|
|
@ -45,15 +45,20 @@ |
|
|
|
let groups: PartOptionGroup[] = []; |
|
|
|
let showRequired = false; |
|
|
|
let loading = false; |
|
|
|
let onlyActive = true; |
|
|
|
let loaded: SprintKind = SprintKind.Invalid |
|
|
|
|
|
|
|
function forceReload() { |
|
|
|
loaded = SprintKind.Invalid; |
|
|
|
} |
|
|
|
|
|
|
|
async function load(kind: SprintKind) { |
|
|
|
loading = true; |
|
|
|
|
|
|
|
try { |
|
|
|
switch (kind) { |
|
|
|
case SprintKind.Items: { |
|
|
|
const items = await sl3(fetch).listItems($scope.id, {}); |
|
|
|
const items = await sl3(fetch).listItems($scope.id, {unAcquired: onlyActive}); |
|
|
|
const projects = items.filter(i => i.project != null).map(i => i.project).sort(compareStatus).filter((p, i, a) => p.id != a[i-1]?.id); |
|
|
|
const requirements = items.filter(i => i.requirement != null).map(i => i.requirement).sort(compareStatus).filter((r, i, a) => r.id != a[i-1]?.id); |
|
|
|
const loose = items.filter(i => i.requirementId == null); |
|
|
@ -62,17 +67,17 @@ |
|
|
|
[c.requirementId]: c.projectId, |
|
|
|
}), {} as Record<number, string>) |
|
|
|
|
|
|
|
groups = projects.map(p => ({ |
|
|
|
groups = projects.filter(p => !onlyActive || p.status === Status.Active || p.status === Status.Background).map(p => ({ |
|
|
|
id: p.id, |
|
|
|
label: `${p.name} (${p.statusName})`, |
|
|
|
options: [], |
|
|
|
subs: requirements.filter(r => reqProjectIdMap[r.id] === p.id).map(r => ({ |
|
|
|
subs: requirements.filter(r => !onlyActive || r.status === Status.Active || r.status === Status.Background).filter(r => reqProjectIdMap[r.id] === p.id).map(r => ({ |
|
|
|
id: r.id, |
|
|
|
label: `${r.name} (${r.statusName})`, |
|
|
|
options: items.filter(i => i.requirementId === r.id).map(i => ({ |
|
|
|
enabled: false, |
|
|
|
partId: i.id, |
|
|
|
name: `${i.name} (${shortestDecimal(i.weightedRequired)})`, |
|
|
|
name: `${i.name} (${shortestDecimal(i.weightedRequired)})${!!i.acquiredTime?" ✓":""}`, |
|
|
|
required: 0, |
|
|
|
})).sort((a,b) => a.partId - b.partId), |
|
|
|
subs: [], |
|
|
@ -81,7 +86,7 @@ |
|
|
|
groups.push({id: -1, label: "Loose items", subs: [], options: loose.map(i => ({ |
|
|
|
enabled: false, |
|
|
|
partId: i.id, |
|
|
|
name: `${i.name} (${shortestDecimal(i.weightedRequired)})`, |
|
|
|
name: `${i.name} (${shortestDecimal(i.weightedRequired)})${!!i.acquiredTime?" ✓":""}`, |
|
|
|
required: 0, |
|
|
|
})).sort((a,b) => a.partId - b.partId)}) |
|
|
|
|
|
|
@ -137,6 +142,11 @@ |
|
|
|
loading = false; |
|
|
|
} |
|
|
|
|
|
|
|
// Hax to make it reload if onlyActive changed. |
|
|
|
$: if (onlyActive != null) { |
|
|
|
forceReload(); |
|
|
|
} |
|
|
|
|
|
|
|
$: if (loaded === kind && error === "") { |
|
|
|
value = groups.flatMap(g => [...g.subs.flatMap(g => g.options), ...g.options]).filter(o => o.enabled).map(o => ({partId: o.partId, required: o.required})) |
|
|
|
} |
|
|
@ -172,6 +182,10 @@ |
|
|
|
</div> |
|
|
|
{/each} |
|
|
|
{/each} |
|
|
|
{#if kind === SprintKind.Items} |
|
|
|
<hr /> |
|
|
|
<Checkbox label="Show only active items" bind:checked={onlyActive} /> |
|
|
|
{/if} |
|
|
|
</div> |
|
|
|
|
|
|
|
<style lang="scss"> |
|
|
@ -208,6 +222,12 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
hr { |
|
|
|
margin-top: 2em; |
|
|
|
border: 0; |
|
|
|
border-bottom: 1px solid $color-entry2; |
|
|
|
} |
|
|
|
|
|
|
|
div.label { |
|
|
|
margin-top: 0.5em; |
|
|
|
border-bottom: 1px solid $color-entry2; |
|
|
|