@modusoperandi/licit 1.4.3 → 1.4.7
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/BlockquoteInsertNewLineCommand.js.flow +70 -70
- package/BlockquoteNodeSpec.js.flow +29 -29
- package/BlockquoteToggleCommand.js.flow +56 -56
- package/BookmarkNodeSpec.js.flow +39 -39
- package/BulletListNodeSpec.js.flow +61 -61
- package/CZIProseMirror.js.flow +90 -90
- package/CodeBlockCommand.js.flow +65 -65
- package/CodeBlockNodeSpec.js.flow +24 -24
- package/CodeMarkSpec.js.flow +14 -14
- package/ContentPlaceholderPlugin.js.flow +183 -183
- package/CursorPlaceholderPlugin.js.flow +113 -113
- package/DocLayoutCommand.js.flow +97 -97
- package/DocNodeSpec.js.flow +62 -62
- package/EMMarkSpec.js.flow +39 -39
- package/EditorCommands.js.flow +124 -124
- package/EditorKeyMap.js.flow +173 -173
- package/EditorMarks.js +4 -2
- package/EditorMarks.js.flow +77 -74
- package/EditorNodes.js.flow +55 -55
- package/EditorPageLayoutPlugin.js.flow +67 -67
- package/EditorPlugins.js.flow +8 -8
- package/EditorSchema.js.flow +12 -12
- package/EditorState.js.flow +7 -7
- package/FontSizeMarkSpec.js.flow +54 -54
- package/FontTypeMarkSpec.js.flow +89 -89
- package/HTMLMutator.js.flow +58 -58
- package/HangingIndentMarkSpec.js +34 -0
- package/HangingIndentMarkSpec.js.flow +30 -0
- package/HardBreakNodeSpec.js.flow +15 -15
- package/HeadingNodeSpec.js.flow +42 -42
- package/HistoryRedoCommand.js.flow +41 -41
- package/HistoryUndoCommand.js.flow +41 -41
- package/HorizontalRuleCommand.js.flow +71 -71
- package/HorizontalRuleNodeSpec.js.flow +39 -39
- package/ImageUploadPlaceholderPlugin.js.flow +187 -187
- package/LICENSE +22 -22
- package/LinkMarkSpec.js +13 -3
- package/LinkMarkSpec.js.flow +41 -37
- package/LinkSetURLCommand.js.flow +129 -129
- package/LinkTooltipPlugin.js +34 -37
- package/LinkTooltipPlugin.js.flow +207 -217
- package/ListItemInsertNewLineCommand.js.flow +76 -76
- package/ListItemMergeCommand.js.flow +197 -197
- package/ListItemNodeSpec.js.flow +52 -52
- package/ListSplitCommand.js.flow +54 -54
- package/ListToggleCommand.js.flow +99 -99
- package/MarkNames.js +2 -1
- package/MarkNames.js.flow +20 -19
- package/MarksClearCommand.js.flow +66 -66
- package/NodeNames.js.flow +23 -23
- package/OrderedListNodeSpec.js.flow +131 -131
- package/OverrideMarkSpec.js.flow +49 -49
- package/ParagraphNodeSpec.js +21 -2
- package/ParagraphNodeSpec.js.flow +233 -215
- package/ParagraphSpacingCommand.js.flow +139 -139
- package/PrintCommand.js.flow +53 -53
- package/SelectionPlaceholderPlugin.js.flow +129 -129
- package/SpacerMarkSpec.js.flow +47 -47
- package/StrikeMarkSpec.js.flow +24 -24
- package/StrongMarkSpec.js.flow +39 -39
- package/StyleView.js.flow +18 -18
- package/TableBackgroundColorCommand.js.flow +79 -79
- package/TableBorderColorCommand.js +5 -3
- package/TableBorderColorCommand.js.flow +108 -106
- package/TableCellColorCommand.js.flow +73 -73
- package/TableCellMenuPlugin.js.flow +129 -129
- package/TableInsertCommand.js.flow +117 -117
- package/TableMergeCellsCommand.js.flow +113 -113
- package/TableNodesSpecs.js.flow +144 -144
- package/TablePlugins.js.flow +14 -14
- package/TableResizePlugin.js.flow +636 -636
- package/TextColorMarkSpec.js.flow +40 -40
- package/TextHighlightMarkSpec.js.flow +47 -47
- package/TextInsertTabSpaceCommand.js +0 -3
- package/TextInsertTabSpaceCommand.js.flow +103 -106
- package/TextNoWrapMarkSpec.js.flow +14 -14
- package/TextNodeSpec.js.flow +7 -7
- package/TextSelectionMarkSpec.js.flow +24 -24
- package/TextSubMarkSpec.js.flow +28 -28
- package/TextSuperMarkSpec.js.flow +28 -28
- package/TextUnderlineMarkSpec.js.flow +24 -24
- package/Types.js.flow +77 -77
- package/WebFontLoader.js.flow +22 -22
- package/blockQuoteInputRule.js.flow +36 -36
- package/bom.xml +9555 -9683
- package/browser.js.flow +7 -7
- package/buildEditorPlugins.js.flow +48 -48
- package/buildInputRules.js.flow +85 -85
- package/client/CollabConnector.js.flow +90 -90
- package/client/EditorConnection.js.flow +324 -324
- package/client/Licit.js +39 -39
- package/client/Licit.js.flow +649 -649
- package/client/Licit.test.js.flow +104 -104
- package/client/Reporter.js.flow +35 -35
- package/client/SimpleConnector.js.flow +61 -61
- package/client/http.js.flow +60 -60
- package/client/licit.css +12 -12
- package/client/throttle.js.flow +27 -27
- package/convertFromDOMElement.js.flow +33 -33
- package/convertFromHTML.js.flow +15 -15
- package/convertFromJSON.js.flow +53 -53
- package/convertToCSSPTValue.js.flow +19 -19
- package/convertToJSON.js.flow +7 -7
- package/createCommand.js.flow +62 -62
- package/createEditorKeyMap.js.flow +87 -87
- package/createEmptyEditorState.js.flow +29 -29
- package/createTableResizingPlugin.js.flow +86 -86
- package/findActionableCell.js.flow +74 -74
- package/findActiveMark.js.flow +32 -32
- package/hyphenize.js.flow +17 -17
- package/index.d.ts +167 -167
- package/index.js.flow +10 -10
- package/insertTable.js.flow +54 -54
- package/isEditorStateEmpty.js.flow +32 -32
- package/isTableNode.js.flow +15 -15
- package/joinDown.js.flow +25 -25
- package/joinListNode.js.flow +55 -55
- package/joinUp.js.flow +37 -37
- package/keymaps.js.flow +175 -175
- package/lookUpElement.js.flow +14 -14
- package/nodeAt.js.flow +12 -12
- package/normalizeHTML.js.flow +80 -80
- package/package.json +152 -152
- package/patchAnchorElements.js.flow +38 -38
- package/patchBreakElements.js.flow +22 -22
- package/patchElementInlineStyles.js.flow +92 -92
- package/patchListElements.js.flow +275 -275
- package/patchMathElements.js.flow +58 -58
- package/patchParagraphElements.js.flow +20 -20
- package/patchStyleElements.js.flow +197 -197
- package/patchTableElements.js.flow +88 -88
- package/rebaseDocWithSteps.js.flow +42 -42
- package/sanitizeURL.js.flow +13 -13
- package/splitListItem.js.flow +191 -191
- package/styles.css +46 -46
- package/toClosestFontPtSize.js.flow +22 -22
- package/toSafeHTMLDocument.js.flow +9 -9
- package/toggleBlockquote.js.flow +101 -101
- package/toggleCodeBlock.js.flow +102 -102
- package/ui/AlertInfo.js.flow +63 -63
- package/ui/BookmarkNodeView.js.flow +64 -64
- package/ui/CommandButton.js.flow +68 -68
- package/ui/CommandMenu.js.flow +74 -74
- package/ui/CommandMenuButton.js.flow +128 -128
- package/ui/CustomEditorView.js.flow +29 -29
- package/ui/CustomMenu.js.flow +14 -14
- package/ui/CustomMenuItem.js.flow +35 -35
- package/ui/CustomNodeView.js.flow +207 -207
- package/ui/CustomRadioButton.js.flow +63 -63
- package/ui/DocLayoutEditor.js.flow +130 -130
- package/ui/Editor.js.flow +281 -281
- package/ui/EditorFrameset.js.flow +79 -79
- package/ui/EditorToolbar.js.flow +197 -197
- package/ui/EditorToolbarConfig.js.flow +162 -162
- package/ui/FontSizeCommandMenuButton.js.flow +66 -66
- package/ui/FontTypeCommandMenuButton.js.flow +60 -60
- package/ui/Frag.js.flow +11 -11
- package/ui/Icon.js.flow +82 -82
- package/ui/ImageInlineEditor.js.flow +66 -66
- package/ui/KeyCodes.js.flow +12 -12
- package/ui/LinkTooltip.js.flow +51 -51
- package/ui/LinkURLEditor.js.flow +227 -227
- package/ui/ListItemNodeView.js.flow +101 -101
- package/ui/ListTypeButton.js.flow +121 -121
- package/ui/ListTypeCommandButton.js.flow +85 -85
- package/ui/ListTypeMenu.js.flow +78 -78
- package/ui/LoadingIndicator.js.flow +19 -19
- package/ui/PasteMenu.js.flow +52 -52
- package/ui/ResizeObserver.js.flow +105 -105
- package/ui/RichTextEditor.js.flow +133 -133
- package/ui/SelectionObserver.js.flow +134 -134
- package/ui/TableCellMenu.js.flow +49 -49
- package/ui/TableGridSizeEditor.js.flow +185 -185
- package/ui/TableNodeView.js.flow +36 -36
- package/ui/bindScrollHandler.js.flow +46 -46
- package/ui/canUseCSSFont.js.flow +42 -42
- package/ui/czi-body-layout-editor.css +16 -16
- package/ui/czi-bookmark-view.css +10 -10
- package/ui/czi-cursor-placeholder.css +36 -36
- package/ui/czi-custom-menu-button.css +18 -18
- package/ui/czi-custom-menu-item.css +30 -30
- package/ui/czi-custom-menu.css +8 -8
- package/ui/czi-custom-radio-button.css +80 -80
- package/ui/czi-custom-scrollbar.css +21 -21
- package/ui/czi-editor-frameset.css +81 -81
- package/ui/czi-editor-toolbar.css +122 -122
- package/ui/czi-editor.css +239 -216
- package/ui/czi-form.css +201 -201
- package/ui/czi-frag.css +3 -3
- package/ui/czi-heading.css +40 -40
- package/ui/czi-icon.css +72 -72
- package/ui/czi-image-resize-box.css +165 -165
- package/ui/czi-image-upload-editor.css +57 -57
- package/ui/czi-image-upload-placeholder.css +50 -50
- package/ui/czi-image-url-editor.css +38 -38
- package/ui/czi-image-view.css +121 -121
- package/ui/czi-indent.css +137 -137
- package/ui/czi-inline-editor.css +20 -20
- package/ui/czi-link-tooltip.css +112 -112
- package/ui/czi-list.css +406 -406
- package/ui/czi-loading-indicator.css +66 -66
- package/ui/czi-math-view.css +62 -62
- package/ui/czi-selection-placeholder.css +24 -24
- package/ui/czi-table-cell-menu.css +16 -16
- package/ui/czi-table-grid-size-editor.css +37 -37
- package/ui/czi-table.css +89 -89
- package/ui/czi-vars.css +47 -45
- package/ui/findActiveFontSize.js.flow +55 -55
- package/ui/findActiveFontType.js.flow +35 -35
- package/ui/fonts.css +460 -460
- package/ui/handleEditorDrop.js.flow +28 -28
- package/ui/handleEditorKeyDown.js.flow +39 -39
- package/ui/handleEditorPaste.js.flow +33 -33
- package/ui/htmlElementToRect.js.flow +18 -18
- package/ui/icon-font.css +9 -9
- package/ui/injectStyleSheet.js.flow +40 -40
- package/ui/isElementFullyVisible.js.flow +14 -14
- package/ui/isOffline.js.flow +8 -8
- package/ui/isReactClass.js.flow +12 -12
- package/ui/listType.css +21 -21
- package/ui/resolveImage.js.flow +121 -121
- package/ui/toCSSColor.js.flow +51 -51
- package/ui/toCSSLineSpacing.js.flow +53 -53
- package/ui/toHexColor.js.flow +26 -26
- package/ui/uuid.js.flow +9 -9
- package/uuid.js.flow +9 -9
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
import Licit, { DataType } from './Licit';
|
|
2
|
-
import RichTextEditor from '../ui/RichTextEditor';
|
|
3
|
-
import { noop } from '@modusoperandi/licit-ui-commands';
|
|
4
|
-
|
|
5
|
-
describe('<Licit />', () => {
|
|
6
|
-
const data = {
|
|
7
|
-
type: 'doc',
|
|
8
|
-
content: [
|
|
9
|
-
{
|
|
10
|
-
type: 'paragraph',
|
|
11
|
-
content: [{ type: 'text', text: ' ' }],
|
|
12
|
-
},
|
|
13
|
-
],
|
|
14
|
-
onReady: () => {},
|
|
15
|
-
autoFocus: true,
|
|
16
|
-
children: '',
|
|
17
|
-
className: 'licit',
|
|
18
|
-
disabled: true,
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const fakeEditorView = {
|
|
22
|
-
focus: noop,
|
|
23
|
-
dispatch: noop,
|
|
24
|
-
state: {
|
|
25
|
-
doc: {
|
|
26
|
-
content: { size: 10 },
|
|
27
|
-
resolve: () => ({
|
|
28
|
-
min: () => 0,
|
|
29
|
-
max: () => 10,
|
|
30
|
-
parent: { inlineContent: true },
|
|
31
|
-
}),
|
|
32
|
-
toJSON: () => data,
|
|
33
|
-
},
|
|
34
|
-
tr: {
|
|
35
|
-
setSelection: () => fakeEditorView.state.tr,
|
|
36
|
-
scrollIntoView: noop,
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
it('should render a <RichTextEditor /> ', () => {
|
|
42
|
-
const wrapper = new RichTextEditor({data});
|
|
43
|
-
wrapper.props = {
|
|
44
|
-
type: 'doc',
|
|
45
|
-
content: [
|
|
46
|
-
{
|
|
47
|
-
type: 'paragraph',
|
|
48
|
-
content: [{ type: 'text', text: ' ' }],
|
|
49
|
-
},
|
|
50
|
-
],
|
|
51
|
-
onReady:() => {},
|
|
52
|
-
autoFocus:true,
|
|
53
|
-
children:'',
|
|
54
|
-
className:'licit',
|
|
55
|
-
disabled:true,
|
|
56
|
-
};
|
|
57
|
-
expect(wrapper.render()).toBeTruthy();
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
describe('editorView (getter)', () => {
|
|
61
|
-
it('should return the prosemirror view', () => {
|
|
62
|
-
const wrapper = new RichTextEditor({data});
|
|
63
|
-
wrapper.props = {
|
|
64
|
-
type: 'doc',
|
|
65
|
-
content: [
|
|
66
|
-
{
|
|
67
|
-
type: 'paragraph',
|
|
68
|
-
content: [{ type: 'text', text: ' ' }],
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
onReady:() => {},
|
|
72
|
-
autoFocus:true,
|
|
73
|
-
children:'',
|
|
74
|
-
className:'licit',
|
|
75
|
-
disabled:true,
|
|
76
|
-
};
|
|
77
|
-
expect(wrapper._onReady(fakeEditorView)).toBeUndefined();
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
describe('<Licit with HTML input/>', () => {
|
|
83
|
-
let wrapper;
|
|
84
|
-
const HELLO = 'Hello ';
|
|
85
|
-
const WORLD = 'World';
|
|
86
|
-
const data =
|
|
87
|
-
'<p stylename="None">' +
|
|
88
|
-
HELLO +
|
|
89
|
-
'<strong overridden="false">' +
|
|
90
|
-
WORLD +
|
|
91
|
-
'</strong></p>';
|
|
92
|
-
|
|
93
|
-
beforeEach(() => {
|
|
94
|
-
wrapper = new Licit({ data }, DataType.HTML);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('should render a <RichTextEditor /> ', () => {
|
|
98
|
-
expect(wrapper.render()).toBeTruthy();
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it('should match state text content with the passed in text ', () => {
|
|
102
|
-
expect(wrapper.state.editorState.doc.textContent).toBe('');
|
|
103
|
-
});
|
|
104
|
-
});
|
|
1
|
+
import Licit, { DataType } from './Licit';
|
|
2
|
+
import RichTextEditor from '../ui/RichTextEditor';
|
|
3
|
+
import { noop } from '@modusoperandi/licit-ui-commands';
|
|
4
|
+
|
|
5
|
+
describe('<Licit />', () => {
|
|
6
|
+
const data = {
|
|
7
|
+
type: 'doc',
|
|
8
|
+
content: [
|
|
9
|
+
{
|
|
10
|
+
type: 'paragraph',
|
|
11
|
+
content: [{ type: 'text', text: ' ' }],
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
onReady: () => {},
|
|
15
|
+
autoFocus: true,
|
|
16
|
+
children: '',
|
|
17
|
+
className: 'licit',
|
|
18
|
+
disabled: true,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const fakeEditorView = {
|
|
22
|
+
focus: noop,
|
|
23
|
+
dispatch: noop,
|
|
24
|
+
state: {
|
|
25
|
+
doc: {
|
|
26
|
+
content: { size: 10 },
|
|
27
|
+
resolve: () => ({
|
|
28
|
+
min: () => 0,
|
|
29
|
+
max: () => 10,
|
|
30
|
+
parent: { inlineContent: true },
|
|
31
|
+
}),
|
|
32
|
+
toJSON: () => data,
|
|
33
|
+
},
|
|
34
|
+
tr: {
|
|
35
|
+
setSelection: () => fakeEditorView.state.tr,
|
|
36
|
+
scrollIntoView: noop,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
it('should render a <RichTextEditor /> ', () => {
|
|
42
|
+
const wrapper = new RichTextEditor({data});
|
|
43
|
+
wrapper.props = {
|
|
44
|
+
type: 'doc',
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: 'paragraph',
|
|
48
|
+
content: [{ type: 'text', text: ' ' }],
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
onReady:() => {},
|
|
52
|
+
autoFocus:true,
|
|
53
|
+
children:'',
|
|
54
|
+
className:'licit',
|
|
55
|
+
disabled:true,
|
|
56
|
+
};
|
|
57
|
+
expect(wrapper.render()).toBeTruthy();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe('editorView (getter)', () => {
|
|
61
|
+
it('should return the prosemirror view', () => {
|
|
62
|
+
const wrapper = new RichTextEditor({data});
|
|
63
|
+
wrapper.props = {
|
|
64
|
+
type: 'doc',
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: 'paragraph',
|
|
68
|
+
content: [{ type: 'text', text: ' ' }],
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
onReady:() => {},
|
|
72
|
+
autoFocus:true,
|
|
73
|
+
children:'',
|
|
74
|
+
className:'licit',
|
|
75
|
+
disabled:true,
|
|
76
|
+
};
|
|
77
|
+
expect(wrapper._onReady(fakeEditorView)).toBeUndefined();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe('<Licit with HTML input/>', () => {
|
|
83
|
+
let wrapper;
|
|
84
|
+
const HELLO = 'Hello ';
|
|
85
|
+
const WORLD = 'World';
|
|
86
|
+
const data =
|
|
87
|
+
'<p stylename="None">' +
|
|
88
|
+
HELLO +
|
|
89
|
+
'<strong overridden="false">' +
|
|
90
|
+
WORLD +
|
|
91
|
+
'</strong></p>';
|
|
92
|
+
|
|
93
|
+
beforeEach(() => {
|
|
94
|
+
wrapper = new Licit({ data }, DataType.HTML);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('should render a <RichTextEditor /> ', () => {
|
|
98
|
+
expect(wrapper.render()).toBeTruthy();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('should match state text content with the passed in text ', () => {
|
|
102
|
+
expect(wrapper.state.editorState.doc.textContent).toBe('');
|
|
103
|
+
});
|
|
104
|
+
});
|
package/client/Reporter.js.flow
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
class Reporter {
|
|
2
|
-
constructor() {
|
|
3
|
-
this.setAt = 0;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
clearState() {
|
|
7
|
-
if (this.state) {
|
|
8
|
-
this.state = this.node = null;
|
|
9
|
-
this.setAt = 0;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
failure(err) {
|
|
14
|
-
console.error('fail', err.toString());
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
delay(err) {
|
|
18
|
-
if (this.state == 'fail') return;
|
|
19
|
-
console.info('delay', err.toString());
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
show(type, message) {
|
|
23
|
-
this.clearState();
|
|
24
|
-
this.state = type;
|
|
25
|
-
this.setAt = Date.now();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
success() {
|
|
29
|
-
if (this.state == 'fail' && this.setAt > Date.now() - 1000 * 10)
|
|
30
|
-
setTimeout(() => this.success(), 5000);
|
|
31
|
-
else this.clearState();
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export default Reporter;
|
|
1
|
+
class Reporter {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.setAt = 0;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
clearState() {
|
|
7
|
+
if (this.state) {
|
|
8
|
+
this.state = this.node = null;
|
|
9
|
+
this.setAt = 0;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
failure(err) {
|
|
14
|
+
console.error('fail', err.toString());
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
delay(err) {
|
|
18
|
+
if (this.state == 'fail') return;
|
|
19
|
+
console.info('delay', err.toString());
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
show(type, message) {
|
|
23
|
+
this.clearState();
|
|
24
|
+
this.state = type;
|
|
25
|
+
this.setAt = Date.now();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
success() {
|
|
29
|
+
if (this.state == 'fail' && this.setAt > Date.now() - 1000 * 10)
|
|
30
|
+
setTimeout(() => this.success(), 5000);
|
|
31
|
+
else this.clearState();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default Reporter;
|
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { EditorState } from 'prosemirror-state';
|
|
4
|
-
import { Transform } from 'prosemirror-transform';
|
|
5
|
-
import { Schema } from 'prosemirror-model';
|
|
6
|
-
import { EditorView } from 'prosemirror-view';
|
|
7
|
-
import ReactDOM from 'react-dom';
|
|
8
|
-
|
|
9
|
-
export type SetStateCall = (
|
|
10
|
-
state: { editorState: EditorState },
|
|
11
|
-
callback: Function
|
|
12
|
-
) => void;
|
|
13
|
-
|
|
14
|
-
class SimpleConnector {
|
|
15
|
-
_setState: SetStateCall;
|
|
16
|
-
_editorState: EditorState;
|
|
17
|
-
// This flag is used to deteremine if data passed in or not
|
|
18
|
-
// If not passed in, use the data from collab server when in collab mode.
|
|
19
|
-
// else use empty content.
|
|
20
|
-
_dataDefined: boolean;
|
|
21
|
-
|
|
22
|
-
constructor(editorState: EditorState, setState: SetStateCall) {
|
|
23
|
-
this._editorState = editorState;
|
|
24
|
-
this._setState = setState;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
onEdit = (transaction: Transform, view: EditorView): void => {
|
|
28
|
-
ReactDOM.unstable_batchedUpdates(() => {
|
|
29
|
-
const editorState = this._editorState.apply(transaction);
|
|
30
|
-
// [FS] IRAD-1236 2020-03-05
|
|
31
|
-
// The state property should not be directly mutated. Use the updateState method.
|
|
32
|
-
if (view) {
|
|
33
|
-
view.updateState(editorState);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const state = {
|
|
37
|
-
editorState,
|
|
38
|
-
data: transaction.doc.toJSON(),
|
|
39
|
-
};
|
|
40
|
-
this._setState(state, () => {
|
|
41
|
-
this._editorState = editorState;
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// FS IRAD-989 2020-18-06
|
|
47
|
-
// updating properties should automatically render the changes
|
|
48
|
-
getState = (): EditorState => {
|
|
49
|
-
return this._editorState;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
// FS IRAD-1040 2020-09-02
|
|
53
|
-
// Send the modified schema to server
|
|
54
|
-
updateSchema = (schema: Schema, data: any) => {};
|
|
55
|
-
|
|
56
|
-
updateContent = (data: any) => {};
|
|
57
|
-
|
|
58
|
-
cleanUp = () => {};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export default SimpleConnector;
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import { EditorState } from 'prosemirror-state';
|
|
4
|
+
import { Transform } from 'prosemirror-transform';
|
|
5
|
+
import { Schema } from 'prosemirror-model';
|
|
6
|
+
import { EditorView } from 'prosemirror-view';
|
|
7
|
+
import ReactDOM from 'react-dom';
|
|
8
|
+
|
|
9
|
+
export type SetStateCall = (
|
|
10
|
+
state: { editorState: EditorState },
|
|
11
|
+
callback: Function
|
|
12
|
+
) => void;
|
|
13
|
+
|
|
14
|
+
class SimpleConnector {
|
|
15
|
+
_setState: SetStateCall;
|
|
16
|
+
_editorState: EditorState;
|
|
17
|
+
// This flag is used to deteremine if data passed in or not
|
|
18
|
+
// If not passed in, use the data from collab server when in collab mode.
|
|
19
|
+
// else use empty content.
|
|
20
|
+
_dataDefined: boolean;
|
|
21
|
+
|
|
22
|
+
constructor(editorState: EditorState, setState: SetStateCall) {
|
|
23
|
+
this._editorState = editorState;
|
|
24
|
+
this._setState = setState;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
onEdit = (transaction: Transform, view: EditorView): void => {
|
|
28
|
+
ReactDOM.unstable_batchedUpdates(() => {
|
|
29
|
+
const editorState = this._editorState.apply(transaction);
|
|
30
|
+
// [FS] IRAD-1236 2020-03-05
|
|
31
|
+
// The state property should not be directly mutated. Use the updateState method.
|
|
32
|
+
if (view) {
|
|
33
|
+
view.updateState(editorState);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const state = {
|
|
37
|
+
editorState,
|
|
38
|
+
data: transaction.doc.toJSON(),
|
|
39
|
+
};
|
|
40
|
+
this._setState(state, () => {
|
|
41
|
+
this._editorState = editorState;
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// FS IRAD-989 2020-18-06
|
|
47
|
+
// updating properties should automatically render the changes
|
|
48
|
+
getState = (): EditorState => {
|
|
49
|
+
return this._editorState;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// FS IRAD-1040 2020-09-02
|
|
53
|
+
// Send the modified schema to server
|
|
54
|
+
updateSchema = (schema: Schema, data: any) => {};
|
|
55
|
+
|
|
56
|
+
updateContent = (data: any) => {};
|
|
57
|
+
|
|
58
|
+
cleanUp = () => {};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export default SimpleConnector;
|
package/client/http.js.flow
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
// A simple wrapper for XHR.
|
|
2
|
-
export function req(conf) {
|
|
3
|
-
const req = new XMLHttpRequest(),
|
|
4
|
-
aborted = false;
|
|
5
|
-
const result = new Promise((success, failure) => {
|
|
6
|
-
req.open(conf.method, conf.url, true);
|
|
7
|
-
req.addEventListener('load', () => {
|
|
8
|
-
if (aborted) return;
|
|
9
|
-
if (req.status < 400) {
|
|
10
|
-
success(req.responseText);
|
|
11
|
-
} else {
|
|
12
|
-
const text = req.responseText;
|
|
13
|
-
const err = new Error(
|
|
14
|
-
'Request failed: ' + req.statusText + (text ? '\n\n' + text : '')
|
|
15
|
-
);
|
|
16
|
-
err.status = req.status;
|
|
17
|
-
|
|
18
|
-
failure(err);
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
req.addEventListener('error', () => {
|
|
22
|
-
if (!aborted) failure(new Error('Network error'));
|
|
23
|
-
});
|
|
24
|
-
if (conf.headers)
|
|
25
|
-
for (const header in conf.headers)
|
|
26
|
-
req.setRequestHeader(header, conf.headers[header]);
|
|
27
|
-
req.send(conf.body || null);
|
|
28
|
-
});
|
|
29
|
-
result.abort = () => {
|
|
30
|
-
if (!aborted) {
|
|
31
|
-
req.abort();
|
|
32
|
-
aborted = true;
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
return result;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function GET(url) {
|
|
39
|
-
return req({ url, method: 'GET' });
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function POST(url, body, type) {
|
|
43
|
-
return req({ url, method: 'POST', body, headers: { 'Content-Type': type } });
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function PUT(url, body, type) {
|
|
47
|
-
return req({ url, method: 'PUT', body, headers: { 'Content-Type': type } });
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// [FS] IRAD-1128 2021-02-03
|
|
51
|
-
// http DELETE request overrided
|
|
52
|
-
export function DELETE(url, type) {
|
|
53
|
-
return req({ url, method: 'DELETE', headers: { 'Content-Type': type } });
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// [FS] IRAD-1128 2021-02-03
|
|
57
|
-
// http PATCH request overrided
|
|
58
|
-
export function PATCH(url, body, type) {
|
|
59
|
-
return req({ url, method: 'PATCH', body, headers: { 'Content-Type': type } });
|
|
60
|
-
}
|
|
1
|
+
// A simple wrapper for XHR.
|
|
2
|
+
export function req(conf) {
|
|
3
|
+
const req = new XMLHttpRequest(),
|
|
4
|
+
aborted = false;
|
|
5
|
+
const result = new Promise((success, failure) => {
|
|
6
|
+
req.open(conf.method, conf.url, true);
|
|
7
|
+
req.addEventListener('load', () => {
|
|
8
|
+
if (aborted) return;
|
|
9
|
+
if (req.status < 400) {
|
|
10
|
+
success(req.responseText);
|
|
11
|
+
} else {
|
|
12
|
+
const text = req.responseText;
|
|
13
|
+
const err = new Error(
|
|
14
|
+
'Request failed: ' + req.statusText + (text ? '\n\n' + text : '')
|
|
15
|
+
);
|
|
16
|
+
err.status = req.status;
|
|
17
|
+
|
|
18
|
+
failure(err);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
req.addEventListener('error', () => {
|
|
22
|
+
if (!aborted) failure(new Error('Network error'));
|
|
23
|
+
});
|
|
24
|
+
if (conf.headers)
|
|
25
|
+
for (const header in conf.headers)
|
|
26
|
+
req.setRequestHeader(header, conf.headers[header]);
|
|
27
|
+
req.send(conf.body || null);
|
|
28
|
+
});
|
|
29
|
+
result.abort = () => {
|
|
30
|
+
if (!aborted) {
|
|
31
|
+
req.abort();
|
|
32
|
+
aborted = true;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function GET(url) {
|
|
39
|
+
return req({ url, method: 'GET' });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function POST(url, body, type) {
|
|
43
|
+
return req({ url, method: 'POST', body, headers: { 'Content-Type': type } });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function PUT(url, body, type) {
|
|
47
|
+
return req({ url, method: 'PUT', body, headers: { 'Content-Type': type } });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// [FS] IRAD-1128 2021-02-03
|
|
51
|
+
// http DELETE request overrided
|
|
52
|
+
export function DELETE(url, type) {
|
|
53
|
+
return req({ url, method: 'DELETE', headers: { 'Content-Type': type } });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// [FS] IRAD-1128 2021-02-03
|
|
57
|
+
// http PATCH request overrided
|
|
58
|
+
export function PATCH(url, body, type) {
|
|
59
|
+
return req({ url, method: 'PATCH', body, headers: { 'Content-Type': type } });
|
|
60
|
+
}
|
package/client/licit.css
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
html {
|
|
2
|
-
background: #fff;
|
|
3
|
-
border: 0;
|
|
4
|
-
border: none;
|
|
5
|
-
margin: 0;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
body {
|
|
9
|
-
background: #fff;
|
|
10
|
-
border: none;
|
|
11
|
-
margin: 0;
|
|
12
|
-
}
|
|
1
|
+
html {
|
|
2
|
+
background: #fff;
|
|
3
|
+
border: 0;
|
|
4
|
+
border: none;
|
|
5
|
+
margin: 0;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
body {
|
|
9
|
+
background: #fff;
|
|
10
|
+
border: none;
|
|
11
|
+
margin: 0;
|
|
12
|
+
}
|
package/client/throttle.js.flow
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
export default function throttle(
|
|
4
|
-
fn: Function,
|
|
5
|
-
threshhold: number,
|
|
6
|
-
context: any
|
|
7
|
-
): Function {
|
|
8
|
-
let last;
|
|
9
|
-
let deferTimer: window.TimeoutID;
|
|
10
|
-
const boundFn = fn.bind(context);
|
|
11
|
-
|
|
12
|
-
return function () {
|
|
13
|
-
const now = Date.now();
|
|
14
|
-
const args = Array.prototype.slice.call(arguments);
|
|
15
|
-
if (last && now < last + threshhold) {
|
|
16
|
-
// hold on to it
|
|
17
|
-
clearTimeout(deferTimer);
|
|
18
|
-
deferTimer = setTimeout(() => {
|
|
19
|
-
last = now;
|
|
20
|
-
boundFn(...args);
|
|
21
|
-
}, threshhold);
|
|
22
|
-
} else {
|
|
23
|
-
last = now;
|
|
24
|
-
boundFn(...args);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
}
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
export default function throttle(
|
|
4
|
+
fn: Function,
|
|
5
|
+
threshhold: number,
|
|
6
|
+
context: any
|
|
7
|
+
): Function {
|
|
8
|
+
let last;
|
|
9
|
+
let deferTimer: window.TimeoutID;
|
|
10
|
+
const boundFn = fn.bind(context);
|
|
11
|
+
|
|
12
|
+
return function () {
|
|
13
|
+
const now = Date.now();
|
|
14
|
+
const args = Array.prototype.slice.call(arguments);
|
|
15
|
+
if (last && now < last + threshhold) {
|
|
16
|
+
// hold on to it
|
|
17
|
+
clearTimeout(deferTimer);
|
|
18
|
+
deferTimer = setTimeout(() => {
|
|
19
|
+
last = now;
|
|
20
|
+
boundFn(...args);
|
|
21
|
+
}, threshhold);
|
|
22
|
+
} else {
|
|
23
|
+
last = now;
|
|
24
|
+
boundFn(...args);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { DOMParser, Schema } from 'prosemirror-model';
|
|
4
|
-
import { EditorState, Plugin } from 'prosemirror-state';
|
|
5
|
-
import { getAttrs } from './DocNodeSpec.js';
|
|
6
|
-
import EditorPlugins from './EditorPlugins.js';
|
|
7
|
-
import EditorSchema from './EditorSchema.js';
|
|
8
|
-
|
|
9
|
-
export default function convertFromDOMElement(
|
|
10
|
-
el: HTMLElement,
|
|
11
|
-
schema: Schema,
|
|
12
|
-
plugins: Array<Plugin>
|
|
13
|
-
): EditorState {
|
|
14
|
-
const effectiveSchema = schema || EditorSchema;
|
|
15
|
-
const effectivePlugins = plugins || EditorPlugins;
|
|
16
|
-
const bodyEl = el.querySelector('body');
|
|
17
|
-
|
|
18
|
-
// https://prosemirror.net/docs/ref/#model.ParseOptions.preserveWhitespace
|
|
19
|
-
const doc = DOMParser.fromSchema(effectiveSchema).parse(el, {
|
|
20
|
-
preserveWhitespace: true,
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
if (bodyEl) {
|
|
24
|
-
// Unfortunately the root node `doc` does not supoort `parseDOM`, thus
|
|
25
|
-
// we'd have to assign its `attrs` manually.
|
|
26
|
-
doc.attrs = getAttrs(bodyEl);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return EditorState.create({
|
|
30
|
-
doc,
|
|
31
|
-
plugins: effectivePlugins,
|
|
32
|
-
});
|
|
33
|
-
}
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import { DOMParser, Schema } from 'prosemirror-model';
|
|
4
|
+
import { EditorState, Plugin } from 'prosemirror-state';
|
|
5
|
+
import { getAttrs } from './DocNodeSpec.js';
|
|
6
|
+
import EditorPlugins from './EditorPlugins.js';
|
|
7
|
+
import EditorSchema from './EditorSchema.js';
|
|
8
|
+
|
|
9
|
+
export default function convertFromDOMElement(
|
|
10
|
+
el: HTMLElement,
|
|
11
|
+
schema: Schema,
|
|
12
|
+
plugins: Array<Plugin>
|
|
13
|
+
): EditorState {
|
|
14
|
+
const effectiveSchema = schema || EditorSchema;
|
|
15
|
+
const effectivePlugins = plugins || EditorPlugins;
|
|
16
|
+
const bodyEl = el.querySelector('body');
|
|
17
|
+
|
|
18
|
+
// https://prosemirror.net/docs/ref/#model.ParseOptions.preserveWhitespace
|
|
19
|
+
const doc = DOMParser.fromSchema(effectiveSchema).parse(el, {
|
|
20
|
+
preserveWhitespace: true,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
if (bodyEl) {
|
|
24
|
+
// Unfortunately the root node `doc` does not supoort `parseDOM`, thus
|
|
25
|
+
// we'd have to assign its `attrs` manually.
|
|
26
|
+
doc.attrs = getAttrs(bodyEl);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return EditorState.create({
|
|
30
|
+
doc,
|
|
31
|
+
plugins: effectivePlugins,
|
|
32
|
+
});
|
|
33
|
+
}
|