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.

162 lines
3.5 KiB

4 years ago
4 years ago
  1. <script lang="ts">
  2. import type { IconName, iconNames } from "../external/icons";
  3. import { formatTime } from "../utils/time";
  4. import DaysLeft from "./DaysLeft.svelte";
  5. import Icon from "./Icon.svelte";
  6. import LinkHook from "./LinkHook.svelte";
  7. import Markdown from "./Markdown.svelte";
  8. interface ActualParent {
  9. id: string
  10. name: string
  11. }
  12. interface EntryCommon {
  13. id: string
  14. name?: string
  15. description: string
  16. icon?: IconName
  17. startTime?: string
  18. endTime?: string
  19. createdTime?: string
  20. loggedTime?: string
  21. active?: boolean
  22. completedAmount?: number
  23. itemAmount?: number
  24. task?: EntryCommonSub
  25. }
  26. interface EntryCommonSub {
  27. name: string
  28. icon: IconName
  29. }
  30. export let entry: EntryCommon = null;
  31. export let actualParent: ActualParent = null;
  32. export let hideParentName: boolean = false;
  33. let iconName: IconName;
  34. let displayName: string;
  35. let displayTime: string;
  36. $: iconName = entry.task?.icon || entry.icon;
  37. $: displayName = entry.name || entry.task?.name || "";
  38. $: displayTime = entry.loggedTime ? formatTime(entry.loggedTime) : "";
  39. </script>
  40. <div class="child-entry">
  41. <LinkHook id={entry.id} />
  42. <div class="body">
  43. <div class="header">
  44. <slot name="icon">
  45. <div class="icon">
  46. <Icon name={iconName} />
  47. </div>
  48. </slot>
  49. {#if (actualParent != null)}
  50. {#if !hideParentName}
  51. <div class="actual-parent-icon">
  52. <Icon block name="link" />
  53. </div>
  54. <div class="actual-parent">
  55. <a href={`/questlog#${actualParent.id}`}>{actualParent.name}</a>
  56. </div>
  57. {/if}
  58. {/if}
  59. <div class="name">{displayName}</div>
  60. <div class="separator"></div>
  61. {#if (entry.endTime != null)}
  62. <div class="times">
  63. <DaysLeft startTime={entry.startTime || entry.createdTime} endTime={entry.endTime} />
  64. </div>
  65. {/if}
  66. {#if (displayTime != null)}
  67. <div class="times">
  68. {displayTime}
  69. </div>
  70. {/if}
  71. </div>
  72. <div class="entry-body">
  73. <Markdown source={entry.description} />
  74. <slot></slot>
  75. </div>
  76. </div>
  77. </div>
  78. <style>
  79. div.child-entry {
  80. display: flex;
  81. flex-direction: row;
  82. margin: 0.25em 0 0.75em 0;
  83. }
  84. div.icon, div.child-entry div.header :global(div.icon-like) {
  85. display: flex;
  86. flex-direction: column;
  87. font-size: 1em;
  88. padding: 0.2em .5ch;
  89. margin-right: 0.5em;
  90. background: #444;
  91. color: #CCC;
  92. }
  93. div.body {
  94. display: flex;
  95. flex-direction: column;
  96. width: 100%;
  97. }
  98. div.header {
  99. display: flex;
  100. flex-direction: row;
  101. background: #333;
  102. }
  103. div.actual-parent-icon {
  104. display: flex;
  105. flex-direction: column;
  106. font-size: 1em;
  107. padding: 0.3em 0;
  108. padding-bottom: 0.1em;
  109. margin-right: 0.5em;
  110. color: #555;
  111. }
  112. div.actual-parent {
  113. font-size: 1em;
  114. font-weight: 100;
  115. margin: auto 0;
  116. vertical-align: middle;
  117. padding: 0.125em 0;
  118. padding-right: 1ch;
  119. display: flex;
  120. flex-direction: row;
  121. }
  122. div.actual-parent :global(div.icon) {
  123. display: none !important;
  124. }
  125. div.name {
  126. font-size: 1em;
  127. font-weight: 100;
  128. margin: auto 0;
  129. vertical-align: middle;
  130. padding: 0.125em .5ch;
  131. }
  132. div.times {
  133. margin-right: 0.25ch;
  134. padding: 0.125em 0;
  135. }
  136. div.separator {
  137. margin-left: auto;
  138. }
  139. div.entry-body {
  140. padding: 0.25em 1ch;
  141. background: #222;
  142. color: #aaa;
  143. border-bottom-right-radius: 0.5em;
  144. }
  145. </style>