diff --git a/server/commands/documentCreator.ts b/server/commands/documentCreator.ts index eb286ec16..8522db26c 100644 --- a/server/commands/documentCreator.ts +++ b/server/commands/documentCreator.ts @@ -1,6 +1,7 @@ import { Transaction } from "sequelize"; import { Optional } from "utility-types"; import { Document, Event, User } from "@server/models"; +import { ProsemirrorHelper } from "@server/models/helpers/ProsemirrorHelper"; import { TextHelper } from "@server/models/helpers/TextHelper"; type Props = Optional< @@ -58,6 +59,12 @@ export default async function documentCreator({ }: Props): Promise { const templateId = templateDocument ? templateDocument.id : undefined; + if (state && templateDocument) { + throw new Error( + "State cannot be set when creating a document from a template" + ); + } + if (urlId) { const existing = await Document.unscoped().findOne({ attributes: ["id"], @@ -103,6 +110,12 @@ export default async function documentCreator({ ip, transaction ), + content: templateDocument + ? ProsemirrorHelper.replaceTemplateVariables( + templateDocument.content, + user + ) + : undefined, state, }, { diff --git a/server/models/helpers/ProsemirrorHelper.tsx b/server/models/helpers/ProsemirrorHelper.tsx index 662bd1560..55764d585 100644 --- a/server/models/helpers/ProsemirrorHelper.tsx +++ b/server/models/helpers/ProsemirrorHelper.tsx @@ -19,7 +19,9 @@ import { schema, parser } from "@server/editor"; import Logger from "@server/logging/Logger"; import { trace } from "@server/logging/tracing"; import Attachment from "@server/models/Attachment"; +import User from "@server/models/User"; import FileStorage from "@server/storage/files"; +import { TextHelper } from "./TextHelper"; export type HTMLOptions = { /** A title, if it should be included */ @@ -172,6 +174,29 @@ export class ProsemirrorHelper { return removeMarksInner(data); } + /** + * Replaces all template variables in the node. + * + * @param data The ProsemirrorData object to replace variables in + * @param user The user to use for replacing variables + * @returns The content with variables replaced + */ + static replaceTemplateVariables(data: ProsemirrorData, user: User) { + function replace(node: ProsemirrorData) { + if (node.type === "text" && node.text) { + node.text = TextHelper.replaceTemplateVariables(node.text, user); + } + + if (node.content) { + node.content.forEach(replace); + } + + return node; + } + + return replace(data); + } + /** * Returns the document as a plain JSON object with attachment URLs signed. * diff --git a/server/models/helpers/TextHelper.ts b/server/models/helpers/TextHelper.ts index 463c23625..8909c72a9 100644 --- a/server/models/helpers/TextHelper.ts +++ b/server/models/helpers/TextHelper.ts @@ -32,7 +32,8 @@ export class TextHelper { return text .replace(/{date}/g, startCase(getCurrentDateAsString(locales))) .replace(/{time}/g, startCase(getCurrentTimeAsString(locales))) - .replace(/{datetime}/g, startCase(getCurrentDateTimeAsString(locales))); + .replace(/{datetime}/g, startCase(getCurrentDateTimeAsString(locales))) + .replace(/{author}/g, user.name); } /**