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.

89 lines
2.2 KiB

  1. <script lang="ts">
  2. import type { GoalCompositionMode } from "../models/goal";
  3. import type { LogResult } from "../models/log";
  4. interface CompositionItem {
  5. link: string
  6. amount: number
  7. name: string
  8. }
  9. export let logs: LogResult[] = [];
  10. export let mode: GoalCompositionMode = "item";
  11. export let ignoreZeroWeight: boolean = false;
  12. let list: CompositionItem[] = [];
  13. $: {
  14. const map: {[k: string]: CompositionItem} = {}
  15. if (mode === "item") {
  16. for (const log of logs) {
  17. if (log.itemCounted !== false) {
  18. const item = log.item;
  19. if (!ignoreZeroWeight || item.groupWeight > 0) {
  20. if (!map[item.id]) {
  21. map[item.id] = {name: item.name, amount: log.itemAmount, link: `/items#${item.id}`};
  22. } else {
  23. map[item.id].amount += log.itemAmount;
  24. }
  25. }
  26. }
  27. if (log.secondaryItem && log.secondaryItemCounted !== false) {
  28. const item = log.secondaryItem;
  29. if (!ignoreZeroWeight || item.groupWeight > 0) {
  30. if (!map[item.id]) {
  31. map[item.id] = {name: item.name, amount: log.secondaryItemAmount, link: `/items#${item.id}`};
  32. } else {
  33. map[item.id].amount += log.secondaryItemAmount;
  34. }
  35. }
  36. }
  37. }
  38. } else {
  39. for (const log of logs) {
  40. const task = log.task;
  41. const amount = log.secondaryItem ? log.secondaryItemAmount + log.itemAmount : log.itemAmount;
  42. if (!map[task.id]) {
  43. map[task.id] = {name: task.name, amount, link: `/questlog#${task.projectId}`};
  44. } else {
  45. map[task.id].amount += amount;
  46. }
  47. }
  48. }
  49. list = Object.keys(map).sort((a, b) => map[b].amount - map[a].amount).map(k => map[k]).filter(e => e.amount > 0);
  50. }
  51. </script>
  52. <div class="composition">
  53. {#each list as item (item.name)}
  54. <div class="item">
  55. <span class="amount">{item.amount}x&nbsp;</span>
  56. <a href={item.link}>{item.name}</a>
  57. </div>
  58. {/each}
  59. </div>
  60. <style>
  61. div.composition {
  62. padding: 0.25em 0ch;
  63. color: #555;
  64. font-size: 0.75em;
  65. }
  66. div.item {
  67. padding: 0.125em 0.5ch;
  68. display: inline-block;
  69. }
  70. span.amount {
  71. color: #777;
  72. }
  73. a {
  74. color: inherit;
  75. }
  76. </style>