217 files
This commit is contained in:
@@ -159,6 +159,11 @@ dashboards. These files are designed for editing. Load
|
||||
`home-assistant-configuration` before changing one — it carries the mandatory
|
||||
style guide, the safe-write path, and the reload/restart rules.
|
||||
|
||||
Automation edits are complete only after the approved safe write, approved
|
||||
`automation.reload` via `call_service`, and read-only load verification. Report
|
||||
saved/reloaded/verified separately. If reload is unapproved or unavailable in the
|
||||
current tool profile, report it as pending; never bypass the profile via shell.
|
||||
|
||||
### 2. MCP tools (runtime API)
|
||||
|
||||
Real-time interaction with the running instance:
|
||||
@@ -182,8 +187,8 @@ is missing, the profile is reduced — say so instead of working around it.
|
||||
### 3. hab CLI (Home Assistant Builder)
|
||||
|
||||
A CLI designed for AI agents, pre-authenticated via the Supervisor token. It is
|
||||
the primary path for dashboards, areas/floors/zones/labels, helpers, scripts,
|
||||
scenes, blueprints, backups, people, categories, to-do lists, notifications,
|
||||
the primary path for dashboards, areas/floors/zones/labels, helpers,
|
||||
blueprints, backups, people, categories, to-do lists, notifications,
|
||||
integrations, repairs, events and templates — the registry-level work that has
|
||||
no YAML file behind it.
|
||||
|
||||
|
||||
@@ -450,6 +450,15 @@ async def _async_setup_shared(hass: HomeAssistant) -> bool:
|
||||
"""
|
||||
hass.data.setdefault(DOMAIN, {})
|
||||
|
||||
# The Lovelace card / calendar card / strategy modules FIRST (#184): HA
|
||||
# builds the list of extra module scripts into index.html at the moment a
|
||||
# page is served, and the frontend does not load modules registered later
|
||||
# into an already open page. Every await below (stores, indexes) used to
|
||||
# sit in front of this line — on a slow hub a dashboard opened during
|
||||
# start-up came without our modules ("Custom element doesn't exist") until
|
||||
# a manual refresh. Register before anything that can take time.
|
||||
await async_register_card(hass)
|
||||
|
||||
# "Business day" scheduling (the day-of-month `business` flag) follows the
|
||||
# user's Workday integration when one is configured — public holidays and
|
||||
# custom working weekdays instead of the plain Mon-Fri rule (#83 follow-up).
|
||||
@@ -861,9 +870,6 @@ async def _async_setup_shared(hass: HomeAssistant) -> bool:
|
||||
# Register WebSocket commands
|
||||
async_register_commands(hass)
|
||||
|
||||
# Register Lovelace card (always available)
|
||||
await async_register_card(hass)
|
||||
|
||||
# Register listener for mobile app notification action buttons
|
||||
async def _handle_notification_action(event: Event) -> None:
|
||||
"""Handle mobile_app_notification_action events from Companion App."""
|
||||
|
||||
@@ -30,6 +30,7 @@ from .const import (
|
||||
CONF_ADVANCED_PREDICTIONS,
|
||||
CONF_ADVANCED_SCHEDULE_TIME,
|
||||
CONF_ADVANCED_SEASONAL,
|
||||
CONF_BATTERY_AUTO_RECORD_RECOVERY,
|
||||
CONF_BATTERY_LOW_PERCENT,
|
||||
CONF_BATTERY_RECOVERED_PERCENT,
|
||||
CONF_BUDGET_ALERT_THRESHOLD,
|
||||
@@ -703,6 +704,12 @@ class GlobalOptionsFlow(OptionsFlow):
|
||||
mode=selector.NumberSelectorMode.BOX,
|
||||
)
|
||||
),
|
||||
# #181 follow-up (advanced): a level-driven recovery records
|
||||
# the replacement in Battery Notes and consumes the cells.
|
||||
vol.Optional(
|
||||
CONF_BATTERY_AUTO_RECORD_RECOVERY,
|
||||
default=self._opt(CONF_BATTERY_AUTO_RECORD_RECOVERY),
|
||||
): selector.BooleanSelector(),
|
||||
vol.Optional(
|
||||
CONF_NOTIFICATIONS_ENABLED,
|
||||
default=self._opt(CONF_NOTIFICATIONS_ENABLED),
|
||||
|
||||
@@ -873,5 +873,9 @@ MISSING_ENTITY_THRESHOLD_REFRESHES = 6 # ~30 min at 5-min intervals
|
||||
CONF_BATTERY_RECOVERED_PERCENT = "battery_recovered_percent"
|
||||
DEFAULT_BATTERY_RECOVERED_PERCENT = 50
|
||||
BATTERY_RECOVERED_PERCENT_RANGE: tuple[int, int] = (20, 100)
|
||||
# #181 follow-up (advanced, default off): when the latch releases a battery
|
||||
# BECAUSE ITS LEVEL rose above the recovery threshold, record the replacement
|
||||
# in Battery Notes and consume the type's spare cells — no tap needed.
|
||||
CONF_BATTERY_AUTO_RECORD_RECOVERY = "battery_auto_record_recovery"
|
||||
# D#182: the shopping-search template is user-settable (max URL length).
|
||||
MAX_PART_SEARCH_URL_TEMPLATE_LENGTH = 500
|
||||
|
||||
@@ -56,6 +56,7 @@ interface SettingsResponse {
|
||||
battery_low_percent?: number;
|
||||
/** #180: a low battery counts as replaced only once its level is above this. */
|
||||
battery_recovered_percent?: number;
|
||||
battery_auto_record_recovery?: boolean;
|
||||
/** D#182: shopping-search URL with {q} ("" = automatic) + the automatic value in effect. */
|
||||
part_search_url_template?: string;
|
||||
part_search_url_default?: string;
|
||||
@@ -517,6 +518,28 @@ export class MaintenanceSettingsView extends LitElement {
|
||||
return runWs<T>(this, payload, { fallbackKey, busy, onError: (msg) => this._showToast(msg) });
|
||||
}
|
||||
|
||||
@state() private _compacting = false;
|
||||
|
||||
/** #170: renumber every object, task and completion sequentially — an
|
||||
* explicit, admin-only action behind a confirm (printed booklets keep the
|
||||
* old numbers, so this is never done silently). */
|
||||
private async _compactReferenceNumbers(): Promise<void> {
|
||||
const L = this._lang;
|
||||
if (this._compacting || !window.confirm(t("settings_compact_refs_confirm", L))) return;
|
||||
const res = await this._ws<{ objects: number; tasks: number; completions: number }>(
|
||||
{ type: "maintenance_supporter/reference_numbers/compact" },
|
||||
"action_error",
|
||||
(b) => { this._compacting = b; },
|
||||
);
|
||||
if (!res) return;
|
||||
this._showToast(
|
||||
t("settings_compact_refs_done", L)
|
||||
.replace("{objects}", String(res.objects))
|
||||
.replace("{tasks}", String(res.tasks))
|
||||
.replace("{completions}", String(res.completions)),
|
||||
);
|
||||
}
|
||||
|
||||
/** Bounded integer settings: an out-of-range entry used to be dropped
|
||||
* silently while the field kept showing it (bug review 2026-09-04). Now
|
||||
* it is named in a toast and the field snaps back to the stored value;
|
||||
@@ -870,6 +893,13 @@ export class MaintenanceSettingsView extends LitElement {
|
||||
${this._intSetting("battery_recovered_percent", g.battery_recovered_percent ?? 50)}
|
||||
</label>
|
||||
<div class="setting-hint">${t("settings_battery_recovered_percent_hint", L)}</div>
|
||||
<label class="setting-row">
|
||||
<span class="setting-label">${t("settings_battery_auto_record", L)}</span>
|
||||
<input type="checkbox" class="auto-record-recovery"
|
||||
.checked=${g.battery_auto_record_recovery === true}
|
||||
@change=${(e: Event) => this._updateSetting("battery_auto_record_recovery", (e.target as HTMLInputElement).checked)} />
|
||||
</label>
|
||||
<div class="setting-hint">${t("settings_battery_auto_record_hint", L)}</div>
|
||||
${this._renderBatteryNotesHint(L)}
|
||||
${this._renderBatteryLifetimes(L)}
|
||||
<div class="setting-hint">${t("settings_thresholds_hint", L)}</div>
|
||||
@@ -896,6 +926,15 @@ export class MaintenanceSettingsView extends LitElement {
|
||||
@change=${(e: Event) => this._updateSetting("ref_numbers_in_lists", (e.target as HTMLInputElement).checked)} />
|
||||
</label>
|
||||
<div class="setting-hint">${t("settings_ref_numbers_in_lists_hint", L)}</div>
|
||||
${this.hass?.user?.is_admin
|
||||
? html`<div class="setting-row">
|
||||
<span class="setting-label">${t("settings_compact_refs", L)}</span>
|
||||
<button class="btn compact-refs" ?disabled=${this._compacting} @click=${this._compactReferenceNumbers}>
|
||||
<ha-icon icon="mdi:sort-numeric-ascending"></ha-icon> ${t("settings_compact_refs", L)}
|
||||
</button>
|
||||
</div>
|
||||
<div class="setting-hint">${t("settings_compact_refs_hint", L)}</div>`
|
||||
: nothing}
|
||||
<label class="setting-row">
|
||||
<span class="setting-label">${t("settings_currency", L)}</span>
|
||||
<select .value=${live(b.currency)} @change=${(e: Event) => this._updateSetting("budget_currency", (e.target as HTMLSelectElement).value)}>
|
||||
|
||||
@@ -168,6 +168,9 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
@state() private _warning = "";
|
||||
@state() private _entryId = "";
|
||||
@state() private _taskId: string | null = null; // null = create
|
||||
/** #181: the battery fleet task takes its quantities from Battery Notes per
|
||||
* device — the parts picker is hidden for it (links there would be ignored). */
|
||||
@state() private _isFleetTask = false;
|
||||
// When openCreate is called without an entry_id and a list of objects is supplied,
|
||||
// the dialog renders an Object selector dropdown so the user can pick the parent.
|
||||
@state() private _objectChoices: Array<{ entry_id: string; name: string }> = [];
|
||||
@@ -350,6 +353,7 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
public async openCreate(entryId: string, objects?: Array<{ entry_id: string; object: { name: string } }>): Promise<void> {
|
||||
this._entryId = entryId;
|
||||
this._taskId = null;
|
||||
this._isFleetTask = false;
|
||||
this._error = "";
|
||||
this._warning = "";
|
||||
// If no entryId is preset but caller passed objects, expose them as a dropdown.
|
||||
@@ -379,6 +383,7 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
// edit mode — and picking another object re-pointed _entryId while
|
||||
// _taskId kept the old task (audit 2026-08-29).
|
||||
this._objectChoices = [];
|
||||
this._isFleetTask = task.battery_fleet_task === true;
|
||||
this._name = task.name;
|
||||
this._type = task.type;
|
||||
this._scheduleType = task.schedule_type;
|
||||
@@ -2675,7 +2680,9 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
${this._partsLoadFailed
|
||||
? html`<div class="field-help parts-load-failed">${t("parts_load_failed", L)}</div>`
|
||||
: nothing}
|
||||
${this.parts.length || this._foreignOwners.length
|
||||
${this._isFleetTask
|
||||
? html`<div class="field-help parts-fleet-hint">${t("task_parts_fleet_hint", L)}</div>`
|
||||
: this.parts.length || this._foreignOwners.length
|
||||
? html`
|
||||
<div class="field">
|
||||
<label>${t("consumes_parts_label", L)}</label>
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Práh „baterie slabá“ (%)",
|
||||
"settings_battery_recovered_percent": "Baterie se považuje za vyměněnou nad (%)",
|
||||
"settings_battery_recovered_percent_hint": "Slabá baterie se počítá jako slabá, dokud její stav nevystoupí nad tuto hodnotu nebo není zaznamenána výměna — stav kolísající kolem prahu tak nedokončuje úlohu flotily stále dokola.",
|
||||
"settings_battery_auto_record": "Automaticky zaznamenat výměnu, když se vybitá baterie zotaví",
|
||||
"settings_battery_auto_record_hint": "Když se vybitá baterie dostane nad práh zotavení, datum výměny se zapíše do Battery Notes a náhradní články se odečtou ze zásoby — bez jediného klepnutí.",
|
||||
"settings_battery_lifetimes": "Typická životnost baterií",
|
||||
"settings_battery_lifetimes_hint": "Použije se jen u baterií bez procent: poznámka Battery Notes jen s typem a datem výměny nebo senzor hlásící pouze „slabá“. Splatnost = poslední výměna + tato životnost. Baterie hlásící úroveň mají prognózu z naměřeného vybíjení. Po třech výměnách daného typu nahradí medián intervalů vestavěnou hodnotu — vaše hodnota má vždy přednost.",
|
||||
"settings_battery_lifetime_months": "měsíců",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Akce v řádcích úkolů",
|
||||
"settings_ref_numbers_in_lists": "Referenční čísla v seznamech",
|
||||
"settings_ref_numbers_in_lists_hint": "Zobrazí štítky #8 / #8.3 před názvy objektů a úkolů v seznamu Dnes, tabulce úkolů, kartách objektů a tabulce objektů.",
|
||||
"settings_compact_refs": "Zhustit referenční čísla",
|
||||
"settings_compact_refs_hint": "Přečísluje všechny objekty, úkoly a dokončení popořadě (1, 2, 3 …) a zaplní mezery po smazání. Čísla již vytištěná v servisních knížkách, na fotkách nebo v poznámkách přestanou souhlasit.",
|
||||
"settings_compact_refs_confirm": "Přečíslovat všechny objekty, úkoly a dokončení průběžně v pořadí vytvoření? Čísla již zapsaná ve vytištěných servisních knížkách, na fotkách nebo v poznámkách přestanou souhlasit. Nelze vrátit zpět.",
|
||||
"settings_compact_refs_done": "Přečíslováno: {objects} objektů, {tasks} úkolů a {completions} dokončení.",
|
||||
"row_actions_buttons_compact": "Tlačítka (na telefonu jen ikony)",
|
||||
"row_actions_buttons": "Tlačítka s textem",
|
||||
"row_actions_icons": "Ikony (klasické)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Používá",
|
||||
"restock_quantity_label": "Zakoupené množství",
|
||||
"consumes_parts_label": "Spotřebovává díly",
|
||||
"task_parts_fleet_hint": "Počty baterií pocházejí z Battery Notes pro každé zařízení — tady není co propojovat.",
|
||||
"shared_parts_other_objects": "Díly z jiných objektů",
|
||||
"shared_parts_help": "Několik objektů může sdílet jeden sklad. Dokončení tohoto úkolu odečte zásobu z vlastnícího objektu.",
|
||||
"shared_part_unknown": "Neznámý díl",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Tærskel „batteri lavt“ (%)",
|
||||
"settings_battery_recovered_percent": "Batteri regnes som udskiftet over (%)",
|
||||
"settings_battery_recovered_percent_hint": "Et lavt batteri tælles som lavt, indtil niveauet stiger over denne værdi, eller et skift registreres — så kan et niveau, der svinger omkring tærsklen, ikke fuldføre flådeopgaven igen og igen.",
|
||||
"settings_battery_auto_record": "Registrér udskiftning automatisk, når et svagt batteri kommer sig",
|
||||
"settings_battery_auto_record_hint": "Når et batteri, der var svagt, stiger over gendannelsestærsklen, registreres udskiftningsdatoen i Battery Notes, og reservecellerne trækkes fra lageret — uden et tryk.",
|
||||
"settings_battery_lifetimes": "Typiske batterilevetider",
|
||||
"settings_battery_lifetimes_hint": "Bruges kun til batterier uden procent: en Battery Notes-note med kun type og udskiftningsdato, eller en sensor der kun melder \"lavt\". Forfaldsdato = seneste udskiftning + denne levetid. Batterier der melder niveau får prognosen fra den målte afladning. Når flåden har set tre udskiftninger af en type, overtager medianintervallet fra den indbyggede værdi — din egen værdi vinder altid.",
|
||||
"settings_battery_lifetime_months": "måneder",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Handlinger i opgaverækker",
|
||||
"settings_ref_numbers_in_lists": "Referencenumre i lister",
|
||||
"settings_ref_numbers_in_lists_hint": "Viser brikkerne #8 / #8.3 foran objekt- og opgavenavne i I dag-listen, opgavetabellen, objektkortene og objekttabellen.",
|
||||
"settings_compact_refs": "Komprimér referencenumre",
|
||||
"settings_compact_refs_hint": "Omnummererer alle objekter, opgaver og udførelser i rækkefølge (1, 2, 3 …) og lukker hullerne efter sletninger. Numre, der allerede står i servicehæfter, på fotos eller noter, passer ikke længere.",
|
||||
"settings_compact_refs_confirm": "Omnummerér alle objekter, opgaver og udførelser fortløbende i oprettelsesrækkefølge? Numre, der allerede står i udskrevne servicehæfter, på fotos eller noter, passer ikke længere. Dette kan ikke fortrydes.",
|
||||
"settings_compact_refs_done": "Omnummererede {objects} objekter, {tasks} opgaver og {completions} udførelser.",
|
||||
"row_actions_buttons_compact": "Knapper (kun ikoner på telefonen)",
|
||||
"row_actions_buttons": "Knapper med tekst",
|
||||
"row_actions_icons": "Ikoner (klassisk)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Bruges af",
|
||||
"restock_quantity_label": "Købt mængde",
|
||||
"consumes_parts_label": "Forbruger dele",
|
||||
"task_parts_fleet_hint": "Batteriantallet kommer fra Battery Notes pr. enhed — intet at kæde sammen her.",
|
||||
"shared_parts_other_objects": "Dele fra andre objekter",
|
||||
"shared_parts_help": "Flere objekter kan dele det samme lager. Når opgaven fuldføres, trækkes der fra det ejende objekt.",
|
||||
"shared_part_unknown": "Ukendt del",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Schwelle „Batterie niedrig“ (%)",
|
||||
"settings_battery_recovered_percent": "Batterie gilt als ersetzt ab (%)",
|
||||
"settings_battery_recovered_percent_hint": "Eine niedrige Batterie bleibt so lange als niedrig gezählt, bis ihr Stand über diesen Wert steigt oder ein Wechsel erfasst wird — ein Stand, der um die Schwelle pendelt, schließt die Flottenaufgabe so nicht immer wieder ab.",
|
||||
"settings_battery_auto_record": "Wechsel automatisch erfassen, wenn eine leere Batterie sich erholt",
|
||||
"settings_battery_auto_record_hint": "Steigt eine zuvor leere Batterie über die Erholungsschwelle, wird das Wechseldatum in Battery Notes eingetragen und die Ersatzzellen werden vom Bestand abgezogen – ohne Antippen.",
|
||||
"settings_battery_lifetimes": "Typische Batterie-Lebensdauern",
|
||||
"settings_battery_lifetimes_hint": "Wird nur für Batterien ohne Prozentanzeige verwendet: eine Battery-Notes-Notiz, die nur Typ und Austauschdatum kennt, oder ein Sensor, der nur „schwach“ meldet. Deren Fälligkeit ist letzter Wechsel + diese Lebensdauer. Batterien mit Füllstand bekommen ihre Prognose aus der gemessenen Entladung. Sobald die Flotte drei Wechsel eines Typs gesehen hat, ersetzt das mittlere Intervall den eingebauten Wert — dein eigener Wert gewinnt immer.",
|
||||
"settings_battery_lifetime_months": "Monate",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Aktionen in Aufgabenzeilen",
|
||||
"settings_ref_numbers_in_lists": "Referenznummern in Listen",
|
||||
"settings_ref_numbers_in_lists_hint": "Zeigt die Chips #8 / #8.3 vor Objekt- und Aufgabennamen in der Heute-Liste, der Aufgabentabelle, den Objektkarten und der Objekttabelle.",
|
||||
"settings_compact_refs": "Referenznummern verdichten",
|
||||
"settings_compact_refs_hint": "Nummeriert alle Objekte, Aufgaben und Erledigungen der Reihe nach neu (1, 2, 3 …) und schließt die Lücken gelöschter Einträge. Bereits auf Servicehefte, Fotos oder Notizen gedruckte Nummern stimmen danach nicht mehr.",
|
||||
"settings_compact_refs_confirm": "Alle Objekte, Aufgaben und Erledigungen in Anlege-Reihenfolge fortlaufend neu nummerieren? Bereits auf gedruckte Servicehefte, Fotos oder Notizen geschriebene Nummern stimmen danach nicht mehr. Das lässt sich nicht rückgängig machen.",
|
||||
"settings_compact_refs_done": "{objects} Objekte, {tasks} Aufgaben und {completions} Erledigungen neu nummeriert.",
|
||||
"row_actions_buttons_compact": "Buttons (auf dem Handy nur Symbole)",
|
||||
"row_actions_buttons": "Buttons mit Text",
|
||||
"row_actions_icons": "Symbole (klassisch)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Verwendet von",
|
||||
"restock_quantity_label": "Gekaufte Menge",
|
||||
"consumes_parts_label": "Verbraucht Teile",
|
||||
"task_parts_fleet_hint": "Die Batteriemengen kommen je Gerät aus Battery Notes – hier ist nichts zu verknüpfen.",
|
||||
"shared_parts_other_objects": "Teile anderer Objekte",
|
||||
"shared_parts_help": "Mehrere Objekte können sich einen Bestand teilen. Beim Abschließen wird vom besitzenden Objekt abgebucht.",
|
||||
"shared_part_unknown": "Unbekanntes Teil",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Battery low threshold (%)",
|
||||
"settings_battery_recovered_percent": "Battery counts as replaced above (%)",
|
||||
"settings_battery_recovered_percent_hint": "A low battery stays counted as low until its level rises above this value or a replacement is recorded — so a level hovering around the low threshold cannot complete the fleet task again and again.",
|
||||
"settings_battery_auto_record": "Record a replacement automatically when a low battery recovers",
|
||||
"settings_battery_auto_record_hint": "When a battery that was low rises above the recovery threshold, the replacement date is recorded in Battery Notes and the spare cells are taken from stock — no tap needed.",
|
||||
"settings_battery_lifetimes": "Typical battery lifetimes",
|
||||
"settings_battery_lifetimes_hint": "Only used for batteries without a percentage: a Battery Notes note that has just a type and a last-replaced date, or a sensor that only reports \"low\". Their due date is last replaced + this lifetime. Batteries that report a level get their forecast from the measured discharge instead. Once the fleet has seen three replacements of a type, the median interval takes over from the built-in value — your own value always wins.",
|
||||
"settings_battery_lifetime_months": "months",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Task row actions",
|
||||
"settings_ref_numbers_in_lists": "Reference numbers in lists",
|
||||
"settings_ref_numbers_in_lists_hint": "Show the #8 / #8.3 chips in front of object and task names in the Today list, the task table, the object cards and the objects table.",
|
||||
"settings_compact_refs": "Compact reference numbers",
|
||||
"settings_compact_refs_hint": "Renumbers all objects, tasks and completions in order (1, 2, 3 …) and closes the gaps left by deletions. Numbers already printed on service booklets, photos or notes will no longer match.",
|
||||
"settings_compact_refs_confirm": "Renumber every object, task and completion sequentially in creation order? Numbers already written on printed service booklets, photos or notes will no longer match. This cannot be undone.",
|
||||
"settings_compact_refs_done": "Renumbered {objects} objects, {tasks} tasks and {completions} completions.",
|
||||
"row_actions_buttons_compact": "Buttons (icons only on phones)",
|
||||
"row_actions_buttons": "Buttons with text",
|
||||
"row_actions_icons": "Icons (classic)",
|
||||
@@ -868,6 +874,7 @@
|
||||
"parts_used_by": "Used by",
|
||||
"restock_quantity_label": "Quantity bought",
|
||||
"consumes_parts_label": "Consumes parts",
|
||||
"task_parts_fleet_hint": "Battery quantities come from Battery Notes per device — nothing to link here.",
|
||||
"shared_parts_other_objects": "Parts from other objects",
|
||||
"shared_parts_help": "Several objects can share one stock. Completing this task takes from the owning object.",
|
||||
"shared_part_unknown": "Unknown part",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Umbral „pila baja“ (%)",
|
||||
"settings_battery_recovered_percent": "Pila considerada sustituida por encima de (%)",
|
||||
"settings_battery_recovered_percent_hint": "Una pila baja sigue contando como baja hasta que su nivel supere este valor o se registre una sustitución — así un nivel que oscila alrededor del umbral no completa la tarea de la flota una y otra vez.",
|
||||
"settings_battery_auto_record": "Registrar el reemplazo automáticamente cuando una batería baja se recupera",
|
||||
"settings_battery_auto_record_hint": "Cuando una batería que estaba baja supera el umbral de recuperación, la fecha de reemplazo se registra en Battery Notes y las pilas de repuesto se descuentan del stock — sin pulsar nada.",
|
||||
"settings_battery_lifetimes": "Duraciones típicas de las pilas",
|
||||
"settings_battery_lifetimes_hint": "Solo se usa para pilas sin porcentaje: una nota de Battery Notes que solo tiene tipo y fecha de sustitución, o un sensor que solo avisa de « baja ». Su vencimiento es última sustitución + esta duración. Las pilas que informan de un nivel obtienen su previsión de la descarga medida. Cuando la flota ha visto tres sustituciones de un tipo, el intervalo mediano sustituye al valor integrado — tu valor siempre gana.",
|
||||
"settings_battery_lifetime_months": "meses",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Acciones en las filas de tareas",
|
||||
"settings_ref_numbers_in_lists": "Números de referencia en las listas",
|
||||
"settings_ref_numbers_in_lists_hint": "Muestra las etiquetas #8 / #8.3 delante de los nombres de objetos y tareas en la lista Hoy, la tabla de tareas, las tarjetas de objetos y la tabla de objetos.",
|
||||
"settings_compact_refs": "Compactar los números de referencia",
|
||||
"settings_compact_refs_hint": "Renumera todos los objetos, tareas y realizaciones en orden (1, 2, 3 …) y cierra los huecos dejados por las eliminaciones. Los números ya impresos en libretas de servicio, fotos o notas dejarán de coincidir.",
|
||||
"settings_compact_refs_confirm": "¿Renumerar todos los objetos, tareas y realizaciones de forma correlativa por orden de creación? Los números ya escritos en libretas de servicio impresas, fotos o notas dejarán de coincidir. Esto no se puede deshacer.",
|
||||
"settings_compact_refs_done": "Se han renumerado {objects} objetos, {tasks} tareas y {completions} realizaciones.",
|
||||
"row_actions_buttons_compact": "Botones (solo iconos en el móvil)",
|
||||
"row_actions_buttons": "Botones con texto",
|
||||
"row_actions_icons": "Iconos (clásico)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Usado por",
|
||||
"restock_quantity_label": "Cantidad comprada",
|
||||
"consumes_parts_label": "Consume piezas",
|
||||
"task_parts_fleet_hint": "Las cantidades de pilas vienen de Battery Notes por dispositivo — aquí no hay nada que vincular.",
|
||||
"shared_parts_other_objects": "Piezas de otros objetos",
|
||||
"shared_parts_help": "Varios objetos pueden compartir un mismo stock. Al completar esta tarea se descuenta del objeto propietario.",
|
||||
"shared_part_unknown": "Pieza desconocida",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Kynnys „paristo vähissä“ (%)",
|
||||
"settings_battery_recovered_percent": "Paristo lasketaan vaihdetuksi yli (%)",
|
||||
"settings_battery_recovered_percent_hint": "Vähissä oleva paristo lasketaan vähissä olevaksi, kunnes sen taso nousee tämän arvon yli tai vaihto kirjataan — näin kynnyksen ympärillä heilahteleva taso ei suorita laivastotehtävää yhä uudelleen.",
|
||||
"settings_battery_auto_record": "Kirjaa vaihto automaattisesti, kun tyhjä paristo toipuu",
|
||||
"settings_battery_auto_record_hint": "Kun tyhjänä ollut paristo nousee toipumisrajan yläpuolelle, vaihtopäivä kirjataan Battery Notesiin ja varaparistot vähennetään varastosta — ilman yhtään napautusta.",
|
||||
"settings_battery_lifetimes": "Paristojen tyypilliset käyttöiät",
|
||||
"settings_battery_lifetimes_hint": "Käytetään vain paristoille ilman prosenttilukua: Battery Notes -merkintä, jolla on vain tyyppi ja vaihtopäivä, tai anturi, joka ilmoittaa vain ”vähissä”. Erääntyminen = viimeisin vaihto + tämä käyttöikä. Tasoa raportoivien paristojen ennuste tulee mitatusta purkautumisesta. Kun laivasto on nähnyt kolme saman tyypin vaihtoa, mediaaniväli korvaa sisäänrakennetun arvon — oma arvosi voittaa aina.",
|
||||
"settings_battery_lifetime_months": "kuukautta",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Tehtävärivien toiminnot",
|
||||
"settings_ref_numbers_in_lists": "Viitenumerot luetteloissa",
|
||||
"settings_ref_numbers_in_lists_hint": "Näyttää tunnisteet #8 / #8.3 kohteiden ja tehtävien nimien edessä Tänään-luettelossa, tehtävätaulukossa, kohdekorteissa ja kohdetaulukossa.",
|
||||
"settings_compact_refs": "Tiivistä viitenumerot",
|
||||
"settings_compact_refs_hint": "Numeroi kaikki kohteet, tehtävät ja suoritukset uudelleen järjestyksessä (1, 2, 3 …) ja täyttää poistojen jättämät aukot. Huoltokirjoihin, kuviin tai muistiinpanoihin jo painetut numerot eivät enää täsmää.",
|
||||
"settings_compact_refs_confirm": "Numeroidaanko kaikki kohteet, tehtävät ja suoritukset uudelleen juoksevasti luontijärjestyksessä? Painettuihin huoltokirjoihin, kuviin tai muistiinpanoihin jo kirjoitetut numerot eivät enää täsmää. Tätä ei voi perua.",
|
||||
"settings_compact_refs_done": "Numeroitiin uudelleen {objects} kohdetta, {tasks} tehtävää ja {completions} suoritusta.",
|
||||
"row_actions_buttons_compact": "Painikkeet (puhelimessa vain kuvakkeet)",
|
||||
"row_actions_buttons": "Painikkeet tekstillä",
|
||||
"row_actions_icons": "Kuvakkeet (perinteinen)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Käyttäjät",
|
||||
"restock_quantity_label": "Ostettu määrä",
|
||||
"consumes_parts_label": "Kuluttaa osia",
|
||||
"task_parts_fleet_hint": "Paristomäärät tulevat laitekohtaisesti Battery Notesista — tässä ei ole mitään liitettävää.",
|
||||
"shared_parts_other_objects": "Muiden kohteiden osat",
|
||||
"shared_parts_help": "Useat kohteet voivat jakaa saman varaston. Tämän tehtävän suorittaminen vähentää omistavan kohteen varastoa.",
|
||||
"shared_part_unknown": "Tuntematon osa",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Seuil « pile faible » (%)",
|
||||
"settings_battery_recovered_percent": "Pile considérée remplacée au-dessus de (%)",
|
||||
"settings_battery_recovered_percent_hint": "Une pile faible reste comptée comme faible tant que son niveau ne dépasse pas cette valeur ou qu'un remplacement n'est pas enregistré — un niveau qui oscille autour du seuil ne peut ainsi plus terminer la tâche du parc encore et encore.",
|
||||
"settings_battery_auto_record": "Enregistrer automatiquement un remplacement quand une pile faible se rétablit",
|
||||
"settings_battery_auto_record_hint": "Quand une pile qui était faible repasse au-dessus du seuil de rétablissement, la date de remplacement est enregistrée dans Battery Notes et les piles de rechange sont retirées du stock — sans aucune action.",
|
||||
"settings_battery_lifetimes": "Durées de vie typiques des piles",
|
||||
"settings_battery_lifetimes_hint": "Utilisé uniquement pour les piles sans pourcentage : une note Battery Notes qui ne connaît qu'un type et une date de remplacement, ou un capteur qui ne signale que « faible ». Leur échéance est dernier remplacement + cette durée. Les piles qui remontent un niveau sont prévues d'après la décharge mesurée. Dès que le parc a vu trois remplacements d'un type, l'intervalle médian remplace la valeur intégrée — votre valeur l'emporte toujours.",
|
||||
"settings_battery_lifetime_months": "mois",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Actions des lignes de tâches",
|
||||
"settings_ref_numbers_in_lists": "Numéros de référence dans les listes",
|
||||
"settings_ref_numbers_in_lists_hint": "Affiche les puces #8 / #8.3 devant les noms d'objets et de tâches dans la liste Aujourd'hui, le tableau des tâches, les cartes d'objets et le tableau des objets.",
|
||||
"settings_compact_refs": "Compacter les numéros de référence",
|
||||
"settings_compact_refs_hint": "Renumérote tous les objets, tâches et réalisations dans l'ordre (1, 2, 3 …) et comble les trous laissés par les suppressions. Les numéros déjà imprimés sur des carnets d'entretien, photos ou notes ne correspondront plus.",
|
||||
"settings_compact_refs_confirm": "Renuméroter tous les objets, tâches et réalisations dans l'ordre de création ? Les numéros déjà écrits sur des carnets d'entretien imprimés, photos ou notes ne correspondront plus. Cette action est irréversible.",
|
||||
"settings_compact_refs_done": "{objects} objets, {tasks} tâches et {completions} réalisations renumérotés.",
|
||||
"row_actions_buttons_compact": "Boutons (icônes seules sur téléphone)",
|
||||
"row_actions_buttons": "Boutons avec texte",
|
||||
"row_actions_icons": "Icônes (classique)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Utilisé par",
|
||||
"restock_quantity_label": "Quantité achetée",
|
||||
"consumes_parts_label": "Consomme des pièces",
|
||||
"task_parts_fleet_hint": "Les quantités de piles viennent de Battery Notes, appareil par appareil — rien à lier ici.",
|
||||
"shared_parts_other_objects": "Pièces d'autres objets",
|
||||
"shared_parts_help": "Plusieurs objets peuvent partager un même stock. Terminer cette tâche décompte du stock de l'objet propriétaire.",
|
||||
"shared_part_unknown": "Pièce inconnue",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "बैटरी „कम“ सीमा (%)",
|
||||
"settings_battery_recovered_percent": "इससे ऊपर बैटरी बदली हुई मानी जाएगी (%)",
|
||||
"settings_battery_recovered_percent_hint": "कम बैटरी तब तक कम गिनी जाती है जब तक उसका स्तर इस मान से ऊपर न हो जाए या बदलाव दर्ज न हो — ताकि सीमा के आसपास झूलता स्तर बेड़े के कार्य को बार-बार पूरा न कर दे।",
|
||||
"settings_battery_auto_record": "कम बैटरी के ठीक होने पर बदलाव स्वतः दर्ज करें",
|
||||
"settings_battery_auto_record_hint": "जब कोई कम बैटरी पुनर्प्राप्ति सीमा से ऊपर उठती है, तो बदलाव की तारीख Battery Notes में दर्ज हो जाती है और अतिरिक्त सेल स्टॉक से घटा दिए जाते हैं — बिना किसी टैप के।",
|
||||
"settings_battery_lifetimes": "बैटरी की सामान्य आयु",
|
||||
"settings_battery_lifetimes_hint": "केवल बिना प्रतिशत वाली बैटरियों के लिए: सिर्फ़ प्रकार और बदलने की तारीख वाला Battery Notes नोट, या केवल \"कम\" बताने वाला सेंसर। नियत तिथि = अंतिम बदलाव + यह आयु। स्तर बताने वाली बैटरियों का पूर्वानुमान मापे गए डिस्चार्ज से बनता है। एक प्रकार के तीन बदलाव देखने के बाद माध्यिका अंतराल अंतर्निहित मान की जगह लेता है — आपका अपना मान हमेशा प्राथमिकता पाता है।",
|
||||
"settings_battery_lifetime_months": "महीने",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "कार्य पंक्ति क्रियाएँ",
|
||||
"settings_ref_numbers_in_lists": "सूचियों में संदर्भ संख्या",
|
||||
"settings_ref_numbers_in_lists_hint": "आज सूची, कार्य तालिका, ऑब्जेक्ट कार्ड और ऑब्जेक्ट तालिका में ऑब्जेक्ट और कार्य नामों के आगे #8 / #8.3 चिप दिखाता है।",
|
||||
"settings_compact_refs": "संदर्भ संख्याएँ संकुचित करें",
|
||||
"settings_compact_refs_hint": "सभी ऑब्जेक्ट, कार्य और पूर्णताओं को क्रम में (1, 2, 3 …) फिर से क्रमांकित करता है और हटाने से बने अंतर भरता है। सेवा पुस्तिका, फ़ोटो या नोट्स पर पहले से छपी संख्याएँ फिर मेल नहीं खाएँगी।",
|
||||
"settings_compact_refs_confirm": "सभी ऑब्जेक्ट, कार्य और पूर्णताओं को निर्माण क्रम में क्रमानुसार फिर से क्रमांकित करें? छपी हुई सेवा पुस्तिका, फ़ोटो या नोट्स पर पहले से लिखी संख्याएँ फिर मेल नहीं खाएँगी। इसे पूर्ववत नहीं किया जा सकता।",
|
||||
"settings_compact_refs_done": "{objects} ऑब्जेक्ट, {tasks} कार्य और {completions} पूर्णताएँ फिर से क्रमांकित की गईं।",
|
||||
"row_actions_buttons_compact": "बटन (फ़ोन पर केवल आइकन)",
|
||||
"row_actions_buttons": "टेक्स्ट वाले बटन",
|
||||
"row_actions_icons": "आइकन (क्लासिक)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "द्वारा उपयोग",
|
||||
"restock_quantity_label": "खरीदी गई मात्रा",
|
||||
"consumes_parts_label": "पुर्ज़े खपत",
|
||||
"task_parts_fleet_hint": "बैटरी की मात्राएँ प्रति डिवाइस Battery Notes से आती हैं — यहाँ जोड़ने के लिए कुछ नहीं है।",
|
||||
"shared_parts_other_objects": "अन्य वस्तुओं के पुर्ज़े",
|
||||
"shared_parts_help": "कई वस्तुएँ एक ही स्टॉक साझा कर सकती हैं। यह कार्य पूरा करने पर स्वामी वस्तु के स्टॉक से घटाया जाता है।",
|
||||
"shared_part_unknown": "अज्ञात पुर्ज़ा",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "„Alacsony akkumulátor” küszöb (%)",
|
||||
"settings_battery_recovered_percent": "Az elem cseréltnek számít e fölött (%)",
|
||||
"settings_battery_recovered_percent_hint": "A lemerült elem addig számít lemerültnek, amíg a töltöttsége e fölé az érték fölé nem emelkedik, vagy egy cserét nem rögzítenek — így a küszöb körül ingadozó töltöttség nem zárja le újra és újra a flottafeladatot.",
|
||||
"settings_battery_auto_record": "Csere automatikus rögzítése, ha egy lemerült elem feléled",
|
||||
"settings_battery_auto_record_hint": "Ha egy korábban lemerült elem a feléledési küszöb fölé emelkedik, a csere dátuma bekerül a Battery Notesba, és a tartalék cellák lekerülnek a készletről — érintés nélkül.",
|
||||
"settings_battery_lifetimes": "Jellemző elem-élettartamok",
|
||||
"settings_battery_lifetimes_hint": "Csak százalék nélküli elemeknél használjuk: olyan Battery Notes-bejegyzésnél, amelynek csak típusa és cseredátuma van, vagy csak „alacsony”-t jelentő érzékelőnél. Esedékesség = utolsó csere + ez az élettartam. A szintet jelentő elemek előrejelzése a mért kisülésből jön. Ha a flotta már három cserét látott egy típusból, a medián időköz veszi át a beépített értéket — a saját értéked mindig nyer.",
|
||||
"settings_battery_lifetime_months": "hónap",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Műveletek a feladatsorokban",
|
||||
"settings_ref_numbers_in_lists": "Hivatkozási számok a listákban",
|
||||
"settings_ref_numbers_in_lists_hint": "Megjeleníti a #8 / #8.3 címkéket az objektum- és feladatnevek előtt a Ma listában, a feladattáblában, az objektumkártyákon és az objektumtáblában.",
|
||||
"settings_compact_refs": "Hivatkozási számok tömörítése",
|
||||
"settings_compact_refs_hint": "Sorban újraszámozza az összes objektumot, feladatot és elvégzést (1, 2, 3 …), és bezárja a törlések hagyta réseket. A szervizfüzetekre, fotókra vagy jegyzetekre már rányomtatott számok ezután nem egyeznek.",
|
||||
"settings_compact_refs_confirm": "Újraszámozza az összes objektumot, feladatot és elvégzést folyamatosan, létrehozási sorrendben? A nyomtatott szervizfüzetekre, fotókra vagy jegyzetekre már felírt számok ezután nem egyeznek. Ez nem vonható vissza.",
|
||||
"settings_compact_refs_done": "Újraszámozva: {objects} objektum, {tasks} feladat és {completions} elvégzés.",
|
||||
"row_actions_buttons_compact": "Gombok (telefonon csak ikonok)",
|
||||
"row_actions_buttons": "Gombok szöveggel",
|
||||
"row_actions_icons": "Ikonok (klasszikus)",
|
||||
@@ -868,6 +874,7 @@
|
||||
"parts_used_by": "Használja",
|
||||
"restock_quantity_label": "Vásárolt mennyiség",
|
||||
"consumes_parts_label": "Felhasznált alkatrészek",
|
||||
"task_parts_fleet_hint": "Az elemek darabszáma eszközönként a Battery Notesból jön — itt nincs mit összekapcsolni.",
|
||||
"shared_parts_other_objects": "Más objektumok alkatrészei",
|
||||
"shared_parts_help": "Több objektum is használhatja ugyanazt a készletet. A feladat elvégzése a tulajdonos objektum készletéből von le.",
|
||||
"shared_part_unknown": "Ismeretlen alkatrész",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Soglia „batteria scarica“ (%)",
|
||||
"settings_battery_recovered_percent": "Batteria considerata sostituita sopra (%)",
|
||||
"settings_battery_recovered_percent_hint": "Una batteria scarica resta conteggiata come scarica finché il livello non supera questo valore o non viene registrata una sostituzione — così un livello che oscilla attorno alla soglia non completa di continuo l'attività della flotta.",
|
||||
"settings_battery_auto_record": "Registra automaticamente la sostituzione quando una batteria scarica si riprende",
|
||||
"settings_battery_auto_record_hint": "Quando una batteria che era scarica supera la soglia di ripresa, la data di sostituzione viene registrata in Battery Notes e le pile di ricambio vengono scalate dalla scorta — senza alcun tocco.",
|
||||
"settings_battery_lifetimes": "Durate tipiche delle batterie",
|
||||
"settings_battery_lifetimes_hint": "Usato solo per batterie senza percentuale: una nota Battery Notes con solo tipo e data di sostituzione, o un sensore che segnala solo « scarica ». La scadenza è ultima sostituzione + questa durata. Le batterie che riportano un livello ricavano la previsione dalla scarica misurata. Dopo tre sostituzioni dello stesso tipo, l'intervallo mediano sostituisce il valore integrato — il tuo valore vince sempre.",
|
||||
"settings_battery_lifetime_months": "mesi",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Azioni nelle righe delle attività",
|
||||
"settings_ref_numbers_in_lists": "Numeri di riferimento negli elenchi",
|
||||
"settings_ref_numbers_in_lists_hint": "Mostra le etichette #8 / #8.3 davanti ai nomi di oggetti e attività nell'elenco Oggi, nella tabella delle attività, nelle schede degli oggetti e nella tabella degli oggetti.",
|
||||
"settings_compact_refs": "Compatta i numeri di riferimento",
|
||||
"settings_compact_refs_hint": "Rinumera tutti gli oggetti, le attività e i completamenti in ordine (1, 2, 3 …) e chiude i vuoti lasciati dalle eliminazioni. I numeri già stampati su libretti di manutenzione, foto o note non corrisponderanno più.",
|
||||
"settings_compact_refs_confirm": "Rinumerare in sequenza tutti gli oggetti, le attività e i completamenti in ordine di creazione? I numeri già scritti su libretti di manutenzione stampati, foto o note non corrisponderanno più. L'operazione non può essere annullata.",
|
||||
"settings_compact_refs_done": "Rinumerati {objects} oggetti, {tasks} attività e {completions} completamenti.",
|
||||
"row_actions_buttons_compact": "Pulsanti (solo icone sul telefono)",
|
||||
"row_actions_buttons": "Pulsanti con testo",
|
||||
"row_actions_icons": "Icone (classico)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Usato da",
|
||||
"restock_quantity_label": "Quantità acquistata",
|
||||
"consumes_parts_label": "Consuma ricambi",
|
||||
"task_parts_fleet_hint": "Le quantità di batterie arrivano da Battery Notes per ogni dispositivo — qui non c'è nulla da collegare.",
|
||||
"shared_parts_other_objects": "Ricambi di altri oggetti",
|
||||
"shared_parts_help": "Più oggetti possono condividere una sola scorta. Completando questa attività si preleva dall'oggetto proprietario.",
|
||||
"shared_part_unknown": "Ricambio sconosciuto",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "電池「残量少」しきい値(%)",
|
||||
"settings_battery_recovered_percent": "この値を超えたら交換済みとみなす(%)",
|
||||
"settings_battery_recovered_percent_hint": "残量が少ない電池は、残量がこの値を超えるか交換が記録されるまで「残量少」として数えられます。しきい値付近で変動する残量が一括タスクを何度も完了させることを防ぎます。",
|
||||
"settings_battery_auto_record": "残量の少ない電池が回復したら交換を自動で記録",
|
||||
"settings_battery_auto_record_hint": "残量が少なかった電池が回復しきい値を上回ると、交換日が Battery Notes に記録され、予備の電池が在庫から差し引かれます。タップは不要です。",
|
||||
"settings_battery_lifetimes": "電池の標準寿命",
|
||||
"settings_battery_lifetimes_hint": "パーセント表示のない電池にのみ使います:種類と交換日だけの Battery Notes メモや「残量低下」しか報告しないセンサーです。期日は最終交換日+この寿命。残量を報告する電池は実測の放電から予測します。同じ種類の交換を3回記録すると、中央値の間隔が内蔵値に代わります。自分で設定した値が常に優先されます。",
|
||||
"settings_battery_lifetime_months": "か月",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "タスク行の操作",
|
||||
"settings_ref_numbers_in_lists": "一覧に参照番号を表示",
|
||||
"settings_ref_numbers_in_lists_hint": "「今日」の一覧、タスク表、オブジェクトカード、オブジェクト表で、オブジェクト名とタスク名の前に #8 / #8.3 のチップを表示します。",
|
||||
"settings_compact_refs": "参照番号を詰め直す",
|
||||
"settings_compact_refs_hint": "すべてのオブジェクト、タスク、完了記録を順番に振り直し(1、2、3…)、削除で空いた番号を詰めます。サービス手帳、写真、メモに印刷済みの番号は一致しなくなります。",
|
||||
"settings_compact_refs_confirm": "すべてのオブジェクト、タスク、完了記録を作成順に連番で振り直しますか?印刷済みのサービス手帳、写真、メモに書かれた番号は一致しなくなります。この操作は取り消せません。",
|
||||
"settings_compact_refs_done": "オブジェクト {objects} 件、タスク {tasks} 件、完了記録 {completions} 件の番号を振り直しました。",
|
||||
"row_actions_buttons_compact": "ボタン(スマートフォンではアイコンのみ)",
|
||||
"row_actions_buttons": "テキスト付きボタン",
|
||||
"row_actions_icons": "アイコン(従来)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "使用タスク",
|
||||
"restock_quantity_label": "購入数量",
|
||||
"consumes_parts_label": "部品を消費",
|
||||
"task_parts_fleet_hint": "電池の数量はデバイスごとに Battery Notes から取得されます。ここで紐づけるものはありません。",
|
||||
"shared_parts_other_objects": "他の対象の部品",
|
||||
"shared_parts_help": "複数の対象で同じ在庫を共有できます。このタスクを完了すると、所有する対象の在庫から差し引かれます。",
|
||||
"shared_part_unknown": "不明な部品",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "배터리 „부족“ 임계값 (%)",
|
||||
"settings_battery_recovered_percent": "이 값 초과 시 배터리 교체됨으로 간주 (%)",
|
||||
"settings_battery_recovered_percent_hint": "부족한 배터리는 잔량이 이 값을 초과하거나 교체가 기록될 때까지 부족으로 계속 집계됩니다. 임계값 근처에서 오르내리는 잔량이 배터리 일괄 작업을 반복 완료하지 못하게 합니다.",
|
||||
"settings_battery_auto_record": "저전량 배터리가 회복되면 교체를 자동으로 기록",
|
||||
"settings_battery_auto_record_hint": "저전량이던 배터리가 회복 임계값 위로 올라가면 교체 날짜가 Battery Notes에 기록되고 예비 전지가 재고에서 차감됩니다. 탭할 필요가 없습니다.",
|
||||
"settings_battery_lifetimes": "배터리 일반 수명",
|
||||
"settings_battery_lifetimes_hint": "백분율이 없는 배터리에만 사용됩니다: 종류와 교체일만 있는 Battery Notes 메모나 \"낮음\"만 알리는 센서입니다. 만기 = 마지막 교체 + 이 수명. 잔량을 보고하는 배터리는 실측 방전으로 예측합니다. 같은 종류의 교체를 3회 기록하면 중앙값 간격이 내장값을 대체합니다. 직접 설정한 값이 항상 우선합니다.",
|
||||
"settings_battery_lifetime_months": "개월",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "작업 행 동작",
|
||||
"settings_ref_numbers_in_lists": "목록에 참조 번호 표시",
|
||||
"settings_ref_numbers_in_lists_hint": "오늘 목록, 작업 표, 개체 카드, 개체 표에서 개체 및 작업 이름 앞에 #8 / #8.3 칩을 표시합니다.",
|
||||
"settings_compact_refs": "참조 번호 정리",
|
||||
"settings_compact_refs_hint": "모든 개체, 작업, 완료 기록을 순서대로(1, 2, 3 …) 다시 번호 매기고 삭제로 생긴 빈 번호를 채웁니다. 이미 정비 수첩, 사진, 메모에 적힌 번호는 더 이상 맞지 않습니다.",
|
||||
"settings_compact_refs_confirm": "모든 개체, 작업, 완료 기록을 생성 순서대로 연속 번호로 다시 매길까요? 인쇄된 정비 수첩, 사진, 메모에 이미 적힌 번호는 더 이상 맞지 않습니다. 되돌릴 수 없습니다.",
|
||||
"settings_compact_refs_done": "개체 {objects}개, 작업 {tasks}개, 완료 기록 {completions}개의 번호를 다시 매겼습니다.",
|
||||
"row_actions_buttons_compact": "버튼 (휴대폰에서는 아이콘만)",
|
||||
"row_actions_buttons": "텍스트가 있는 버튼",
|
||||
"row_actions_icons": "아이콘 (기본)",
|
||||
@@ -868,6 +874,7 @@
|
||||
"parts_used_by": "사용처",
|
||||
"restock_quantity_label": "구매 수량",
|
||||
"consumes_parts_label": "사용하는 부품",
|
||||
"task_parts_fleet_hint": "배터리 수량은 기기별로 Battery Notes에서 가져옵니다. 여기서 연결할 것은 없습니다.",
|
||||
"shared_parts_other_objects": "다른 객체의 부품",
|
||||
"shared_parts_help": "여러 객체가 하나의 재고를 공유할 수 있습니다. 이 작업을 완료하면 소유 객체의 재고에서 차감됩니다.",
|
||||
"shared_part_unknown": "알 수 없는 부품",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Terskel „batteri lavt“ (%)",
|
||||
"settings_battery_recovered_percent": "Batteri regnes som byttet over (%)",
|
||||
"settings_battery_recovered_percent_hint": "Et lavt batteri telles som lavt til nivået stiger over denne verdien eller et bytte registreres — slik kan et nivå som svinger rundt terskelen ikke fullføre flåteoppgaven igjen og igjen.",
|
||||
"settings_battery_auto_record": "Registrer bytte automatisk når et svakt batteri kommer seg",
|
||||
"settings_battery_auto_record_hint": "Når et batteri som var svakt stiger over gjenopprettingsterskelen, registreres byttedatoen i Battery Notes og reservecellene trekkes fra lageret — uten et trykk.",
|
||||
"settings_battery_lifetimes": "Typiske batterilevetider",
|
||||
"settings_battery_lifetimes_hint": "Brukes bare for batterier uten prosent: et Battery Notes-notat med bare type og byttedato, eller en sensor som bare melder «lavt». Forfall = siste bytte + denne levetiden. Batterier som melder nivå får prognosen fra målt utlading. Når flåten har sett tre bytter av en type, overtar medianintervallet fra den innebygde verdien — din egen verdi vinner alltid.",
|
||||
"settings_battery_lifetime_months": "måneder",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Handlinger i oppgaverader",
|
||||
"settings_ref_numbers_in_lists": "Referansenumre i lister",
|
||||
"settings_ref_numbers_in_lists_hint": "Viser brikkene #8 / #8.3 foran objekt- og oppgavenavn i I dag-listen, oppgavetabellen, objektkortene og objekttabellen.",
|
||||
"settings_compact_refs": "Komprimer referansenumre",
|
||||
"settings_compact_refs_hint": "Nummererer alle objekter, oppgaver og utførelser på nytt i rekkefølge (1, 2, 3 …) og tetter hullene etter slettinger. Numre som allerede står i servicehefter, på bilder eller notater, stemmer ikke lenger.",
|
||||
"settings_compact_refs_confirm": "Nummerere alle objekter, oppgaver og utførelser på nytt fortløpende i opprettelsesrekkefølge? Numre som allerede står i utskrevne servicehefter, på bilder eller notater, stemmer ikke lenger. Dette kan ikke angres.",
|
||||
"settings_compact_refs_done": "Nummererte på nytt {objects} objekter, {tasks} oppgaver og {completions} utførelser.",
|
||||
"row_actions_buttons_compact": "Knapper (bare ikoner på mobil)",
|
||||
"row_actions_buttons": "Knapper med tekst",
|
||||
"row_actions_icons": "Ikoner (klassisk)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Brukes av",
|
||||
"restock_quantity_label": "Kjøpt mengde",
|
||||
"consumes_parts_label": "Forbruker deler",
|
||||
"task_parts_fleet_hint": "Batteriantallet kommer fra Battery Notes per enhet — ingenting å koble her.",
|
||||
"shared_parts_other_objects": "Deler fra andre objekter",
|
||||
"shared_parts_help": "Flere objekter kan dele samme lager. Når oppgaven fullføres, trekkes det fra det eiende objektet.",
|
||||
"shared_part_unknown": "Ukjent del",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Drempel „batterij laag“ (%)",
|
||||
"settings_battery_recovered_percent": "Batterij geldt als vervangen boven (%)",
|
||||
"settings_battery_recovered_percent_hint": "Een lege batterij blijft als laag geteld tot het niveau boven deze waarde stijgt of een vervanging wordt vastgelegd — zo kan een niveau dat rond de drempel schommelt de vloottaak niet steeds opnieuw afronden.",
|
||||
"settings_battery_auto_record": "Vervanging automatisch vastleggen wanneer een lege batterij herstelt",
|
||||
"settings_battery_auto_record_hint": "Als een batterij die leeg was boven de hersteldrempel komt, wordt de vervangdatum in Battery Notes vastgelegd en worden de reservecellen van de voorraad afgeboekt — zonder tik.",
|
||||
"settings_battery_lifetimes": "Gebruikelijke batterijlevensduur",
|
||||
"settings_battery_lifetimes_hint": "Alleen gebruikt voor batterijen zonder percentage: een Battery Notes-notitie met enkel een type en een vervangdatum, of een sensor die alleen „bijna leeg“ meldt. Hun vervaldatum is laatste vervanging + deze levensduur. Batterijen die een niveau melden krijgen hun voorspelling uit de gemeten ontlading. Zodra de vloot drie vervangingen van een type heeft gezien, vervangt het mediane interval de ingebouwde waarde — je eigen waarde wint altijd.",
|
||||
"settings_battery_lifetime_months": "maanden",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Acties in taakrijen",
|
||||
"settings_ref_numbers_in_lists": "Referentienummers in lijsten",
|
||||
"settings_ref_numbers_in_lists_hint": "Toont de chips #8 / #8.3 vóór object- en taaknamen in de lijst Vandaag, de takentabel, de objectkaarten en de objectentabel.",
|
||||
"settings_compact_refs": "Referentienummers verdichten",
|
||||
"settings_compact_refs_hint": "Nummert alle objecten, taken en voltooiingen opnieuw op volgorde (1, 2, 3 …) en sluit de gaten van verwijderde items. Nummers die al op serviceboekjes, foto's of notities staan, kloppen daarna niet meer.",
|
||||
"settings_compact_refs_confirm": "Alle objecten, taken en voltooiingen opnieuw doorlopend nummeren in volgorde van aanmaak? Nummers die al op gedrukte serviceboekjes, foto's of notities staan, kloppen daarna niet meer. Dit kan niet ongedaan worden gemaakt.",
|
||||
"settings_compact_refs_done": "{objects} objecten, {tasks} taken en {completions} voltooiingen opnieuw genummerd.",
|
||||
"row_actions_buttons_compact": "Knoppen (op telefoons alleen pictogrammen)",
|
||||
"row_actions_buttons": "Knoppen met tekst",
|
||||
"row_actions_icons": "Pictogrammen (klassiek)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Gebruikt door",
|
||||
"restock_quantity_label": "Gekochte hoeveelheid",
|
||||
"consumes_parts_label": "Verbruikt onderdelen",
|
||||
"task_parts_fleet_hint": "De batterijaantallen komen per apparaat uit Battery Notes — hier valt niets te koppelen.",
|
||||
"shared_parts_other_objects": "Onderdelen van andere objecten",
|
||||
"shared_parts_help": "Meerdere objecten kunnen één voorraad delen. Bij afronden wordt van het eigenaarsobject afgeboekt.",
|
||||
"shared_part_unknown": "Onbekend onderdeel",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Próg „bateria słaba” (%)",
|
||||
"settings_battery_recovered_percent": "Bateria uznana za wymienioną powyżej (%)",
|
||||
"settings_battery_recovered_percent_hint": "Słaba bateria pozostaje liczona jako słaba, dopóki jej poziom nie wzrośnie powyżej tej wartości lub nie zostanie zapisana wymiana — poziom oscylujący wokół progu nie kończy więc zadania floty raz za razem.",
|
||||
"settings_battery_auto_record": "Automatycznie rejestruj wymianę, gdy słaba bateria się regeneruje",
|
||||
"settings_battery_auto_record_hint": "Gdy słaba bateria wzrośnie powyżej progu regeneracji, data wymiany zostaje zapisana w Battery Notes, a zapasowe ogniwa zdjęte ze stanu — bez żadnego kliknięcia.",
|
||||
"settings_battery_lifetimes": "Typowa żywotność baterii",
|
||||
"settings_battery_lifetimes_hint": "Używane tylko dla baterii bez procentu: notatka Battery Notes z samym typem i datą wymiany albo czujnik zgłaszający tylko „niski”. Termin = ostatnia wymiana + ta żywotność. Baterie raportujące poziom dostają prognozę z mierzonego rozładowania. Po trzech wymianach danego typu mediana odstępów zastępuje wbudowaną wartość — Twoja wartość zawsze wygrywa.",
|
||||
"settings_battery_lifetime_months": "mies.",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Akcje w wierszach zadań",
|
||||
"settings_ref_numbers_in_lists": "Numery referencyjne na listach",
|
||||
"settings_ref_numbers_in_lists_hint": "Pokazuje etykiety #8 / #8.3 przed nazwami obiektów i zadań na liście Dzisiaj, w tabeli zadań, na kartach obiektów i w tabeli obiektów.",
|
||||
"settings_compact_refs": "Zagęść numery referencyjne",
|
||||
"settings_compact_refs_hint": "Numeruje ponownie wszystkie obiekty, zadania i wykonania po kolei (1, 2, 3 …) i zamyka luki po usunięciach. Numery już wydrukowane w książkach serwisowych, na zdjęciach lub w notatkach przestaną się zgadzać.",
|
||||
"settings_compact_refs_confirm": "Ponumerować ponownie wszystkie obiekty, zadania i wykonania kolejno w porządku utworzenia? Numery zapisane już w wydrukowanych książkach serwisowych, na zdjęciach lub w notatkach przestaną się zgadzać. Tej operacji nie można cofnąć.",
|
||||
"settings_compact_refs_done": "Ponumerowano ponownie: obiekty {objects}, zadania {tasks}, wykonania {completions}.",
|
||||
"row_actions_buttons_compact": "Przyciski (na telefonie tylko ikony)",
|
||||
"row_actions_buttons": "Przyciski z tekstem",
|
||||
"row_actions_icons": "Ikony (klasyczne)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Używane przez",
|
||||
"restock_quantity_label": "Kupiona ilość",
|
||||
"consumes_parts_label": "Zużywa części",
|
||||
"task_parts_fleet_hint": "Liczba baterii pochodzi z Battery Notes dla każdego urządzenia — tu nie ma nic do powiązania.",
|
||||
"shared_parts_other_objects": "Części z innych obiektów",
|
||||
"shared_parts_help": "Kilka obiektów może korzystać z jednego zapasu. Wykonanie tego zadania odejmuje ze stanu obiektu będącego właścicielem.",
|
||||
"shared_part_unknown": "Nieznana część",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Limite „pilha fraca“ (%)",
|
||||
"settings_battery_recovered_percent": "Pilha considerada trocada acima de (%)",
|
||||
"settings_battery_recovered_percent_hint": "Uma pilha fraca continua contando como fraca até o nível subir acima deste valor ou uma troca ser registrada — assim um nível oscilando em torno do limite não conclui a tarefa da frota repetidamente.",
|
||||
"settings_battery_auto_record": "Registrar a troca automaticamente quando uma bateria fraca se recupera",
|
||||
"settings_battery_auto_record_hint": "Quando uma bateria que estava fraca sobe acima do limite de recuperação, a data da troca é registrada no Battery Notes e as pilhas reservas são baixadas do estoque — sem precisar tocar.",
|
||||
"settings_battery_lifetimes": "Vida útil típica das pilhas",
|
||||
"settings_battery_lifetimes_hint": "Usado apenas para pilhas sem porcentagem: uma nota do Battery Notes só com tipo e data de troca, ou um sensor que apenas informa « fraca ». O vencimento é última troca + esta vida útil. Pilhas que informam nível têm a previsão pela descarga medida. Após três trocas de um tipo, o intervalo mediano substitui o valor integrado — seu valor sempre vence.",
|
||||
"settings_battery_lifetime_months": "meses",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Ações nas linhas de tarefas",
|
||||
"settings_ref_numbers_in_lists": "Números de referência nas listas",
|
||||
"settings_ref_numbers_in_lists_hint": "Mostra as etiquetas #8 / #8.3 antes dos nomes de objetos e tarefas na lista Hoje, na tabela de tarefas, nos cartões de objetos e na tabela de objetos.",
|
||||
"settings_compact_refs": "Compactar os números de referência",
|
||||
"settings_compact_refs_hint": "Renumera todos os objetos, tarefas e conclusões em ordem (1, 2, 3 …) e fecha as lacunas deixadas por exclusões. Números já impressos em cadernetas de serviço, fotos ou notas deixarão de corresponder.",
|
||||
"settings_compact_refs_confirm": "Renumerar sequencialmente todos os objetos, tarefas e conclusões em ordem de criação? Números já escritos em cadernetas de serviço impressas, fotos ou notas deixarão de corresponder. Isso não pode ser desfeito.",
|
||||
"settings_compact_refs_done": "Renumerados {objects} objetos, {tasks} tarefas e {completions} conclusões.",
|
||||
"row_actions_buttons_compact": "Botões (só ícones no celular)",
|
||||
"row_actions_buttons": "Botões com texto",
|
||||
"row_actions_icons": "Ícones (clássico)",
|
||||
@@ -868,6 +874,7 @@
|
||||
"parts_used_by": "Usado por",
|
||||
"restock_quantity_label": "Quantidade comprada",
|
||||
"consumes_parts_label": "Consome peças",
|
||||
"task_parts_fleet_hint": "As quantidades de pilhas vêm do Battery Notes por dispositivo — nada a vincular aqui.",
|
||||
"shared_parts_other_objects": "Peças de outros objetos",
|
||||
"shared_parts_help": "Vários objetos podem compartilhar o mesmo estoque. Concluir esta tarefa desconta do objeto proprietário.",
|
||||
"shared_part_unknown": "Peça desconhecida",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Limiar „pilha fraca“ (%)",
|
||||
"settings_battery_recovered_percent": "Pilha considerada substituída acima de (%)",
|
||||
"settings_battery_recovered_percent_hint": "Uma pilha fraca continua a contar como fraca até o nível subir acima deste valor ou ser registada uma substituição — assim, um nível que oscila em torno do limiar não conclui a tarefa da frota vezes sem conta.",
|
||||
"settings_battery_auto_record": "Registar automaticamente a substituição quando uma bateria fraca recupera",
|
||||
"settings_battery_auto_record_hint": "Quando uma bateria que estava fraca sobe acima do limiar de recuperação, a data de substituição é registada no Battery Notes e as pilhas sobressalentes são retiradas do stock — sem qualquer toque.",
|
||||
"settings_battery_lifetimes": "Durações típicas das pilhas",
|
||||
"settings_battery_lifetimes_hint": "Usado apenas para pilhas sem percentagem: uma nota do Battery Notes só com tipo e data de substituição, ou um sensor que apenas reporta « fraca ». O vencimento é última substituição + esta duração. Pilhas que reportam nível obtêm a previsão da descarga medida. Após três substituições de um tipo, o intervalo mediano substitui o valor integrado — o seu valor ganha sempre.",
|
||||
"settings_battery_lifetime_months": "meses",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Ações nas linhas de tarefas",
|
||||
"settings_ref_numbers_in_lists": "Números de referência nas listas",
|
||||
"settings_ref_numbers_in_lists_hint": "Mostra as etiquetas #8 / #8.3 antes dos nomes de objetos e tarefas na lista Hoje, na tabela de tarefas, nos cartões de objetos e na tabela de objetos.",
|
||||
"settings_compact_refs": "Compactar os números de referência",
|
||||
"settings_compact_refs_hint": "Renumera todos os objetos, tarefas e conclusões por ordem (1, 2, 3 …) e fecha os intervalos deixados por eliminações. Os números já impressos em livros de serviço, fotos ou notas deixarão de corresponder.",
|
||||
"settings_compact_refs_confirm": "Renumerar sequencialmente todos os objetos, tarefas e conclusões por ordem de criação? Os números já escritos em livros de serviço impressos, fotos ou notas deixarão de corresponder. Isto não pode ser anulado.",
|
||||
"settings_compact_refs_done": "Renumerados {objects} objetos, {tasks} tarefas e {completions} conclusões.",
|
||||
"row_actions_buttons_compact": "Botões (só ícones no telemóvel)",
|
||||
"row_actions_buttons": "Botões com texto",
|
||||
"row_actions_icons": "Ícones (clássico)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Usado por",
|
||||
"restock_quantity_label": "Quantidade comprada",
|
||||
"consumes_parts_label": "Consome peças",
|
||||
"task_parts_fleet_hint": "As quantidades de pilhas vêm do Battery Notes por dispositivo — nada a associar aqui.",
|
||||
"shared_parts_other_objects": "Peças de outros objetos",
|
||||
"shared_parts_help": "Vários objetos podem partilhar o mesmo stock. Concluir esta tarefa desconta do objeto proprietário.",
|
||||
"shared_part_unknown": "Peça desconhecida",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Порог «батарея разряжена» (%)",
|
||||
"settings_battery_recovered_percent": "Батарея считается заменённой выше (%)",
|
||||
"settings_battery_recovered_percent_hint": "Разряженная батарея считается разряженной, пока её уровень не поднимется выше этого значения или не будет записана замена — уровень, колеблющийся около порога, больше не завершает задачу парка снова и снова.",
|
||||
"settings_battery_auto_record": "Автоматически фиксировать замену, когда разряженная батарея восстанавливается",
|
||||
"settings_battery_auto_record_hint": "Когда разряженная батарея поднимается выше порога восстановления, дата замены записывается в Battery Notes, а запасные элементы списываются со склада — без единого нажатия.",
|
||||
"settings_battery_lifetimes": "Типичный срок службы батарей",
|
||||
"settings_battery_lifetimes_hint": "Используется только для батарей без процента: заметка Battery Notes лишь с типом и датой замены или датчик, сообщающий только «низкий». Срок = последняя замена + этот срок службы. Для батарей с уровнем прогноз строится по измеренному разряду. После трёх замен одного типа медианный интервал заменяет встроенное значение — ваше значение всегда главнее.",
|
||||
"settings_battery_lifetime_months": "мес.",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Действия в строках задач",
|
||||
"settings_ref_numbers_in_lists": "Номера ссылок в списках",
|
||||
"settings_ref_numbers_in_lists_hint": "Показывать метки #8 / #8.3 перед названиями объектов и задач в списке «Сегодня», таблице задач, карточках объектов и таблице объектов.",
|
||||
"settings_compact_refs": "Уплотнить номера ссылок",
|
||||
"settings_compact_refs_hint": "Перенумеровывает все объекты, задачи и выполнения по порядку (1, 2, 3 …) и закрывает пробелы после удалений. Номера, уже напечатанные в сервисных книжках, на фото или в заметках, перестанут совпадать.",
|
||||
"settings_compact_refs_confirm": "Перенумеровать все объекты, задачи и выполнения последовательно в порядке создания? Номера, уже записанные в напечатанных сервисных книжках, на фото или в заметках, перестанут совпадать. Это нельзя отменить.",
|
||||
"settings_compact_refs_done": "Перенумеровано: объектов — {objects}, задач — {tasks}, выполнений — {completions}.",
|
||||
"row_actions_buttons_compact": "Кнопки (на телефоне только значки)",
|
||||
"row_actions_buttons": "Кнопки с текстом",
|
||||
"row_actions_icons": "Значки (классический вид)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Используется",
|
||||
"restock_quantity_label": "Куплено, шт.",
|
||||
"consumes_parts_label": "Расходует детали",
|
||||
"task_parts_fleet_hint": "Количество батарей берётся из Battery Notes для каждого устройства — здесь нечего привязывать.",
|
||||
"shared_parts_other_objects": "Детали других объектов",
|
||||
"shared_parts_help": "Несколько объектов могут использовать один запас. Выполнение этой задачи списывает детали у объекта-владельца.",
|
||||
"shared_part_unknown": "Неизвестная деталь",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Tröskel „batteri lågt“ (%)",
|
||||
"settings_battery_recovered_percent": "Batteri räknas som bytt över (%)",
|
||||
"settings_battery_recovered_percent_hint": "Ett lågt batteri räknas som lågt tills nivån stiger över detta värde eller ett byte registreras — så kan en nivå som pendlar kring tröskeln inte slutföra flottuppgiften om och om igen.",
|
||||
"settings_battery_auto_record": "Registrera byte automatiskt när ett svagt batteri återhämtar sig",
|
||||
"settings_battery_auto_record_hint": "När ett batteri som var svagt stiger över återhämtningströskeln registreras bytesdatumet i Battery Notes och reservcellerna dras från lagret — utan ett enda tryck.",
|
||||
"settings_battery_lifetimes": "Typiska batterilivslängder",
|
||||
"settings_battery_lifetimes_hint": "Används bara för batterier utan procent: en Battery Notes-anteckning med bara typ och bytesdatum, eller en sensor som bara rapporterar ”lågt”. Deras förfallodatum är senaste byte + denna livslängd. Batterier som rapporterar nivå får sin prognos från den uppmätta urladdningen. När flottan sett tre byten av en typ tar medianintervallet över från det inbyggda värdet — ditt eget värde vinner alltid.",
|
||||
"settings_battery_lifetime_months": "månader",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Åtgärder i uppgiftsrader",
|
||||
"settings_ref_numbers_in_lists": "Referensnummer i listor",
|
||||
"settings_ref_numbers_in_lists_hint": "Visar brickorna #8 / #8.3 före objekt- och uppgiftsnamn i Idag-listan, uppgiftstabellen, objektkorten och objekttabellen.",
|
||||
"settings_compact_refs": "Packa referensnumren",
|
||||
"settings_compact_refs_hint": "Numrerar om alla objekt, uppgifter och utföranden i ordning (1, 2, 3 …) och stänger luckorna efter raderingar. Nummer som redan står i servicehäften, på foton eller anteckningar stämmer inte längre.",
|
||||
"settings_compact_refs_confirm": "Numrera om alla objekt, uppgifter och utföranden löpande i skapandeordning? Nummer som redan står i utskrivna servicehäften, på foton eller anteckningar stämmer inte längre. Detta kan inte ångras.",
|
||||
"settings_compact_refs_done": "Numrerade om {objects} objekt, {tasks} uppgifter och {completions} utföranden.",
|
||||
"row_actions_buttons_compact": "Knappar (endast ikoner på mobilen)",
|
||||
"row_actions_buttons": "Knappar med text",
|
||||
"row_actions_icons": "Ikoner (klassiskt)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Används av",
|
||||
"restock_quantity_label": "Köpt antal",
|
||||
"consumes_parts_label": "Förbrukar delar",
|
||||
"task_parts_fleet_hint": "Batteriantalen kommer från Battery Notes per enhet — inget att koppla här.",
|
||||
"shared_parts_other_objects": "Delar från andra objekt",
|
||||
"shared_parts_help": "Flera objekt kan dela samma lager. När uppgiften slutförs dras det från det ägande objektet.",
|
||||
"shared_part_unknown": "Okänd del",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "„Pil zayıf“ eşiği (%)",
|
||||
"settings_battery_recovered_percent": "Pil şu değerin üzerinde değiştirilmiş sayılır (%)",
|
||||
"settings_battery_recovered_percent_hint": "Zayıf bir pil, seviyesi bu değerin üzerine çıkana veya bir değişim kaydedilene kadar zayıf sayılmaya devam eder — böylece eşik çevresinde salınan bir seviye filo görevini tekrar tekrar tamamlayamaz.",
|
||||
"settings_battery_auto_record": "Zayıf bir pil toparlandığında değişimi otomatik kaydet",
|
||||
"settings_battery_auto_record_hint": "Zayıf olan bir pil toparlanma eşiğinin üzerine çıktığında, değişim tarihi Battery Notes'a kaydedilir ve yedek piller stoktan düşülür — dokunmaya gerek yok.",
|
||||
"settings_battery_lifetimes": "Tipik pil ömürleri",
|
||||
"settings_battery_lifetimes_hint": "Yalnızca yüzdesi olmayan piller için kullanılır: sadece tür ve değişim tarihi olan bir Battery Notes notu ya da yalnızca \"düşük\" bildiren bir sensör. Vade = son değişim + bu ömür. Seviye bildiren pillerin tahmini ölçülen deşarjdan gelir. Filo bir türden üç değişim gördüğünde ortanca aralık yerleşik değerin yerini alır — kendi değerin her zaman kazanır.",
|
||||
"settings_battery_lifetime_months": "ay",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Görev satırı eylemleri",
|
||||
"settings_ref_numbers_in_lists": "Listelerde referans numaraları",
|
||||
"settings_ref_numbers_in_lists_hint": "Bugün listesinde, görev tablosunda, nesne kartlarında ve nesne tablosunda nesne ve görev adlarının önünde #8 / #8.3 etiketlerini gösterir.",
|
||||
"settings_compact_refs": "Referans numaralarını sıkıştır",
|
||||
"settings_compact_refs_hint": "Tüm nesneleri, görevleri ve tamamlamaları sırayla (1, 2, 3 …) yeniden numaralandırır ve silmelerin bıraktığı boşlukları kapatır. Servis defterlerine, fotoğraflara veya notlara zaten basılmış numaralar artık eşleşmez.",
|
||||
"settings_compact_refs_confirm": "Tüm nesneler, görevler ve tamamlamalar oluşturulma sırasına göre ardışık olarak yeniden numaralandırılsın mı? Basılı servis defterlerine, fotoğraflara veya notlara zaten yazılmış numaralar artık eşleşmez. Bu işlem geri alınamaz.",
|
||||
"settings_compact_refs_done": "{objects} nesne, {tasks} görev ve {completions} tamamlama yeniden numaralandırıldı.",
|
||||
"row_actions_buttons_compact": "Düğmeler (telefonda yalnızca simgeler)",
|
||||
"row_actions_buttons": "Metinli düğmeler",
|
||||
"row_actions_icons": "Simgeler (klasik)",
|
||||
@@ -868,6 +874,7 @@
|
||||
"parts_used_by": "Kullanan",
|
||||
"restock_quantity_label": "Satın alınan miktar",
|
||||
"consumes_parts_label": "Parça tüketir",
|
||||
"task_parts_fleet_hint": "Pil adetleri cihaz başına Battery Notes'tan gelir — burada bağlanacak bir şey yok.",
|
||||
"shared_parts_other_objects": "Diğer nesnelerin parçaları",
|
||||
"shared_parts_help": "Birden fazla nesne aynı stoğu paylaşabilir. Bu görev tamamlandığında stok, sahibi olan nesneden düşülür.",
|
||||
"shared_part_unknown": "Bilinmeyen parça",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Поріг «батарея розряджена» (%)",
|
||||
"settings_battery_recovered_percent": "Батарея вважається заміненою вище (%)",
|
||||
"settings_battery_recovered_percent_hint": "Розряджена батарея вважається розрядженою, доки її рівень не підніметься вище цього значення або не буде записано заміну — рівень, що коливається біля порога, більше не завершує завдання парку знову й знову.",
|
||||
"settings_battery_auto_record": "Автоматично фіксувати заміну, коли розряджена батарея відновлюється",
|
||||
"settings_battery_auto_record_hint": "Коли розряджена батарея піднімається вище порога відновлення, дата заміни записується в Battery Notes, а запасні елементи списуються зі складу — без жодного натискання.",
|
||||
"settings_battery_lifetimes": "Типовий строк служби батарей",
|
||||
"settings_battery_lifetimes_hint": "Використовується лише для батарей без відсотка: нотатка Battery Notes лише з типом і датою заміни або датчик, що повідомляє тільки «низький». Термін = остання заміна + цей строк служби. Для батарей з рівнем прогноз будується за виміряним розрядом. Після трьох замін одного типу медіанний інтервал замінює вбудоване значення — ваше значення завжди головніше.",
|
||||
"settings_battery_lifetime_months": "міс.",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Дії в рядках завдань",
|
||||
"settings_ref_numbers_in_lists": "Номери посилань у списках",
|
||||
"settings_ref_numbers_in_lists_hint": "Показувати мітки #8 / #8.3 перед назвами об'єктів і завдань у списку «Сьогодні», таблиці завдань, картках об'єктів і таблиці об'єктів.",
|
||||
"settings_compact_refs": "Ущільнити номери посилань",
|
||||
"settings_compact_refs_hint": "Перенумеровує всі об'єкти, завдання та виконання по порядку (1, 2, 3 …) і закриває прогалини після видалень. Номери, вже надруковані в сервісних книжках, на фото чи в нотатках, більше не збігатимуться.",
|
||||
"settings_compact_refs_confirm": "Перенумерувати всі об'єкти, завдання та виконання послідовно в порядку створення? Номери, вже записані в надрукованих сервісних книжках, на фото чи в нотатках, більше не збігатимуться. Це не можна скасувати.",
|
||||
"settings_compact_refs_done": "Перенумеровано: об'єктів — {objects}, завдань — {tasks}, виконань — {completions}.",
|
||||
"row_actions_buttons_compact": "Кнопки (на телефоні лише значки)",
|
||||
"row_actions_buttons": "Кнопки з текстом",
|
||||
"row_actions_icons": "Значки (класичний вигляд)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Використовується",
|
||||
"restock_quantity_label": "Куплена кількість",
|
||||
"consumes_parts_label": "Витрачає деталі",
|
||||
"task_parts_fleet_hint": "Кількість батарей береться з Battery Notes для кожного пристрою — тут нічого прив'язувати.",
|
||||
"shared_parts_other_objects": "Деталі інших об'єктів",
|
||||
"shared_parts_help": "Кілька об'єктів можуть використовувати один запас. Виконання цього завдання списує деталі з об'єкта-власника.",
|
||||
"shared_part_unknown": "Невідома деталь",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "电池“电量低”阈值(%)",
|
||||
"settings_battery_recovered_percent": "电量高于此值视为已更换(%)",
|
||||
"settings_battery_recovered_percent_hint": "电量低的电池会一直计为低电量,直到电量高于此值或记录了更换——这样在阈值附近波动的电量不会反复完成电池组任务。",
|
||||
"settings_battery_auto_record": "低电量电池恢复时自动记录更换",
|
||||
"settings_battery_auto_record_hint": "当原本低电量的电池回升到恢复阈值以上时,更换日期会记录到 Battery Notes,备用电池会从库存中扣除——无需任何点击。",
|
||||
"settings_battery_lifetimes": "电池典型寿命",
|
||||
"settings_battery_lifetimes_hint": "仅用于没有百分比的电池:只有类型和更换日期的 Battery Notes 记录,或只报告“低电量”的传感器。其到期日 = 上次更换 + 此寿命。报告电量的电池改用实测放电来预测。同一类型出现三次更换后,中位间隔将取代内置值——你自己的值始终优先。",
|
||||
"settings_battery_lifetime_months": "个月",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "任务行操作",
|
||||
"settings_ref_numbers_in_lists": "在列表中显示编号",
|
||||
"settings_ref_numbers_in_lists_hint": "在“今天”列表、任务表、对象卡片和对象表中的对象与任务名称前显示 #8 / #8.3 编号标签。",
|
||||
"settings_compact_refs": "重新紧凑编号",
|
||||
"settings_compact_refs_hint": "按顺序重新为所有对象、任务和完成记录编号(1、2、3…),并填补删除留下的空缺。已印在服务手册、照片或备注上的编号将不再对应。",
|
||||
"settings_compact_refs_confirm": "按创建顺序重新连续编号所有对象、任务和完成记录?已写在打印的服务手册、照片或备注上的编号将不再对应。此操作无法撤销。",
|
||||
"settings_compact_refs_done": "已重新编号 {objects} 个对象、{tasks} 个任务和 {completions} 条完成记录。",
|
||||
"row_actions_buttons_compact": "按钮(手机上仅显示图标)",
|
||||
"row_actions_buttons": "带文字的按钮",
|
||||
"row_actions_icons": "图标(经典)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "使用于",
|
||||
"restock_quantity_label": "购买数量",
|
||||
"consumes_parts_label": "消耗配件",
|
||||
"task_parts_fleet_hint": "电池数量按设备来自 Battery Notes——此处无需关联。",
|
||||
"shared_parts_other_objects": "其他设备的配件",
|
||||
"shared_parts_help": "多个设备可以共用同一批库存。完成此任务将从所属设备的库存中扣减。",
|
||||
"shared_part_unknown": "未知配件",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Práh „baterie slabá“ (%)",
|
||||
"settings_battery_recovered_percent": "Baterie se považuje za vyměněnou nad (%)",
|
||||
"settings_battery_recovered_percent_hint": "Slabá baterie se počítá jako slabá, dokud její stav nevystoupí nad tuto hodnotu nebo není zaznamenána výměna — stav kolísající kolem prahu tak nedokončuje úlohu flotily stále dokola.",
|
||||
"settings_battery_auto_record": "Automaticky zaznamenat výměnu, když se vybitá baterie zotaví",
|
||||
"settings_battery_auto_record_hint": "Když se vybitá baterie dostane nad práh zotavení, datum výměny se zapíše do Battery Notes a náhradní články se odečtou ze zásoby — bez jediného klepnutí.",
|
||||
"settings_battery_lifetimes": "Typická životnost baterií",
|
||||
"settings_battery_lifetimes_hint": "Použije se jen u baterií bez procent: poznámka Battery Notes jen s typem a datem výměny nebo senzor hlásící pouze „slabá“. Splatnost = poslední výměna + tato životnost. Baterie hlásící úroveň mají prognózu z naměřeného vybíjení. Po třech výměnách daného typu nahradí medián intervalů vestavěnou hodnotu — vaše hodnota má vždy přednost.",
|
||||
"settings_battery_lifetime_months": "měsíců",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Akce v řádcích úkolů",
|
||||
"settings_ref_numbers_in_lists": "Referenční čísla v seznamech",
|
||||
"settings_ref_numbers_in_lists_hint": "Zobrazí štítky #8 / #8.3 před názvy objektů a úkolů v seznamu Dnes, tabulce úkolů, kartách objektů a tabulce objektů.",
|
||||
"settings_compact_refs": "Zhustit referenční čísla",
|
||||
"settings_compact_refs_hint": "Přečísluje všechny objekty, úkoly a dokončení popořadě (1, 2, 3 …) a zaplní mezery po smazání. Čísla již vytištěná v servisních knížkách, na fotkách nebo v poznámkách přestanou souhlasit.",
|
||||
"settings_compact_refs_confirm": "Přečíslovat všechny objekty, úkoly a dokončení průběžně v pořadí vytvoření? Čísla již zapsaná ve vytištěných servisních knížkách, na fotkách nebo v poznámkách přestanou souhlasit. Nelze vrátit zpět.",
|
||||
"settings_compact_refs_done": "Přečíslováno: {objects} objektů, {tasks} úkolů a {completions} dokončení.",
|
||||
"row_actions_buttons_compact": "Tlačítka (na telefonu jen ikony)",
|
||||
"row_actions_buttons": "Tlačítka s textem",
|
||||
"row_actions_icons": "Ikony (klasické)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Používá",
|
||||
"restock_quantity_label": "Zakoupené množství",
|
||||
"consumes_parts_label": "Spotřebovává díly",
|
||||
"task_parts_fleet_hint": "Počty baterií pocházejí z Battery Notes pro každé zařízení — tady není co propojovat.",
|
||||
"shared_parts_other_objects": "Díly z jiných objektů",
|
||||
"shared_parts_help": "Několik objektů může sdílet jeden sklad. Dokončení tohoto úkolu odečte zásobu z vlastnícího objektu.",
|
||||
"shared_part_unknown": "Neznámý díl",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Tærskel „batteri lavt“ (%)",
|
||||
"settings_battery_recovered_percent": "Batteri regnes som udskiftet over (%)",
|
||||
"settings_battery_recovered_percent_hint": "Et lavt batteri tælles som lavt, indtil niveauet stiger over denne værdi, eller et skift registreres — så kan et niveau, der svinger omkring tærsklen, ikke fuldføre flådeopgaven igen og igen.",
|
||||
"settings_battery_auto_record": "Registrér udskiftning automatisk, når et svagt batteri kommer sig",
|
||||
"settings_battery_auto_record_hint": "Når et batteri, der var svagt, stiger over gendannelsestærsklen, registreres udskiftningsdatoen i Battery Notes, og reservecellerne trækkes fra lageret — uden et tryk.",
|
||||
"settings_battery_lifetimes": "Typiske batterilevetider",
|
||||
"settings_battery_lifetimes_hint": "Bruges kun til batterier uden procent: en Battery Notes-note med kun type og udskiftningsdato, eller en sensor der kun melder \"lavt\". Forfaldsdato = seneste udskiftning + denne levetid. Batterier der melder niveau får prognosen fra den målte afladning. Når flåden har set tre udskiftninger af en type, overtager medianintervallet fra den indbyggede værdi — din egen værdi vinder altid.",
|
||||
"settings_battery_lifetime_months": "måneder",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Handlinger i opgaverækker",
|
||||
"settings_ref_numbers_in_lists": "Referencenumre i lister",
|
||||
"settings_ref_numbers_in_lists_hint": "Viser brikkerne #8 / #8.3 foran objekt- og opgavenavne i I dag-listen, opgavetabellen, objektkortene og objekttabellen.",
|
||||
"settings_compact_refs": "Komprimér referencenumre",
|
||||
"settings_compact_refs_hint": "Omnummererer alle objekter, opgaver og udførelser i rækkefølge (1, 2, 3 …) og lukker hullerne efter sletninger. Numre, der allerede står i servicehæfter, på fotos eller noter, passer ikke længere.",
|
||||
"settings_compact_refs_confirm": "Omnummerér alle objekter, opgaver og udførelser fortløbende i oprettelsesrækkefølge? Numre, der allerede står i udskrevne servicehæfter, på fotos eller noter, passer ikke længere. Dette kan ikke fortrydes.",
|
||||
"settings_compact_refs_done": "Omnummererede {objects} objekter, {tasks} opgaver og {completions} udførelser.",
|
||||
"row_actions_buttons_compact": "Knapper (kun ikoner på telefonen)",
|
||||
"row_actions_buttons": "Knapper med tekst",
|
||||
"row_actions_icons": "Ikoner (klassisk)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Bruges af",
|
||||
"restock_quantity_label": "Købt mængde",
|
||||
"consumes_parts_label": "Forbruger dele",
|
||||
"task_parts_fleet_hint": "Batteriantallet kommer fra Battery Notes pr. enhed — intet at kæde sammen her.",
|
||||
"shared_parts_other_objects": "Dele fra andre objekter",
|
||||
"shared_parts_help": "Flere objekter kan dele det samme lager. Når opgaven fuldføres, trækkes der fra det ejende objekt.",
|
||||
"shared_part_unknown": "Ukendt del",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Schwelle „Batterie niedrig“ (%)",
|
||||
"settings_battery_recovered_percent": "Batterie gilt als ersetzt ab (%)",
|
||||
"settings_battery_recovered_percent_hint": "Eine niedrige Batterie bleibt so lange als niedrig gezählt, bis ihr Stand über diesen Wert steigt oder ein Wechsel erfasst wird — ein Stand, der um die Schwelle pendelt, schließt die Flottenaufgabe so nicht immer wieder ab.",
|
||||
"settings_battery_auto_record": "Wechsel automatisch erfassen, wenn eine leere Batterie sich erholt",
|
||||
"settings_battery_auto_record_hint": "Steigt eine zuvor leere Batterie über die Erholungsschwelle, wird das Wechseldatum in Battery Notes eingetragen und die Ersatzzellen werden vom Bestand abgezogen – ohne Antippen.",
|
||||
"settings_battery_lifetimes": "Typische Batterie-Lebensdauern",
|
||||
"settings_battery_lifetimes_hint": "Wird nur für Batterien ohne Prozentanzeige verwendet: eine Battery-Notes-Notiz, die nur Typ und Austauschdatum kennt, oder ein Sensor, der nur „schwach“ meldet. Deren Fälligkeit ist letzter Wechsel + diese Lebensdauer. Batterien mit Füllstand bekommen ihre Prognose aus der gemessenen Entladung. Sobald die Flotte drei Wechsel eines Typs gesehen hat, ersetzt das mittlere Intervall den eingebauten Wert — dein eigener Wert gewinnt immer.",
|
||||
"settings_battery_lifetime_months": "Monate",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Aktionen in Aufgabenzeilen",
|
||||
"settings_ref_numbers_in_lists": "Referenznummern in Listen",
|
||||
"settings_ref_numbers_in_lists_hint": "Zeigt die Chips #8 / #8.3 vor Objekt- und Aufgabennamen in der Heute-Liste, der Aufgabentabelle, den Objektkarten und der Objekttabelle.",
|
||||
"settings_compact_refs": "Referenznummern verdichten",
|
||||
"settings_compact_refs_hint": "Nummeriert alle Objekte, Aufgaben und Erledigungen der Reihe nach neu (1, 2, 3 …) und schließt die Lücken gelöschter Einträge. Bereits auf Servicehefte, Fotos oder Notizen gedruckte Nummern stimmen danach nicht mehr.",
|
||||
"settings_compact_refs_confirm": "Alle Objekte, Aufgaben und Erledigungen in Anlege-Reihenfolge fortlaufend neu nummerieren? Bereits auf gedruckte Servicehefte, Fotos oder Notizen geschriebene Nummern stimmen danach nicht mehr. Das lässt sich nicht rückgängig machen.",
|
||||
"settings_compact_refs_done": "{objects} Objekte, {tasks} Aufgaben und {completions} Erledigungen neu nummeriert.",
|
||||
"row_actions_buttons_compact": "Buttons (auf dem Handy nur Symbole)",
|
||||
"row_actions_buttons": "Buttons mit Text",
|
||||
"row_actions_icons": "Symbole (klassisch)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Verwendet von",
|
||||
"restock_quantity_label": "Gekaufte Menge",
|
||||
"consumes_parts_label": "Verbraucht Teile",
|
||||
"task_parts_fleet_hint": "Die Batteriemengen kommen je Gerät aus Battery Notes – hier ist nichts zu verknüpfen.",
|
||||
"shared_parts_other_objects": "Teile anderer Objekte",
|
||||
"shared_parts_help": "Mehrere Objekte können sich einen Bestand teilen. Beim Abschließen wird vom besitzenden Objekt abgebucht.",
|
||||
"shared_part_unknown": "Unbekanntes Teil",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Battery low threshold (%)",
|
||||
"settings_battery_recovered_percent": "Battery counts as replaced above (%)",
|
||||
"settings_battery_recovered_percent_hint": "A low battery stays counted as low until its level rises above this value or a replacement is recorded — so a level hovering around the low threshold cannot complete the fleet task again and again.",
|
||||
"settings_battery_auto_record": "Record a replacement automatically when a low battery recovers",
|
||||
"settings_battery_auto_record_hint": "When a battery that was low rises above the recovery threshold, the replacement date is recorded in Battery Notes and the spare cells are taken from stock — no tap needed.",
|
||||
"settings_battery_lifetimes": "Typical battery lifetimes",
|
||||
"settings_battery_lifetimes_hint": "Only used for batteries without a percentage: a Battery Notes note that has just a type and a last-replaced date, or a sensor that only reports \"low\". Their due date is last replaced + this lifetime. Batteries that report a level get their forecast from the measured discharge instead. Once the fleet has seen three replacements of a type, the median interval takes over from the built-in value — your own value always wins.",
|
||||
"settings_battery_lifetime_months": "months",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Task row actions",
|
||||
"settings_ref_numbers_in_lists": "Reference numbers in lists",
|
||||
"settings_ref_numbers_in_lists_hint": "Show the #8 / #8.3 chips in front of object and task names in the Today list, the task table, the object cards and the objects table.",
|
||||
"settings_compact_refs": "Compact reference numbers",
|
||||
"settings_compact_refs_hint": "Renumbers all objects, tasks and completions in order (1, 2, 3 …) and closes the gaps left by deletions. Numbers already printed on service booklets, photos or notes will no longer match.",
|
||||
"settings_compact_refs_confirm": "Renumber every object, task and completion sequentially in creation order? Numbers already written on printed service booklets, photos or notes will no longer match. This cannot be undone.",
|
||||
"settings_compact_refs_done": "Renumbered {objects} objects, {tasks} tasks and {completions} completions.",
|
||||
"row_actions_buttons_compact": "Buttons (icons only on phones)",
|
||||
"row_actions_buttons": "Buttons with text",
|
||||
"row_actions_icons": "Icons (classic)",
|
||||
@@ -868,6 +874,7 @@
|
||||
"parts_used_by": "Used by",
|
||||
"restock_quantity_label": "Quantity bought",
|
||||
"consumes_parts_label": "Consumes parts",
|
||||
"task_parts_fleet_hint": "Battery quantities come from Battery Notes per device — nothing to link here.",
|
||||
"shared_parts_other_objects": "Parts from other objects",
|
||||
"shared_parts_help": "Several objects can share one stock. Completing this task takes from the owning object.",
|
||||
"shared_part_unknown": "Unknown part",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Umbral „pila baja“ (%)",
|
||||
"settings_battery_recovered_percent": "Pila considerada sustituida por encima de (%)",
|
||||
"settings_battery_recovered_percent_hint": "Una pila baja sigue contando como baja hasta que su nivel supere este valor o se registre una sustitución — así un nivel que oscila alrededor del umbral no completa la tarea de la flota una y otra vez.",
|
||||
"settings_battery_auto_record": "Registrar el reemplazo automáticamente cuando una batería baja se recupera",
|
||||
"settings_battery_auto_record_hint": "Cuando una batería que estaba baja supera el umbral de recuperación, la fecha de reemplazo se registra en Battery Notes y las pilas de repuesto se descuentan del stock — sin pulsar nada.",
|
||||
"settings_battery_lifetimes": "Duraciones típicas de las pilas",
|
||||
"settings_battery_lifetimes_hint": "Solo se usa para pilas sin porcentaje: una nota de Battery Notes que solo tiene tipo y fecha de sustitución, o un sensor que solo avisa de « baja ». Su vencimiento es última sustitución + esta duración. Las pilas que informan de un nivel obtienen su previsión de la descarga medida. Cuando la flota ha visto tres sustituciones de un tipo, el intervalo mediano sustituye al valor integrado — tu valor siempre gana.",
|
||||
"settings_battery_lifetime_months": "meses",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Acciones en las filas de tareas",
|
||||
"settings_ref_numbers_in_lists": "Números de referencia en las listas",
|
||||
"settings_ref_numbers_in_lists_hint": "Muestra las etiquetas #8 / #8.3 delante de los nombres de objetos y tareas en la lista Hoy, la tabla de tareas, las tarjetas de objetos y la tabla de objetos.",
|
||||
"settings_compact_refs": "Compactar los números de referencia",
|
||||
"settings_compact_refs_hint": "Renumera todos los objetos, tareas y realizaciones en orden (1, 2, 3 …) y cierra los huecos dejados por las eliminaciones. Los números ya impresos en libretas de servicio, fotos o notas dejarán de coincidir.",
|
||||
"settings_compact_refs_confirm": "¿Renumerar todos los objetos, tareas y realizaciones de forma correlativa por orden de creación? Los números ya escritos en libretas de servicio impresas, fotos o notas dejarán de coincidir. Esto no se puede deshacer.",
|
||||
"settings_compact_refs_done": "Se han renumerado {objects} objetos, {tasks} tareas y {completions} realizaciones.",
|
||||
"row_actions_buttons_compact": "Botones (solo iconos en el móvil)",
|
||||
"row_actions_buttons": "Botones con texto",
|
||||
"row_actions_icons": "Iconos (clásico)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Usado por",
|
||||
"restock_quantity_label": "Cantidad comprada",
|
||||
"consumes_parts_label": "Consume piezas",
|
||||
"task_parts_fleet_hint": "Las cantidades de pilas vienen de Battery Notes por dispositivo — aquí no hay nada que vincular.",
|
||||
"shared_parts_other_objects": "Piezas de otros objetos",
|
||||
"shared_parts_help": "Varios objetos pueden compartir un mismo stock. Al completar esta tarea se descuenta del objeto propietario.",
|
||||
"shared_part_unknown": "Pieza desconocida",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Kynnys „paristo vähissä“ (%)",
|
||||
"settings_battery_recovered_percent": "Paristo lasketaan vaihdetuksi yli (%)",
|
||||
"settings_battery_recovered_percent_hint": "Vähissä oleva paristo lasketaan vähissä olevaksi, kunnes sen taso nousee tämän arvon yli tai vaihto kirjataan — näin kynnyksen ympärillä heilahteleva taso ei suorita laivastotehtävää yhä uudelleen.",
|
||||
"settings_battery_auto_record": "Kirjaa vaihto automaattisesti, kun tyhjä paristo toipuu",
|
||||
"settings_battery_auto_record_hint": "Kun tyhjänä ollut paristo nousee toipumisrajan yläpuolelle, vaihtopäivä kirjataan Battery Notesiin ja varaparistot vähennetään varastosta — ilman yhtään napautusta.",
|
||||
"settings_battery_lifetimes": "Paristojen tyypilliset käyttöiät",
|
||||
"settings_battery_lifetimes_hint": "Käytetään vain paristoille ilman prosenttilukua: Battery Notes -merkintä, jolla on vain tyyppi ja vaihtopäivä, tai anturi, joka ilmoittaa vain ”vähissä”. Erääntyminen = viimeisin vaihto + tämä käyttöikä. Tasoa raportoivien paristojen ennuste tulee mitatusta purkautumisesta. Kun laivasto on nähnyt kolme saman tyypin vaihtoa, mediaaniväli korvaa sisäänrakennetun arvon — oma arvosi voittaa aina.",
|
||||
"settings_battery_lifetime_months": "kuukautta",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Tehtävärivien toiminnot",
|
||||
"settings_ref_numbers_in_lists": "Viitenumerot luetteloissa",
|
||||
"settings_ref_numbers_in_lists_hint": "Näyttää tunnisteet #8 / #8.3 kohteiden ja tehtävien nimien edessä Tänään-luettelossa, tehtävätaulukossa, kohdekorteissa ja kohdetaulukossa.",
|
||||
"settings_compact_refs": "Tiivistä viitenumerot",
|
||||
"settings_compact_refs_hint": "Numeroi kaikki kohteet, tehtävät ja suoritukset uudelleen järjestyksessä (1, 2, 3 …) ja täyttää poistojen jättämät aukot. Huoltokirjoihin, kuviin tai muistiinpanoihin jo painetut numerot eivät enää täsmää.",
|
||||
"settings_compact_refs_confirm": "Numeroidaanko kaikki kohteet, tehtävät ja suoritukset uudelleen juoksevasti luontijärjestyksessä? Painettuihin huoltokirjoihin, kuviin tai muistiinpanoihin jo kirjoitetut numerot eivät enää täsmää. Tätä ei voi perua.",
|
||||
"settings_compact_refs_done": "Numeroitiin uudelleen {objects} kohdetta, {tasks} tehtävää ja {completions} suoritusta.",
|
||||
"row_actions_buttons_compact": "Painikkeet (puhelimessa vain kuvakkeet)",
|
||||
"row_actions_buttons": "Painikkeet tekstillä",
|
||||
"row_actions_icons": "Kuvakkeet (perinteinen)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Käyttäjät",
|
||||
"restock_quantity_label": "Ostettu määrä",
|
||||
"consumes_parts_label": "Kuluttaa osia",
|
||||
"task_parts_fleet_hint": "Paristomäärät tulevat laitekohtaisesti Battery Notesista — tässä ei ole mitään liitettävää.",
|
||||
"shared_parts_other_objects": "Muiden kohteiden osat",
|
||||
"shared_parts_help": "Useat kohteet voivat jakaa saman varaston. Tämän tehtävän suorittaminen vähentää omistavan kohteen varastoa.",
|
||||
"shared_part_unknown": "Tuntematon osa",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Seuil « pile faible » (%)",
|
||||
"settings_battery_recovered_percent": "Pile considérée remplacée au-dessus de (%)",
|
||||
"settings_battery_recovered_percent_hint": "Une pile faible reste comptée comme faible tant que son niveau ne dépasse pas cette valeur ou qu'un remplacement n'est pas enregistré — un niveau qui oscille autour du seuil ne peut ainsi plus terminer la tâche du parc encore et encore.",
|
||||
"settings_battery_auto_record": "Enregistrer automatiquement un remplacement quand une pile faible se rétablit",
|
||||
"settings_battery_auto_record_hint": "Quand une pile qui était faible repasse au-dessus du seuil de rétablissement, la date de remplacement est enregistrée dans Battery Notes et les piles de rechange sont retirées du stock — sans aucune action.",
|
||||
"settings_battery_lifetimes": "Durées de vie typiques des piles",
|
||||
"settings_battery_lifetimes_hint": "Utilisé uniquement pour les piles sans pourcentage : une note Battery Notes qui ne connaît qu'un type et une date de remplacement, ou un capteur qui ne signale que « faible ». Leur échéance est dernier remplacement + cette durée. Les piles qui remontent un niveau sont prévues d'après la décharge mesurée. Dès que le parc a vu trois remplacements d'un type, l'intervalle médian remplace la valeur intégrée — votre valeur l'emporte toujours.",
|
||||
"settings_battery_lifetime_months": "mois",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Actions des lignes de tâches",
|
||||
"settings_ref_numbers_in_lists": "Numéros de référence dans les listes",
|
||||
"settings_ref_numbers_in_lists_hint": "Affiche les puces #8 / #8.3 devant les noms d'objets et de tâches dans la liste Aujourd'hui, le tableau des tâches, les cartes d'objets et le tableau des objets.",
|
||||
"settings_compact_refs": "Compacter les numéros de référence",
|
||||
"settings_compact_refs_hint": "Renumérote tous les objets, tâches et réalisations dans l'ordre (1, 2, 3 …) et comble les trous laissés par les suppressions. Les numéros déjà imprimés sur des carnets d'entretien, photos ou notes ne correspondront plus.",
|
||||
"settings_compact_refs_confirm": "Renuméroter tous les objets, tâches et réalisations dans l'ordre de création ? Les numéros déjà écrits sur des carnets d'entretien imprimés, photos ou notes ne correspondront plus. Cette action est irréversible.",
|
||||
"settings_compact_refs_done": "{objects} objets, {tasks} tâches et {completions} réalisations renumérotés.",
|
||||
"row_actions_buttons_compact": "Boutons (icônes seules sur téléphone)",
|
||||
"row_actions_buttons": "Boutons avec texte",
|
||||
"row_actions_icons": "Icônes (classique)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Utilisé par",
|
||||
"restock_quantity_label": "Quantité achetée",
|
||||
"consumes_parts_label": "Consomme des pièces",
|
||||
"task_parts_fleet_hint": "Les quantités de piles viennent de Battery Notes, appareil par appareil — rien à lier ici.",
|
||||
"shared_parts_other_objects": "Pièces d'autres objets",
|
||||
"shared_parts_help": "Plusieurs objets peuvent partager un même stock. Terminer cette tâche décompte du stock de l'objet propriétaire.",
|
||||
"shared_part_unknown": "Pièce inconnue",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "बैटरी „कम“ सीमा (%)",
|
||||
"settings_battery_recovered_percent": "इससे ऊपर बैटरी बदली हुई मानी जाएगी (%)",
|
||||
"settings_battery_recovered_percent_hint": "कम बैटरी तब तक कम गिनी जाती है जब तक उसका स्तर इस मान से ऊपर न हो जाए या बदलाव दर्ज न हो — ताकि सीमा के आसपास झूलता स्तर बेड़े के कार्य को बार-बार पूरा न कर दे।",
|
||||
"settings_battery_auto_record": "कम बैटरी के ठीक होने पर बदलाव स्वतः दर्ज करें",
|
||||
"settings_battery_auto_record_hint": "जब कोई कम बैटरी पुनर्प्राप्ति सीमा से ऊपर उठती है, तो बदलाव की तारीख Battery Notes में दर्ज हो जाती है और अतिरिक्त सेल स्टॉक से घटा दिए जाते हैं — बिना किसी टैप के।",
|
||||
"settings_battery_lifetimes": "बैटरी की सामान्य आयु",
|
||||
"settings_battery_lifetimes_hint": "केवल बिना प्रतिशत वाली बैटरियों के लिए: सिर्फ़ प्रकार और बदलने की तारीख वाला Battery Notes नोट, या केवल \"कम\" बताने वाला सेंसर। नियत तिथि = अंतिम बदलाव + यह आयु। स्तर बताने वाली बैटरियों का पूर्वानुमान मापे गए डिस्चार्ज से बनता है। एक प्रकार के तीन बदलाव देखने के बाद माध्यिका अंतराल अंतर्निहित मान की जगह लेता है — आपका अपना मान हमेशा प्राथमिकता पाता है।",
|
||||
"settings_battery_lifetime_months": "महीने",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "कार्य पंक्ति क्रियाएँ",
|
||||
"settings_ref_numbers_in_lists": "सूचियों में संदर्भ संख्या",
|
||||
"settings_ref_numbers_in_lists_hint": "आज सूची, कार्य तालिका, ऑब्जेक्ट कार्ड और ऑब्जेक्ट तालिका में ऑब्जेक्ट और कार्य नामों के आगे #8 / #8.3 चिप दिखाता है।",
|
||||
"settings_compact_refs": "संदर्भ संख्याएँ संकुचित करें",
|
||||
"settings_compact_refs_hint": "सभी ऑब्जेक्ट, कार्य और पूर्णताओं को क्रम में (1, 2, 3 …) फिर से क्रमांकित करता है और हटाने से बने अंतर भरता है। सेवा पुस्तिका, फ़ोटो या नोट्स पर पहले से छपी संख्याएँ फिर मेल नहीं खाएँगी।",
|
||||
"settings_compact_refs_confirm": "सभी ऑब्जेक्ट, कार्य और पूर्णताओं को निर्माण क्रम में क्रमानुसार फिर से क्रमांकित करें? छपी हुई सेवा पुस्तिका, फ़ोटो या नोट्स पर पहले से लिखी संख्याएँ फिर मेल नहीं खाएँगी। इसे पूर्ववत नहीं किया जा सकता।",
|
||||
"settings_compact_refs_done": "{objects} ऑब्जेक्ट, {tasks} कार्य और {completions} पूर्णताएँ फिर से क्रमांकित की गईं।",
|
||||
"row_actions_buttons_compact": "बटन (फ़ोन पर केवल आइकन)",
|
||||
"row_actions_buttons": "टेक्स्ट वाले बटन",
|
||||
"row_actions_icons": "आइकन (क्लासिक)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "द्वारा उपयोग",
|
||||
"restock_quantity_label": "खरीदी गई मात्रा",
|
||||
"consumes_parts_label": "पुर्ज़े खपत",
|
||||
"task_parts_fleet_hint": "बैटरी की मात्राएँ प्रति डिवाइस Battery Notes से आती हैं — यहाँ जोड़ने के लिए कुछ नहीं है।",
|
||||
"shared_parts_other_objects": "अन्य वस्तुओं के पुर्ज़े",
|
||||
"shared_parts_help": "कई वस्तुएँ एक ही स्टॉक साझा कर सकती हैं। यह कार्य पूरा करने पर स्वामी वस्तु के स्टॉक से घटाया जाता है।",
|
||||
"shared_part_unknown": "अज्ञात पुर्ज़ा",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "„Alacsony akkumulátor” küszöb (%)",
|
||||
"settings_battery_recovered_percent": "Az elem cseréltnek számít e fölött (%)",
|
||||
"settings_battery_recovered_percent_hint": "A lemerült elem addig számít lemerültnek, amíg a töltöttsége e fölé az érték fölé nem emelkedik, vagy egy cserét nem rögzítenek — így a küszöb körül ingadozó töltöttség nem zárja le újra és újra a flottafeladatot.",
|
||||
"settings_battery_auto_record": "Csere automatikus rögzítése, ha egy lemerült elem feléled",
|
||||
"settings_battery_auto_record_hint": "Ha egy korábban lemerült elem a feléledési küszöb fölé emelkedik, a csere dátuma bekerül a Battery Notesba, és a tartalék cellák lekerülnek a készletről — érintés nélkül.",
|
||||
"settings_battery_lifetimes": "Jellemző elem-élettartamok",
|
||||
"settings_battery_lifetimes_hint": "Csak százalék nélküli elemeknél használjuk: olyan Battery Notes-bejegyzésnél, amelynek csak típusa és cseredátuma van, vagy csak „alacsony”-t jelentő érzékelőnél. Esedékesség = utolsó csere + ez az élettartam. A szintet jelentő elemek előrejelzése a mért kisülésből jön. Ha a flotta már három cserét látott egy típusból, a medián időköz veszi át a beépített értéket — a saját értéked mindig nyer.",
|
||||
"settings_battery_lifetime_months": "hónap",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Műveletek a feladatsorokban",
|
||||
"settings_ref_numbers_in_lists": "Hivatkozási számok a listákban",
|
||||
"settings_ref_numbers_in_lists_hint": "Megjeleníti a #8 / #8.3 címkéket az objektum- és feladatnevek előtt a Ma listában, a feladattáblában, az objektumkártyákon és az objektumtáblában.",
|
||||
"settings_compact_refs": "Hivatkozási számok tömörítése",
|
||||
"settings_compact_refs_hint": "Sorban újraszámozza az összes objektumot, feladatot és elvégzést (1, 2, 3 …), és bezárja a törlések hagyta réseket. A szervizfüzetekre, fotókra vagy jegyzetekre már rányomtatott számok ezután nem egyeznek.",
|
||||
"settings_compact_refs_confirm": "Újraszámozza az összes objektumot, feladatot és elvégzést folyamatosan, létrehozási sorrendben? A nyomtatott szervizfüzetekre, fotókra vagy jegyzetekre már felírt számok ezután nem egyeznek. Ez nem vonható vissza.",
|
||||
"settings_compact_refs_done": "Újraszámozva: {objects} objektum, {tasks} feladat és {completions} elvégzés.",
|
||||
"row_actions_buttons_compact": "Gombok (telefonon csak ikonok)",
|
||||
"row_actions_buttons": "Gombok szöveggel",
|
||||
"row_actions_icons": "Ikonok (klasszikus)",
|
||||
@@ -868,6 +874,7 @@
|
||||
"parts_used_by": "Használja",
|
||||
"restock_quantity_label": "Vásárolt mennyiség",
|
||||
"consumes_parts_label": "Felhasznált alkatrészek",
|
||||
"task_parts_fleet_hint": "Az elemek darabszáma eszközönként a Battery Notesból jön — itt nincs mit összekapcsolni.",
|
||||
"shared_parts_other_objects": "Más objektumok alkatrészei",
|
||||
"shared_parts_help": "Több objektum is használhatja ugyanazt a készletet. A feladat elvégzése a tulajdonos objektum készletéből von le.",
|
||||
"shared_part_unknown": "Ismeretlen alkatrész",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Soglia „batteria scarica“ (%)",
|
||||
"settings_battery_recovered_percent": "Batteria considerata sostituita sopra (%)",
|
||||
"settings_battery_recovered_percent_hint": "Una batteria scarica resta conteggiata come scarica finché il livello non supera questo valore o non viene registrata una sostituzione — così un livello che oscilla attorno alla soglia non completa di continuo l'attività della flotta.",
|
||||
"settings_battery_auto_record": "Registra automaticamente la sostituzione quando una batteria scarica si riprende",
|
||||
"settings_battery_auto_record_hint": "Quando una batteria che era scarica supera la soglia di ripresa, la data di sostituzione viene registrata in Battery Notes e le pile di ricambio vengono scalate dalla scorta — senza alcun tocco.",
|
||||
"settings_battery_lifetimes": "Durate tipiche delle batterie",
|
||||
"settings_battery_lifetimes_hint": "Usato solo per batterie senza percentuale: una nota Battery Notes con solo tipo e data di sostituzione, o un sensore che segnala solo « scarica ». La scadenza è ultima sostituzione + questa durata. Le batterie che riportano un livello ricavano la previsione dalla scarica misurata. Dopo tre sostituzioni dello stesso tipo, l'intervallo mediano sostituisce il valore integrato — il tuo valore vince sempre.",
|
||||
"settings_battery_lifetime_months": "mesi",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Azioni nelle righe delle attività",
|
||||
"settings_ref_numbers_in_lists": "Numeri di riferimento negli elenchi",
|
||||
"settings_ref_numbers_in_lists_hint": "Mostra le etichette #8 / #8.3 davanti ai nomi di oggetti e attività nell'elenco Oggi, nella tabella delle attività, nelle schede degli oggetti e nella tabella degli oggetti.",
|
||||
"settings_compact_refs": "Compatta i numeri di riferimento",
|
||||
"settings_compact_refs_hint": "Rinumera tutti gli oggetti, le attività e i completamenti in ordine (1, 2, 3 …) e chiude i vuoti lasciati dalle eliminazioni. I numeri già stampati su libretti di manutenzione, foto o note non corrisponderanno più.",
|
||||
"settings_compact_refs_confirm": "Rinumerare in sequenza tutti gli oggetti, le attività e i completamenti in ordine di creazione? I numeri già scritti su libretti di manutenzione stampati, foto o note non corrisponderanno più. L'operazione non può essere annullata.",
|
||||
"settings_compact_refs_done": "Rinumerati {objects} oggetti, {tasks} attività e {completions} completamenti.",
|
||||
"row_actions_buttons_compact": "Pulsanti (solo icone sul telefono)",
|
||||
"row_actions_buttons": "Pulsanti con testo",
|
||||
"row_actions_icons": "Icone (classico)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Usato da",
|
||||
"restock_quantity_label": "Quantità acquistata",
|
||||
"consumes_parts_label": "Consuma ricambi",
|
||||
"task_parts_fleet_hint": "Le quantità di batterie arrivano da Battery Notes per ogni dispositivo — qui non c'è nulla da collegare.",
|
||||
"shared_parts_other_objects": "Ricambi di altri oggetti",
|
||||
"shared_parts_help": "Più oggetti possono condividere una sola scorta. Completando questa attività si preleva dall'oggetto proprietario.",
|
||||
"shared_part_unknown": "Ricambio sconosciuto",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "電池「残量少」しきい値(%)",
|
||||
"settings_battery_recovered_percent": "この値を超えたら交換済みとみなす(%)",
|
||||
"settings_battery_recovered_percent_hint": "残量が少ない電池は、残量がこの値を超えるか交換が記録されるまで「残量少」として数えられます。しきい値付近で変動する残量が一括タスクを何度も完了させることを防ぎます。",
|
||||
"settings_battery_auto_record": "残量の少ない電池が回復したら交換を自動で記録",
|
||||
"settings_battery_auto_record_hint": "残量が少なかった電池が回復しきい値を上回ると、交換日が Battery Notes に記録され、予備の電池が在庫から差し引かれます。タップは不要です。",
|
||||
"settings_battery_lifetimes": "電池の標準寿命",
|
||||
"settings_battery_lifetimes_hint": "パーセント表示のない電池にのみ使います:種類と交換日だけの Battery Notes メモや「残量低下」しか報告しないセンサーです。期日は最終交換日+この寿命。残量を報告する電池は実測の放電から予測します。同じ種類の交換を3回記録すると、中央値の間隔が内蔵値に代わります。自分で設定した値が常に優先されます。",
|
||||
"settings_battery_lifetime_months": "か月",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "タスク行の操作",
|
||||
"settings_ref_numbers_in_lists": "一覧に参照番号を表示",
|
||||
"settings_ref_numbers_in_lists_hint": "「今日」の一覧、タスク表、オブジェクトカード、オブジェクト表で、オブジェクト名とタスク名の前に #8 / #8.3 のチップを表示します。",
|
||||
"settings_compact_refs": "参照番号を詰め直す",
|
||||
"settings_compact_refs_hint": "すべてのオブジェクト、タスク、完了記録を順番に振り直し(1、2、3…)、削除で空いた番号を詰めます。サービス手帳、写真、メモに印刷済みの番号は一致しなくなります。",
|
||||
"settings_compact_refs_confirm": "すべてのオブジェクト、タスク、完了記録を作成順に連番で振り直しますか?印刷済みのサービス手帳、写真、メモに書かれた番号は一致しなくなります。この操作は取り消せません。",
|
||||
"settings_compact_refs_done": "オブジェクト {objects} 件、タスク {tasks} 件、完了記録 {completions} 件の番号を振り直しました。",
|
||||
"row_actions_buttons_compact": "ボタン(スマートフォンではアイコンのみ)",
|
||||
"row_actions_buttons": "テキスト付きボタン",
|
||||
"row_actions_icons": "アイコン(従来)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "使用タスク",
|
||||
"restock_quantity_label": "購入数量",
|
||||
"consumes_parts_label": "部品を消費",
|
||||
"task_parts_fleet_hint": "電池の数量はデバイスごとに Battery Notes から取得されます。ここで紐づけるものはありません。",
|
||||
"shared_parts_other_objects": "他の対象の部品",
|
||||
"shared_parts_help": "複数の対象で同じ在庫を共有できます。このタスクを完了すると、所有する対象の在庫から差し引かれます。",
|
||||
"shared_part_unknown": "不明な部品",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "배터리 „부족“ 임계값 (%)",
|
||||
"settings_battery_recovered_percent": "이 값 초과 시 배터리 교체됨으로 간주 (%)",
|
||||
"settings_battery_recovered_percent_hint": "부족한 배터리는 잔량이 이 값을 초과하거나 교체가 기록될 때까지 부족으로 계속 집계됩니다. 임계값 근처에서 오르내리는 잔량이 배터리 일괄 작업을 반복 완료하지 못하게 합니다.",
|
||||
"settings_battery_auto_record": "저전량 배터리가 회복되면 교체를 자동으로 기록",
|
||||
"settings_battery_auto_record_hint": "저전량이던 배터리가 회복 임계값 위로 올라가면 교체 날짜가 Battery Notes에 기록되고 예비 전지가 재고에서 차감됩니다. 탭할 필요가 없습니다.",
|
||||
"settings_battery_lifetimes": "배터리 일반 수명",
|
||||
"settings_battery_lifetimes_hint": "백분율이 없는 배터리에만 사용됩니다: 종류와 교체일만 있는 Battery Notes 메모나 \"낮음\"만 알리는 센서입니다. 만기 = 마지막 교체 + 이 수명. 잔량을 보고하는 배터리는 실측 방전으로 예측합니다. 같은 종류의 교체를 3회 기록하면 중앙값 간격이 내장값을 대체합니다. 직접 설정한 값이 항상 우선합니다.",
|
||||
"settings_battery_lifetime_months": "개월",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "작업 행 동작",
|
||||
"settings_ref_numbers_in_lists": "목록에 참조 번호 표시",
|
||||
"settings_ref_numbers_in_lists_hint": "오늘 목록, 작업 표, 개체 카드, 개체 표에서 개체 및 작업 이름 앞에 #8 / #8.3 칩을 표시합니다.",
|
||||
"settings_compact_refs": "참조 번호 정리",
|
||||
"settings_compact_refs_hint": "모든 개체, 작업, 완료 기록을 순서대로(1, 2, 3 …) 다시 번호 매기고 삭제로 생긴 빈 번호를 채웁니다. 이미 정비 수첩, 사진, 메모에 적힌 번호는 더 이상 맞지 않습니다.",
|
||||
"settings_compact_refs_confirm": "모든 개체, 작업, 완료 기록을 생성 순서대로 연속 번호로 다시 매길까요? 인쇄된 정비 수첩, 사진, 메모에 이미 적힌 번호는 더 이상 맞지 않습니다. 되돌릴 수 없습니다.",
|
||||
"settings_compact_refs_done": "개체 {objects}개, 작업 {tasks}개, 완료 기록 {completions}개의 번호를 다시 매겼습니다.",
|
||||
"row_actions_buttons_compact": "버튼 (휴대폰에서는 아이콘만)",
|
||||
"row_actions_buttons": "텍스트가 있는 버튼",
|
||||
"row_actions_icons": "아이콘 (기본)",
|
||||
@@ -868,6 +874,7 @@
|
||||
"parts_used_by": "사용처",
|
||||
"restock_quantity_label": "구매 수량",
|
||||
"consumes_parts_label": "사용하는 부품",
|
||||
"task_parts_fleet_hint": "배터리 수량은 기기별로 Battery Notes에서 가져옵니다. 여기서 연결할 것은 없습니다.",
|
||||
"shared_parts_other_objects": "다른 객체의 부품",
|
||||
"shared_parts_help": "여러 객체가 하나의 재고를 공유할 수 있습니다. 이 작업을 완료하면 소유 객체의 재고에서 차감됩니다.",
|
||||
"shared_part_unknown": "알 수 없는 부품",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Terskel „batteri lavt“ (%)",
|
||||
"settings_battery_recovered_percent": "Batteri regnes som byttet over (%)",
|
||||
"settings_battery_recovered_percent_hint": "Et lavt batteri telles som lavt til nivået stiger over denne verdien eller et bytte registreres — slik kan et nivå som svinger rundt terskelen ikke fullføre flåteoppgaven igjen og igjen.",
|
||||
"settings_battery_auto_record": "Registrer bytte automatisk når et svakt batteri kommer seg",
|
||||
"settings_battery_auto_record_hint": "Når et batteri som var svakt stiger over gjenopprettingsterskelen, registreres byttedatoen i Battery Notes og reservecellene trekkes fra lageret — uten et trykk.",
|
||||
"settings_battery_lifetimes": "Typiske batterilevetider",
|
||||
"settings_battery_lifetimes_hint": "Brukes bare for batterier uten prosent: et Battery Notes-notat med bare type og byttedato, eller en sensor som bare melder «lavt». Forfall = siste bytte + denne levetiden. Batterier som melder nivå får prognosen fra målt utlading. Når flåten har sett tre bytter av en type, overtar medianintervallet fra den innebygde verdien — din egen verdi vinner alltid.",
|
||||
"settings_battery_lifetime_months": "måneder",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Handlinger i oppgaverader",
|
||||
"settings_ref_numbers_in_lists": "Referansenumre i lister",
|
||||
"settings_ref_numbers_in_lists_hint": "Viser brikkene #8 / #8.3 foran objekt- og oppgavenavn i I dag-listen, oppgavetabellen, objektkortene og objekttabellen.",
|
||||
"settings_compact_refs": "Komprimer referansenumre",
|
||||
"settings_compact_refs_hint": "Nummererer alle objekter, oppgaver og utførelser på nytt i rekkefølge (1, 2, 3 …) og tetter hullene etter slettinger. Numre som allerede står i servicehefter, på bilder eller notater, stemmer ikke lenger.",
|
||||
"settings_compact_refs_confirm": "Nummerere alle objekter, oppgaver og utførelser på nytt fortløpende i opprettelsesrekkefølge? Numre som allerede står i utskrevne servicehefter, på bilder eller notater, stemmer ikke lenger. Dette kan ikke angres.",
|
||||
"settings_compact_refs_done": "Nummererte på nytt {objects} objekter, {tasks} oppgaver og {completions} utførelser.",
|
||||
"row_actions_buttons_compact": "Knapper (bare ikoner på mobil)",
|
||||
"row_actions_buttons": "Knapper med tekst",
|
||||
"row_actions_icons": "Ikoner (klassisk)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Brukes av",
|
||||
"restock_quantity_label": "Kjøpt mengde",
|
||||
"consumes_parts_label": "Forbruker deler",
|
||||
"task_parts_fleet_hint": "Batteriantallet kommer fra Battery Notes per enhet — ingenting å koble her.",
|
||||
"shared_parts_other_objects": "Deler fra andre objekter",
|
||||
"shared_parts_help": "Flere objekter kan dele samme lager. Når oppgaven fullføres, trekkes det fra det eiende objektet.",
|
||||
"shared_part_unknown": "Ukjent del",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Drempel „batterij laag“ (%)",
|
||||
"settings_battery_recovered_percent": "Batterij geldt als vervangen boven (%)",
|
||||
"settings_battery_recovered_percent_hint": "Een lege batterij blijft als laag geteld tot het niveau boven deze waarde stijgt of een vervanging wordt vastgelegd — zo kan een niveau dat rond de drempel schommelt de vloottaak niet steeds opnieuw afronden.",
|
||||
"settings_battery_auto_record": "Vervanging automatisch vastleggen wanneer een lege batterij herstelt",
|
||||
"settings_battery_auto_record_hint": "Als een batterij die leeg was boven de hersteldrempel komt, wordt de vervangdatum in Battery Notes vastgelegd en worden de reservecellen van de voorraad afgeboekt — zonder tik.",
|
||||
"settings_battery_lifetimes": "Gebruikelijke batterijlevensduur",
|
||||
"settings_battery_lifetimes_hint": "Alleen gebruikt voor batterijen zonder percentage: een Battery Notes-notitie met enkel een type en een vervangdatum, of een sensor die alleen „bijna leeg“ meldt. Hun vervaldatum is laatste vervanging + deze levensduur. Batterijen die een niveau melden krijgen hun voorspelling uit de gemeten ontlading. Zodra de vloot drie vervangingen van een type heeft gezien, vervangt het mediane interval de ingebouwde waarde — je eigen waarde wint altijd.",
|
||||
"settings_battery_lifetime_months": "maanden",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Acties in taakrijen",
|
||||
"settings_ref_numbers_in_lists": "Referentienummers in lijsten",
|
||||
"settings_ref_numbers_in_lists_hint": "Toont de chips #8 / #8.3 vóór object- en taaknamen in de lijst Vandaag, de takentabel, de objectkaarten en de objectentabel.",
|
||||
"settings_compact_refs": "Referentienummers verdichten",
|
||||
"settings_compact_refs_hint": "Nummert alle objecten, taken en voltooiingen opnieuw op volgorde (1, 2, 3 …) en sluit de gaten van verwijderde items. Nummers die al op serviceboekjes, foto's of notities staan, kloppen daarna niet meer.",
|
||||
"settings_compact_refs_confirm": "Alle objecten, taken en voltooiingen opnieuw doorlopend nummeren in volgorde van aanmaak? Nummers die al op gedrukte serviceboekjes, foto's of notities staan, kloppen daarna niet meer. Dit kan niet ongedaan worden gemaakt.",
|
||||
"settings_compact_refs_done": "{objects} objecten, {tasks} taken en {completions} voltooiingen opnieuw genummerd.",
|
||||
"row_actions_buttons_compact": "Knoppen (op telefoons alleen pictogrammen)",
|
||||
"row_actions_buttons": "Knoppen met tekst",
|
||||
"row_actions_icons": "Pictogrammen (klassiek)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Gebruikt door",
|
||||
"restock_quantity_label": "Gekochte hoeveelheid",
|
||||
"consumes_parts_label": "Verbruikt onderdelen",
|
||||
"task_parts_fleet_hint": "De batterijaantallen komen per apparaat uit Battery Notes — hier valt niets te koppelen.",
|
||||
"shared_parts_other_objects": "Onderdelen van andere objecten",
|
||||
"shared_parts_help": "Meerdere objecten kunnen één voorraad delen. Bij afronden wordt van het eigenaarsobject afgeboekt.",
|
||||
"shared_part_unknown": "Onbekend onderdeel",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Próg „bateria słaba” (%)",
|
||||
"settings_battery_recovered_percent": "Bateria uznana za wymienioną powyżej (%)",
|
||||
"settings_battery_recovered_percent_hint": "Słaba bateria pozostaje liczona jako słaba, dopóki jej poziom nie wzrośnie powyżej tej wartości lub nie zostanie zapisana wymiana — poziom oscylujący wokół progu nie kończy więc zadania floty raz za razem.",
|
||||
"settings_battery_auto_record": "Automatycznie rejestruj wymianę, gdy słaba bateria się regeneruje",
|
||||
"settings_battery_auto_record_hint": "Gdy słaba bateria wzrośnie powyżej progu regeneracji, data wymiany zostaje zapisana w Battery Notes, a zapasowe ogniwa zdjęte ze stanu — bez żadnego kliknięcia.",
|
||||
"settings_battery_lifetimes": "Typowa żywotność baterii",
|
||||
"settings_battery_lifetimes_hint": "Używane tylko dla baterii bez procentu: notatka Battery Notes z samym typem i datą wymiany albo czujnik zgłaszający tylko „niski”. Termin = ostatnia wymiana + ta żywotność. Baterie raportujące poziom dostają prognozę z mierzonego rozładowania. Po trzech wymianach danego typu mediana odstępów zastępuje wbudowaną wartość — Twoja wartość zawsze wygrywa.",
|
||||
"settings_battery_lifetime_months": "mies.",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Akcje w wierszach zadań",
|
||||
"settings_ref_numbers_in_lists": "Numery referencyjne na listach",
|
||||
"settings_ref_numbers_in_lists_hint": "Pokazuje etykiety #8 / #8.3 przed nazwami obiektów i zadań na liście Dzisiaj, w tabeli zadań, na kartach obiektów i w tabeli obiektów.",
|
||||
"settings_compact_refs": "Zagęść numery referencyjne",
|
||||
"settings_compact_refs_hint": "Numeruje ponownie wszystkie obiekty, zadania i wykonania po kolei (1, 2, 3 …) i zamyka luki po usunięciach. Numery już wydrukowane w książkach serwisowych, na zdjęciach lub w notatkach przestaną się zgadzać.",
|
||||
"settings_compact_refs_confirm": "Ponumerować ponownie wszystkie obiekty, zadania i wykonania kolejno w porządku utworzenia? Numery zapisane już w wydrukowanych książkach serwisowych, na zdjęciach lub w notatkach przestaną się zgadzać. Tej operacji nie można cofnąć.",
|
||||
"settings_compact_refs_done": "Ponumerowano ponownie: obiekty {objects}, zadania {tasks}, wykonania {completions}.",
|
||||
"row_actions_buttons_compact": "Przyciski (na telefonie tylko ikony)",
|
||||
"row_actions_buttons": "Przyciski z tekstem",
|
||||
"row_actions_icons": "Ikony (klasyczne)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Używane przez",
|
||||
"restock_quantity_label": "Kupiona ilość",
|
||||
"consumes_parts_label": "Zużywa części",
|
||||
"task_parts_fleet_hint": "Liczba baterii pochodzi z Battery Notes dla każdego urządzenia — tu nie ma nic do powiązania.",
|
||||
"shared_parts_other_objects": "Części z innych obiektów",
|
||||
"shared_parts_help": "Kilka obiektów może korzystać z jednego zapasu. Wykonanie tego zadania odejmuje ze stanu obiektu będącego właścicielem.",
|
||||
"shared_part_unknown": "Nieznana część",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "Limite „pilha fraca“ (%)",
|
||||
"settings_battery_recovered_percent": "Pilha considerada trocada acima de (%)",
|
||||
"settings_battery_recovered_percent_hint": "Uma pilha fraca continua contando como fraca até o nível subir acima deste valor ou uma troca ser registrada — assim um nível oscilando em torno do limite não conclui a tarefa da frota repetidamente.",
|
||||
"settings_battery_auto_record": "Registrar a troca automaticamente quando uma bateria fraca se recupera",
|
||||
"settings_battery_auto_record_hint": "Quando uma bateria que estava fraca sobe acima do limite de recuperação, a data da troca é registrada no Battery Notes e as pilhas reservas são baixadas do estoque — sem precisar tocar.",
|
||||
"settings_battery_lifetimes": "Vida útil típica das pilhas",
|
||||
"settings_battery_lifetimes_hint": "Usado apenas para pilhas sem porcentagem: uma nota do Battery Notes só com tipo e data de troca, ou um sensor que apenas informa « fraca ». O vencimento é última troca + esta vida útil. Pilhas que informam nível têm a previsão pela descarga medida. Após três trocas de um tipo, o intervalo mediano substitui o valor integrado — seu valor sempre vence.",
|
||||
"settings_battery_lifetime_months": "meses",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Ações nas linhas de tarefas",
|
||||
"settings_ref_numbers_in_lists": "Números de referência nas listas",
|
||||
"settings_ref_numbers_in_lists_hint": "Mostra as etiquetas #8 / #8.3 antes dos nomes de objetos e tarefas na lista Hoje, na tabela de tarefas, nos cartões de objetos e na tabela de objetos.",
|
||||
"settings_compact_refs": "Compactar os números de referência",
|
||||
"settings_compact_refs_hint": "Renumera todos os objetos, tarefas e conclusões em ordem (1, 2, 3 …) e fecha as lacunas deixadas por exclusões. Números já impressos em cadernetas de serviço, fotos ou notas deixarão de corresponder.",
|
||||
"settings_compact_refs_confirm": "Renumerar sequencialmente todos os objetos, tarefas e conclusões em ordem de criação? Números já escritos em cadernetas de serviço impressas, fotos ou notas deixarão de corresponder. Isso não pode ser desfeito.",
|
||||
"settings_compact_refs_done": "Renumerados {objects} objetos, {tasks} tarefas e {completions} conclusões.",
|
||||
"row_actions_buttons_compact": "Botões (só ícones no celular)",
|
||||
"row_actions_buttons": "Botões com texto",
|
||||
"row_actions_icons": "Ícones (clássico)",
|
||||
@@ -868,6 +874,7 @@
|
||||
"parts_used_by": "Usado por",
|
||||
"restock_quantity_label": "Quantidade comprada",
|
||||
"consumes_parts_label": "Consome peças",
|
||||
"task_parts_fleet_hint": "As quantidades de pilhas vêm do Battery Notes por dispositivo — nada a vincular aqui.",
|
||||
"shared_parts_other_objects": "Peças de outros objetos",
|
||||
"shared_parts_help": "Vários objetos podem compartilhar o mesmo estoque. Concluir esta tarefa desconta do objeto proprietário.",
|
||||
"shared_part_unknown": "Peça desconhecida",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Limiar „pilha fraca“ (%)",
|
||||
"settings_battery_recovered_percent": "Pilha considerada substituída acima de (%)",
|
||||
"settings_battery_recovered_percent_hint": "Uma pilha fraca continua a contar como fraca até o nível subir acima deste valor ou ser registada uma substituição — assim, um nível que oscila em torno do limiar não conclui a tarefa da frota vezes sem conta.",
|
||||
"settings_battery_auto_record": "Registar automaticamente a substituição quando uma bateria fraca recupera",
|
||||
"settings_battery_auto_record_hint": "Quando uma bateria que estava fraca sobe acima do limiar de recuperação, a data de substituição é registada no Battery Notes e as pilhas sobressalentes são retiradas do stock — sem qualquer toque.",
|
||||
"settings_battery_lifetimes": "Durações típicas das pilhas",
|
||||
"settings_battery_lifetimes_hint": "Usado apenas para pilhas sem percentagem: uma nota do Battery Notes só com tipo e data de substituição, ou um sensor que apenas reporta « fraca ». O vencimento é última substituição + esta duração. Pilhas que reportam nível obtêm a previsão da descarga medida. Após três substituições de um tipo, o intervalo mediano substitui o valor integrado — o seu valor ganha sempre.",
|
||||
"settings_battery_lifetime_months": "meses",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Ações nas linhas de tarefas",
|
||||
"settings_ref_numbers_in_lists": "Números de referência nas listas",
|
||||
"settings_ref_numbers_in_lists_hint": "Mostra as etiquetas #8 / #8.3 antes dos nomes de objetos e tarefas na lista Hoje, na tabela de tarefas, nos cartões de objetos e na tabela de objetos.",
|
||||
"settings_compact_refs": "Compactar os números de referência",
|
||||
"settings_compact_refs_hint": "Renumera todos os objetos, tarefas e conclusões por ordem (1, 2, 3 …) e fecha os intervalos deixados por eliminações. Os números já impressos em livros de serviço, fotos ou notas deixarão de corresponder.",
|
||||
"settings_compact_refs_confirm": "Renumerar sequencialmente todos os objetos, tarefas e conclusões por ordem de criação? Os números já escritos em livros de serviço impressos, fotos ou notas deixarão de corresponder. Isto não pode ser anulado.",
|
||||
"settings_compact_refs_done": "Renumerados {objects} objetos, {tasks} tarefas e {completions} conclusões.",
|
||||
"row_actions_buttons_compact": "Botões (só ícones no telemóvel)",
|
||||
"row_actions_buttons": "Botões com texto",
|
||||
"row_actions_icons": "Ícones (clássico)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Usado por",
|
||||
"restock_quantity_label": "Quantidade comprada",
|
||||
"consumes_parts_label": "Consome peças",
|
||||
"task_parts_fleet_hint": "As quantidades de pilhas vêm do Battery Notes por dispositivo — nada a associar aqui.",
|
||||
"shared_parts_other_objects": "Peças de outros objetos",
|
||||
"shared_parts_help": "Vários objetos podem partilhar o mesmo stock. Concluir esta tarefa desconta do objeto proprietário.",
|
||||
"shared_part_unknown": "Peça desconhecida",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Порог «батарея разряжена» (%)",
|
||||
"settings_battery_recovered_percent": "Батарея считается заменённой выше (%)",
|
||||
"settings_battery_recovered_percent_hint": "Разряженная батарея считается разряженной, пока её уровень не поднимется выше этого значения или не будет записана замена — уровень, колеблющийся около порога, больше не завершает задачу парка снова и снова.",
|
||||
"settings_battery_auto_record": "Автоматически фиксировать замену, когда разряженная батарея восстанавливается",
|
||||
"settings_battery_auto_record_hint": "Когда разряженная батарея поднимается выше порога восстановления, дата замены записывается в Battery Notes, а запасные элементы списываются со склада — без единого нажатия.",
|
||||
"settings_battery_lifetimes": "Типичный срок службы батарей",
|
||||
"settings_battery_lifetimes_hint": "Используется только для батарей без процента: заметка Battery Notes лишь с типом и датой замены или датчик, сообщающий только «низкий». Срок = последняя замена + этот срок службы. Для батарей с уровнем прогноз строится по измеренному разряду. После трёх замен одного типа медианный интервал заменяет встроенное значение — ваше значение всегда главнее.",
|
||||
"settings_battery_lifetime_months": "мес.",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Действия в строках задач",
|
||||
"settings_ref_numbers_in_lists": "Номера ссылок в списках",
|
||||
"settings_ref_numbers_in_lists_hint": "Показывать метки #8 / #8.3 перед названиями объектов и задач в списке «Сегодня», таблице задач, карточках объектов и таблице объектов.",
|
||||
"settings_compact_refs": "Уплотнить номера ссылок",
|
||||
"settings_compact_refs_hint": "Перенумеровывает все объекты, задачи и выполнения по порядку (1, 2, 3 …) и закрывает пробелы после удалений. Номера, уже напечатанные в сервисных книжках, на фото или в заметках, перестанут совпадать.",
|
||||
"settings_compact_refs_confirm": "Перенумеровать все объекты, задачи и выполнения последовательно в порядке создания? Номера, уже записанные в напечатанных сервисных книжках, на фото или в заметках, перестанут совпадать. Это нельзя отменить.",
|
||||
"settings_compact_refs_done": "Перенумеровано: объектов — {objects}, задач — {tasks}, выполнений — {completions}.",
|
||||
"row_actions_buttons_compact": "Кнопки (на телефоне только значки)",
|
||||
"row_actions_buttons": "Кнопки с текстом",
|
||||
"row_actions_icons": "Значки (классический вид)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Используется",
|
||||
"restock_quantity_label": "Куплено, шт.",
|
||||
"consumes_parts_label": "Расходует детали",
|
||||
"task_parts_fleet_hint": "Количество батарей берётся из Battery Notes для каждого устройства — здесь нечего привязывать.",
|
||||
"shared_parts_other_objects": "Детали других объектов",
|
||||
"shared_parts_help": "Несколько объектов могут использовать один запас. Выполнение этой задачи списывает детали у объекта-владельца.",
|
||||
"shared_part_unknown": "Неизвестная деталь",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Tröskel „batteri lågt“ (%)",
|
||||
"settings_battery_recovered_percent": "Batteri räknas som bytt över (%)",
|
||||
"settings_battery_recovered_percent_hint": "Ett lågt batteri räknas som lågt tills nivån stiger över detta värde eller ett byte registreras — så kan en nivå som pendlar kring tröskeln inte slutföra flottuppgiften om och om igen.",
|
||||
"settings_battery_auto_record": "Registrera byte automatiskt när ett svagt batteri återhämtar sig",
|
||||
"settings_battery_auto_record_hint": "När ett batteri som var svagt stiger över återhämtningströskeln registreras bytesdatumet i Battery Notes och reservcellerna dras från lagret — utan ett enda tryck.",
|
||||
"settings_battery_lifetimes": "Typiska batterilivslängder",
|
||||
"settings_battery_lifetimes_hint": "Används bara för batterier utan procent: en Battery Notes-anteckning med bara typ och bytesdatum, eller en sensor som bara rapporterar ”lågt”. Deras förfallodatum är senaste byte + denna livslängd. Batterier som rapporterar nivå får sin prognos från den uppmätta urladdningen. När flottan sett tre byten av en typ tar medianintervallet över från det inbyggda värdet — ditt eget värde vinner alltid.",
|
||||
"settings_battery_lifetime_months": "månader",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Åtgärder i uppgiftsrader",
|
||||
"settings_ref_numbers_in_lists": "Referensnummer i listor",
|
||||
"settings_ref_numbers_in_lists_hint": "Visar brickorna #8 / #8.3 före objekt- och uppgiftsnamn i Idag-listan, uppgiftstabellen, objektkorten och objekttabellen.",
|
||||
"settings_compact_refs": "Packa referensnumren",
|
||||
"settings_compact_refs_hint": "Numrerar om alla objekt, uppgifter och utföranden i ordning (1, 2, 3 …) och stänger luckorna efter raderingar. Nummer som redan står i servicehäften, på foton eller anteckningar stämmer inte längre.",
|
||||
"settings_compact_refs_confirm": "Numrera om alla objekt, uppgifter och utföranden löpande i skapandeordning? Nummer som redan står i utskrivna servicehäften, på foton eller anteckningar stämmer inte längre. Detta kan inte ångras.",
|
||||
"settings_compact_refs_done": "Numrerade om {objects} objekt, {tasks} uppgifter och {completions} utföranden.",
|
||||
"row_actions_buttons_compact": "Knappar (endast ikoner på mobilen)",
|
||||
"row_actions_buttons": "Knappar med text",
|
||||
"row_actions_icons": "Ikoner (klassiskt)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Används av",
|
||||
"restock_quantity_label": "Köpt antal",
|
||||
"consumes_parts_label": "Förbrukar delar",
|
||||
"task_parts_fleet_hint": "Batteriantalen kommer från Battery Notes per enhet — inget att koppla här.",
|
||||
"shared_parts_other_objects": "Delar från andra objekt",
|
||||
"shared_parts_help": "Flera objekt kan dela samma lager. När uppgiften slutförs dras det från det ägande objektet.",
|
||||
"shared_part_unknown": "Okänd del",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "„Pil zayıf“ eşiği (%)",
|
||||
"settings_battery_recovered_percent": "Pil şu değerin üzerinde değiştirilmiş sayılır (%)",
|
||||
"settings_battery_recovered_percent_hint": "Zayıf bir pil, seviyesi bu değerin üzerine çıkana veya bir değişim kaydedilene kadar zayıf sayılmaya devam eder — böylece eşik çevresinde salınan bir seviye filo görevini tekrar tekrar tamamlayamaz.",
|
||||
"settings_battery_auto_record": "Zayıf bir pil toparlandığında değişimi otomatik kaydet",
|
||||
"settings_battery_auto_record_hint": "Zayıf olan bir pil toparlanma eşiğinin üzerine çıktığında, değişim tarihi Battery Notes'a kaydedilir ve yedek piller stoktan düşülür — dokunmaya gerek yok.",
|
||||
"settings_battery_lifetimes": "Tipik pil ömürleri",
|
||||
"settings_battery_lifetimes_hint": "Yalnızca yüzdesi olmayan piller için kullanılır: sadece tür ve değişim tarihi olan bir Battery Notes notu ya da yalnızca \"düşük\" bildiren bir sensör. Vade = son değişim + bu ömür. Seviye bildiren pillerin tahmini ölçülen deşarjdan gelir. Filo bir türden üç değişim gördüğünde ortanca aralık yerleşik değerin yerini alır — kendi değerin her zaman kazanır.",
|
||||
"settings_battery_lifetime_months": "ay",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "Görev satırı eylemleri",
|
||||
"settings_ref_numbers_in_lists": "Listelerde referans numaraları",
|
||||
"settings_ref_numbers_in_lists_hint": "Bugün listesinde, görev tablosunda, nesne kartlarında ve nesne tablosunda nesne ve görev adlarının önünde #8 / #8.3 etiketlerini gösterir.",
|
||||
"settings_compact_refs": "Referans numaralarını sıkıştır",
|
||||
"settings_compact_refs_hint": "Tüm nesneleri, görevleri ve tamamlamaları sırayla (1, 2, 3 …) yeniden numaralandırır ve silmelerin bıraktığı boşlukları kapatır. Servis defterlerine, fotoğraflara veya notlara zaten basılmış numaralar artık eşleşmez.",
|
||||
"settings_compact_refs_confirm": "Tüm nesneler, görevler ve tamamlamalar oluşturulma sırasına göre ardışık olarak yeniden numaralandırılsın mı? Basılı servis defterlerine, fotoğraflara veya notlara zaten yazılmış numaralar artık eşleşmez. Bu işlem geri alınamaz.",
|
||||
"settings_compact_refs_done": "{objects} nesne, {tasks} görev ve {completions} tamamlama yeniden numaralandırıldı.",
|
||||
"row_actions_buttons_compact": "Düğmeler (telefonda yalnızca simgeler)",
|
||||
"row_actions_buttons": "Metinli düğmeler",
|
||||
"row_actions_icons": "Simgeler (klasik)",
|
||||
@@ -868,6 +874,7 @@
|
||||
"parts_used_by": "Kullanan",
|
||||
"restock_quantity_label": "Satın alınan miktar",
|
||||
"consumes_parts_label": "Parça tüketir",
|
||||
"task_parts_fleet_hint": "Pil adetleri cihaz başına Battery Notes'tan gelir — burada bağlanacak bir şey yok.",
|
||||
"shared_parts_other_objects": "Diğer nesnelerin parçaları",
|
||||
"shared_parts_help": "Birden fazla nesne aynı stoğu paylaşabilir. Bu görev tamamlandığında stok, sahibi olan nesneden düşülür.",
|
||||
"shared_part_unknown": "Bilinmeyen parça",
|
||||
|
||||
@@ -502,6 +502,8 @@
|
||||
"settings_battery_low_percent": "Поріг «батарея розряджена» (%)",
|
||||
"settings_battery_recovered_percent": "Батарея вважається заміненою вище (%)",
|
||||
"settings_battery_recovered_percent_hint": "Розряджена батарея вважається розрядженою, доки її рівень не підніметься вище цього значення або не буде записано заміну — рівень, що коливається біля порога, більше не завершує завдання парку знову й знову.",
|
||||
"settings_battery_auto_record": "Автоматично фіксувати заміну, коли розряджена батарея відновлюється",
|
||||
"settings_battery_auto_record_hint": "Коли розряджена батарея піднімається вище порога відновлення, дата заміни записується в Battery Notes, а запасні елементи списуються зі складу — без жодного натискання.",
|
||||
"settings_battery_lifetimes": "Типовий строк служби батарей",
|
||||
"settings_battery_lifetimes_hint": "Використовується лише для батарей без відсотка: нотатка Battery Notes лише з типом і датою заміни або датчик, що повідомляє тільки «низький». Термін = остання заміна + цей строк служби. Для батарей з рівнем прогноз будується за виміряним розрядом. Після трьох замін одного типу медіанний інтервал замінює вбудоване значення — ваше значення завжди головніше.",
|
||||
"settings_battery_lifetime_months": "міс.",
|
||||
@@ -520,6 +522,10 @@
|
||||
"settings_row_actions": "Дії в рядках завдань",
|
||||
"settings_ref_numbers_in_lists": "Номери посилань у списках",
|
||||
"settings_ref_numbers_in_lists_hint": "Показувати мітки #8 / #8.3 перед назвами об'єктів і завдань у списку «Сьогодні», таблиці завдань, картках об'єктів і таблиці об'єктів.",
|
||||
"settings_compact_refs": "Ущільнити номери посилань",
|
||||
"settings_compact_refs_hint": "Перенумеровує всі об'єкти, завдання та виконання по порядку (1, 2, 3 …) і закриває прогалини після видалень. Номери, вже надруковані в сервісних книжках, на фото чи в нотатках, більше не збігатимуться.",
|
||||
"settings_compact_refs_confirm": "Перенумерувати всі об'єкти, завдання та виконання послідовно в порядку створення? Номери, вже записані в надрукованих сервісних книжках, на фото чи в нотатках, більше не збігатимуться. Це не можна скасувати.",
|
||||
"settings_compact_refs_done": "Перенумеровано: об'єктів — {objects}, завдань — {tasks}, виконань — {completions}.",
|
||||
"row_actions_buttons_compact": "Кнопки (на телефоні лише значки)",
|
||||
"row_actions_buttons": "Кнопки з текстом",
|
||||
"row_actions_icons": "Значки (класичний вигляд)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "Використовується",
|
||||
"restock_quantity_label": "Куплена кількість",
|
||||
"consumes_parts_label": "Витрачає деталі",
|
||||
"task_parts_fleet_hint": "Кількість батарей береться з Battery Notes для кожного пристрою — тут нічого прив'язувати.",
|
||||
"shared_parts_other_objects": "Деталі інших об'єктів",
|
||||
"shared_parts_help": "Кілька об'єктів можуть використовувати один запас. Виконання цього завдання списує деталі з об'єкта-власника.",
|
||||
"shared_part_unknown": "Невідома деталь",
|
||||
|
||||
@@ -504,6 +504,8 @@
|
||||
"settings_battery_low_percent": "电池“电量低”阈值(%)",
|
||||
"settings_battery_recovered_percent": "电量高于此值视为已更换(%)",
|
||||
"settings_battery_recovered_percent_hint": "电量低的电池会一直计为低电量,直到电量高于此值或记录了更换——这样在阈值附近波动的电量不会反复完成电池组任务。",
|
||||
"settings_battery_auto_record": "低电量电池恢复时自动记录更换",
|
||||
"settings_battery_auto_record_hint": "当原本低电量的电池回升到恢复阈值以上时,更换日期会记录到 Battery Notes,备用电池会从库存中扣除——无需任何点击。",
|
||||
"settings_battery_lifetimes": "电池典型寿命",
|
||||
"settings_battery_lifetimes_hint": "仅用于没有百分比的电池:只有类型和更换日期的 Battery Notes 记录,或只报告“低电量”的传感器。其到期日 = 上次更换 + 此寿命。报告电量的电池改用实测放电来预测。同一类型出现三次更换后,中位间隔将取代内置值——你自己的值始终优先。",
|
||||
"settings_battery_lifetime_months": "个月",
|
||||
@@ -522,6 +524,10 @@
|
||||
"settings_row_actions": "任务行操作",
|
||||
"settings_ref_numbers_in_lists": "在列表中显示编号",
|
||||
"settings_ref_numbers_in_lists_hint": "在“今天”列表、任务表、对象卡片和对象表中的对象与任务名称前显示 #8 / #8.3 编号标签。",
|
||||
"settings_compact_refs": "重新紧凑编号",
|
||||
"settings_compact_refs_hint": "按顺序重新为所有对象、任务和完成记录编号(1、2、3…),并填补删除留下的空缺。已印在服务手册、照片或备注上的编号将不再对应。",
|
||||
"settings_compact_refs_confirm": "按创建顺序重新连续编号所有对象、任务和完成记录?已写在打印的服务手册、照片或备注上的编号将不再对应。此操作无法撤销。",
|
||||
"settings_compact_refs_done": "已重新编号 {objects} 个对象、{tasks} 个任务和 {completions} 条完成记录。",
|
||||
"row_actions_buttons_compact": "按钮(手机上仅显示图标)",
|
||||
"row_actions_buttons": "带文字的按钮",
|
||||
"row_actions_icons": "图标(经典)",
|
||||
@@ -862,6 +868,7 @@
|
||||
"parts_used_by": "使用于",
|
||||
"restock_quantity_label": "购买数量",
|
||||
"consumes_parts_label": "消耗配件",
|
||||
"task_parts_fleet_hint": "电池数量按设备来自 Battery Notes——此处无需关联。",
|
||||
"shared_parts_other_objects": "其他设备的配件",
|
||||
"shared_parts_help": "多个设备可以共用同一批库存。完成此任务将从所属设备的库存中扣减。",
|
||||
"shared_part_unknown": "未知配件",
|
||||
|
||||
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
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,5 +1,5 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{e as f}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-ZLVS6B3E.js";import{a as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-FE4LECIX.js";import{a as o,b as _,c as i,f as l,h,l as g,m as n,q as t,s as u,u as v}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";var r=class extends h{constructor(){super(...arguments);this._open=!1;this._loading=!1;this._adopting=!1;this._error="";this._sensors=[];this._selected=new Set;this._users=[];this._responsible="";this._forMinutes="0";this._localeReady=!1;this._userService=null;this._toggle=s=>{let a=new Set(this._selected);a.has(s)?a.delete(s):a.add(s),this._selected=a};this._toggleAll=()=>{this._selected.size===this._sensors.length?this._selected=new Set:this._selected=new Set(this._sensors.map(s=>s.entity_id))};this._adopt=async()=>{if(!(this._selected.size===0||this._adopting)){this._adopting=!0,this._error="";try{let s=this._sensors.filter(e=>this._selected.has(e.entity_id)).map(e=>({entity_id:e.entity_id,name:e.name,entry_id:e.suggested_entry_id??void 0,object_name:e.suggested_object_name,device_id:e.device_id??void 0,part_id:e.suggested_part_id??void 0,responsible_user_id:this._responsible||void 0,for_minutes:parseInt(this._forMinutes,10)>0?parseInt(this._forMinutes,10):void 0})),a=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/adopt",selections:s});this.dispatchEvent(new CustomEvent("problem-sensors-adopted",{bubbles:!0,composed:!0,detail:a})),this._open=!1}catch(s){this._error=p(s,this._lang)}finally{this._adopting=!1}}}}get _lang(){return u(this.hass)}updated(s){s.has("hass")&&this.hass&&!this._localeReady&&(this._localeReady=!0,v(this._lang).then(()=>this.requestUpdate()))}async open(){this._open=!0,this._loading=!0,this._error="",this._sensors=[],this._selected=new Set,this._responsible="",this._forMinutes="0";try{this._userService?this._userService.updateHass(this.hass):this._userService=new f(this.hass);let[s,a]=await Promise.all([this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/discover"}),this._userService.getUsers().catch(()=>[])]);this._sensors=s.sensors||[],this._selected=new Set(this._sensors.map(e=>e.entity_id)),this._users=a}catch(s){this._error=p(s,this._lang)}finally{this._loading=!1}}_close(){this._open=!1}render(){if(!this._open)return i``;let s=this._lang,a=this._sensors.length>0&&this._selected.size===this._sensors.length;return i`
|
||||
/*! maintenance_supporter frontend 2.88.0 */
|
||||
import{e as f}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-Z4FODB56.js";import{a as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-XRSEIZKJ.js";import{a as o,b as _,c as i,f as l,h,l as g,m as n,q as t,s as u,u as v}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-OXPKT66L.js";var r=class extends h{constructor(){super(...arguments);this._open=!1;this._loading=!1;this._adopting=!1;this._error="";this._sensors=[];this._selected=new Set;this._users=[];this._responsible="";this._forMinutes="0";this._localeReady=!1;this._userService=null;this._toggle=s=>{let a=new Set(this._selected);a.has(s)?a.delete(s):a.add(s),this._selected=a};this._toggleAll=()=>{this._selected.size===this._sensors.length?this._selected=new Set:this._selected=new Set(this._sensors.map(s=>s.entity_id))};this._adopt=async()=>{if(!(this._selected.size===0||this._adopting)){this._adopting=!0,this._error="";try{let s=this._sensors.filter(e=>this._selected.has(e.entity_id)).map(e=>({entity_id:e.entity_id,name:e.name,entry_id:e.suggested_entry_id??void 0,object_name:e.suggested_object_name,device_id:e.device_id??void 0,part_id:e.suggested_part_id??void 0,responsible_user_id:this._responsible||void 0,for_minutes:parseInt(this._forMinutes,10)>0?parseInt(this._forMinutes,10):void 0})),a=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/adopt",selections:s});this.dispatchEvent(new CustomEvent("problem-sensors-adopted",{bubbles:!0,composed:!0,detail:a})),this._open=!1}catch(s){this._error=p(s,this._lang)}finally{this._adopting=!1}}}}get _lang(){return u(this.hass)}updated(s){s.has("hass")&&this.hass&&!this._localeReady&&(this._localeReady=!0,v(this._lang).then(()=>this.requestUpdate()))}async open(){this._open=!0,this._loading=!0,this._error="",this._sensors=[],this._selected=new Set,this._responsible="",this._forMinutes="0";try{this._userService?this._userService.updateHass(this.hass):this._userService=new f(this.hass);let[s,a]=await Promise.all([this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/discover"}),this._userService.getUsers().catch(()=>[])]);this._sensors=s.sensors||[],this._selected=new Set(this._sensors.map(e=>e.entity_id)),this._users=a}catch(s){this._error=p(s,this._lang)}finally{this._loading=!1}}_close(){this._open=!1}render(){if(!this._open)return i``;let s=this._lang,a=this._sensors.length>0&&this._selected.size===this._sensors.length;return i`
|
||||
<div class="overlay" @click=${this._close}>
|
||||
<div class="card" @click=${e=>e.stopPropagation()}>
|
||||
<div class="title">${t("adopt_problem_title",s)}</div>
|
||||
-250
@@ -1,250 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{e as f}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-LXDQIXSO.js";import{a as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-73OGSTHK.js";import{a as o,b as _,c as i,f as l,h,l as g,m as n,q as t,s as u,u as v}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var r=class extends h{constructor(){super(...arguments);this._open=!1;this._loading=!1;this._adopting=!1;this._error="";this._sensors=[];this._selected=new Set;this._users=[];this._responsible="";this._forMinutes="0";this._localeReady=!1;this._userService=null;this._toggle=s=>{let a=new Set(this._selected);a.has(s)?a.delete(s):a.add(s),this._selected=a};this._toggleAll=()=>{this._selected.size===this._sensors.length?this._selected=new Set:this._selected=new Set(this._sensors.map(s=>s.entity_id))};this._adopt=async()=>{if(!(this._selected.size===0||this._adopting)){this._adopting=!0,this._error="";try{let s=this._sensors.filter(e=>this._selected.has(e.entity_id)).map(e=>({entity_id:e.entity_id,name:e.name,entry_id:e.suggested_entry_id??void 0,object_name:e.suggested_object_name,device_id:e.device_id??void 0,part_id:e.suggested_part_id??void 0,responsible_user_id:this._responsible||void 0,for_minutes:parseInt(this._forMinutes,10)>0?parseInt(this._forMinutes,10):void 0})),a=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/adopt",selections:s});this.dispatchEvent(new CustomEvent("problem-sensors-adopted",{bubbles:!0,composed:!0,detail:a})),this._open=!1}catch(s){this._error=p(s,this._lang)}finally{this._adopting=!1}}}}get _lang(){return u(this.hass)}updated(s){s.has("hass")&&this.hass&&!this._localeReady&&(this._localeReady=!0,v(this._lang).then(()=>this.requestUpdate()))}async open(){this._open=!0,this._loading=!0,this._error="",this._sensors=[],this._selected=new Set,this._responsible="",this._forMinutes="0";try{this._userService?this._userService.updateHass(this.hass):this._userService=new f(this.hass);let[s,a]=await Promise.all([this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/discover"}),this._userService.getUsers().catch(()=>[])]);this._sensors=s.sensors||[],this._selected=new Set(this._sensors.map(e=>e.entity_id)),this._users=a}catch(s){this._error=p(s,this._lang)}finally{this._loading=!1}}_close(){this._open=!1}render(){if(!this._open)return i``;let s=this._lang,a=this._sensors.length>0&&this._selected.size===this._sensors.length;return i`
|
||||
<div class="overlay" @click=${this._close}>
|
||||
<div class="card" @click=${e=>e.stopPropagation()}>
|
||||
<div class="title">${t("adopt_problem_title",s)}</div>
|
||||
<div class="hint">${t("adopt_problem_hint",s)}</div>
|
||||
${this._error?i`<div class="error">${this._error}</div>`:l}
|
||||
|
||||
${this._loading?i`<div class="loading">…</div>`:this._sensors.length===0?i`<div class="empty">${t("adopt_problem_none",s)}</div>`:i`
|
||||
<label class="select-all">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${a}
|
||||
@change=${this._toggleAll}
|
||||
/>
|
||||
<span>${t("selected",s)}: ${this._selected.size} / ${this._sensors.length}</span>
|
||||
</label>
|
||||
<div class="list">
|
||||
${this._sensors.map(e=>{let m=this._selected.has(e.entity_id),d=e.state==="on",c=[e.device_name,e.area_name].filter(Boolean).join(" \xB7 ");return i`
|
||||
<label class="row">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${m}
|
||||
@change=${()=>this._toggle(e.entity_id)}
|
||||
/>
|
||||
<div class="row-main">
|
||||
<div class="row-top">
|
||||
<span class="row-name">${e.name}</span>
|
||||
<span class="chip ${d?"chip-active":"chip-ok"}">
|
||||
${d?t("adopt_problem_active",s):t("adopt_problem_ok",s)}
|
||||
</span>
|
||||
</div>
|
||||
${c?i`<div class="row-sub">${c}</div>`:l}
|
||||
<div class="row-target">
|
||||
→ ${e.suggested_object_name}${e.suggested_entry_id?l:i` <span class="new-tag">${t("adopt_problem_new_object",s)}</span>`}
|
||||
</div>
|
||||
${e.suggested_part_name?i`<div class="row-part">
|
||||
<ha-icon icon="mdi:package-variant-closed"></ha-icon>
|
||||
${t("adopt_problem_part",s).replace("{name}",e.suggested_part_name)}
|
||||
</div>`:l}
|
||||
</div>
|
||||
</label>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
${!this._loading&&this._sensors.length>0?i`
|
||||
<label class="responsible">
|
||||
<span>${t("for_at_least_minutes",s)}</span>
|
||||
<input
|
||||
class="for-input"
|
||||
type="number"
|
||||
min="0"
|
||||
max="1440"
|
||||
.value=${this._forMinutes}
|
||||
@input=${e=>this._forMinutes=e.target.value}
|
||||
/>
|
||||
</label>
|
||||
<div class="for-hint">${t("adopt_for_minutes_hint",s)}</div>
|
||||
`:l}
|
||||
|
||||
${!this._loading&&this._sensors.length>0&&this._users.length>0?i`
|
||||
<label class="responsible">
|
||||
<span>${t("adopt_problem_responsible",s)}</span>
|
||||
<select
|
||||
.value=${this._responsible}
|
||||
@change=${e=>{this._responsible=e.target.value}}
|
||||
>
|
||||
<option value="" ?selected=${!this._responsible}>${t("no_user_assigned",s)}</option>
|
||||
${this._users.map(e=>i`<option value=${e.id} ?selected=${e.id===this._responsible}>${e.name}</option>`)}
|
||||
</select>
|
||||
</label>
|
||||
`:l}
|
||||
|
||||
<div class="actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${t("cancel",s)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._adopt}
|
||||
.disabled=${this._selected.size===0||this._adopting}
|
||||
>
|
||||
${t("adopt_problem_adopt",s)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`}};r.styles=_`
|
||||
.overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
.card {
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
min-width: min(360px, calc(100vw - 24px));
|
||||
max-width: 560px;
|
||||
width: 90vw;
|
||||
max-height: 80vh;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.hint {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 13px;
|
||||
}
|
||||
.error {
|
||||
color: var(--error-color, #f44336);
|
||||
font-size: 13px;
|
||||
}
|
||||
.loading,
|
||||
.empty {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 14px;
|
||||
padding: 12px 0;
|
||||
}
|
||||
.select-all {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
.select-all input {
|
||||
cursor: pointer;
|
||||
}
|
||||
.list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
overflow-y: auto;
|
||||
max-height: 50vh;
|
||||
}
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
padding: 8px;
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.row input {
|
||||
margin-top: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.row-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
min-width: 0;
|
||||
flex: 1;
|
||||
}
|
||||
.row-top {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.row-name {
|
||||
font-weight: 500;
|
||||
font-size: 13px;
|
||||
}
|
||||
.row-sub {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-target {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-part {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.row-part ha-icon {
|
||||
--mdc-icon-size: 14px;
|
||||
}
|
||||
.new-tag {
|
||||
font-style: italic;
|
||||
}
|
||||
.chip {
|
||||
font-size: 11px;
|
||||
padding: 1px 8px;
|
||||
border-radius: 10px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.chip-active {
|
||||
background: var(--error-color, #f44336);
|
||||
color: #fff;
|
||||
}
|
||||
.chip-ok {
|
||||
background: var(--divider-color);
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.responsible {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color);
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.for-input {
|
||||
width: 70px;
|
||||
background: var(--card-background-color);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: 4px;
|
||||
padding: 4px 6px;
|
||||
}
|
||||
.for-hint {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
margin: -4px 0 2px;
|
||||
}
|
||||
.responsible select {
|
||||
flex: 1;
|
||||
min-width: 140px;
|
||||
padding: 4px 6px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid var(--divider-color);
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font-size: 13px;
|
||||
}
|
||||
.actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 8px;
|
||||
}
|
||||
`,o([g({attribute:!1})],r.prototype,"hass",2),o([n()],r.prototype,"_open",2),o([n()],r.prototype,"_loading",2),o([n()],r.prototype,"_adopting",2),o([n()],r.prototype,"_error",2),o([n()],r.prototype,"_sensors",2),o([n()],r.prototype,"_selected",2),o([n()],r.prototype,"_users",2),o([n()],r.prototype,"_responsible",2),o([n()],r.prototype,"_forMinutes",2);customElements.get("maintenance-adopt-problem-sensors-dialog")||customElements.define("maintenance-adopt-problem-sensors-dialog",r);export{r as MaintenanceAdoptProblemSensorsDialog};
|
||||
-250
@@ -1,250 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.82.0 */
|
||||
import{e as f}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-B4ELBSAY.js";import{a as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-XCPYIT7M.js";import{a as o,b as _,c as i,f as l,h,l as g,m as n,q as t,s as u,u as v}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-4OPY4VQ5.js";var r=class extends h{constructor(){super(...arguments);this._open=!1;this._loading=!1;this._adopting=!1;this._error="";this._sensors=[];this._selected=new Set;this._users=[];this._responsible="";this._forMinutes="0";this._localeReady=!1;this._userService=null;this._toggle=s=>{let a=new Set(this._selected);a.has(s)?a.delete(s):a.add(s),this._selected=a};this._toggleAll=()=>{this._selected.size===this._sensors.length?this._selected=new Set:this._selected=new Set(this._sensors.map(s=>s.entity_id))};this._adopt=async()=>{if(!(this._selected.size===0||this._adopting)){this._adopting=!0,this._error="";try{let s=this._sensors.filter(e=>this._selected.has(e.entity_id)).map(e=>({entity_id:e.entity_id,name:e.name,entry_id:e.suggested_entry_id??void 0,object_name:e.suggested_object_name,device_id:e.device_id??void 0,part_id:e.suggested_part_id??void 0,responsible_user_id:this._responsible||void 0,for_minutes:parseInt(this._forMinutes,10)>0?parseInt(this._forMinutes,10):void 0})),a=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/adopt",selections:s});this.dispatchEvent(new CustomEvent("problem-sensors-adopted",{bubbles:!0,composed:!0,detail:a})),this._open=!1}catch(s){this._error=p(s,this._lang)}finally{this._adopting=!1}}}}get _lang(){return u(this.hass)}updated(s){s.has("hass")&&this.hass&&!this._localeReady&&(this._localeReady=!0,v(this._lang).then(()=>this.requestUpdate()))}async open(){this._open=!0,this._loading=!0,this._error="",this._sensors=[],this._selected=new Set,this._responsible="",this._forMinutes="0";try{this._userService?this._userService.updateHass(this.hass):this._userService=new f(this.hass);let[s,a]=await Promise.all([this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/discover"}),this._userService.getUsers().catch(()=>[])]);this._sensors=s.sensors||[],this._selected=new Set(this._sensors.map(e=>e.entity_id)),this._users=a}catch(s){this._error=p(s,this._lang)}finally{this._loading=!1}}_close(){this._open=!1}render(){if(!this._open)return i``;let s=this._lang,a=this._sensors.length>0&&this._selected.size===this._sensors.length;return i`
|
||||
<div class="overlay" @click=${this._close}>
|
||||
<div class="card" @click=${e=>e.stopPropagation()}>
|
||||
<div class="title">${t("adopt_problem_title",s)}</div>
|
||||
<div class="hint">${t("adopt_problem_hint",s)}</div>
|
||||
${this._error?i`<div class="error">${this._error}</div>`:l}
|
||||
|
||||
${this._loading?i`<div class="loading">…</div>`:this._sensors.length===0?i`<div class="empty">${t("adopt_problem_none",s)}</div>`:i`
|
||||
<label class="select-all">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${a}
|
||||
@change=${this._toggleAll}
|
||||
/>
|
||||
<span>${t("selected",s)}: ${this._selected.size} / ${this._sensors.length}</span>
|
||||
</label>
|
||||
<div class="list">
|
||||
${this._sensors.map(e=>{let m=this._selected.has(e.entity_id),d=e.state==="on",c=[e.device_name,e.area_name].filter(Boolean).join(" \xB7 ");return i`
|
||||
<label class="row">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${m}
|
||||
@change=${()=>this._toggle(e.entity_id)}
|
||||
/>
|
||||
<div class="row-main">
|
||||
<div class="row-top">
|
||||
<span class="row-name">${e.name}</span>
|
||||
<span class="chip ${d?"chip-active":"chip-ok"}">
|
||||
${d?t("adopt_problem_active",s):t("adopt_problem_ok",s)}
|
||||
</span>
|
||||
</div>
|
||||
${c?i`<div class="row-sub">${c}</div>`:l}
|
||||
<div class="row-target">
|
||||
→ ${e.suggested_object_name}${e.suggested_entry_id?l:i` <span class="new-tag">${t("adopt_problem_new_object",s)}</span>`}
|
||||
</div>
|
||||
${e.suggested_part_name?i`<div class="row-part">
|
||||
<ha-icon icon="mdi:package-variant-closed"></ha-icon>
|
||||
${t("adopt_problem_part",s).replace("{name}",e.suggested_part_name)}
|
||||
</div>`:l}
|
||||
</div>
|
||||
</label>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
${!this._loading&&this._sensors.length>0?i`
|
||||
<label class="responsible">
|
||||
<span>${t("for_at_least_minutes",s)}</span>
|
||||
<input
|
||||
class="for-input"
|
||||
type="number"
|
||||
min="0"
|
||||
max="1440"
|
||||
.value=${this._forMinutes}
|
||||
@input=${e=>this._forMinutes=e.target.value}
|
||||
/>
|
||||
</label>
|
||||
<div class="for-hint">${t("adopt_for_minutes_hint",s)}</div>
|
||||
`:l}
|
||||
|
||||
${!this._loading&&this._sensors.length>0&&this._users.length>0?i`
|
||||
<label class="responsible">
|
||||
<span>${t("adopt_problem_responsible",s)}</span>
|
||||
<select
|
||||
.value=${this._responsible}
|
||||
@change=${e=>{this._responsible=e.target.value}}
|
||||
>
|
||||
<option value="" ?selected=${!this._responsible}>${t("no_user_assigned",s)}</option>
|
||||
${this._users.map(e=>i`<option value=${e.id} ?selected=${e.id===this._responsible}>${e.name}</option>`)}
|
||||
</select>
|
||||
</label>
|
||||
`:l}
|
||||
|
||||
<div class="actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${t("cancel",s)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._adopt}
|
||||
.disabled=${this._selected.size===0||this._adopting}
|
||||
>
|
||||
${t("adopt_problem_adopt",s)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`}};r.styles=_`
|
||||
.overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
.card {
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
min-width: min(360px, calc(100vw - 24px));
|
||||
max-width: 560px;
|
||||
width: 90vw;
|
||||
max-height: 80vh;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.hint {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 13px;
|
||||
}
|
||||
.error {
|
||||
color: var(--error-color, #f44336);
|
||||
font-size: 13px;
|
||||
}
|
||||
.loading,
|
||||
.empty {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 14px;
|
||||
padding: 12px 0;
|
||||
}
|
||||
.select-all {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
.select-all input {
|
||||
cursor: pointer;
|
||||
}
|
||||
.list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
overflow-y: auto;
|
||||
max-height: 50vh;
|
||||
}
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
padding: 8px;
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.row input {
|
||||
margin-top: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.row-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
min-width: 0;
|
||||
flex: 1;
|
||||
}
|
||||
.row-top {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.row-name {
|
||||
font-weight: 500;
|
||||
font-size: 13px;
|
||||
}
|
||||
.row-sub {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-target {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-part {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.row-part ha-icon {
|
||||
--mdc-icon-size: 14px;
|
||||
}
|
||||
.new-tag {
|
||||
font-style: italic;
|
||||
}
|
||||
.chip {
|
||||
font-size: 11px;
|
||||
padding: 1px 8px;
|
||||
border-radius: 10px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.chip-active {
|
||||
background: var(--error-color, #f44336);
|
||||
color: #fff;
|
||||
}
|
||||
.chip-ok {
|
||||
background: var(--divider-color);
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.responsible {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color);
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.for-input {
|
||||
width: 70px;
|
||||
background: var(--card-background-color);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: 4px;
|
||||
padding: 4px 6px;
|
||||
}
|
||||
.for-hint {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
margin: -4px 0 2px;
|
||||
}
|
||||
.responsible select {
|
||||
flex: 1;
|
||||
min-width: 140px;
|
||||
padding: 4px 6px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid var(--divider-color);
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font-size: 13px;
|
||||
}
|
||||
.actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 8px;
|
||||
}
|
||||
`,o([g({attribute:!1})],r.prototype,"hass",2),o([n()],r.prototype,"_open",2),o([n()],r.prototype,"_loading",2),o([n()],r.prototype,"_adopting",2),o([n()],r.prototype,"_error",2),o([n()],r.prototype,"_sensors",2),o([n()],r.prototype,"_selected",2),o([n()],r.prototype,"_users",2),o([n()],r.prototype,"_responsible",2),o([n()],r.prototype,"_forMinutes",2);customElements.get("maintenance-adopt-problem-sensors-dialog")||customElements.define("maintenance-adopt-problem-sensors-dialog",r);export{r as MaintenanceAdoptProblemSensorsDialog};
|
||||
-250
@@ -1,250 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.87.0 */
|
||||
import{e as f}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-KRAXVQN3.js";import{a as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-6FKJJO4T.js";import{a as o,b as _,c as i,f as l,h,l as g,m as n,q as t,s as u,u as v}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-BFRW5MGC.js";var r=class extends h{constructor(){super(...arguments);this._open=!1;this._loading=!1;this._adopting=!1;this._error="";this._sensors=[];this._selected=new Set;this._users=[];this._responsible="";this._forMinutes="0";this._localeReady=!1;this._userService=null;this._toggle=s=>{let a=new Set(this._selected);a.has(s)?a.delete(s):a.add(s),this._selected=a};this._toggleAll=()=>{this._selected.size===this._sensors.length?this._selected=new Set:this._selected=new Set(this._sensors.map(s=>s.entity_id))};this._adopt=async()=>{if(!(this._selected.size===0||this._adopting)){this._adopting=!0,this._error="";try{let s=this._sensors.filter(e=>this._selected.has(e.entity_id)).map(e=>({entity_id:e.entity_id,name:e.name,entry_id:e.suggested_entry_id??void 0,object_name:e.suggested_object_name,device_id:e.device_id??void 0,part_id:e.suggested_part_id??void 0,responsible_user_id:this._responsible||void 0,for_minutes:parseInt(this._forMinutes,10)>0?parseInt(this._forMinutes,10):void 0})),a=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/adopt",selections:s});this.dispatchEvent(new CustomEvent("problem-sensors-adopted",{bubbles:!0,composed:!0,detail:a})),this._open=!1}catch(s){this._error=p(s,this._lang)}finally{this._adopting=!1}}}}get _lang(){return u(this.hass)}updated(s){s.has("hass")&&this.hass&&!this._localeReady&&(this._localeReady=!0,v(this._lang).then(()=>this.requestUpdate()))}async open(){this._open=!0,this._loading=!0,this._error="",this._sensors=[],this._selected=new Set,this._responsible="",this._forMinutes="0";try{this._userService?this._userService.updateHass(this.hass):this._userService=new f(this.hass);let[s,a]=await Promise.all([this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/discover"}),this._userService.getUsers().catch(()=>[])]);this._sensors=s.sensors||[],this._selected=new Set(this._sensors.map(e=>e.entity_id)),this._users=a}catch(s){this._error=p(s,this._lang)}finally{this._loading=!1}}_close(){this._open=!1}render(){if(!this._open)return i``;let s=this._lang,a=this._sensors.length>0&&this._selected.size===this._sensors.length;return i`
|
||||
<div class="overlay" @click=${this._close}>
|
||||
<div class="card" @click=${e=>e.stopPropagation()}>
|
||||
<div class="title">${t("adopt_problem_title",s)}</div>
|
||||
<div class="hint">${t("adopt_problem_hint",s)}</div>
|
||||
${this._error?i`<div class="error">${this._error}</div>`:l}
|
||||
|
||||
${this._loading?i`<div class="loading">…</div>`:this._sensors.length===0?i`<div class="empty">${t("adopt_problem_none",s)}</div>`:i`
|
||||
<label class="select-all">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${a}
|
||||
@change=${this._toggleAll}
|
||||
/>
|
||||
<span>${t("selected",s)}: ${this._selected.size} / ${this._sensors.length}</span>
|
||||
</label>
|
||||
<div class="list">
|
||||
${this._sensors.map(e=>{let m=this._selected.has(e.entity_id),d=e.state==="on",c=[e.device_name,e.area_name].filter(Boolean).join(" \xB7 ");return i`
|
||||
<label class="row">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${m}
|
||||
@change=${()=>this._toggle(e.entity_id)}
|
||||
/>
|
||||
<div class="row-main">
|
||||
<div class="row-top">
|
||||
<span class="row-name">${e.name}</span>
|
||||
<span class="chip ${d?"chip-active":"chip-ok"}">
|
||||
${d?t("adopt_problem_active",s):t("adopt_problem_ok",s)}
|
||||
</span>
|
||||
</div>
|
||||
${c?i`<div class="row-sub">${c}</div>`:l}
|
||||
<div class="row-target">
|
||||
→ ${e.suggested_object_name}${e.suggested_entry_id?l:i` <span class="new-tag">${t("adopt_problem_new_object",s)}</span>`}
|
||||
</div>
|
||||
${e.suggested_part_name?i`<div class="row-part">
|
||||
<ha-icon icon="mdi:package-variant-closed"></ha-icon>
|
||||
${t("adopt_problem_part",s).replace("{name}",e.suggested_part_name)}
|
||||
</div>`:l}
|
||||
</div>
|
||||
</label>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
${!this._loading&&this._sensors.length>0?i`
|
||||
<label class="responsible">
|
||||
<span>${t("for_at_least_minutes",s)}</span>
|
||||
<input
|
||||
class="for-input"
|
||||
type="number"
|
||||
min="0"
|
||||
max="1440"
|
||||
.value=${this._forMinutes}
|
||||
@input=${e=>this._forMinutes=e.target.value}
|
||||
/>
|
||||
</label>
|
||||
<div class="for-hint">${t("adopt_for_minutes_hint",s)}</div>
|
||||
`:l}
|
||||
|
||||
${!this._loading&&this._sensors.length>0&&this._users.length>0?i`
|
||||
<label class="responsible">
|
||||
<span>${t("adopt_problem_responsible",s)}</span>
|
||||
<select
|
||||
.value=${this._responsible}
|
||||
@change=${e=>{this._responsible=e.target.value}}
|
||||
>
|
||||
<option value="" ?selected=${!this._responsible}>${t("no_user_assigned",s)}</option>
|
||||
${this._users.map(e=>i`<option value=${e.id} ?selected=${e.id===this._responsible}>${e.name}</option>`)}
|
||||
</select>
|
||||
</label>
|
||||
`:l}
|
||||
|
||||
<div class="actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${t("cancel",s)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._adopt}
|
||||
.disabled=${this._selected.size===0||this._adopting}
|
||||
>
|
||||
${t("adopt_problem_adopt",s)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`}};r.styles=_`
|
||||
.overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
.card {
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
min-width: min(360px, calc(100vw - 24px));
|
||||
max-width: 560px;
|
||||
width: 90vw;
|
||||
max-height: 80vh;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.hint {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 13px;
|
||||
}
|
||||
.error {
|
||||
color: var(--error-color, #f44336);
|
||||
font-size: 13px;
|
||||
}
|
||||
.loading,
|
||||
.empty {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 14px;
|
||||
padding: 12px 0;
|
||||
}
|
||||
.select-all {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
.select-all input {
|
||||
cursor: pointer;
|
||||
}
|
||||
.list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
overflow-y: auto;
|
||||
max-height: 50vh;
|
||||
}
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
padding: 8px;
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.row input {
|
||||
margin-top: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.row-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
min-width: 0;
|
||||
flex: 1;
|
||||
}
|
||||
.row-top {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.row-name {
|
||||
font-weight: 500;
|
||||
font-size: 13px;
|
||||
}
|
||||
.row-sub {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-target {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-part {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.row-part ha-icon {
|
||||
--mdc-icon-size: 14px;
|
||||
}
|
||||
.new-tag {
|
||||
font-style: italic;
|
||||
}
|
||||
.chip {
|
||||
font-size: 11px;
|
||||
padding: 1px 8px;
|
||||
border-radius: 10px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.chip-active {
|
||||
background: var(--error-color, #f44336);
|
||||
color: #fff;
|
||||
}
|
||||
.chip-ok {
|
||||
background: var(--divider-color);
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.responsible {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color);
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.for-input {
|
||||
width: 70px;
|
||||
background: var(--card-background-color);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: 4px;
|
||||
padding: 4px 6px;
|
||||
}
|
||||
.for-hint {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
margin: -4px 0 2px;
|
||||
}
|
||||
.responsible select {
|
||||
flex: 1;
|
||||
min-width: 140px;
|
||||
padding: 4px 6px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid var(--divider-color);
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font-size: 13px;
|
||||
}
|
||||
.actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 8px;
|
||||
}
|
||||
`,o([g({attribute:!1})],r.prototype,"hass",2),o([n()],r.prototype,"_open",2),o([n()],r.prototype,"_loading",2),o([n()],r.prototype,"_adopting",2),o([n()],r.prototype,"_error",2),o([n()],r.prototype,"_sensors",2),o([n()],r.prototype,"_selected",2),o([n()],r.prototype,"_users",2),o([n()],r.prototype,"_responsible",2),o([n()],r.prototype,"_forMinutes",2);customElements.get("maintenance-adopt-problem-sensors-dialog")||customElements.define("maintenance-adopt-problem-sensors-dialog",r);export{r as MaintenanceAdoptProblemSensorsDialog};
|
||||
@@ -1,88 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a,b as y,c as s,f as l,h as g,l as o,m as f,q as d,z as m}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";function $(n){let t=m("2001-02-03",n).match(/\d+/g)||[],e=v=>t.findIndex(_=>Number(_)===v),h=e(2001),c=e(2),u=e(3);return h===0?"YMD":c>=0&&u>=0&&c<u?"MDY":"DMY"}function p(n,i,t){if(n<1e3||n>9999||i<1||i>12||t<1||t>31)return null;let e=new Date(n,i-1,t);return e.getFullYear()!==n||e.getMonth()!==i-1||e.getDate()!==t?null:`${n}-${String(i).padStart(2,"0")}-${String(t).padStart(2,"0")}`}function b(n,i){let t=n.trim(),e;if(e=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/))return p(+e[1],+e[2],+e[3]);if(e=t.match(/^(\d{4})$/))return p(+e[1],1,1);if(e=t.match(/^(\d{1,2})[./](\d{4})$/))return p(+e[2],+e[1],1);if(e=t.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/))return p(+e[3],+e[2],+e[1]);if(e=t.match(/^(\d{1,2})[/-](\d{1,2})[/-](\d{4})$/)){let h=+e[1],c=+e[2],u=+e[3];return $(i)==="MDY"?p(u,h,c):p(u,c,h)}return null}function x(n,i){if(i)switch(n){case"date":return i.split("T")[0];case"time":return i.length===5?`${i}:00`:i;case"datetime":{let[t,e="00:00:00"]=i.split("T");return`${t} ${e.length===5?`${e}:00`:e}`}}}function k(n,i){if(typeof i!="string"||!i)return"";switch(n){case"date":return i.slice(0,10);case"time":return i.slice(0,5);case"datetime":{let[t,e="00:00:00"]=i.split(" ");return`${t}T${e.length===5?`${e}:00`:e}`}}}var r=class extends g{constructor(){super(...arguments);this.kind="date";this.label="";this.value="";this.clearable=!1;this.disabled=!1;this.required=!1;this.lang="en";this._typing=!1;this._typed="";this._typedInvalid=!1}_startTyping(){this._typed=this.value,this._typedInvalid=!1,this._typing=!0,this.updateComplete.then(()=>this.shadowRoot?.querySelector("input.typed")?.focus())}_commitTyped(){if(!this._typed.trim()){this._typing=!1;return}let t=b(this._typed,this.lang);if(!t){this._typedInvalid=!0;return}this._typing=!1,this._typedInvalid=!1,this._emit(t)}_onTypedKey(t){t.key==="Enter"?(t.preventDefault(),this._commitTyped()):t.key==="Escape"&&(t.preventDefault(),this._typing=!1,this._typedInvalid=!1)}_selector(){switch(this.kind){case"date":return{date:{}};case"time":return{time:{no_second:!0}};case"datetime":return{datetime:{}}}}_onSelectorChange(t){t.stopPropagation(),this._emit(k(this.kind,t.detail?.value))}_clear(){this._emit("")}_emit(t){t!==this.value&&(this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{bubbles:!0,composed:!0,detail:{value:t}})))}render(){return s`
|
||||
<div class="field">
|
||||
${this.label?s`<span class="label">${this.label}${this.required?s`<span class="req">*</span>`:l}</span>`:l}
|
||||
<div class="row">
|
||||
${this._typing?s`<input class="typed" type="text" inputmode="numeric" autocomplete="off"
|
||||
.value=${this._typed}
|
||||
placeholder=${m("1978-03-15",this.lang)}
|
||||
aria-invalid=${this._typedInvalid?"true":"false"}
|
||||
@input=${t=>{this._typed=t.target.value,this._typedInvalid=!1}}
|
||||
@keydown=${this._onTypedKey}
|
||||
@blur=${this._commitTyped} />`:s`<ha-selector
|
||||
.hass=${this.hass}
|
||||
.selector=${this._selector()}
|
||||
.value=${x(this.kind,this.value)}
|
||||
.required=${this.required}
|
||||
.disabled=${this.disabled}
|
||||
@value-changed=${this._onSelectorChange}
|
||||
></ha-selector>`}
|
||||
${this.kind==="date"&&!this.disabled&&!this._typing?s`<button type="button" class="type-toggle" title=${d("date_type_toggle",this.lang)} aria-label=${d("date_type_toggle",this.lang)} @click=${this._startTyping}>
|
||||
<ha-icon icon="mdi:keyboard-outline"></ha-icon>
|
||||
</button>`:l}
|
||||
${this.clearable&&this.value&&!this.disabled&&!this._typing?s`<button type="button" class="clear" title=${d("clear",this.lang)} aria-label=${d("clear",this.lang)} @click=${this._clear}>
|
||||
<ha-icon icon="mdi:close"></ha-icon>
|
||||
</button>`:l}
|
||||
</div>
|
||||
${this._typedInvalid?s`<span class="helper invalid">${d("date_type_invalid",this.lang)}</span>`:this.helper?s`<span class="helper">${this.helper}</span>`:l}
|
||||
</div>
|
||||
`}};r.styles=y`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
ha-selector {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
.clear, .type-toggle {
|
||||
flex: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
padding: 0;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
--mdc-icon-size: 20px;
|
||||
}
|
||||
.clear:hover, .type-toggle:hover { background: rgba(var(--rgb-primary-text-color, 0, 0, 0), 0.08); }
|
||||
.clear:focus-visible, .type-toggle:focus-visible { outline: 2px solid var(--primary-color); }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
.helper.invalid { color: var(--error-color, #f44336); font-style: normal; }
|
||||
input.typed {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
height: 40px;
|
||||
box-sizing: border-box;
|
||||
padding: 0 12px;
|
||||
border: 1px solid var(--divider-color, #ccc);
|
||||
border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font: inherit;
|
||||
}
|
||||
input.typed[aria-invalid="true"] { border-color: var(--error-color, #f44336); }
|
||||
input.typed:focus { outline: 2px solid var(--primary-color); outline-offset: -1px; }
|
||||
`,a([o({attribute:!1})],r.prototype,"hass",2),a([o()],r.prototype,"kind",2),a([o()],r.prototype,"label",2),a([o()],r.prototype,"value",2),a([o()],r.prototype,"helper",2),a([o({type:Boolean})],r.prototype,"clearable",2),a([o({type:Boolean})],r.prototype,"disabled",2),a([o({type:Boolean})],r.prototype,"required",2),a([o()],r.prototype,"lang",2),a([f()],r.prototype,"_typing",2),a([f()],r.prototype,"_typed",2),a([f()],r.prototype,"_typedInvalid",2);customElements.get("ms-date-field")||customElements.define("ms-date-field",r);
|
||||
+1
-1
@@ -1,2 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
/*! maintenance_supporter frontend 2.88.0 */
|
||||
function c(o,t,e){let l=new Blob([o],{type:e}),d=URL.createObjectURL(l),n=document.createElement("a");n.href=d,n.download=t,n.target="_blank",n.rel="noopener",n.style.display="none",document.body.appendChild(n),n.dispatchEvent(new MouseEvent("click")),document.body.removeChild(n),setTimeout(()=>URL.revokeObjectURL(d),6e4)}function r(o,t){let e=document.createElement("a");e.href=o,e.download=t,e.target="_blank",e.rel="noopener",e.style.display="none",document.body.appendChild(e),e.dispatchEvent(new MouseEvent("click")),document.body.removeChild(e)}export{c as a,r as b};
|
||||
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
@@ -1,2 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{q as a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var s={entry_id:"object",name:"name",task_type:"maintenance_type",schedule_type:"schedule_type",interval_days:"interval_days",interval_anchor:"interval_anchor",warning_days:"warning_days",last_performed:"last_performed_optional",notes:"notes_optional",documentation_url:"documentation_url_optional",custom_icon:"custom_icon_optional",nfc_tag_id:"nfc_tag_id_optional",responsible_user_id:"responsible_user",entity_slug:"entity_slug",entity_id:"entity_id",area_id:"area_id_optional",manufacturer:"manufacturer_optional",model:"model_optional",serial_number:"serial_number_optional",installation_date:"installation_date_optional",warranty_expiry:"warranty_expiry_optional",checklist:"checklist_steps_optional",reason:"reason",feedback:"feedback",cost:"cost",duration:"duration",description:"description_optional",group_name:"name",group_description:"description_optional",environmental_entity:"environmental_entity_optional",environmental_attribute:"environmental_attribute_optional",trigger_above:"trigger_above",trigger_below:"trigger_below",trigger_equals:"trigger_equals",trigger_not_equals:"trigger_not_equals",trigger_for_minutes:"trigger_for_minutes"};function c(e,o){let r=s[e];if(!r)return e;let t=a(r,o);return t&&t!==r?t:e}function d(e){let r=e.match(/data\['([^']+)'\]/)?.[1],t;return(t=e.match(/length of value must be at most (\d+)/))?{field:r,rule:"too_long",param:t[1]}:(t=e.match(/length of value must be at least (\d+)/))?{field:r,rule:"too_short",param:t[1]}:(t=e.match(/value must be at most (\S+)/))?{field:r,rule:"value_too_high",param:t[1]}:(t=e.match(/value must be at least (\S+)/))?{field:r,rule:"value_too_low",param:t[1]}:/required key not provided/.test(e)?{field:r,rule:"required"}:(t=e.match(/expected (\w+)/))?{field:r,rule:"wrong_type",param:t[1]}:/value must be one of/.test(e)?{field:r,rule:"invalid_choice"}:/not a valid value/.test(e)?{field:r,rule:"invalid_value"}:{field:r,rule:"unknown"}}function g(e,o,r){if(r=r??a("action_error",o),typeof e=="string")return e;if(typeof e!="object"||e===null)return r;let t=e,_=t.message||t.error?.message||"";if(!_)return r;let i=d(_),l=i.field?c(i.field,o):"",n=u=>a(u,o).replace("{field}",l).replace("{n}",i.param??"");switch(i.rule){case"too_long":return n("err_too_long");case"too_short":return n("err_too_short");case"value_too_high":return n("err_value_too_high");case"value_too_low":return n("err_value_too_low");case"required":return n("err_required");case"wrong_type":return n("err_wrong_type").replace("{type}",i.param??"");case"invalid_choice":return n("err_invalid_choice");case"invalid_value":return n("err_invalid_value");default:return _||r}}export{g as a};
|
||||
@@ -1,79 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as r,b as l,c as i,f as o,h as n,l as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var e=class extends n{constructor(){super(...arguments);this.label="";this.value="";this.placeholder="";this.type="text";this.required=!1;this.disabled=!1;this.multiline=!1;this.rows=3}_onInput(s){let a=s.target.value;this.value=a,this.dispatchEvent(new CustomEvent("input",{bubbles:!0,composed:!0,detail:{value:a}}))}render(){return i`
|
||||
<label class="field">
|
||||
${this.label?i`<span class="label">${this.label}${this.required?i`<span class="req">*</span>`:o}</span>`:o}
|
||||
${this.multiline?i`
|
||||
<textarea
|
||||
.value=${this.value??""}
|
||||
rows=${this.rows}
|
||||
?required=${this.required}
|
||||
?disabled=${this.disabled}
|
||||
placeholder=${this.placeholder}
|
||||
@input=${this._onInput}
|
||||
@change=${this._onInput}
|
||||
></textarea>`:i`
|
||||
<input
|
||||
.value=${this.value??""}
|
||||
.type=${this.type}
|
||||
?required=${this.required}
|
||||
?disabled=${this.disabled}
|
||||
placeholder=${this.placeholder}
|
||||
step=${this.step??o}
|
||||
min=${this.min??o}
|
||||
max=${this.max??o}
|
||||
pattern=${this.pattern??o}
|
||||
@input=${this._onInput}
|
||||
@change=${this._onInput}
|
||||
/>`}
|
||||
${this.helper?i`<span class="helper">${this.helper}</span>`:o}
|
||||
</label>
|
||||
`}};e.styles=l`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
input {
|
||||
padding: 8px 10px;
|
||||
font-size: 14px;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color, rgba(255,255,255,0.12));
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
outline: none;
|
||||
}
|
||||
input:focus {
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
input:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
textarea {
|
||||
padding: 8px 10px;
|
||||
font-size: 14px;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color, rgba(255,255,255,0.12));
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
outline: none;
|
||||
resize: vertical;
|
||||
}
|
||||
textarea:focus { border-color: var(--primary-color); }
|
||||
textarea:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
`,r([t()],e.prototype,"label",2),r([t()],e.prototype,"value",2),r([t()],e.prototype,"placeholder",2),r([t()],e.prototype,"type",2),r([t({type:Boolean})],e.prototype,"required",2),r([t({type:Boolean})],e.prototype,"disabled",2),r([t()],e.prototype,"step",2),r([t()],e.prototype,"min",2),r([t()],e.prototype,"max",2),r([t()],e.prototype,"pattern",2),r([t()],e.prototype,"helper",2),r([t({type:Boolean})],e.prototype,"multiline",2),r([t({type:Number})],e.prototype,"rows",2);customElements.get("ms-textfield")||customElements.define("ms-textfield",e);
|
||||
@@ -1,153 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as u}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-FE4LECIX.js";import{a as r,b as _,c as l,f as o,h,l as d,m as s,q as i,s as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";var a=class extends h{constructor(){super(...arguments);this.objects=[];this._open=!1;this._loading=!1;this._error="";this._name="";this._manufacturer="";this._model="";this._serialNumber="";this._areaId="";this._installationDate="";this._warrantyExpiry="";this._documentationUrl="";this._notes="";this._haDeviceId="";this._parentEntryId="";this._entryId=null}get _lang(){return p(this.hass)}openCreate(){this._entryId=null,this._name="",this._manufacturer="",this._model="",this._serialNumber="",this._areaId="",this._installationDate="",this._warrantyExpiry="",this._documentationUrl="",this._notes="",this._haDeviceId="",this._parentEntryId="",this._error="",this._open=!0}openEdit(e,n){this._entryId=e,this._name=n.name||"",this._manufacturer=n.manufacturer||"",this._model=n.model||"",this._serialNumber=n.serial_number||"",this._areaId=n.area_id||"",this._installationDate=n.installation_date||"",this._warrantyExpiry=n.warranty_expiry||"",this._documentationUrl=n.documentation_url||"",this._notes=n.notes||"",this._haDeviceId=n.ha_device_id||"",this._parentEntryId=n.parent_entry_id||"",this._error="",this._open=!0}async _save(){if(!this._loading&&this._name.trim()){this._loading=!0,this._error="";try{this._entryId?await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/update",entry_id:this._entryId,name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}):await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/create",name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}),this._open=!1,this.dispatchEvent(new CustomEvent("object-saved"))}catch(e){this._error=u(e,this._lang,i("save_error",this._lang))}finally{this._loading=!1}}}_parentChoices(){return(this.objects||[]).filter(e=>e.entry_id!==this._entryId)}_close(){this._open=!1}render(){if(!this._open)return l``;let e=this._lang,n=this._entryId?i("edit_object",e):i("new_object",e);return l`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${n}</div>
|
||||
<div class="content">
|
||||
${this._error?l`<div class="error">${this._error}</div>`:o}
|
||||
<ms-textfield
|
||||
label="${i("name",e)}"
|
||||
required
|
||||
.value=${this._name}
|
||||
@input=${t=>this._name=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("manufacturer_optional",e)}"
|
||||
.value=${this._manufacturer}
|
||||
@input=${t=>this._manufacturer=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("model_optional",e)}"
|
||||
.value=${this._model}
|
||||
@input=${t=>this._model=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("serial_number_optional",e)}"
|
||||
.value=${this._serialNumber}
|
||||
@input=${t=>this._serialNumber=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("documentation_url_optional",e)}"
|
||||
type="url"
|
||||
.value=${this._documentationUrl}
|
||||
@input=${t=>this._documentationUrl=t.target.value}
|
||||
></ms-textfield>
|
||||
<ha-area-picker
|
||||
.hass=${this.hass}
|
||||
label="${i("area_id_optional",e)}"
|
||||
.value=${this._areaId}
|
||||
@value-changed=${t=>this._areaId=t.detail.value||""}
|
||||
></ha-area-picker>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${e}
|
||||
label="${i("installation_date_optional",e)}"
|
||||
.value=${this._installationDate}
|
||||
@value-changed=${t=>this._installationDate=t.detail.value}
|
||||
></ms-date-field>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${e}
|
||||
label="${i("warranty_expiry_optional",e)}"
|
||||
.value=${this._warrantyExpiry}
|
||||
@value-changed=${t=>this._warrantyExpiry=t.detail.value}
|
||||
></ms-date-field>
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${{device:this._haDeviceId||void 0}}
|
||||
.schema=${[{name:"device",selector:{device:{}}}]}
|
||||
.computeLabel=${()=>i("link_device_optional",e)}
|
||||
@value-changed=${t=>this._haDeviceId=t.detail.value?.device||""}
|
||||
></ha-form>
|
||||
${this._parentChoices().length?l`<label class="textarea-field">
|
||||
<span class="textarea-label">${i("parent_object_optional",e)}</span>
|
||||
<select
|
||||
class="parent-select"
|
||||
.value=${this._parentEntryId}
|
||||
@change=${t=>this._parentEntryId=t.target.value}
|
||||
>
|
||||
<option value="" ?selected=${!this._parentEntryId}>
|
||||
${i("parent_none",e)}
|
||||
</option>
|
||||
${this._parentChoices().map(t=>l`<option
|
||||
value=${t.entry_id}
|
||||
?selected=${this._parentEntryId===t.entry_id}
|
||||
>${t.object.name}</option>`)}
|
||||
</select>
|
||||
</label>`:o}
|
||||
<label class="textarea-field">
|
||||
<span class="textarea-label">${i("object_notes_optional",e)}</span>
|
||||
<textarea
|
||||
rows="3"
|
||||
.value=${this._notes}
|
||||
@input=${t=>this._notes=t.target.value}
|
||||
></textarea>
|
||||
<span class="md-hint">${i("notes_markdown_hint",e)}</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${i("cancel",this._lang)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._save}
|
||||
.disabled=${this._loading||!this._name.trim()}
|
||||
>
|
||||
${this._loading?i("saving",this._lang):i("save",this._lang)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</ha-dialog>
|
||||
`}};a.styles=_`
|
||||
.dialog-title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
min-width: 300px;
|
||||
}
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 16px;
|
||||
}
|
||||
ms-textfield {
|
||||
display: block;
|
||||
}
|
||||
.textarea-field {
|
||||
display: flex; flex-direction: column; gap: 4px;
|
||||
}
|
||||
.textarea-label {
|
||||
font-size: 12px; color: var(--secondary-text-color, #888); font-weight: 500;
|
||||
}
|
||||
.textarea-field textarea {
|
||||
padding: 8px 10px; font-size: 14px; font-family: inherit;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
resize: vertical;
|
||||
}
|
||||
.textarea-field textarea:focus {
|
||||
outline: none; border-color: var(--primary-color);
|
||||
}
|
||||
.md-hint {
|
||||
font-size: 11px; color: var(--secondary-text-color); font-style: italic;
|
||||
}
|
||||
.parent-select {
|
||||
padding: 8px 10px; font-size: 14px; font-family: inherit;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
}
|
||||
.error {
|
||||
color: var(--error-color, #f44336);
|
||||
font-size: 13px;
|
||||
}
|
||||
`,r([d({attribute:!1})],a.prototype,"hass",2),r([d({attribute:!1})],a.prototype,"objects",2),r([s()],a.prototype,"_open",2),r([s()],a.prototype,"_loading",2),r([s()],a.prototype,"_error",2),r([s()],a.prototype,"_name",2),r([s()],a.prototype,"_manufacturer",2),r([s()],a.prototype,"_model",2),r([s()],a.prototype,"_serialNumber",2),r([s()],a.prototype,"_areaId",2),r([s()],a.prototype,"_installationDate",2),r([s()],a.prototype,"_warrantyExpiry",2),r([s()],a.prototype,"_documentationUrl",2),r([s()],a.prototype,"_notes",2),r([s()],a.prototype,"_haDeviceId",2),r([s()],a.prototype,"_parentEntryId",2),r([s()],a.prototype,"_entryId",2);customElements.get("maintenance-object-dialog")||customElements.define("maintenance-object-dialog",a);export{a};
|
||||
@@ -1,79 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.87.0 */
|
||||
import{a as r,b as l,c as i,f as o,h as n,l as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-BFRW5MGC.js";var e=class extends n{constructor(){super(...arguments);this.label="";this.value="";this.placeholder="";this.type="text";this.required=!1;this.disabled=!1;this.multiline=!1;this.rows=3}_onInput(s){let a=s.target.value;this.value=a,this.dispatchEvent(new CustomEvent("input",{bubbles:!0,composed:!0,detail:{value:a}}))}render(){return i`
|
||||
<label class="field">
|
||||
${this.label?i`<span class="label">${this.label}${this.required?i`<span class="req">*</span>`:o}</span>`:o}
|
||||
${this.multiline?i`
|
||||
<textarea
|
||||
.value=${this.value??""}
|
||||
rows=${this.rows}
|
||||
?required=${this.required}
|
||||
?disabled=${this.disabled}
|
||||
placeholder=${this.placeholder}
|
||||
@input=${this._onInput}
|
||||
@change=${this._onInput}
|
||||
></textarea>`:i`
|
||||
<input
|
||||
.value=${this.value??""}
|
||||
.type=${this.type}
|
||||
?required=${this.required}
|
||||
?disabled=${this.disabled}
|
||||
placeholder=${this.placeholder}
|
||||
step=${this.step??o}
|
||||
min=${this.min??o}
|
||||
max=${this.max??o}
|
||||
pattern=${this.pattern??o}
|
||||
@input=${this._onInput}
|
||||
@change=${this._onInput}
|
||||
/>`}
|
||||
${this.helper?i`<span class="helper">${this.helper}</span>`:o}
|
||||
</label>
|
||||
`}};e.styles=l`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
input {
|
||||
padding: 8px 10px;
|
||||
font-size: 14px;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color, rgba(255,255,255,0.12));
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
outline: none;
|
||||
}
|
||||
input:focus {
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
input:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
textarea {
|
||||
padding: 8px 10px;
|
||||
font-size: 14px;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color, rgba(255,255,255,0.12));
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
outline: none;
|
||||
resize: vertical;
|
||||
}
|
||||
textarea:focus { border-color: var(--primary-color); }
|
||||
textarea:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
`,r([t()],e.prototype,"label",2),r([t()],e.prototype,"value",2),r([t()],e.prototype,"placeholder",2),r([t()],e.prototype,"type",2),r([t({type:Boolean})],e.prototype,"required",2),r([t({type:Boolean})],e.prototype,"disabled",2),r([t()],e.prototype,"step",2),r([t()],e.prototype,"min",2),r([t()],e.prototype,"max",2),r([t()],e.prototype,"pattern",2),r([t()],e.prototype,"helper",2),r([t({type:Boolean})],e.prototype,"multiline",2),r([t({type:Number})],e.prototype,"rows",2);customElements.get("ms-textfield")||customElements.define("ms-textfield",e);
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as r,b as l,c as i,f as o,h as n,l as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";var e=class extends n{constructor(){super(...arguments);this.label="";this.value="";this.placeholder="";this.type="text";this.required=!1;this.disabled=!1;this.multiline=!1;this.rows=3}_onInput(s){let a=s.target.value;this.value=a,this.dispatchEvent(new CustomEvent("input",{bubbles:!0,composed:!0,detail:{value:a}}))}render(){return i`
|
||||
/*! maintenance_supporter frontend 2.88.0 */
|
||||
import{a as r,b as l,c as i,f as o,h as n,l as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-OXPKT66L.js";var e=class extends n{constructor(){super(...arguments);this.label="";this.value="";this.placeholder="";this.type="text";this.required=!1;this.disabled=!1;this.multiline=!1;this.rows=3}_onInput(s){let a=s.target.value;this.value=a,this.dispatchEvent(new CustomEvent("input",{bubbles:!0,composed:!0,detail:{value:a}}))}render(){return i`
|
||||
<label class="field">
|
||||
${this.label?i`<span class="label">${this.label}${this.required?i`<span class="req">*</span>`:o}</span>`:o}
|
||||
${this.multiline?i`
|
||||
@@ -1,88 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{A as m,a,b as y,c as s,f as l,h as g,l as o,m as f,q as d}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";function $(n){let t=m("2001-02-03",n).match(/\d+/g)||[],e=v=>t.findIndex(_=>Number(_)===v),h=e(2001),c=e(2),u=e(3);return h===0?"YMD":c>=0&&u>=0&&c<u?"MDY":"DMY"}function p(n,i,t){if(n<1e3||n>9999||i<1||i>12||t<1||t>31)return null;let e=new Date(n,i-1,t);return e.getFullYear()!==n||e.getMonth()!==i-1||e.getDate()!==t?null:`${n}-${String(i).padStart(2,"0")}-${String(t).padStart(2,"0")}`}function b(n,i){let t=n.trim(),e;if(e=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/))return p(+e[1],+e[2],+e[3]);if(e=t.match(/^(\d{4})$/))return p(+e[1],1,1);if(e=t.match(/^(\d{1,2})[./](\d{4})$/))return p(+e[2],+e[1],1);if(e=t.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/))return p(+e[3],+e[2],+e[1]);if(e=t.match(/^(\d{1,2})[/-](\d{1,2})[/-](\d{4})$/)){let h=+e[1],c=+e[2],u=+e[3];return $(i)==="MDY"?p(u,h,c):p(u,c,h)}return null}function x(n,i){if(i)switch(n){case"date":return i.split("T")[0];case"time":return i.length===5?`${i}:00`:i;case"datetime":{let[t,e="00:00:00"]=i.split("T");return`${t} ${e.length===5?`${e}:00`:e}`}}}function k(n,i){if(typeof i!="string"||!i)return"";switch(n){case"date":return i.slice(0,10);case"time":return i.slice(0,5);case"datetime":{let[t,e="00:00:00"]=i.split(" ");return`${t}T${e.length===5?`${e}:00`:e}`}}}var r=class extends g{constructor(){super(...arguments);this.kind="date";this.label="";this.value="";this.clearable=!1;this.disabled=!1;this.required=!1;this.lang="en";this._typing=!1;this._typed="";this._typedInvalid=!1}_startTyping(){this._typed=this.value,this._typedInvalid=!1,this._typing=!0,this.updateComplete.then(()=>this.shadowRoot?.querySelector("input.typed")?.focus())}_commitTyped(){if(!this._typed.trim()){this._typing=!1;return}let t=b(this._typed,this.lang);if(!t){this._typedInvalid=!0;return}this._typing=!1,this._typedInvalid=!1,this._emit(t)}_onTypedKey(t){t.key==="Enter"?(t.preventDefault(),this._commitTyped()):t.key==="Escape"&&(t.preventDefault(),this._typing=!1,this._typedInvalid=!1)}_selector(){switch(this.kind){case"date":return{date:{}};case"time":return{time:{no_second:!0}};case"datetime":return{datetime:{}}}}_onSelectorChange(t){t.stopPropagation(),this._emit(k(this.kind,t.detail?.value))}_clear(){this._emit("")}_emit(t){t!==this.value&&(this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{bubbles:!0,composed:!0,detail:{value:t}})))}render(){return s`
|
||||
<div class="field">
|
||||
${this.label?s`<span class="label">${this.label}${this.required?s`<span class="req">*</span>`:l}</span>`:l}
|
||||
<div class="row">
|
||||
${this._typing?s`<input class="typed" type="text" inputmode="numeric" autocomplete="off"
|
||||
.value=${this._typed}
|
||||
placeholder=${m("1978-03-15",this.lang)}
|
||||
aria-invalid=${this._typedInvalid?"true":"false"}
|
||||
@input=${t=>{this._typed=t.target.value,this._typedInvalid=!1}}
|
||||
@keydown=${this._onTypedKey}
|
||||
@blur=${this._commitTyped} />`:s`<ha-selector
|
||||
.hass=${this.hass}
|
||||
.selector=${this._selector()}
|
||||
.value=${x(this.kind,this.value)}
|
||||
.required=${this.required}
|
||||
.disabled=${this.disabled}
|
||||
@value-changed=${this._onSelectorChange}
|
||||
></ha-selector>`}
|
||||
${this.kind==="date"&&!this.disabled&&!this._typing?s`<button type="button" class="type-toggle" title=${d("date_type_toggle",this.lang)} aria-label=${d("date_type_toggle",this.lang)} @click=${this._startTyping}>
|
||||
<ha-icon icon="mdi:keyboard-outline"></ha-icon>
|
||||
</button>`:l}
|
||||
${this.clearable&&this.value&&!this.disabled&&!this._typing?s`<button type="button" class="clear" title=${d("clear",this.lang)} aria-label=${d("clear",this.lang)} @click=${this._clear}>
|
||||
<ha-icon icon="mdi:close"></ha-icon>
|
||||
</button>`:l}
|
||||
</div>
|
||||
${this._typedInvalid?s`<span class="helper invalid">${d("date_type_invalid",this.lang)}</span>`:this.helper?s`<span class="helper">${this.helper}</span>`:l}
|
||||
</div>
|
||||
`}};r.styles=y`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
ha-selector {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
.clear, .type-toggle {
|
||||
flex: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
padding: 0;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
--mdc-icon-size: 20px;
|
||||
}
|
||||
.clear:hover, .type-toggle:hover { background: rgba(var(--rgb-primary-text-color, 0, 0, 0), 0.08); }
|
||||
.clear:focus-visible, .type-toggle:focus-visible { outline: 2px solid var(--primary-color); }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
.helper.invalid { color: var(--error-color, #f44336); font-style: normal; }
|
||||
input.typed {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
height: 40px;
|
||||
box-sizing: border-box;
|
||||
padding: 0 12px;
|
||||
border: 1px solid var(--divider-color, #ccc);
|
||||
border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font: inherit;
|
||||
}
|
||||
input.typed[aria-invalid="true"] { border-color: var(--error-color, #f44336); }
|
||||
input.typed:focus { outline: 2px solid var(--primary-color); outline-offset: -1px; }
|
||||
`,a([o({attribute:!1})],r.prototype,"hass",2),a([o()],r.prototype,"kind",2),a([o()],r.prototype,"label",2),a([o()],r.prototype,"value",2),a([o()],r.prototype,"helper",2),a([o({type:Boolean})],r.prototype,"clearable",2),a([o({type:Boolean})],r.prototype,"disabled",2),a([o({type:Boolean})],r.prototype,"required",2),a([o()],r.prototype,"lang",2),a([f()],r.prototype,"_typing",2),a([f()],r.prototype,"_typed",2),a([f()],r.prototype,"_typedInvalid",2);customElements.get("ms-date-field")||customElements.define("ms-date-field",r);
|
||||
@@ -1,2 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{q as o}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";var v={already_archived:"ws_err_already_archived",already_paused:"ws_err_already_paused",archived:"ws_err_archived",create_failed:"ws_err_create_failed",duplicate_failed:"ws_err_duplicate_failed",empty:"ws_err_empty",empty_csv:"ws_err_empty_csv",invalid_cursor:"ws_err_invalid_cursor",invalid_date:"ws_err_invalid_date",invalid_device:"ws_err_invalid_device",invalid_entity_slug:"ws_err_invalid_entity_slug",invalid_format:"ws_err_invalid_format",invalid_input:"ws_err_invalid_input",invalid_parent:"ws_err_invalid_parent",invalid_range:"ws_err_invalid_range",invalid_target:"ws_err_invalid_target",invalid_trigger_config:"ws_err_invalid_trigger_config",invalid_url:"ws_err_invalid_url",invalid_user:"ws_err_invalid_user",invalid_view:"ws_err_invalid_view",limit_reached:"ws_err_limit_reached",no_defaults:"ws_err_no_defaults",no_phases:"ws_err_no_phases",no_url:"ws_err_no_url",not_archived:"ws_err_not_archived",not_available:"ws_err_not_available",not_configured:"ws_err_not_configured",not_found:"ws_err_not_found",not_loaded:"ws_err_not_loaded",not_paused:"ws_err_not_paused",replace_failed:"ws_err_replace_failed",self_link_device:"ws_err_self_link_device",storage_unavailable:"ws_err_storage_unavailable",too_early:"ws_err_too_early",too_large:"ws_err_too_large",too_many:"ws_err_too_many",too_many_views:"ws_err_too_many_views",unauthorized:"ws_err_unauthorized",unavailable:"ws_err_unavailable"},g={entry_id:"object",name:"name",task_type:"maintenance_type",schedule_type:"schedule_type",interval_days:"interval_days",interval_anchor:"interval_anchor",warning_days:"warning_days",last_performed:"last_performed_optional",notes:"notes_optional",documentation_url:"documentation_url_optional",custom_icon:"custom_icon_optional",nfc_tag_id:"nfc_tag_id_optional",responsible_user_id:"responsible_user",entity_slug:"entity_slug",entity_id:"entity_id",area_id:"area_id_optional",manufacturer:"manufacturer_optional",model:"model_optional",serial_number:"serial_number_optional",installation_date:"installation_date_optional",warranty_expiry:"warranty_expiry_optional",checklist:"checklist_steps_optional",reason:"reason",feedback:"feedback",cost:"cost",duration:"duration",description:"description_optional",environmental_entity:"environmental_entity_optional",environmental_attribute:"environmental_attribute_optional",trigger_above:"trigger_above",trigger_below:"trigger_below",trigger_equals:"trigger_equals",trigger_not_equals:"trigger_not_equals",trigger_for_minutes:"trigger_for_minutes"};function p(e){let _=e.replace(/_ids?$/,"").split("_").filter(Boolean);if(_.length===0)return e;let r=_.join(" ");return r.charAt(0).toUpperCase()+r.slice(1)}function w(e,_){let r=g[e];if(r){let t=o(r,_);if(t&&t!==r)return t}return p(e)}function f(e){let _=[...e.matchAll(/\['([^']+)'\]/g)].map(n=>n[1]),r=_.length?_[_.length-1]:void 0,t;return(t=e.match(/length of value must be at most (\d+)/))?{field:r,rule:"too_long",param:t[1]}:(t=e.match(/length of value must be at least (\d+)/))?{field:r,rule:"too_short",param:t[1]}:(t=e.match(/value must be at most (\S+)/))?{field:r,rule:"value_too_high",param:t[1]}:(t=e.match(/value must be at least (\S+)/))?{field:r,rule:"value_too_low",param:t[1]}:/required key not provided/.test(e)?{field:r,rule:"required"}:(t=e.match(/expected (\w+)/))?{field:r,rule:"wrong_type",param:t[1]}:/value must be one of/.test(e)?{field:r,rule:"invalid_choice"}:/not a valid value/.test(e)?{field:r,rule:"invalid_value"}:{field:r,rule:"unknown"}}var u=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(_=>_.length>1);function m(e,_){let r=new Set(u(_));return u(e).every(t=>r.has(t))}function y(e,_,r){if(r=r??o("action_error",_),typeof e=="string")return e;if(typeof e!="object"||e===null)return r;let t=e,n=t.message||t.error?.message||"",s=t.code||t.error?.code||"",d=s?v[s]:void 0;if(!n&&!d)return r;let a=f(n),c=a.field?w(a.field,_):"",i=l=>o(l,_).replace("{field}",c).replace("{n}",a.param??"");switch(a.rule){case"too_long":return i("err_too_long");case"too_short":return i("err_too_short");case"value_too_high":return i("err_value_too_high");case"value_too_low":return i("err_value_too_low");case"required":return i("err_required");case"wrong_type":return i("err_wrong_type").replace("{type}",a.param??"");case"invalid_choice":return i("err_invalid_choice");case"invalid_value":return i("err_invalid_value");default:if(d){let l=o(d,_);return n&&!m(n,s)?`${l} (${n})`:l}return n||r}}export{y as a};
|
||||
@@ -1,213 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.87.0 */
|
||||
import{a as x}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-NOXOKE42.js";import{a,b as v,c as n,f as p,h as b,l as h,m as c,q as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-BFRW5MGC.js";function d(l){return l.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function f(l){return!l.startsWith("data:image/svg+xml,")&&!l.startsWith("data:image/png;base64,")?"":d(l)}function q(l){return l.replace(/[/\\:*?"<>|#%]+/g,"").replace(/\s+/g,"-").toLowerCase().substring(0,100)}var o=class extends b{constructor(){super(...arguments);this.lang="en";this._open=!1;this._loading=!1;this._error="";this._viewResult=null;this._completeResult=null;this._urlMode="companion";this._entryId="";this._taskId=null;this._objectName="";this._taskName="";this._generateSeq=0}openForObject(e,i){this._entryId=e,this._taskId=null,this._objectName=i,this._taskName="",this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}openForTask(e,i,r,s){this._entryId=e,this._taskId=i,this._objectName=r,this._taskName=s,this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}async _generate(){let e=++this._generateSeq;this._loading=!0,this._error="",this._viewResult=null,this._completeResult=null;try{let i={type:"maintenance_supporter/qr/generate",entry_id:this._entryId,url_mode:this._urlMode};this._taskId&&(i.task_id=this._taskId);let r=[this.hass.connection.sendMessagePromise({...i,action:"view"})];this._taskId&&r.push(this.hass.connection.sendMessagePromise({...i,action:"complete"}));let s=await Promise.all(r);if(e!==this._generateSeq)return;this._viewResult=s[0],s.length>1&&(this._completeResult=s[1])}catch(i){if(e!==this._generateSeq)return;let r=i?.code,s=i?.message;this._error=r==="no_url"||typeof s=="string"&&s.includes("No Home Assistant URL")?t("qr_error_no_url",this.lang):t("qr_error",this.lang)}finally{e===this._generateSeq&&(this._loading=!1)}}_setUrlMode(e){this._urlMode!==e&&(this._urlMode=e,this._generate())}_print(){if(!this._viewResult)return;let e=this._viewResult,i=e.label.task_name?`${e.label.object_name} \u2014 ${e.label.task_name}`:e.label.object_name,r=[e.label.manufacturer,e.label.model].filter(Boolean).join(" "),s=window.open("","_blank","width=600,height=500");if(!s)return;let g=this.lang||"en",u=d(i),m=d(r),_=!!this._completeResult,w=d(t("qr_action_view",g)),$=d(t("qr_action_complete",g));s.document.write(`<!DOCTYPE html><html><head><meta charset="utf-8">
|
||||
<meta name="color-scheme" content="light">
|
||||
<title>${u}</title>
|
||||
<style>
|
||||
/* Printable sheet \u2014 must not inherit the phone's dark theme. The QR images
|
||||
carry their own white quiet zone and stay scannable either way, but the
|
||||
labels below are explicit dark greys and would vanish on a WebView's dark
|
||||
canvas. Same reasoning as helpers/report.ts. */
|
||||
:root{color-scheme:light}
|
||||
body{font-family:sans-serif;text-align:center;padding:20px;background:#fff;color:#1a1a1a}
|
||||
h2{margin:0 0 4px}
|
||||
.sub{color:#666;font-size:14px;margin-bottom:16px}
|
||||
.qr-row{display:flex;justify-content:center;gap:24px;margin:12px 0}
|
||||
.qr-col{display:flex;flex-direction:column;align-items:center;gap:6px}
|
||||
.qr-col img{width:${_?"200px":"280px"}}
|
||||
.qr-label{font-size:13px;font-weight:500;color:#333}
|
||||
.url{font-size:10px;color:#999;word-break:break-all;margin-top:8px;max-width:480px}
|
||||
</style></head><body>
|
||||
<h2>${u}</h2>
|
||||
${m?`<div class="sub">${m}</div>`:""}
|
||||
<div class="qr-row">
|
||||
<div class="qr-col">
|
||||
<img src="${f(this._viewResult.svg_data_uri)}" alt="QR Info" />
|
||||
<div class="qr-label">${w}</div>
|
||||
</div>
|
||||
${_?`<div class="qr-col">
|
||||
<img src="${f(this._completeResult.svg_data_uri)}" alt="QR Complete" />
|
||||
<div class="qr-label">${$}</div>
|
||||
</div>`:""}
|
||||
</div>
|
||||
<div class="url">${d(this._viewResult.url)}</div>
|
||||
<script>setTimeout(()=>window.print(),300)<\/script>
|
||||
</body></html>`),s.document.close()}_downloadSvg(e,i){let r=decodeURIComponent(e.svg_data_uri.replace("data:image/svg+xml,","")),s=this._taskName?`${this._objectName}-${this._taskName}`:this._objectName;x(r,`qr-${q(s)}-${i}.svg`,"image/svg+xml")}_close(){this._open=!1,this._viewResult=null,this._completeResult=null,this._error="",this._loading=!1}render(){if(!this._open)return n``;let e=this.lang||this.hass?.language||"en",i=this._taskName?`${t("qr_code",e)}: ${this._objectName} \u2014 ${this._taskName}`:`${t("qr_code",e)}: ${this._objectName}`,r=!!this._viewResult;return n`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${i}</div>
|
||||
<div class="content">
|
||||
${this._loading?n`<div class="loading">${t("qr_generating",e)}</div>`:this._error?n`<div class="error">${this._error}</div>`:r?n`
|
||||
<div class="qr-pair">
|
||||
<div class="qr-item">
|
||||
<img
|
||||
class="qr-image ${this._completeResult?"small":""}"
|
||||
src="${this._viewResult.svg_data_uri}"
|
||||
alt="QR Info"
|
||||
/>
|
||||
<div class="qr-item-label">${t("qr_action_view",e)}</div>
|
||||
<button class="dl-btn"
|
||||
@click=${()=>this._downloadSvg(this._viewResult,"info")}>
|
||||
<ha-icon icon="mdi:download"></ha-icon>
|
||||
${t("qr_download",e)}
|
||||
</button>
|
||||
</div>
|
||||
${this._completeResult?n`
|
||||
<div class="qr-item">
|
||||
<img
|
||||
class="qr-image small"
|
||||
src="${this._completeResult.svg_data_uri}"
|
||||
alt="QR Complete"
|
||||
/>
|
||||
<div class="qr-item-label">${t("qr_action_complete",e)}</div>
|
||||
<button class="dl-btn"
|
||||
@click=${()=>this._downloadSvg(this._completeResult,"complete")}>
|
||||
<ha-icon icon="mdi:download"></ha-icon>
|
||||
${t("qr_download",e)}
|
||||
</button>
|
||||
</div>
|
||||
`:p}
|
||||
</div>
|
||||
<div class="url-display">${this._viewResult.url}</div>
|
||||
`:p}
|
||||
<div class="action-row">
|
||||
<label>${t("qr_url_mode",e)}</label>
|
||||
<div class="action-toggle">
|
||||
<button class="toggle-btn ${this._urlMode==="companion"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("companion")}>${t("qr_mode_companion",e)}</button>
|
||||
<button class="toggle-btn ${this._urlMode==="local"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("local")}>${t("qr_mode_local",e)}</button>
|
||||
<button class="toggle-btn ${this._urlMode==="server"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("server")}>${t("qr_mode_server",e)}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${t("cancel",e)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._print}
|
||||
.disabled=${!r}
|
||||
>
|
||||
${t("qr_print",e)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</ha-dialog>
|
||||
`}};o.styles=v`
|
||||
.dialog-title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
min-width: 300px;
|
||||
}
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 16px;
|
||||
}
|
||||
.qr-pair {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
}
|
||||
.qr-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
.qr-image {
|
||||
width: 240px;
|
||||
height: 240px;
|
||||
image-rendering: pixelated;
|
||||
}
|
||||
.qr-image.small {
|
||||
width: 180px;
|
||||
height: 180px;
|
||||
}
|
||||
.qr-item-label {
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--secondary-text-color);
|
||||
text-align: center;
|
||||
}
|
||||
.dl-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
background: none;
|
||||
border: 1px solid var(--divider-color, #e0e0e0);
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
color: var(--primary-text-color);
|
||||
padding: 6px 14px;
|
||||
border-radius: 18px;
|
||||
transition: background 0.2s, border-color 0.2s;
|
||||
}
|
||||
.dl-btn:hover {
|
||||
background: var(--secondary-background-color, #f5f5f5);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
.dl-btn ha-icon {
|
||||
--mdc-icon-size: 18px;
|
||||
}
|
||||
.url-display {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
word-break: break-all;
|
||||
text-align: center;
|
||||
max-width: 400px;
|
||||
}
|
||||
.loading {
|
||||
padding: 40px 0;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.error {
|
||||
padding: 20px 0;
|
||||
color: var(--error-color, #f44336);
|
||||
}
|
||||
.action-row {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
width: 100%;
|
||||
}
|
||||
.action-row label {
|
||||
font-size: 13px;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.action-toggle {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
background: var(--divider-color, #e0e0e0);
|
||||
border-radius: 6px;
|
||||
padding: 3px;
|
||||
}
|
||||
.toggle-btn {
|
||||
flex: 1;
|
||||
padding: 8px 12px;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: var(--primary-text-color);
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
transition: all 0.2s;
|
||||
line-height: 1.3;
|
||||
}
|
||||
.toggle-btn:hover {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
.toggle-btn.active {
|
||||
background: var(--primary-color);
|
||||
color: var(--text-primary-color, #fff);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
`,a([h({attribute:!1})],o.prototype,"hass",2),a([h()],o.prototype,"lang",2),a([c()],o.prototype,"_open",2),a([c()],o.prototype,"_loading",2),a([c()],o.prototype,"_error",2),a([c()],o.prototype,"_viewResult",2),a([c()],o.prototype,"_completeResult",2),a([c()],o.prototype,"_urlMode",2);customElements.get("maintenance-qr-dialog")||customElements.define("maintenance-qr-dialog",o);export{o as a};
|
||||
+4
-4
File diff suppressed because one or more lines are too long
@@ -1,153 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.87.0 */
|
||||
import{a as u}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-6FKJJO4T.js";import{a as r,b as _,c as l,f as o,h,l as d,m as s,q as i,s as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-BFRW5MGC.js";var a=class extends h{constructor(){super(...arguments);this.objects=[];this._open=!1;this._loading=!1;this._error="";this._name="";this._manufacturer="";this._model="";this._serialNumber="";this._areaId="";this._installationDate="";this._warrantyExpiry="";this._documentationUrl="";this._notes="";this._haDeviceId="";this._parentEntryId="";this._entryId=null}get _lang(){return p(this.hass)}openCreate(){this._entryId=null,this._name="",this._manufacturer="",this._model="",this._serialNumber="",this._areaId="",this._installationDate="",this._warrantyExpiry="",this._documentationUrl="",this._notes="",this._haDeviceId="",this._parentEntryId="",this._error="",this._open=!0}openEdit(e,n){this._entryId=e,this._name=n.name||"",this._manufacturer=n.manufacturer||"",this._model=n.model||"",this._serialNumber=n.serial_number||"",this._areaId=n.area_id||"",this._installationDate=n.installation_date||"",this._warrantyExpiry=n.warranty_expiry||"",this._documentationUrl=n.documentation_url||"",this._notes=n.notes||"",this._haDeviceId=n.ha_device_id||"",this._parentEntryId=n.parent_entry_id||"",this._error="",this._open=!0}async _save(){if(!this._loading&&this._name.trim()){this._loading=!0,this._error="";try{this._entryId?await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/update",entry_id:this._entryId,name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}):await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/create",name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}),this._open=!1,this.dispatchEvent(new CustomEvent("object-saved"))}catch(e){this._error=u(e,this._lang,i("save_error",this._lang))}finally{this._loading=!1}}}_parentChoices(){return(this.objects||[]).filter(e=>e.entry_id!==this._entryId)}_close(){this._open=!1}render(){if(!this._open)return l``;let e=this._lang,n=this._entryId?i("edit_object",e):i("new_object",e);return l`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${n}</div>
|
||||
<div class="content">
|
||||
${this._error?l`<div class="error">${this._error}</div>`:o}
|
||||
<ms-textfield
|
||||
label="${i("name",e)}"
|
||||
required
|
||||
.value=${this._name}
|
||||
@input=${t=>this._name=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("manufacturer_optional",e)}"
|
||||
.value=${this._manufacturer}
|
||||
@input=${t=>this._manufacturer=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("model_optional",e)}"
|
||||
.value=${this._model}
|
||||
@input=${t=>this._model=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("serial_number_optional",e)}"
|
||||
.value=${this._serialNumber}
|
||||
@input=${t=>this._serialNumber=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("documentation_url_optional",e)}"
|
||||
type="url"
|
||||
.value=${this._documentationUrl}
|
||||
@input=${t=>this._documentationUrl=t.target.value}
|
||||
></ms-textfield>
|
||||
<ha-area-picker
|
||||
.hass=${this.hass}
|
||||
label="${i("area_id_optional",e)}"
|
||||
.value=${this._areaId}
|
||||
@value-changed=${t=>this._areaId=t.detail.value||""}
|
||||
></ha-area-picker>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${e}
|
||||
label="${i("installation_date_optional",e)}"
|
||||
.value=${this._installationDate}
|
||||
@value-changed=${t=>this._installationDate=t.detail.value}
|
||||
></ms-date-field>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${e}
|
||||
label="${i("warranty_expiry_optional",e)}"
|
||||
.value=${this._warrantyExpiry}
|
||||
@value-changed=${t=>this._warrantyExpiry=t.detail.value}
|
||||
></ms-date-field>
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${{device:this._haDeviceId||void 0}}
|
||||
.schema=${[{name:"device",selector:{device:{}}}]}
|
||||
.computeLabel=${()=>i("link_device_optional",e)}
|
||||
@value-changed=${t=>this._haDeviceId=t.detail.value?.device||""}
|
||||
></ha-form>
|
||||
${this._parentChoices().length?l`<label class="textarea-field">
|
||||
<span class="textarea-label">${i("parent_object_optional",e)}</span>
|
||||
<select
|
||||
class="parent-select"
|
||||
.value=${this._parentEntryId}
|
||||
@change=${t=>this._parentEntryId=t.target.value}
|
||||
>
|
||||
<option value="" ?selected=${!this._parentEntryId}>
|
||||
${i("parent_none",e)}
|
||||
</option>
|
||||
${this._parentChoices().map(t=>l`<option
|
||||
value=${t.entry_id}
|
||||
?selected=${this._parentEntryId===t.entry_id}
|
||||
>${t.object.name}</option>`)}
|
||||
</select>
|
||||
</label>`:o}
|
||||
<label class="textarea-field">
|
||||
<span class="textarea-label">${i("object_notes_optional",e)}</span>
|
||||
<textarea
|
||||
rows="3"
|
||||
.value=${this._notes}
|
||||
@input=${t=>this._notes=t.target.value}
|
||||
></textarea>
|
||||
<span class="md-hint">${i("notes_markdown_hint",e)}</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${i("cancel",this._lang)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._save}
|
||||
.disabled=${this._loading||!this._name.trim()}
|
||||
>
|
||||
${this._loading?i("saving",this._lang):i("save",this._lang)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</ha-dialog>
|
||||
`}};a.styles=_`
|
||||
.dialog-title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
min-width: 300px;
|
||||
}
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 16px;
|
||||
}
|
||||
ms-textfield {
|
||||
display: block;
|
||||
}
|
||||
.textarea-field {
|
||||
display: flex; flex-direction: column; gap: 4px;
|
||||
}
|
||||
.textarea-label {
|
||||
font-size: 12px; color: var(--secondary-text-color, #888); font-weight: 500;
|
||||
}
|
||||
.textarea-field textarea {
|
||||
padding: 8px 10px; font-size: 14px; font-family: inherit;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
resize: vertical;
|
||||
}
|
||||
.textarea-field textarea:focus {
|
||||
outline: none; border-color: var(--primary-color);
|
||||
}
|
||||
.md-hint {
|
||||
font-size: 11px; color: var(--secondary-text-color); font-style: italic;
|
||||
}
|
||||
.parent-select {
|
||||
padding: 8px 10px; font-size: 14px; font-family: inherit;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
}
|
||||
.error {
|
||||
color: var(--error-color, #f44336);
|
||||
font-size: 13px;
|
||||
}
|
||||
`,r([d({attribute:!1})],a.prototype,"hass",2),r([d({attribute:!1})],a.prototype,"objects",2),r([s()],a.prototype,"_open",2),r([s()],a.prototype,"_loading",2),r([s()],a.prototype,"_error",2),r([s()],a.prototype,"_name",2),r([s()],a.prototype,"_manufacturer",2),r([s()],a.prototype,"_model",2),r([s()],a.prototype,"_serialNumber",2),r([s()],a.prototype,"_areaId",2),r([s()],a.prototype,"_installationDate",2),r([s()],a.prototype,"_warrantyExpiry",2),r([s()],a.prototype,"_documentationUrl",2),r([s()],a.prototype,"_notes",2),r([s()],a.prototype,"_haDeviceId",2),r([s()],a.prototype,"_parentEntryId",2),r([s()],a.prototype,"_entryId",2);customElements.get("maintenance-object-dialog")||customElements.define("maintenance-object-dialog",a);export{a};
|
||||
@@ -1,2 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{q as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";function f(r){return`${r.entry_id??""}\0${r.part_id}`}function g(r,n,i,o){let t=!!r.entry_id&&r.entry_id!==n,e=t?r.entry_id:n,s=i.find(l=>l.entry_id===e),a=(s?.parts||[]).find(l=>l.id===r.part_id)||null,u=t&&s?.object?.name||"",d=a?.name||p("shared_part_unknown",o);return{part:a,foreign:t,ownerName:u,label:u?`${d} (${u})`:d}}function _(r,n,i,o){let{part:t,label:e}=g(r,n,i,o),s=t&&t.stock!==null&&t.stock!==void 0?` (${t.stock}${t.unit?" "+t.unit:""})`:"",a=t?.storage_location?` \u2014 ${t.storage_location}`:"";return`${r.quantity}\xD7 ${e}${s}${a}`}function R(r,n,i,o){let e=(i.find(a=>a.entry_id===n)?.parts||[]).map(a=>({...a})),s=new Set(e.map(a=>f({part_id:a.id})));for(let a of r?.consumes_parts||[]){if(!a.entry_id||a.entry_id===n)continue;let u=f(a);if(s.has(u))continue;s.add(u);let{part:d,ownerName:l}=g(a,n,i,o);e.push({id:a.part_id,name:d?.name||p("shared_part_unknown",o),unit:d?.unit,stock:d?.stock??null,storage_location:d?.storage_location,entry_id:a.entry_id,owner_name:l})}return e}function w(){let r=new Uint8Array(4);return(globalThis.crypto??{getRandomValues:n=>n.map(()=>Math.floor(Math.random()*256))}).getRandomValues(r),Array.from(r,n=>n.toString(16).padStart(2,"0")).join("")}function c(r){let n=r?.reading_values;if(!Array.isArray(n))return[];let i=[],o=new Set;for(let t of n){if(!t||typeof t!="object")continue;let e=t;typeof e.id!="string"||!e.id||o.has(e.id)||typeof e.value!="number"||!Number.isFinite(e.value)||(o.add(e.id),i.push({id:e.id,name:typeof e.name=="string"?e.name:e.id,unit:typeof e.unit=="string"?e.unit:null,value:e.value}))}return i}function y(r){return r.filter(n=>n.type==="completed"&&(n.reading_value!=null||c(n).length>0)).sort((n,i)=>n.timestamp.localeCompare(i.timestamp))}function S(r){return y(r??[]).map(n=>({timestamp:n.timestamp,values:c(n)})).filter(n=>n.values.length>0)}function P(r,n,i){let o;for(let t of r){if(i!==void 0){let s=new Date(t.timestamp).getTime();if(!isNaN(s)&&s>=i)break}let e=t.values.find(s=>s.id===n);e&&(o=e)}return o}function b(r,n,i){let o=c(n).find(e=>e.id===i);if(!o)return null;let t=null;for(let e of y(r)){if(e.timestamp>=n.timestamp)break;let s=c(e).find(a=>a.id===i);s&&(t=s.value)}return t==null?null:o.value-t}function E(r){let n=new Set,i=new Set;for(let o of r){let t=(o.name||"").trim().toLowerCase();t&&(n.has(t)?i.add(o.id):n.add(t))}return i}function v(r){let n=[],i=new Set,o=new Set;for(let t of r){let e=(t.name||"").trim();if(!(!e||i.has(t.id)||o.has(e.toLowerCase()))&&(i.add(t.id),o.add(e.toLowerCase()),n.push({id:t.id,name:e,unit:(t.unit||"").trim()||null}),n.length>=20))break}return n}var x=["notes","cost","duration","photo","user"],h={notes:"notes_label",cost:"cost",duration:"duration",photo:"photo_label",user:"user_label"};export{f as a,_ as b,R as c,w as d,c as e,S as f,P as g,b as h,E as i,v as j,x as k,h as l};
|
||||
File diff suppressed because one or more lines are too long
@@ -1,2 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.82.0 */
|
||||
var l=[{key:"name",labelKey:"name",required:!0},{key:"ref_no",labelKey:"ref_number"},{key:"manufacturer",labelKey:"manufacturer"},{key:"model",labelKey:"model"},{key:"serial_number",labelKey:"serial_number_label"},{key:"installation_date",labelKey:"installed"},{key:"warranty_expiry",labelKey:"warranty"},{key:"area_id",labelKey:"area"},{key:"documentation_url",labelKey:"documentation_url_label"},{key:"notes",labelKey:"object_notes_label"},{key:"task_count",labelKey:"tasks"},{key:"actions",labelKey:"actions"}],i=l.map(a=>a.key),r=["name","manufacturer","model","serial_number","installation_date","warranty_expiry","area_id","task_count","actions"];function o(a){if(!Array.isArray(a))return[...r];let t=new Set,e=[];for(let n of a)typeof n=="string"&&i.includes(n)&&!t.has(n)&&(t.add(n),e.push(n));return e.length?(e.includes("name")||e.unshift("name"),e):[...r]}export{l as a,r as b,o as c};
|
||||
@@ -1,88 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.82.0 */
|
||||
import{a,b as y,c as s,f as l,h as g,l as o,m as f,q as d,z as m}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-4OPY4VQ5.js";function $(n){let t=m("2001-02-03",n).match(/\d+/g)||[],e=v=>t.findIndex(_=>Number(_)===v),h=e(2001),c=e(2),u=e(3);return h===0?"YMD":c>=0&&u>=0&&c<u?"MDY":"DMY"}function p(n,i,t){if(n<1e3||n>9999||i<1||i>12||t<1||t>31)return null;let e=new Date(n,i-1,t);return e.getFullYear()!==n||e.getMonth()!==i-1||e.getDate()!==t?null:`${n}-${String(i).padStart(2,"0")}-${String(t).padStart(2,"0")}`}function b(n,i){let t=n.trim(),e;if(e=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/))return p(+e[1],+e[2],+e[3]);if(e=t.match(/^(\d{4})$/))return p(+e[1],1,1);if(e=t.match(/^(\d{1,2})[./](\d{4})$/))return p(+e[2],+e[1],1);if(e=t.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/))return p(+e[3],+e[2],+e[1]);if(e=t.match(/^(\d{1,2})[/-](\d{1,2})[/-](\d{4})$/)){let h=+e[1],c=+e[2],u=+e[3];return $(i)==="MDY"?p(u,h,c):p(u,c,h)}return null}function x(n,i){if(i)switch(n){case"date":return i.split("T")[0];case"time":return i.length===5?`${i}:00`:i;case"datetime":{let[t,e="00:00:00"]=i.split("T");return`${t} ${e.length===5?`${e}:00`:e}`}}}function k(n,i){if(typeof i!="string"||!i)return"";switch(n){case"date":return i.slice(0,10);case"time":return i.slice(0,5);case"datetime":{let[t,e="00:00:00"]=i.split(" ");return`${t}T${e.length===5?`${e}:00`:e}`}}}var r=class extends g{constructor(){super(...arguments);this.kind="date";this.label="";this.value="";this.clearable=!1;this.disabled=!1;this.required=!1;this.lang="en";this._typing=!1;this._typed="";this._typedInvalid=!1}_startTyping(){this._typed=this.value,this._typedInvalid=!1,this._typing=!0,this.updateComplete.then(()=>this.shadowRoot?.querySelector("input.typed")?.focus())}_commitTyped(){if(!this._typed.trim()){this._typing=!1;return}let t=b(this._typed,this.lang);if(!t){this._typedInvalid=!0;return}this._typing=!1,this._typedInvalid=!1,this._emit(t)}_onTypedKey(t){t.key==="Enter"?(t.preventDefault(),this._commitTyped()):t.key==="Escape"&&(t.preventDefault(),this._typing=!1,this._typedInvalid=!1)}_selector(){switch(this.kind){case"date":return{date:{}};case"time":return{time:{no_second:!0}};case"datetime":return{datetime:{}}}}_onSelectorChange(t){t.stopPropagation(),this._emit(k(this.kind,t.detail?.value))}_clear(){this._emit("")}_emit(t){t!==this.value&&(this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{bubbles:!0,composed:!0,detail:{value:t}})))}render(){return s`
|
||||
<div class="field">
|
||||
${this.label?s`<span class="label">${this.label}${this.required?s`<span class="req">*</span>`:l}</span>`:l}
|
||||
<div class="row">
|
||||
${this._typing?s`<input class="typed" type="text" inputmode="numeric" autocomplete="off"
|
||||
.value=${this._typed}
|
||||
placeholder=${m("1978-03-15",this.lang)}
|
||||
aria-invalid=${this._typedInvalid?"true":"false"}
|
||||
@input=${t=>{this._typed=t.target.value,this._typedInvalid=!1}}
|
||||
@keydown=${this._onTypedKey}
|
||||
@blur=${this._commitTyped} />`:s`<ha-selector
|
||||
.hass=${this.hass}
|
||||
.selector=${this._selector()}
|
||||
.value=${x(this.kind,this.value)}
|
||||
.required=${this.required}
|
||||
.disabled=${this.disabled}
|
||||
@value-changed=${this._onSelectorChange}
|
||||
></ha-selector>`}
|
||||
${this.kind==="date"&&!this.disabled&&!this._typing?s`<button type="button" class="type-toggle" title=${d("date_type_toggle",this.lang)} aria-label=${d("date_type_toggle",this.lang)} @click=${this._startTyping}>
|
||||
<ha-icon icon="mdi:keyboard-outline"></ha-icon>
|
||||
</button>`:l}
|
||||
${this.clearable&&this.value&&!this.disabled&&!this._typing?s`<button type="button" class="clear" title=${d("clear",this.lang)} aria-label=${d("clear",this.lang)} @click=${this._clear}>
|
||||
<ha-icon icon="mdi:close"></ha-icon>
|
||||
</button>`:l}
|
||||
</div>
|
||||
${this._typedInvalid?s`<span class="helper invalid">${d("date_type_invalid",this.lang)}</span>`:this.helper?s`<span class="helper">${this.helper}</span>`:l}
|
||||
</div>
|
||||
`}};r.styles=y`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
ha-selector {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
.clear, .type-toggle {
|
||||
flex: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
padding: 0;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
--mdc-icon-size: 20px;
|
||||
}
|
||||
.clear:hover, .type-toggle:hover { background: rgba(var(--rgb-primary-text-color, 0, 0, 0), 0.08); }
|
||||
.clear:focus-visible, .type-toggle:focus-visible { outline: 2px solid var(--primary-color); }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
.helper.invalid { color: var(--error-color, #f44336); font-style: normal; }
|
||||
input.typed {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
height: 40px;
|
||||
box-sizing: border-box;
|
||||
padding: 0 12px;
|
||||
border: 1px solid var(--divider-color, #ccc);
|
||||
border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font: inherit;
|
||||
}
|
||||
input.typed[aria-invalid="true"] { border-color: var(--error-color, #f44336); }
|
||||
input.typed:focus { outline: 2px solid var(--primary-color); outline-offset: -1px; }
|
||||
`,a([o({attribute:!1})],r.prototype,"hass",2),a([o()],r.prototype,"kind",2),a([o()],r.prototype,"label",2),a([o()],r.prototype,"value",2),a([o()],r.prototype,"helper",2),a([o({type:Boolean})],r.prototype,"clearable",2),a([o({type:Boolean})],r.prototype,"disabled",2),a([o({type:Boolean})],r.prototype,"required",2),a([o()],r.prototype,"lang",2),a([f()],r.prototype,"_typing",2),a([f()],r.prototype,"_typed",2),a([f()],r.prototype,"_typedInvalid",2);customElements.get("ms-date-field")||customElements.define("ms-date-field",r);
|
||||
@@ -1,2 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.87.0 */
|
||||
import{c as r,f as i}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-BFRW5MGC.js";var a=["#c62828","#ad1457","#6a1b9a","#4527a0","#283593","#1565c0","#00838f","#2e7d32","#558b2f","#ef6c00","#6d4c41","#546e7a"];function u(e){let s=(e||"").split(/\s+/).filter(Boolean);return s.length===0?"?":s.length===1?s[0][0].toUpperCase():(s[0][0]+s[s.length-1][0]).toUpperCase()}function c(e){let s=0;for(let n of e)s=s*31+n.charCodeAt(0)>>>0;return a[s%a.length]}function o(e){return e?{id:e.id,name:e.name,initials:e.initials||u(e.name),color:e.color||c(e.id)}:null}function h(e){return e?r`<span class="person-avatar" style="--person-color: ${e.color}" title=${e.name}>${e.initials}</span>`:i}function m(e,s=""){return e?r`<span class="person-chip ${s}" title=${e.name}>${h(e)}<span class="person-name">${e.name}</span></span>`:i}var l=class{constructor(s){this.usersCache=null;this.cacheTimestamp=0;this.CACHE_TTL_MS=6e4;this.hass=s}updateHass(s){this.hass=s}async getUsers(s=!1){let n=Date.now();if(!s&&this.usersCache&&n-this.cacheTimestamp<this.CACHE_TTL_MS)return this.usersCache;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/users/list"});return this.usersCache=t.users,this.cacheTimestamp=n,this.usersCache}catch(t){return console.error("Failed to fetch users:",t),this.usersCache||[]}}async assignUser(s,n,t){await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/task/assign_user",entry_id:s,task_id:n,user_id:t})}async getTasksByUser(s){return(await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/tasks/by_user",user_id:s})).tasks}getUserName(s){return!s||!this.usersCache?null:this.usersCache.find(t=>t.id===s)?.name||null}getPerson(s){return o(this.getUser(s))}getUser(s){return!s||!this.usersCache?null:this.usersCache.find(n=>n.id===s)||null}getCurrentUserId(){return this.hass.user?.id||null}isCurrentUser(s){return s?s===this.getCurrentUserId():!1}clearCache(){this.usersCache=null,this.cacheTimestamp=0}};export{a,o as b,h as c,m as d,l as e};
|
||||
@@ -1,213 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as x}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-TVK2JN4G.js";import{a,b as v,c as n,f as p,h as b,l as h,m as c,q as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";function d(l){return l.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function f(l){return!l.startsWith("data:image/svg+xml,")&&!l.startsWith("data:image/png;base64,")?"":d(l)}function q(l){return l.replace(/[/\\:*?"<>|#%]+/g,"").replace(/\s+/g,"-").toLowerCase().substring(0,100)}var o=class extends b{constructor(){super(...arguments);this.lang="en";this._open=!1;this._loading=!1;this._error="";this._viewResult=null;this._completeResult=null;this._urlMode="companion";this._entryId="";this._taskId=null;this._objectName="";this._taskName="";this._generateSeq=0}openForObject(e,i){this._entryId=e,this._taskId=null,this._objectName=i,this._taskName="",this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}openForTask(e,i,r,s){this._entryId=e,this._taskId=i,this._objectName=r,this._taskName=s,this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}async _generate(){let e=++this._generateSeq;this._loading=!0,this._error="",this._viewResult=null,this._completeResult=null;try{let i={type:"maintenance_supporter/qr/generate",entry_id:this._entryId,url_mode:this._urlMode};this._taskId&&(i.task_id=this._taskId);let r=[this.hass.connection.sendMessagePromise({...i,action:"view"})];this._taskId&&r.push(this.hass.connection.sendMessagePromise({...i,action:"complete"}));let s=await Promise.all(r);if(e!==this._generateSeq)return;this._viewResult=s[0],s.length>1&&(this._completeResult=s[1])}catch(i){if(e!==this._generateSeq)return;let r=i?.code,s=i?.message;this._error=r==="no_url"||typeof s=="string"&&s.includes("No Home Assistant URL")?t("qr_error_no_url",this.lang):t("qr_error",this.lang)}finally{e===this._generateSeq&&(this._loading=!1)}}_setUrlMode(e){this._urlMode!==e&&(this._urlMode=e,this._generate())}_print(){if(!this._viewResult)return;let e=this._viewResult,i=e.label.task_name?`${e.label.object_name} \u2014 ${e.label.task_name}`:e.label.object_name,r=[e.label.manufacturer,e.label.model].filter(Boolean).join(" "),s=window.open("","_blank","width=600,height=500");if(!s)return;let g=this.lang||"en",u=d(i),m=d(r),_=!!this._completeResult,w=d(t("qr_action_view",g)),$=d(t("qr_action_complete",g));s.document.write(`<!DOCTYPE html><html><head><meta charset="utf-8">
|
||||
<meta name="color-scheme" content="light">
|
||||
<title>${u}</title>
|
||||
<style>
|
||||
/* Printable sheet \u2014 must not inherit the phone's dark theme. The QR images
|
||||
carry their own white quiet zone and stay scannable either way, but the
|
||||
labels below are explicit dark greys and would vanish on a WebView's dark
|
||||
canvas. Same reasoning as helpers/report.ts. */
|
||||
:root{color-scheme:light}
|
||||
body{font-family:sans-serif;text-align:center;padding:20px;background:#fff;color:#1a1a1a}
|
||||
h2{margin:0 0 4px}
|
||||
.sub{color:#666;font-size:14px;margin-bottom:16px}
|
||||
.qr-row{display:flex;justify-content:center;gap:24px;margin:12px 0}
|
||||
.qr-col{display:flex;flex-direction:column;align-items:center;gap:6px}
|
||||
.qr-col img{width:${_?"200px":"280px"}}
|
||||
.qr-label{font-size:13px;font-weight:500;color:#333}
|
||||
.url{font-size:10px;color:#999;word-break:break-all;margin-top:8px;max-width:480px}
|
||||
</style></head><body>
|
||||
<h2>${u}</h2>
|
||||
${m?`<div class="sub">${m}</div>`:""}
|
||||
<div class="qr-row">
|
||||
<div class="qr-col">
|
||||
<img src="${f(this._viewResult.svg_data_uri)}" alt="QR Info" />
|
||||
<div class="qr-label">${w}</div>
|
||||
</div>
|
||||
${_?`<div class="qr-col">
|
||||
<img src="${f(this._completeResult.svg_data_uri)}" alt="QR Complete" />
|
||||
<div class="qr-label">${$}</div>
|
||||
</div>`:""}
|
||||
</div>
|
||||
<div class="url">${d(this._viewResult.url)}</div>
|
||||
<script>setTimeout(()=>window.print(),300)<\/script>
|
||||
</body></html>`),s.document.close()}_downloadSvg(e,i){let r=decodeURIComponent(e.svg_data_uri.replace("data:image/svg+xml,","")),s=this._taskName?`${this._objectName}-${this._taskName}`:this._objectName;x(r,`qr-${q(s)}-${i}.svg`,"image/svg+xml")}_close(){this._open=!1,this._viewResult=null,this._completeResult=null,this._error="",this._loading=!1}render(){if(!this._open)return n``;let e=this.lang||this.hass?.language||"en",i=this._taskName?`${t("qr_code",e)}: ${this._objectName} \u2014 ${this._taskName}`:`${t("qr_code",e)}: ${this._objectName}`,r=!!this._viewResult;return n`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${i}</div>
|
||||
<div class="content">
|
||||
${this._loading?n`<div class="loading">${t("qr_generating",e)}</div>`:this._error?n`<div class="error">${this._error}</div>`:r?n`
|
||||
<div class="qr-pair">
|
||||
<div class="qr-item">
|
||||
<img
|
||||
class="qr-image ${this._completeResult?"small":""}"
|
||||
src="${this._viewResult.svg_data_uri}"
|
||||
alt="QR Info"
|
||||
/>
|
||||
<div class="qr-item-label">${t("qr_action_view",e)}</div>
|
||||
<button class="dl-btn"
|
||||
@click=${()=>this._downloadSvg(this._viewResult,"info")}>
|
||||
<ha-icon icon="mdi:download"></ha-icon>
|
||||
${t("qr_download",e)}
|
||||
</button>
|
||||
</div>
|
||||
${this._completeResult?n`
|
||||
<div class="qr-item">
|
||||
<img
|
||||
class="qr-image small"
|
||||
src="${this._completeResult.svg_data_uri}"
|
||||
alt="QR Complete"
|
||||
/>
|
||||
<div class="qr-item-label">${t("qr_action_complete",e)}</div>
|
||||
<button class="dl-btn"
|
||||
@click=${()=>this._downloadSvg(this._completeResult,"complete")}>
|
||||
<ha-icon icon="mdi:download"></ha-icon>
|
||||
${t("qr_download",e)}
|
||||
</button>
|
||||
</div>
|
||||
`:p}
|
||||
</div>
|
||||
<div class="url-display">${this._viewResult.url}</div>
|
||||
`:p}
|
||||
<div class="action-row">
|
||||
<label>${t("qr_url_mode",e)}</label>
|
||||
<div class="action-toggle">
|
||||
<button class="toggle-btn ${this._urlMode==="companion"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("companion")}>${t("qr_mode_companion",e)}</button>
|
||||
<button class="toggle-btn ${this._urlMode==="local"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("local")}>${t("qr_mode_local",e)}</button>
|
||||
<button class="toggle-btn ${this._urlMode==="server"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("server")}>${t("qr_mode_server",e)}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${t("cancel",e)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._print}
|
||||
.disabled=${!r}
|
||||
>
|
||||
${t("qr_print",e)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</ha-dialog>
|
||||
`}};o.styles=v`
|
||||
.dialog-title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
min-width: 300px;
|
||||
}
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 16px;
|
||||
}
|
||||
.qr-pair {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
}
|
||||
.qr-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
.qr-image {
|
||||
width: 240px;
|
||||
height: 240px;
|
||||
image-rendering: pixelated;
|
||||
}
|
||||
.qr-image.small {
|
||||
width: 180px;
|
||||
height: 180px;
|
||||
}
|
||||
.qr-item-label {
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--secondary-text-color);
|
||||
text-align: center;
|
||||
}
|
||||
.dl-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
background: none;
|
||||
border: 1px solid var(--divider-color, #e0e0e0);
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
color: var(--primary-text-color);
|
||||
padding: 6px 14px;
|
||||
border-radius: 18px;
|
||||
transition: background 0.2s, border-color 0.2s;
|
||||
}
|
||||
.dl-btn:hover {
|
||||
background: var(--secondary-background-color, #f5f5f5);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
.dl-btn ha-icon {
|
||||
--mdc-icon-size: 18px;
|
||||
}
|
||||
.url-display {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
word-break: break-all;
|
||||
text-align: center;
|
||||
max-width: 400px;
|
||||
}
|
||||
.loading {
|
||||
padding: 40px 0;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.error {
|
||||
padding: 20px 0;
|
||||
color: var(--error-color, #f44336);
|
||||
}
|
||||
.action-row {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
width: 100%;
|
||||
}
|
||||
.action-row label {
|
||||
font-size: 13px;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.action-toggle {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
background: var(--divider-color, #e0e0e0);
|
||||
border-radius: 6px;
|
||||
padding: 3px;
|
||||
}
|
||||
.toggle-btn {
|
||||
flex: 1;
|
||||
padding: 8px 12px;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: var(--primary-text-color);
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
transition: all 0.2s;
|
||||
line-height: 1.3;
|
||||
}
|
||||
.toggle-btn:hover {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
.toggle-btn.active {
|
||||
background: var(--primary-color);
|
||||
color: var(--text-primary-color, #fff);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
`,a([h({attribute:!1})],o.prototype,"hass",2),a([h()],o.prototype,"lang",2),a([c()],o.prototype,"_open",2),a([c()],o.prototype,"_loading",2),a([c()],o.prototype,"_error",2),a([c()],o.prototype,"_viewResult",2),a([c()],o.prototype,"_completeResult",2),a([c()],o.prototype,"_urlMode",2);customElements.get("maintenance-qr-dialog")||customElements.define("maintenance-qr-dialog",o);export{o as a};
|
||||
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,2 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
/*! maintenance_supporter frontend 2.88.0 */
|
||||
var l=[{key:"name",labelKey:"name",required:!0},{key:"ref_no",labelKey:"ref_number"},{key:"manufacturer",labelKey:"manufacturer"},{key:"model",labelKey:"model"},{key:"serial_number",labelKey:"serial_number_label"},{key:"installation_date",labelKey:"installed"},{key:"warranty_expiry",labelKey:"warranty"},{key:"area_id",labelKey:"area"},{key:"documentation_url",labelKey:"documentation_url_label"},{key:"notes",labelKey:"object_notes_label"},{key:"task_count",labelKey:"tasks"},{key:"actions",labelKey:"actions"}],i=l.map(a=>a.key),r=["name","manufacturer","model","serial_number","installation_date","warranty_expiry","area_id","task_count","actions"];function o(a){if(!Array.isArray(a))return[...r];let t=new Set,e=[];for(let n of a)typeof n=="string"&&i.includes(n)&&!t.has(n)&&(t.add(n),e.push(n));return e.length?(e.includes("name")||e.unshift("name"),e):[...r]}export{l as a,r as b,o as c};
|
||||
@@ -1,2 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{c as r,f as i}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var a=["#c62828","#ad1457","#6a1b9a","#4527a0","#283593","#1565c0","#00838f","#2e7d32","#558b2f","#ef6c00","#6d4c41","#546e7a"];function u(e){let s=(e||"").split(/\s+/).filter(Boolean);return s.length===0?"?":s.length===1?s[0][0].toUpperCase():(s[0][0]+s[s.length-1][0]).toUpperCase()}function c(e){let s=0;for(let n of e)s=s*31+n.charCodeAt(0)>>>0;return a[s%a.length]}function o(e){return e?{id:e.id,name:e.name,initials:e.initials||u(e.name),color:e.color||c(e.id)}:null}function h(e){return e?r`<span class="person-avatar" style="--person-color: ${e.color}" title=${e.name}>${e.initials}</span>`:i}function m(e,s=""){return e?r`<span class="person-chip ${s}" title=${e.name}>${h(e)}<span class="person-name">${e.name}</span></span>`:i}var l=class{constructor(s){this.usersCache=null;this.cacheTimestamp=0;this.CACHE_TTL_MS=6e4;this.hass=s}updateHass(s){this.hass=s}async getUsers(s=!1){let n=Date.now();if(!s&&this.usersCache&&n-this.cacheTimestamp<this.CACHE_TTL_MS)return this.usersCache;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/users/list"});return this.usersCache=t.users,this.cacheTimestamp=n,this.usersCache}catch(t){return console.error("Failed to fetch users:",t),this.usersCache||[]}}async assignUser(s,n,t){await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/task/assign_user",entry_id:s,task_id:n,user_id:t})}async getTasksByUser(s){return(await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/tasks/by_user",user_id:s})).tasks}getUserName(s){return!s||!this.usersCache?null:this.usersCache.find(t=>t.id===s)?.name||null}getPerson(s){return o(this.getUser(s))}getUser(s){return!s||!this.usersCache?null:this.usersCache.find(n=>n.id===s)||null}getCurrentUserId(){return this.hass.user?.id||null}isCurrentUser(s){return s?s===this.getCurrentUserId():!1}clearCache(){this.usersCache=null,this.cacheTimestamp=0}};export{a,o as b,h as c,m as d,l as e};
|
||||
@@ -1,2 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.87.0 */
|
||||
function c(o,t,e){let l=new Blob([o],{type:e}),d=URL.createObjectURL(l),n=document.createElement("a");n.href=d,n.download=t,n.target="_blank",n.rel="noopener",n.style.display="none",document.body.appendChild(n),n.dispatchEvent(new MouseEvent("click")),document.body.removeChild(n),setTimeout(()=>URL.revokeObjectURL(d),6e4)}function r(o,t){let e=document.createElement("a");e.href=o,e.download=t,e.target="_blank",e.rel="noopener",e.style.display="none",document.body.appendChild(e),e.dispatchEvent(new MouseEvent("click")),document.body.removeChild(e)}export{c as a,r as b};
|
||||
@@ -1,213 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.82.0 */
|
||||
import{a as x}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-ZSJQYRHU.js";import{a,b as v,c as n,f as p,h as b,l as h,m as c,q as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-4OPY4VQ5.js";function d(l){return l.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function f(l){return!l.startsWith("data:image/svg+xml,")&&!l.startsWith("data:image/png;base64,")?"":d(l)}function q(l){return l.replace(/[/\\:*?"<>|#%]+/g,"").replace(/\s+/g,"-").toLowerCase().substring(0,100)}var o=class extends b{constructor(){super(...arguments);this.lang="en";this._open=!1;this._loading=!1;this._error="";this._viewResult=null;this._completeResult=null;this._urlMode="companion";this._entryId="";this._taskId=null;this._objectName="";this._taskName="";this._generateSeq=0}openForObject(e,i){this._entryId=e,this._taskId=null,this._objectName=i,this._taskName="",this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}openForTask(e,i,r,s){this._entryId=e,this._taskId=i,this._objectName=r,this._taskName=s,this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}async _generate(){let e=++this._generateSeq;this._loading=!0,this._error="",this._viewResult=null,this._completeResult=null;try{let i={type:"maintenance_supporter/qr/generate",entry_id:this._entryId,url_mode:this._urlMode};this._taskId&&(i.task_id=this._taskId);let r=[this.hass.connection.sendMessagePromise({...i,action:"view"})];this._taskId&&r.push(this.hass.connection.sendMessagePromise({...i,action:"complete"}));let s=await Promise.all(r);if(e!==this._generateSeq)return;this._viewResult=s[0],s.length>1&&(this._completeResult=s[1])}catch(i){if(e!==this._generateSeq)return;let r=i?.code,s=i?.message;this._error=r==="no_url"||typeof s=="string"&&s.includes("No Home Assistant URL")?t("qr_error_no_url",this.lang):t("qr_error",this.lang)}finally{e===this._generateSeq&&(this._loading=!1)}}_setUrlMode(e){this._urlMode!==e&&(this._urlMode=e,this._generate())}_print(){if(!this._viewResult)return;let e=this._viewResult,i=e.label.task_name?`${e.label.object_name} \u2014 ${e.label.task_name}`:e.label.object_name,r=[e.label.manufacturer,e.label.model].filter(Boolean).join(" "),s=window.open("","_blank","width=600,height=500");if(!s)return;let g=this.lang||"en",u=d(i),m=d(r),_=!!this._completeResult,w=d(t("qr_action_view",g)),$=d(t("qr_action_complete",g));s.document.write(`<!DOCTYPE html><html><head><meta charset="utf-8">
|
||||
<meta name="color-scheme" content="light">
|
||||
<title>${u}</title>
|
||||
<style>
|
||||
/* Printable sheet \u2014 must not inherit the phone's dark theme. The QR images
|
||||
carry their own white quiet zone and stay scannable either way, but the
|
||||
labels below are explicit dark greys and would vanish on a WebView's dark
|
||||
canvas. Same reasoning as helpers/report.ts. */
|
||||
:root{color-scheme:light}
|
||||
body{font-family:sans-serif;text-align:center;padding:20px;background:#fff;color:#1a1a1a}
|
||||
h2{margin:0 0 4px}
|
||||
.sub{color:#666;font-size:14px;margin-bottom:16px}
|
||||
.qr-row{display:flex;justify-content:center;gap:24px;margin:12px 0}
|
||||
.qr-col{display:flex;flex-direction:column;align-items:center;gap:6px}
|
||||
.qr-col img{width:${_?"200px":"280px"}}
|
||||
.qr-label{font-size:13px;font-weight:500;color:#333}
|
||||
.url{font-size:10px;color:#999;word-break:break-all;margin-top:8px;max-width:480px}
|
||||
</style></head><body>
|
||||
<h2>${u}</h2>
|
||||
${m?`<div class="sub">${m}</div>`:""}
|
||||
<div class="qr-row">
|
||||
<div class="qr-col">
|
||||
<img src="${f(this._viewResult.svg_data_uri)}" alt="QR Info" />
|
||||
<div class="qr-label">${w}</div>
|
||||
</div>
|
||||
${_?`<div class="qr-col">
|
||||
<img src="${f(this._completeResult.svg_data_uri)}" alt="QR Complete" />
|
||||
<div class="qr-label">${$}</div>
|
||||
</div>`:""}
|
||||
</div>
|
||||
<div class="url">${d(this._viewResult.url)}</div>
|
||||
<script>setTimeout(()=>window.print(),300)<\/script>
|
||||
</body></html>`),s.document.close()}_downloadSvg(e,i){let r=decodeURIComponent(e.svg_data_uri.replace("data:image/svg+xml,","")),s=this._taskName?`${this._objectName}-${this._taskName}`:this._objectName;x(r,`qr-${q(s)}-${i}.svg`,"image/svg+xml")}_close(){this._open=!1,this._viewResult=null,this._completeResult=null,this._error="",this._loading=!1}render(){if(!this._open)return n``;let e=this.lang||this.hass?.language||"en",i=this._taskName?`${t("qr_code",e)}: ${this._objectName} \u2014 ${this._taskName}`:`${t("qr_code",e)}: ${this._objectName}`,r=!!this._viewResult;return n`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${i}</div>
|
||||
<div class="content">
|
||||
${this._loading?n`<div class="loading">${t("qr_generating",e)}</div>`:this._error?n`<div class="error">${this._error}</div>`:r?n`
|
||||
<div class="qr-pair">
|
||||
<div class="qr-item">
|
||||
<img
|
||||
class="qr-image ${this._completeResult?"small":""}"
|
||||
src="${this._viewResult.svg_data_uri}"
|
||||
alt="QR Info"
|
||||
/>
|
||||
<div class="qr-item-label">${t("qr_action_view",e)}</div>
|
||||
<button class="dl-btn"
|
||||
@click=${()=>this._downloadSvg(this._viewResult,"info")}>
|
||||
<ha-icon icon="mdi:download"></ha-icon>
|
||||
${t("qr_download",e)}
|
||||
</button>
|
||||
</div>
|
||||
${this._completeResult?n`
|
||||
<div class="qr-item">
|
||||
<img
|
||||
class="qr-image small"
|
||||
src="${this._completeResult.svg_data_uri}"
|
||||
alt="QR Complete"
|
||||
/>
|
||||
<div class="qr-item-label">${t("qr_action_complete",e)}</div>
|
||||
<button class="dl-btn"
|
||||
@click=${()=>this._downloadSvg(this._completeResult,"complete")}>
|
||||
<ha-icon icon="mdi:download"></ha-icon>
|
||||
${t("qr_download",e)}
|
||||
</button>
|
||||
</div>
|
||||
`:p}
|
||||
</div>
|
||||
<div class="url-display">${this._viewResult.url}</div>
|
||||
`:p}
|
||||
<div class="action-row">
|
||||
<label>${t("qr_url_mode",e)}</label>
|
||||
<div class="action-toggle">
|
||||
<button class="toggle-btn ${this._urlMode==="companion"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("companion")}>${t("qr_mode_companion",e)}</button>
|
||||
<button class="toggle-btn ${this._urlMode==="local"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("local")}>${t("qr_mode_local",e)}</button>
|
||||
<button class="toggle-btn ${this._urlMode==="server"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("server")}>${t("qr_mode_server",e)}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${t("cancel",e)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._print}
|
||||
.disabled=${!r}
|
||||
>
|
||||
${t("qr_print",e)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</ha-dialog>
|
||||
`}};o.styles=v`
|
||||
.dialog-title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
min-width: 300px;
|
||||
}
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 16px;
|
||||
}
|
||||
.qr-pair {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
}
|
||||
.qr-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
.qr-image {
|
||||
width: 240px;
|
||||
height: 240px;
|
||||
image-rendering: pixelated;
|
||||
}
|
||||
.qr-image.small {
|
||||
width: 180px;
|
||||
height: 180px;
|
||||
}
|
||||
.qr-item-label {
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--secondary-text-color);
|
||||
text-align: center;
|
||||
}
|
||||
.dl-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
background: none;
|
||||
border: 1px solid var(--divider-color, #e0e0e0);
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
color: var(--primary-text-color);
|
||||
padding: 6px 14px;
|
||||
border-radius: 18px;
|
||||
transition: background 0.2s, border-color 0.2s;
|
||||
}
|
||||
.dl-btn:hover {
|
||||
background: var(--secondary-background-color, #f5f5f5);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
.dl-btn ha-icon {
|
||||
--mdc-icon-size: 18px;
|
||||
}
|
||||
.url-display {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
word-break: break-all;
|
||||
text-align: center;
|
||||
max-width: 400px;
|
||||
}
|
||||
.loading {
|
||||
padding: 40px 0;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.error {
|
||||
padding: 20px 0;
|
||||
color: var(--error-color, #f44336);
|
||||
}
|
||||
.action-row {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
width: 100%;
|
||||
}
|
||||
.action-row label {
|
||||
font-size: 13px;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.action-toggle {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
background: var(--divider-color, #e0e0e0);
|
||||
border-radius: 6px;
|
||||
padding: 3px;
|
||||
}
|
||||
.toggle-btn {
|
||||
flex: 1;
|
||||
padding: 8px 12px;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: var(--primary-text-color);
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
transition: all 0.2s;
|
||||
line-height: 1.3;
|
||||
}
|
||||
.toggle-btn:hover {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
.toggle-btn.active {
|
||||
background: var(--primary-color);
|
||||
color: var(--text-primary-color, #fff);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
`,a([h({attribute:!1})],o.prototype,"hass",2),a([h()],o.prototype,"lang",2),a([c()],o.prototype,"_open",2),a([c()],o.prototype,"_loading",2),a([c()],o.prototype,"_error",2),a([c()],o.prototype,"_viewResult",2),a([c()],o.prototype,"_completeResult",2),a([c()],o.prototype,"_urlMode",2);customElements.get("maintenance-qr-dialog")||customElements.define("maintenance-qr-dialog",o);export{o as a};
|
||||
+5
-5
File diff suppressed because one or more lines are too long
@@ -1,2 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.87.0 */
|
||||
var l=[{key:"name",labelKey:"name",required:!0},{key:"ref_no",labelKey:"ref_number"},{key:"manufacturer",labelKey:"manufacturer"},{key:"model",labelKey:"model"},{key:"serial_number",labelKey:"serial_number_label"},{key:"installation_date",labelKey:"installed"},{key:"warranty_expiry",labelKey:"warranty"},{key:"area_id",labelKey:"area"},{key:"documentation_url",labelKey:"documentation_url_label"},{key:"notes",labelKey:"object_notes_label"},{key:"task_count",labelKey:"tasks"},{key:"actions",labelKey:"actions"}],i=l.map(a=>a.key),r=["name","manufacturer","model","serial_number","installation_date","warranty_expiry","area_id","task_count","actions"];function o(a){if(!Array.isArray(a))return[...r];let t=new Set,e=[];for(let n of a)typeof n=="string"&&i.includes(n)&&!t.has(n)&&(t.add(n),e.push(n));return e.length?(e.includes("name")||e.unshift("name"),e):[...r]}export{l as a,r as b,o as c};
|
||||
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,2 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{q as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";function f(r){return`${r.entry_id??""}\0${r.part_id}`}function g(r,n,i,o){let t=!!r.entry_id&&r.entry_id!==n,e=t?r.entry_id:n,s=i.find(l=>l.entry_id===e),a=(s?.parts||[]).find(l=>l.id===r.part_id)||null,u=t&&s?.object?.name||"",d=a?.name||p("shared_part_unknown",o);return{part:a,foreign:t,ownerName:u,label:u?`${d} (${u})`:d}}function _(r,n,i,o){let{part:t,label:e}=g(r,n,i,o),s=t&&t.stock!==null&&t.stock!==void 0?` (${t.stock}${t.unit?" "+t.unit:""})`:"",a=t?.storage_location?` \u2014 ${t.storage_location}`:"";return`${r.quantity}\xD7 ${e}${s}${a}`}function R(r,n,i,o){let e=(i.find(a=>a.entry_id===n)?.parts||[]).map(a=>({...a})),s=new Set(e.map(a=>f({part_id:a.id})));for(let a of r?.consumes_parts||[]){if(!a.entry_id||a.entry_id===n)continue;let u=f(a);if(s.has(u))continue;s.add(u);let{part:d,ownerName:l}=g(a,n,i,o);e.push({id:a.part_id,name:d?.name||p("shared_part_unknown",o),unit:d?.unit,stock:d?.stock??null,storage_location:d?.storage_location,entry_id:a.entry_id,owner_name:l})}return e}function w(){let r=new Uint8Array(4);return(globalThis.crypto??{getRandomValues:n=>n.map(()=>Math.floor(Math.random()*256))}).getRandomValues(r),Array.from(r,n=>n.toString(16).padStart(2,"0")).join("")}function c(r){let n=r?.reading_values;if(!Array.isArray(n))return[];let i=[],o=new Set;for(let t of n){if(!t||typeof t!="object")continue;let e=t;typeof e.id!="string"||!e.id||o.has(e.id)||typeof e.value!="number"||!Number.isFinite(e.value)||(o.add(e.id),i.push({id:e.id,name:typeof e.name=="string"?e.name:e.id,unit:typeof e.unit=="string"?e.unit:null,value:e.value}))}return i}function y(r){return r.filter(n=>n.type==="completed"&&(n.reading_value!=null||c(n).length>0)).sort((n,i)=>n.timestamp.localeCompare(i.timestamp))}function S(r){return y(r??[]).map(n=>({timestamp:n.timestamp,values:c(n)})).filter(n=>n.values.length>0)}function P(r,n,i){let o;for(let t of r){if(i!==void 0){let s=new Date(t.timestamp).getTime();if(!isNaN(s)&&s>=i)break}let e=t.values.find(s=>s.id===n);e&&(o=e)}return o}function b(r,n,i){let o=c(n).find(e=>e.id===i);if(!o)return null;let t=null;for(let e of y(r)){if(e.timestamp>=n.timestamp)break;let s=c(e).find(a=>a.id===i);s&&(t=s.value)}return t==null?null:o.value-t}function E(r){let n=new Set,i=new Set;for(let o of r){let t=(o.name||"").trim().toLowerCase();t&&(n.has(t)?i.add(o.id):n.add(t))}return i}function v(r){let n=[],i=new Set,o=new Set;for(let t of r){let e=(t.name||"").trim();if(!(!e||i.has(t.id)||o.has(e.toLowerCase()))&&(i.add(t.id),o.add(e.toLowerCase()),n.push({id:t.id,name:e,unit:(t.unit||"").trim()||null}),n.length>=20))break}return n}var x=["notes","cost","duration","photo","user"],h={notes:"notes_label",cost:"cost",duration:"duration",photo:"photo_label",user:"user_label"};export{f as a,_ as b,R as c,w as d,c as e,S as f,P as g,b as h,E as i,v as j,x as k,h as l};
|
||||
/*! maintenance_supporter frontend 2.88.0 */
|
||||
import{q as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-OXPKT66L.js";function f(r){return`${r.entry_id??""}\0${r.part_id}`}function g(r,n,i,o){let t=!!r.entry_id&&r.entry_id!==n,e=t?r.entry_id:n,s=i.find(l=>l.entry_id===e),a=(s?.parts||[]).find(l=>l.id===r.part_id)||null,u=t&&s?.object?.name||"",d=a?.name||p("shared_part_unknown",o);return{part:a,foreign:t,ownerName:u,label:u?`${d} (${u})`:d}}function _(r,n,i,o){let{part:t,label:e}=g(r,n,i,o),s=t&&t.stock!==null&&t.stock!==void 0?` (${t.stock}${t.unit?" "+t.unit:""})`:"",a=t?.storage_location?` \u2014 ${t.storage_location}`:"";return`${r.quantity}\xD7 ${e}${s}${a}`}function R(r,n,i,o){let e=(i.find(a=>a.entry_id===n)?.parts||[]).map(a=>({...a})),s=new Set(e.map(a=>f({part_id:a.id})));for(let a of r?.consumes_parts||[]){if(!a.entry_id||a.entry_id===n)continue;let u=f(a);if(s.has(u))continue;s.add(u);let{part:d,ownerName:l}=g(a,n,i,o);e.push({id:a.part_id,name:d?.name||p("shared_part_unknown",o),unit:d?.unit,stock:d?.stock??null,storage_location:d?.storage_location,entry_id:a.entry_id,owner_name:l})}return e}function w(){let r=new Uint8Array(4);return(globalThis.crypto??{getRandomValues:n=>n.map(()=>Math.floor(Math.random()*256))}).getRandomValues(r),Array.from(r,n=>n.toString(16).padStart(2,"0")).join("")}function c(r){let n=r?.reading_values;if(!Array.isArray(n))return[];let i=[],o=new Set;for(let t of n){if(!t||typeof t!="object")continue;let e=t;typeof e.id!="string"||!e.id||o.has(e.id)||typeof e.value!="number"||!Number.isFinite(e.value)||(o.add(e.id),i.push({id:e.id,name:typeof e.name=="string"?e.name:e.id,unit:typeof e.unit=="string"?e.unit:null,value:e.value}))}return i}function y(r){return r.filter(n=>n.type==="completed"&&(n.reading_value!=null||c(n).length>0)).sort((n,i)=>n.timestamp.localeCompare(i.timestamp))}function S(r){return y(r??[]).map(n=>({timestamp:n.timestamp,values:c(n)})).filter(n=>n.values.length>0)}function P(r,n,i){let o;for(let t of r){if(i!==void 0){let s=new Date(t.timestamp).getTime();if(!isNaN(s)&&s>=i)break}let e=t.values.find(s=>s.id===n);e&&(o=e)}return o}function b(r,n,i){let o=c(n).find(e=>e.id===i);if(!o)return null;let t=null;for(let e of y(r)){if(e.timestamp>=n.timestamp)break;let s=c(e).find(a=>a.id===i);s&&(t=s.value)}return t==null?null:o.value-t}function E(r){let n=new Set,i=new Set;for(let o of r){let t=(o.name||"").trim().toLowerCase();t&&(n.has(t)?i.add(o.id):n.add(t))}return i}function v(r){let n=[],i=new Set,o=new Set;for(let t of r){let e=(t.name||"").trim();if(!(!e||i.has(t.id)||o.has(e.toLowerCase()))&&(i.add(t.id),o.add(e.toLowerCase()),n.push({id:t.id,name:e,unit:(t.unit||"").trim()||null}),n.length>=20))break}return n}var x=["notes","cost","duration","photo","user"],h={notes:"notes_label",cost:"cost",duration:"duration",photo:"photo_label",user:"user_label"};export{f as a,_ as b,R as c,w as d,c as e,S as f,P as g,b as h,E as i,v as j,x as k,h as l};
|
||||
+7
-7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,5 +1,5 @@
|
||||
/*! maintenance_supporter frontend 2.87.0 */
|
||||
import{A as m,a,b as y,c as s,f as l,h as g,l as o,m as f,q as d}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-BFRW5MGC.js";function $(n){let t=m("2001-02-03",n).match(/\d+/g)||[],e=v=>t.findIndex(_=>Number(_)===v),h=e(2001),c=e(2),u=e(3);return h===0?"YMD":c>=0&&u>=0&&c<u?"MDY":"DMY"}function p(n,i,t){if(n<1e3||n>9999||i<1||i>12||t<1||t>31)return null;let e=new Date(n,i-1,t);return e.getFullYear()!==n||e.getMonth()!==i-1||e.getDate()!==t?null:`${n}-${String(i).padStart(2,"0")}-${String(t).padStart(2,"0")}`}function b(n,i){let t=n.trim(),e;if(e=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/))return p(+e[1],+e[2],+e[3]);if(e=t.match(/^(\d{4})$/))return p(+e[1],1,1);if(e=t.match(/^(\d{1,2})[./](\d{4})$/))return p(+e[2],+e[1],1);if(e=t.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/))return p(+e[3],+e[2],+e[1]);if(e=t.match(/^(\d{1,2})[/-](\d{1,2})[/-](\d{4})$/)){let h=+e[1],c=+e[2],u=+e[3];return $(i)==="MDY"?p(u,h,c):p(u,c,h)}return null}function x(n,i){if(i)switch(n){case"date":return i.split("T")[0];case"time":return i.length===5?`${i}:00`:i;case"datetime":{let[t,e="00:00:00"]=i.split("T");return`${t} ${e.length===5?`${e}:00`:e}`}}}function k(n,i){if(typeof i!="string"||!i)return"";switch(n){case"date":return i.slice(0,10);case"time":return i.slice(0,5);case"datetime":{let[t,e="00:00:00"]=i.split(" ");return`${t}T${e.length===5?`${e}:00`:e}`}}}var r=class extends g{constructor(){super(...arguments);this.kind="date";this.label="";this.value="";this.clearable=!1;this.disabled=!1;this.required=!1;this.lang="en";this._typing=!1;this._typed="";this._typedInvalid=!1}_startTyping(){this._typed=this.value,this._typedInvalid=!1,this._typing=!0,this.updateComplete.then(()=>this.shadowRoot?.querySelector("input.typed")?.focus())}_commitTyped(){if(!this._typed.trim()){this._typing=!1;return}let t=b(this._typed,this.lang);if(!t){this._typedInvalid=!0;return}this._typing=!1,this._typedInvalid=!1,this._emit(t)}_onTypedKey(t){t.key==="Enter"?(t.preventDefault(),this._commitTyped()):t.key==="Escape"&&(t.preventDefault(),this._typing=!1,this._typedInvalid=!1)}_selector(){switch(this.kind){case"date":return{date:{}};case"time":return{time:{no_second:!0}};case"datetime":return{datetime:{}}}}_onSelectorChange(t){t.stopPropagation(),this._emit(k(this.kind,t.detail?.value))}_clear(){this._emit("")}_emit(t){t!==this.value&&(this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{bubbles:!0,composed:!0,detail:{value:t}})))}render(){return s`
|
||||
/*! maintenance_supporter frontend 2.88.0 */
|
||||
import{A as m,a,b as y,c as s,f as l,h as g,l as o,m as f,q as d}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-OXPKT66L.js";function $(n){let t=m("2001-02-03",n).match(/\d+/g)||[],e=v=>t.findIndex(_=>Number(_)===v),h=e(2001),c=e(2),u=e(3);return h===0?"YMD":c>=0&&u>=0&&c<u?"MDY":"DMY"}function p(n,i,t){if(n<1e3||n>9999||i<1||i>12||t<1||t>31)return null;let e=new Date(n,i-1,t);return e.getFullYear()!==n||e.getMonth()!==i-1||e.getDate()!==t?null:`${n}-${String(i).padStart(2,"0")}-${String(t).padStart(2,"0")}`}function b(n,i){let t=n.trim(),e;if(e=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/))return p(+e[1],+e[2],+e[3]);if(e=t.match(/^(\d{4})$/))return p(+e[1],1,1);if(e=t.match(/^(\d{1,2})[./](\d{4})$/))return p(+e[2],+e[1],1);if(e=t.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/))return p(+e[3],+e[2],+e[1]);if(e=t.match(/^(\d{1,2})[/-](\d{1,2})[/-](\d{4})$/)){let h=+e[1],c=+e[2],u=+e[3];return $(i)==="MDY"?p(u,h,c):p(u,c,h)}return null}function x(n,i){if(i)switch(n){case"date":return i.split("T")[0];case"time":return i.length===5?`${i}:00`:i;case"datetime":{let[t,e="00:00:00"]=i.split("T");return`${t} ${e.length===5?`${e}:00`:e}`}}}function k(n,i){if(typeof i!="string"||!i)return"";switch(n){case"date":return i.slice(0,10);case"time":return i.slice(0,5);case"datetime":{let[t,e="00:00:00"]=i.split(" ");return`${t}T${e.length===5?`${e}:00`:e}`}}}var r=class extends g{constructor(){super(...arguments);this.kind="date";this.label="";this.value="";this.clearable=!1;this.disabled=!1;this.required=!1;this.lang="en";this._typing=!1;this._typed="";this._typedInvalid=!1}_startTyping(){this._typed=this.value,this._typedInvalid=!1,this._typing=!0,this.updateComplete.then(()=>this.shadowRoot?.querySelector("input.typed")?.focus())}_commitTyped(){if(!this._typed.trim()){this._typing=!1;return}let t=b(this._typed,this.lang);if(!t){this._typedInvalid=!0;return}this._typing=!1,this._typedInvalid=!1,this._emit(t)}_onTypedKey(t){t.key==="Enter"?(t.preventDefault(),this._commitTyped()):t.key==="Escape"&&(t.preventDefault(),this._typing=!1,this._typedInvalid=!1)}_selector(){switch(this.kind){case"date":return{date:{}};case"time":return{time:{no_second:!0}};case"datetime":return{datetime:{}}}}_onSelectorChange(t){t.stopPropagation(),this._emit(k(this.kind,t.detail?.value))}_clear(){this._emit("")}_emit(t){t!==this.value&&(this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{bubbles:!0,composed:!0,detail:{value:t}})))}render(){return s`
|
||||
<div class="field">
|
||||
${this.label?s`<span class="label">${this.label}${this.required?s`<span class="req">*</span>`:l}</span>`:l}
|
||||
<div class="row">
|
||||
+49
-47
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,5 +1,5 @@
|
||||
/*! maintenance_supporter frontend 2.82.0 */
|
||||
import{a as u}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-XCPYIT7M.js";import{a as r,b as _,c as l,f as o,h,l as d,m as s,q as i,s as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-4OPY4VQ5.js";var a=class extends h{constructor(){super(...arguments);this.objects=[];this._open=!1;this._loading=!1;this._error="";this._name="";this._manufacturer="";this._model="";this._serialNumber="";this._areaId="";this._installationDate="";this._warrantyExpiry="";this._documentationUrl="";this._notes="";this._haDeviceId="";this._parentEntryId="";this._entryId=null}get _lang(){return p(this.hass)}openCreate(){this._entryId=null,this._name="",this._manufacturer="",this._model="",this._serialNumber="",this._areaId="",this._installationDate="",this._warrantyExpiry="",this._documentationUrl="",this._notes="",this._haDeviceId="",this._parentEntryId="",this._error="",this._open=!0}openEdit(e,n){this._entryId=e,this._name=n.name||"",this._manufacturer=n.manufacturer||"",this._model=n.model||"",this._serialNumber=n.serial_number||"",this._areaId=n.area_id||"",this._installationDate=n.installation_date||"",this._warrantyExpiry=n.warranty_expiry||"",this._documentationUrl=n.documentation_url||"",this._notes=n.notes||"",this._haDeviceId=n.ha_device_id||"",this._parentEntryId=n.parent_entry_id||"",this._error="",this._open=!0}async _save(){if(!this._loading&&this._name.trim()){this._loading=!0,this._error="";try{this._entryId?await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/update",entry_id:this._entryId,name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}):await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/create",name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}),this._open=!1,this.dispatchEvent(new CustomEvent("object-saved"))}catch(e){this._error=u(e,this._lang,i("save_error",this._lang))}finally{this._loading=!1}}}_parentChoices(){return(this.objects||[]).filter(e=>e.entry_id!==this._entryId)}_close(){this._open=!1}render(){if(!this._open)return l``;let e=this._lang,n=this._entryId?i("edit_object",e):i("new_object",e);return l`
|
||||
/*! maintenance_supporter frontend 2.88.0 */
|
||||
import{a as u}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-XRSEIZKJ.js";import{a as r,b as _,c as l,f as o,h,l as d,m as s,q as i,s as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-OXPKT66L.js";var a=class extends h{constructor(){super(...arguments);this.objects=[];this._open=!1;this._loading=!1;this._error="";this._name="";this._manufacturer="";this._model="";this._serialNumber="";this._areaId="";this._installationDate="";this._warrantyExpiry="";this._documentationUrl="";this._notes="";this._haDeviceId="";this._parentEntryId="";this._entryId=null}get _lang(){return p(this.hass)}openCreate(){this._entryId=null,this._name="",this._manufacturer="",this._model="",this._serialNumber="",this._areaId="",this._installationDate="",this._warrantyExpiry="",this._documentationUrl="",this._notes="",this._haDeviceId="",this._parentEntryId="",this._error="",this._open=!0}openEdit(e,n){this._entryId=e,this._name=n.name||"",this._manufacturer=n.manufacturer||"",this._model=n.model||"",this._serialNumber=n.serial_number||"",this._areaId=n.area_id||"",this._installationDate=n.installation_date||"",this._warrantyExpiry=n.warranty_expiry||"",this._documentationUrl=n.documentation_url||"",this._notes=n.notes||"",this._haDeviceId=n.ha_device_id||"",this._parentEntryId=n.parent_entry_id||"",this._error="",this._open=!0}async _save(){if(!this._loading&&this._name.trim()){this._loading=!0,this._error="";try{this._entryId?await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/update",entry_id:this._entryId,name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}):await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/create",name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}),this._open=!1,this.dispatchEvent(new CustomEvent("object-saved"))}catch(e){this._error=u(e,this._lang,i("save_error",this._lang))}finally{this._loading=!1}}}_parentChoices(){return(this.objects||[]).filter(e=>e.entry_id!==this._entryId)}_close(){this._open=!1}render(){if(!this._open)return l``;let e=this._lang,n=this._entryId?i("edit_object",e):i("new_object",e);return l`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${n}</div>
|
||||
<div class="content">
|
||||
File diff suppressed because one or more lines are too long
@@ -1,153 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as u}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-73OGSTHK.js";import{a as r,b as _,c as l,f as o,h,l as d,m as s,q as i,s as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var a=class extends h{constructor(){super(...arguments);this.objects=[];this._open=!1;this._loading=!1;this._error="";this._name="";this._manufacturer="";this._model="";this._serialNumber="";this._areaId="";this._installationDate="";this._warrantyExpiry="";this._documentationUrl="";this._notes="";this._haDeviceId="";this._parentEntryId="";this._entryId=null}get _lang(){return p(this.hass)}openCreate(){this._entryId=null,this._name="",this._manufacturer="",this._model="",this._serialNumber="",this._areaId="",this._installationDate="",this._warrantyExpiry="",this._documentationUrl="",this._notes="",this._haDeviceId="",this._parentEntryId="",this._error="",this._open=!0}openEdit(e,n){this._entryId=e,this._name=n.name||"",this._manufacturer=n.manufacturer||"",this._model=n.model||"",this._serialNumber=n.serial_number||"",this._areaId=n.area_id||"",this._installationDate=n.installation_date||"",this._warrantyExpiry=n.warranty_expiry||"",this._documentationUrl=n.documentation_url||"",this._notes=n.notes||"",this._haDeviceId=n.ha_device_id||"",this._parentEntryId=n.parent_entry_id||"",this._error="",this._open=!0}async _save(){if(!this._loading&&this._name.trim()){this._loading=!0,this._error="";try{this._entryId?await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/update",entry_id:this._entryId,name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}):await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/create",name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}),this._open=!1,this.dispatchEvent(new CustomEvent("object-saved"))}catch(e){this._error=u(e,this._lang,i("save_error",this._lang))}finally{this._loading=!1}}}_parentChoices(){return(this.objects||[]).filter(e=>e.entry_id!==this._entryId)}_close(){this._open=!1}render(){if(!this._open)return l``;let e=this._lang,n=this._entryId?i("edit_object",e):i("new_object",e);return l`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${n}</div>
|
||||
<div class="content">
|
||||
${this._error?l`<div class="error">${this._error}</div>`:o}
|
||||
<ms-textfield
|
||||
label="${i("name",e)}"
|
||||
required
|
||||
.value=${this._name}
|
||||
@input=${t=>this._name=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("manufacturer_optional",e)}"
|
||||
.value=${this._manufacturer}
|
||||
@input=${t=>this._manufacturer=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("model_optional",e)}"
|
||||
.value=${this._model}
|
||||
@input=${t=>this._model=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("serial_number_optional",e)}"
|
||||
.value=${this._serialNumber}
|
||||
@input=${t=>this._serialNumber=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("documentation_url_optional",e)}"
|
||||
type="url"
|
||||
.value=${this._documentationUrl}
|
||||
@input=${t=>this._documentationUrl=t.target.value}
|
||||
></ms-textfield>
|
||||
<ha-area-picker
|
||||
.hass=${this.hass}
|
||||
label="${i("area_id_optional",e)}"
|
||||
.value=${this._areaId}
|
||||
@value-changed=${t=>this._areaId=t.detail.value||""}
|
||||
></ha-area-picker>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${e}
|
||||
label="${i("installation_date_optional",e)}"
|
||||
.value=${this._installationDate}
|
||||
@value-changed=${t=>this._installationDate=t.detail.value}
|
||||
></ms-date-field>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${e}
|
||||
label="${i("warranty_expiry_optional",e)}"
|
||||
.value=${this._warrantyExpiry}
|
||||
@value-changed=${t=>this._warrantyExpiry=t.detail.value}
|
||||
></ms-date-field>
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${{device:this._haDeviceId||void 0}}
|
||||
.schema=${[{name:"device",selector:{device:{}}}]}
|
||||
.computeLabel=${()=>i("link_device_optional",e)}
|
||||
@value-changed=${t=>this._haDeviceId=t.detail.value?.device||""}
|
||||
></ha-form>
|
||||
${this._parentChoices().length?l`<label class="textarea-field">
|
||||
<span class="textarea-label">${i("parent_object_optional",e)}</span>
|
||||
<select
|
||||
class="parent-select"
|
||||
.value=${this._parentEntryId}
|
||||
@change=${t=>this._parentEntryId=t.target.value}
|
||||
>
|
||||
<option value="" ?selected=${!this._parentEntryId}>
|
||||
${i("parent_none",e)}
|
||||
</option>
|
||||
${this._parentChoices().map(t=>l`<option
|
||||
value=${t.entry_id}
|
||||
?selected=${this._parentEntryId===t.entry_id}
|
||||
>${t.object.name}</option>`)}
|
||||
</select>
|
||||
</label>`:o}
|
||||
<label class="textarea-field">
|
||||
<span class="textarea-label">${i("object_notes_optional",e)}</span>
|
||||
<textarea
|
||||
rows="3"
|
||||
.value=${this._notes}
|
||||
@input=${t=>this._notes=t.target.value}
|
||||
></textarea>
|
||||
<span class="md-hint">${i("notes_markdown_hint",e)}</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${i("cancel",this._lang)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._save}
|
||||
.disabled=${this._loading||!this._name.trim()}
|
||||
>
|
||||
${this._loading?i("saving",this._lang):i("save",this._lang)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</ha-dialog>
|
||||
`}};a.styles=_`
|
||||
.dialog-title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
min-width: 300px;
|
||||
}
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 16px;
|
||||
}
|
||||
ms-textfield {
|
||||
display: block;
|
||||
}
|
||||
.textarea-field {
|
||||
display: flex; flex-direction: column; gap: 4px;
|
||||
}
|
||||
.textarea-label {
|
||||
font-size: 12px; color: var(--secondary-text-color, #888); font-weight: 500;
|
||||
}
|
||||
.textarea-field textarea {
|
||||
padding: 8px 10px; font-size: 14px; font-family: inherit;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
resize: vertical;
|
||||
}
|
||||
.textarea-field textarea:focus {
|
||||
outline: none; border-color: var(--primary-color);
|
||||
}
|
||||
.md-hint {
|
||||
font-size: 11px; color: var(--secondary-text-color); font-style: italic;
|
||||
}
|
||||
.parent-select {
|
||||
padding: 8px 10px; font-size: 14px; font-family: inherit;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
}
|
||||
.error {
|
||||
color: var(--error-color, #f44336);
|
||||
font-size: 13px;
|
||||
}
|
||||
`,r([d({attribute:!1})],a.prototype,"hass",2),r([d({attribute:!1})],a.prototype,"objects",2),r([s()],a.prototype,"_open",2),r([s()],a.prototype,"_loading",2),r([s()],a.prototype,"_error",2),r([s()],a.prototype,"_name",2),r([s()],a.prototype,"_manufacturer",2),r([s()],a.prototype,"_model",2),r([s()],a.prototype,"_serialNumber",2),r([s()],a.prototype,"_areaId",2),r([s()],a.prototype,"_installationDate",2),r([s()],a.prototype,"_warrantyExpiry",2),r([s()],a.prototype,"_documentationUrl",2),r([s()],a.prototype,"_notes",2),r([s()],a.prototype,"_haDeviceId",2),r([s()],a.prototype,"_parentEntryId",2),r([s()],a.prototype,"_entryId",2);customElements.get("maintenance-object-dialog")||customElements.define("maintenance-object-dialog",a);export{a};
|
||||
@@ -1,2 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
function c(o,t,e){let l=new Blob([o],{type:e}),d=URL.createObjectURL(l),n=document.createElement("a");n.href=d,n.download=t,n.target="_blank",n.rel="noopener",n.style.display="none",document.body.appendChild(n),n.dispatchEvent(new MouseEvent("click")),document.body.removeChild(n),setTimeout(()=>URL.revokeObjectURL(d),6e4)}function r(o,t){let e=document.createElement("a");e.href=o,e.download=t,e.target="_blank",e.rel="noopener",e.style.display="none",document.body.appendChild(e),e.dispatchEvent(new MouseEvent("click")),document.body.removeChild(e)}export{c as a,r as b};
|
||||
@@ -1,79 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.82.0 */
|
||||
import{a as r,b as l,c as i,f as o,h as n,l as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-4OPY4VQ5.js";var e=class extends n{constructor(){super(...arguments);this.label="";this.value="";this.placeholder="";this.type="text";this.required=!1;this.disabled=!1;this.multiline=!1;this.rows=3}_onInput(s){let a=s.target.value;this.value=a,this.dispatchEvent(new CustomEvent("input",{bubbles:!0,composed:!0,detail:{value:a}}))}render(){return i`
|
||||
<label class="field">
|
||||
${this.label?i`<span class="label">${this.label}${this.required?i`<span class="req">*</span>`:o}</span>`:o}
|
||||
${this.multiline?i`
|
||||
<textarea
|
||||
.value=${this.value??""}
|
||||
rows=${this.rows}
|
||||
?required=${this.required}
|
||||
?disabled=${this.disabled}
|
||||
placeholder=${this.placeholder}
|
||||
@input=${this._onInput}
|
||||
@change=${this._onInput}
|
||||
></textarea>`:i`
|
||||
<input
|
||||
.value=${this.value??""}
|
||||
.type=${this.type}
|
||||
?required=${this.required}
|
||||
?disabled=${this.disabled}
|
||||
placeholder=${this.placeholder}
|
||||
step=${this.step??o}
|
||||
min=${this.min??o}
|
||||
max=${this.max??o}
|
||||
pattern=${this.pattern??o}
|
||||
@input=${this._onInput}
|
||||
@change=${this._onInput}
|
||||
/>`}
|
||||
${this.helper?i`<span class="helper">${this.helper}</span>`:o}
|
||||
</label>
|
||||
`}};e.styles=l`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
input {
|
||||
padding: 8px 10px;
|
||||
font-size: 14px;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color, rgba(255,255,255,0.12));
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
outline: none;
|
||||
}
|
||||
input:focus {
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
input:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
textarea {
|
||||
padding: 8px 10px;
|
||||
font-size: 14px;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color, rgba(255,255,255,0.12));
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
outline: none;
|
||||
resize: vertical;
|
||||
}
|
||||
textarea:focus { border-color: var(--primary-color); }
|
||||
textarea:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
`,r([t()],e.prototype,"label",2),r([t()],e.prototype,"value",2),r([t()],e.prototype,"placeholder",2),r([t()],e.prototype,"type",2),r([t({type:Boolean})],e.prototype,"required",2),r([t({type:Boolean})],e.prototype,"disabled",2),r([t()],e.prototype,"step",2),r([t()],e.prototype,"min",2),r([t()],e.prototype,"max",2),r([t()],e.prototype,"pattern",2),r([t()],e.prototype,"helper",2),r([t({type:Boolean})],e.prototype,"multiline",2),r([t({type:Number})],e.prototype,"rows",2);customElements.get("ms-textfield")||customElements.define("ms-textfield",e);
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,2 +0,0 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
var l=[{key:"name",labelKey:"name",required:!0},{key:"ref_no",labelKey:"ref_number"},{key:"manufacturer",labelKey:"manufacturer"},{key:"model",labelKey:"model"},{key:"serial_number",labelKey:"serial_number_label"},{key:"installation_date",labelKey:"installed"},{key:"warranty_expiry",labelKey:"warranty"},{key:"area_id",labelKey:"area"},{key:"documentation_url",labelKey:"documentation_url_label"},{key:"notes",labelKey:"object_notes_label"},{key:"task_count",labelKey:"tasks"},{key:"actions",labelKey:"actions"}],i=l.map(a=>a.key),r=["name","manufacturer","model","serial_number","installation_date","warranty_expiry","area_id","task_count","actions"];function o(a){if(!Array.isArray(a))return[...r];let t=new Set,e=[];for(let n of a)typeof n=="string"&&i.includes(n)&&!t.has(n)&&(t.add(n),e.push(n));return e.length?(e.includes("name")||e.unshift("name"),e):[...r]}export{l as a,r as b,o as c};
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as x}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-D52RXZ4R.js";import{a,b as v,c as n,f as p,h as b,l as h,m as c,q as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";function d(l){return l.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function f(l){return!l.startsWith("data:image/svg+xml,")&&!l.startsWith("data:image/png;base64,")?"":d(l)}function q(l){return l.replace(/[/\\:*?"<>|#%]+/g,"").replace(/\s+/g,"-").toLowerCase().substring(0,100)}var o=class extends b{constructor(){super(...arguments);this.lang="en";this._open=!1;this._loading=!1;this._error="";this._viewResult=null;this._completeResult=null;this._urlMode="companion";this._entryId="";this._taskId=null;this._objectName="";this._taskName="";this._generateSeq=0}openForObject(e,i){this._entryId=e,this._taskId=null,this._objectName=i,this._taskName="",this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}openForTask(e,i,r,s){this._entryId=e,this._taskId=i,this._objectName=r,this._taskName=s,this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}async _generate(){let e=++this._generateSeq;this._loading=!0,this._error="",this._viewResult=null,this._completeResult=null;try{let i={type:"maintenance_supporter/qr/generate",entry_id:this._entryId,url_mode:this._urlMode};this._taskId&&(i.task_id=this._taskId);let r=[this.hass.connection.sendMessagePromise({...i,action:"view"})];this._taskId&&r.push(this.hass.connection.sendMessagePromise({...i,action:"complete"}));let s=await Promise.all(r);if(e!==this._generateSeq)return;this._viewResult=s[0],s.length>1&&(this._completeResult=s[1])}catch(i){if(e!==this._generateSeq)return;let r=i?.code,s=i?.message;this._error=r==="no_url"||typeof s=="string"&&s.includes("No Home Assistant URL")?t("qr_error_no_url",this.lang):t("qr_error",this.lang)}finally{e===this._generateSeq&&(this._loading=!1)}}_setUrlMode(e){this._urlMode!==e&&(this._urlMode=e,this._generate())}_print(){if(!this._viewResult)return;let e=this._viewResult,i=e.label.task_name?`${e.label.object_name} \u2014 ${e.label.task_name}`:e.label.object_name,r=[e.label.manufacturer,e.label.model].filter(Boolean).join(" "),s=window.open("","_blank","width=600,height=500");if(!s)return;let g=this.lang||"en",u=d(i),m=d(r),_=!!this._completeResult,w=d(t("qr_action_view",g)),$=d(t("qr_action_complete",g));s.document.write(`<!DOCTYPE html><html><head><meta charset="utf-8">
|
||||
/*! maintenance_supporter frontend 2.88.0 */
|
||||
import{a as x}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-3UVOHVFS.js";import{a,b as v,c as n,f as p,h as b,l as h,m as c,q as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-OXPKT66L.js";function d(l){return l.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function f(l){return!l.startsWith("data:image/svg+xml,")&&!l.startsWith("data:image/png;base64,")?"":d(l)}function q(l){return l.replace(/[/\\:*?"<>|#%]+/g,"").replace(/\s+/g,"-").toLowerCase().substring(0,100)}var o=class extends b{constructor(){super(...arguments);this.lang="en";this._open=!1;this._loading=!1;this._error="";this._viewResult=null;this._completeResult=null;this._urlMode="companion";this._entryId="";this._taskId=null;this._objectName="";this._taskName="";this._generateSeq=0}openForObject(e,i){this._entryId=e,this._taskId=null,this._objectName=i,this._taskName="",this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}openForTask(e,i,r,s){this._entryId=e,this._taskId=i,this._objectName=r,this._taskName=s,this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}async _generate(){let e=++this._generateSeq;this._loading=!0,this._error="",this._viewResult=null,this._completeResult=null;try{let i={type:"maintenance_supporter/qr/generate",entry_id:this._entryId,url_mode:this._urlMode};this._taskId&&(i.task_id=this._taskId);let r=[this.hass.connection.sendMessagePromise({...i,action:"view"})];this._taskId&&r.push(this.hass.connection.sendMessagePromise({...i,action:"complete"}));let s=await Promise.all(r);if(e!==this._generateSeq)return;this._viewResult=s[0],s.length>1&&(this._completeResult=s[1])}catch(i){if(e!==this._generateSeq)return;let r=i?.code,s=i?.message;this._error=r==="no_url"||typeof s=="string"&&s.includes("No Home Assistant URL")?t("qr_error_no_url",this.lang):t("qr_error",this.lang)}finally{e===this._generateSeq&&(this._loading=!1)}}_setUrlMode(e){this._urlMode!==e&&(this._urlMode=e,this._generate())}_print(){if(!this._viewResult)return;let e=this._viewResult,i=e.label.task_name?`${e.label.object_name} \u2014 ${e.label.task_name}`:e.label.object_name,r=[e.label.manufacturer,e.label.model].filter(Boolean).join(" "),s=window.open("","_blank","width=600,height=500");if(!s)return;let g=this.lang||"en",u=d(i),m=d(r),_=!!this._completeResult,w=d(t("qr_action_view",g)),$=d(t("qr_action_complete",g));s.document.write(`<!DOCTYPE html><html><head><meta charset="utf-8">
|
||||
<meta name="color-scheme" content="light">
|
||||
<title>${u}</title>
|
||||
<style>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user