fix: Attributes lost creating template on server (#7049)

This commit is contained in:
Tom Moor
2024-06-15 22:06:37 -04:00
committed by GitHub
parent eb1882eb96
commit 379d2cb788
3 changed files with 40 additions and 1 deletions

View File

@@ -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<Document> {
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,
},
{

View File

@@ -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.
*

View File

@@ -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);
}
/**