From 84ef5dd5d600ac9674d451573dbb5ee5625cb9bd Mon Sep 17 00:00:00 2001
From: Miki <mikif70@gmail.com>
Date: Wed, 10 Jan 2024 11:52:56 +0100
Subject: [PATCH] priority setup - OK todo: add SSE

---
 frontend/src/lib/stores/surfers.js           |  29 ++
 frontend/src/routes/light/setup/+page.svelte | 265 +++++++++++++++----
 2 files changed, 238 insertions(+), 56 deletions(-)
 create mode 100644 frontend/src/lib/stores/surfers.js

diff --git a/frontend/src/lib/stores/surfers.js b/frontend/src/lib/stores/surfers.js
new file mode 100644
index 0000000..51da363
--- /dev/null
+++ b/frontend/src/lib/stores/surfers.js
@@ -0,0 +1,29 @@
+import { writable } from 'svelte/store';
+
+function createSurfers() {
+    const { subscribe, set, update } = writable([
+        { color: 'gray', priority: '' },
+        { color: 'gray', priority: '' },
+        { color: 'gray', priority: '' },
+        { color: 'gray', priority: '' },
+        { color: 'gray', priority: '' },
+        { color: 'gray', priority: '' },
+    ])
+    return {
+        subscribe,
+        set,
+        update,
+        reset: () => set([
+            { color: 'gray', priority: '' },
+            { color: 'gray', priority: '' },
+            { color: 'gray', priority: '' },
+            { color: 'gray', priority: '' },
+            { color: 'gray', priority: '' },
+            { color: 'gray', priority: '' },
+        ]),
+    }
+}
+
+export const surfers = createSurfers()
+
+export const surfersCount = writable(6)
\ No newline at end of file
diff --git a/frontend/src/routes/light/setup/+page.svelte b/frontend/src/routes/light/setup/+page.svelte
index 60219bd..134a283 100644
--- a/frontend/src/routes/light/setup/+page.svelte
+++ b/frontend/src/routes/light/setup/+page.svelte
@@ -1,93 +1,206 @@
 <script>
     import { onMount } from 'svelte';
+    import { surfers, surfersCount } from '$lib/stores/surfers.js';
+    import { colors } from '$lib/stores/colors.js';
     import Button from '$lib/button.svelte';
-    import Color from '$lib/color.svelte';
 
-    let saved = false;
     $: start = false;
-
-    $: surfer = [
-        { color: 'gray', priority: '2' },
-        { color: 'gray', priority: 'P' },
-        { color: 'gray', priority: '4' },
-        { color: 'gray', priority: '3' },
-        { color: 'gray', priority: '6' },
-        { color: 'gray', priority: '5' },
-    ];
-    $: surfers = 6;
-
-	$: if (saved && surfer) {
-		window.sessionStorage.setItem('priority', JSON.stringify(surfer));
-        window.sessionStorage.setItem('surfers', JSON.stringify(surfers));
-        window.sessionStorage.setItem('status', JSON.stringify(start));
-		console.log(`saved: ${JSON.stringify(surfer)}`);
-	}
+    // $: surfers_tot = 6;
 
     let footer_height = 8;
-    $: setup_height = ((100 - footer_height) / surfers) - (2.2 / surfers);
+    $: setup_height = ((100 - footer_height) / $surfersCount) - (2.2 / $surfersCount);
+
+	$: if (start && $surfers) {
+		window.sessionStorage.setItem('priority', JSON.stringify($surfers));
+        window.sessionStorage.setItem('surfers', JSON.stringify($surfersCount));
+        window.sessionStorage.setItem('status', JSON.stringify(start));
+		console.log(`saved: ${JSON.stringify($surfers)}`);
+	}
 
 	onMount(async () => {
 		let ses = window.sessionStorage.getItem('priority');        
 		if (ses) {
-			surfer = JSON.parse(ses);
-            surfers = JSON.parse(window.sessionStorage.getItem('surfers'));
+			$surfers = JSON.parse(ses);
+            $surfersCount = JSON.parse(window.sessionStorage.getItem('surfers'));
             start = JSON.parse(window.sessionStorage.getItem('status'));
-			console.log(`loaded: ${JSON.stringify(surfer)}`);
+			console.log(`loaded: ${JSON.stringify($surfers)}`);
 		}
-		saved = true;
 	});
 
+    function hasDuplicateColors() {
+		const colors = [];
+
+		console.log(JSON.stringify($surfers));
+
+		for (let i = 0; i < $surfersCount; i++) {
+			const color = $surfers[i].color;
+
+			if (colors.includes(color)) {
+				console.log(`duplicate color: ${color}`);
+				return true;
+			}
+
+			colors.push(color);
+		}
+
+		return false;
+	}
+
+    function ResetPriority() {
+        for (let i = 0; i < $surfersCount; i++) {
+            $surfers[i].priority = '';
+        }
+    }
+
+    function StartHeat() {
+        if (hasDuplicateColors()) {
+            alert('Duplicate colors');
+            return;
+        }
+        ResetPriority();
+        start = true;
+    }
+
+    function StopHeat() {
+        window.sessionStorage.clear();
+        start = false;
+    }
+
+    function AddSurfer() {
+        if ($surfersCount < 6) {
+            $surfersCount += 1;
+        }
+    }
+
+    function RemSurfer() {
+        if ($surfersCount > 2) {
+            $surfersCount -= 1;
+        }
+    }
+
+    function ResetSurfer() {
+        window.sessionStorage.clear(); 
+        location.reload();
+    }
+
+	 async function ChangePriority(id) {
+	// 	let max = $priority.surfers.length;
+	 	console.log($surfers[id]);
+		if ($surfers[id].priority === 'P') {
+			for (let i=0; i<$surfersCount; i++) {
+				if (i != id) {
+					let pos = parseInt($surfers[i].priority) - 1;
+					if (pos === 1) {
+						$surfers[i].priority = 'P';
+					} else {
+						$surfers[i].priority = pos.toString();
+					}
+				}
+			}
+			$surfers[id].priority = $surfersCount.toString();
+        } else if ($surfers[id].priority === '') {
+            console.log(`priority empty; pressed: [${id}] ${$surfers[id].priority}`);
+            for (let i=0; i<$surfersCount; i++) { 
+                console.log(`looping(${id}): ${i} - ${$surfers[i].priority}`);
+                if (i != id) {
+                    if ($surfers[i].priority === '') {
+                        console.log(`empty: [${i}] ${$surfers[i].priority}`);
+                        continue;
+                    } else {
+                        console.log(`not empty: [${i}] ${$surfers[i].priority}`);
+                        let pos = parseInt($surfers[i].priority) - 1;
+                        if (pos === 1) {
+                            $surfers[i].priority = 'P';
+                        } else {
+                            $surfers[i].priority = pos.toString();
+                        }
+                    }
+                } 
+                $surfers[id].priority = $surfersCount.toString();
+            }
+        } else {
+            console.log(`pressed: [${id}] ${$surfers[id].priority}`);
+            let oldpos = parseInt($surfers[id].priority);
+            for (let i=0; i<$surfersCount; i++) {
+                if (i != id) {
+                    console.log(`pos: [${i}] ${$surfers[i].priority} ${$surfers[i].priority > oldpos}`);
+                    if ($surfers[i].priority != 'P') {
+                        let pos = parseInt($surfers[i].priority);
+                        if (pos > oldpos) {
+                            console.log(`newpos: ${$surfers[i].priority}`);
+                            $surfers[i].priority = (pos - 1).toString();
+                        }
+                    }
+                } else {
+                    $surfers[i].priority = $surfersCount.toString();
+                    console.log(`last: [${i}] ${$surfers[i].priority}`);
+                }
+            }
+        }
+
+	// 	const res = await fetch(`/api/priority`, {
+	// 		method: 'POST',
+	// 		body: JSON.stringify({
+	// 			priority: $priority.surfers.map((obj) => obj.priority),
+	// 			mode: 'priority'
+	// 		}),
+	// 		headers: {
+	// 			'Content-Type': 'application/json'
+	// 		}
+	// 	});
+	// 	console.log(
+	// 		JSON.stringify({
+	// 			priority: $priority.surfers.map((obj) => obj.priority),
+	// 			mode: 'priority'
+	// 		})
+	// 	);
+	// 	console.log(`retval: ${JSON.stringify(res)}`);
+	}
+
 </script>
 
 {#if start}
     <ul>
-        {#each Array(surfers) as _, id}
+        {#each Array($surfersCount) as _, id}
             <li style="--height:{setup_height}vh">
-                {#if surfer[id].priority == 'P'}
-                    <div class="priority" id="p"><a href="/">{surfer[id].priority}</a></div>
+                {#if $surfers[id].priority == 'P'}
+                    <div class="priority" id="p" on:click={() => ChangePriority(id)}>{$surfers[id].priority}</div>
                 {:else}
-                    <div class="priority" id="n">{surfer[id].priority}</div>
+                    <div class="priority" id="n" on:click={() => ChangePriority(id)}>{$surfers[id].priority}</div>
                 {/if}
-                <div class="color" style:background-color={surfer[id].color}>
+                <div class="color" style:background-color={$surfers[id].color}>
                 </div>
             </li>        
         {/each}
     </ul>
     <div class="footer" style="--height:{footer_height}vh">
-        <Button label="STOP" handleClick={() => {start = false;}} />    
+        <button class="button" on:click={StopHeat}>STOP</button>
     </div>    
 {:else}
     <ul>
-        {#each Array(surfers) as _, id}
+        {#each Array($surfersCount) as _, id}
             <li style="--height:{setup_height}vh">
-                {#if surfer[id].priority == 'P'}
-                    <div class="priority" id="p"><a href="/">{surfer[id].priority}</a></div>
-                    <!-- <span>{footer_height} - {setup_height}</span> -->
-                {:else}
-                    <div class="priority" id="n">{surfer[id].priority}</div>
-                {/if}
-                <div class="color" style:background-color={surfer[id].color}></div>
+                <div class="priority" id="color">
+                    <select name="color{id}" id="{id}" bind:value={$surfers[id].color} style="background-color: {$surfers[id].color};">
+                        {#each $colors as color}
+                            <option value="{color}" style="background-color: {color}"></option>
+                        {/each}
+                    </select>            
+                </div>
+                <div class="color" style:background-color={$surfers[id].color}></div>
             </li>        
         {/each}
     </ul>
     <div class="footer" style="--height:{footer_height}vh">
-        <!-- <span>{footer_height} - {setup_height}</span>
-        <span style:padding-left="20px"></span>
-        {#each Array(surfers) as _, id}        
-            <span style:padding-left="20px"></span><span>{surfer[id].color}</span>
-        {/each}
-        <br> -->
-        <Button label="+" handleClick={() => {if (surfers < 6) surfers += 1;}} />
-        <Button label={surfers} />
-        <Button label="-" handleClick={() => {if (surfers > 2) surfers -= 1;}} />
-        {#each Array(surfers) as _, id}
-            <span style:padding-left="1vmin"></span>
-            <Color id="color{id}" label="Color-{id+1}" bind:value={surfer[id].color} />
-        {/each}
-        <span style:padding-left="1vmin"></span>
-        <Button label="Reset" handleClick={() => {saved = false; window.sessionStorage.clear(); location.reload();}} />
-        <span style:padding-left="1vmin"></span>
-        <Button label="START" handleClick={() => {start = true;}} />    
+        <div class="control">
+            <button class="button" on:click={AddSurfer}>+</button>
+            <button class="display">{$surfersCount}</button>
+            <button class="button" on:click={RemSurfer}>-</button>    
+        </div>
+        <div class="command">
+            <button class="button" on:click={ResetSurfer}>Reset</button>
+            <button class="button" on:click={StartHeat}>START</button>    
+        </div>
     </div>
 {/if}
 
@@ -142,16 +255,56 @@
 		height: 100%;
 	}
 
+    .priority#color {
+        background-color: lightgrey;
+        margin: 0 auto;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+    }
+
+    .priority#color select {
+        width: 100%;
+        /* margin-top: 40%; */
+        font-size: 6vmin;
+    }
+
 	.color {
 		width: 100vw;
 	}
 
     .footer {
-        display: fixed;
+        display: inline-flex;
         bottom: 0;
         background-color: darkgrey;
         /* border: 2px solid black; */
         width: 100%;        
         height: var(--height);
+        justify-content: center;
+        align-items: center;
+    }
+
+    .control {
+        margin-left: 0;
+        margin-right: auto;
+    }
+
+    .command {
+        margin-left: auto;
+        margin-right: 0;
+    }
+
+    .display {
+        margin-left: 2vmin;
+        margin-right: 2vmin;
+        font-size: 2.5vmin;
+    }
+
+    .button {
+        margin-left: 2vmin;
+        margin-right: 2vmin;
+        border-radius: 4px;
+        border-style: inset;
+        font-size: 2.5vmin;
     }
 </style>