|
2 | 2 | import { page } from '$app/stores'; |
3 | 3 | import { replaceEmptyStrings } from '$lib/common/component_utilities'; |
4 | 4 | import { AlertError } from '$lib/common/errors'; |
5 | | - import { generateNewUniqueDatasetName, getFirstTaskIndexForContinuingWorkflow } from '$lib/common/job_utilities'; |
| 5 | + import { |
| 6 | + generateNewUniqueDatasetName, |
| 7 | + getFirstTaskIndexForContinuingWorkflow |
| 8 | + } from '$lib/common/job_utilities'; |
| 9 | + import BooleanIcon from '$lib/components/common/BooleanIcon.svelte'; |
6 | 10 | import Modal from '$lib/components/common/Modal.svelte'; |
7 | 11 |
|
8 | 12 | /** @type {import('$lib/types-v2').DatasetV2[]} */ |
|
50 | 54 | export function open(action) { |
51 | 55 | mode = action; |
52 | 56 | replaceExistingDataset = true; |
| 57 | + applyingWorkflow = false; |
| 58 | + checkingConfiguration = false; |
53 | 59 | workerInitControl = ''; |
54 | | - if ((mode === 'run' || mode === 'restart') && workflow.task_list.length > 0) { |
| 60 | + if (mode === 'run' || mode === 'restart') { |
55 | 61 | firstTaskIndex = 0; |
56 | 62 | } else { |
57 | 63 | firstTaskIndex = getFirstTaskIndexForContinuingWorkflow(workflow.task_list, statuses); |
|
121 | 127 | } |
122 | 128 |
|
123 | 129 | async function replaceDataset() { |
124 | | - const { id, name, zarr_dir } = getSelectedDataset(); |
| 130 | + const { id, name, zarr_dir } = /** @type {import('$lib/types-v2').DatasetV2} */ ( |
| 131 | + selectedDataset |
| 132 | + ); |
125 | 133 | await handleDatasetDelete(id); |
126 | 134 | const newDatasets = datasets.filter((d) => d.id !== id); |
127 | 135 | const newDataset = await handleDatasetCreate(name, zarr_dir); |
|
130 | 138 | } |
131 | 139 |
|
132 | 140 | async function createNewDataset() { |
133 | | - const { zarr_dir } = getSelectedDataset(); |
| 141 | + const { zarr_dir } = /** @type {import('$lib/types-v2').DatasetV2} */ (selectedDataset); |
134 | 142 | const newDataset = await handleDatasetCreate(newDatasetName, zarr_dir); |
135 | 143 | onDatasetsUpdated([...datasets, newDataset], newDataset.id); |
136 | 144 | } |
|
185 | 193 | } |
186 | 194 | } |
187 | 195 |
|
188 | | - function computeNewDatasetName() { |
189 | | - newDatasetName = generateNewUniqueDatasetName(datasets, getSelectedDataset().name); |
| 196 | + /** @type {{ [key: string]: string|number|boolean }} */ |
| 197 | + let appliedAttributeFilters = {}; |
| 198 | + /** @type {{ [key: string]: boolean }} */ |
| 199 | + let appliedTypeFilters = {}; |
| 200 | +
|
| 201 | + function showConfirmRun() { |
| 202 | + checkingConfiguration = true; |
| 203 | + const wft = workflow.task_list[firstTaskIndex || 0]; |
| 204 | + if (mode === 'restart') { |
| 205 | + appliedAttributeFilters = { ...wft.input_filters.attributes }; |
| 206 | + appliedTypeFilters = { ...wft.input_filters.types }; |
| 207 | + } else { |
| 208 | + const dataset = /** @type {import('$lib/types-v2').DatasetV2} */ (selectedDataset); |
| 209 | + appliedAttributeFilters = { ...dataset.filters.attributes, ...wft.input_filters.attributes }; |
| 210 | + appliedTypeFilters = { ...dataset.filters.types, ...wft.input_filters.types }; |
| 211 | + } |
190 | 212 | } |
191 | 213 |
|
192 | | - function getSelectedDataset() { |
193 | | - return /** @type {import('$lib/types-v2').DatasetV2}*/ ( |
194 | | - datasets.find((d) => d.id === selectedDatasetId) |
195 | | - ); |
| 214 | + function computeNewDatasetName() { |
| 215 | + const dataset = /** @type {import('$lib/types-v2').DatasetV2} */ (selectedDataset); |
| 216 | + newDatasetName = generateNewUniqueDatasetName(datasets, dataset.name); |
196 | 217 | } |
197 | 218 | </script> |
198 | 219 |
|
|
384 | 405 | </div> |
385 | 406 | </div> |
386 | 407 | </div> |
| 408 | + {#if checkingConfiguration} |
| 409 | + <hr /> |
| 410 | + <h6 class="mt-3">Applied filters</h6> |
| 411 | + {#if Object.entries(appliedAttributeFilters).length > 0 || Object.entries(appliedTypeFilters).length > 0} |
| 412 | + <p> |
| 413 | + Currently, the following filters are applied to the image list before it is passed to |
| 414 | + the first task: |
| 415 | + </p> |
| 416 | + <ul class="mb-0"> |
| 417 | + {#each Object.entries(appliedAttributeFilters) as [key, value]} |
| 418 | + <li>{key}: <code>{value}</code></li> |
| 419 | + {/each} |
| 420 | + </ul> |
| 421 | + <ul class="mt-0 mb-1"> |
| 422 | + {#each Object.entries(appliedTypeFilters) as [key, value]} |
| 423 | + <li>{key}: <BooleanIcon {value} /></li> |
| 424 | + {/each} |
| 425 | + </ul> |
| 426 | + {:else} |
| 427 | + <p class="mb-0">No filters</p> |
| 428 | + {/if} |
| 429 | + {/if} |
387 | 430 | </form> |
388 | 431 | </svelte:fragment> |
389 | 432 | <svelte:fragment slot="footer"> |
|
402 | 445 | Confirm |
403 | 446 | </button> |
404 | 447 | {:else} |
405 | | - <button |
406 | | - class="btn btn-primary" |
407 | | - on:click={() => (checkingConfiguration = true)} |
408 | | - disabled={runBtnDisabled} |
409 | | - > |
| 448 | + <button class="btn btn-primary" on:click={showConfirmRun} disabled={runBtnDisabled}> |
410 | 449 | Run |
411 | 450 | </button> |
412 | 451 | {/if} |
413 | 452 | </svelte:fragment> |
414 | 453 | </Modal> |
| 454 | +
|
| 455 | +<style> |
| 456 | + :global(.boolean-icon) { |
| 457 | + vertical-align: top; |
| 458 | + } |
| 459 | +</style> |
0 commit comments