Plan stuff. Log stuff.
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.
 
 
 
 
 

168 lines
5.1 KiB

<script context="module">
const UNKNOWN = (Object.freeze||(o => o))({
name: "(Unknown)",
subGoals: [],
subActivities: [],
});
</script>
<script>
import { get } from "svelte/store";
import pluralize from "pluralize";
import Boi from "../components/Boi.svelte";
import AddBoi from "../components/AddBoi.svelte";
import Property from "../components/Property.svelte";
import Row from "../components/Row.svelte";
import Col from "../components/Col.svelte";
import Link from "../components/Link.svelte";
import ActivityIcon from "../components/ActivityIcon.svelte";
import PointsBar from "../components/PointsBar.svelte";
import stufflog from "../stores/stufflog";
import modal from "../stores/modal";
import dateStr from "../utils/dateStr";
let activityMap = {};
let scores = {};
function openGoalModal(modalName, id, goalId, subGoalId) {
const period = get(stufflog).periods.find(a => a.id === id);
const goal = period ? period.goals.find(g => g.id === goalId) : null;
const subGoal = goal ? goal.subGoals.find(s => s.id === subGoalId) : null;
const activity = goal ? get(stufflog).activities.find(a => a.id === goal.activityId) : null
modal.open(modalName, {period, goal, subGoal, activity})
}
function openLogModal(modalName, id, logId) {
const period = get(stufflog).periods.find(a => a.id === id);
const row = period ? period.table.find(r => r.log.id === logId) : {};
modal.open(modalName, {period, ...row})
}
$: activityMap = $stufflog.activities.reduce((p, v) => ({...p, [v.id]: v}), {});
</script>
<div class="page">
{#each $stufflog.periods as period (period.id)}
<Boi header={period.name}>
<Row>
<Col size=3><Property label="From" value={dateStr(period.from)} /></Col>
<Col size=3><Property label="To" value={dateStr(period.to)} /></Col>
<Col size=6>
<Property label="Options">
<Link on:click={() => openGoalModal("period.edit", period.id)}>Edit Period</Link>,
<Link on:click={() => openGoalModal("periodgoal.add", period.id)}>Add Goal</Link>,
{#if period.goals.length > 0}
<Link on:click={() => openGoalModal("periodlog.add", period.id)}>Add Log</Link>,
{/if}
<Link on:click={() => openGoalModal("period.delete", period.id)}>Delete Period</Link>
</Property>
</Col>
</Row>
<table>
<tr>
<th class="th-name">Activity</th>
<th class="th-points">Points</th>
<th class="th-options">Options</th>
</tr>
{#each period.goals as goal (goal.id)}
<tr>
<td>
<div class="icon"><ActivityIcon name={(activityMap[goal.activityId] || {name: "(Unknown)"}).icon} /></div>
<div class="name">{(activityMap[goal.activityId] || {name: "(Unknown)"}).name}</div>
</td>
<td><PointsBar value={period.scores[goal.id]} goal={goal.pointCount} /></td>
<td class="td-options">
<Link on:click={() => openGoalModal("periodgoal.remove", period.id, goal.id)}>Delete</Link>
</td>
</tr>
{/each}
</table>
<table>
<tr>
<th class="th-date">Date</th>
<th class="th-log">Goal</th>
<th class="th-log">Sub-Activity</th>
<th class="th-points2">Amount</th>
<th class="th-points2">Points</th>
<th class="th-options">Options</th>
</tr>
{#each period.table as row (row.log.id)}
<tr>
<td>{dateStr(row.log.date)}</td>
<td class:dark={row.activity.name.startsWith("(")}>
<div class="icon"><ActivityIcon name={row.activity.icon} /></div>
<div class="name">{row.activity.name} {row.subActivity.name}</div>
</td>
<td class:dark={row.subGoal.name.startsWith("(")}>{row.subGoal.name}</td>
<td>{row.log.amount} {pluralize(row.subActivity.unitName, row.log.amount)}</td>
<td>
<Link on:click={() => openLogModal("periodlog.info", period.id, row.log.id)}>{row.log.score.total}</Link>
</td>
<td class="td-options">
<Link on:click={() => openLogModal("periodlog.remove", period.id, row.log.id)}>Delete</Link>
</td>
</tr>
{/each}
</table>
</Boi>
{/each}
<AddBoi on:click={() => modal.open("period.create")}>Period</AddBoi>
</div>
<style>
div.page {
width: 100ch;
max-width: 90%;
margin: auto;
}
table {
width: 100%;
padding: 0.5em 0;
}
table th, table td {
padding: 0em 1ch;
}
table th {
text-align: left;
font-size: 0.75em;
}
table th.th-name {
width: 25%;
}
table th.th-date {
width: 25%;
}
table th.th-points {
width: 62.5%;
}
table th.th-options, table td.td-options {
width: 12.5%;
text-align: right;
}
table th.th-log {
width: calc(37.5%/2);
}
table th.th-points2 {
width: 12.5%;
}
table td.dark {
color: #666;
}
table td div.icon {
position: relative;
top: 0.175em;
display: inline-block;
}
table td div.name {
display: inline-block;
}
</style>