Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
25e5960
release: prepare 2026.3.1
josephbirkner Jun 17, 2026
5eed3db
Handle BigInt inspection search values
josephbirkner Jun 22, 2026
e01c386
Support interactive datasource catalog updates
josephbirkner Jun 25, 2026
6264d19
Fix search auto-style field selection
josephbirkner Jun 25, 2026
8157546
Polish maps panel tree layout
josephbirkner Jun 25, 2026
5b7a52f
Adapt search schema integration to LayerSchema
josephbirkner Jun 30, 2026
f59f8a6
Validate style option identifiers
josephbirkner Jun 30, 2026
d795314
Sync bundled app configuration
josephbirkner Jun 30, 2026
a133be9
Improve dock resize rendering
josephbirkner Jun 30, 2026
cecd099
Revert "Sync bundled app configuration"
josephbirkner Jun 30, 2026
271b84d
- Add inspection-tree expand/collapse-all controls with restore sta…
Waguramu Jun 23, 2026
43bb489
Add tile diagnostics option in context menu
Waguramu Jun 30, 2026
d9219d4
Refactor SCSS styles. Add File menu
Waguramu Jun 30, 2026
c280816
Add URLv2. Add split SCSS styles
Waguramu Jun 30, 2026
b3c6d42
Reorder menu
Waguramu Jun 30, 2026
ac460f5
Add info to tile threshold preferences. Update export menus
Waguramu Jun 30, 2026
ebedbe8
Remove tooltips from menu
Waguramu Jun 30, 2026
c01df04
Fix visualization tests
Waguramu Jun 30, 2026
3685fd0
Remove tile threshold function. Fix vitests.
Waguramu Jun 30, 2026
903268c
- Add configurable single low-fi tile threshold in app state and pref…
Waguramu Jul 1, 2026
ba3f92f
Revert config
Waguramu Jul 1, 2026
2fc333f
Remove GeoJSON export and inspection export service
Waguramu Jul 1, 2026
0b853c9
- Revert visualization-base.cpp relation dedupe/two-way logic back to…
Waguramu Jul 1, 2026
1f286df
Maintain the state of expansion controls
Waguramu Jul 1, 2026
77d91f2
Update npm packages
Waguramu Jul 1, 2026
308cfb7
Merge pull request #435 from ndsev/bugfixes
Waguramu Jul 1, 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
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2026.3.0
2026.3.1
16 changes: 3 additions & 13 deletions app/app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ 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";
import {DiagnosticsFacadeService} from "./diagnostics/diagnostics.facade.service";

// Redeclare window with extended interface
declare let window: DebugWindow;
Expand Down Expand Up @@ -54,18 +55,6 @@ declare let window: DebugWindow;
<about-dialog></about-dialog>
<router-outlet></router-outlet>
`,
styles: [`
.dialog-content {
margin-bottom: 0.5em;
}

@media only screen and (max-width: 56em) {
.elevated {
bottom: 3.5em;
padding-bottom: 0;
}
}
`],
standalone: false
})
/**
Expand Down Expand Up @@ -97,6 +86,7 @@ export class AppComponent implements OnDestroy {
private infoMessageService: InfoMessageService,
private dialogStack: DialogStackService,
private configService: AppConfigService,
private diagnostics: DiagnosticsFacadeService,
private titleService: Title) {
// Register a default container for alert dialogs
this.infoMessageService.registerDefaultContainer(this.viewContainerRef);
Expand Down Expand Up @@ -255,7 +245,7 @@ export class AppComponent implements OnDestroy {

/** Opens the diagnostics performance dialog from the global keyboard shortcut. */
private openStatistics() {
this.stateService.openDialog(this.diagnosticsPerformanceDialogLayoutId);
this.diagnostics.openPerformanceDialog();
}

protected readonly environment = environment;
Expand Down
52 changes: 40 additions & 12 deletions app/app.dockable.layout.component.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import {Component, DoCheck, ElementRef, OnDestroy, Renderer2, ViewChild} from '@angular/core';
import {ChangeDetectorRef, Component, DoCheck, ElementRef, OnDestroy, Renderer2, ViewChild} from '@angular/core';
import {environment} from "./environments/environment";
import {AppStateService, INSPECTION_DOCK_TAB_ID, SEARCH_DOCK_TAB_ID} from "./shared/appstate.service";
import {FeatureSearchService, FeatureSearchSession} from "./search/feature.search.service";
import {DockedPanelDragController, DockedPanelDragOffset} from "./shared/docked-panel-drag.controller";
import {Subscription} from "rxjs";
import {MAP_VIEW_LAYOUT_RESIZE_PREPARE_EVENT} from "./mapview/render-view.model";

@Component({
selector: 'dockable-layout',
template: `
<div class="main-layout">
<div class="viewer-layout" [ngClass]="{'open': !stateService.isDockOpen, 'collapsed': stateService.isDockOpen}">
<div #viewerLayout class="viewer-layout" [ngClass]="{'open': !stateService.isDockOpen, 'collapsed': stateService.isDockOpen}">
<mapview-container></mapview-container>
@if (!environment.visualizationOnly) {
<main-bar></main-bar>
Expand Down Expand Up @@ -102,7 +104,6 @@ import {DockedPanelDragController, DockedPanelDragOffset} from "./shared/docked-
}
</div>
`,
styles: [``],
standalone: false
})
/**
Expand All @@ -116,6 +117,7 @@ export class DockableLayoutComponent implements DoCheck, OnDestroy {
private static readonly DOCK_RESIZE_PAUSE_END_EVENT = "erdblick-dock-resize-end";

@ViewChild('dock') private dockRef?: ElementRef<HTMLDivElement>;
@ViewChild('viewerLayout') private viewerLayoutRef?: ElementRef<HTMLDivElement>;
private detachMove?: () => void;
private detachUp?: () => void;
private detachCancel?: () => void;
Expand All @@ -124,15 +126,43 @@ export class DockableLayoutComponent implements DoCheck, OnDestroy {
private dockPauseEndRafFirst?: number;
private dockPauseEndRafSecond?: number;
private dockResizePauseActive = false;
private dockOpenSubscription: Subscription;
private observedDockOpen: boolean;
protected readonly searchDockDrag: DockedPanelDragController<string>;

constructor(public stateService: AppStateService,
private renderer: Renderer2,
private featureSearchService: FeatureSearchService) {
private featureSearchService: FeatureSearchService,
private cdr: ChangeDetectorRef) {
this.observedDockOpen = this.stateService.isDockOpen;
this.dockOpenSubscription = this.stateService.dockOpenState.subscribe(nextDockOpen => {
if (nextDockOpen === this.observedDockOpen) {
return;
}
this.observedDockOpen = nextDockOpen;
const viewerLayout = this.viewerLayoutRef?.nativeElement;
if (!viewerLayout) {
return;
}

this.dispatchDockResizePauseStart();
const viewerWidth = viewerLayout.getBoundingClientRect().width;
this.cdr.detectChanges();
const targetViewerWidth = viewerLayout.getBoundingClientRect().width;

if (!Number.isFinite(viewerWidth) || !Number.isFinite(targetViewerWidth) || viewerWidth <= 0
|| Math.abs(targetViewerWidth - viewerWidth) < 0.5) {
this.scheduleDockResizePauseEnd();
return;
}

window.dispatchEvent(new Event(MAP_VIEW_LAYOUT_RESIZE_PREPARE_EVENT));
this.scheduleDockResizePauseEnd();
});
this.searchDockDrag = new DockedPanelDragController<string>({
renderer: this.renderer,
baseFontSize: () => this.stateService.baseFontSize,
container: () => this.searchDockContainer(),
container: () => this.dockRef?.nativeElement.querySelector('.feature-search-dock-container') ?? null,
itemSelector: 'feature-search',
readId: element => element.dataset['surfaceId'],
previewClass: 'app-dock-drag-preview',
Expand All @@ -150,11 +180,9 @@ export class DockableLayoutComponent implements DoCheck, OnDestroy {
protected readonly inspectionDockTabId = INSPECTION_DOCK_TAB_ID;
protected readonly searchDockTabId = SEARCH_DOCK_TAB_ID;

/** Toggles dock visibility and emits resize-pause events around the transition. */
/** Toggles dock visibility; the dock-open subscription performs the resize preparation. */
protected toggleDock() {
this.dispatchDockResizePauseStart();
this.stateService.isDockOpen = !this.stateService.isDockOpen;
this.scheduleDockResizePauseEnd();
}

protected dockedInspectionCount(): number {
Expand Down Expand Up @@ -203,13 +231,17 @@ export class DockableLayoutComponent implements DoCheck, OnDestroy {
this.detachMove?.();
this.detachUp?.();
this.detachCancel?.();
this.dockOpenSubscription.unsubscribe();
this.searchDockDrag.destroy();
this.clearScheduledDockResizePauseEnd();
this.dispatchDockResizePauseEnd();
}

/** Closes the right-hand dock without changing any surface dock state. */
protected closeDock() {
if (!this.stateService.isDockOpen) {
return;
}
this.stateService.isDockOpen = false;
}

Expand All @@ -230,10 +262,6 @@ export class DockableLayoutComponent implements DoCheck, OnDestroy {
this.featureSearchService.setSessionDocked(searchId, false);
}

private searchDockContainer(): HTMLElement | null {
return this.dockRef?.nativeElement.querySelector('.feature-search-dock-container') ?? null;
}

/** Starts a manual dock resize interaction from the resize handle. */
onResizeStart(ev: PointerEvent) {
if (!this.stateService.isDockOpen || !this.dockRef) {
Expand Down
Loading
Loading