Change Area layout rendering with dataview table

This commit is contained in:
kitelev 2025-01-04 20:47:39 +05:00
parent eb2a93642b
commit df293b86c6
2 changed files with 58 additions and 38 deletions

View File

@ -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<Area> {
constructor(private ctx: ExoContext, private dvRender: DvRenderer) {
}
constructor(private ctx: ExoContext, private dvRender: DvRenderer) {
}
async render(ko: Area, el: HTMLElement): Promise<void> {
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<void> {
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);
}
}

View File

@ -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;
}
}