From c4d601bfba7f3366db832af3097964f3366c21c9 Mon Sep 17 00:00:00 2001 From: Home Assistant Version Control Date: Sun, 4 Oct 2026 05:26:42 +0000 Subject: [PATCH] 331 files --- .storage/lovelace_resources | 4 +- .../maintenance_supporter/__init__.py | 3 +- .../maintenance_supporter/const.py | 3 + .../maintenance_supporter/coordinator.py | 2 + .../__tests__/complete-dialog.test.ts | 54 +- .../task-dialog-completion-actions.test.ts | 6 +- .../components/battery-fleet-section.ts | 55 +- .../components/complete-dialog.ts | 42 +- .../frontend-src/components/group-dialog.ts | 5 +- .../components/history-edit-dialog.ts | 16 +- .../components/seasonal-overrides-dialog.ts | 5 +- .../frontend-src/components/settings-view.ts | 14 +- .../frontend-src/components/task-dialog.ts | 16 +- .../frontend-src/helpers/calendar-bucket.ts | 5 +- .../frontend-src/locales/cs.json | 16 + .../frontend-src/locales/da.json | 16 + .../frontend-src/locales/de.json | 16 + .../frontend-src/locales/en.json | 16 + .../frontend-src/locales/es.json | 16 + .../frontend-src/locales/fi.json | 16 + .../frontend-src/locales/fr.json | 16 + .../frontend-src/locales/hi.json | 16 + .../frontend-src/locales/hu.json | 16 + .../frontend-src/locales/it.json | 16 + .../frontend-src/locales/ja.json | 16 + .../frontend-src/locales/ko.json | 16 + .../frontend-src/locales/nb.json | 16 + .../frontend-src/locales/nl.json | 16 + .../frontend-src/locales/pl.json | 16 + .../frontend-src/locales/pt-br.json | 16 + .../frontend-src/locales/pt.json | 16 + .../frontend-src/locales/ru.json | 16 + .../frontend-src/locales/sv.json | 16 + .../frontend-src/locales/tr.json | 16 + .../frontend-src/locales/uk.json | 16 + .../frontend-src/locales/zh.json | 16 + .../frontend-src/maintenance-calendar-card.ts | 2 +- .../frontend-src/maintenance-panel.ts | 140 +- .../frontend-src/package-lock.json | 54 +- .../frontend-src/package.json | 8 +- .../frontend-src/panel-styles.ts | 28 +- .../frontend-src/renderers/charts.ts | 33 +- .../frontend-src/renderers/history.ts | 6 +- .../frontend-src/renderers/task-detail.ts | 6 +- .../frontend-src/styles.ts | 12 +- .../frontend-src/types.ts | 3 + .../frontend/locales/cs.json | 16 + .../frontend/locales/da.json | 16 + .../frontend/locales/de.json | 16 + .../frontend/locales/en.json | 16 + .../frontend/locales/es.json | 16 + .../frontend/locales/fi.json | 16 + .../frontend/locales/fr.json | 16 + .../frontend/locales/hi.json | 16 + .../frontend/locales/hu.json | 16 + .../frontend/locales/it.json | 16 + .../frontend/locales/ja.json | 16 + .../frontend/locales/ko.json | 16 + .../frontend/locales/nb.json | 16 + .../frontend/locales/nl.json | 16 + .../frontend/locales/pl.json | 16 + .../frontend/locales/pt-br.json | 16 + .../frontend/locales/pt.json | 16 + .../frontend/locales/ru.json | 16 + .../frontend/locales/sv.json | 16 + .../frontend/locales/tr.json | 16 + .../frontend/locales/uk.json | 16 + .../frontend/locales/zh.json | 16 + .../frontend/maintenance-calendar-card.js | 1419 +++---- .../frontend/maintenance-card.js | 530 +-- .../frontend/maintenance-panel.js | 2499 +++++++------ .../frontend/maintenance-strategy-shim.js | 4 +- .../adopt-problem-sensors-dialog-2C6DAJNM.js | 250 -- .../adopt-problem-sensors-dialog-FZCNE25E.js | 301 -- .../adopt-problem-sensors-dialog-G6OMYHFP.js | 301 -- ... adopt-problem-sensors-dialog-RQ23EE22.js} | 4 +- .../adopt-problem-sensors-dialog-YOSPIPSF.js | 271 -- .../panel-chunks/area-view-DOCESFOL.js | 277 -- ...view-JP4ZKMDQ.js => area-view-EU5UROHJ.js} | 136 +- ...iew-EIIITWEQ.js => areas-view-TVJJZL6F.js} | 4 +- .../panel-chunks/areas-view-Z6D3T47X.js | 54 - .../panel-chunks/bulk-edit-dialog-AAZ72ERS.js | 113 + .../frontend/panel-chunks/chunk-2CZ4LD2Q.js | 37 + .../frontend/panel-chunks/chunk-2IGVBRZV.js | 153 - .../frontend/panel-chunks/chunk-2PKU3QXM.js | 88 - .../frontend/panel-chunks/chunk-2SARE4MS.js | 1470 -------- .../frontend/panel-chunks/chunk-3GDXUAER.js | 1465 -------- .../frontend/panel-chunks/chunk-3UVOHVFS.js | 2 - .../frontend/panel-chunks/chunk-3WM7WAL2.js | 153 - .../frontend/panel-chunks/chunk-45NFFEKB.js | 2 - .../{chunk-B7AS4DOM.js => chunk-4CRDSGBT.js} | 4 +- .../frontend/panel-chunks/chunk-4XNVTWGC.js | 1301 ------- .../{chunk-E7KPGZZO.js => chunk-5ROMA2NQ.js} | 4 +- .../frontend/panel-chunks/chunk-5SGCD2J3.js | 2 + .../frontend/panel-chunks/chunk-5XRT3AM7.js | 2 - .../frontend/panel-chunks/chunk-63C4ZGBD.js | 2 - .../frontend/panel-chunks/chunk-6LZYA7IL.js | 2 - .../frontend/panel-chunks/chunk-6RV6BU2W.js | 2 - .../frontend/panel-chunks/chunk-73EHFI76.js | 2 - .../frontend/panel-chunks/chunk-7NJJOABV.js | 88 - .../frontend/panel-chunks/chunk-AHDRR46D.js | 234 -- .../{chunk-APJICCRG.js => chunk-AKHM2FQS.js} | 4 +- .../frontend/panel-chunks/chunk-BEGYKXHI.js | 2 + .../frontend/panel-chunks/chunk-BFBOHWBW.js | 2 - .../frontend/panel-chunks/chunk-BLR3NVGU.js | 153 - .../frontend/panel-chunks/chunk-BYGTDXRD.js | 2 - .../frontend/panel-chunks/chunk-C2DCJ26U.js | 79 - .../frontend/panel-chunks/chunk-C7OGYVZI.js | 2 - .../{chunk-4PTWLV7V.js => chunk-D4KM62SJ.js} | 4 +- .../frontend/panel-chunks/chunk-DTRCTWKY.js | 2 - .../frontend/panel-chunks/chunk-EH52ZZY4.js | 79 - .../frontend/panel-chunks/chunk-ENPF2LDM.js | 2 - .../{chunk-5YKNSANW.js => chunk-EPK25IMX.js} | 2 +- .../frontend/panel-chunks/chunk-FLCA3VKG.js | 213 -- .../frontend/panel-chunks/chunk-FQOUX6W2.js | 79 - .../frontend/panel-chunks/chunk-FR6WMAD6.js | 478 --- .../frontend/panel-chunks/chunk-G76Z2Z4C.js | 1431 ------- .../{chunk-2KTY4IVI.js => chunk-GG5NDVS4.js} | 4 +- .../frontend/panel-chunks/chunk-GGJ6YWZO.js | 2 - .../{chunk-WJT4RRLS.js => chunk-GSRF4WCQ.js} | 2 +- .../frontend/panel-chunks/chunk-GTEFDN23.js | 478 --- .../frontend/panel-chunks/chunk-GVLO7RZ4.js | 2 + .../{chunk-QLW72JHE.js => chunk-HVQDZ5QR.js} | 4 +- .../frontend/panel-chunks/chunk-I7NCFUZX.js | 2 - .../{chunk-BA7DXCPM.js => chunk-IEG2EHSV.js} | 113 +- .../frontend/panel-chunks/chunk-IRVVKPDP.js | 2 - .../frontend/panel-chunks/chunk-JE577H3E.js | 1301 ------- .../frontend/panel-chunks/chunk-JEWIFUZC.js | 2 - .../frontend/panel-chunks/chunk-K4SNNHPR.js | 2 - .../frontend/panel-chunks/chunk-KFHQ72KC.js | 969 ----- .../{chunk-CWEQFONI.js => chunk-KH4WZJRU.js} | 4 +- .../{chunk-232HSTEK.js => chunk-KR7J3CDC.js} | 19 +- .../{chunk-2U4DNN5T.js => chunk-KV46GCLQ.js} | 2 +- .../frontend/panel-chunks/chunk-LEWJHPDY.js | 2 - .../frontend/panel-chunks/chunk-LJBGBUDY.js | 2 - .../frontend/panel-chunks/chunk-MHBW3M6D.js | 2 - .../frontend/panel-chunks/chunk-MJTDRBP6.js | 2 - .../{chunk-3DX24CU6.js => chunk-MW3LIRZD.js} | 4 +- .../frontend/panel-chunks/chunk-NZPPXRKZ.js | 937 ----- .../{chunk-4OFQFCKD.js => chunk-O7BSORZB.js} | 2 +- .../frontend/panel-chunks/chunk-ODPGZXCU.js | 2 - .../frontend/panel-chunks/chunk-OTS5U34S.js | 2 - .../frontend/panel-chunks/chunk-OXPKT66L.js | 1289 ------- .../frontend/panel-chunks/chunk-P3JMRZOA.js | 2 - .../frontend/panel-chunks/chunk-PDDZINC4.js | 452 --- .../frontend/panel-chunks/chunk-PWKMLGJR.js | 2 - .../{chunk-AU57O2BC.js => chunk-QEKEY7ZD.js} | 2 +- .../frontend/panel-chunks/chunk-QOKIQTSS.js | 2 - .../{chunk-VZYRPSO6.js => chunk-R3GKJJ55.js} | 2 +- .../frontend/panel-chunks/chunk-RAW6RFRE.js | 1299 ------- .../frontend/panel-chunks/chunk-RJY4VEHX.js | 2 - .../frontend/panel-chunks/chunk-RSV5IULH.js | 88 - .../frontend/panel-chunks/chunk-RSVG7WFD.js | 79 - .../frontend/panel-chunks/chunk-S7ZP4PVX.js | 2 - .../frontend/panel-chunks/chunk-SBK5UZCL.js | 450 --- .../frontend/panel-chunks/chunk-SCLV5YEV.js | 2 - .../frontend/panel-chunks/chunk-TCEU2O2H.js | 153 - .../{chunk-2REBRMPM.js => chunk-TSU2RKSC.js} | 4 +- .../frontend/panel-chunks/chunk-UJICOAU3.js | 2 - .../frontend/panel-chunks/chunk-UN244A6U.js | 969 ----- .../frontend/panel-chunks/chunk-UVBHIULM.js | 88 - .../frontend/panel-chunks/chunk-W2HMC6OR.js | 213 -- .../frontend/panel-chunks/chunk-WQXORDNI.js | 2 - .../frontend/panel-chunks/chunk-WUMSAU4G.js | 2 - .../frontend/panel-chunks/chunk-XB4BHMUS.js | 2 - .../frontend/panel-chunks/chunk-XCDM7D5I.js | 2 - .../frontend/panel-chunks/chunk-XRSEIZKJ.js | 2 - .../frontend/panel-chunks/chunk-XSFV5MUM.js | 2 - .../{chunk-N6F5RX6S.js => chunk-YJXVPPWG.js} | 11 +- .../frontend/panel-chunks/chunk-YKVD2DJ5.js | 2 - .../frontend/panel-chunks/chunk-YQT7IJJB.js | 2 - .../frontend/panel-chunks/chunk-YV5NLEJS.js | 213 -- .../frontend/panel-chunks/chunk-Z4FODB56.js | 2 - .../{chunk-3VJOJBZ5.js => chunk-Z5US4BJZ.js} | 4 +- .../frontend/panel-chunks/chunk-ZA53FZUW.js | 2 - .../frontend/panel-chunks/chunk-ZCBGAPJD.js | 2 - .../frontend/panel-chunks/chunk-ZCC7RQPW.js | 2 - .../frontend/panel-chunks/chunk-ZJPHP3YU.js | 1460 -------- .../frontend/panel-chunks/chunk-ZMV2VB57.js | 937 ----- .../{chunk-R26ZOQ5V.js => chunk-ZUQUKRCN.js} | 247 +- .../panel-chunks/complete-dialog-4RUZZVM3.js | 2 - .../panel-chunks/complete-dialog-6I7ZE4B2.js | 2 - .../panel-chunks/complete-dialog-C2KNLAXY.js | 2 - .../panel-chunks/complete-dialog-OY3KNAYB.js | 2 + .../panel-chunks/complete-dialog-PYGTDA7N.js | 2 - .../panel-chunks/complete-dialog-XE23FN7E.js | 2 - .../panel-chunks/dialog-mount-B3LEX7L5.js | 2 + .../panel-chunks/dialog-mount-DACUEWGB.js | 2 - .../panel-chunks/dialog-mount-FGPZ3MEC.js | 2 - .../panel-chunks/dialog-mount-H6J55EII.js | 2 - .../panel-chunks/dialog-mount-OI2EBUCS.js | 2 - .../panel-chunks/dialog-mount-UGGXUPH3.js | 2 - .../panel-chunks/object-dialog-GD4U5DIY.js | 2 - .../panel-chunks/object-dialog-LYW4YDC6.js | 2 - .../panel-chunks/object-dialog-P2V7MPUV.js | 2 + .../panel-chunks/object-dialog-U6UMEA4M.js | 2 - .../panel-chunks/object-dialog-V5TRDSAR.js | 2 - .../panel-chunks/object-dialog-W3BBT6BL.js | 2 - .../panel-chunks/qr-dialog-AUR4YBIQ.js | 2 - .../panel-chunks/qr-dialog-FROADDFS.js | 2 - .../panel-chunks/qr-dialog-ND4XOZOC.js | 2 - .../panel-chunks/qr-dialog-VLMVLZ4U.js | 2 - .../panel-chunks/qr-dialog-X6MJCUUJ.js | 2 + .../panel-chunks/qr-dialog-ZQG2O72E.js | 2 - .../panel-chunks/settings-view-BOF5YKYH.js | 1371 ------- .../panel-chunks/settings-view-PU2VMIUH.js | 1371 ------- .../panel-chunks/settings-view-QX4GUQJW.js | 1421 ------- .../panel-chunks/settings-view-YNCYESZH.js | 1428 ------- ...-2LFKI3RI.js => settings-view-Z5DP5ZSW.js} | 20 +- .../suggested-setups-dialog-IWUD5J2S.js | 149 - .../suggested-setups-dialog-JCV6DSEW.js | 146 - .../suggested-setups-dialog-ME7PK73B.js | 184 - ...js => suggested-setups-dialog-NF6ISSCL.js} | 4 +- .../suggested-setups-dialog-OTTCDLIG.js | 146 - .../panel-chunks/task-dialog-2CVAHRCG.js | 2 - .../panel-chunks/task-dialog-5V36PJTB.js | 2 - .../panel-chunks/task-dialog-AOPRQNRI.js | 2 - .../panel-chunks/task-dialog-EE5GCFYK.js | 2 + .../panel-chunks/task-dialog-RUBVA4WM.js | 2 - .../panel-chunks/task-dialog-VVSVAG5I.js | 2 - .../chunks/budget-section-card-7UXAZ46X.js | 125 - .../chunks/budget-section-card-FYYZR3LV.js | 127 - .../chunks/budget-section-card-ILO66YA4.js | 125 - ...MGQ.js => budget-section-card-TNXX4ZSN.js} | 4 +- .../chunks/budget-section-card-ZFASWXPP.js | 127 - .../strategy/chunks/chunk-2ARNLSF6.js | 1301 ------- .../strategy/chunks/chunk-42I2X2DS.js | 2 - .../strategy/chunks/chunk-4JW6SHXP.js | 2 - .../{chunk-EAYT244O.js => chunk-5BNA7QPW.js} | 4 +- .../strategy/chunks/chunk-62AO4XFY.js | 2 - .../strategy/chunks/chunk-6BHUADHJ.js | 66 - .../{chunk-SUKVNZGX.js => chunk-6RSHEGAW.js} | 4 +- .../strategy/chunks/chunk-6VYW2MWJ.js | 1301 ------- .../strategy/chunks/chunk-BR3YZILG.js | 2 - .../strategy/chunks/chunk-C275ZO4V.js | 2 - .../strategy/chunks/chunk-CH4XIFVT.js | 60 - .../{chunk-3MSNNIFG.js => chunk-G7Y44K4C.js} | 4 +- .../{chunk-CTWCZMNP.js => chunk-GDJJTBLT.js} | 4 +- .../{chunk-7S4QZ3RX.js => chunk-GN5JMQ24.js} | 4 +- .../strategy/chunks/chunk-HSMB7CYB.js | 2 - .../{chunk-XOYZSKDM.js => chunk-IPUKIEZ2.js} | 2 +- .../strategy/chunks/chunk-IWH6LGYJ.js | 60 - .../strategy/chunks/chunk-KK4NNJHL.js | 88 - .../strategy/chunks/chunk-LKMEBXIJ.js | 60 - .../strategy/chunks/chunk-MSGNUEIB.js | 60 - .../strategy/chunks/chunk-N5LSMQW7.js | 88 - .../strategy/chunks/chunk-NKXHANLV.js | 2 - .../strategy/chunks/chunk-PUCXXZSB.js | 2 - .../strategy/chunks/chunk-QP2XJAYX.js | 66 - .../strategy/chunks/chunk-R3EVJQWN.js | 88 - .../strategy/chunks/chunk-RGIYRWN4.js | 2 - .../strategy/chunks/chunk-RVTWU5ZB.js | 2 - .../strategy/chunks/chunk-UI7IMFM7.js | 1299 ------- .../{chunk-V2H6N4AC.js => chunk-XR5IXJXS.js} | 17 +- .../strategy/chunks/chunk-XXOH7YPH.js | 88 - .../strategy/chunks/chunk-ZBY2DACR.js | 1289 ------- .../strategy/chunks/dialog-mount-BY7EKQPS.js | 3290 ----------------- ...t-ZNHSIDHE.js => dialog-mount-JZ3NZ27Q.js} | 392 +- .../strategy/chunks/dialog-mount-PK3764GA.js | 3234 ---------------- .../strategy/chunks/dialog-mount-WHFRELKY.js | 3265 ---------------- .../strategy/chunks/dialog-mount-WO4CSUQS.js | 3264 ---------------- .../chunks/groups-section-card-6ZQ3HTXV.js | 137 - ...DMS.js => groups-section-card-FW4PWBGZ.js} | 4 +- .../chunks/groups-section-card-N72HOEE7.js | 137 - .../chunks/groups-section-card-QPDSJJK3.js | 137 - .../chunks/groups-section-card-V63GWVBG.js | 137 - .../chunks/vacation-section-card-LORMB24Z.js | 134 - .../chunks/vacation-section-card-NYA736FJ.js | 134 - .../chunks/vacation-section-card-OWLMOYJJ.js | 134 - .../chunks/vacation-section-card-R3FY4AUU.js | 134 - ...C.js => vacation-section-card-R5YCE3CM.js} | 4 +- .../maintenance-dashboard-strategy.js | 6 +- .../maintenance_supporter/helpers/sanitize.py | 3 +- .../maintenance_supporter/manifest.json | 2 +- .../models/maintenance_task.py | 14 +- .../maintenance_supporter/services.yaml | 5 +- .../maintenance_supporter/strings.json | 2 +- .../maintenance_supporter/templates.py | 56 +- .../maintenance_supporter/templates_i18n.py | 207 ++ .../translations/cs.json | 2 +- .../translations/da.json | 2 +- .../translations/de.json | 2 +- .../translations/en.json | 2 +- .../translations/es.json | 2 +- .../translations/fi.json | 2 +- .../translations/fr.json | 2 +- .../translations/hi.json | 2 +- .../translations/hu.json | 2 +- .../translations/it.json | 2 +- .../translations/ja.json | 2 +- .../translations/ko.json | 2 +- .../translations/nb.json | 2 +- .../translations/nl.json | 2 +- .../translations/pl.json | 2 +- .../translations/pt-BR.json | 2 +- .../translations/pt.json | 2 +- .../translations/ru.json | 2 +- .../translations/sv.json | 2 +- .../translations/tr.json | 2 +- .../translations/uk.json | 2 +- .../translations/zh-Hans.json | 2 +- .../websocket/__init__.py | 4 + .../maintenance_supporter/websocket/io.py | 9 +- .../websocket/tasks_actions.py | 3 +- .../websocket/tasks_history.py | 3 +- custom_components/taskmate/coord_chores.py | 10 +- .../taskmate/coord_notifications.py | 28 +- custom_components/taskmate/frontend.py | 1 + custom_components/taskmate/manifest.json | 2 +- custom_components/taskmate/sensor.py | 112 +- .../taskmate/translations/pl.json | 1387 +++++++ .../taskmate/www/locales/da.json | 30 +- .../taskmate/www/locales/de.json | 30 +- .../taskmate/www/locales/en-GB.json | 30 +- .../taskmate/www/locales/en.json | 30 +- .../taskmate/www/locales/fr.json | 30 +- .../taskmate/www/locales/nb.json | 30 +- .../taskmate/www/locales/nn.json | 30 +- .../taskmate/www/locales/pl.json | 2887 +++++++++++++++ .../taskmate/www/locales/pt-BR.json | 30 +- .../taskmate/www/locales/pt.json | 30 +- .../taskmate/www/taskmate-attr-resolver.js | 61 +- .../taskmate/www/taskmate-child-card.js | 4 + .../taskmate/www/taskmate-chore-board-card.js | 807 ++++ .../clock-weather-card/clock-weather-card.js | 4 +- .../clock-weather-card.js.gz | Bin 56641 -> 56637 bytes .../simple-thermostat.debug.js | 118 +- .../simple-thermostat.debug.js.gz | Bin 69206 -> 69511 bytes .../simple-thermostat/simple-thermostat.js | 182 +- .../simple-thermostat/simple-thermostat.js.gz | Bin 54580 -> 54774 bytes zigbee2mqtt/state.json | 40 +- 331 files changed, 10227 insertions(+), 50159 deletions(-) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/adopt-problem-sensors-dialog-2C6DAJNM.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/adopt-problem-sensors-dialog-FZCNE25E.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/adopt-problem-sensors-dialog-G6OMYHFP.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{adopt-problem-sensors-dialog-FJ4YGWMJ.js => adopt-problem-sensors-dialog-RQ23EE22.js} (98%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/adopt-problem-sensors-dialog-YOSPIPSF.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/area-view-DOCESFOL.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{area-view-JP4ZKMDQ.js => area-view-EU5UROHJ.js} (57%) rename custom_components/maintenance_supporter/frontend/panel-chunks/{areas-view-EIIITWEQ.js => areas-view-TVJJZL6F.js} (91%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/areas-view-Z6D3T47X.js create mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/bulk-edit-dialog-AAZ72ERS.js create mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-2CZ4LD2Q.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-2IGVBRZV.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-2PKU3QXM.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-2SARE4MS.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-3GDXUAER.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-3UVOHVFS.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-3WM7WAL2.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-45NFFEKB.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-B7AS4DOM.js => chunk-4CRDSGBT.js} (96%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-4XNVTWGC.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-E7KPGZZO.js => chunk-5ROMA2NQ.js} (92%) create mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-5SGCD2J3.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-5XRT3AM7.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-63C4ZGBD.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-6LZYA7IL.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-6RV6BU2W.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-73EHFI76.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-7NJJOABV.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-AHDRR46D.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-APJICCRG.js => chunk-AKHM2FQS.js} (94%) create mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-BEGYKXHI.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-BFBOHWBW.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-BLR3NVGU.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-BYGTDXRD.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-C2DCJ26U.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-C7OGYVZI.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-4PTWLV7V.js => chunk-D4KM62SJ.js} (94%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-DTRCTWKY.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-EH52ZZY4.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-ENPF2LDM.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-5YKNSANW.js => chunk-EPK25IMX.js} (94%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-FLCA3VKG.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-FQOUX6W2.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-FR6WMAD6.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-G76Z2Z4C.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-2KTY4IVI.js => chunk-GG5NDVS4.js} (98%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-GGJ6YWZO.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-WJT4RRLS.js => chunk-GSRF4WCQ.js} (94%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-GTEFDN23.js create mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-GVLO7RZ4.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-QLW72JHE.js => chunk-HVQDZ5QR.js} (97%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-I7NCFUZX.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-BA7DXCPM.js => chunk-IEG2EHSV.js} (65%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-IRVVKPDP.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-JE577H3E.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-JEWIFUZC.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-K4SNNHPR.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-KFHQ72KC.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-CWEQFONI.js => chunk-KH4WZJRU.js} (94%) rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-232HSTEK.js => chunk-KR7J3CDC.js} (98%) rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-2U4DNN5T.js => chunk-KV46GCLQ.js} (92%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-LEWJHPDY.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-LJBGBUDY.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-MHBW3M6D.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-MJTDRBP6.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-3DX24CU6.js => chunk-MW3LIRZD.js} (91%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-NZPPXRKZ.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-4OFQFCKD.js => chunk-O7BSORZB.js} (97%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-ODPGZXCU.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-OTS5U34S.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-OXPKT66L.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-P3JMRZOA.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-PDDZINC4.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-PWKMLGJR.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-AU57O2BC.js => chunk-QEKEY7ZD.js} (96%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-QOKIQTSS.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-VZYRPSO6.js => chunk-R3GKJJ55.js} (75%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-RAW6RFRE.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-RJY4VEHX.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-RSV5IULH.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-RSVG7WFD.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-S7ZP4PVX.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-SBK5UZCL.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-SCLV5YEV.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-TCEU2O2H.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-2REBRMPM.js => chunk-TSU2RKSC.js} (98%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-UJICOAU3.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-UN244A6U.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-UVBHIULM.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-W2HMC6OR.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-WQXORDNI.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-WUMSAU4G.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-XB4BHMUS.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-XCDM7D5I.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-XRSEIZKJ.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-XSFV5MUM.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-N6F5RX6S.js => chunk-YJXVPPWG.js} (63%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-YKVD2DJ5.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-YQT7IJJB.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-YV5NLEJS.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-Z4FODB56.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-3VJOJBZ5.js => chunk-Z5US4BJZ.js} (87%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-ZA53FZUW.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-ZCBGAPJD.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-ZCC7RQPW.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-ZJPHP3YU.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/chunk-ZMV2VB57.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{chunk-R26ZOQ5V.js => chunk-ZUQUKRCN.js} (76%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/complete-dialog-4RUZZVM3.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/complete-dialog-6I7ZE4B2.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/complete-dialog-C2KNLAXY.js create mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/complete-dialog-OY3KNAYB.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/complete-dialog-PYGTDA7N.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/complete-dialog-XE23FN7E.js create mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/dialog-mount-B3LEX7L5.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/dialog-mount-DACUEWGB.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/dialog-mount-FGPZ3MEC.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/dialog-mount-H6J55EII.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/dialog-mount-OI2EBUCS.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/dialog-mount-UGGXUPH3.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/object-dialog-GD4U5DIY.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/object-dialog-LYW4YDC6.js create mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/object-dialog-P2V7MPUV.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/object-dialog-U6UMEA4M.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/object-dialog-V5TRDSAR.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/object-dialog-W3BBT6BL.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/qr-dialog-AUR4YBIQ.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/qr-dialog-FROADDFS.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/qr-dialog-ND4XOZOC.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/qr-dialog-VLMVLZ4U.js create mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/qr-dialog-X6MJCUUJ.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/qr-dialog-ZQG2O72E.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/settings-view-BOF5YKYH.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/settings-view-PU2VMIUH.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/settings-view-QX4GUQJW.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/settings-view-YNCYESZH.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{settings-view-2LFKI3RI.js => settings-view-Z5DP5ZSW.js} (98%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/suggested-setups-dialog-IWUD5J2S.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/suggested-setups-dialog-JCV6DSEW.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/suggested-setups-dialog-ME7PK73B.js rename custom_components/maintenance_supporter/frontend/panel-chunks/{suggested-setups-dialog-DV6WXAWB.js => suggested-setups-dialog-NF6ISSCL.js} (98%) delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/suggested-setups-dialog-OTTCDLIG.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/task-dialog-2CVAHRCG.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/task-dialog-5V36PJTB.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/task-dialog-AOPRQNRI.js create mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/task-dialog-EE5GCFYK.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/task-dialog-RUBVA4WM.js delete mode 100644 custom_components/maintenance_supporter/frontend/panel-chunks/task-dialog-VVSVAG5I.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/budget-section-card-7UXAZ46X.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/budget-section-card-FYYZR3LV.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/budget-section-card-ILO66YA4.js rename custom_components/maintenance_supporter/frontend/strategy/chunks/{budget-section-card-3BHOHMGQ.js => budget-section-card-TNXX4ZSN.js} (97%) delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/budget-section-card-ZFASWXPP.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-2ARNLSF6.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-42I2X2DS.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-4JW6SHXP.js rename custom_components/maintenance_supporter/frontend/strategy/chunks/{chunk-EAYT244O.js => chunk-5BNA7QPW.js} (94%) delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-62AO4XFY.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-6BHUADHJ.js rename custom_components/maintenance_supporter/frontend/strategy/chunks/{chunk-SUKVNZGX.js => chunk-6RSHEGAW.js} (98%) delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-6VYW2MWJ.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-BR3YZILG.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-C275ZO4V.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-CH4XIFVT.js rename custom_components/maintenance_supporter/frontend/strategy/chunks/{chunk-3MSNNIFG.js => chunk-G7Y44K4C.js} (93%) rename custom_components/maintenance_supporter/frontend/strategy/chunks/{chunk-CTWCZMNP.js => chunk-GDJJTBLT.js} (96%) rename custom_components/maintenance_supporter/frontend/strategy/chunks/{chunk-7S4QZ3RX.js => chunk-GN5JMQ24.js} (94%) delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-HSMB7CYB.js rename custom_components/maintenance_supporter/frontend/strategy/chunks/{chunk-XOYZSKDM.js => chunk-IPUKIEZ2.js} (98%) delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-IWH6LGYJ.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-KK4NNJHL.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-LKMEBXIJ.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-MSGNUEIB.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-N5LSMQW7.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-NKXHANLV.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-PUCXXZSB.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-QP2XJAYX.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-R3EVJQWN.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-RGIYRWN4.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-RVTWU5ZB.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-UI7IMFM7.js rename custom_components/maintenance_supporter/frontend/strategy/chunks/{chunk-V2H6N4AC.js => chunk-XR5IXJXS.js} (57%) delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-XXOH7YPH.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/chunk-ZBY2DACR.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/dialog-mount-BY7EKQPS.js rename custom_components/maintenance_supporter/frontend/strategy/chunks/{dialog-mount-ZNHSIDHE.js => dialog-mount-JZ3NZ27Q.js} (82%) delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/dialog-mount-PK3764GA.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/dialog-mount-WHFRELKY.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/dialog-mount-WO4CSUQS.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/groups-section-card-6ZQ3HTXV.js rename custom_components/maintenance_supporter/frontend/strategy/chunks/{groups-section-card-DLDUVDMS.js => groups-section-card-FW4PWBGZ.js} (95%) delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/groups-section-card-N72HOEE7.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/groups-section-card-QPDSJJK3.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/groups-section-card-V63GWVBG.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/vacation-section-card-LORMB24Z.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/vacation-section-card-NYA736FJ.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/vacation-section-card-OWLMOYJJ.js delete mode 100644 custom_components/maintenance_supporter/frontend/strategy/chunks/vacation-section-card-R3FY4AUU.js rename custom_components/maintenance_supporter/frontend/strategy/chunks/{vacation-section-card-KBV2JPSC.js => vacation-section-card-R5YCE3CM.js} (96%) create mode 100644 custom_components/taskmate/translations/pl.json create mode 100644 custom_components/taskmate/www/locales/pl.json create mode 100644 custom_components/taskmate/www/taskmate-chore-board-card.js diff --git a/.storage/lovelace_resources b/.storage/lovelace_resources index b0b30e76..d8789d42 100644 --- a/.storage/lovelace_resources +++ b/.storage/lovelace_resources @@ -231,7 +231,7 @@ }, { "id": "449ff43140654e4bbe2c7b2d361dfacc", - "url": "/hacsfiles/clock-weather-card/clock-weather-card.js?hacstag=522634019295", + "url": "/hacsfiles/clock-weather-card/clock-weather-card.js?hacstag=522634019296", "type": "module" }, { @@ -261,7 +261,7 @@ }, { "id": "6c3f7d87683d4473b5dc8fe8177535f6", - "url": "/hacsfiles/simple-thermostat/simple-thermostat.js?hacstag=1230152807450", + "url": "/hacsfiles/simple-thermostat/simple-thermostat.js?hacstag=1230152807451", "type": "module" }, { diff --git a/custom_components/maintenance_supporter/__init__.py b/custom_components/maintenance_supporter/__init__.py index bd9e0504..7fd3ce63 100644 --- a/custom_components/maintenance_supporter/__init__.py +++ b/custom_components/maintenance_supporter/__init__.py @@ -71,6 +71,7 @@ from .const import ( MAX_NAME_LENGTH, MAX_TEXT_LENGTH, MAX_TYPE_LENGTH, + MIN_COST, PLATFORMS, SERVICE_ADD_OBJECT, SERVICE_ADD_TASK, @@ -146,7 +147,7 @@ SERVICE_COMPLETE_SCHEMA = vol.Schema( { vol.Required(ATTR_ENTITY_ID): vol.All(cv.entity_ids, vol.Length(min=1)), vol.Optional("notes"): vol.All(cv.string, vol.Length(max=2000)), - vol.Optional("cost"): vol.All(vol.Coerce(float), vol.Range(min=0, max=MAX_COST)), + vol.Optional("cost"): vol.All(vol.Coerce(float), vol.Range(min=MIN_COST, max=MAX_COST)), vol.Optional("duration"): vol.All(vol.Coerce(int), vol.Range(min=0, max=MAX_DURATION_MINUTES)), # Meter readings (v2.20, #83): recorded value for `reading` tasks. vol.Optional("reading_value"): vol.All(vol.Coerce(float), vol.Range(min=-1e12, max=1e12)), diff --git a/custom_components/maintenance_supporter/const.py b/custom_components/maintenance_supporter/const.py index cf6f9275..264e8a3c 100644 --- a/custom_components/maintenance_supporter/const.py +++ b/custom_components/maintenance_supporter/const.py @@ -856,6 +856,9 @@ MAX_PANEL_TITLE_LENGTH = 50 # sidebar panel title override # config-flow-path sanitiser (they must agree, else a value the sanitiser # accepts can bypass the WS cap or vice-versa). MAX_COST = 1_000_000 # per completion / history entry +# #200: a credit — the old unit sold, a refund — is a negative cost; every +# total nets it (budget, task, object, area). +MIN_COST = -MAX_COST MAX_DURATION_MINUTES = 525_600 # one year in minutes MAX_TYPE_LENGTH = 50 # task_type, schedule_type MAX_CHECKLIST_ITEMS = 100 diff --git a/custom_components/maintenance_supporter/coordinator.py b/custom_components/maintenance_supporter/coordinator.py index 272899b4..bb1b4ad7 100644 --- a/custom_components/maintenance_supporter/coordinator.py +++ b/custom_components/maintenance_supporter/coordinator.py @@ -112,6 +112,7 @@ def _inert_task_result(task: MaintenanceTask, status: str, **extra: Any) -> dict task_result["_trigger_active"] = False task_result["_times_performed"] = task.times_performed task_result["_total_cost"] = task.total_cost + task_result["_average_cost"] = task.average_cost task_result["_average_duration"] = task.average_duration task_result["_last_entry"] = task.last_entry task_result.update(extra) @@ -526,6 +527,7 @@ class MaintenanceCoordinator(DataUpdateCoordinator[dict[str, Any]]): task_result["_trigger_current_delta"] = current - baseline task_result["_times_performed"] = task.times_performed task_result["_total_cost"] = task.total_cost + task_result["_average_cost"] = task.average_cost task_result["_average_duration"] = task.average_duration task_result["_last_entry"] = task.last_entry diff --git a/custom_components/maintenance_supporter/frontend-src/__tests__/complete-dialog.test.ts b/custom_components/maintenance_supporter/frontend-src/__tests__/complete-dialog.test.ts index 6957d30f..c3f84ecd 100644 --- a/custom_components/maintenance_supporter/frontend-src/__tests__/complete-dialog.test.ts +++ b/custom_components/maintenance_supporter/frontend-src/__tests__/complete-dialog.test.ts @@ -47,6 +47,21 @@ function setInput(el: MaintenanceCompleteDialog, index: number, value: string) { input.dispatchEvent(new Event("input")); } +/** The cost has its own element (#200: Cost | Credit and the amount). */ +function costInput(el: MaintenanceCompleteDialog) { + return el.shadowRoot!.querySelector("ms-cost-input")! as HTMLElement & { value: string; updateComplete: Promise }; +} + +function costAmount(el: MaintenanceCompleteDialog): HTMLInputElement { + return costInput(el).shadowRoot!.querySelector("input.amount")!; +} + +function setCost(el: MaintenanceCompleteDialog, value: string) { + const input = costAmount(el); + input.value = value; + input.dispatchEvent(new Event("input")); +} + function clickComplete(el: MaintenanceCompleteDialog) { const buttons = [...el.shadowRoot!.querySelectorAll(".dialog-actions ha-button")]; (buttons[buttons.length - 1] as HTMLElement).click(); @@ -60,8 +75,8 @@ describe("complete-dialog", () => { }); setInput(el, 0, "oil changed"); - setInput(el, 1, "12.5"); - setInput(el, 2, "30"); + setCost(el, "12.5"); + setInput(el, 1, "30"); // Tick the second checklist step (click the checkbox; the event bubbles // to the row's toggle handler exactly once). const boxes = [...el.shadowRoot!.querySelectorAll(".checklist-item input")]; @@ -105,6 +120,34 @@ describe("complete-dialog", () => { expect("completed_at" in msg).to.be.false; }); + it("a credit goes out as a negative cost (#200)", async () => { + // The old unit sold for 150: Credit, then the amount — a phone keypad + // has no minus key, so the switch carries the sign. + const { el, sent } = await mount(); + const cost = costInput(el); + await cost.updateComplete; + cost.shadowRoot!.querySelector(".kind.credit")!.click(); + await cost.updateComplete; + expect(cost.shadowRoot!.querySelector(".hint")!.textContent).to.include("Money back"); + setCost(el, "150"); + clickComplete(el); + await new Promise((r) => setTimeout(r, 10)); + const msg = sent.find((m) => m.type === "maintenance_supporter/task/complete")!; + expect(msg.cost).to.equal(-150); + }); + + it("notes may run over several lines (#202): a text area, sent trimmed, no Markdown promise", async () => { + const { el, sent } = await mount(); + expect(el.shadowRoot!.querySelector("textarea.field-input"), "the notes field is a text area").to.exist; + // The history and the printouts show notes as plain text. + expect(el.shadowRoot!.textContent).not.to.include("Markdown"); + setInput(el, 0, "Filter changed\nSeal checked\n"); + clickComplete(el); + await new Promise((r) => setTimeout(r, 10)); + const msg = sent.find((m) => m.type === "maintenance_supporter/task/complete")!; + expect(msg.notes, "the line break inside stays, the one at the end goes").to.equal("Filter changed\nSeal checked"); + }); + /** The optional backdate starts as a "Set date & time" button (#163): the * HA datetime selector has no empty state, so the field only appears once * the user asks for it, seeded with the current minute. */ @@ -396,10 +439,9 @@ describe("complete-dialog parts cost (#104)", () => { expect(chip(el)!.textContent).to.include("18"); chip(el)!.click(); await el.updateComplete; - // Buy task: restock qty, notes, cost. - const cost = [...el.shadowRoot!.querySelectorAll(".field-input")][2]; + await costInput(el).updateComplete; // Machine value for the — never profile-formatted. - expect(cost.value).to.equal("18"); + expect(costAmount(el).value).to.equal("18"); expect(chip(el), "chip hides once cost is set").to.equal(null); }); @@ -423,7 +465,7 @@ describe("complete-dialog parts cost (#104)", () => { it("buy task: no chip once the user typed a cost themselves", async () => { const el = await mountWithParts({ restockDefault: 1, restockUnitCost: 5 }); expect(chip(el)).to.exist; - setInput(el, 2, "3.10"); + setCost(el, "3.10"); await el.updateComplete; expect(chip(el)).to.equal(null); }); diff --git a/custom_components/maintenance_supporter/frontend-src/__tests__/task-dialog-completion-actions.test.ts b/custom_components/maintenance_supporter/frontend-src/__tests__/task-dialog-completion-actions.test.ts index 402b8f1f..34d34cb6 100644 --- a/custom_components/maintenance_supporter/frontend-src/__tests__/task-dialog-completion-actions.test.ts +++ b/custom_components/maintenance_supporter/frontend-src/__tests__/task-dialog-completion-actions.test.ts @@ -128,8 +128,10 @@ describe("task-dialog completion-actions sections", () => { "ms-textfield", ); expect(qcInputs[0]?.value, "qc notes").to.equal("Quick note"); - expect(qcInputs[1]?.value, "qc cost").to.equal("4.5"); - expect(qcInputs[2]?.value, "qc duration").to.equal("10"); + // The cost has its own element (#200: Cost | Credit and the amount). + const qcCost = sections[1].querySelector("ms-cost-input"); + expect(qcCost?.value, "qc cost").to.equal("4.5"); + expect(qcInputs[1]?.value, "qc duration").to.equal("10"); const qcSelect = sections[1].querySelector("select.qc-feedback"); expect(qcSelect?.value, "qc feedback").to.equal("needed"); diff --git a/custom_components/maintenance_supporter/frontend-src/components/battery-fleet-section.ts b/custom_components/maintenance_supporter/frontend-src/components/battery-fleet-section.ts index cd31b773..145e90c6 100644 --- a/custom_components/maintenance_supporter/frontend-src/components/battery-fleet-section.ts +++ b/custom_components/maintenance_supporter/frontend-src/components/battery-fleet-section.ts @@ -444,7 +444,9 @@ export class MaintenanceBatteryFleetSection extends LitElement { : b.no_sensor ? html`${t("battery_fleet_no_sensor", L)}` : nothing; - const type = html`${b.quantity}× ${b.battery_type}`; + // The full type as a tooltip: a long one ends in an ellipsis (D#162). + const typeText = `${b.quantity}× ${b.battery_type}`; + const type = html`${typeText}`; const writer = this._canWrite; const showMark = writer && (o.mark === "always" || b.no_sensor || b.can_mark_replaced); return html` @@ -659,7 +661,10 @@ export class MaintenanceBatteryFleetSection extends LitElement { } static styles = css` + /* The query container of the row layout (see "In a narrow list" below): + * the list's own width, not the screen's. */ .bf-card { + container: bf-fleet / inline-size; background: var(--card-background-color, #fff); border: 1px solid var(--divider-color); border-radius: 10px; @@ -817,9 +822,16 @@ export class MaintenanceBatteryFleetSection extends LitElement { font-size: 12px; font-style: italic; } + /* Every row shares the list's columns, so ONE long type ("1× BATTERY + * PACK") widened the type column of all of them (D#162): it stops at + * 12em and ends in an ellipsis, the full text is the tooltip. */ .bf-type { color: var(--secondary-text-color); font-size: 13px; + max-width: 12em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .bf-recharge { color: var(--secondary-text-color); @@ -835,18 +847,37 @@ export class MaintenanceBatteryFleetSection extends LitElement { flex: 0 0 auto; cursor: help; } - /* On phones the row cannot fit name + chips + curve + bar + date in ONE - * line: the decorations yield (the percentage still carries the number) - * and the row wraps to two lines - the name spans the full width, the - * status chip moves under it (left, into the name column) and the rest - * keeps its pinned subgrid column, so type / percentage / date / eye - * stay aligned across rows. Without this the fixed max-content columns - * overflowed 400 px and the chips overlapped the wrapped names. */ - @media (max-width: 640px) { + /* In a narrow list the row cannot fit name + chips + curve + bar + date + * in ONE line: the decorations yield (the percentage still carries the + * number) and the row wraps to two lines - the name spans the full + * width, the status chip moves under it (left, into the name column) + * and the rest keeps its pinned subgrid column, so type / percentage / + * date / eye stay aligned across rows. Without this the fixed + * max-content columns overflowed 400 px and the chips overlapped the + * wrapped names. + * + * The LIST's width decides, not the screen's (D#162): the Lovelace card + * sits in a dashboard column of 400-500 px on a wide screen, kept the + * one-line layout there and cut off the badge, the date and the hide + * button. 680 px of list is where the one-line rows stop fitting; + * desktop task pages (700 px and more) keep them. */ + @container bf-fleet (max-width: 680px) { .bf-spark, .bf-bar { display: none; } + /* No fixed gaps: a column a phone leaves empty (status chip moved, + * curve and bar hidden) cost its 8 px gap all the same, and together + * with one long type the rows ran 25 px past a 402 px phone. Each + * occupied column brings its own 6 px instead, and the type column + * may shrink - its text ends in an ellipsis. */ + .bf-rows { + column-gap: 0; + grid-template-columns: minmax(0, 1fr) max-content minmax(0, max-content) repeat(7, max-content); + } + .bf-row > :not(.bf-dev) { + margin-inline-start: 6px; + } .bf-row { row-gap: 2px; } @@ -864,12 +895,10 @@ export class MaintenanceBatteryFleetSection extends LitElement { grid-row: 1; justify-self: end; } + /* The column shrinks, the ellipsis comes from the base rule (a cap in + * vw measured the screen, not the list). */ .bf-type { grid-row: 2; - max-width: 44vw; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } .bf-recharge, .bf-level, diff --git a/custom_components/maintenance_supporter/frontend-src/components/complete-dialog.ts b/custom_components/maintenance_supporter/frontend-src/components/complete-dialog.ts index 25afc5fc..7f4fddf5 100644 --- a/custom_components/maintenance_supporter/frontend-src/components/complete-dialog.ts +++ b/custom_components/maintenance_supporter/frontend-src/components/complete-dialog.ts @@ -14,6 +14,7 @@ import { REQUIRED_COMPLETION_LABELS } from "./required-completion-labels"; import { PhotoUploadController } from "../helpers/photo-upload-controller"; import { parseDurationMinutes } from "../helpers/duration"; import "./ms-date-field"; +import "./ms-cost-input"; import "./ms-photo-picker"; import { photoPickerStyles } from "./ms-photo-picker"; @@ -173,10 +174,14 @@ export class MaintenanceCompleteDialog extends LitElement { entry_id: this.entryId, task_id: this.taskId, }; - if (this._notes) data.notes = this._notes; + // Trimmed like the required check reads it: a text area easily keeps a + // trailing line break, which the history would show as an empty line. + const notes = this._notes.trim(); + if (notes) data.notes = notes; if (this._cost) { + // #200: a credit is negative; the server holds the bounds. const cost = parseFloat(this._cost); - if (!isNaN(cost) && cost >= 0) data.cost = cost; + if (!isNaN(cost)) data.cost = cost; } // Whole minutes — the server coerces to int (helpers/duration). const dur = parseDurationMinutes(this._duration); @@ -309,9 +314,15 @@ export class MaintenanceCompleteDialog extends LitElement { return this.requiredFields.filter((f) => !filled[f]); } + /** Does the task demand this detail? Its label then drops "(optional)" — + * "Notes (optional) *" contradicted itself. */ + private _demands(field: string): boolean { + return this.requiredFields.includes(field); + } + /** Marker appended to a required field's label. */ private _req(field: string) { - return this.requiredFields.includes(field) ? html`` : nothing; + return this._demands(field) ? html`` : nothing; } /** A buy task's price: restock qty (packages) × the part's price per @@ -485,20 +496,22 @@ export class MaintenanceCompleteDialog extends LitElement { only sees the title + Cancel/Complete buttons — the original bug report. Native inputs always render. --> -