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.

113 lines
3.2 KiB

  1. <script lang="ts">
  2. import { tick } from "svelte";
  3. import { navigate } from "svelte-routing";
  4. import type { ProjectGroupResult } from "../models/projectgroup";
  5. import modalStore from "../stores/modal";
  6. import projectGroupStore from "../stores/projectGroup";
  7. import { sortProjects } from "../utils/sorters";
  8. import ColoredNumber from "./ColoredNumber.svelte";
  9. export let groups: ProjectGroupResult[] = [];
  10. export let selected: string;
  11. function onClickAdd() {
  12. modalStore.set({name: "projectgroup.add"});
  13. }
  14. function onNavigate(group: ProjectGroupResult) {
  15. if (group.projects.length === 0) {
  16. navigate(`/questlog/${group.id}`);
  17. } else {
  18. const preferredId = localStorage.getItem(`sl2.projectgroup.${group.id}.last_project_id`);
  19. const projects = [...group.projects].sort(sortProjects);
  20. const project = projects.find(p => p.id === preferredId) || projects[0];
  21. navigate(`/questlog/${group.id}/${project.id}`);
  22. // There's some weirdness with navigate. This hack will just do a
  23. // groups = [...groups] in the sttore to get the page to update.
  24. //
  25. // Edit: It doesn't seem to be needed anymore? Idk why, but I'll keep this in just in case.
  26. tick().then(() => {
  27. projectGroupStore.fakeRefresh();
  28. })
  29. }
  30. }
  31. </script>
  32. <div class="group-menu">
  33. {#each groups as group (group.id)}
  34. <div class="group-entry" on:click={() => onNavigate(group)} class:selected={selected === group.id}>
  35. <div class="name">{group.abbreviation}</div>
  36. <div class="counts">
  37. <ColoredNumber selected={selected === group.id} status="active" number={group.projectCounts["active"]} />
  38. <ColoredNumber selected={selected === group.id} status="background" number={group.projectCounts["background"]} />
  39. <ColoredNumber selected={selected === group.id} status="progress" number={group.projectCounts["progress"]} />
  40. <ColoredNumber selected={selected === group.id} status="to do" number={group.projectCounts["to do"]} />
  41. <ColoredNumber selected={selected === group.id} status="on hold" number={group.projectCounts["on hold"]} />
  42. </div>
  43. </div>
  44. {/each}
  45. <div class="group-entry add" on:click={onClickAdd}>
  46. <div>+</div>
  47. </div>
  48. </div>
  49. <style>
  50. div.group-menu {
  51. display: flex;
  52. flex-direction: row;
  53. padding: 0 2ch;
  54. border-bottom: 1px solid #333;
  55. margin-bottom: 0.5em;
  56. -webkit-user-select: none;
  57. -moz-user-select: none;
  58. }
  59. div.group-entry {
  60. padding: 0.05em 1ch;
  61. padding-bottom: 0.15em;
  62. margin-right: 2ch;
  63. border: 1px solid #333;
  64. border-bottom: none;
  65. border-top-left-radius: 0.5em;
  66. border-top-right-radius: 0.5em;
  67. cursor: pointer;
  68. color: #777;
  69. font-weight: 300;
  70. }
  71. div.group-entry.add {
  72. color: #333;
  73. }
  74. div.group-entry.add > div {
  75. font-size: 2em;
  76. line-height: 1em;
  77. }
  78. div.group-entry.selected {
  79. background-color: #191919;
  80. color: #AAA;
  81. }
  82. div.group-entry:hover {
  83. color: #CCC;
  84. background-color: #222222;
  85. }
  86. div.name {
  87. text-align: center;
  88. padding: 0em 0.4ch;
  89. }
  90. div.counts {
  91. font-size: 0.666em;
  92. font-weight: 400;
  93. text-align: center;
  94. }
  95. div.counts :global(div) {
  96. display: inline-block;
  97. padding: 0em 0.2ch;
  98. }
  99. </style>