fix: Attributes lost creating template on server (#7049)
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import { Transaction } from "sequelize";
|
import { Transaction } from "sequelize";
|
||||||
import { Optional } from "utility-types";
|
import { Optional } from "utility-types";
|
||||||
import { Document, Event, User } from "@server/models";
|
import { Document, Event, User } from "@server/models";
|
||||||
|
import { ProsemirrorHelper } from "@server/models/helpers/ProsemirrorHelper";
|
||||||
import { TextHelper } from "@server/models/helpers/TextHelper";
|
import { TextHelper } from "@server/models/helpers/TextHelper";
|
||||||
|
|
||||||
type Props = Optional<
|
type Props = Optional<
|
||||||
@@ -58,6 +59,12 @@ export default async function documentCreator({
|
|||||||
}: Props): Promise<Document> {
|
}: Props): Promise<Document> {
|
||||||
const templateId = templateDocument ? templateDocument.id : undefined;
|
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) {
|
if (urlId) {
|
||||||
const existing = await Document.unscoped().findOne({
|
const existing = await Document.unscoped().findOne({
|
||||||
attributes: ["id"],
|
attributes: ["id"],
|
||||||
@@ -103,6 +110,12 @@ export default async function documentCreator({
|
|||||||
ip,
|
ip,
|
||||||
transaction
|
transaction
|
||||||
),
|
),
|
||||||
|
content: templateDocument
|
||||||
|
? ProsemirrorHelper.replaceTemplateVariables(
|
||||||
|
templateDocument.content,
|
||||||
|
user
|
||||||
|
)
|
||||||
|
: undefined,
|
||||||
state,
|
state,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,7 +19,9 @@ import { schema, parser } from "@server/editor";
|
|||||||
import Logger from "@server/logging/Logger";
|
import Logger from "@server/logging/Logger";
|
||||||
import { trace } from "@server/logging/tracing";
|
import { trace } from "@server/logging/tracing";
|
||||||
import Attachment from "@server/models/Attachment";
|
import Attachment from "@server/models/Attachment";
|
||||||
|
import User from "@server/models/User";
|
||||||
import FileStorage from "@server/storage/files";
|
import FileStorage from "@server/storage/files";
|
||||||
|
import { TextHelper } from "./TextHelper";
|
||||||
|
|
||||||
export type HTMLOptions = {
|
export type HTMLOptions = {
|
||||||
/** A title, if it should be included */
|
/** A title, if it should be included */
|
||||||
@@ -172,6 +174,29 @@ export class ProsemirrorHelper {
|
|||||||
return removeMarksInner(data);
|
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.
|
* Returns the document as a plain JSON object with attachment URLs signed.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ export class TextHelper {
|
|||||||
return text
|
return text
|
||||||
.replace(/{date}/g, startCase(getCurrentDateAsString(locales)))
|
.replace(/{date}/g, startCase(getCurrentDateAsString(locales)))
|
||||||
.replace(/{time}/g, startCase(getCurrentTimeAsString(locales)))
|
.replace(/{time}/g, startCase(getCurrentTimeAsString(locales)))
|
||||||
.replace(/{datetime}/g, startCase(getCurrentDateTimeAsString(locales)));
|
.replace(/{datetime}/g, startCase(getCurrentDateTimeAsString(locales)))
|
||||||
|
.replace(/{author}/g, user.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user