mirror of
https://github.com/home-assistant/frontend.git
synced 2025-10-16 07:09:38 +00:00
Compare commits
13 Commits
cursor/ena
...
copilot/ad
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1ab3b155d6 | ||
![]() |
72fe6f1e94 | ||
![]() |
faf6cb6333 | ||
![]() |
a2e1e6362b | ||
![]() |
3212ab6f3b | ||
![]() |
3d27daad80 | ||
![]() |
b679f1ce60 | ||
![]() |
6b0a5d783b | ||
![]() |
23e2f94d11 | ||
![]() |
c250777858 | ||
![]() |
c35d0da9bd | ||
![]() |
794aa45a2b | ||
![]() |
d0b85d0c0b |
6
.github/workflows/codeql-analysis.yml
vendored
6
.github/workflows/codeql-analysis.yml
vendored
@@ -36,14 +36,14 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.30.6
|
uses: github/codeql-action/init@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v4.30.8
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.30.6
|
uses: github/codeql-action/autobuild@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v4.30.8
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 https://git.io/JvXDl
|
# 📚 https://git.io/JvXDl
|
||||||
@@ -57,4 +57,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.30.6
|
uses: github/codeql-action/analyze@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v4.30.8
|
||||||
|
6
.github/workflows/release.yaml
vendored
6
.github/workflows/release.yaml
vendored
@@ -55,7 +55,7 @@ jobs:
|
|||||||
script/release
|
script/release
|
||||||
|
|
||||||
- name: Upload release assets
|
- name: Upload release assets
|
||||||
uses: softprops/action-gh-release@62c96d0c4e8a889135c1f3a25910db8dbe0e85f7 # v2.3.4
|
uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
dist/*.whl
|
dist/*.whl
|
||||||
@@ -108,7 +108,7 @@ jobs:
|
|||||||
- name: Tar folder
|
- name: Tar folder
|
||||||
run: tar -czf landing-page/home_assistant_frontend_landingpage-${{ github.event.release.tag_name }}.tar.gz -C landing-page/dist .
|
run: tar -czf landing-page/home_assistant_frontend_landingpage-${{ github.event.release.tag_name }}.tar.gz -C landing-page/dist .
|
||||||
- name: Upload release asset
|
- name: Upload release asset
|
||||||
uses: softprops/action-gh-release@62c96d0c4e8a889135c1f3a25910db8dbe0e85f7 # v2.3.4
|
uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1
|
||||||
with:
|
with:
|
||||||
files: landing-page/home_assistant_frontend_landingpage-${{ github.event.release.tag_name }}.tar.gz
|
files: landing-page/home_assistant_frontend_landingpage-${{ github.event.release.tag_name }}.tar.gz
|
||||||
|
|
||||||
@@ -137,6 +137,6 @@ jobs:
|
|||||||
- name: Tar folder
|
- name: Tar folder
|
||||||
run: tar -czf hassio/home_assistant_frontend_supervisor-${{ github.event.release.tag_name }}.tar.gz -C hassio/build .
|
run: tar -czf hassio/home_assistant_frontend_supervisor-${{ github.event.release.tag_name }}.tar.gz -C hassio/build .
|
||||||
- name: Upload release asset
|
- name: Upload release asset
|
||||||
uses: softprops/action-gh-release@62c96d0c4e8a889135c1f3a25910db8dbe0e85f7 # v2.3.4
|
uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1
|
||||||
with:
|
with:
|
||||||
files: hassio/home_assistant_frontend_supervisor-${{ github.event.release.tag_name }}.tar.gz
|
files: hassio/home_assistant_frontend_supervisor-${{ github.event.release.tag_name }}.tar.gz
|
||||||
|
@@ -83,17 +83,19 @@ class HassioIngressView extends LitElement {
|
|||||||
</hass-subpage>`;
|
</hass-subpage>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return html`${this.narrow || this.hass.dockedSidebar === "always_hidden"
|
return html`${this._addon.webui_ha_aware
|
||||||
? html`<div class="header">
|
? iframe
|
||||||
<ha-icon-button
|
: this.narrow || this.hass.dockedSidebar === "always_hidden"
|
||||||
.label=${this.hass.localize("ui.sidebar.sidebar_toggle")}
|
? html`<div class="header">
|
||||||
.path=${mdiMenu}
|
<ha-icon-button
|
||||||
@click=${this._toggleMenu}
|
.label=${this.hass.localize("ui.sidebar.sidebar_toggle")}
|
||||||
></ha-icon-button>
|
.path=${mdiMenu}
|
||||||
<div class="main-title">${this._addon.name}</div>
|
@click=${this._toggleMenu}
|
||||||
</div>
|
></ha-icon-button>
|
||||||
${iframe}`
|
<div class="main-title">${this._addon.name}</div>
|
||||||
: iframe}`;
|
</div>
|
||||||
|
${iframe}`
|
||||||
|
: iframe}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async firstUpdated(): Promise<void> {
|
protected async firstUpdated(): Promise<void> {
|
||||||
|
22
package.json
22
package.json
@@ -37,15 +37,15 @@
|
|||||||
"@codemirror/view": "6.38.5",
|
"@codemirror/view": "6.38.5",
|
||||||
"@date-fns/tz": "1.4.1",
|
"@date-fns/tz": "1.4.1",
|
||||||
"@egjs/hammerjs": "2.0.17",
|
"@egjs/hammerjs": "2.0.17",
|
||||||
"@formatjs/intl-datetimeformat": "6.18.1",
|
"@formatjs/intl-datetimeformat": "6.18.2",
|
||||||
"@formatjs/intl-displaynames": "6.8.12",
|
"@formatjs/intl-displaynames": "6.8.13",
|
||||||
"@formatjs/intl-durationformat": "0.7.5",
|
"@formatjs/intl-durationformat": "0.7.6",
|
||||||
"@formatjs/intl-getcanonicallocales": "2.5.6",
|
"@formatjs/intl-getcanonicallocales": "2.5.6",
|
||||||
"@formatjs/intl-listformat": "7.7.12",
|
"@formatjs/intl-listformat": "7.7.13",
|
||||||
"@formatjs/intl-locale": "4.2.12",
|
"@formatjs/intl-locale": "4.2.13",
|
||||||
"@formatjs/intl-numberformat": "8.15.5",
|
"@formatjs/intl-numberformat": "8.15.6",
|
||||||
"@formatjs/intl-pluralrules": "5.4.5",
|
"@formatjs/intl-pluralrules": "5.4.6",
|
||||||
"@formatjs/intl-relativetimeformat": "11.4.12",
|
"@formatjs/intl-relativetimeformat": "11.4.13",
|
||||||
"@fullcalendar/core": "6.1.19",
|
"@fullcalendar/core": "6.1.19",
|
||||||
"@fullcalendar/daygrid": "6.1.19",
|
"@fullcalendar/daygrid": "6.1.19",
|
||||||
"@fullcalendar/interaction": "6.1.19",
|
"@fullcalendar/interaction": "6.1.19",
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
"barcode-detector": "3.0.6",
|
"barcode-detector": "3.0.6",
|
||||||
"color-name": "2.0.2",
|
"color-name": "2.0.2",
|
||||||
"comlink": "4.4.2",
|
"comlink": "4.4.2",
|
||||||
"core-js": "3.45.1",
|
"core-js": "3.46.0",
|
||||||
"cropperjs": "1.6.2",
|
"cropperjs": "1.6.2",
|
||||||
"culori": "4.0.2",
|
"culori": "4.0.2",
|
||||||
"date-fns": "4.1.0",
|
"date-fns": "4.1.0",
|
||||||
@@ -114,7 +114,7 @@
|
|||||||
"hls.js": "1.6.13",
|
"hls.js": "1.6.13",
|
||||||
"home-assistant-js-websocket": "9.5.0",
|
"home-assistant-js-websocket": "9.5.0",
|
||||||
"idb-keyval": "6.2.2",
|
"idb-keyval": "6.2.2",
|
||||||
"intl-messageformat": "10.7.17",
|
"intl-messageformat": "10.7.18",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"leaflet": "1.9.4",
|
"leaflet": "1.9.4",
|
||||||
"leaflet-draw": "patch:leaflet-draw@npm%3A1.0.4#./.yarn/patches/leaflet-draw-npm-1.0.4-0ca0ebcf65.patch",
|
"leaflet-draw": "patch:leaflet-draw@npm%3A1.0.4#./.yarn/patches/leaflet-draw-npm-1.0.4-0ca0ebcf65.patch",
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
"stacktrace-js": "2.0.2",
|
"stacktrace-js": "2.0.2",
|
||||||
"superstruct": "2.0.2",
|
"superstruct": "2.0.2",
|
||||||
"tinykeys": "3.0.0",
|
"tinykeys": "3.0.0",
|
||||||
"ua-parser-js": "2.0.5",
|
"ua-parser-js": "2.0.6",
|
||||||
"vue": "2.7.16",
|
"vue": "2.7.16",
|
||||||
"vue2-daterange-picker": "0.6.8",
|
"vue2-daterange-picker": "0.6.8",
|
||||||
"weekstart": "2.0.0",
|
"weekstart": "2.0.0",
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { mdiPlus } from "@mdi/js";
|
import { mdiPlayBox, mdiPlus } from "@mdi/js";
|
||||||
import type { PropertyValues } from "lit";
|
import type { PropertyValues } from "lit";
|
||||||
import { css, html, LitElement, nothing } from "lit";
|
import { css, html, LitElement, nothing } from "lit";
|
||||||
import { customElement, property, state } from "lit/decorators";
|
import { customElement, property, state } from "lit/decorators";
|
||||||
@@ -7,7 +7,10 @@ import { fireEvent } from "../../common/dom/fire_event";
|
|||||||
import { supportsFeature } from "../../common/entity/supports-feature";
|
import { supportsFeature } from "../../common/entity/supports-feature";
|
||||||
import { getSignedPath } from "../../data/auth";
|
import { getSignedPath } from "../../data/auth";
|
||||||
import type { MediaPickedEvent } from "../../data/media-player";
|
import type { MediaPickedEvent } from "../../data/media-player";
|
||||||
import { MediaPlayerEntityFeature } from "../../data/media-player";
|
import {
|
||||||
|
MediaClassBrowserSettings,
|
||||||
|
MediaPlayerEntityFeature,
|
||||||
|
} from "../../data/media-player";
|
||||||
import type { MediaSelector, MediaSelectorValue } from "../../data/selector";
|
import type { MediaSelector, MediaSelectorValue } from "../../data/selector";
|
||||||
import type { HomeAssistant } from "../../types";
|
import type { HomeAssistant } from "../../types";
|
||||||
import { brandsUrl, extractDomainFromBrandUrl } from "../../util/brands-url";
|
import { brandsUrl, extractDomainFromBrandUrl } from "../../util/brands-url";
|
||||||
@@ -17,8 +20,6 @@ import type { SchemaUnion } from "../ha-form/types";
|
|||||||
import { showMediaBrowserDialog } from "../media-player/show-media-browser-dialog";
|
import { showMediaBrowserDialog } from "../media-player/show-media-browser-dialog";
|
||||||
import { ensureArray } from "../../common/array/ensure-array";
|
import { ensureArray } from "../../common/array/ensure-array";
|
||||||
import "../ha-picture-upload";
|
import "../ha-picture-upload";
|
||||||
import "../chips/ha-chip-set";
|
|
||||||
import "../chips/ha-input-chip";
|
|
||||||
|
|
||||||
const MANUAL_SCHEMA = [
|
const MANUAL_SCHEMA = [
|
||||||
{ name: "media_content_id", required: false, selector: { text: {} } },
|
{ name: "media_content_id", required: false, selector: { text: {} } },
|
||||||
@@ -35,8 +36,7 @@ export class HaMediaSelector extends LitElement {
|
|||||||
|
|
||||||
@property({ attribute: false }) public selector!: MediaSelector;
|
@property({ attribute: false }) public selector!: MediaSelector;
|
||||||
|
|
||||||
@property({ attribute: false })
|
@property({ attribute: false }) public value?: MediaSelectorValue;
|
||||||
public value?: MediaSelectorValue | MediaSelectorValue[];
|
|
||||||
|
|
||||||
@property() public label?: string;
|
@property() public label?: string;
|
||||||
|
|
||||||
@@ -52,9 +52,6 @@ export class HaMediaSelector extends LitElement {
|
|||||||
|
|
||||||
@state() private _thumbnailUrl?: string | null;
|
@state() private _thumbnailUrl?: string | null;
|
||||||
|
|
||||||
// For multiple selection mode, cache signed/rewritten URLs per thumbnail string
|
|
||||||
@state() private _thumbnailUrlMap: Record<string, string | null> = {};
|
|
||||||
|
|
||||||
private _contextEntities: string[] | undefined;
|
private _contextEntities: string[] | undefined;
|
||||||
|
|
||||||
private get _hasAccept(): boolean {
|
private get _hasAccept(): boolean {
|
||||||
@@ -62,15 +59,6 @@ export class HaMediaSelector extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
willUpdate(changedProps: PropertyValues<this>) {
|
willUpdate(changedProps: PropertyValues<this>) {
|
||||||
if (changedProps.has("selector") && this.value !== undefined) {
|
|
||||||
if (this.selector.media?.multiple && !Array.isArray(this.value)) {
|
|
||||||
this.value = [this.value];
|
|
||||||
fireEvent(this, "value-changed", { value: this.value });
|
|
||||||
} else if (!this.selector.media?.multiple && Array.isArray(this.value)) {
|
|
||||||
this.value = this.value[0];
|
|
||||||
fireEvent(this, "value-changed", { value: this.value });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (changedProps.has("context")) {
|
if (changedProps.has("context")) {
|
||||||
if (!this._hasAccept) {
|
if (!this._hasAccept) {
|
||||||
this._contextEntities = ensureArray(this.context?.filter_entity);
|
this._contextEntities = ensureArray(this.context?.filter_entity);
|
||||||
@@ -78,91 +66,32 @@ export class HaMediaSelector extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (changedProps.has("value")) {
|
if (changedProps.has("value")) {
|
||||||
if (this.selector.media?.multiple) {
|
const thumbnail = this.value?.metadata?.thumbnail;
|
||||||
const values = Array.isArray(this.value)
|
const oldThumbnail = (changedProps.get("value") as this["value"])
|
||||||
? this.value
|
?.metadata?.thumbnail;
|
||||||
: this.value
|
if (thumbnail === oldThumbnail) {
|
||||||
? [this.value]
|
return;
|
||||||
: [];
|
}
|
||||||
const seenThumbs = new Set<string>();
|
if (thumbnail && thumbnail.startsWith("/")) {
|
||||||
values.forEach((val) => {
|
this._thumbnailUrl = undefined;
|
||||||
const thumbnail = val.metadata?.thumbnail;
|
// Thumbnails served by local API require authentication
|
||||||
if (!thumbnail) {
|
getSignedPath(this.hass, thumbnail).then((signedPath) => {
|
||||||
return;
|
this._thumbnailUrl = signedPath.path;
|
||||||
}
|
|
||||||
seenThumbs.add(thumbnail);
|
|
||||||
// Only (re)compute if not cached yet
|
|
||||||
if (this._thumbnailUrlMap[thumbnail] !== undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (thumbnail.startsWith("/")) {
|
|
||||||
this._thumbnailUrlMap = {
|
|
||||||
...this._thumbnailUrlMap,
|
|
||||||
[thumbnail]: null,
|
|
||||||
};
|
|
||||||
getSignedPath(this.hass, thumbnail).then((signedPath) => {
|
|
||||||
// Avoid losing other keys
|
|
||||||
this._thumbnailUrlMap = {
|
|
||||||
...this._thumbnailUrlMap,
|
|
||||||
[thumbnail]: signedPath.path,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
} else if (thumbnail.startsWith("https://brands.home-assistant.io")) {
|
|
||||||
this._thumbnailUrlMap = {
|
|
||||||
...this._thumbnailUrlMap,
|
|
||||||
[thumbnail]: brandsUrl({
|
|
||||||
domain: extractDomainFromBrandUrl(thumbnail),
|
|
||||||
type: "icon",
|
|
||||||
useFallback: true,
|
|
||||||
darkOptimized: this.hass.themes?.darkMode,
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
this._thumbnailUrlMap = {
|
|
||||||
...this._thumbnailUrlMap,
|
|
||||||
[thumbnail]: thumbnail,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
// Clean up thumbnails no longer present
|
} else if (
|
||||||
const newMap: Record<string, string | null> = {};
|
thumbnail &&
|
||||||
Object.keys(this._thumbnailUrlMap).forEach((key) => {
|
thumbnail.startsWith("https://brands.home-assistant.io")
|
||||||
if (seenThumbs.has(key)) {
|
) {
|
||||||
newMap[key] = this._thumbnailUrlMap[key];
|
// The backend is not aware of the theme used by the users,
|
||||||
}
|
// so we rewrite the URL to show a proper icon
|
||||||
|
this._thumbnailUrl = brandsUrl({
|
||||||
|
domain: extractDomainFromBrandUrl(thumbnail),
|
||||||
|
type: "icon",
|
||||||
|
useFallback: true,
|
||||||
|
darkOptimized: this.hass.themes?.darkMode,
|
||||||
});
|
});
|
||||||
this._thumbnailUrlMap = newMap;
|
|
||||||
} else {
|
} else {
|
||||||
const currVal = Array.isArray(this.value) ? this.value[0] : this.value;
|
this._thumbnailUrl = thumbnail;
|
||||||
const prevVal = Array.isArray(changedProps.get("value") as any)
|
|
||||||
? (changedProps.get("value") as MediaSelectorValue[])[0]
|
|
||||||
: (changedProps.get("value") as MediaSelectorValue);
|
|
||||||
const thumbnail = currVal?.metadata?.thumbnail;
|
|
||||||
const oldThumbnail = prevVal?.metadata?.thumbnail;
|
|
||||||
if (thumbnail === oldThumbnail) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (thumbnail && thumbnail.startsWith("/")) {
|
|
||||||
this._thumbnailUrl = undefined;
|
|
||||||
// Thumbnails served by local API require authentication
|
|
||||||
getSignedPath(this.hass, thumbnail).then((signedPath) => {
|
|
||||||
this._thumbnailUrl = signedPath.path;
|
|
||||||
});
|
|
||||||
} else if (
|
|
||||||
thumbnail &&
|
|
||||||
thumbnail.startsWith("https://brands.home-assistant.io")
|
|
||||||
) {
|
|
||||||
// The backend is not aware of the theme used by the users,
|
|
||||||
// so we rewrite the URL to show a proper icon
|
|
||||||
this._thumbnailUrl = brandsUrl({
|
|
||||||
domain: extractDomainFromBrandUrl(thumbnail),
|
|
||||||
type: "icon",
|
|
||||||
useFallback: true,
|
|
||||||
darkOptimized: this.hass.themes?.darkMode,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._thumbnailUrl = thumbnail ?? undefined;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -177,12 +106,7 @@ export class HaMediaSelector extends LitElement {
|
|||||||
(stateObj &&
|
(stateObj &&
|
||||||
supportsFeature(stateObj, MediaPlayerEntityFeature.BROWSE_MEDIA));
|
supportsFeature(stateObj, MediaPlayerEntityFeature.BROWSE_MEDIA));
|
||||||
|
|
||||||
const isMultiple = this.selector.media?.multiple === true;
|
if (this.selector.media?.image_upload && !this.value) {
|
||||||
|
|
||||||
if (
|
|
||||||
this.selector.media?.image_upload &&
|
|
||||||
(!this.value || (Array.isArray(this.value) && this.value.length === 0))
|
|
||||||
) {
|
|
||||||
return html`<ha-picture-upload
|
return html`<ha-picture-upload
|
||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
.value=${null}
|
.value=${null}
|
||||||
@@ -224,47 +148,19 @@ export class HaMediaSelector extends LitElement {
|
|||||||
</ha-alert>
|
</ha-alert>
|
||||||
<ha-form
|
<ha-form
|
||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
.data=${Array.isArray(this.value)
|
.data=${this.value || EMPTY_FORM}
|
||||||
? this.value[0]
|
|
||||||
: this.value || EMPTY_FORM}
|
|
||||||
.schema=${MANUAL_SCHEMA}
|
.schema=${MANUAL_SCHEMA}
|
||||||
.computeLabel=${this._computeLabelCallback}
|
.computeLabel=${this._computeLabelCallback}
|
||||||
.computeHelper=${this._computeHelperCallback}
|
.computeHelper=${this._computeHelperCallback}
|
||||||
></ha-form>
|
></ha-form>
|
||||||
`
|
`
|
||||||
: html`
|
: html`<ha-card
|
||||||
${isMultiple && Array.isArray(this.value) && this.value.length
|
|
||||||
? html`
|
|
||||||
<ha-chip-set>
|
|
||||||
${this.value.map(
|
|
||||||
(item, idx) => html`
|
|
||||||
<ha-input-chip
|
|
||||||
selected
|
|
||||||
.idx=${idx}
|
|
||||||
@remove=${this._removeItem}
|
|
||||||
>${item.metadata?.title ||
|
|
||||||
item.media_content_id}</ha-input-chip
|
|
||||||
>
|
|
||||||
`
|
|
||||||
)}
|
|
||||||
</ha-chip-set>
|
|
||||||
`
|
|
||||||
: nothing}
|
|
||||||
|
|
||||||
<ha-card
|
|
||||||
outlined
|
outlined
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
role="button"
|
role="button"
|
||||||
aria-label=${(() => {
|
aria-label=${!this.value?.media_content_id
|
||||||
const currVal = Array.isArray(this.value)
|
? this.hass.localize("ui.components.selectors.media.pick_media")
|
||||||
? this.value[this.value.length - 1]
|
: this.value.metadata?.title || this.value.media_content_id}
|
||||||
: this.value;
|
|
||||||
return !currVal?.media_content_id
|
|
||||||
? this.hass.localize(
|
|
||||||
"ui.components.selectors.media.pick_media"
|
|
||||||
)
|
|
||||||
: currVal.metadata?.title || currVal.media_content_id;
|
|
||||||
})()}
|
|
||||||
@click=${this._pickMedia}
|
@click=${this._pickMedia}
|
||||||
@keydown=${this._handleKeyDown}
|
@keydown=${this._handleKeyDown}
|
||||||
class=${this.disabled || (!entityId && !this._hasAccept)
|
class=${this.disabled || (!entityId && !this._hasAccept)
|
||||||
@@ -273,22 +169,14 @@ export class HaMediaSelector extends LitElement {
|
|||||||
>
|
>
|
||||||
<div class="content-container">
|
<div class="content-container">
|
||||||
<div class="thumbnail">
|
<div class="thumbnail">
|
||||||
${!isMultiple &&
|
${this.value?.metadata?.thumbnail
|
||||||
(Array.isArray(this.value) ? this.value[0] : this.value)
|
|
||||||
?.metadata?.thumbnail
|
|
||||||
? html`
|
? html`
|
||||||
<div
|
<div
|
||||||
class="${classMap({
|
class="${classMap({
|
||||||
"centered-image":
|
"centered-image":
|
||||||
!!(
|
!!this.value.metadata.media_class &&
|
||||||
Array.isArray(this.value)
|
|
||||||
? this.value[0]
|
|
||||||
: this.value
|
|
||||||
)!.metadata!.media_class &&
|
|
||||||
["app", "directory"].includes(
|
["app", "directory"].includes(
|
||||||
(Array.isArray(this.value)
|
this.value.metadata.media_class
|
||||||
? this.value[0]
|
|
||||||
: this.value)!.metadata!.media_class!
|
|
||||||
),
|
),
|
||||||
})}
|
})}
|
||||||
image"
|
image"
|
||||||
@@ -301,27 +189,32 @@ export class HaMediaSelector extends LitElement {
|
|||||||
<div class="icon-holder image">
|
<div class="icon-holder image">
|
||||||
<ha-svg-icon
|
<ha-svg-icon
|
||||||
class="folder"
|
class="folder"
|
||||||
.path=${mdiPlus}
|
.path=${!this.value?.media_content_id
|
||||||
|
? mdiPlus
|
||||||
|
: this.value?.metadata?.media_class
|
||||||
|
? MediaClassBrowserSettings[
|
||||||
|
this.value.metadata.media_class ===
|
||||||
|
"directory"
|
||||||
|
? this.value.metadata
|
||||||
|
.children_media_class ||
|
||||||
|
this.value.metadata.media_class
|
||||||
|
: this.value.metadata.media_class
|
||||||
|
].icon
|
||||||
|
: mdiPlayBox}
|
||||||
></ha-svg-icon>
|
></ha-svg-icon>
|
||||||
</div>
|
</div>
|
||||||
`}
|
`}
|
||||||
</div>
|
</div>
|
||||||
<div class="title">
|
<div class="title">
|
||||||
${(() => {
|
${!this.value?.media_content_id
|
||||||
const currVal = Array.isArray(this.value)
|
? this.hass.localize(
|
||||||
? this.value[this.value.length - 1]
|
"ui.components.selectors.media.pick_media"
|
||||||
: this.value;
|
)
|
||||||
return !currVal?.media_content_id
|
: this.value.metadata?.title || this.value.media_content_id}
|
||||||
? this.hass.localize(
|
|
||||||
"ui.components.selectors.media.pick_media"
|
|
||||||
)
|
|
||||||
: currVal.metadata?.title || currVal.media_content_id;
|
|
||||||
})()}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</ha-card>
|
</ha-card>
|
||||||
${this.selector.media?.clearable &&
|
${this.selector.media?.clearable
|
||||||
(Array.isArray(this.value) ? this.value.length : this.value)
|
|
||||||
? html`<div>
|
? html`<div>
|
||||||
<ha-button
|
<ha-button
|
||||||
appearance="plain"
|
appearance="plain"
|
||||||
@@ -334,8 +227,7 @@ export class HaMediaSelector extends LitElement {
|
|||||||
)}
|
)}
|
||||||
</ha-button>
|
</ha-button>
|
||||||
</div>`
|
</div>`
|
||||||
: nothing}
|
: nothing}`}
|
||||||
`}
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -376,61 +268,41 @@ export class HaMediaSelector extends LitElement {
|
|||||||
showMediaBrowserDialog(this, {
|
showMediaBrowserDialog(this, {
|
||||||
action: "pick",
|
action: "pick",
|
||||||
entityId: this._getActiveEntityId(),
|
entityId: this._getActiveEntityId(),
|
||||||
navigateIds: (Array.isArray(this.value)
|
navigateIds: this.value?.metadata?.navigateIds,
|
||||||
? this.value[this.value.length - 1]
|
|
||||||
: this.value
|
|
||||||
)?.metadata?.navigateIds,
|
|
||||||
accept: this.selector.media?.accept,
|
accept: this.selector.media?.accept,
|
||||||
defaultId: Array.isArray(this.value)
|
defaultId: this.value?.media_content_id,
|
||||||
? this.value[this.value.length - 1]?.media_content_id
|
defaultType: this.value?.media_content_type,
|
||||||
: this.value?.media_content_id,
|
|
||||||
defaultType: Array.isArray(this.value)
|
|
||||||
? this.value[this.value.length - 1]?.media_content_type
|
|
||||||
: this.value?.media_content_type,
|
|
||||||
hideContentType: this.selector.media?.hide_content_type,
|
hideContentType: this.selector.media?.hide_content_type,
|
||||||
contentIdHelper: this.selector.media?.content_id_helper,
|
contentIdHelper: this.selector.media?.content_id_helper,
|
||||||
mediaPickedCallback: (pickedMedia: MediaPickedEvent) => {
|
mediaPickedCallback: (pickedMedia: MediaPickedEvent) => {
|
||||||
const newItem: MediaSelectorValue = {
|
fireEvent(this, "value-changed", {
|
||||||
...(Array.isArray(this.value) ? {} : (this.value as any)),
|
value: {
|
||||||
media_content_id: pickedMedia.item.media_content_id,
|
...this.value,
|
||||||
media_content_type: pickedMedia.item.media_content_type,
|
media_content_id: pickedMedia.item.media_content_id,
|
||||||
metadata: {
|
media_content_type: pickedMedia.item.media_content_type,
|
||||||
title: pickedMedia.item.title,
|
metadata: {
|
||||||
thumbnail: pickedMedia.item.thumbnail,
|
title: pickedMedia.item.title,
|
||||||
media_class: pickedMedia.item.media_class,
|
thumbnail: pickedMedia.item.thumbnail,
|
||||||
children_media_class: pickedMedia.item.children_media_class,
|
media_class: pickedMedia.item.media_class,
|
||||||
navigateIds: pickedMedia.navigateIds?.map((id) => ({
|
children_media_class: pickedMedia.item.children_media_class,
|
||||||
media_content_type: id.media_content_type,
|
navigateIds: pickedMedia.navigateIds?.map((id) => ({
|
||||||
media_content_id: id.media_content_id,
|
media_content_type: id.media_content_type,
|
||||||
})),
|
media_content_id: id.media_content_id,
|
||||||
...(!this._hasAccept && this.context?.filter_entity
|
})),
|
||||||
? { browse_entity_id: this._getActiveEntityId() }
|
...(!this._hasAccept && this.context?.filter_entity
|
||||||
: {}),
|
? { browse_entity_id: this._getActiveEntityId() }
|
||||||
|
: {}),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
});
|
||||||
if (this.selector.media?.multiple) {
|
|
||||||
const current = Array.isArray(this.value)
|
|
||||||
? this.value
|
|
||||||
: this.value
|
|
||||||
? [this.value]
|
|
||||||
: [];
|
|
||||||
fireEvent(this, "value-changed", {
|
|
||||||
value: [...current, newItem],
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
fireEvent(this, "value-changed", { value: newItem });
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private _getActiveEntityId(): string | undefined {
|
private _getActiveEntityId(): string | undefined {
|
||||||
const val = Array.isArray(this.value)
|
const metaId = this.value?.metadata?.browse_entity_id;
|
||||||
? this.value[this.value.length - 1]
|
|
||||||
: this.value;
|
|
||||||
const metaId = val?.metadata?.browse_entity_id;
|
|
||||||
return (
|
return (
|
||||||
val?.entity_id ||
|
this.value?.entity_id ||
|
||||||
(metaId && this._contextEntities?.includes(metaId) && metaId) ||
|
(metaId && this._contextEntities?.includes(metaId) && metaId) ||
|
||||||
this._contextEntities?.[0]
|
this._contextEntities?.[0]
|
||||||
);
|
);
|
||||||
@@ -445,47 +317,27 @@ export class HaMediaSelector extends LitElement {
|
|||||||
|
|
||||||
private _pictureUploadMediaPicked(ev) {
|
private _pictureUploadMediaPicked(ev) {
|
||||||
const pickedMedia = ev.detail as MediaPickedEvent;
|
const pickedMedia = ev.detail as MediaPickedEvent;
|
||||||
const newItem: MediaSelectorValue = {
|
|
||||||
...(Array.isArray(this.value) ? {} : (this.value as any)),
|
|
||||||
media_content_id: pickedMedia.item.media_content_id,
|
|
||||||
media_content_type: pickedMedia.item.media_content_type,
|
|
||||||
metadata: {
|
|
||||||
title: pickedMedia.item.title,
|
|
||||||
thumbnail: pickedMedia.item.thumbnail,
|
|
||||||
media_class: pickedMedia.item.media_class,
|
|
||||||
children_media_class: pickedMedia.item.children_media_class,
|
|
||||||
navigateIds: pickedMedia.navigateIds?.map((id) => ({
|
|
||||||
media_content_type: id.media_content_type,
|
|
||||||
media_content_id: id.media_content_id,
|
|
||||||
})),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
if (this.selector.media?.multiple) {
|
|
||||||
const current = Array.isArray(this.value)
|
|
||||||
? this.value
|
|
||||||
: this.value
|
|
||||||
? [this.value]
|
|
||||||
: [];
|
|
||||||
fireEvent(this, "value-changed", { value: [...current, newItem] });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
fireEvent(this, "value-changed", { value: newItem });
|
|
||||||
}
|
|
||||||
|
|
||||||
private _clearValue() {
|
|
||||||
fireEvent(this, "value-changed", {
|
fireEvent(this, "value-changed", {
|
||||||
value: this.selector.media?.multiple ? [] : undefined,
|
value: {
|
||||||
|
...this.value,
|
||||||
|
media_content_id: pickedMedia.item.media_content_id,
|
||||||
|
media_content_type: pickedMedia.item.media_content_type,
|
||||||
|
metadata: {
|
||||||
|
title: pickedMedia.item.title,
|
||||||
|
thumbnail: pickedMedia.item.thumbnail,
|
||||||
|
media_class: pickedMedia.item.media_class,
|
||||||
|
children_media_class: pickedMedia.item.children_media_class,
|
||||||
|
navigateIds: pickedMedia.navigateIds?.map((id) => ({
|
||||||
|
media_content_type: id.media_content_type,
|
||||||
|
media_content_id: id.media_content_id,
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private _removeItem(ev: CustomEvent) {
|
private _clearValue() {
|
||||||
ev.stopPropagation();
|
fireEvent(this, "value-changed", { value: undefined });
|
||||||
if (!Array.isArray(this.value)) return;
|
|
||||||
const idx = (ev.currentTarget as any).idx as number;
|
|
||||||
if (idx === undefined) return;
|
|
||||||
const newValue = this.value.slice();
|
|
||||||
newValue.splice(idx, 1);
|
|
||||||
fireEvent(this, "value-changed", { value: newValue });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static styles = css`
|
static styles = css`
|
||||||
@@ -497,9 +349,6 @@ export class HaMediaSelector extends LitElement {
|
|||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
ha-chip-set {
|
|
||||||
padding-bottom: 8px;
|
|
||||||
}
|
|
||||||
ha-card {
|
ha-card {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@@ -112,6 +112,7 @@ export interface HassioAddonDetails extends HassioAddonInfo {
|
|||||||
translations: Record<string, AddonTranslations>;
|
translations: Record<string, AddonTranslations>;
|
||||||
watchdog: null | boolean;
|
watchdog: null | boolean;
|
||||||
webui: null | string;
|
webui: null | string;
|
||||||
|
webui_ha_aware: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface HassioAddonsInfo {
|
export interface HassioAddonsInfo {
|
||||||
|
@@ -316,7 +316,6 @@ export interface MediaSelector {
|
|||||||
clearable?: boolean;
|
clearable?: boolean;
|
||||||
hide_content_type?: boolean;
|
hide_content_type?: boolean;
|
||||||
content_id_helper?: string;
|
content_id_helper?: string;
|
||||||
multiple?: boolean;
|
|
||||||
} | null;
|
} | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,7 +15,6 @@ import type { PropertyValues } from "lit";
|
|||||||
import { LitElement, css, html, nothing } from "lit";
|
import { LitElement, css, html, nothing } from "lit";
|
||||||
import { customElement, property, state } from "lit/decorators";
|
import { customElement, property, state } from "lit/decorators";
|
||||||
import { cache } from "lit/directives/cache";
|
import { cache } from "lit/directives/cache";
|
||||||
import { join } from "lit/directives/join";
|
|
||||||
import { keyed } from "lit/directives/keyed";
|
import { keyed } from "lit/directives/keyed";
|
||||||
import { dynamicElement } from "../../common/dom/dynamic-element-directive";
|
import { dynamicElement } from "../../common/dom/dynamic-element-directive";
|
||||||
import { fireEvent } from "../../common/dom/fire_event";
|
import { fireEvent } from "../../common/dom/fire_event";
|
||||||
@@ -33,6 +32,7 @@ import {
|
|||||||
} from "../../common/entity/context/get_entity_context";
|
} from "../../common/entity/context/get_entity_context";
|
||||||
import { shouldHandleRequestSelectedEvent } from "../../common/mwc/handle-request-selected-event";
|
import { shouldHandleRequestSelectedEvent } from "../../common/mwc/handle-request-selected-event";
|
||||||
import { navigate } from "../../common/navigate";
|
import { navigate } from "../../common/navigate";
|
||||||
|
import { computeRTL } from "../../common/util/compute_rtl";
|
||||||
import "../../components/ha-button-menu";
|
import "../../components/ha-button-menu";
|
||||||
import "../../components/ha-dialog";
|
import "../../components/ha-dialog";
|
||||||
import "../../components/ha-dialog-header";
|
import "../../components/ha-dialog-header";
|
||||||
@@ -361,6 +361,8 @@ export class MoreInfoDialog extends LitElement {
|
|||||||
);
|
);
|
||||||
const title = this._childView?.viewTitle || breadcrumb.pop() || entityId;
|
const title = this._childView?.viewTitle || breadcrumb.pop() || entityId;
|
||||||
|
|
||||||
|
const isRTL = computeRTL(this.hass);
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<ha-dialog
|
<ha-dialog
|
||||||
open
|
open
|
||||||
@@ -394,17 +396,13 @@ export class MoreInfoDialog extends LitElement {
|
|||||||
${breadcrumb.length > 0
|
${breadcrumb.length > 0
|
||||||
? !__DEMO__ && isAdmin
|
? !__DEMO__ && isAdmin
|
||||||
? html`
|
? html`
|
||||||
<button
|
<button class="breadcrumb" @click=${this._breadcrumbClick}>
|
||||||
class="breadcrumb"
|
${breadcrumb.join(isRTL ? " ◂ " : " ▸ ")}
|
||||||
@click=${this._breadcrumbClick}
|
|
||||||
aria-label=${breadcrumb.join(" > ")}
|
|
||||||
>
|
|
||||||
${join(breadcrumb, html`<ha-icon-next></ha-icon-next>`)}
|
|
||||||
</button>
|
</button>
|
||||||
`
|
`
|
||||||
: html`
|
: html`
|
||||||
<p class="breadcrumb">
|
<p class="breadcrumb">
|
||||||
${join(breadcrumb, html`<ha-icon-next></ha-icon-next>`)}
|
${breadcrumb.join(isRTL ? " ◂ " : " ▸ ")}
|
||||||
</p>
|
</p>
|
||||||
`
|
`
|
||||||
: nothing}
|
: nothing}
|
||||||
|
@@ -1,14 +1,11 @@
|
|||||||
import { mdiCalendarSync, mdiClose, mdiGestureTap } from "@mdi/js";
|
import { mdiCalendarSync, mdiGestureTap } from "@mdi/js";
|
||||||
import type { CSSResultGroup } from "lit";
|
import type { CSSResultGroup } from "lit";
|
||||||
import { LitElement, css, html, nothing } from "lit";
|
import { LitElement, css, html, nothing } from "lit";
|
||||||
import { customElement, property, query, state } from "lit/decorators";
|
import { customElement, property, state } from "lit/decorators";
|
||||||
import { fireEvent } from "../../../../common/dom/fire_event";
|
import { fireEvent } from "../../../../common/dom/fire_event";
|
||||||
import "../../../../components/ha-dialog-header";
|
|
||||||
import "../../../../components/ha-icon-button";
|
|
||||||
import "../../../../components/ha-icon-next";
|
import "../../../../components/ha-icon-next";
|
||||||
import "../../../../components/ha-md-dialog";
|
|
||||||
import type { HaMdDialog } from "../../../../components/ha-md-dialog";
|
|
||||||
import "../../../../components/ha-md-list";
|
import "../../../../components/ha-md-list";
|
||||||
|
import "../../../../components/ha-wa-dialog";
|
||||||
import "../../../../components/ha-md-list-item";
|
import "../../../../components/ha-md-list-item";
|
||||||
import "../../../../components/ha-svg-icon";
|
import "../../../../components/ha-svg-icon";
|
||||||
import type { HassDialog } from "../../../../dialogs/make-dialog-manager";
|
import type { HassDialog } from "../../../../dialogs/make-dialog-manager";
|
||||||
@@ -24,92 +21,80 @@ class DialogNewBackup extends LitElement implements HassDialog {
|
|||||||
|
|
||||||
@state() private _params?: NewBackupDialogParams;
|
@state() private _params?: NewBackupDialogParams;
|
||||||
|
|
||||||
@query("ha-md-dialog") private _dialog?: HaMdDialog;
|
|
||||||
|
|
||||||
public showDialog(params: NewBackupDialogParams): void {
|
public showDialog(params: NewBackupDialogParams): void {
|
||||||
this._opened = true;
|
this._opened = true;
|
||||||
this._params = params;
|
this._params = params;
|
||||||
}
|
}
|
||||||
|
|
||||||
public closeDialog() {
|
public closeDialog() {
|
||||||
this._dialog?.close();
|
this._opened = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _dialogClosed() {
|
private _dialogClosed() {
|
||||||
if (this._params!.cancel) {
|
if (this._params?.cancel) {
|
||||||
this._params!.cancel();
|
this._params.cancel();
|
||||||
}
|
}
|
||||||
if (this._opened) {
|
|
||||||
fireEvent(this, "dialog-closed", { dialog: this.localName });
|
|
||||||
}
|
|
||||||
this._opened = false;
|
|
||||||
this._params = undefined;
|
this._params = undefined;
|
||||||
|
fireEvent(this, "dialog-closed", { dialog: this.localName });
|
||||||
}
|
}
|
||||||
|
|
||||||
protected render() {
|
protected render() {
|
||||||
if (!this._opened || !this._params) {
|
if (!this._params) {
|
||||||
return nothing;
|
return nothing;
|
||||||
}
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<ha-md-dialog open @closed=${this._dialogClosed}>
|
<ha-wa-dialog
|
||||||
<ha-dialog-header slot="headline">
|
.hass=${this.hass}
|
||||||
<ha-icon-button
|
.open=${this._opened}
|
||||||
slot="navigationIcon"
|
header-title=${this.hass.localize(
|
||||||
@click=${this.closeDialog}
|
"ui.panel.config.backup.dialogs.new.title"
|
||||||
.label=${this.hass.localize("ui.common.close")}
|
)}
|
||||||
.path=${mdiClose}
|
@closed=${this._dialogClosed}
|
||||||
></ha-icon-button>
|
>
|
||||||
<span slot="title">
|
<ha-md-list
|
||||||
${this.hass.localize("ui.panel.config.backup.dialogs.new.title")}
|
innerRole="listbox"
|
||||||
</span>
|
itemRoles="option"
|
||||||
</ha-dialog-header>
|
.innerAriaLabel=${this.hass.localize(
|
||||||
<div slot="content">
|
"ui.panel.config.backup.dialogs.new.options"
|
||||||
<ha-md-list
|
)}
|
||||||
innerRole="listbox"
|
rootTabbable
|
||||||
itemRoles="option"
|
>
|
||||||
.innerAriaLabel=${this.hass.localize(
|
<ha-md-list-item
|
||||||
"ui.panel.config.backup.dialogs.new.options"
|
@click=${this._automatic}
|
||||||
)}
|
type="button"
|
||||||
rootTabbable
|
.disabled=${!this._params.config.create_backup.password}
|
||||||
dialogInitialFocus
|
|
||||||
>
|
>
|
||||||
<ha-md-list-item
|
<ha-svg-icon slot="start" .path=${mdiCalendarSync}></ha-svg-icon>
|
||||||
@click=${this._automatic}
|
<span slot="headline">
|
||||||
type="button"
|
${this.hass.localize(
|
||||||
.disabled=${!this._params.config.create_backup.password}
|
"ui.panel.config.backup.dialogs.new.automatic.title"
|
||||||
>
|
)}
|
||||||
<ha-svg-icon slot="start" .path=${mdiCalendarSync}></ha-svg-icon>
|
</span>
|
||||||
<span slot="headline">
|
<span slot="supporting-text">
|
||||||
${this.hass.localize(
|
${this.hass.localize(
|
||||||
"ui.panel.config.backup.dialogs.new.automatic.title"
|
"ui.panel.config.backup.dialogs.new.automatic.description"
|
||||||
)}
|
)}
|
||||||
</span>
|
</span>
|
||||||
<span slot="supporting-text">
|
<ha-icon-next slot="end"></ha-icon-next>
|
||||||
${this.hass.localize(
|
</ha-md-list-item>
|
||||||
"ui.panel.config.backup.dialogs.new.automatic.description"
|
<ha-md-list-item @click=${this._manual} type="button">
|
||||||
)}
|
<ha-svg-icon slot="start" .path=${mdiGestureTap}></ha-svg-icon>
|
||||||
</span>
|
<span slot="headline">
|
||||||
<ha-icon-next slot="end"></ha-icon-next>
|
${this.hass.localize(
|
||||||
</ha-md-list-item>
|
"ui.panel.config.backup.dialogs.new.manual.title"
|
||||||
<ha-md-list-item @click=${this._manual} type="button">
|
)}
|
||||||
<ha-svg-icon slot="start" .path=${mdiGestureTap}></ha-svg-icon>
|
</span>
|
||||||
<span slot="headline">
|
<span slot="supporting-text">
|
||||||
${this.hass.localize(
|
${this.hass.localize(
|
||||||
"ui.panel.config.backup.dialogs.new.manual.title"
|
"ui.panel.config.backup.dialogs.new.manual.description"
|
||||||
)}
|
)}
|
||||||
</span>
|
</span>
|
||||||
<span slot="supporting-text">
|
<ha-icon-next slot="end"></ha-icon-next>
|
||||||
${this.hass.localize(
|
</ha-md-list-item>
|
||||||
"ui.panel.config.backup.dialogs.new.manual.description"
|
</ha-md-list>
|
||||||
)}
|
</ha-wa-dialog>
|
||||||
</span>
|
|
||||||
<ha-icon-next slot="end"></ha-icon-next>
|
|
||||||
</ha-md-list-item>
|
|
||||||
</ha-md-list>
|
|
||||||
</div>
|
|
||||||
</ha-md-dialog>
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,24 +113,13 @@ class DialogNewBackup extends LitElement implements HassDialog {
|
|||||||
haStyle,
|
haStyle,
|
||||||
haStyleDialog,
|
haStyleDialog,
|
||||||
css`
|
css`
|
||||||
ha-md-dialog {
|
ha-wa-dialog {
|
||||||
--dialog-content-padding: 0;
|
--dialog-content-padding: 0;
|
||||||
max-width: 500px;
|
|
||||||
}
|
|
||||||
@media all and (max-width: 450px), all and (max-height: 500px) {
|
|
||||||
ha-md-dialog {
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
div[slot="content"] {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ha-md-list {
|
ha-md-list {
|
||||||
background: none;
|
background: none;
|
||||||
}
|
}
|
||||||
ha-md-list-item {
|
|
||||||
}
|
|
||||||
ha-icon-next {
|
ha-icon-next {
|
||||||
width: 24px;
|
width: 24px;
|
||||||
}
|
}
|
||||||
|
@@ -128,11 +128,10 @@ class ZHAAddDevicesPage extends LitElement {
|
|||||||
this.hass,
|
this.hass,
|
||||||
"/integrations/zha#adding-devices"
|
"/integrations/zha#adding-devices"
|
||||||
)}
|
)}
|
||||||
>
|
>${this.hass.localize(
|
||||||
${this.hass.localize(
|
|
||||||
"ui.panel.config.zha.add_device_page.pairing_mode_link"
|
"ui.panel.config.zha.add_device_page.pairing_mode_link"
|
||||||
)}
|
)}</a
|
||||||
</a>
|
>
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
)}
|
)}
|
||||||
|
@@ -4,6 +4,7 @@ import { isComponentLoaded } from "../../../../common/config/is_component_loaded
|
|||||||
import { generateEntityFilter } from "../../../../common/entity/entity_filter";
|
import { generateEntityFilter } from "../../../../common/entity/entity_filter";
|
||||||
import type { AreaRegistryEntry } from "../../../../data/area_registry";
|
import type { AreaRegistryEntry } from "../../../../data/area_registry";
|
||||||
import { getEnergyPreferences } from "../../../../data/energy";
|
import { getEnergyPreferences } from "../../../../data/energy";
|
||||||
|
import type { LovelaceCardConfig } from "../../../../data/lovelace/config/card";
|
||||||
import type {
|
import type {
|
||||||
LovelaceSectionConfig,
|
LovelaceSectionConfig,
|
||||||
LovelaceSectionRawConfig,
|
LovelaceSectionRawConfig,
|
||||||
@@ -15,11 +16,11 @@ import type {
|
|||||||
AreaCardConfig,
|
AreaCardConfig,
|
||||||
HomeSummaryCard,
|
HomeSummaryCard,
|
||||||
MarkdownCardConfig,
|
MarkdownCardConfig,
|
||||||
TileCardConfig,
|
|
||||||
WeatherForecastCardConfig,
|
WeatherForecastCardConfig,
|
||||||
} from "../../cards/types";
|
} from "../../cards/types";
|
||||||
import { getAreas } from "../areas/helpers/areas-strategy-helper";
|
import { getAreas, getFloors } from "../areas/helpers/areas-strategy-helper";
|
||||||
import type { CommonControlSectionStrategyConfig } from "../usage_prediction/common-controls-section-strategy";
|
import type { CommonControlSectionStrategyConfig } from "../usage_prediction/common-controls-section-strategy";
|
||||||
|
import { getHomeStructure } from "./helpers/home-structure";
|
||||||
|
|
||||||
export interface HomeMainViewStrategyConfig {
|
export interface HomeMainViewStrategyConfig {
|
||||||
type: "home-main";
|
type: "home-main";
|
||||||
@@ -59,25 +60,67 @@ export class HomeMainViewStrategy extends ReactiveElement {
|
|||||||
hass: HomeAssistant
|
hass: HomeAssistant
|
||||||
): Promise<LovelaceViewConfig> {
|
): Promise<LovelaceViewConfig> {
|
||||||
const areas = getAreas(hass.areas);
|
const areas = getAreas(hass.areas);
|
||||||
|
const floors = getFloors(hass.floors);
|
||||||
|
|
||||||
const areasSection: LovelaceSectionConfig = {
|
const home = getHomeStructure(floors, areas);
|
||||||
type: "grid",
|
|
||||||
column_span: 2,
|
const floorCount = home.floors.length + (home.areas.length ? 1 : 0);
|
||||||
cards: [
|
|
||||||
{
|
|
||||||
type: "heading",
|
|
||||||
heading_style: "title",
|
|
||||||
heading: hass.localize("ui.panel.lovelace.strategy.home.areas"),
|
|
||||||
},
|
|
||||||
...areas.map<AreaCardConfig>((area) =>
|
|
||||||
computeAreaCard(area.area_id, hass)
|
|
||||||
),
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
// Allow between 2 and 3 columns (the max should be set to define the width of the header)
|
// Allow between 2 and 3 columns (the max should be set to define the width of the header)
|
||||||
const maxColumns = 2;
|
const maxColumns = 2;
|
||||||
|
|
||||||
|
const floorsSections: LovelaceSectionConfig[] = [];
|
||||||
|
for (const floorStructure of home.floors) {
|
||||||
|
const floorId = floorStructure.id;
|
||||||
|
const areaIds = floorStructure.areas;
|
||||||
|
const floor = hass.floors[floorId];
|
||||||
|
|
||||||
|
const cards: LovelaceCardConfig[] = [];
|
||||||
|
for (const areaId of areaIds) {
|
||||||
|
cards.push(computeAreaCard(areaId, hass));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cards.length) {
|
||||||
|
floorsSections.push({
|
||||||
|
type: "grid",
|
||||||
|
column_span: maxColumns,
|
||||||
|
cards: [
|
||||||
|
{
|
||||||
|
type: "heading",
|
||||||
|
heading:
|
||||||
|
floorCount > 1
|
||||||
|
? floor.name
|
||||||
|
: hass.localize("ui.panel.lovelace.strategy.home.areas"),
|
||||||
|
heading_style: "title",
|
||||||
|
},
|
||||||
|
...cards,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (home.areas.length) {
|
||||||
|
const cards: LovelaceCardConfig[] = [];
|
||||||
|
for (const areaId of home.areas) {
|
||||||
|
cards.push(computeAreaCard(areaId, hass));
|
||||||
|
}
|
||||||
|
floorsSections.push({
|
||||||
|
type: "grid",
|
||||||
|
column_span: maxColumns,
|
||||||
|
cards: [
|
||||||
|
{
|
||||||
|
type: "heading",
|
||||||
|
heading:
|
||||||
|
floorCount > 1
|
||||||
|
? hass.localize("ui.panel.lovelace.strategy.home.other_areas")
|
||||||
|
: hass.localize("ui.panel.lovelace.strategy.home.areas"),
|
||||||
|
heading_style: "title",
|
||||||
|
},
|
||||||
|
...cards,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const favoriteSection: LovelaceSectionConfig = {
|
const favoriteSection: LovelaceSectionConfig = {
|
||||||
type: "grid",
|
type: "grid",
|
||||||
column_span: maxColumns,
|
column_span: maxColumns,
|
||||||
@@ -87,31 +130,14 @@ export class HomeMainViewStrategy extends ReactiveElement {
|
|||||||
const favoriteEntities = (config.favorite_entities || []).filter(
|
const favoriteEntities = (config.favorite_entities || []).filter(
|
||||||
(entityId) => hass.states[entityId] !== undefined
|
(entityId) => hass.states[entityId] !== undefined
|
||||||
);
|
);
|
||||||
|
const maxCommonControls = Math.max(8, favoriteEntities.length);
|
||||||
if (favoriteEntities.length > 0) {
|
|
||||||
favoriteSection.cards!.push(
|
|
||||||
{
|
|
||||||
type: "heading",
|
|
||||||
heading: "",
|
|
||||||
heading_style: "subtitle",
|
|
||||||
},
|
|
||||||
...favoriteEntities.map(
|
|
||||||
(entityId) =>
|
|
||||||
({
|
|
||||||
type: "tile",
|
|
||||||
entity: entityId,
|
|
||||||
show_entity_picture: true,
|
|
||||||
}) as TileCardConfig
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const commonControlsSection = {
|
const commonControlsSection = {
|
||||||
strategy: {
|
strategy: {
|
||||||
type: "common-controls",
|
type: "common-controls",
|
||||||
title: hass.localize("ui.panel.lovelace.strategy.home.common_controls"),
|
title: hass.localize("ui.panel.lovelace.strategy.home.common_controls"),
|
||||||
limit: 4,
|
limit: maxCommonControls,
|
||||||
exclude_entities: favoriteEntities,
|
include_entities: favoriteEntities,
|
||||||
hide_empty: true,
|
hide_empty: true,
|
||||||
} satisfies CommonControlSectionStrategyConfig,
|
} satisfies CommonControlSectionStrategyConfig,
|
||||||
column_span: maxColumns,
|
column_span: maxColumns,
|
||||||
@@ -234,7 +260,7 @@ export class HomeMainViewStrategy extends ReactiveElement {
|
|||||||
favoriteSection.cards && favoriteSection,
|
favoriteSection.cards && favoriteSection,
|
||||||
commonControlsSection,
|
commonControlsSection,
|
||||||
summarySection,
|
summarySection,
|
||||||
areasSection,
|
...floorsSections,
|
||||||
widgetSection.cards && widgetSection,
|
widgetSection.cards && widgetSection,
|
||||||
] satisfies (LovelaceSectionRawConfig | undefined)[]
|
] satisfies (LovelaceSectionRawConfig | undefined)[]
|
||||||
).filter(Boolean) as LovelaceSectionRawConfig[];
|
).filter(Boolean) as LovelaceSectionRawConfig[];
|
||||||
|
@@ -14,6 +14,7 @@ export interface CommonControlSectionStrategyConfig {
|
|||||||
icon?: string;
|
icon?: string;
|
||||||
limit?: number;
|
limit?: number;
|
||||||
exclude_entities?: string[];
|
exclude_entities?: string[];
|
||||||
|
include_entities?: string[];
|
||||||
hide_empty?: boolean;
|
hide_empty?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,12 +53,23 @@ export class CommonControlsSectionStrategy extends ReactiveElement {
|
|||||||
(entity) => entity in hass.states
|
(entity) => entity in hass.states
|
||||||
);
|
);
|
||||||
|
|
||||||
if (config.exclude_entities) {
|
if (config.exclude_entities?.length) {
|
||||||
predictedEntities = predictedEntities.filter(
|
predictedEntities = predictedEntities.filter(
|
||||||
(entity) => !config.exclude_entities!.includes(entity)
|
(entity) => !config.exclude_entities!.includes(entity)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config.include_entities?.length) {
|
||||||
|
// Remove included entities from predicted list to avoid duplicates
|
||||||
|
predictedEntities = predictedEntities.filter(
|
||||||
|
(entity) => !config.include_entities!.includes(entity)
|
||||||
|
);
|
||||||
|
// Add included entities to the start of the list
|
||||||
|
predictedEntities.unshift(
|
||||||
|
...config.include_entities!.filter((entity) => entity in hass.states)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const limit = config.limit ?? DEFAULT_LIMIT;
|
const limit = config.limit ?? DEFAULT_LIMIT;
|
||||||
predictedEntities = predictedEntities.slice(0, limit);
|
predictedEntities = predictedEntities.slice(0, limit);
|
||||||
|
|
||||||
|
@@ -20,6 +20,11 @@ export class HuiDialogWebBrowserPlayMedia extends LitElement {
|
|||||||
|
|
||||||
public closeDialog() {
|
public closeDialog() {
|
||||||
this._params = undefined;
|
this._params = undefined;
|
||||||
|
const img = this.renderRoot.querySelector("img");
|
||||||
|
if (img) {
|
||||||
|
// Unload streaming images so the connection can be closed
|
||||||
|
img.src = "";
|
||||||
|
}
|
||||||
fireEvent(this, "dialog-closed", { dialog: this.localName });
|
fireEvent(this, "dialog-closed", { dialog: this.localName });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
180
yarn.lock
180
yarn.lock
@@ -1698,15 +1698,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/ecma402-abstract@npm:2.3.5":
|
"@formatjs/ecma402-abstract@npm:2.3.6":
|
||||||
version: 2.3.5
|
version: 2.3.6
|
||||||
resolution: "@formatjs/ecma402-abstract@npm:2.3.5"
|
resolution: "@formatjs/ecma402-abstract@npm:2.3.6"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/fast-memoize": "npm:2.2.7"
|
"@formatjs/fast-memoize": "npm:2.2.7"
|
||||||
"@formatjs/intl-localematcher": "npm:0.6.2"
|
"@formatjs/intl-localematcher": "npm:0.6.2"
|
||||||
decimal.js: "npm:^10.4.3"
|
decimal.js: "npm:^10.4.3"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/254651057170836237dc4f0fbb372157f97133c4dcee414007e0cdb5b589baf0546c2f6337d117b988ee0a4f0a4d8247780aaa9e96b410c568495f162c40dc50
|
checksum: 10/30b1b5cd6b62ba46245f934429936592df5500bc1b089dc92dd49c826757b873dd92c305dcfe370701e4df6b057bf007782113abb9b65db550d73be4961718bc
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -1719,68 +1719,68 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/icu-messageformat-parser@npm:2.11.3":
|
"@formatjs/icu-messageformat-parser@npm:2.11.4":
|
||||||
version: 2.11.3
|
version: 2.11.4
|
||||||
resolution: "@formatjs/icu-messageformat-parser@npm:2.11.3"
|
resolution: "@formatjs/icu-messageformat-parser@npm:2.11.4"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
"@formatjs/icu-skeleton-parser": "npm:1.8.15"
|
"@formatjs/icu-skeleton-parser": "npm:1.8.16"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/339f5ff5ea7417e2db7f01bd41340f78fd5a8e56a66e723272d21ce7ab4b265dcb45748cdca76eac7137e2b5e6767986812b471e011b4602cf7afbc6da57fb98
|
checksum: 10/2acb100c06c2ade666d72787fb9f9795b1ace41e8e73bfadc2b1a7b8562e81f655e484f0f33d8c39473aa17bf0ad96fb2228871806a9b3dc4f5f876754a0de3a
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/icu-skeleton-parser@npm:1.8.15":
|
"@formatjs/icu-skeleton-parser@npm:1.8.16":
|
||||||
version: 1.8.15
|
version: 1.8.16
|
||||||
resolution: "@formatjs/icu-skeleton-parser@npm:1.8.15"
|
resolution: "@formatjs/icu-skeleton-parser@npm:1.8.16"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/19825abc1a5eef0288456c08420d06f3da8256fbe81db0b9ead48cacc94954d748c8068988e26d184d38fca2e50c191ecda5a10ff3935529c3134b8d80db0538
|
checksum: 10/428001e5bed81889b276a2356a1393157af91dc59220b765a1a132f6407ac5832b7ac6ae9737674ac38e44035295c0c1c310b2630f383f2b5779ea90bf2849e6
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/intl-datetimeformat@npm:6.18.1":
|
"@formatjs/intl-datetimeformat@npm:6.18.2":
|
||||||
version: 6.18.1
|
version: 6.18.2
|
||||||
resolution: "@formatjs/intl-datetimeformat@npm:6.18.1"
|
resolution: "@formatjs/intl-datetimeformat@npm:6.18.2"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
"@formatjs/intl-localematcher": "npm:0.6.2"
|
"@formatjs/intl-localematcher": "npm:0.6.2"
|
||||||
decimal.js: "npm:^10.4.3"
|
decimal.js: "npm:^10.4.3"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/66938778ecf37472a7e2f1d9349b0ac249fcbd5d684ae5614dea07287876182429980ba2fe3671224f981065baf017ac955f4b3c1f3c924c89bf2ec82dd1acd8
|
checksum: 10/e6f80d0eb2049564502370839697a18858268a0dff8d199b1908137c4a229b1303131c12b8b8a8e8e259a1feba26dbc25b003b150adabea10d1c43f68086efbe
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/intl-displaynames@npm:6.8.12":
|
"@formatjs/intl-displaynames@npm:6.8.13":
|
||||||
version: 6.8.12
|
version: 6.8.13
|
||||||
resolution: "@formatjs/intl-displaynames@npm:6.8.12"
|
resolution: "@formatjs/intl-displaynames@npm:6.8.13"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
"@formatjs/intl-localematcher": "npm:0.6.2"
|
"@formatjs/intl-localematcher": "npm:0.6.2"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/7de27ef7e8cde2febce84d5443f00b70062cbd0c3f1039ce8ed1caacb15c4c7a36da16295f26657d59aa4663141a04d7b1083bfd1eea6a4e8ad9dc6093a2c886
|
checksum: 10/adefd25fa42266c7bc33dd3cd50f3681bdce51d18b32a03c98f8ad7587dfd8b9291345e185a4b16f31f4eee10fc799fd1b6361bdfd3a2c9fe127744e1e0f3b07
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/intl-durationformat@npm:0.7.5":
|
"@formatjs/intl-durationformat@npm:0.7.6":
|
||||||
version: 0.7.5
|
version: 0.7.6
|
||||||
resolution: "@formatjs/intl-durationformat@npm:0.7.5"
|
resolution: "@formatjs/intl-durationformat@npm:0.7.6"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
"@formatjs/intl-localematcher": "npm:0.6.2"
|
"@formatjs/intl-localematcher": "npm:0.6.2"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/4dc81b112fed25dc8da0a16ddeff033b7c763bf9a1cfd7b1b25c1216f7f147eb67a47059a3cf95b4d4ade150c54a813542b84e69298905a4bc22548d74bf8567
|
checksum: 10/442236ba85bcd9cb7296c43a708271fa09f110b1ca9d5899066d00812fc2965eaeaec6b5240be421b80daba62860352131088449ba0fcd2061f671cec6240f0b
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/intl-enumerator@npm:1.8.11":
|
"@formatjs/intl-enumerator@npm:1.8.12":
|
||||||
version: 1.8.11
|
version: 1.8.12
|
||||||
resolution: "@formatjs/intl-enumerator@npm:1.8.11"
|
resolution: "@formatjs/intl-enumerator@npm:1.8.12"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/8646a517cd4160c1ceff888ec8fdf652caa3d375fa41231e829c13bc7be0cd156c9642e339b75e9cfa8ef60ae8140c766f9055318c62f1c1d9345f25cdb7f426
|
checksum: 10/8dfd7ca5383b4dca530e1df5118a72f71347f4e0daa6131b82dbf7e860a8b96bec0fed43bfa6f6e650e55fa50fcd3e9e3a5253515131b578539d8eaa84630927
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -1793,26 +1793,26 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/intl-listformat@npm:7.7.12":
|
"@formatjs/intl-listformat@npm:7.7.13":
|
||||||
version: 7.7.12
|
version: 7.7.13
|
||||||
resolution: "@formatjs/intl-listformat@npm:7.7.12"
|
resolution: "@formatjs/intl-listformat@npm:7.7.13"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
"@formatjs/intl-localematcher": "npm:0.6.2"
|
"@formatjs/intl-localematcher": "npm:0.6.2"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/eee910e83ad28b3b3c24ab6e155720187ae5b5ac936ffa2c8ec6cc8c392c194fd5c79a166290da1c6de8dc1857e3d9d11241029832ec88f7a85cce1821b7f067
|
checksum: 10/476d7cffb64eb996a888b1865aa237f04088de60fa7c65b6d073bca8a3c0f4304040ef12f16eafaf6587895976b773607296951afa7f119447d8f9b2c40daa55
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/intl-locale@npm:4.2.12":
|
"@formatjs/intl-locale@npm:4.2.13":
|
||||||
version: 4.2.12
|
version: 4.2.13
|
||||||
resolution: "@formatjs/intl-locale@npm:4.2.12"
|
resolution: "@formatjs/intl-locale@npm:4.2.13"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
"@formatjs/intl-enumerator": "npm:1.8.11"
|
"@formatjs/intl-enumerator": "npm:1.8.12"
|
||||||
"@formatjs/intl-getcanonicallocales": "npm:2.5.6"
|
"@formatjs/intl-getcanonicallocales": "npm:2.5.6"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/42111a3002a5a2076b3eb012073230f69c62355dc03647bc17f4d0805f39c7e720e2281b359277d020fef623944a5bcc1ddc3dae9a3af74886d876147680147d
|
checksum: 10/865615561b4bad8b8d7d93539cae7eb3ed2d46b6156486ef3ccb1b8f9f46f075c7cf2f6e5325aba1cf07150e19280858dff7dfd86d530fbf45fd31ea4fabf8d4
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -1825,38 +1825,38 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/intl-numberformat@npm:8.15.5":
|
"@formatjs/intl-numberformat@npm:8.15.6":
|
||||||
version: 8.15.5
|
version: 8.15.6
|
||||||
resolution: "@formatjs/intl-numberformat@npm:8.15.5"
|
resolution: "@formatjs/intl-numberformat@npm:8.15.6"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
"@formatjs/intl-localematcher": "npm:0.6.2"
|
"@formatjs/intl-localematcher": "npm:0.6.2"
|
||||||
decimal.js: "npm:^10.4.3"
|
decimal.js: "npm:^10.4.3"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/3440371a43c54cdd2aa3714cb518ad22e491dd19fbc0c046e712dde078d3f6ed709474376863d64d2bddb506957d1cf265d440f6723b88211044a7b56186e550
|
checksum: 10/674c5fefa0b14fcd7c58d0c0e592b4887dc2563fa5a11d80a0a82328ac12b2bb82b9a5367fa0a4d80060d61d15a1821bca7085e20cad09aa93b87edb3cff68ea
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/intl-pluralrules@npm:5.4.5":
|
"@formatjs/intl-pluralrules@npm:5.4.6":
|
||||||
version: 5.4.5
|
version: 5.4.6
|
||||||
resolution: "@formatjs/intl-pluralrules@npm:5.4.5"
|
resolution: "@formatjs/intl-pluralrules@npm:5.4.6"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
"@formatjs/intl-localematcher": "npm:0.6.2"
|
"@formatjs/intl-localematcher": "npm:0.6.2"
|
||||||
decimal.js: "npm:^10.4.3"
|
decimal.js: "npm:^10.4.3"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/00f650891893b743d126dd2bf0d17c1b16a8c9e0e0dd94cd0895e66cb556246116263e9603204e1991924814d0ed3a3503765914aff08181d5e4435dfc5e547c
|
checksum: 10/88aa244e69ccfdf459899f5fa3c64df345f451ef91ce1188eab35b7e37daa225d22120f64be633f2cd8b826ea705d19831915118f555f2d17611ee842a9a86dc
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@formatjs/intl-relativetimeformat@npm:11.4.12":
|
"@formatjs/intl-relativetimeformat@npm:11.4.13":
|
||||||
version: 11.4.12
|
version: 11.4.13
|
||||||
resolution: "@formatjs/intl-relativetimeformat@npm:11.4.12"
|
resolution: "@formatjs/intl-relativetimeformat@npm:11.4.13"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
"@formatjs/intl-localematcher": "npm:0.6.2"
|
"@formatjs/intl-localematcher": "npm:0.6.2"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/f6adca59738cb7f58d2ea985558d8fc45e567406de6fb6e67894afe790e2a9fa1a19d34853afc36805fa4a3d638e29c62d6c6ba3ec2a85628c240081dcdfebc1
|
checksum: 10/c2058d5f29a13aa216d317d309a6ffd7d203f0fe11696b7bd524e17ac3cc22ae50ad56a26dbf18125e4c115a3e75f01e6cf2134a83df6c7916ae6d3fb21a1e9b
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -6925,10 +6925,10 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"core-js@npm:3.45.1":
|
"core-js@npm:3.46.0":
|
||||||
version: 3.45.1
|
version: 3.46.0
|
||||||
resolution: "core-js@npm:3.45.1"
|
resolution: "core-js@npm:3.46.0"
|
||||||
checksum: 10/b9dca79b1af8bb4f0d4af0752ea98d694fe157abaf55513fd4084df32dfd4398f0fc57898b32cdb643c1cecb87b9231c2a2ce535797c80ae328eac6d6078ee61
|
checksum: 10/82993ca487c6cbbf8bbf00e45eeb9705eb63dc2f9c90d7f35696733efbc3f4b52426e1f8dbef0f0b68ea16caa21e4f44cc5490e08120e1cad4a72b031ed8adaa
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -9192,15 +9192,15 @@ __metadata:
|
|||||||
"@codemirror/view": "npm:6.38.5"
|
"@codemirror/view": "npm:6.38.5"
|
||||||
"@date-fns/tz": "npm:1.4.1"
|
"@date-fns/tz": "npm:1.4.1"
|
||||||
"@egjs/hammerjs": "npm:2.0.17"
|
"@egjs/hammerjs": "npm:2.0.17"
|
||||||
"@formatjs/intl-datetimeformat": "npm:6.18.1"
|
"@formatjs/intl-datetimeformat": "npm:6.18.2"
|
||||||
"@formatjs/intl-displaynames": "npm:6.8.12"
|
"@formatjs/intl-displaynames": "npm:6.8.13"
|
||||||
"@formatjs/intl-durationformat": "npm:0.7.5"
|
"@formatjs/intl-durationformat": "npm:0.7.6"
|
||||||
"@formatjs/intl-getcanonicallocales": "npm:2.5.6"
|
"@formatjs/intl-getcanonicallocales": "npm:2.5.6"
|
||||||
"@formatjs/intl-listformat": "npm:7.7.12"
|
"@formatjs/intl-listformat": "npm:7.7.13"
|
||||||
"@formatjs/intl-locale": "npm:4.2.12"
|
"@formatjs/intl-locale": "npm:4.2.13"
|
||||||
"@formatjs/intl-numberformat": "npm:8.15.5"
|
"@formatjs/intl-numberformat": "npm:8.15.6"
|
||||||
"@formatjs/intl-pluralrules": "npm:5.4.5"
|
"@formatjs/intl-pluralrules": "npm:5.4.6"
|
||||||
"@formatjs/intl-relativetimeformat": "npm:11.4.12"
|
"@formatjs/intl-relativetimeformat": "npm:11.4.13"
|
||||||
"@fullcalendar/core": "npm:6.1.19"
|
"@fullcalendar/core": "npm:6.1.19"
|
||||||
"@fullcalendar/daygrid": "npm:6.1.19"
|
"@fullcalendar/daygrid": "npm:6.1.19"
|
||||||
"@fullcalendar/interaction": "npm:6.1.19"
|
"@fullcalendar/interaction": "npm:6.1.19"
|
||||||
@@ -9283,7 +9283,7 @@ __metadata:
|
|||||||
browserslist-useragent-regexp: "npm:4.1.3"
|
browserslist-useragent-regexp: "npm:4.1.3"
|
||||||
color-name: "npm:2.0.2"
|
color-name: "npm:2.0.2"
|
||||||
comlink: "npm:4.4.2"
|
comlink: "npm:4.4.2"
|
||||||
core-js: "npm:3.45.1"
|
core-js: "npm:3.46.0"
|
||||||
cropperjs: "npm:1.6.2"
|
cropperjs: "npm:1.6.2"
|
||||||
culori: "npm:4.0.2"
|
culori: "npm:4.0.2"
|
||||||
date-fns: "npm:4.1.0"
|
date-fns: "npm:4.1.0"
|
||||||
@@ -9317,7 +9317,7 @@ __metadata:
|
|||||||
html-minifier-terser: "npm:7.2.0"
|
html-minifier-terser: "npm:7.2.0"
|
||||||
husky: "npm:9.1.7"
|
husky: "npm:9.1.7"
|
||||||
idb-keyval: "npm:6.2.2"
|
idb-keyval: "npm:6.2.2"
|
||||||
intl-messageformat: "npm:10.7.17"
|
intl-messageformat: "npm:10.7.18"
|
||||||
js-yaml: "npm:4.1.0"
|
js-yaml: "npm:4.1.0"
|
||||||
jsdom: "npm:27.0.0"
|
jsdom: "npm:27.0.0"
|
||||||
jszip: "npm:3.10.1"
|
jszip: "npm:3.10.1"
|
||||||
@@ -9355,7 +9355,7 @@ __metadata:
|
|||||||
ts-lit-plugin: "npm:2.0.2"
|
ts-lit-plugin: "npm:2.0.2"
|
||||||
typescript: "npm:5.9.3"
|
typescript: "npm:5.9.3"
|
||||||
typescript-eslint: "npm:8.46.0"
|
typescript-eslint: "npm:8.46.0"
|
||||||
ua-parser-js: "npm:2.0.5"
|
ua-parser-js: "npm:2.0.6"
|
||||||
vite-tsconfig-paths: "npm:5.1.4"
|
vite-tsconfig-paths: "npm:5.1.4"
|
||||||
vitest: "npm:3.2.4"
|
vitest: "npm:3.2.4"
|
||||||
vue: "npm:2.7.16"
|
vue: "npm:2.7.16"
|
||||||
@@ -9712,15 +9712,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"intl-messageformat@npm:10.7.17":
|
"intl-messageformat@npm:10.7.18":
|
||||||
version: 10.7.17
|
version: 10.7.18
|
||||||
resolution: "intl-messageformat@npm:10.7.17"
|
resolution: "intl-messageformat@npm:10.7.18"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@formatjs/ecma402-abstract": "npm:2.3.5"
|
"@formatjs/ecma402-abstract": "npm:2.3.6"
|
||||||
"@formatjs/fast-memoize": "npm:2.2.7"
|
"@formatjs/fast-memoize": "npm:2.2.7"
|
||||||
"@formatjs/icu-messageformat-parser": "npm:2.11.3"
|
"@formatjs/icu-messageformat-parser": "npm:2.11.4"
|
||||||
tslib: "npm:^2.8.0"
|
tslib: "npm:^2.8.0"
|
||||||
checksum: 10/4f8c30c998bfc14eb64894414b94a8923045ab31d7bbf0978dab6621c644d451ff5c533c04ce8128163b74dd6d59061ec1ef3acb1cbab3302d31cbdb21947620
|
checksum: 10/96650d673912763d21bbfa14b50749b992d45f1901092a020e3155961e3c70f4644dd1731c3ecb1207a1eb94d84bedf4c34b1ac8127c29ad6b015b6a2a4045cb
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -14379,17 +14379,16 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"ua-parser-js@npm:2.0.5":
|
"ua-parser-js@npm:2.0.6":
|
||||||
version: 2.0.5
|
version: 2.0.6
|
||||||
resolution: "ua-parser-js@npm:2.0.5"
|
resolution: "ua-parser-js@npm:2.0.6"
|
||||||
dependencies:
|
dependencies:
|
||||||
detect-europe-js: "npm:^0.1.2"
|
detect-europe-js: "npm:^0.1.2"
|
||||||
is-standalone-pwa: "npm:^0.1.1"
|
is-standalone-pwa: "npm:^0.1.1"
|
||||||
ua-is-frozen: "npm:^0.1.2"
|
ua-is-frozen: "npm:^0.1.2"
|
||||||
undici: "npm:^7.12.0"
|
|
||||||
bin:
|
bin:
|
||||||
ua-parser-js: script/cli.js
|
ua-parser-js: script/cli.js
|
||||||
checksum: 10/e946cb1c85bfcd0f2d30c7d5e1b605e340bb458432e7e87fc4aa1b2f90117e4220521d4e0bc7dd8c2a5cadd0935dedb5ac434b70efdc0007221288c1d98b3cd5
|
checksum: 10/b0049d3b272979049c7df6af2ec2ce032e4351316b10c33699f6e3f0bec701336f67530cc3ccb363c554b1bb5047b75d2f46575699afacd6e541762ca3861f4d
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -14452,13 +14451,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"undici@npm:^7.12.0":
|
|
||||||
version: 7.16.0
|
|
||||||
resolution: "undici@npm:7.16.0"
|
|
||||||
checksum: 10/2bb71672b23d3dc0f56f1b7fb6c936e4487a350db46eaafc03f2f9107f99cdf8e51ecdd32e589e2381ef47a64b6369cfb31f328b2c3ea663023aa47bc5258b9e
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"unicode-canonical-property-names-ecmascript@npm:^2.0.0":
|
"unicode-canonical-property-names-ecmascript@npm:^2.0.0":
|
||||||
version: 2.0.1
|
version: 2.0.1
|
||||||
resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1"
|
resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1"
|
||||||
|
Reference in New Issue
Block a user