mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-07 23:19:14 +00:00
The summary panel's Total room area was memoised on the global config epoch: any `_saveConfig()` or adopted server config — a rename on one floor, a device or a setting — made the memo stale and the next View render ran `cleanFloorAreaSteps` over every floor again (71 portions on large-house). The area of a floor reads only its stored record, the model built from its own record and constants, so each floor's value is now memoised by the content key of those records. The key comes from the helper extracted out of the #744 reader (`floorRecordKeyMemo`, src/floor-geometry-key.ts): one fingerprint per floor and epoch, both records when a preview or a duplicate id makes them differ, and independent of the shown floor. The total is the sum of the floor values in `models` order, summed anew on every pass, so it stays bitwise equal to a fresh `totalCleanFloorAreaM2`. A failed floor is memoised as `null` until its record changes; the freshness check stays one epoch comparison; the #509 portions, skeleton and the old value on screen during a recomputation are unchanged; a lifecycle reset clears the memo. The furniture and stairs magnet keeps its epoch key by measurement (its own edits change the floor record anyway); the decision is recorded at the key. Unit: test/summary-panel-area-memo.test.mjs (AC1–AC3 on a three-floor fixture with walls, a door, a partition, a column and a stair; floors counted through the injected geometry and portions through the step generator), and test/floor-geometry-key.test.mjs for the shared key helper, now in the test build. Two registry mutants (epoch key, rooms-only key); the #744 and #509 anchors follow the moved lines. Issue: #769 User-Visible: yes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
54 lines
5.4 KiB
JSON
54 lines
5.4 KiB
JSON
{
|
|
"extends": "./tsconfig.json",
|
|
"compilerOptions": {
|
|
"module": "esnext",
|
|
"outDir": "test-build",
|
|
"noEmit": false,
|
|
"declaration": false,
|
|
"resolveJsonModule": true,
|
|
"incremental": true,
|
|
"tsBuildInfoFile": "test-build/.tsbuildinfo"
|
|
},
|
|
"include": [
|
|
"src/color.ts", "src/styles.ts", "src/styles/*.styles.ts", "src/logic.ts", "src/i18n.ts", "src/i18n/registry.ts", "src/i18n/language-runtime.ts", "src/i18n/namespace-language.ts", "src/i18n/settings.ts", "src/i18n/support.ts", "src/i18n/topology.ts", "src/i18n/tools.ts", "src/i18n/led.ts", "src/glow-blend.ts", "src/grid-scale.ts", "src/device-visual.ts", "src/device-pulse.ts", "src/device-presentation.ts", "src/device-marker-geometry.ts",
|
|
"src/device-face.ts", "src/device-hit-owner.ts", "src/device-toggle.ts", "src/marker-toggle-entity.ts", "src/activity-runtime.ts", "src/summary-runtime-loader.ts", "src/card-version.ts", "src/device-area-relocation.ts",
|
|
"src/ha-binding-status.ts",
|
|
"src/zigbee-topology-settings.ts", "src/zigbee-topology.ts", "src/zigbee-topology-geometry.ts", "src/zigbee-topology-runtime.ts", "src/zigbee-topology-style.ts",
|
|
"src/radar-model.ts", "src/radar-editor.ts", "src/radar-geometry.ts", "src/radar-setup.ts", "src/radar-render.ts",
|
|
"src/integration-provider.ts", "src/vacuum.ts", "src/vacuum-routes.ts", "src/vacuum-route-edit.ts",
|
|
"src/sun.ts", "src/moon.ts", "src/moon-gate.ts", "src/moon-runtime.ts", "src/moon-art.generated.ts",
|
|
"src/light-visibility.ts", "src/led-strip-geometry.ts", "src/led-strip-gate.ts", "src/led-strip-runtime.ts", "src/led-strip-field.ts", "src/led-strip-editor.ts", "src/led-strip-card.ts", "src/glow-scene.ts", "src/space-render.ts", "src/space-card.ts",
|
|
"src/resize.ts", "src/resize-labels.ts", "src/resize-controller.ts", "src/wall-record-preservation.ts",
|
|
"src/rules.ts", "src/device-battery.ts", "src/device-battery-settings.ts", "src/device-battery-geometry.ts",
|
|
"src/devices.ts", "src/device-inbox.ts",
|
|
"src/virtual-light-state.ts", "src/config-store.ts", "src/config-reload-authority.ts", "src/config-write-conflict.ts", "src/summary-panel.ts", "src/summary-panel-metrics.ts", "src/summary-panel-i18n.ts", "src/summary-panel-identity.ts", "src/summary-panel-picker.ts", "src/summary-panel-runtime-loaded.ts", "src/header-menu.ts", "src/iso-materials.ts", "src/iso-first-frame.ts", "src/iso-tiles.ts", "src/iso-sun.ts",
|
|
"src/backdrop-probe.ts", "src/zoom-scale-activity.ts",
|
|
"src/types.ts", "src/canvas-constants.ts", "src/editors/dialog-baseline.ts", "src/editors/color-tile-ink.ts", "src/editors/general-form-state.ts", "src/editors/moon-status.ts", "src/editors/space-form-state.ts", "src/editors/marker-form-state.ts", "src/editors/room-form-state.ts",
|
|
"src/space-geometry.ts", "src/stairs.ts", "src/clean-floor.ts", "src/floor-geometry-key.ts", "src/stairs-editor-model.ts", "src/stairs-box.ts", "src/stairs-view.ts", "src/junction-limits.ts", "src/room-gear-drag.ts",
|
|
"src/space-order.ts", "src/card-editor-validation.ts",
|
|
"src/signing.ts", "src/initial-load.ts", "src/space-model-selection.ts", "src/space-dialog.ts",
|
|
"src/visual-continuity.ts", "src/version-recovery.ts", "src/version-recovery-card.ts", "src/mode-transition.ts", "src/viewport-transition.ts", "src/boot-soft-layout.ts", "src/room-fit.ts", "src/editor-runtime-loader.ts", "src/editor-secondary.ts", "src/pointer-modality.ts", "src/touch-gesture-click-guard.ts",
|
|
"src/render-device-snapshot.ts", "src/render-invalidation.ts", "src/config-fingerprint-pass.ts", "src/houseplan-render-lifecycle.ts", "src/live-interaction-runtime.ts", "src/live-viewport.ts", "src/live-hover.ts", "src/live-editor.ts", "src/pointer-move-queue.ts",
|
|
"src/command-stack.ts", "src/device-position-history.ts",
|
|
"src/coordinate-canonicalization.ts",
|
|
"src/serialized-write-queue.ts",
|
|
"src/align-grid.ts",
|
|
"src/plan-optimizer.ts", "src/plan-optimize-write.ts", "src/optimize-plans-dialog.ts", "src/space-reference-repair.ts", "src/space-deletion.ts", "src/space-copy.ts", "src/space-copy-runtime.ts",
|
|
"src/plan-geometry-preflight.ts", "src/draft-live-preflight.ts", "src/draft-live-commit.ts",
|
|
"src/furniture.ts", "src/furniture-plan-art.generated.ts", "src/decor-assets.ts",
|
|
"src/floating-surface.ts", "src/floating-surface-controller.ts", "src/help-behavior.ts", "src/support-feedback.ts",
|
|
"src/hp-help.ts", "src/hp-dialog.ts", "src/hp-color-opacity.ts", "src/danger-confirm.ts",
|
|
"src/opening-placement.ts", "src/opening-dimensions.ts", "src/partition-openings.ts", "src/plan-snap-overlay.ts", "src/wall-face-graph.ts", "src/wall-face-repair.ts", "src/room-deletion.ts", "src/render/opening-symbol.ts",
|
|
"src/wall-thickness.ts",
|
|
"src/wall-segment-model.ts", "src/wall-face-lineage.ts",
|
|
"src/wall-merge.ts", "src/writer-fixed-point.ts", "src/room-reference-transaction.ts",
|
|
"src/physical-geometry.ts",
|
|
"src/labs.ts", "src/iso-projection.ts", "src/iso-walls.ts", "src/iso-openings.ts", "src/iso-overlays.ts", "src/iso-scene-render.ts",
|
|
"src/open-spans.ts",
|
|
"src/zero-walls.ts",
|
|
"src/editors/decor/geometry.ts",
|
|
"src/backdrop-pick.ts", "src/decor-image-editor.ts",
|
|
"src/pdf/pdf-font.generated.ts", "src/pdf/pdf-date.ts", "src/pdf/svg-path.ts", "src/pdf/pdf-writer.ts", "src/pdf/pdf-compass.ts", "src/pdf/pdf-collision.ts", "src/pdf/pdf-dimensions.ts", "src/pdf/pdf-layout.ts", "src/pdf/pdf-raster.ts", "src/pdf/pdf-scene.ts"
|
|
]
|
|
}
|