Change Area layout rendering with dataview

This commit is contained in:
kitelev 2025-01-04 20:33:43 +05:00
parent d7ce3ef9ce
commit eb2a93642b
6 changed files with 67 additions and 34 deletions

View File

@ -1,14 +1,15 @@
import Layout from "./Layout"; import Layout from "./Layout";
import ExoContext from "../../../../../common/ExoContext"; import ExoContext from "../../../../../common/ExoContext";
import Area from "../../../../../core/src/domain/Area"; 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> { export default class AreaLayout implements Layout<Area> {
constructor(private ctx: ExoContext) { constructor(private ctx: ExoContext, private dvRender: DvRenderer) {
} }
async render(ko: Area): Promise<HTMLDivElement> { async render(ko: Area, el: HTMLElement): Promise<void> {
const renderText = document.createElement("div");
const unresolvedEfforts = await this.ctx.effortRepository.find(e => { const unresolvedEfforts = await this.ctx.effortRepository.find(e => {
if (e.area === null) { if (e.area === null) {
return false; return false;
@ -19,28 +20,27 @@ export default class AreaLayout implements Layout<Area> {
}); });
if (unresolvedEfforts.length > 0) { if (unresolvedEfforts.length > 0) {
let h1 = document.createElement("h1"); let header = this.createH1("Unresolved Efforts");
h1.textContent = "Unresolved Efforts"; el.appendChild(header);
renderText.appendChild(h1);
let table = document.createElement("table"); const dvTable = await this.createTable(unresolvedEfforts);
renderText.appendChild(table); el.appendChild(dvTable)
const headerRow = document.createElement("tr");
const th = document.createElement("th");
th.innerText = "Name";
headerRow.appendChild(th);
table.appendChild(headerRow);
for (let effort of unresolvedEfforts) {
const tr = document.createElement("tr");
let td = document.createElement("td");
td.textContent = "[[" + effort.title + "]]";
tr.appendChild(td);
table.appendChild(tr);
}
} }
}
return renderText; 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;
} }
} }

View File

@ -1,3 +1,3 @@
export default interface Layout<KO> { export default interface Layout<KO> {
render(ko: KO): Promise<HTMLElement>; render(ko: KO, el: HTMLElement): Promise<void>;
} }

View File

@ -1,17 +1,18 @@
import AreaLayout from "./AreaLayout";
import {KOC} from "../../../../../core/src/domain/KOC"; import {KOC} from "../../../../../core/src/domain/KOC";
import ExoContext from "../../../../../common/ExoContext"; import ExoContext from "../../../../../common/ExoContext";
import KObject from "../../../../../core/src/domain/KObject"; import KObject from "../../../../../core/src/domain/KObject";
import AreaLayoutDv from "./AreaLayout";
import DvRenderer from "../../../utils/dv/DvRenderer";
import Layout from "./Layout"; import Layout from "./Layout";
export default class LayoutFactory { export default class LayoutFactory {
constructor(private ctx: ExoContext) { constructor(private ctx: ExoContext) {
} }
create(ko: KObject): Layout<KObject> | null { create(ko: KObject, dvRender: DvRenderer): Layout<KObject> | null {
switch (ko.koc) { switch (ko.koc) {
case KOC.EMS_AREA: case KOC.EMS_AREA:
return new AreaLayout(this.ctx); return new AreaLayoutDv(this.ctx, dvRender);
default: default:
return null; return null;
} }

View File

@ -24,7 +24,7 @@ export default class KObjectCreator {
case KOC.EMS_EFFORT: case KOC.EMS_EFFORT:
return await this.ctx.effortCreator.create(file); return await this.ctx.effortCreator.create(file);
default: default:
throw new Error("Not implemented createFromTFileTyped") throw new Error(`KOC '${koc}' not supported`);
} }
} }

View File

@ -0,0 +1,30 @@
import ExoContext from "../../../../common/ExoContext";
import {Component, MarkdownPostProcessorContext} from "obsidian";
import {DataviewApi} from "api/plugin-api";
import {getAPI, Link} from "obsidian-dataview";
/**
* Dataview renderer for MarkdownPostProcessing
*/
export default class DvRenderer {
public readonly dvApi: DataviewApi;
constructor(private exoCtx: ExoContext,
private mdCtx: MarkdownPostProcessorContext,
private component: Component) {
const dvApi: DataviewApi | undefined = getAPI(this.exoCtx.app);
if (!dvApi) {
throw new Error('Dataview API not available.');
}
this.dvApi = dvApi;
}
async list(links: Link[], el: HTMLElement) {
await this.dvApi.list(
links,
el,
this.component,
this.mdCtx.sourcePath // TODO maybe this in unnecessary
);
}
}

12
main.ts
View File

@ -3,6 +3,7 @@ import {ExoMainModal} from "./app/src/ExoMainModal";
import "localforage"; import "localforage";
import ExoApi from "./core/src/ExoApi"; import ExoApi from "./core/src/ExoApi";
import ExoContext from "./common/ExoContext"; import ExoContext from "./common/ExoContext";
import DvRenderer from "./app/src/utils/dv/DvRenderer";
export default class ExoPlugin extends Plugin { export default class ExoPlugin extends Plugin {
private api: ExoApi; private api: ExoApi;
@ -22,16 +23,17 @@ export default class ExoPlugin extends Plugin {
} }
if (el.classList.contains("mod-ui")) { if (el.classList.contains("mod-ui")) {
const renderer = new DvRenderer(this.ctx, ctx, this);
const file: TFile = this.ctx.appUtils.getFileByPathOrThrow(ctx.sourcePath); const file: TFile = this.ctx.appUtils.getFileByPathOrThrow(ctx.sourcePath);
console.log(file)
const ko = await this.ctx.kObjectCreator.createFromTFileTyped(file); const ko = await this.ctx.kObjectCreator.createFromTFileTyped(file);
const layout = this.ctx.layoutFactory.create(ko);
if (!layout) { const layout = this.ctx.layoutFactory.create(ko, renderer);
if (layout === null) {
return; return;
} }
const renderText = await layout.render(ko); await layout.render(ko, el);
el.prepend(renderText);
} }
}); });
} }