From 155d54d4115e2b383f0f39bd79ab0eeb7a6afbf1 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Thu, 7 Jul 2022 14:38:28 +0300 Subject: [PATCH] Edit badge owners in DB --- app/routes/badges/$id/edit.tsx | 95 +++++++++++++++++++++++++++++----- app/styles/badges.css | 18 +++++-- 2 files changed, 97 insertions(+), 16 deletions(-) diff --git a/app/routes/badges/$id/edit.tsx b/app/routes/badges/$id/edit.tsx index 710d93302..91a89d3bf 100644 --- a/app/routes/badges/$id/edit.tsx +++ b/app/routes/badges/$id/edit.tsx @@ -15,6 +15,7 @@ import { parseRequestFormData, validate } from "~/utils/remix"; import { canEditBadgeManagers } from "~/permissions"; import { assertUnreachable } from "~/utils/types"; import { db } from "~/db"; +import type { User } from "~/db/types"; const editBadgeActionSchema = z.union([ z.object({ @@ -23,7 +24,7 @@ const editBadgeActionSchema = z.union([ }), z.object({ _action: z.literal("OWNERS"), - ownerIds: z.preprocess(safeJSONParse, z.array(id).refine(noDuplicates)), + ownerIds: z.preprocess(safeJSONParse, z.array(id)), }), ]); @@ -72,6 +73,7 @@ export default function EditBadgePage() { to={atOrError(matches, -2).pathname} variant="minimal-destructive" tiny + className="badges-edit__cancel-button" > Cancel @@ -84,6 +86,13 @@ export default function EditBadgePage() { ); } +function submitButtonText(amountOfChanges: number) { + if (amountOfChanges === 0) return "Submit"; + if (amountOfChanges === 1) return `Submit ${amountOfChanges} change`; + + return `Submit ${amountOfChanges} changes`; +} + function Managers({ data }: { data: BadgeDetailsLoaderData }) { const [managers, setManagers] = React.useState( data.managers.map((m) => ({ @@ -156,21 +165,83 @@ function Managers({ data }: { data: BadgeDetailsLoaderData }) { } function Owners({ data }: { data: BadgeDetailsLoaderData }) { + const [owners, setOwners] = React.useState( + data.owners.map((o) => ({ + id: o.id, + discordFullName: discordFullName(o), + count: o.count, + })) + ); + + const amountOfChanges = owners.reduce((acc, owner) => { + const oldOwner = data.owners.find((o) => o.id === owner.id); + const hasChanged = !oldOwner || owner.count !== oldOwner.count; + return acc + (hasChanged ? 1 : 0); + }, 0); + return ( -
-

Owners

-
- +
+
+

Owners

+
    + {owners.map((owner) => ( +
  • + {owner.discordFullName} + + setOwners( + owners.map((o) => + o.id === owner.id + ? { ...o, count: Number(e.target.value) } + : o + ) + ) + } + /> +
  • + ))} +
+ { + if (!user) return; + + setOwners([ + ...owners, + { discordFullName: user.label, id: Number(user.value), count: 1 }, + ]); + }} + userIdsToOmit={new Set(owners.map((m) => m.id))} + />
+ +
); } -function submitButtonText(amountOfChanges: number) { - if (amountOfChanges === 0) return "Submit"; - if (amountOfChanges === 1) return `Submit ${amountOfChanges} change`; - - return `Submit ${amountOfChanges} changes`; +function countArrayToDuplicatedIdsArray( + owners: Array<{ id: User["id"]; count: number }> +) { + return owners.flatMap((o) => new Array(o.count).fill(null).map(() => o.id)); } diff --git a/app/styles/badges.css b/app/styles/badges.css index 1b06ad088..30f3dee57 100644 --- a/app/styles/badges.css +++ b/app/styles/badges.css @@ -54,19 +54,29 @@ } .badges-edit__users-list > li { - list-style: none; display: flex; - justify-content: space-between; align-items: center; + justify-content: space-between; + list-style: none; } .badges-edit__users-list { + display: flex; + flex-direction: column; padding: 0; font-size: var(--fonts-xs); font-weight: var(--semi-bold); - display: flex; gap: var(--s-2); - flex-direction: column; + padding-block-end: var(--s-2-5); +} + +.badges-edit__number-input { + width: 5rem; +} + +.badges-edit__cancel-button { + width: max-content; + margin: 0 auto; } .badges-edit__big-header {