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.

103 lines
3.5 KiB

  1. <script lang="ts" context="module">
  2. let lastQuest = "";
  3. </script>
  4. <script lang="ts">
  5. import type { ProjectResult } from "../models/project";
  6. import selectionStore from "../stores/selection";
  7. import ProjectEntry from "./ProjectEntry.svelte";
  8. import QlList from "./QLList.svelte";
  9. import Boi from "../components/Boi.svelte";
  10. import type { ModalData } from "../stores/modal";
  11. export let projects: ProjectResult[];
  12. const mdProjectAdd: ModalData = {name: "project.add"};
  13. let expiringProjects: ProjectResult[];
  14. let activeProjects: ProjectResult[];
  15. let inactiveProjects: ProjectResult[];
  16. let completedProjects: ProjectResult[];
  17. let failedProjects: ProjectResult[];
  18. let onholdProjects: ProjectResult[];
  19. let ideaProjects: ProjectResult[];
  20. let project: ProjectResult = null;
  21. function sortProjects(a: ProjectResult, b: ProjectResult) {
  22. const aName = `${a.tags.slice(0, 1).map(t => t+":").join("")} ${a.name}`.trim();
  23. const bName = `${b.tags.slice(0, 1).map(t => t+":").join("")} ${b.name}`.trim();
  24. console.log(aName, bName)
  25. return aName.localeCompare(bName);
  26. }
  27. $: project = $selectionStore.hash.startsWith("P") ? projects.find(p => p.id === $selectionStore.hash) : null;
  28. $: expiringProjects = projects.filter(p => p.active && p.endTime).sort((a,b) => Date.parse(a.endTime) - Date.parse(b.endTime));
  29. $: activeProjects = projects.filter(p => p.active && !p.endTime).sort(sortProjects);
  30. $: inactiveProjects = projects.filter(p => !p.active).sort(sortProjects);
  31. $: completedProjects = inactiveProjects.filter(p => p.statusTag === "completed" || p.statusTag == null);
  32. $: failedProjects = inactiveProjects.filter(p => p.statusTag === "failed" || p.statusTag === "declined");
  33. $: onholdProjects = inactiveProjects.filter(p => p.statusTag === "on hold" || p.statusTag === "onhold").sort(sortProjects);
  34. $: ideaProjects = inactiveProjects.filter(p => p.statusTag === "to do" || p.statusTag === "idea").sort(sortProjects);
  35. $: backgroundProjects = inactiveProjects.filter(p => p.statusTag === "background").sort(sortProjects);
  36. $: progressProjects = inactiveProjects.filter(p => p.statusTag === "progress").sort(sortProjects);
  37. $: {
  38. if (project === null && projects.length > 0) {
  39. if (lastQuest !== "") {
  40. project = projects.find(p => p.id === lastQuest) || null;
  41. }
  42. if (project === null) {
  43. project = expiringProjects[0] || activeProjects[0] || completedProjects[0] || null;
  44. }
  45. if (project !== null) {
  46. selectionStore.change("hash", project.id);
  47. }
  48. }
  49. }
  50. $: {
  51. if ($selectionStore.hash.startsWith("P")) {
  52. lastQuest = $selectionStore.hash;
  53. }
  54. }
  55. </script>
  56. <div class="quest-log">
  57. <div class="list">
  58. <Boi compacter open={mdProjectAdd}>Add Project</Boi>
  59. <QlList label="Deadlines" projects={expiringProjects} />
  60. <QlList label="Active" projects={activeProjects} />
  61. <QlList label="Background" projects={backgroundProjects} />
  62. <QlList label="Progress" projects={progressProjects} />
  63. <QlList label="To Do" projects={ideaProjects} />
  64. <QlList label="On Hold" projects={onholdProjects} />
  65. <QlList label="Completed" projects={completedProjects} />
  66. <QlList label="Failed" projects={failedProjects} />
  67. </div>
  68. <div class="body">
  69. {#if project != null}
  70. <ProjectEntry removeHook hideIcon project={project} showAllOptions />
  71. {/if}
  72. </div>
  73. </div>
  74. <style>
  75. div.quest-log {
  76. display: flex;
  77. flex-direction: row;
  78. }
  79. div.list {
  80. flex-shrink: 0;
  81. width: 32ch;
  82. }
  83. div.body {
  84. flex-grow: 1;
  85. margin: 1em 1ch;
  86. }
  87. </style>