@atlaskit/editor-common 74.57.0 → 74.58.0
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 +7 -0
- package/dist/cjs/element-browser/ElementBrowser.js +152 -0
- package/dist/cjs/element-browser/ViewMore.js +39 -0
- package/dist/cjs/element-browser/components/CategoryList.js +115 -0
- package/dist/cjs/element-browser/components/ElementBrowserLoader.js +36 -0
- package/dist/cjs/element-browser/components/ElementList/ElementList.js +256 -0
- package/dist/cjs/element-browser/components/ElementList/EmptyState.js +47 -0
- package/dist/cjs/element-browser/components/ElementList/NotFoundIllustration.js +70 -0
- package/dist/cjs/element-browser/components/ElementList/cellSizeAndPositionGetter.js +42 -0
- package/dist/cjs/element-browser/components/ElementList/utils.js +54 -0
- package/dist/cjs/element-browser/components/ElementSearch.js +88 -0
- package/dist/cjs/element-browser/components/StatelessElementBrowser.js +269 -0
- package/dist/cjs/element-browser/constants.js +41 -0
- package/dist/cjs/element-browser/hooks/use-container-width.js +70 -0
- package/dist/cjs/element-browser/hooks/use-focus.js +51 -0
- package/dist/cjs/element-browser/hooks/use-select-and-focus-on-arrow-navigation.js +286 -0
- package/dist/cjs/element-browser/index.js +20 -0
- package/dist/cjs/element-browser/types.js +12 -0
- package/dist/cjs/monitoring/error.js +1 -1
- package/dist/cjs/ui/DropList/index.js +1 -1
- package/dist/cjs/utils/performance/measure-render.js +4 -3
- package/dist/cjs/utils/performance/measure-tti.js +9 -3
- package/dist/es2019/element-browser/ElementBrowser.js +117 -0
- package/dist/es2019/element-browser/ViewMore.js +40 -0
- package/dist/es2019/element-browser/components/CategoryList.js +106 -0
- package/dist/es2019/element-browser/components/ElementBrowserLoader.js +21 -0
- package/dist/es2019/element-browser/components/ElementList/ElementList.js +320 -0
- package/dist/es2019/element-browser/components/ElementList/EmptyState.js +58 -0
- package/dist/es2019/element-browser/components/ElementList/NotFoundIllustration.js +65 -0
- package/dist/es2019/element-browser/components/ElementList/cellSizeAndPositionGetter.js +39 -0
- package/dist/es2019/element-browser/components/ElementList/utils.js +50 -0
- package/dist/es2019/element-browser/components/ElementSearch.js +117 -0
- package/dist/es2019/element-browser/components/StatelessElementBrowser.js +339 -0
- package/dist/es2019/element-browser/constants.js +23 -0
- package/dist/es2019/element-browser/hooks/use-container-width.js +59 -0
- package/dist/es2019/element-browser/hooks/use-focus.js +48 -0
- package/dist/es2019/element-browser/hooks/use-select-and-focus-on-arrow-navigation.js +284 -0
- package/dist/es2019/element-browser/index.js +2 -0
- package/dist/es2019/element-browser/types.js +5 -0
- package/dist/es2019/monitoring/error.js +1 -1
- package/dist/es2019/ui/DropList/index.js +1 -1
- package/dist/es2019/utils/performance/measure-render.js +2 -3
- package/dist/es2019/utils/performance/measure-tti.js +9 -3
- package/dist/esm/element-browser/ElementBrowser.js +142 -0
- package/dist/esm/element-browser/ViewMore.js +31 -0
- package/dist/esm/element-browser/components/CategoryList.js +105 -0
- package/dist/esm/element-browser/components/ElementBrowserLoader.js +23 -0
- package/dist/esm/element-browser/components/ElementList/ElementList.js +241 -0
- package/dist/esm/element-browser/components/ElementList/EmptyState.js +40 -0
- package/dist/esm/element-browser/components/ElementList/NotFoundIllustration.js +63 -0
- package/dist/esm/element-browser/components/ElementList/cellSizeAndPositionGetter.js +37 -0
- package/dist/esm/element-browser/components/ElementList/utils.js +46 -0
- package/dist/esm/element-browser/components/ElementSearch.js +77 -0
- package/dist/esm/element-browser/components/StatelessElementBrowser.js +258 -0
- package/dist/esm/element-browser/constants.js +23 -0
- package/dist/esm/element-browser/hooks/use-container-width.js +61 -0
- package/dist/esm/element-browser/hooks/use-focus.js +46 -0
- package/dist/esm/element-browser/hooks/use-select-and-focus-on-arrow-navigation.js +278 -0
- package/dist/esm/element-browser/index.js +2 -0
- package/dist/esm/element-browser/types.js +5 -0
- package/dist/esm/monitoring/error.js +1 -1
- package/dist/esm/ui/DropList/index.js +1 -1
- package/dist/esm/utils/performance/measure-render.js +2 -3
- package/dist/esm/utils/performance/measure-tti.js +9 -3
- package/dist/types/analytics/types/general-events.d.ts +2 -1
- package/dist/types/element-browser/ElementBrowser.d.ts +37 -0
- package/dist/types/element-browser/ViewMore.d.ts +6 -0
- package/dist/types/element-browser/components/CategoryList.d.ts +10 -0
- package/dist/types/element-browser/components/ElementBrowserLoader.d.ts +6 -0
- package/dist/types/element-browser/components/ElementList/ElementList.d.ts +33 -0
- package/dist/types/element-browser/components/ElementList/EmptyState.d.ts +6 -0
- package/dist/types/element-browser/components/ElementList/NotFoundIllustration.d.ts +2 -0
- package/dist/types/element-browser/components/ElementList/cellSizeAndPositionGetter.d.ts +7 -0
- package/dist/types/element-browser/components/ElementList/utils.d.ts +12 -0
- package/dist/types/element-browser/components/ElementSearch.d.ts +18 -0
- package/dist/types/element-browser/components/StatelessElementBrowser.d.ts +23 -0
- package/dist/types/element-browser/constants.d.ts +19 -0
- package/dist/types/element-browser/hooks/use-container-width.d.ts +33 -0
- package/dist/types/element-browser/hooks/use-focus.d.ts +35 -0
- package/dist/types/element-browser/hooks/use-select-and-focus-on-arrow-navigation.d.ts +72 -0
- package/dist/types/element-browser/index.d.ts +2 -0
- package/dist/types/element-browser/types.d.ts +12 -0
- package/dist/types/types/quick-insert.d.ts +1 -0
- package/dist/types/utils/performance/measure-render.d.ts +6 -4
- package/dist/types/utils/performance/measure-tti.d.ts +1 -1
- package/dist/types-ts4.5/analytics/types/general-events.d.ts +2 -1
- package/dist/types-ts4.5/element-browser/ElementBrowser.d.ts +37 -0
- package/dist/types-ts4.5/element-browser/ViewMore.d.ts +6 -0
- package/dist/types-ts4.5/element-browser/components/CategoryList.d.ts +10 -0
- package/dist/types-ts4.5/element-browser/components/ElementBrowserLoader.d.ts +6 -0
- package/dist/types-ts4.5/element-browser/components/ElementList/ElementList.d.ts +33 -0
- package/dist/types-ts4.5/element-browser/components/ElementList/EmptyState.d.ts +6 -0
- package/dist/types-ts4.5/element-browser/components/ElementList/NotFoundIllustration.d.ts +2 -0
- package/dist/types-ts4.5/element-browser/components/ElementList/cellSizeAndPositionGetter.d.ts +7 -0
- package/dist/types-ts4.5/element-browser/components/ElementList/utils.d.ts +12 -0
- package/dist/types-ts4.5/element-browser/components/ElementSearch.d.ts +18 -0
- package/dist/types-ts4.5/element-browser/components/StatelessElementBrowser.d.ts +23 -0
- package/dist/types-ts4.5/element-browser/constants.d.ts +19 -0
- package/dist/types-ts4.5/element-browser/hooks/use-container-width.d.ts +33 -0
- package/dist/types-ts4.5/element-browser/hooks/use-focus.d.ts +35 -0
- package/dist/types-ts4.5/element-browser/hooks/use-select-and-focus-on-arrow-navigation.d.ts +72 -0
- package/dist/types-ts4.5/element-browser/index.d.ts +2 -0
- package/dist/types-ts4.5/element-browser/types.d.ts +12 -0
- package/dist/types-ts4.5/types/quick-insert.d.ts +1 -0
- package/dist/types-ts4.5/utils/performance/measure-render.d.ts +6 -4
- package/dist/types-ts4.5/utils/performance/measure-tti.d.ts +1 -1
- package/element-browser/package.json +15 -0
- package/package.json +6 -2
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = useContainerWidth;
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
|
+
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
|
|
11
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _react2 = require("@emotion/react");
|
|
13
|
+
var _widthDetector = require("@atlaskit/width-detector");
|
|
14
|
+
var _templateObject;
|
|
15
|
+
/** @jsx jsx */
|
|
16
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
17
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
* Problem:
|
|
21
|
+
* While using WidthObserver, there's no initial width.
|
|
22
|
+
* That may cause problems, but not limited to, something like a lag between
|
|
23
|
+
* renders for conditionally rendered components.
|
|
24
|
+
*
|
|
25
|
+
* solution:
|
|
26
|
+
* useContainerWidth() hook
|
|
27
|
+
* it pre-measures the width of a parent container on initial mount
|
|
28
|
+
* and gives you back the containerWidth.
|
|
29
|
+
*
|
|
30
|
+
*
|
|
31
|
+
* Example hook usage:
|
|
32
|
+
*
|
|
33
|
+
* const { containerWidth, ContainerWidthMonitor } = useContainerWidth();
|
|
34
|
+
*
|
|
35
|
+
* return (
|
|
36
|
+
* <>
|
|
37
|
+
* <ContainerWidthMonitor />
|
|
38
|
+
* {containerWidth < 600 ? <MobileComponent /> : <DesktopComponent />}
|
|
39
|
+
* </>
|
|
40
|
+
* );
|
|
41
|
+
*
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
var widthObserverWrapper = (0, _react2.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n position: relative;\n"])));
|
|
45
|
+
function useContainerWidth() {
|
|
46
|
+
var _useState = (0, _react.useState)(0),
|
|
47
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
48
|
+
containerWidth = _useState2[0],
|
|
49
|
+
setContainerWidth = _useState2[1];
|
|
50
|
+
var ref = (0, _react.useRef)(null);
|
|
51
|
+
(0, _react.useEffect)(function () {
|
|
52
|
+
var current = ref.current;
|
|
53
|
+
if (ref && current) {
|
|
54
|
+
setContainerWidth(current.getBoundingClientRect().width);
|
|
55
|
+
}
|
|
56
|
+
}, [ref]);
|
|
57
|
+
var ContainerWidthMonitor = /*#__PURE__*/(0, _react.memo)(function () {
|
|
58
|
+
return (0, _react2.jsx)("div", {
|
|
59
|
+
css: widthObserverWrapper,
|
|
60
|
+
ref: ref,
|
|
61
|
+
tabIndex: -1
|
|
62
|
+
}, (0, _react2.jsx)(_widthDetector.WidthObserver, {
|
|
63
|
+
setWidth: setContainerWidth
|
|
64
|
+
}));
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
containerWidth: containerWidth,
|
|
68
|
+
ContainerWidthMonitor: ContainerWidthMonitor
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = useFocus;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
/**
|
|
9
|
+
* A custom hook that handles focus on a DOM element.
|
|
10
|
+
* Takes in a boolean value and calls element.focus
|
|
11
|
+
*
|
|
12
|
+
* @param {boolean} focus
|
|
13
|
+
*
|
|
14
|
+
* Example usage:
|
|
15
|
+
*******************************************************************************
|
|
16
|
+
* const SearchBar = ({ focus }) => {
|
|
17
|
+
* const ref = useFocus(focus);
|
|
18
|
+
* return <input ref={ref} />
|
|
19
|
+
* }
|
|
20
|
+
*******************************************************************************
|
|
21
|
+
* const ItemList = ({ items, focus }) => (
|
|
22
|
+
* <ul>
|
|
23
|
+
* {items.map((item, index) => (
|
|
24
|
+
* <Item key={item.uuid} item={item} focus={focus} />
|
|
25
|
+
* ))}
|
|
26
|
+
* </ul>
|
|
27
|
+
* );
|
|
28
|
+
*
|
|
29
|
+
* const Item = ({ item, focus }) => {
|
|
30
|
+
* const ref = useFocus(focus);
|
|
31
|
+
* return (
|
|
32
|
+
* <li ref={ref}>
|
|
33
|
+
* {item.name}
|
|
34
|
+
* </li>
|
|
35
|
+
* )
|
|
36
|
+
* }
|
|
37
|
+
*******************************************************************************
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
function useFocus(focus) {
|
|
41
|
+
var ref = (0, _react.useRef)(null);
|
|
42
|
+
(0, _react.useLayoutEffect)(function () {
|
|
43
|
+
var current = ref.current;
|
|
44
|
+
if (focus && current && document.activeElement !== current) {
|
|
45
|
+
current.focus({
|
|
46
|
+
preventScroll: true
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}, [focus]);
|
|
50
|
+
return ref;
|
|
51
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.ensureSafeIndex = exports.default = exports.ACTIONS = void 0;
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
var _react = require("react");
|
|
11
|
+
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; }
|
|
12
|
+
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) { (0, _defineProperty2.default)(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; }
|
|
13
|
+
/**
|
|
14
|
+
* a custom hook that handles keyboard navigation for Arrow keys based on a
|
|
15
|
+
* given listSize, and a step (for up and down arrows).
|
|
16
|
+
*
|
|
17
|
+
* @param {number} listSize
|
|
18
|
+
* @param {number} upDownStep
|
|
19
|
+
*
|
|
20
|
+
* Example usage:
|
|
21
|
+
* const list = ['Confluence','Jira','Atlaskit'];
|
|
22
|
+
* const {
|
|
23
|
+
* selectedItemIndex,
|
|
24
|
+
* focusedItemIndex,
|
|
25
|
+
* focusOnSearch,
|
|
26
|
+
* focusOnViewMore,
|
|
27
|
+
* setFocusedItemIndex,
|
|
28
|
+
* onKeyDown
|
|
29
|
+
* } = useSelectAndFocusOnArrowNavigation(list.length - 1, 1);
|
|
30
|
+
*
|
|
31
|
+
* return (
|
|
32
|
+
* <div onKeyDown={onKeyDown}>
|
|
33
|
+
* <SearchBar onClick={() => setFocusedItemIndex(undefined)} focus={focusOnSearch} />
|
|
34
|
+
* {list.map((item, index) => (
|
|
35
|
+
* <ListItem
|
|
36
|
+
* title={item}
|
|
37
|
+
* style={{ ..., color: selected ? 'selectedStateColor' : defaultColor }}
|
|
38
|
+
* onClick={() => {
|
|
39
|
+
* setFocusedItemIndex(index);
|
|
40
|
+
* }
|
|
41
|
+
* />
|
|
42
|
+
* )}
|
|
43
|
+
* </div>
|
|
44
|
+
* );
|
|
45
|
+
*
|
|
46
|
+
* const SearchBar = ({ focus }) => {
|
|
47
|
+
* const ref = useRefToFocusOrScroll(focus);
|
|
48
|
+
* return <input ref={ref} />
|
|
49
|
+
* }
|
|
50
|
+
*
|
|
51
|
+
*/
|
|
52
|
+
var ACTIONS = /*#__PURE__*/function (ACTIONS) {
|
|
53
|
+
ACTIONS["FOCUS_SEARCH"] = "focusOnSearch";
|
|
54
|
+
ACTIONS["UPDATE_STATE"] = "updateState";
|
|
55
|
+
ACTIONS["MOVE"] = "move";
|
|
56
|
+
return ACTIONS;
|
|
57
|
+
}({});
|
|
58
|
+
exports.ACTIONS = ACTIONS;
|
|
59
|
+
var reducer = function reducer(state, action) {
|
|
60
|
+
switch (action.type) {
|
|
61
|
+
case ACTIONS.UPDATE_STATE:
|
|
62
|
+
return _objectSpread(_objectSpread({}, state), action.payload);
|
|
63
|
+
case ACTIONS.FOCUS_SEARCH:
|
|
64
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
65
|
+
focusedItemIndex: undefined,
|
|
66
|
+
focusOnSearch: true,
|
|
67
|
+
focusOnViewMore: false
|
|
68
|
+
});
|
|
69
|
+
case ACTIONS.MOVE:
|
|
70
|
+
return moveReducer(state, action);
|
|
71
|
+
}
|
|
72
|
+
return state;
|
|
73
|
+
};
|
|
74
|
+
var moveReducer = function moveReducer(state, action) {
|
|
75
|
+
var listSize = state.listSize,
|
|
76
|
+
canFocusViewMore = state.canFocusViewMore;
|
|
77
|
+
if (state.focusOnSearch) {
|
|
78
|
+
// up arrow
|
|
79
|
+
if (action.payload.positions && action.payload.positions <= -1) {
|
|
80
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
81
|
+
focusOnSearch: false,
|
|
82
|
+
focusOnViewMore: !!canFocusViewMore,
|
|
83
|
+
focusedItemIndex: canFocusViewMore ? undefined : listSize,
|
|
84
|
+
selectedItemIndex: canFocusViewMore ? undefined : listSize
|
|
85
|
+
});
|
|
86
|
+
} else {
|
|
87
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
88
|
+
focusOnSearch: false,
|
|
89
|
+
focusOnViewMore: false,
|
|
90
|
+
focusedItemIndex: 0,
|
|
91
|
+
selectedItemIndex: 0
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (state.focusOnViewMore) {
|
|
96
|
+
// down arrow
|
|
97
|
+
if (action.payload.positions === 1) {
|
|
98
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
99
|
+
focusOnSearch: true,
|
|
100
|
+
focusOnViewMore: false,
|
|
101
|
+
focusedItemIndex: undefined,
|
|
102
|
+
// if search is focused then select first item.
|
|
103
|
+
selectedItemIndex: 0
|
|
104
|
+
});
|
|
105
|
+
} else {
|
|
106
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
107
|
+
focusOnSearch: false,
|
|
108
|
+
focusOnViewMore: false,
|
|
109
|
+
focusedItemIndex: listSize,
|
|
110
|
+
selectedItemIndex: listSize
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
var newIndex = state.selectedItemIndex ? state.selectedItemIndex + action.payload.positions : action.payload.positions;
|
|
115
|
+
var safeIndex = ensureSafeIndex(newIndex, state.listSize);
|
|
116
|
+
// down arrow key is pressed or right arrow key is pressed.
|
|
117
|
+
if (state.focusedItemIndex !== undefined && action.payload.positions && action.payload.positions >= 1) {
|
|
118
|
+
// when multi column element browser is open and we are in last
|
|
119
|
+
// row then newIndex will be greater than listSize when
|
|
120
|
+
// down arrow key is pressed.
|
|
121
|
+
// Or when last item is focused and down or right arrow key is pressed.
|
|
122
|
+
var isLastItemFocused = newIndex > listSize;
|
|
123
|
+
var focusOnSearch = isLastItemFocused && !canFocusViewMore;
|
|
124
|
+
var focusOnViewMore = isLastItemFocused && !!canFocusViewMore;
|
|
125
|
+
// if search is focused, then select first item.
|
|
126
|
+
// otherwise if view more is focused then select item should be undefined.
|
|
127
|
+
var selectedItemIndex = focusOnSearch ? 0 : focusOnViewMore ? undefined : safeIndex;
|
|
128
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
129
|
+
focusOnSearch: focusOnSearch,
|
|
130
|
+
focusOnViewMore: focusOnViewMore,
|
|
131
|
+
selectedItemIndex: selectedItemIndex,
|
|
132
|
+
focusedItemIndex: isLastItemFocused ? undefined : safeIndex
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// up arrow key is pressed or left arrow key is pressed.
|
|
137
|
+
if (state.focusedItemIndex !== undefined && action.payload.positions && action.payload.positions <= -1) {
|
|
138
|
+
// if arrow up key is pressed when focus is in first row,
|
|
139
|
+
// or, arrow left key is pressed when first item is focused,
|
|
140
|
+
// then newIndex will become less than zero.
|
|
141
|
+
// In this case, focus search, and, kept previously selected item.
|
|
142
|
+
var isFirstRowFocused = newIndex < 0;
|
|
143
|
+
// if focus goes to search then kept last selected item in first row.
|
|
144
|
+
var _selectedItemIndex = isFirstRowFocused ? state.selectedItemIndex : safeIndex;
|
|
145
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
146
|
+
// focus search if first item is focused on up or left arrow key
|
|
147
|
+
focusOnSearch: isFirstRowFocused,
|
|
148
|
+
focusOnViewMore: false,
|
|
149
|
+
focusedItemIndex: isFirstRowFocused ? undefined : safeIndex,
|
|
150
|
+
selectedItemIndex: _selectedItemIndex
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
154
|
+
focusOnSearch: false,
|
|
155
|
+
focusOnViewMore: false,
|
|
156
|
+
selectedItemIndex: safeIndex,
|
|
157
|
+
focusedItemIndex: safeIndex
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
var initialState = {
|
|
161
|
+
focusOnSearch: true,
|
|
162
|
+
focusOnViewMore: false,
|
|
163
|
+
selectedItemIndex: 0,
|
|
164
|
+
focusedItemIndex: undefined,
|
|
165
|
+
listSize: 0
|
|
166
|
+
};
|
|
167
|
+
var getInitialState = function getInitialState(listSize, canFocusViewMore) {
|
|
168
|
+
return function (initialState) {
|
|
169
|
+
return _objectSpread(_objectSpread({}, initialState), {}, {
|
|
170
|
+
listSize: listSize,
|
|
171
|
+
canFocusViewMore: canFocusViewMore
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
function useSelectAndFocusOnArrowNavigation(listSize, step, canFocusViewMore) {
|
|
176
|
+
var _useReducer = (0, _react.useReducer)(reducer, initialState, getInitialState(listSize, canFocusViewMore)),
|
|
177
|
+
_useReducer2 = (0, _slicedToArray2.default)(_useReducer, 2),
|
|
178
|
+
state = _useReducer2[0],
|
|
179
|
+
dispatch = _useReducer2[1];
|
|
180
|
+
(0, _react.useEffect)(function () {
|
|
181
|
+
dispatch({
|
|
182
|
+
type: ACTIONS.UPDATE_STATE,
|
|
183
|
+
payload: {
|
|
184
|
+
canFocusViewMore: canFocusViewMore
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}, [canFocusViewMore]);
|
|
188
|
+
var selectedItemIndex = state.selectedItemIndex,
|
|
189
|
+
focusedItemIndex = state.focusedItemIndex,
|
|
190
|
+
focusOnSearch = state.focusOnSearch,
|
|
191
|
+
focusOnViewMore = state.focusOnViewMore;
|
|
192
|
+
var reset = (0, _react.useCallback)(function (listSize) {
|
|
193
|
+
var payload = _objectSpread(_objectSpread({}, initialState), {}, {
|
|
194
|
+
listSize: listSize
|
|
195
|
+
});
|
|
196
|
+
dispatch({
|
|
197
|
+
type: ACTIONS.UPDATE_STATE,
|
|
198
|
+
payload: payload
|
|
199
|
+
});
|
|
200
|
+
}, []);
|
|
201
|
+
var removeFocusFromSearchAndSetOnItem = (0, _react.useCallback)(function (index) {
|
|
202
|
+
var payload = {
|
|
203
|
+
focusedItemIndex: index,
|
|
204
|
+
selectedItemIndex: index,
|
|
205
|
+
focusOnSearch: false,
|
|
206
|
+
focusOnViewMore: false
|
|
207
|
+
};
|
|
208
|
+
dispatch({
|
|
209
|
+
type: ACTIONS.UPDATE_STATE,
|
|
210
|
+
payload: payload
|
|
211
|
+
});
|
|
212
|
+
}, [dispatch]);
|
|
213
|
+
var setFocusOnSearch = (0, _react.useCallback)(function () {
|
|
214
|
+
dispatch({
|
|
215
|
+
type: ACTIONS.FOCUS_SEARCH,
|
|
216
|
+
payload: {}
|
|
217
|
+
});
|
|
218
|
+
}, [dispatch]);
|
|
219
|
+
var isMoving = (0, _react.useRef)(false);
|
|
220
|
+
var move = (0, _react.useCallback)(function (e, positions, actualStep) {
|
|
221
|
+
e.preventDefault();
|
|
222
|
+
e.stopPropagation();
|
|
223
|
+
|
|
224
|
+
// avoid firing 2 moves at the same time when holding an arrow down as this can freeze the screen
|
|
225
|
+
if (!isMoving.current) {
|
|
226
|
+
isMoving.current = true;
|
|
227
|
+
requestAnimationFrame(function () {
|
|
228
|
+
isMoving.current = false;
|
|
229
|
+
dispatch({
|
|
230
|
+
type: ACTIONS.MOVE,
|
|
231
|
+
payload: {
|
|
232
|
+
positions: positions,
|
|
233
|
+
step: actualStep
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}, []);
|
|
239
|
+
var onKeyDown = (0, _react.useCallback)(function (e) {
|
|
240
|
+
var avoidKeysWhileSearching = ['/',
|
|
241
|
+
// While already focused on search bar, let users type in.
|
|
242
|
+
'ArrowRight', 'ArrowLeft'];
|
|
243
|
+
if (focusOnSearch && avoidKeysWhileSearching.includes(e.key)) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
switch (e.key) {
|
|
247
|
+
case '/':
|
|
248
|
+
e.preventDefault();
|
|
249
|
+
e.stopPropagation();
|
|
250
|
+
return setFocusOnSearch();
|
|
251
|
+
case 'ArrowRight':
|
|
252
|
+
return move(e, +1);
|
|
253
|
+
case 'ArrowLeft':
|
|
254
|
+
return move(e, -1);
|
|
255
|
+
case 'ArrowDown':
|
|
256
|
+
return move(e, +step);
|
|
257
|
+
case 'ArrowUp':
|
|
258
|
+
return move(e, -step, step);
|
|
259
|
+
}
|
|
260
|
+
}, [focusOnSearch, setFocusOnSearch, move, step]);
|
|
261
|
+
(0, _react.useEffect)(function () {
|
|
262
|
+
// To reset selection when user filters
|
|
263
|
+
reset(listSize);
|
|
264
|
+
}, [listSize, reset]);
|
|
265
|
+
return {
|
|
266
|
+
selectedItemIndex: selectedItemIndex,
|
|
267
|
+
onKeyDown: onKeyDown,
|
|
268
|
+
focusOnSearch: focusOnSearch,
|
|
269
|
+
focusOnViewMore: focusOnViewMore,
|
|
270
|
+
setFocusOnSearch: setFocusOnSearch,
|
|
271
|
+
focusedItemIndex: focusedItemIndex,
|
|
272
|
+
setFocusedItemIndex: removeFocusFromSearchAndSetOnItem
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
var ensureSafeIndex = function ensureSafeIndex(index, listSize) {
|
|
276
|
+
if (index < 0) {
|
|
277
|
+
return 0;
|
|
278
|
+
}
|
|
279
|
+
if (index > listSize) {
|
|
280
|
+
return listSize;
|
|
281
|
+
}
|
|
282
|
+
return index;
|
|
283
|
+
};
|
|
284
|
+
exports.ensureSafeIndex = ensureSafeIndex;
|
|
285
|
+
var _default = useSelectAndFocusOnArrowNavigation;
|
|
286
|
+
exports.default = _default;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
Object.defineProperty(exports, "ELEMENT_ITEM_HEIGHT", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function get() {
|
|
10
|
+
return _constants.ELEMENT_ITEM_HEIGHT;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(exports, "ElementBrowser", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function get() {
|
|
16
|
+
return _ElementBrowserLoader.default;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
var _ElementBrowserLoader = _interopRequireDefault(require("./components/ElementBrowserLoader"));
|
|
20
|
+
var _constants = require("./constants");
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Modes = void 0;
|
|
7
|
+
var Modes = /*#__PURE__*/function (Modes) {
|
|
8
|
+
Modes["full"] = "full";
|
|
9
|
+
Modes["inline"] = "inline";
|
|
10
|
+
return Modes;
|
|
11
|
+
}({});
|
|
12
|
+
exports.Modes = Modes;
|
|
@@ -16,7 +16,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
|
|
|
16
16
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
17
|
var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
|
|
18
18
|
var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
|
|
19
|
-
var packageVersion = "74.
|
|
19
|
+
var packageVersion = "74.58.0";
|
|
20
20
|
var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
|
|
21
21
|
// Remove URL as it has UGC
|
|
22
22
|
// TODO: Sanitise the URL instead of just removing it
|
|
@@ -24,7 +24,7 @@ var _templateObject, _templateObject2, _templateObject3;
|
|
|
24
24
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
25
25
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } /** @jsx jsx */
|
|
26
26
|
var packageName = "@atlaskit/editor-common";
|
|
27
|
-
var packageVersion = "74.
|
|
27
|
+
var packageVersion = "74.58.0";
|
|
28
28
|
var halfFocusRing = 1;
|
|
29
29
|
var dropOffset = '0, 8';
|
|
30
30
|
var DropList = /*#__PURE__*/function (_Component) {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.getDistortedDurationMonitor =
|
|
6
|
+
exports.getDistortedDurationMonitor = void 0;
|
|
7
7
|
exports.measureRender = measureRender;
|
|
8
8
|
var _isPerformanceApiAvailable = require("./is-performance-api-available");
|
|
9
9
|
/**
|
|
@@ -11,7 +11,7 @@ var _isPerformanceApiAvailable = require("./is-performance-api-available");
|
|
|
11
11
|
* distorted duration measurements (where the measurement uses the
|
|
12
12
|
* requestAnimationFrame api).
|
|
13
13
|
*/
|
|
14
|
-
function getDistortedDurationMonitor() {
|
|
14
|
+
var getDistortedDurationMonitor = function getDistortedDurationMonitor() {
|
|
15
15
|
if (typeof document === 'undefined') {
|
|
16
16
|
return {
|
|
17
17
|
distortedDuration: false,
|
|
@@ -43,7 +43,7 @@ function getDistortedDurationMonitor() {
|
|
|
43
43
|
document.removeEventListener('visibilitychange', handleVisibilityChange);
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
|
-
}
|
|
46
|
+
};
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
49
|
* Measures time it takes to render a frame including -> style, paint, layout and composition.
|
|
@@ -58,6 +58,7 @@ function getDistortedDurationMonitor() {
|
|
|
58
58
|
* | javascript (framework) | style | layout | paint | composite | javascript | ...
|
|
59
59
|
* | startMark + scheduling rAF | | rAF callback, endMark
|
|
60
60
|
*/
|
|
61
|
+
exports.getDistortedDurationMonitor = getDistortedDurationMonitor;
|
|
61
62
|
function measureRender(
|
|
62
63
|
/**
|
|
63
64
|
* Unique name for the measurement
|
|
@@ -8,6 +8,7 @@ exports.getTTISeverity = getTTISeverity;
|
|
|
8
8
|
exports.measureTTI = measureTTI;
|
|
9
9
|
var _analytics = require("../analytics");
|
|
10
10
|
var _isPerformanceApiAvailable = require("./is-performance-api-available");
|
|
11
|
+
var _measureRender = require("./measure-render");
|
|
11
12
|
function measureTTI(onMeasureComplete) {
|
|
12
13
|
var idleThreshold = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
|
|
13
14
|
var cancelAfter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 60;
|
|
@@ -18,6 +19,8 @@ function measureTTI(onMeasureComplete) {
|
|
|
18
19
|
return;
|
|
19
20
|
}
|
|
20
21
|
var start = performance.now();
|
|
22
|
+
// Keeping track of users moving away from the tab, which distorts the TTI measurement
|
|
23
|
+
var distortedDurationMonitor = (0, _measureRender.getDistortedDurationMonitor)();
|
|
21
24
|
var prevLongTask;
|
|
22
25
|
var lastLongTask = {
|
|
23
26
|
startTime: start,
|
|
@@ -48,13 +51,16 @@ function measureTTI(onMeasureComplete) {
|
|
|
48
51
|
var canceled = elapsedTimeMs > cancelAfterMs;
|
|
49
52
|
if (!prevLongTask) {
|
|
50
53
|
observer.disconnect();
|
|
51
|
-
|
|
54
|
+
distortedDurationMonitor.cleanup();
|
|
55
|
+
return onMeasureComplete(prevEnd, 0, false, distortedDurationMonitor.distortedDuration);
|
|
52
56
|
} else if (lastLongTask.startTime - prevEnd >= idleThreshold) {
|
|
53
57
|
observer.disconnect();
|
|
54
|
-
|
|
58
|
+
distortedDurationMonitor.cleanup();
|
|
59
|
+
return onMeasureComplete(prevEnd, prevEnd - start, canceled, distortedDurationMonitor.distortedDuration);
|
|
55
60
|
} else if (now - lastEnd >= idleThreshold || canceled) {
|
|
56
61
|
observer.disconnect();
|
|
57
|
-
|
|
62
|
+
distortedDurationMonitor.cleanup();
|
|
63
|
+
return onMeasureComplete(lastEnd, lastEnd - start, canceled, distortedDurationMonitor.distortedDuration);
|
|
58
64
|
}
|
|
59
65
|
return setTimeout(checkIdle, idleThreshold);
|
|
60
66
|
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import React, { PureComponent } from 'react';
|
|
3
|
+
import StatelessElementBrowser from './components/StatelessElementBrowser';
|
|
4
|
+
export default class ElementBrowser extends PureComponent {
|
|
5
|
+
constructor(...args) {
|
|
6
|
+
super(...args);
|
|
7
|
+
_defineProperty(this, "state", {
|
|
8
|
+
categories: [],
|
|
9
|
+
items: [],
|
|
10
|
+
searchTerm: '',
|
|
11
|
+
selectedCategory: this.props.defaultCategory
|
|
12
|
+
});
|
|
13
|
+
_defineProperty(this, "getCategories", (items = this.fetchItems()) =>
|
|
14
|
+
// NOTE: we fetch all items to determine available categories.
|
|
15
|
+
this.filterCategories(items, this.props.categories));
|
|
16
|
+
_defineProperty(this, "filterCategories", (items, categories = []) => {
|
|
17
|
+
const {
|
|
18
|
+
showCategories
|
|
19
|
+
} = this.props;
|
|
20
|
+
if (!showCategories) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
return categories.filter(category => category.name === 'all' || items.some(item => (item.categories || []).includes(category.name)));
|
|
24
|
+
});
|
|
25
|
+
_defineProperty(this, "fetchItems", (query, category) => {
|
|
26
|
+
return this.props.getItems(query, category);
|
|
27
|
+
});
|
|
28
|
+
_defineProperty(this, "handleSearch", searchTerm => {
|
|
29
|
+
const {
|
|
30
|
+
defaultCategory
|
|
31
|
+
} = this.props;
|
|
32
|
+
this.setState({
|
|
33
|
+
searchTerm,
|
|
34
|
+
selectedCategory: defaultCategory
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
_defineProperty(this, "handleCategorySelection", clickedCategory => {
|
|
38
|
+
const {
|
|
39
|
+
selectedCategory: stateCategoryValue
|
|
40
|
+
} = this.state;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Reset selection if clicked on the same category twice.
|
|
44
|
+
*/
|
|
45
|
+
if (stateCategoryValue === clickedCategory.name) {
|
|
46
|
+
return this.setState({
|
|
47
|
+
selectedCategory: this.props.defaultCategory
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
this.setState({
|
|
51
|
+
selectedCategory: clickedCategory.name,
|
|
52
|
+
searchTerm: ''
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
componentDidMount() {
|
|
57
|
+
const items = this.fetchItems();
|
|
58
|
+
this.setState({
|
|
59
|
+
items,
|
|
60
|
+
categories: this.getCategories(items)
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
componentDidUpdate(prevProps, prevState) {
|
|
64
|
+
const {
|
|
65
|
+
searchTerm,
|
|
66
|
+
selectedCategory
|
|
67
|
+
} = this.state;
|
|
68
|
+
|
|
69
|
+
// Update both items and categories when there's a new getItems
|
|
70
|
+
if (this.props.getItems !== prevProps.getItems) {
|
|
71
|
+
this.setState({
|
|
72
|
+
categories: this.getCategories(),
|
|
73
|
+
items: this.fetchItems(searchTerm, selectedCategory)
|
|
74
|
+
});
|
|
75
|
+
} else if (searchTerm !== prevState.searchTerm || selectedCategory !== prevState.selectedCategory) {
|
|
76
|
+
this.setState({
|
|
77
|
+
items: this.fetchItems(searchTerm, selectedCategory)
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
render() {
|
|
82
|
+
const {
|
|
83
|
+
onInsertItem,
|
|
84
|
+
onSelectItem,
|
|
85
|
+
showSearch,
|
|
86
|
+
showCategories,
|
|
87
|
+
mode,
|
|
88
|
+
emptyStateHandler,
|
|
89
|
+
viewMoreItem
|
|
90
|
+
} = this.props;
|
|
91
|
+
const {
|
|
92
|
+
categories,
|
|
93
|
+
searchTerm,
|
|
94
|
+
selectedCategory,
|
|
95
|
+
items
|
|
96
|
+
} = this.state;
|
|
97
|
+
return /*#__PURE__*/React.createElement(StatelessElementBrowser, {
|
|
98
|
+
items: items,
|
|
99
|
+
categories: categories,
|
|
100
|
+
onSearch: this.handleSearch,
|
|
101
|
+
onSelectCategory: this.handleCategorySelection,
|
|
102
|
+
onSelectItem: onSelectItem,
|
|
103
|
+
onInsertItem: onInsertItem,
|
|
104
|
+
selectedCategory: selectedCategory,
|
|
105
|
+
showSearch: showSearch,
|
|
106
|
+
showCategories: showCategories,
|
|
107
|
+
mode: mode,
|
|
108
|
+
searchTerm: searchTerm,
|
|
109
|
+
emptyStateHandler: emptyStateHandler,
|
|
110
|
+
viewMoreItem: viewMoreItem
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
_defineProperty(ElementBrowser, "defaultProps", {
|
|
115
|
+
defaultCategory: 'all',
|
|
116
|
+
onInsertItem: () => {}
|
|
117
|
+
});
|