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) {