fix: Fix thumbnail rendering issues (#2058)

- Closes #2054
This commit is contained in:
Dermot Duffy
2025-05-22 21:21:04 -07:00
committed by GitHub
parent 95c926e237
commit c342c5d529
6 changed files with 45 additions and 26 deletions
@@ -135,8 +135,12 @@ export class ThumbnailDetailsController {
: []), : []),
]; ];
// To avoid duplication, if the event already has a structured 'what' and a
// starttime, the title is omitted from the details.
const includeTitle =
!ViewItemClassifier.isEvent(item) || !item?.getWhat()?.length || !startTime;
this._details = [ this._details = [
...(itemTitle ...(includeTitle && itemTitle
? [ ? [
{ {
title: itemTitle, title: itemTitle,
+17 -15
View File
@@ -40,27 +40,29 @@ export class AdvancedCameraCardThumbnailDetails extends LitElement {
const heading = this._controller.getHeading(); const heading = this._controller.getHeading();
const details = this._controller.getDetails(); const details = this._controller.getDetails();
return html`<div class="details"> return html`
${heading ${heading
? html` <div class="title"> ? html` <div class="heading">
<span title=${heading}>${heading}</span> <span title=${heading}>${heading}</span>
</div>` </div>`
: ``} : ``}
${details ${details
? details.map( ? html` <div class="details">
(detail) => ${details.map(
html`<div> (detail) =>
${detail.icon html`<div>
? html` <advanced-camera-card-icon ${detail.icon
title=${detail.hint ?? ''} ? html` <advanced-camera-card-icon
.icon=${detail.icon} title=${detail.hint ?? ''}
></advanced-camera-card-icon>` .icon=${detail.icon}
: ''} ></advanced-camera-card-icon>`
<span>${detail.title}</span> : ''}
</div>`, <span>${detail.title}</span>
) </div>`,
)}
</div>`
: ''} : ''}
</div> `; `;
} }
static get styles(): CSSResult { static get styles(): CSSResult {
+2 -2
View File
@@ -58,8 +58,8 @@ export class AdvancedCameraCardThumbnailFeature extends LitElement {
class="${thumbnailClasses}" class="${thumbnailClasses}"
.hass=${this.hass} .hass=${this.hass}
.thumbnail=${this._controller.getThumbnail()} .thumbnail=${this._controller.getThumbnail()}
aria-label=${this._controller.getTitle() ?? ''} aria-label=${this.item?.getTitle() ?? ''}
title=${this._controller.getTitle() ?? ''} title=${this.item?.getTitle() ?? ''}
></advanced-camera-card-thumbnail-feature-thumbnail>` ></advanced-camera-card-thumbnail-feature-thumbnail>`
: this._controller.getIcon() : this._controller.getIcon()
? html`<advanced-camera-card-icon ? html`<advanced-camera-card-icon
-1
View File
@@ -96,7 +96,6 @@ export class AdvancedCameraCardThumbnail extends LitElement {
return html` return html`
<advanced-camera-card-thumbnail-feature <advanced-camera-card-thumbnail-feature
aria-label=${this.item.getTitle() ?? ''}
.cameraManager=${this.cameraManager} .cameraManager=${this.cameraManager}
.hasDetails=${this.details} .hasDetails=${this.details}
.hass=${this.hass} .hass=${this.hass}
+1 -3
View File
@@ -64,8 +64,6 @@ advanced-camera-card-icon.download {
bottom: 3px; bottom: 3px;
} }
advanced-camera-card-thumbnail-details-event, advanced-camera-card-thumbnail-details {
advanced-camera-card-thumbnail-details-recording,
advanced-camera-card-thumbnail-details-folder {
flex: 1; flex: 1;
} }
@@ -1,9 +1,9 @@
import { describe, expect, it } from 'vitest'; import { describe, expect, it } from 'vitest';
import { mock } from 'vitest-mock-extended'; import { mock } from 'vitest-mock-extended';
import { CameraManager } from '../../../../src/camera-manager/manager'; import { CameraManager } from '../../../src/camera-manager/manager';
import { ThumbnailDetailsController } from '../../../../src/components-lib/thumbnail/details-controller'; import { ThumbnailDetailsController } from '../../../src/components-lib/thumbnail/details-controller';
import { ViewFolder, ViewMediaType } from '../../../../src/view/item'; import { ViewFolder, ViewMediaType } from '../../../src/view/item';
import { createFolder, TestViewMedia } from '../../../test-utils'; import { createFolder, TestViewMedia } from '../../test-utils';
describe('ThumbnailDetailsController', () => { describe('ThumbnailDetailsController', () => {
describe('should set heading', () => { describe('should set heading', () => {
@@ -117,6 +117,22 @@ describe('ThumbnailDetailsController', () => {
}, },
]); ]);
}); });
it('should not have title with a what and a start time', () => {
const item = new TestViewMedia({
title: 'Test Event',
what: ['person', 'car'],
startTime: new Date('2025-05-22T21:12:00Z'),
});
const controller = new ThumbnailDetailsController();
controller.calculate(null, item);
expect(controller.getDetails()).not.toContainEqual(
expect.objectContaining({
title: 'Test Event',
}),
);
});
}); });
it('should have start time in details', () => { it('should have start time in details', () => {