From df293b86c6771ad415804d0659873a91f9cf8f99 Mon Sep 17 00:00:00 2001 From: kitelev Date: Sat, 4 Jan 2025 20:47:39 +0500 Subject: [PATCH] Change Area layout rendering with dataview table --- app/src/adapters/input/layouts/AreaLayout.ts | 72 +++++++++++--------- app/src/utils/dv/DvRenderer.ts | 24 +++++-- 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/app/src/adapters/input/layouts/AreaLayout.ts b/app/src/adapters/input/layouts/AreaLayout.ts index 8fe805d..a2a8782 100644 --- a/app/src/adapters/input/layouts/AreaLayout.ts +++ b/app/src/adapters/input/layouts/AreaLayout.ts @@ -2,45 +2,51 @@ import Layout from "./Layout"; import ExoContext from "../../../../../common/ExoContext"; import Area from "../../../../../core/src/domain/Area"; import DvRenderer from "../../../utils/dv/DvRenderer"; -import {Link} from "obsidian-dataview"; import Effort from "../../../../../core/src/domain/effort/Effort"; export default class AreaLayout implements Layout { - constructor(private ctx: ExoContext, private dvRender: DvRenderer) { - } + constructor(private ctx: ExoContext, private dvRender: DvRenderer) { + } - async render(ko: Area, el: HTMLElement): Promise { - const unresolvedEfforts = await this.ctx.effortRepository.find(e => { - if (e.area === null) { - return false; - } - const sameArea = e.area.id == ko.id; - const unresolved = e.isUnresolved(); - return sameArea && unresolved; - }); + async render(ko: Area, el: HTMLElement): Promise { + const unresolvedEfforts = await this.ctx.effortRepository.find(e => { + if (e.area === null) { + return false; + } + const sameArea = e.area.id == ko.id; + const unresolved = e.isUnresolved(); + return sameArea && unresolved; + }); - if (unresolvedEfforts.length > 0) { - let header = this.createH1("Unresolved Efforts"); - el.appendChild(header); + if (unresolvedEfforts.length > 0) { + let header = this.createH1("Unresolved Efforts"); + el.appendChild(header); - const dvTable = await this.createTable(unresolvedEfforts); - el.appendChild(dvTable) - } - } + const dvTable = await this.createTable(unresolvedEfforts); + el.appendChild(dvTable) + } + } - private createH1(textContent: string) { - const h1 = document.createElement("h1"); - h1.textContent = textContent; - return h1; - } + private createH1(textContent: string) { + const h1 = document.createElement("h1"); + h1.textContent = textContent; + return h1; + } - private async createTable(unresolvedEfforts: Effort[]) { - let effortsLinks: Link[] = unresolvedEfforts.map(e => { - let file = this.ctx.appUtils.getObjectFileOrThrow(e); - return this.dvRender.dvApi.fileLink(file.path); - }); - const dvDiv = document.createElement("div"); - await this.dvRender.list(effortsLinks, dvDiv); - return dvDiv; - } + private async createTable(unresolvedEfforts: Effort[]) { + const headers = ["Effort", "Area", "Status", "Votes"]; + const rows = unresolvedEfforts.map(e => { + const effortLink = this.toLink(e); + const aresStr = e.area?.name ?? "--"; // TODO use inherited area + const statusStr = e.status; + const votesStr = "--"; // TODO implement votes + return [effortLink, aresStr, statusStr, votesStr]; + }); + return await this.dvRender.table(headers, rows); + } + + private toLink(e: Effort) { + let file = this.ctx.appUtils.getObjectFileOrThrow(e); + return this.dvRender.dvApi.fileLink(file.path); + } } diff --git a/app/src/utils/dv/DvRenderer.ts b/app/src/utils/dv/DvRenderer.ts index 3e73417..17394a4 100644 --- a/app/src/utils/dv/DvRenderer.ts +++ b/app/src/utils/dv/DvRenderer.ts @@ -19,12 +19,26 @@ export default class DvRenderer { this.dvApi = dvApi; } - async list(links: Link[], el: HTMLElement) { - await this.dvApi.list( - links, - el, - this.component, + // noinspection JSUnusedGlobalSymbols + async list(links: Link[]) { + const div = document.createElement("div"); + div.addClass("dv-renderer"); + + await this.dvApi.list(links, div, this.component, this.mdCtx.sourcePath // TODO maybe this in unnecessary ); + + return div; + } + + async table(headers: string[], rows: any[][]) { + const div = document.createElement("div"); + div.addClass("dv-renderer"); + + await this.dvApi.table(headers, rows, div, this.component, + this.mdCtx.sourcePath // TODO maybe this in unnecessary + ); + + return div; } }