Skip to content

Commit a6d74f5

Browse files
committed
🎨 Improve ui for dropdown position in contest table (#1874)
1 parent 0c8eb3d commit a6d74f5

File tree

2 files changed

+39
-5
lines changed

2 files changed

+39
-5
lines changed

src/lib/components/SubmissionStatus/UpdatingDropdown.svelte

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
// Component
2121
<button
2222
type="button"
23-
onclick={() => updatingDropdown.toggle()} // Open / close the dropdown.
23+
onclick={(event) => updatingDropdown.toggle(event)} // Open / close the dropdown.
2424
>
2525
2626
<UpdatingDropdown bind:this={updatingDropdown} {taskResult} {isLoggedIn} {onupdate} />
@@ -56,15 +56,49 @@
5656
let dropdownStatus = $state(false);
5757
let closeDropdown = dropdown.close;
5858
59+
let dropdownX = $state(0);
60+
let dropdownY = $state(0);
61+
let isLowerHalfInScreen = $state(false);
62+
5963
$effect(() => {
6064
activeUrl = $page.url.pathname;
6165
dropdownStatus = dropdown.isOpen;
66+
67+
if (dropdownStatus) {
68+
document.documentElement.style.setProperty('--dropdown-x', `${dropdownX}px`);
69+
document.documentElement.style.setProperty('--dropdown-y', `${dropdownY}px`);
70+
}
6271
});
6372
64-
export function toggle(): void {
73+
export function toggle(event?: MouseEvent): void {
74+
if (event) {
75+
getDropdownPosition(event);
76+
}
77+
6578
dropdown.toggle();
6679
}
6780
81+
function getDropdownPosition(event: MouseEvent): void {
82+
const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();
83+
84+
dropdownX = rect.right;
85+
dropdownY = rect.bottom;
86+
87+
isLowerHalfInScreen = rect.top > window.innerHeight / 2;
88+
}
89+
90+
function getDropdownClasses(isLower: boolean): string {
91+
let classes =
92+
'absolute w-32 z-[999] shadow-lg pointer-events-auto left-[var(--dropdown-x)] transform -translate-x-full ';
93+
94+
if (isLower) {
95+
classes += 'bottom-[calc(100vh-var(--dropdown-y))] mb-5';
96+
} else {
97+
classes += 'top-[var(--dropdown-y)] mt-1';
98+
}
99+
return classes;
100+
}
101+
68102
let selectedSubmissionStatus = $state<SubmissionStatus>();
69103
let showForm = $state(false);
70104
@@ -176,12 +210,12 @@
176210
});
177211
</script>
178212

179-
<div class="relative">
213+
<div class="fixed inset-0 pointer-events-none z-50 w-full h-full">
180214
<Dropdown
181215
{activeUrl}
182216
{dropdownStatus}
183217
{closeDropdown}
184-
class="absolute w-32 z-20 left-auto right-0 mt-5"
218+
class={getDropdownClasses(isLowerHalfInScreen)}
185219
>
186220
<DropdownUl class="border rounded-lg shadow">
187221
{#if isLoggedIn}

src/lib/components/TaskTables/TaskTableBodyCell.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
<button
6262
type="button"
6363
class="flex-shrink-0 w-6 ml-auto"
64-
onclick={() => updatingDropdown.toggle()}
64+
onclick={(event) => updatingDropdown.toggle(event)}
6565
aria-label="Update submission for {selectedTaskResult.title}"
6666
>
6767
<ChevronDown class="w-4 h-4 mx-auto" />

0 commit comments

Comments
 (0)