Commit 4ff4f66
Feature/architecture domain services (#4351)
* build(visualization): install dependency-cruiser
Add dependency-cruiser for enforcing architecture rules and detecting
circular dependencies in the codebase.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(visualization): add architecture rules with dependency-cruiser
Configure dependency-cruiser to enforce feature-based architecture:
- Detect circular dependencies (warn for now, will be error later)
- Enforce feature isolation (services only accessible within feature)
- Prevent types from importing from services/stores/effects
- Only allow stores to inject @ngrx/store
Add npm scripts:
- lint:architecture: Check architecture violations
- lint:architecture:graph: Generate HTML dependency graph
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(visualization): create globalSettings feature with domain services
Implement new feature-based architecture for globalSettings using
domain-focused services with clear business meaning.
Structure:
- services/: 8 domain services (DisplayQuality, MapLayout, BackgroundTheme,
FlatBuildingVisibility, AutomaticCameraReset, ScreenshotDestination,
ExperimentalFeatures, ResetSettings)
- stores/: Store wrappers (only place that injects @ngrx/store)
- selectors/: Feature-owned selectors
- components/: UI components migrated from old location
- facade.ts: Public API for external features
Architecture flow: Components → Services → Stores → @ngrx/store
Each service represents a single domain concept using domain language
that describes WHAT it does, not HOW it's implemented.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(visualization): update old components to use domain services
Update components in old location (ui/toolBar/globalConfigurationButton)
to use new domain services instead of unified GlobalSettingsService.
Components now inject specific domain services they need:
- DisplayQualitySelectionComponent → DisplayQualityService
- MapLayoutSelectionComponent → MapLayoutService
- GlobalConfigurationDialogComponent → 5 domain services
- ResetSettingsButtonComponent → ResetSettingsService
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(visualization): update external usages to import from facade
Update external files to import selectors from globalSettings facade
instead of scattered selector files.
Updated files:
- ui/codeMap/codeMap.component.ts
- ui/codeMap/threeViewer/threeRenderer.service.ts
- ui/screenshotButton/screenshotButton.component.ts
- state/effects/autoFitCodeMapChange/*.ts
All imports now go through the feature facade for better encapsulation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(visualization): remove old selector files
Delete old selector files that have been moved to globalSettings feature.
Removed files:
- screenshotToClipboardEnabled.selector.ts
- experimentalFeaturesEnabled.selector.ts
- isWhiteBackground.selector.ts
- hideFlatBuildings.selector.ts
- resetCameraIfNewFileIsLoaded.selector.ts
- layoutAlgorithm.selector.ts
- maxTreeMapFiles.selector.ts
- sharpnessMode.selector.ts
These selectors are now owned by the globalSettings feature and
exported through its facade.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(visualization): remove comments from globalSettings feature
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(visualization): convert globalSettings facade to service
Transform facade from exporting selectors/services to a proper service
that exposes methods. External features now use facade service methods
instead of direct selector imports.
Changes:
- Create GlobalSettingsFacade service with methods wrapping domain services
- Update all external usages to inject facade and call methods
- Update spec files to mock facade service
- Keep selectors file for internal use (e.g., combineLatest in effects)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* test(visualization): add comprehensive test coverage for globalSettings feature
- Add selector tests (1 file, 16 tests)
- Add store tests (8 files, ~40 tests total)
- Add service tests (8 files, ~40 tests total)
- Add/recreate component tests (7 files, ~80 tests total)
Fixes:
- Add State and Store providers to component tests
- Fix input validation tests using direct value assignment
- Fix keyboard accessibility test with selectOptions
- Fix multiple button selection issues
- Add missing selector imports to autoFitCodeMap and screenshotButton
- Fix facade mock in autoFitCodeMap to use BehaviorSubject
- Export selectors from facade for backward compatibility
All tests passing: 355 test suites, 1887 tests
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* style(visualization): fix BiomeJS lint errors in test files
Remove unused imports and variables from globalSettings tests and autoFitCodeMap effect tests.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Delete visualization/.claude/settings.local.json
* fix(visualization): use proper Three.js imports in test files
Replace internal Three.js source path imports (three/src/...) with
proper package exports to fix test failures after npm ci.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(visualization): remove unused GlobalConfigurationButtonComponent export from facade
The GlobalConfigurationButtonComponent was exported from the facade but never imported from there. All usages already import it directly from the component file.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(visualization): remove selector exports from globalSettings facade
Components and tests now use the GlobalSettingsFacade service methods instead of importing selectors directly. This improves encapsulation and makes the facade the single point of access for global settings.
Changes:
- Updated DisplayQualitySelectionComponent to use facade methods
- Updated MapLayoutSelectionComponent to use facade methods
- Updated GlobalConfigurationDialogComponent to use facade methods
- Updated all related test files to mock the facade instead of selectors
- Removed selector exports from facade.ts
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(visualization): move GlobalConfigurationButtonComponent into its own folder
Reorganize the globalSettings feature components by moving GlobalConfigurationButtonComponent into a dedicated subfolder, matching the structure of GlobalConfigurationDialogComponent.
Changes:
- Created globalConfigurationButton/ subfolder
- Moved component files (ts, spec, html, scss) into the new folder
- Updated relative import paths in component and test files
- Updated import in toolBar.component.ts
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix button tag in globalConfigurationButton component
* refactor(visualization): remove 'as any' cast in screenshotDestination.service.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' cast in displayQuality.service.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' cast in resetSettings.service.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' cast in automaticCameraReset.service.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' cast in mapLayout.service.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' cast in flatBuildingVisibility.service.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' cast in experimentalFeatures.service.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' cast in backgroundTheme.service.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' cast in displayQualitySelection.component.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' casts in globalConfigurationButton.component.spec.ts
Replace unsafe type casts with jest.Mocked<Partial<T>> for type-safe partial mocks.
* refactor(visualization): remove 'as any' cast in resetSettingsButton.component.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' cast in mapLayoutSelection.component.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
* refactor(visualization): remove 'as any' casts in globalConfigurationDialog.component.spec.ts
Replace unsafe type casts with jest.Mocked<Partial<T>> for type-safe partial mocks.
* refactor(visualization): remove 'as any' cast in resetSettings.store.spec.ts
Replace unsafe type cast with jest.Mocked<Partial<T>> for type-safe partial mock.
---------
Co-authored-by: Christian Hühn <christian.huehn@maibornwolff.de>
Co-authored-by: Claude <noreply@anthropic.com>1 parent f026b36 commit 4ff4f66
File tree
95 files changed
+5578
-119
lines changed- .github/workflows
- plans
- visualization
- app/codeCharta
- features/globalSettings
- components
- globalConfigurationButton
- globalConfigurationDialog
- displayQualitySelection
- externalLinks
- mapLayoutSelection
- resetSettingsButton
- settingToggle
- selectors
- services
- stores
- state
- effects/autoFitCodeMapChange
- store/appSettings
- enableClipboard
- enableExperimentalFeatures
- hideFlatBuildings
- isWhiteBackground
- layoutAlgorithm
- maxTreeMapFiles
- resetCameraIfNewFileIsLoaded
- sharpnessMode
- ui
- codeMap
- threeViewer
- screenshotButton
- toolBar
- globalConfigurationButton/globalConfigurationDialog
- displayQualitySelection
- mapLayoutSelection
- viewCube
- util
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
95 files changed
+5578
-119
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
48 | 54 | | |
49 | 55 | | |
50 | 56 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
Lines changed: 170 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
0 commit comments