Add created file opening in CreateEffortUnderAreaExoCommand
This commit is contained in:
parent
6d5a4c1266
commit
2f0a745248
|
@ -16,6 +16,8 @@ export default class CreateEffortUnderAreaExoCommand implements ExoCommand {
|
||||||
throw new Error("Active file is not an Area");
|
throw new Error("Active file is not an Area");
|
||||||
}
|
}
|
||||||
|
|
||||||
this.ctx.createEffortUseCase.taskUnderArea(activeKo);
|
let effort = await this.ctx.createEffortUseCase.taskUnderArea(activeKo);
|
||||||
|
|
||||||
|
await this.ctx.appUtils.openKObject(effort);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,30 +1,48 @@
|
||||||
import EffortRepository from "../../../../core/src/ports/output/EffortRepository";
|
import EffortRepository from "../../../../core/src/ports/output/EffortRepository";
|
||||||
import Effort from "../../../../core/src/domain/effort/Effort";
|
import Effort from "../../../../core/src/domain/effort/Effort";
|
||||||
import ExoContext from "../../../../common/ExoContext";
|
import ExoContext from "../../../../common/ExoContext";
|
||||||
|
import Area from "../../../../core/src/domain/Area";
|
||||||
|
|
||||||
export default class EffortPersistenceAdapter implements EffortRepository {
|
export default class EffortPersistenceAdapter implements EffortRepository {
|
||||||
constructor(private ctx: ExoContext) {
|
constructor(private ctx: ExoContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
async save(effort: Effort): Promise<void> {
|
async save(effort: Effort): Promise<void> {
|
||||||
const folderPath: string = this.getPathForCreate(effort)
|
const folderPath: string = this.ctx.effortPathRulesHelper.getEffortPath(effort)
|
||||||
const filePath = folderPath + "/" + effort.title + ".md";
|
const filePath = folderPath + "/" + effort.title + ".md";
|
||||||
const data: string = "---\ntags:\n - EMS/Effort\n---\n\nThis is effort created with Exo!";
|
const data = this.serializeData(effort);
|
||||||
await this.ctx.app.vault.create(filePath, data);
|
|
||||||
|
await this.ctx.appUtils.createFile(filePath, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO should be in EffortPathRulesHelper in app module
|
async update(effort: Effort): Promise<void> {
|
||||||
getPathForCreate(effort: Effort): string {
|
const file = this.ctx.appUtils.getObjectFileOrThrow(effort);
|
||||||
if (effort.area !== null) {
|
const data = this.serializeData(effort);
|
||||||
const areaFile = this.ctx.appUtils.getObjectFileOrThrow(effort.area);
|
await this.ctx.app.vault.modify(file, data);
|
||||||
const areaFolder = areaFile.parent;
|
}
|
||||||
if (!areaFolder) {
|
|
||||||
throw new Error("Area file has no parent folder");
|
|
||||||
}
|
|
||||||
|
|
||||||
return areaFolder.path;
|
private serializeData(effort: Effort) {
|
||||||
|
let result = "";
|
||||||
|
result += "---\n"; // frontmatter start
|
||||||
|
result += "tags:\n";
|
||||||
|
result += " - EMS/Effort\n";
|
||||||
|
result += "uid: " + effort.id + "\n";
|
||||||
|
result += "e-status: " + effort.status + "\n";
|
||||||
|
if (effort.started) {
|
||||||
|
result += "started: " + effort.started + "\n";
|
||||||
}
|
}
|
||||||
|
if (effort.ended) {
|
||||||
|
result += "ended: " + effort.ended + "\n";
|
||||||
|
}
|
||||||
|
if (effort.area) {
|
||||||
|
result += "area: \"" + this.getLinkToArea(effort.area) + "\"\n";
|
||||||
|
}
|
||||||
|
result += "---\n"; // frontmatter end
|
||||||
|
result += effort.body;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
return "/0 Inbox/";
|
private getLinkToArea(area: Area): string {
|
||||||
|
return `[[${area.name}]]`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
import ExoContext from "../../../common/ExoContext";
|
||||||
|
import Effort from "../../../core/src/domain/effort/Effort";
|
||||||
|
|
||||||
|
export default class EffortPathRulesHelper {
|
||||||
|
constructor(private ctx: ExoContext) {
|
||||||
|
}
|
||||||
|
|
||||||
|
getEffortPath(effort: Effort) {
|
||||||
|
if (effort.area !== null) {
|
||||||
|
const areaFile = this.ctx.appUtils.getObjectFileOrThrow(effort.area);
|
||||||
|
const areaFolder = areaFile.parent;
|
||||||
|
if (!areaFolder) {
|
||||||
|
throw new Error("Area file has no parent folder");
|
||||||
|
}
|
||||||
|
|
||||||
|
return areaFolder.path;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (effort.parent !== null) {
|
||||||
|
const parentFile = this.ctx.appUtils.getObjectFileOrThrow(effort.parent);
|
||||||
|
const parentFolder = parentFile.parent;
|
||||||
|
if (!parentFolder) {
|
||||||
|
throw new Error("Effort parent file has no parent folder");
|
||||||
|
}
|
||||||
|
|
||||||
|
return parentFolder.path;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "/0 Inbox/";
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,24 @@ export default class AppUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
async createFile(path: string, textContent: string) {
|
async createFile(path: string, textContent: string) {
|
||||||
await this.app.vault.create(path, textContent);
|
let file = await this.app.vault.create(path, textContent);
|
||||||
|
await this.waitCacheUpdate(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async waitCacheUpdate(file: TFile) {
|
||||||
|
const fileCachePromise = new Promise<CachedMetadata | null>((resolve) => {
|
||||||
|
const onCacheUpdate = (updatedFile: TFile) => {
|
||||||
|
if (updatedFile.path === file.path) {
|
||||||
|
const fileCache = this.app.metadataCache.getFileCache(file);
|
||||||
|
this.app.metadataCache.off("changed", onCacheUpdate); // Убираем подписку
|
||||||
|
resolve(fileCache || null); // Обрабатываем случай с null
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.app.metadataCache.on("changed", onCacheUpdate);
|
||||||
|
});
|
||||||
|
|
||||||
|
await fileCachePromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
async openKObject(ko: KObject) {
|
async openKObject(ko: KObject) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ import CreateEffortService from "../core/src/service/CreateEffortService";
|
||||||
import EffortRepository from "../core/src/ports/output/EffortRepository";
|
import EffortRepository from "../core/src/ports/output/EffortRepository";
|
||||||
import EffortPersistenceAdapter from "../app/src/adapters/output/EffortPersistenceAdapter";
|
import EffortPersistenceAdapter from "../app/src/adapters/output/EffortPersistenceAdapter";
|
||||||
import KObjectUtility from "../app/src/utils/KObjectUtility";
|
import KObjectUtility from "../app/src/utils/KObjectUtility";
|
||||||
|
import EffortPathRulesHelper from "../app/src/helpers/EffortPathRulesHelper";
|
||||||
|
|
||||||
export default class ExoContext {
|
export default class ExoContext {
|
||||||
public readonly utils: Utils;
|
public readonly utils: Utils;
|
||||||
|
@ -28,6 +29,7 @@ export default class ExoContext {
|
||||||
public readonly getCurrentDNUseCase: GetCurrentDailyNoteUseCase;
|
public readonly getCurrentDNUseCase: GetCurrentDailyNoteUseCase;
|
||||||
public readonly createEffortUseCase: CreateEffortUseCase;
|
public readonly createEffortUseCase: CreateEffortUseCase;
|
||||||
public readonly effortRepository: EffortRepository;
|
public readonly effortRepository: EffortRepository;
|
||||||
|
public readonly effortPathRulesHelper: EffortPathRulesHelper;
|
||||||
|
|
||||||
constructor(public app: App) {
|
constructor(public app: App) {
|
||||||
this.utils = new Utils(this.app);
|
this.utils = new Utils(this.app);
|
||||||
|
@ -41,5 +43,6 @@ export default class ExoContext {
|
||||||
this.getCurrentDNUseCase = new GetCurrentDailyNoteService(this.dailyNoteRepository);
|
this.getCurrentDNUseCase = new GetCurrentDailyNoteService(this.dailyNoteRepository);
|
||||||
this.effortRepository = new EffortPersistenceAdapter(this);
|
this.effortRepository = new EffortPersistenceAdapter(this);
|
||||||
this.createEffortUseCase = new CreateEffortService(this.effortRepository);
|
this.createEffortUseCase = new CreateEffortService(this.effortRepository);
|
||||||
|
this.effortPathRulesHelper = new EffortPathRulesHelper(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,9 @@ export default class Effort extends KObject {
|
||||||
public status: EffortStatus,
|
public status: EffortStatus,
|
||||||
public started: Date | null,
|
public started: Date | null,
|
||||||
public ended: Date | null,
|
public ended: Date | null,
|
||||||
public area: Area | null) {
|
public area: Area | null,
|
||||||
|
public parent: Effort | null,
|
||||||
|
public body: string) {
|
||||||
super(id, KOC.EMS_EFFORT);
|
super(id, KOC.EMS_EFFORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
export enum EffortStatus {
|
export enum EffortStatus {
|
||||||
DRAFT,
|
DRAFT = "DRAFT",
|
||||||
BACKLOG,
|
BACKLOG = "BACKLOG",
|
||||||
READY,
|
READY = "READY",
|
||||||
STARTED,
|
STARTED = "STARTED",
|
||||||
ENDED,
|
ENDED = "ENDED",
|
||||||
TRASHED
|
TRASHED = "TRASHED"
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,5 +2,5 @@ import Effort from "../../domain/effort/Effort";
|
||||||
import Area from "../../domain/Area";
|
import Area from "../../domain/Area";
|
||||||
|
|
||||||
export default interface CreateEffortUseCase {
|
export default interface CreateEffortUseCase {
|
||||||
taskUnderArea(area: Area): Effort;
|
taskUnderArea(area: Area): Promise<Effort>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import Effort from "../../domain/effort/Effort";
|
import Effort from "../../domain/effort/Effort";
|
||||||
|
|
||||||
export default interface EffortRepository {
|
export default interface EffortRepository {
|
||||||
save(effort: Effort): void;
|
save(effort: Effort): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,12 +9,12 @@ export default class CreateEffortService implements CreateEffortUseCase {
|
||||||
constructor(private effortRepository: EffortRepository) {
|
constructor(private effortRepository: EffortRepository) {
|
||||||
}
|
}
|
||||||
|
|
||||||
taskUnderArea(area: Area): Effort {
|
async taskUnderArea(area: Area): Promise<Effort> {
|
||||||
const title = "Task under " + area.name;
|
const title = crypto.randomUUID();
|
||||||
const id = crypto.randomUUID() as UUID;
|
const id = crypto.randomUUID() as UUID;
|
||||||
const effort = new Effort(id, title, EffortStatus.DRAFT, null, null, area);
|
const effort = new Effort(id, title, EffortStatus.DRAFT, null, null, area, null, "Body");
|
||||||
|
|
||||||
this.effortRepository.save(effort);
|
await this.effortRepository.save(effort);
|
||||||
|
|
||||||
return effort;
|
return effort;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -33,6 +33,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"compare-versions": "^6.1.1",
|
"compare-versions": "^6.1.1",
|
||||||
"jest": "^29.7.0"
|
"jest": "^29.7.0",
|
||||||
|
"obsidian-dev-utils": "^11.3.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue