From 63679a0008a8e3bf3a82995dc6b68a4e774ae2dd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Aaron=20D=C3=B6tsch?= <aaron@fsmpi.rwth-aachen.de>
Date: Fri, 4 Aug 2023 02:49:01 +0200
Subject: [PATCH] Create Bitfield Selector component

Until now a bit field was only used for card flags. Soon (aka in uncommited changes) there are more
bit fields used. Creating a new component for every bit field would be unnecessary and bad coding
style, so I created a component that works for all bit fields and replaced all usages of the old
PermSelect component with the new one.
---
 src/components/BitfieldSelector.svelte       | 27 ++++++++++++++++++++
 src/routes/admin/user/[id]/CardItem.svelte   |  4 +--
 src/routes/admin/user/[id]/CardList.svelte   |  5 ++--
 src/routes/admin/user/[id]/PermSelect.svelte | 24 -----------------
 4 files changed, 32 insertions(+), 28 deletions(-)
 create mode 100644 src/components/BitfieldSelector.svelte
 delete mode 100644 src/routes/admin/user/[id]/PermSelect.svelte

diff --git a/src/components/BitfieldSelector.svelte b/src/components/BitfieldSelector.svelte
new file mode 100644
index 0000000..3e1c2b3
--- /dev/null
+++ b/src/components/BitfieldSelector.svelte
@@ -0,0 +1,27 @@
+<script lang="ts">
+	export let fields: {name: string, value: number}[];
+	export let value: number;
+	export let formName: string|undefined = undefined;
+	export let formFieldName: string|undefined = undefined;
+	let list = fields.map(({value})=>value).filter(x=>x&value);
+	$: selectedValue = list.reduce((a,b)=>a|b, 0);
+</script>
+
+<style>
+	ul {
+		list-style: none;
+		padding: 0;
+		margin: 0;
+	}
+</style>
+
+<ul>
+	{#each fields as {name, value}}
+		<li>
+			<label><input type="checkbox" bind:group={list} value={value} />{name}</label>
+		</li>
+	{/each}
+</ul>
+{#if formName}
+	<input type="hidden" name={formFieldName} value={selectedValue} form={formName} />
+{/if}
diff --git a/src/routes/admin/user/[id]/CardItem.svelte b/src/routes/admin/user/[id]/CardItem.svelte
index 2ee95ca..93ab707 100644
--- a/src/routes/admin/user/[id]/CardItem.svelte
+++ b/src/routes/admin/user/[id]/CardItem.svelte
@@ -1,7 +1,7 @@
 <script>
-	import PermSelect from "./PermSelect.svelte";
 	import { addMessage, MessageType } from "$lib/messages";
 	import { Flags } from "$lib/flags";
+	import BitfieldSelector from "../../../../components/BitfieldSelector.svelte";
 
 	export let code, perms, cards, index, edit;
 	function deleteCard(){
@@ -26,7 +26,7 @@
 {#if edit}
 <tr>
 	<td>{code}</td>
-	<td><PermSelect formName="form{code}" {perms} /></td>
+	<td><BitfieldSelector value={perms} fields={Object.entries(Flags).map(([name, value])=>({name, value}))} formName="form{code}" formFieldName="perms" /></td>
 	<td><button type="submit" form="form{code}">Speichern</button><button on:click={()=>edit=false}>Abbrechen</button></td>
 </tr>
 {:else}
diff --git a/src/routes/admin/user/[id]/CardList.svelte b/src/routes/admin/user/[id]/CardList.svelte
index ddc3c7e..1e7ab17 100644
--- a/src/routes/admin/user/[id]/CardList.svelte
+++ b/src/routes/admin/user/[id]/CardList.svelte
@@ -1,8 +1,9 @@
 <script>
 	import CardItem from "./CardItem.svelte";
 	import { enhance } from "$app/forms";
-	import PermSelect from "./PermSelect.svelte";
 	import { addMessage, MessageType } from "$lib/messages";
+	import BitfieldSelector from "../../../../components/BitfieldSelector.svelte";
+	import { Flags } from "$lib/flags";
 
 	export let cards;
 	let edit = cards.map(() => false);
@@ -19,7 +20,7 @@
 	{/each}
 	<tr>
 		<td><input form="form-new" name="code" /></td>
-		<td><PermSelect perms={0} formName="form-new" /></td>
+		<td><BitfieldSelector value={0} fields={Object.entries(Flags).map(([name, value])=>({name, value}))} formName="form-new" formFieldName="perms" /></td>
 		<td><button type="submit" form="form-new">Erstellen</button></td>
 	</tr>
 </table>
diff --git a/src/routes/admin/user/[id]/PermSelect.svelte b/src/routes/admin/user/[id]/PermSelect.svelte
deleted file mode 100644
index 0cb537d..0000000
--- a/src/routes/admin/user/[id]/PermSelect.svelte
+++ /dev/null
@@ -1,24 +0,0 @@
-<script>
-	import { Flags } from "$lib/flags";
-	export let formName, perms;
-	let permsList = Object.values(Flags).filter(x=>x&perms);
-	$: selectedPerms = permsList.reduce((a,b)=>a+b, 0);
-</script>
-
-<style>
-	ul {
-		list-style: none;
-		padding: 0;
-		margin: 0;
-	}
-</style>
-
-<ul>
-	{#each Object.keys(Flags) as p}
-		<li>
-			<label><input type="checkbox" bind:group={permsList} value={Flags[p]} />{p}</label>
-		</li>
-	{/each}
-</ul>
-<input type="hidden" name="perms" value={selectedPerms} form={formName} />
-
-- 
GitLab