|
21 | 21 | wrapperClass = 'mt-3 mb-3' |
22 | 22 | } = $props(); |
23 | 23 |
|
| 24 | + let validationError = $state(''); |
| 25 | +
|
24 | 26 | onMount(() => { |
25 | | - selectAllGroup(); |
| 27 | + selectDefaultGroup(); |
26 | 28 | }); |
27 | 29 |
|
28 | | - function selectAllGroup() { |
| 30 | + function selectDefaultGroup() { |
29 | 31 | if (selectedGroup === null) { |
30 | 32 | const groupAll = groupIdsNames.find((i) => i[1] === defaultGroupName); |
31 | 33 | if (groupAll) { |
32 | 34 | selectedGroup = groupAll[0]; |
| 35 | + } else if (groupIdsNames.length === 1) { |
| 36 | + selectedGroup = groupIdsNames[0][0]; |
33 | 37 | } |
34 | 38 | } |
35 | 39 | } |
| 40 | +
|
| 41 | + export function validate() { |
| 42 | + validationError = ''; |
| 43 | + if (!privateTask && selectedGroup === null) { |
| 44 | + validationError = 'Shared tasks must be associated with a group'; |
| 45 | + return false; |
| 46 | + } |
| 47 | + return true; |
| 48 | + } |
| 49 | +
|
| 50 | + export function clear() { |
| 51 | + validationError = ''; |
| 52 | + } |
36 | 53 | </script> |
37 | 54 |
|
38 | 55 | <div class={wrapperClass}> |
|
46 | 63 | id="taskSelectorShared-{id}" |
47 | 64 | value={false} |
48 | 65 | bind:group={privateTask} |
49 | | - onchange={selectAllGroup} |
| 66 | + onchange={() => { |
| 67 | + validationError = ''; |
| 68 | + selectDefaultGroup(); |
| 69 | + }} |
50 | 70 | /> |
51 | 71 | <label class="form-check-label" for="taskSelectorShared-{id}">Shared task</label> |
52 | 72 | </div> |
|
57 | 77 | name="privateTaskSelector-{id}" |
58 | 78 | id="taskSelectorPrivate-{id}" |
59 | 79 | value={true} |
| 80 | + onchange={() => (validationError = '')} |
60 | 81 | bind:group={privateTask} |
61 | 82 | /> |
62 | 83 | <label class="form-check-label" for="taskSelectorPrivate-{id}">Private task</label> |
63 | 84 | </div> |
64 | 85 | </div> |
65 | | - {#if !privateTask && groupIdsNames.length > 0} |
| 86 | + {#if !privateTask} |
66 | 87 | <div class="col-12"> |
67 | 88 | <div class="input-group"> |
68 | 89 | <label class="input-group-text" for="task-group-selector">Group</label> |
69 | | - <select class="form-select" id="task-group-selector" bind:value={selectedGroup}> |
| 90 | + <select |
| 91 | + class="form-select" |
| 92 | + id="task-group-selector" |
| 93 | + bind:value={selectedGroup} |
| 94 | + class:is-invalid={validationError} |
| 95 | + > |
70 | 96 | <option value={null}>Select...</option> |
71 | 97 | {#if groupIdsNames} |
72 | 98 | {#each groupIdsNames as [groupId, groupName] (groupId)} |
|
78 | 104 | </div> |
79 | 105 | {/if} |
80 | 106 | </div> |
| 107 | + {#if validationError} |
| 108 | + <div class="row text-danger mt-2"> |
| 109 | + <div class="col">{validationError}</div> |
| 110 | + </div> |
| 111 | + {/if} |
81 | 112 | </div> |
0 commit comments