Gisle Aune
3 years ago
8 changed files with 237 additions and 23 deletions
-
2api/task.go
-
5models/log.go
-
2models/task.go
-
114services/loader.go
-
108svelte-ui/src/components/ItemProgress.svelte
-
3svelte-ui/src/components/ProjectEntry.svelte
-
4svelte-ui/src/models/log.ts
-
4svelte-ui/src/models/task.ts
@ -0,0 +1,108 @@ |
|||||
|
<script lang="ts"> |
||||
|
import type Item from "../models/item"; |
||||
|
import type { ProjectResult } from "../models/project"; |
||||
|
import Icon from "./Icon.svelte"; |
||||
|
|
||||
|
interface ListEntry { |
||||
|
item: Item |
||||
|
amount: number |
||||
|
target: number |
||||
|
extras: number |
||||
|
} |
||||
|
|
||||
|
export let project: ProjectResult; |
||||
|
|
||||
|
let list: ListEntry[] = []; |
||||
|
|
||||
|
$: { |
||||
|
list = []; |
||||
|
for (const task of project.tasks) { |
||||
|
let entry = list.find(e => e.item.id === task.item.id); |
||||
|
if (entry == null) { |
||||
|
entry = {item: task.item, amount: 0, target: 0, extras: 0}; |
||||
|
list.push(entry); |
||||
|
} |
||||
|
|
||||
|
if (task.completedAmount > task.itemAmount) { |
||||
|
entry.extras += task.completedAmount - task.itemAmount; |
||||
|
entry.amount += task.itemAmount; |
||||
|
} else { |
||||
|
entry.amount += task.completedAmount; |
||||
|
} |
||||
|
entry.target += task.itemAmount; |
||||
|
|
||||
|
for (const log of task.logs) { |
||||
|
if (log.secondaryItem != null) { |
||||
|
let entry = list.find(e => e.item.id === log.secondaryItemId); |
||||
|
if (entry == null) { |
||||
|
entry = {item: log.secondaryItem, amount: 0, target: 0, extras: 0}; |
||||
|
list.push(entry); |
||||
|
} |
||||
|
|
||||
|
entry.extras += log.secondaryItemAmount; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
list.sort((a,b) => { |
||||
|
if (a.target === b.target) { |
||||
|
return a.item.name.localeCompare(b.item.name); |
||||
|
} else { |
||||
|
return b.target - a.target; |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<div class="ItemProgress"> |
||||
|
{#each list as entry (entry.item.id)} |
||||
|
<div class="entry"> |
||||
|
<div class="icon"> |
||||
|
<Icon name={entry.item.icon} /> |
||||
|
</div> |
||||
|
<div class="name"> |
||||
|
{entry.item.name} |
||||
|
</div> |
||||
|
{#if entry.target !== 0} |
||||
|
<div class="amount"> |
||||
|
<span>{entry.amount}</span> |
||||
|
<span> / </span> |
||||
|
<span>{entry.target}</span> |
||||
|
{#if entry.extras > 0} |
||||
|
<span class="extras">+ {entry.extras}</span> |
||||
|
{/if} |
||||
|
</div> |
||||
|
|
||||
|
{:else} |
||||
|
<div class="extras"> |
||||
|
×{entry.extras} |
||||
|
</div> |
||||
|
{/if} |
||||
|
</div> |
||||
|
{/each} |
||||
|
</div> |
||||
|
|
||||
|
<style> |
||||
|
div.ItemProgress { |
||||
|
display: inline-block; |
||||
|
padding: 0.25em; |
||||
|
font-size: 0.8em; |
||||
|
} |
||||
|
div.ItemProgress div.entry { |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
color: #777; |
||||
|
} |
||||
|
div.ItemProgress div.entry div { |
||||
|
padding: 0.1em 0.25em; |
||||
|
} |
||||
|
div.ItemProgress div.entry .name { |
||||
|
color: #555; |
||||
|
} |
||||
|
div.ItemProgress div.entry .icon { |
||||
|
padding: 0.20em; |
||||
|
} |
||||
|
div.ItemProgress div.entry .extras { |
||||
|
color: #484; |
||||
|
} |
||||
|
</style> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue