@modusoperandi/licit 1.0.4 → 1.0.5
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 +7 -8
- package/BlockquoteInsertNewLineCommand.js.flow +77 -77
- package/BlockquoteNodeSpec.js +1 -1
- package/BlockquoteNodeSpec.js.flow +30 -30
- package/BlockquoteToggleCommand.js +8 -9
- package/BlockquoteToggleCommand.js.flow +56 -56
- package/BookmarkNodeSpec.js +1 -1
- package/BookmarkNodeSpec.js.flow +39 -39
- package/BulletListNodeSpec.js.flow +61 -61
- package/CZIProseMirror.js.flow +90 -90
- package/CodeBlockCommand.js +8 -9
- package/CodeBlockCommand.js.flow +65 -65
- package/CodeBlockNodeSpec.js.flow +24 -24
- package/CodeMarkSpec.js.flow +14 -14
- package/ContentPlaceholderPlugin.js +3 -4
- package/ContentPlaceholderPlugin.js.flow +187 -187
- package/CursorPlaceholderPlugin.js +4 -4
- package/CursorPlaceholderPlugin.js.flow +115 -115
- package/DocLayoutCommand.js +9 -10
- package/DocLayoutCommand.js.flow +99 -99
- package/DocNodeSpec.js.flow +64 -64
- package/EMMarkSpec.js.flow +14 -14
- package/EditorCommands.js.flow +126 -126
- package/EditorKeyMap.js.flow +187 -187
- package/EditorMarks.js +1 -1
- package/EditorMarks.js.flow +71 -71
- package/EditorNodes.js +1 -1
- package/EditorNodes.js.flow +59 -59
- package/EditorPageLayoutPlugin.js +2 -2
- 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 +49 -49
- package/FontTypeMarkSpec.js.flow +80 -80
- package/HTMLMutator.js +2 -3
- package/HTMLMutator.js.flow +59 -59
- package/HardBreakNodeSpec.js.flow +15 -15
- package/HeadingNodeSpec.js +1 -1
- package/HeadingNodeSpec.js.flow +52 -52
- package/HistoryRedoCommand.js +7 -8
- package/HistoryRedoCommand.js.flow +41 -41
- package/HistoryUndoCommand.js +7 -8
- package/HistoryUndoCommand.js.flow +41 -41
- package/HorizontalRuleCommand.js +7 -8
- package/HorizontalRuleCommand.js.flow +71 -71
- package/HorizontalRuleNodeSpec.js.flow +39 -39
- package/ImageUploadPlaceholderPlugin.js +2 -2
- package/ImageUploadPlaceholderPlugin.js.flow +192 -192
- package/LinkMarkSpec.js.flow +32 -32
- package/LinkSetURLCommand.js +8 -9
- package/LinkSetURLCommand.js.flow +117 -117
- package/LinkTooltipPlugin.js +3 -4
- package/LinkTooltipPlugin.js.flow +190 -190
- package/ListItemInsertNewLineCommand.js +7 -8
- package/ListItemInsertNewLineCommand.js.flow +77 -77
- package/ListItemMergeCommand.js +9 -10
- package/ListItemMergeCommand.js.flow +199 -199
- package/ListItemNodeSpec.js.flow +52 -52
- package/ListSplitCommand.js +7 -8
- package/ListSplitCommand.js.flow +54 -54
- package/ListToggleCommand.js +11 -12
- package/ListToggleCommand.js.flow +99 -99
- package/MarkNames.js.flow +18 -18
- package/MarksClearCommand.js +9 -10
- package/MarksClearCommand.js.flow +65 -65
- package/MathEditCommand.js +8 -9
- package/MathEditCommand.js.flow +120 -120
- package/MathNodeSpec.js.flow +46 -46
- package/NodeNames.js.flow +23 -23
- package/OrderedListNodeSpec.js +1 -1
- package/OrderedListNodeSpec.js.flow +132 -132
- package/ParagraphNodeSpec.js.flow +156 -156
- package/ParagraphSpacingCommand.js +9 -10
- package/ParagraphSpacingCommand.js.flow +144 -144
- package/PrintCommand.js +9 -10
- package/PrintCommand.js.flow +53 -53
- package/SelectionPlaceholderPlugin.js +4 -4
- package/SelectionPlaceholderPlugin.js.flow +131 -131
- package/SpacerMarkSpec.js +1 -1
- package/SpacerMarkSpec.js.flow +47 -47
- package/StrikeMarkSpec.js.flow +21 -21
- package/StrongMarkSpec.js.flow +25 -25
- package/StyleView.js +2 -3
- package/StyleView.js.flow +19 -19
- package/TableBackgroundColorCommand.js +25 -12
- package/TableBackgroundColorCommand.js.flow +83 -75
- package/TableBorderColorCommand.js +25 -12
- package/TableBorderColorCommand.js.flow +86 -75
- package/TableCellColorCommand.js +11 -11
- package/TableCellColorCommand.js.flow +75 -75
- package/TableCellMenuPlugin.js +3 -4
- package/TableCellMenuPlugin.js.flow +132 -132
- package/TableInsertCommand.js +9 -10
- package/TableInsertCommand.js.flow +120 -120
- package/TableMergeCellsCommand.js +7 -8
- package/TableMergeCellsCommand.js.flow +112 -112
- package/TableNodesSpecs.js.flow +78 -78
- package/TablePlugins.js.flow +14 -14
- package/TableResizePlugin.js +3 -4
- package/TableResizePlugin.js.flow +631 -631
- package/TextColorMarkSpec.js.flow +35 -35
- package/TextHighlightMarkSpec.js.flow +38 -38
- package/TextInsertTabSpaceCommand.js +7 -8
- package/TextInsertTabSpaceCommand.js.flow +106 -106
- package/TextNoWrapMarkSpec.js.flow +14 -14
- package/TextNodeSpec.js.flow +7 -7
- package/TextSelectionMarkSpec.js.flow +24 -24
- package/TextSubMarkSpec.js.flow +20 -20
- package/TextSuperMarkSpec.js.flow +20 -20
- package/TextUnderlineMarkSpec.js.flow +27 -27
- package/Types.js +5 -0
- package/Types.js.flow +80 -75
- package/WebFontLoader.js +2 -3
- package/WebFontLoader.js.flow +22 -22
- package/blockQuoteInputRule.js.flow +36 -36
- package/bom.xml +21569 -23179
- package/browser.js.flow +7 -7
- package/buildEditorPlugins.js +2 -3
- package/buildEditorPlugins.js.flow +49 -49
- package/buildInputRules.js.flow +81 -81
- package/client/CollabConnector.js +12 -12
- package/client/CollabConnector.js.flow +90 -90
- package/client/EditorConnection.js +2 -3
- package/client/EditorConnection.js.flow +323 -323
- package/client/Licit.js +59 -60
- package/client/Licit.js.flow +643 -643
- package/client/Licit.test.js +2 -2
- package/client/Licit.test.js.flow +98 -98
- package/client/Reporter.js +2 -3
- package/client/Reporter.js.flow +37 -37
- package/client/SimpleConnector.js +1 -1
- package/client/SimpleConnector.js.flow +61 -61
- package/client/http.js.flow +70 -70
- package/client/licit.css +12 -12
- package/client/throttle.js.flow +27 -27
- package/convertFromDOMElement.js.flow +36 -36
- package/convertFromHTML.js.flow +17 -17
- package/convertFromJSON.js.flow +56 -56
- package/convertToCSSPTValue.js.flow +22 -22
- package/convertToJSON.js.flow +7 -7
- package/createCommand.js +8 -9
- package/createCommand.js.flow +62 -62
- package/createEditorKeyMap.js +1 -1
- package/createEditorKeyMap.js.flow +94 -94
- package/createEmptyEditorState.js.flow +31 -31
- 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 +165 -165
- package/index.js.flow +10 -10
- package/insertTable.js.flow +56 -56
- package/isEditorStateEmpty.js.flow +32 -32
- package/isTableNode.js.flow +15 -15
- package/joinDown.js.flow +27 -27
- package/joinListNode.js.flow +55 -55
- package/joinUp.js.flow +39 -39
- package/keymaps.js.flow +185 -185
- package/lookUpElement.js.flow +14 -14
- package/nodeAt.js.flow +12 -12
- package/normalizeHTML.js.flow +78 -78
- package/package.json +156 -155
- package/patchAnchorElements.js.flow +38 -38
- package/patchBreakElements.js.flow +22 -22
- package/patchElementInlineStyles.js.flow +92 -92
- package/patchListElements.js.flow +276 -276
- package/patchMathElements.js.flow +60 -60
- package/patchParagraphElements.js.flow +20 -20
- package/patchStyleElements.js.flow +196 -196
- package/patchTableElements.js.flow +89 -89
- package/rebaseDocWithSteps.js.flow +42 -42
- package/sanitizeURL.js.flow +13 -13
- package/splitListItem.js +1 -1
- package/splitListItem.js.flow +191 -191
- package/styles.css +19 -19
- package/styles0.css +29 -29
- package/toClosestFontPtSize.js.flow +22 -22
- package/toSafeHTMLDocument.js.flow +9 -9
- package/toggleBlockquote.js.flow +108 -108
- package/toggleCodeBlock.js.flow +102 -102
- package/ui/AlertInfo.js +7 -8
- package/ui/AlertInfo.js.flow +64 -64
- package/ui/BookmarkNodeView.js +8 -10
- package/ui/BookmarkNodeView.js.flow +66 -66
- package/ui/CommandButton.js +7 -8
- package/ui/CommandButton.js.flow +68 -68
- package/ui/CommandMenu.js +8 -9
- package/ui/CommandMenu.js.flow +75 -75
- package/ui/CommandMenuButton.js +13 -14
- package/ui/CommandMenuButton.js.flow +131 -131
- package/ui/CustomEditorView.js +8 -9
- package/ui/CustomEditorView.js.flow +28 -28
- package/ui/CustomMenu.js +3 -4
- package/ui/CustomMenu.js.flow +17 -17
- package/ui/CustomMenuItem.js +6 -8
- package/ui/CustomMenuItem.js.flow +36 -36
- package/ui/CustomNodeView.js +2 -3
- package/ui/CustomNodeView.js.flow +200 -200
- package/ui/CustomRadioButton.js +6 -7
- package/ui/CustomRadioButton.js.flow +65 -65
- package/ui/DocLayoutEditor.js +9 -10
- package/ui/DocLayoutEditor.js.flow +146 -146
- package/ui/Editor.js +15 -16
- package/ui/Editor.js.flow +288 -288
- package/ui/EditorFrameset.js +5 -6
- package/ui/EditorFrameset.js.flow +81 -81
- package/ui/EditorToolbar.js +13 -14
- package/ui/EditorToolbar.js.flow +218 -218
- package/ui/EditorToolbarConfig.js.flow +164 -164
- package/ui/FontSizeCommandMenuButton.js +5 -6
- package/ui/FontSizeCommandMenuButton.js.flow +66 -66
- package/ui/FontTypeCommandMenuButton.js +5 -6
- package/ui/FontTypeCommandMenuButton.js.flow +61 -61
- package/ui/Frag.js +3 -4
- package/ui/Frag.js.flow +13 -13
- package/ui/Icon.js +9 -12
- package/ui/Icon.js.flow +89 -89
- package/ui/ImageInlineEditor.js +6 -7
- package/ui/ImageInlineEditor.js.flow +67 -67
- package/ui/KeyCodes.js.flow +12 -12
- package/ui/LinkTooltip.js +9 -10
- package/ui/LinkTooltip.js.flow +85 -85
- package/ui/LinkURLEditor.js +9 -10
- package/ui/LinkURLEditor.js.flow +117 -117
- package/ui/ListItemNodeView.js +2 -3
- package/ui/ListItemNodeView.js.flow +98 -98
- package/ui/ListTypeButton.js +13 -14
- package/ui/ListTypeButton.js.flow +131 -131
- package/ui/ListTypeCommandButton.js +5 -6
- package/ui/ListTypeCommandButton.js.flow +85 -85
- package/ui/ListTypeMenu.js +11 -12
- package/ui/ListTypeMenu.js.flow +70 -70
- package/ui/LoadingIndicator.js +3 -4
- package/ui/LoadingIndicator.js.flow +20 -20
- package/ui/MathEditor.js +10 -11
- package/ui/MathEditor.js.flow +78 -78
- package/ui/MathInlineEditor.js +8 -9
- package/ui/MathInlineEditor.js.flow +102 -102
- package/ui/MathNodeView.js +14 -16
- package/ui/MathNodeView.js.flow +186 -186
- package/ui/PasteMenu.js +10 -11
- package/ui/PasteMenu.js.flow +57 -57
- package/ui/ResizeObserver.js.flow +106 -106
- package/ui/RichTextEditor.js +9 -10
- package/ui/RichTextEditor.js.flow +133 -133
- package/ui/SelectionObserver.js +2 -3
- package/ui/SelectionObserver.js.flow +134 -134
- package/ui/TableCellMenu.js +6 -7
- package/ui/TableCellMenu.js.flow +51 -51
- package/ui/TableGridSizeEditor.js +19 -21
- package/ui/TableGridSizeEditor.js.flow +184 -184
- package/ui/TableNodeView.js +3 -4
- package/ui/TableNodeView.js.flow +25 -25
- package/ui/bindScrollHandler.js.flow +46 -46
- package/ui/canUseCSSFont.js.flow +43 -43
- 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 +220 -220
- package/ui/czi-form.css +107 -107
- 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 +125 -125
- package/ui/czi-indent.css +137 -137
- package/ui/czi-inline-editor.css +20 -20
- package/ui/czi-link-tooltip.css +71 -71
- package/ui/czi-list.css +410 -410
- package/ui/czi-loading-indicator.css +111 -111
- package/ui/czi-math-view.css +62 -62
- package/ui/czi-selection-placeholder.css +24 -24
- package/ui/czi-table-cell-menu.css +14 -14
- package/ui/czi-table-grid-size-editor.css +37 -37
- package/ui/czi-table.css +87 -87
- package/ui/czi-vars.css +2 -2
- package/ui/findActiveFontSize.js.flow +58 -58
- package/ui/findActiveFontType.js.flow +38 -38
- 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 +42 -42
- package/ui/isElementFullyVisible.js.flow +26 -26
- package/ui/isOffline.js.flow +8 -8
- package/ui/isReactClass.js.flow +12 -12
- package/ui/listType.css +21 -21
- package/ui/mathquill-editor/MathQuillEditor.js +15 -17
- package/ui/mathquill-editor/MathQuillEditor.js.flow +159 -159
- package/ui/mathquill-editor/MathQuillEditorSymbols.js.flow +483 -483
- package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js +6 -7
- package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js.flow +50 -50
- package/ui/mathquill-editor/czi-mathquill-editor-symbols-panel.css +39 -39
- package/ui/mathquill-editor/czi-mathquill-editor.css +50 -50
- package/ui/mathquill-editor/mathquill-import-kludge.js.flow +24 -24
- package/ui/renderLaTeXAsHTML.js +1 -1
- package/ui/renderLaTeXAsHTML.js.flow +46 -46
- package/ui/resolveImage.js +1 -1
- package/ui/resolveImage.js.flow +123 -123
- package/ui/toCSSColor.js.flow +51 -51
- package/ui/toCSSLineSpacing.js.flow +55 -55
- package/ui/toHexColor.js.flow +26 -26
- package/ui/uuid.js.flow +9 -9
- package/uuid.js.flow +9 -9
package/client/Licit.test.js
CHANGED
|
@@ -5,8 +5,8 @@ import Licit, { DataType } from './Licit';
|
|
|
5
5
|
import RichTextEditor from '../ui/RichTextEditor';
|
|
6
6
|
import { noop } from '@modusoperandi/licit-ui-commands';
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* Configure Jest to use react / enzyme
|
|
8
|
+
/**
|
|
9
|
+
* Configure Jest to use react / enzyme
|
|
10
10
|
*/
|
|
11
11
|
configure({
|
|
12
12
|
adapter: new Adapter()
|
|
@@ -1,98 +1,98 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { configure, shallow } from 'enzyme';
|
|
3
|
-
import Adapter from '@cfaester/enzyme-adapter-react-18';
|
|
4
|
-
import Licit, { DataType } from './Licit';
|
|
5
|
-
import RichTextEditor from '../ui/RichTextEditor';
|
|
6
|
-
import { noop } from '@modusoperandi/licit-ui-commands';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Configure Jest to use react / enzyme
|
|
10
|
-
*/
|
|
11
|
-
configure({
|
|
12
|
-
adapter: new Adapter(),
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
describe('<Licit />', () => {
|
|
16
|
-
let wrapper;
|
|
17
|
-
let licit;
|
|
18
|
-
|
|
19
|
-
// provide an empty document just to shut up that warning
|
|
20
|
-
const data = {
|
|
21
|
-
type: 'doc',
|
|
22
|
-
content: [
|
|
23
|
-
{
|
|
24
|
-
type: 'paragraph',
|
|
25
|
-
content: [{ type: 'text', text: ' ' }],
|
|
26
|
-
},
|
|
27
|
-
],
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// Mocking the functions used in _onReady
|
|
31
|
-
const fakeEditorView = {
|
|
32
|
-
focus: noop,
|
|
33
|
-
dispatch: noop,
|
|
34
|
-
state: {
|
|
35
|
-
doc: {
|
|
36
|
-
content: { size: 10 },
|
|
37
|
-
resolve: () => ({
|
|
38
|
-
min: () => 0,
|
|
39
|
-
max: () => 10,
|
|
40
|
-
parent: { inlineContent: true },
|
|
41
|
-
}),
|
|
42
|
-
toJSON: () => data,
|
|
43
|
-
},
|
|
44
|
-
tr: {
|
|
45
|
-
setSelection: () => fakeEditorView.state.tr,
|
|
46
|
-
scrollIntoView: noop,
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
beforeEach(() => {
|
|
52
|
-
wrapper = shallow(<Licit data={data} />);
|
|
53
|
-
licit = wrapper.instance();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('should render a <RichTextEditor /> ', () => {
|
|
57
|
-
expect(wrapper.find(RichTextEditor)).toBeTruthy();
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
describe('editorView (getter)', () => {
|
|
61
|
-
it('should return the prosemirror view', () => {
|
|
62
|
-
// Using shallow, the underlying RichTexEditor is never really created,
|
|
63
|
-
// and Licit's _onReady method is not called. Call it here with the fake
|
|
64
|
-
// view created above
|
|
65
|
-
licit._onReady(fakeEditorView);
|
|
66
|
-
|
|
67
|
-
// Verify that getter now returns the underlying view.
|
|
68
|
-
expect(licit.editorView).toBe(fakeEditorView);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
describe('<Licit with HTML input/>', () => {
|
|
74
|
-
let wrapper;
|
|
75
|
-
let licit;
|
|
76
|
-
|
|
77
|
-
const HELLO = 'Hello ';
|
|
78
|
-
const WORLD = 'World';
|
|
79
|
-
const data =
|
|
80
|
-
'<p stylename="None">' +
|
|
81
|
-
HELLO +
|
|
82
|
-
'<strong overridden="false">' +
|
|
83
|
-
WORLD +
|
|
84
|
-
'</strong></p>';
|
|
85
|
-
|
|
86
|
-
beforeEach(() => {
|
|
87
|
-
wrapper = shallow(<Licit data={data} dataType={DataType.HTML} />);
|
|
88
|
-
licit = wrapper.instance();
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('should render a <RichTextEditor /> ', () => {
|
|
92
|
-
expect(wrapper.find(RichTextEditor)).toBeTruthy();
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('should match state text content with the passed in text ', () => {
|
|
96
|
-
expect(licit.state.editorState.doc.textContent).toBe(HELLO + WORLD);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { configure, shallow } from 'enzyme';
|
|
3
|
+
import Adapter from '@cfaester/enzyme-adapter-react-18';
|
|
4
|
+
import Licit, { DataType } from './Licit';
|
|
5
|
+
import RichTextEditor from '../ui/RichTextEditor';
|
|
6
|
+
import { noop } from '@modusoperandi/licit-ui-commands';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Configure Jest to use react / enzyme
|
|
10
|
+
*/
|
|
11
|
+
configure({
|
|
12
|
+
adapter: new Adapter(),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('<Licit />', () => {
|
|
16
|
+
let wrapper;
|
|
17
|
+
let licit;
|
|
18
|
+
|
|
19
|
+
// provide an empty document just to shut up that warning
|
|
20
|
+
const data = {
|
|
21
|
+
type: 'doc',
|
|
22
|
+
content: [
|
|
23
|
+
{
|
|
24
|
+
type: 'paragraph',
|
|
25
|
+
content: [{ type: 'text', text: ' ' }],
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Mocking the functions used in _onReady
|
|
31
|
+
const fakeEditorView = {
|
|
32
|
+
focus: noop,
|
|
33
|
+
dispatch: noop,
|
|
34
|
+
state: {
|
|
35
|
+
doc: {
|
|
36
|
+
content: { size: 10 },
|
|
37
|
+
resolve: () => ({
|
|
38
|
+
min: () => 0,
|
|
39
|
+
max: () => 10,
|
|
40
|
+
parent: { inlineContent: true },
|
|
41
|
+
}),
|
|
42
|
+
toJSON: () => data,
|
|
43
|
+
},
|
|
44
|
+
tr: {
|
|
45
|
+
setSelection: () => fakeEditorView.state.tr,
|
|
46
|
+
scrollIntoView: noop,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
beforeEach(() => {
|
|
52
|
+
wrapper = shallow(<Licit data={data} />);
|
|
53
|
+
licit = wrapper.instance();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should render a <RichTextEditor /> ', () => {
|
|
57
|
+
expect(wrapper.find(RichTextEditor)).toBeTruthy();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe('editorView (getter)', () => {
|
|
61
|
+
it('should return the prosemirror view', () => {
|
|
62
|
+
// Using shallow, the underlying RichTexEditor is never really created,
|
|
63
|
+
// and Licit's _onReady method is not called. Call it here with the fake
|
|
64
|
+
// view created above
|
|
65
|
+
licit._onReady(fakeEditorView);
|
|
66
|
+
|
|
67
|
+
// Verify that getter now returns the underlying view.
|
|
68
|
+
expect(licit.editorView).toBe(fakeEditorView);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe('<Licit with HTML input/>', () => {
|
|
74
|
+
let wrapper;
|
|
75
|
+
let licit;
|
|
76
|
+
|
|
77
|
+
const HELLO = 'Hello ';
|
|
78
|
+
const WORLD = 'World';
|
|
79
|
+
const data =
|
|
80
|
+
'<p stylename="None">' +
|
|
81
|
+
HELLO +
|
|
82
|
+
'<strong overridden="false">' +
|
|
83
|
+
WORLD +
|
|
84
|
+
'</strong></p>';
|
|
85
|
+
|
|
86
|
+
beforeEach(() => {
|
|
87
|
+
wrapper = shallow(<Licit data={data} dataType={DataType.HTML} />);
|
|
88
|
+
licit = wrapper.instance();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('should render a <RichTextEditor /> ', () => {
|
|
92
|
+
expect(wrapper.find(RichTextEditor)).toBeTruthy();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('should match state text content with the passed in text ', () => {
|
|
96
|
+
expect(licit.state.editorState.doc.textContent).toBe(HELLO + WORLD);
|
|
97
|
+
});
|
|
98
|
+
});
|
package/client/Reporter.js
CHANGED
|
@@ -2,7 +2,7 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
|
|
|
2
2
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
3
3
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
4
4
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
5
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i :
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
6
6
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
7
|
/* eslint-disable */
|
|
8
8
|
var Reporter = /*#__PURE__*/function () {
|
|
@@ -10,7 +10,7 @@ var Reporter = /*#__PURE__*/function () {
|
|
|
10
10
|
_classCallCheck(this, Reporter);
|
|
11
11
|
this.setAt = 0;
|
|
12
12
|
}
|
|
13
|
-
_createClass(Reporter, [{
|
|
13
|
+
return _createClass(Reporter, [{
|
|
14
14
|
key: "clearState",
|
|
15
15
|
value: function clearState() {
|
|
16
16
|
if (this.state) {
|
|
@@ -45,6 +45,5 @@ var Reporter = /*#__PURE__*/function () {
|
|
|
45
45
|
}, 5000);else this.clearState();
|
|
46
46
|
}
|
|
47
47
|
}]);
|
|
48
|
-
return Reporter;
|
|
49
48
|
}();
|
|
50
49
|
export default Reporter;
|
package/client/Reporter.js.flow
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
|
|
3
|
-
class Reporter {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.setAt = 0;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
clearState() {
|
|
9
|
-
if (this.state) {
|
|
10
|
-
this.state = this.node = null;
|
|
11
|
-
this.setAt = 0;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
failure(err) {
|
|
16
|
-
console.error('fail', err.toString());
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
delay(err) {
|
|
20
|
-
if (this.state == 'fail') return;
|
|
21
|
-
console.info('delay', err.toString());
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
show(type, message) {
|
|
25
|
-
this.clearState();
|
|
26
|
-
this.state = type;
|
|
27
|
-
this.setAt = Date.now();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
success() {
|
|
31
|
-
if (this.state == 'fail' && this.setAt > Date.now() - 1000 * 10)
|
|
32
|
-
setTimeout(() => this.success(), 5000);
|
|
33
|
-
else this.clearState();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export default Reporter;
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
|
|
3
|
+
class Reporter {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.setAt = 0;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
clearState() {
|
|
9
|
+
if (this.state) {
|
|
10
|
+
this.state = this.node = null;
|
|
11
|
+
this.setAt = 0;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
failure(err) {
|
|
16
|
+
console.error('fail', err.toString());
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
delay(err) {
|
|
20
|
+
if (this.state == 'fail') return;
|
|
21
|
+
console.info('delay', err.toString());
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
show(type, message) {
|
|
25
|
+
this.clearState();
|
|
26
|
+
this.state = type;
|
|
27
|
+
this.setAt = Date.now();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
success() {
|
|
31
|
+
if (this.state == 'fail' && this.setAt > Date.now() - 1000 * 10)
|
|
32
|
+
setTimeout(() => this.success(), 5000);
|
|
33
|
+
else this.clearState();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export default Reporter;
|
|
@@ -3,7 +3,7 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+
|
|
|
3
3
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
4
4
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
5
5
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i :
|
|
6
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
7
7
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
8
8
|
import { EditorState } from 'prosemirror-state';
|
|
9
9
|
import { Transform } from 'prosemirror-transform';
|
|
@@ -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,70 +1,70 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
|
|
3
|
-
// A simple wrapper for XHR.
|
|
4
|
-
export function req(conf) {
|
|
5
|
-
let req = new XMLHttpRequest(),
|
|
6
|
-
aborted = false;
|
|
7
|
-
let result = new Promise((success, failure) => {
|
|
8
|
-
req.open(conf.method, conf.url, true);
|
|
9
|
-
req.addEventListener('load', () => {
|
|
10
|
-
if (aborted) return;
|
|
11
|
-
if (req.status < 400) {
|
|
12
|
-
success(req.responseText);
|
|
13
|
-
} else {
|
|
14
|
-
let text = req.responseText;
|
|
15
|
-
if (text && /html/.test(req.getResponseHeader('content-type')))
|
|
16
|
-
text = makePlain(text);
|
|
17
|
-
let err = new Error(
|
|
18
|
-
'Request failed: ' + req.statusText + (text ? '\n\n' + text : '')
|
|
19
|
-
);
|
|
20
|
-
err.status = req.status;
|
|
21
|
-
|
|
22
|
-
failure(err);
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
req.addEventListener('error', () => {
|
|
26
|
-
if (!aborted) failure(new Error('Network error'));
|
|
27
|
-
});
|
|
28
|
-
if (conf.headers)
|
|
29
|
-
for (let header in conf.headers)
|
|
30
|
-
req.setRequestHeader(header, conf.headers[header]);
|
|
31
|
-
req.send(conf.body || null);
|
|
32
|
-
});
|
|
33
|
-
result.abort = () => {
|
|
34
|
-
if (!aborted) {
|
|
35
|
-
req.abort();
|
|
36
|
-
aborted = true;
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
return result;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function makePlain(html) {
|
|
43
|
-
var elt = document.createElement('div');
|
|
44
|
-
elt.innerHTML = html;
|
|
45
|
-
return elt.textContent.replace(/\n[^]*|\s+$/g, '');
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function GET(url) {
|
|
49
|
-
return req({ url, method: 'GET' });
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function POST(url, body, type) {
|
|
53
|
-
return req({ url, method: 'POST', body, headers: { 'Content-Type': type } });
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function PUT(url, body, type) {
|
|
57
|
-
return req({ url, method: 'PUT', body, headers: { 'Content-Type': type } });
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// [FS] IRAD-1128 2021-02-03
|
|
61
|
-
// http DELETE request overrided
|
|
62
|
-
export function DELETE(url, type) {
|
|
63
|
-
return req({ url, method: 'DELETE', headers: { 'Content-Type': type } });
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// [FS] IRAD-1128 2021-02-03
|
|
67
|
-
// http PATCH request overrided
|
|
68
|
-
export function PATCH(url, body, type) {
|
|
69
|
-
return req({ url, method: 'PATCH', body, headers: { 'Content-Type': type } });
|
|
70
|
-
}
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
|
|
3
|
+
// A simple wrapper for XHR.
|
|
4
|
+
export function req(conf) {
|
|
5
|
+
let req = new XMLHttpRequest(),
|
|
6
|
+
aborted = false;
|
|
7
|
+
let result = new Promise((success, failure) => {
|
|
8
|
+
req.open(conf.method, conf.url, true);
|
|
9
|
+
req.addEventListener('load', () => {
|
|
10
|
+
if (aborted) return;
|
|
11
|
+
if (req.status < 400) {
|
|
12
|
+
success(req.responseText);
|
|
13
|
+
} else {
|
|
14
|
+
let text = req.responseText;
|
|
15
|
+
if (text && /html/.test(req.getResponseHeader('content-type')))
|
|
16
|
+
text = makePlain(text);
|
|
17
|
+
let err = new Error(
|
|
18
|
+
'Request failed: ' + req.statusText + (text ? '\n\n' + text : '')
|
|
19
|
+
);
|
|
20
|
+
err.status = req.status;
|
|
21
|
+
|
|
22
|
+
failure(err);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
req.addEventListener('error', () => {
|
|
26
|
+
if (!aborted) failure(new Error('Network error'));
|
|
27
|
+
});
|
|
28
|
+
if (conf.headers)
|
|
29
|
+
for (let header in conf.headers)
|
|
30
|
+
req.setRequestHeader(header, conf.headers[header]);
|
|
31
|
+
req.send(conf.body || null);
|
|
32
|
+
});
|
|
33
|
+
result.abort = () => {
|
|
34
|
+
if (!aborted) {
|
|
35
|
+
req.abort();
|
|
36
|
+
aborted = true;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function makePlain(html) {
|
|
43
|
+
var elt = document.createElement('div');
|
|
44
|
+
elt.innerHTML = html;
|
|
45
|
+
return elt.textContent.replace(/\n[^]*|\s+$/g, '');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function GET(url) {
|
|
49
|
+
return req({ url, method: 'GET' });
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function POST(url, body, type) {
|
|
53
|
+
return req({ url, method: 'POST', body, headers: { 'Content-Type': type } });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function PUT(url, body, type) {
|
|
57
|
+
return req({ url, method: 'PUT', body, headers: { 'Content-Type': type } });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// [FS] IRAD-1128 2021-02-03
|
|
61
|
+
// http DELETE request overrided
|
|
62
|
+
export function DELETE(url, type) {
|
|
63
|
+
return req({ url, method: 'DELETE', headers: { 'Content-Type': type } });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// [FS] IRAD-1128 2021-02-03
|
|
67
|
+
// http PATCH request overrided
|
|
68
|
+
export function PATCH(url, body, type) {
|
|
69
|
+
return req({ url, method: 'PATCH', body, headers: { 'Content-Type': type } });
|
|
70
|
+
}
|
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.apply(null, args);
|
|
21
|
-
}, threshhold);
|
|
22
|
-
} else {
|
|
23
|
-
last = now;
|
|
24
|
-
boundFn.apply(null, 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.apply(null, args);
|
|
21
|
+
}, threshhold);
|
|
22
|
+
} else {
|
|
23
|
+
last = now;
|
|
24
|
+
boundFn.apply(null, args);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|