@geoit/ui 0.1.0 → 0.2.0

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.
@@ -0,0 +1,16 @@
1
+ import { GeoMapController } from '../../geo-map.controller';
2
+ import type { GeoMapLocateErrorReason } from '../../geo-map.types';
3
+ export interface GeoMapLocateCallbacks {
4
+ onLocated?: (lonLat: [number, number]) => void;
5
+ onDenied?: () => void;
6
+ onError?: (error: {
7
+ reason: GeoMapLocateErrorReason;
8
+ message?: string;
9
+ }) => void;
10
+ }
11
+ /**
12
+ * Shared browser-geolocation trigger — centers `ctrl` on the user and reports the outcome.
13
+ * Used by both `geo-map-locate` (standalone button) and `geo-map-shell`'s built-in locate
14
+ * toolbar action so the two never drift on error-reason mapping.
15
+ */
16
+ export declare function runGeoMapLocate(ctrl: GeoMapController, callbacks: GeoMapLocateCallbacks): void;
@@ -1,6 +1,6 @@
1
1
  import { GeoMapController } from '../../geo-map.controller';
2
2
  import type { GeoTreeNode } from '../../../geo-tree/geo-tree.types';
3
- import type { GeoMapBasemap, GeoMapBasemapOption, GeoMapClickEvent, GeoMapLayerConfig, GeoMapLegendItem, GeoMapMeasureMode, GeoMapParcelAudience, GeoMapParcelDetail, GeoMapSearchQuery, GeoMapSearchResultItem, GeoMapToolbarAction } from '../../geo-map.types';
3
+ import type { GeoMapBasemap, GeoMapBasemapOption, GeoMapClickEvent, GeoMapLayerConfig, GeoMapLegendItem, GeoMapLocateErrorReason, GeoMapMeasureMode, GeoMapParcelAudience, GeoMapParcelDetail, GeoMapSearchQuery, GeoMapSearchResultItem, GeoMapToolbarAction } from '../../geo-map.types';
4
4
  import * as i0 from "@angular/core";
5
5
  /**
6
6
  * Map viewport + portal chrome (toolbar, layers drawer, legend, help, swipe, …).
@@ -22,6 +22,8 @@ export declare class GeoMapShellComponent {
22
22
  /** Extra overlays merged after demo thematic + traffic. */
23
23
  readonly layers: import("@angular/core").InputSignal<GeoMapLayerConfig[]>;
24
24
  readonly legendItems: import("@angular/core").InputSignal<GeoMapLegendItem[]>;
25
+ /** Host app sets true when the legend catalog (loại đất/ký hiệu/màu) failed to load. */
26
+ readonly legendCatalogMissing: import("@angular/core").InputSignal<boolean>;
25
27
  readonly showNav: import("@angular/core").InputSignal<boolean>;
26
28
  readonly includeDemoLayers: import("@angular/core").InputSignal<boolean>;
27
29
  readonly adminNodes: import("@angular/core").InputSignal<GeoTreeNode[]>;
@@ -52,7 +54,12 @@ export declare class GeoMapShellComponent {
52
54
  readonly adminExpandedKeys: import("@angular/core").ModelSignal<(string | number)[]>;
53
55
  readonly mapReady: import("@angular/core").OutputEmitterRef<GeoMapController>;
54
56
  readonly mapClick: import("@angular/core").OutputEmitterRef<GeoMapClickEvent>;
57
+ readonly located: import("@angular/core").OutputEmitterRef<void>;
55
58
  readonly locateDenied: import("@angular/core").OutputEmitterRef<void>;
59
+ readonly locateError: import("@angular/core").OutputEmitterRef<{
60
+ reason: GeoMapLocateErrorReason;
61
+ message?: string;
62
+ }>;
56
63
  readonly actionClick: import("@angular/core").OutputEmitterRef<GeoMapToolbarAction>;
57
64
  readonly search: import("@angular/core").OutputEmitterRef<GeoMapSearchQuery>;
58
65
  readonly searchReset: import("@angular/core").OutputEmitterRef<void>;
@@ -93,11 +100,13 @@ export declare class GeoMapShellComponent {
93
100
  private enterPanMode;
94
101
  private exitToolMode;
95
102
  private applyPanCursor;
103
+ /** Backing action for the `locate` toolbar entry (`GEO_MAP_LOCATE_TOOLBAR_ACTION`). */
104
+ private triggerLocate;
96
105
  private setMapCursor;
97
106
  private bindPanCursor;
98
107
  private unbindPanCursor;
99
108
  private buildDemoSearchResults;
100
109
  private ensureSwipeOverlayVisible;
101
110
  static ɵfac: i0.ɵɵFactoryDeclaration<GeoMapShellComponent, never>;
102
- static ɵcmp: i0.ɵɵComponentDeclaration<GeoMapShellComponent, "geo-map-shell", never, { "center": { "alias": "center"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "showMousePosition": { "alias": "showMousePosition"; "required": false; "isSignal": true; }; "basemapOptions": { "alias": "basemapOptions"; "required": false; "isSignal": true; }; "toolbarActions": { "alias": "toolbarActions"; "required": false; "isSignal": true; }; "layers": { "alias": "layers"; "required": false; "isSignal": true; }; "legendItems": { "alias": "legendItems"; "required": false; "isSignal": true; }; "showNav": { "alias": "showNav"; "required": false; "isSignal": true; }; "includeDemoLayers": { "alias": "includeDemoLayers"; "required": false; "isSignal": true; }; "adminNodes": { "alias": "adminNodes"; "required": false; "isSignal": true; }; "locationLabel": { "alias": "locationLabel"; "required": false; "isSignal": true; }; "parcelAudience": { "alias": "parcelAudience"; "required": false; "isSignal": true; }; "provinceExtent": { "alias": "provinceExtent"; "required": false; "isSignal": true; }; "demoSearch": { "alias": "demoSearch"; "required": false; "isSignal": true; }; "homeMode": { "alias": "homeMode"; "required": false; "isSignal": true; }; "basemapId": { "alias": "basemapId"; "required": false; "isSignal": true; }; "measureMode": { "alias": "measureMode"; "required": false; "isSignal": true; }; "checkedMap": { "alias": "checkedMap"; "required": false; "isSignal": true; }; "layersOpen": { "alias": "layersOpen"; "required": false; "isSignal": true; }; "legendOpen": { "alias": "legendOpen"; "required": false; "isSignal": true; }; "helpOpen": { "alias": "helpOpen"; "required": false; "isSignal": true; }; "swipeActive": { "alias": "swipeActive"; "required": false; "isSignal": true; }; "searchOpen": { "alias": "searchOpen"; "required": false; "isSignal": true; }; "adminFilterOpen": { "alias": "adminFilterOpen"; "required": false; "isSignal": true; }; "parcelOpen": { "alias": "parcelOpen"; "required": false; "isSignal": true; }; "managedLayers": { "alias": "managedLayers"; "required": false; "isSignal": true; }; "searchResults": { "alias": "searchResults"; "required": false; "isSignal": true; }; "selectedParcel": { "alias": "selectedParcel"; "required": false; "isSignal": true; }; "adminCheckedKeys": { "alias": "adminCheckedKeys"; "required": false; "isSignal": true; }; "adminExpandedKeys": { "alias": "adminExpandedKeys"; "required": false; "isSignal": true; }; }, { "basemapId": "basemapIdChange"; "measureMode": "measureModeChange"; "checkedMap": "checkedMapChange"; "layersOpen": "layersOpenChange"; "legendOpen": "legendOpenChange"; "helpOpen": "helpOpenChange"; "swipeActive": "swipeActiveChange"; "searchOpen": "searchOpenChange"; "adminFilterOpen": "adminFilterOpenChange"; "parcelOpen": "parcelOpenChange"; "managedLayers": "managedLayersChange"; "searchResults": "searchResultsChange"; "selectedParcel": "selectedParcelChange"; "adminCheckedKeys": "adminCheckedKeysChange"; "adminExpandedKeys": "adminExpandedKeysChange"; "mapReady": "mapReady"; "mapClick": "mapClick"; "locateDenied": "locateDenied"; "actionClick": "actionClick"; "search": "search"; "searchReset": "searchReset"; "resultSelect": "resultSelect"; "parcelExport": "parcelExport"; "adminApply": "adminApply"; }, never, ["[geoMapShellTopRight]"], true, never>;
111
+ static ɵcmp: i0.ɵɵComponentDeclaration<GeoMapShellComponent, "geo-map-shell", never, { "center": { "alias": "center"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "showMousePosition": { "alias": "showMousePosition"; "required": false; "isSignal": true; }; "basemapOptions": { "alias": "basemapOptions"; "required": false; "isSignal": true; }; "toolbarActions": { "alias": "toolbarActions"; "required": false; "isSignal": true; }; "layers": { "alias": "layers"; "required": false; "isSignal": true; }; "legendItems": { "alias": "legendItems"; "required": false; "isSignal": true; }; "legendCatalogMissing": { "alias": "legendCatalogMissing"; "required": false; "isSignal": true; }; "showNav": { "alias": "showNav"; "required": false; "isSignal": true; }; "includeDemoLayers": { "alias": "includeDemoLayers"; "required": false; "isSignal": true; }; "adminNodes": { "alias": "adminNodes"; "required": false; "isSignal": true; }; "locationLabel": { "alias": "locationLabel"; "required": false; "isSignal": true; }; "parcelAudience": { "alias": "parcelAudience"; "required": false; "isSignal": true; }; "provinceExtent": { "alias": "provinceExtent"; "required": false; "isSignal": true; }; "demoSearch": { "alias": "demoSearch"; "required": false; "isSignal": true; }; "homeMode": { "alias": "homeMode"; "required": false; "isSignal": true; }; "basemapId": { "alias": "basemapId"; "required": false; "isSignal": true; }; "measureMode": { "alias": "measureMode"; "required": false; "isSignal": true; }; "checkedMap": { "alias": "checkedMap"; "required": false; "isSignal": true; }; "layersOpen": { "alias": "layersOpen"; "required": false; "isSignal": true; }; "legendOpen": { "alias": "legendOpen"; "required": false; "isSignal": true; }; "helpOpen": { "alias": "helpOpen"; "required": false; "isSignal": true; }; "swipeActive": { "alias": "swipeActive"; "required": false; "isSignal": true; }; "searchOpen": { "alias": "searchOpen"; "required": false; "isSignal": true; }; "adminFilterOpen": { "alias": "adminFilterOpen"; "required": false; "isSignal": true; }; "parcelOpen": { "alias": "parcelOpen"; "required": false; "isSignal": true; }; "managedLayers": { "alias": "managedLayers"; "required": false; "isSignal": true; }; "searchResults": { "alias": "searchResults"; "required": false; "isSignal": true; }; "selectedParcel": { "alias": "selectedParcel"; "required": false; "isSignal": true; }; "adminCheckedKeys": { "alias": "adminCheckedKeys"; "required": false; "isSignal": true; }; "adminExpandedKeys": { "alias": "adminExpandedKeys"; "required": false; "isSignal": true; }; }, { "basemapId": "basemapIdChange"; "measureMode": "measureModeChange"; "checkedMap": "checkedMapChange"; "layersOpen": "layersOpenChange"; "legendOpen": "legendOpenChange"; "helpOpen": "helpOpenChange"; "swipeActive": "swipeActiveChange"; "searchOpen": "searchOpenChange"; "adminFilterOpen": "adminFilterOpenChange"; "parcelOpen": "parcelOpenChange"; "managedLayers": "managedLayersChange"; "searchResults": "searchResultsChange"; "selectedParcel": "selectedParcelChange"; "adminCheckedKeys": "adminCheckedKeysChange"; "adminExpandedKeys": "adminExpandedKeysChange"; "mapReady": "mapReady"; "mapClick": "mapClick"; "located": "located"; "locateDenied": "locateDenied"; "locateError": "locateError"; "actionClick": "actionClick"; "search": "search"; "searchReset": "searchReset"; "resultSelect": "resultSelect"; "parcelExport": "parcelExport"; "adminApply": "adminApply"; }, never, ["[geoMapShellTopRight]"], true, never>;
103
112
  }
@@ -39,6 +39,12 @@ export declare const GEO_MAP_DEFAULT_BASEMAP_OPTIONS: GeoMapBasemapOption[];
39
39
  export declare const GEO_MAP_TRAFFIC_OVERLAY: GeoMapXyzLayerConfig;
40
40
  /** Built-in toolbar actions — Figma map chrome (Dat Dai Lam Dong 2026). */
41
41
  export declare const GEO_MAP_DEFAULT_TOOLBAR_ACTIONS: GeoMapToolbarAction[];
42
+ /**
43
+ * Built-in "Vị trí của tôi" toolbar action — pair with `id: 'locate'` handling that
44
+ * `geo-map-shell` already resolves internally (geolocate + emit `located`/`locateError`).
45
+ * Not included in `GEO_MAP_DEFAULT_TOOLBAR_ACTIONS`; host apps opt in explicitly.
46
+ */
47
+ export declare const GEO_MAP_LOCATE_TOOLBAR_ACTION: GeoMapToolbarAction;
42
48
  /**
43
49
  * Demo thematic overlays for Storybook (offline-friendly GeoJSON).
44
50
  * Groups match portal layers popover: QHSDD · địa chính · hiện trạng.
@@ -1,7 +1,7 @@
1
1
  import type Feature from 'ol/Feature';
2
2
  import type Geometry from 'ol/geom/Geometry';
3
3
  /** Supported map layer source kinds. */
4
- export type GeoMapLayerType = 'osm' | 'xyz' | 'wms' | 'wmts' | 'vector' | 'geojson';
4
+ export type GeoMapLayerType = 'osm' | 'xyz' | 'wms' | 'wmts' | 'vector' | 'geojson' | 'mapbox-style';
5
5
  /** Layer load lifecycle for panel / chrome. */
6
6
  export type GeoMapLayerStatus = 'idle' | 'loading' | 'ready' | 'error';
7
7
  export interface ProjectionConfig {
@@ -75,13 +75,31 @@ export interface GeoMapVectorLayerConfig extends GeoMapLayerBase {
75
75
  /** Pre-built OL features (app-owned). */
76
76
  features?: Feature<Geometry>[];
77
77
  }
78
- export type GeoMapLayerConfig = GeoMapOsmLayerConfig | GeoMapXyzLayerConfig | GeoMapWmsLayerConfig | GeoMapWmtsLayerConfig | GeoMapGeoJsonLayerConfig | GeoMapVectorLayerConfig;
78
+ /**
79
+ * Vector basemap driven by a Mapbox/MapLibre style document, applied via `ol-mapbox-style`.
80
+ * One of `styleJson`/`styleUrl` is required. `transformRequest` is forwarded verbatim to
81
+ * `ol-mapbox-style` — the library never inspects or stores it, so host-app auth headers
82
+ * (e.g. an API key) stay owned by the app, not the library.
83
+ */
84
+ export interface GeoMapMapboxStyleLayerConfig extends GeoMapLayerBase {
85
+ type: 'mapbox-style';
86
+ styleJson?: Record<string, unknown>;
87
+ styleUrl?: string;
88
+ transformRequest?: (url: string, resourceType: string) => Request | void;
89
+ }
90
+ export type GeoMapLayerConfig = GeoMapOsmLayerConfig | GeoMapXyzLayerConfig | GeoMapWmsLayerConfig | GeoMapWmtsLayerConfig | GeoMapGeoJsonLayerConfig | GeoMapVectorLayerConfig | GeoMapMapboxStyleLayerConfig;
79
91
  export type GeoMapBasemapInput = 'osm' | {
80
92
  type: 'xyz';
81
93
  url: string;
82
94
  attributions?: string | string[];
83
95
  maxZoom?: number;
84
96
  title?: string;
97
+ } | {
98
+ type: 'mapbox-style';
99
+ styleJson?: Record<string, unknown>;
100
+ styleUrl?: string;
101
+ title?: string;
102
+ transformRequest?: (url: string, resourceType: string) => Request | void;
85
103
  };
86
104
  /** Alias used by basemap switcher output. */
87
105
  export type GeoMapBasemap = GeoMapBasemapInput;
@@ -37,6 +37,7 @@ export declare class GeoMapLayerService {
37
37
  private createWmtsLayer;
38
38
  private createGeoJsonLayer;
39
39
  private createVectorLayer;
40
+ private createMapboxStyleLayer;
40
41
  static ɵfac: i0.ɵɵFactoryDeclaration<GeoMapLayerService, never>;
41
42
  static ɵprov: i0.ɵɵInjectableDeclaration<GeoMapLayerService>;
42
43
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geoit/ui",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "GEO UI — Angular 18 + ng-zorro design system components",
5
5
  "peerDependencies": {
6
6
  "@angular/animations": "^18.2.0",
@@ -11,6 +11,7 @@
11
11
  "@ant-design/icons-angular": "^18.0.0",
12
12
  "ng-zorro-antd": "^18.2.0",
13
13
  "ol": "^10.0.0",
14
+ "ol-mapbox-style": "^13.4.3",
14
15
  "proj4": "^2.11.0"
15
16
  },
16
17
  "dependencies": {