mirror of
https://github.com/docmost/docmost.git
synced 2026-05-14 12:44:16 +08:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 425924cb4d | |||
| 3b983a27f6 | |||
| 299a9ca3c8 |
@@ -361,6 +361,8 @@
|
||||
"Create block quote.": "Create block quote.",
|
||||
"Insert code snippet.": "Insert code snippet.",
|
||||
"Insert horizontal rule divider": "Insert horizontal rule divider",
|
||||
"Page break": "Page break",
|
||||
"Insert a page break for printing.": "Insert a page break for printing.",
|
||||
"Upload any image from your device.": "Upload any image from your device.",
|
||||
"Upload any video from your device.": "Upload any video from your device.",
|
||||
"Upload any audio from your device.": "Upload any audio from your device.",
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
IconH2,
|
||||
IconH3,
|
||||
IconMenu4,
|
||||
IconPageBreak,
|
||||
IconTypography,
|
||||
} from "@tabler/icons-react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
@@ -102,6 +103,12 @@ export const BlockTypeGroup: FC<Props> = ({ editor }) => {
|
||||
>
|
||||
{t("Divider")}
|
||||
</Menu.Item>
|
||||
<Menu.Item
|
||||
leftSection={<IconPageBreak size={16} />}
|
||||
onClick={() => editor.chain().focus().setPageBreak().run()}
|
||||
>
|
||||
{t("Page break")}
|
||||
</Menu.Item>
|
||||
</Menu.Dropdown>
|
||||
</Menu>
|
||||
);
|
||||
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
IconTable,
|
||||
IconTypography,
|
||||
IconMenu4,
|
||||
IconPageBreak,
|
||||
IconCalendar,
|
||||
IconAppWindow,
|
||||
IconSitemap,
|
||||
@@ -164,6 +165,14 @@ const CommandGroups: SlashMenuGroupedItemsType = {
|
||||
command: ({ editor, range }: CommandProps) =>
|
||||
editor.chain().focus().deleteRange(range).setHorizontalRule().run(),
|
||||
},
|
||||
{
|
||||
title: "Page break",
|
||||
description: "Insert a page break for printing.",
|
||||
searchTerms: ["page", "break", "pagebreak", "print"],
|
||||
icon: IconPageBreak,
|
||||
command: ({ editor, range }: CommandProps) =>
|
||||
editor.chain().focus().deleteRange(range).setPageBreak().run(),
|
||||
},
|
||||
{
|
||||
title: "Image",
|
||||
description: "Upload any image from your device.",
|
||||
|
||||
@@ -42,6 +42,7 @@ import {
|
||||
Excalidraw,
|
||||
Embed,
|
||||
TiptapPdf,
|
||||
PageBreak,
|
||||
SearchAndReplace,
|
||||
Mention,
|
||||
TableDndExtension,
|
||||
@@ -366,6 +367,7 @@ export const mainExtensions = [
|
||||
TiptapPdf.configure({
|
||||
view: PdfView,
|
||||
}),
|
||||
PageBreak,
|
||||
Subpages.configure({
|
||||
view: SubpagesView,
|
||||
}),
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
@import "./media.css";
|
||||
@import "./code.css";
|
||||
@import "./print.css";
|
||||
@import "./page-break.css";
|
||||
@import "./find.css";
|
||||
@import "./mention.css";
|
||||
@import "./ordered-list.css";
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
.ProseMirror .page-break {
|
||||
position: relative;
|
||||
margin: 1.5rem 0;
|
||||
border-top: 1px dashed var(--mantine-color-default-border);
|
||||
height: 0;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.ProseMirror[contenteditable="false"] .page-break {
|
||||
margin: 0;
|
||||
border: none;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.ProseMirror[contenteditable="false"] .page-break::after {
|
||||
content: none;
|
||||
}
|
||||
|
||||
.ProseMirror .page-break::after {
|
||||
content: "Page break";
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
padding: 0 0.5rem;
|
||||
background: var(--mantine-color-body);
|
||||
color: var(--mantine-color-dimmed);
|
||||
font-size: 0.75rem;
|
||||
line-height: 1;
|
||||
letter-spacing: 0.02em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.ProseMirror .page-break.ProseMirror-selectednode {
|
||||
border-top-color: var(--mantine-primary-color-filled);
|
||||
}
|
||||
|
||||
@media print {
|
||||
.ProseMirror .page-break {
|
||||
break-before: always;
|
||||
page-break-before: always;
|
||||
visibility: hidden;
|
||||
border: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.ProseMirror .page-break::after {
|
||||
content: none;
|
||||
}
|
||||
}
|
||||
@@ -81,7 +81,7 @@
|
||||
"ioredis": "^5.10.1",
|
||||
"js-tiktoken": "^1.0.21",
|
||||
"jsonwebtoken": "^9.0.3",
|
||||
"kysely": "^0.29.0",
|
||||
"kysely": "^0.28.17",
|
||||
"kysely-migration-cli": "^0.4.2",
|
||||
"kysely-postgres-js": "^3.0.0",
|
||||
"ldapts": "^8.1.7",
|
||||
|
||||
@@ -26,6 +26,7 @@ import {
|
||||
TiptapVideo,
|
||||
TiptapAudio,
|
||||
TiptapPdf,
|
||||
PageBreak,
|
||||
TrailingNode,
|
||||
Attachment,
|
||||
Drawio,
|
||||
@@ -94,6 +95,7 @@ export const tiptapExtensions = [
|
||||
TiptapVideo,
|
||||
TiptapAudio,
|
||||
TiptapPdf,
|
||||
PageBreak,
|
||||
Callout,
|
||||
Attachment,
|
||||
CustomCodeBlock,
|
||||
|
||||
+1
-1
Submodule apps/server/src/ee updated: 71844c0972...b30e92f6a0
@@ -31,5 +31,6 @@ export * from "./lib/recreate-transform";
|
||||
export * from "./lib/columns";
|
||||
export * from "./lib/status";
|
||||
export * from "./lib/pdf";
|
||||
export * from "./lib/page-break";
|
||||
export * from "./lib/resizable-nodeview";
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export * from "./page-break";
|
||||
@@ -0,0 +1,60 @@
|
||||
import { mergeAttributes, Node } from "@tiptap/core";
|
||||
|
||||
export interface PageBreakOptions {
|
||||
HTMLAttributes: Record<string, any>;
|
||||
}
|
||||
|
||||
declare module "@tiptap/core" {
|
||||
interface Commands<ReturnType> {
|
||||
pageBreak: {
|
||||
setPageBreak: () => ReturnType;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export const PageBreak = Node.create<PageBreakOptions>({
|
||||
name: "pageBreak",
|
||||
|
||||
group: "block",
|
||||
|
||||
atom: true,
|
||||
|
||||
selectable: true,
|
||||
|
||||
addOptions() {
|
||||
return {
|
||||
HTMLAttributes: {},
|
||||
};
|
||||
},
|
||||
|
||||
parseHTML() {
|
||||
return [
|
||||
{
|
||||
tag: `div[data-type="${this.name}"]`,
|
||||
},
|
||||
];
|
||||
},
|
||||
|
||||
renderHTML({ HTMLAttributes }) {
|
||||
return [
|
||||
"div",
|
||||
mergeAttributes(
|
||||
{ "data-type": this.name, class: "page-break" },
|
||||
this.options.HTMLAttributes,
|
||||
HTMLAttributes,
|
||||
),
|
||||
];
|
||||
},
|
||||
|
||||
addCommands() {
|
||||
return {
|
||||
setPageBreak:
|
||||
() =>
|
||||
({ chain }) =>
|
||||
chain()
|
||||
.insertContent({ type: this.name })
|
||||
.focus()
|
||||
.run(),
|
||||
};
|
||||
},
|
||||
});
|
||||
Generated
+15
-15
@@ -637,14 +637,14 @@ importers:
|
||||
specifier: ^9.0.3
|
||||
version: 9.0.3
|
||||
kysely:
|
||||
specifier: ^0.29.0
|
||||
version: 0.29.0
|
||||
specifier: ^0.28.17
|
||||
version: 0.28.17
|
||||
kysely-migration-cli:
|
||||
specifier: ^0.4.2
|
||||
version: 0.4.2
|
||||
kysely-postgres-js:
|
||||
specifier: ^3.0.0
|
||||
version: 3.0.0(kysely@0.29.0)(postgres@3.4.8)
|
||||
version: 3.0.0(kysely@0.28.17)(postgres@3.4.8)
|
||||
ldapts:
|
||||
specifier: ^8.1.7
|
||||
version: 8.1.7
|
||||
@@ -668,7 +668,7 @@ importers:
|
||||
version: 6.2.0(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)
|
||||
nestjs-kysely:
|
||||
specifier: ^3.1.2
|
||||
version: 3.1.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(kysely@0.29.0)(reflect-metadata@0.2.2)
|
||||
version: 3.1.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(kysely@0.28.17)(reflect-metadata@0.2.2)
|
||||
nestjs-pino:
|
||||
specifier: ^4.6.1
|
||||
version: 4.6.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@11.0.0)(pino@10.1.0)(rxjs@7.8.2)
|
||||
@@ -819,7 +819,7 @@ importers:
|
||||
version: 30.3.0(@types/node@25.5.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@25.5.0)(typescript@5.9.3))
|
||||
kysely-codegen:
|
||||
specifier: ^0.20.0
|
||||
version: 0.20.0(kysely@0.29.0)(pg@8.16.3)(typescript@5.9.3)
|
||||
version: 0.20.0(kysely@0.28.17)(pg@8.16.3)(typescript@5.9.3)
|
||||
prettier:
|
||||
specifier: ^3.8.1
|
||||
version: 3.8.1
|
||||
@@ -7815,9 +7815,9 @@ packages:
|
||||
postgres:
|
||||
optional: true
|
||||
|
||||
kysely@0.29.0:
|
||||
resolution: {integrity: sha512-LrQfPUeTW7MXbMvT62moEMnpMTuj9TO3lqjCeLKjM975PJ4Alrl/43f2tlDX7xOsNptKgH4LSNGwIbXwEkLg4g==}
|
||||
engines: {node: '>=22.0.0'}
|
||||
kysely@0.28.17:
|
||||
resolution: {integrity: sha512-nbD8lB9EB3wNdMhOCdx5Li8DxnLbvKByylRLcJ1h+4SkrowVeECAyZlyiKMThF7xFdRz0jSQ2MoJr+wXux2y0Q==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
|
||||
langium@3.3.1:
|
||||
resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==}
|
||||
@@ -18686,14 +18686,14 @@ snapshots:
|
||||
|
||||
klona@2.0.6: {}
|
||||
|
||||
kysely-codegen@0.20.0(kysely@0.29.0)(pg@8.16.3)(typescript@5.9.3):
|
||||
kysely-codegen@0.20.0(kysely@0.28.17)(pg@8.16.3)(typescript@5.9.3):
|
||||
dependencies:
|
||||
chalk: 4.1.2
|
||||
cosmiconfig: 9.0.0(typescript@5.9.3)
|
||||
diff: 8.0.3
|
||||
dotenv: 17.2.4
|
||||
dotenv-expand: 12.0.3
|
||||
kysely: 0.29.0
|
||||
kysely: 0.28.17
|
||||
micromatch: 4.0.8
|
||||
minimist: 1.2.8
|
||||
pluralize: 8.0.0
|
||||
@@ -18708,13 +18708,13 @@ snapshots:
|
||||
'@commander-js/extra-typings': 11.1.0(commander@11.1.0)
|
||||
commander: 11.1.0
|
||||
|
||||
kysely-postgres-js@3.0.0(kysely@0.29.0)(postgres@3.4.8):
|
||||
kysely-postgres-js@3.0.0(kysely@0.28.17)(postgres@3.4.8):
|
||||
dependencies:
|
||||
kysely: 0.29.0
|
||||
kysely: 0.28.17
|
||||
optionalDependencies:
|
||||
postgres: 3.4.8
|
||||
|
||||
kysely@0.29.0: {}
|
||||
kysely@0.28.17: {}
|
||||
|
||||
langium@3.3.1:
|
||||
dependencies:
|
||||
@@ -19142,11 +19142,11 @@ snapshots:
|
||||
reflect-metadata: 0.2.2
|
||||
rxjs: 7.8.2
|
||||
|
||||
nestjs-kysely@3.1.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(kysely@0.29.0)(reflect-metadata@0.2.2):
|
||||
nestjs-kysely@3.1.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(kysely@0.28.17)(reflect-metadata@0.2.2):
|
||||
dependencies:
|
||||
'@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
|
||||
'@nestjs/core': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)
|
||||
kysely: 0.29.0
|
||||
kysely: 0.28.17
|
||||
reflect-metadata: 0.2.2
|
||||
|
||||
nestjs-pino@4.6.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@11.0.0)(pino@10.1.0)(rxjs@7.8.2):
|
||||
|
||||
Reference in New Issue
Block a user