You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.2 KiB

  1. <script lang="ts">
  2. import type Project from "../models/project";
  3. import projectStore from "../stores/project";
  4. interface OptGroup {
  5. status: string
  6. projects: Project[]
  7. }
  8. export let value = "";
  9. export let name = "";
  10. export let disabled = false;
  11. export let optional = false;
  12. let optGroups: OptGroup[]
  13. $: {
  14. optGroups = [
  15. {
  16. status: "Deadlines",
  17. projects: $projectStore.projects.filter(p => p.active && p.endTime)
  18. },
  19. {
  20. status: "Active",
  21. projects: $projectStore.projects.filter(p => p.active && !p.endTime)
  22. },
  23. {
  24. status: "To Do",
  25. projects: $projectStore.projects.filter(p => !p.active && p.statusTag === "to do")
  26. },
  27. {
  28. status: "On Hold",
  29. projects: $projectStore.projects.filter(p => !p.active && p.statusTag === "on hold")
  30. },
  31. {
  32. status: "Completed",
  33. projects: $projectStore.projects.filter(p => !p.active && p.statusTag === "completed")
  34. },
  35. {
  36. status: "Background",
  37. projects: $projectStore.projects.filter(p => !p.active && p.statusTag === "background")
  38. },
  39. {
  40. status: "Progress",
  41. projects: $projectStore.projects.filter(p => !p.active && p.statusTag === "progress")
  42. },
  43. {
  44. status: "Failed",
  45. projects: $projectStore.projects.filter(p => !p.active && p.statusTag === "failed")
  46. },
  47. ]
  48. for (const group of optGroups) {
  49. group.projects.sort((a,b) => a.name.localeCompare(b.name));
  50. }
  51. }
  52. $: {
  53. if (optGroups.length > 0 && value === "" && !optional) {
  54. const nonEmpty = optGroups.find(g => g.projects.length > 0);
  55. if (nonEmpty != null) {
  56. value = nonEmpty.projects[0].id;
  57. }
  58. }
  59. }
  60. </script>
  61. <select name={name} bind:value={value} disabled={disabled || $projectStore.loading}>
  62. {#if optional}
  63. <option value={""} selected={"" === value}>None</option>
  64. {/if}
  65. {#each optGroups as group (group.status)}
  66. {#if group.projects.length > 0}
  67. <optgroup label={group.status}>
  68. {#each group.projects as project (project.id)}
  69. <option value={project.id} selected={project.id === value}>{project.name}</option>
  70. {/each}
  71. </optgroup>
  72. {/if}
  73. {/each}
  74. </select>