Skip to content

Commit 7ce072f

Browse files
committed
fix: fixed issues
1 parent 9a1c4c5 commit 7ce072f

13 files changed

Lines changed: 95 additions & 101 deletions

File tree

demo/src/components/Playground.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {
3232
wLatexBlockItemData,
3333
wLatexInlineItemData,
3434
} from '@gravity-ui/markdown-editor-latex-extension/configs';
35-
import {YfmPageConstructor} from '@gravity-ui/markdown-editor-page-constructor-extension';
35+
import {YfmPageConstructorExtension} from '@gravity-ui/markdown-editor-page-constructor-extension';
3636
import {wYfmPageConstructorItemData} from '@gravity-ui/markdown-editor-page-constructor-extension/configs';
3737
import {Button, DropdownMenu} from '@gravity-ui/uikit';
3838

@@ -214,7 +214,7 @@ export const Playground = memo<PlaygroundProps>((props) => {
214214
},
215215
theme: {dark: 'dark', light: 'forest'},
216216
})
217-
.use(YfmPageConstructor, {
217+
.use(YfmPageConstructorExtension, {
218218
autoSave: {
219219
enabled:
220220
storyAdditionalControls?.yfmPageConstructorAutoSaveEnabled ??

packages/page-constructor-extension/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ npm install @gravity-ui/markdown-editor @gravity-ui/uikit @gravity-ui/page-const
2121
### WYSIWYG extension
2222

2323
```typescript
24-
import {YfmPageConstructor} from '@gravity-ui/markdown-editor-page-constructor-extension';
24+
import {YfmPageConstructorExtension} from '@gravity-ui/markdown-editor-page-constructor-extension';
2525

26-
builder.use(YfmPageConstructor, {
26+
builder.use(YfmPageConstructorExtension, {
2727
autoSave: {enabled: true, delay: 1000},
2828
});
2929
```

packages/page-constructor-extension/src/extension/YfmPageConstructorNodeView/YfmPageConstructor.scss

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.g-md-YfmPageConstructor {
1+
.g-md-yfm-page-constructor {
22
position: relative;
33

44
display: flex;
@@ -15,7 +15,7 @@
1515
display: flex;
1616
}
1717

18-
&__Constructor {
18+
&__constructor {
1919
flex: 1 1 auto;
2020

2121
min-width: 0;
@@ -26,7 +26,7 @@
2626
}
2727
}
2828

29-
&__Error {
29+
&__error {
3030
flex: 1 1 auto;
3131

3232
font-family: var(--g-font-family-monospace);
@@ -36,7 +36,7 @@
3636
color: var(--g-color-text-danger);
3737
}
3838

39-
&__Preview {
39+
&__preview {
4040
flex: 1 1 auto;
4141

4242
min-width: 0;
@@ -47,7 +47,7 @@
4747
}
4848
}
4949

50-
&__Editor {
50+
&__editor {
5151
flex: 1 1 auto;
5252

5353
min-width: 320px;
@@ -56,15 +56,15 @@
5656
caret-color: auto;
5757
}
5858

59-
&__Controls {
59+
&__controls {
6060
display: flex;
6161
justify-content: flex-end;
6262
gap: 8px;
6363

6464
margin-top: 8px;
6565
}
6666

67-
&__Menu {
67+
&__menu {
6868
position: absolute;
6969
z-index: 10;
7070
top: 0;

packages/page-constructor-extension/src/extension/YfmPageConstructorNodeView/YfmPageConstructorPreview.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ export const YfmPageConstructorPreview: React.FC<{
4343

4444
if (!loadResult.success) {
4545
return (
46-
<div className={b('Error')}>
46+
<div className={b('error')}>
4747
<div>{String(loadResult.error)}</div>
4848
</div>
4949
);
5050
}
5151

5252
return (
53-
<div className={b('Preview')}>
53+
<div className={b('preview')}>
5454
<ErrorBoundary
5555
fallbackRender={({error}) => (
5656
<Flex justifyContent="center" alignItems="center" width="100%" height="100%">

packages/page-constructor-extension/src/extension/YfmPageConstructorNodeView/YfmPageConstructorView.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import type {TransformerOptions} from './YfmPageConstructorPreview';
2424
import './YfmPageConstructor.scss';
2525

2626
export {type TransformerOptions};
27-
export const cnYfmPageConstructor: (...args: unknown[]) => string = cn('YfmPageConstructor');
27+
export const cnYfmPageConstructor: (...args: unknown[]) => string = cn('yfm-page-constructor');
2828
export const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';
2929

3030
const b = cnYfmPageConstructor;
@@ -67,16 +67,16 @@ const PageConstructorEditMode: React.FC<{
6767
<YfmPageConstructorPreview
6868
text={value}
6969
transformerOptions={transformerOptions}
70-
className={b('Constructor')}
70+
className={b('constructor')}
7171
/>
72-
<div className={b('Editor')} style={{whiteSpace: 'nowrap', caretColor: 'auto'}}>
72+
<div className={b('editor')} style={{whiteSpace: 'nowrap', caretColor: 'auto'}}>
7373
<TextArea
7474
controlProps={{className: STOP_EVENT_CLASSNAME}}
7575
value={value}
7676
onUpdate={handleChange}
7777
autoFocus
7878
/>
79-
<Flex justifyContent="flex-end" spacing={{mt: 2}} className={b('Controls')}>
79+
<Flex justifyContent="flex-end" spacing={{mt: 2}} className={b('controls')}>
8080
<Button onClick={onCancel} view="flat">
8181
<span className={STOP_EVENT_CLASSNAME}>
8282
{isAutoSaveEnabled ? i18n('close') : i18n('cancel')}
@@ -152,10 +152,10 @@ export const YfmPageConstructorView: React.FC<{
152152
<YfmPageConstructorPreview
153153
text={content}
154154
transformerOptions={transformerOptions}
155-
className={b('Constructor')}
155+
className={b('constructor')}
156156
/>
157157
{canEdit && (
158-
<div className={b('Menu')}>
158+
<div className={b('menu')}>
159159
<Button
160160
size="s"
161161
onClick={toggleMenuOpen}

packages/page-constructor-extension/src/extension/YfmPageConstructorSpecs/const.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
import {entityIdAttr, nodeTypeFactory} from '@gravity-ui/markdown-editor';
22

3-
export enum YfmPageConstructorAttrs {
4-
// @ts-expect-error error TS18055
5-
EntityId = entityIdAttr,
6-
content = 'data-content',
7-
}
3+
export const YfmPageConstructorAttrs = {
4+
EntityId: entityIdAttr,
5+
content: 'data-content',
6+
} as const;
87

98
export const yfmPageConstructorNodeName = 'yfm-page-constructor';
109
export const yfmPageConstructorTokenName = 'yfm_page-constructor';
1110
export const yfmPageConstructorNodeType = nodeTypeFactory(yfmPageConstructorNodeName);
1211

13-
export const YfmPageConstructorAction = 'createYfmPageConstructor';
14-
1512
export const YfmPageConstructorConsts = {
1613
NodeName: yfmPageConstructorNodeName,
1714
NodeAttrs: YfmPageConstructorAttrs,

packages/page-constructor-extension/src/extension/YfmPageConstructorSpecs/index.tsx

Lines changed: 38 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {transform} from '@diplodoc/page-constructor-extension/plugin/csr';
2-
import type {ExtensionAuto, ExtensionNodeSpec} from '@gravity-ui/markdown-editor';
2+
import type {ExtensionAuto} from '@gravity-ui/markdown-editor';
33
import {generateEntityId} from '@gravity-ui/markdown-editor';
44

55
import {
@@ -11,65 +11,50 @@ import {
1111

1212
export {yfmPageConstructorNodeName, YfmPageConstructorConsts} from './const';
1313

14-
export type YfmPageConstructorSpecsOptions = {
15-
nodeView?: ExtensionNodeSpec['view'];
16-
};
17-
18-
const YfmPageConstructorSpecsExtension: ExtensionAuto<YfmPageConstructorSpecsOptions> = (
19-
builder,
20-
{nodeView},
21-
) => {
14+
export const YfmPageConstructorSpecsExtension: ExtensionAuto = (builder) => {
2215
builder
2316
.configureMd((md) => md.use(transform({bundle: false}), {}))
24-
.addNode(yfmPageConstructorNodeName, () => ({
25-
fromMd: {
26-
tokenName: yfmPageConstructorTokenName,
27-
tokenSpec: {
28-
name: yfmPageConstructorNodeName,
29-
type: 'node',
30-
noCloseToken: true,
31-
getAttrs: ({content}) => ({
32-
[YfmPageConstructorConsts.NodeAttrs.content]: content,
33-
[YfmPageConstructorConsts.NodeAttrs.EntityId]: generateEntityId(
34-
yfmPageConstructorNodeName,
35-
),
36-
}),
17+
.addNodeSpec(yfmPageConstructorNodeName, () => ({
18+
selectable: true,
19+
atom: true,
20+
group: 'block',
21+
attrs: {
22+
[YfmPageConstructorConsts.NodeAttrs.content]: {default: ''},
23+
[YfmPageConstructorConsts.NodeAttrs.EntityId]: {
24+
default: defaultYfmPageConstructorEntityId,
3725
},
3826
},
39-
spec: {
40-
selectable: true,
41-
atom: true,
42-
group: 'block',
43-
attrs: {
44-
[YfmPageConstructorConsts.NodeAttrs.content]: {default: ''},
45-
[YfmPageConstructorConsts.NodeAttrs.EntityId]: {
46-
default: defaultYfmPageConstructorEntityId,
47-
},
48-
},
49-
parseDOM: [],
50-
toDOM(node) {
51-
return ['div', node.attrs];
52-
},
53-
dnd: {props: {offset: [8, 1]}},
27+
parseDOM: [],
28+
toDOM(node) {
29+
return ['div', node.attrs];
5430
},
55-
toMd: (state, node) => {
56-
const content = String(
57-
node.attrs[YfmPageConstructorConsts.NodeAttrs.content] || '',
58-
);
59-
60-
state.write('::: page-constructor');
31+
dnd: {props: {offset: [8, 1]}},
32+
}))
33+
.addMarkdownTokenParserSpec(yfmPageConstructorTokenName, () => ({
34+
name: yfmPageConstructorNodeName,
35+
type: 'node',
36+
noCloseToken: true,
37+
getAttrs: ({content}) => ({
38+
[YfmPageConstructorConsts.NodeAttrs.content]: content,
39+
[YfmPageConstructorConsts.NodeAttrs.EntityId]: generateEntityId(
40+
yfmPageConstructorNodeName,
41+
),
42+
}),
43+
}))
44+
.addNodeSerializerSpec(yfmPageConstructorNodeName, () => (state, node) => {
45+
const content = String(node.attrs[YfmPageConstructorConsts.NodeAttrs.content] || '');
46+
47+
state.write('::: page-constructor');
48+
state.ensureNewLine();
49+
50+
if (content) {
51+
state.text(content.trimEnd(), false);
6152
state.ensureNewLine();
53+
}
6254

63-
if (content) {
64-
state.text(content.trimEnd(), false);
65-
state.ensureNewLine();
66-
}
67-
68-
state.write(':::');
69-
state.closeBlock(node);
70-
},
71-
view: nodeView,
72-
}));
55+
state.write(':::');
56+
state.closeBlock(node);
57+
});
7358
};
7459

7560
export const YfmPageConstructorSpecs = Object.assign(

packages/page-constructor-extension/src/extension/actions.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type {ActionSpec} from '@gravity-ui/markdown-editor';
22
import {SharedStateKey, generateEntityId, get$Cursor, pType} from '@gravity-ui/markdown-editor';
33
import type {Command} from '@gravity-ui/markdown-editor/pm/state';
44

5-
import {YfmPageConstructorConsts} from './YfmPageConstructorSpecs';
5+
import {YfmPageConstructorConsts} from './YfmPageConstructorSpecs/const';
66
import type {YfmPageConstructorEntitySharedState} from './types';
77

88
const defaultYfmPageConstructorContent = [
@@ -40,6 +40,9 @@ const createYfmPageConstructor: Command = (state, dispatch) => {
4040
};
4141

4242
export const addYfmPageConstructor: ActionSpec = {
43+
isActive() {
44+
return false;
45+
},
4346
isEnable(state) {
4447
return createYfmPageConstructor(state);
4548
},
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
export * from './YfmPageConstructorSpecs/const';
2+
3+
export const YfmPageConstructorAction = 'createYfmPageConstructor';

packages/page-constructor-extension/src/extension/index.ts

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,44 @@
1-
import type {
2-
Action,
3-
ExtensionAuto,
4-
ExtensionDeps,
5-
NodeViewConstructor,
6-
} from '@gravity-ui/markdown-editor';
1+
import type {Action, ExtensionAuto} from '@gravity-ui/markdown-editor';
2+
import {Plugin} from '@gravity-ui/markdown-editor/pm/state';
73

84
import {WYfmPageConstructorNodeView} from './YfmPageConstructorNodeView';
95
import type {TransformerOptions} from './YfmPageConstructorNodeView/YfmPageConstructorPreview';
106
export type {TransformerOptions as YfmPageConstructorTransformerOptions};
117
import {YfmPageConstructorSpecs} from './YfmPageConstructorSpecs';
12-
import {YfmPageConstructorAction} from './YfmPageConstructorSpecs/const';
8+
import {yfmPageConstructorNodeName} from './YfmPageConstructorSpecs/const';
139
import {addYfmPageConstructor} from './actions';
10+
import {YfmPageConstructorAction} from './const';
1411

1512
export type YfmPageConstructorOptions = {
13+
/** Whether the user can edit page-constructor blocks in WYSIWYG mode. @default true */
1614
canEdit?: boolean;
15+
/** Auto-save configuration for the YAML editor inside the node view. */
1716
autoSave?: {
17+
/** Enable auto-save. When true, changes are saved automatically after a delay. */
1818
enabled: boolean;
19+
/** Delay in milliseconds before auto-saving after the last edit. */
1920
delay?: number;
2021
};
22+
/** Options for server-side content transformation, or `false` to disable it. */
2123
transformerOptions?: TransformerOptions;
2224
};
2325

24-
function createNodeViewFactory(
25-
options: YfmPageConstructorOptions,
26-
): (deps: ExtensionDeps) => NodeViewConstructor {
27-
return () => (node, view, getPos) => {
28-
return new WYfmPageConstructorNodeView(node, view, getPos, options);
29-
};
30-
}
26+
export const YfmPageConstructorExtension: ExtensionAuto<YfmPageConstructorOptions> = (
27+
builder,
28+
options,
29+
) => {
30+
builder.use(YfmPageConstructorSpecs);
3131

32-
export const YfmPageConstructor: ExtensionAuto<YfmPageConstructorOptions> = (builder, options) => {
33-
builder.use(YfmPageConstructorSpecs, {
34-
nodeView: createNodeViewFactory(options),
32+
builder.addPlugin(() => {
33+
return new Plugin({
34+
props: {
35+
nodeViews: {
36+
[yfmPageConstructorNodeName]: (node, view, getPos) => {
37+
return new WYfmPageConstructorNodeView(node, view, getPos, options);
38+
},
39+
},
40+
},
41+
});
3542
});
3643

3744
builder.addAction(YfmPageConstructorAction, () => addYfmPageConstructor);

0 commit comments

Comments
 (0)