@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.
- package/ai/README.md +1 -1
- package/ai/catalog.json +18 -2
- package/ai/components/geo-map-shell.md +3 -0
- package/ai/components/geo-map.md +7 -5
- package/ai/mockup.html +2 -2
- package/esm2022/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.mjs +14 -37
- package/esm2022/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.util.mjs +38 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.mjs +25 -3
- package/esm2022/lib/figma/geo-map/geo-map.constants.mjs +13 -1
- package/esm2022/lib/figma/geo-map/geo-map.types.mjs +1 -1
- package/esm2022/lib/figma/geo-map/services/geo-map-layer.service.mjs +49 -1
- package/fesm2022/geoit-ui.mjs +132 -38
- package/fesm2022/geoit-ui.mjs.map +1 -1
- package/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.util.d.ts +16 -0
- package/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.d.ts +11 -2
- package/lib/figma/geo-map/geo-map.constants.d.ts +6 -0
- package/lib/figma/geo-map/geo-map.types.d.ts +20 -2
- package/lib/figma/geo-map/services/geo-map-layer.service.d.ts +1 -0
- package/package.json +2 -1
|
@@ -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
|
-
|
|
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.
|
|
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": {
|