Updated Scheduler and Maintainance Apps

This commit is contained in:
2026-07-08 12:00:20 -04:00
parent fefc2c8b5c
commit 0f7585754d
227 changed files with 2877 additions and 958 deletions
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Výňatek z manuálu",
"worksheet_pages": "strany",
"worksheet_printed": "Vytištěno",
"worksheet_never": "Nikdy"
"worksheet_never": "Nikdy",
"card_all_caught_up": "Vše hotovo — nic nevyžaduje pozornost",
"postpone": "Odložit",
"postpone_date_prompt": "Na jaké datum odložit tento termín?",
"postpone_date_label": "Nové datum",
"postponed": "Odloženo",
"postponed_to": "Odloženo na",
"season_window_label": "Sezónní okno (měsíce)",
"season_window_hint": "Termín jen ve vybraných měsících; data mimo sezónu se posunou na další aktivní měsíc. Žádné = celý rok.",
"series_end_label": "Končí",
"series_end_never": "Nikdy (opakuje se stále)",
"series_end_after_count": "Po počtu opakování",
"series_end_until": "K datu",
"series_end_count_label": "Počet opakování",
"series_end_until_label": "Datum konce"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Uddrag af manualen",
"worksheet_pages": "sider",
"worksheet_printed": "Udskrevet",
"worksheet_never": "Aldrig"
"worksheet_never": "Aldrig",
"card_all_caught_up": "Alt er klaret — intet kræver opmærksomhed",
"postpone": "Udskyd",
"postpone_date_prompt": "Udskyd denne forekomst til hvilken dato?",
"postpone_date_label": "Ny forfaldsdato",
"postponed": "Udskudt",
"postponed_to": "Udskudt til",
"season_window_label": "Sæsonvindue (måneder)",
"season_window_hint": "Kun forfalden i de valgte måneder; datoer uden for sæsonen rykkes til næste aktive måned. Ingen = hele året.",
"series_end_label": "Slutter",
"series_end_never": "Aldrig (gentages uendeligt)",
"series_end_after_count": "Efter et antal gange",
"series_end_until": "På en dato",
"series_end_count_label": "Antal gange",
"series_end_until_label": "Slutdato"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Handbuch-Auszug",
"worksheet_pages": "Seiten",
"worksheet_printed": "Gedruckt",
"worksheet_never": "Nie"
"worksheet_never": "Nie",
"card_all_caught_up": "Alles erledigt — nichts braucht Aufmerksamkeit",
"postpone": "Verschieben",
"postpone_date_prompt": "Diesen Termin auf welches Datum verschieben?",
"postpone_date_label": "Neues Fälligkeitsdatum",
"postponed": "Verschoben",
"postponed_to": "Verschoben auf",
"season_window_label": "Saisonfenster (Monate)",
"season_window_hint": "Nur in den gewählten Monaten fällig; Termine außerhalb rollen in den nächsten aktiven Monat. Keine = ganzjährig.",
"series_end_label": "Endet",
"series_end_never": "Nie (wiederholt unbegrenzt)",
"series_end_after_count": "Nach Anzahl",
"series_end_until": "An einem Datum",
"series_end_count_label": "Anzahl",
"series_end_until_label": "Enddatum"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Manual excerpt",
"worksheet_pages": "pages",
"worksheet_printed": "Printed",
"worksheet_never": "Never"
"worksheet_never": "Never",
"card_all_caught_up": "All caught up — nothing needs attention",
"postpone": "Postpone",
"postpone_date_prompt": "Postpone this occurrence to which date?",
"postpone_date_label": "New due date",
"postponed": "Postponed",
"postponed_to": "Postponed to",
"season_window_label": "Seasonal window (months)",
"season_window_hint": "Only due in the selected months; off-season dates roll to the next active month. None = all year.",
"series_end_label": "Ends",
"series_end_never": "Never (repeats indefinitely)",
"series_end_after_count": "After a number of times",
"series_end_until": "On a date",
"series_end_count_label": "Number of times",
"series_end_until_label": "End date"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Extracto del manual",
"worksheet_pages": "páginas",
"worksheet_printed": "Impreso",
"worksheet_never": "Nunca"
"worksheet_never": "Nunca",
"card_all_caught_up": "Todo al día — nada requiere atención",
"postpone": "Posponer",
"postpone_date_prompt": "¿A qué fecha posponer esta vez?",
"postpone_date_label": "Nueva fecha de vencimiento",
"postponed": "Pospuesto",
"postponed_to": "Pospuesto hasta",
"season_window_label": "Ventana estacional (meses)",
"season_window_hint": "Solo vence en los meses seleccionados; las fechas fuera de temporada pasan al siguiente mes activo. Ninguno = todo el año.",
"series_end_label": "Termina",
"series_end_never": "Nunca (se repite indefinidamente)",
"series_end_after_count": "Tras un número de veces",
"series_end_until": "En una fecha",
"series_end_count_label": "Número de veces",
"series_end_until_label": "Fecha de fin"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Ote käyttöohjeesta",
"worksheet_pages": "sivut",
"worksheet_printed": "Tulostettu",
"worksheet_never": "Ei koskaan"
"worksheet_never": "Ei koskaan",
"card_all_caught_up": "Kaikki kunnossa — mikään ei vaadi huomiota",
"postpone": "Lykkää",
"postpone_date_prompt": "Mihin päivään tämä kerta lykätään?",
"postpone_date_label": "Uusi eräpäivä",
"postponed": "Lykätty",
"postponed_to": "Lykätty päivään",
"season_window_label": "Kausi-ikkuna (kuukaudet)",
"season_window_hint": "Erääntyy vain valittuina kuukausina; kauden ulkopuoliset päivät siirtyvät seuraavaan aktiiviseen kuukauteen. Ei mitään = koko vuosi.",
"series_end_label": "Päättyy",
"series_end_never": "Ei koskaan (toistuu loputtomasti)",
"series_end_after_count": "Tietyn kertamäärän jälkeen",
"series_end_until": "Päivämääränä",
"series_end_count_label": "Kertojen määrä",
"series_end_until_label": "Päättymispäivä"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Extrait du manuel",
"worksheet_pages": "pages",
"worksheet_printed": "Imprimé",
"worksheet_never": "Jamais"
"worksheet_never": "Jamais",
"card_all_caught_up": "Tout est à jour — rien ne requiert d'attention",
"postpone": "Reporter",
"postpone_date_prompt": "Reporter cette échéance à quelle date ?",
"postpone_date_label": "Nouvelle date d’échéance",
"postponed": "Reporté",
"postponed_to": "Reporté au",
"season_window_label": "Fenêtre saisonnière (mois)",
"season_window_hint": "Dû uniquement les mois sélectionnés ; les dates hors saison passent au mois actif suivant. Aucun = toute lannée.",
"series_end_label": "Se termine",
"series_end_never": "Jamais (répète indéfiniment)",
"series_end_after_count": "Après un nombre de fois",
"series_end_until": "À une date",
"series_end_count_label": "Nombre de fois",
"series_end_until_label": "Date de fin"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "मैनुअल अंश",
"worksheet_pages": "पृष्ठ",
"worksheet_printed": "मुद्रित",
"worksheet_never": "कभी नहीं"
"worksheet_never": "कभी नहीं",
"card_all_caught_up": "सब पूरा — किसी चीज़ पर ध्यान देने की ज़रूरत नहीं",
"postpone": "टालें",
"postpone_date_prompt": "इस बार को किस तारीख तक टालें?",
"postpone_date_label": "नई नियत तिथि",
"postponed": "टाल दिया गया",
"postponed_to": "तक टाला गया",
"season_window_label": "मौसमी अवधि (महीने)",
"season_window_hint": "केवल चुने गए महीनों में देय; ऑफ-सीज़न तिथियाँ अगले सक्रिय महीने में चली जाती हैं। कोई नहीं = पूरे वर्ष।",
"series_end_label": "समाप्त होता है",
"series_end_never": "कभी नहीं (अनिश्चित रूप से दोहराता है)",
"series_end_after_count": "कुछ बार के बाद",
"series_end_until": "एक तिथि पर",
"series_end_count_label": "कितनी बार",
"series_end_until_label": "समाप्ति तिथि"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Estratto del manuale",
"worksheet_pages": "pagine",
"worksheet_printed": "Stampato",
"worksheet_never": "Mai"
"worksheet_never": "Mai",
"card_all_caught_up": "Tutto in ordine — niente richiede attenzione",
"postpone": "Posticipa",
"postpone_date_prompt": "A quale data posticipare questa scadenza?",
"postpone_date_label": "Nuova data di scadenza",
"postponed": "Posticipato",
"postponed_to": "Posticipato al",
"season_window_label": "Finestra stagionale (mesi)",
"season_window_hint": "Scade solo nei mesi selezionati; le date fuori stagione passano al mese attivo successivo. Nessuno = tutto lanno.",
"series_end_label": "Termina",
"series_end_never": "Mai (ripete allinfinito)",
"series_end_after_count": "Dopo un numero di volte",
"series_end_until": "In una data",
"series_end_count_label": "Numero di volte",
"series_end_until_label": "Data di fine"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "マニュアル抜粋",
"worksheet_pages": "ページ",
"worksheet_printed": "印刷日",
"worksheet_never": "未実施"
"worksheet_never": "未実施",
"card_all_caught_up": "すべて完了 — 対応が必要なものはありません",
"postpone": "延期",
"postpone_date_prompt": "この回をどの日付に延期しますか?",
"postpone_date_label": "新しい期日",
"postponed": "延期済み",
"postponed_to": "延期先",
"season_window_label": "季節ウィンドウ(月)",
"season_window_hint": "選択した月のみ期限;シーズン外の日付は次の有効な月へ繰り越し。なし=通年。",
"series_end_label": "終了",
"series_end_never": "なし(無期限に繰り返す)",
"series_end_after_count": "回数の後",
"series_end_until": "日付で",
"series_end_count_label": "回数",
"series_end_until_label": "終了日"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Utdrag fra manualen",
"worksheet_pages": "sider",
"worksheet_printed": "Skrevet ut",
"worksheet_never": "Aldri"
"worksheet_never": "Aldri",
"card_all_caught_up": "Alt er i orden — ingenting trenger oppmerksomhet",
"postpone": "Utsett",
"postpone_date_prompt": "Utsett denne forekomsten til hvilken dato?",
"postpone_date_label": "Ny forfallsdato",
"postponed": "Utsatt",
"postponed_to": "Utsatt til",
"season_window_label": "Sesongvindu (måneder)",
"season_window_hint": "Forfaller kun i valgte måneder; datoer utenfor sesongen flyttes til neste aktive måned. Ingen = hele året.",
"series_end_label": "Slutter",
"series_end_never": "Aldri (gjentas uendelig)",
"series_end_after_count": "Etter et antall ganger",
"series_end_until": "På en dato",
"series_end_count_label": "Antall ganger",
"series_end_until_label": "Sluttdato"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Handleidingfragment",
"worksheet_pages": "pagina's",
"worksheet_printed": "Afgedrukt",
"worksheet_never": "Nooit"
"worksheet_never": "Nooit",
"card_all_caught_up": "Alles bijgewerkt — niets vraagt aandacht",
"postpone": "Uitstellen",
"postpone_date_prompt": "Deze keer uitstellen tot welke datum?",
"postpone_date_label": "Nieuwe vervaldatum",
"postponed": "Uitgesteld",
"postponed_to": "Uitgesteld tot",
"season_window_label": "Seizoensvenster (maanden)",
"season_window_hint": "Alleen verschuldigd in de gekozen maanden; data buiten het seizoen schuiven naar de volgende actieve maand. Geen = hele jaar.",
"series_end_label": "Eindigt",
"series_end_never": "Nooit (herhaalt onbeperkt)",
"series_end_after_count": "Na een aantal keer",
"series_end_until": "Op een datum",
"series_end_count_label": "Aantal keer",
"series_end_until_label": "Einddatum"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Fragment instrukcji",
"worksheet_pages": "strony",
"worksheet_printed": "Wydrukowano",
"worksheet_never": "Nigdy"
"worksheet_never": "Nigdy",
"card_all_caught_up": "Wszystko zrobione — nic nie wymaga uwagi",
"postpone": "Odłóż",
"postpone_date_prompt": "Przełożyć ten termin na jaką datę?",
"postpone_date_label": "Nowa data",
"postponed": "Odłożono",
"postponed_to": "Odłożono do",
"season_window_label": "Okno sezonowe (miesiące)",
"season_window_hint": "Termin tylko w wybranych miesiącach; daty poza sezonem przechodzą na następny aktywny miesiąc. Brak = cały rok.",
"series_end_label": "Kończy się",
"series_end_never": "Nigdy (powtarza bez końca)",
"series_end_after_count": "Po liczbie razy",
"series_end_until": "W dniu",
"series_end_count_label": "Liczba razy",
"series_end_until_label": "Data końcowa"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Excerto do manual",
"worksheet_pages": "páginas",
"worksheet_printed": "Impresso",
"worksheet_never": "Nunca"
"worksheet_never": "Nunca",
"card_all_caught_up": "Tudo em dia — nada requer atenção",
"postpone": "Adiar",
"postpone_date_prompt": "Adiar esta ocorrência para qual data?",
"postpone_date_label": "Nova data de vencimento",
"postponed": "Adiado",
"postponed_to": "Adiado para",
"season_window_label": "Janela sazonal (meses)",
"season_window_hint": "Só vence nos meses selecionados; datas fora de época passam para o próximo mês ativo. Nenhum = todo o ano.",
"series_end_label": "Termina",
"series_end_never": "Nunca (repete indefinidamente)",
"series_end_after_count": "Após um número de vezes",
"series_end_until": "Numa data",
"series_end_count_label": "Número de vezes",
"series_end_until_label": "Data final"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Выдержка из руководства",
"worksheet_pages": "страницы",
"worksheet_printed": "Напечатано",
"worksheet_never": "Никогда"
"worksheet_never": "Никогда",
"card_all_caught_up": "Всё выполнено — ничего не требует внимания",
"postpone": "Отложить",
"postpone_date_prompt": "На какую дату отложить этот раз?",
"postpone_date_label": "Новый срок",
"postponed": "Отложено",
"postponed_to": "Отложено до",
"season_window_label": "Сезонное окно (месяцы)",
"season_window_hint": "Срок только в выбранные месяцы; даты вне сезона переносятся на следующий активный месяц. Нет = весь год.",
"series_end_label": "Заканчивается",
"series_end_never": "Никогда (повторяется бесконечно)",
"series_end_after_count": "После числа раз",
"series_end_until": "В дату",
"series_end_count_label": "Число раз",
"series_end_until_label": "Дата окончания"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Utdrag ur manualen",
"worksheet_pages": "sidor",
"worksheet_printed": "Utskriven",
"worksheet_never": "Aldrig"
"worksheet_never": "Aldrig",
"card_all_caught_up": "Allt klart — inget behöver åtgärdas",
"postpone": "Skjut upp",
"postpone_date_prompt": "Skjut upp den här gången till vilket datum?",
"postpone_date_label": "Nytt förfallodatum",
"postponed": "Uppskjuten",
"postponed_to": "Uppskjuten till",
"season_window_label": "Säsongsfönster (månader)",
"season_window_hint": "Förfaller endast valda månader; datum utanför säsongen flyttas till nästa aktiva månad. Inga = hela året.",
"series_end_label": "Slutar",
"series_end_never": "Aldrig (upprepas i oändlighet)",
"series_end_after_count": "Efter ett antal gånger",
"series_end_until": "På ett datum",
"series_end_count_label": "Antal gånger",
"series_end_until_label": "Slutdatum"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "Витяг з посібника",
"worksheet_pages": "сторінки",
"worksheet_printed": "Надруковано",
"worksheet_never": "Ніколи"
"worksheet_never": "Ніколи",
"card_all_caught_up": "Усе виконано — ніщо не потребує уваги",
"postpone": "Відкласти",
"postpone_date_prompt": "На яку дату відкласти цей раз?",
"postpone_date_label": "Новий термін",
"postponed": "Відкладено",
"postponed_to": "Відкладено до",
"season_window_label": "Сезонне вікно (місяці)",
"season_window_hint": "Термін лише у вибрані місяці; дати поза сезоном переносяться на наступний активний місяць. Немає = весь рік.",
"series_end_label": "Завершується",
"series_end_never": "Ніколи (повторюється безкінечно)",
"series_end_after_count": "Після кількості разів",
"series_end_until": "У дату",
"series_end_count_label": "Кількість разів",
"series_end_until_label": "Дата завершення"
}
@@ -692,5 +692,19 @@
"worksheet_manual_excerpt": "手册摘录",
"worksheet_pages": "页",
"worksheet_printed": "打印于",
"worksheet_never": "从未"
"worksheet_never": "从未",
"card_all_caught_up": "全部完成——没有需要处理的事项",
"postpone": "推迟",
"postpone_date_prompt": "将此次推迟到哪一天?",
"postpone_date_label": "新的到期日",
"postponed": "已推迟",
"postponed_to": "推迟至",
"season_window_label": "季节窗口(月份)",
"season_window_hint": "仅在所选月份到期;非当季日期顺延至下一个活动月份。无 = 全年。",
"series_end_label": "结束",
"series_end_never": "从不(无限重复)",
"series_end_after_count": "达到次数后",
"series_end_until": "在某日期",
"series_end_count_label": "次数",
"series_end_until_label": "结束日期"
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
import{a as f}from"./chunk-6EEEWEML.js";import{a as h,b as o,d as b,e as m,f as g,g as n,h as _,j as a,l as v,s as p}from"./chunk-2LLDFX26.js";import{a as i}from"./chunk-LO2NM3CE.js";var s=class extends m{constructor(){super(...arguments);this._config={type:""};this._status=null;this._busy=!1;this._error="";this._localMonthly="";this._localYearly="";this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load(),v(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/budget_status"});this._status=t,this._localMonthly=t.monthly_budget?String(t.monthly_budget):"",this._localYearly=t.yearly_budget?String(t.yearly_budget):"",this._dirty=!1}catch(t){this._error=p(t,this._lang)}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=parseFloat(this._localMonthly),e=parseFloat(this._localYearly),r={};!isNaN(t)&&t>=0&&(r.budget_monthly=t),!isNaN(e)&&e>=0&&(r.budget_yearly=e),await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/global/update",settings:r}),await this._load()}catch(t){this._error=p(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_budget"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,e=this._status;if(!e)return o`<ha-card><div class="loading">${a("loading",t)||"Loading\u2026"}</div></ha-card>`;let r=e.currency_symbol||_,l=e.monthly_budget?Math.min(100,(e.monthly_spent||0)/e.monthly_budget*100):0,d=e.yearly_budget?Math.min(100,(e.yearly_spent||0)/e.yearly_budget*100):0,u=l>=100?"danger":l>=80?"warning":"ok",y=d>=100?"danger":d>=80?"warning":"ok";return o`
import{a as f}from"./chunk-SHU63LHK.js";import{a as h,b as o,d as b,e as m,f as g,g as n,h as _,j as a,l as v,s as p}from"./chunk-GKOWV2CF.js";import{a as i}from"./chunk-LO2NM3CE.js";var s=class extends m{constructor(){super(...arguments);this._config={type:""};this._status=null;this._busy=!1;this._error="";this._localMonthly="";this._localYearly="";this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load(),v(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/budget_status"});this._status=t,this._localMonthly=t.monthly_budget?String(t.monthly_budget):"",this._localYearly=t.yearly_budget?String(t.yearly_budget):"",this._dirty=!1}catch(t){this._error=p(t,this._lang)}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=parseFloat(this._localMonthly),e=parseFloat(this._localYearly),r={};!isNaN(t)&&t>=0&&(r.budget_monthly=t),!isNaN(e)&&e>=0&&(r.budget_yearly=e),await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/global/update",settings:r}),await this._load()}catch(t){this._error=p(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_budget"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,e=this._status;if(!e)return o`<ha-card><div class="loading">${a("loading",t)||"Loading\u2026"}</div></ha-card>`;let r=e.currency_symbol||_,l=e.monthly_budget?Math.min(100,(e.monthly_spent||0)/e.monthly_budget*100):0,d=e.yearly_budget?Math.min(100,(e.yearly_spent||0)/e.yearly_budget*100):0,u=l>=100?"danger":l>=80?"warning":"ok",y=d>=100?"danger":d>=80?"warning":"ok";return o`
<ha-card>
<div class="card-content">
<div class="header">
@@ -1,4 +1,4 @@
import{a as r}from"./chunk-2LLDFX26.js";var a=r`
import{a as r}from"./chunk-GKOWV2CF.js";var a=r`
ha-card { overflow: hidden; }
.card-content {
padding: 16px;
@@ -1,4 +1,4 @@
import{a as m}from"./chunk-6EEEWEML.js";import{a as u,b as s,d as l,e as h,f as g,g as o,j as i,l as _,s as p}from"./chunk-2LLDFX26.js";import{a}from"./chunk-LO2NM3CE.js";var e=class extends h{constructor(){super(...arguments);this._config={type:""};this._groups={};this._loaded=!1;this._busy=!1;this._error="";this._newName="";this._editingId=null;this._editingName="";this._hasInitiallyLoaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._hasInitiallyLoaded&&(this._hasInitiallyLoaded=!0,this._load(),_(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/groups"});this._groups=t.groups||{},this._loaded=!0}catch(t){this._error=p(t,this._lang)}}async _addGroup(){if(!this._isAdmin)return;let t=this._newName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/create",name:t}),this._newName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}_startEdit(t){this._editingId=t,this._editingName=this._groups[t]?.name||""}async _saveEdit(){if(!this._isAdmin||!this._editingId)return;let t=this._editingName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/update",group_id:this._editingId,name:t}),this._editingId=null,this._editingName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}async _deleteGroup(t,r){if(!this._isAdmin)return;let n=(i("group_delete_confirm",this._lang)||'Delete group "{name}"?').replace("{name}",r);if(window.confirm(n)){this._busy=!0;try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/delete",group_id:t}),await this._load()}catch(d){this._error=p(d,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_groups"),window.dispatchEvent(new CustomEvent("location-changed"))}_onKeyDown(t,r){t.key==="Enter"?(t.preventDefault(),r()):t.key==="Escape"&&(t.preventDefault(),this._editingId=null,this._editingName="")}render(){let t=this._lang;if(!this._loaded)return s`<ha-card><div class="loading">${i("loading",t)||"Loading\u2026"}</div></ha-card>`;let r=Object.keys(this._groups);return s`
import{a as m}from"./chunk-SHU63LHK.js";import{a as u,b as s,d as l,e as h,f as g,g as o,j as i,l as _,s as p}from"./chunk-GKOWV2CF.js";import{a}from"./chunk-LO2NM3CE.js";var e=class extends h{constructor(){super(...arguments);this._config={type:""};this._groups={};this._loaded=!1;this._busy=!1;this._error="";this._newName="";this._editingId=null;this._editingName="";this._hasInitiallyLoaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._hasInitiallyLoaded&&(this._hasInitiallyLoaded=!0,this._load(),_(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/groups"});this._groups=t.groups||{},this._loaded=!0}catch(t){this._error=p(t,this._lang)}}async _addGroup(){if(!this._isAdmin)return;let t=this._newName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/create",name:t}),this._newName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}_startEdit(t){this._editingId=t,this._editingName=this._groups[t]?.name||""}async _saveEdit(){if(!this._isAdmin||!this._editingId)return;let t=this._editingName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/update",group_id:this._editingId,name:t}),this._editingId=null,this._editingName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}async _deleteGroup(t,r){if(!this._isAdmin)return;let n=(i("group_delete_confirm",this._lang)||'Delete group "{name}"?').replace("{name}",r);if(window.confirm(n)){this._busy=!0;try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/delete",group_id:t}),await this._load()}catch(d){this._error=p(d,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_groups"),window.dispatchEvent(new CustomEvent("location-changed"))}_onKeyDown(t,r){t.key==="Enter"?(t.preventDefault(),r()):t.key==="Escape"&&(t.preventDefault(),this._editingId=null,this._editingName="")}render(){let t=this._lang;if(!this._loaded)return s`<ha-card><div class="loading">${i("loading",t)||"Loading\u2026"}</div></ha-card>`;let r=Object.keys(this._groups);return s`
<ha-card>
<div class="card-content">
<div class="header">
@@ -1,4 +1,4 @@
import{a as m}from"./chunk-6EEEWEML.js";import{a as h,b as n,d as c,e as _,f as v,g as r,j as e,l as f,s as l}from"./chunk-2LLDFX26.js";import{a as i}from"./chunk-LO2NM3CE.js";var a=class extends _{constructor(){super(...arguments);this._config={type:""};this._state=null;this._busy=!1;this._error="";this._localStart="";this._localEnd="";this._localBuffer=7;this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load(),f(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/state"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||"",this._localBuffer=t.buffer_days??7,this._dirty=!1}catch(t){this._error=l(t,this._lang)}}async _toggleEnabled(t){this._busy=!0,this._error="";try{let s=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",enabled:t});this._state=s}catch(s){this._error=l(s,this._lang)}finally{this._busy=!1}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",start:this._localStart||null,end:this._localEnd||null,buffer_days:this._localBuffer});this._state=t,this._dirty=!1}catch(t){this._error=l(t,this._lang)}finally{this._busy=!1}}}async _endNow(){if(this._isAdmin&&window.confirm(e("vacation_end_now_confirm",this._lang)||"End vacation immediately?")){this._busy=!0;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/end_now"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||""}catch(t){this._error=l(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_vacation"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,s=this._state;if(!s)return n`<ha-card><div class="loading">${e("loading",t)||"Loading\u2026"}</div></ha-card>`;let p=s.is_active===!0,d=s.enabled===!0,u=s.exempt_task_ids?.length??0,b=p?e("vacation_status_active",t)||"Active now":d?e("vacation_status_scheduled",t)||"Scheduled":e("vacation_status_inactive",t)||"Inactive",g=p?"active":d?"scheduled":"inactive";return n`
import{a as m}from"./chunk-SHU63LHK.js";import{a as h,b as n,d as c,e as _,f as v,g as r,j as e,l as f,s as l}from"./chunk-GKOWV2CF.js";import{a as i}from"./chunk-LO2NM3CE.js";var a=class extends _{constructor(){super(...arguments);this._config={type:""};this._state=null;this._busy=!1;this._error="";this._localStart="";this._localEnd="";this._localBuffer=7;this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load(),f(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/state"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||"",this._localBuffer=t.buffer_days??7,this._dirty=!1}catch(t){this._error=l(t,this._lang)}}async _toggleEnabled(t){this._busy=!0,this._error="";try{let s=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",enabled:t});this._state=s}catch(s){this._error=l(s,this._lang)}finally{this._busy=!1}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",start:this._localStart||null,end:this._localEnd||null,buffer_days:this._localBuffer});this._state=t,this._dirty=!1}catch(t){this._error=l(t,this._lang)}finally{this._busy=!1}}}async _endNow(){if(this._isAdmin&&window.confirm(e("vacation_end_now_confirm",this._lang)||"End vacation immediately?")){this._busy=!0;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/end_now"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||""}catch(t){this._error=l(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_vacation"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,s=this._state;if(!s)return n`<ha-card><div class="loading">${e("loading",t)||"Loading\u2026"}</div></ha-card>`;let p=s.is_active===!0,d=s.enabled===!0,u=s.exempt_task_ids?.length??0,b=p?e("vacation_status_active",t)||"Active now":d?e("vacation_status_scheduled",t)||"Scheduled":e("vacation_status_inactive",t)||"Inactive",g=p?"active":d?"scheduled":"inactive";return n`
<ha-card>
<div class="card-content">
<div class="header">
File diff suppressed because one or more lines are too long