mirror of
https://github.com/immich-app/immich.git
synced 2025-02-04 01:09:14 -05:00
feat: handle escape key and higher wheel zoom ratio (#3471)
This commit is contained in:
parent
95c75c289c
commit
e368b9e50b
5 changed files with 63 additions and 12 deletions
|
@ -13,7 +13,7 @@
|
||||||
UserResponseDto,
|
UserResponseDto,
|
||||||
api,
|
api,
|
||||||
} from '@api';
|
} from '@api';
|
||||||
import { onMount } from 'svelte';
|
import { onDestroy, onMount } from 'svelte';
|
||||||
import ArrowLeft from 'svelte-material-icons/ArrowLeft.svelte';
|
import ArrowLeft from 'svelte-material-icons/ArrowLeft.svelte';
|
||||||
import DeleteOutline from 'svelte-material-icons/DeleteOutline.svelte';
|
import DeleteOutline from 'svelte-material-icons/DeleteOutline.svelte';
|
||||||
import DotsVertical from 'svelte-material-icons/DotsVertical.svelte';
|
import DotsVertical from 'svelte-material-icons/DotsVertical.svelte';
|
||||||
|
@ -43,6 +43,7 @@
|
||||||
import ConfirmDialogue from '$lib/components/shared-components/confirm-dialogue.svelte';
|
import ConfirmDialogue from '$lib/components/shared-components/confirm-dialogue.svelte';
|
||||||
import { handleError } from '../../utils/handle-error';
|
import { handleError } from '../../utils/handle-error';
|
||||||
import { downloadArchive } from '../../utils/asset-utils';
|
import { downloadArchive } from '../../utils/asset-utils';
|
||||||
|
import { isViewingAssetStoreState } from '$lib/stores/asset-interaction.store';
|
||||||
|
|
||||||
export let album: AlbumResponseDto;
|
export let album: AlbumResponseDto;
|
||||||
export let sharedLink: SharedLinkResponseDto | undefined = undefined;
|
export let sharedLink: SharedLinkResponseDto | undefined = undefined;
|
||||||
|
@ -119,7 +120,10 @@
|
||||||
return startDateString === endDateString ? startDateString : `${startDateString} - ${endDateString}`;
|
return startDateString === endDateString ? startDateString : `${startDateString} - ${endDateString}`;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onKeyboardPress = (event: KeyboardEvent) => handleKeyboardPress(event);
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
|
document.addEventListener('keydown', onKeyboardPress);
|
||||||
currentAlbumName = album.albumName;
|
currentAlbumName = album.albumName;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -130,6 +134,26 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
if (browser) {
|
||||||
|
document.removeEventListener('keydown', onKeyboardPress);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const handleKeyboardPress = (event: KeyboardEvent) => {
|
||||||
|
if (!$isViewingAssetStoreState) {
|
||||||
|
switch (event.key) {
|
||||||
|
case 'Escape':
|
||||||
|
if (isMultiSelectionMode) {
|
||||||
|
multiSelectAsset = new Set();
|
||||||
|
} else {
|
||||||
|
goto(backUrl);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Update Album Name
|
// Update Album Name
|
||||||
$: {
|
$: {
|
||||||
if (!isEditingTitle && currentAlbumName != album.albumName && isOwned) {
|
if (!isEditingTitle && currentAlbumName != album.albumName && isOwned) {
|
||||||
|
|
|
@ -93,7 +93,7 @@
|
||||||
|
|
||||||
$: if (imgElement) {
|
$: if (imgElement) {
|
||||||
createZoomImageWheel(imgElement, {
|
createZoomImageWheel(imgElement, {
|
||||||
wheelZoomRatio: 0.06,
|
wheelZoomRatio: 0.2,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -89,16 +89,19 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.key === '/') {
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$isViewingAssetStoreState) {
|
if (!$isViewingAssetStoreState) {
|
||||||
switch (event.key) {
|
switch (event.key) {
|
||||||
|
case 'Escape':
|
||||||
|
assetInteractionStore.clearMultiselect();
|
||||||
|
return;
|
||||||
case '?':
|
case '?':
|
||||||
if (event.shiftKey) showShortcuts = !showShortcuts;
|
if (event.shiftKey) {
|
||||||
|
event.preventDefault();
|
||||||
|
showShortcuts = !showShortcuts;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
case '/':
|
case '/':
|
||||||
|
event.preventDefault();
|
||||||
goto(AppRoute.EXPLORE);
|
goto(AppRoute.EXPLORE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
import { flip } from 'svelte/animate';
|
import { flip } from 'svelte/animate';
|
||||||
import { archivedAsset } from '$lib/stores/archived-asset.store';
|
import { archivedAsset } from '$lib/stores/archived-asset.store';
|
||||||
import { getThumbnailSize } from '$lib/utils/thumbnail-util';
|
import { getThumbnailSize } from '$lib/utils/thumbnail-util';
|
||||||
|
import { isViewingAssetStoreState } from '$lib/stores/asset-interaction.store';
|
||||||
|
|
||||||
export let assets: AssetResponseDto[];
|
export let assets: AssetResponseDto[];
|
||||||
export let sharedLink: SharedLinkResponseDto | undefined = undefined;
|
export let sharedLink: SharedLinkResponseDto | undefined = undefined;
|
||||||
|
@ -19,8 +20,6 @@
|
||||||
export let viewFrom: ViewFrom;
|
export let viewFrom: ViewFrom;
|
||||||
export let showArchiveIcon = false;
|
export let showArchiveIcon = false;
|
||||||
|
|
||||||
let isShowAssetViewer = false;
|
|
||||||
|
|
||||||
let selectedAsset: AssetResponseDto;
|
let selectedAsset: AssetResponseDto;
|
||||||
let currentViewAssetIndex = 0;
|
let currentViewAssetIndex = 0;
|
||||||
|
|
||||||
|
@ -34,7 +33,7 @@
|
||||||
|
|
||||||
currentViewAssetIndex = assets.findIndex((a) => a.id == asset.id);
|
currentViewAssetIndex = assets.findIndex((a) => a.id == asset.id);
|
||||||
selectedAsset = assets[currentViewAssetIndex];
|
selectedAsset = assets[currentViewAssetIndex];
|
||||||
isShowAssetViewer = true;
|
$isViewingAssetStoreState = true;
|
||||||
pushState(selectedAsset.id);
|
pushState(selectedAsset.id);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -82,7 +81,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
const closeViewer = () => {
|
const closeViewer = () => {
|
||||||
isShowAssetViewer = false;
|
$isViewingAssetStoreState = false;
|
||||||
history.pushState(null, '', `${$page.url.pathname}`);
|
history.pushState(null, '', `${$page.url.pathname}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -118,7 +117,7 @@
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<!-- Overlay Asset Viewer -->
|
<!-- Overlay Asset Viewer -->
|
||||||
{#if isShowAssetViewer}
|
{#if $isViewingAssetStoreState}
|
||||||
<AssetViewer
|
<AssetViewer
|
||||||
asset={selectedAsset}
|
asset={selectedAsset}
|
||||||
publicSharedKey={sharedLink?.key}
|
publicSharedKey={sharedLink?.key}
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
import { AppRoute } from '$lib/constants';
|
import { AppRoute } from '$lib/constants';
|
||||||
import AlbumCard from '$lib/components/album-page/album-card.svelte';
|
import AlbumCard from '$lib/components/album-page/album-card.svelte';
|
||||||
import { flip } from 'svelte/animate';
|
import { flip } from 'svelte/animate';
|
||||||
|
import { onDestroy, onMount } from 'svelte';
|
||||||
|
import { browser } from '$app/environment';
|
||||||
|
import { isViewingAssetStoreState } from '$lib/stores/asset-interaction.store';
|
||||||
|
|
||||||
export let data: PageData;
|
export let data: PageData;
|
||||||
|
|
||||||
|
@ -32,6 +35,28 @@
|
||||||
let previousRoute = AppRoute.EXPLORE as string;
|
let previousRoute = AppRoute.EXPLORE as string;
|
||||||
$: albums = data.results.albums.items;
|
$: albums = data.results.albums.items;
|
||||||
|
|
||||||
|
const onKeyboardPress = (event: KeyboardEvent) => handleKeyboardPress(event);
|
||||||
|
|
||||||
|
onMount(async () => {
|
||||||
|
document.addEventListener('keydown', onKeyboardPress);
|
||||||
|
});
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
if (browser) {
|
||||||
|
document.removeEventListener('keydown', onKeyboardPress);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const handleKeyboardPress = (event: KeyboardEvent) => {
|
||||||
|
if (!$isViewingAssetStoreState) {
|
||||||
|
switch (event.key) {
|
||||||
|
case 'Escape':
|
||||||
|
goto(previousRoute);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
afterNavigate(({ from }) => {
|
afterNavigate(({ from }) => {
|
||||||
// Prevent setting previousRoute to the current page.
|
// Prevent setting previousRoute to the current page.
|
||||||
if (from && from.route.id !== $page.route.id) {
|
if (from && from.route.id !== $page.route.id) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue