```jsx const {fandoms: fandomIcons, categories: categoryIcons} = await dc.require("root/views/cat-icons.md#category icons") const PRE_REGEX = /^\d+\s-\s/m; const tprogress = (t) => { if(t.$completed) return 1; let completed = t.$elements.filter(x => x.$completed).length; let total = Math.max(t.$elements.length, 1); let a = 0; t.$elements.forEach(e => { a += tprogress(e) / total; }) return a; } const usePath = (path) => dc.useQuery(`childof (@block-list) and $parentLine < 0 and @task and path("${path}") and !#folder-note and !contains($file, "uni")`) function TaskTable({rows}) { //const uniq = dc.useMemo(() => q.map(x => x.$parent).filter((b, i, a) => i === a.findIndex(y => y.$file === b.$file)), [q]); /*const groups = dc.useMemo(() => uniq .map((p) => ({key: p, rows: q.filter(b => b.$parent.$id === p.$id)})) .sort((a, b) => { let aa = a.key.$file.split("/").toReversed()[0]; let bb = b.key.$file.split("/").toReversed()[0]; return aa > bb ? 1 : aa < bb ? -1 : 0; }), [uniq, q]);*/ return dc.useMemo(() => { const tprops = { groupings: [ { render: (k, r) => { let kk = k.$file.split("/"); let block = kk.pop(); let name = kk[kk.length - 1]; name = name.substr(0, name.lastIndexOf(".")); let link = k.$parent.$link.withDisplay(k.$parent.$title) return (

) } } ], rows, columns: [ { id: "one", title: "task", value: (x) => x, render: (v, o) => { return }, width: "maximum" }, { id: "progress", title: "% done", value: (x) => x, render: (v, o) => , width: "minimum" } ], paging: 7 } return }, [rows]) } function Fandom({projects, name, path}) { let realName = name.replace(PRE_REGEX, "") let lastSegment = path.split("/").toReversed()[0] const title = return ( <> {projects.map(p => ( } collapsible={false}> ))} ) } function Type({ fandoms, catName }) { // console.log("tasks", tasks); // console.log(arr) let realName = catName.replace(PRE_REGEX, "") return ( {realName}}> {fandoms.map(f => ( ))} ) } function Master({tasks}) { return (<> {tasks.map(x => )} ) } function ProjectView({type, path}) { let tmp = path.split("/").toReversed().slice(1).toReversed() path = tmp.join("/").replace(/\.md$/m, "") switch(type) { case "master": { const gf = o => { let tmp = o.substring(o.indexOf("/")) return tmp } const tasks = dc.array(usePath(path)).groupBy(o => o.$parent) .groupBy(ok => ok.key.$file) .groupBy(ok => { let t = ok.key; t = t.substring(0, t.lastIndexOf("/")) return t }) .groupBy((ok) => { return ok.key.split("/").toReversed().slice(1).toReversed().join("/") }) .array() return } case "category": const tasks = usePath(path); const fandoms = dc.array(tasks).groupBy(ok => ok.$parent) .groupBy(ok => ok.key.$file) .groupBy(ok => { let tpo = ok.key.split("/").toReversed().slice(1).toReversed().join("/") return tpo }).array(); return case "fandom": default: let projects = dc.array(usePath(path)).groupBy(ok => ok.$parent).groupBy(ok => ok.key.$file).array(); return } } return {TaskTable, Type, Fandom, ProjectView} ``` Dz1PGyklbj