From fef5dc42322dce13684c570cc9c72abb8f6041a4 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Thu, 30 Jan 2025 18:02:56 +0100 Subject: [PATCH] Fix location icon when many locations in backup datatable (#23964) * Fix location icon when many locations in backup datatable * Reuse data * Don't copy twice * Improve naming --- .../config/backup/ha-config-backup-backups.ts | 131 +++++++++++------- 1 file changed, 83 insertions(+), 48 deletions(-) diff --git a/src/panels/config/backup/ha-config-backup-backups.ts b/src/panels/config/backup/ha-config-backup-backups.ts index 315403bbed..548cf9190d 100644 --- a/src/panels/config/backup/ha-config-backup-backups.ts +++ b/src/panels/config/backup/ha-config-backup-backups.ts @@ -141,7 +141,10 @@ class HaConfigBackupBackups extends SubscribeMixin(LitElement) { }; private _columns = memoizeOne( - (localize: LocalizeFunc): DataTableColumnContainer => ({ + ( + localize: LocalizeFunc, + maxDisplayedAgents: number + ): DataTableColumnContainer => ({ name: { title: localize("ui.panel.config.backup.name"), main: true, @@ -172,54 +175,75 @@ class HaConfigBackupBackups extends SubscribeMixin(LitElement) { locations: { title: localize("ui.panel.config.backup.locations"), showNarrow: true, - minWidth: "60px", - template: (backup) => html` -
- ${(backup.agent_ids || []).map((agentId) => { - const name = computeBackupAgentName( - this.hass.localize, - agentId, - this.agents - ); - if (isLocalAgent(agentId)) { + // 24 icon size, 4 gap, 16 left and right padding + minWidth: `${maxDisplayedAgents * 24 + (maxDisplayedAgents - 1) * 4 + 32}px`, + template: (backup) => { + const agentIds = backup.agent_ids; + const displayedAgentIds = + agentIds.length > maxDisplayedAgents + ? [...agentIds].splice(0, maxDisplayedAgents - 1) + : agentIds; + const agentsMore = Math.max( + agentIds.length - displayedAgentIds.length, + 0 + ); + return html` +
+ ${displayedAgentIds.map((agentId) => { + const name = computeBackupAgentName( + this.hass.localize, + agentId, + this.agents + ); + if (isLocalAgent(agentId)) { + return html` + + `; + } + if (isNetworkMountAgent(agentId)) { + return html` + + `; + } + const domain = computeDomain(agentId); return html` - + /> `; - } - if (isNetworkMountAgent(agentId)) { - return html` - - `; - } - const domain = computeDomain(agentId); - return html` - ${name} - `; - })} -
- `, + })} + ${agentsMore + ? html` + + +${agentsMore} + + ` + : nothing} +
+ `; + }, }, actions: { title: "", @@ -293,20 +317,31 @@ class HaConfigBackupBackups extends SubscribeMixin(LitElement) { } return filteredBackups.map((backup) => { const type = backup.with_automatic_settings ? "automatic" : "manual"; + const agentIds = Object.keys(backup.agents); return { ...backup, size: computeBackupSize(backup), - agent_ids: Object.keys(backup.agents).sort(compareAgents), + agent_ids: agentIds.sort(compareAgents), formatted_type: localize(`ui.panel.config.backup.type.${type}`), }; }); } ); + private _maxAgents = memoizeOne((data: BackupRow[]): number => + Math.max(...data.map((row) => row.agent_ids.length)) + ); + protected render(): TemplateResult { const backupInProgress = "state" in this.manager && this.manager.state === "in_progress"; + const data = this._data(this.backups, this._filters, this.hass.localize); + const maxDisplayedAgents = Math.min( + this._maxAgents(data), + this.narrow ? 3 : 5 + ); + return html`