@atlaskit/editor-plugin-block-controls 3.8.6 → 3.8.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/CHANGELOG.md +8 -0
- package/dist/cjs/blockControlsPlugin.js +17 -10
- package/dist/cjs/pm-plugins/interaction-tracking/commands.js +17 -0
- package/dist/cjs/pm-plugins/interaction-tracking/handle-key-down.js +32 -0
- package/dist/cjs/pm-plugins/interaction-tracking/handle-mouse-move.js +16 -0
- package/dist/cjs/pm-plugins/interaction-tracking/pm-plugin.js +46 -0
- package/dist/cjs/ui/visibility-container.js +4 -3
- package/dist/es2019/blockControlsPlugin.js +18 -8
- package/dist/es2019/pm-plugins/interaction-tracking/commands.js +11 -0
- package/dist/es2019/pm-plugins/interaction-tracking/handle-key-down.js +26 -0
- package/dist/es2019/pm-plugins/interaction-tracking/handle-mouse-move.js +10 -0
- package/dist/es2019/pm-plugins/interaction-tracking/pm-plugin.js +40 -0
- package/dist/es2019/ui/visibility-container.js +4 -3
- package/dist/esm/blockControlsPlugin.js +17 -10
- package/dist/esm/pm-plugins/interaction-tracking/commands.js +11 -0
- package/dist/esm/pm-plugins/interaction-tracking/handle-key-down.js +26 -0
- package/dist/esm/pm-plugins/interaction-tracking/handle-mouse-move.js +10 -0
- package/dist/esm/pm-plugins/interaction-tracking/pm-plugin.js +40 -0
- package/dist/esm/ui/visibility-container.js +4 -3
- package/dist/types/blockControlsPluginType.d.ts +1 -0
- package/dist/types/pm-plugins/interaction-tracking/commands.d.ts +3 -0
- package/dist/types/pm-plugins/interaction-tracking/handle-key-down.d.ts +2 -0
- package/dist/types/pm-plugins/interaction-tracking/handle-mouse-move.d.ts +2 -0
- package/dist/types/pm-plugins/interaction-tracking/pm-plugin.d.ts +12 -0
- package/dist/types-ts4.5/blockControlsPluginType.d.ts +1 -0
- package/dist/types-ts4.5/pm-plugins/interaction-tracking/commands.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/interaction-tracking/handle-key-down.d.ts +2 -0
- package/dist/types-ts4.5/pm-plugins/interaction-tracking/handle-mouse-move.d.ts +2 -0
- package/dist/types-ts4.5/pm-plugins/interaction-tracking/pm-plugin.d.ts +12 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-block-controls
|
|
2
2
|
|
|
3
|
+
## 3.8.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#138396](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/138396)
|
|
8
|
+
[`6a11423e1442f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/6a11423e1442f) -
|
|
9
|
+
Add new plugin which tracks user typing, add typing check to visibility container of widgets
|
|
10
|
+
|
|
3
11
|
## 3.8.6
|
|
4
12
|
|
|
5
13
|
### Patch Changes
|
|
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.blockControlsPlugin = void 0;
|
|
8
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
10
9
|
var _react = _interopRequireDefault(require("react"));
|
|
11
10
|
var _selection = require("@atlaskit/editor-common/selection");
|
|
12
11
|
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
@@ -15,6 +14,7 @@ var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
|
|
|
15
14
|
var _moveNode = require("./editor-commands/move-node");
|
|
16
15
|
var _moveToLayout = require("./editor-commands/move-to-layout");
|
|
17
16
|
var _firstNodeDecPlugin = require("./pm-plugins/first-node-dec-plugin");
|
|
17
|
+
var _pmPlugin = require("./pm-plugins/interaction-tracking/pm-plugin");
|
|
18
18
|
var _main = require("./pm-plugins/main");
|
|
19
19
|
var _getSelection = require("./pm-plugins/utils/getSelection");
|
|
20
20
|
var _blockMenu = _interopRequireDefault(require("./ui/block-menu"));
|
|
@@ -27,7 +27,7 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
|
|
|
27
27
|
return {
|
|
28
28
|
name: 'blockControls',
|
|
29
29
|
pmPlugins: function pmPlugins() {
|
|
30
|
-
var
|
|
30
|
+
var pmPlugins = [{
|
|
31
31
|
name: 'blockControlsPmPlugin',
|
|
32
32
|
plugin: function plugin(_ref2) {
|
|
33
33
|
var getIntl = _ref2.getIntl,
|
|
@@ -35,13 +35,19 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
|
|
|
35
35
|
return (0, _main.createPlugin)(api, getIntl, nodeViewPortalProviderAPI);
|
|
36
36
|
}
|
|
37
37
|
}];
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
if ((0, _experiments.editorExperiment)('platform_editor_controls', 'variant1')) {
|
|
39
|
+
if ((0, _platformFeatureFlags.fg)('platform_editor_controls_widget_visibility')) {
|
|
40
|
+
pmPlugins.push({
|
|
41
|
+
name: 'blockControlsInteractionTrackingPlugin',
|
|
42
|
+
plugin: _pmPlugin.createInteractionTrackingPlugin
|
|
43
|
+
});
|
|
42
44
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
pmPlugins.push({
|
|
46
|
+
name: 'firstNodeDec',
|
|
47
|
+
plugin: _firstNodeDecPlugin.firstNodeDecPlugin
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return pmPlugins;
|
|
45
51
|
},
|
|
46
52
|
commands: {
|
|
47
53
|
moveNode: (0, _moveNode.moveNode)(api),
|
|
@@ -161,7 +167,7 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
|
|
|
161
167
|
}
|
|
162
168
|
},
|
|
163
169
|
getSharedState: function getSharedState(editorState) {
|
|
164
|
-
var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8;
|
|
170
|
+
var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8, _interactionTrackingP;
|
|
165
171
|
if (!editorState) {
|
|
166
172
|
return undefined;
|
|
167
173
|
}
|
|
@@ -173,7 +179,8 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
|
|
|
173
179
|
isPMDragging: (_key$getState$isPMDra = (_key$getState5 = _main.key.getState(editorState)) === null || _key$getState5 === void 0 ? void 0 : _key$getState5.isPMDragging) !== null && _key$getState$isPMDra !== void 0 ? _key$getState$isPMDra : false,
|
|
174
180
|
multiSelectDnD: (_key$getState$multiSe = (_key$getState6 = _main.key.getState(editorState)) === null || _key$getState6 === void 0 ? void 0 : _key$getState6.multiSelectDnD) !== null && _key$getState$multiSe !== void 0 ? _key$getState$multiSe : undefined,
|
|
175
181
|
isShiftDown: (_key$getState$isShift = (_key$getState7 = _main.key.getState(editorState)) === null || _key$getState7 === void 0 ? void 0 : _key$getState7.isShiftDown) !== null && _key$getState$isShift !== void 0 ? _key$getState$isShift : undefined,
|
|
176
|
-
lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = _main.key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false
|
|
182
|
+
lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = _main.key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false,
|
|
183
|
+
isEditing: (_interactionTrackingP = _pmPlugin.interactionTrackingPluginKey.getState(editorState)) === null || _interactionTrackingP === void 0 ? void 0 : _interactionTrackingP.isEditing
|
|
177
184
|
};
|
|
178
185
|
},
|
|
179
186
|
contentComponent: function contentComponent(_ref7) {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.stopEditing = exports.startEditing = void 0;
|
|
7
|
+
var _pmPlugin = require("./pm-plugin");
|
|
8
|
+
var stopEditing = exports.stopEditing = function stopEditing(view) {
|
|
9
|
+
view.dispatch(view.state.tr.setMeta(_pmPlugin.interactionTrackingPluginKey, {
|
|
10
|
+
type: 'stopEditing'
|
|
11
|
+
}));
|
|
12
|
+
};
|
|
13
|
+
var startEditing = exports.startEditing = function startEditing(view) {
|
|
14
|
+
view.dispatch(view.state.tr.setMeta(_pmPlugin.interactionTrackingPluginKey, {
|
|
15
|
+
type: 'startEditing'
|
|
16
|
+
}));
|
|
17
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.handleKeyDown = void 0;
|
|
7
|
+
var _commands = require("./commands");
|
|
8
|
+
var _pmPlugin = require("./pm-plugin");
|
|
9
|
+
var handleKeyDown = exports.handleKeyDown = function handleKeyDown(view, event) {
|
|
10
|
+
// Check if this is a keyboard shortcut (Ctrl/Cmd + key)
|
|
11
|
+
var isShortcut = event.ctrlKey || event.metaKey || event.altKey;
|
|
12
|
+
if (isShortcut) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Only consider actual typing keys (not shortcuts)
|
|
17
|
+
// We need to check if it's a single character key or a deletion key
|
|
18
|
+
// and ensure it's not part of a shortcut
|
|
19
|
+
var isTypingKey =
|
|
20
|
+
// Single character keys (letters, numbers, symbols)
|
|
21
|
+
event.key.length === 1 || event.key === 'Backspace' || event.key === 'Delete' || event.key === ' ' || event.key === 'Enter';
|
|
22
|
+
if (!isTypingKey) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
var state = (0, _pmPlugin.getInteractionTrackingState)(view.state);
|
|
26
|
+
|
|
27
|
+
// if user hasnt started typing yet, start timer
|
|
28
|
+
if (!(state !== null && state !== void 0 && state.isEditing)) {
|
|
29
|
+
(0, _commands.startEditing)(view);
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.handleMouseMove = void 0;
|
|
7
|
+
var _commands = require("./commands");
|
|
8
|
+
var _pmPlugin = require("./pm-plugin");
|
|
9
|
+
var handleMouseMove = exports.handleMouseMove = function handleMouseMove(view) {
|
|
10
|
+
var state = (0, _pmPlugin.getInteractionTrackingState)(view.state);
|
|
11
|
+
// if user has stopped editing and moved their mouse, show block controls again
|
|
12
|
+
if (state !== null && state !== void 0 && state.isEditing) {
|
|
13
|
+
(0, _commands.stopEditing)(view);
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.interactionTrackingPluginKey = exports.getInteractionTrackingState = exports.createInteractionTrackingPlugin = void 0;
|
|
7
|
+
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
|
|
8
|
+
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
9
|
+
var _handleKeyDown = require("./handle-key-down");
|
|
10
|
+
var _handleMouseMove = require("./handle-mouse-move");
|
|
11
|
+
var interactionTrackingPluginKey = exports.interactionTrackingPluginKey = new _state.PluginKey('interactionTrackingPlugin');
|
|
12
|
+
var createInteractionTrackingPlugin = exports.createInteractionTrackingPlugin = function createInteractionTrackingPlugin() {
|
|
13
|
+
return new _safePlugin.SafePlugin({
|
|
14
|
+
key: interactionTrackingPluginKey,
|
|
15
|
+
state: {
|
|
16
|
+
init: function init() {
|
|
17
|
+
return {
|
|
18
|
+
isEditing: false
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
apply: function apply(tr, pluginState) {
|
|
22
|
+
var meta = tr.getMeta(interactionTrackingPluginKey);
|
|
23
|
+
switch (meta === null || meta === void 0 ? void 0 : meta.type) {
|
|
24
|
+
case 'startEditing':
|
|
25
|
+
return {
|
|
26
|
+
isEditing: true
|
|
27
|
+
};
|
|
28
|
+
case 'stopEditing':
|
|
29
|
+
return {
|
|
30
|
+
isEditing: false
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return pluginState;
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
props: {
|
|
37
|
+
handleKeyDown: _handleKeyDown.handleKeyDown,
|
|
38
|
+
handleDOMEvents: {
|
|
39
|
+
mousemove: _handleMouseMove.handleMouseMove
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var getInteractionTrackingState = exports.getInteractionTrackingState = function getInteractionTrackingState(state) {
|
|
45
|
+
return interactionTrackingPluginKey.getState(state);
|
|
46
|
+
};
|
|
@@ -17,14 +17,15 @@ var visibleStyles = (0, _primitives.xcss)({
|
|
|
17
17
|
});
|
|
18
18
|
var hiddenStyles = (0, _primitives.xcss)({
|
|
19
19
|
opacity: 0,
|
|
20
|
-
// CONFIRM this change doesnt cause this issue to regress https://product-fabric.atlassian.net/browse/ED-24136
|
|
21
20
|
visibility: 'hidden'
|
|
22
21
|
});
|
|
23
22
|
var VisibilityContainer = exports.VisibilityContainer = function VisibilityContainer(_ref) {
|
|
24
23
|
var api = _ref.api,
|
|
25
24
|
children = _ref.children;
|
|
26
|
-
var
|
|
25
|
+
var isTypeAheadOpen = (0, _useSharedPluginStateSelector.useSharedPluginStateSelector)(api, 'typeAhead.isOpen');
|
|
26
|
+
var isEditing = (0, _useSharedPluginStateSelector.useSharedPluginStateSelector)(api, 'blockControls.isEditing');
|
|
27
|
+
var shouldHide = isTypeAheadOpen || isEditing;
|
|
27
28
|
return /*#__PURE__*/_react.default.createElement(_primitives.Box, {
|
|
28
|
-
xcss: [baseStyles,
|
|
29
|
+
xcss: [baseStyles, shouldHide ? hiddenStyles : visibleStyles]
|
|
29
30
|
}, children);
|
|
30
31
|
};
|
|
@@ -6,6 +6,7 @@ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
|
|
|
6
6
|
import { moveNode } from './editor-commands/move-node';
|
|
7
7
|
import { moveToLayout } from './editor-commands/move-to-layout';
|
|
8
8
|
import { firstNodeDecPlugin } from './pm-plugins/first-node-dec-plugin';
|
|
9
|
+
import { createInteractionTrackingPlugin, interactionTrackingPluginKey } from './pm-plugins/interaction-tracking/pm-plugin';
|
|
9
10
|
import { createPlugin, key } from './pm-plugins/main';
|
|
10
11
|
import { selectNode } from './pm-plugins/utils/getSelection';
|
|
11
12
|
import BlockMenu from './ui/block-menu';
|
|
@@ -16,18 +17,26 @@ export const blockControlsPlugin = ({
|
|
|
16
17
|
}) => ({
|
|
17
18
|
name: 'blockControls',
|
|
18
19
|
pmPlugins() {
|
|
19
|
-
const
|
|
20
|
+
const pmPlugins = [{
|
|
20
21
|
name: 'blockControlsPmPlugin',
|
|
21
22
|
plugin: ({
|
|
22
23
|
getIntl,
|
|
23
24
|
nodeViewPortalProviderAPI
|
|
24
25
|
}) => createPlugin(api, getIntl, nodeViewPortalProviderAPI)
|
|
25
26
|
}];
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
if (editorExperiment('platform_editor_controls', 'variant1')) {
|
|
28
|
+
if (fg('platform_editor_controls_widget_visibility')) {
|
|
29
|
+
pmPlugins.push({
|
|
30
|
+
name: 'blockControlsInteractionTrackingPlugin',
|
|
31
|
+
plugin: createInteractionTrackingPlugin
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
pmPlugins.push({
|
|
35
|
+
name: 'firstNodeDec',
|
|
36
|
+
plugin: firstNodeDecPlugin
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return pmPlugins;
|
|
31
40
|
},
|
|
32
41
|
commands: {
|
|
33
42
|
moveNode: moveNode(api),
|
|
@@ -149,7 +158,7 @@ export const blockControlsPlugin = ({
|
|
|
149
158
|
}
|
|
150
159
|
},
|
|
151
160
|
getSharedState(editorState) {
|
|
152
|
-
var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8;
|
|
161
|
+
var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8, _interactionTrackingP;
|
|
153
162
|
if (!editorState) {
|
|
154
163
|
return undefined;
|
|
155
164
|
}
|
|
@@ -161,7 +170,8 @@ export const blockControlsPlugin = ({
|
|
|
161
170
|
isPMDragging: (_key$getState$isPMDra = (_key$getState5 = key.getState(editorState)) === null || _key$getState5 === void 0 ? void 0 : _key$getState5.isPMDragging) !== null && _key$getState$isPMDra !== void 0 ? _key$getState$isPMDra : false,
|
|
162
171
|
multiSelectDnD: (_key$getState$multiSe = (_key$getState6 = key.getState(editorState)) === null || _key$getState6 === void 0 ? void 0 : _key$getState6.multiSelectDnD) !== null && _key$getState$multiSe !== void 0 ? _key$getState$multiSe : undefined,
|
|
163
172
|
isShiftDown: (_key$getState$isShift = (_key$getState7 = key.getState(editorState)) === null || _key$getState7 === void 0 ? void 0 : _key$getState7.isShiftDown) !== null && _key$getState$isShift !== void 0 ? _key$getState$isShift : undefined,
|
|
164
|
-
lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false
|
|
173
|
+
lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false,
|
|
174
|
+
isEditing: (_interactionTrackingP = interactionTrackingPluginKey.getState(editorState)) === null || _interactionTrackingP === void 0 ? void 0 : _interactionTrackingP.isEditing
|
|
165
175
|
};
|
|
166
176
|
},
|
|
167
177
|
contentComponent({
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { interactionTrackingPluginKey } from './pm-plugin';
|
|
2
|
+
export const stopEditing = view => {
|
|
3
|
+
view.dispatch(view.state.tr.setMeta(interactionTrackingPluginKey, {
|
|
4
|
+
type: 'stopEditing'
|
|
5
|
+
}));
|
|
6
|
+
};
|
|
7
|
+
export const startEditing = view => {
|
|
8
|
+
view.dispatch(view.state.tr.setMeta(interactionTrackingPluginKey, {
|
|
9
|
+
type: 'startEditing'
|
|
10
|
+
}));
|
|
11
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { startEditing } from './commands';
|
|
2
|
+
import { getInteractionTrackingState } from './pm-plugin';
|
|
3
|
+
export const handleKeyDown = (view, event) => {
|
|
4
|
+
// Check if this is a keyboard shortcut (Ctrl/Cmd + key)
|
|
5
|
+
const isShortcut = event.ctrlKey || event.metaKey || event.altKey;
|
|
6
|
+
if (isShortcut) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Only consider actual typing keys (not shortcuts)
|
|
11
|
+
// We need to check if it's a single character key or a deletion key
|
|
12
|
+
// and ensure it's not part of a shortcut
|
|
13
|
+
const isTypingKey =
|
|
14
|
+
// Single character keys (letters, numbers, symbols)
|
|
15
|
+
event.key.length === 1 || event.key === 'Backspace' || event.key === 'Delete' || event.key === ' ' || event.key === 'Enter';
|
|
16
|
+
if (!isTypingKey) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const state = getInteractionTrackingState(view.state);
|
|
20
|
+
|
|
21
|
+
// if user hasnt started typing yet, start timer
|
|
22
|
+
if (!(state !== null && state !== void 0 && state.isEditing)) {
|
|
23
|
+
startEditing(view);
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { stopEditing } from './commands';
|
|
2
|
+
import { getInteractionTrackingState } from './pm-plugin';
|
|
3
|
+
export const handleMouseMove = view => {
|
|
4
|
+
const state = getInteractionTrackingState(view.state);
|
|
5
|
+
// if user has stopped editing and moved their mouse, show block controls again
|
|
6
|
+
if (state !== null && state !== void 0 && state.isEditing) {
|
|
7
|
+
stopEditing(view);
|
|
8
|
+
}
|
|
9
|
+
return false;
|
|
10
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import { PluginKey } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
import { handleKeyDown } from './handle-key-down';
|
|
4
|
+
import { handleMouseMove } from './handle-mouse-move';
|
|
5
|
+
export const interactionTrackingPluginKey = new PluginKey('interactionTrackingPlugin');
|
|
6
|
+
export const createInteractionTrackingPlugin = () => {
|
|
7
|
+
return new SafePlugin({
|
|
8
|
+
key: interactionTrackingPluginKey,
|
|
9
|
+
state: {
|
|
10
|
+
init() {
|
|
11
|
+
return {
|
|
12
|
+
isEditing: false
|
|
13
|
+
};
|
|
14
|
+
},
|
|
15
|
+
apply(tr, pluginState) {
|
|
16
|
+
const meta = tr.getMeta(interactionTrackingPluginKey);
|
|
17
|
+
switch (meta === null || meta === void 0 ? void 0 : meta.type) {
|
|
18
|
+
case 'startEditing':
|
|
19
|
+
return {
|
|
20
|
+
isEditing: true
|
|
21
|
+
};
|
|
22
|
+
case 'stopEditing':
|
|
23
|
+
return {
|
|
24
|
+
isEditing: false
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return pluginState;
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
props: {
|
|
31
|
+
handleKeyDown,
|
|
32
|
+
handleDOMEvents: {
|
|
33
|
+
mousemove: handleMouseMove
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
export const getInteractionTrackingState = state => {
|
|
39
|
+
return interactionTrackingPluginKey.getState(state);
|
|
40
|
+
};
|
|
@@ -10,15 +10,16 @@ const visibleStyles = xcss({
|
|
|
10
10
|
});
|
|
11
11
|
const hiddenStyles = xcss({
|
|
12
12
|
opacity: 0,
|
|
13
|
-
// CONFIRM this change doesnt cause this issue to regress https://product-fabric.atlassian.net/browse/ED-24136
|
|
14
13
|
visibility: 'hidden'
|
|
15
14
|
});
|
|
16
15
|
export const VisibilityContainer = ({
|
|
17
16
|
api,
|
|
18
17
|
children
|
|
19
18
|
}) => {
|
|
20
|
-
const
|
|
19
|
+
const isTypeAheadOpen = useSharedPluginStateSelector(api, 'typeAhead.isOpen');
|
|
20
|
+
const isEditing = useSharedPluginStateSelector(api, 'blockControls.isEditing');
|
|
21
|
+
const shouldHide = isTypeAheadOpen || isEditing;
|
|
21
22
|
return /*#__PURE__*/React.createElement(Box, {
|
|
22
|
-
xcss: [baseStyles,
|
|
23
|
+
xcss: [baseStyles, shouldHide ? hiddenStyles : visibleStyles]
|
|
23
24
|
}, children);
|
|
24
25
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
-
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
3
2
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
4
3
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
5
4
|
import React from 'react';
|
|
@@ -10,6 +9,7 @@ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
|
|
|
10
9
|
import { moveNode } from './editor-commands/move-node';
|
|
11
10
|
import { moveToLayout } from './editor-commands/move-to-layout';
|
|
12
11
|
import { firstNodeDecPlugin } from './pm-plugins/first-node-dec-plugin';
|
|
12
|
+
import { createInteractionTrackingPlugin, interactionTrackingPluginKey } from './pm-plugins/interaction-tracking/pm-plugin';
|
|
13
13
|
import { createPlugin, key } from './pm-plugins/main';
|
|
14
14
|
import { selectNode } from './pm-plugins/utils/getSelection';
|
|
15
15
|
import BlockMenu from './ui/block-menu';
|
|
@@ -20,7 +20,7 @@ export var blockControlsPlugin = function blockControlsPlugin(_ref) {
|
|
|
20
20
|
return {
|
|
21
21
|
name: 'blockControls',
|
|
22
22
|
pmPlugins: function pmPlugins() {
|
|
23
|
-
var
|
|
23
|
+
var pmPlugins = [{
|
|
24
24
|
name: 'blockControlsPmPlugin',
|
|
25
25
|
plugin: function plugin(_ref2) {
|
|
26
26
|
var getIntl = _ref2.getIntl,
|
|
@@ -28,13 +28,19 @@ export var blockControlsPlugin = function blockControlsPlugin(_ref) {
|
|
|
28
28
|
return createPlugin(api, getIntl, nodeViewPortalProviderAPI);
|
|
29
29
|
}
|
|
30
30
|
}];
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
if (editorExperiment('platform_editor_controls', 'variant1')) {
|
|
32
|
+
if (fg('platform_editor_controls_widget_visibility')) {
|
|
33
|
+
pmPlugins.push({
|
|
34
|
+
name: 'blockControlsInteractionTrackingPlugin',
|
|
35
|
+
plugin: createInteractionTrackingPlugin
|
|
36
|
+
});
|
|
35
37
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
pmPlugins.push({
|
|
39
|
+
name: 'firstNodeDec',
|
|
40
|
+
plugin: firstNodeDecPlugin
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return pmPlugins;
|
|
38
44
|
},
|
|
39
45
|
commands: {
|
|
40
46
|
moveNode: moveNode(api),
|
|
@@ -154,7 +160,7 @@ export var blockControlsPlugin = function blockControlsPlugin(_ref) {
|
|
|
154
160
|
}
|
|
155
161
|
},
|
|
156
162
|
getSharedState: function getSharedState(editorState) {
|
|
157
|
-
var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8;
|
|
163
|
+
var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8, _interactionTrackingP;
|
|
158
164
|
if (!editorState) {
|
|
159
165
|
return undefined;
|
|
160
166
|
}
|
|
@@ -166,7 +172,8 @@ export var blockControlsPlugin = function blockControlsPlugin(_ref) {
|
|
|
166
172
|
isPMDragging: (_key$getState$isPMDra = (_key$getState5 = key.getState(editorState)) === null || _key$getState5 === void 0 ? void 0 : _key$getState5.isPMDragging) !== null && _key$getState$isPMDra !== void 0 ? _key$getState$isPMDra : false,
|
|
167
173
|
multiSelectDnD: (_key$getState$multiSe = (_key$getState6 = key.getState(editorState)) === null || _key$getState6 === void 0 ? void 0 : _key$getState6.multiSelectDnD) !== null && _key$getState$multiSe !== void 0 ? _key$getState$multiSe : undefined,
|
|
168
174
|
isShiftDown: (_key$getState$isShift = (_key$getState7 = key.getState(editorState)) === null || _key$getState7 === void 0 ? void 0 : _key$getState7.isShiftDown) !== null && _key$getState$isShift !== void 0 ? _key$getState$isShift : undefined,
|
|
169
|
-
lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false
|
|
175
|
+
lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false,
|
|
176
|
+
isEditing: (_interactionTrackingP = interactionTrackingPluginKey.getState(editorState)) === null || _interactionTrackingP === void 0 ? void 0 : _interactionTrackingP.isEditing
|
|
170
177
|
};
|
|
171
178
|
},
|
|
172
179
|
contentComponent: function contentComponent(_ref7) {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { interactionTrackingPluginKey } from './pm-plugin';
|
|
2
|
+
export var stopEditing = function stopEditing(view) {
|
|
3
|
+
view.dispatch(view.state.tr.setMeta(interactionTrackingPluginKey, {
|
|
4
|
+
type: 'stopEditing'
|
|
5
|
+
}));
|
|
6
|
+
};
|
|
7
|
+
export var startEditing = function startEditing(view) {
|
|
8
|
+
view.dispatch(view.state.tr.setMeta(interactionTrackingPluginKey, {
|
|
9
|
+
type: 'startEditing'
|
|
10
|
+
}));
|
|
11
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { startEditing } from './commands';
|
|
2
|
+
import { getInteractionTrackingState } from './pm-plugin';
|
|
3
|
+
export var handleKeyDown = function handleKeyDown(view, event) {
|
|
4
|
+
// Check if this is a keyboard shortcut (Ctrl/Cmd + key)
|
|
5
|
+
var isShortcut = event.ctrlKey || event.metaKey || event.altKey;
|
|
6
|
+
if (isShortcut) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Only consider actual typing keys (not shortcuts)
|
|
11
|
+
// We need to check if it's a single character key or a deletion key
|
|
12
|
+
// and ensure it's not part of a shortcut
|
|
13
|
+
var isTypingKey =
|
|
14
|
+
// Single character keys (letters, numbers, symbols)
|
|
15
|
+
event.key.length === 1 || event.key === 'Backspace' || event.key === 'Delete' || event.key === ' ' || event.key === 'Enter';
|
|
16
|
+
if (!isTypingKey) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
var state = getInteractionTrackingState(view.state);
|
|
20
|
+
|
|
21
|
+
// if user hasnt started typing yet, start timer
|
|
22
|
+
if (!(state !== null && state !== void 0 && state.isEditing)) {
|
|
23
|
+
startEditing(view);
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { stopEditing } from './commands';
|
|
2
|
+
import { getInteractionTrackingState } from './pm-plugin';
|
|
3
|
+
export var handleMouseMove = function handleMouseMove(view) {
|
|
4
|
+
var state = getInteractionTrackingState(view.state);
|
|
5
|
+
// if user has stopped editing and moved their mouse, show block controls again
|
|
6
|
+
if (state !== null && state !== void 0 && state.isEditing) {
|
|
7
|
+
stopEditing(view);
|
|
8
|
+
}
|
|
9
|
+
return false;
|
|
10
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import { PluginKey } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
import { handleKeyDown } from './handle-key-down';
|
|
4
|
+
import { handleMouseMove } from './handle-mouse-move';
|
|
5
|
+
export var interactionTrackingPluginKey = new PluginKey('interactionTrackingPlugin');
|
|
6
|
+
export var createInteractionTrackingPlugin = function createInteractionTrackingPlugin() {
|
|
7
|
+
return new SafePlugin({
|
|
8
|
+
key: interactionTrackingPluginKey,
|
|
9
|
+
state: {
|
|
10
|
+
init: function init() {
|
|
11
|
+
return {
|
|
12
|
+
isEditing: false
|
|
13
|
+
};
|
|
14
|
+
},
|
|
15
|
+
apply: function apply(tr, pluginState) {
|
|
16
|
+
var meta = tr.getMeta(interactionTrackingPluginKey);
|
|
17
|
+
switch (meta === null || meta === void 0 ? void 0 : meta.type) {
|
|
18
|
+
case 'startEditing':
|
|
19
|
+
return {
|
|
20
|
+
isEditing: true
|
|
21
|
+
};
|
|
22
|
+
case 'stopEditing':
|
|
23
|
+
return {
|
|
24
|
+
isEditing: false
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return pluginState;
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
props: {
|
|
31
|
+
handleKeyDown: handleKeyDown,
|
|
32
|
+
handleDOMEvents: {
|
|
33
|
+
mousemove: handleMouseMove
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
export var getInteractionTrackingState = function getInteractionTrackingState(state) {
|
|
39
|
+
return interactionTrackingPluginKey.getState(state);
|
|
40
|
+
};
|
|
@@ -10,14 +10,15 @@ var visibleStyles = xcss({
|
|
|
10
10
|
});
|
|
11
11
|
var hiddenStyles = xcss({
|
|
12
12
|
opacity: 0,
|
|
13
|
-
// CONFIRM this change doesnt cause this issue to regress https://product-fabric.atlassian.net/browse/ED-24136
|
|
14
13
|
visibility: 'hidden'
|
|
15
14
|
});
|
|
16
15
|
export var VisibilityContainer = function VisibilityContainer(_ref) {
|
|
17
16
|
var api = _ref.api,
|
|
18
17
|
children = _ref.children;
|
|
19
|
-
var
|
|
18
|
+
var isTypeAheadOpen = useSharedPluginStateSelector(api, 'typeAhead.isOpen');
|
|
19
|
+
var isEditing = useSharedPluginStateSelector(api, 'blockControls.isEditing');
|
|
20
|
+
var shouldHide = isTypeAheadOpen || isEditing;
|
|
20
21
|
return /*#__PURE__*/React.createElement(Box, {
|
|
21
|
-
xcss: [baseStyles,
|
|
22
|
+
xcss: [baseStyles, shouldHide ? hiddenStyles : visibleStyles]
|
|
22
23
|
}, children);
|
|
23
24
|
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import { PluginKey } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
import type { EditorState } from '@atlaskit/editor-prosemirror/state';
|
|
4
|
+
export type InteractionTrackingPluginState = {
|
|
5
|
+
/**
|
|
6
|
+
* Tracks if a users intention is to edit the document (e.g. typing, deleting, etc.)
|
|
7
|
+
*/
|
|
8
|
+
isEditing: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const interactionTrackingPluginKey: PluginKey<InteractionTrackingPluginState>;
|
|
11
|
+
export declare const createInteractionTrackingPlugin: () => SafePlugin<InteractionTrackingPluginState>;
|
|
12
|
+
export declare const getInteractionTrackingState: (state: EditorState) => InteractionTrackingPluginState | undefined;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import { PluginKey } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
import type { EditorState } from '@atlaskit/editor-prosemirror/state';
|
|
4
|
+
export type InteractionTrackingPluginState = {
|
|
5
|
+
/**
|
|
6
|
+
* Tracks if a users intention is to edit the document (e.g. typing, deleting, etc.)
|
|
7
|
+
*/
|
|
8
|
+
isEditing: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const interactionTrackingPluginKey: PluginKey<InteractionTrackingPluginState>;
|
|
11
|
+
export declare const createInteractionTrackingPlugin: () => SafePlugin<InteractionTrackingPluginState>;
|
|
12
|
+
export declare const getInteractionTrackingState: (state: EditorState) => InteractionTrackingPluginState | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/editor-plugin-block-controls",
|
|
3
|
-
"version": "3.8.
|
|
3
|
+
"version": "3.8.7",
|
|
4
4
|
"description": "Block controls plugin for @atlaskit/editor-core",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"@atlaskit/pragmatic-drag-and-drop": "^1.5.0",
|
|
52
52
|
"@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.0",
|
|
53
53
|
"@atlaskit/pragmatic-drag-and-drop-react-drop-indicator": "^3.0.0",
|
|
54
|
-
"@atlaskit/primitives": "^14.
|
|
54
|
+
"@atlaskit/primitives": "^14.4.0",
|
|
55
55
|
"@atlaskit/theme": "^18.0.0",
|
|
56
56
|
"@atlaskit/tmp-editor-statsig": "^4.6.0",
|
|
57
57
|
"@atlaskit/tokens": "^4.7.0",
|