Skip to content

Commit 14d204d

Browse files
committed
Introducing slim-select to improve task selection
- Common tasks gets grouped in select by their reference package - User tasks gets grouped by their owners
1 parent 54a0a10 commit 14d204d

File tree

5 files changed

+73
-16
lines changed

5 files changed

+73
-16
lines changed

package-lock.json

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"dependencies": {
3535
"@vincjo/datatables": "^1.6.0",
3636
"ajv": "^8.12.0",
37-
"jose": "^4.14.4"
37+
"jose": "^4.14.4",
38+
"slim-select": "^2.5.1"
3839
}
3940
}

src/app.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css"
1818
/>
1919
<title>Fractal Web Client</title>
20+
<link rel='stylesheet' href='%sveltekit.assets%/slimselect.css'>
2021
<link rel='stylesheet' href='%sveltekit.assets%/global.css'>
2122
</head>
2223
<body>

src/lib/components/workflow/WorkflowTaskSelection.svelte

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script>
22
// import { page } from '$app/stores';
3+
import { onMount } from 'svelte';
4+
import SlimSelect from 'slim-select';
35
import { greatestVersionDesc } from '$lib/common/component_utilities.js';
46
57
export let tasks = undefined;
@@ -9,15 +11,33 @@
911
let selectionTasksNames = [];
1012
let selectedMapKey;
1113
let selectedMapTaskVersions = undefined;
12-
14+
let selectionControl = undefined;
15+
let filteredTasks = [];
16+
17+
18+
onMount(() => {
19+
selectionControl = new SlimSelect({
20+
select: '#advanced-select',
21+
events: {
22+
afterChange: (selection) => {
23+
const selectedOption = selection[0];
24+
if (!selectedOption.placeholder) {
25+
selectedMapKey = selectedOption.value;
26+
selectedMapTaskVersions = selectionTasks.get(selectedMapKey);
27+
selectedMapTaskVersions.sort(greatestVersionDesc);
28+
}
29+
}
30+
}
31+
});
32+
});
1333
1434
function setSelectionTasks(group, tasks) {
1535
selectionTasks = new Map();
1636
selectionTasksNames = [];
1737
selectedMapKey = null;
1838
selectedMapTaskVersions = undefined;
1939
20-
let filteredTasks = [];
40+
filteredTasks = [];
2141
2242
if (group === 'common') {
2343
filteredTasks = tasks.filter(task => task.owner === null); // .filter((task, index, self) => self.findIndex(t => t.name === task.name) === index);
@@ -36,17 +56,49 @@
3656
});
3757
selectionTasksNames = Array.from(selectionTasks.keys());
3858
59+
setSelectionControlData();
3960
}
4061
41-
function setSelectedGroup(group) {
42-
console.log(group);
43-
selectedTypeOfTask = group;
62+
function setSelectionControlData() {
63+
let optionsMap = [];
64+
65+
if (selectedTypeOfTask === 'common') {
66+
// Group filtered tasks by source
67+
optionsMap = filteredTasks.reduce((dataOptions, task) => {
68+
const source = task.source.split(':')[1]; // Package name
69+
const sourceIndex = dataOptions.findIndex(d => d.label === source);
70+
if (sourceIndex === -1) {
71+
dataOptions.push({ label: source, options: [{ text: task.name, value: task.name }] });
72+
} else {
73+
// If task name already exists in options, don't add it again
74+
if (!dataOptions[sourceIndex].options.find(o => o.text === task.name))
75+
dataOptions[sourceIndex].options.push({ text: task.name, value: task.name });
76+
}
77+
return dataOptions;
78+
}, []);
79+
}
80+
81+
if (selectedTypeOfTask === 'user') {
82+
optionsMap = filteredTasks.reduce((dataOptions, task) => {
83+
const source = task.owner;
84+
const sourceIndex = dataOptions.findIndex(d => d.label === source);
85+
if (sourceIndex === -1) {
86+
dataOptions.push({ label: source, options: [{ text: task.name, value: task.name }] });
87+
} else {
88+
// If task name already exists in options, don't add it again
89+
if (!dataOptions[sourceIndex].options.find(o => o.text === task.name))
90+
dataOptions[sourceIndex].options.push({ text: task.name, value: task.name });
91+
}
92+
return dataOptions;
93+
}, []);
94+
}
95+
96+
optionsMap = [{ text: 'Task selection', placeholder: true }, ...optionsMap];
97+
selectionControl?.setData(optionsMap);
4498
}
4599
46-
function handleSelectedTaskKey(event) {
47-
selectedMapKey = event.target.value;
48-
selectedMapTaskVersions = selectionTasks.get(selectedMapKey);
49-
selectedMapTaskVersions.sort(greatestVersionDesc);
100+
function setSelectedGroup(group) {
101+
selectedTypeOfTask = group;
50102
}
51103
52104
$: setSelectionTasks(selectedTypeOfTask, tasks);
@@ -73,11 +125,7 @@
73125
<div class='card-body'>
74126
<label for='taskId' class='form-label'>Select task</label>
75127
{#if selectedTypeOfTask }
76-
<select on:change={handleSelectedTaskKey} class='form-select' bind:value={selectedMapKey}>
77-
<option selected value={null}>Select available task</option>
78-
{#each selectionTasksNames as taskName}
79-
<option value={taskName}>{taskName}</option>
80-
{/each}
128+
<select id='advanced-select' class='' bind:value={selectedMapKey}>
81129
</select>
82130
{/if}
83131
<br>

static/slimselect.css

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)