|
3 | 3 | import { AlertError } from '$lib/common/errors'; |
4 | 4 | import { onMount, tick } from 'svelte'; |
5 | 5 | import Modal from '../common/Modal.svelte'; |
| 6 | + import { error } from '@sveltejs/kit'; |
6 | 7 |
|
7 | 8 | /** @type {(dataset: (import('$lib/types').Dataset)) => void} */ |
8 | 9 | export let createDatasetCallback; |
|
20 | 21 | let datasetType = ''; |
21 | 22 | let customDatasetType = ''; |
22 | 23 | let readonly = false; |
23 | | - /** @type {Array<{ id: number | null, path: string, editing: boolean, error: boolean }>} */ |
| 24 | + /** @type {Array<{ id: number | null, path: string, editing: boolean, error: string }>} */ |
24 | 25 | let resources = [getNewResource()]; |
25 | 26 | let submitted = false; |
26 | 27 | let saving = false; |
| 28 | + let creatingDataset = false; |
27 | 29 |
|
28 | 30 | // Used for the update |
29 | 31 | /** @type {import('$lib/types').Dataset} */ |
|
75 | 77 | readonly = false; |
76 | 78 | resources = [getNewResource()]; |
77 | 79 | submitted = false; |
| 80 | + creatingDataset = false; |
78 | 81 | modal.show(); |
79 | 82 | } |
80 | 83 |
|
|
83 | 86 | id: /** @type {number | null} */ null, |
84 | 87 | path: '', |
85 | 88 | editing: true, |
86 | | - error: false |
| 89 | + error: '' |
87 | 90 | }; |
88 | 91 | } |
89 | 92 |
|
|
93 | 96 | datasetName = dataset.name; |
94 | 97 | if (!dataset.type || datasetTypes.indexOf(dataset.type) !== -1) { |
95 | 98 | datasetTypeOption = 'standard'; |
96 | | - datasetType = dataset.type || ""; |
| 99 | + datasetType = dataset.type || ''; |
97 | 100 | customDatasetType = ''; |
98 | 101 | } else { |
99 | 102 | datasetTypeOption = 'custom'; |
100 | 103 | datasetType = ''; |
101 | | - customDatasetType = dataset.type || ""; |
| 104 | + customDatasetType = dataset.type || ''; |
102 | 105 | } |
103 | 106 | readonly = dataset.readonly; |
104 | 107 | resources = dataset.resource_list.map((r) => { |
105 | | - return { id: r.id, path: r.path, editing: false, error: false }; |
| 108 | + return { id: r.id, path: r.path, editing: false, error: '' }; |
106 | 109 | }); |
107 | 110 | submitted = false; |
| 111 | + creatingDataset = false; |
108 | 112 | modal.show(); |
109 | 113 | } |
110 | 114 |
|
|
121 | 125 | } |
122 | 126 |
|
123 | 127 | async function save() { |
| 128 | + // reset resources errors |
| 129 | + resources = resources.map((r) => { |
| 130 | + return { ...r, error: '' }; |
| 131 | + }); |
| 132 | +
|
124 | 133 | try { |
125 | 134 | if (datasetId === null) { |
| 135 | + creatingDataset = true; |
126 | 136 | originalDataset = await callCreateDataset(); |
127 | 137 | datasetId = originalDataset.id; |
128 | 138 | createDatasetCallback(originalDataset); |
129 | 139 | } else { |
| 140 | + creatingDataset = false; |
130 | 141 | originalDataset = await callUpdateDataset(); |
131 | 142 | updateDatasetCallback(originalDataset); |
132 | 143 | } |
|
196 | 207 | modal.hideErrorAlert(); |
197 | 208 |
|
198 | 209 | const resource = resources[index]; |
199 | | - resource.error = false; |
| 210 | + resource.error = ''; |
200 | 211 | if (!resource.path) { |
201 | 212 | return false; |
202 | 213 | } |
203 | 214 |
|
204 | 215 | if (datasetId === null) { |
205 | 216 | try { |
| 217 | + if (!fieldsAreValid()) { |
| 218 | + return false; |
| 219 | + } |
| 220 | + creatingDataset = true; |
206 | 221 | originalDataset = await callCreateDataset(); |
207 | 222 | datasetId = originalDataset.id; |
208 | 223 | createDatasetCallback(originalDataset); |
|
224 | 239 | setResourceEditable(index, false); |
225 | 240 | updateDatasetCallback(getUpdatedDataset()); |
226 | 241 | } catch (err) { |
227 | | - resource.error = true; |
228 | | - modal.displayErrorAlert(err); |
| 242 | + const validationMsg = |
| 243 | + err instanceof AlertError ? err.getSimpleValidationMessage('path') : null; |
| 244 | + if (validationMsg) { |
| 245 | + resource.error = validationMsg; |
| 246 | + } else { |
| 247 | + resource.error = 'An error happened saving the resource'; |
| 248 | + modal.displayErrorAlert(err); |
| 249 | + } |
229 | 250 | } finally { |
230 | 251 | resources = resources.filter((r, i) => (i === index ? resource : r)); |
231 | 252 | } |
|
251 | 272 | const result = await response.json(); |
252 | 273 | if (!response.ok) { |
253 | 274 | console.log('Dataset resource creation failed', result); |
254 | | - throw new AlertError(result); |
| 275 | + throw new AlertError(result, response.status); |
255 | 276 | } |
256 | 277 | return result; |
257 | 278 | } |
|
365 | 386 | return false; |
366 | 387 | } |
367 | 388 | } |
368 | | - return datasetName; |
| 389 | + return !!datasetName; |
369 | 390 | } |
370 | 391 |
|
371 | 392 | function getDatasetType() { |
|
390 | 411 | </h4> |
391 | 412 | </svelte:fragment> |
392 | 413 | <svelte:fragment slot="body"> |
| 414 | + {#if creatingDataset && resources.filter((r) => r.error !== '').length > 0} |
| 415 | + <div class="alert alert-warning alert-dismissible fade show" role="alert"> |
| 416 | + <span> |
| 417 | + <i class="bi bi-exclamation-triangle" /> |
| 418 | + <strong>Warning</strong>: Dataset has been created but the creation of some of its |
| 419 | + resources failed. |
| 420 | + </span> |
| 421 | + <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close" /> |
| 422 | + </div> |
| 423 | + {/if} |
393 | 424 | <span id="errorAlert-createUpdateDatasetModal" /> |
394 | 425 | <form class="row" on:submit|preventDefault={handleSave} id="create-update-dataset-form"> |
395 | 426 | <div class="col"> |
|
438 | 469 | <div class="row mb-3"> |
439 | 470 | <div class="col-10 offset-2"> |
440 | 471 | {#if datasetTypeOption === 'standard'} |
441 | | - <select |
442 | | - id="datasetType" |
443 | | - bind:value={datasetType} |
444 | | - class="form-control" |
445 | | - > |
| 472 | + <select id="datasetType" bind:value={datasetType} class="form-control"> |
446 | 473 | <option value="">Select...</option> |
447 | 474 | {#each datasetTypes as allowedType} |
448 | 475 | <option>{allowedType}</option> |
|
521 | 548 | <div class="invalid-feedback">Required field</div> |
522 | 549 | {/if} |
523 | 550 | {#if submitted && resource.error} |
524 | | - <div class="invalid-feedback">An error happened saving the resource</div> |
| 551 | + <div class="invalid-feedback">{resource.error}</div> |
525 | 552 | {/if} |
526 | 553 | </div> |
527 | 554 | </div> |
|
0 commit comments