Keep deposit entry visible while selecting a user
Place the amount entry and actions in a clear adjacent panel on larger screens and above the scrollable user list on mobile. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
3 files changed
+146
-23
No files matched your search
@@ -1,17 +1,113 @@
|
|||||||
|
.deposit {
|
||||||
|
display: grid;
|
||||||
|
align-items: start;
|
||||||
|
gap: 1rem 2rem;
|
||||||
|
grid-template:
|
||||||
|
"heading amount" auto
|
||||||
|
"search amount" auto
|
||||||
|
"users amount" 1fr
|
||||||
|
/ minmax(0, 1fr) minmax(260px, 320px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.heading {
|
||||||
|
grid-area: heading;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
grid-area: search;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search input {
|
||||||
|
width: min(100%, 420px);
|
||||||
|
}
|
||||||
|
|
||||||
.userList {
|
.userList {
|
||||||
display: grid;
|
display: grid;
|
||||||
height: 800px;
|
max-height: min(62vh, 680px);
|
||||||
padding-top: 2rem;
|
padding: 0.5rem 0.5rem 0.5rem 0;
|
||||||
column-gap: 16px;
|
gap: 1rem;
|
||||||
grid-template-columns: repeat(5, 220px);
|
grid-area: users;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
row-gap: 24px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.amountSection {
|
.amountSection {
|
||||||
margin-top: 32px;
|
position: sticky;
|
||||||
|
top: 1rem;
|
||||||
|
padding: 1.25rem;
|
||||||
|
border: 1px solid rgba(221, 81, 127, 0.45);
|
||||||
|
border-radius: 8px;
|
||||||
|
background: rgba(35, 15, 41, 0.84);
|
||||||
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.24);
|
||||||
|
grid-area: amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
.amountSection h2 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.selectedUser {
|
||||||
|
min-height: 1.5em;
|
||||||
|
margin: 0 0 1.25rem;
|
||||||
|
color: rgba(255, 255, 255, 0.78);
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.selectedUser strong {
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.amountLabel {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 0.4rem;
|
||||||
|
color: var(--sun);
|
||||||
|
}
|
||||||
|
|
||||||
|
.amountInput {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.amountInput input {
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
font-size: 1.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.amountInput span {
|
||||||
|
color: rgba(255, 255, 255, 0.8);
|
||||||
|
text-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.checkout {
|
.checkout {
|
||||||
margin-top: 32px;
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0.75rem;
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 760px) {
|
||||||
|
.deposit {
|
||||||
|
gap: 0.75rem;
|
||||||
|
grid-template:
|
||||||
|
"heading" auto
|
||||||
|
"search" auto
|
||||||
|
"amount" auto
|
||||||
|
"users" auto
|
||||||
|
/ minmax(0, 1fr);
|
||||||
|
}
|
||||||
|
|
||||||
|
.amountSection {
|
||||||
|
position: static;
|
||||||
|
}
|
||||||
|
|
||||||
|
.userList {
|
||||||
|
max-height: 45vh;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -14,6 +14,7 @@ const Deposit = (): JSX.Element => {
|
|||||||
userQuery,
|
userQuery,
|
||||||
setUserQuery,
|
setUserQuery,
|
||||||
filteredUsers,
|
filteredUsers,
|
||||||
|
selectedUserDetails,
|
||||||
reset,
|
reset,
|
||||||
onSubmit,
|
onSubmit,
|
||||||
} = useDeposit();
|
} = useDeposit();
|
||||||
@@ -23,20 +24,57 @@ const Deposit = (): JSX.Element => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div className={styles.deposit}>
|
||||||
<section>
|
<h2 className={styles.heading}>Hvem skal sette inn penger?</h2>
|
||||||
<h2>Hvem skal sette inn penger?</h2>
|
<div className={styles.search}>
|
||||||
<input
|
<input
|
||||||
name="userQuery"
|
name="userQuery"
|
||||||
onChange={(event: React.FormEvent<HTMLInputElement>) => setUserQuery(event.currentTarget.value)}
|
onChange={(event: React.FormEvent<HTMLInputElement>) => setUserQuery(event.currentTarget.value)}
|
||||||
value={userQuery}
|
value={userQuery}
|
||||||
placeholder="Filtrér på navn"
|
placeholder="Filtrér på navn"
|
||||||
|
aria-label="Filtrér personer på navn"
|
||||||
/>
|
/>
|
||||||
{userQuery !== "" && (
|
{userQuery !== "" && (
|
||||||
<button type="button" onClick={() => setUserQuery("")}>
|
<button type="button" onClick={() => setUserQuery("")}>
|
||||||
Vis alle
|
Vis alle
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
|
</div>
|
||||||
|
<section className={styles.amountSection} aria-label="Innskudd">
|
||||||
|
<h2>Hvor mye?</h2>
|
||||||
|
{selectedUserDetails ? (
|
||||||
|
<p className={styles.selectedUser}>
|
||||||
|
Innskudd til{" "}
|
||||||
|
<strong>
|
||||||
|
{selectedUserDetails.firstName} {selectedUserDetails.lastName}
|
||||||
|
</strong>
|
||||||
|
</p>
|
||||||
|
) : (
|
||||||
|
<p className={styles.selectedUser}>Velg en person fra listen</p>
|
||||||
|
)}
|
||||||
|
<label className={styles.amountLabel} htmlFor="deposit-amount">
|
||||||
|
Beløp
|
||||||
|
</label>
|
||||||
|
<div className={styles.amountInput}>
|
||||||
|
<input
|
||||||
|
id="deposit-amount"
|
||||||
|
name="amount"
|
||||||
|
inputMode="decimal"
|
||||||
|
value={amount}
|
||||||
|
onChange={(event) => setAmount(event.target.value)}
|
||||||
|
placeholder="0"
|
||||||
|
/>
|
||||||
|
<span>kr</span>
|
||||||
|
</div>
|
||||||
|
<div className={styles.checkout}>
|
||||||
|
<button type="button" onClick={onSubmit} className="primary">
|
||||||
|
Sett inn
|
||||||
|
</button>
|
||||||
|
<button type="button" onClick={reset}>
|
||||||
|
Start på nytt
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
<div className={styles.userList}>
|
<div className={styles.userList}>
|
||||||
{filteredUsers.map((user) => (
|
{filteredUsers.map((user) => (
|
||||||
<UserCard
|
<UserCard
|
||||||
@@ -49,19 +87,6 @@ const Deposit = (): JSX.Element => {
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
|
||||||
<section className={styles.amountSection}>
|
|
||||||
<h2>Hvor mye?</h2>
|
|
||||||
<input name="amount" value={amount} onChange={(event) => setAmount(event.target.value)} placeholder="0" />
|
|
||||||
</section>
|
|
||||||
<section className={styles.checkout}>
|
|
||||||
<button type="button" onClick={onSubmit} className="primary">
|
|
||||||
Sett inn
|
|
||||||
</button>{" "}
|
|
||||||
<button type="button" onClick={reset}>
|
|
||||||
Start på nytt
|
|
||||||
</button>
|
|
||||||
</section>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const useDeposit = () => {
|
|||||||
const filteredUsers = (data?.allUsers || []).filter((user) =>
|
const filteredUsers = (data?.allUsers || []).filter((user) =>
|
||||||
`${user.firstName.toLowerCase()} ${user.lastName.toLowerCase()}`.includes(userQuery.toLowerCase()),
|
`${user.firstName.toLowerCase()} ${user.lastName.toLowerCase()}`.includes(userQuery.toLowerCase()),
|
||||||
);
|
);
|
||||||
|
const selectedUserDetails = data?.allUsers.find((user) => user.id === selectedUser);
|
||||||
const { showToast } = useToast();
|
const { showToast } = useToast();
|
||||||
|
|
||||||
const onSubmit = async () => {
|
const onSubmit = async () => {
|
||||||
@@ -61,6 +62,7 @@ export const useDeposit = () => {
|
|||||||
userQuery,
|
userQuery,
|
||||||
setUserQuery,
|
setUserQuery,
|
||||||
filteredUsers,
|
filteredUsers,
|
||||||
|
selectedUserDetails,
|
||||||
reset,
|
reset,
|
||||||
onSubmit,
|
onSubmit,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in new issue
Block a user