@verdant-web/tiptap 0.1.6 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/__browserTests__/react.test.js +145 -0
- package/dist/esm/__browserTests__/react.test.js.map +1 -1
- package/dist/esm/fields.js +26 -8
- package/dist/esm/fields.js.map +1 -1
- package/dist/esm/plugins.d.ts +26 -3
- package/dist/esm/plugins.js +195 -18
- package/dist/esm/plugins.js.map +1 -1
- package/dist/esm/react.d.ts +4 -6
- package/dist/esm/react.js +9 -71
- package/dist/esm/react.js.map +1 -1
- package/package.json +10 -10
- package/src/__browserTests__/react.test.tsx +205 -0
- package/src/fields.ts +29 -8
- package/src/plugins.ts +285 -44
- package/src/react.ts +21 -111
|
@@ -147,4 +147,149 @@ it('should support nullable tiptap schema fields with a specified default doc',
|
|
|
147
147
|
text: null,
|
|
148
148
|
});
|
|
149
149
|
});
|
|
150
|
+
it('should support Verdant undo and redo', async () => {
|
|
151
|
+
const testPost = await client.posts.put({});
|
|
152
|
+
// reset history
|
|
153
|
+
await client.entities.flushAllBatches();
|
|
154
|
+
client.undoHistory.clear();
|
|
155
|
+
const TipTapTest = () => {
|
|
156
|
+
const editor = useSyncedEditor(testPost, 'requiredBody', {
|
|
157
|
+
editorOptions: {
|
|
158
|
+
extensions: [
|
|
159
|
+
StarterKit.configure({
|
|
160
|
+
// using Verdant history.
|
|
161
|
+
history: false,
|
|
162
|
+
}),
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
// NOTE: this config is not required in regular usage, I'm tweaking batching
|
|
166
|
+
// to be sure it captures the entire testing change in one batch for undo to
|
|
167
|
+
// make the test predictable.
|
|
168
|
+
extensionOptions: {
|
|
169
|
+
batchConfig: {
|
|
170
|
+
// capture up to 100 changes in the batch.
|
|
171
|
+
max: 100,
|
|
172
|
+
timeout: null,
|
|
173
|
+
batchName: 'tiptap',
|
|
174
|
+
undoable: true,
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
return (_jsxs("div", { children: [_jsx("div", { children: "Text editor:" }), _jsx(EditorContent, { style: {
|
|
179
|
+
width: 500,
|
|
180
|
+
height: 300,
|
|
181
|
+
}, editor: editor, id: "#editor", "data-testid": "editor" })] }));
|
|
182
|
+
};
|
|
183
|
+
const screen = await renderWithProvider(_jsx(TipTapTest, {}));
|
|
184
|
+
await expect.element(screen.getByTestId('editor')).toBeVisible();
|
|
185
|
+
const editor = screen.getByTestId('editor').getByRole('textbox');
|
|
186
|
+
await expect.element(editor).toHaveTextContent('');
|
|
187
|
+
// send keystrokes to the editor
|
|
188
|
+
await userEvent.type(editor, 'Hello, world!');
|
|
189
|
+
await expect.element(editor).toHaveTextContent('Hello, world!');
|
|
190
|
+
await client.entities.flushAllBatches();
|
|
191
|
+
expect(client.undoHistory.undoLength).toBe(1);
|
|
192
|
+
await client.undoHistory.undo();
|
|
193
|
+
expect(testPost.get('requiredBody').getSnapshot()).toEqual({
|
|
194
|
+
type: 'doc',
|
|
195
|
+
attrs: {},
|
|
196
|
+
from: null,
|
|
197
|
+
to: null,
|
|
198
|
+
content: [],
|
|
199
|
+
marks: [],
|
|
200
|
+
text: null,
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
it('should support TipTap undo and redo', async () => {
|
|
204
|
+
const testPost = await client.posts.put({});
|
|
205
|
+
// reset history
|
|
206
|
+
await client.entities.flushAllBatches();
|
|
207
|
+
client.undoHistory.clear();
|
|
208
|
+
const TipTapTest = () => {
|
|
209
|
+
const editor = useSyncedEditor(testPost, 'requiredBody', {
|
|
210
|
+
editorOptions: {
|
|
211
|
+
extensions: [StarterKit],
|
|
212
|
+
},
|
|
213
|
+
extensionOptions: {
|
|
214
|
+
batchConfig: {
|
|
215
|
+
undoable: false,
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
return (_jsxs("div", { children: [_jsx("div", { children: "Text editor:" }), _jsx(EditorContent, { style: {
|
|
220
|
+
width: 500,
|
|
221
|
+
height: 300,
|
|
222
|
+
}, editor: editor, id: "#editor", "data-testid": "editor" }), _jsx("button", { "data-testid": "undo", onClick: () => editor.commands.undo(), children: "Undo" })] }));
|
|
223
|
+
};
|
|
224
|
+
const screen = await renderWithProvider(_jsx(TipTapTest, {}));
|
|
225
|
+
await expect.element(screen.getByTestId('editor')).toBeVisible();
|
|
226
|
+
const editor = screen.getByTestId('editor').getByRole('textbox');
|
|
227
|
+
await expect.element(editor).toHaveTextContent('');
|
|
228
|
+
// send keystrokes to the editor
|
|
229
|
+
await userEvent.type(editor, 'Hello, world!');
|
|
230
|
+
await expect.element(editor).toHaveTextContent('Hello, world!');
|
|
231
|
+
await client.entities.flushAllBatches();
|
|
232
|
+
// Verdant did not capture the change in undo history.
|
|
233
|
+
expect(client.undoHistory.undoLength).toBe(0);
|
|
234
|
+
await userEvent.click(screen.getByTestId('undo'));
|
|
235
|
+
await expect.element(editor).toHaveTextContent('');
|
|
236
|
+
// notably, TipTap history doesn't seem to remove the paragraph node,
|
|
237
|
+
// but to the user this behaves as expected.
|
|
238
|
+
expect(testPost.get('requiredBody').getSnapshot()).toEqual({
|
|
239
|
+
type: 'doc',
|
|
240
|
+
attrs: {},
|
|
241
|
+
from: null,
|
|
242
|
+
to: null,
|
|
243
|
+
content: [
|
|
244
|
+
{
|
|
245
|
+
attrs: {},
|
|
246
|
+
content: [],
|
|
247
|
+
from: null,
|
|
248
|
+
marks: [],
|
|
249
|
+
text: null,
|
|
250
|
+
to: null,
|
|
251
|
+
type: 'paragraph',
|
|
252
|
+
},
|
|
253
|
+
],
|
|
254
|
+
marks: [],
|
|
255
|
+
text: null,
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
it('should initialize from an existing document', async () => {
|
|
259
|
+
const testPost = await client.posts.put({
|
|
260
|
+
requiredBody: {
|
|
261
|
+
type: 'doc',
|
|
262
|
+
content: [
|
|
263
|
+
{
|
|
264
|
+
type: 'paragraph',
|
|
265
|
+
content: [
|
|
266
|
+
{
|
|
267
|
+
type: 'text',
|
|
268
|
+
text: 'Hello, world!',
|
|
269
|
+
},
|
|
270
|
+
],
|
|
271
|
+
},
|
|
272
|
+
],
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
// reset history
|
|
276
|
+
await client.entities.flushAllBatches();
|
|
277
|
+
client.undoHistory.clear();
|
|
278
|
+
const TipTapTest = () => {
|
|
279
|
+
const editor = useSyncedEditor(testPost, 'requiredBody', {
|
|
280
|
+
editorOptions: {
|
|
281
|
+
extensions: [StarterKit.configure({ history: false })],
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
return (_jsxs("div", { children: [_jsx("div", { children: "Text editor:" }), _jsx(EditorContent, { style: {
|
|
285
|
+
width: 500,
|
|
286
|
+
height: 300,
|
|
287
|
+
}, editor: editor, id: "#editor", "data-testid": "editor" })] }));
|
|
288
|
+
};
|
|
289
|
+
const screen = await renderWithProvider(_jsx(TipTapTest, {}));
|
|
290
|
+
await expect.element(screen.getByTestId('editor')).toBeVisible();
|
|
291
|
+
const editor = screen.getByTestId('editor').getByRole('textbox');
|
|
292
|
+
await expect.element(editor).toHaveTextContent('');
|
|
293
|
+
await expect.element(editor).toHaveTextContent('Hello, world!');
|
|
294
|
+
});
|
|
150
295
|
//# sourceMappingURL=react.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.test.js","sourceRoot":"","sources":["../../../src/__browserTests__/react.test.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react.test.js","sourceRoot":"","sources":["../../../src/__browserTests__/react.test.tsx"],"names":[],"mappings":"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"}
|
package/dist/esm/fields.js
CHANGED
|
@@ -10,15 +10,8 @@ export function createTipTapFieldSchema(options) {
|
|
|
10
10
|
}
|
|
11
11
|
const baseField = schema.fields.object({
|
|
12
12
|
fields: {},
|
|
13
|
-
default: () => {
|
|
14
|
-
if (options.default === null) {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
return structuredClone(options.default);
|
|
18
|
-
},
|
|
19
|
-
nullable: options.default === null,
|
|
20
13
|
});
|
|
21
|
-
|
|
14
|
+
const nestedContent = schema.fields.replaceObjectFields(baseField, {
|
|
22
15
|
type: schema.fields.string(),
|
|
23
16
|
from: schema.fields.number({ nullable: true }),
|
|
24
17
|
to: schema.fields.number({ nullable: true }),
|
|
@@ -33,5 +26,30 @@ export function createTipTapFieldSchema(options) {
|
|
|
33
26
|
items: baseField,
|
|
34
27
|
}),
|
|
35
28
|
});
|
|
29
|
+
const rootField = schema.fields.object({
|
|
30
|
+
fields: {
|
|
31
|
+
type: schema.fields.string(),
|
|
32
|
+
from: schema.fields.number({ nullable: true }),
|
|
33
|
+
to: schema.fields.number({ nullable: true }),
|
|
34
|
+
attrs: schema.fields.map({
|
|
35
|
+
values: schema.fields.any(),
|
|
36
|
+
}),
|
|
37
|
+
content: schema.fields.array({
|
|
38
|
+
items: nestedContent,
|
|
39
|
+
}),
|
|
40
|
+
text: schema.fields.string({ nullable: true }),
|
|
41
|
+
marks: schema.fields.array({
|
|
42
|
+
items: nestedContent,
|
|
43
|
+
}),
|
|
44
|
+
},
|
|
45
|
+
default: () => {
|
|
46
|
+
if (options.default === null) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return structuredClone(options.default);
|
|
50
|
+
},
|
|
51
|
+
nullable: options.default === null,
|
|
52
|
+
});
|
|
53
|
+
return rootField;
|
|
36
54
|
}
|
|
37
55
|
//# sourceMappingURL=fields.js.map
|
package/dist/esm/fields.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/fields.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,MAAM,GAON,MAAM,qBAAqB,CAAC;AAoB7B;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAEvC;IACA,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAC;IACH,CAAC;
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/fields.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,MAAM,GAON,MAAM,qBAAqB,CAAC;AAoB7B;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAEvC;IACA,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QACtC,MAAM,EAAE,EAAE;KACV,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE;QAClE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC9C,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;SAC3B,CAAC;QACF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAC5B,KAAK,EAAE,SAAS;SAChB,CAAC;QACF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC9C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAC1B,KAAK,EAAE,SAAS;SAChB,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QACtC,MAAM,EAAE;YACP,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;YAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC9C,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;gBACxB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;aAC3B,CAAC;YACF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC5B,KAAK,EAAE,aAAa;aACpB,CAAC;YACF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC9C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC1B,KAAK,EAAE,aAAa;aACpB,CAAC;SACF;QACD,OAAO,EAAE,GAAG,EAAE;YACb,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC9B,OAAO,IAAI,CAAC;YACb,CAAC;YACD,OAAO,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,QAAQ,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI;KAClC,CAAC,CAAC;IAEH,OAAO,SAAgB,CAAC;AACzB,CAAC"}
|
package/dist/esm/plugins.d.ts
CHANGED
|
@@ -1,4 +1,27 @@
|
|
|
1
1
|
import { Extension } from '@tiptap/core';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { AnyEntity } from '@verdant-web/store';
|
|
3
|
+
export declare const NodeIdExtension: Extension<any, any>;
|
|
4
|
+
export declare const verdantIdAttribute = "data-verdant-oid";
|
|
5
|
+
export interface VerdantExtensionOptions {
|
|
6
|
+
parent: AnyEntity<any, any, any>;
|
|
7
|
+
fieldName: string | number;
|
|
8
|
+
nullDocumentDefault?: any;
|
|
9
|
+
batchConfig?: {
|
|
10
|
+
undoable?: boolean;
|
|
11
|
+
batchName?: string;
|
|
12
|
+
max?: number | null;
|
|
13
|
+
timeout?: number | null;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare const VerdantExtension: Extension<VerdantExtensionOptions, {
|
|
17
|
+
updating: boolean;
|
|
18
|
+
unsubscribe: (() => void) | null;
|
|
19
|
+
}>;
|
|
20
|
+
export type ValidEntityKey<Ent extends AnyEntity<any, any, any>> = Ent extends never ? string : Ent extends AnyEntity<any, any, infer Shape> ? keyof Shape : never;
|
|
21
|
+
export type EntitySnapshot<Ent extends AnyEntity<any, any, any>, Key extends ValidEntityKey<Ent>> = Ent extends AnyEntity<any, any, infer Snap> ? Key extends keyof Snap ? Snap[Key] : any : never;
|
|
22
|
+
export declare function createVerdantExtension<TEnt extends AnyEntity<any, any, any>, Key extends ValidEntityKey<TEnt>>(parent: TEnt, fieldName: Key, options?: Omit<VerdantExtensionOptions, 'parent' | 'fieldName' | 'nullDocumentDefault'> & {
|
|
23
|
+
nullDocumentDefault?: EntitySnapshot<TEnt, Key>;
|
|
24
|
+
}): Extension<VerdantExtensionOptions, {
|
|
25
|
+
updating: boolean;
|
|
26
|
+
unsubscribe: (() => void) | null;
|
|
27
|
+
}>;
|
package/dist/esm/plugins.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Extension } from '@tiptap/core';
|
|
2
2
|
import { Plugin, PluginKey } from '@tiptap/pm/state';
|
|
3
|
-
import {
|
|
3
|
+
import { assignOid, cloneDeep, maybeGetOid } from '@verdant-web/common';
|
|
4
|
+
import { getEntityClient, id, } from '@verdant-web/store';
|
|
4
5
|
const NodeIdPlugin = new Plugin({
|
|
5
6
|
key: new PluginKey('node-ids'),
|
|
6
7
|
appendTransaction: (_, oldState, newState) => {
|
|
@@ -31,30 +32,20 @@ const NodeIdPlugin = new Plugin({
|
|
|
31
32
|
return tr;
|
|
32
33
|
},
|
|
33
34
|
});
|
|
34
|
-
const
|
|
35
|
-
'blockquote',
|
|
36
|
-
'bulletList',
|
|
37
|
-
'codeBlock',
|
|
38
|
-
'heading',
|
|
39
|
-
'listItem',
|
|
40
|
-
'orderedList',
|
|
41
|
-
'paragraph',
|
|
42
|
-
'image',
|
|
43
|
-
'mention',
|
|
44
|
-
'table',
|
|
45
|
-
'taskList',
|
|
46
|
-
'taskItem',
|
|
47
|
-
'youtube',
|
|
48
|
-
];
|
|
49
|
-
export const NodeIdExtension = (options = {}) => Extension.create({
|
|
35
|
+
export const NodeIdExtension = Extension.create({
|
|
50
36
|
name: 'nodeId',
|
|
51
37
|
addProseMirrorPlugins() {
|
|
52
38
|
return [NodeIdPlugin];
|
|
53
39
|
},
|
|
40
|
+
addOptions() {
|
|
41
|
+
return {
|
|
42
|
+
types: [],
|
|
43
|
+
};
|
|
44
|
+
},
|
|
54
45
|
addGlobalAttributes() {
|
|
55
46
|
return [
|
|
56
47
|
{
|
|
57
|
-
types: options.
|
|
48
|
+
types: this.options.types,
|
|
58
49
|
attributes: {
|
|
59
50
|
id: {
|
|
60
51
|
default: null,
|
|
@@ -73,4 +64,190 @@ export const NodeIdExtension = (options = {}) => Extension.create({
|
|
|
73
64
|
];
|
|
74
65
|
},
|
|
75
66
|
});
|
|
67
|
+
export const verdantIdAttribute = 'data-verdant-oid';
|
|
68
|
+
export const VerdantExtension = Extension.create({
|
|
69
|
+
name: 'verdant',
|
|
70
|
+
addOptions() {
|
|
71
|
+
return {
|
|
72
|
+
parent: null,
|
|
73
|
+
fieldName: '',
|
|
74
|
+
nullDocumentDefault: null,
|
|
75
|
+
batchConfig: {
|
|
76
|
+
undoable: true,
|
|
77
|
+
batchName: 'tiptap',
|
|
78
|
+
max: null,
|
|
79
|
+
timeout: 600,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
addStorage() {
|
|
84
|
+
return {
|
|
85
|
+
updating: false,
|
|
86
|
+
unsubscribe: null,
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
addGlobalAttributes() {
|
|
90
|
+
const nodeTypes = this.extensions
|
|
91
|
+
.filter((ext) => ext.type === 'node')
|
|
92
|
+
.filter((ext) => ext.config.group !== 'inline')
|
|
93
|
+
.map((ext) => ext.name)
|
|
94
|
+
.filter((s) => s !== null);
|
|
95
|
+
return [
|
|
96
|
+
{
|
|
97
|
+
types: nodeTypes,
|
|
98
|
+
attributes: {
|
|
99
|
+
[verdantIdAttribute]: {
|
|
100
|
+
default: null,
|
|
101
|
+
keepOnSplit: false,
|
|
102
|
+
parseHTML: (element) => element.getAttribute(verdantIdAttribute),
|
|
103
|
+
renderHTML: (attributes) => {
|
|
104
|
+
if (!attributes[verdantIdAttribute])
|
|
105
|
+
return {};
|
|
106
|
+
return {
|
|
107
|
+
[verdantIdAttribute]: attributes[verdantIdAttribute],
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
];
|
|
114
|
+
},
|
|
115
|
+
onBeforeCreate() {
|
|
116
|
+
const { parent, fieldName, nullDocumentDefault } = this.options;
|
|
117
|
+
// validate options
|
|
118
|
+
if (!parent) {
|
|
119
|
+
throw new Error('VerdantOidExtension requires a parent entity');
|
|
120
|
+
}
|
|
121
|
+
if (!fieldName) {
|
|
122
|
+
throw new Error('VerdantOidExtension requires a field name');
|
|
123
|
+
}
|
|
124
|
+
const fieldSchema = parent.getFieldSchema(fieldName);
|
|
125
|
+
if (!fieldSchema) {
|
|
126
|
+
throw new Error(`VerdantOidExtension error: ${fieldName} is not a valid field of the parent entity`);
|
|
127
|
+
}
|
|
128
|
+
if (fieldSchema.type !== 'object') {
|
|
129
|
+
throw new Error(`VerdantOidExtension requires an object field for the document, ${fieldName} is a ${fieldSchema.type}`);
|
|
130
|
+
}
|
|
131
|
+
if (fieldSchema.nullable && !fieldSchema.default && !nullDocumentDefault) {
|
|
132
|
+
throw new Error('VerdantOidExtension requires a nullDocumentDefault for a nullable document field');
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
onCreate() {
|
|
136
|
+
const { parent, fieldName, nullDocumentDefault } = this.options;
|
|
137
|
+
// subscribe to field changes
|
|
138
|
+
let unsubscribe = null;
|
|
139
|
+
const updateFromField = (field) => {
|
|
140
|
+
if (this.editor && !this.editor.isDestroyed) {
|
|
141
|
+
this.storage.updating = true;
|
|
142
|
+
const { from, to } = this.editor.state.selection;
|
|
143
|
+
this.editor.commands.setContent(ensureDocShape(getFieldSnapshot(field, nullDocumentDefault, fieldName)), false);
|
|
144
|
+
this.editor.commands.setTextSelection({ from, to });
|
|
145
|
+
this.storage.updating = false;
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
const subscribeToDocumentChanges = () => {
|
|
149
|
+
const field = parent.get(fieldName);
|
|
150
|
+
if (field) {
|
|
151
|
+
unsubscribe = field.subscribe('changeDeep', (target, info) => {
|
|
152
|
+
if (!info.isLocal || target === field) {
|
|
153
|
+
updateFromField(field);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
updateFromField(field);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
this.storage.unsubscribe = parent.subscribe('change', (info) => {
|
|
160
|
+
unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe();
|
|
161
|
+
subscribeToDocumentChanges();
|
|
162
|
+
});
|
|
163
|
+
subscribeToDocumentChanges();
|
|
164
|
+
},
|
|
165
|
+
onUpdate() {
|
|
166
|
+
// this flag is set synchronously while applying changes from the entity
|
|
167
|
+
// to the editor. if it's true, we don't want to apply changes from the editor
|
|
168
|
+
// back to the entity again, making an infinite cycle.
|
|
169
|
+
if (this.storage.updating) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const newData = this.editor.getJSON();
|
|
173
|
+
const value = this.options.parent.get(this.options.fieldName);
|
|
174
|
+
if (!value) {
|
|
175
|
+
this.options.parent.set(this.options.fieldName, newData);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// re-assign oids to data objects so they can be diffed more effectively
|
|
179
|
+
// against existing data
|
|
180
|
+
consumeOidsAndAssignToSnapshots(newData);
|
|
181
|
+
// printAllOids(newData);
|
|
182
|
+
const client = getEntityClient(value);
|
|
183
|
+
client.batch(this.options.batchConfig).run(() => {
|
|
184
|
+
value.update(newData, {
|
|
185
|
+
merge: false,
|
|
186
|
+
dangerouslyDisableMerge: true,
|
|
187
|
+
replaceSubObjects: false,
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
onDestroy() {
|
|
193
|
+
var _a, _b;
|
|
194
|
+
(_b = (_a = this.storage).unsubscribe) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
export function createVerdantExtension(parent, fieldName, options) {
|
|
198
|
+
return VerdantExtension.configure(Object.assign({ parent, fieldName: fieldName }, options));
|
|
199
|
+
}
|
|
200
|
+
function consumeOidsAndAssignToSnapshots(doc) {
|
|
201
|
+
var _a;
|
|
202
|
+
if (((_a = doc.attrs) === null || _a === void 0 ? void 0 : _a[verdantIdAttribute]) !== undefined) {
|
|
203
|
+
assignOid(doc, doc.attrs[verdantIdAttribute]);
|
|
204
|
+
delete doc.attrs[verdantIdAttribute];
|
|
205
|
+
}
|
|
206
|
+
if (doc.content) {
|
|
207
|
+
doc.content.forEach(consumeOidsAndAssignToSnapshots);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// since the schema doesn't enforce this shape but it's
|
|
211
|
+
// needed for the editor to work, we'll ensure it here
|
|
212
|
+
function ensureDocShape(json) {
|
|
213
|
+
var _a;
|
|
214
|
+
for (const node of (_a = json.content) !== null && _a !== void 0 ? _a : []) {
|
|
215
|
+
// remove undefined nodes
|
|
216
|
+
node.content = node.content.filter((n) => !!n).map(ensureDocShape);
|
|
217
|
+
}
|
|
218
|
+
return json;
|
|
219
|
+
}
|
|
220
|
+
function getFieldSnapshot(field, nullDocumentDefault, fieldName) {
|
|
221
|
+
const content = field
|
|
222
|
+
? cloneDeep(field.getSnapshot())
|
|
223
|
+
: (nullDocumentDefault !== null && nullDocumentDefault !== void 0 ? nullDocumentDefault : null);
|
|
224
|
+
if (content === null) {
|
|
225
|
+
throw new Error(`The provided field "${String(fieldName)}" is null and a default document was not provided.
|
|
226
|
+
Please provide a default document or ensure the field is not null when calling useSyncedEditor, or make your
|
|
227
|
+
field schema non-null and specify a default document there.`);
|
|
228
|
+
}
|
|
229
|
+
addOidAttrs(content);
|
|
230
|
+
return content;
|
|
231
|
+
}
|
|
232
|
+
function addOidAttrs(doc) {
|
|
233
|
+
var _a;
|
|
234
|
+
const oid = maybeGetOid(doc);
|
|
235
|
+
if (oid) {
|
|
236
|
+
doc.attrs = (_a = doc.attrs) !== null && _a !== void 0 ? _a : {};
|
|
237
|
+
doc.attrs[verdantIdAttribute] = oid;
|
|
238
|
+
}
|
|
239
|
+
if (doc.content) {
|
|
240
|
+
doc.content.forEach(addOidAttrs);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function printAllOids(obj) {
|
|
244
|
+
if (obj && typeof obj === 'object') {
|
|
245
|
+
const oid = maybeGetOid(obj);
|
|
246
|
+
if (oid)
|
|
247
|
+
console.log(oid, obj);
|
|
248
|
+
for (const key in obj) {
|
|
249
|
+
printAllOids(obj[key]);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
76
253
|
//# sourceMappingURL=plugins.js.map
|
package/dist/esm/plugins.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/plugins.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/react.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { Editor } from '@tiptap/core';
|
|
2
1
|
import { UseEditorOptions } from '@tiptap/react';
|
|
3
2
|
import { AnyEntity } from '@verdant-web/store';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export declare function useSyncedEditor<Ent extends AnyEntity<any, any, any>, Key extends AllowedKey<Ent>>(parent: Ent, fieldName: Key, { editorOptions: extraOptions, editorDependencies, nullDocumentDefault, }?: {
|
|
3
|
+
import { VerdantExtensionOptions, type EntitySnapshot, type ValidEntityKey } from './plugins.js';
|
|
4
|
+
export declare function useSyncedEditor<Ent extends AnyEntity<any, any, any>, Key extends ValidEntityKey<Ent>>(parent: Ent, fieldName: Key, { editorOptions: extraOptions, editorDependencies, nullDocumentDefault, extensionOptions, }?: {
|
|
7
5
|
editorOptions?: UseEditorOptions;
|
|
8
6
|
editorDependencies?: any[];
|
|
9
7
|
nullDocumentDefault?: EntitySnapshot<Ent, Key>;
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
extensionOptions?: Partial<VerdantExtensionOptions>;
|
|
9
|
+
}): import("@tiptap/react").Editor | null;
|
package/dist/esm/react.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { useEditor } from '@tiptap/react';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
export function useSyncedEditor(parent, fieldName, { editorOptions: extraOptions, editorDependencies, nullDocumentDefault, } = {}) {
|
|
2
|
+
import { useRef, useState } from 'react';
|
|
3
|
+
import { VerdantExtension, } from './plugins.js';
|
|
4
|
+
export function useSyncedEditor(parent, fieldName, { editorOptions: extraOptions, editorDependencies, nullDocumentDefault, extensionOptions, } = {}) {
|
|
5
|
+
var _a;
|
|
5
6
|
const cachedOptions = useRef({
|
|
6
7
|
nullDocumentDefault,
|
|
7
8
|
fieldName,
|
|
@@ -10,75 +11,12 @@ export function useSyncedEditor(parent, fieldName, { editorOptions: extraOptions
|
|
|
10
11
|
nullDocumentDefault,
|
|
11
12
|
fieldName,
|
|
12
13
|
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
if (updatingRef.current) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const newData = editor.getJSON();
|
|
21
|
-
const value = parent.get(cachedOptions.current.fieldName);
|
|
22
|
-
if (!value) {
|
|
23
|
-
parent.set(cachedOptions.current.fieldName, newData);
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
value.update(newData, {
|
|
27
|
-
merge: false,
|
|
28
|
-
dangerouslyDisableMerge: true,
|
|
29
|
-
replaceSubObjects: false,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
const cachedInitialContent = useRef(ensureDocShape(getFieldSnapshot(field, nullDocumentDefault, fieldName)));
|
|
34
|
-
const editor = useEditor(Object.assign(Object.assign({}, extraOptions), { content: cachedInitialContent.current, onUpdate: (ctx) => {
|
|
35
|
-
var _a;
|
|
36
|
-
update(ctx.editor);
|
|
37
|
-
(_a = extraOptions === null || extraOptions === void 0 ? void 0 : extraOptions.onUpdate) === null || _a === void 0 ? void 0 : _a.call(extraOptions, ctx);
|
|
38
|
-
}, onContentError(props) {
|
|
14
|
+
// create a configured version of the Verdant extension, which handles
|
|
15
|
+
// the actual syncing of the editor content to the field
|
|
16
|
+
const [extension] = useState(() => VerdantExtension.configure(Object.assign({ parent, fieldName: fieldName, nullDocumentDefault }, extensionOptions)));
|
|
17
|
+
const editor = useEditor(Object.assign(Object.assign({}, extraOptions), { onContentError(props) {
|
|
39
18
|
console.error('Content error:', props.error);
|
|
40
|
-
} }), editorDependencies);
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
function updateFromField() {
|
|
43
|
-
if (editor && !editor.isDestroyed) {
|
|
44
|
-
updatingRef.current = true;
|
|
45
|
-
const { from, to } = editor.state.selection;
|
|
46
|
-
editor.commands.setContent(ensureDocShape(getFieldSnapshot(field, cachedOptions.current.nullDocumentDefault, cachedOptions.current.fieldName)), false);
|
|
47
|
-
editor.commands.setTextSelection({ from, to });
|
|
48
|
-
updatingRef.current = false;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
updateFromField();
|
|
52
|
-
return field === null || field === void 0 ? void 0 : field.subscribe('changeDeep', (target, info) => {
|
|
53
|
-
if (!info.isLocal || target === field) {
|
|
54
|
-
updateFromField();
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
}, [field, editor, cachedOptions]);
|
|
19
|
+
}, extensions: [extension, ...((_a = extraOptions === null || extraOptions === void 0 ? void 0 : extraOptions.extensions) !== null && _a !== void 0 ? _a : [])] }), editorDependencies);
|
|
58
20
|
return editor;
|
|
59
21
|
}
|
|
60
|
-
// since the schema doesn't enforce this shape but it's
|
|
61
|
-
// needed for the editor to work, we'll ensure it here
|
|
62
|
-
function ensureDocShape(json) {
|
|
63
|
-
var _a;
|
|
64
|
-
for (const node of (_a = json.content) !== null && _a !== void 0 ? _a : []) {
|
|
65
|
-
// remove undefined nodes
|
|
66
|
-
node.content = node.content.filter((n) => !!n).map(ensureDocShape);
|
|
67
|
-
}
|
|
68
|
-
return json;
|
|
69
|
-
}
|
|
70
|
-
function getFieldSnapshot(field, nullDocumentDefault, fieldName) {
|
|
71
|
-
const content = field ? field.getSnapshot() : (nullDocumentDefault !== null && nullDocumentDefault !== void 0 ? nullDocumentDefault : null);
|
|
72
|
-
if (content === null) {
|
|
73
|
-
throw new Error(`The provided field "${String(fieldName)}" is null and a default document was not provided.
|
|
74
|
-
Please provide a default document or ensure the field is not null when calling useSyncedEditor, or make your
|
|
75
|
-
field schema non-null and specify a default document there.`);
|
|
76
|
-
}
|
|
77
|
-
return content;
|
|
78
|
-
}
|
|
79
|
-
function useStableCallback(callback) {
|
|
80
|
-
const ref = useRef(callback);
|
|
81
|
-
ref.current = callback;
|
|
82
|
-
return useCallback((...args) => ref.current(...args), []);
|
|
83
|
-
}
|
|
84
22
|
//# sourceMappingURL=react.js.map
|