Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
5062246
Add support for parallel lines with miter offset / all-of in styles
Waguramu May 12, 2026
1178ce7
Release 2026.3.0
josephbirkner May 12, 2026
3157404
Fix zoom to feature
Waguramu May 18, 2026
3a3d5cb
Add focus to panels/dialogs and zoom to selections fro
Waguramu May 19, 2026
09702bb
Cache datasource info in deck workers.
josephbirkner May 20, 2026
92ee89d
Make feature search dockable
Waguramu May 21, 2026
e3dd522
Multiple search with completion
Waguramu May 21, 2026
2161c3e
Fix visual bugs and paddings
Waguramu May 22, 2026
dab672a
Allow adding and deleting rules and conditions
Waguramu May 22, 2026
583f8a6
Small adjustments + more color mockups
Waguramu May 22, 2026
c358510
Merge pull request #393 from ndsev/dockable-searches
josephbirkner May 22, 2026
b65004d
Merge pull request #392 from ndsev/parallel-lines
josephbirkner May 22, 2026
e5f3054
search: Use backend search and schema-based completion.
josephbirkner May 26, 2026
fae65a1
search: Move towards virtual quadtree.
josephbirkner May 27, 2026
11dbae3
search: wire streamed result visualization
josephbirkner May 27, 2026
aa1c1a2
Split up the MapDataService
josephbirkner May 28, 2026
de64448
Implement PR review feedback.
josephbirkner May 29, 2026
b96ede8
Merge pull request #394 from ndsev/mapdata-service-refactor
josephbirkner May 29, 2026
957edf6
Add style color component
Waguramu May 29, 2026
fa7df17
Fixes
Waguramu May 31, 2026
182ecb2
Expose schema-aware search diagnostics
josephbirkner May 29, 2026
caf0d00
Use schema-aware search scope and ordered tiles
josephbirkner May 29, 2026
4452234
Add polygon hole support.
josephbirkner Jun 2, 2026
87d52ea
Polygon hole cleanup.
josephbirkner Jun 2, 2026
159c9c4
* Fix the enabled control - as a toggle
Waguramu Jun 2, 2026
05e148e
Fix the config
Waguramu Jun 2, 2026
af826e9
* Add shared app confirmation popup abstraction with severity icons a…
Waguramu Jun 2, 2026
9d8ed3e
Fix View drop-down sizing
Waguramu Jun 2, 2026
e74486e
Fix View dropdown
Waguramu Jun 2, 2026
4bb690a
Fix search results disappearing on map panel de-selections
Waguramu Jun 2, 2026
907215b
feat(inspection): focus attribute validity targets
josephbirkner Jun 3, 2026
eeb61db
fix(ui): keep inspection headers draggable
josephbirkner Jun 3, 2026
458a5d6
feat(search): stream server result diagnostics
josephbirkner Jun 3, 2026
151a53c
feat(search): render result overlays by tile priority
josephbirkner Jun 3, 2026
1066ce1
feat(search): add schema driven visualization UI
josephbirkner Jun 3, 2026
9029c08
Move search schema analysis to workers
josephbirkner Jun 4, 2026
3693bb1
Stream server search result ingress
josephbirkner Jun 4, 2026
2ce2896
Add configurable search result visualization
josephbirkner Jun 4, 2026
5d55826
Add inspection-driven search and highlights
josephbirkner Jun 4, 2026
c64fd4a
Document search and inspection workflows
josephbirkner Jun 4, 2026
b47b644
Add geolocation search
Waguramu Jun 4, 2026
2f24a38
Level multiselect added, default [13], no filter/select-all.
Waguramu Jun 4, 2026
7af5f1c
Fix copying search paths
Waguramu Jun 5, 2026
478e9fd
Implement streamed schema-backed search
josephbirkner Jun 8, 2026
9020f4a
Document Search 2.0 workflows
josephbirkner Jun 8, 2026
869fbfe
- Keep search panel mounted across wide/mobile menubar changes.
Waguramu Jun 8, 2026
8f1f1f7
Fix features search tree select for map layers
Waguramu Jun 8, 2026
405c7da
Update package lock file
Waguramu Jun 8, 2026
eb0c59a
Fix GH workflow
Waguramu Jun 8, 2026
20ab252
Update lock file with npm 11.16
Waguramu Jun 8, 2026
26e0289
Render validity point clouds as points
josephbirkner Jun 8, 2026
25995ce
Fix docked search styling
josephbirkner Jun 8, 2026
59cb9d5
Revert "Fix docked search styling"
Waguramu Jun 8, 2026
adabe99
Fix AppPanel / AppSurfaceHeader layout
Waguramu Jun 8, 2026
647df52
Fix p-tree padding
Waguramu Jun 8, 2026
3899a8c
Fix default colors for dropdowns
Waguramu Jun 8, 2026
9ca7bc9
Fix visualizations tab in search
Waguramu Jun 8, 2026
1dae092
Merge pull request #402 from ndsev/app-panel-header
Waguramu Jun 8, 2026
691fe00
Change default opacity from 40 to 60 percent
Waguramu Jun 8, 2026
5ca1a85
Finalize schema-normalized feature search UX
josephbirkner Jun 9, 2026
410ba9e
Use mapget release 2026.3.0
josephbirkner Jun 9, 2026
a5d3d95
Fix release CI dependencies
josephbirkner Jun 9, 2026
82c2818
Harden Playwright integration CI
josephbirkner Jun 9, 2026
be08cef
Fix Playwright release integration tests
josephbirkner Jun 9, 2026
07db724
Install UUID headers for Playwright mapget wheel
josephbirkner Jun 9, 2026
0ac19c4
Fix standalone Playwright config snapshots
josephbirkner Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 20 additions & 4 deletions .github/workflows/build-playwright.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
submodules: recursive

Expand All @@ -25,13 +25,13 @@ jobs:
- name: Install build dependencies (ninja, git-lfs, mesa software rendering, xvfb)
run: |
sudo apt-get update
sudo apt-get install -y ninja-build git-lfs libgl1-mesa-dri mesa-vulkan-drivers xvfb
sudo apt-get install -y ninja-build git-lfs libgl1-mesa-dri mesa-vulkan-drivers uuid-dev xvfb

- name: Initialize Git LFS
run: git lfs install

- name: Set up Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: "24.x"
cache: "npm"
Expand Down Expand Up @@ -71,9 +71,25 @@ jobs:
- name: Set up mapget
run: |
python3 -m venv venv
./venv/bin/pip install mapget
MAPGET_SOURCE="$GITHUB_WORKSPACE/build/_deps/mapget-src"
if [[ ! -d "$MAPGET_SOURCE" ]]; then
echo "Expected CMake-fetched mapget source at $MAPGET_SOURCE" >&2
exit 1
fi

cmake -S "$MAPGET_SOURCE" -B "$GITHUB_WORKSPACE/build/mapget-wheel" -GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DMAPGET_WITH_WHEEL=ON \
-DMAPGET_WITH_SERVICE=ON \
-DMAPGET_WITH_HTTPLIB=ON \
-DMAPGET_ENABLE_TESTING=OFF \
-DMAPGET_BUILD_EXAMPLES=OFF
cmake --build "$GITHUB_WORKSPACE/build/mapget-wheel" --target wheel -- -j"$(nproc)"
./venv/bin/pip install "$GITHUB_WORKSPACE"/build/mapget-wheel/bin/wheel/mapget-*.whl
./venv/bin/pip show mapget

- name: Run Playwright integration tests (with coverage)
timeout-minutes: 35
run: |
source ./venv/bin/activate
EB_FIREFOX_HEADED=1 xvfb-run -a $GITHUB_WORKSPACE/ci/run-integration-with-venv-mapget.sh
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/build-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
submodules: recursive

- name: Use Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: "24.x"
cache: "npm"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
submodules: recursive

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/build-vitest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
submodules: recursive

Expand All @@ -31,7 +31,7 @@ jobs:
run: git lfs install

- name: Set up Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: "24.x"
cache: "npm"
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2026.2.1
2026.3.0
5 changes: 4 additions & 1 deletion angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,10 @@
"app/styles.scss"
],
"scripts": [],
"webWorkerTsConfig": "tsconfig.worker.json"
"webWorkerTsConfig": "tsconfig.worker.json",
"allowedCommonJsDependencies": [
"earcut"
]
},
"configurations": {
"production": {
Expand Down
20 changes: 16 additions & 4 deletions app/app.component.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import {Component, OnDestroy, ViewContainerRef} from '@angular/core';
import {HttpClient} from "@angular/common/http";
import {MapDataService} from "./mapdata/map.service";
import {MapInfoService} from "./mapdata/map-info.service";
import {MapTileStreamService} from "./mapdata/map-tile-stream.service";
import {
AppStateService,
DIAGNOSTICS_EXPORT_DIALOG_LAYOUT_ID,
DIAGNOSTICS_LOG_DIALOG_LAYOUT_ID,
DIAGNOSTICS_PERFORMANCE_DIALOG_LAYOUT_ID,
FEATURE_SEARCH_EXPORT_DIALOG_LAYOUT_ID,
Versions
} from "./shared/appstate.service";
import {DebugWindow, ErdblickDebugApi} from "./app.debugapi.component";
Expand All @@ -15,6 +17,7 @@ import {DialogStackService} from "./shared/dialog-stack.service";
import {Title} from "@angular/platform-browser";
import {KeyboardService} from "./shared/keyboard.service";
import {AppConfigService} from "./shared/app-config.service";
import {StyleService} from "./styledata/style.service";

// Redeclare window with extended interface
declare let window: DebugWindow;
Expand All @@ -37,7 +40,11 @@ declare let window: DebugWindow;
<diagnostics-export-dialog></diagnostics-export-dialog>
}
<style-panel></style-panel>
<feature-search></feature-search>
<inspection-dialogs></inspection-dialogs>
<feature-search-dialogs></feature-search-dialogs>
@if (stateService.isDialogOpen(featureSearchExportDialogLayoutId)) {
<feature-search-export-dialog></feature-search-export-dialog>
}
<keyboard-dialog></keyboard-dialog>
<preferences></preferences>
<survey></survey>
Expand Down Expand Up @@ -72,6 +79,7 @@ export class AppComponent implements OnDestroy {
protected readonly diagnosticsPerformanceDialogLayoutId = DIAGNOSTICS_PERFORMANCE_DIALOG_LAYOUT_ID;
protected readonly diagnosticsLogDialogLayoutId = DIAGNOSTICS_LOG_DIALOG_LAYOUT_ID;
protected readonly diagnosticsExportDialogLayoutId = DIAGNOSTICS_EXPORT_DIALOG_LAYOUT_ID;
protected readonly featureSearchExportDialogLayoutId = FEATURE_SEARCH_EXPORT_DIALOG_LAYOUT_ID;

title: string = "erdblick";
private detachDialogFocusListener?: () => void;
Expand All @@ -81,7 +89,9 @@ export class AppComponent implements OnDestroy {

constructor(public stateService: AppStateService,
private httpClient: HttpClient,
private mapService: MapDataService,
private mapInfo: MapInfoService,
private tileStream: MapTileStreamService,
private styleService: StyleService,
private keyboardService: KeyboardService,
private viewContainerRef: ViewContainerRef,
private infoMessageService: InfoMessageService,
Expand All @@ -94,7 +104,9 @@ export class AppComponent implements OnDestroy {
this.bindDialogFocusStacking();
this.bindDialogDragSelectionGuard();
window.ebDebug = new ErdblickDebugApi(
this.mapService,
this.mapInfo,
this.tileStream,
this.styleService,
this.stateService
);

Expand Down
48 changes: 24 additions & 24 deletions app/app.debugapi.component.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import {coreLib, uint8ArrayFromWasm, ErdblickCore_} from "./integrations/wasm";
import {MapDataService} from "./mapdata/map.service";
import {MapInfoService} from "./mapdata/map-info.service";
import {MapTileStreamService} from "./mapdata/map-tile-stream.service";
import {AppStateService} from "./shared/appstate.service";
import {StyleService} from "./styledata/style.service";

type DebugHighlightMode = "none" | "hover" | "selection";
type DebugRenderer = "deck";
Expand All @@ -23,7 +25,9 @@ export class ErdblickDebugApi {
/**
* Initialize a new ErdblickDebugApi instance.
*/
constructor(private mapService: MapDataService,
constructor(private mapInfo: MapInfoService,
private tileStream: MapTileStreamService,
private styleService: StyleService,
private stateService: AppStateService) {
}

Expand Down Expand Up @@ -76,11 +80,15 @@ export class ErdblickDebugApi {
* Generate a test TileFeatureLayer, and show it.
*/
showTestTile() {
let tile = uint8ArrayFromWasm((sharedArr: any) => {
coreLib.generateTestTile(sharedArr, this.mapService.tileLayerParser);
const tile = uint8ArrayFromWasm(sharedArr => {
coreLib.generateTestTile(sharedArr, this.mapInfo.tileLayerParser);
});
if (!tile) {
console.warn("Failed to generate test tile.");
return;
}
let style = coreLib.generateTestStyle();
this.mapService.addTileFeatureLayer(tile, {
const styleEntry = {
id: "_builtin",
shortId: "TEST",
modified: false,
Expand All @@ -93,9 +101,12 @@ export class ErdblickDebugApi {
additional: false,
sourceRef: {
styleName: "_builtin",
sourceKind: "base"
sourceKind: "base" as const
}
}, true);
};
this.styleService.styles.set(styleEntry.id, styleEntry);
this.styleService.styleAddedForId.next(styleEntry.id);
this.tileStream.addTileFeatureLayer(tile, true);
}

/**
Expand All @@ -105,29 +116,18 @@ export class ErdblickDebugApi {
return coreLib;
}

/** Run some simfil query to reproduce problems with search. */
runSimfilQuery(query: string = "**.transition") {
for (const [_, tile] of this.mapService.loadedTileLayers) {
tile.peek(parsedTile => {
let search = new coreLib.FeatureLayerSearch(parsedTile);
const matchingFeatures = search.filter(query);
search.delete();
})
}
}

mapTileKey(mapId: string, layerId: string, tileId: string | number | bigint): string {
const numericTileId = typeof tileId === "bigint" ? tileId : BigInt(tileId);
return coreLib.getTileFeatureLayerKey(mapId, layerId, numericTileId) as string;
}

/** Ensures a feature tile is loaded before a console-side debugging action uses it. */
async ensureTileLoaded(mapTileKey: string) {
const existing = this.mapService.loadedTileLayers.get(mapTileKey);
const existing = this.tileStream.loadedTileLayers.get(mapTileKey);
if (existing?.hasData()) {
return existing;
}
const loaded = await this.mapService.loadTiles(new Set([mapTileKey]));
const loaded = await this.tileStream.loadTiles(new Set([mapTileKey]));
return loaded.get(mapTileKey) ?? null;
}

Expand All @@ -136,7 +136,7 @@ export class ErdblickDebugApi {
mapTileKey: string,
featureId: string,
keyFilter: string = "") {
const tile = this.mapService.loadedTileLayers.get(mapTileKey);
const tile = this.tileStream.loadedTileLayers.get(mapTileKey);
if (!tile?.hasData()) {
return {error: `Tile ${mapTileKey} is not loaded.`};
}
Expand Down Expand Up @@ -215,11 +215,11 @@ export class ErdblickDebugApi {
featureIdSubset: string[],
_renderer: DebugRenderer = "deck",
mode: DebugHighlightMode = "hover") {
const tile = this.mapService.loadedTileLayers.get(mapTileKey);
const tile = this.tileStream.loadedTileLayers.get(mapTileKey);
if (!tile?.hasData()) {
return {error: `Tile ${mapTileKey} is not loaded.`};
}
const style = this.mapService.styleService.styles.get(styleId);
const style = this.styleService.styles.get(styleId);
if (!style) {
return {error: `Style ${styleId} is not loaded.`};
}
Expand All @@ -230,7 +230,7 @@ export class ErdblickDebugApi {
? coreLib.HighlightMode.NO_HIGHLIGHT
: coreLib.HighlightMode.HOVER_HIGHLIGHT;

const styleOptions = this.mapService.maps.getLayerStyleOptions(
const styleOptions = this.mapInfo.maps.getLayerStyleOptions(
0,
tile.mapName,
tile.layerName,
Expand Down
Loading
Loading