Change Area layout rendering with dataview
This commit is contained in:
parent
d7ce3ef9ce
commit
eb2a93642b
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
12
main.ts
|
@ -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);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue