diff --git a/package.json b/package.json
index d67d582af2a9..2f1c2b10a773 100644
--- a/package.json
+++ b/package.json
@@ -155,7 +155,7 @@
"@babel/plugin-transform-runtime": "7.24.7",
"@babel/preset-env": "7.24.7",
"@babel/preset-typescript": "7.24.7",
- "@bundle-stats/plugin-webpack-filter": "4.13.2",
+ "@bundle-stats/plugin-webpack-filter": "4.13.3",
"@koa/cors": "5.0.0",
"@lokalise/node-api": "12.5.0",
"@octokit/auth-oauth-device": "7.1.1",
@@ -185,8 +185,8 @@
"@types/tar": "6.1.13",
"@types/ua-parser-js": "0.7.39",
"@types/webspeechapi": "0.0.29",
- "@typescript-eslint/eslint-plugin": "7.13.1",
- "@typescript-eslint/parser": "7.13.1",
+ "@typescript-eslint/eslint-plugin": "7.14.1",
+ "@typescript-eslint/parser": "7.14.1",
"@web/dev-server": "0.1.38",
"@web/dev-server-rollup": "0.4.1",
"babel-loader": "9.1.3",
@@ -220,7 +220,7 @@
"lodash.template": "4.5.0",
"magic-string": "0.30.10",
"map-stream": "0.0.7",
- "mocha": "10.4.0",
+ "mocha": "10.5.0",
"object-hash": "3.0.0",
"open": "10.1.0",
"pinst": "3.0.0",
diff --git a/pyproject.toml b/pyproject.toml
index 48b7f8fcea7c..4d2f4be0602b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "home-assistant-frontend"
-version = "20240627.0"
+version = "20240628.0"
license = {text = "Apache-2.0"}
description = "The Home Assistant frontend"
readme = "README.md"
diff --git a/src/panels/config/application_credentials/dialog-add-application-credential.ts b/src/panels/config/application_credentials/dialog-add-application-credential.ts
index d620f499c1a4..e30e494b4730 100644
--- a/src/panels/config/application_credentials/dialog-add-application-credential.ts
+++ b/src/panels/config/application_credentials/dialog-add-application-credential.ts
@@ -1,4 +1,3 @@
-import "@material/mwc-button";
import "@material/mwc-list/mwc-list-item";
import { mdiOpenInNew } from "@mdi/js";
import { ComboBoxLitRenderer } from "@vaadin/combo-box/lit";
@@ -11,6 +10,7 @@ import "../../../components/ha-combo-box";
import { createCloseHeading } from "../../../components/ha-dialog";
import "../../../components/ha-markdown";
import "../../../components/ha-textfield";
+import "../../../components/ha-button";
import {
ApplicationCredential,
ApplicationCredentialsConfig,
@@ -231,10 +231,10 @@ export class DialogAddApplicationCredential extends LitElement {
`
: html`
-
+
${this.hass.localize("ui.common.cancel")}
-
-
+
+
`}
`;
diff --git a/src/panels/config/application_credentials/ha-config-application-credentials.ts b/src/panels/config/application_credentials/ha-config-application-credentials.ts
index 644759e148da..e11f0515f431 100644
--- a/src/panels/config/application_credentials/ha-config-application-credentials.ts
+++ b/src/panels/config/application_credentials/ha-config-application-credentials.ts
@@ -7,6 +7,7 @@ import { LocalizeFunc } from "../../../common/translations/localize";
import {
DataTableColumnContainer,
SelectionChangedEvent,
+ SortingChangedEvent,
} from "../../../components/data-table/ha-data-table";
import "../../../components/ha-fab";
import "../../../components/ha-help-tooltip";
@@ -27,6 +28,7 @@ import type { HaTabsSubpageDataTable } from "../../../layouts/hass-tabs-subpage-
import { HomeAssistant, Route } from "../../../types";
import { configSections } from "../ha-panel-config";
import { showAddApplicationCredentialDialog } from "./show-dialog-add-application-credential";
+import { storage } from "../../../common/decorators/storage";
@customElement("ha-config-application-credentials")
export class HaConfigApplicationCredentials extends LitElement {
@@ -45,6 +47,35 @@ export class HaConfigApplicationCredentials extends LitElement {
@query("hass-tabs-subpage-data-table", true)
private _dataTable!: HaTabsSubpageDataTable;
+ @storage({
+ key: "application-credentials-table-sort",
+ state: false,
+ subscribe: false,
+ })
+ private _activeSorting?: SortingChangedEvent;
+
+ @storage({
+ key: "application-credentials-table-column-order",
+ state: false,
+ subscribe: false,
+ })
+ private _activeColumnOrder?: string[];
+
+ @storage({
+ key: "application-credentials-table-hidden-columns",
+ state: false,
+ subscribe: false,
+ })
+ private _activeHiddenColumns?: string[];
+
+ @storage({
+ storage: "sessionStorage",
+ key: "application-credentials-table-search",
+ state: true,
+ subscribe: false,
+ })
+ private _filter = "";
+
private _columns = memoizeOne(
(narrow: boolean, localize: LocalizeFunc): DataTableColumnContainer => {
const columns: DataTableColumnContainer = {
@@ -53,6 +84,7 @@ export class HaConfigApplicationCredentials extends LitElement {
"ui.panel.config.application_credentials.picker.headers.name"
),
sortable: true,
+ filterable: true,
direction: "asc",
grows: true,
},
@@ -60,6 +92,7 @@ export class HaConfigApplicationCredentials extends LitElement {
title: localize(
"ui.panel.config.application_credentials.picker.headers.client_id"
),
+ filterable: true,
width: "30%",
hidden: narrow,
},
@@ -68,6 +101,7 @@ export class HaConfigApplicationCredentials extends LitElement {
"ui.panel.config.application_credentials.picker.headers.application"
),
sortable: true,
+ filterable: true,
width: "30%",
direction: "asc",
},
@@ -84,7 +118,7 @@ export class HaConfigApplicationCredentials extends LitElement {
path: mdiDelete,
warning: true,
label: this.hass.localize("ui.common.delete"),
- action: () => this._removeCredential(credential),
+ action: () => this._deleteCredential(credential),
},
]}
>
@@ -128,11 +162,18 @@ export class HaConfigApplicationCredentials extends LitElement {
selectable
.selected=${this._selected.length}
@selection-changed=${this._handleSelectionChanged}
+ .initialSorting=${this._activeSorting}
+ .columnOrder=${this._activeColumnOrder}
+ .hiddenColumns=${this._activeHiddenColumns}
+ @columns-changed=${this._handleColumnsChanged}
+ @sorting-changed=${this._handleSortingChanged}
+ .filter=${this._filter}
+ @search-changed=${this._handleSearchChange}
>