mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
feat(room): «Настройки комнаты» по референсу — серия 3 из четырёх (#600)
§6 SPEC.md референса. Четыре карточки #594 остались, менялось содержимое: - Basics — Display name и Home Assistant area в одну строку из двух полей (#room-name, #room-area — контролы набора); подстановка имени из зоны при пустом имени прежняя; - Fill — «Как у пространства» стала строкой-тумблером (#room-fill-inherit, решение владельца Q4): включена — подсказка «Следует за пространством: режим»; выключена — сегмент из пяти режимов, который стартует с действующего режима пространства, а не с «None». «Свой цвет» — плашка вокруг прежнего hp-color-opacity (Q5): свотч, hex, число прозрачности, Reset у своего цвета. Границы комфорта при эффективной «Температуре» — два поля с единицей °C (#room-temp-min/-max) с плейсхолдерами границ пространства, легендой Cold / Comfort / Hot, ошибкой под полями и ссылкой «Как у пространства». Модуль room-temperature-controls.ts удалён — его разметку заменили поля набора; - Sensor sources — подзаголовки, прежний сегмент «среднее / конкретный», при конкретном — кнопка выбора в стиле селекта и панель с поиском в потоке карточки (sourcePicker набора, роль listbox/option; общая с диалогом устройства в серии 4). Кандидаты и запись прежние; - Font sizes — две строки «слайдер + число % + Reset to 100%» с концами шкалы, подсказка про размер карточек пространства, образец карточки сохранён внутри .hpf-tint (решение владельца Q2). Футер: Cancel | статус | Save; в create — Keep as walls слева. К10: снимок черновика при _openRoomEdit (room-form-state.ts поверх dialog-baseline), в edit Save только при изменениях, закрытие с изменениями спрашивает через _confirmDanger; в create Save по прежнему условию (имя или зона), отмена без вопроса — она и раньше значила «не создавать» и возвращала контур на план. Ошибки черновика: имя (edit) / имя-или-зона (create), нечисло в границах — подпись под полем, «Review N fields» в футере ведёт к первому полю. Из eager-листа dialogs.styles.ts удалены .roomtemprange*, .roomdialog .srcrow и .dropbtn; `overflow-x: hidden` у .body убран — скроллер один (К3). Смоки переписаны осознанно, с пометкой #600: smoke_room_settings (тумблер вместо радио, #room-name/#room-area, .hpf-panel .hpf-cand, старт сегмента с режима пространства), smoke_room_temperature_thresholds (.hpf-temprange, ссылка сброса). Golden-harness room-temperature — те же селекторы. Новый фокусный свидетель demo/smoke_room_settings_form.mjs: четыре карточки без старой разметки, имя и зона в одну строку, оболочка 560 и один скроллер, тумблер/сегмент/плашка/границы/источники/размеры пишут в свои ключи, Save и вопрос при закрытии, create-режим, семь полос экранов. Мутанты: room-save-enabled-without-changes, room-discard-without-asking, room-fill-segment-starts-at-none, room-temp-min-writes-max. Якорь form-kit-writes-to-a-neighbour-key прежний. smoke-links: символ roomTemperatureControls заменён на renderRoomSettingsDialog. Словарь i18n/settings: девять ключей room.* на четыре локали; в основном каталоге room.area_label без «(unassigned)». Фикстуры листа диалогов набора пересняты намеренно (панель — байт в байт, AC11). Бюджет: стартовый граф 290 575 — потолок ОПУЩЕН 292 200 → 291 600 (ушли CSS диалога комнаты и модуль границ); ленивый редакторский 239 391 — потолок 238 600 → 240 100 с разбором в bundle-budget.mjs. Гейты: typecheck, build, bundle:sync (три копии байт в байт), npm test 2790+ pass по четырём частям, mutation-gate --check, смоки: room_settings, room_settings_form, room_temperature_thresholds, editor_tabs, font_scales, resize_labels, room_autoclose, binding_ui, color_picker_consumers, lazy_editor_chunk, space_settings_form, general_settings_form, ux_fixes, settings_dialog_cards, dialog_footer_width. Issue: #600 User-Visible: no
This commit is contained in:
@@ -10391,6 +10391,53 @@ const MUTANT_DEFINITIONS = [
|
||||
replace: ' if (this.embedded && this.savedEnabled) return this._renderEmbedded();',
|
||||
}],
|
||||
},
|
||||
{
|
||||
id: 'room-save-enabled-without-changes',
|
||||
guard: 'node demo/smoke_room_settings_form.mjs',
|
||||
because: '#600 К10/AC6 (Q1) для «Настроек комнаты»: в edit Save активен только при '
|
||||
+ 'изменениях; без dirty футер снова врёт о том, есть ли что сохранять',
|
||||
patches: [{
|
||||
file: 'src/editors/room-settings-dialog.ts',
|
||||
find: ' const canSave = problems.length === 0 && tempValid && (edit ? dirty : true);',
|
||||
replace: ' const canSave = problems.length === 0 && tempValid;',
|
||||
}],
|
||||
},
|
||||
{
|
||||
id: 'room-discard-without-asking',
|
||||
guard: 'node demo/smoke_room_settings_form.mjs',
|
||||
because: '#600 К10 (Q1): закрытие диалога комнаты с изменениями обязано спросить. '
|
||||
+ 'Перевёрнутое условие закрывает «грязный» диалог молча и спрашивает у чистого',
|
||||
patches: [{
|
||||
file: 'src/editors/room-settings-dialog.ts',
|
||||
find: " if (!edit || !dirty) { close(); return; }",
|
||||
replace: " if (!edit || dirty) { close(); return; }",
|
||||
}],
|
||||
},
|
||||
{
|
||||
id: 'room-fill-segment-starts-at-none',
|
||||
guard: 'node demo/smoke_room_settings_form.mjs',
|
||||
because: '#600 Q4 (решение владельца): при выключении «Как у пространства» сегмент '
|
||||
+ 'стартует с действующего режима пространства, а не с «None» — человек видит то, '
|
||||
+ 'что уже действует, и меняет дальше. Старт с None выключил бы заливку комнаты '
|
||||
+ 'одним щелчком тумблера',
|
||||
patches: [{
|
||||
file: 'src/editors/room-settings-dialog.ts',
|
||||
find: " onChange: (v) => setFill(v ? '' : startMode()),",
|
||||
replace: " onChange: (v) => setFill(v ? '' : 'none'),",
|
||||
}],
|
||||
},
|
||||
{
|
||||
id: 'room-temp-min-writes-max',
|
||||
guard: 'node demo/smoke_room_settings_form.mjs',
|
||||
because: '#600 К1/AC3: два одинаковых поля с единицей °C рядом — нижняя граница обязана '
|
||||
+ 'писать в _roomTempMin. Утечка в соседний ключ на глаз незаметна: диапазон всё '
|
||||
+ 'равно нормализуется при чтении, и в конфиг уедет не та пара',
|
||||
patches: [{
|
||||
file: 'src/editors/room-settings-dialog.ts',
|
||||
find: " onInput: (raw) => { host._roomTempMin = raw; host.requestUpdate(); },",
|
||||
replace: " onInput: (raw) => { host._roomTempMax = raw; host.requestUpdate(); },",
|
||||
}],
|
||||
},
|
||||
{
|
||||
id: 'form-kit-segment-drops-radio-semantics',
|
||||
guard: 'node --test test/form-kit.test.mjs',
|
||||
|
||||
Reference in New Issue
Block a user