Compare commits

..

1 Commits

Author SHA1 Message Date
github-actions[bot]
68af54ae75 Update frontend to version 20250903.5 2025-09-13 00:29:51 +00:00
2303 changed files with 3315 additions and 3602 deletions

View File

@@ -53,7 +53,7 @@ jobs:
requirements: ${{ steps.requirements.outputs.changed }}
steps:
- name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
with:
fetch-depth: 0
@@ -70,7 +70,7 @@ jobs:
- name: Get changed files
id: changed_files
if: steps.version.outputs.publish == 'false'
uses: masesgroup/retrieve-changed-files@491e80760c0e28d36ca6240a27b1ccb8e1402c13 # v3.0.0
uses: masesgroup/retrieve-changed-files@v3.0.0
- name: Check if requirements files changed
id: requirements
@@ -92,7 +92,7 @@ jobs:
arch: ${{ fromJson(needs.init.outputs.architectures) }}
steps:
- name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
with:
fetch-depth: 0
@@ -104,7 +104,6 @@ jobs:
echo "CARGO_NET_GIT_FETCH_WITH_CLI=true"
) > .env_file
# home-assistant/wheels doesn't support sha pinning
- name: Build wheels
if: needs.init.outputs.requirements == 'true'
uses: home-assistant/wheels@2025.07.0
@@ -126,13 +125,13 @@ jobs:
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
if: needs.init.outputs.publish == 'true'
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
uses: actions/setup-python@v6.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Install Cosign
if: needs.init.outputs.publish == 'true'
uses: sigstore/cosign-installer@d7543c93d881b35a8faa02e8e3605f69b7a1ce62 # v3.10.0
uses: sigstore/cosign-installer@v3.9.2
with:
cosign-release: "v2.4.3"
@@ -150,7 +149,7 @@ jobs:
- name: Login to GitHub Container Registry
if: needs.init.outputs.publish == 'true'
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
uses: docker/login-action@v3.5.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@@ -160,9 +159,8 @@ jobs:
if: needs.init.outputs.publish == 'false'
run: echo "BUILD_ARGS=--test" >> $GITHUB_ENV
# home-assistant/builder doesn't support sha pinning
- name: Build supervisor
uses: home-assistant/builder@2025.09.0
uses: home-assistant/builder@2025.03.0
with:
args: |
$BUILD_ARGS \
@@ -180,7 +178,7 @@ jobs:
steps:
- name: Checkout the repository
if: needs.init.outputs.publish == 'true'
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Initialize git
if: needs.init.outputs.publish == 'true'
@@ -205,12 +203,11 @@ jobs:
timeout-minutes: 60
steps:
- name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
# home-assistant/builder doesn't support sha pinning
- name: Build the Supervisor
if: needs.init.outputs.publish != 'true'
uses: home-assistant/builder@2025.09.0
uses: home-assistant/builder@2025.03.0
with:
args: |
--test \

View File

@@ -26,15 +26,15 @@ jobs:
name: Prepare Python dependencies
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Set up Python
id: python
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
uses: actions/setup-python@v6.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: venv
key: |
@@ -48,7 +48,7 @@ jobs:
pip install -r requirements.txt -r requirements_tests.txt
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: ${{ env.PRE_COMMIT_CACHE }}
lookup-only: true
@@ -68,15 +68,15 @@ jobs:
needs: prepare
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ needs.prepare.outputs.python-version }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
uses: actions/setup-python@v6.0.0
id: python
with:
python-version: ${{ needs.prepare.outputs.python-version }}
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: venv
key: |
@@ -88,7 +88,7 @@ jobs:
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: ${{ env.PRE_COMMIT_CACHE }}
key: |
@@ -111,15 +111,15 @@ jobs:
needs: prepare
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ needs.prepare.outputs.python-version }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
uses: actions/setup-python@v6.0.0
id: python
with:
python-version: ${{ needs.prepare.outputs.python-version }}
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: venv
key: |
@@ -131,7 +131,7 @@ jobs:
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: ${{ env.PRE_COMMIT_CACHE }}
key: |
@@ -154,7 +154,7 @@ jobs:
needs: prepare
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Register hadolint problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/hadolint.json"
@@ -169,15 +169,15 @@ jobs:
needs: prepare
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ needs.prepare.outputs.python-version }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
uses: actions/setup-python@v6.0.0
id: python
with:
python-version: ${{ needs.prepare.outputs.python-version }}
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: venv
key: |
@@ -189,7 +189,7 @@ jobs:
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: ${{ env.PRE_COMMIT_CACHE }}
key: |
@@ -213,15 +213,15 @@ jobs:
needs: prepare
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ needs.prepare.outputs.python-version }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
uses: actions/setup-python@v6.0.0
id: python
with:
python-version: ${{ needs.prepare.outputs.python-version }}
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: venv
key: |
@@ -233,7 +233,7 @@ jobs:
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: ${{ env.PRE_COMMIT_CACHE }}
key: |
@@ -257,15 +257,15 @@ jobs:
needs: prepare
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ needs.prepare.outputs.python-version }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
uses: actions/setup-python@v6.0.0
id: python
with:
python-version: ${{ needs.prepare.outputs.python-version }}
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: venv
key: |
@@ -293,9 +293,9 @@ jobs:
needs: prepare
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ needs.prepare.outputs.python-version }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
uses: actions/setup-python@v6.0.0
id: python
with:
python-version: ${{ needs.prepare.outputs.python-version }}
@@ -307,7 +307,7 @@ jobs:
echo "key=mypy-${{ env.MYPY_CACHE_VERSION }}-$mypy_version-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: venv
key: >-
@@ -318,7 +318,7 @@ jobs:
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore mypy cache
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: .mypy_cache
key: >-
@@ -339,19 +339,19 @@ jobs:
name: Run tests Python ${{ needs.prepare.outputs.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ needs.prepare.outputs.python-version }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
uses: actions/setup-python@v6.0.0
id: python
with:
python-version: ${{ needs.prepare.outputs.python-version }}
- name: Install Cosign
uses: sigstore/cosign-installer@d7543c93d881b35a8faa02e8e3605f69b7a1ce62 # v3.10.0
uses: sigstore/cosign-installer@v3.9.2
with:
cosign-release: "v2.4.3"
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: venv
key: |
@@ -386,7 +386,7 @@ jobs:
-o console_output_style=count \
tests
- name: Upload coverage artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: actions/upload-artifact@v4.6.2
with:
name: coverage
path: .coverage
@@ -398,15 +398,15 @@ jobs:
needs: ["pytest", "prepare"]
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ needs.prepare.outputs.python-version }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
uses: actions/setup-python@v6.0.0
id: python
with:
python-version: ${{ needs.prepare.outputs.python-version }}
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
uses: actions/cache@v4.2.4
with:
path: venv
key: |
@@ -417,7 +417,7 @@ jobs:
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Download all coverage artifacts
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
uses: actions/download-artifact@v5.0.0
with:
name: coverage
path: coverage/
@@ -428,4 +428,4 @@ jobs:
coverage report
coverage xml
- name: Upload coverage to Codecov
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
uses: codecov/codecov-action@v5.5.1

View File

@@ -9,7 +9,7 @@ jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1
- uses: dessant/lock-threads@v5.0.1
with:
github-token: ${{ github.token }}
issue-inactive-days: "30"

View File

@@ -11,7 +11,7 @@ jobs:
name: Release Drafter
steps:
- name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
with:
fetch-depth: 0
@@ -36,7 +36,7 @@ jobs:
echo "version=$datepre.$newpost" >> "$GITHUB_OUTPUT"
- name: Run Release Drafter
uses: release-drafter/release-drafter@b1476f6e6eb133afa41ed8589daba6dc69b4d3f5 # v6.1.0
uses: release-drafter/release-drafter@v6.1.0
with:
tag: ${{ steps.version.outputs.version }}
name: ${{ steps.version.outputs.version }}

View File

@@ -12,7 +12,7 @@ jobs:
if: github.event.issue.type.name == 'Task'
steps:
- name: Check if user is authorized
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
uses: actions/github-script@v8
with:
script: |
const issueAuthor = context.payload.issue.user.login;

View File

@@ -10,9 +10,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code from GitHub
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Sentry Release
uses: getsentry/action-release@526942b68292201ac6bbb99b9a0747d4abee354c # v3.2.0
uses: getsentry/action-release@v3.2.0
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}

View File

@@ -9,7 +9,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@3a9db7e6a41a89f618792c92c0e97cc736e1b13f # v10.0.0
- uses: actions/stale@v10.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 30

View File

@@ -14,10 +14,10 @@ jobs:
latest_version: ${{ steps.latest_frontend_version.outputs.latest_tag }}
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Get latest frontend release
id: latest_frontend_version
uses: abatilo/release-info-action@32cb932219f1cee3fc4f4a298fd65ead5d35b661 # v1.3.3
uses: abatilo/release-info-action@v1.3.3
with:
owner: home-assistant
repo: frontend
@@ -49,7 +49,7 @@ jobs:
if: needs.check-version.outputs.skip != 'true'
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@v5.0.0
- name: Clear www folder
run: |
rm -rf supervisor/api/panel/*
@@ -57,7 +57,7 @@ jobs:
run: |
echo "${{ needs.check-version.outputs.latest_version }}" > .ha-frontend-version
- name: Download release assets
uses: robinraju/release-downloader@daf26c55d821e836577a15f77d86ddc078948b05 # v1.12
uses: robinraju/release-downloader@v1
with:
repository: 'home-assistant/frontend'
tag: ${{ needs.check-version.outputs.latest_version }}
@@ -68,7 +68,7 @@ jobs:
run: |
rm -f supervisor/api/panel/home_assistant_frontend_supervisor-*.tar.gz
- name: Create PR
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
uses: peter-evans/create-pull-request@v7
with:
commit-message: "Update frontend to version ${{ needs.check-version.outputs.latest_version }}"
branch: autoupdate-frontend

View File

@@ -1 +1 @@
20250811.0
20250903.5

View File

@@ -8,8 +8,8 @@ brotli==1.1.0
ciso8601==2.3.3
colorlog==6.9.0
cpe==1.3.1
cryptography==46.0.1
debugpy==1.8.17
cryptography==45.0.7
debugpy==1.8.16
deepmerge==2.0
dirhash==0.5.0
docker==7.1.0
@@ -23,7 +23,7 @@ pyudev==0.24.3
PyYAML==6.0.2
requests==2.32.5
securetar==2025.2.1
sentry-sdk==2.38.0
sentry-sdk==2.37.1
setuptools==80.9.0
voluptuous==0.15.2
dbus-fast==2.44.3

View File

@@ -10,7 +10,7 @@ pytest-timeout==2.4.0
pytest==8.4.2
ruff==0.13.0
time-machine==2.19.0
types-docker==7.1.0.20250916
types-pyyaml==6.0.12.20250915
types-requests==2.32.4.20250913
types-docker==7.1.0.20250907
types-pyyaml==6.0.12.20250822
types-requests==2.32.4.20250809
urllib3==2.5.0

View File

@@ -66,23 +66,10 @@ if __name__ == "__main__":
_LOGGER.info("Setting up Supervisor")
loop.run_until_complete(coresys.core.setup())
# Create startup task that can be cancelled gracefully
startup_task = loop.create_task(coresys.core.start())
def shutdown_handler() -> None:
"""Handle shutdown signals gracefully during startup."""
if not startup_task.done():
_LOGGER.warning("Supervisor startup interrupted by shutdown signal")
startup_task.cancel()
coresys.create_task(coresys.core.stop())
bootstrap.register_signal_handlers(loop, shutdown_handler)
bootstrap.register_signal_handlers(loop, coresys)
try:
loop.run_until_complete(startup_task)
except asyncio.CancelledError:
_LOGGER.warning("Supervisor startup cancelled")
loop.run_until_complete(coresys.core.start())
except Exception as err: # pylint: disable=broad-except
# Supervisor itself is running at this point, just something didn't
# start as expected. Log with traceback to get more insights for

View File

@@ -93,7 +93,15 @@ class AddonOptions(CoreSysAttributes):
typ = self.raw_schema[key]
try:
options[key] = self._validate_element(typ, value, key)
if isinstance(typ, list):
# nested value list
options[key] = self._nested_validate_list(typ[0], value, key)
elif isinstance(typ, dict):
# nested value dict
options[key] = self._nested_validate_dict(typ, value, key)
else:
# normal value
options[key] = self._single_validate(typ, value, key)
except (IndexError, KeyError):
raise vol.Invalid(
f"Type error for option '{key}' in {self._name} ({self._slug})"
@@ -103,20 +111,7 @@ class AddonOptions(CoreSysAttributes):
return options
# pylint: disable=no-value-for-parameter
def _validate_element(self, typ: Any, value: Any, key: str) -> Any:
"""Validate a value against a type specification."""
if isinstance(typ, list):
# nested value list
return self._nested_validate_list(typ[0], value, key)
elif isinstance(typ, dict):
# nested value dict
return self._nested_validate_dict(typ, value, key)
else:
# normal value
return self._single_validate(typ, value, key)
# pylint: disable=no-value-for-parameter
def _single_validate(self, typ: str, value: Any, key: str) -> Any:
def _single_validate(self, typ: str, value: Any, key: str):
"""Validate a single element."""
# if required argument
if value is None:
@@ -193,9 +188,7 @@ class AddonOptions(CoreSysAttributes):
f"Fatal error for option '{key}' with type '{typ}' in {self._name} ({self._slug})"
) from None
def _nested_validate_list(
self, typ: Any, data_list: list[Any], key: str
) -> list[Any]:
def _nested_validate_list(self, typ: Any, data_list: list[Any], key: str):
"""Validate nested items."""
options = []
@@ -208,13 +201,17 @@ class AddonOptions(CoreSysAttributes):
# Process list
for element in data_list:
# Nested?
options.append(self._validate_element(typ, element, key))
if isinstance(typ, dict):
c_options = self._nested_validate_dict(typ, element, key)
options.append(c_options)
else:
options.append(self._single_validate(typ, element, key))
return options
def _nested_validate_dict(
self, typ: dict[Any, Any], data_dict: dict[Any, Any], key: str
) -> dict[Any, Any]:
):
"""Validate nested items."""
options = {}
@@ -234,7 +231,12 @@ class AddonOptions(CoreSysAttributes):
continue
# Nested?
options[c_key] = self._validate_element(typ[c_key], c_value, c_key)
if isinstance(typ[c_key], list):
options[c_key] = self._nested_validate_list(
typ[c_key][0], c_value, c_key
)
else:
options[c_key] = self._single_validate(typ[c_key], c_value, c_key)
self._check_missing_options(typ, options, key)
return options
@@ -272,28 +274,18 @@ class UiOptions(CoreSysAttributes):
# read options
for key, value in raw_schema.items():
self._ui_schema_element(ui_schema, value, key)
if isinstance(value, list):
# nested value list
self._nested_ui_list(ui_schema, value, key)
elif isinstance(value, dict):
# nested value dict
self._nested_ui_dict(ui_schema, value, key)
else:
# normal value
self._single_ui_option(ui_schema, value, key)
return ui_schema
def _ui_schema_element(
self,
ui_schema: list[dict[str, Any]],
value: str,
key: str,
multiple: bool = False,
):
if isinstance(value, list):
# nested value list
assert not multiple
self._nested_ui_list(ui_schema, value, key)
elif isinstance(value, dict):
# nested value dict
self._nested_ui_dict(ui_schema, value, key, multiple)
else:
# normal value
self._single_ui_option(ui_schema, value, key, multiple)
def _single_ui_option(
self,
ui_schema: list[dict[str, Any]],
@@ -385,7 +377,10 @@ class UiOptions(CoreSysAttributes):
_LOGGER.error("Invalid schema %s", key)
return
self._ui_schema_element(ui_schema, element, key, multiple=True)
if isinstance(element, dict):
self._nested_ui_dict(ui_schema, element, key, multiple=True)
else:
self._single_ui_option(ui_schema, element, key, multiple=True)
def _nested_ui_dict(
self,
@@ -404,7 +399,11 @@ class UiOptions(CoreSysAttributes):
nested_schema: list[dict[str, Any]] = []
for c_key, c_value in option_dict.items():
self._ui_schema_element(nested_schema, c_value, c_key)
# Nested?
if isinstance(c_value, list):
self._nested_ui_list(nested_schema, c_value, c_key)
else:
self._single_ui_option(nested_schema, c_value, c_key)
ui_node["schema"] = nested_schema
ui_schema.append(ui_node)

View File

@@ -32,7 +32,6 @@ from ..const import (
ATTR_DISCOVERY,
ATTR_DOCKER_API,
ATTR_ENVIRONMENT,
ATTR_FIELDS,
ATTR_FULL_ACCESS,
ATTR_GPIO,
ATTR_HASSIO_API,
@@ -138,19 +137,7 @@ RE_DOCKER_IMAGE_BUILD = re.compile(
r"^([a-zA-Z\-\.:\d{}]+/)*?([\-\w{}]+)/([\-\w{}]+)(:[\.\-\w{}]+)?$"
)
SCHEMA_ELEMENT = vol.Schema(
vol.Any(
vol.Match(RE_SCHEMA_ELEMENT),
[
# A list may not directly contain another list
vol.Any(
vol.Match(RE_SCHEMA_ELEMENT),
{str: vol.Self},
)
],
{str: vol.Self},
)
)
SCHEMA_ELEMENT = vol.Match(RE_SCHEMA_ELEMENT)
RE_MACHINE = re.compile(
r"^!?(?:"
@@ -419,7 +406,20 @@ _SCHEMA_ADDON_CONFIG = vol.Schema(
vol.Optional(ATTR_CODENOTARY): vol.Email(),
vol.Optional(ATTR_OPTIONS, default={}): dict,
vol.Optional(ATTR_SCHEMA, default={}): vol.Any(
vol.Schema({str: SCHEMA_ELEMENT}),
vol.Schema(
{
str: vol.Any(
SCHEMA_ELEMENT,
[
vol.Any(
SCHEMA_ELEMENT,
{str: vol.Any(SCHEMA_ELEMENT, [SCHEMA_ELEMENT])},
)
],
vol.Schema({str: vol.Any(SCHEMA_ELEMENT, [SCHEMA_ELEMENT])}),
)
}
),
False,
),
vol.Optional(ATTR_IMAGE): docker_image,
@@ -455,7 +455,6 @@ SCHEMA_TRANSLATION_CONFIGURATION = vol.Schema(
{
vol.Required(ATTR_NAME): str,
vol.Optional(ATTR_DESCRIPTON): vol.Maybe(str),
vol.Optional(ATTR_FIELDS): {str: vol.Self},
},
extra=vol.REMOVE_EXTRA,
)

View File

@@ -146,14 +146,6 @@ class RestAPI(CoreSysAttributes):
follow=True,
),
),
web.get(
f"{path}/logs/latest",
partial(
self._api_host.advanced_logs,
identifier=syslog_identifier,
latest=True,
),
),
web.get(
f"{path}/logs/boots/{{bootid}}",
partial(self._api_host.advanced_logs, identifier=syslog_identifier),
@@ -448,7 +440,6 @@ class RestAPI(CoreSysAttributes):
# is known and reported to the user using the resolution center.
await async_capture_exception(err)
kwargs.pop("follow", None) # Follow is not supported for Docker logs
kwargs.pop("latest", None) # Latest is not supported for Docker logs
return await api_supervisor.logs(*args, **kwargs)
self.webapp.add_routes(
@@ -458,10 +449,6 @@ class RestAPI(CoreSysAttributes):
"/supervisor/logs/follow",
partial(get_supervisor_logs, follow=True),
),
web.get(
"/supervisor/logs/latest",
partial(get_supervisor_logs, latest=True),
),
web.get("/supervisor/logs/boots/{bootid}", get_supervisor_logs),
web.get(
"/supervisor/logs/boots/{bootid}/follow",
@@ -574,10 +561,6 @@ class RestAPI(CoreSysAttributes):
"/addons/{addon}/logs/follow",
partial(get_addon_logs, follow=True),
),
web.get(
"/addons/{addon}/logs/latest",
partial(get_addon_logs, latest=True),
),
web.get("/addons/{addon}/logs/boots/{bootid}", get_addon_logs),
web.get(
"/addons/{addon}/logs/boots/{bootid}/follow",

View File

@@ -2,17 +2,10 @@
import asyncio
from contextlib import suppress
import json
import logging
from typing import Any
from aiohttp import (
ClientConnectionResetError,
ClientError,
ClientPayloadError,
ClientTimeout,
web,
)
from aiohttp import ClientConnectionResetError, ClientPayloadError, web
from aiohttp.hdrs import ACCEPT, RANGE
import voluptuous as vol
from voluptuous.error import CoerceInvalid
@@ -201,11 +194,7 @@ class APIHost(CoreSysAttributes):
return possible_offset
async def advanced_logs_handler(
self,
request: web.Request,
identifier: str | None = None,
follow: bool = False,
latest: bool = False,
self, request: web.Request, identifier: str | None = None, follow: bool = False
) -> web.StreamResponse:
"""Return systemd-journald logs."""
log_formatter = LogFormatter.PLAIN
@@ -224,20 +213,6 @@ class APIHost(CoreSysAttributes):
if follow:
params[PARAM_FOLLOW] = ""
if latest:
if not identifier:
raise APIError(
"Latest logs can only be fetched for a specific identifier."
)
try:
epoch = await self._get_container_last_epoch(identifier)
params["CONTAINER_LOG_EPOCH"] = epoch
except HostLogError as err:
raise APIError(
f"Cannot determine CONTAINER_LOG_EPOCH of {identifier}, latest logs not available."
) from err
if ACCEPT in request.headers and request.headers[ACCEPT] not in [
CONTENT_TYPE_TEXT,
CONTENT_TYPE_X_LOG,
@@ -266,8 +241,6 @@ class APIHost(CoreSysAttributes):
lines = max(2, lines)
# entries=cursor[[:num_skip]:num_entries]
range_header = f"entries=:-{lines - 1}:{SYSTEMD_JOURNAL_GATEWAYD_LINES_MAX if follow else lines}"
elif latest:
range_header = f"entries=0:{SYSTEMD_JOURNAL_GATEWAYD_LINES_MAX}"
elif RANGE in request.headers:
range_header = request.headers[RANGE]
else:
@@ -313,14 +286,10 @@ class APIHost(CoreSysAttributes):
@api_process_raw(CONTENT_TYPE_TEXT, error_type=CONTENT_TYPE_TEXT)
async def advanced_logs(
self,
request: web.Request,
identifier: str | None = None,
follow: bool = False,
latest: bool = False,
self, request: web.Request, identifier: str | None = None, follow: bool = False
) -> web.StreamResponse:
"""Return systemd-journald logs. Wrapped as standard API handler."""
return await self.advanced_logs_handler(request, identifier, follow, latest)
return await self.advanced_logs_handler(request, identifier, follow)
@api_process
async def disk_usage(self, request: web.Request) -> dict:
@@ -367,27 +336,3 @@ class APIHost(CoreSysAttributes):
*known_paths,
],
}
async def _get_container_last_epoch(self, identifier: str) -> str | None:
"""Get Docker's internal log epoch of the latest log entry for the given identifier."""
try:
async with self.sys_host.logs.journald_logs(
params={"CONTAINER_NAME": identifier},
range_header="entries=:-1:2", # -1 = next to the last entry
accept=LogFormat.JSON,
timeout=ClientTimeout(total=10),
) as resp:
text = await resp.text()
except (ClientError, TimeoutError) as err:
raise HostLogError(
"Could not get last container epoch from systemd-journal-gatewayd",
_LOGGER.error,
) from err
try:
return json.loads(text.strip().split("\n")[-1])["CONTAINER_LOG_EPOCH"]
except (json.JSONDecodeError, KeyError, IndexError) as err:
raise HostLogError(
f"Failed to parse CONTAINER_LOG_EPOCH of {identifier} container, got: {text}",
_LOGGER.error,
) from err

View File

@@ -1 +1 @@
!function(){function d(d){var e=document.createElement("script");e.src=d,document.body.appendChild(e)}if(/Edge?\/(12[89]|1[3-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(12[89]|1[3-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(109|1[1-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(18\.\d+|(19|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(1{2}[3-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(16[._]([6-9]|\d{2,})|(1[7-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](12[89]|1[3-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(13\d|1[4-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(12[89]|1[3-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/(2[7-9]|[3-9]\d|\d{3,})\.\d+|Home As{2}istant\/[\d.]+ \(.+; macOS (1[3-9]|[2-9]\d|\d{3,})\.\d+(\.\d+)?\)/.test(navigator.userAgent))try{new Function("import('/api/hassio/app/frontend_latest/entrypoint.13b942f66af14ae7.js')")()}catch(e){d("/api/hassio/app/frontend_es5/entrypoint.4fccc51701dd6142.js")}else d("/api/hassio/app/frontend_es5/entrypoint.4fccc51701dd6142.js")}()
!function(){function d(d){var e=document.createElement("script");e.src=d,document.body.appendChild(e)}if(/Edge?\/(129|1[3-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(12[89]|1[3-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(109|1[1-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(18\.\d+|(19|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(18[._]\d+|(19|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](129|1[3-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(13[1-9]|1[4-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(129|1[3-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/(2[89]|[3-9]\d|\d{3,})\.\d+|Home As{2}istant\/[\d.]+ \(.+; macOS (1[3-9]|[2-9]\d|\d{3,})\.\d+(\.\d+)?\)/.test(navigator.userAgent))try{new Function("import('/api/hassio/app/frontend_latest/entrypoint.7fa1b2078e8f7b31.js')")()}catch(e){d("/api/hassio/app/frontend_es5/entrypoint.4a8da09f39f2cd8b.js")}else d("/api/hassio/app/frontend_es5/entrypoint.4a8da09f39f2cd8b.js")}()

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"version":3,"file":"113.13cc15fa81bd492f.js","sources":["https://raw.githubusercontent.com/home-assistant/frontend/20250811.0/src/components/ha-icon-button-arrow-next.ts"],"names":["HaIconButtonArrowNext","LitElement","render","_this$hass","html","_t","_","this","disabled","label","hass","localize","_icon","args","mainWindow","attribute","type","Boolean"],"mappings":"4RASO,MAAMA,UAA8BC,EAAAA,GAU/BC,MAAAA,GAAyB,IAAAC,EACjC,OAAOC,EAAAA,EAAAA,IAAIC,IAAAA,EAAAC,CAAA,mFAEKC,KAAKC,SACRD,KAAKE,QAAkB,QAAbN,EAAII,KAAKG,YAAI,IAAAP,OAAA,EAATA,EAAWQ,SAAS,oBAAqB,OACxDJ,KAAKK,MAGnB,C,kBAlBK,SAAAC,GAAA,KAG+BL,UAAW,OAI9BI,MACa,QAA5BE,EAAAA,EAAAA,SAAAA,I,gLAPUC,WAAW,K,uDAEXC,KAAMC,W"}
{"version":3,"file":"113.13cc15fa81bd492f.js","sources":["https://raw.githubusercontent.com/home-assistant/frontend/20250903.5/src/components/ha-icon-button-arrow-next.ts"],"names":["HaIconButtonArrowNext","LitElement","render","_this$hass","html","_t","_","this","disabled","label","hass","localize","_icon","args","mainWindow","attribute","type","Boolean"],"mappings":"4RASO,MAAMA,UAA8BC,EAAAA,GAU/BC,MAAAA,GAAyB,IAAAC,EACjC,OAAOC,EAAAA,EAAAA,IAAIC,IAAAA,EAAAC,CAAA,mFAEKC,KAAKC,SACRD,KAAKE,QAAkB,QAAbN,EAAII,KAAKG,YAAI,IAAAP,OAAA,EAATA,EAAWQ,SAAS,oBAAqB,OACxDJ,KAAKK,MAGnB,C,kBAlBK,SAAAC,GAAA,KAG+BL,UAAW,OAI9BI,MACa,QAA5BE,EAAAA,EAAAA,SAAAA,I,gLAPUC,WAAW,K,uDAEXC,KAAMC,W"}

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

View File

@@ -1 +1 @@
{"version":3,"file":"1303.586b15f0603e938e.js","sources":["https://raw.githubusercontent.com/home-assistant/frontend/20250811.0/src/components/ha-form/ha-form-constant.ts"],"names":["HaFormConstant","LitElement","render","html","_t","_","this","label","schema","value","styles","css","_t2","attribute"],"mappings":"kPAMO,MAAMA,UAAuBC,EAAAA,GAKxBC,MAAAA,GACR,OAAOC,EAAAA,EAAAA,IAAIC,IAAAA,EAAAC,CAAA,uBAAuB,WAAvB,KAAuBC,KAAKC,MAAeD,KAAKE,OAAOC,MAC5D,KAAKH,KAAKE,OAAOC,QACjB,GACR,EATWT,EAWJU,QAASC,EAAAA,EAAAA,IAAGC,IAAAA,EAAAP,CAAA,0E,2BAVPQ,WAAW,K"}
{"version":3,"file":"1303.586b15f0603e938e.js","sources":["https://raw.githubusercontent.com/home-assistant/frontend/20250903.5/src/components/ha-form/ha-form-constant.ts"],"names":["HaFormConstant","LitElement","render","html","_t","_","this","label","schema","value","styles","css","_t2","attribute"],"mappings":"kPAMO,MAAMA,UAAuBC,EAAAA,GAKxBC,MAAAA,GACR,OAAOC,EAAAA,EAAAA,IAAIC,IAAAA,EAAAC,CAAA,uBAAuB,WAAvB,KAAuBC,KAAKC,MAAeD,KAAKE,OAAOC,MAC5D,KAAKH,KAAKE,OAAOC,QACjB,GACR,EATWT,EAWJU,QAASC,EAAAA,EAAAA,IAAGC,IAAAA,EAAAP,CAAA,0E,2BAVPQ,WAAW,K"}

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"version":3,"file":"1374.3202a7d8086556de.js","sources":["https://raw.githubusercontent.com/home-assistant/frontend/20250811.0/src/components/ha-icon-next.ts"],"names":["HaIconNext","HaSvgIcon","args","path","mainWindow"],"mappings":"yPAMO,MAAMA,UAAmBC,EAAAA,U,kBAAzB,SAAAC,GAAA,KACuBC,KACE,QAA5BC,EAAAA,EAAAA,SAAAA,I"}
{"version":3,"file":"1374.3202a7d8086556de.js","sources":["https://raw.githubusercontent.com/home-assistant/frontend/20250903.5/src/components/ha-icon-next.ts"],"names":["HaIconNext","HaSvgIcon","args","path","mainWindow"],"mappings":"yPAMO,MAAMA,UAAmBC,EAAAA,U,kBAAzB,SAAAC,GAAA,KACuBC,KACE,QAA5BC,EAAAA,EAAAA,SAAAA,I"}

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

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

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

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

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

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

View File

@@ -0,0 +1,5 @@
"use strict";(self.webpackChunkhome_assistant_frontend=self.webpackChunkhome_assistant_frontend||[]).push([["174"],{32107:function(a,e,t){t.a(a,async function(a,i){try{t.r(e),t.d(e,{HaDialogDatePicker:function(){return b}});t(26847),t(1455),t(27530);var o=t(73742),r=t(53246),l=t(16973),d=t(59048),n=t(7616),c=t(39884),s=t(65863),p=t(95814),h=(t(83378),t(72953)),u=a([r,h]);[r,h]=u.then?(await u)():u;let g,v,m,_=a=>a;class b extends d.oi{async showDialog(a){await(0,s.y)(),this._params=a,this._value=a.value}closeDialog(){this._params=void 0,(0,c.B)(this,"dialog-closed",{dialog:this.localName})}render(){return this._params?(0,d.dy)(g||(g=_`<ha-dialog open @closed="${0}"> <app-datepicker .value="${0}" .min="${0}" .max="${0}" .locale="${0}" @datepicker-value-updated="${0}" .firstDayOfWeek="${0}"></app-datepicker> ${0} <ha-button appearance="plain" slot="secondaryAction" @click="${0}"> ${0} </ha-button> <ha-button appearance="plain" slot="primaryAction" dialogaction="cancel" class="cancel-btn"> ${0} </ha-button> <ha-button slot="primaryAction" @click="${0}"> ${0} </ha-button> </ha-dialog>`),this.closeDialog,this._value,this._params.min,this._params.max,this._params.locale,this._valueChanged,this._params.firstWeekday,this._params.canClear?(0,d.dy)(v||(v=_`<ha-button slot="secondaryAction" @click="${0}" variant="danger" appearance="plain"> ${0} </ha-button>`),this._clear,this.hass.localize("ui.dialogs.date-picker.clear")):d.Ld,this._setToday,this.hass.localize("ui.dialogs.date-picker.today"),this.hass.localize("ui.common.cancel"),this._setValue,this.hass.localize("ui.common.ok")):d.Ld}_valueChanged(a){this._value=a.detail.value}_clear(){var a;null===(a=this._params)||void 0===a||a.onChange(void 0),this.closeDialog()}_setToday(){const a=new Date;this._value=(0,l.WU)(a,"yyyy-MM-dd")}_setValue(){var a;this._value||this._setToday(),null===(a=this._params)||void 0===a||a.onChange(this._value),this.closeDialog()}constructor(...a){super(...a),this.disabled=!1}}b.styles=[p.yu,(0,d.iv)(m||(m=_`ha-dialog{--dialog-content-padding:0;--justify-action-buttons:space-between}app-datepicker{--app-datepicker-accent-color:var(--primary-color);--app-datepicker-bg-color:transparent;--app-datepicker-color:var(--primary-text-color);--app-datepicker-disabled-day-color:var(--disabled-text-color);--app-datepicker-focused-day-color:var(--text-primary-color);--app-datepicker-focused-year-bg-color:var(--primary-color);--app-datepicker-selector-color:var(--secondary-text-color);--app-datepicker-separator-color:var(--divider-color);--app-datepicker-weekday-color:var(--secondary-text-color)}app-datepicker::part(calendar-day):focus{outline:0}app-datepicker::part(body){direction:ltr}@media all and (min-width:450px){ha-dialog{--mdc-dialog-min-width:300px}}@media all and (max-width:450px),all and (max-height:500px){app-datepicker{width:100%}}`))],(0,o.__decorate)([(0,n.Cb)({attribute:!1})],b.prototype,"hass",void 0),(0,o.__decorate)([(0,n.Cb)()],b.prototype,"value",void 0),(0,o.__decorate)([(0,n.Cb)({type:Boolean})],b.prototype,"disabled",void 0),(0,o.__decorate)([(0,n.Cb)()],b.prototype,"label",void 0),(0,o.__decorate)([(0,n.SB)()],b.prototype,"_params",void 0),(0,o.__decorate)([(0,n.SB)()],b.prototype,"_value",void 0),b=(0,o.__decorate)([(0,n.Mo)("ha-dialog-date-picker")],b),i()}catch(g){i(g)}})},83378:function(a,e,t){t.d(e,{i:function(){return u}});t(26847),t(27530),t(44776);var i=t(73742),o=t(24004),r=t(75907),l=t(59048),d=t(7616);t(60115),t(81777);let n,c,s,p=a=>a;const h=["button","ha-list-item"],u=(a,e)=>{var t;return(0,l.dy)(n||(n=p` <div class="header_title"> <ha-icon-button .label="${0}" .path="${0}" dialogAction="close" class="header_button"></ha-icon-button> <span>${0}</span> </div> `),null!==(t=null==a?void 0:a.localize("ui.common.close"))&&void 0!==t?t:"Close","M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z",e)};class g extends o.M{scrollToPos(a,e){var t;null===(t=this.contentElement)||void 0===t||t.scrollTo(a,e)}renderHeading(){return(0,l.dy)(c||(c=p`<slot name="heading"> ${0} </slot>`),super.renderHeading())}firstUpdated(){var a;super.firstUpdated(),this.suppressDefaultPressSelector=[this.suppressDefaultPressSelector,h].join(", "),this._updateScrolledAttribute(),null===(a=this.contentElement)||void 0===a||a.addEventListener("scroll",this._onScroll,{passive:!0})}disconnectedCallback(){super.disconnectedCallback(),this.contentElement.removeEventListener("scroll",this._onScroll)}_updateScrolledAttribute(){this.contentElement&&this.toggleAttribute("scrolled",0!==this.contentElement.scrollTop)}constructor(...a){super(...a),this._onScroll=()=>{this._updateScrolledAttribute()}}}g.styles=[r.W,(0,l.iv)(s||(s=p`:host([scrolled]) ::slotted(ha-dialog-header){border-bottom:1px solid var(--mdc-dialog-scroll-divider-color,rgba(0,0,0,.12))}.mdc-dialog{--mdc-dialog-scroll-divider-color:var(
--dialog-scroll-divider-color,
var(--divider-color)
);z-index:var(--dialog-z-index,8);-webkit-backdrop-filter:var(--ha-dialog-scrim-backdrop-filter,var(--dialog-backdrop-filter,none));backdrop-filter:var(--ha-dialog-scrim-backdrop-filter,var(--dialog-backdrop-filter,none));--mdc-dialog-box-shadow:var(--dialog-box-shadow, none);--mdc-typography-headline6-font-weight:var(--ha-font-weight-normal);--mdc-typography-headline6-font-size:1.574rem}.mdc-dialog__actions{justify-content:var(--justify-action-buttons,flex-end);padding:12px 16px max(var(--safe-area-inset-bottom),16px) 16px}.mdc-dialog__actions span:first-child{flex:var(--secondary-action-button-flex,unset)}.mdc-dialog__actions span:nth-child(2){flex:var(--primary-action-button-flex,unset)}.mdc-dialog__container{align-items:var(--vertical-align-dialog,center)}.mdc-dialog__title{padding:16px 16px 0 16px}.mdc-dialog__title:has(span){padding:12px 12px 0}.mdc-dialog__title::before{content:unset}.mdc-dialog .mdc-dialog__content{position:var(--dialog-content-position,relative);padding:var(--dialog-content-padding,24px)}:host([hideactions]) .mdc-dialog .mdc-dialog__content{padding-bottom:max(var(--dialog-content-padding,24px),var(--safe-area-inset-bottom))}.mdc-dialog .mdc-dialog__surface{position:var(--dialog-surface-position,relative);top:var(--dialog-surface-top);margin-top:var(--dialog-surface-margin-top);min-height:var(--mdc-dialog-min-height,auto);border-radius:var(--ha-dialog-border-radius,24px);-webkit-backdrop-filter:var(--ha-dialog-surface-backdrop-filter,none);backdrop-filter:var(--ha-dialog-surface-backdrop-filter,none);background:var(--ha-dialog-surface-background,var(--mdc-theme-surface,#fff))}:host([flexContent]) .mdc-dialog .mdc-dialog__content{display:flex;flex-direction:column}.header_title{display:flex;align-items:center;direction:var(--direction)}.header_title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;padding-left:4px;padding-right:4px;margin-right:12px;margin-inline-end:12px;margin-inline-start:initial}.header_button{text-decoration:none;color:inherit;inset-inline-start:initial;inset-inline-end:-12px;direction:var(--direction)}.dialog-actions{inset-inline-start:initial!important;inset-inline-end:0px!important;direction:var(--direction)}`))],g=(0,i.__decorate)([(0,d.Mo)("ha-dialog")],g)}}]);
//# sourceMappingURL=174.27e6e2c221cab52d.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"174.27e6e2c221cab52d.js","sources":["https://raw.githubusercontent.com/home-assistant/frontend/20250903.5/src/components/ha-dialog-date-picker.ts","https://raw.githubusercontent.com/home-assistant/frontend/20250903.5/src/components/ha-dialog.ts"],"names":["HaDialogDatePicker","LitElement","showDialog","params","nextRender","this","_params","_value","value","closeDialog","undefined","fireEvent","dialog","localName","render","html","_t","_","min","max","locale","_valueChanged","firstWeekday","canClear","_t2","_clear","hass","localize","nothing","_setToday","_setValue","ev","detail","_this$_params","onChange","today","Date","format","_this$_params2","args","disabled","styles","haStyleDialog","css","_t3","attribute","type","Boolean","SUPPRESS_DEFAULT_PRESS_SELECTOR","createCloseHeading","title","_hass$localize","HaDialog","DialogBase","scrollToPos","x","y","_this$contentElement","contentElement","scrollTo","renderHeading","super","firstUpdated","_this$contentElement2","suppressDefaultPressSelector","join","_updateScrolledAttribute","addEventListener","_onScroll","passive","disconnectedCallback","removeEventListener","toggleAttribute","scrollTop"],"mappings":"kaAaO,MAAMA,UAA2BC,EAAAA,GAatC,gBAAaC,CAAWC,SAGhBC,EAAAA,EAAAA,KACNC,KAAKC,QAAUH,EACfE,KAAKE,OAASJ,EAAOK,KACvB,CAEOC,WAAAA,GACLJ,KAAKC,aAAUI,GACfC,EAAAA,EAAAA,GAAUN,KAAM,gBAAiB,CAAEO,OAAQP,KAAKQ,WAClD,CAEAC,MAAAA,GACE,OAAKT,KAAKC,SAGHS,EAAAA,EAAAA,IAAIC,IAAAA,EAAAC,CAAA,0cAA2BZ,KAAKI,YAE9BJ,KAAKE,OACPF,KAAKC,QAAQY,IACbb,KAAKC,QAAQa,IACVd,KAAKC,QAAQc,OACKf,KAAKgB,cACfhB,KAAKC,QAAQgB,aAE/BjB,KAAKC,QAAQiB,UACXR,EAAAA,EAAAA,IAAIS,IAAAA,EAAAP,CAAA,0GAEOZ,KAAKoB,OAIZpB,KAAKqB,KAAKC,SAAS,iCAEvBC,EAAAA,GAIOvB,KAAKwB,UAEZxB,KAAKqB,KAAKC,SAAS,gCAQnBtB,KAAKqB,KAAKC,SAAS,oBAEkBtB,KAAKyB,UAC1CzB,KAAKqB,KAAKC,SAAS,iBArChBC,EAAAA,EAwCX,CAEQP,aAAAA,CAAcU,GACpB1B,KAAKE,OAASwB,EAAGC,OAAOxB,KAC1B,CAEQiB,MAAAA,GAAS,IAAAQ,EACH,QAAZA,EAAA5B,KAAKC,eAAO,IAAA2B,GAAZA,EAAcC,cAASxB,GACvBL,KAAKI,aACP,CAEQoB,SAAAA,GACN,MAAMM,EAAQ,IAAIC,KAClB/B,KAAKE,QAAS8B,EAAAA,EAAAA,IAAOF,EAAO,aAC9B,CAEQL,SAAAA,GAAY,IAAAQ,EACbjC,KAAKE,QAGRF,KAAKwB,YAEK,QAAZS,EAAAjC,KAAKC,eAAO,IAAAgC,GAAZA,EAAcJ,SAAS7B,KAAKE,QAC5BF,KAAKI,aACP,C,kBA5FK,SAAA8B,GAAA,KAK+BC,UAAW,C,EALpCxC,EA8FJyC,OAAS,CACdC,EAAAA,IACAC,EAAAA,EAAAA,IAAGC,IAAAA,EAAA3B,CAAA,60B,2BA/FO4B,WAAW,K,iHAIXC,KAAMC,W,8cCjByC,MASvDC,EAAkC,CAAC,SAAU,gBAEtCC,EAAqBA,CAChCvB,EACAwB,KAAA,IAAAC,EAAA,OACGpC,EAAAA,EAAAA,IAAIC,IAAAA,EAAAC,CAAA,iKAGqB,QAHrBkC,EAGMzB,aAAA,EAAAA,EAAMC,SAAS,8BAAAwB,EAAAA,EAAsB,QAjBS,gHAsBjDD,IAKL,MAAME,UAAiBC,EAAAA,EAGrBC,WAAAA,CAAYC,EAAWC,GAAW,IAAAC,EACpB,QAAnBA,EAAApD,KAAKqD,sBAAc,IAAAD,GAAnBA,EAAqBE,SAASJ,EAAGC,EACnC,CAEUI,aAAAA,GACR,OAAO7C,EAAAA,EAAAA,IAAIS,IAAAA,EAAAP,CAAA,yBAAyB,aAAA4C,MAAMD,gBAC5C,CAEUE,YAAAA,GAAqB,IAAAC,EAC7BF,MAAMC,eACNzD,KAAK2D,6BAA+B,CAClC3D,KAAK2D,6BACLhB,GACAiB,KAAK,MACP5D,KAAK6D,2BACc,QAAnBH,EAAA1D,KAAKqD,sBAAc,IAAAK,GAAnBA,EAAqBI,iBAAiB,SAAU9D,KAAK+D,UAAW,CAC9DC,SAAS,GAEb,CAEAC,oBAAAA,GACET,MAAMS,uBACNjE,KAAKqD,eAAea,oBAAoB,SAAUlE,KAAK+D,UACzD,CAMQF,wBAAAA,GACD7D,KAAKqD,gBACVrD,KAAKmE,gBAAgB,WAA8C,IAAlCnE,KAAKqD,eAAee,UACvD,C,kBAnCK,SAAAlC,GAAA,KA4BG6B,UAAY,KAClB/D,KAAK6D,2B,EA7BId,EAqCKX,OAAS,CACvBA,EAAAA,GACAE,EAAAA,EAAAA,IAAGC,IAAAA,EAAA3B,CAAA"}

View File

@@ -1,5 +0,0 @@
"use strict";(self.webpackChunkhome_assistant_frontend=self.webpackChunkhome_assistant_frontend||[]).push([["174"],{32107:function(a,e,t){t.a(a,async function(a,o){try{t.r(e),t.d(e,{HaDialogDatePicker:function(){return b}});t(26847),t(1455),t(27530);var i=t(73742),r=t(53246),l=t(16973),d=t(59048),n=t(7616),c=t(39884),s=t(65863),p=t(95814),h=(t(83378),t(72953)),u=a([r,h]);[r,h]=u.then?(await u)():u;let g,v,m,_=a=>a;class b extends d.oi{async showDialog(a){await(0,s.y)(),this._params=a,this._value=a.value}closeDialog(){this._params=void 0,(0,c.B)(this,"dialog-closed",{dialog:this.localName})}render(){return this._params?(0,d.dy)(g||(g=_`<ha-dialog open @closed="${0}"> <app-datepicker .value="${0}" .min="${0}" .max="${0}" .locale="${0}" @datepicker-value-updated="${0}" .firstDayOfWeek="${0}"></app-datepicker> ${0} <ha-button appearance="plain" slot="secondaryAction" @click="${0}"> ${0} </ha-button> <ha-button appearance="plain" slot="primaryAction" dialogaction="cancel" class="cancel-btn"> ${0} </ha-button> <ha-button slot="primaryAction" @click="${0}"> ${0} </ha-button> </ha-dialog>`),this.closeDialog,this._value,this._params.min,this._params.max,this._params.locale,this._valueChanged,this._params.firstWeekday,this._params.canClear?(0,d.dy)(v||(v=_`<ha-button slot="secondaryAction" @click="${0}" variant="danger" appearance="plain"> ${0} </ha-button>`),this._clear,this.hass.localize("ui.dialogs.date-picker.clear")):d.Ld,this._setToday,this.hass.localize("ui.dialogs.date-picker.today"),this.hass.localize("ui.common.cancel"),this._setValue,this.hass.localize("ui.common.ok")):d.Ld}_valueChanged(a){this._value=a.detail.value}_clear(){var a;null===(a=this._params)||void 0===a||a.onChange(void 0),this.closeDialog()}_setToday(){const a=new Date;this._value=(0,l.WU)(a,"yyyy-MM-dd")}_setValue(){var a;this._value||this._setToday(),null===(a=this._params)||void 0===a||a.onChange(this._value),this.closeDialog()}constructor(...a){super(...a),this.disabled=!1}}b.styles=[p.yu,(0,d.iv)(m||(m=_`ha-dialog{--dialog-content-padding:0;--justify-action-buttons:space-between}app-datepicker{--app-datepicker-accent-color:var(--primary-color);--app-datepicker-bg-color:transparent;--app-datepicker-color:var(--primary-text-color);--app-datepicker-disabled-day-color:var(--disabled-text-color);--app-datepicker-focused-day-color:var(--text-primary-color);--app-datepicker-focused-year-bg-color:var(--primary-color);--app-datepicker-selector-color:var(--secondary-text-color);--app-datepicker-separator-color:var(--divider-color);--app-datepicker-weekday-color:var(--secondary-text-color)}app-datepicker::part(calendar-day):focus{outline:0}app-datepicker::part(body){direction:ltr}@media all and (min-width:450px){ha-dialog{--mdc-dialog-min-width:300px}}@media all and (max-width:450px),all and (max-height:500px){app-datepicker{width:100%}}`))],(0,i.__decorate)([(0,n.Cb)({attribute:!1})],b.prototype,"hass",void 0),(0,i.__decorate)([(0,n.Cb)()],b.prototype,"value",void 0),(0,i.__decorate)([(0,n.Cb)({type:Boolean})],b.prototype,"disabled",void 0),(0,i.__decorate)([(0,n.Cb)()],b.prototype,"label",void 0),(0,i.__decorate)([(0,n.SB)()],b.prototype,"_params",void 0),(0,i.__decorate)([(0,n.SB)()],b.prototype,"_value",void 0),b=(0,i.__decorate)([(0,n.Mo)("ha-dialog-date-picker")],b),o()}catch(g){o(g)}})},83378:function(a,e,t){t.d(e,{i:function(){return u}});t(26847),t(27530),t(44776);var o=t(73742),i=t(24004),r=t(75907),l=t(59048),d=t(7616);t(60115),t(81777);let n,c,s,p=a=>a;const h=["button","ha-list-item"],u=(a,e)=>{var t;return(0,l.dy)(n||(n=p` <div class="header_title"> <ha-icon-button .label="${0}" .path="${0}" dialogAction="close" class="header_button"></ha-icon-button> <span>${0}</span> </div> `),null!==(t=null==a?void 0:a.localize("ui.common.close"))&&void 0!==t?t:"Close","M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z",e)};class g extends i.M{scrollToPos(a,e){var t;null===(t=this.contentElement)||void 0===t||t.scrollTo(a,e)}renderHeading(){return(0,l.dy)(c||(c=p`<slot name="heading"> ${0} </slot>`),super.renderHeading())}firstUpdated(){var a;super.firstUpdated(),this.suppressDefaultPressSelector=[this.suppressDefaultPressSelector,h].join(", "),this._updateScrolledAttribute(),null===(a=this.contentElement)||void 0===a||a.addEventListener("scroll",this._onScroll,{passive:!0})}disconnectedCallback(){super.disconnectedCallback(),this.contentElement.removeEventListener("scroll",this._onScroll)}_updateScrolledAttribute(){this.contentElement&&this.toggleAttribute("scrolled",0!==this.contentElement.scrollTop)}constructor(...a){super(...a),this._onScroll=()=>{this._updateScrolledAttribute()}}}g.styles=[r.W,(0,l.iv)(s||(s=p`:host([scrolled]) ::slotted(ha-dialog-header){border-bottom:1px solid var(--mdc-dialog-scroll-divider-color,rgba(0,0,0,.12))}.mdc-dialog{--mdc-dialog-scroll-divider-color:var(
--dialog-scroll-divider-color,
var(--divider-color)
);z-index:var(--dialog-z-index,8);-webkit-backdrop-filter:var(--ha-dialog-scrim-backdrop-filter,var(--dialog-backdrop-filter,none));backdrop-filter:var(--ha-dialog-scrim-backdrop-filter,var(--dialog-backdrop-filter,none));--mdc-dialog-box-shadow:var(--dialog-box-shadow, none);--mdc-typography-headline6-font-weight:var(--ha-font-weight-normal);--mdc-typography-headline6-font-size:1.574rem}.mdc-dialog__actions{justify-content:var(--justify-action-buttons,flex-end);padding:12px 16px max(var(--safe-area-inset-bottom),16px) 16px}.mdc-dialog__actions span:first-child{flex:var(--secondary-action-button-flex,unset)}.mdc-dialog__actions span:nth-child(2){flex:var(--primary-action-button-flex,unset)}.mdc-dialog__container{align-items:var(--vertical-align-dialog,center)}.mdc-dialog__title{padding:16px 16px 0 16px}.mdc-dialog__title:has(span){padding:12px 12px 0}.mdc-dialog__title::before{content:unset}.mdc-dialog .mdc-dialog__content{position:var(--dialog-content-position,relative);padding:var(--dialog-content-padding,24px)}:host([hideactions]) .mdc-dialog .mdc-dialog__content{padding-bottom:max(var(--dialog-content-padding,24px),var(--safe-area-inset-bottom))}.mdc-dialog .mdc-dialog__surface{position:var(--dialog-surface-position,relative);top:var(--dialog-surface-top);margin-top:var(--dialog-surface-margin-top);min-height:var(--mdc-dialog-min-height,auto);border-radius:var(--ha-dialog-border-radius,24px);-webkit-backdrop-filter:var(--ha-dialog-surface-backdrop-filter,none);backdrop-filter:var(--ha-dialog-surface-backdrop-filter,none);background:var(--ha-dialog-surface-background,var(--mdc-theme-surface,#fff))}:host([flexContent]) .mdc-dialog .mdc-dialog__content{display:flex;flex-direction:column}.header_title{display:flex;align-items:center;direction:var(--direction)}.header_title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;padding-left:4px}.header_button{text-decoration:none;color:inherit;inset-inline-start:initial;inset-inline-end:-12px;direction:var(--direction)}.dialog-actions{inset-inline-start:initial!important;inset-inline-end:0px!important;direction:var(--direction)}`))],g=(0,o.__decorate)([(0,d.Mo)("ha-dialog")],g)}}]);
//# sourceMappingURL=174.ee01401de6dea936.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"174.ee01401de6dea936.js","sources":["https://raw.githubusercontent.com/home-assistant/frontend/20250811.0/src/components/ha-dialog-date-picker.ts","https://raw.githubusercontent.com/home-assistant/frontend/20250811.0/src/components/ha-dialog.ts"],"names":["HaDialogDatePicker","LitElement","showDialog","params","nextRender","this","_params","_value","value","closeDialog","undefined","fireEvent","dialog","localName","render","html","_t","_","min","max","locale","_valueChanged","firstWeekday","canClear","_t2","_clear","hass","localize","nothing","_setToday","_setValue","ev","detail","_this$_params","onChange","today","Date","format","_this$_params2","args","disabled","styles","haStyleDialog","css","_t3","attribute","type","Boolean","SUPPRESS_DEFAULT_PRESS_SELECTOR","createCloseHeading","title","_hass$localize","HaDialog","DialogBase","scrollToPos","x","y","_this$contentElement","contentElement","scrollTo","renderHeading","super","firstUpdated","_this$contentElement2","suppressDefaultPressSelector","join","_updateScrolledAttribute","addEventListener","_onScroll","passive","disconnectedCallback","removeEventListener","toggleAttribute","scrollTop"],"mappings":"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"}

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

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More