Skip to content

Commit 3f9ee4c

Browse files
committed
update: add delay to tooltips;
update: proper id hashing for spreadsheet keys; update: state management issues with column swaps and resizing; update: handle horizontal grid scroll with restore on url query sorting;
1 parent 29f1331 commit 3f9ee4c

File tree

9 files changed

+154
-68
lines changed

9 files changed

+154
-68
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"@appwrite.io/pink-icons": "0.25.0",
2727
"@appwrite.io/pink-icons-svelte": "^2.0.0-RC.1",
2828
"@appwrite.io/pink-legacy": "^1.0.3",
29-
"@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@0468c93",
29+
"@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@0c30e2f",
3030
"@faker-js/faker": "^9.9.0",
3131
"@popperjs/core": "^2.11.8",
3232
"@sentry/sveltekit": "^8.38.0",

pnpm-lock.yaml

Lines changed: 17 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lib/components/copy.svelte

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,32 @@
11
<script lang="ts">
2-
import { trackEvent } from '$lib/actions/analytics';
3-
import { clickOnEnter } from '$lib/helpers/a11y';
2+
import type { Snippet } from 'svelte';
43
import { copy } from '$lib/helpers/copy';
5-
import { addNotification } from '$lib/stores/notifications';
4+
import { clickOnEnter } from '$lib/helpers/a11y';
65
import { Tooltip } from '@appwrite.io/pink-svelte';
6+
import { trackEvent } from '$lib/actions/analytics';
7+
import { addNotification } from '$lib/stores/notifications';
78
8-
export let value: string;
9-
export let event: string = null;
10-
export let eventContext = 'click_id_tag';
11-
export let tooltipDisabled = false;
12-
export let tooltipPortal = false;
13-
export let copyText: string = 'Click to copy';
9+
let {
10+
value,
11+
event = null,
12+
eventContext = 'click_id_tag',
13+
tooltipDisabled = false,
14+
tooltipPortal = false,
15+
copyText = 'Click to copy',
16+
delay = 0,
17+
children
18+
}: {
19+
value: string;
20+
event?: string;
21+
eventContext?: string;
22+
tooltipDisabled?: boolean;
23+
tooltipPortal?: boolean;
24+
copyText?: string;
25+
delay?: number;
26+
children?: Snippet;
27+
} = $props();
1428
15-
let content = copyText;
29+
let content = $state(copyText);
1630
1731
async function handleClick() {
1832
const success = await copy(value);
@@ -35,17 +49,21 @@
3549
//TODO: remove this component
3650
</script>
3751

38-
<Tooltip disabled={tooltipDisabled} portal={tooltipPortal}>
52+
<Tooltip disabled={tooltipDisabled} portal={tooltipPortal} {delay}>
3953
<span
4054
data-private
4155
style:display="inline-flex"
4256
role="button"
4357
tabindex="0"
4458
style:cursor="pointer"
45-
on:click|preventDefault|stopPropagation={handleClick}
46-
on:keyup={clickOnEnter}
47-
on:mouseenter={() => setTimeout(() => (content = copyText))}>
48-
<slot />
59+
onclick={(event) => {
60+
event.preventDefault();
61+
event.stopPropagation();
62+
handleClick();
63+
}}
64+
onkeyup={clickOnEnter}
65+
onmouseenter={() => setTimeout(() => (content = copyText))}>
66+
{@render children?.()}
4967
</span>
5068
<p slot="tooltip" let:showing>
5169
{#if showing}

src/lib/components/id.svelte

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,13 @@
4848
4949
export let value: string;
5050
export let event: string = null;
51+
5152
export let tooltipPortal = false;
53+
export let tooltipDelay: number = 0;
5254
</script>
5355

5456
{#key value}
55-
<Copy {value} {event} {tooltipPortal}>
57+
<Copy {value} {event} {tooltipPortal} delay={tooltipDelay}>
5658
<Tag size="xs" variant="code">
5759
<Icon icon={IconDuplicate} size="s" slot="start" />
5860
<span

src/lib/helpers/string.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,12 @@ export const hostnameRegex = String.raw`(\*)|(\*\.)?(?!-)[A-Za-z0-9\-]+([\-\.]{1
6060
* Supports domains, localhost, wildcards, ip-addresses and Chrome extension IDs!
6161
*/
6262
export const extendedHostnameRegex = String.raw`(\*)|(\*\.)?((?!-)[A-Za-z0-9\-]+([\-\.]{1}[a-z0-9]+)*\.[A-Za-z]{2,18}|localhost|(\d{1,3}\.){3}\d{1,3}|[a-z0-9]{32})`;
63+
64+
export function hash(input: string | string[], delimiter: string = ','): string {
65+
const str = Array.isArray(input) ? input.join(delimiter) : input;
66+
let hash = 0;
67+
for (let i = 0; i < str.length; i++) {
68+
hash = ((hash << 5) - hash + str.charCodeAt(i)) & 0xffffffff;
69+
}
70+
return Math.abs(hash).toString(36);
71+
}

src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -192,13 +192,15 @@
192192
</svelte:fragment>
193193

194194
<svelte:fragment slot="footer">
195-
<Layout.Stack
196-
direction="row"
197-
alignContent="center"
198-
alignItems="center"
199-
justifyContent="space-between">
200-
<Skeleton variant="line" height={18} width={125} />
201-
</Layout.Stack>
195+
{#if $spreadsheetLoading}
196+
<Layout.Stack
197+
direction="row"
198+
alignContent="center"
199+
alignItems="center"
200+
justifyContent="space-between">
201+
<Skeleton variant="line" height={18} width={125} />
202+
</Layout.Stack>
203+
{/if}
202204
</svelte:fragment>
203205
</Spreadsheet.Root>
204206

@@ -295,7 +297,7 @@
295297
top: 29%;
296298
bottom: 0;
297299
width: 100%;
298-
height: 70vh;
300+
height: 70.5vh;
299301
position: fixed;
300302
background: linear-gradient(
301303
180deg,

src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/spreadsheet.svelte

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,35 @@
11
<script lang="ts">
2+
import { scrollStore } from '../store';
3+
24
let spreadsheetHeight = '74.5vh';
35
let spreadsheetWrapper: HTMLDivElement;
6+
let spreadsheetGridContainer: HTMLDivElement;
7+
8+
function initSpreadsheetGridContainer() {
9+
if (!spreadsheetWrapper) return false;
10+
11+
spreadsheetGridContainer = spreadsheetWrapper.querySelector('.spreadsheet-container');
12+
return !!spreadsheetGridContainer;
13+
}
414
5-
function resizeSheet() {
15+
/** adjust height to fill remaining viewport space */
16+
export function resizeSheet() {
617
if (!spreadsheetWrapper) return;
718
const rect = spreadsheetWrapper.getBoundingClientRect();
819
spreadsheetHeight = window.innerHeight - rect.top + 'px';
920
}
1021
22+
export function saveGridSheetScroll() {
23+
initSpreadsheetGridContainer();
24+
scrollStore.set(spreadsheetGridContainer?.scrollLeft);
25+
}
26+
27+
export function restoreGridSheetScroll() {
28+
if (initSpreadsheetGridContainer() && spreadsheetGridContainer.scrollWidth > 0) {
29+
spreadsheetGridContainer.scrollLeft = $scrollStore;
30+
}
31+
}
32+
1133
resizeSheet();
1234
</script>
1335

0 commit comments

Comments
 (0)