64 lines
1.8 KiB
Markdown
64 lines
1.8 KiB
Markdown
<%*
|
|
// iterdef: defines a planning iteration with sequence id, status, start/end and optional goal.
|
|
const componentName = "iterdef";
|
|
const newId = tp.user.auto_increment("iterdef_id");
|
|
const today = tp.date.now("YYYY-MM-DD");
|
|
const file = tp.file.find_tfile(tp.file.path(true));
|
|
|
|
setTimeout(async () => {
|
|
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
|
|
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
|
|
if (!components.includes(componentName)) components.push(componentName);
|
|
|
|
frontmatter["components"] = components;
|
|
frontmatter["iterdef_id"] = frontmatter["iterdef_id"] ?? newId;
|
|
frontmatter["iterdef_status"] = frontmatter["iterdef_status"] ?? "planned";
|
|
frontmatter["iterdef_start"] = frontmatter["iterdef_start"] ?? today;
|
|
frontmatter["iterdef_end"] = frontmatter["iterdef_end"] ?? today;
|
|
frontmatter["iterdef_goal"] = frontmatter["iterdef_goal"] ?? "";
|
|
frontmatter["iterdef_capacity_minutes"] = frontmatter["iterdef_capacity_minutes"] ?? 0;
|
|
frontmatter["cssclasses"] = frontmatter["cssclasses"] ?? "wide-page";
|
|
});
|
|
}, 300)
|
|
-%>
|
|
|
|
## Goal
|
|
|
|
|
|
## Workspace
|
|
```base
|
|
filters:
|
|
and:
|
|
- file.hasLink(this.file.path)
|
|
formulas:
|
|
Aufwand (ET: action_effort_minutes / 60 / 8
|
|
properties:
|
|
formula.Aufwand (ET:
|
|
displayName: Aufwand (ET)
|
|
views:
|
|
- type: table
|
|
name: Table
|
|
order:
|
|
- file.name
|
|
- action_status
|
|
- formula.Aufwand (ET
|
|
- action_impact
|
|
- action_effort_minutes
|
|
sort:
|
|
- property: action_status
|
|
direction: ASC
|
|
|
|
```
|
|
|
|
## Bound Work
|
|
```dataview
|
|
TABLE
|
|
action_status as "Action",
|
|
work_status as "Work",
|
|
round(action_effort_minutes / 60 / 8, 1) as "Aufwand (ET)",
|
|
action_impact as "Impact"
|
|
FROM ""
|
|
WHERE iterbind_target = this.file.link
|
|
SORT action_impact DESC, action_effort_minutes ASC
|
|
```
|