@opengis/gis 0.2.145 → 0.2.146

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.
Files changed (201) hide show
  1. package/README.md +181 -181
  2. package/dist/{CardIcon-KPdJQSAj.js → CardIcon-BCll_4SB.js} +1 -1
  3. package/dist/{EntityCreatePage-Da8XgBKU.js → EntityCreatePage-Ch8NU_Yw.js} +14 -14
  4. package/dist/{EntityEditPage-QktKEAxz.js → EntityEditPage-CRRcW7FL.js} +27 -27
  5. package/dist/{EntityTablePage-D0CxSITf.js → EntityTablePage-DXJPsOx8.js} +26 -26
  6. package/dist/{ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-B7Nkfd7c.js → ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BJ-zsrml.js} +1 -1
  7. package/dist/{HeaderActions.vue_vue_type_script_setup_true_lang-9kitzmJK.js → HeaderActions.vue_vue_type_script_setup_true_lang-EZGjVDor.js} +5 -5
  8. package/dist/{MapSettings-CBkp5Cfw.js → MapSettings-CG7u4F4i.js} +33 -33
  9. package/dist/{RastersTablePage-D1k_WisA.js → RastersTablePage-CN5hfj6F.js} +29 -29
  10. package/dist/cartocss-BNVXz6oJ.js +1065 -0
  11. package/dist/{import-utils-CVdAWcDL.js → import-utils-BwcMU3Gp.js} +33 -33
  12. package/dist/{index-DJKZSGVW.js → index-8aAArh78.js} +63 -63
  13. package/dist/index.css +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/index.umd.cjs +35 -35
  16. package/dist/raster-BN1gB-NS.js +804 -0
  17. package/dist/{register-Br5WdQas.js → register-DZ24Z6dC.js} +8 -8
  18. package/dist/{service-1sCTWkzU.js → service-DXLa4AiW.js} +392 -380
  19. package/dist/{vs-datatable-CviY_UkX.js → vs-datatable-DVC6-2mA.js} +28 -28
  20. package/module/cls.json +6 -6
  21. package/module/gis/card/gis.metadata.table/index.yml +22 -22
  22. package/module/gis/card/gis.metadata.table/main_info.hbs +20 -20
  23. package/module/gis/card/gis.metadata.table/metadata_info.hbs +27 -27
  24. package/module/gis/card/gis.metadata.table/other.hbs +25 -25
  25. package/module/gis/card/gis.rasters.table/index.yml +11 -11
  26. package/module/gis/card/gis.rasters.table/main_info.hbs +27 -27
  27. package/module/gis/card/gis.registers.table/cls.hbs +36 -36
  28. package/module/gis/card/gis.registers.table/columns.hbs +89 -89
  29. package/module/gis/card/gis.registers.table/filters.hbs +80 -80
  30. package/module/gis/card/gis.registers.table/index.yml +23 -23
  31. package/module/gis/card/gis.registers.table/main_info.hbs +35 -35
  32. package/module/gis/card/gis.registers.table/source.hbs +45 -45
  33. package/module/gis/card/gis.services.table/attributes.hbs +91 -91
  34. package/module/gis/card/gis.services.table/filters.hbs +83 -83
  35. package/module/gis/card/gis.services.table/index.yml +25 -25
  36. package/module/gis/card/gis.services.table/main_info.hbs +27 -27
  37. package/module/gis/card/gis.services.table/source.hbs +25 -25
  38. package/module/gis/cls/bool.yes_no.json +12 -12
  39. package/module/gis/cls/encoding.json +14 -14
  40. package/module/gis/cls/geom_type.json +14 -14
  41. package/module/gis/cls/gis.column_type.json +34 -34
  42. package/module/gis/cls/gis.column_view_type.json +26 -26
  43. package/module/gis/cls/gis.filter_type.json +22 -22
  44. package/module/gis/cls/language.json +10 -10
  45. package/module/gis/cls/meta.service_type.json +42 -42
  46. package/module/gis/cls/ogc.service.json +21 -21
  47. package/module/gis/cls/service_type.json +42 -42
  48. package/module/gis/cls/source_type.json +10 -10
  49. package/module/gis/cls/standarts.json +6 -6
  50. package/module/gis/cls/topic_category.json +106 -106
  51. package/module/gis/cls/update_frequency.json +29 -29
  52. package/module/gis/cls/view.json +21 -21
  53. package/module/gis/form/feedback.answer.form.json +10 -10
  54. package/module/gis/form/gis.cartocss.form.json +64 -64
  55. package/module/gis/form/gis.group_list.form.json +17 -17
  56. package/module/gis/form/gis.maps.form.json +61 -61
  57. package/module/gis/form/gis.metadata.form.json +240 -240
  58. package/module/gis/form/gis.metadata_new.form.json +195 -195
  59. package/module/gis/form/gis.ogc_service.form.json +51 -51
  60. package/module/gis/form/gis.rasters.form.json +76 -76
  61. package/module/gis/form/gis.registers.form.json +124 -124
  62. package/module/gis/form/gis.registers_column.form.json +84 -84
  63. package/module/gis/form/gis.registers_filter.form.json +65 -65
  64. package/module/gis/form/gis.services.form.json +111 -111
  65. package/module/gis/form/gis.services_attributes.form.json +75 -75
  66. package/module/gis/form/gis.services_filter.form.json +65 -65
  67. package/module/gis/menu.json +43 -43
  68. package/module/gis/select/admin.cls.name.sql +9 -9
  69. package/module/gis/select/layer_list.sql +7 -7
  70. package/module/gis/select/layer_list_text.sql +7 -7
  71. package/module/gis/select/pg.column_name.geometry.sql +12 -12
  72. package/module/gis/select/pg.columns.parent.sql +6 -6
  73. package/module/gis/select/pg.table_name.sql +17 -17
  74. package/module/gis/select/service_id.sql +1 -1
  75. package/module/gis/table/gis.cartocss.table.json +74 -74
  76. package/module/gis/table/gis.group_list.table.json +58 -58
  77. package/module/gis/table/gis.maps.table.json +110 -110
  78. package/module/gis/table/gis.metadata.table.json +70 -70
  79. package/module/gis/table/gis.metadata_new.table.json +137 -137
  80. package/module/gis/table/gis.ogc_service.table.json +100 -100
  81. package/module/gis/table/gis.rasters.table.json +101 -101
  82. package/module/gis/table/gis.registers.table.json +143 -143
  83. package/module/gis/table/gis.services.table.json +120 -120
  84. package/module/gis/table/site.gis.registers.table.json +88 -88
  85. package/module/gis/table/site.gis.services.table.json +106 -106
  86. package/module/gis/templates/ISO19136_2017_gml_template.xml +330 -330
  87. package/module/gis/tokens.yml +5 -5
  88. package/module/permissions/form/permissions.users.form.json +151 -151
  89. package/module/permissions/table/gis.permissions.table.json +97 -97
  90. package/module/test/cls/bp_build_type.json +37 -37
  91. package/module/test/cls/doc_status.json +31 -31
  92. package/module/test/cls/ts.temp_status.json +18 -18
  93. package/module/test/cls/ts.temp_structure.ts_class.json +49 -49
  94. package/module/test/cls/ts.temp_type.json +9 -9
  95. package/module/test/layer/bp.json +59 -59
  96. package/module/test/layer/bp1.yml +33 -33
  97. package/module/test/layer/individual.yml +53 -53
  98. package/module/test/layer/ts.linking_passport.yml +55 -55
  99. package/module/test/layer/ts.temp_structure.yml +50 -50
  100. package/module/test/map/addr.yml +21 -21
  101. package/module/test/map/bp_myo.json +43 -43
  102. package/module/test/map/bpf.json +43 -43
  103. package/module/test/map/main.json +37 -37
  104. package/module/test/map/mbd.json +92 -92
  105. package/module/test/map/ts.json +53 -53
  106. package/module/test/select/address_id.json +2 -2
  107. package/module/test/select/address_id.sql +7 -7
  108. package/module/test/select/core.user_uid.sql +1 -1
  109. package/module/test/table/data_address.street.table.json +69 -69
  110. package/module/test/table/data_bp_myo.bp.table.json +122 -122
  111. package/package.json +75 -75
  112. package/plugin.js +55 -55
  113. package/server/migrations/array_intersect.sql +13 -13
  114. package/server/migrations/cartocss.sql +27 -27
  115. package/server/migrations/group_list.sql +74 -74
  116. package/server/migrations/maps.sql +30 -30
  117. package/server/migrations/metadata.sql +415 -415
  118. package/server/migrations/ogc.sql +106 -106
  119. package/server/migrations/rasters.sql +265 -265
  120. package/server/migrations/services.sql +247 -247
  121. package/server/migrations/services_users_rel.sql +22 -22
  122. package/server/migrations/widgets.sql +20 -20
  123. package/server/plugins/crons.js +21 -21
  124. package/server/plugins/mapnik/funcs/checkRasterFile.js +109 -109
  125. package/server/plugins/mapnik/funcs/mapnik.js +151 -151
  126. package/server/plugins/mapnik/funcs/rootFolder.mjs +8 -8
  127. package/server/plugins/mapnik/map.proto +230 -230
  128. package/server/plugins/vite.js +74 -74
  129. package/server/routes/gis/cartocss/add.cartocss.js +42 -42
  130. package/server/routes/gis/cartocss/get.cartocss.js +59 -59
  131. package/server/routes/gis/checkXML.js +117 -117
  132. package/server/routes/gis/dashboard.js +29 -29
  133. package/server/routes/gis/index.mjs +87 -87
  134. package/server/routes/gis/metadata/editMetadata.js +34 -34
  135. package/server/routes/gis/metadata/metadataXML.js +13 -13
  136. package/server/routes/gis/ogc/map.info.point.js +124 -124
  137. package/server/routes/gis/registers/add.registry.js +35 -35
  138. package/server/routes/gis/registers/del.registry.js +14 -14
  139. package/server/routes/gis/registers/funcs/classifiers.js +100 -100
  140. package/server/routes/gis/registers/funcs/columns.js +3 -3
  141. package/server/routes/gis/registers/funcs/content.type.js +9 -9
  142. package/server/routes/gis/registers/funcs/get.info.js +89 -89
  143. package/server/routes/gis/registers/funcs/handleRegistryRequest.js +146 -146
  144. package/server/routes/gis/registers/gis.export.js +153 -153
  145. package/server/routes/gis/registers/gis.registry.js +64 -64
  146. package/server/routes/gis/registers/gis.registry.list.js +59 -59
  147. package/server/routes/gis/registers/insert.columns.js +107 -107
  148. package/server/routes/gis/registers/insert.filters.js +110 -110
  149. package/server/routes/gis/registers/map.registry.js +79 -79
  150. package/server/routes/gis/services/add.service.js +64 -64
  151. package/server/routes/gis/services/del.service.js +12 -12
  152. package/server/routes/gis/services/get.layer.geom.js +27 -27
  153. package/server/routes/gis/services/get.services.col.js +33 -33
  154. package/server/routes/gis/services/get.services.js +84 -84
  155. package/server/routes/gis/services/legend.auto.js +77 -77
  156. package/server/routes/map/controllers/clearTiles.js +34 -34
  157. package/server/routes/map/controllers/geojson.js +187 -187
  158. package/server/routes/map/controllers/jsonData.js +205 -205
  159. package/server/routes/map/controllers/layerList.js +102 -102
  160. package/server/routes/map/controllers/map.js +123 -123
  161. package/server/routes/map/controllers/mapCatalog.js +72 -72
  162. package/server/routes/map/controllers/mapCatalogAttribute.js +55 -55
  163. package/server/routes/map/controllers/mapFeatures.js +128 -128
  164. package/server/routes/map/controllers/mapFormat.js +234 -234
  165. package/server/routes/map/controllers/mapTiles.js +152 -152
  166. package/server/routes/map/controllers/maps.js +15 -15
  167. package/server/routes/map/controllers/marker_icon.js +43 -43
  168. package/server/routes/map/controllers/vtile.js +172 -172
  169. package/server/routes/map/index.mjs +169 -169
  170. package/server/routes/map/maps/add.map.js +43 -43
  171. package/server/routes/map/maps/del.map.js +18 -18
  172. package/server/routes/map/maps/get.map.js +118 -118
  173. package/server/routes/map/vtile1.js +179 -179
  174. package/server/routes/map/widgets/add.widget.js +38 -38
  175. package/server/routes/map/widgets/del.widget.js +22 -22
  176. package/server/routes/map/widgets/get.widget.js +40 -40
  177. package/server/routes/mapnik/controllers/clearTiles.js +106 -106
  178. package/server/routes/mapnik/controllers/createXml.js +67 -67
  179. package/server/routes/mapnik/controllers/createXmlMulti.js +76 -76
  180. package/server/routes/mapnik/controllers/fileSearch.js +38 -38
  181. package/server/routes/mapnik/controllers/fileStat.js +28 -28
  182. package/server/routes/mapnik/controllers/mapnikLogger.js +29 -29
  183. package/server/routes/mapnik/controllers/mapnikStat.js +19 -19
  184. package/server/routes/mapnik/controllers/pretile.js +144 -144
  185. package/server/routes/mapnik/controllers/rasterInfo.js +57 -57
  186. package/server/routes/mapnik/controllers/readDir.js +22 -22
  187. package/server/routes/mapnik/controllers/rtile.js +150 -150
  188. package/server/routes/mapnik/controllers/uploadRaster.js +157 -157
  189. package/server/routes/mapnik/functions/cartoBounds.js +32 -32
  190. package/server/routes/mapnik/functions/convertBoundToTile.js +27 -27
  191. package/server/routes/mapnik/functions/uploadXML.js +113 -113
  192. package/server/routes/mapnik/index.js +40 -40
  193. package/server/routes/permissions/controllers/catalog.permissions.edit.js +22 -22
  194. package/server/routes/permissions/controllers/catalog.permissions.js +7 -7
  195. package/server/routes/permissions/controllers/gis.catalog.js +80 -80
  196. package/server/routes/permissions/controllers/utils/get.permissions.js +59 -59
  197. package/server/routes/permissions/index.mjs +18 -18
  198. package/server/routes/root.mjs +3 -3
  199. package/utils.js +13 -13
  200. package/dist/cartocss-KfS-aCRn.js +0 -1053
  201. package/dist/raster-CKQiGAgN.js +0 -792
@@ -0,0 +1,804 @@
1
+ import { defineComponent as te, resolveDirective as We, openBlock as u, createElementBlock as m, createElementVNode as n, Fragment as W, renderList as X, toDisplayString as d, withDirectives as we, createTextVNode as Xe, normalizeClass as ae, ref as $, watch as S, computed as h, vModelText as Ke, onMounted as Ye, onBeforeUnmount as Ze, createCommentVNode as q, createVNode as B, withCtx as He, createBlock as F, resolveDynamicComponent as Je } from "vue";
2
+ import { useRouter as et, useRoute as tt } from "vue-router";
3
+ import { TooltipDirective as st, notify as M } from "@opengis/core";
4
+ import { _ as nt, u as ot, f as lt, F as rt, M as it, i as at, j as be } from "./index-8aAArh78.js";
5
+ import { _ as ut, a as ct, b as dt, c as ft } from "./HeaderActions.vue_vue_type_script_setup_true_lang-EZGjVDor.js";
6
+ import { _ as he } from "./ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BJ-zsrml.js";
7
+ const mt = { class: "flex-1 overflow-y-auto p-4 sm:p-6" }, pt = { class: "space-y-3" }, gt = { class: "bg-white p-3 rounded-xl border border-gray-200 shadow-sm" }, vt = { class: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2" }, yt = { class: "text-xs text-gray-500 mb-1" }, xt = {
8
+ key: 0,
9
+ class: "text-base text-md font-semibold text-gray-900"
10
+ }, bt = {
11
+ key: 1,
12
+ class: "text-base text-md font-semibold text-gray-900"
13
+ }, ht = { class: "bg-white p-3 rounded-xl border border-gray-200 shadow-sm" }, _t = { class: "space-y-2" }, wt = { class: "bg-gradient-to-br from-blue-50 to-blue-100/30 p-4 rounded-lg border border-blue-200" }, $t = { class: "text-sm font-semibold text-gray-900" }, kt = { class: "text-xs text-gray-600 mt-1" }, Ct = { class: "grid grid-cols-2 gap-3" }, Et = { class: "text-xs text-gray-500 mb-1" }, Lt = { class: "text-sm font-semibold text-gray-900" }, Rt = { class: "bg-gray-50 p-4 rounded-lg" }, Mt = { class: "grid grid-cols-2 gap-4" }, St = { class: "text-xs text-gray-500 mb-1" }, It = { class: "text-sm font-semibold text-gray-900" }, jt = /* @__PURE__ */ te({
14
+ directives: {
15
+ tooltip: st
16
+ },
17
+ __name: "raster-info-tab",
18
+ props: {
19
+ details: {}
20
+ },
21
+ setup(_) {
22
+ return (v, y) => {
23
+ const r = We("tooltip");
24
+ return u(), m("div", mt, [
25
+ n("div", pt, [
26
+ n("div", gt, [
27
+ y[0] || (y[0] = n("div", { class: "mb-4" }, [
28
+ n("h4", { class: "text-sm font-semibold text-gray-900 uppercase tracking-wide" }, "Основні параметри")
29
+ ], -1)),
30
+ n("div", vt, [
31
+ (u(!0), m(W, null, X(_.details.baseParams, (f) => (u(), m("div", {
32
+ key: f.label,
33
+ class: "bg-gray-50 p-2 rounded-lg"
34
+ }, [
35
+ n("p", yt, d(f.label), 1),
36
+ f.tooltip ? we((u(), m("p", xt, [
37
+ Xe(d(f.value), 1)
38
+ ])), [
39
+ [r, f.tooltip]
40
+ ]) : (u(), m("p", bt, d(f.value), 1))
41
+ ]))), 128))
42
+ ])
43
+ ]),
44
+ n("div", ht, [
45
+ y[3] || (y[3] = n("div", { class: "mb-2" }, [
46
+ n("h4", { class: "text-sm font-semibold text-gray-900 uppercase tracking-wide" }, "Просторова інформація")
47
+ ], -1)),
48
+ n("div", _t, [
49
+ n("div", null, [
50
+ y[1] || (y[1] = n("p", { class: "text-xs text-gray-500 mb-2" }, "Система координат", -1)),
51
+ n("div", wt, [
52
+ n("p", $t, d(_.details.spatial.crs.code), 1),
53
+ n("p", kt, d(_.details.spatial.crs.description), 1)
54
+ ])
55
+ ]),
56
+ n("div", null, [
57
+ y[2] || (y[2] = n("p", { class: "text-xs text-gray-500 mb-2" }, "Межі покриття", -1)),
58
+ n("div", Ct, [
59
+ (u(!0), m(W, null, X(_.details.spatial.bounds, (f) => (u(), m("div", {
60
+ key: f.label,
61
+ class: "bg-gray-50 p-2 rounded-lg border border-gray-200"
62
+ }, [
63
+ n("p", Et, d(f.label), 1),
64
+ n("p", Lt, d(f.value), 1)
65
+ ]))), 128))
66
+ ])
67
+ ]),
68
+ n("div", Rt, [
69
+ n("div", Mt, [
70
+ (u(!0), m(W, null, X(_.details.spatial.resolution, (f) => (u(), m("div", {
71
+ key: f.label
72
+ }, [
73
+ n("p", St, d(f.label), 1),
74
+ n("p", It, d(f.value), 1)
75
+ ]))), 128))
76
+ ])
77
+ ])
78
+ ])
79
+ ])
80
+ ])
81
+ ]);
82
+ };
83
+ }
84
+ }), zt = { class: "flex-1 overflow-y-auto space-y-3 pr-1" }, Bt = { class: "font-medium text-sm text-gray-800" }, Pt = { class: "text-xs text-gray-500" }, Nt = /* @__PURE__ */ te({
85
+ __name: "raster-files-tab",
86
+ props: {
87
+ files: {}
88
+ },
89
+ setup(_) {
90
+ return (v, y) => (u(), m("div", zt, [
91
+ (u(!0), m(W, null, X(_.files, (r) => (u(), m("div", {
92
+ key: r.name,
93
+ class: "border border-gray-100 rounded-xl p-4 shadow-sm bg-white flex items-start justify-between"
94
+ }, [
95
+ n("div", null, [
96
+ n("p", Bt, d(r.name), 1),
97
+ n("p", Pt, d(r.resolution) + " • " + d(r.size) + "MB", 1)
98
+ ]),
99
+ n("span", {
100
+ class: ae(["text-[11px] font-semibold px-2 py-0.5 rounded-full", r.statusClass])
101
+ }, d(r.status), 3)
102
+ ]))), 128))
103
+ ]));
104
+ }
105
+ }), Dt = {}, Ut = {
106
+ xmlns: "http://www.w3.org/2000/svg",
107
+ width: "24",
108
+ height: "24",
109
+ viewBox: "0 0 24 24",
110
+ fill: "none",
111
+ stroke: "currentColor",
112
+ "stroke-width": "2",
113
+ "stroke-linecap": "round",
114
+ "stroke-linejoin": "round"
115
+ };
116
+ function Tt(_, v) {
117
+ return u(), m("svg", Ut, [...v[0] || (v[0] = [
118
+ n("circle", {
119
+ cx: "12",
120
+ cy: "12",
121
+ r: "9"
122
+ }, null, -1),
123
+ n("line", {
124
+ x1: "12",
125
+ y1: "8",
126
+ x2: "12",
127
+ y2: "8"
128
+ }, null, -1),
129
+ n("path", { d: "M11 12h1v4h1" }, null, -1)
130
+ ])]);
131
+ }
132
+ const qt = /* @__PURE__ */ nt(Dt, [["render", Tt]]), Ft = { class: "absolute top-[5.5rem] left-4 z-30 flex flex-col items-start gap-2" }, Vt = { class: "rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur" }, At = { class: "flex items-center gap-2" }, Ot = { class: "rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur" }, Gt = { class: "inline-flex items-center gap-2 text-[11px] text-slate-600" }, Qt = ["checked"], Wt = /* @__PURE__ */ te({
133
+ __name: "RasterLayer",
134
+ props: {
135
+ tileUrl: {},
136
+ extent: {},
137
+ layerId: {},
138
+ beforeId: {},
139
+ showRasterExtent: { type: Boolean }
140
+ },
141
+ emits: ["toggle-extent"],
142
+ setup(_) {
143
+ const v = _, y = v.layerId || "raster-preview-layer", r = `${y}-source`, f = v.extent && v.extent.length === 4 ? [...v.extent] : void 0, P = ot(y, {
144
+ sourceId: r,
145
+ source: {
146
+ type: "raster",
147
+ tiles: v.tileUrl ? [v.tileUrl + "?nottl=1"] : [],
148
+ tileSize: 256,
149
+ ...f ? { bounds: f } : {}
150
+ },
151
+ layer: {
152
+ id: `${y}-raster`,
153
+ type: "raster",
154
+ paint: { "raster-opacity": 1 }
155
+ },
156
+ beforeId: v.beforeId ?? null
157
+ }), { fitBounds: V } = lt(), N = $(1);
158
+ S(
159
+ () => v.tileUrl,
160
+ (p) => {
161
+ if (!p) {
162
+ P.setVisible(!1);
163
+ return;
164
+ }
165
+ P.setVisible(!0), P.setTiles([p]);
166
+ },
167
+ { immediate: !0 }
168
+ ), S(
169
+ () => N.value,
170
+ (p) => {
171
+ P.setOpacity(p);
172
+ },
173
+ { immediate: !0 }
174
+ );
175
+ let x = null, c = !1;
176
+ S(
177
+ () => v.extent,
178
+ (p) => {
179
+ if (!p || p.length !== 4) return;
180
+ const b = p.join(",");
181
+ if (b !== x) {
182
+ if (x = b, !c) {
183
+ c = !0;
184
+ return;
185
+ }
186
+ V == null || V([[p[0], p[1]], [p[2], p[3]]], {
187
+ padding: 40,
188
+ maxZoom: 17
189
+ });
190
+ }
191
+ },
192
+ { immediate: !0 }
193
+ );
194
+ const A = h(() => `${Math.round(N.value * 100)}%`);
195
+ return (p, b) => (u(), m("div", Ft, [
196
+ n("div", Vt, [
197
+ n("div", At, [
198
+ b[2] || (b[2] = n("span", null, "Прозорість:", -1)),
199
+ we(n("input", {
200
+ type: "range",
201
+ min: "0",
202
+ max: "1",
203
+ step: "0.01",
204
+ "onUpdate:modelValue": b[0] || (b[0] = (I) => N.value = I),
205
+ class: "h-1 w-28 cursor-pointer appearance-none rounded-full bg-slate-300 focus:outline-none",
206
+ style: { "accent-color": "#3b82f6" }
207
+ }, null, 512), [
208
+ [
209
+ Ke,
210
+ N.value,
211
+ void 0,
212
+ { number: !0 }
213
+ ]
214
+ ]),
215
+ n("span", null, d(A.value), 1)
216
+ ])
217
+ ]),
218
+ n("div", Ot, [
219
+ n("label", Gt, [
220
+ n("input", {
221
+ type: "checkbox",
222
+ class: "h-3.5 w-3.5 rounded border-slate-300 text-blue-600 focus:ring-blue-200",
223
+ checked: _.showRasterExtent,
224
+ onChange: b[1] || (b[1] = (I) => p.$emit("toggle-extent", I.target.checked))
225
+ }, null, 40, Qt),
226
+ b[3] || (b[3] = n("span", null, "Межі растру", -1))
227
+ ])
228
+ ])
229
+ ]));
230
+ }
231
+ }), Xt = { class: "flex h-full bg-gradient-to-br from-slate-50 to-white" }, Kt = { class: "flex-1 relative overflow-hidden" }, Yt = { class: "absolute top-0 left-0 w-full z-20" }, Zt = { class: "px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm" }, Ht = { class: "flex items-start justify-between gap-4" }, Jt = { class: "flex-1 min-w-0" }, es = { class: "flex items-center text-sm text-gray-500 mb-3" }, ts = { class: "text-gray-900 font-medium truncate max-w-xs" }, ss = { class: "flex items-center justify-between gap-4" }, ns = { class: "flex-1 min-w-0" }, os = { class: "flex items-center gap-3 mb-1" }, ls = { class: "text-base font-semibold text-gray-900 truncate" }, rs = ["title"], is = { class: "flex items-center gap-4 min-w-0" }, as = { class: "flex-1 min-w-0" }, us = ["title"], cs = { 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]" }, ds = { class: "relative w-full h-full" }, fs = { class: "absolute top-4 left-4 z-20" }, ms = {
232
+ key: 1,
233
+ 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"
234
+ }, ps = { class: "absolute top-[6.5rem] right-2 space-y-1 z-20" }, gs = { class: "flex-1 flex flex-col h-full" }, vs = { class: "px-3 pt-3 pb-2 border-b border-gray-100" }, ys = { 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" }, xs = ["aria-selected", "onClick"], bs = { class: "leading-none" }, hs = { class: "flex flex-col flex-1 overflow-y-hidden p-3" }, _s = {
235
+ key: 0,
236
+ class: "mb-3 text-xs text-slate-500"
237
+ }, ws = {
238
+ key: 1,
239
+ class: "mb-3 text-xs text-rose-600"
240
+ }, $s = "OpenGIS", _e = 2, ee = 5, ks = 5, js = /* @__PURE__ */ te({
241
+ __name: "raster",
242
+ setup(_) {
243
+ const v = [
244
+ { cardClass: "bg-gradient-to-br from-green-50 to-green-100/30 border-green-200", titleClass: "text-green-900" },
245
+ { cardClass: "bg-gradient-to-br from-blue-50 to-blue-100/30 border-blue-200", titleClass: "text-blue-900" },
246
+ { cardClass: "bg-gradient-to-br from-purple-50 to-purple-100/30 border-purple-200", titleClass: "text-purple-900" },
247
+ { cardClass: "bg-gradient-to-br from-gray-50 to-gray-100/30 border-gray-200", titleClass: "text-gray-900" }
248
+ ], y = et(), r = tt(), f = $(null), P = h(() => {
249
+ var s;
250
+ const e = (s = r.matched[r.matched.length - 1]) == null ? void 0 : s.path;
251
+ return (typeof e == "string" && e ? e : r.path).replace(/\/:id\??$/, "") || "/";
252
+ }), V = h(() => {
253
+ var t;
254
+ const e = (t = r.meta) == null ? void 0 : t.title;
255
+ return typeof e == "string" && e.trim() ? e : "Растри";
256
+ });
257
+ function N() {
258
+ y.push(P.value);
259
+ }
260
+ const x = h(() => {
261
+ var t;
262
+ const e = (t = r.params) == null ? void 0 : t.id;
263
+ return typeof e == "string" ? e : void 0;
264
+ }), c = $(null), A = $(!1), p = $(!1), b = $(null), I = $(!0), C = $(!1), O = $(null);
265
+ let G = null, D = null;
266
+ const se = $(!1);
267
+ let j = null, Q = !1;
268
+ function K(e) {
269
+ if (Array.isArray(e)) return K(e[0]);
270
+ if (typeof e != "string" && typeof e != "number") return null;
271
+ const t = typeof e == "number" ? e : Number(e.trim());
272
+ return Number.isFinite(t) ? t : null;
273
+ }
274
+ function ne(e, t) {
275
+ return e.toFixed(t);
276
+ }
277
+ function oe(e, t, s) {
278
+ const o = 0.5 * 10 ** -s;
279
+ return Math.abs(e - t) > o;
280
+ }
281
+ function z() {
282
+ var e;
283
+ return (e = f.value) == null ? void 0 : e.ctx;
284
+ }
285
+ function ue() {
286
+ var a, g, R, k;
287
+ const e = (g = (a = z()) == null ? void 0 : a.map) == null ? void 0 : g.value;
288
+ if (!e) return;
289
+ const t = K(r.query.z), s = K(r.query.x), o = K(r.query.y);
290
+ if (t == null || s == null || o == null) return;
291
+ const l = (R = e.getCenter) == null ? void 0 : R.call(e), i = (k = e.getZoom) == null ? void 0 : k.call(e);
292
+ (!l || oe(l.lng, s, ee) || oe(l.lat, o, ee) || oe(i ?? 0, t, _e)) && (se.value = !0, e.jumpTo({ center: [s, o], zoom: t }), se.value = !1);
293
+ }
294
+ function $e() {
295
+ var l, i, w, a;
296
+ if (se.value) return;
297
+ const e = (i = (l = z()) == null ? void 0 : l.map) == null ? void 0 : i.value;
298
+ if (!e) return;
299
+ const t = (w = e.getCenter) == null ? void 0 : w.call(e), s = (a = e.getZoom) == null ? void 0 : a.call(e);
300
+ if (!t || s == null) return;
301
+ const o = {
302
+ ...r.query,
303
+ z: ne(s, _e),
304
+ x: ne(t.lng, ee),
305
+ y: ne(t.lat, ee)
306
+ };
307
+ r.query.z === o.z && r.query.x === o.x && r.query.y === o.y || y.replace({ query: o });
308
+ }
309
+ function ke() {
310
+ var t;
311
+ if (typeof document > "u") return;
312
+ const e = (t = T.value) == null ? void 0 : t.name;
313
+ document.title = e ? `${e} — Растер` : $s;
314
+ }
315
+ function Y(e) {
316
+ return Number(e.toFixed(ks));
317
+ }
318
+ function ce(e, t) {
319
+ const [s, o] = e, [l, i] = t;
320
+ return [
321
+ Y(Math.min(s, l)),
322
+ Y(Math.min(o, i)),
323
+ Y(Math.max(s, l)),
324
+ Y(Math.max(o, i))
325
+ ];
326
+ }
327
+ function Ce(e) {
328
+ const [t, s, o, l] = e;
329
+ return {
330
+ type: "Polygon",
331
+ coordinates: [[
332
+ [t, s],
333
+ [o, s],
334
+ [o, l],
335
+ [t, l],
336
+ [t, s]
337
+ ]]
338
+ };
339
+ }
340
+ function le(e) {
341
+ var o, l, i;
342
+ const t = (l = (o = z()) == null ? void 0 : o.map) == null ? void 0 : l.value, s = (i = t == null ? void 0 : t.getCanvas) == null ? void 0 : i.call(t);
343
+ s != null && s.style && (s.style.cursor = e);
344
+ }
345
+ async function Ee(e, t) {
346
+ if (!(!x.value || !c.value))
347
+ try {
348
+ const s = Ce(e), o = await fetch(`/api/gis-metadata/raster/${encodeURIComponent(x.value)}`, {
349
+ method: "POST",
350
+ headers: { "Content-Type": "application/json" },
351
+ body: JSON.stringify({ geom: s })
352
+ });
353
+ if (!o.ok) throw new Error(`Failed to save raster metadata geom: ${o.status}`);
354
+ M({
355
+ type: "success",
356
+ title: "Extent збережено",
357
+ message: "Нові межі успішно збережено."
358
+ }), await H();
359
+ } catch (s) {
360
+ console.error("Failed to save raster extent", s), c.value && (c.value = {
361
+ ...c.value,
362
+ extent: t ? [...t] : void 0
363
+ }), M({
364
+ type: "error",
365
+ title: "Помилка",
366
+ message: "Не вдалося зберегти Extent"
367
+ });
368
+ }
369
+ }
370
+ function de(e) {
371
+ var s, o, l;
372
+ const t = (o = (s = z()) == null ? void 0 : s.map) == null ? void 0 : o.value;
373
+ if ((l = t == null ? void 0 : t.dragPan) != null && l.enable && t.dragPan.enable(), (e == null ? void 0 : e.length) === 4 && c.value) {
374
+ const i = Array.isArray(c.value.extent) ? [...c.value.extent] : null;
375
+ c.value = {
376
+ ...c.value,
377
+ extent: [...e]
378
+ }, Ee(e, i);
379
+ }
380
+ j = null, Q = !1, O.value = null, C.value = !1, le("");
381
+ }
382
+ function re() {
383
+ de(null);
384
+ }
385
+ function Le() {
386
+ var i, w;
387
+ const e = (w = (i = z()) == null ? void 0 : i.map) == null ? void 0 : w.value;
388
+ if (!e) return;
389
+ const t = (a) => {
390
+ var R, k, J;
391
+ if (!C.value || ((R = a == null ? void 0 : a.originalEvent) == null ? void 0 : R.button) != null && a.originalEvent.button !== 0) return;
392
+ const g = a == null ? void 0 : a.lngLat;
393
+ g && (j = [g.lng, g.lat], Q = !0, O.value = [g.lng, g.lat, g.lng, g.lat], (J = (k = e.dragPan) == null ? void 0 : k.disable) == null || J.call(k));
394
+ }, s = (a) => {
395
+ if (!C.value || !Q || !j) return;
396
+ const g = a == null ? void 0 : a.lngLat;
397
+ g && (O.value = ce(j, [g.lng, g.lat]));
398
+ }, o = (a) => {
399
+ if (!C.value || !Q || !j) return;
400
+ const g = a == null ? void 0 : a.lngLat;
401
+ if (!g) {
402
+ re();
403
+ return;
404
+ }
405
+ const R = ce(j, [g.lng, g.lat]), [k, J, Ge, Qe] = R;
406
+ if (!(Math.abs(Ge - k) > 0 && Math.abs(Qe - J) > 0)) {
407
+ M({
408
+ type: "warning",
409
+ title: "Bounds не змінено",
410
+ message: "Потрібно протягнути прямокутник з ненульовою площею."
411
+ }), re();
412
+ return;
413
+ }
414
+ de(R);
415
+ }, l = (a) => {
416
+ C.value && a.key === "Escape" && (a.preventDefault(), re());
417
+ };
418
+ e.on("mousedown", t), e.on("mousemove", s), e.on("mouseup", o), window.addEventListener("keydown", l), D = () => {
419
+ e.off("mousedown", t), e.off("mousemove", s), e.off("mouseup", o), window.removeEventListener("keydown", l);
420
+ };
421
+ }
422
+ async function Re() {
423
+ var s;
424
+ if (C.value) return;
425
+ const e = z();
426
+ !(e != null && e.ready) || (await e.ready(), !((s = e.map) == null ? void 0 : s.value)) || (D || Le(), C.value = !0, Q = !1, j = null, O.value = null, le("crosshair"), M({
427
+ type: "info",
428
+ title: "Редагування Bounds",
429
+ message: "Протягніть прямокутник на карті, щоб задати нові межі."
430
+ }));
431
+ }
432
+ const fe = h(() => {
433
+ var t;
434
+ const e = (t = c.value) == null ? void 0 : t.url;
435
+ return e ? /^https?:\/\//i.test(e) || typeof window > "u" || typeof location > "u" ? e : `${location.origin}${e}` : "";
436
+ }), U = h(() => {
437
+ var e;
438
+ return ((e = c.value) == null ? void 0 : e.extent) ?? null;
439
+ }), me = h(() => x.value ? `raster-${x.value}` : void 0), Me = h(() => x.value ? `raster-extent-${x.value}` : "raster-extent"), Se = h(() => x.value ? `raster-extent-draft-${x.value}` : "raster-extent-draft"), Ie = h(() => {
440
+ const e = me.value ?? "raster", t = U.value && U.value.length === 4 ? U.value.join(",") : "no-extent";
441
+ return `${e}-${t}`;
442
+ }), je = h(() => !!fe.value), pe = h(() => {
443
+ const e = U.value;
444
+ if (!e || e.length !== 4) return null;
445
+ const [t, s, o, l] = e;
446
+ return [t, s, o, l].some(
447
+ (i) => typeof i != "number" || Number.isNaN(i)
448
+ ) ? null : [(t + o) / 2, (s + l) / 2];
449
+ }), T = h(() => {
450
+ var i, w;
451
+ const e = c.value, t = e == null ? void 0 : e.extent, o = x.value ?? "—", l = [
452
+ e != null && e.extension ? `Формат ${String(e.extension).toUpperCase()}` : null,
453
+ (e == null ? void 0 : e.resolution) || null
454
+ ].filter(Boolean).join(", ");
455
+ return {
456
+ id: o,
457
+ name: (e == null ? void 0 : e.name) || ((w = (i = e == null ? void 0 : e.files) == null ? void 0 : i[0]) == null ? void 0 : w.name),
458
+ description: (e == null ? void 0 : e.description) || l || "Попередній перегляд растрового шару.",
459
+ coverage: t && t.length === 4 ? `${L(t[0])}, ${L(t[1])} → ${L(t[2])}, ${L(t[3])}` : "Покриття уточнюється",
460
+ crs: e != null && e.srid ? `EPSG:${e.srid}` : "EPSG:4326",
461
+ source: e != null && e.proj4 ? e.proj4 : "Джерело: Mapnik",
462
+ updatedAt: e != null && e.cache ? "Дані кешовано" : "Нові дані"
463
+ };
464
+ }), ie = h(() => {
465
+ const e = c.value;
466
+ return e ? [
467
+ e.source_path,
468
+ e.srid ? `SRID: ${e.srid}` : null,
469
+ e.is_public ? "Публічна" : "Не публічна",
470
+ e.is_active ? "Активна" : "Неактивна",
471
+ e.cache ? "Кешовано" : null
472
+ ].filter((t) => t).join(", ") : "";
473
+ }), ge = [
474
+ { key: "info", label: "Інформація", icon: qt },
475
+ { key: "files", label: "Файли", icon: rt },
476
+ { key: "metadata", label: "Метадані", icon: ut }
477
+ ], ve = ge.map((e) => e.key), E = $(ve.includes(r.query.tab) ? r.query.tab : "info"), Z = $(!0);
478
+ S(() => r.query.tab, (e) => {
479
+ e && ve.includes(e) && E.value !== e && (E.value = e);
480
+ }), S(E, (e) => {
481
+ r.query.tab !== e && y.replace({ query: { ...r.query, tab: e } });
482
+ });
483
+ const ze = h(() => Ne(c.value)), ye = h(() => Ue(c.value));
484
+ S(
485
+ () => c.value,
486
+ () => {
487
+ ke();
488
+ },
489
+ { immediate: !0 }
490
+ );
491
+ async function Be() {
492
+ var o;
493
+ const e = z();
494
+ if (!(e != null && e.ready)) return;
495
+ await e.ready(), ue();
496
+ const t = (o = e.map) == null ? void 0 : o.value;
497
+ if (!t) return;
498
+ const s = () => $e();
499
+ t.on("moveend", s), t.on("zoomend", s), G = () => {
500
+ t.off("moveend", s), t.off("zoomend", s);
501
+ };
502
+ }
503
+ S(
504
+ () => [r.query.z, r.query.x, r.query.y],
505
+ () => {
506
+ ue();
507
+ }
508
+ ), Ye(() => {
509
+ Be();
510
+ }), Ze(() => {
511
+ G == null || G(), G = null, D == null || D(), D = null, le("");
512
+ }), S(x, () => {
513
+ H();
514
+ }, { immediate: !0 });
515
+ async function Pe(e) {
516
+ var t;
517
+ H(), ((t = c.value) == null ? void 0 : t.srid) !== e.srid && (M({ title: "XML start", type: "info", message: "зміна системи координат, оновлюємо карту ..." }), await xe(`/api/gis-xml/${encodeURIComponent(x.value)}`), M({ title: "XML created", type: "info", message: "карта створена" }), location.reload());
518
+ }
519
+ async function H() {
520
+ const e = x.value;
521
+ if (!e) {
522
+ c.value = null, b.value = null;
523
+ return;
524
+ }
525
+ A.value = !0, b.value = null;
526
+ try {
527
+ const t = await fetch(`/api/gis-raster/${encodeURIComponent(e)}`);
528
+ if (!t.ok)
529
+ throw new Error(`HTTP ${t.status}`);
530
+ const s = await t.json();
531
+ s.xml && (p.value = !0), c.value = s, s.xml || (M({ title: "XML not found", type: "info", message: "йде створення xml ... зачекайте" }), await xe(`/api/gis-xml/${encodeURIComponent(e)}`), M({ title: "XML created", type: "info", message: "карта створена" }), fetch(`/api/gis-raster/${encodeURIComponent(e)}?nocache=1`), p.value = !0);
532
+ } catch (t) {
533
+ console.error("Failed to load raster info", t), c.value = null, b.value = t instanceof Error ? t.message : String(t);
534
+ } finally {
535
+ A.value = !1;
536
+ }
537
+ }
538
+ function xe(e) {
539
+ return new Promise((t, s) => {
540
+ const o = new EventSource(e), l = [];
541
+ o.onmessage = (i) => {
542
+ l.push(i.data), console.log("Received:", i.data);
543
+ }, o.addEventListener("end", () => {
544
+ o.close(), t(l);
545
+ }), o.onerror = (i) => {
546
+ o.close(), t(i);
547
+ };
548
+ });
549
+ }
550
+ function Ne(e) {
551
+ var t;
552
+ return (t = e == null ? void 0 : e.files) != null && t.length ? e.files.map((s) => ({
553
+ name: s.name,
554
+ resolution: De(s.name, e),
555
+ size: s.size || "—",
556
+ status: "Готово",
557
+ statusClass: "bg-emerald-50 text-emerald-600 border border-emerald-100"
558
+ })) : [];
559
+ }
560
+ function De(e, t) {
561
+ const s = e.toLowerCase();
562
+ return s.endsWith(".tfw") ? "Georeference" : s.endsWith(".xml") ? "Опис" : s.endsWith(".tif") || s.endsWith(".tiff") ? t != null && t.resolution ? t.resolution : "Растер" : (t == null ? void 0 : t.resolution) ?? "Файл";
563
+ }
564
+ function Ue(e) {
565
+ return e ? {
566
+ baseParams: qe(e),
567
+ spatial: {
568
+ crs: {
569
+ code: e.srid ? `EPSG:${e.srid}` : "EPSG:4326",
570
+ description: e.proj4 || "WGS 84 — World Geodetic System 1984"
571
+ },
572
+ bounds: Fe(e.extent),
573
+ resolution: Ve(e)
574
+ },
575
+ statistics: Ae(e),
576
+ technical: Oe(e)
577
+ } : null;
578
+ }
579
+ function Te(e) {
580
+ return e != null && e.length ? e.map((s) => {
581
+ var l;
582
+ if (!s) return "";
583
+ const o = s.trim().split(/\s+/)[0];
584
+ return ((l = o == null ? void 0 : o[0]) == null ? void 0 : l.toUpperCase()) || "";
585
+ }).filter(Boolean).join("") : "";
586
+ }
587
+ function qe(e) {
588
+ var i, w;
589
+ const t = e.bands_count ?? ((i = e.bands) == null ? void 0 : i.length) ?? "—", s = Te(e.bands), o = (e.bands ?? []).map((a) => a.trim()).filter((a) => a.length > 0), l = o.length ? o.join(", ") : void 0;
590
+ return [
591
+ {
592
+ label: "Розмір растру, px",
593
+ value: e.width && e.height ? `${e.width}×${e.height}` : "—"
594
+ },
595
+ { label: "Формат файлу", value: ((w = e.extension) == null ? void 0 : w.toUpperCase()) ?? "—" },
596
+ { label: "Розмір файлу, mb", value: e.total_size ? `${e.total_size}` : "—" },
597
+ {
598
+ label: "Кількість каналів",
599
+ value: typeof t == "number" ? `${t}${s ? ` (${s})` : ""}` : `${t}${s ? ` (${s})` : ""}`,
600
+ tooltip: l
601
+ },
602
+ { label: "Глибина кольору", value: e.color_depth ? `${e.color_depth} біт/канал` : "—" },
603
+ { label: "Стиснення", value: e.compression || "—" }
604
+ ];
605
+ }
606
+ function Fe(e) {
607
+ return !e || e.length !== 4 ? [] : [
608
+ { label: "Північ", value: L(e[3], "N") },
609
+ { label: "Схід", value: L(e[2], "E") },
610
+ { label: "Південь", value: L(e[1], "S") },
611
+ { label: "Захід", value: L(e[0], "W") }
612
+ ];
613
+ }
614
+ function Ve(e) {
615
+ const t = [
616
+ { label: "Роздільна здатність", value: e.resolution || "—" }
617
+ ];
618
+ return e.width && e.height && t.push({ label: "Розмір пікселя", value: `${e.width} × ${e.height} px` }), t;
619
+ }
620
+ function Ae(e) {
621
+ var t;
622
+ return (t = e.bands) != null && t.length ? e.bands.map((s, o) => {
623
+ const l = v[o % v.length];
624
+ return {
625
+ label: `Канал ${o + 1}${s ? ` (${s})` : ""}`,
626
+ cardClass: l.cardClass,
627
+ titleClass: l.titleClass,
628
+ metrics: [
629
+ { label: "Назва", value: s || `Канал ${o + 1}` },
630
+ { label: "Глибина", value: e.color_depth ? `${e.color_depth} біт` : "—" },
631
+ { label: "Статус", value: e.cache ? "Кешовано" : "Готово" }
632
+ ]
633
+ };
634
+ }) : [];
635
+ }
636
+ function Oe(e) {
637
+ var t;
638
+ return [
639
+ { label: "Тип даних", value: e.color_depth ? `Unsigned Integer ${e.color_depth}-bit` : "—" },
640
+ { label: "Компресія", value: e.compression || "—" },
641
+ { label: "Кольорова інтерпретація", value: ((t = e.bands) == null ? void 0 : t.join(", ")) || "—" },
642
+ { label: "SRID", value: e.srid ? `EPSG:${e.srid}` : "—" },
643
+ { label: "Проекція (proj4)", value: e.proj4 || "—" },
644
+ { label: "URL тайла", value: e.url || "—" }
645
+ ];
646
+ }
647
+ function L(e, t) {
648
+ if (e == null || Number.isNaN(e)) return "—";
649
+ const s = `${e.toFixed(5)}°`;
650
+ return t ? `${s} ${t}` : s;
651
+ }
652
+ return (e, t) => (u(), m("div", Xt, [
653
+ n("div", Kt, [
654
+ n("div", Yt, [
655
+ n("div", Zt, [
656
+ n("div", Ht, [
657
+ n("div", Jt, [
658
+ n("div", es, [
659
+ n("button", {
660
+ type: "button",
661
+ class: "hover:text-gray-700 cursor-pointer transition-colors",
662
+ onClick: N
663
+ }, d(V.value), 1),
664
+ t[2] || (t[2] = n("svg", {
665
+ xmlns: "http://www.w3.org/2000/svg",
666
+ width: "24",
667
+ height: "24",
668
+ viewBox: "0 0 24 24",
669
+ fill: "none",
670
+ stroke: "currentColor",
671
+ "stroke-width": "2",
672
+ "stroke-linecap": "round",
673
+ "stroke-linejoin": "round",
674
+ class: "lucide lucide-chevron-right w-4 h-4 mx-1"
675
+ }, [
676
+ n("path", { d: "m9 18 6-6-6-6" })
677
+ ], -1)),
678
+ n("span", ts, d(T.value.name || "Растер"), 1)
679
+ ]),
680
+ n("div", ss, [
681
+ n("div", ns, [
682
+ n("div", os, [
683
+ n("h1", ls, d(T.value.name || "Растер"), 1)
684
+ ]),
685
+ ie.value ? (u(), m("p", {
686
+ key: 0,
687
+ class: "text-xs text-gray-500 truncate",
688
+ title: ie.value
689
+ }, d(ie.value), 9, rs)) : q("", !0)
690
+ ])
691
+ ])
692
+ ]),
693
+ n("div", is, [
694
+ n("div", as, [
695
+ n("div", {
696
+ class: "w-full text-xs text-gray-600 truncate",
697
+ title: T.value.description
698
+ }, d(T.value.description), 9, us)
699
+ ]),
700
+ B(ct, {
701
+ "entity-id": x.value || "",
702
+ "entity-info": { name: T.value.name },
703
+ table: "gis.rasters.table",
704
+ "entity-label": "Растер",
705
+ "save-method": "put",
706
+ "edit-button-text": "Редагувати",
707
+ onSaved: Pe
708
+ }, null, 8, ["entity-id", "entity-info"])
709
+ ])
710
+ ])
711
+ ])
712
+ ]),
713
+ n("div", cs, [
714
+ n("div", ds, [
715
+ B(it, {
716
+ ref_key: "mapViewRef",
717
+ ref: f
718
+ }, {
719
+ default: He(() => [
720
+ je.value && p.value ? (u(), F(Wt, {
721
+ key: Ie.value,
722
+ "tile-url": fe.value,
723
+ extent: U.value,
724
+ "layer-id": me.value,
725
+ "show-raster-extent": I.value,
726
+ onToggleExtent: t[0] || (t[0] = (s) => I.value = s)
727
+ }, null, 8, ["tile-url", "extent", "layer-id", "show-raster-extent"])) : q("", !0),
728
+ B(he, {
729
+ extent: I.value ? U.value : null,
730
+ "layer-id": Me.value
731
+ }, null, 8, ["extent", "layer-id"]),
732
+ B(he, {
733
+ extent: O.value,
734
+ "layer-id": Se.value,
735
+ "line-color": "#0ea5e9",
736
+ "line-width": 3
737
+ }, null, 8, ["extent", "layer-id"]),
738
+ n("div", fs, [
739
+ B(at)
740
+ ]),
741
+ C.value ? (u(), m("div", ms, " Потягніть на карті, щоб намалювати нові Bounds. Esc скасовує редагування. ")) : q("", !0),
742
+ n("div", ps, [
743
+ B(be),
744
+ pe.value ? (u(), F(be, {
745
+ key: 0,
746
+ targetCenter: pe.value,
747
+ targetLabel: "Центр даних",
748
+ targetAriaLabel: "Перейти до центру даних"
749
+ }, null, 8, ["targetCenter"])) : q("", !0)
750
+ ])
751
+ ]),
752
+ _: 1
753
+ }, 512)
754
+ ])
755
+ ]),
756
+ B(dt, {
757
+ open: Z.value,
758
+ onToggle: t[1] || (t[1] = (s) => Z.value = !Z.value)
759
+ }, null, 8, ["open"])
760
+ ]),
761
+ n("div", {
762
+ class: ae(["bg-white border-l border-gray-100 flex flex-col overflow-hidden shadow-lg flex-shrink-0 transition-[width] duration-100 ease-in-out", Z.value ? "w-[650px]" : "w-0"])
763
+ }, [
764
+ n("div", gs, [
765
+ n("div", vs, [
766
+ n("div", ys, [
767
+ (u(), m(W, null, X(ge, (s) => n("button", {
768
+ key: s.key,
769
+ type: "button",
770
+ role: "tab",
771
+ "aria-selected": E.value === s.key,
772
+ class: ae(["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", E.value === s.key ? "bg-white shadow-sm text-gray-700" : ""]),
773
+ onClick: (o) => E.value = s.key
774
+ }, [
775
+ (u(), F(Je(s.icon), { class: "h-3.5 w-3.5 mb-0.5" })),
776
+ n("span", bs, d(s.label), 1)
777
+ ], 10, xs)), 64))
778
+ ])
779
+ ]),
780
+ n("div", hs, [
781
+ A.value ? (u(), m("div", _s, " Завантаження метаданих растру… ")) : b.value ? (u(), m("div", ws, " Не вдалося отримати дані: " + d(b.value), 1)) : q("", !0),
782
+ E.value === "files" ? (u(), F(Nt, {
783
+ key: 2,
784
+ files: ze.value
785
+ }, null, 8, ["files"])) : E.value === "metadata" ? (u(), F(ft, {
786
+ key: 3,
787
+ data: c.value,
788
+ "entity-id": x.value,
789
+ "entity-type": "raster",
790
+ onSaved: H,
791
+ onEditCssBounds: Re
792
+ }, null, 8, ["data", "entity-id"])) : ye.value ? (u(), F(jt, {
793
+ key: 4,
794
+ details: ye.value
795
+ }, null, 8, ["details"])) : q("", !0)
796
+ ])
797
+ ])
798
+ ], 2)
799
+ ]));
800
+ }
801
+ });
802
+ export {
803
+ js as default
804
+ };