@opengis/gis 0.2.168 → 0.2.169
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-DzERD2T8.js → CardIcon-xkRDr3_E.js} +1 -1
- package/dist/{EntityTablePage-DAVJRQLe.js → EntityTablePage-D1IR5Bmq.js} +1 -1
- package/dist/{ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-B-6axJUY.js → ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BJKIgAkD.js} +1 -1
- package/dist/{HeaderActions.vue_vue_type_script_setup_true_lang-D1iwSeRN.js → HeaderActions.vue_vue_type_script_setup_true_lang-BU8__ouG.js} +1 -1
- package/dist/{MapSettings-wVix8wMh.js → MapSettings-DIOlNpt6.js} +1 -1
- package/dist/{RastersTablePage-u3oN_h_n.js → RastersTablePage-OD1VqHP8.js} +1 -1
- package/dist/{cartocss-BIveBlgY.js → cartocss-BiamDcNB.js} +5 -5
- package/dist/{import-utils-DkKPU_Nd.js → import-utils-CvUG1jV0.js} +1 -1
- package/dist/{index-C3bl1qBS.js → index-C6W8IkTm.js} +10 -10
- package/dist/index.css +1 -1
- package/dist/index.js +1 -1
- package/dist/index.umd.cjs +1 -1
- package/dist/{raster-CfTJZx5p.js → raster-BbIiZGoX.js} +3 -3
- package/dist/{register-dV5ipRhb.js → register-Dt2QoLZ3.js} +3 -3
- package/dist/{service-DWC5gq3L.js → service-CdUYntMi.js} +8 -7
- package/dist/{vs-datatable-Cd2Gp4jo.js → vs-datatable-BELnJrfM.js} +1 -1
- package/module/gis/card/gis.metadata.table/index.yml +22 -22
- package/module/gis/card/gis.rasters.table/index.yml +11 -11
- package/module/gis/card/gis.registers.table/index.yml +23 -23
- package/module/gis/card/gis.services.table/index.yml +25 -25
- package/module/gis/cls/bool.yes_no.json +12 -12
- package/module/gis/cls/encoding.json +14 -14
- package/module/gis/cls/geom_type.json +14 -14
- package/module/gis/cls/gis.column_type.json +34 -34
- package/module/gis/cls/gis.column_view_type.json +26 -26
- package/module/gis/cls/gis.filter_type.json +22 -22
- package/module/gis/cls/language.json +10 -10
- package/module/gis/cls/meta.service_type.json +42 -42
- package/module/gis/cls/ogc.service.json +21 -21
- package/module/gis/cls/source_type.json +10 -10
- package/module/gis/cls/standarts.json +6 -6
- package/module/gis/cls/topic_category.json +106 -106
- package/module/gis/cls/update_frequency.json +29 -29
- package/module/gis/cls/view.json +21 -21
- package/module/gis/form/feedback.answer.form.json +10 -10
- package/module/gis/form/gis.cartocss.form.json +64 -64
- package/module/gis/form/gis.group_list.form.json +17 -17
- package/module/gis/form/gis.maps.form.json +61 -61
- package/module/gis/form/gis.metadata.form.json +240 -240
- package/module/gis/form/gis.metadata_new.form.json +195 -195
- package/module/gis/form/gis.ogc_service.form.json +51 -51
- package/module/gis/form/gis.rasters.form.json +76 -76
- package/module/gis/form/gis.registers.form.json +124 -124
- package/module/gis/form/gis.registers_column.form.json +84 -84
- package/module/gis/form/gis.registers_filter.form.json +65 -65
- package/module/gis/form/gis.services.form.json +111 -111
- package/module/gis/form/gis.services_attributes.form.json +75 -75
- package/module/gis/form/gis.services_filter.form.json +65 -65
- package/module/gis/menu.json +43 -43
- package/module/gis/select/admin.cls.name.sql +9 -9
- package/module/gis/select/layer_list.sql +7 -7
- package/module/gis/select/layer_list_text.sql +7 -7
- package/module/gis/select/pg.column_name.geometry.sql +12 -12
- package/module/gis/select/pg.columns.parent.sql +6 -6
- package/module/gis/select/pg.table_name.sql +17 -17
- package/module/gis/select/service_id.sql +1 -1
- package/module/gis/select/srid.sql +7 -7
- package/module/gis/table/gis.cartocss.table.json +74 -74
- package/module/gis/table/gis.group_list.table.json +58 -58
- package/module/gis/table/gis.maps.table.json +110 -110
- package/module/gis/table/gis.metadata.table.json +70 -70
- package/module/gis/table/gis.metadata_new.table.json +137 -137
- package/module/gis/table/gis.ogc_service.table.json +100 -100
- package/module/gis/table/gis.rasters.table.json +113 -113
- package/module/gis/table/gis.registers.table.json +143 -143
- package/module/gis/table/gis.services.table.json +120 -120
- package/module/gis/table/site.gis.registers.table.json +88 -88
- package/module/gis/table/site.gis.services.table.json +106 -106
- package/module/gis/templates/ISO19136_2017_gml_template.xml +330 -330
- package/module/gis/tokens.yml +5 -5
- package/module/permissions/form/permissions.users.form.json +151 -151
- package/module/permissions/table/gis.permissions.table.json +97 -97
- package/module/test/map/addr.json +303 -0
- package/module/test/map/{addr.yml → addr1.yml} +3 -1
- package/module/test/select/address.str_id.sql +3 -0
- package/package.json +10 -10
- package/plugin.js +21 -12
- package/server/plugins/mapnik/funcs/checkRasterFile.js +1 -3
- package/server/routes/cartocss/cartocss.route.js +31 -0
- package/server/routes/cartocss/cartocss.route.test.js +79 -0
- package/server/routes/cartocss/cartocss.schema.js +73 -0
- package/server/routes/{gis/cartocss → cartocss/functions}/add.cartocss.js +8 -11
- package/server/routes/{gis/cartocss → cartocss/functions}/get.cartocss.js +11 -13
- package/server/routes/gis/functions/checkXML.js +107 -0
- package/server/routes/gis/functions/dashboard.js +24 -0
- package/server/routes/gis/gis.route.js +26 -0
- package/server/routes/gis/gis.route.test.js +34 -0
- package/server/routes/gis/gis.schema.js +1 -0
- package/server/routes/map/{controllers → functions}/clearTiles.js +9 -8
- package/server/routes/map/{controllers → functions}/geojson.js +43 -43
- package/server/routes/map/{controllers → functions}/gis.convert.js +15 -23
- package/server/routes/map/{controllers → functions}/gis.icon.js +23 -10
- package/server/routes/map/{controllers → functions}/jsonData.js +72 -71
- package/server/routes/map/{controllers → functions}/layerList.js +17 -17
- package/server/routes/map/{controllers → functions}/map.js +8 -9
- package/server/routes/map/{controllers → functions}/mapCatalog.js +7 -7
- package/server/routes/map/functions/mapCatalogAttribute.js +54 -0
- package/server/routes/map/{controllers → functions}/mapFeatures.js +22 -18
- package/server/routes/map/{controllers → functions}/mapFormat.js +25 -28
- package/server/routes/map/{controllers → functions}/mapTiles.js +39 -30
- package/server/routes/map/{controllers → functions}/maps.js +3 -3
- package/server/routes/map/{controllers → functions}/marker_icon.js +1 -1
- package/server/routes/map/{controllers → functions}/parseGeoFile.js +10 -11
- package/server/routes/map/{controllers → functions}/pointHeight.js +3 -7
- package/server/routes/map/{controllers → functions}/vtile.js +5 -3
- package/server/routes/map/{vtile1.js → functions/vtile1.js} +39 -33
- package/server/routes/map/map.route.js +280 -0
- package/server/routes/map/map.route.test.js +503 -0
- package/server/routes/map/map.schema.js +356 -0
- package/server/routes/mapnik/{controllers → functions}/clearTiles.js +26 -29
- package/server/routes/mapnik/{controllers → functions}/createXml.js +17 -20
- package/server/routes/mapnik/{controllers → functions}/createXmlMulti.js +11 -15
- package/server/routes/mapnik/{controllers → functions}/fileSearch.js +6 -9
- package/server/routes/mapnik/functions/fileStat.js +28 -0
- package/server/routes/mapnik/{controllers → functions}/pretile.js +29 -35
- package/server/routes/mapnik/{controllers → functions}/rasterInfo.js +19 -10
- package/server/routes/mapnik/{controllers → functions}/readDir.js +4 -4
- package/server/routes/mapnik/functions/rtile.js +164 -0
- package/server/routes/mapnik/{controllers → functions}/uploadRaster.js +19 -24
- package/server/routes/mapnik/functions/uploadXML.js +27 -0
- package/server/routes/mapnik/mapnik.route.js +102 -0
- package/server/routes/mapnik/mapnik.route.test.js +371 -0
- package/server/routes/mapnik/mapnik.schema.mjs +190 -0
- package/server/routes/mapnik.prefixless/functions/mapnikLogger.js +31 -0
- package/server/routes/{mapnik/controllers → mapnik.prefixless/functions}/mapnikStat.js +7 -5
- package/server/routes/mapnik.prefixless/mapnik.prefixless.route.js +20 -0
- package/server/routes/mapnik.prefixless/mapnik.prefixless.route.test.js +91 -0
- package/server/routes/mapnik.prefixless/mapnik.prefixless.schema.mjs +27 -0
- package/server/routes/maps/functions/add.map.js +42 -0
- package/server/routes/{map/maps → maps/functions}/del.map.js +6 -7
- package/server/routes/{map/maps → maps/functions}/get.map.js +12 -11
- package/server/routes/maps/maps.route.js +58 -0
- package/server/routes/maps/maps.route.test.js +231 -0
- package/server/routes/maps/maps.schema.js +10 -0
- package/server/routes/metadata/functions/editMetadata.js +35 -0
- package/server/routes/metadata/functions/metadataXML.js +19 -0
- package/server/routes/metadata/metadata.route.js +26 -0
- package/server/routes/metadata/metadata.route.test.js +47 -0
- package/server/routes/metadata/metadata.schema.js +53 -0
- package/server/routes/{gis/ogc → ogc/functions}/map.info.point.js +22 -29
- package/server/routes/ogc/ogc.route.js +21 -0
- package/server/routes/ogc/ogc.route.test.js +54 -0
- package/server/routes/ogc/ogc.schema.js +16 -0
- package/server/routes/permissions/functions/catalog.permissions.edit.js +20 -0
- package/server/routes/permissions/functions/catalog.permissions.js +13 -0
- package/server/routes/permissions/{controllers → functions}/gis.catalog.js +10 -10
- package/server/routes/permissions/permissions.route.js +35 -0
- package/server/routes/permissions/permissions.route.test.js +35 -0
- package/server/routes/permissions/permissions.schema.js +44 -0
- package/server/routes/registers/functions/add.registry.js +37 -0
- package/server/routes/{gis/registers/funcs → registers/functions}/classifiers.js +2 -2
- package/server/routes/{gis/registers → registers/functions}/del.registry.js +5 -5
- package/server/routes/{gis/registers/funcs → registers/functions}/get.info.js +9 -5
- package/server/routes/{gis/registers → registers/functions}/gis.export.js +27 -21
- package/server/routes/{gis/registers → registers/functions}/gis.registry.js +22 -15
- package/server/routes/{gis/registers → registers/functions}/gis.registry.list.js +12 -10
- package/server/routes/{gis/registers/funcs → registers/functions}/handleRegistryRequest.js +12 -11
- package/server/routes/registers/registers.route.js +80 -0
- package/server/routes/registers/registers.route.test.js +145 -0
- package/server/routes/registers/registers.schema.js +246 -0
- package/server/routes/{gis/services → services/functions}/add.service.js +14 -16
- package/server/routes/services/functions/create.route.js +93 -0
- package/server/routes/{gis/services → services/functions}/del.service.js +5 -5
- package/server/routes/{gis/services → services/functions}/get.service.users.js +15 -13
- package/server/routes/services/functions/get.services.col.js +34 -0
- package/server/routes/{gis/services → services/functions}/get.services.js +21 -16
- package/server/routes/services/services.route.js +76 -0
- package/server/routes/services/services.route.test.js +168 -0
- package/server/routes/services/services.schema.js +278 -0
- package/server/routes/widgets/functions/add.widget.js +39 -0
- package/server/routes/widgets/functions/del.widget.js +18 -0
- package/server/routes/{map/widgets → widgets/functions}/get.widget.js +12 -11
- package/server/routes/widgets/widgets.route.js +61 -0
- package/server/routes/widgets/widgets.route.test.js +144 -0
- package/server/routes/widgets/widgets.schema.js +25 -0
- package/module/cls.json +0 -7
- package/module/gis/card/gis.metadata.table/main_info.hbs +0 -21
- package/module/gis/card/gis.metadata.table/metadata_info.hbs +0 -28
- package/module/gis/card/gis.metadata.table/other.hbs +0 -26
- package/module/gis/card/gis.rasters.table/main_info.hbs +0 -27
- package/module/gis/card/gis.registers.table/cls.hbs +0 -36
- package/module/gis/card/gis.registers.table/columns.hbs +0 -89
- package/module/gis/card/gis.registers.table/filters.hbs +0 -80
- package/module/gis/card/gis.registers.table/main_info.hbs +0 -35
- package/module/gis/card/gis.registers.table/source.hbs +0 -45
- package/module/gis/card/gis.services.table/attributes.hbs +0 -91
- package/module/gis/card/gis.services.table/filters.hbs +0 -83
- package/module/gis/card/gis.services.table/main_info.hbs +0 -27
- package/module/gis/card/gis.services.table/source.hbs +0 -26
- package/module/test/cls/bp_build_type.json +0 -37
- package/module/test/cls/doc_status.json +0 -32
- package/module/test/cls/ts.temp_status.json +0 -18
- package/module/test/cls/ts.temp_structure.ts_class.json +0 -50
- package/module/test/cls/ts.temp_type.json +0 -10
- package/module/test/layer/bp.json +0 -60
- package/module/test/layer/bp1.yml +0 -33
- package/module/test/layer/individual.yml +0 -54
- package/module/test/layer/ts.linking_passport.yml +0 -56
- package/module/test/layer/ts.temp_structure.yml +0 -51
- package/module/test/map/bp_myo.json +0 -44
- package/module/test/map/bpf.json +0 -44
- package/module/test/map/main.json +0 -39
- package/module/test/map/mbd.json +0 -92
- package/module/test/map/ts.json +0 -53
- package/module/test/select/address_id.json +0 -3
- package/module/test/select/address_id.sql +0 -8
- package/module/test/select/core.user_uid.sql +0 -1
- package/module/test/table/data_address.street.table.json +0 -70
- package/module/test/table/data_bp_myo.bp.table.json +0 -123
- package/server/routes/gis/checkXML.js +0 -117
- package/server/routes/gis/dashboard.js +0 -29
- package/server/routes/gis/index.mjs +0 -92
- package/server/routes/gis/metadata/editMetadata.js +0 -34
- package/server/routes/gis/metadata/metadataXML.js +0 -13
- package/server/routes/gis/registers/add.registry.js +0 -35
- package/server/routes/gis/registers/insert.columns.js +0 -107
- package/server/routes/gis/registers/insert.filters.js +0 -110
- package/server/routes/gis/services/create.route.js +0 -96
- package/server/routes/gis/services/get.services.col.js +0 -33
- package/server/routes/map/controllers/mapCatalogAttribute.js +0 -56
- package/server/routes/map/index.mjs +0 -259
- package/server/routes/map/maps/add.map.js +0 -43
- package/server/routes/map/widgets/add.widget.js +0 -39
- package/server/routes/map/widgets/del.widget.js +0 -23
- package/server/routes/mapnik/controllers/fileStat.js +0 -28
- package/server/routes/mapnik/controllers/mapnikLogger.js +0 -29
- package/server/routes/mapnik/controllers/rtile.js +0 -167
- package/server/routes/mapnik/index.js +0 -40
- package/server/routes/permissions/controllers/catalog.permissions.edit.js +0 -22
- package/server/routes/permissions/controllers/catalog.permissions.js +0 -8
- package/server/routes/permissions/index.mjs +0 -18
- /package/server/routes/map/{controllers/pin → pin}/circle1.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/circle2.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/none.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin1.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin2.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin3.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin4.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin5.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin6.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin7.svg +0 -0
- /package/server/routes/permissions/{controllers/utils → functions}/get.permissions.js +0 -0
- /package/server/routes/{gis/registers/funcs → registers/functions}/columns.js +0 -0
- /package/server/routes/{gis/registers/funcs → registers/functions}/content.type.js +0 -0
- /package/server/routes/{gis/registers → registers/functions}/map.registry.js +0 -0
- /package/server/routes/{gis/services → services/functions}/get.layer.geom.js +0 -0
- /package/server/routes/{gis/services → services/functions}/legend.auto.js +0 -0
package/dist/index.umd.cjs
CHANGED
|
@@ -54,5 +54,5 @@ ${t.slice(i+1)}`:u+=t.slice(l),u.slice(1)}function k2(t){let n="",o=0;for(let r=
|
|
|
54
54
|
${s??"CartoCSS property (Mapnik)."}`}]}}}))}const Un=e.defineComponent({__name:"MonacoEditor",props:{modelValue:{},language:{},theme:{}},emits:["update:modelValue","load"],setup(t,{emit:n}){const o=t,r=n,l=e.ref(null);let s=null,i=null,d=!1;function u(){return new Promise((p,a)=>{if(i)return p(i);if(window.monaco)return i=window.monaco,p(i);const g=y=>{if([...document.styleSheets].some(h=>{var f;return(f=h==null?void 0:h.href)==null?void 0:f.includes(y)}))return;const k=document.createElement("link");k.rel="stylesheet",k.href=y,document.head.appendChild(k)},m=y=>new Promise((k,h)=>{const f=document.createElement("script");f.src=y,f.onload=()=>k(!0),f.onerror=h,document.body.appendChild(f)});g("https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.0/min/vs/editor/editor.main.min.css"),m("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"],()=>{i=window.monaco,p(i)})}).catch(a)})}function c(){var y,k;if(!l.value||!i)return;s&&s.dispose();const p=o.language||"yaml",a=i.editor.createModel(o.modelValue||"",p),g=p==="cartocss"?{acceptSuggestionOnCommitCharacter:!1,acceptSuggestionOnEnter:"off",snippetSuggestions:"none",tabCompletion:"off",wordBasedSuggestions:"off"}:{};s=i.editor.create(l.value,{model:a,theme:o.theme||"vs-light",automaticLayout:!0,minimap:{enabled:!1},...g});const m=p;i.editor.setModelLanguage(a,m),m==="css"&&((k=(y=i.languages)==null?void 0:y.css)!=null&&k.cssDefaults)&&i.languages.css.cssDefaults.setDiagnosticsOptions({validate:!1,lint:{}}),s.onDidChangeModelContent(()=>{d||r("update:modelValue",s.getValue())})}return e.watch(()=>o.modelValue,p=>{if(!s)return;const a=s.getModel();if(!a)return;const g=a.getValue();if(p!==g){const m=s.getPosition(),y=s.getSelection(),k=s.getScrollTop(),h=s.getScrollLeft();d=!0,s.executeEdits("external-model-sync",[{range:a.getFullModelRange(),text:p||"",forceMoveMarkers:!0}]),y&&s.setSelection(y),m&&s.setPosition(m),s.setScrollTop(k),s.setScrollLeft(h),d=!1}}),e.watch(()=>o.language,p=>{s&&i&&i.editor.setModelLanguage(s.getModel(),p||"yaml")}),e.watch(()=>o.theme,p=>{s&&i&&i.editor.setTheme(p||"vs-light")}),e.onMounted(async()=>{await u(),G_(i),c()}),e.onBeforeUnmount(()=>{s&&s.dispose()}),(p,a)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"editorContainer",ref:l,class:"w-full h-full"},null,512))}}),Z_={class:"flex flex-col flex-1 overflow-hidden"},K_={class:"flex justify-end gap-2"},X_=["href"],J_={class:"flex flex-col flex-1 overflow-hidden"},Q_={class:"bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden mt-3 flex flex-col flex-1"},eE={class:"relative bg-gradient-to-br from-slate-50 to-white flex-1"},tE=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,r=n,l=e.ref("");e.watch(()=>o.styleText,u=>{const c=u??"";l.value!==c&&(l.value=c)},{immediate:!0}),e.watch(l,async u=>{var p,a;const c=u??"";o.styleText!==c&&r("update:style-text",c);try{const g=u?wa(u):null;if((p=g==null?void 0:g.colorAttr)!=null&&p.length&&((a=o.styleYaml)==null?void 0:a.colorAttr)!==g.colorAttr){const m=await s(g.colorAttr);g.colors=m.reduce((k,h,f)=>({...k,[h.id.toString()]:i[f]}),{});const y=Oa(g);y!==l.value&&(l.value=y)}JSON.stringify(g)!==JSON.stringify(o.styleYaml)&&r("update:style-yaml",g&&typeof g=="object"?g:null)}catch{o.styleYaml!==null&&r("update:style-yaml",null)}});async function s(u){return(await fetch(`/api/gis-service/${o.token}/${u}`).then(p=>p.json())).rows}const i=["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd"],d=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})}),r("update"),Ee.notify({type:"success",title:"Успіх",message:"Стилі збережено"})}catch(c){Ee.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти стилі"}),console.log(c)}};return(u,c)=>(e.openBlock(),e.createElementBlock("div",Z_,[e.createElementVNode("div",K_,[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,X_),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"},[...c[1]||(c[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",J_,[e.createElementVNode("div",Q_,[c[2]||(c[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",eE,[e.createVNode(Un,{modelValue:l.value,"onUpdate:modelValue":c[0]||(c[0]=p=>l.value=p),language:"yaml",theme:"vs-light"},null,8,["modelValue"])])])])]))}}),nE={class:"flex flex-col flex-1 min-h-0"},oE={class:"flex flex-col flex-1 min-h-0"},rE=e.defineComponent({__name:"vs-tab-popup",props:{token:{},fields:{},columns:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,r=n,l=e.ref(o.columns||[]);e.watch(()=>o.columns,y=>l.value=y||[],{immediate:!0}),e.watch(l,y=>{const k=je(o.token);k&&(k.popup=y),r("update:columns",y)});const s=e.ref("list"),i=e.ref(!1),d=e.ref([]),u=[{key:"name",label:"Назва",type:"main"}],c={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:"autocomplete",label:"Класифікатор",data:"admin.cls.name"}};function p(){d.value=l.value.map(y=>y.name||y.id),i.value=!0}function a(){var f;const y=[...l.value],k=((f=o.fields)==null?void 0:f.filter(b=>d.value.includes(b.name)))||[],h=dn(y,k,{selectedKeys:d.value,resolveKey:b=>zt(b)});l.value=h,i.value=!1,d.value=[]}function g(){i.value=!1,d.value=[]}function m(){let y=[];s.value==="all"?y=o.fields||[]:s.value==="none"?y=[]:y=l.value,y.filter(k=>!k.label).forEach(k=>k.label=k.ua),r("save",y)}return(y,k)=>(e.openBlock(),e.createElementBlock("div",nE,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:p,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.createElementVNode("div",oE,[s.value==="list"?(e.openBlock(),e.createBlock(Pt,{key:0,modelValue:l.value,"onUpdate:modelValue":k[0]||(k[0]=h=>l.value=h),"columns-scheme":u,"form-scheme":c,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):e.createCommentVNode("",!0)]),e.createVNode(sn,{visible:i.value,"onUpdate:visible":k[1]||(k[1]=h=>i.value=h),selection:d.value,"onUpdate:selection":k[2]||(k[2]=h=>d.value=h),fields:t.fields,title:"Імпорт полів","id-prefix":"import-popup",onConfirm:a,onCancel:g},null,8,["visible","selection","fields"])]))}}),lE={class:"flex flex-col flex-1 min-h-0"},aE={class:"flex justify-between mb-3 gap-2"},sE={class:"p-4 space-y-4 text-sm"},iE={class:"space-y-1"},cE={class:"space-y-1"},dE={class:"flex items-center gap-3"},uE={class:"flex justify-end gap-2 p-4 border-t"},fE=e.defineComponent({__name:"vs-tab-legend",props:{mapInfo:{},token:{},columns:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,r=n,l=e.ref(o.columns||[]);e.watch(()=>o.columns,y=>{l.value=y||[]}),e.watch(l,y=>{r("update:columns",y)});const s=e.ref(!1),i=e.ref({name:"",color:"#2E86DE"}),d=e.defineAsyncComponent(()=>import("@opengis/core").then(y=>y.VsModal)),u=[{key:"name",label:"Назва"},{key:"color",label:"Колір",type:"color"}],c={name:{type:"text",label:"Назва",validators:["required"]},color:{type:"color",label:"Колір",validators:["required"]}};function p(y){y&&a(),s.value=y}function a(){i.value={name:"",color:"#2E86DE"}}function g(){var f,b;const y=(f=i.value.name)==null?void 0:f.trim();if(!y){Ee.notify({type:"warning",title:"Перевірка",message:"Вкажіть назву елементу легенди"});return}const k=((b=i.value.color)==null?void 0:b.trim())||"#2E86DE";if(l.value.some(x=>zt(x)===zt({name:y}))){Ee.notify({type:"warning",title:"Дубль",message:"Такий елемент легенди вже існує"});return}l.value=[...l.value,{name:y,color:k}],a(),s.value=!1}function m(){r("save",l.value)}return(y,k)=>(e.openBlock(),e.createElementBlock("div",lE,[e.createElementVNode("div",aE,[e.createElementVNode("button",{onClick:k[0]||(k[0]=h=>s.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: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(Pt,{modelValue:l.value,"onUpdate:modelValue":k[1]||(k[1]=h=>l.value=h),"columns-scheme":u,"form-scheme":c,"main-col-width":"250px","add-button":!1},null,8,["modelValue"]),e.createVNode(e.unref(d),{teleport:"#modal",visible:s.value,title:"Новий елемент легенди","onUpdate:visible":p},{footer:e.withCtx(()=>[e.createElementVNode("div",uE,[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:k[5]||(k[5]=h=>p(!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:g}," Додати ")])]),default:e.withCtx(()=>[e.createElementVNode("div",sE,[e.createElementVNode("div",iE,[k[6]||(k[6]=e.createElementVNode("label",{class:"block text-xs font-medium text-gray-500 uppercase tracking-wide"}," Назва ",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":k[2]||(k[2]=h=>i.value.name=h),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,i.value.name]])]),e.createElementVNode("div",cE,[k[7]||(k[7]=e.createElementVNode("label",{class:"block text-xs font-medium text-gray-500 uppercase tracking-wide"}," Колір ",-1)),e.createElementVNode("div",dE,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":k[3]||(k[3]=h=>i.value.color=h),type:"color",class:"h-10 w-16 rounded border border-gray-300"},null,512),[[e.vModelText,i.value.color]]),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":k[4]||(k[4]=h=>i.value.color=h),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,i.value.color]])])])])]),_:1},8,["visible"])]))}}),mE={class:"space-y-3 bg-gradient-to-br from-sky-50 to-blue-50 p-4 rounded-xl border border-sky-100 shadow-sm"},pE=["onClick"],gE=["aria-checked","value"],yE={key:0},hE=e.defineComponent({__name:"view-mode-toggle",props:{modelValue:{},options:{},showHtml:{type:Boolean}},emits:["update:modelValue"],setup(t,{emit:n}){const o=t,r=n,l=i=>r("update:modelValue",i),s=o.options||[{value:"all",label:"All"},{value:"list",label:"List"},{value:"none",label:"None"}];return(i,d)=>(e.openBlock(),e.createElementBlock("div",mE,[d[1]||(d[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(s).length}`])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(s),u=>(e.openBlock(),e.createElementBlock("div",{key:u.value,onClick:c=>l(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",yE,[...d[0]||(d[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,gE),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,pE))),128))],2)]))}}),bE={class:"flex flex-col flex-1 min-h-0"},xE={class:"flex flex-col flex-1 min-h-0"},kE=e.defineComponent({__name:"vs-tab-card",props:{fields:{},columns:{},viewMode:{},html:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,r=n,l=e.ref(o.columns||[]);e.watch(()=>o.columns,h=>l.value=h||[],{immediate:!0}),e.watch(l,h=>r("update:columns",h));const s=e.ref(o.viewMode??"list");e.watch(()=>o.viewMode,h=>{h&&h!==s.value&&(s.value=h)});const i=e.ref(o.html??"");e.watch(()=>o.html,h=>{typeof h=="string"&&h!==i.value&&(i.value=h)},{immediate:!0});const d=e.ref(!1),u=e.ref([]),c=[{key:"name",label:"Name",type:"main"}],p={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 a(){u.value=s.value==="html"?[]:l.value.map(h=>h.name||h.id),d.value=!0}function g(){var x;const h=[...l.value],f=((x=o.fields)==null?void 0:x.filter(C=>u.value.includes(C.name)).map(C=>{const{type:V,format:E,...w}=C;return{...w,format:E??V??"text"}}))||[],b=dn(h,f,{selectedKeys:u.value,resolveKey:C=>zt(C)});if(l.value=b,s.value==="html"&&f.length){const C=f.map(w=>{const B=w.label??"",L=w.name??w.id??"";return`<dd>${B}</dd>
|
|
55
55
|
<dt>{{ ${L} }}</dt>`}).join(`
|
|
56
56
|
`),E=(i.value??"").trimEnd();i.value=E?`${E}
|
|
57
|
-
${C}`:C}d.value=!1,u.value=[]}function m(){d.value=!1,u.value=[]}function y(){const h=s.value==="html"?"html":"list",f={card_mode:h};h==="html"?f.html=i.value:h==="list"&&(f.list=l.value),r("save","card",f)}const k=[{value:"all",label:"Всі"},{value:"list",label:"Список"},{value:"none",label:"Жодне"},{value:"html",label:"HTML"}];return(h,f)=>(e.openBlock(),e.createElementBlock("div",bE,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:a,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:y,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(hE,{modelValue:s.value,"onUpdate:modelValue":f[0]||(f[0]=b=>s.value=b),options:k},null,8,["modelValue"]),e.createElementVNode("div",xE,[s.value==="list"?(e.openBlock(),e.createBlock(Pt,{key:0,modelValue:l.value,"onUpdate:modelValue":f[1]||(f[1]=b=>l.value=b),"columns-scheme":c,"form-scheme":p,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):s.value==="html"?(e.openBlock(),e.createBlock(Un,{key:1,modelValue:i.value,"onUpdate:modelValue":f[2]||(f[2]=b=>i.value=b),language:"html",theme:"vs-light",class:"flex-1 min-h-0"},null,8,["modelValue"])):e.createCommentVNode("",!0)]),e.createVNode(sn,{visible:d.value,"onUpdate:visible":f[3]||(f[3]=b=>d.value=b),selection:u.value,"onUpdate:selection":f[4]||(f[4]=b=>u.value=b),fields:t.fields,title:"Імпорт полів для картки","id-prefix":"import-card",onConfirm:g,onCancel:m},null,8,["visible","selection","fields"])]))}}),wE={class:"flex flex-col flex-1 min-h-0"},_E=e.defineComponent({__name:"vs-tab-filter",props:{fields:{},columns:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,r=n;console.log(o.columns);const l=e.ref(o.columns||[]);e.watch(()=>o.columns,y=>l.value=y||[],{immediate:!0}),e.watch(l,y=>r("update:columns",y),{deep:!0,immediate:!0});const s=e.ref("list"),i=e.ref(!1),d=e.ref([]),u=[{key:"id",label:"Name"},{key:"label",label:"UA"}],c={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 p(){d.value=l.value.map(y=>y.name||y.id),i.value=!0}function a(){var f;const y=[...l.value],k=((f=o.fields)==null?void 0:f.filter(b=>d.value.includes(b.name)))||[],h=dn(y,k,{selectedKeys:d.value,resolveKey:b=>zt(b)});l.value=h,i.value=!1,d.value=[]}function g(){i.value=!1,d.value=[]}function m(){let y=[];s.value==="all"?y=o.fields||[]:s.value==="none"?y=[]:y=l.value,r("save",y)}return(y,k)=>(e.openBlock(),e.createElementBlock("div",wE,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:p,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"}," Зберегти фільтр ")]),s.value==="list"?(e.openBlock(),e.createBlock(Pt,{key:0,modelValue:l.value,"onUpdate:modelValue":k[0]||(k[0]=h=>l.value=h),"columns-scheme":u,"form-scheme":c,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):e.createCommentVNode("",!0),e.createVNode(sn,{visible:i.value,"onUpdate:visible":k[1]||(k[1]=h=>i.value=h),selection:d.value,"onUpdate:selection":k[2]||(k[2]=h=>d.value=h),fields:t.fields,title:"Імпорт полів","id-prefix":"import-filter",onConfirm:a,onCancel:g},null,8,["visible","selection","fields"])]))}}),EE=e.defineComponent({__name:"MapDataLayer",props:{id:{},layer:{},styleSpec:{},autoCenter:{type:[Boolean,null]}},setup(t,{expose:n}){var y,k,h,f;const{map:o,flyTo:r,setZoom:l}=Je(),s=((k=(y=e.getCurrentInstance())==null?void 0:y.appContext.config.globalProperties)==null?void 0:k.$settings)||null,i=t,d=i.id;String(i.id);const u=`${location.origin}/api/vtile/${i.id}/ua/{z}/{x}/{y}.vmt?all=1`,c=je(d,{source:{type:"vector",tiles:[u],minzoom:0,maxzoom:14},popup:i.layer.popup,layer:{style:(h=i.layer)==null?void 0:h.style}});n({layerHandle:c}),(i.autoCenter??!0)&&r({center:i.layer.center||((f=s==null?void 0:s.map)==null?void 0:f.center)||[30,50],animate:!1});let p=null;function a(){if(!(c!=null&&c.setTiles))return;const b=u.includes("?")?"&":"?",x=`${u}${b}_=${Date.now()}`;c.setTiles([x])}function g(){p&&clearTimeout(p),p=setTimeout(()=>{p=null,m().catch(b=>console.error("Failed to update map layer",b))},300)}async function m(){o.value&&(a(),c.setStyle(i.styleSpec??null))}return e.watch(()=>i.styleSpec,g,{deep:!0}),e.onBeforeUnmount(()=>{c.remove()}),(b,x)=>null}}),CE={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},NE={class:"flex-1 relative overflow-hidden"},VE={class:"absolute top-0 left-0 w-full z-20"},$E={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},BE={class:"flex items-start justify-between gap-4"},SE={class:"flex-1 min-w-0"},vE={class:"flex items-center text-sm text-gray-500 mb-3"},LE={class:"text-gray-900 font-medium truncate max-w-xs"},TE={class:"flex items-center justify-between gap-4"},AE={class:"flex-1 min-w-0"},ME={class:"flex items-center gap-3 mb-1"},FE={class:"text-base font-semibold text-gray-900 truncate"},DE={key:0,class:"px-2 py-0.5 bg-green-50 border border-green-200 rounded flex-shrink-0"},PE={class:"text-xs font-medium text-green-700"},zE=["title"],RE={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]"},IE={class:"relative w-full h-full"},jE={style:{top:"17px",left:"230px",position:"absolute","z-index":"1"}},OE={class:"absolute top-4 left-4 z-20"},UE={class:"absolute top-[6.5rem] right-2 space-y-1 z-20"},qE={class:"absolute bottom-4 left-4 z-20"},HE={class:"flex-1 flex flex-col h-full"},WE={class:"px-3 pt-3 pb-2 border-b border-gray-100"},YE={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"},GE=["aria-selected","onClick"],ZE={class:"leading-none"},KE={class:"flex flex-col flex-1 overflow-y-hidden p-3"},XE="OpenGIS",Ga=2,Mo=5,JE=1e3,QE=Object.freeze(Object.defineProperty({__proto__:null,default:Me(e.defineComponent({__name:"service",props:{hideServiceKey:{type:Boolean,default:!1}},setup(t){var pe,Le;const n=t,o=e.toRef(n,"hideServiceKey"),r=qe.useRoute(),l=qe.useRouter(),{id:s}=r.params,i=e.ref(null),d=e.ref(null),u=e.ref({}),c=e.ref(null),p=((Le=(pe=e.getCurrentInstance())==null?void 0:pe.appContext.config.globalProperties)==null?void 0:Le.$settings)||null;function a(j){typeof document>"u"||(document.title=j?`${j} — Сервіс`:XE)}let g=null;const m=e.ref(!1);function y(){var j;return(j=i.value)==null?void 0:j.ctx}function k(j){typeof window>"u"||window.dispatchEvent(new CustomEvent(ao,{detail:j}))}function h(j){var ze,Ae,Ye;const Q=(Ae=(ze=y())==null?void 0:ze.map)==null?void 0:Ae.value;if(!Q||!j)return[];const _e=(Ye=c.value)!=null&&Ye.service_id?String(c.value.service_id):null;return(Q.queryRenderedFeatures(j)||[]).filter(Ge=>{var A,Z,X,xe,Ve,R;const ot=((A=Ge==null?void 0:Ge.properties)==null?void 0:A.id)??(Ge==null?void 0:Ge.id);if(ot==null||!(Ge!=null&&Ge.source)||_e&&String(Ge.source)!==_e)return!1;const Qe=je(Ge.source)||je((Z=Ge.layer)==null?void 0:Z.id);if(!Qe)return!1;const P=(xe=(X=Qe==null?void 0:Qe.opts)==null?void 0:X.source)==null?void 0:xe.type,fe=(R=(Ve=Qe==null?void 0:Qe.opts)==null?void 0:Ve.layer)==null?void 0:R.type;return P!=="raster"&&fe!=="raster"})}function f(j){const Q=h(j==null?void 0:j.point);k({features:Q,externalItems:[]})}function b(j){if(Array.isArray(j))return b(j[0]);if(typeof j!="string"&&typeof j!="number")return null;const Q=typeof j=="number"?j:Number(j.trim());return Number.isFinite(Q)?Q:null}function x(j,Q){return j.toFixed(Q)}function C(j,Q,_e){const ve=.5*10**-_e;return Math.abs(j-Q)>ve}function V(){var Ge,ot,Qe,P;const j=(ot=(Ge=y())==null?void 0:Ge.map)==null?void 0:ot.value;if(!j)return;const Q=b(r.query.z),_e=b(r.query.x),ve=b(r.query.y);if(Q==null||_e==null||ve==null)return;const ze=(Qe=j.getCenter)==null?void 0:Qe.call(j),Ae=(P=j.getZoom)==null?void 0:P.call(j);(!ze||C(ze.lng,_e,Mo)||C(ze.lat,ve,Mo)||C(Ae??0,Q,Ga))&&(m.value=!0,j.jumpTo({center:[_e,ve],zoom:Q}),m.value=!1)}function E(){var ze,Ae,Ye,Ge;if(m.value)return;const j=(Ae=(ze=y())==null?void 0:ze.map)==null?void 0:Ae.value;if(!j)return;const Q=(Ye=j.getCenter)==null?void 0:Ye.call(j),_e=(Ge=j.getZoom)==null?void 0:Ge.call(j);if(!Q||_e==null)return;const ve={...r.query,z:x(_e,Ga),x:x(Q.lng,Mo),y:x(Q.lat,Mo)};r.query.z===ve.z&&r.query.x===ve.x&&r.query.y===ve.y||l.replace({query:ve})}const w=e.ref(null),B=e.ref(""),L=e.ref([]),W=e.ref([]),J=e.ref([]),I=e.ref("list"),te=e.ref(""),ue=e.ref([]),be=e.ref(!0);let ae=null;const ne=e.computed(()=>{var j,Q;return((j=c.value)==null?void 0:j.id)??((Q=c.value)==null?void 0:Q.service_id)??null}),v=e.computed(()=>{const j=(p==null?void 0:p.map)||null,Q=(j==null?void 0:j.boundary)??null,_e=(j==null?void 0:j.katottg)??null;return!Q&&!_e?null:{boundary:Q,katottg:_e}}),M=e.computed(()=>{const j=c.value;if(!j)return"";const Q=[];!o.value&&j.service_key&&Q.push(`Сервіс: ${j.service_key}`),j.description&&Q.push(j.description);const _e=j.group_name||j.group_id;return _e&&Q.push(`Група: ${_e}`),typeof j.is_public<"u"&&Q.push(j.is_public?"Публічний":"Не публічний"),typeof j.is_active<"u"&&Q.push(j.is_active?"Активний":"Неактивний"),Q.join(", ")}),$=e.computed(()=>{const j=c.value,Q=(j==null?void 0:j.group_name)||(j==null?void 0:j.group_id);return Q?String(Q).toUpperCase():""}),N=e.computed(()=>{var _e;const j=(_e=r.matched[r.matched.length-1])==null?void 0:_e.path;return(typeof j=="string"&&j?j:r.path).replace(/\/:id\??$/,"")||"/"}),F=e.computed(()=>{var Q;const j=(Q=r.meta)==null?void 0:Q.title;return typeof j=="string"&&j.trim()?j:"Datasets"});function H(){l.push(N.value)}const he=[{key:"style",label:"Стиль",icon:Ua},{key:"popup",label:"Попап",icon:G2},{key:"filter",label:"Фільтр",icon:J2},{key:"legend",label:"Легенда",icon:j2},{key:"card",label:"Картка",icon:qa},{key:"metadata",label:"Метадані",icon:Or}],Y=he.map(j=>j.key),D=e.ref("style");e.onMounted(async()=>{const j=r.query.tab;j&&Y.includes(j)&&(D.value=j),await we(),O()});async function O(){var ve;const j=y();if(!(j!=null&&j.ready))return;await j.ready(),V();const Q=(ve=j.map)==null?void 0:ve.value;if(!Q)return;const _e=()=>E();Q.on("moveend",_e),Q.on("zoomend",_e),Q.on("click",f),g=()=>{Q.off("moveend",_e),Q.off("zoomend",_e),Q.off("click",f)}}e.watch(()=>[r.query.z,r.query.x,r.query.y],()=>{V()}),e.watch(D,j=>{r.query.tab!==j&&l.replace({query:{...r.query,tab:j}})}),e.watch(()=>r.query.tab,j=>{j&&Y.includes(j)&&D.value!==j&&(D.value=j)}),e.watch(()=>{var j;return(j=c.value)==null?void 0:j.name},j=>a(j),{immediate:!0});function q(j){if(!j)return null;try{return JSON.parse(JSON.stringify(j))}catch(Q){return console.warn("Failed to clone style",Q),null}}function ee(j){if(!j)return null;if(typeof j=="string")try{return Go(wa(j)||null)}catch(Q){return console.warn("Failed to parse style yaml",Q),null}return Go(q(j))}function z(j,Q){try{return JSON.stringify(j)===JSON.stringify(Q)}catch{return!1}}function oe(){var Q;if(!c.value)return;const j=ee(w.value);z(j,((Q=c.value)==null?void 0:Q.style)??null)||(c.value={...c.value,style:j})}function ye(){ae&&clearTimeout(ae),ae=setTimeout(()=>{ae=null,oe()},JE)}const we=async()=>{try{const j=await fetch(`/api/gis-service/${s}`);if(!j.ok)throw new Error(`${j.status}`);const Q=await j.json();u.value=Q||{},d.value=s;const _e=ee(Q.style);c.value=Q?{...Q,style:q(_e)}:null,w.value=_e,B.value=typeof(Q==null?void 0:Q.style)=="string"?Q.style:_e?Oa(_e):"",W.value=(Q==null?void 0:Q.popup)||[],I.value=Q.card_mode==="html"?"html":"list",J.value=Q.card,te.value=Q.html,L.value=(Q==null?void 0:Q.legend)||[],ue.value=(Q==null?void 0:Q.filters)||[]}catch(j){console.error("Failed to fetch map info",j)}};e.watch(()=>{var j;return(j=c.value)==null?void 0:j.style},j=>{w.value=ee(j)},{deep:!0}),e.watch(()=>w.value,()=>{ye()},{deep:!0}),e.onBeforeUnmount(()=>{ae&&(clearTimeout(ae),ae=null),g==null||g(),g=null});async function T(j){try{const Q=await fetch(`/api/gis-clear-vtile/${j}`),{message:_e,error:ve,code:ze}=await Q.json();if(ze===200)return Ee.notify({type:"success",title:"Успіх",message:_e});Ee.notify({type:"error",title:"Помилка",message:ve})}catch(Q){Ee.notify({type:"error",title:"Помилка",message:"Не вдалося очистити тайли"}),console.error(Q)}}async function K(j,Q){await ie({[j]:Q},j)}function me(){const j=q(w.value);c.value=c.value?{...c.value,style:j}:c.value}async function ie(j,Q){if(c.value={...c.value||{},...j},typeof j.html<"u"&&(u.value={...u.value||{},html:j.html}),!!ne.value)try{if(!(await fetch(`/api/gis-service/${ne.value}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(j)})).ok)throw new Error("Save failed");Ee.notify({type:"success",title:"Успіх",message:`${Q} saved`}),await we()}catch(_e){Ee.notify({type:"error",title:"Помилка",message:`Failed to save ${Q}`}),console.error(_e)}}async function de(j,Q){if(j!=="card"){await K(j,Q);return}const _e=(Q==null?void 0:Q.card_mode)==="html"?"html":"list",ve=_e==="html"&&typeof(Q==null?void 0:Q.html)=="string"?Q.html:"",ze=(_e==="html"?[]:null)||(Array.isArray(Q==null?void 0:Q.list)?Q.list:[]);J.value=ze,I.value=_e,te.value=ve;const Ae={card_mode:_e};_e==="html"&&(Ae.html=ve),_e==="list"&&(Ae.card=ze),await ie(Ae,"card")}return(j,Q)=>{var _e,ve,ze;return e.openBlock(),e.createElementBlock("div",CE,[e.createElementVNode("div",NE,[e.createElementVNode("div",VE,[e.createElementVNode("div",$E,[e.createElementVNode("div",BE,[e.createElementVNode("div",SE,[e.createElementVNode("div",vE,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:H},e.toDisplayString(F.value),1),Q[10]||(Q[10]=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",LE,e.toDisplayString(((_e=c.value)==null?void 0:_e.name)||"Dataset"),1)]),e.createElementVNode("div",TE,[e.createElementVNode("div",AE,[e.createElementVNode("div",ME,[e.createElementVNode("h1",FE,e.toDisplayString(((ve=c.value)==null?void 0:ve.name)||"Dataset"),1),$.value?(e.openBlock(),e.createElementBlock("div",DE,[e.createElementVNode("span",PE,e.toDisplayString($.value),1)])):e.createCommentVNode("",!0)]),M.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:M.value},e.toDisplayString(M.value),9,zE)):e.createCommentVNode("",!0)])])]),ne.value?(e.openBlock(),e.createBlock(qr,{key:0,class:"flex-shrink-0","entity-id":ne.value,"entity-info":{name:(ze=c.value)==null?void 0:ze.name},table:"gis.services.table","entity-label":"Сервіс","save-method":"put","show-xml-item":!1,"clear-tiles-handler":T,onSaved:we},null,8,["entity-id","entity-info"])):e.createCommentVNode("",!0)])])]),e.createElementVNode("div",RE,[e.createElementVNode("div",IE,[e.createVNode(eo,{ref_key:"mapViewRef",ref:i},{default:e.withCtx(()=>{var Ae,Ye,Ge,ot,Qe,P,fe;return[(Ae=c.value)!=null&&Ae.service_id?(e.openBlock(),e.createBlock(EE,{key:0,id:(Ye=c.value)==null?void 0:Ye.service_id,layer:c.value,"style-spec":((Ge=c.value)==null?void 0:Ge.style)||null,autoCenter:!1},null,8,["id","layer","style-spec"])):e.createCommentVNode("",!0),ne.value?(e.openBlock(),e.createBlock(jl,{key:1,"layer-id":ne.value,boundary:((ot=c.value)==null?void 0:ot.boundary)||((Qe=v.value)==null?void 0:Qe.boundary)||null,katottg:((P=c.value)==null?void 0:P.katottg)||((fe=v.value)==null?void 0:fe.katottg)||null},null,8,["layer-id","boundary","katottg"])):e.createCommentVNode("",!0),e.createElementVNode("div",jE,[ne.value?(e.openBlock(),e.createBlock(sr,{key:0,"layer-id":ne.value,filters:ue.value},null,8,["layer-id","filters"])):e.createCommentVNode("",!0)]),Q[11]||(Q[11]=e.createElementVNode("div",{id:"map-filter-popover-host",class:"map-widget__filter-host"},null,-1)),e.createElementVNode("div",OE,[e.createVNode(rn)]),e.createElementVNode("div",UE,[e.createVNode(Ht),u.value.center?(e.openBlock(),e.createBlock(Ht,{key:0,targetCenter:u.value.center,targetLabel:"Ценр даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0)]),e.createElementVNode("div",qE,[e.createVNode(ar,{items:L.value||null},null,8,["items"])]),e.createVNode(El),e.createVNode(lr,{html:u.value.html},null,8,["html"])]}),_:1},512)])]),e.createVNode(jr,{open:be.value,onToggle:Q[0]||(Q[0]=Ae=>be.value=!be.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",be.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",HE,[e.createElementVNode("div",WE,[e.createElementVNode("div",YE,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(he,Ae=>e.createElementVNode("button",{key:Ae.key,type:"button",role:"tab","aria-selected":D.value===Ae.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",D.value===Ae.key?"bg-white shadow-sm text-gray-700":""]),onClick:Ye=>D.value=Ae.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(Ae.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",ZE,e.toDisplayString(Ae.label),1)],10,GE)),64))])]),e.createElementVNode("div",KE,[D.value==="style"?(e.openBlock(),e.createBlock(tE,{key:0,token:ne.value,"style-text":B.value,"style-yaml":w.value,"onUpdate:styleYaml":Q[1]||(Q[1]=Ae=>w.value=Ae),"onUpdate:styleText":Q[2]||(Q[2]=Ae=>B.value=Ae),onUpdate:me},null,8,["token","style-text","style-yaml"])):D.value==="legend"?(e.openBlock(),e.createBlock(fE,{key:1,token:ne.value,columns:L.value,"onUpdate:columns":Q[3]||(Q[3]=Ae=>L.value=Ae),onSave:Q[4]||(Q[4]=Ae=>K("legend",Ae))},null,8,["token","columns"])):D.value==="popup"?(e.openBlock(),e.createBlock(rE,{key:2,token:ne.value,columns:W.value,fields:u.value.fields,"onUpdate:columns":Q[5]||(Q[5]=Ae=>W.value=Ae),onSave:Q[6]||(Q[6]=Ae=>K("popup",Ae))},null,8,["token","columns","fields"])):D.value==="card"?(e.openBlock(),e.createBlock(kE,{key:3,token:ne.value,columns:J.value,fields:u.value.fields,"view-mode":I.value,html:te.value,"onUpdate:columns":Q[7]||(Q[7]=Ae=>J.value=Ae),onSave:de},null,8,["token","columns","fields","view-mode","html"])):D.value==="filter"?(e.openBlock(),e.createBlock(_E,{key:4,token:ne.value,fields:u.value.fields,columns:ue.value,"onUpdate:columns":Q[8]||(Q[8]=Ae=>ue.value=Ae),onSave:Q[9]||(Q[9]=Ae=>K("filters",Ae))},null,8,["token","fields","columns"])):D.value==="metadata"?(e.openBlock(),e.createBlock(Ur,{key:5,data:c.value,"entity-id":String(e.unref(s)),"entity-type":"service",onSaved:we},null,8,["data","entity-id"])):e.createCommentVNode("",!0)])])],2)])}}}),[["__scopeId","data-v-ae471f34"]])},Symbol.toStringTag,{value:"Module"})),eC={class:"flex-1 flex flex-col bg-gray-50 h-screen overflow-hidden p-0 m-0"},tC={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"},nC={class:"flex-1 px-4 sm:px-6 pb-4 overflow-y-auto overflow-x-visible"},oC={class:"bg-white rounded-lg shadow-sm border border-gray-200 overflow-visible"},rC={class:"p-3 border-b border-gray-200"},lC={class:"flex flex-col sm:flex-row gap-2"},aC={class:"entity-table-root"},sC={class:"gap-2 inline-flex"},iC=["onClick"],cC={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"},dC={class:"text-sm text-gray-500"},uC={class:"font-medium text-gray-700"},fC={class:"font-medium text-gray-700"},mC={class:"font-medium text-gray-700"},pC={class:"flex items-center justify-end gap-3"},gC=Object.freeze(Object.defineProperty({__proto__:null,default:Me(e.defineComponent({__name:"RastersTablePage",props:{entityKey:{default:"rasters"},entityBasePath:{default:"/gis.rasters"},columnsConfig:{default:()=>[]}},setup(t){const n=e.defineAsyncComponent(()=>import("@opengis/table")),o=qe.useRoute(),r=qe.useRouter(),l=t,s=e.computed(()=>{var v;return String(((v=o.meta)==null?void 0:v.title)||"Растри")}),i=e.computed(()=>{var v;return String(((v=o.meta)==null?void 0:v.description)||"")}),d=e.computed(()=>`Пошук ${String(s.value).trim()}...`),u=e.computed(()=>l.entityKey||"rasters"),c=e.computed(()=>l.entityBasePath||"/gis.rasters"),p=e.ref([]),a=e.ref(!0),g=e.ref([]),m=e.ref([]),y=e.ref({}),k=e.ref([]),h=e.ref(String(o.query.search??"")),f=e.ref(Math.max(1,Number(o.query.page)||1)),b=e.ref(15),x=e.ref(0),C=e.computed(()=>x.value>0),V=e.computed(()=>x.value?(f.value-1)*b.value+1:0),E=e.computed(()=>x.value?Math.min(f.value*b.value,x.value):0);function w(v){const M=new URLSearchParams;return Object.entries(v).forEach(([$,N])=>{if(!(N==null||N==="")){if(Array.isArray(N)){N.forEach(F=>{F!=null&&F!==""&&M.append($,String(F))});return}M.append($,String(N))}}),M.toString()}function B(){return`${c.value}/new`}function L(v){return`${c.value}/${v}/edit`}async function W(){try{a.value=!0;const v=`/api/data/gis.${u.value}.table`,M=w({...y.value,page:f.value,limit:b.value}),$=await fetch(M?`${v}?${M}`:v);if(!$.ok)throw new Error(`Rows fetch failed: ${$.status}`);const N=await $.json();p.value=N.rows||[],x.value=Number(N.filtered??N.total??N.count??p.value.length)||0,g.value=l.columnsConfig.length?l.columnsConfig:N.columns||[],m.value=N.filters||[],k.value=N.actions||[],g.value.length&&!g.value[0].link?g.value[0].link=`${c.value}/{id}`:g.value.length&&(g.value[0].link=`${c.value}/{id}`)}catch{p.value=[],x.value=0}finally{a.value=!1}}function J(v){y.value=v,f.value=1,ne(),W()}async function I(v,M,$){const N=await fetch(`/api/form/gis.${u.value}.table/${v.id}`);if(!N.ok)throw new Error(`Form fetch failed: ${N.status}`);const H=(await N.json()).token,he=await fetch(`/api/table/${H}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({[M]:$})});if(!he.ok)throw Ee.notify({type:"error",title:"Помилка збереження",message:`Поле "${M}" не оновлено`}),new Error(`Save failed: ${he.status}`);Ee.notify({title:"Збережено",message:`Поле "${M}" оновлено`})}function te(v,M){y.value={...y.value,[v]:M},f.value=1,ne(),W()}function ue(v){te((v==null?void 0:v.name)||"search",(v==null?void 0:v.value)??h.value)}function be(v){h.value="",te(v||"search",void 0)}function ae(v){!v||v===f.value||(f.value=v,ne(),W())}function ne(){const v={...o.query,page:String(f.value),...h.value?{search:h.value}:{}};h.value||delete v.search,delete v.view,r.replace({query:v})}return e.onMounted(()=>{W(),document.title=s.value}),e.watch(()=>o.name,()=>{f.value=1,h.value="",W(),document.title=s.value}),e.watch(()=>o.query,v=>{const M=Math.max(1,Number(v.page)||1),$=String(v.search??""),N=M!==f.value,F=$!==h.value;!N&&!F||(f.value=M,h.value=$,y.value={...y.value,search:$||void 0},W())}),(v,M)=>(e.openBlock(),e.createElementBlock("div",eC,[e.createVNode(an,{variant:"table"},e.createSlots({title:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value),1)]),actions:e.withCtx(()=>[e.createElementVNode("a",tC,[e.createVNode(e.unref(ge.RefreshCw),{size:16}),M[2]||(M[2]=e.createTextVNode(" Оновити растри ",-1))]),e.createElementVNode("a",{onClick:M[0]||(M[0]=$=>e.unref(r).push(B())),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(ge.Plus),{size:16}),M[3]||(M[3]=e.createTextVNode(" Додати ",-1))])]),_:2},[i.value?{name:"description",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(i.value),1)]),key:"0"}:void 0]),1024),e.createElementVNode("div",nC,[e.createElementVNode("div",oC,[e.createElementVNode("div",rC,[e.createElementVNode("div",lC,[e.createVNode(e.unref(Jn.FilterField),{modelValue:h.value,"onUpdate:modelValue":M[1]||(M[1]=$=>h.value=$),name:"search",type:"text",layout:"inline",class:"flex-1",width:"100%",cleanable:!0,onChange:ue,onClear:be,placeholder:d.value},null,8,["modelValue","placeholder"]),e.createVNode(e.unref(Jn.Filter),{schema:m.value,value:y.value,onChange:J,layout:"inline",mode:"soft",view:"popover",limit:8,class:"flex-shrink-0"},null,8,["schema","value"])])]),e.createElementVNode("div",aC,[e.createVNode(e.unref(n),{rows:p.value,columns:g.value,loading:a.value,router:e.unref(r),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:$})=>[e.createElementVNode("div",sC,[e.createElementVNode("button",{onClick:N=>e.unref(r).push(L($.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(Qn)],8,iC)])]),_:1},8,["rows","columns","loading","router"])]),C.value?(e.openBlock(),e.createElementBlock("div",cC,[e.createElementVNode("div",dC,[M[4]||(M[4]=e.createTextVNode(" Показано ",-1)),e.createElementVNode("span",uC,e.toDisplayString(V.value),1),M[5]||(M[5]=e.createTextVNode(" - ",-1)),e.createElementVNode("span",fC,e.toDisplayString(E.value),1),M[6]||(M[6]=e.createTextVNode(" з ",-1)),e.createElementVNode("span",mC,e.toDisplayString(x.value),1)]),e.createElementVNode("div",pC,[e.createVNode(e.unref(Ee.VsPagination),{total:x.value,page:f.value,"page-size":b.value,showPageSizes:!1,pageRange:5,view:"button",color:"gray","onUpdate:page":ae,onPageChange:ae},null,8,["total","page","page-size"])])])):e.createCommentVNode("",!0)])])]))}}),[["__scopeId","data-v-63309b89"]])},Symbol.toStringTag,{value:"Module"})),yC={class:"flex-1 overflow-y-auto p-4 sm:p-6"},hC={class:"space-y-3"},bC={class:"bg-white p-3 rounded-xl border border-gray-200 shadow-sm"},xC={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2"},kC={class:"text-xs text-gray-500 mb-1"},wC={key:0,class:"text-base text-md font-semibold text-gray-900"},_C={key:1,class:"text-base text-md font-semibold text-gray-900"},EC={class:"bg-white p-3 rounded-xl border border-gray-200 shadow-sm"},CC={class:"space-y-2"},NC={class:"bg-gradient-to-br from-blue-50 to-blue-100/30 p-4 rounded-lg border border-blue-200"},VC={class:"text-sm font-semibold text-gray-900"},$C={class:"text-xs text-gray-600 mt-1"},BC={class:"grid grid-cols-2 gap-3"},SC={class:"text-xs text-gray-500 mb-1"},vC={class:"text-sm font-semibold text-gray-900"},LC={class:"bg-gray-50 p-4 rounded-lg"},TC={class:"grid grid-cols-2 gap-4"},AC={class:"text-xs text-gray-500 mb-1"},MC={class:"text-sm font-semibold text-gray-900"},FC=e.defineComponent({directives:{tooltip:Ee.TooltipDirective},__name:"raster-info-tab",props:{details:{}},setup(t){return(n,o)=>{const r=e.resolveDirective("tooltip");return e.openBlock(),e.createElementBlock("div",yC,[e.createElementVNode("div",hC,[e.createElementVNode("div",bC,[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",xC,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.baseParams,l=>(e.openBlock(),e.createElementBlock("div",{key:l.label,class:"bg-gray-50 p-2 rounded-lg"},[e.createElementVNode("p",kC,e.toDisplayString(l.label),1),l.tooltip?e.withDirectives((e.openBlock(),e.createElementBlock("p",wC,[e.createTextVNode(e.toDisplayString(l.value),1)])),[[r,l.tooltip]]):(e.openBlock(),e.createElementBlock("p",_C,e.toDisplayString(l.value),1))]))),128))])]),e.createElementVNode("div",EC,[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",CC,[e.createElementVNode("div",null,[o[1]||(o[1]=e.createElementVNode("p",{class:"text-xs text-gray-500 mb-2"},"Система координат",-1)),e.createElementVNode("div",NC,[e.createElementVNode("p",VC,e.toDisplayString(t.details.spatial.crs.code),1),e.createElementVNode("p",$C,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",BC,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.spatial.bounds,l=>(e.openBlock(),e.createElementBlock("div",{key:l.label,class:"bg-gray-50 p-2 rounded-lg border border-gray-200"},[e.createElementVNode("p",SC,e.toDisplayString(l.label),1),e.createElementVNode("p",vC,e.toDisplayString(l.value),1)]))),128))])]),e.createElementVNode("div",LC,[e.createElementVNode("div",TC,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.spatial.resolution,l=>(e.openBlock(),e.createElementBlock("div",{key:l.label},[e.createElementVNode("p",AC,e.toDisplayString(l.label),1),e.createElementVNode("p",MC,e.toDisplayString(l.value),1)]))),128))])])])])])])}}}),DC={class:"flex-1 overflow-y-auto space-y-3 pr-1"},PC={class:"font-medium text-sm text-gray-800"},zC={class:"text-xs text-gray-500"},RC=e.defineComponent({__name:"raster-files-tab",props:{files:{}},setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",DC,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.files,r=>(e.openBlock(),e.createElementBlock("div",{key:r.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",PC,e.toDisplayString(r.name),1),e.createElementVNode("p",zC,e.toDisplayString(r.resolution)+" • "+e.toDisplayString(r.size)+"MB",1)]),e.createElementVNode("span",{class:e.normalizeClass(["text-[11px] font-semibold px-2 py-0.5 rounded-full",r.statusClass])},e.toDisplayString(r.status),3)]))),128))]))}}),IC={},jC={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 OC(t,n){return e.openBlock(),e.createElementBlock("svg",jC,[...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 UC=Me(IC,[["render",OC]]),qC={class:"absolute top-[5.5rem] left-4 z-30 flex flex-col items-start gap-2"},HC={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},WC={class:"flex items-center gap-2"},YC={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},GC={class:"inline-flex items-center gap-2 text-[11px] text-slate-600"},ZC=["checked"],KC=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",r=`${o}-source`,l=n.extent&&n.extent.length===4?[...n.extent]:void 0,s=je(o,{sourceId:r,source:{type:"raster",tiles:n.tileUrl?[n.tileUrl+"?nottl=1"]:[],tileSize:256,...l?{bounds:l}:{}},layer:{id:`${o}-raster`,type:"raster",paint:{"raster-opacity":1}},beforeId:n.beforeId??null}),{fitBounds:i}=Je(),d=e.ref(1);e.watch(()=>n.tileUrl,a=>{if(!a){s.setVisible(!1);return}s.setVisible(!0),s.setTiles([a])},{immediate:!0}),e.watch(()=>d.value,a=>{s.setOpacity(a)},{immediate:!0});let u=null,c=!1;e.watch(()=>n.extent,a=>{if(!a||a.length!==4)return;const g=a.join(",");if(g!==u){if(u=g,!c){c=!0;return}i==null||i([[a[0],a[1]],[a[2],a[3]]],{padding:40,maxZoom:17})}},{immediate:!0});const p=e.computed(()=>`${Math.round(d.value*100)}%`);return(a,g)=>(e.openBlock(),e.createElementBlock("div",qC,[e.createElementVNode("div",HC,[e.createElementVNode("div",WC,[g[2]||(g[2]=e.createElementVNode("span",null,"Прозорість:",-1)),e.withDirectives(e.createElementVNode("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":g[0]||(g[0]=m=>d.value=m),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,d.value,void 0,{number:!0}]]),e.createElementVNode("span",null,e.toDisplayString(p.value),1)])]),e.createElementVNode("div",YC,[e.createElementVNode("label",GC,[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:g[1]||(g[1]=m=>a.$emit("toggle-extent",m.target.checked))},null,40,ZC),g[3]||(g[3]=e.createElementVNode("span",null,"Межі растру",-1))])])]))}}),Fo=e.defineComponent({__name:"ExtentOutlineLayer",props:{extent:{},layerId:{},beforeId:{},lineColor:{},lineWidth:{}},setup(t){const n=t,o=n.layerId||"extent-outline-layer",r=`${o}-source`,l=e.computed(()=>{const{extent:d}=n;if(!d||d.length!==4)return null;const[u,c,p,a]=d;return[u,c,p,a].some(g=>typeof g!="number"||Number.isNaN(g))?null:{type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[u,c],[p,c],[p,a],[u,a],[u,c]]]}}]}}),s=Je(),i=je(o,{sourceId:r,source:{type:"geojson",data:l.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(()=>l.value,d=>{var c;if(!d){i.setVisible(!1),i.setData({type:"FeatureCollection",features:[]});return}i.setVisible(!0),i.setData(d);const u=(c=s.map)==null?void 0:c.value;u!=null&&u.moveLayer&&u.getLayer(o)&&u.moveLayer(o)},{immediate:!0}),(d,u)=>e.createCommentVNode("",!0)}}),XC={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},JC={class:"flex-1 relative overflow-hidden"},QC={class:"absolute top-0 left-0 w-full z-20"},eN={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},tN={class:"flex items-start justify-between gap-4"},nN={class:"flex-1 min-w-0"},oN={class:"flex items-center text-sm text-gray-500 mb-3"},rN={class:"text-gray-900 font-medium truncate max-w-xs"},lN={class:"flex items-center justify-between gap-4"},aN={class:"flex-1 min-w-0"},sN={class:"flex items-center gap-3 mb-1"},iN={class:"text-base font-semibold text-gray-900 truncate"},cN=["title"],dN={class:"flex items-center gap-4 min-w-0"},uN={class:"flex-1 min-w-0"},fN=["title"],mN={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]"},pN={class:"relative w-full h-full"},gN={class:"absolute top-4 left-4 z-20"},yN={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"},hN={class:"absolute top-[6.5rem] right-2 space-y-1 z-20"},bN={class:"flex-1 flex flex-col h-full"},xN={class:"px-3 pt-3 pb-2 border-b border-gray-100"},kN={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"},wN=["aria-selected","onClick"],_N={class:"leading-none"},EN={class:"flex flex-col flex-1 overflow-y-hidden p-3"},CN={key:0,class:"mb-3 text-xs text-slate-500"},NN={key:1,class:"mb-3 text-xs text-rose-600"},VN="OpenGIS",Za=2,Do=5,$N=5,BN=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=qe.useRouter(),r=qe.useRoute(),l=e.ref(null),s=e.computed(()=>{var A;const P=(A=r.matched[r.matched.length-1])==null?void 0:A.path;return(typeof P=="string"&&P?P:r.path).replace(/\/:id\??$/,"")||"/"}),i=e.computed(()=>{var fe;const P=(fe=r.meta)==null?void 0:fe.title;return typeof P=="string"&&P.trim()?P:"Растри"});function d(){o.push(s.value)}const u=e.computed(()=>{var fe;const P=(fe=r.params)==null?void 0:fe.id;return typeof P=="string"?P:void 0}),c=e.ref(null),p=e.ref(!1),a=e.ref(!1),g=e.ref(null),m=e.ref(!0),y=e.ref(!1),k=e.ref(null);let h=null,f=null;const b=e.ref(!1);let x=null,C=!1;function V(P){if(Array.isArray(P))return V(P[0]);if(typeof P!="string"&&typeof P!="number")return null;const fe=typeof P=="number"?P:Number(P.trim());return Number.isFinite(fe)?fe:null}function E(P,fe){return P.toFixed(fe)}function w(P,fe,A){const Z=.5*10**-A;return Math.abs(P-fe)>Z}function B(){var P;return(P=l.value)==null?void 0:P.ctx}function L(){var R,se,re,Ce;const P=(se=(R=B())==null?void 0:R.map)==null?void 0:se.value;if(!P)return;const fe=V(r.query.z),A=V(r.query.x),Z=V(r.query.y);if(fe==null||A==null||Z==null)return;const X=(re=P.getCenter)==null?void 0:re.call(P),xe=(Ce=P.getZoom)==null?void 0:Ce.call(P);(!X||w(X.lng,A,Do)||w(X.lat,Z,Do)||w(xe??0,fe,Za))&&(b.value=!0,P.jumpTo({center:[A,Z],zoom:fe}),b.value=!1)}function W(){var X,xe,Ve,R;if(b.value)return;const P=(xe=(X=B())==null?void 0:X.map)==null?void 0:xe.value;if(!P)return;const fe=(Ve=P.getCenter)==null?void 0:Ve.call(P),A=(R=P.getZoom)==null?void 0:R.call(P);if(!fe||A==null)return;const Z={...r.query,z:E(A,Za),x:E(fe.lng,Do),y:E(fe.lat,Do)};r.query.z===Z.z&&r.query.x===Z.x&&r.query.y===Z.y||o.replace({query:Z})}function J(){var fe;if(typeof document>"u")return;const P=(fe=ee.value)==null?void 0:fe.name;document.title=P?`${P} — Растер`:VN}function I(P){return Number(P.toFixed($N))}function te(P,fe){const[A,Z]=P,[X,xe]=fe;return[I(Math.min(A,X)),I(Math.min(Z,xe)),I(Math.max(A,X)),I(Math.max(Z,xe))]}function ue(P){const[fe,A,Z,X]=P;return{type:"Polygon",coordinates:[[[fe,A],[Z,A],[Z,X],[fe,X],[fe,A]]]}}function be(P){var Z,X,xe;const fe=(X=(Z=B())==null?void 0:Z.map)==null?void 0:X.value,A=(xe=fe==null?void 0:fe.getCanvas)==null?void 0:xe.call(fe);A!=null&&A.style&&(A.style.cursor=P)}async function ae(P,fe){if(!(!u.value||!c.value))try{const A=ue(P),Z=await fetch(`/api/gis-metadata/raster/${encodeURIComponent(u.value)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({geom:A})});if(!Z.ok)throw new Error(`Failed to save raster metadata geom: ${Z.status}`);Ee.notify({type:"success",title:"Extent збережено",message:"Нові межі успішно збережено."}),await pe()}catch(A){console.error("Failed to save raster extent",A),c.value&&(c.value={...c.value,extent:fe?[...fe]:void 0}),Ee.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти Extent"})}}function ne(P){var A,Z,X;const fe=(Z=(A=B())==null?void 0:A.map)==null?void 0:Z.value;if((X=fe==null?void 0:fe.dragPan)!=null&&X.enable&&fe.dragPan.enable(),(P==null?void 0:P.length)===4&&c.value){const xe=Array.isArray(c.value.extent)?[...c.value.extent]:null;c.value={...c.value,extent:[...P]},ae(P,xe)}x=null,C=!1,k.value=null,y.value=!1,be("")}function v(){ne(null)}function M(){var xe,Ve;const P=(Ve=(xe=B())==null?void 0:xe.map)==null?void 0:Ve.value;if(!P)return;const fe=R=>{var re,Ce,$e;if(!y.value||((re=R==null?void 0:R.originalEvent)==null?void 0:re.button)!=null&&R.originalEvent.button!==0)return;const se=R==null?void 0:R.lngLat;se&&(x=[se.lng,se.lat],C=!0,k.value=[se.lng,se.lat,se.lng,se.lat],($e=(Ce=P.dragPan)==null?void 0:Ce.disable)==null||$e.call(Ce))},A=R=>{if(!y.value||!C||!x)return;const se=R==null?void 0:R.lngLat;se&&(k.value=te(x,[se.lng,se.lat]))},Z=R=>{if(!y.value||!C||!x)return;const se=R==null?void 0:R.lngLat;if(!se){v();return}const re=te(x,[se.lng,se.lat]),[Ce,$e,Ie,tt]=re;if(!(Math.abs(Ie-Ce)>0&&Math.abs(tt-$e)>0)){Ee.notify({type:"warning",title:"Bounds не змінено",message:"Потрібно протягнути прямокутник з ненульовою площею."}),v();return}ne(re)},X=R=>{y.value&&R.key==="Escape"&&(R.preventDefault(),v())};P.on("mousedown",fe),P.on("mousemove",A),P.on("mouseup",Z),window.addEventListener("keydown",X),f=()=>{P.off("mousedown",fe),P.off("mousemove",A),P.off("mouseup",Z),window.removeEventListener("keydown",X)}}async function $(){var A;if(y.value)return;const P=B();!(P!=null&&P.ready)||(await P.ready(),!((A=P.map)==null?void 0:A.value))||(f||M(),y.value=!0,C=!1,x=null,k.value=null,be("crosshair"),Ee.notify({type:"info",title:"Редагування Bounds",message:"Протягніть прямокутник на карті, щоб задати нові межі."}))}const N=e.computed(()=>{var fe;const P=(fe=c.value)==null?void 0:fe.url;return P?/^https?:\/\//i.test(P)||typeof window>"u"||typeof location>"u"?P:`${location.origin}${P}`:""}),F=e.computed(()=>{var P;return((P=c.value)==null?void 0:P.extent)??null}),H=e.computed(()=>u.value?`raster-${u.value}`:void 0),he=e.computed(()=>u.value?`raster-extent-${u.value}`:"raster-extent"),Y=e.computed(()=>u.value?`raster-extent-draft-${u.value}`:"raster-extent-draft"),D=e.computed(()=>{const P=H.value??"raster",fe=F.value&&F.value.length===4?F.value.join(","):"no-extent";return`${P}-${fe}`}),O=e.computed(()=>!!N.value),q=e.computed(()=>{const P=F.value;if(!P||P.length!==4)return null;const[fe,A,Z,X]=P;return[fe,A,Z,X].some(xe=>typeof xe!="number"||Number.isNaN(xe))?null:[(fe+Z)/2,(A+X)/2]}),ee=e.computed(()=>{var xe,Ve;const P=c.value,fe=P==null?void 0:P.extent,Z=u.value??"—",X=[P!=null&&P.extension?`Формат ${String(P.extension).toUpperCase()}`:null,(P==null?void 0:P.resolution)||null].filter(Boolean).join(", ");return{id:Z,name:(P==null?void 0:P.name)||((Ve=(xe=P==null?void 0:P.files)==null?void 0:xe[0])==null?void 0:Ve.name),description:(P==null?void 0:P.description)||X||"Попередній перегляд растрового шару.",coverage:fe&&fe.length===4?`${Qe(fe[0])}, ${Qe(fe[1])} → ${Qe(fe[2])}, ${Qe(fe[3])}`:"Покриття уточнюється",crs:P!=null&&P.srid?`EPSG:${P.srid}`:"EPSG:4326",source:P!=null&&P.proj4?P.proj4:"Джерело: Mapnik",updatedAt:P!=null&&P.cache?"Дані кешовано":"Нові дані"}}),z=e.computed(()=>{const P=c.value;return P?[P.source_path,P.srid?`SRID: ${P.srid}`:null,P.is_public?"Публічна":"Не публічна",P.is_active?"Активна":"Неактивна",P.cache?"Кешовано":null].filter(fe=>fe).join(", "):""}),oe=[{key:"info",label:"Інформація",icon:UC},{key:"files",label:"Файли",icon:Qn},{key:"metadata",label:"Метадані",icon:Or}],ye=oe.map(P=>P.key),we=e.ref(ye.includes(r.query.tab)?r.query.tab:"info"),T=e.ref(!0);e.watch(()=>r.query.tab,P=>{P&&ye.includes(P)&&we.value!==P&&(we.value=P)}),e.watch(we,P=>{r.query.tab!==P&&o.replace({query:{...r.query,tab:P}})});const K=e.computed(()=>j(c.value)),me=e.computed(()=>_e(c.value));e.watch(()=>c.value,()=>{J()},{immediate:!0});async function ie(){var Z;const P=B();if(!(P!=null&&P.ready))return;await P.ready(),L();const fe=(Z=P.map)==null?void 0:Z.value;if(!fe)return;const A=()=>W();fe.on("moveend",A),fe.on("zoomend",A),h=()=>{fe.off("moveend",A),fe.off("zoomend",A)}}e.watch(()=>[r.query.z,r.query.x,r.query.y],()=>{L()}),e.onMounted(()=>{ie()}),e.onBeforeUnmount(()=>{h==null||h(),h=null,f==null||f(),f=null,be("")}),e.watch(u,()=>{pe()},{immediate:!0});async function de(P){var fe;pe(),((fe=c.value)==null?void 0:fe.srid)!==P.srid&&(Ee.notify({title:"XML start",type:"info",message:"зміна системи координат, оновлюємо карту ..."}),await Le(`/api/gis-xml/${encodeURIComponent(u.value)}`),Ee.notify({title:"XML created",type:"info",message:"карта створена"}),location.reload())}async function pe(){const P=u.value;if(!P){c.value=null,g.value=null;return}p.value=!0,g.value=null;try{const fe=await fetch(`/api/gis-raster/${encodeURIComponent(P)}`);if(!fe.ok)throw new Error(`HTTP ${fe.status}`);const A=await fe.json();A.xml&&(a.value=!0),c.value=A,A.xml||(Ee.notify({title:"XML not found",type:"info",message:"йде створення xml ... зачекайте"}),await Le(`/api/gis-xml/${encodeURIComponent(P)}`),Ee.notify({title:"XML created",type:"info",message:"карта створена"}),fetch(`/api/gis-raster/${encodeURIComponent(P)}?nocache=1`),a.value=!0)}catch(fe){console.error("Failed to load raster info",fe),c.value=null,g.value=fe instanceof Error?fe.message:String(fe)}finally{p.value=!1}}function Le(P){return new Promise((fe,A)=>{const Z=new EventSource(P),X=[];Z.onmessage=xe=>{X.push(xe.data),console.log("Received:",xe.data)},Z.addEventListener("end",()=>{Z.close(),fe(X)}),Z.onerror=xe=>{Z.close(),fe(xe)}})}function j(P){var fe;return(fe=P==null?void 0:P.files)!=null&&fe.length?P.files.map(A=>({name:A.name,resolution:Q(A.name,P),size:A.size||"—",status:"Готово",statusClass:"bg-emerald-50 text-emerald-600 border border-emerald-100"})):[]}function Q(P,fe){const A=P.toLowerCase();return A.endsWith(".tfw")?"Georeference":A.endsWith(".xml")?"Опис":A.endsWith(".tif")||A.endsWith(".tiff")?fe!=null&&fe.resolution?fe.resolution:"Растер":(fe==null?void 0:fe.resolution)??"Файл"}function _e(P){return P?{baseParams:ze(P),spatial:{crs:{code:P.srid?`EPSG:${P.srid}`:"EPSG:4326",description:P.proj4||"WGS 84 — World Geodetic System 1984"},bounds:Ae(P.extent),resolution:Ye(P)},statistics:Ge(P),technical:ot(P)}:null}function ve(P){return P!=null&&P.length?P.map(A=>{var X;if(!A)return"";const Z=A.trim().split(/\s+/)[0];return((X=Z==null?void 0:Z[0])==null?void 0:X.toUpperCase())||""}).filter(Boolean).join(""):""}function ze(P){var xe,Ve;const fe=P.bands_count??((xe=P.bands)==null?void 0:xe.length)??"—",A=ve(P.bands),Z=(P.bands??[]).map(R=>R.trim()).filter(R=>R.length>0),X=Z.length?Z.join(", "):void 0;return[{label:"Розмір растру, px",value:P.width&&P.height?`${P.width}×${P.height}`:"—"},{label:"Формат файлу",value:((Ve=P.extension)==null?void 0:Ve.toUpperCase())??"—"},{label:"Розмір файлу, mb",value:P.total_size?`${P.total_size}`:"—"},{label:"Кількість каналів",value:typeof fe=="number"?`${fe}${A?` (${A})`:""}`:`${fe}${A?` (${A})`:""}`,tooltip:X},{label:"Глибина кольору",value:P.color_depth?`${P.color_depth} біт/канал`:"—"},{label:"Стиснення",value:P.compression||"—"}]}function Ae(P){return!P||P.length!==4?[]:[{label:"Північ",value:Qe(P[3],"N")},{label:"Схід",value:Qe(P[2],"E")},{label:"Південь",value:Qe(P[1],"S")},{label:"Захід",value:Qe(P[0],"W")}]}function Ye(P){const fe=[{label:"Роздільна здатність",value:P.resolution||"—"}];return P.width&&P.height&&fe.push({label:"Розмір пікселя",value:`${P.width} × ${P.height} px`}),fe}function Ge(P){var fe;return(fe=P.bands)!=null&&fe.length?P.bands.map((A,Z)=>{const X=n[Z%n.length];return{label:`Канал ${Z+1}${A?` (${A})`:""}`,cardClass:X.cardClass,titleClass:X.titleClass,metrics:[{label:"Назва",value:A||`Канал ${Z+1}`},{label:"Глибина",value:P.color_depth?`${P.color_depth} біт`:"—"},{label:"Статус",value:P.cache?"Кешовано":"Готово"}]}}):[]}function ot(P){var fe;return[{label:"Тип даних",value:P.color_depth?`Unsigned Integer ${P.color_depth}-bit`:"—"},{label:"Компресія",value:P.compression||"—"},{label:"Кольорова інтерпретація",value:((fe=P.bands)==null?void 0:fe.join(", "))||"—"},{label:"SRID",value:P.srid?`EPSG:${P.srid}`:"—"},{label:"Проекція (proj4)",value:P.proj4||"—"},{label:"URL тайла",value:P.url||"—"}]}function Qe(P,fe){if(P==null||Number.isNaN(P))return"—";const A=`${P.toFixed(5)}°`;return fe?`${A} ${fe}`:A}return(P,fe)=>(e.openBlock(),e.createElementBlock("div",XC,[e.createElementVNode("div",JC,[e.createElementVNode("div",QC,[e.createElementVNode("div",eN,[e.createElementVNode("div",tN,[e.createElementVNode("div",nN,[e.createElementVNode("div",oN,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:d},e.toDisplayString(i.value),1),fe[2]||(fe[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:"lucide lucide-chevron-right w-4 h-4 mx-1"},[e.createElementVNode("path",{d:"m9 18 6-6-6-6"})],-1)),e.createElementVNode("span",rN,e.toDisplayString(ee.value.name||"Растер"),1)]),e.createElementVNode("div",lN,[e.createElementVNode("div",aN,[e.createElementVNode("div",sN,[e.createElementVNode("h1",iN,e.toDisplayString(ee.value.name||"Растер"),1)]),z.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:z.value},e.toDisplayString(z.value),9,cN)):e.createCommentVNode("",!0)])])]),e.createElementVNode("div",dN,[e.createElementVNode("div",uN,[e.createElementVNode("div",{class:"w-full text-xs text-gray-600 truncate",title:ee.value.description},e.toDisplayString(ee.value.description),9,fN)]),e.createVNode(qr,{"entity-id":u.value||"","entity-info":{name:ee.value.name},table:"gis.rasters.table","entity-label":"Растер","save-method":"put","edit-button-text":"Редагувати",onSaved:de},null,8,["entity-id","entity-info"])])])])]),e.createElementVNode("div",mN,[e.createElementVNode("div",pN,[e.createVNode(eo,{ref_key:"mapViewRef",ref:l},{default:e.withCtx(()=>[O.value&&a.value?(e.openBlock(),e.createBlock(KC,{key:D.value,"tile-url":N.value,extent:F.value,"layer-id":H.value,"show-raster-extent":m.value,onToggleExtent:fe[0]||(fe[0]=A=>m.value=A)},null,8,["tile-url","extent","layer-id","show-raster-extent"])):e.createCommentVNode("",!0),e.createVNode(Fo,{extent:m.value?F.value:null,"layer-id":he.value},null,8,["extent","layer-id"]),e.createVNode(Fo,{extent:k.value,"layer-id":Y.value,"line-color":"#0ea5e9","line-width":3},null,8,["extent","layer-id"]),e.createElementVNode("div",gN,[e.createVNode(rn)]),y.value?(e.openBlock(),e.createElementBlock("div",yN," Потягніть на карті, щоб намалювати нові Bounds. Esc скасовує редагування. ")):e.createCommentVNode("",!0),e.createElementVNode("div",hN,[e.createVNode(Ht),q.value?(e.openBlock(),e.createBlock(Ht,{key:0,targetCenter:q.value,targetLabel:"Центр даних",targetAriaLabel:"Перейти до центру даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0)])]),_:1},512)])]),e.createVNode(jr,{open:T.value,onToggle:fe[1]||(fe[1]=A=>T.value=!T.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",T.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",bN,[e.createElementVNode("div",xN,[e.createElementVNode("div",kN,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(oe,A=>e.createElementVNode("button",{key:A.key,type:"button",role:"tab","aria-selected":we.value===A.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",we.value===A.key?"bg-white shadow-sm text-gray-700":""]),onClick:Z=>we.value=A.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(A.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",_N,e.toDisplayString(A.label),1)],10,wN)),64))])]),e.createElementVNode("div",EN,[p.value?(e.openBlock(),e.createElementBlock("div",CN," Завантаження метаданих растру… ")):g.value?(e.openBlock(),e.createElementBlock("div",NN," Не вдалося отримати дані: "+e.toDisplayString(g.value),1)):e.createCommentVNode("",!0),we.value==="files"?(e.openBlock(),e.createBlock(RC,{key:2,files:K.value},null,8,["files"])):we.value==="metadata"?(e.openBlock(),e.createBlock(Ur,{key:3,data:c.value,"entity-id":u.value,"entity-type":"raster",onSaved:pe,onEditCssBounds:$},null,8,["data","entity-id"])):me.value?(e.openBlock(),e.createBlock(FC,{key:4,details:me.value},null,8,["details"])):e.createCommentVNode("",!0)])])],2)]))}})},Symbol.toStringTag,{value:"Module"})),SN={},vN={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 LN(t,n){return e.openBlock(),e.createElementBlock("svg",vN,[...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 TN=Me(SN,[["render",LN]]),AN={class:"flex flex-col h-full"},MN={class:"flex justify-end mb-3 gap-2"},FN=e.defineComponent({__name:"cartocss-css-tab",props:{modelValue:{}},emits:["update:modelValue","save"],setup(t,{emit:n}){const o=t,r=n,l=e.computed({get:()=>o.modelValue,set:s=>r("update:modelValue",s)});return(s,i)=>(e.openBlock(),e.createElementBlock("div",AN,[e.createElementVNode("div",MN,[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:i[0]||(i[0]=d=>s.$emit("save"))},[...i[2]||(i[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(Un,{modelValue:l.value,"onUpdate:modelValue":i[1]||(i[1]=d=>l.value=d),language:"cartocss",class:"flex-1 rounded-lg overflow-hidden"},null,8,["modelValue"])]))}}),DN={class:"flex flex-col flex-1 min-h-0"},PN={class:"flex justify-between mb-3 gap-2"},zN={class:"text-left"},RN={class:"font-medium text-gray-900"},IN={class:"text-xs text-gray-500"},jN={class:"flex justify-center gap-2"},ON=["checked","onChange"],UN={class:"text-sm font-medium text-gray-900"},qN=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"}],r=e.defineAsyncComponent(()=>import("@opengis/core").then(y=>y.VsModal)),l=e.defineAsyncComponent(()=>import("@opengis/form")),s=e.useModel(t,"modelValue"),i=n,d=e.ref(!1),u=e.ref({table:"",query:"",srid:"",key:"",columns:"",gcol:"",minzoom:"",maxzoom:"",proj4text:"",active:!0}),c={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 p(){u.value={table:"",query:"",srid:"",key:"",columns:"",gcol:"",minzoom:"",maxzoom:"",proj4text:"",active:!0},d.value=!0}function a(){d.value=!1}function g(){var h,f;const y=(h=u.value.table)==null?void 0:h.trim(),k=(f=u.value.key)==null?void 0:f.trim();if(!y||!k){Ee.notify({type:"warning",title:"Перевірка",message:"Вкажіть таблицю та підпис"});return}s.value=[...Array.isArray(s.value)?s.value:[],{...u.value,table:y,key:k}],d.value=!1}function m(y,k){var f;const h=((f=k==null?void 0:k.target)==null?void 0:f.checked)??!1;y.active=h,s.value=Array.isArray(s.value)?[...s.value]:[]}return(y,k)=>(e.openBlock(),e.createElementBlock("div",DN,[e.createElementVNode("div",PN,[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:p}," Додати таблицю "),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:k[0]||(k[0]=h=>i("save"))}," Зберегти ")]),e.createVNode(Pt,{modelValue:s.value,"onUpdate:modelValue":k[1]||(k[1]=h=>s.value=h),"columns-scheme":o,"form-scheme":c,"add-button":!1,"main-col-width":"260px"},{datasetCell:e.withCtx(({row:h})=>[e.createElementVNode("div",zN,[e.createElementVNode("div",RN,e.toDisplayString(h.table),1),e.createElementVNode("div",IN,e.toDisplayString(h.key),1)])]),activeCell:e.withCtx(({row:h})=>[e.createElementVNode("label",jN,[e.createElementVNode("input",{type:"checkbox",class:"h-4 w-4 text-sky-500 border-gray-300 rounded focus:ring-sky-300",checked:h.active,onChange:f=>m(h,f)},null,40,ON)])]),zoomCell:e.withCtx(({row:h})=>[e.createElementVNode("div",UN,e.toDisplayString(h.zoom),1)]),_:1},8,["modelValue"]),e.createVNode(e.unref(r),{teleport:"#modal",visible:d.value,"onUpdate:visible":k[3]||(k[3]=h=>d.value=h),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:a}," Скасувати "),e.createElementVNode("button",{type:"button",class:"px-4 py-2 rounded bg-blue-600 text-white",onClick:g}," Додати ")])]),default:e.withCtx(()=>[e.createVNode(e.unref(l),{values:u.value,"onUpdate:values":k[2]||(k[2]=h=>u.value=h),schema:c},null,8,["values"])]),_:1},8,["visible"])]))}}),HN={class:"flex flex-col flex-1 min-h-0 gap-4"},WN={class:"h-[calc(100vh-230px)] rounded-md border border-gray-200 bg-white"},YN=e.defineComponent({__name:"cartocss-card-tab",props:{card:{},table:{}},emits:["save"],setup(t,{emit:n}){const o=t,r=n,l=e.ref(o.table),s=e.ref(o.card),i=e.defineAsyncComponent(()=>import("@opengis/form").then(u=>u.VsInputText));function d(){r("save",{card_html:s.value,card_table:l.value})}return(u,c)=>(e.openBlock(),e.createElementBlock("div",HN,[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:d},[...c[2]||(c[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(i),{modelValue:l.value,"onUpdate:modelValue":c[0]||(c[0]=p=>l.value=p)},null,8,["modelValue"])]),e.createElementVNode("div",WN,[e.createVNode(Un,{modelValue:s.value,"onUpdate:modelValue":c[1]||(c[1]=p=>s.value=p),language:"html",theme:"vs-light",class:"h-full w-full rounded-md"},null,8,["modelValue"])])]))}}),GN=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=Je(),{activateTemporaryLayer:r,deactivateTemporaryLayer:l,setTemporaryLayerOpacity:s}=Cn(o.map),i=e.computed(()=>{var a;const p=`${(a=n==null?void 0:n.tileUrl)==null?void 0:a.trim()}`;return p?typeof window>"u"||typeof location>"u"||/^https?:\/\//i.test(p)?p:p.startsWith("//")?`${window.location.protocol}${p}`:p.startsWith("/")?`${location.origin}${p}`:`${location.origin}/${p}`:""});let d="",u="";function c(){const p=n.active&&!!i.value;d&&(!p||d!==n.layerId)&&(l(d,u||void 0),d="",u=""),p&&(r({id:n.layerId,title:n.title||n.layerId,url:i.value,opacity:n.opacity},{},n.owner),d=n.layerId,u=n.owner||"")}return e.watch(()=>[n.layerId,i.value,n.active,n.owner],c,{immediate:!0}),e.watch(()=>n.opacity,p=>{!d||!n.active||s(d,p,u||void 0)},{immediate:!0}),e.onUnmounted(()=>{d&&(l(d,u||void 0),d="",u="")}),(p,a)=>e.createCommentVNode("",!0)}}),ZN=e.defineComponent({__name:"CartocssMapClickListener",props:{cartocssId:{},infoEnabled:{type:[Boolean,null]},active:{type:[Boolean,null]}},setup(t){const n=t,o=e.computed(()=>n.cartocssId??null),r=e.computed(()=>!!n.infoEnabled&&n.active!==!1),{map:l,ready:s}=Je(),i=m=>{!m||typeof window>"u"||window.dispatchEvent(new CustomEvent(rr,{detail:m}))},d=async m=>{const y=await fetch(`/api/map-format?${m.toString()}`);if(!y.ok)throw new Error(`API returned ${y.status}`);return y.json()};let u=null,c=null;const p=m=>{if(!m)return null;if(typeof m=="string")try{return JSON.parse(m)}catch{return null}return m},a=async(m,y)=>{var f;const k=o.value?`external:${o.value},${String(m)}`:null,h=new URLSearchParams({layer:o.value??"",id:String(m)});try{const b=await d(h),x=typeof b.html=="string"?b.html:null,C=p(((f=b==null?void 0:b.data)==null?void 0:f.geom)??(b==null?void 0:b.geom)??null);(x||C)&&i({html:x,geometry:C??y,infoToken:k})}catch(b){console.warn("CartoCSS map-format (id) error",b)}},g=async m=>{var f,b,x,C;if(!o.value||n.active===!1)return;if(!r.value){Ee.notify({type:"error",title:"CartoCSS",message:"Картка не налаштована"});return}const y=(f=m==null?void 0:m.lngLat)==null?void 0:f.lng,k=(b=m==null?void 0:m.lngLat)==null?void 0:b.lat;if(typeof y!="number"||typeof k!="number")return;const h=new URLSearchParams({layer:o.value,lat:k.toFixed(6),lng:y.toFixed(6)});try{const V=await d(h),E=p(((x=V==null?void 0:V.data)==null?void 0:x.geom)??(V==null?void 0:V.geom)??null),w=((C=V==null?void 0:V.data)==null?void 0:C.id)??(V==null?void 0:V.id);if(w!=null){await a(w,E);return}Nl({html:V==null?void 0:V.html})&&i({html:V==null?void 0:V.html,geometry:E,infoToken:null})}catch(V){console.warn("CartoCSS map-format error",V)}};return s().then(()=>{c=l.value,c&&(c.on("click",g),u=()=>c==null?void 0:c.off("click",g))}),e.onBeforeUnmount(()=>{u==null||u(),u=null,c=null}),()=>{}}}),KN=["title","aria-label","disabled"],XN={key:0,class:"absolute right-full mr-3 px-1.5 py-0.5 bg-gray-700 text-white text-[0.75rem] font-medium rounded-md opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100 pointer-events-none transition-opacity duration-200 whitespace-nowrap","aria-hidden":"true"},Jt=e.defineComponent({__name:"MapIconButton",props:{title:{},ariaLabel:{default:""},tooltip:{default:""},active:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},emits:["click"],setup(t){const n=t,o=e.computed(()=>["group relative flex items-center justify-center w-9 h-9 rounded-xl shadow-lg transition-transform transition-shadow duration-200 hover:scale-105 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400/60 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:scale-100",n.active?"bg-blue-50 text-blue-700 ring-1 ring-blue-300":"bg-white text-gray-700 hover:bg-gray-50"].join(" "));return(r,l)=>(e.openBlock(),e.createElementBlock("button",{type:"button",class:e.normalizeClass(o.value),title:t.title,"aria-label":t.ariaLabel||t.title,disabled:t.disabled,onClick:l[0]||(l[0]=e.withModifiers(s=>r.$emit("click",s),["stop"]))},[t.tooltip?(e.openBlock(),e.createElementBlock("span",XN,e.toDisplayString(t.tooltip),1)):e.createCommentVNode("",!0),e.renderSlot(r.$slots,"default")],10,KN))}}),JN=e.defineComponent({__name:"MapZoomInButton",setup(t){const{map:n,ready:o}=Je(),r=e.ref(!1);e.onMounted(async()=>{await(o==null?void 0:o()),r.value=!!n.value});function l(){const s=n.value;s!=null&&s.zoomIn&&s.zoomIn()}return(s,i)=>(e.openBlock(),e.createBlock(Jt,{title:"Збільшити",tooltip:"Плюс зум",disabled:!r.value,onClick:l},{default:e.withCtx(()=>[e.createVNode(e.unref(ge.ZoomIn),{class:"w-4 h-4"})]),_:1},8,["disabled"]))}}),QN=e.defineComponent({__name:"MapZoomOutButton",setup(t){const{map:n,ready:o}=Je(),r=e.ref(!1);e.onMounted(async()=>{await(o==null?void 0:o()),r.value=!!n.value});function l(){const s=n.value;s!=null&&s.zoomOut&&s.zoomOut()}return(s,i)=>(e.openBlock(),e.createBlock(Jt,{title:"Зменшити",tooltip:"Мінус зум",disabled:!r.value,onClick:l},{default:e.withCtx(()=>[e.createVNode(e.unref(ge.ZoomOut),{class:"w-4 h-4"})]),_:1},8,["disabled"]))}}),eV=e.defineComponent({__name:"MapCompassButton",setup(t){const{map:n,ready:o}=Je(),r=e.ref(!1),l=e.ref(0),s=e.ref(0),i=e.computed(()=>({transform:`scale(${(1+s.value/70).toFixed(5)}) rotateZ(0deg) rotateX(${s.value}deg) rotateZ(${l.value}deg)`}));function d(){var p,a;const c=n.value;c&&(l.value=Number(((p=c.getBearing)==null?void 0:p.call(c))??0),s.value=Number(((a=c.getPitch)==null?void 0:a.call(c))??0))}e.onMounted(async()=>{var p,a,g;await(o==null?void 0:o());const c=n.value;r.value=!!c,d(),(p=c==null?void 0:c.on)==null||p.call(c,"rotate",d),(a=c==null?void 0:c.on)==null||a.call(c,"pitch",d),(g=c==null?void 0:c.on)==null||g.call(c,"load",d)}),e.onBeforeUnmount(()=>{var p,a,g;const c=n.value;(p=c==null?void 0:c.off)==null||p.call(c,"rotate",d),(a=c==null?void 0:c.off)==null||a.call(c,"pitch",d),(g=c==null?void 0:c.off)==null||g.call(c,"load",d)});function u(){const c=n.value;c!=null&&c.easeTo&&c.easeTo({bearing:0,pitch:0})}return(c,p)=>(e.openBlock(),e.createBlock(Jt,{title:"Повернути орієнтацію",tooltip:"Компас",disabled:!r.value,onClick:u},{default:e.withCtx(()=>[e.createVNode(e.unref(ge.Compass),{class:"w-4 h-4","aria-hidden":"true",style:e.normalizeStyle(i.value)},null,8,["style"])]),_:1},8,["disabled"]))}}),tV=100,nV=e.defineComponent({__name:"MapFullscreenButton",props:{target:{}},setup(t){const n=t,{map:o,ready:r}=Je(),l=e.ref(!1),s=e.ref(!1);function i(){var a,g;if(n.target)return n.target;const p=(g=(a=o.value)==null?void 0:a.getContainer)==null?void 0:g.call(a);return p?p.closest(".map-view-root")??p:null}function d(){const p=i();s.value=!!(p&&document.fullscreenElement===p)}function u(){window.setTimeout(()=>{var p,a;(a=(p=o.value)==null?void 0:p.resize)==null||a.call(p)},tV)}async function c(){const p=i();if(p)try{document.fullscreenElement===p?await document.exitFullscreen():document.fullscreenElement?(await document.exitFullscreen(),await p.requestFullscreen()):await p.requestFullscreen()}catch(a){console.error("Fullscreen error:",a)}finally{d(),u()}}return e.onMounted(async()=>{await(r==null?void 0:r()),l.value=!!o.value,d(),document.addEventListener("fullscreenchange",d),document.addEventListener("fullscreenchange",u)}),e.onBeforeUnmount(()=>{document.removeEventListener("fullscreenchange",d),document.removeEventListener("fullscreenchange",u)}),(p,a)=>(e.openBlock(),e.createBlock(Jt,{title:s.value?"Вийти з повного екрана":"Повний екран",tooltip:s.value?"Вийти з повного екрана":"Повний екран",active:s.value,disabled:!l.value,onClick:c},{default:e.withCtx(()=>[s.value?(e.openBlock(),e.createBlock(e.unref(ge.Minimize2),{key:0,class:"w-4 h-4"})):(e.openBlock(),e.createBlock(e.unref(ge.Maximize2),{key:1,class:"w-4 h-4"}))]),_:1},8,["title","tooltip","active","disabled"]))}}),oV=e.defineComponent({__name:"MapCopyLinkButton",props:{url:{default:""}},setup(t){const n=t;async function o(){const r=n.url||(typeof window<"u"?window.location.href:"");if(!r){Ee.notify({type:"warning",title:"Посилання",message:"Немає URL для копіювання"});return}try{await navigator.clipboard.writeText(r),Ee.notify({type:"success",title:"Посилання",message:"Посилання скопійовано"})}catch(l){console.error("Copy link error:",l),Ee.notify({type:"error",title:"Посилання",message:"Не вдалося скопіювати посилання"})}}return(r,l)=>(e.openBlock(),e.createBlock(Jt,{title:"Копіювати посилання",tooltip:"Копіювати посилання",onClick:o},{default:e.withCtx(()=>[e.createVNode(e.unref(ge.Link2),{class:"w-4 h-4"})]),_:1}))}}),rV={key:0,class:"absolute right-full top-0 mr-2 z-[450] flex",role:"group","aria-label":"Вибір рівня зуму"},lV={class:"flex flex-col items-center rounded-lg border border-gray-200 bg-white/95 py-2.5 pl-1 pr-2 shadow-lg backdrop-blur-sm"},aV=["title","onClick"],sV={key:0,class:"absolute right-5 text-[9px] tabular-nums text-gray-400"},iV=Me(e.defineComponent({__name:"MapZoomSlider",props:{visible:{type:Boolean},modelValue:{},min:{default:5},max:{default:20}},emits:["update:modelValue"],setup(t,{emit:n}){const o=t,r=n,l=e.ref(),s=e.ref(o.modelValue),i=e.ref(!1);e.watch(()=>o.modelValue,h=>{i.value||(s.value=h)});const d=e.computed(()=>{const h=[];for(let f=o.min;f<=o.max;f+=1)h.push(f);return h}),u=e.computed(()=>{const h=new Set;for(let f=o.min;f<=o.max;f+=5)h.add(f);return h.add(o.max),h}),c=h=>u.value.has(h),p=h=>{const f=o.max-o.min;return f<=0?0:(o.max-h)/f*100},a=h=>{r("update:modelValue",h)},g=h=>{if(!l.value)return;const f=l.value.getBoundingClientRect(),b=(h-f.top)/f.height;s.value=Math.max(o.min,Math.min(o.max,Math.round(o.max-b*(o.max-o.min))))},m=h=>{g(h.clientY)},y=()=>{window.removeEventListener("mousemove",m),window.removeEventListener("mouseup",y),i.value=!1,s.value!==o.modelValue&&r("update:modelValue",s.value)},k=h=>{i.value=!0,g(h.clientY),window.addEventListener("mousemove",m),window.addEventListener("mouseup",y)};return(h,f)=>(e.openBlock(),e.createBlock(e.Transition,{name:"zoom-panel"},{default:e.withCtx(()=>[t.visible?(e.openBlock(),e.createElementBlock("div",rV,[e.createElementVNode("div",lV,[f[1]||(f[1]=e.createElementVNode("span",{class:"mb-1 text-[9px] font-semibold uppercase tracking-wider text-gray-400"}," Zoom ",-1)),e.createElementVNode("div",{ref_key:"sliderRef",ref:l,class:"relative h-44 w-8 cursor-pointer select-none",onMousedown:e.withModifiers(k,["prevent"])},[f[0]||(f[0]=e.createElementVNode("div",{class:"absolute right-0 top-0 bottom-0 w-px bg-gray-200"},null,-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,b=>(e.openBlock(),e.createElementBlock("button",{key:b,type:"button",class:"absolute right-0 -translate-y-1/2 flex items-center justify-end group",style:e.normalizeStyle({top:`${p(b)}%`}),title:`Zoom ${b}`,onClick:e.withModifiers(x=>a(b),["stop"])},[e.createElementVNode("span",{class:e.normalizeClass(["block rounded-full",c(b)?"h-px w-2.5 bg-gray-300 group-hover:bg-gray-400":"h-px w-1.5 bg-gray-200 group-hover:bg-gray-300"])},null,2),c(b)?(e.openBlock(),e.createElementBlock("span",sV,e.toDisplayString(b),1)):e.createCommentVNode("",!0)],12,aV))),128)),e.createElementVNode("div",{class:"absolute right-0 -translate-y-1/2 flex items-center",style:e.normalizeStyle({top:`${p(s.value)}%`})},[e.createElementVNode("div",{class:e.normalizeClass(["h-[4px] w-4 rounded-full bg-blue-600/80 shadow-sm transition-all",i.value?"bg-blue-300 transform duration-200":""])},null,2)],4)],544)])])):e.createCommentVNode("",!0)]),_:1}))}}),[["__scopeId","data-v-ca77aba8"]]),cV={class:"text-[0.7rem] font-bold tabular-nums leading-none text-gray-600"},Hr=5,Wr=20,dV=13,uV=.01,fV=200,mV=e.defineComponent({__name:"MapZoomLevelButton",setup(t){const{map:n,ready:o}=Je(),r=e.ref(!1),l=e.ref(!1),s=e.ref(dV),i=e.ref(!1),d=e.ref(Hr),u=e.ref(Wr),c=e.computed(()=>String(s.value));function p(f){return Math.round(Math.min(u.value,Math.max(d.value,f)))}function a(){var C,V;const f=n.value;if(!f)return;const b=(C=f.getMinZoom)==null?void 0:C.call(f),x=(V=f.getMaxZoom)==null?void 0:V.call(f);Number.isFinite(b)&&(d.value=Math.max(Hr,Math.floor(Number(b)))),Number.isFinite(x)&&(u.value=Math.min(Wr,Math.ceil(Number(x)))),d.value>u.value&&(d.value=Hr,u.value=Wr)}function g(){var C;const f=n.value;if(!f||i.value)return;const b=(C=f.getZoom)==null?void 0:C.call(f);if(b==null)return;const x=p(b);s.value!==x&&(s.value=x)}function m(f){var E,w;const b=n.value;if(!(b!=null&&b.easeTo))return;const x=(E=b.getCenter)==null?void 0:E.call(b);if(!x)return;const C=p(f),V=(w=b.getZoom)==null?void 0:w.call(b);V!=null&&Math.abs(V-C)<uV||(i.value=!0,b.easeTo({center:[x.lng,x.lat],zoom:C,duration:fV,essential:!0}))}function y(){i.value=!1,g()}function k(){l.value=!l.value,l.value&&(a(),g())}function h(f){s.value=f,m(f)}return e.onMounted(async()=>{var b;await(o==null?void 0:o());const f=n.value;r.value=!!f,a(),g(),(b=f==null?void 0:f.on)==null||b.call(f,"zoomend",y)}),e.onBeforeUnmount(()=>{var f,b;(b=(f=n.value)==null?void 0:f.off)==null||b.call(f,"zoomend",y)}),(f,b)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createVNode(Jt,{title:l.value?"Закрити вибір зуму":"Вибрати рівень зуму",tooltip:"Рівень зуму",active:l.value,disabled:!r.value,"aria-label":"Рівень зуму",onClick:k},{default:e.withCtx(()=>[e.createElementVNode("div",cV,e.toDisplayString(c.value),1)]),_:1},8,["title","active","disabled"]),e.createVNode(iV,{visible:l.value,"model-value":s.value,min:d.value,max:u.value,"onUpdate:modelValue":h},null,8,["visible","model-value","min","max"])],64))}}),pV=e.defineComponent({__name:"MapRulerButton",props:{active:{type:Boolean}},emits:["click"],setup(t){return(n,o)=>(e.openBlock(),e.createBlock(Jt,{title:t.active?"Вимкнути лінійку":"Увімкнути лінійку",tooltip:"Вимірювання",active:t.active,"aria-label":"Вимірювання",onClick:o[0]||(o[0]=r=>n.$emit("click",r))},{default:e.withCtx(()=>[e.createVNode(e.unref(ge.Ruler),{class:"w-4 h-4"})]),_:1},8,["title","active"]))}}),gV={class:"absolute right-3 top-3 z-[450] flex flex-col gap-1 pointer-events-auto"},yV=e.defineComponent({name:"MapToolbarRight",__name:"MapToolbarRight",setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",gV,[e.renderSlot(n.$slots,"default")]))}}),hV=e.defineComponent({__name:"RulerMapClickBridge",props:{active:{type:Boolean}},emits:["map-click"],setup(t,{emit:n}){const o=t,r=n,{map:l,ready:s}=Je();let i=null;function d(c){if(!o.active)return;const p=c==null?void 0:c.lngLat;typeof(p==null?void 0:p.lat)!="number"||typeof(p==null?void 0:p.lng)!="number"||r("map-click",{lat:p.lat,lng:p.lng})}async function u(){if(i==null||i(),i=null,!o.active)return;await(s==null?void 0:s());const c=l.value;c!=null&&c.on&&(c.on("click",d),i=()=>{var p;return(p=c.off)==null?void 0:p.call(c,"click",d)})}return e.watch(()=>o.active,()=>{u()},{immediate:!0}),e.onBeforeUnmount(()=>{i==null||i(),i=null}),(c,p)=>null}}),bV={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},xV={class:"flex-1 relative overflow-hidden"},kV={class:"absolute top-0 left-0 w-full z-20"},wV={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},_V={class:"flex items-start justify-between gap-4"},EV={class:"flex-1 min-w-0"},CV={class:"flex items-center text-sm text-gray-500 mb-3"},NV={class:"text-gray-900 font-medium truncate max-w-xs"},VV={class:"flex items-center justify-between gap-4"},$V={class:"flex-1 min-w-0"},BV={class:"flex items-center gap-3 mb-1"},SV={class:"text-base font-semibold text-gray-900 truncate"},vV={key:0,class:"px-2 py-0.5 bg-green-50 border border-green-200 rounded flex-shrink-0"},LV={class:"text-xs font-medium text-green-700"},TV=["title"],AV={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]"},MV={class:"relative w-full h-full"},FV={class:"absolute top-3 left-3 z-20"},DV={class:"px-3 py-2 flex items-center gap-2 border-b border-gray-100"},PV={class:"text-xs text-gray-700 w-9 text-right"},zV={class:"px-3 py-2 flex items-center gap-2"},RV={for:"show-layer",class:"text-xs text-gray-700 flex items-center gap-1 cursor-pointer"},IV={key:2,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"},jV={class:"flex-1 flex flex-col h-full"},OV={key:0,class:"px-3 pt-3 pb-2 border-b border-gray-100"},UV=["aria-selected","onClick"],qV={class:"leading-none"},HV={class:"flex flex-col flex-1 overflow-y-hidden p-3"},WV={key:0,class:"flex-1 flex items-center justify-center text-sm text-gray-500"},YV="cartocss-demo-001",GV="OpenGIS",Ka=2,Po=5,ZV=5,KV=Object.freeze(Object.defineProperty({__proto__:null,default:e.defineComponent({__name:"cartocss",setup(t){const n=qe.useRouter(),o=qe.useRoute(),r=e.ref(null),l=e.computed(()=>{var re;const R=(re=o.matched[o.matched.length-1])==null?void 0:re.path;return(typeof R=="string"&&R?R:o.path).replace(/\/:id\??$/,"")||"/"}),s=e.computed(()=>{var se;const R=(se=o.meta)==null?void 0:se.title;return typeof R=="string"&&R.trim()?R:"CartoCSS"});function i(){n.push(l.value)}const d=[{key:"css",label:"CSS",icon:Ua},{key:"data",label:"Дані",icon:TN},{key:"metadata",label:"Метадані",icon:Or},{key:"card",label:"Картка",icon:qa}],u=d.map(R=>R.key),c=e.ref(u.includes(o.query.tab)?o.query.tab:"css"),p=e.ref(!0),a=e.ref(null),g=e.computed(()=>{var R;return(R=a.value)!=null&&R.source_path?d.filter(se=>se.key==="card"||se.key==="metadata"):d}),m=e.computed(()=>o.params.id||YV),y=e.ref({id:m.value,name:"",description:""});let k=null;const h=e.ref(!1);function f(R){if(Array.isArray(R))return f(R[0]);if(typeof R!="string"&&typeof R!="number")return null;const se=typeof R=="number"?R:Number(R.trim());return Number.isFinite(se)?se:null}function b(R,se){return R.toFixed(se)}function x(R,se,re){const Ce=.5*10**-re;return Math.abs(R-se)>Ce}function C(){var R;return(R=r.value)==null?void 0:R.ctx}function V(){var et,rt,st,kt;const R=(rt=(et=C())==null?void 0:et.map)==null?void 0:rt.value;if(!R)return;const se=f(o.query.z),re=f(o.query.x),Ce=f(o.query.y);if(se==null||re==null||Ce==null)return;const $e=(st=R.getCenter)==null?void 0:st.call(R),Ie=(kt=R.getZoom)==null?void 0:kt.call(R);(!$e||x($e.lng,re,Po)||x($e.lat,Ce,Po)||x(Ie??0,se,Ka))&&(h.value=!0,R.jumpTo({center:[re,Ce],zoom:se}),h.value=!1)}function E(){var $e,Ie,tt,et;if(h.value)return;const R=(Ie=($e=C())==null?void 0:$e.map)==null?void 0:Ie.value;if(!R)return;const se=(tt=R.getCenter)==null?void 0:tt.call(R),re=(et=R.getZoom)==null?void 0:et.call(R);if(!se||re==null)return;const Ce={...o.query,z:b(re,Ka),x:b(se.lng,Po),y:b(se.lat,Po)};o.query.z===Ce.z&&o.query.x===Ce.x&&o.query.y===Ce.y||n.replace({query:Ce})}function w(R){typeof document>"u"||(document.title=R?`${R} — CartoCSS`:GV)}const B=e.ref(""),L=e.ref([]),W=e.ref(!1),J=e.ref(!1),I=e.ref(""),te=e.ref(0),ue=e.ref(!0),be=e.ref(1),ae=e.ref(!1),ne=e.ref(null),v=e.ref(!1),M=e.ref(null),$=e.ref([]),N=e.ref(!1),F=e.ref("general");function H(R){$.value=R}function he(R){var se;(se=M.value)==null||se.addPoint(R)}function Y(){var R;$.value=[],N.value=!1,(R=M.value)==null||R.clearPoints(),v.value=!1}function D(){if(v.value){Y();return}v.value=!0}const O=e.computed(()=>`cartocss-layer-${m.value}`),q=e.computed(()=>`${Math.round(be.value*100)}%`),ee=e.computed(()=>`cartocss-extent-${m.value}`),z=e.computed(()=>`cartocss-extent-draft-${m.value}`),oe=e.computed(()=>{var $e;const R=($e=I.value)==null?void 0:$e.trim();if(!R)return"";const se=R.includes("?")?"&":"?",re=`${R}${se}nottl=1`,Ce=te.value;return Ce?`${R}${se}ts=${Ce}&nocache=1`:re}),ye=e.ref(""),we=e.ref(""),T=e.computed(()=>{var Ie;const R=(Ie=a.value)==null?void 0:Ie.bounds;if(!Array.isArray(R)||R.length<4)return null;const[se,re,Ce,$e]=R;return[se,re,Ce,$e].some(tt=>typeof tt!="number"||Number.isNaN(tt))?null:[(se+Ce)/2,(re+$e)/2]}),K=e.computed(()=>{var Ie;const R=(Ie=a.value)==null?void 0:Ie.bounds;if(!Array.isArray(R)||R.length<4)return null;const[se,re,Ce,$e]=R;return[se,re,Ce,$e].some(tt=>typeof tt!="number"||Number.isNaN(tt))?null:[se,re,Ce,$e]}),me=e.computed(()=>{const R=a.value;return R?[R.description,R.group_id?`Група: ${R.group_id}`:null,R.source_path?`Шлях: ${R.source_path}`:null,R.is_public===!0?"Публічний":"Не публічний",R.enabled===!0?"Активний":"Неактивний"].filter(Boolean).join(", "):""}),ie=e.computed(()=>{var se;const R=(se=a.value)==null?void 0:se.group_id;return R?String(R).toUpperCase():""});let de=null,pe=!1,Le=null;function j(R){return Number(R.toFixed(ZV))}function Q(R,se){const[re,Ce]=R,[$e,Ie]=se;return[j(Math.min(re,$e)),j(Math.min(Ce,Ie)),j(Math.max(re,$e)),j(Math.max(Ce,Ie))]}function _e(R){const[se,re,Ce,$e]=R;return{type:"Polygon",coordinates:[[[se,re],[Ce,re],[Ce,$e],[se,$e],[se,re]]]}}function ve(R){var Ce,$e,Ie;const se=($e=(Ce=C())==null?void 0:Ce.map)==null?void 0:$e.value,re=(Ie=se==null?void 0:se.getCanvas)==null?void 0:Ie.call(se);re!=null&&re.style&&(re.style.cursor=R)}async function ze(R,se){if(!(!m.value||!a.value)){J.value=!0;try{const re=_e(R),Ce=await fetch(`/api/gis-css/${m.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({geom:re})});if(!Ce.ok)throw new Error(`Failed to save cartocss bounds: ${Ce.status}`);Ee.notify({type:"success",title:"Bounds збережено",message:"Нові межі успішно збережено."}),await X(m.value,{bustCache:!0})}catch(re){console.error("Failed to save CartoCSS bounds",re),a.value&&(a.value={...a.value,bounds:se?[...se]:null}),Ee.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти Bounds"})}finally{J.value=!1}}}function Ae(R){var re,Ce,$e;const se=(Ce=(re=C())==null?void 0:re.map)==null?void 0:Ce.value;if(($e=se==null?void 0:se.dragPan)!=null&&$e.enable&&se.dragPan.enable(),(R==null?void 0:R.length)===4&&a.value){const Ie=Array.isArray(a.value.bounds)?[...a.value.bounds]:null;a.value={...a.value,bounds:[...R]},ze(R,Ie)}de=null,pe=!1,ne.value=null,ae.value=!1,ve("")}function Ye(){Ae(null)}function Ge(){var Ie,tt;const R=(tt=(Ie=C())==null?void 0:Ie.map)==null?void 0:tt.value;if(!R)return;const se=et=>{var st,kt,At;if(!ae.value||((st=et==null?void 0:et.originalEvent)==null?void 0:st.button)!=null&&et.originalEvent.button!==0)return;const rt=et==null?void 0:et.lngLat;rt&&(de=[rt.lng,rt.lat],pe=!0,ne.value=[rt.lng,rt.lat,rt.lng,rt.lat],(At=(kt=R.dragPan)==null?void 0:kt.disable)==null||At.call(kt))},re=et=>{if(!ae.value||!pe||!de)return;const rt=et==null?void 0:et.lngLat;rt&&(ne.value=Q(de,[rt.lng,rt.lat]))},Ce=et=>{if(!ae.value||!pe||!de)return;const rt=et==null?void 0:et.lngLat;if(!rt){Ye();return}const st=Q(de,[rt.lng,rt.lat]),[kt,At,Mt,Qt]=st;if(!(Math.abs(Mt-kt)>0&&Math.abs(Qt-At)>0)){Ee.notify({type:"warning",title:"Bounds не змінено",message:"Потрібно протягнути прямокутник з ненульовою площею."}),Ye();return}Ae(st)},$e=et=>{ae.value&&et.key==="Escape"&&(et.preventDefault(),Ye())};R.on("mousedown",se),R.on("mousemove",re),R.on("mouseup",Ce),window.addEventListener("keydown",$e),Le=()=>{R.off("mousedown",se),R.off("mousemove",re),R.off("mouseup",Ce),window.removeEventListener("keydown",$e)}}async function ot(){var re;const R=C();!(R!=null&&R.ready)||(await R.ready(),!((re=R.map)==null?void 0:re.value))||(Le||Ge(),ae.value=!0,pe=!1,de=null,ne.value=null,ve("crosshair"),Ee.notify({type:"info",title:"Редагування Bounds",message:"Протягніть прямокутник на карті, щоб задати нові межі."}))}e.watch(m,R=>{R&&X(R)},{immediate:!0}),e.watch(()=>{var R;return(R=y.value)==null?void 0:R.name},R=>w(R),{immediate:!0});async function Qe(){var Ce;const R=C();if(!(R!=null&&R.ready))return;await R.ready(),V();const se=(Ce=R.map)==null?void 0:Ce.value;if(!se)return;const re=()=>E();se.on("moveend",re),se.on("zoomend",re),k=()=>{se.off("moveend",re),se.off("zoomend",re)}}e.watch(()=>[o.query.z,o.query.x,o.query.y],()=>{V()}),e.onMounted(()=>{Qe()}),e.onBeforeUnmount(()=>{k==null||k(),k=null,Le==null||Le(),Le=null,ve("")}),e.watch(()=>o.query.tab,R=>{R&&g.value.some(se=>se.key===R)&&c.value!==R&&(c.value=R)}),e.watch(g,R=>{R.length&&!R.some(se=>se.key===c.value)&&(c.value=R[0].key)},{immediate:!0}),e.watch(c,R=>{o.query.tab!==R&&g.value.some(se=>se.key===R)&&n.replace({query:{...o.query,tab:R}})}),e.watch(()=>a.value,R=>{const se=R==null?void 0:R.card_html;ye.value=se,we.value=R==null?void 0:R.card_table},{immediate:!0});function P(){m.value&&X(m.value,{bustCache:!0})}async function fe(R,se){if(m.value){J.value=!0;try{const re=await fetch(`/api/gis-css/${m.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(R)});if(!re.ok)throw new Error(`Failed to save cartocss: ${re.status}`);Ee.notify({type:"success",title:"Збережено",message:se}),await X(m.value,{bustCache:!0})}catch(re){console.error("Failed to save CartoCSS",re),Ee.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти CartoCSS"})}finally{J.value=!1}}}function A(R){if(!R)return null;if(typeof R=="string")try{return JSON.parse(R)}catch(se){return console.warn("Failed to parse CartoCSS config",se),null}return typeof R=="object"?R:null}function Z(R){const se=Array.isArray(R)?R:R==null?void 0:R.datasets;return Array.isArray(se)?se.map((re,Ce)=>({table:(re==null?void 0:re.table)||(re==null?void 0:re.id)||`dataset_${Ce+1}`,query:(re==null?void 0:re.query)||"",srid:(re==null?void 0:re.srid)||"",gcol:(re==null?void 0:re.gcol)||"",key:(re==null?void 0:re.key)||(re==null?void 0:re.label)||"Без підпису",active:typeof(re==null?void 0:re.active)=="boolean"?re.active:!0,minzoom:typeof(re==null?void 0:re.zoom)>"u"?"":String(re.zoom),maxzoom:typeof(re==null?void 0:re.maxzoom)>"u"?"":String(re.maxzoom),columns:(re==null?void 0:re.columns)||"",proj4text:(re==null?void 0:re.proj4text)||""})):[]}async function X(R,se){W.value=!0;try{const re=await fetch(`/api/gis-css/${R}`);if(!re.ok)throw new Error(`Failed to load cartocss: ${re.status}`);const Ce=await re.json(),$e=(Ce==null?void 0:Ce.message)||Ce||{};a.value=$e,y.value={id:$e.cartocss_key||R,name:$e.name||y.value.name,description:$e.description||y.value.description},B.value=typeof $e.style=="string"?$e.style:"";const Ie=A($e.config??[]);L.value=Z(Ie);const tt=typeof $e.url=="string"?$e.url:"";I.value=tt,ue.value=!!(tt&&$e.enabled!==!1),te.value=se!=null&&se.bustCache?Date.now():0}catch(re){console.error("Failed to fetch CartoCSS",re),ue.value=!1,I.value="",te.value=0,a.value=null}finally{W.value=!1}}async function xe(){await fe({style:B.value||"",config:L.value},"CartoCSS оновлено")}async function Ve(R){const se=await fetch(`/api/gis-css/${m.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(R)});if(!se.ok)throw new Error(`Failed to save cartocss: ${se.status}`);Ee.notify({type:"success",title:"Збережено",message:"Картка CartoCSS оновлена"})}return(R,se)=>(e.openBlock(),e.createElementBlock("div",bV,[e.createElementVNode("div",xV,[e.createElementVNode("div",kV,[e.createElementVNode("div",wV,[e.createElementVNode("div",_V,[e.createElementVNode("div",EV,[e.createElementVNode("div",CV,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:i},e.toDisplayString(s.value),1),se[7]||(se[7]=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",NV,e.toDisplayString(y.value.name||"CartoCSS"),1)]),e.createElementVNode("div",VV,[e.createElementVNode("div",$V,[e.createElementVNode("div",BV,[e.createElementVNode("h1",SV,e.toDisplayString(y.value.name||"CartoCSS"),1),ie.value?(e.openBlock(),e.createElementBlock("div",vV,[e.createElementVNode("span",LV,e.toDisplayString(ie.value),1)])):e.createCommentVNode("",!0)]),me.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:me.value},e.toDisplayString(me.value),9,TV)):e.createCommentVNode("",!0)])])]),e.createVNode(qr,{class:"flex-shrink-0","entity-id":m.value,"entity-info":y.value,"form-endpoint":re=>`/api/form/gis.cartocss.table/${re}`,"save-endpoint":re=>`/api/gis-css/${re}`,"entity-label":"CartoCSS","save-method":"post",onSaved:P},null,8,["entity-id","entity-info","form-endpoint","save-endpoint"])])])]),e.createElementVNode("div",AV,[e.createElementVNode("div",MV,[e.createVNode(eo,{ref_key:"mapViewRef",ref:r},{default:e.withCtx(()=>{var re,Ce;return[e.createElementVNode("div",FV,[e.createVNode(rn,null,{default:e.withCtx(()=>[e.createElementVNode("div",DV,[se[8]||(se[8]=e.createElementVNode("span",{class:"text-xs text-gray-600 whitespace-nowrap"},"Прозорість:",-1)),e.withDirectives(e.createElementVNode("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":se[0]||(se[0]=$e=>be.value=$e),class:"flex-1 h-1 accent-blue-600",style:{"accent-color":"rgb(30, 78, 216)"}},null,512),[[e.vModelText,be.value,void 0,{number:!0}]]),e.createElementVNode("span",PV,e.toDisplayString(q.value),1)]),e.createElementVNode("div",zV,[e.withDirectives(e.createElementVNode("input",{id:"show-layer",type:"checkbox",class:"rounded","onUpdate:modelValue":se[1]||(se[1]=$e=>ue.value=$e),style:{"accent-color":"rgb(30, 78, 216)"}},null,512),[[e.vModelCheckbox,ue.value]]),e.createElementVNode("label",RV,[ue.value?(e.openBlock(),e.createBlock(e.unref(ge.Eye),{key:0,class:"w-3.5 h-3.5"})):(e.openBlock(),e.createBlock(e.unref(ge.EyeOff),{key:1,class:"w-3.5 h-3.5"})),se[9]||(se[9]=e.createTextVNode(" Показати шар ",-1))])])]),_:1})]),e.createVNode(yV,null,{default:e.withCtx(()=>[e.createVNode(JN),e.createVNode(QN),e.createVNode(eV),e.createVNode(Ht),T.value?(e.openBlock(),e.createBlock(Ht,{key:0,targetCenter:T.value,targetLabel:"Центр даних",targetAriaLabel:"Перейти до центру даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0),e.createVNode(nV),e.createVNode(oV),e.createVNode(pV,{active:v.value,onClick:D},null,8,["active"]),e.createVNode(mV)]),_:1}),v.value?(e.openBlock(),e.createBlock(Pl,{key:0,ref_key:"rulerPanelRef",ref:M,onClose:Y,onTabChange:se[2]||(se[2]=$e=>F.value=$e),onPointsChange:H,onShapeClosedChange:se[3]||(se[3]=$e=>N.value=$e)},null,512)):e.createCommentVNode("",!0),v.value&&$.value.length>0?(e.openBlock(),e.createBlock(zl,{key:1,points:$.value,"is-shape-closed":N.value,"label-mode":F.value},null,8,["points","is-shape-closed","label-mode"])):e.createCommentVNode("",!0),e.createVNode(hV,{active:v.value,onMapClick:he},null,8,["active"]),ae.value?(e.openBlock(),e.createElementBlock("div",IV," Потягніть на карті, щоб намалювати нові Bounds. Esc скасовує редагування. ")):e.createCommentVNode("",!0),oe.value?(e.openBlock(),e.createBlock(GN,{key:3,"layer-id":O.value,"tile-url":oe.value,active:ue.value,opacity:be.value,title:y.value.name,owner:m.value},null,8,["layer-id","tile-url","active","opacity","title","owner"])):e.createCommentVNode("",!0),e.createVNode(Fo,{extent:K.value,"layer-id":ee.value},null,8,["extent","layer-id"]),e.createVNode(Fo,{extent:ne.value,"layer-id":z.value,"line-color":"#0ea5e9","line-width":3},null,8,["extent","layer-id"]),e.createVNode(ZN,{"cartocss-id":m.value,bounds:((re=a.value)==null?void 0:re.bounds)??null,active:ue.value&&!ae.value&&!v.value,"info-enabled":(Ce=a.value)==null?void 0:Ce.info},null,8,["cartocss-id","bounds","active","info-enabled"]),e.createVNode(lr,{"map-id":m.value},null,8,["map-id"])]}),_:1},512)])]),a.value?(e.openBlock(),e.createBlock(jr,{key:0,open:p.value,onToggle:se[4]||(se[4]=re=>p.value=!p.value)},null,8,["open"])):e.createCommentVNode("",!0)]),a.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",p.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",jV,[g.value.length>1?(e.openBlock(),e.createElementBlock("div",OV,[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,re=>(e.openBlock(),e.createElementBlock("button",{key:re.key,type:"button",role:"tab","aria-selected":c.value===re.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",c.value===re.key?"bg-white shadow-sm text-gray-700":""]),onClick:Ce=>c.value=re.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(re.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",qV,e.toDisplayString(re.label),1)],10,UV))),128))],4)])):e.createCommentVNode("",!0),e.createElementVNode("div",HV,[W.value?(e.openBlock(),e.createElementBlock("div",WV," Завантаження стилю… ")):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[c.value==="css"?(e.openBlock(),e.createBlock(FN,{key:0,modelValue:B.value,"onUpdate:modelValue":se[5]||(se[5]=re=>B.value=re),class:"flex-1 min-h-0",onSave:xe},null,8,["modelValue"])):c.value==="data"?(e.openBlock(),e.createBlock(qN,{key:1,modelValue:L.value,"onUpdate:modelValue":se[6]||(se[6]=re=>L.value=re),class:"flex-1 min-h-0 flex flex-col",onSave:xe},null,8,["modelValue"])):c.value==="card"?(e.openBlock(),e.createBlock(YN,{key:2,card:ye.value,table:we.value,class:"flex-1 min-h-0",onSave:Ve},null,8,["card","table"])):c.value==="metadata"?(e.openBlock(),e.createBlock(Ur,{key:3,data:a.value,"entity-id":m.value,"entity-type":"css",onSaved:P,onEditCssBounds:ot},null,8,["data","entity-id"])):e.createCommentVNode("",!0)],64))])])],2)):e.createCommentVNode("",!0)]))}})},Symbol.toStringTag,{value:"Module"})),XV={class:"rounded-lg border border-gray-200 bg-[rgba(252,252,252,0.8)] p-6"},JV=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")),r=t,l=n,s=e.computed({get:()=>r.modelValue,set:d=>l("update:modelValue",d)}),i=e.computed({get:()=>r.form,set:d=>l("update:form",d)});return(d,u)=>(e.openBlock(),e.createElementBlock("section",XV,[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:s.value,"onUpdate:values":u[0]||(u[0]=c=>s.value=c),form:i.value,"onUpdate:form":u[1]||(u[1]=c=>i.value=c)},null,8,["schema","values","form"]))]))}}),QV={class:"rounded-lg border border-gray-200 bg-[rgba(252,252,252,0.8)] p-6"},e$=e.defineComponent({__name:"LayerSettings",props:{layerIDs:{},options:{}},emits:["update:layerIDs"],setup(t,{emit:n}){const o=t,r=n,l=e.computed({get:()=>o.layerIDs,set:s=>r("update:layerIDs",s)});return(s,i)=>(e.openBlock(),e.createElementBlock("section",QV,[i[1]||(i[1]=e.createElementVNode("h2",{class:"text-lg font-semibold text-gray-800 mb-4"},"Шари",-1)),i[2]||(i[2]=e.createElementVNode("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Доступні шари",-1)),e.createVNode(e.unref(al.VsInputArraySelect),{data:"layer_list",api:"/api/suggest/layer_list",modelValue:l.value,"onUpdate:modelValue":i[0]||(i[0]=d=>l.value=d),placeholder:"Шари"},null,8,["modelValue"])]))}}),t$={class:"w-full"},n$=e.defineComponent({__name:"MapPreview",props:{id:{}},setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",t$,[e.createVNode(wo,{class:"w-full h-[calc(100vh-200px)]",height:"h-[calc(100vh-200px)]",id:t.id},null,8,["id"])]))}}),o$={class:"bg-white rounded-lg shadow-xl w-full max-w-4xl flex flex-col h-[80vh] m-4"},r$={class:"flex items-center justify-between px-6 py-4 border-b border-gray-200"},l$={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"},a$={class:"flex-1 overflow-hidden relative bg-[#fffffe]"},s$={class:"px-6 py-4 border-t border-gray-200 flex justify-end gap-3"},i$=["disabled"],c$=e.defineComponent({__name:"ConfigEditor",props:{modelValue:{}},emits:["update:modelValue","save"],setup(t,{emit:n}){const o=t,r=n,l=e.ref(""),s=e.ref(null);e.watch(()=>o.modelValue,u=>{if(u){try{l.value=JSON.stringify(u,null,2)}catch{l.value="{}"}s.value=null}},{immediate:!0}),e.watch(l,u=>{if(!u.trim()){s.value=null;return}try{JSON.parse(u),s.value=null}catch(c){s.value=c.message}}),e.watch(()=>o.modelValue,()=>{setTimeout(()=>{const{monaco:u}=window;if(u&&u.editor){const c=u.editor.getEditors();c.length>0&&c[c.length-1].updateOptions({wordWrap:"on"})}},300)},{immediate:!0});function i(){r("update:modelValue",null),l.value="",s.value=null}function d(){if(!s.value)try{const u=JSON.parse(l.value);r("save",u),i()}catch(u){console.error("Failed to parse JSON",u)}}return(u,c)=>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(i,["self"])},[e.createElementVNode("div",o$,[e.createElementVNode("div",r$,[c[1]||(c[1]=e.createElementVNode("h3",{class:"text-lg font-semibold text-gray-800"}," Редагування конфігурації (JSON) ",-1)),e.createElementVNode("button",{onClick:i,class:"text-gray-500 hover:text-gray-700 transition-colors"},[e.createVNode(e.unref(ge.X),{size:20})])]),s.value?(e.openBlock(),e.createElementBlock("div",l$," Помилка JSON: "+e.toDisplayString(s.value),1)):e.createCommentVNode("",!0),e.createElementVNode("div",a$,[e.createVNode(Un,{modelValue:l.value,"onUpdate:modelValue":c[0]||(c[0]=p=>l.value=p),language:"json",theme:"vs-light",class:"w-full h-full"},null,8,["modelValue"])]),e.createElementVNode("div",s$,[e.createElementVNode("button",{onClick:i,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:d,disabled:!!s.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,i$)])])])):e.createCommentVNode("",!0)}}),d$={key:0,class:"text-center py-8 text-gray-500 border rounded-lg bg-[rgba(252,252,252,0.8)]"},u$={key:1,class:"rounded-lg border border-gray-200 overflow-hidden"},f$={class:"w-full text-sm"},m$={class:"divide-y divide-gray-200"},p$={class:"px-4 py-3"},g$=["onUpdate:modelValue","onChange"],y$=["value"],h$={class:"px-4 py-3"},b$=["onUpdate:modelValue","onChange"],x$=["value"],k$={class:"px-4 py-3 text-center"},w$=["checked","onChange"],_$={class:"px-4 py-3"},E$={key:0,class:"flex items-center gap-2"},C$=["onClick"],N$=["onClick"],V$={key:1},$$=["onClick"],B$={class:"px-4 py-3 text-right"},S$=["onClick"],v$=e.defineComponent({__name:"WidgetSettings",props:{modelValue:{}},emits:["update:modelValue"],setup(t,{emit:n}){const o=t,r=n,l=["catalog","legend","basemaps","info","layers","dataset","filters","search"],s=["top-left","top-right","bottom-left","bottom-right"],i=e.ref(null),d=e.ref(-1),u=e.computed(()=>o.modelValue||[]);function c(){const f=[...u.value,{type:"info",position:"top-left",visible:!0,config:{}}];r("update:modelValue",f)}function p(f){Ee.confirm({title:"Видалити віджет?",message:"Ви впевнені, що хочете видалити цей віджет?",type:"warning",onConfirm:()=>{const b=u.value.filter((x,C)=>C!==f);r("update:modelValue",b)}})}function a(f,b,x){const C=[...u.value];C[f]={...C[f],[b]:x},r("update:modelValue",C)}function g(f){return!!f&&Object.keys(f).length>0}function m(f,b){d.value=f,i.value=b||{}}function y(f){m(f,{})}function k(f){Ee.confirm({title:"Видалити конфігурацію?",message:"Ви впевнені, що хочете видалити конфігурацію цього віджета?",type:"warning",onConfirm:()=>{a(f,"config",void 0)}})}function h(f){d.value>-1&&a(d.value,"config",f),i.value=null,d.value=-1}return(f,b)=>{var x;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:c,class:"px-3 py-1.5 text-sm bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors"}," + Додати віджет ")]),(x=u.value)!=null&&x.length?(e.openBlock(),e.createElementBlock("div",u$,[e.createElementVNode("table",f$,[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",m$,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,(C,V)=>(e.openBlock(),e.createElementBlock("tr",{key:V,class:"hover:bg-gray-50"},[e.createElementVNode("td",p$,[e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":E=>C.type=E,onChange:E=>a(V,"type",C.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(l,E=>e.createElementVNode("option",{key:E,value:E},e.toDisplayString(E),9,y$)),64))],40,g$),[[e.vModelSelect,C.type]])]),e.createElementVNode("td",h$,[e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":E=>C.position=E,onChange:E=>a(V,"position",C.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(s,E=>e.createElementVNode("option",{key:E,value:E},e.toDisplayString(E),9,x$)),64))],40,b$),[[e.vModelSelect,C.position]])]),e.createElementVNode("td",k$,[e.createElementVNode("input",{type:"checkbox",checked:C.visible!==!1,onChange:E=>a(V,"visible",E.target.checked),class:"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500"},null,40,w$)]),e.createElementVNode("td",_$,[g(C.config)?(e.openBlock(),e.createElementBlock("div",E$,[e.createElementVNode("button",{onClick:E=>m(V,C.config),class:"p-1 text-blue-600 hover:text-blue-800 hover:bg-blue-50 rounded transition-colors",title:"Редагувати конфігурацію"},[e.createVNode(e.unref(ge.Pen),{size:16})],8,C$),e.createElementVNode("button",{onClick:E=>k(V),class:"p-1 text-red-500 hover:text-red-700 hover:bg-red-50 rounded transition-colors",title:"Видалити конфігурацію"},[e.createVNode(e.unref(ge.X),{size:16})],8,N$)])):(e.openBlock(),e.createElementBlock("div",V$,[e.createElementVNode("button",{onClick:E=>y(V),class:"p-1 text-green-600 hover:text-green-800 hover:bg-green-50 rounded transition-colors",title:"Додати конфігурацію"},[e.createVNode(e.unref(ge.Plus),{size:16})],8,$$)]))]),e.createElementVNode("td",B$,[e.createElementVNode("button",{onClick:E=>p(V),class:"p-1 text-gray-400 hover:text-red-500 transition-colors",title:"Видалити віджет"},[e.createVNode(e.unref(ge.Trash2),{size:16})],8,S$)])]))),128))])])])):(e.openBlock(),e.createElementBlock("div",d$," Немає віджетів. Додайте перший віджет. ")),e.createVNode(c$,{teleport:"#modal",modelValue:i.value,"onUpdate:modelValue":b[0]||(b[0]=C=>i.value=C),onSave:h},null,8,["modelValue"])])}}}),L$={class:"relative h-full flex flex-col flex-1 min-h-0 overflow-hidden mx-auto w-full"},T$={class:"mx-1"},A$={class:"text-gray-900 font-semibold"},M$=["disabled"],F$={key:0,class:"text-center py-12 mt-6 px-[24px]"},D$={key:1,class:"px-[24px] overflow-y-auto"},P$={class:"space-y-6"},z$={class:"space-y-6"},R$={class:"space-y-6"},I$=Object.freeze(Object.defineProperty({__proto__:null,default:Me(e.defineComponent({__name:"MapSettings",setup(t){const n=qe.useRouter(),o=qe.useRoute(),r=e.computed(()=>{var E;return((E=n.resolve("/gis.maps").meta)==null?void 0:E.title)??"Карти"}),l=e.ref(!0),s=e.ref(!1),i=e.ref({}),d=e.ref({}),u=[{name:"Загальна",id:"general"},{name:"Шари",id:"layers"},{name:"Віджети",id:"widgets"},{name:"Карта",id:"map"}],c=u.map(E=>E.id),p=E=>E?Array.isArray(E)?E[0]:E:null,a=(()=>{const E=p(o.query.tab);return E&&c.includes(E)?E:"general"})(),g=e.ref(a);e.watch(()=>o.query.tab,E=>{const w=p(E);w&&c.includes(w)&&g.value!==w&&(g.value=w)}),e.watch(g,E=>{o.query.tab!==E&&n.replace({query:{...o.query,tab:E}})});const m=e.ref({name:"",map_key:"",description:"",holder:"",image:"",keywords:[],center:null,zoom:11,widgets:[],layers:[]}),y=e.computed({get:()=>(m.value.layers||[]).map(E=>E.id||E),set:E=>{m.value.layers=E}});async function k(E){if(!E.length){d.value={};return}try{const w=new URLSearchParams({json:"1",val:Array.from(new Set(E)).join(",")}),B=await fetch(`/api/suggest/layer_list?${w.toString()}`);if(!B.ok)return;const L=await B.json(),W=(L==null?void 0:L.data)??L??[],J=Array.isArray(W)?W:[],I={...d.value};J.forEach(te=>{const ue=te.id!=null?String(te.id):"";ue&&(I[ue]=te.text??te.name??ue)}),d.value=I}catch(w){console.error("Failed to fetch layer labels:",w)}}const h=e.computed({get:()=>y.value.map(E=>d.value[E]??E),set:E=>{const w=Object.entries(d.value).reduce((L,[W,J])=>(L[J]=W,L),{}),B=E.map(L=>w[L]??null).filter(L=>L!=null);y.value=B}}),f=e.computed(()=>{const E=m.value.center;if(!Array.isArray(E)||E.length<2)return"Не задано";const[w,B]=E;return w===void 0||B===void 0||w===null||B===null||Number.isNaN(Number(w))||Number.isNaN(Number(B))?"Не задано":`Lng ${Number(w).toFixed(6)}, Lat ${Number(B).toFixed(6)}`}),b=e.computed(()=>{const E=m.value.zoom;if(E==null||E==="")return"Не задано";const w=Number(E);return Number.isNaN(w)?"Не задано":w.toFixed(2)}),x=[{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 C(){try{const w=await(await fetch(`/api/gis-map/${o.params.id}?original=1`)).json();m.value={...w,keywords:w.keywords||[],center:w.center??null,widgets:Array.isArray(w.widgets)?w.widgets:[],layers:(w.layers||[]).map(B=>B.id||B)},await k(m.value.layers??[])}catch(E){console.error("Failed to load map:",E),Ee.notify({type:"error",title:"Помилка",message:"Не вдалося завантажити карту"})}finally{l.value=!1}}async function V(){var w,B;const E=(B=(w=i.value)==null?void 0:w.validate)==null?void 0:B.call(w);if(E){Ee.notify({type:"warning",title:"Валідація",message:Object.entries(E).map(([L,W])=>`${L}: ${W}`).join(`
|
|
57
|
+
${C}`:C}d.value=!1,u.value=[]}function m(){d.value=!1,u.value=[]}function y(){const h=s.value==="html"?"html":"list",f={card_mode:h};h==="html"?f.html=i.value:h==="list"&&(f.list=l.value),r("save","card",f)}const k=[{value:"all",label:"Всі"},{value:"list",label:"Список"},{value:"none",label:"Жодне"},{value:"html",label:"HTML"}];return(h,f)=>(e.openBlock(),e.createElementBlock("div",bE,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:a,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:y,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(hE,{modelValue:s.value,"onUpdate:modelValue":f[0]||(f[0]=b=>s.value=b),options:k},null,8,["modelValue"]),e.createElementVNode("div",xE,[s.value==="list"?(e.openBlock(),e.createBlock(Pt,{key:0,modelValue:l.value,"onUpdate:modelValue":f[1]||(f[1]=b=>l.value=b),"columns-scheme":c,"form-scheme":p,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):s.value==="html"?(e.openBlock(),e.createBlock(Un,{key:1,modelValue:i.value,"onUpdate:modelValue":f[2]||(f[2]=b=>i.value=b),language:"html",theme:"vs-light",class:"flex-1 min-h-0"},null,8,["modelValue"])):e.createCommentVNode("",!0)]),e.createVNode(sn,{visible:d.value,"onUpdate:visible":f[3]||(f[3]=b=>d.value=b),selection:u.value,"onUpdate:selection":f[4]||(f[4]=b=>u.value=b),fields:t.fields,title:"Імпорт полів для картки","id-prefix":"import-card",onConfirm:g,onCancel:m},null,8,["visible","selection","fields"])]))}}),wE={class:"flex flex-col flex-1 min-h-0"},_E=e.defineComponent({__name:"vs-tab-filter",props:{fields:{},columns:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,r=n;console.log(o.columns);const l=e.ref(o.columns||[]);e.watch(()=>o.columns,y=>l.value=y||[],{immediate:!0}),e.watch(l,y=>r("update:columns",y),{deep:!0,immediate:!0});const s=e.ref("list"),i=e.ref(!1),d=e.ref([]),u=[{key:"id",label:"Name"},{key:"label",label:"UA"}],c={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 p(){d.value=l.value.map(y=>y.name||y.id),i.value=!0}function a(){var f;const y=[...l.value],k=((f=o.fields)==null?void 0:f.filter(b=>d.value.includes(b.name)))||[],h=dn(y,k,{selectedKeys:d.value,resolveKey:b=>zt(b)});l.value=h,i.value=!1,d.value=[]}function g(){i.value=!1,d.value=[]}function m(){let y=[];s.value==="all"?y=o.fields||[]:s.value==="none"?y=[]:y=l.value,r("save",y)}return(y,k)=>(e.openBlock(),e.createElementBlock("div",wE,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:p,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"}," Зберегти фільтр ")]),s.value==="list"?(e.openBlock(),e.createBlock(Pt,{key:0,modelValue:l.value,"onUpdate:modelValue":k[0]||(k[0]=h=>l.value=h),"columns-scheme":u,"form-scheme":c,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):e.createCommentVNode("",!0),e.createVNode(sn,{visible:i.value,"onUpdate:visible":k[1]||(k[1]=h=>i.value=h),selection:d.value,"onUpdate:selection":k[2]||(k[2]=h=>d.value=h),fields:t.fields,title:"Імпорт полів","id-prefix":"import-filter",onConfirm:a,onCancel:g},null,8,["visible","selection","fields"])]))}}),EE=e.defineComponent({__name:"MapDataLayer",props:{id:{},layer:{},styleSpec:{},autoCenter:{type:[Boolean,null]}},setup(t,{expose:n}){var y,k,h,f;const{map:o,flyTo:r,setZoom:l}=Je(),s=((k=(y=e.getCurrentInstance())==null?void 0:y.appContext.config.globalProperties)==null?void 0:k.$settings)||null,i=t,d=i.id;String(i.id);const u=`${location.origin}/api/vtile/${i.id}/ua/{z}/{x}/{y}.vmt?all=1`,c=je(d,{source:{type:"vector",tiles:[u],minzoom:0,maxzoom:14},popup:i.layer.popup,layer:{style:(h=i.layer)==null?void 0:h.style}});n({layerHandle:c}),(i.autoCenter??!0)&&r({center:i.layer.center||((f=s==null?void 0:s.map)==null?void 0:f.center)||[30,50],animate:!1});let p=null;function a(){if(!(c!=null&&c.setTiles))return;const b=u.includes("?")?"&":"?",x=`${u}${b}_=${Date.now()}`;c.setTiles([x])}function g(){p&&clearTimeout(p),p=setTimeout(()=>{p=null,m().catch(b=>console.error("Failed to update map layer",b))},300)}async function m(){o.value&&(a(),c.setStyle(i.styleSpec??null))}return e.watch(()=>i.styleSpec,g,{deep:!0}),e.onBeforeUnmount(()=>{c.remove()}),(b,x)=>null}}),CE={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},NE={class:"flex-1 relative overflow-hidden"},VE={class:"absolute top-0 left-0 w-full z-20"},$E={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},BE={class:"flex items-start justify-between gap-4"},SE={class:"flex-1 min-w-0"},vE={class:"flex items-center text-sm text-gray-500 mb-3"},LE={class:"text-gray-900 font-medium truncate max-w-xs"},TE={class:"flex items-center justify-between gap-4"},AE={class:"flex-1 min-w-0"},ME={class:"flex items-center gap-3 mb-1"},FE={class:"text-base font-semibold text-gray-900 truncate"},DE={key:0,class:"px-2 py-0.5 bg-green-50 border border-green-200 rounded flex-shrink-0"},PE={class:"text-xs font-medium text-green-700"},zE=["title"],RE={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]"},IE={class:"relative w-full h-full"},jE={style:{top:"17px",left:"230px",position:"absolute","z-index":"1"}},OE={class:"absolute top-4 left-4 z-20"},UE={class:"absolute top-[6.5rem] right-2 space-y-1 z-20"},qE={class:"absolute bottom-4 left-4 z-20"},HE={class:"flex-1 flex flex-col h-full"},WE={class:"px-3 pt-3 pb-2 border-b border-gray-100"},YE={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"},GE=["aria-selected","onClick"],ZE={class:"leading-none"},KE={class:"flex flex-col flex-1 overflow-y-hidden p-3"},XE="OpenGIS",Ga=2,Mo=5,JE=1e3,QE=Object.freeze(Object.defineProperty({__proto__:null,default:Me(e.defineComponent({__name:"service",props:{hideServiceKey:{type:Boolean,default:!1}},setup(t){var pe,Le;const n=t,o=e.toRef(n,"hideServiceKey"),r=qe.useRoute(),l=qe.useRouter(),{id:s}=r.params,i=e.ref(null),d=e.ref(null),u=e.ref({}),c=e.ref(null),p=((Le=(pe=e.getCurrentInstance())==null?void 0:pe.appContext.config.globalProperties)==null?void 0:Le.$settings)||null;function a(j){typeof document>"u"||(document.title=j?`${j} — Сервіс`:XE)}let g=null;const m=e.ref(!1);function y(){var j;return(j=i.value)==null?void 0:j.ctx}function k(j){typeof window>"u"||window.dispatchEvent(new CustomEvent(ao,{detail:j}))}function h(j){var ze,Ae,Ye;const Q=(Ae=(ze=y())==null?void 0:ze.map)==null?void 0:Ae.value;if(!Q||!j)return[];const _e=(Ye=c.value)!=null&&Ye.service_id?String(c.value.service_id):null;return(Q.queryRenderedFeatures(j)||[]).filter(Ge=>{var A,Z,X,xe,Ve,R;const ot=((A=Ge==null?void 0:Ge.properties)==null?void 0:A.id)??(Ge==null?void 0:Ge.id);if(ot==null||!(Ge!=null&&Ge.source)||_e&&String(Ge.source)!==_e)return!1;const Qe=je(Ge.source)||je((Z=Ge.layer)==null?void 0:Z.id);if(!Qe)return!1;const P=(xe=(X=Qe==null?void 0:Qe.opts)==null?void 0:X.source)==null?void 0:xe.type,fe=(R=(Ve=Qe==null?void 0:Qe.opts)==null?void 0:Ve.layer)==null?void 0:R.type;return P!=="raster"&&fe!=="raster"})}function f(j){const Q=h(j==null?void 0:j.point);k({features:Q,externalItems:[]})}function b(j){if(Array.isArray(j))return b(j[0]);if(typeof j!="string"&&typeof j!="number")return null;const Q=typeof j=="number"?j:Number(j.trim());return Number.isFinite(Q)?Q:null}function x(j,Q){return j.toFixed(Q)}function C(j,Q,_e){const ve=.5*10**-_e;return Math.abs(j-Q)>ve}function V(){var Ge,ot,Qe,P;const j=(ot=(Ge=y())==null?void 0:Ge.map)==null?void 0:ot.value;if(!j)return;const Q=b(r.query.z),_e=b(r.query.x),ve=b(r.query.y);if(Q==null||_e==null||ve==null)return;const ze=(Qe=j.getCenter)==null?void 0:Qe.call(j),Ae=(P=j.getZoom)==null?void 0:P.call(j);(!ze||C(ze.lng,_e,Mo)||C(ze.lat,ve,Mo)||C(Ae??0,Q,Ga))&&(m.value=!0,j.jumpTo({center:[_e,ve],zoom:Q}),m.value=!1)}function E(){var ze,Ae,Ye,Ge;if(m.value)return;const j=(Ae=(ze=y())==null?void 0:ze.map)==null?void 0:Ae.value;if(!j)return;const Q=(Ye=j.getCenter)==null?void 0:Ye.call(j),_e=(Ge=j.getZoom)==null?void 0:Ge.call(j);if(!Q||_e==null)return;const ve={...r.query,z:x(_e,Ga),x:x(Q.lng,Mo),y:x(Q.lat,Mo)};r.query.z===ve.z&&r.query.x===ve.x&&r.query.y===ve.y||l.replace({query:ve})}const w=e.ref(null),B=e.ref(""),L=e.ref([]),W=e.ref([]),J=e.ref([]),I=e.ref("list"),te=e.ref(""),ue=e.ref([]),be=e.ref(!0);let ae=null;const ne=e.computed(()=>{var j,Q;return((j=c.value)==null?void 0:j.id)??((Q=c.value)==null?void 0:Q.service_id)??null}),v=e.computed(()=>{const j=(p==null?void 0:p.map)||null,Q=(j==null?void 0:j.boundary)??null,_e=(j==null?void 0:j.katottg)??null;return!Q&&!_e?null:{boundary:Q,katottg:_e}}),M=e.computed(()=>{const j=c.value;if(!j)return"";const Q=[];!o.value&&j.service_key&&Q.push(`Сервіс: ${j.service_key}`),j.description&&Q.push(j.description);const _e=j.group_name||j.group_id;return _e&&Q.push(`Група: ${_e}`),typeof j.is_public<"u"&&Q.push(j.is_public?"Публічний":"Не публічний"),typeof j.is_active<"u"&&Q.push(j.is_active?"Активний":"Неактивний"),Q.join(", ")}),$=e.computed(()=>{const j=c.value,Q=(j==null?void 0:j.group_name)||(j==null?void 0:j.group_id);return Q?String(Q).toUpperCase():""}),N=e.computed(()=>{var _e;const j=(_e=r.matched[r.matched.length-1])==null?void 0:_e.path;return(typeof j=="string"&&j?j:r.path).replace(/\/:id\??$/,"")||"/"}),F=e.computed(()=>{var Q;const j=(Q=r.meta)==null?void 0:Q.title;return typeof j=="string"&&j.trim()?j:"Datasets"});function H(){l.push(N.value)}const he=[{key:"style",label:"Стиль",icon:Ua},{key:"popup",label:"Попап",icon:G2},{key:"filter",label:"Фільтр",icon:J2},{key:"legend",label:"Легенда",icon:j2},{key:"card",label:"Картка",icon:qa},{key:"metadata",label:"Метадані",icon:Or}],Y=he.map(j=>j.key),D=e.ref("style");e.onMounted(async()=>{const j=r.query.tab;j&&Y.includes(j)&&(D.value=j),await we(),O()});async function O(){var ve;const j=y();if(!(j!=null&&j.ready))return;await j.ready(),V();const Q=(ve=j.map)==null?void 0:ve.value;if(!Q)return;const _e=()=>E();Q.on("moveend",_e),Q.on("zoomend",_e),Q.on("click",f),g=()=>{Q.off("moveend",_e),Q.off("zoomend",_e),Q.off("click",f)}}e.watch(()=>[r.query.z,r.query.x,r.query.y],()=>{V()}),e.watch(D,j=>{r.query.tab!==j&&l.replace({query:{...r.query,tab:j}})}),e.watch(()=>r.query.tab,j=>{j&&Y.includes(j)&&D.value!==j&&(D.value=j)}),e.watch(()=>{var j;return(j=c.value)==null?void 0:j.name},j=>a(j),{immediate:!0});function q(j){if(!j)return null;try{return JSON.parse(JSON.stringify(j))}catch(Q){return console.warn("Failed to clone style",Q),null}}function ee(j){if(!j)return null;if(typeof j=="string")try{return Go(wa(j)||null)}catch(Q){return console.warn("Failed to parse style yaml",Q),null}return Go(q(j))}function z(j,Q){try{return JSON.stringify(j)===JSON.stringify(Q)}catch{return!1}}function oe(){var Q;if(!c.value)return;const j=ee(w.value);z(j,((Q=c.value)==null?void 0:Q.style)??null)||(c.value={...c.value,style:j})}function ye(){ae&&clearTimeout(ae),ae=setTimeout(()=>{ae=null,oe()},JE)}const we=async()=>{try{const j=await fetch(`/api/gis-service/${s}`);if(!j.ok)throw new Error(`${j.status}`);const Q=await j.json();u.value=Q||{},d.value=s;const _e=ee(Q.style);c.value=Q?{...Q,style:q(_e)}:null,w.value=_e,B.value=typeof(Q==null?void 0:Q.style)=="string"?Q.style:_e?Oa(_e):"",W.value=(Q==null?void 0:Q.popup)||[],I.value=Q.card_mode==="html"?"html":"list",J.value=Q.card,te.value=Q.html,L.value=(Q==null?void 0:Q.legend)||[],ue.value=(Q==null?void 0:Q.filters)||[]}catch(j){console.error("Failed to fetch map info",j)}};e.watch(()=>{var j;return(j=c.value)==null?void 0:j.style},j=>{w.value=ee(j)},{deep:!0}),e.watch(()=>w.value,()=>{ye()},{deep:!0}),e.onBeforeUnmount(()=>{ae&&(clearTimeout(ae),ae=null),g==null||g(),g=null});async function T(j){try{const Q=await fetch(`/api/gis-clear-vtile/${j}`),{message:_e,error:ve,code:ze}=await Q.json();if(ze===200)return Ee.notify({type:"success",title:"Успіх",message:_e});Ee.notify({type:"error",title:"Помилка",message:ve})}catch(Q){Ee.notify({type:"error",title:"Помилка",message:"Не вдалося очистити тайли"}),console.error(Q)}}async function K(j,Q){await ie({[j]:Q},j)}function me(){const j=q(w.value);c.value=c.value?{...c.value,style:j}:c.value}async function ie(j,Q){if(c.value={...c.value||{},...j},typeof j.html<"u"&&(u.value={...u.value||{},html:j.html}),!!ne.value)try{if(!(await fetch(`/api/gis-service/${ne.value}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(j)})).ok)throw new Error("Save failed");Ee.notify({type:"success",title:"Успіх",message:`${Q} saved`}),await we()}catch(_e){Ee.notify({type:"error",title:"Помилка",message:`Failed to save ${Q}`}),console.error(_e)}}async function de(j,Q){if(j!=="card"){await K(j,Q);return}const _e=(Q==null?void 0:Q.card_mode)==="html"?"html":"list",ve=_e==="html"&&typeof(Q==null?void 0:Q.html)=="string"?Q.html:"",ze=(_e==="html"?[]:null)||(Array.isArray(Q==null?void 0:Q.list)?Q.list:[]);J.value=ze,I.value=_e,te.value=ve;const Ae={card_mode:_e};_e==="html"&&(Ae.html=ve),_e==="list"&&(Ae.card=ze),await ie(Ae,"card")}return(j,Q)=>{var _e,ve,ze;return e.openBlock(),e.createElementBlock("div",CE,[e.createElementVNode("div",NE,[e.createElementVNode("div",VE,[e.createElementVNode("div",$E,[e.createElementVNode("div",BE,[e.createElementVNode("div",SE,[e.createElementVNode("div",vE,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:H},e.toDisplayString(F.value),1),Q[10]||(Q[10]=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",LE,e.toDisplayString(((_e=c.value)==null?void 0:_e.name)||"Dataset"),1)]),e.createElementVNode("div",TE,[e.createElementVNode("div",AE,[e.createElementVNode("div",ME,[e.createElementVNode("h1",FE,e.toDisplayString(((ve=c.value)==null?void 0:ve.name)||"Dataset"),1),$.value?(e.openBlock(),e.createElementBlock("div",DE,[e.createElementVNode("span",PE,e.toDisplayString($.value),1)])):e.createCommentVNode("",!0)]),M.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:M.value},e.toDisplayString(M.value),9,zE)):e.createCommentVNode("",!0)])])]),ne.value?(e.openBlock(),e.createBlock(qr,{key:0,class:"flex-shrink-0","entity-id":ne.value,"entity-info":{name:(ze=c.value)==null?void 0:ze.name},table:"gis.services.table","entity-label":"Сервіс","save-method":"put","show-xml-item":!1,"clear-tiles-handler":T,onSaved:we},null,8,["entity-id","entity-info"])):e.createCommentVNode("",!0)])])]),e.createElementVNode("div",RE,[e.createElementVNode("div",IE,[e.createVNode(eo,{ref_key:"mapViewRef",ref:i},{default:e.withCtx(()=>{var Ae,Ye,Ge,ot,Qe,P,fe;return[(Ae=c.value)!=null&&Ae.service_id?(e.openBlock(),e.createBlock(EE,{key:0,id:(Ye=c.value)==null?void 0:Ye.service_id,layer:c.value,"style-spec":((Ge=c.value)==null?void 0:Ge.style)||null,autoCenter:!1},null,8,["id","layer","style-spec"])):e.createCommentVNode("",!0),ne.value?(e.openBlock(),e.createBlock(jl,{key:1,"layer-id":ne.value,boundary:((ot=c.value)==null?void 0:ot.boundary)||((Qe=v.value)==null?void 0:Qe.boundary)||null,katottg:((P=c.value)==null?void 0:P.katottg)||((fe=v.value)==null?void 0:fe.katottg)||null},null,8,["layer-id","boundary","katottg"])):e.createCommentVNode("",!0),e.createElementVNode("div",jE,[ne.value?(e.openBlock(),e.createBlock(sr,{key:0,"layer-id":ne.value,filters:ue.value},null,8,["layer-id","filters"])):e.createCommentVNode("",!0)]),Q[11]||(Q[11]=e.createElementVNode("div",{id:"map-filter-popover-host",class:"map-widget__filter-host"},null,-1)),e.createElementVNode("div",OE,[e.createVNode(rn)]),e.createElementVNode("div",UE,[e.createVNode(Ht),u.value.center?(e.openBlock(),e.createBlock(Ht,{key:0,targetCenter:u.value.center,targetLabel:"Ценр даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0)]),e.createElementVNode("div",qE,[e.createVNode(ar,{items:L.value||null},null,8,["items"])]),e.createVNode(El),e.createVNode(lr,{html:u.value.html},null,8,["html"])]}),_:1},512)])]),e.createVNode(jr,{open:be.value,onToggle:Q[0]||(Q[0]=Ae=>be.value=!be.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",be.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",HE,[e.createElementVNode("div",WE,[e.createElementVNode("div",YE,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(he,Ae=>e.createElementVNode("button",{key:Ae.key,type:"button",role:"tab","aria-selected":D.value===Ae.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",D.value===Ae.key?"bg-white shadow-sm text-gray-700":""]),onClick:Ye=>D.value=Ae.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(Ae.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",ZE,e.toDisplayString(Ae.label),1)],10,GE)),64))])]),e.createElementVNode("div",KE,[D.value==="style"?(e.openBlock(),e.createBlock(tE,{key:0,token:ne.value,"style-text":B.value,"style-yaml":w.value,"onUpdate:styleYaml":Q[1]||(Q[1]=Ae=>w.value=Ae),"onUpdate:styleText":Q[2]||(Q[2]=Ae=>B.value=Ae),onUpdate:me},null,8,["token","style-text","style-yaml"])):D.value==="legend"?(e.openBlock(),e.createBlock(fE,{key:1,token:ne.value,columns:L.value,"onUpdate:columns":Q[3]||(Q[3]=Ae=>L.value=Ae),onSave:Q[4]||(Q[4]=Ae=>K("legend",Ae))},null,8,["token","columns"])):D.value==="popup"?(e.openBlock(),e.createBlock(rE,{key:2,token:ne.value,columns:W.value,fields:u.value.fields,"onUpdate:columns":Q[5]||(Q[5]=Ae=>W.value=Ae),onSave:Q[6]||(Q[6]=Ae=>K("popup",Ae))},null,8,["token","columns","fields"])):D.value==="card"?(e.openBlock(),e.createBlock(kE,{key:3,token:ne.value,columns:J.value,fields:u.value.fields,"view-mode":I.value,html:te.value,"onUpdate:columns":Q[7]||(Q[7]=Ae=>J.value=Ae),onSave:de},null,8,["token","columns","fields","view-mode","html"])):D.value==="filter"?(e.openBlock(),e.createBlock(_E,{key:4,token:ne.value,fields:u.value.fields,columns:ue.value,"onUpdate:columns":Q[8]||(Q[8]=Ae=>ue.value=Ae),onSave:Q[9]||(Q[9]=Ae=>K("filters",Ae))},null,8,["token","fields","columns"])):D.value==="metadata"?(e.openBlock(),e.createBlock(Ur,{key:5,data:c.value,"entity-id":String(e.unref(s)),"entity-type":"service",onSaved:we},null,8,["data","entity-id"])):e.createCommentVNode("",!0)])])],2)])}}}),[["__scopeId","data-v-21ef302a"]])},Symbol.toStringTag,{value:"Module"})),eC={class:"flex-1 flex flex-col bg-gray-50 h-screen overflow-hidden p-0 m-0"},tC={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"},nC={class:"flex-1 px-4 sm:px-6 pb-4 overflow-y-auto overflow-x-visible"},oC={class:"bg-white rounded-lg shadow-sm border border-gray-200 overflow-visible"},rC={class:"p-3 border-b border-gray-200"},lC={class:"flex flex-col sm:flex-row gap-2"},aC={class:"entity-table-root"},sC={class:"gap-2 inline-flex"},iC=["onClick"],cC={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"},dC={class:"text-sm text-gray-500"},uC={class:"font-medium text-gray-700"},fC={class:"font-medium text-gray-700"},mC={class:"font-medium text-gray-700"},pC={class:"flex items-center justify-end gap-3"},gC=Object.freeze(Object.defineProperty({__proto__:null,default:Me(e.defineComponent({__name:"RastersTablePage",props:{entityKey:{default:"rasters"},entityBasePath:{default:"/gis.rasters"},columnsConfig:{default:()=>[]}},setup(t){const n=e.defineAsyncComponent(()=>import("@opengis/table")),o=qe.useRoute(),r=qe.useRouter(),l=t,s=e.computed(()=>{var v;return String(((v=o.meta)==null?void 0:v.title)||"Растри")}),i=e.computed(()=>{var v;return String(((v=o.meta)==null?void 0:v.description)||"")}),d=e.computed(()=>`Пошук ${String(s.value).trim()}...`),u=e.computed(()=>l.entityKey||"rasters"),c=e.computed(()=>l.entityBasePath||"/gis.rasters"),p=e.ref([]),a=e.ref(!0),g=e.ref([]),m=e.ref([]),y=e.ref({}),k=e.ref([]),h=e.ref(String(o.query.search??"")),f=e.ref(Math.max(1,Number(o.query.page)||1)),b=e.ref(15),x=e.ref(0),C=e.computed(()=>x.value>0),V=e.computed(()=>x.value?(f.value-1)*b.value+1:0),E=e.computed(()=>x.value?Math.min(f.value*b.value,x.value):0);function w(v){const M=new URLSearchParams;return Object.entries(v).forEach(([$,N])=>{if(!(N==null||N==="")){if(Array.isArray(N)){N.forEach(F=>{F!=null&&F!==""&&M.append($,String(F))});return}M.append($,String(N))}}),M.toString()}function B(){return`${c.value}/new`}function L(v){return`${c.value}/${v}/edit`}async function W(){try{a.value=!0;const v=`/api/data/gis.${u.value}.table`,M=w({...y.value,page:f.value,limit:b.value}),$=await fetch(M?`${v}?${M}`:v);if(!$.ok)throw new Error(`Rows fetch failed: ${$.status}`);const N=await $.json();p.value=N.rows||[],x.value=Number(N.filtered??N.total??N.count??p.value.length)||0,g.value=l.columnsConfig.length?l.columnsConfig:N.columns||[],m.value=N.filters||[],k.value=N.actions||[],g.value.length&&!g.value[0].link?g.value[0].link=`${c.value}/{id}`:g.value.length&&(g.value[0].link=`${c.value}/{id}`)}catch{p.value=[],x.value=0}finally{a.value=!1}}function J(v){y.value=v,f.value=1,ne(),W()}async function I(v,M,$){const N=await fetch(`/api/form/gis.${u.value}.table/${v.id}`);if(!N.ok)throw new Error(`Form fetch failed: ${N.status}`);const H=(await N.json()).token,he=await fetch(`/api/table/${H}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({[M]:$})});if(!he.ok)throw Ee.notify({type:"error",title:"Помилка збереження",message:`Поле "${M}" не оновлено`}),new Error(`Save failed: ${he.status}`);Ee.notify({title:"Збережено",message:`Поле "${M}" оновлено`})}function te(v,M){y.value={...y.value,[v]:M},f.value=1,ne(),W()}function ue(v){te((v==null?void 0:v.name)||"search",(v==null?void 0:v.value)??h.value)}function be(v){h.value="",te(v||"search",void 0)}function ae(v){!v||v===f.value||(f.value=v,ne(),W())}function ne(){const v={...o.query,page:String(f.value),...h.value?{search:h.value}:{}};h.value||delete v.search,delete v.view,r.replace({query:v})}return e.onMounted(()=>{W(),document.title=s.value}),e.watch(()=>o.name,()=>{f.value=1,h.value="",W(),document.title=s.value}),e.watch(()=>o.query,v=>{const M=Math.max(1,Number(v.page)||1),$=String(v.search??""),N=M!==f.value,F=$!==h.value;!N&&!F||(f.value=M,h.value=$,y.value={...y.value,search:$||void 0},W())}),(v,M)=>(e.openBlock(),e.createElementBlock("div",eC,[e.createVNode(an,{variant:"table"},e.createSlots({title:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value),1)]),actions:e.withCtx(()=>[e.createElementVNode("a",tC,[e.createVNode(e.unref(ge.RefreshCw),{size:16}),M[2]||(M[2]=e.createTextVNode(" Оновити растри ",-1))]),e.createElementVNode("a",{onClick:M[0]||(M[0]=$=>e.unref(r).push(B())),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(ge.Plus),{size:16}),M[3]||(M[3]=e.createTextVNode(" Додати ",-1))])]),_:2},[i.value?{name:"description",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(i.value),1)]),key:"0"}:void 0]),1024),e.createElementVNode("div",nC,[e.createElementVNode("div",oC,[e.createElementVNode("div",rC,[e.createElementVNode("div",lC,[e.createVNode(e.unref(Jn.FilterField),{modelValue:h.value,"onUpdate:modelValue":M[1]||(M[1]=$=>h.value=$),name:"search",type:"text",layout:"inline",class:"flex-1",width:"100%",cleanable:!0,onChange:ue,onClear:be,placeholder:d.value},null,8,["modelValue","placeholder"]),e.createVNode(e.unref(Jn.Filter),{schema:m.value,value:y.value,onChange:J,layout:"inline",mode:"soft",view:"popover",limit:8,class:"flex-shrink-0"},null,8,["schema","value"])])]),e.createElementVNode("div",aC,[e.createVNode(e.unref(n),{rows:p.value,columns:g.value,loading:a.value,router:e.unref(r),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:$})=>[e.createElementVNode("div",sC,[e.createElementVNode("button",{onClick:N=>e.unref(r).push(L($.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(Qn)],8,iC)])]),_:1},8,["rows","columns","loading","router"])]),C.value?(e.openBlock(),e.createElementBlock("div",cC,[e.createElementVNode("div",dC,[M[4]||(M[4]=e.createTextVNode(" Показано ",-1)),e.createElementVNode("span",uC,e.toDisplayString(V.value),1),M[5]||(M[5]=e.createTextVNode(" - ",-1)),e.createElementVNode("span",fC,e.toDisplayString(E.value),1),M[6]||(M[6]=e.createTextVNode(" з ",-1)),e.createElementVNode("span",mC,e.toDisplayString(x.value),1)]),e.createElementVNode("div",pC,[e.createVNode(e.unref(Ee.VsPagination),{total:x.value,page:f.value,"page-size":b.value,showPageSizes:!1,pageRange:5,view:"button",color:"gray","onUpdate:page":ae,onPageChange:ae},null,8,["total","page","page-size"])])])):e.createCommentVNode("",!0)])])]))}}),[["__scopeId","data-v-63309b89"]])},Symbol.toStringTag,{value:"Module"})),yC={class:"flex-1 overflow-y-auto p-4 sm:p-6"},hC={class:"space-y-3"},bC={class:"bg-white p-3 rounded-xl border border-gray-200 shadow-sm"},xC={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2"},kC={class:"text-xs text-gray-500 mb-1"},wC={key:0,class:"text-base text-md font-semibold text-gray-900"},_C={key:1,class:"text-base text-md font-semibold text-gray-900"},EC={class:"bg-white p-3 rounded-xl border border-gray-200 shadow-sm"},CC={class:"space-y-2"},NC={class:"bg-gradient-to-br from-blue-50 to-blue-100/30 p-4 rounded-lg border border-blue-200"},VC={class:"text-sm font-semibold text-gray-900"},$C={class:"text-xs text-gray-600 mt-1"},BC={class:"grid grid-cols-2 gap-3"},SC={class:"text-xs text-gray-500 mb-1"},vC={class:"text-sm font-semibold text-gray-900"},LC={class:"bg-gray-50 p-4 rounded-lg"},TC={class:"grid grid-cols-2 gap-4"},AC={class:"text-xs text-gray-500 mb-1"},MC={class:"text-sm font-semibold text-gray-900"},FC=e.defineComponent({directives:{tooltip:Ee.TooltipDirective},__name:"raster-info-tab",props:{details:{}},setup(t){return(n,o)=>{const r=e.resolveDirective("tooltip");return e.openBlock(),e.createElementBlock("div",yC,[e.createElementVNode("div",hC,[e.createElementVNode("div",bC,[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",xC,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.baseParams,l=>(e.openBlock(),e.createElementBlock("div",{key:l.label,class:"bg-gray-50 p-2 rounded-lg"},[e.createElementVNode("p",kC,e.toDisplayString(l.label),1),l.tooltip?e.withDirectives((e.openBlock(),e.createElementBlock("p",wC,[e.createTextVNode(e.toDisplayString(l.value),1)])),[[r,l.tooltip]]):(e.openBlock(),e.createElementBlock("p",_C,e.toDisplayString(l.value),1))]))),128))])]),e.createElementVNode("div",EC,[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",CC,[e.createElementVNode("div",null,[o[1]||(o[1]=e.createElementVNode("p",{class:"text-xs text-gray-500 mb-2"},"Система координат",-1)),e.createElementVNode("div",NC,[e.createElementVNode("p",VC,e.toDisplayString(t.details.spatial.crs.code),1),e.createElementVNode("p",$C,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",BC,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.spatial.bounds,l=>(e.openBlock(),e.createElementBlock("div",{key:l.label,class:"bg-gray-50 p-2 rounded-lg border border-gray-200"},[e.createElementVNode("p",SC,e.toDisplayString(l.label),1),e.createElementVNode("p",vC,e.toDisplayString(l.value),1)]))),128))])]),e.createElementVNode("div",LC,[e.createElementVNode("div",TC,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.spatial.resolution,l=>(e.openBlock(),e.createElementBlock("div",{key:l.label},[e.createElementVNode("p",AC,e.toDisplayString(l.label),1),e.createElementVNode("p",MC,e.toDisplayString(l.value),1)]))),128))])])])])])])}}}),DC={class:"flex-1 overflow-y-auto space-y-3 pr-1"},PC={class:"font-medium text-sm text-gray-800"},zC={class:"text-xs text-gray-500"},RC=e.defineComponent({__name:"raster-files-tab",props:{files:{}},setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",DC,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.files,r=>(e.openBlock(),e.createElementBlock("div",{key:r.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",PC,e.toDisplayString(r.name),1),e.createElementVNode("p",zC,e.toDisplayString(r.resolution)+" • "+e.toDisplayString(r.size)+"MB",1)]),e.createElementVNode("span",{class:e.normalizeClass(["text-[11px] font-semibold px-2 py-0.5 rounded-full",r.statusClass])},e.toDisplayString(r.status),3)]))),128))]))}}),IC={},jC={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 OC(t,n){return e.openBlock(),e.createElementBlock("svg",jC,[...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 UC=Me(IC,[["render",OC]]),qC={class:"absolute top-[5.5rem] left-4 z-30 flex flex-col items-start gap-2"},HC={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},WC={class:"flex items-center gap-2"},YC={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},GC={class:"inline-flex items-center gap-2 text-[11px] text-slate-600"},ZC=["checked"],KC=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",r=`${o}-source`,l=n.extent&&n.extent.length===4?[...n.extent]:void 0,s=je(o,{sourceId:r,source:{type:"raster",tiles:n.tileUrl?[n.tileUrl+"?nottl=1"]:[],tileSize:256,...l?{bounds:l}:{}},layer:{id:`${o}-raster`,type:"raster",paint:{"raster-opacity":1}},beforeId:n.beforeId??null}),{fitBounds:i}=Je(),d=e.ref(1);e.watch(()=>n.tileUrl,a=>{if(!a){s.setVisible(!1);return}s.setVisible(!0),s.setTiles([a])},{immediate:!0}),e.watch(()=>d.value,a=>{s.setOpacity(a)},{immediate:!0});let u=null,c=!1;e.watch(()=>n.extent,a=>{if(!a||a.length!==4)return;const g=a.join(",");if(g!==u){if(u=g,!c){c=!0;return}i==null||i([[a[0],a[1]],[a[2],a[3]]],{padding:40,maxZoom:17})}},{immediate:!0});const p=e.computed(()=>`${Math.round(d.value*100)}%`);return(a,g)=>(e.openBlock(),e.createElementBlock("div",qC,[e.createElementVNode("div",HC,[e.createElementVNode("div",WC,[g[2]||(g[2]=e.createElementVNode("span",null,"Прозорість:",-1)),e.withDirectives(e.createElementVNode("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":g[0]||(g[0]=m=>d.value=m),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,d.value,void 0,{number:!0}]]),e.createElementVNode("span",null,e.toDisplayString(p.value),1)])]),e.createElementVNode("div",YC,[e.createElementVNode("label",GC,[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:g[1]||(g[1]=m=>a.$emit("toggle-extent",m.target.checked))},null,40,ZC),g[3]||(g[3]=e.createElementVNode("span",null,"Межі растру",-1))])])]))}}),Fo=e.defineComponent({__name:"ExtentOutlineLayer",props:{extent:{},layerId:{},beforeId:{},lineColor:{},lineWidth:{}},setup(t){const n=t,o=n.layerId||"extent-outline-layer",r=`${o}-source`,l=e.computed(()=>{const{extent:d}=n;if(!d||d.length!==4)return null;const[u,c,p,a]=d;return[u,c,p,a].some(g=>typeof g!="number"||Number.isNaN(g))?null:{type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[u,c],[p,c],[p,a],[u,a],[u,c]]]}}]}}),s=Je(),i=je(o,{sourceId:r,source:{type:"geojson",data:l.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(()=>l.value,d=>{var c;if(!d){i.setVisible(!1),i.setData({type:"FeatureCollection",features:[]});return}i.setVisible(!0),i.setData(d);const u=(c=s.map)==null?void 0:c.value;u!=null&&u.moveLayer&&u.getLayer(o)&&u.moveLayer(o)},{immediate:!0}),(d,u)=>e.createCommentVNode("",!0)}}),XC={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},JC={class:"flex-1 relative overflow-hidden"},QC={class:"absolute top-0 left-0 w-full z-20"},eN={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},tN={class:"flex items-start justify-between gap-4"},nN={class:"flex-1 min-w-0"},oN={class:"flex items-center text-sm text-gray-500 mb-3"},rN={class:"text-gray-900 font-medium truncate max-w-xs"},lN={class:"flex items-center justify-between gap-4"},aN={class:"flex-1 min-w-0"},sN={class:"flex items-center gap-3 mb-1"},iN={class:"text-base font-semibold text-gray-900 truncate"},cN=["title"],dN={class:"flex items-center gap-4 min-w-0"},uN={class:"flex-1 min-w-0"},fN=["title"],mN={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]"},pN={class:"relative w-full h-full"},gN={class:"absolute top-4 left-4 z-20"},yN={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"},hN={class:"absolute top-[6.5rem] right-2 space-y-1 z-20"},bN={class:"flex-1 flex flex-col h-full"},xN={class:"px-3 pt-3 pb-2 border-b border-gray-100"},kN={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"},wN=["aria-selected","onClick"],_N={class:"leading-none"},EN={class:"flex flex-col flex-1 overflow-y-hidden p-3"},CN={key:0,class:"mb-3 text-xs text-slate-500"},NN={key:1,class:"mb-3 text-xs text-rose-600"},VN="OpenGIS",Za=2,Do=5,$N=5,BN=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=qe.useRouter(),r=qe.useRoute(),l=e.ref(null),s=e.computed(()=>{var A;const P=(A=r.matched[r.matched.length-1])==null?void 0:A.path;return(typeof P=="string"&&P?P:r.path).replace(/\/:id\??$/,"")||"/"}),i=e.computed(()=>{var fe;const P=(fe=r.meta)==null?void 0:fe.title;return typeof P=="string"&&P.trim()?P:"Растри"});function d(){o.push(s.value)}const u=e.computed(()=>{var fe;const P=(fe=r.params)==null?void 0:fe.id;return typeof P=="string"?P:void 0}),c=e.ref(null),p=e.ref(!1),a=e.ref(!1),g=e.ref(null),m=e.ref(!0),y=e.ref(!1),k=e.ref(null);let h=null,f=null;const b=e.ref(!1);let x=null,C=!1;function V(P){if(Array.isArray(P))return V(P[0]);if(typeof P!="string"&&typeof P!="number")return null;const fe=typeof P=="number"?P:Number(P.trim());return Number.isFinite(fe)?fe:null}function E(P,fe){return P.toFixed(fe)}function w(P,fe,A){const Z=.5*10**-A;return Math.abs(P-fe)>Z}function B(){var P;return(P=l.value)==null?void 0:P.ctx}function L(){var R,se,re,Ce;const P=(se=(R=B())==null?void 0:R.map)==null?void 0:se.value;if(!P)return;const fe=V(r.query.z),A=V(r.query.x),Z=V(r.query.y);if(fe==null||A==null||Z==null)return;const X=(re=P.getCenter)==null?void 0:re.call(P),xe=(Ce=P.getZoom)==null?void 0:Ce.call(P);(!X||w(X.lng,A,Do)||w(X.lat,Z,Do)||w(xe??0,fe,Za))&&(b.value=!0,P.jumpTo({center:[A,Z],zoom:fe}),b.value=!1)}function W(){var X,xe,Ve,R;if(b.value)return;const P=(xe=(X=B())==null?void 0:X.map)==null?void 0:xe.value;if(!P)return;const fe=(Ve=P.getCenter)==null?void 0:Ve.call(P),A=(R=P.getZoom)==null?void 0:R.call(P);if(!fe||A==null)return;const Z={...r.query,z:E(A,Za),x:E(fe.lng,Do),y:E(fe.lat,Do)};r.query.z===Z.z&&r.query.x===Z.x&&r.query.y===Z.y||o.replace({query:Z})}function J(){var fe;if(typeof document>"u")return;const P=(fe=ee.value)==null?void 0:fe.name;document.title=P?`${P} — Растер`:VN}function I(P){return Number(P.toFixed($N))}function te(P,fe){const[A,Z]=P,[X,xe]=fe;return[I(Math.min(A,X)),I(Math.min(Z,xe)),I(Math.max(A,X)),I(Math.max(Z,xe))]}function ue(P){const[fe,A,Z,X]=P;return{type:"Polygon",coordinates:[[[fe,A],[Z,A],[Z,X],[fe,X],[fe,A]]]}}function be(P){var Z,X,xe;const fe=(X=(Z=B())==null?void 0:Z.map)==null?void 0:X.value,A=(xe=fe==null?void 0:fe.getCanvas)==null?void 0:xe.call(fe);A!=null&&A.style&&(A.style.cursor=P)}async function ae(P,fe){if(!(!u.value||!c.value))try{const A=ue(P),Z=await fetch(`/api/gis-metadata/raster/${encodeURIComponent(u.value)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({geom:A})});if(!Z.ok)throw new Error(`Failed to save raster metadata geom: ${Z.status}`);Ee.notify({type:"success",title:"Extent збережено",message:"Нові межі успішно збережено."}),await pe()}catch(A){console.error("Failed to save raster extent",A),c.value&&(c.value={...c.value,extent:fe?[...fe]:void 0}),Ee.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти Extent"})}}function ne(P){var A,Z,X;const fe=(Z=(A=B())==null?void 0:A.map)==null?void 0:Z.value;if((X=fe==null?void 0:fe.dragPan)!=null&&X.enable&&fe.dragPan.enable(),(P==null?void 0:P.length)===4&&c.value){const xe=Array.isArray(c.value.extent)?[...c.value.extent]:null;c.value={...c.value,extent:[...P]},ae(P,xe)}x=null,C=!1,k.value=null,y.value=!1,be("")}function v(){ne(null)}function M(){var xe,Ve;const P=(Ve=(xe=B())==null?void 0:xe.map)==null?void 0:Ve.value;if(!P)return;const fe=R=>{var re,Ce,$e;if(!y.value||((re=R==null?void 0:R.originalEvent)==null?void 0:re.button)!=null&&R.originalEvent.button!==0)return;const se=R==null?void 0:R.lngLat;se&&(x=[se.lng,se.lat],C=!0,k.value=[se.lng,se.lat,se.lng,se.lat],($e=(Ce=P.dragPan)==null?void 0:Ce.disable)==null||$e.call(Ce))},A=R=>{if(!y.value||!C||!x)return;const se=R==null?void 0:R.lngLat;se&&(k.value=te(x,[se.lng,se.lat]))},Z=R=>{if(!y.value||!C||!x)return;const se=R==null?void 0:R.lngLat;if(!se){v();return}const re=te(x,[se.lng,se.lat]),[Ce,$e,Ie,tt]=re;if(!(Math.abs(Ie-Ce)>0&&Math.abs(tt-$e)>0)){Ee.notify({type:"warning",title:"Bounds не змінено",message:"Потрібно протягнути прямокутник з ненульовою площею."}),v();return}ne(re)},X=R=>{y.value&&R.key==="Escape"&&(R.preventDefault(),v())};P.on("mousedown",fe),P.on("mousemove",A),P.on("mouseup",Z),window.addEventListener("keydown",X),f=()=>{P.off("mousedown",fe),P.off("mousemove",A),P.off("mouseup",Z),window.removeEventListener("keydown",X)}}async function $(){var A;if(y.value)return;const P=B();!(P!=null&&P.ready)||(await P.ready(),!((A=P.map)==null?void 0:A.value))||(f||M(),y.value=!0,C=!1,x=null,k.value=null,be("crosshair"),Ee.notify({type:"info",title:"Редагування Bounds",message:"Протягніть прямокутник на карті, щоб задати нові межі."}))}const N=e.computed(()=>{var fe;const P=(fe=c.value)==null?void 0:fe.url;return P?/^https?:\/\//i.test(P)||typeof window>"u"||typeof location>"u"?P:`${location.origin}${P}`:""}),F=e.computed(()=>{var P;return((P=c.value)==null?void 0:P.extent)??null}),H=e.computed(()=>u.value?`raster-${u.value}`:void 0),he=e.computed(()=>u.value?`raster-extent-${u.value}`:"raster-extent"),Y=e.computed(()=>u.value?`raster-extent-draft-${u.value}`:"raster-extent-draft"),D=e.computed(()=>{const P=H.value??"raster",fe=F.value&&F.value.length===4?F.value.join(","):"no-extent";return`${P}-${fe}`}),O=e.computed(()=>!!N.value),q=e.computed(()=>{const P=F.value;if(!P||P.length!==4)return null;const[fe,A,Z,X]=P;return[fe,A,Z,X].some(xe=>typeof xe!="number"||Number.isNaN(xe))?null:[(fe+Z)/2,(A+X)/2]}),ee=e.computed(()=>{var xe,Ve;const P=c.value,fe=P==null?void 0:P.extent,Z=u.value??"—",X=[P!=null&&P.extension?`Формат ${String(P.extension).toUpperCase()}`:null,(P==null?void 0:P.resolution)||null].filter(Boolean).join(", ");return{id:Z,name:(P==null?void 0:P.name)||((Ve=(xe=P==null?void 0:P.files)==null?void 0:xe[0])==null?void 0:Ve.name),description:(P==null?void 0:P.description)||X||"Попередній перегляд растрового шару.",coverage:fe&&fe.length===4?`${Qe(fe[0])}, ${Qe(fe[1])} → ${Qe(fe[2])}, ${Qe(fe[3])}`:"Покриття уточнюється",crs:P!=null&&P.srid?`EPSG:${P.srid}`:"EPSG:4326",source:P!=null&&P.proj4?P.proj4:"Джерело: Mapnik",updatedAt:P!=null&&P.cache?"Дані кешовано":"Нові дані"}}),z=e.computed(()=>{const P=c.value;return P?[P.source_path,P.srid?`SRID: ${P.srid}`:null,P.is_public?"Публічна":"Не публічна",P.is_active?"Активна":"Неактивна",P.cache?"Кешовано":null].filter(fe=>fe).join(", "):""}),oe=[{key:"info",label:"Інформація",icon:UC},{key:"files",label:"Файли",icon:Qn},{key:"metadata",label:"Метадані",icon:Or}],ye=oe.map(P=>P.key),we=e.ref(ye.includes(r.query.tab)?r.query.tab:"info"),T=e.ref(!0);e.watch(()=>r.query.tab,P=>{P&&ye.includes(P)&&we.value!==P&&(we.value=P)}),e.watch(we,P=>{r.query.tab!==P&&o.replace({query:{...r.query,tab:P}})});const K=e.computed(()=>j(c.value)),me=e.computed(()=>_e(c.value));e.watch(()=>c.value,()=>{J()},{immediate:!0});async function ie(){var Z;const P=B();if(!(P!=null&&P.ready))return;await P.ready(),L();const fe=(Z=P.map)==null?void 0:Z.value;if(!fe)return;const A=()=>W();fe.on("moveend",A),fe.on("zoomend",A),h=()=>{fe.off("moveend",A),fe.off("zoomend",A)}}e.watch(()=>[r.query.z,r.query.x,r.query.y],()=>{L()}),e.onMounted(()=>{ie()}),e.onBeforeUnmount(()=>{h==null||h(),h=null,f==null||f(),f=null,be("")}),e.watch(u,()=>{pe()},{immediate:!0});async function de(P){var fe;pe(),((fe=c.value)==null?void 0:fe.srid)!==P.srid&&(Ee.notify({title:"XML start",type:"info",message:"зміна системи координат, оновлюємо карту ..."}),await Le(`/api/gis-xml/${encodeURIComponent(u.value)}`),Ee.notify({title:"XML created",type:"info",message:"карта створена"}),location.reload())}async function pe(){const P=u.value;if(!P){c.value=null,g.value=null;return}p.value=!0,g.value=null;try{const fe=await fetch(`/api/gis-raster/${encodeURIComponent(P)}`);if(!fe.ok)throw new Error(`HTTP ${fe.status}`);const A=await fe.json();A.xml&&(a.value=!0),c.value=A,A.xml||(Ee.notify({title:"XML not found",type:"info",message:"йде створення xml ... зачекайте"}),await Le(`/api/gis-xml/${encodeURIComponent(P)}`),Ee.notify({title:"XML created",type:"info",message:"карта створена"}),fetch(`/api/gis-raster/${encodeURIComponent(P)}?nocache=1`),a.value=!0)}catch(fe){console.error("Failed to load raster info",fe),c.value=null,g.value=fe instanceof Error?fe.message:String(fe)}finally{p.value=!1}}function Le(P){return new Promise((fe,A)=>{const Z=new EventSource(P),X=[];Z.onmessage=xe=>{X.push(xe.data),console.log("Received:",xe.data)},Z.addEventListener("end",()=>{Z.close(),fe(X)}),Z.onerror=xe=>{Z.close(),fe(xe)}})}function j(P){var fe;return(fe=P==null?void 0:P.files)!=null&&fe.length?P.files.map(A=>({name:A.name,resolution:Q(A.name,P),size:A.size||"—",status:"Готово",statusClass:"bg-emerald-50 text-emerald-600 border border-emerald-100"})):[]}function Q(P,fe){const A=P.toLowerCase();return A.endsWith(".tfw")?"Georeference":A.endsWith(".xml")?"Опис":A.endsWith(".tif")||A.endsWith(".tiff")?fe!=null&&fe.resolution?fe.resolution:"Растер":(fe==null?void 0:fe.resolution)??"Файл"}function _e(P){return P?{baseParams:ze(P),spatial:{crs:{code:P.srid?`EPSG:${P.srid}`:"EPSG:4326",description:P.proj4||"WGS 84 — World Geodetic System 1984"},bounds:Ae(P.extent),resolution:Ye(P)},statistics:Ge(P),technical:ot(P)}:null}function ve(P){return P!=null&&P.length?P.map(A=>{var X;if(!A)return"";const Z=A.trim().split(/\s+/)[0];return((X=Z==null?void 0:Z[0])==null?void 0:X.toUpperCase())||""}).filter(Boolean).join(""):""}function ze(P){var xe,Ve;const fe=P.bands_count??((xe=P.bands)==null?void 0:xe.length)??"—",A=ve(P.bands),Z=(P.bands??[]).map(R=>R.trim()).filter(R=>R.length>0),X=Z.length?Z.join(", "):void 0;return[{label:"Розмір растру, px",value:P.width&&P.height?`${P.width}×${P.height}`:"—"},{label:"Формат файлу",value:((Ve=P.extension)==null?void 0:Ve.toUpperCase())??"—"},{label:"Розмір файлу, mb",value:P.total_size?`${P.total_size}`:"—"},{label:"Кількість каналів",value:typeof fe=="number"?`${fe}${A?` (${A})`:""}`:`${fe}${A?` (${A})`:""}`,tooltip:X},{label:"Глибина кольору",value:P.color_depth?`${P.color_depth} біт/канал`:"—"},{label:"Стиснення",value:P.compression||"—"}]}function Ae(P){return!P||P.length!==4?[]:[{label:"Північ",value:Qe(P[3],"N")},{label:"Схід",value:Qe(P[2],"E")},{label:"Південь",value:Qe(P[1],"S")},{label:"Захід",value:Qe(P[0],"W")}]}function Ye(P){const fe=[{label:"Роздільна здатність",value:P.resolution||"—"}];return P.width&&P.height&&fe.push({label:"Розмір пікселя",value:`${P.width} × ${P.height} px`}),fe}function Ge(P){var fe;return(fe=P.bands)!=null&&fe.length?P.bands.map((A,Z)=>{const X=n[Z%n.length];return{label:`Канал ${Z+1}${A?` (${A})`:""}`,cardClass:X.cardClass,titleClass:X.titleClass,metrics:[{label:"Назва",value:A||`Канал ${Z+1}`},{label:"Глибина",value:P.color_depth?`${P.color_depth} біт`:"—"},{label:"Статус",value:P.cache?"Кешовано":"Готово"}]}}):[]}function ot(P){var fe;return[{label:"Тип даних",value:P.color_depth?`Unsigned Integer ${P.color_depth}-bit`:"—"},{label:"Компресія",value:P.compression||"—"},{label:"Кольорова інтерпретація",value:((fe=P.bands)==null?void 0:fe.join(", "))||"—"},{label:"SRID",value:P.srid?`EPSG:${P.srid}`:"—"},{label:"Проекція (proj4)",value:P.proj4||"—"},{label:"URL тайла",value:P.url||"—"}]}function Qe(P,fe){if(P==null||Number.isNaN(P))return"—";const A=`${P.toFixed(5)}°`;return fe?`${A} ${fe}`:A}return(P,fe)=>(e.openBlock(),e.createElementBlock("div",XC,[e.createElementVNode("div",JC,[e.createElementVNode("div",QC,[e.createElementVNode("div",eN,[e.createElementVNode("div",tN,[e.createElementVNode("div",nN,[e.createElementVNode("div",oN,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:d},e.toDisplayString(i.value),1),fe[2]||(fe[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:"lucide lucide-chevron-right w-4 h-4 mx-1"},[e.createElementVNode("path",{d:"m9 18 6-6-6-6"})],-1)),e.createElementVNode("span",rN,e.toDisplayString(ee.value.name||"Растер"),1)]),e.createElementVNode("div",lN,[e.createElementVNode("div",aN,[e.createElementVNode("div",sN,[e.createElementVNode("h1",iN,e.toDisplayString(ee.value.name||"Растер"),1)]),z.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:z.value},e.toDisplayString(z.value),9,cN)):e.createCommentVNode("",!0)])])]),e.createElementVNode("div",dN,[e.createElementVNode("div",uN,[e.createElementVNode("div",{class:"w-full text-xs text-gray-600 truncate",title:ee.value.description},e.toDisplayString(ee.value.description),9,fN)]),e.createVNode(qr,{"entity-id":u.value||"","entity-info":{name:ee.value.name},table:"gis.rasters.table","entity-label":"Растер","save-method":"put","edit-button-text":"Редагувати",onSaved:de},null,8,["entity-id","entity-info"])])])])]),e.createElementVNode("div",mN,[e.createElementVNode("div",pN,[e.createVNode(eo,{ref_key:"mapViewRef",ref:l},{default:e.withCtx(()=>[O.value&&a.value?(e.openBlock(),e.createBlock(KC,{key:D.value,"tile-url":N.value,extent:F.value,"layer-id":H.value,"show-raster-extent":m.value,onToggleExtent:fe[0]||(fe[0]=A=>m.value=A)},null,8,["tile-url","extent","layer-id","show-raster-extent"])):e.createCommentVNode("",!0),e.createVNode(Fo,{extent:m.value?F.value:null,"layer-id":he.value},null,8,["extent","layer-id"]),e.createVNode(Fo,{extent:k.value,"layer-id":Y.value,"line-color":"#0ea5e9","line-width":3},null,8,["extent","layer-id"]),e.createElementVNode("div",gN,[e.createVNode(rn)]),y.value?(e.openBlock(),e.createElementBlock("div",yN," Потягніть на карті, щоб намалювати нові Bounds. Esc скасовує редагування. ")):e.createCommentVNode("",!0),e.createElementVNode("div",hN,[e.createVNode(Ht),q.value?(e.openBlock(),e.createBlock(Ht,{key:0,targetCenter:q.value,targetLabel:"Центр даних",targetAriaLabel:"Перейти до центру даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0)])]),_:1},512)])]),e.createVNode(jr,{open:T.value,onToggle:fe[1]||(fe[1]=A=>T.value=!T.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",T.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",bN,[e.createElementVNode("div",xN,[e.createElementVNode("div",kN,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(oe,A=>e.createElementVNode("button",{key:A.key,type:"button",role:"tab","aria-selected":we.value===A.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",we.value===A.key?"bg-white shadow-sm text-gray-700":""]),onClick:Z=>we.value=A.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(A.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",_N,e.toDisplayString(A.label),1)],10,wN)),64))])]),e.createElementVNode("div",EN,[p.value?(e.openBlock(),e.createElementBlock("div",CN," Завантаження метаданих растру… ")):g.value?(e.openBlock(),e.createElementBlock("div",NN," Не вдалося отримати дані: "+e.toDisplayString(g.value),1)):e.createCommentVNode("",!0),we.value==="files"?(e.openBlock(),e.createBlock(RC,{key:2,files:K.value},null,8,["files"])):we.value==="metadata"?(e.openBlock(),e.createBlock(Ur,{key:3,data:c.value,"entity-id":u.value,"entity-type":"raster",onSaved:pe,onEditCssBounds:$},null,8,["data","entity-id"])):me.value?(e.openBlock(),e.createBlock(FC,{key:4,details:me.value},null,8,["details"])):e.createCommentVNode("",!0)])])],2)]))}})},Symbol.toStringTag,{value:"Module"})),SN={},vN={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 LN(t,n){return e.openBlock(),e.createElementBlock("svg",vN,[...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 TN=Me(SN,[["render",LN]]),AN={class:"flex flex-col h-full"},MN={class:"flex justify-end mb-3 gap-2"},FN=e.defineComponent({__name:"cartocss-css-tab",props:{modelValue:{}},emits:["update:modelValue","save"],setup(t,{emit:n}){const o=t,r=n,l=e.computed({get:()=>o.modelValue,set:s=>r("update:modelValue",s)});return(s,i)=>(e.openBlock(),e.createElementBlock("div",AN,[e.createElementVNode("div",MN,[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:i[0]||(i[0]=d=>s.$emit("save"))},[...i[2]||(i[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(Un,{modelValue:l.value,"onUpdate:modelValue":i[1]||(i[1]=d=>l.value=d),language:"cartocss",class:"flex-1 rounded-lg overflow-hidden"},null,8,["modelValue"])]))}}),DN={class:"flex flex-col flex-1 min-h-0"},PN={class:"flex justify-between mb-3 gap-2"},zN={class:"text-left"},RN={class:"font-medium text-gray-900"},IN={class:"text-xs text-gray-500"},jN={class:"flex justify-center gap-2"},ON=["checked","onChange"],UN={class:"text-sm font-medium text-gray-900"},qN=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"}],r=e.defineAsyncComponent(()=>import("@opengis/core").then(y=>y.VsModal)),l=e.defineAsyncComponent(()=>import("@opengis/form")),s=e.useModel(t,"modelValue"),i=n,d=e.ref(!1),u=e.ref({table:"",query:"",srid:"",key:"",columns:"",gcol:"",minzoom:"",maxzoom:"",proj4text:"",active:!0}),c={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 p(){u.value={table:"",query:"",srid:"",key:"",columns:"",gcol:"",minzoom:"",maxzoom:"",proj4text:"",active:!0},d.value=!0}function a(){d.value=!1}function g(){var h,f;const y=(h=u.value.table)==null?void 0:h.trim(),k=(f=u.value.key)==null?void 0:f.trim();if(!y||!k){Ee.notify({type:"warning",title:"Перевірка",message:"Вкажіть таблицю та підпис"});return}s.value=[...Array.isArray(s.value)?s.value:[],{...u.value,table:y,key:k}],d.value=!1}function m(y,k){var f;const h=((f=k==null?void 0:k.target)==null?void 0:f.checked)??!1;y.active=h,s.value=Array.isArray(s.value)?[...s.value]:[]}return(y,k)=>(e.openBlock(),e.createElementBlock("div",DN,[e.createElementVNode("div",PN,[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:p}," Додати таблицю "),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:k[0]||(k[0]=h=>i("save"))}," Зберегти ")]),e.createVNode(Pt,{modelValue:s.value,"onUpdate:modelValue":k[1]||(k[1]=h=>s.value=h),"columns-scheme":o,"form-scheme":c,"add-button":!1,"main-col-width":"260px"},{datasetCell:e.withCtx(({row:h})=>[e.createElementVNode("div",zN,[e.createElementVNode("div",RN,e.toDisplayString(h.table),1),e.createElementVNode("div",IN,e.toDisplayString(h.key),1)])]),activeCell:e.withCtx(({row:h})=>[e.createElementVNode("label",jN,[e.createElementVNode("input",{type:"checkbox",class:"h-4 w-4 text-sky-500 border-gray-300 rounded focus:ring-sky-300",checked:h.active,onChange:f=>m(h,f)},null,40,ON)])]),zoomCell:e.withCtx(({row:h})=>[e.createElementVNode("div",UN,e.toDisplayString(h.zoom),1)]),_:1},8,["modelValue"]),e.createVNode(e.unref(r),{teleport:"#modal",visible:d.value,"onUpdate:visible":k[3]||(k[3]=h=>d.value=h),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:a}," Скасувати "),e.createElementVNode("button",{type:"button",class:"px-4 py-2 rounded bg-blue-600 text-white",onClick:g}," Додати ")])]),default:e.withCtx(()=>[e.createVNode(e.unref(l),{values:u.value,"onUpdate:values":k[2]||(k[2]=h=>u.value=h),schema:c},null,8,["values"])]),_:1},8,["visible"])]))}}),HN={class:"flex flex-col flex-1 min-h-0 gap-4"},WN={class:"h-[calc(100vh-230px)] rounded-md border border-gray-200 bg-white"},YN=e.defineComponent({__name:"cartocss-card-tab",props:{card:{},table:{}},emits:["save"],setup(t,{emit:n}){const o=t,r=n,l=e.ref(o.table),s=e.ref(o.card),i=e.defineAsyncComponent(()=>import("@opengis/form").then(u=>u.VsInputText));function d(){r("save",{card_html:s.value,card_table:l.value})}return(u,c)=>(e.openBlock(),e.createElementBlock("div",HN,[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:d},[...c[2]||(c[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(i),{modelValue:l.value,"onUpdate:modelValue":c[0]||(c[0]=p=>l.value=p)},null,8,["modelValue"])]),e.createElementVNode("div",WN,[e.createVNode(Un,{modelValue:s.value,"onUpdate:modelValue":c[1]||(c[1]=p=>s.value=p),language:"html",theme:"vs-light",class:"h-full w-full rounded-md"},null,8,["modelValue"])])]))}}),GN=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=Je(),{activateTemporaryLayer:r,deactivateTemporaryLayer:l,setTemporaryLayerOpacity:s}=Cn(o.map),i=e.computed(()=>{var a;const p=`${(a=n==null?void 0:n.tileUrl)==null?void 0:a.trim()}`;return p?typeof window>"u"||typeof location>"u"||/^https?:\/\//i.test(p)?p:p.startsWith("//")?`${window.location.protocol}${p}`:p.startsWith("/")?`${location.origin}${p}`:`${location.origin}/${p}`:""});let d="",u="";function c(){const p=n.active&&!!i.value;d&&(!p||d!==n.layerId)&&(l(d,u||void 0),d="",u=""),p&&(r({id:n.layerId,title:n.title||n.layerId,url:i.value,opacity:n.opacity},{},n.owner),d=n.layerId,u=n.owner||"")}return e.watch(()=>[n.layerId,i.value,n.active,n.owner],c,{immediate:!0}),e.watch(()=>n.opacity,p=>{!d||!n.active||s(d,p,u||void 0)},{immediate:!0}),e.onUnmounted(()=>{d&&(l(d,u||void 0),d="",u="")}),(p,a)=>e.createCommentVNode("",!0)}}),ZN=e.defineComponent({__name:"CartocssMapClickListener",props:{cartocssId:{},infoEnabled:{type:[Boolean,null]},active:{type:[Boolean,null]}},setup(t){const n=t,o=e.computed(()=>n.cartocssId??null),r=e.computed(()=>!!n.infoEnabled&&n.active!==!1),{map:l,ready:s}=Je(),i=m=>{!m||typeof window>"u"||window.dispatchEvent(new CustomEvent(rr,{detail:m}))},d=async m=>{const y=await fetch(`/api/map-format?${m.toString()}`);if(!y.ok)throw new Error(`API returned ${y.status}`);return y.json()};let u=null,c=null;const p=m=>{if(!m)return null;if(typeof m=="string")try{return JSON.parse(m)}catch{return null}return m},a=async(m,y)=>{var f;const k=o.value?`external:${o.value},${String(m)}`:null,h=new URLSearchParams({layer:o.value??"",id:String(m)});try{const b=await d(h),x=typeof b.html=="string"?b.html:null,C=p(((f=b==null?void 0:b.data)==null?void 0:f.geom)??(b==null?void 0:b.geom)??null);(x||C)&&i({html:x,geometry:C??y,infoToken:k})}catch(b){console.warn("CartoCSS map-format (id) error",b)}},g=async m=>{var f,b,x,C;if(!o.value||n.active===!1)return;if(!r.value){Ee.notify({type:"error",title:"CartoCSS",message:"Картка не налаштована"});return}const y=(f=m==null?void 0:m.lngLat)==null?void 0:f.lng,k=(b=m==null?void 0:m.lngLat)==null?void 0:b.lat;if(typeof y!="number"||typeof k!="number")return;const h=new URLSearchParams({layer:o.value,lat:k.toFixed(6),lng:y.toFixed(6)});try{const V=await d(h),E=p(((x=V==null?void 0:V.data)==null?void 0:x.geom)??(V==null?void 0:V.geom)??null),w=((C=V==null?void 0:V.data)==null?void 0:C.id)??(V==null?void 0:V.id);if(w!=null){await a(w,E);return}Nl({html:V==null?void 0:V.html})&&i({html:V==null?void 0:V.html,geometry:E,infoToken:null})}catch(V){console.warn("CartoCSS map-format error",V)}};return s().then(()=>{c=l.value,c&&(c.on("click",g),u=()=>c==null?void 0:c.off("click",g))}),e.onBeforeUnmount(()=>{u==null||u(),u=null,c=null}),()=>{}}}),KN=["title","aria-label","disabled"],XN={key:0,class:"absolute right-full mr-3 px-1.5 py-0.5 bg-gray-700 text-white text-[0.75rem] font-medium rounded-md opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100 pointer-events-none transition-opacity duration-200 whitespace-nowrap","aria-hidden":"true"},Jt=e.defineComponent({__name:"MapIconButton",props:{title:{},ariaLabel:{default:""},tooltip:{default:""},active:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},emits:["click"],setup(t){const n=t,o=e.computed(()=>["group relative flex items-center justify-center w-9 h-9 rounded-xl shadow-lg transition-transform transition-shadow duration-200 hover:scale-105 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400/60 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:scale-100",n.active?"bg-blue-50 text-blue-700 ring-1 ring-blue-300":"bg-white text-gray-700 hover:bg-gray-50"].join(" "));return(r,l)=>(e.openBlock(),e.createElementBlock("button",{type:"button",class:e.normalizeClass(o.value),title:t.title,"aria-label":t.ariaLabel||t.title,disabled:t.disabled,onClick:l[0]||(l[0]=e.withModifiers(s=>r.$emit("click",s),["stop"]))},[t.tooltip?(e.openBlock(),e.createElementBlock("span",XN,e.toDisplayString(t.tooltip),1)):e.createCommentVNode("",!0),e.renderSlot(r.$slots,"default")],10,KN))}}),JN=e.defineComponent({__name:"MapZoomInButton",setup(t){const{map:n,ready:o}=Je(),r=e.ref(!1);e.onMounted(async()=>{await(o==null?void 0:o()),r.value=!!n.value});function l(){const s=n.value;s!=null&&s.zoomIn&&s.zoomIn()}return(s,i)=>(e.openBlock(),e.createBlock(Jt,{title:"Збільшити",tooltip:"Плюс зум",disabled:!r.value,onClick:l},{default:e.withCtx(()=>[e.createVNode(e.unref(ge.ZoomIn),{class:"w-4 h-4"})]),_:1},8,["disabled"]))}}),QN=e.defineComponent({__name:"MapZoomOutButton",setup(t){const{map:n,ready:o}=Je(),r=e.ref(!1);e.onMounted(async()=>{await(o==null?void 0:o()),r.value=!!n.value});function l(){const s=n.value;s!=null&&s.zoomOut&&s.zoomOut()}return(s,i)=>(e.openBlock(),e.createBlock(Jt,{title:"Зменшити",tooltip:"Мінус зум",disabled:!r.value,onClick:l},{default:e.withCtx(()=>[e.createVNode(e.unref(ge.ZoomOut),{class:"w-4 h-4"})]),_:1},8,["disabled"]))}}),eV=e.defineComponent({__name:"MapCompassButton",setup(t){const{map:n,ready:o}=Je(),r=e.ref(!1),l=e.ref(0),s=e.ref(0),i=e.computed(()=>({transform:`scale(${(1+s.value/70).toFixed(5)}) rotateZ(0deg) rotateX(${s.value}deg) rotateZ(${l.value}deg)`}));function d(){var p,a;const c=n.value;c&&(l.value=Number(((p=c.getBearing)==null?void 0:p.call(c))??0),s.value=Number(((a=c.getPitch)==null?void 0:a.call(c))??0))}e.onMounted(async()=>{var p,a,g;await(o==null?void 0:o());const c=n.value;r.value=!!c,d(),(p=c==null?void 0:c.on)==null||p.call(c,"rotate",d),(a=c==null?void 0:c.on)==null||a.call(c,"pitch",d),(g=c==null?void 0:c.on)==null||g.call(c,"load",d)}),e.onBeforeUnmount(()=>{var p,a,g;const c=n.value;(p=c==null?void 0:c.off)==null||p.call(c,"rotate",d),(a=c==null?void 0:c.off)==null||a.call(c,"pitch",d),(g=c==null?void 0:c.off)==null||g.call(c,"load",d)});function u(){const c=n.value;c!=null&&c.easeTo&&c.easeTo({bearing:0,pitch:0})}return(c,p)=>(e.openBlock(),e.createBlock(Jt,{title:"Повернути орієнтацію",tooltip:"Компас",disabled:!r.value,onClick:u},{default:e.withCtx(()=>[e.createVNode(e.unref(ge.Compass),{class:"w-4 h-4","aria-hidden":"true",style:e.normalizeStyle(i.value)},null,8,["style"])]),_:1},8,["disabled"]))}}),tV=100,nV=e.defineComponent({__name:"MapFullscreenButton",props:{target:{}},setup(t){const n=t,{map:o,ready:r}=Je(),l=e.ref(!1),s=e.ref(!1);function i(){var a,g;if(n.target)return n.target;const p=(g=(a=o.value)==null?void 0:a.getContainer)==null?void 0:g.call(a);return p?p.closest(".map-view-root")??p:null}function d(){const p=i();s.value=!!(p&&document.fullscreenElement===p)}function u(){window.setTimeout(()=>{var p,a;(a=(p=o.value)==null?void 0:p.resize)==null||a.call(p)},tV)}async function c(){const p=i();if(p)try{document.fullscreenElement===p?await document.exitFullscreen():document.fullscreenElement?(await document.exitFullscreen(),await p.requestFullscreen()):await p.requestFullscreen()}catch(a){console.error("Fullscreen error:",a)}finally{d(),u()}}return e.onMounted(async()=>{await(r==null?void 0:r()),l.value=!!o.value,d(),document.addEventListener("fullscreenchange",d),document.addEventListener("fullscreenchange",u)}),e.onBeforeUnmount(()=>{document.removeEventListener("fullscreenchange",d),document.removeEventListener("fullscreenchange",u)}),(p,a)=>(e.openBlock(),e.createBlock(Jt,{title:s.value?"Вийти з повного екрана":"Повний екран",tooltip:s.value?"Вийти з повного екрана":"Повний екран",active:s.value,disabled:!l.value,onClick:c},{default:e.withCtx(()=>[s.value?(e.openBlock(),e.createBlock(e.unref(ge.Minimize2),{key:0,class:"w-4 h-4"})):(e.openBlock(),e.createBlock(e.unref(ge.Maximize2),{key:1,class:"w-4 h-4"}))]),_:1},8,["title","tooltip","active","disabled"]))}}),oV=e.defineComponent({__name:"MapCopyLinkButton",props:{url:{default:""}},setup(t){const n=t;async function o(){const r=n.url||(typeof window<"u"?window.location.href:"");if(!r){Ee.notify({type:"warning",title:"Посилання",message:"Немає URL для копіювання"});return}try{await navigator.clipboard.writeText(r),Ee.notify({type:"success",title:"Посилання",message:"Посилання скопійовано"})}catch(l){console.error("Copy link error:",l),Ee.notify({type:"error",title:"Посилання",message:"Не вдалося скопіювати посилання"})}}return(r,l)=>(e.openBlock(),e.createBlock(Jt,{title:"Копіювати посилання",tooltip:"Копіювати посилання",onClick:o},{default:e.withCtx(()=>[e.createVNode(e.unref(ge.Link2),{class:"w-4 h-4"})]),_:1}))}}),rV={key:0,class:"absolute right-full top-0 mr-2 z-[450] flex",role:"group","aria-label":"Вибір рівня зуму"},lV={class:"flex flex-col items-center rounded-lg border border-gray-200 bg-white/95 py-2.5 pl-1 pr-2 shadow-lg backdrop-blur-sm"},aV=["title","onClick"],sV={key:0,class:"absolute right-5 text-[9px] tabular-nums text-gray-400"},iV=Me(e.defineComponent({__name:"MapZoomSlider",props:{visible:{type:Boolean},modelValue:{},min:{default:5},max:{default:20}},emits:["update:modelValue"],setup(t,{emit:n}){const o=t,r=n,l=e.ref(),s=e.ref(o.modelValue),i=e.ref(!1);e.watch(()=>o.modelValue,h=>{i.value||(s.value=h)});const d=e.computed(()=>{const h=[];for(let f=o.min;f<=o.max;f+=1)h.push(f);return h}),u=e.computed(()=>{const h=new Set;for(let f=o.min;f<=o.max;f+=5)h.add(f);return h.add(o.max),h}),c=h=>u.value.has(h),p=h=>{const f=o.max-o.min;return f<=0?0:(o.max-h)/f*100},a=h=>{r("update:modelValue",h)},g=h=>{if(!l.value)return;const f=l.value.getBoundingClientRect(),b=(h-f.top)/f.height;s.value=Math.max(o.min,Math.min(o.max,Math.round(o.max-b*(o.max-o.min))))},m=h=>{g(h.clientY)},y=()=>{window.removeEventListener("mousemove",m),window.removeEventListener("mouseup",y),i.value=!1,s.value!==o.modelValue&&r("update:modelValue",s.value)},k=h=>{i.value=!0,g(h.clientY),window.addEventListener("mousemove",m),window.addEventListener("mouseup",y)};return(h,f)=>(e.openBlock(),e.createBlock(e.Transition,{name:"zoom-panel"},{default:e.withCtx(()=>[t.visible?(e.openBlock(),e.createElementBlock("div",rV,[e.createElementVNode("div",lV,[f[1]||(f[1]=e.createElementVNode("span",{class:"mb-1 text-[9px] font-semibold uppercase tracking-wider text-gray-400"}," Zoom ",-1)),e.createElementVNode("div",{ref_key:"sliderRef",ref:l,class:"relative h-44 w-8 cursor-pointer select-none",onMousedown:e.withModifiers(k,["prevent"])},[f[0]||(f[0]=e.createElementVNode("div",{class:"absolute right-0 top-0 bottom-0 w-px bg-gray-200"},null,-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,b=>(e.openBlock(),e.createElementBlock("button",{key:b,type:"button",class:"absolute right-0 -translate-y-1/2 flex items-center justify-end group",style:e.normalizeStyle({top:`${p(b)}%`}),title:`Zoom ${b}`,onClick:e.withModifiers(x=>a(b),["stop"])},[e.createElementVNode("span",{class:e.normalizeClass(["block rounded-full",c(b)?"h-px w-2.5 bg-gray-300 group-hover:bg-gray-400":"h-px w-1.5 bg-gray-200 group-hover:bg-gray-300"])},null,2),c(b)?(e.openBlock(),e.createElementBlock("span",sV,e.toDisplayString(b),1)):e.createCommentVNode("",!0)],12,aV))),128)),e.createElementVNode("div",{class:"absolute right-0 -translate-y-1/2 flex items-center",style:e.normalizeStyle({top:`${p(s.value)}%`})},[e.createElementVNode("div",{class:e.normalizeClass(["h-[4px] w-4 rounded-full bg-blue-600/80 shadow-sm transition-all",i.value?"bg-blue-300 transform duration-200":""])},null,2)],4)],544)])])):e.createCommentVNode("",!0)]),_:1}))}}),[["__scopeId","data-v-ca77aba8"]]),cV={class:"text-[0.7rem] font-bold tabular-nums leading-none text-gray-600"},Hr=5,Wr=20,dV=13,uV=.01,fV=200,mV=e.defineComponent({__name:"MapZoomLevelButton",setup(t){const{map:n,ready:o}=Je(),r=e.ref(!1),l=e.ref(!1),s=e.ref(dV),i=e.ref(!1),d=e.ref(Hr),u=e.ref(Wr),c=e.computed(()=>String(s.value));function p(f){return Math.round(Math.min(u.value,Math.max(d.value,f)))}function a(){var C,V;const f=n.value;if(!f)return;const b=(C=f.getMinZoom)==null?void 0:C.call(f),x=(V=f.getMaxZoom)==null?void 0:V.call(f);Number.isFinite(b)&&(d.value=Math.max(Hr,Math.floor(Number(b)))),Number.isFinite(x)&&(u.value=Math.min(Wr,Math.ceil(Number(x)))),d.value>u.value&&(d.value=Hr,u.value=Wr)}function g(){var C;const f=n.value;if(!f||i.value)return;const b=(C=f.getZoom)==null?void 0:C.call(f);if(b==null)return;const x=p(b);s.value!==x&&(s.value=x)}function m(f){var E,w;const b=n.value;if(!(b!=null&&b.easeTo))return;const x=(E=b.getCenter)==null?void 0:E.call(b);if(!x)return;const C=p(f),V=(w=b.getZoom)==null?void 0:w.call(b);V!=null&&Math.abs(V-C)<uV||(i.value=!0,b.easeTo({center:[x.lng,x.lat],zoom:C,duration:fV,essential:!0}))}function y(){i.value=!1,g()}function k(){l.value=!l.value,l.value&&(a(),g())}function h(f){s.value=f,m(f)}return e.onMounted(async()=>{var b;await(o==null?void 0:o());const f=n.value;r.value=!!f,a(),g(),(b=f==null?void 0:f.on)==null||b.call(f,"zoomend",y)}),e.onBeforeUnmount(()=>{var f,b;(b=(f=n.value)==null?void 0:f.off)==null||b.call(f,"zoomend",y)}),(f,b)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createVNode(Jt,{title:l.value?"Закрити вибір зуму":"Вибрати рівень зуму",tooltip:"Рівень зуму",active:l.value,disabled:!r.value,"aria-label":"Рівень зуму",onClick:k},{default:e.withCtx(()=>[e.createElementVNode("div",cV,e.toDisplayString(c.value),1)]),_:1},8,["title","active","disabled"]),e.createVNode(iV,{visible:l.value,"model-value":s.value,min:d.value,max:u.value,"onUpdate:modelValue":h},null,8,["visible","model-value","min","max"])],64))}}),pV=e.defineComponent({__name:"MapRulerButton",props:{active:{type:Boolean}},emits:["click"],setup(t){return(n,o)=>(e.openBlock(),e.createBlock(Jt,{title:t.active?"Вимкнути лінійку":"Увімкнути лінійку",tooltip:"Вимірювання",active:t.active,"aria-label":"Вимірювання",onClick:o[0]||(o[0]=r=>n.$emit("click",r))},{default:e.withCtx(()=>[e.createVNode(e.unref(ge.Ruler),{class:"w-4 h-4"})]),_:1},8,["title","active"]))}}),gV={class:"absolute right-3 top-3 z-[450] flex flex-col gap-1 pointer-events-auto"},yV=e.defineComponent({name:"MapToolbarRight",__name:"MapToolbarRight",setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",gV,[e.renderSlot(n.$slots,"default")]))}}),hV=e.defineComponent({__name:"RulerMapClickBridge",props:{active:{type:Boolean}},emits:["map-click"],setup(t,{emit:n}){const o=t,r=n,{map:l,ready:s}=Je();let i=null;function d(c){if(!o.active)return;const p=c==null?void 0:c.lngLat;typeof(p==null?void 0:p.lat)!="number"||typeof(p==null?void 0:p.lng)!="number"||r("map-click",{lat:p.lat,lng:p.lng})}async function u(){if(i==null||i(),i=null,!o.active)return;await(s==null?void 0:s());const c=l.value;c!=null&&c.on&&(c.on("click",d),i=()=>{var p;return(p=c.off)==null?void 0:p.call(c,"click",d)})}return e.watch(()=>o.active,()=>{u()},{immediate:!0}),e.onBeforeUnmount(()=>{i==null||i(),i=null}),(c,p)=>null}}),bV={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},xV={class:"flex-1 relative overflow-hidden"},kV={class:"absolute top-0 left-0 w-full z-20"},wV={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},_V={class:"flex items-start justify-between gap-4"},EV={class:"flex-1 min-w-0"},CV={class:"flex items-center text-sm text-gray-500 mb-3"},NV={class:"text-gray-900 font-medium truncate max-w-xs"},VV={class:"flex items-center justify-between gap-4"},$V={class:"flex-1 min-w-0"},BV={class:"flex items-center gap-3 mb-1"},SV={class:"text-base font-semibold text-gray-900 truncate"},vV={key:0,class:"px-2 py-0.5 bg-green-50 border border-green-200 rounded flex-shrink-0"},LV={class:"text-xs font-medium text-green-700"},TV=["title"],AV={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]"},MV={class:"relative w-full h-full"},FV={class:"absolute top-3 left-3 z-20"},DV={class:"px-3 py-2 flex items-center gap-2 border-b border-gray-100"},PV={class:"text-xs text-gray-700 w-9 text-right"},zV={class:"px-3 py-2 flex items-center gap-2"},RV={for:"show-layer",class:"text-xs text-gray-700 flex items-center gap-1 cursor-pointer"},IV={key:2,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"},jV={class:"flex-1 flex flex-col h-full"},OV={key:0,class:"px-3 pt-3 pb-2 border-b border-gray-100"},UV=["aria-selected","onClick"],qV={class:"leading-none"},HV={class:"flex flex-col flex-1 overflow-y-hidden p-3"},WV={key:0,class:"flex-1 flex items-center justify-center text-sm text-gray-500"},YV="cartocss-demo-001",GV="OpenGIS",Ka=2,Po=5,ZV=5,KV=Object.freeze(Object.defineProperty({__proto__:null,default:e.defineComponent({__name:"cartocss",setup(t){const n=qe.useRouter(),o=qe.useRoute(),r=e.ref(null),l=e.computed(()=>{var re;const R=(re=o.matched[o.matched.length-1])==null?void 0:re.path;return(typeof R=="string"&&R?R:o.path).replace(/\/:id\??$/,"")||"/"}),s=e.computed(()=>{var se;const R=(se=o.meta)==null?void 0:se.title;return typeof R=="string"&&R.trim()?R:"CartoCSS"});function i(){n.push(l.value)}const d=[{key:"css",label:"CSS",icon:Ua},{key:"data",label:"Дані",icon:TN},{key:"metadata",label:"Метадані",icon:Or},{key:"card",label:"Картка",icon:qa}],u=d.map(R=>R.key),c=e.ref(u.includes(o.query.tab)?o.query.tab:"css"),p=e.ref(!0),a=e.ref(null),g=e.computed(()=>{var R;return(R=a.value)!=null&&R.source_path?d.filter(se=>se.key==="card"||se.key==="metadata"):d}),m=e.computed(()=>o.params.id||YV),y=e.ref({id:m.value,name:"",description:""});let k=null;const h=e.ref(!1);function f(R){if(Array.isArray(R))return f(R[0]);if(typeof R!="string"&&typeof R!="number")return null;const se=typeof R=="number"?R:Number(R.trim());return Number.isFinite(se)?se:null}function b(R,se){return R.toFixed(se)}function x(R,se,re){const Ce=.5*10**-re;return Math.abs(R-se)>Ce}function C(){var R;return(R=r.value)==null?void 0:R.ctx}function V(){var et,rt,st,kt;const R=(rt=(et=C())==null?void 0:et.map)==null?void 0:rt.value;if(!R)return;const se=f(o.query.z),re=f(o.query.x),Ce=f(o.query.y);if(se==null||re==null||Ce==null)return;const $e=(st=R.getCenter)==null?void 0:st.call(R),Ie=(kt=R.getZoom)==null?void 0:kt.call(R);(!$e||x($e.lng,re,Po)||x($e.lat,Ce,Po)||x(Ie??0,se,Ka))&&(h.value=!0,R.jumpTo({center:[re,Ce],zoom:se}),h.value=!1)}function E(){var $e,Ie,tt,et;if(h.value)return;const R=(Ie=($e=C())==null?void 0:$e.map)==null?void 0:Ie.value;if(!R)return;const se=(tt=R.getCenter)==null?void 0:tt.call(R),re=(et=R.getZoom)==null?void 0:et.call(R);if(!se||re==null)return;const Ce={...o.query,z:b(re,Ka),x:b(se.lng,Po),y:b(se.lat,Po)};o.query.z===Ce.z&&o.query.x===Ce.x&&o.query.y===Ce.y||n.replace({query:Ce})}function w(R){typeof document>"u"||(document.title=R?`${R} — CartoCSS`:GV)}const B=e.ref(""),L=e.ref([]),W=e.ref(!1),J=e.ref(!1),I=e.ref(""),te=e.ref(0),ue=e.ref(!0),be=e.ref(1),ae=e.ref(!1),ne=e.ref(null),v=e.ref(!1),M=e.ref(null),$=e.ref([]),N=e.ref(!1),F=e.ref("general");function H(R){$.value=R}function he(R){var se;(se=M.value)==null||se.addPoint(R)}function Y(){var R;$.value=[],N.value=!1,(R=M.value)==null||R.clearPoints(),v.value=!1}function D(){if(v.value){Y();return}v.value=!0}const O=e.computed(()=>`cartocss-layer-${m.value}`),q=e.computed(()=>`${Math.round(be.value*100)}%`),ee=e.computed(()=>`cartocss-extent-${m.value}`),z=e.computed(()=>`cartocss-extent-draft-${m.value}`),oe=e.computed(()=>{var $e;const R=($e=I.value)==null?void 0:$e.trim();if(!R)return"";const se=R.includes("?")?"&":"?",re=`${R}${se}nottl=1`,Ce=te.value;return Ce?`${R}${se}ts=${Ce}&nocache=1`:re}),ye=e.ref(""),we=e.ref(""),T=e.computed(()=>{var Ie;const R=(Ie=a.value)==null?void 0:Ie.bounds;if(!Array.isArray(R)||R.length<4)return null;const[se,re,Ce,$e]=R;return[se,re,Ce,$e].some(tt=>typeof tt!="number"||Number.isNaN(tt))?null:[(se+Ce)/2,(re+$e)/2]}),K=e.computed(()=>{var Ie;const R=(Ie=a.value)==null?void 0:Ie.bounds;if(!Array.isArray(R)||R.length<4)return null;const[se,re,Ce,$e]=R;return[se,re,Ce,$e].some(tt=>typeof tt!="number"||Number.isNaN(tt))?null:[se,re,Ce,$e]}),me=e.computed(()=>{const R=a.value;return R?[R.description,R.group_id?`Група: ${R.group_id}`:null,R.source_path?`Шлях: ${R.source_path}`:null,R.is_public===!0?"Публічний":"Не публічний",R.enabled===!0?"Активний":"Неактивний"].filter(Boolean).join(", "):""}),ie=e.computed(()=>{var se;const R=(se=a.value)==null?void 0:se.group_id;return R?String(R).toUpperCase():""});let de=null,pe=!1,Le=null;function j(R){return Number(R.toFixed(ZV))}function Q(R,se){const[re,Ce]=R,[$e,Ie]=se;return[j(Math.min(re,$e)),j(Math.min(Ce,Ie)),j(Math.max(re,$e)),j(Math.max(Ce,Ie))]}function _e(R){const[se,re,Ce,$e]=R;return{type:"Polygon",coordinates:[[[se,re],[Ce,re],[Ce,$e],[se,$e],[se,re]]]}}function ve(R){var Ce,$e,Ie;const se=($e=(Ce=C())==null?void 0:Ce.map)==null?void 0:$e.value,re=(Ie=se==null?void 0:se.getCanvas)==null?void 0:Ie.call(se);re!=null&&re.style&&(re.style.cursor=R)}async function ze(R,se){if(!(!m.value||!a.value)){J.value=!0;try{const re=_e(R),Ce=await fetch(`/api/gis-css/${m.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({geom:re})});if(!Ce.ok)throw new Error(`Failed to save cartocss bounds: ${Ce.status}`);Ee.notify({type:"success",title:"Bounds збережено",message:"Нові межі успішно збережено."}),await X(m.value,{bustCache:!0})}catch(re){console.error("Failed to save CartoCSS bounds",re),a.value&&(a.value={...a.value,bounds:se?[...se]:null}),Ee.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти Bounds"})}finally{J.value=!1}}}function Ae(R){var re,Ce,$e;const se=(Ce=(re=C())==null?void 0:re.map)==null?void 0:Ce.value;if(($e=se==null?void 0:se.dragPan)!=null&&$e.enable&&se.dragPan.enable(),(R==null?void 0:R.length)===4&&a.value){const Ie=Array.isArray(a.value.bounds)?[...a.value.bounds]:null;a.value={...a.value,bounds:[...R]},ze(R,Ie)}de=null,pe=!1,ne.value=null,ae.value=!1,ve("")}function Ye(){Ae(null)}function Ge(){var Ie,tt;const R=(tt=(Ie=C())==null?void 0:Ie.map)==null?void 0:tt.value;if(!R)return;const se=et=>{var st,kt,At;if(!ae.value||((st=et==null?void 0:et.originalEvent)==null?void 0:st.button)!=null&&et.originalEvent.button!==0)return;const rt=et==null?void 0:et.lngLat;rt&&(de=[rt.lng,rt.lat],pe=!0,ne.value=[rt.lng,rt.lat,rt.lng,rt.lat],(At=(kt=R.dragPan)==null?void 0:kt.disable)==null||At.call(kt))},re=et=>{if(!ae.value||!pe||!de)return;const rt=et==null?void 0:et.lngLat;rt&&(ne.value=Q(de,[rt.lng,rt.lat]))},Ce=et=>{if(!ae.value||!pe||!de)return;const rt=et==null?void 0:et.lngLat;if(!rt){Ye();return}const st=Q(de,[rt.lng,rt.lat]),[kt,At,Mt,Qt]=st;if(!(Math.abs(Mt-kt)>0&&Math.abs(Qt-At)>0)){Ee.notify({type:"warning",title:"Bounds не змінено",message:"Потрібно протягнути прямокутник з ненульовою площею."}),Ye();return}Ae(st)},$e=et=>{ae.value&&et.key==="Escape"&&(et.preventDefault(),Ye())};R.on("mousedown",se),R.on("mousemove",re),R.on("mouseup",Ce),window.addEventListener("keydown",$e),Le=()=>{R.off("mousedown",se),R.off("mousemove",re),R.off("mouseup",Ce),window.removeEventListener("keydown",$e)}}async function ot(){var re;const R=C();!(R!=null&&R.ready)||(await R.ready(),!((re=R.map)==null?void 0:re.value))||(Le||Ge(),ae.value=!0,pe=!1,de=null,ne.value=null,ve("crosshair"),Ee.notify({type:"info",title:"Редагування Bounds",message:"Протягніть прямокутник на карті, щоб задати нові межі."}))}e.watch(m,R=>{R&&X(R)},{immediate:!0}),e.watch(()=>{var R;return(R=y.value)==null?void 0:R.name},R=>w(R),{immediate:!0});async function Qe(){var Ce;const R=C();if(!(R!=null&&R.ready))return;await R.ready(),V();const se=(Ce=R.map)==null?void 0:Ce.value;if(!se)return;const re=()=>E();se.on("moveend",re),se.on("zoomend",re),k=()=>{se.off("moveend",re),se.off("zoomend",re)}}e.watch(()=>[o.query.z,o.query.x,o.query.y],()=>{V()}),e.onMounted(()=>{Qe()}),e.onBeforeUnmount(()=>{k==null||k(),k=null,Le==null||Le(),Le=null,ve("")}),e.watch(()=>o.query.tab,R=>{R&&g.value.some(se=>se.key===R)&&c.value!==R&&(c.value=R)}),e.watch(g,R=>{R.length&&!R.some(se=>se.key===c.value)&&(c.value=R[0].key)},{immediate:!0}),e.watch(c,R=>{o.query.tab!==R&&g.value.some(se=>se.key===R)&&n.replace({query:{...o.query,tab:R}})}),e.watch(()=>a.value,R=>{const se=R==null?void 0:R.card_html;ye.value=se,we.value=R==null?void 0:R.card_table},{immediate:!0});function P(){m.value&&X(m.value,{bustCache:!0})}async function fe(R,se){if(m.value){J.value=!0;try{const re=await fetch(`/api/gis-css/${m.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(R)});if(!re.ok)throw new Error(`Failed to save cartocss: ${re.status}`);Ee.notify({type:"success",title:"Збережено",message:se}),await X(m.value,{bustCache:!0})}catch(re){console.error("Failed to save CartoCSS",re),Ee.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти CartoCSS"})}finally{J.value=!1}}}function A(R){if(!R)return null;if(typeof R=="string")try{return JSON.parse(R)}catch(se){return console.warn("Failed to parse CartoCSS config",se),null}return typeof R=="object"?R:null}function Z(R){const se=Array.isArray(R)?R:R==null?void 0:R.datasets;return Array.isArray(se)?se.map((re,Ce)=>({table:(re==null?void 0:re.table)||(re==null?void 0:re.id)||`dataset_${Ce+1}`,query:(re==null?void 0:re.query)||"",srid:(re==null?void 0:re.srid)||"",gcol:(re==null?void 0:re.gcol)||"",key:(re==null?void 0:re.key)||(re==null?void 0:re.label)||"Без підпису",active:typeof(re==null?void 0:re.active)=="boolean"?re.active:!0,minzoom:typeof(re==null?void 0:re.zoom)>"u"?"":String(re.zoom),maxzoom:typeof(re==null?void 0:re.maxzoom)>"u"?"":String(re.maxzoom),columns:(re==null?void 0:re.columns)||"",proj4text:(re==null?void 0:re.proj4text)||""})):[]}async function X(R,se){W.value=!0;try{const re=await fetch(`/api/gis-css/${R}`);if(!re.ok)throw new Error(`Failed to load cartocss: ${re.status}`);const Ce=await re.json(),$e=(Ce==null?void 0:Ce.message)||Ce||{};a.value=$e,y.value={id:$e.cartocss_key||R,name:$e.name||y.value.name,description:$e.description||y.value.description},B.value=typeof $e.style=="string"?$e.style:"";const Ie=A($e.config??[]);L.value=Z(Ie);const tt=typeof $e.url=="string"?$e.url:"";I.value=tt,ue.value=!!(tt&&$e.enabled!==!1),te.value=se!=null&&se.bustCache?Date.now():0}catch(re){console.error("Failed to fetch CartoCSS",re),ue.value=!1,I.value="",te.value=0,a.value=null}finally{W.value=!1}}async function xe(){await fe({style:B.value||"",config:L.value},"CartoCSS оновлено")}async function Ve(R){const se=await fetch(`/api/gis-css/${m.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(R)});if(!se.ok)throw new Error(`Failed to save cartocss: ${se.status}`);Ee.notify({type:"success",title:"Збережено",message:"Картка CartoCSS оновлена"})}return(R,se)=>(e.openBlock(),e.createElementBlock("div",bV,[e.createElementVNode("div",xV,[e.createElementVNode("div",kV,[e.createElementVNode("div",wV,[e.createElementVNode("div",_V,[e.createElementVNode("div",EV,[e.createElementVNode("div",CV,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:i},e.toDisplayString(s.value),1),se[7]||(se[7]=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",NV,e.toDisplayString(y.value.name||"CartoCSS"),1)]),e.createElementVNode("div",VV,[e.createElementVNode("div",$V,[e.createElementVNode("div",BV,[e.createElementVNode("h1",SV,e.toDisplayString(y.value.name||"CartoCSS"),1),ie.value?(e.openBlock(),e.createElementBlock("div",vV,[e.createElementVNode("span",LV,e.toDisplayString(ie.value),1)])):e.createCommentVNode("",!0)]),me.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:me.value},e.toDisplayString(me.value),9,TV)):e.createCommentVNode("",!0)])])]),e.createVNode(qr,{class:"flex-shrink-0","entity-id":m.value,"entity-info":y.value,"form-endpoint":re=>`/api/form/gis.cartocss.table/${re}`,"save-endpoint":re=>`/api/gis-css/${re}`,"entity-label":"CartoCSS","save-method":"post",onSaved:P},null,8,["entity-id","entity-info","form-endpoint","save-endpoint"])])])]),e.createElementVNode("div",AV,[e.createElementVNode("div",MV,[e.createVNode(eo,{ref_key:"mapViewRef",ref:r},{default:e.withCtx(()=>{var re,Ce;return[e.createElementVNode("div",FV,[e.createVNode(rn,null,{default:e.withCtx(()=>[e.createElementVNode("div",DV,[se[8]||(se[8]=e.createElementVNode("span",{class:"text-xs text-gray-600 whitespace-nowrap"},"Прозорість:",-1)),e.withDirectives(e.createElementVNode("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":se[0]||(se[0]=$e=>be.value=$e),class:"flex-1 h-1 accent-blue-600",style:{"accent-color":"rgb(30, 78, 216)"}},null,512),[[e.vModelText,be.value,void 0,{number:!0}]]),e.createElementVNode("span",PV,e.toDisplayString(q.value),1)]),e.createElementVNode("div",zV,[e.withDirectives(e.createElementVNode("input",{id:"show-layer",type:"checkbox",class:"rounded","onUpdate:modelValue":se[1]||(se[1]=$e=>ue.value=$e),style:{"accent-color":"rgb(30, 78, 216)"}},null,512),[[e.vModelCheckbox,ue.value]]),e.createElementVNode("label",RV,[ue.value?(e.openBlock(),e.createBlock(e.unref(ge.Eye),{key:0,class:"w-3.5 h-3.5"})):(e.openBlock(),e.createBlock(e.unref(ge.EyeOff),{key:1,class:"w-3.5 h-3.5"})),se[9]||(se[9]=e.createTextVNode(" Показати шар ",-1))])])]),_:1})]),e.createVNode(yV,null,{default:e.withCtx(()=>[e.createVNode(JN),e.createVNode(QN),e.createVNode(eV),e.createVNode(Ht),T.value?(e.openBlock(),e.createBlock(Ht,{key:0,targetCenter:T.value,targetLabel:"Центр даних",targetAriaLabel:"Перейти до центру даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0),e.createVNode(nV),e.createVNode(oV),e.createVNode(pV,{active:v.value,onClick:D},null,8,["active"]),e.createVNode(mV)]),_:1}),v.value?(e.openBlock(),e.createBlock(Pl,{key:0,ref_key:"rulerPanelRef",ref:M,onClose:Y,onTabChange:se[2]||(se[2]=$e=>F.value=$e),onPointsChange:H,onShapeClosedChange:se[3]||(se[3]=$e=>N.value=$e)},null,512)):e.createCommentVNode("",!0),v.value&&$.value.length>0?(e.openBlock(),e.createBlock(zl,{key:1,points:$.value,"is-shape-closed":N.value,"label-mode":F.value},null,8,["points","is-shape-closed","label-mode"])):e.createCommentVNode("",!0),e.createVNode(hV,{active:v.value,onMapClick:he},null,8,["active"]),ae.value?(e.openBlock(),e.createElementBlock("div",IV," Потягніть на карті, щоб намалювати нові Bounds. Esc скасовує редагування. ")):e.createCommentVNode("",!0),oe.value?(e.openBlock(),e.createBlock(GN,{key:3,"layer-id":O.value,"tile-url":oe.value,active:ue.value,opacity:be.value,title:y.value.name,owner:m.value},null,8,["layer-id","tile-url","active","opacity","title","owner"])):e.createCommentVNode("",!0),e.createVNode(Fo,{extent:K.value,"layer-id":ee.value},null,8,["extent","layer-id"]),e.createVNode(Fo,{extent:ne.value,"layer-id":z.value,"line-color":"#0ea5e9","line-width":3},null,8,["extent","layer-id"]),e.createVNode(ZN,{"cartocss-id":m.value,bounds:((re=a.value)==null?void 0:re.bounds)??null,active:ue.value&&!ae.value&&!v.value,"info-enabled":(Ce=a.value)==null?void 0:Ce.info},null,8,["cartocss-id","bounds","active","info-enabled"]),e.createVNode(lr,{"map-id":m.value},null,8,["map-id"])]}),_:1},512)])]),a.value?(e.openBlock(),e.createBlock(jr,{key:0,open:p.value,onToggle:se[4]||(se[4]=re=>p.value=!p.value)},null,8,["open"])):e.createCommentVNode("",!0)]),a.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",p.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",jV,[g.value.length>1?(e.openBlock(),e.createElementBlock("div",OV,[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,re=>(e.openBlock(),e.createElementBlock("button",{key:re.key,type:"button",role:"tab","aria-selected":c.value===re.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",c.value===re.key?"bg-white shadow-sm text-gray-700":""]),onClick:Ce=>c.value=re.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(re.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",qV,e.toDisplayString(re.label),1)],10,UV))),128))],4)])):e.createCommentVNode("",!0),e.createElementVNode("div",HV,[W.value?(e.openBlock(),e.createElementBlock("div",WV," Завантаження стилю… ")):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[c.value==="css"?(e.openBlock(),e.createBlock(FN,{key:0,modelValue:B.value,"onUpdate:modelValue":se[5]||(se[5]=re=>B.value=re),class:"flex-1 min-h-0",onSave:xe},null,8,["modelValue"])):c.value==="data"?(e.openBlock(),e.createBlock(qN,{key:1,modelValue:L.value,"onUpdate:modelValue":se[6]||(se[6]=re=>L.value=re),class:"flex-1 min-h-0 flex flex-col",onSave:xe},null,8,["modelValue"])):c.value==="card"?(e.openBlock(),e.createBlock(YN,{key:2,card:ye.value,table:we.value,class:"flex-1 min-h-0",onSave:Ve},null,8,["card","table"])):c.value==="metadata"?(e.openBlock(),e.createBlock(Ur,{key:3,data:a.value,"entity-id":m.value,"entity-type":"css",onSaved:P,onEditCssBounds:ot},null,8,["data","entity-id"])):e.createCommentVNode("",!0)],64))])])],2)):e.createCommentVNode("",!0)]))}})},Symbol.toStringTag,{value:"Module"})),XV={class:"rounded-lg border border-gray-200 bg-[rgba(252,252,252,0.8)] p-6"},JV=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")),r=t,l=n,s=e.computed({get:()=>r.modelValue,set:d=>l("update:modelValue",d)}),i=e.computed({get:()=>r.form,set:d=>l("update:form",d)});return(d,u)=>(e.openBlock(),e.createElementBlock("section",XV,[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:s.value,"onUpdate:values":u[0]||(u[0]=c=>s.value=c),form:i.value,"onUpdate:form":u[1]||(u[1]=c=>i.value=c)},null,8,["schema","values","form"]))]))}}),QV={class:"rounded-lg border border-gray-200 bg-[rgba(252,252,252,0.8)] p-6"},e$=e.defineComponent({__name:"LayerSettings",props:{layerIDs:{},options:{}},emits:["update:layerIDs"],setup(t,{emit:n}){const o=t,r=n,l=e.computed({get:()=>o.layerIDs,set:s=>r("update:layerIDs",s)});return(s,i)=>(e.openBlock(),e.createElementBlock("section",QV,[i[1]||(i[1]=e.createElementVNode("h2",{class:"text-lg font-semibold text-gray-800 mb-4"},"Шари",-1)),i[2]||(i[2]=e.createElementVNode("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Доступні шари",-1)),e.createVNode(e.unref(al.VsInputArraySelect),{data:"layer_list",api:"/api/suggest/layer_list",modelValue:l.value,"onUpdate:modelValue":i[0]||(i[0]=d=>l.value=d),placeholder:"Шари"},null,8,["modelValue"])]))}}),t$={class:"w-full"},n$=e.defineComponent({__name:"MapPreview",props:{id:{}},setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",t$,[e.createVNode(wo,{class:"w-full h-[calc(100vh-200px)]",height:"h-[calc(100vh-200px)]",id:t.id},null,8,["id"])]))}}),o$={class:"bg-white rounded-lg shadow-xl w-full max-w-4xl flex flex-col h-[80vh] m-4"},r$={class:"flex items-center justify-between px-6 py-4 border-b border-gray-200"},l$={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"},a$={class:"flex-1 overflow-hidden relative bg-[#fffffe]"},s$={class:"px-6 py-4 border-t border-gray-200 flex justify-end gap-3"},i$=["disabled"],c$=e.defineComponent({__name:"ConfigEditor",props:{modelValue:{}},emits:["update:modelValue","save"],setup(t,{emit:n}){const o=t,r=n,l=e.ref(""),s=e.ref(null);e.watch(()=>o.modelValue,u=>{if(u){try{l.value=JSON.stringify(u,null,2)}catch{l.value="{}"}s.value=null}},{immediate:!0}),e.watch(l,u=>{if(!u.trim()){s.value=null;return}try{JSON.parse(u),s.value=null}catch(c){s.value=c.message}}),e.watch(()=>o.modelValue,()=>{setTimeout(()=>{const{monaco:u}=window;if(u&&u.editor){const c=u.editor.getEditors();c.length>0&&c[c.length-1].updateOptions({wordWrap:"on"})}},300)},{immediate:!0});function i(){r("update:modelValue",null),l.value="",s.value=null}function d(){if(!s.value)try{const u=JSON.parse(l.value);r("save",u),i()}catch(u){console.error("Failed to parse JSON",u)}}return(u,c)=>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(i,["self"])},[e.createElementVNode("div",o$,[e.createElementVNode("div",r$,[c[1]||(c[1]=e.createElementVNode("h3",{class:"text-lg font-semibold text-gray-800"}," Редагування конфігурації (JSON) ",-1)),e.createElementVNode("button",{onClick:i,class:"text-gray-500 hover:text-gray-700 transition-colors"},[e.createVNode(e.unref(ge.X),{size:20})])]),s.value?(e.openBlock(),e.createElementBlock("div",l$," Помилка JSON: "+e.toDisplayString(s.value),1)):e.createCommentVNode("",!0),e.createElementVNode("div",a$,[e.createVNode(Un,{modelValue:l.value,"onUpdate:modelValue":c[0]||(c[0]=p=>l.value=p),language:"json",theme:"vs-light",class:"w-full h-full"},null,8,["modelValue"])]),e.createElementVNode("div",s$,[e.createElementVNode("button",{onClick:i,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:d,disabled:!!s.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,i$)])])])):e.createCommentVNode("",!0)}}),d$={key:0,class:"text-center py-8 text-gray-500 border rounded-lg bg-[rgba(252,252,252,0.8)]"},u$={key:1,class:"rounded-lg border border-gray-200 overflow-hidden"},f$={class:"w-full text-sm"},m$={class:"divide-y divide-gray-200"},p$={class:"px-4 py-3"},g$=["onUpdate:modelValue","onChange"],y$=["value"],h$={class:"px-4 py-3"},b$=["onUpdate:modelValue","onChange"],x$=["value"],k$={class:"px-4 py-3 text-center"},w$=["checked","onChange"],_$={class:"px-4 py-3"},E$={key:0,class:"flex items-center gap-2"},C$=["onClick"],N$=["onClick"],V$={key:1},$$=["onClick"],B$={class:"px-4 py-3 text-right"},S$=["onClick"],v$=e.defineComponent({__name:"WidgetSettings",props:{modelValue:{}},emits:["update:modelValue"],setup(t,{emit:n}){const o=t,r=n,l=["catalog","legend","basemaps","info","layers","dataset","filters","search"],s=["top-left","top-right","bottom-left","bottom-right"],i=e.ref(null),d=e.ref(-1),u=e.computed(()=>o.modelValue||[]);function c(){const f=[...u.value,{type:"info",position:"top-left",visible:!0,config:{}}];r("update:modelValue",f)}function p(f){Ee.confirm({title:"Видалити віджет?",message:"Ви впевнені, що хочете видалити цей віджет?",type:"warning",onConfirm:()=>{const b=u.value.filter((x,C)=>C!==f);r("update:modelValue",b)}})}function a(f,b,x){const C=[...u.value];C[f]={...C[f],[b]:x},r("update:modelValue",C)}function g(f){return!!f&&Object.keys(f).length>0}function m(f,b){d.value=f,i.value=b||{}}function y(f){m(f,{})}function k(f){Ee.confirm({title:"Видалити конфігурацію?",message:"Ви впевнені, що хочете видалити конфігурацію цього віджета?",type:"warning",onConfirm:()=>{a(f,"config",void 0)}})}function h(f){d.value>-1&&a(d.value,"config",f),i.value=null,d.value=-1}return(f,b)=>{var x;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:c,class:"px-3 py-1.5 text-sm bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors"}," + Додати віджет ")]),(x=u.value)!=null&&x.length?(e.openBlock(),e.createElementBlock("div",u$,[e.createElementVNode("table",f$,[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",m$,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,(C,V)=>(e.openBlock(),e.createElementBlock("tr",{key:V,class:"hover:bg-gray-50"},[e.createElementVNode("td",p$,[e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":E=>C.type=E,onChange:E=>a(V,"type",C.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(l,E=>e.createElementVNode("option",{key:E,value:E},e.toDisplayString(E),9,y$)),64))],40,g$),[[e.vModelSelect,C.type]])]),e.createElementVNode("td",h$,[e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":E=>C.position=E,onChange:E=>a(V,"position",C.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(s,E=>e.createElementVNode("option",{key:E,value:E},e.toDisplayString(E),9,x$)),64))],40,b$),[[e.vModelSelect,C.position]])]),e.createElementVNode("td",k$,[e.createElementVNode("input",{type:"checkbox",checked:C.visible!==!1,onChange:E=>a(V,"visible",E.target.checked),class:"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500"},null,40,w$)]),e.createElementVNode("td",_$,[g(C.config)?(e.openBlock(),e.createElementBlock("div",E$,[e.createElementVNode("button",{onClick:E=>m(V,C.config),class:"p-1 text-blue-600 hover:text-blue-800 hover:bg-blue-50 rounded transition-colors",title:"Редагувати конфігурацію"},[e.createVNode(e.unref(ge.Pen),{size:16})],8,C$),e.createElementVNode("button",{onClick:E=>k(V),class:"p-1 text-red-500 hover:text-red-700 hover:bg-red-50 rounded transition-colors",title:"Видалити конфігурацію"},[e.createVNode(e.unref(ge.X),{size:16})],8,N$)])):(e.openBlock(),e.createElementBlock("div",V$,[e.createElementVNode("button",{onClick:E=>y(V),class:"p-1 text-green-600 hover:text-green-800 hover:bg-green-50 rounded transition-colors",title:"Додати конфігурацію"},[e.createVNode(e.unref(ge.Plus),{size:16})],8,$$)]))]),e.createElementVNode("td",B$,[e.createElementVNode("button",{onClick:E=>p(V),class:"p-1 text-gray-400 hover:text-red-500 transition-colors",title:"Видалити віджет"},[e.createVNode(e.unref(ge.Trash2),{size:16})],8,S$)])]))),128))])])])):(e.openBlock(),e.createElementBlock("div",d$," Немає віджетів. Додайте перший віджет. ")),e.createVNode(c$,{teleport:"#modal",modelValue:i.value,"onUpdate:modelValue":b[0]||(b[0]=C=>i.value=C),onSave:h},null,8,["modelValue"])])}}}),L$={class:"relative h-full flex flex-col flex-1 min-h-0 overflow-hidden mx-auto w-full"},T$={class:"mx-1"},A$={class:"text-gray-900 font-semibold"},M$=["disabled"],F$={key:0,class:"text-center py-12 mt-6 px-[24px]"},D$={key:1,class:"px-[24px] overflow-y-auto"},P$={class:"space-y-6"},z$={class:"space-y-6"},R$={class:"space-y-6"},I$=Object.freeze(Object.defineProperty({__proto__:null,default:Me(e.defineComponent({__name:"MapSettings",setup(t){const n=qe.useRouter(),o=qe.useRoute(),r=e.computed(()=>{var E;return((E=n.resolve("/gis.maps").meta)==null?void 0:E.title)??"Карти"}),l=e.ref(!0),s=e.ref(!1),i=e.ref({}),d=e.ref({}),u=[{name:"Загальна",id:"general"},{name:"Шари",id:"layers"},{name:"Віджети",id:"widgets"},{name:"Карта",id:"map"}],c=u.map(E=>E.id),p=E=>E?Array.isArray(E)?E[0]:E:null,a=(()=>{const E=p(o.query.tab);return E&&c.includes(E)?E:"general"})(),g=e.ref(a);e.watch(()=>o.query.tab,E=>{const w=p(E);w&&c.includes(w)&&g.value!==w&&(g.value=w)}),e.watch(g,E=>{o.query.tab!==E&&n.replace({query:{...o.query,tab:E}})});const m=e.ref({name:"",map_key:"",description:"",holder:"",image:"",keywords:[],center:null,zoom:11,widgets:[],layers:[]}),y=e.computed({get:()=>(m.value.layers||[]).map(E=>E.id||E),set:E=>{m.value.layers=E}});async function k(E){if(!E.length){d.value={};return}try{const w=new URLSearchParams({json:"1",val:Array.from(new Set(E)).join(",")}),B=await fetch(`/api/suggest/layer_list?${w.toString()}`);if(!B.ok)return;const L=await B.json(),W=(L==null?void 0:L.data)??L??[],J=Array.isArray(W)?W:[],I={...d.value};J.forEach(te=>{const ue=te.id!=null?String(te.id):"";ue&&(I[ue]=te.text??te.name??ue)}),d.value=I}catch(w){console.error("Failed to fetch layer labels:",w)}}const h=e.computed({get:()=>y.value.map(E=>d.value[E]??E),set:E=>{const w=Object.entries(d.value).reduce((L,[W,J])=>(L[J]=W,L),{}),B=E.map(L=>w[L]??null).filter(L=>L!=null);y.value=B}}),f=e.computed(()=>{const E=m.value.center;if(!Array.isArray(E)||E.length<2)return"Не задано";const[w,B]=E;return w===void 0||B===void 0||w===null||B===null||Number.isNaN(Number(w))||Number.isNaN(Number(B))?"Не задано":`Lng ${Number(w).toFixed(6)}, Lat ${Number(B).toFixed(6)}`}),b=e.computed(()=>{const E=m.value.zoom;if(E==null||E==="")return"Не задано";const w=Number(E);return Number.isNaN(w)?"Не задано":w.toFixed(2)}),x=[{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 C(){try{const w=await(await fetch(`/api/gis-map/${o.params.id}?original=1`)).json();m.value={...w,keywords:w.keywords||[],center:w.center??null,widgets:Array.isArray(w.widgets)?w.widgets:[],layers:(w.layers||[]).map(B=>B.id||B)},await k(m.value.layers??[])}catch(E){console.error("Failed to load map:",E),Ee.notify({type:"error",title:"Помилка",message:"Не вдалося завантажити карту"})}finally{l.value=!1}}async function V(){var w,B;const E=(B=(w=i.value)==null?void 0:w.validate)==null?void 0:B.call(w);if(E){Ee.notify({type:"warning",title:"Валідація",message:Object.entries(E).map(([L,W])=>`${L}: ${W}`).join(`
|
|
58
58
|
`)});return}s.value=!0;try{const L=JSON.parse(JSON.stringify(m.value));if(L.zoom=Number(L.zoom),Array.isArray(L.center)&&(L.center.every(I=>I==null||I===""||I===0)||L.center.length===0)&&(L.center=null),delete L.created_at,delete L.updated_at,delete L.created_by,delete L.updated_by,delete L.history,delete L.maps,!(await fetch(`/api/gis-map/${o.params.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(L)})).ok)throw new Error("Save failed");Ee.notify({type:"success",title:"Успіх",message:"Збережено!"})}catch(L){console.error("Save error:",L),Ee.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти"})}finally{s.value=!1}}return e.watch(()=>{var E;return((E=m.value)==null?void 0:E.layers)??[]},E=>k(Array.isArray(E)?E.map(w=>(w==null?void 0:w.id)??w):[]),{immediate:!1}),e.onMounted(async()=>{await C()}),(E,w)=>{const B=e.resolveComponent("router-link");return e.openBlock(),e.createElementBlock("div",L$,[e.createVNode(an,{variant:"form",title:m.value.name||"Налаштування карти"},{breadcrumbs:e.withCtx(()=>[e.createVNode(B,{to:"/gis.maps",class:"text-gray-500 hover:text-gray-700"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(r.value),1)]),_:1}),e.createElementVNode("span",T$,[e.createVNode(e.unref(ge.LucideChevronRight),{size:16,class:"shrink-0"})]),e.createElementVNode("span",A$,e.toDisplayString(m.value.name||"Налаштування карти"),1)]),description:e.withCtx(()=>[...w[6]||(w[6]=[e.createTextVNode("Редагування параметрів карти",-1)])]),actions:e.withCtx(()=>[e.createElementVNode("button",{onClick:w[0]||(w[0]=L=>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:V,disabled:s.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(s.value?"Збереження...":"Зберегти"),9,M$)]),_:1},8,["title"]),l.value?(e.openBlock(),e.createElementBlock("div",F$,[...w[7]||(w[7]=[e.createElementVNode("p",{class:"text-gray-500"},"Завантаження...",-1)])])):(e.openBlock(),e.createElementBlock("div",D$,[e.createVNode(Xl,{tabs:u,activeTab:g.value,"onUpdate:activeTab":w[1]||(w[1]=L=>g.value=L)},null,8,["activeTab"]),e.withDirectives(e.createElementVNode("div",P$,[e.createVNode(JV,{schema:x,loading:l.value,modelValue:m.value,"onUpdate:modelValue":w[2]||(w[2]=L=>m.value=L),form:i.value,"onUpdate:form":w[3]||(w[3]=L=>i.value=L)},null,8,["loading","modelValue","form"])],512),[[e.vShow,g.value==="general"]]),e.withDirectives(e.createElementVNode("div",z$,[e.createVNode(e$,{layerIDs:y.value,"onUpdate:layerIDs":w[4]||(w[4]=L=>y.value=L)},null,8,["layerIDs"])],512),[[e.vShow,g.value==="layers"]]),e.withDirectives(e.createVNode(v$,{modelValue:m.value.widgets,"onUpdate:modelValue":w[5]||(w[5]=L=>m.value.widgets=L)},null,8,["modelValue"]),[[e.vShow,g.value==="widgets"]]),e.withDirectives(e.createElementVNode("div",R$,[e.createVNode(n$,{"center-display":f.value,"zoom-display":b.value,"layer-names":h.value,id:e.unref(o).params.id},null,8,["center-display","zoom-display","layer-names","id"])],512),[[e.vShow,g.value==="map"]])]))])}}}),[["__scopeId","data-v-df90fbac"]])},Symbol.toStringTag,{value:"Module"}));Xe.CartoCSS=fs,Xe.Classifiers=ec,Xe.MapSettings=xs,Xe.MapWidget=wo,Xe.Permissions=Nc,Xe.Raster=cs,Xe.Register=os,Xe.Service=as,Xe.default=wo,Xe.install=K0,Xe.template1=Ol,Xe.template2=Ul,Xe.template3=ql,Xe.template4=Hl,Xe.template5=Wl,Object.defineProperties(Xe,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|