diff --git a/.vscode/settings.json b/.vscode/settings.json
index b386502a11..be0466ee1b 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -50,7 +50,7 @@
"editor.formatOnSave": true,
"editor.tabSize": 2
},
- "cSpell.words": ["immich"],
+ "cSpell.words": ["immich", "intersectable", "intersectables"],
"editor.formatOnSave": true,
"eslint.validate": ["javascript", "svelte"],
"explorer.fileNesting.enabled": true,
diff --git a/web/src/lib/components/photos-page/asset-date-group-comp.svelte b/web/src/lib/components/photos-page/asset-date-group-comp.svelte
new file mode 100644
index 0000000000..d1420274f9
--- /dev/null
+++ b/web/src/lib/components/photos-page/asset-date-group-comp.svelte
@@ -0,0 +1,182 @@
+
+
+{#each filterIntersecting(monthGroup.dayGroups) as dayGroup, groupIndex (dayGroup.day)}
+ {@const absoluteWidth = dayGroup.left}
+
+
+ {
+ isMouseOverGroup = true;
+ hoveredDayGroup = dayGroup.groupTitle;
+ }}
+ onmouseleave={() => {
+ isMouseOverGroup = false;
+ hoveredDayGroup = null;
+ }}
+ >
+
+
+ {#if !singleSelect && ((hoveredDayGroup === dayGroup.groupTitle && isMouseOverGroup) || isDayGroupSelected(dayGroup))}
+
onDayGroupSelect(dayGroup, assetsSnapshot(dayGroup.getAssets()))}
+ onkeydown={() => onDayGroupSelect(dayGroup, assetsSnapshot(dayGroup.getAssets()))}
+ >
+ {#if isDayGroupSelected(dayGroup)}
+
+ {:else}
+
+ {/if}
+
+ {/if}
+
+
+ {dayGroup.groupTitle}
+
+
+
+
+
+ {#each filterIntersecting(dayGroup.viewerAssets) as viewerAsset (viewerAsset.id)}
+ {@const position = viewerAsset.position!}
+ {@const asset = viewerAsset.asset!}
+
+
+
+ onAssetOpen(dayGroup, assetSnapshot(asset))}
+ onSelect={() => onAssetSelect(dayGroup, assetSnapshot(asset))}
+ onMouseEvent={() => onHover(dayGroup, assetSnapshot(asset))}
+ selected={isAssetSelected(asset)}
+ selectionCandidate={isAssetSelectionCandidate(asset)}
+ disabled={isAssetDisabled(asset)}
+ thumbnailWidth={position.width}
+ thumbnailHeight={position.height}
+ />
+ {#if customLayout}
+ {@render customLayout(asset)}
+ {/if}
+
+ {/each}
+
+
+{/each}
+
+
diff --git a/web/src/lib/components/photos-page/asset-date-group-selection-aware.svelte b/web/src/lib/components/photos-page/asset-date-group-selection-aware.svelte
new file mode 100644
index 0000000000..fd2f741bdd
--- /dev/null
+++ b/web/src/lib/components/photos-page/asset-date-group-selection-aware.svelte
@@ -0,0 +1,124 @@
+
+
+
+
+ true}
+ isAssetSelected={(asset) => true}
+ isAssetSelectionCandidate={(asset) => true}
+ isAssetDisabled={(asset) => true}
+>
diff --git a/web/src/lib/components/photos-page/asset-date-group.svelte b/web/src/lib/components/photos-page/asset-date-group.svelte
index 2ead425759..93eaa9e65f 100644
--- a/web/src/lib/components/photos-page/asset-date-group.svelte
+++ b/web/src/lib/components/photos-page/asset-date-group.svelte
@@ -184,10 +184,8 @@
- actionLib.onDateGroupSelect({ title: dayGroup.groupTitle, assets: assetsSnapshot(dayGroup.getAssets()) })}
- onkeydown={() =>
- actionLib.onDateGroupSelect({ title: dayGroup.groupTitle, assets: assetsSnapshot(dayGroup.getAssets()) })}
+ onclick={() => actionLib.onDayGroupSelect(dayGroup, assetsSnapshot(dayGroup.getAssets()))}
+ onkeydown={() => actionLib.onDayGroupSelect(dayGroup, assetsSnapshot(dayGroup.getAssets()))}
>
{#if assetInteraction.selectedGroup.has(dayGroup.groupTitle)}
diff --git a/web/src/lib/components/photos-page/date-group-actions-lib.svelte.ts b/web/src/lib/components/photos-page/date-group-actions-lib.svelte.ts
index dac2548b9a..213586bffb 100644
--- a/web/src/lib/components/photos-page/date-group-actions-lib.svelte.ts
+++ b/web/src/lib/components/photos-page/date-group-actions-lib.svelte.ts
@@ -1,3 +1,4 @@
+import { DayGroup } from '$lib/managers/timeline-manager/day-group.svelte';
import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte';
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
import { assetsSnapshot } from '$lib/managers/timeline-manager/utils.svelte';
@@ -67,7 +68,8 @@ export class DateGroupActionLib {
this.lastAssetMouseEvent = asset;
};
- onDateGroupSelect = ({ title: group, assets }: { title: string; assets: TimelineAsset[] }) => {
+ onDayGroupSelect = (dayGroup: DayGroup, assets: TimelineAsset[]) => {
+ const group = dayGroup.groupTitle;
if (this.assetInteraction.selectedGroup.has(group)) {
this.assetInteraction.removeGroupFromMultiselectGroup(group);
for (const asset of assets) {