|
1 | 1 | <script> |
2 | 2 | import { page } from '$app/stores'; |
3 | | - import { AlertError, displayStandardErrorAlert } from '$lib/common/errors'; |
| 3 | + import { AlertError, displayStandardErrorAlert, FormErrorHandler } from '$lib/common/errors'; |
4 | 4 | import { sortUserByEmailComparator } from '$lib/common/user_utilities'; |
| 5 | + import StandardDismissableAlert from '$lib/components/common/StandardDismissableAlert.svelte'; |
| 6 | + import { onMount } from 'svelte'; |
5 | 7 |
|
6 | 8 | /** @type {import('$lib/types').Group & {user_ids: number[]}} */ |
7 | | - $: group = $page.data.group; |
| 9 | + let group = $page.data.group; |
8 | 10 | /** @type {Array<import('$lib/types').User & {id: number}>} */ |
9 | | - $: users = $page.data.users; |
| 11 | + let users = $page.data.users; |
10 | 12 |
|
11 | 13 | /** @type {import('$lib/types').User & {id: number}|null} */ |
12 | 14 | let draggedUser = null; |
|
69 | 71 | addingUser = null; |
70 | 72 | hovering = false; |
71 | 73 | } |
| 74 | +
|
| 75 | + /** @type {string[]} */ |
| 76 | + let editableViewPaths = []; |
| 77 | + let viewerPathsUpdatedMessage = ''; |
| 78 | + const viewerPathsErrorHandler = new FormErrorHandler('viewerPathGenericError', ['viewer_paths']); |
| 79 | + const viewerPathsValidationErrors = viewerPathsErrorHandler.getValidationErrorStore(); |
| 80 | +
|
| 81 | + function addViewerPath() { |
| 82 | + editableViewPaths = [...editableViewPaths, '']; |
| 83 | + } |
| 84 | +
|
| 85 | + /** |
| 86 | + * @param {number} index |
| 87 | + */ |
| 88 | + function removeViewerPath(index) { |
| 89 | + editableViewPaths = editableViewPaths.filter((_, i) => i !== index); |
| 90 | + } |
| 91 | +
|
| 92 | + async function saveViewerPaths() { |
| 93 | + viewerPathsUpdatedMessage = ''; |
| 94 | + viewerPathsErrorHandler.clearErrors(); |
| 95 | + const headers = new Headers(); |
| 96 | + headers.set('Content-Type', 'application/json'); |
| 97 | + const response = await fetch(`/api/auth/group/${group.id}`, { |
| 98 | + method: 'PATCH', |
| 99 | + credentials: 'include', |
| 100 | + headers, |
| 101 | + body: JSON.stringify({ |
| 102 | + viewer_paths: [...editableViewPaths] |
| 103 | + }) |
| 104 | + }); |
| 105 | + if (!response.ok) { |
| 106 | + await viewerPathsErrorHandler.handleErrorResponse(response); |
| 107 | + return; |
| 108 | + } |
| 109 | + const { viewer_paths } = await response.json(); |
| 110 | + editableViewPaths = viewer_paths; |
| 111 | + viewerPathsUpdatedMessage = 'Paths successfully updated'; |
| 112 | + } |
| 113 | +
|
| 114 | + onMount(() => { |
| 115 | + editableViewPaths = [...group.viewer_paths]; |
| 116 | + }); |
72 | 117 | </script> |
73 | 118 |
|
74 | 119 | <nav aria-label="breadcrumb"> |
|
146 | 191 | {/if} |
147 | 192 | </div> |
148 | 193 | </div> |
| 194 | +
|
| 195 | +<div class="row mt-4"> |
| 196 | + <div class="col-lg-9"> |
| 197 | + <h4 class="fw-light">Viewer paths</h4> |
| 198 | + {#each editableViewPaths as viewerPath, i} |
| 199 | + <div class="input-group mb-2"> |
| 200 | + <input |
| 201 | + type="text" |
| 202 | + class="form-control" |
| 203 | + id={`viewerPath-${i}`} |
| 204 | + bind:value={viewerPath} |
| 205 | + aria-label={`Viewer path #${i + 1}`} |
| 206 | + required |
| 207 | + /> |
| 208 | + <button |
| 209 | + class="btn btn-outline-secondary" |
| 210 | + type="button" |
| 211 | + id="viewer_path_remove_{i}" |
| 212 | + aria-label={`Remove viewer path #${i + 1}`} |
| 213 | + on:click={() => removeViewerPath(i)} |
| 214 | + > |
| 215 | + <i class="bi bi-trash" /> |
| 216 | + </button> |
| 217 | + </div> |
| 218 | + {/each} |
| 219 | + <button class="btn btn-secondary mb-2" on:click={addViewerPath}>Add viewer path</button> |
| 220 | + <div id="viewerPathGenericError" /> |
| 221 | + {#if $viewerPathsValidationErrors['viewer_paths']} |
| 222 | + <div class="alert alert-danger mb-2"> |
| 223 | + {$viewerPathsValidationErrors['viewer_paths']} |
| 224 | + </div> |
| 225 | + {/if} |
| 226 | + <StandardDismissableAlert message={viewerPathsUpdatedMessage} /> |
| 227 | + <button class="btn btn-primary" on:click={saveViewerPaths}>Save</button> |
| 228 | + </div> |
| 229 | +</div> |
0 commit comments