Add icon column to document (#7066)

* Add icon column to document

* Backfill columns

---------

Co-authored-by: Tom Moor <tom.moor@gmail.com>
This commit is contained in:
Hemachandar
2024-06-21 18:56:20 +05:30
committed by GitHub
parent b6d178943a
commit 4897f001e4
10 changed files with 119 additions and 0 deletions

View File

@@ -97,6 +97,8 @@ export default async function documentCreator({
sourceMetadata,
fullWidth: templateDocument ? templateDocument.fullWidth : fullWidth,
emoji: templateDocument ? templateDocument.emoji : emoji,
icon: templateDocument ? templateDocument.emoji : emoji,
color: templateDocument ? templateDocument.color : null,
title: TextHelper.replaceTemplateVariables(
templateDocument ? templateDocument.title : title,
user

View File

@@ -26,6 +26,7 @@ describe("documentDuplicator", () => {
expect(response[0].title).toEqual(original.title);
expect(response[0].text).toEqual(original.text);
expect(response[0].emoji).toEqual(original.emoji);
expect(response[0].icon).toEqual(original.emoji);
expect(response[0].publishedAt).toBeInstanceOf(Date);
});
@@ -52,6 +53,7 @@ describe("documentDuplicator", () => {
expect(response[0].title).toEqual("New title");
expect(response[0].text).toEqual(original.text);
expect(response[0].emoji).toEqual(original.emoji);
expect(response[0].icon).toEqual(original.emoji);
expect(response[0].publishedAt).toBeInstanceOf(Date);
});
@@ -106,6 +108,7 @@ describe("documentDuplicator", () => {
expect(response[0].title).toEqual(original.title);
expect(response[0].text).toEqual(original.text);
expect(response[0].emoji).toEqual(original.emoji);
expect(response[0].icon).toEqual(original.emoji);
expect(response[0].publishedAt).toBeNull();
});
});

View File

@@ -67,6 +67,7 @@ export default async function documentUpdater({
}
if (emoji !== undefined) {
document.emoji = emoji;
document.icon = emoji;
}
if (editorVersion) {
document.editorVersion = editorVersion;

View File

@@ -0,0 +1,79 @@
"use strict";
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.sequelize.transaction(async transaction => {
await queryInterface.addColumn(
"documents",
"icon",
{
type: Sequelize.STRING,
allowNull: true,
},
{
transaction,
}
);
await queryInterface.addColumn(
"revisions",
"icon",
{
type: Sequelize.STRING,
allowNull: true,
},
{
transaction,
}
);
await queryInterface.addColumn(
"documents",
"color",
{
type: Sequelize.STRING,
allowNull: true,
},
{ transaction }
);
await queryInterface.addColumn(
"revisions",
"color",
{
type: Sequelize.STRING,
allowNull: true,
},
{ transaction }
);
});
if (process.env.DEPLOYMENT === "hosted") {
return;
}
await queryInterface.sequelize.transaction(async (transaction) => {
await queryInterface.sequelize.query(
`UPDATE documents SET icon = emoji`,
{
transaction,
type: queryInterface.sequelize.QueryTypes.UPDATE,
}
);
await queryInterface.sequelize.query(
`UPDATE revisions SET icon = emoji`,
{
transaction,
type: queryInterface.sequelize.QueryTypes.UPDATE,
}
);
});
},
async down(queryInterface, Sequelize) {
await queryInterface.sequelize.transaction(async transaction => {
await queryInterface.removeColumn("documents", "icon", { transaction });
await queryInterface.removeColumn("revisions", "icon", { transaction });
await queryInterface.removeColumn("documents", "color", { transaction });
await queryInterface.removeColumn("revisions", "color", { transaction });
});
},
};

View File

@@ -64,6 +64,7 @@ import View from "./View";
import ParanoidModel from "./base/ParanoidModel";
import Fix from "./decorators/Fix";
import { DocumentHelper } from "./helpers/DocumentHelper";
import IsHexColor from "./validators/IsHexColor";
import Length from "./validators/Length";
export const DOCUMENT_VERSION = 2;
@@ -262,6 +263,18 @@ class Document extends ParanoidModel<
@Column
emoji: string | null;
@Length({
max: 50,
msg: `icon must be 50 characters or less`,
})
@Column
icon: string | null;
/** The color of the icon. */
@IsHexColor
@Column
color: string | null;
/**
* The content of the document as Markdown.
*

View File

@@ -20,6 +20,7 @@ import Document from "./Document";
import User from "./User";
import IdModel from "./base/IdModel";
import Fix from "./decorators/Fix";
import IsHexColor from "./validators/IsHexColor";
import Length from "./validators/Length";
@DefaultScope(() => ({
@@ -77,6 +78,18 @@ class Revision extends IdModel<
@Column
emoji: string | null;
@Length({
max: 50,
msg: `icon must be 50 characters or less`,
})
@Column
icon: string | null;
/** The color of the icon. */
@IsHexColor
@Column
color: string | null;
// associations
@BelongsTo(() => Document, "documentId")
@@ -121,6 +134,8 @@ class Revision extends IdModel<
title: document.title,
text: document.text,
emoji: document.emoji,
icon: document.emoji,
color: document.color,
content: document.content,
userId: document.lastModifiedById,
editorVersion: document.editorVersion,

View File

@@ -80,6 +80,8 @@ export default class ImportJSONTask extends ImportTask {
// structure directly in the future.
text: serializer.serialize(Node.fromJSON(schema, node.data)),
emoji: node.emoji,
icon: node.emoji,
color: null,
createdAt: node.createdAt ? new Date(node.createdAt) : undefined,
updatedAt: node.updatedAt ? new Date(node.updatedAt) : undefined,
publishedAt: node.publishedAt ? new Date(node.publishedAt) : null,

View File

@@ -116,6 +116,7 @@ export default class ImportMarkdownZipTask extends ImportTask {
id,
title,
emoji,
icon: emoji,
text,
collectionId,
parentDocumentId,

View File

@@ -131,6 +131,7 @@ export default class ImportNotionTask extends ImportTask {
id,
title,
emoji,
icon: emoji,
text,
collectionId,
parentDocumentId,

View File

@@ -61,6 +61,8 @@ export type StructuredImportData = {
urlId?: string;
title: string;
emoji?: string | null;
icon?: string | null;
color?: string | null;
/**
* The document text. To reference an attachment or image use the special
* formatting <<attachmentId>>. It will be replaced with a reference to the