aboutsummaryrefslogtreecommitdiffstats
path: root/apps/projects/src/app/pages/views/entry-form/sections/labels.svelte
blob: f0853ccfc2eb17ec5eab141e4c9ba469539b477f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<script>
	import {generate_random_hex_color} from "$shared/lib/colors";
	import labels, {reload_labels, create_label_async} from "$app/lib/stores/labels";
	import Dropdown from "$shared/components/dropdown.svelte";

	let labelsError = "";
	let loading = false;
	let DropdownExports;

	function reset() {
		DropdownExports.reset();
		console.log("Reset labels-part");
	}

	function get_selected() {
		return $labels.filter((c) => Object.hasOwn(c, "selected") && c.selected === true);
	}

	function select_label(id) {
		DropdownExports.select(id);
	}

	function select_labels(ids) {
		for (const id of ids) {
			DropdownExports.select(id);
		}
	}

	async function on_create({name}) {
		loading = true;
		const response = await create_label_async({
			name: name,
			color: generate_random_hex_color(),
		});
		loading = false;
		if (response.ok) {
			// Small pause to allow loading state to update everywhere.
			setTimeout(() => select_label(response.data.id), 50);
		}
	}

	export const functions = {
		get_selected,
		reset,
		load_labels: reload_labels,
		select_labels,
		select_label,
	};
</script>

<Dropdown
        entries={$labels}
        label="Labels"
        maxlength="50"
        createable={true}
        placeholder="Search or create"
        multiple="{true}"
        id="labels-search"
        name="labels-search"
        on_create_async={on_create}
        noResultsText="No labels available (Create a new one by searching for it)"
        errorText="{labelsError}"
        bind:this={DropdownExports}
        {loading}
/>