zenit-sdk 0.2.0 → 0.2.2

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.
@@ -713,6 +713,7 @@ interface ZenitLayerManagerProps {
713
713
  }) => Promise<void> | void;
714
714
  availableFilterLayers?: Array<number | string>;
715
715
  filterFieldWhitelist?: string[];
716
+ showFiltersTab?: boolean;
716
717
  }
717
718
  declare const ZenitLayerManager: React.FC<ZenitLayerManagerProps>;
718
719
 
@@ -713,6 +713,7 @@ interface ZenitLayerManagerProps {
713
713
  }) => Promise<void> | void;
714
714
  availableFilterLayers?: Array<number | string>;
715
715
  filterFieldWhitelist?: string[];
716
+ showFiltersTab?: boolean;
716
717
  }
717
718
  declare const ZenitLayerManager: React.FC<ZenitLayerManagerProps>;
718
719
 
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { M as MapDto, N as NormalizedMapLayer, G as GeoJsonFeature, B as Bbox, a as GeoJsonFeatureCollection, F as FilterMultipleMetadata, L as LayerFilters, b as GeoJsonRequestOptions, c as GeoJsonPolygon, Z as ZenitClient } from './index-Cp6tg4tg.mjs';
2
- export { O as ApiEnvelope, P as ApiResponseData, ai as ChatRequestDto, ad as ChatRequestOptions, ak as ChatResponseDto, ac as ChatServiceConfig, ae as ChatStreamCallbacks, D as DEFAULT_MAX_FEATURES_FULL_GEOJSON, a8 as EffectiveLayerState, a4 as FilterMultipleLayerMeta, a5 as FilterMultipleWithFallbackResult, a3 as FilterValue, ar as FloatingChatBox, as as FloatingChatBoxProps, T as GeoJsonBBoxRequest, J as GeoJsonGeometryCollection, W as GeoJsonIntersectRequest, I as GeoJsonPoint, o as HttpClient, H as HttpClientOptions, X as LayerAoi, a6 as LayerBaseState, K as LayerDataStrategy, C as LayerDto, a1 as LayerFeatureCatalogItem, a2 as LayerFeaturesCatalogDto, Q as LayerMetadata, a7 as LayerOverrideState, an as LayerSnapshot, ay as LayerStyle, E as LayerSummary, $ as LoadLayerDataParams, a0 as LoadLayerDataResult, f as LoginRequest, g as LoginResponse, s as MapLayerConfig, q as MapSettings, h as MeResponse, R as RefreshResponse, Y as ResolveLayerStrategyParams, _ as ResolveLayerStrategyResult, j as SdkTokenExchangeResponse, S as SdkTokenValidateResponse, aj as SuggestedAction, U as UserSummary, V as ValidateResponse, i as ZenitAuthClient, aq as ZenitFeatureFilterPanel, ap as ZenitLayerManager, A as ZenitLayersClient, al as ZenitMap, ao as ZenitMapProps, am as ZenitMapRef, p as ZenitMapsClient, e as ZenitRuntimeConfig, k as ZenitSdkAuthClient, d as ZenitSdkConfig, l as ZenitSdkError, at as ZenitSelect, av as ZenitSelectOption, au as ZenitSelectProps, aD as ZoomOpacityOptions, aa as applyLayerOverrides, x as buildAoiFromFeatureCollection, u as buildFilterMultipleParams, t as buildLayerFilters, z as buildLimitedMessage, aE as clampNumber, aF as clampOpacity, ah as createChatService, aC as getAccentByLayerId, aJ as getEffectiveLayerOpacity, aA as getLayerColor, aI as getLayerZoomOpacityFactor, aB as getStyleByLayerId, aH as getZoomOpacityFactor, a9 as initLayerStates, aG as isPolygonLayer, m as mergeFilters, n as normalizeFilters, ab as resetOverrides, az as resolveLayerAccent, y as resolveLayerStrategy, r as resolveRuntimeConfig, af as sendMessage, ag as sendMessageStream, w as shouldSkipGeojsonDownload, v as shouldUseFilterMultiple, aw as useSendMessage, ax as useSendMessageStream } from './index-Cp6tg4tg.mjs';
1
+ import { M as MapDto, N as NormalizedMapLayer, G as GeoJsonFeature, B as Bbox, a as GeoJsonFeatureCollection, F as FilterMultipleMetadata, L as LayerFilters, b as GeoJsonRequestOptions, c as GeoJsonPolygon, Z as ZenitClient } from './index-BitY8iwn.mjs';
2
+ export { O as ApiEnvelope, P as ApiResponseData, ai as ChatRequestDto, ad as ChatRequestOptions, ak as ChatResponseDto, ac as ChatServiceConfig, ae as ChatStreamCallbacks, D as DEFAULT_MAX_FEATURES_FULL_GEOJSON, a8 as EffectiveLayerState, a4 as FilterMultipleLayerMeta, a5 as FilterMultipleWithFallbackResult, a3 as FilterValue, ar as FloatingChatBox, as as FloatingChatBoxProps, T as GeoJsonBBoxRequest, J as GeoJsonGeometryCollection, W as GeoJsonIntersectRequest, I as GeoJsonPoint, o as HttpClient, H as HttpClientOptions, X as LayerAoi, a6 as LayerBaseState, K as LayerDataStrategy, C as LayerDto, a1 as LayerFeatureCatalogItem, a2 as LayerFeaturesCatalogDto, Q as LayerMetadata, a7 as LayerOverrideState, an as LayerSnapshot, ay as LayerStyle, E as LayerSummary, $ as LoadLayerDataParams, a0 as LoadLayerDataResult, f as LoginRequest, g as LoginResponse, s as MapLayerConfig, q as MapSettings, h as MeResponse, R as RefreshResponse, Y as ResolveLayerStrategyParams, _ as ResolveLayerStrategyResult, j as SdkTokenExchangeResponse, S as SdkTokenValidateResponse, aj as SuggestedAction, U as UserSummary, V as ValidateResponse, i as ZenitAuthClient, aq as ZenitFeatureFilterPanel, ap as ZenitLayerManager, A as ZenitLayersClient, al as ZenitMap, ao as ZenitMapProps, am as ZenitMapRef, p as ZenitMapsClient, e as ZenitRuntimeConfig, k as ZenitSdkAuthClient, d as ZenitSdkConfig, l as ZenitSdkError, at as ZenitSelect, av as ZenitSelectOption, au as ZenitSelectProps, aD as ZoomOpacityOptions, aa as applyLayerOverrides, x as buildAoiFromFeatureCollection, u as buildFilterMultipleParams, t as buildLayerFilters, z as buildLimitedMessage, aE as clampNumber, aF as clampOpacity, ah as createChatService, aC as getAccentByLayerId, aJ as getEffectiveLayerOpacity, aA as getLayerColor, aI as getLayerZoomOpacityFactor, aB as getStyleByLayerId, aH as getZoomOpacityFactor, a9 as initLayerStates, aG as isPolygonLayer, m as mergeFilters, n as normalizeFilters, ab as resetOverrides, az as resolveLayerAccent, y as resolveLayerStrategy, r as resolveRuntimeConfig, af as sendMessage, ag as sendMessageStream, w as shouldSkipGeojsonDownload, v as shouldUseFilterMultiple, aw as useSendMessage, ax as useSendMessageStream } from './index-BitY8iwn.mjs';
3
3
  export { ChevronDown, ChevronLeft, ChevronRight, Eye, EyeOff, Layers, Upload, X, ZoomIn } from 'lucide-react';
4
4
  import 'react';
5
5
  import 'leaflet';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { M as MapDto, N as NormalizedMapLayer, G as GeoJsonFeature, B as Bbox, a as GeoJsonFeatureCollection, F as FilterMultipleMetadata, L as LayerFilters, b as GeoJsonRequestOptions, c as GeoJsonPolygon, Z as ZenitClient } from './index-Cp6tg4tg.js';
2
- export { O as ApiEnvelope, P as ApiResponseData, ai as ChatRequestDto, ad as ChatRequestOptions, ak as ChatResponseDto, ac as ChatServiceConfig, ae as ChatStreamCallbacks, D as DEFAULT_MAX_FEATURES_FULL_GEOJSON, a8 as EffectiveLayerState, a4 as FilterMultipleLayerMeta, a5 as FilterMultipleWithFallbackResult, a3 as FilterValue, ar as FloatingChatBox, as as FloatingChatBoxProps, T as GeoJsonBBoxRequest, J as GeoJsonGeometryCollection, W as GeoJsonIntersectRequest, I as GeoJsonPoint, o as HttpClient, H as HttpClientOptions, X as LayerAoi, a6 as LayerBaseState, K as LayerDataStrategy, C as LayerDto, a1 as LayerFeatureCatalogItem, a2 as LayerFeaturesCatalogDto, Q as LayerMetadata, a7 as LayerOverrideState, an as LayerSnapshot, ay as LayerStyle, E as LayerSummary, $ as LoadLayerDataParams, a0 as LoadLayerDataResult, f as LoginRequest, g as LoginResponse, s as MapLayerConfig, q as MapSettings, h as MeResponse, R as RefreshResponse, Y as ResolveLayerStrategyParams, _ as ResolveLayerStrategyResult, j as SdkTokenExchangeResponse, S as SdkTokenValidateResponse, aj as SuggestedAction, U as UserSummary, V as ValidateResponse, i as ZenitAuthClient, aq as ZenitFeatureFilterPanel, ap as ZenitLayerManager, A as ZenitLayersClient, al as ZenitMap, ao as ZenitMapProps, am as ZenitMapRef, p as ZenitMapsClient, e as ZenitRuntimeConfig, k as ZenitSdkAuthClient, d as ZenitSdkConfig, l as ZenitSdkError, at as ZenitSelect, av as ZenitSelectOption, au as ZenitSelectProps, aD as ZoomOpacityOptions, aa as applyLayerOverrides, x as buildAoiFromFeatureCollection, u as buildFilterMultipleParams, t as buildLayerFilters, z as buildLimitedMessage, aE as clampNumber, aF as clampOpacity, ah as createChatService, aC as getAccentByLayerId, aJ as getEffectiveLayerOpacity, aA as getLayerColor, aI as getLayerZoomOpacityFactor, aB as getStyleByLayerId, aH as getZoomOpacityFactor, a9 as initLayerStates, aG as isPolygonLayer, m as mergeFilters, n as normalizeFilters, ab as resetOverrides, az as resolveLayerAccent, y as resolveLayerStrategy, r as resolveRuntimeConfig, af as sendMessage, ag as sendMessageStream, w as shouldSkipGeojsonDownload, v as shouldUseFilterMultiple, aw as useSendMessage, ax as useSendMessageStream } from './index-Cp6tg4tg.js';
1
+ import { M as MapDto, N as NormalizedMapLayer, G as GeoJsonFeature, B as Bbox, a as GeoJsonFeatureCollection, F as FilterMultipleMetadata, L as LayerFilters, b as GeoJsonRequestOptions, c as GeoJsonPolygon, Z as ZenitClient } from './index-BitY8iwn.js';
2
+ export { O as ApiEnvelope, P as ApiResponseData, ai as ChatRequestDto, ad as ChatRequestOptions, ak as ChatResponseDto, ac as ChatServiceConfig, ae as ChatStreamCallbacks, D as DEFAULT_MAX_FEATURES_FULL_GEOJSON, a8 as EffectiveLayerState, a4 as FilterMultipleLayerMeta, a5 as FilterMultipleWithFallbackResult, a3 as FilterValue, ar as FloatingChatBox, as as FloatingChatBoxProps, T as GeoJsonBBoxRequest, J as GeoJsonGeometryCollection, W as GeoJsonIntersectRequest, I as GeoJsonPoint, o as HttpClient, H as HttpClientOptions, X as LayerAoi, a6 as LayerBaseState, K as LayerDataStrategy, C as LayerDto, a1 as LayerFeatureCatalogItem, a2 as LayerFeaturesCatalogDto, Q as LayerMetadata, a7 as LayerOverrideState, an as LayerSnapshot, ay as LayerStyle, E as LayerSummary, $ as LoadLayerDataParams, a0 as LoadLayerDataResult, f as LoginRequest, g as LoginResponse, s as MapLayerConfig, q as MapSettings, h as MeResponse, R as RefreshResponse, Y as ResolveLayerStrategyParams, _ as ResolveLayerStrategyResult, j as SdkTokenExchangeResponse, S as SdkTokenValidateResponse, aj as SuggestedAction, U as UserSummary, V as ValidateResponse, i as ZenitAuthClient, aq as ZenitFeatureFilterPanel, ap as ZenitLayerManager, A as ZenitLayersClient, al as ZenitMap, ao as ZenitMapProps, am as ZenitMapRef, p as ZenitMapsClient, e as ZenitRuntimeConfig, k as ZenitSdkAuthClient, d as ZenitSdkConfig, l as ZenitSdkError, at as ZenitSelect, av as ZenitSelectOption, au as ZenitSelectProps, aD as ZoomOpacityOptions, aa as applyLayerOverrides, x as buildAoiFromFeatureCollection, u as buildFilterMultipleParams, t as buildLayerFilters, z as buildLimitedMessage, aE as clampNumber, aF as clampOpacity, ah as createChatService, aC as getAccentByLayerId, aJ as getEffectiveLayerOpacity, aA as getLayerColor, aI as getLayerZoomOpacityFactor, aB as getStyleByLayerId, aH as getZoomOpacityFactor, a9 as initLayerStates, aG as isPolygonLayer, m as mergeFilters, n as normalizeFilters, ab as resetOverrides, az as resolveLayerAccent, y as resolveLayerStrategy, r as resolveRuntimeConfig, af as sendMessage, ag as sendMessageStream, w as shouldSkipGeojsonDownload, v as shouldUseFilterMultiple, aw as useSendMessage, ax as useSendMessageStream } from './index-BitY8iwn.js';
3
3
  export { ChevronDown, ChevronLeft, ChevronRight, Eye, EyeOff, Layers, Upload, X, ZoomIn } from 'lucide-react';
4
4
  import 'react';
5
5
  import 'leaflet';
package/dist/index.js CHANGED
@@ -1733,6 +1733,28 @@ function sanitizeGeoJson(input, debugKey) {
1733
1733
  var import_jsx_runtime = require("react/jsx-runtime");
1734
1734
  var POINT_GEOMETRY_TYPES = /* @__PURE__ */ new Set(["Point", "MultiPoint"]);
1735
1735
  var DEV_MODE = typeof process !== "undefined" && process.env.NODE_ENV !== "production";
1736
+ function getPolygonArea(coords) {
1737
+ let area = 0;
1738
+ for (let i = 0; i < coords.length - 1; i++) {
1739
+ area += coords[i][0] * coords[i + 1][1] - coords[i + 1][0] * coords[i][1];
1740
+ }
1741
+ return Math.abs(area / 2);
1742
+ }
1743
+ function getFeatureArea(feature) {
1744
+ const geom = feature?.geometry;
1745
+ if (!geom?.coordinates) return 0;
1746
+ try {
1747
+ if (geom.type === "Polygon") return getPolygonArea(geom.coordinates[0]);
1748
+ if (geom.type === "MultiPolygon") {
1749
+ return geom.coordinates.reduce(
1750
+ (sum, poly) => sum + getPolygonArea(poly[0]),
1751
+ 0
1752
+ );
1753
+ }
1754
+ } catch {
1755
+ }
1756
+ return 0;
1757
+ }
1736
1758
  function normalizeBboxFromData(data) {
1737
1759
  const bboxCandidate = data.bbox;
1738
1760
  if (!Array.isArray(bboxCandidate) || bboxCandidate.length < 4) return null;
@@ -1834,7 +1856,10 @@ var LayerGeoJson = ({
1834
1856
  }, [onEachFeature]);
1835
1857
  const safeData = (0, import_react.useMemo)(() => sanitizeGeoJson(data, String(layerId)), [data, layerId]);
1836
1858
  const features = (0, import_react.useMemo)(() => safeData.features ?? [], [safeData]);
1837
- const fillFeatures = (0, import_react.useMemo)(() => features.filter(isNonPointGeometry), [features]);
1859
+ const fillFeatures = (0, import_react.useMemo)(
1860
+ () => [...features.filter(isNonPointGeometry)].sort((a, b) => getFeatureArea(b) - getFeatureArea(a)),
1861
+ [features]
1862
+ );
1838
1863
  const pointFeatures = (0, import_react.useMemo)(() => features.filter(isPointGeometry), [features]);
1839
1864
  const dataVersionRef = (0, import_react.useRef)(0);
1840
1865
  const prevSignatureRef = (0, import_react.useRef)("");
@@ -1879,7 +1904,8 @@ var LayerGeoJson = ({
1879
1904
  return import_leaflet.default.marker(latlng, {
1880
1905
  icon: createPointDivIcon(style, isMobile),
1881
1906
  pane: clusterPaneName,
1882
- interactive: true
1907
+ interactive: true,
1908
+ bubblingMouseEvents: false
1883
1909
  });
1884
1910
  },
1885
1911
  onEachFeature: (feature, layer) => onEachFeatureRef.current(feature, layer)
@@ -1907,7 +1933,7 @@ var LayerGeoJson = ({
1907
1933
  {
1908
1934
  data: fillData,
1909
1935
  pane: resolvedFillPane,
1910
- style: (feature) => styleFn(feature, layerType, baseOpacity),
1936
+ style: (feature) => ({ ...styleFn(feature, layerType, baseOpacity), bubblingMouseEvents: false }),
1911
1937
  onEachFeature: (feature, layer) => {
1912
1938
  onEachFeature(feature, layer);
1913
1939
  onPolygonLabel?.(feature, layer);
@@ -1926,7 +1952,9 @@ var LayerGeoJson = ({
1926
1952
  }
1927
1953
  return import_leaflet.default.circleMarker(latlng, {
1928
1954
  radius: isMobile ? 8 : 6,
1929
- ...styleFn(feature, layerType, baseOpacity)
1955
+ ...styleFn(feature, layerType, baseOpacity),
1956
+ bubblingMouseEvents: false,
1957
+ interactive: true
1930
1958
  });
1931
1959
  },
1932
1960
  onEachFeature
@@ -2159,6 +2187,7 @@ var POPUP_EXCLUDED_KEYS = /* @__PURE__ */ new Set(["geom", "geometry", "_private
2159
2187
  var POPUP_TITLE_KEYS = ["id", "nombre", "name", "title", "titulo", "cluster"];
2160
2188
  var POPUP_BADGE_KEYS = ["tipo", "type", "category", "categoria", "estado", "status"];
2161
2189
  var POPUP_DESCRIPTION_KEYS = ["descripcion", "description", "desc"];
2190
+ var POPUP_PRIORITY_KEYS = ["insights", "recomendaciones"];
2162
2191
  var CURRENCY_KEYWORDS = [
2163
2192
  "capital",
2164
2193
  "monto",
@@ -2389,6 +2418,14 @@ function shouldIncludePopupEntry(key, value) {
2389
2418
  if (typeof value === "string" && !value.trim()) return false;
2390
2419
  return true;
2391
2420
  }
2421
+ function getPopupPriorityIndex(key) {
2422
+ const normalized = key.trim().toLowerCase();
2423
+ const idx = POPUP_PRIORITY_KEYS.indexOf(normalized);
2424
+ return idx === -1 ? POPUP_PRIORITY_KEYS.length : idx;
2425
+ }
2426
+ function sortEntriesByPriority(entries) {
2427
+ return [...entries].sort((a, b) => getPopupPriorityIndex(a[0]) - getPopupPriorityIndex(b[0]));
2428
+ }
2392
2429
  function createPopupContent(properties) {
2393
2430
  const header = findHeaderProperties(properties);
2394
2431
  const headerText = header.title?.value ?? extractPopupHeader(properties);
@@ -2396,11 +2433,13 @@ function createPopupContent(properties) {
2396
2433
  const badge = header.badge ? getBadgeForProperty(header.badge.key, header.badge.value) : null;
2397
2434
  const colorValue = properties.color;
2398
2435
  const colorBar = typeof colorValue === "string" && isHexColor(colorValue) ? `<div style="height:6px; border-radius:8px; margin:-2px -2px 10px; background:linear-gradient(90deg, ${colorValue}, rgba(255,255,255,0.95));"></div>` : "";
2399
- const entries = Object.entries(properties).filter(([key, value]) => {
2400
- if (!shouldIncludePopupEntry(key, value)) return false;
2401
- if (usedKeys.has(key)) return false;
2402
- return true;
2403
- });
2436
+ const entries = sortEntriesByPriority(
2437
+ Object.entries(properties).filter(([key, value]) => {
2438
+ if (!shouldIncludePopupEntry(key, value)) return false;
2439
+ if (usedKeys.has(key)) return false;
2440
+ return true;
2441
+ })
2442
+ );
2404
2443
  if (entries.length === 0) {
2405
2444
  return '<div style="padding:8px 0; color:#64748b; text-align:center;">Sin datos disponibles</div>';
2406
2445
  }
@@ -2446,7 +2485,10 @@ function buildWhitelistedRows(properties, headerSections) {
2446
2485
  return null;
2447
2486
  }
2448
2487
  const { whitelist, modalType } = selection;
2449
- const entries = applyModalWhitelist(properties, whitelist);
2488
+ const rawEntries = applyModalWhitelist(properties, whitelist);
2489
+ const entries = [...rawEntries].sort(
2490
+ (a, b) => getPopupPriorityIndex(a.matchedKey) - getPopupPriorityIndex(b.matchedKey)
2491
+ );
2450
2492
  if (entries.length === 0) {
2451
2493
  logModalWhitelistDebug({
2452
2494
  modalType,
@@ -2997,6 +3039,39 @@ function isCandidateGeometryType(candidate, allowedTypes) {
2997
3039
  const geometryType = candidate?.geometry?.type;
2998
3040
  return Boolean(geometryType && allowedTypes.has(geometryType));
2999
3041
  }
3042
+ function calculatePolygonArea(coords) {
3043
+ let area = 0;
3044
+ for (let i = 0; i < coords.length - 1; i++) {
3045
+ area += coords[i][0] * coords[i + 1][1] - coords[i + 1][0] * coords[i][1];
3046
+ }
3047
+ return Math.abs(area / 2);
3048
+ }
3049
+ function calculateGeometryArea(geometry) {
3050
+ if (!geometry?.coordinates) return 0;
3051
+ try {
3052
+ if (geometry.type === "Polygon") return calculatePolygonArea(geometry.coordinates[0]);
3053
+ if (geometry.type === "MultiPolygon") {
3054
+ return geometry.coordinates.reduce(
3055
+ (sum, poly) => sum + calculatePolygonArea(poly[0]),
3056
+ 0
3057
+ );
3058
+ }
3059
+ } catch {
3060
+ }
3061
+ return 0;
3062
+ }
3063
+ function calculateLayerAverageArea(features) {
3064
+ if (!features?.length) return 0;
3065
+ try {
3066
+ const total = features.reduce(
3067
+ (sum, f) => sum + (f?.geometry ? calculateGeometryArea(f.geometry) : 0),
3068
+ 0
3069
+ );
3070
+ return total / features.length;
3071
+ } catch {
3072
+ return 0;
3073
+ }
3074
+ }
3000
3075
  function getFeatureStyleOverrides(feature) {
3001
3076
  const candidate = feature?.properties?._style;
3002
3077
  if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) return null;
@@ -3358,7 +3433,7 @@ var ZenitMap = (0, import_react5.forwardRef)(({
3358
3433
  );
3359
3434
  if (layerStates && onLayerStateChange) {
3360
3435
  const next = effectiveStates.map(
3361
- (state) => state.layerId === layerId ? {
3436
+ (state) => isLayerIdMatch(state.layerId, layerId) ? {
3362
3437
  ...state,
3363
3438
  baseOpacity,
3364
3439
  opacity: effectiveOpacity,
@@ -3369,11 +3444,11 @@ var ZenitMap = (0, import_react5.forwardRef)(({
3369
3444
  return;
3370
3445
  }
3371
3446
  setBaseStates(
3372
- (prev) => prev.map((state) => state.layerId === layerId ? { ...state, baseOpacity } : state)
3447
+ (prev) => prev.map((state) => isLayerIdMatch(state.layerId, layerId) ? { ...state, baseOpacity } : state)
3373
3448
  );
3374
3449
  setUiOverrides((prev) => {
3375
- const existing = prev.find((entry) => entry.layerId === layerId);
3376
- const filtered = prev.filter((entry) => entry.layerId !== layerId);
3450
+ const existing = prev.find((entry) => isLayerIdMatch(entry.layerId, layerId));
3451
+ const filtered = prev.filter((entry) => !isLayerIdMatch(entry.layerId, layerId));
3377
3452
  if (existing && existing.overrideVisible !== void 0) {
3378
3453
  return [
3379
3454
  ...filtered,
@@ -3415,13 +3490,18 @@ var ZenitMap = (0, import_react5.forwardRef)(({
3415
3490
  const override = layerGeojsonOverrides[layerKey];
3416
3491
  return {
3417
3492
  ...layer,
3418
- effective: effectiveStates.find((state) => state.layerId === layer.mapLayer.layerId),
3493
+ effective: effectiveStates.find((state) => isLayerIdMatch(state.layerId, layer.mapLayer.layerId)),
3419
3494
  data: override ?? layerGeojson?.[layer.mapLayer.layerId] ?? layerGeojson?.[layerKey] ?? null
3420
3495
  };
3421
3496
  });
3422
3497
  }, [effectiveStates, layerGeojson, layerGeojsonOverrides, layers]);
3423
3498
  const orderedLayers = (0, import_react5.useMemo)(() => {
3424
- return [...decoratedLayers].filter((layer) => layer.effective?.visible && layer.data).sort((a, b) => a.displayOrder - b.displayOrder);
3499
+ return [...decoratedLayers].filter((layer) => layer.effective?.visible && layer.data).sort((a, b) => {
3500
+ const aArea = calculateLayerAverageArea(a.data?.features ?? []);
3501
+ const bArea = calculateLayerAverageArea(b.data?.features ?? []);
3502
+ if (aArea !== bArea) return bArea - aArea;
3503
+ return a.displayOrder - b.displayOrder;
3504
+ });
3425
3505
  }, [decoratedLayers]);
3426
3506
  const autoZoomGeojson = (0, import_react5.useMemo)(
3427
3507
  () => orderedLayers.map((layer) => layer.data).filter((collection) => !!collection),
@@ -3474,15 +3554,14 @@ var ZenitMap = (0, import_react5.forwardRef)(({
3474
3554
  (targetMap, targetLayers) => {
3475
3555
  const fillBaseZIndex = 400;
3476
3556
  const pointsBaseZIndex = 750;
3477
- targetLayers.forEach((layer) => {
3478
- const order = Number.isFinite(layer.displayOrder) ? layer.displayOrder : 0;
3479
- const orderOffset = Math.max(0, Math.min(order, 150));
3557
+ const sortedByArea = [...targetLayers].sort((a, b) => (b.averageArea ?? 0) - (a.averageArea ?? 0));
3558
+ sortedByArea.forEach((layer, areaIndex) => {
3480
3559
  const fillPaneName = `zenit-layer-${layer.layerId}-fill`;
3481
3560
  const pointPaneName = `zenit-layer-${layer.layerId}-points`;
3482
3561
  const fillPane = targetMap.getPane(fillPaneName) ?? targetMap.createPane(fillPaneName);
3483
3562
  const pointPane = targetMap.getPane(pointPaneName) ?? targetMap.createPane(pointPaneName);
3484
- fillPane.style.zIndex = String(fillBaseZIndex + orderOffset);
3485
- pointPane.style.zIndex = String(pointsBaseZIndex + orderOffset);
3563
+ fillPane.style.zIndex = String(fillBaseZIndex + areaIndex);
3564
+ pointPane.style.zIndex = String(pointsBaseZIndex + areaIndex);
3486
3565
  });
3487
3566
  },
3488
3567
  []
@@ -3505,10 +3584,11 @@ var ZenitMap = (0, import_react5.forwardRef)(({
3505
3584
  }
3506
3585
  const layerTargets = orderedLayers.map((layer) => ({
3507
3586
  layerId: layer.mapLayer.layerId,
3508
- displayOrder: layer.displayOrder
3587
+ displayOrder: layer.displayOrder,
3588
+ averageArea: calculateLayerAverageArea(layer.data?.features ?? [])
3509
3589
  }));
3510
3590
  if (overlayGeojson) {
3511
- layerTargets.push({ layerId: "overlay-geojson", displayOrder: 999 });
3591
+ layerTargets.push({ layerId: "overlay-geojson", displayOrder: 999, averageArea: 0 });
3512
3592
  }
3513
3593
  ensureLayerPanes(mapInstance, layerTargets);
3514
3594
  const first = layerTargets[0];
@@ -3558,9 +3638,7 @@ var ZenitMap = (0, import_react5.forwardRef)(({
3558
3638
  });
3559
3639
  }
3560
3640
  layer.on("click", (e) => {
3561
- if (clickIntent === "point") {
3562
- import_leaflet4.default.DomEvent.stopPropagation(e);
3563
- }
3641
+ import_leaflet4.default.DomEvent.stopPropagation(e);
3564
3642
  if (featureInfoMode === "popup" && client && layerId !== void 0 && !extractDescriptionValue(feature?.properties) && feature?.geometry) {
3565
3643
  if (DEV_MODE2) {
3566
3644
  console.debug("[ZenitMap] click/intersect:start", {
@@ -4500,8 +4578,6 @@ var CATALOG_FIELD_BLACKLIST = /* @__PURE__ */ new Set([
4500
4578
  "objectid",
4501
4579
  "OBJECTID",
4502
4580
  "objectId",
4503
- "gforms",
4504
- "GFORMS",
4505
4581
  "nomina",
4506
4582
  "NOMINA",
4507
4583
  "shape_area",
@@ -4563,7 +4639,8 @@ var ZenitLayerManager = ({
4563
4639
  onApplyLayerFilter,
4564
4640
  onClearLayerFilter,
4565
4641
  availableFilterLayers = [],
4566
- filterFieldWhitelist = []
4642
+ filterFieldWhitelist = [],
4643
+ showFiltersTab = true
4567
4644
  }) => {
4568
4645
  const [map, setMap] = (0, import_react8.useState)(null);
4569
4646
  const [loadingMap, setLoadingMap] = (0, import_react8.useState)(false);
@@ -4949,20 +5026,21 @@ var ZenitLayerManager = ({
4949
5026
  controller.abort();
4950
5027
  };
4951
5028
  }, [activeCatalogKey, activeTab, catalogByLayerField, catalogFieldsByLayer, client.layers, extractCatalogFieldMap, filterFieldWhitelist, selectedFilterField, selectedFilterLayer]);
4952
- const handleApplyFilter = import_react8.default.useCallback(async () => {
4953
- if (!selectedFilterLayer || !selectedFilterField || !selectedFilterValue || !onApplyLayerFilter) return;
5029
+ const handleApplyFilter = import_react8.default.useCallback(async (valueOverride) => {
5030
+ const value = valueOverride ?? selectedFilterValue;
5031
+ if (!selectedFilterLayer || !selectedFilterField || !value || !onApplyLayerFilter) return;
4954
5032
  setApplyingFilter(true);
4955
5033
  setFilterError(null);
4956
5034
  try {
4957
5035
  await onApplyLayerFilter({
4958
5036
  layerId: selectedFilterLayer.mapLayer.layerId,
4959
5037
  field: selectedFilterField,
4960
- value: selectedFilterValue
5038
+ value
4961
5039
  });
4962
5040
  setAppliedFilter({
4963
5041
  layerId: selectedFilterLayer.mapLayer.layerId,
4964
5042
  field: selectedFilterField,
4965
- value: selectedFilterValue
5043
+ value
4966
5044
  });
4967
5045
  } catch (error) {
4968
5046
  const message = error instanceof Error ? error.message : "No se pudo aplicar el filtro";
@@ -5341,7 +5419,7 @@ var ZenitLayerManager = ({
5341
5419
  ]
5342
5420
  }
5343
5421
  ),
5344
- !hasPrefilters && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
5422
+ !hasPrefilters && showFiltersTab && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
5345
5423
  "button",
5346
5424
  {
5347
5425
  type: "button",
@@ -5376,7 +5454,7 @@ var ZenitLayerManager = ({
5376
5454
  ) }),
5377
5455
  renderLayerCards()
5378
5456
  ] }),
5379
- !hasPrefilters && activeTab === "filters" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "zlm-filter-panel", style: { display: "flex", flexDirection: "column", gap: 12, background: "#fff", border: "1px solid #e2e8f0", borderRadius: 12, padding: 12 }, children: !filterableLayers.length ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { color: "#64748b", fontSize: 13 }, children: "No hay filtros disponibles para las capas de este mapa." }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
5457
+ !hasPrefilters && showFiltersTab && activeTab === "filters" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "zlm-filter-panel", style: { display: "flex", flexDirection: "column", gap: 12, background: "#fff", border: "1px solid #e2e8f0", borderRadius: 12, padding: 12 }, children: !filterableLayers.length ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { color: "#64748b", fontSize: 13 }, children: "No hay filtros disponibles para las capas de este mapa." }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
5380
5458
  filterableLayers.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("label", { style: { display: "flex", flexDirection: "column", gap: 6, fontSize: 12, color: "#475569" }, children: [
5381
5459
  "Capa",
5382
5460
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
@@ -5415,7 +5493,10 @@ var ZenitLayerManager = ({
5415
5493
  value: selectedFilterValue,
5416
5494
  placeholder: "Seleccionar\u2026",
5417
5495
  searchPlaceholder: "Buscar valor\u2026",
5418
- onChange: (nextValue) => setSelectedFilterValue(nextValue),
5496
+ onChange: (nextValue) => {
5497
+ setSelectedFilterValue(nextValue);
5498
+ if (nextValue) handleApplyFilter(nextValue);
5499
+ },
5419
5500
  options: activeCatalogValues,
5420
5501
  disabled: loadingCatalog || activeCatalogValues.length === 0
5421
5502
  }
@@ -5437,7 +5518,7 @@ var ZenitLayerManager = ({
5437
5518
  type: "button",
5438
5519
  className: "zlm-panel-toggle",
5439
5520
  disabled: !selectedFilterValue || applyingFilter || !onApplyLayerFilter,
5440
- onClick: handleApplyFilter,
5521
+ onClick: () => handleApplyFilter(),
5441
5522
  children: applyingFilter ? "Aplicando\u2026" : "Aplicar"
5442
5523
  }
5443
5524
  ),