perf(08-02): migrate cover-grid, artists-view, and genres-view virtualizers to repeat() directive

- cover-grid: all 3 virtualizers (single, before-split, after-split) use repeat() with album.ID key
- artists-view uses repeat() with artist.ID key
- genres-view uses repeat() with genre.name key
- Removed gridKeyFunction (now inlined in repeat calls)
- Removed .renderItem and .keyFunction properties from all virtualizers
This commit is contained in:
2026-03-04 23:16:55 -05:00
parent d2d7d8c6ce
commit 1c3514da1d
3 changed files with 28 additions and 27 deletions
@@ -10,6 +10,7 @@ import type {
VisibilityChangedEvent, VisibilityChangedEvent,
} from '@lit-labs/virtualizer'; } from '@lit-labs/virtualizer';
import { grid } from '@lit-labs/virtualizer/layouts/grid.js'; import { grid } from '@lit-labs/virtualizer/layouts/grid.js';
import { repeat } from 'lit/directives/repeat.js';
import { import {
GetAlbumsByArtist, GetAlbumsByArtist,
GetAlbumTracks, GetAlbumTracks,
@@ -1216,15 +1217,13 @@ export class ArtistsView
> >
<lit-virtualizer <lit-virtualizer
.items=${entries} .items=${entries}
.renderItem=${(
entry: ArtistEntry,
) =>
this.renderArtistCard(
entry,
)}
.layout=${this.gridLayout} .layout=${this.gridLayout}
@visibilityChanged=${this.onVisibilityChanged} @visibilityChanged=${this.onVisibilityChanged}
></lit-virtualizer> >${repeat(
entries,
(entry) => entry.artist.ID,
(entry) => this.renderArtistCard(entry),
)}</lit-virtualizer>
</div> </div>
${this.renderContextMenu()} ${this.renderContextMenu()}
`; `;
@@ -11,6 +11,7 @@ import type {
VisibilityChangedEvent, VisibilityChangedEvent,
} from '@lit-labs/virtualizer'; } from '@lit-labs/virtualizer';
import { grid } from '@lit-labs/virtualizer/layouts/grid.js'; import { grid } from '@lit-labs/virtualizer/layouts/grid.js';
import { repeat } from 'lit/directives/repeat.js';
import { GetAlbumTracks } from '@go/library/Library'; import { GetAlbumTracks } from '@go/library/Library';
import { library } from '@go/models'; import { library } from '@go/models';
import { LibraryController } from '@store/controllers/library-controller'; import { LibraryController } from '@store/controllers/library-controller';
@@ -924,12 +925,6 @@ export class CoverGrid
); );
} }
private gridKeyFunction = (
entry: GridEntry,
) => {
return `a-${entry.album.ID}`;
};
/* ==================================================================== /* ====================================================================
* Dropdown (expand/collapse) * Dropdown (expand/collapse)
* ==================================================================== */ * ==================================================================== */
@@ -1853,15 +1848,17 @@ export class CoverGrid
<lit-virtualizer <lit-virtualizer
id="grid-single" id="grid-single"
.items=${this.buildGridEntries()} .items=${this.buildGridEntries()}
.renderItem=${this.renderGridEntry}
.keyFunction=${this.gridKeyFunction}
.layout=${this.gridLayout} .layout=${this.gridLayout}
@click=${this.onGridAlbumClick} @click=${this.onGridAlbumClick}
@dblclick=${this.onGridAlbumDblClick} @dblclick=${this.onGridAlbumDblClick}
@keydown=${this.onGridAlbumKeydown} @keydown=${this.onGridAlbumKeydown}
@contextmenu=${this.onGridAlbumContextMenu} @contextmenu=${this.onGridAlbumContextMenu}
@visibilityChanged=${this.onVisibilityChanged} @visibilityChanged=${this.onVisibilityChanged}
></lit-virtualizer> >${repeat(
this.buildGridEntries(),
(entry) => entry.album.ID,
(entry) => this.renderGridEntry(entry),
)}</lit-virtualizer>
`; `;
} }
@@ -1880,15 +1877,17 @@ export class CoverGrid
<lit-virtualizer <lit-virtualizer
id="grid-before" id="grid-before"
.items=${this.getBeforeEntries()} .items=${this.getBeforeEntries()}
.renderItem=${this.renderGridEntry}
.keyFunction=${this.gridKeyFunction}
.layout=${this.gridLayout} .layout=${this.gridLayout}
@click=${this.onGridAlbumClick} @click=${this.onGridAlbumClick}
@dblclick=${this.onGridAlbumDblClick} @dblclick=${this.onGridAlbumDblClick}
@keydown=${this.onGridAlbumKeydown} @keydown=${this.onGridAlbumKeydown}
@contextmenu=${this.onGridAlbumContextMenu} @contextmenu=${this.onGridAlbumContextMenu}
@visibilityChanged=${this.onVisibilityChanged} @visibilityChanged=${this.onVisibilityChanged}
></lit-virtualizer> >${repeat(
this.getBeforeEntries(),
(entry) => entry.album.ID,
(entry) => this.renderGridEntry(entry),
)}</lit-virtualizer>
<album-dropdown <album-dropdown
.tracks=${this.expandedTracks} .tracks=${this.expandedTracks}
@@ -1909,14 +1908,16 @@ export class CoverGrid
<lit-virtualizer <lit-virtualizer
id="grid-after" id="grid-after"
.items=${afterEntries} .items=${afterEntries}
.renderItem=${this.renderGridEntry}
.keyFunction=${this.gridKeyFunction}
.layout=${this.gridLayoutAfter} .layout=${this.gridLayoutAfter}
@click=${this.onGridAlbumClick} @click=${this.onGridAlbumClick}
@dblclick=${this.onGridAlbumDblClick} @dblclick=${this.onGridAlbumDblClick}
@keydown=${this.onGridAlbumKeydown} @keydown=${this.onGridAlbumKeydown}
@contextmenu=${this.onGridAlbumContextMenu} @contextmenu=${this.onGridAlbumContextMenu}
></lit-virtualizer> >${repeat(
afterEntries,
(entry) => entry.album.ID,
(entry) => this.renderGridEntry(entry),
)}</lit-virtualizer>
` `
: nothing} : nothing}
`; `;
@@ -10,6 +10,7 @@ import type {
VisibilityChangedEvent, VisibilityChangedEvent,
} from '@lit-labs/virtualizer'; } from '@lit-labs/virtualizer';
import { grid } from '@lit-labs/virtualizer/layouts/grid.js'; import { grid } from '@lit-labs/virtualizer/layouts/grid.js';
import { repeat } from 'lit/directives/repeat.js';
import { GetTracksByGenre } from '@go/library/Library'; import { GetTracksByGenre } from '@go/library/Library';
import type { library } from '@go/models'; import type { library } from '@go/models';
import { LibraryController } from '@store/controllers/library-controller'; import { LibraryController } from '@store/controllers/library-controller';
@@ -1168,13 +1169,13 @@ export class GenresView
> >
<lit-virtualizer <lit-virtualizer
.items=${entries} .items=${entries}
.renderItem=${(
entry: GenreEntry,
) =>
this.renderGenreCard(entry)}
.layout=${this.gridLayout} .layout=${this.gridLayout}
@visibilityChanged=${this.onVisibilityChanged} @visibilityChanged=${this.onVisibilityChanged}
></lit-virtualizer> >${repeat(
entries,
(entry) => entry.genre.name,
(entry) => this.renderGenreCard(entry),
)}</lit-virtualizer>
</div> </div>
${this.renderContextMenu()} ${this.renderContextMenu()}
`; `;