@atlaskit/editor-plugin-insert-block 4.1.7 → 4.2.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.
Files changed (57) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/insertBlockPlugin.js +15 -5
  3. package/dist/cjs/ui/toolbar-components/EmojiButton.js +132 -0
  4. package/dist/cjs/ui/toolbar-components/ImageButton.js +47 -0
  5. package/dist/cjs/ui/toolbar-components/LayoutButton.js +39 -0
  6. package/dist/cjs/ui/toolbar-components/MediaButton.js +71 -0
  7. package/dist/cjs/ui/toolbar-components/MentionButton.js +46 -0
  8. package/dist/cjs/ui/toolbar-components/TableButton.js +52 -0
  9. package/dist/cjs/ui/toolbar-components/TableSizePicker.js +83 -0
  10. package/dist/cjs/ui/toolbar-components/TaskListButton.js +40 -0
  11. package/dist/cjs/ui/toolbar-components/utils/utils.js +12 -0
  12. package/dist/cjs/ui/toolbar-components.js +172 -0
  13. package/dist/es2019/insertBlockPlugin.js +15 -5
  14. package/dist/es2019/ui/toolbar-components/EmojiButton.js +120 -0
  15. package/dist/es2019/ui/toolbar-components/ImageButton.js +46 -0
  16. package/dist/es2019/ui/toolbar-components/LayoutButton.js +37 -0
  17. package/dist/es2019/ui/toolbar-components/MediaButton.js +66 -0
  18. package/dist/es2019/ui/toolbar-components/MentionButton.js +42 -0
  19. package/dist/es2019/ui/toolbar-components/TableButton.js +50 -0
  20. package/dist/es2019/ui/toolbar-components/TableSizePicker.js +70 -0
  21. package/dist/es2019/ui/toolbar-components/TaskListButton.js +38 -0
  22. package/dist/es2019/ui/toolbar-components/utils/utils.js +4 -0
  23. package/dist/es2019/ui/toolbar-components.js +152 -0
  24. package/dist/esm/insertBlockPlugin.js +15 -5
  25. package/dist/esm/ui/toolbar-components/EmojiButton.js +123 -0
  26. package/dist/esm/ui/toolbar-components/ImageButton.js +40 -0
  27. package/dist/esm/ui/toolbar-components/LayoutButton.js +32 -0
  28. package/dist/esm/ui/toolbar-components/MediaButton.js +63 -0
  29. package/dist/esm/ui/toolbar-components/MentionButton.js +39 -0
  30. package/dist/esm/ui/toolbar-components/TableButton.js +45 -0
  31. package/dist/esm/ui/toolbar-components/TableSizePicker.js +74 -0
  32. package/dist/esm/ui/toolbar-components/TaskListButton.js +33 -0
  33. package/dist/esm/ui/toolbar-components/utils/utils.js +6 -0
  34. package/dist/esm/ui/toolbar-components.js +165 -0
  35. package/dist/types/types/index.d.ts +3 -1
  36. package/dist/types/ui/toolbar-components/EmojiButton.d.ts +8 -0
  37. package/dist/types/ui/toolbar-components/ImageButton.d.ts +8 -0
  38. package/dist/types/ui/toolbar-components/LayoutButton.d.ts +8 -0
  39. package/dist/types/ui/toolbar-components/MediaButton.d.ts +8 -0
  40. package/dist/types/ui/toolbar-components/MentionButton.d.ts +8 -0
  41. package/dist/types/ui/toolbar-components/TableButton.d.ts +8 -0
  42. package/dist/types/ui/toolbar-components/TableSizePicker.d.ts +9 -0
  43. package/dist/types/ui/toolbar-components/TaskListButton.d.ts +8 -0
  44. package/dist/types/ui/toolbar-components/utils/utils.d.ts +4 -0
  45. package/dist/types/ui/toolbar-components.d.ts +9 -0
  46. package/dist/types-ts4.5/types/index.d.ts +3 -1
  47. package/dist/types-ts4.5/ui/toolbar-components/EmojiButton.d.ts +8 -0
  48. package/dist/types-ts4.5/ui/toolbar-components/ImageButton.d.ts +8 -0
  49. package/dist/types-ts4.5/ui/toolbar-components/LayoutButton.d.ts +8 -0
  50. package/dist/types-ts4.5/ui/toolbar-components/MediaButton.d.ts +8 -0
  51. package/dist/types-ts4.5/ui/toolbar-components/MentionButton.d.ts +8 -0
  52. package/dist/types-ts4.5/ui/toolbar-components/TableButton.d.ts +8 -0
  53. package/dist/types-ts4.5/ui/toolbar-components/TableSizePicker.d.ts +9 -0
  54. package/dist/types-ts4.5/ui/toolbar-components/TaskListButton.d.ts +8 -0
  55. package/dist/types-ts4.5/ui/toolbar-components/utils/utils.d.ts +4 -0
  56. package/dist/types-ts4.5/ui/toolbar-components.d.ts +9 -0
  57. package/package.json +6 -3
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl-next';
3
+ import { INPUT_METHOD } from '@atlaskit/editor-common/analytics';
4
+ import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
5
+ import { useEditorToolbar } from '@atlaskit/editor-common/toolbar';
6
+ import { ToolbarButton, ToolbarTooltip, TaskIcon } from '@atlaskit/editor-toolbar';
7
+ export const TaskListButton = ({
8
+ api
9
+ }) => {
10
+ const {
11
+ formatMessage
12
+ } = useIntl();
13
+ const {
14
+ editorView
15
+ } = useEditorToolbar();
16
+ if (!(editorView !== null && editorView !== void 0 && editorView.state.schema.nodes.taskItem)) {
17
+ return null;
18
+ }
19
+ const onClick = () => {
20
+ if (editorView) {
21
+ var _api$taskDecision;
22
+ const {
23
+ state,
24
+ dispatch
25
+ } = editorView;
26
+ api === null || api === void 0 ? void 0 : (_api$taskDecision = api.taskDecision) === null || _api$taskDecision === void 0 ? void 0 : _api$taskDecision.actions.insertTaskDecision('taskList', INPUT_METHOD.TOOLBAR)(state, dispatch);
27
+ }
28
+ };
29
+ return /*#__PURE__*/React.createElement(ToolbarTooltip, {
30
+ content: formatMessage(messages.action)
31
+ }, /*#__PURE__*/React.createElement(ToolbarButton, {
32
+ iconBefore: /*#__PURE__*/React.createElement(TaskIcon, {
33
+ label: formatMessage(messages.action)
34
+ }),
35
+ onClick: onClick,
36
+ ariaKeyshortcuts: "[ ] Space"
37
+ }));
38
+ };
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Checks if an element is detached (i.e. not in the current document)
3
+ */
4
+ export const isDetachedElement = el => !document.body.contains(el);
@@ -0,0 +1,152 @@
1
+ import React from 'react';
2
+ import { INSERT_BLOCK_SECTION, TASK_LIST_GROUP, MEDIA_GROUP, TOOLBAR_RANK, TOOLBARS, INSERT_BLOCK_SECTION_RANK, TASK_LIST_BUTTON, TASK_LIST_GROUP_RANK, MEDIA_BUTTON, MENTION_GROUP, MEDIA_GROUP_RANK, MENTION_BUTTON, MENTION_GROUP_RANK, EMOJI_GROUP, EMOJI_BUTTON, EMOJI_GROUP_RANK, LAYOUT_GROUP, LAYOUT_BUTTON, LAYOUT_GROUP_RANK, TABLE_GROUP_RANK, TABLE_BUTTON, TABLE_GROUP, TABLE_SIZE_PICKER } from "@atlaskit/editor-common/toolbar";
3
+ import { EmojiButton } from './toolbar-components/EmojiButton';
4
+ import { ImageButton } from './toolbar-components/ImageButton';
5
+ import { LayoutButton } from './toolbar-components/LayoutButton';
6
+ import { MediaButton } from './toolbar-components/MediaButton';
7
+ import { MentionButton } from './toolbar-components/MentionButton';
8
+ import { TableButton } from './toolbar-components/TableButton';
9
+ import { TableSizePicker } from './toolbar-components/TableSizePicker';
10
+ import { TaskListButton } from "./toolbar-components/TaskListButton";
11
+ export const getToolbarComponents = ({
12
+ api,
13
+ tableSelectorSupported
14
+ }) => {
15
+ return [{
16
+ type: INSERT_BLOCK_SECTION.type,
17
+ key: INSERT_BLOCK_SECTION.key,
18
+ parents: [{
19
+ type: 'toolbar',
20
+ key: TOOLBARS.PRIMARY_TOOLBAR,
21
+ rank: TOOLBAR_RANK[INSERT_BLOCK_SECTION.key]
22
+ }]
23
+ }, {
24
+ type: TASK_LIST_GROUP.type,
25
+ key: TASK_LIST_GROUP.key,
26
+ parents: [{
27
+ type: INSERT_BLOCK_SECTION.type,
28
+ key: INSERT_BLOCK_SECTION.key,
29
+ rank: INSERT_BLOCK_SECTION_RANK[TASK_LIST_GROUP.key]
30
+ }]
31
+ }, {
32
+ type: TASK_LIST_BUTTON.type,
33
+ key: TASK_LIST_BUTTON.key,
34
+ parents: [{
35
+ type: TASK_LIST_GROUP.type,
36
+ key: TASK_LIST_GROUP.key,
37
+ rank: TASK_LIST_GROUP_RANK[TASK_LIST_BUTTON.key]
38
+ }],
39
+ component: () => /*#__PURE__*/React.createElement(TaskListButton, {
40
+ api: api
41
+ })
42
+ }, {
43
+ type: MEDIA_GROUP.type,
44
+ key: MEDIA_GROUP.key,
45
+ parents: [{
46
+ type: INSERT_BLOCK_SECTION.type,
47
+ key: INSERT_BLOCK_SECTION.key,
48
+ rank: INSERT_BLOCK_SECTION_RANK[MEDIA_GROUP.key]
49
+ }]
50
+ }, {
51
+ type: MEDIA_BUTTON.type,
52
+ key: MEDIA_BUTTON.key,
53
+ parents: [{
54
+ type: MEDIA_GROUP.type,
55
+ key: MEDIA_GROUP.key,
56
+ rank: MEDIA_GROUP_RANK[MEDIA_BUTTON.key]
57
+ }],
58
+ component: () => !!(api !== null && api !== void 0 && api.imageUpload) ? /*#__PURE__*/React.createElement(ImageButton, {
59
+ api: api
60
+ }) : /*#__PURE__*/React.createElement(MediaButton, {
61
+ api: api
62
+ })
63
+ }, {
64
+ type: MENTION_GROUP.type,
65
+ key: MENTION_GROUP.key,
66
+ parents: [{
67
+ type: INSERT_BLOCK_SECTION.type,
68
+ key: INSERT_BLOCK_SECTION.key,
69
+ rank: INSERT_BLOCK_SECTION_RANK[MENTION_GROUP.key]
70
+ }]
71
+ }, {
72
+ type: MENTION_BUTTON.type,
73
+ key: MENTION_BUTTON.key,
74
+ parents: [{
75
+ type: MENTION_GROUP.type,
76
+ key: MENTION_GROUP.key,
77
+ rank: MENTION_GROUP_RANK[MENTION_BUTTON.key]
78
+ }],
79
+ component: () => /*#__PURE__*/React.createElement(MentionButton, {
80
+ api: api
81
+ })
82
+ }, {
83
+ type: EMOJI_GROUP.type,
84
+ key: EMOJI_GROUP.key,
85
+ parents: [{
86
+ type: INSERT_BLOCK_SECTION.type,
87
+ key: INSERT_BLOCK_SECTION.key,
88
+ rank: INSERT_BLOCK_SECTION_RANK[EMOJI_GROUP.key]
89
+ }]
90
+ }, {
91
+ type: EMOJI_BUTTON.type,
92
+ key: EMOJI_BUTTON.key,
93
+ parents: [{
94
+ type: EMOJI_GROUP.type,
95
+ key: EMOJI_GROUP.key,
96
+ rank: EMOJI_GROUP_RANK[EMOJI_BUTTON.key]
97
+ }],
98
+ component: () => /*#__PURE__*/React.createElement(EmojiButton, {
99
+ api: api
100
+ })
101
+ }, {
102
+ type: LAYOUT_GROUP.type,
103
+ key: LAYOUT_GROUP.key,
104
+ parents: [{
105
+ type: INSERT_BLOCK_SECTION.type,
106
+ key: INSERT_BLOCK_SECTION.key,
107
+ rank: INSERT_BLOCK_SECTION_RANK[LAYOUT_GROUP.key]
108
+ }]
109
+ }, {
110
+ type: LAYOUT_BUTTON.type,
111
+ key: LAYOUT_BUTTON.key,
112
+ parents: [{
113
+ type: LAYOUT_GROUP.type,
114
+ key: LAYOUT_GROUP.key,
115
+ rank: LAYOUT_GROUP_RANK[LAYOUT_BUTTON.key]
116
+ }],
117
+ component: () => /*#__PURE__*/React.createElement(LayoutButton, {
118
+ api: api
119
+ })
120
+ }, {
121
+ type: TABLE_GROUP.type,
122
+ key: TABLE_GROUP.key,
123
+ parents: [{
124
+ type: INSERT_BLOCK_SECTION.type,
125
+ key: INSERT_BLOCK_SECTION.key,
126
+ rank: INSERT_BLOCK_SECTION_RANK[TABLE_GROUP.key]
127
+ }]
128
+ }, {
129
+ type: TABLE_BUTTON.type,
130
+ key: TABLE_BUTTON.key,
131
+ parents: [{
132
+ type: TABLE_GROUP.type,
133
+ key: TABLE_GROUP.key,
134
+ rank: TABLE_GROUP_RANK[TABLE_BUTTON.key]
135
+ }],
136
+ component: () => /*#__PURE__*/React.createElement(TableButton, {
137
+ api: api
138
+ })
139
+ }, {
140
+ type: TABLE_SIZE_PICKER.type,
141
+ key: TABLE_SIZE_PICKER.key,
142
+ parents: [{
143
+ type: TABLE_GROUP.type,
144
+ key: TABLE_GROUP.key,
145
+ rank: TABLE_GROUP_RANK[TABLE_SIZE_PICKER.key]
146
+ }],
147
+ component: () => /*#__PURE__*/React.createElement(TableSizePicker, {
148
+ api: api,
149
+ tableSelectorSupported: tableSelectorSupported
150
+ })
151
+ }];
152
+ };
@@ -7,8 +7,10 @@ import { ToolbarSize } from '@atlaskit/editor-common/types';
7
7
  import { useSharedPluginStateSelector } from '@atlaskit/editor-common/use-shared-plugin-state-selector';
8
8
  import { BLOCK_QUOTE, CODE_BLOCK, PANEL } from '@atlaskit/editor-plugin-block-type/consts';
9
9
  import { fg } from '@atlaskit/platform-feature-flags';
10
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
10
11
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
11
12
  import { toggleInsertBlockPmKey, toggleInsertBlockPmPlugin } from './pm-plugins/toggleInsertBlock';
13
+ import { getToolbarComponents } from './ui/toolbar-components';
12
14
  // Ignored via go/ees005
13
15
  // eslint-disable-next-line import/no-named-as-default
14
16
  import ToolbarInsertBlock from './ui/ToolbarInsertBlock';
@@ -92,7 +94,6 @@ function delayUntilIdle(cb) {
92
94
  });
93
95
  }
94
96
  export var insertBlockPlugin = function insertBlockPlugin(_ref) {
95
- var _api$primaryToolbar;
96
97
  var _ref$config = _ref.config,
97
98
  options = _ref$config === void 0 ? {} : _ref$config,
98
99
  api = _ref.api;
@@ -151,10 +152,19 @@ export var insertBlockPlugin = function insertBlockPlugin(_ref) {
151
152
  renderNode: renderNode
152
153
  });
153
154
  };
154
- api === null || api === void 0 || (_api$primaryToolbar = api.primaryToolbar) === null || _api$primaryToolbar === void 0 || _api$primaryToolbar.actions.registerComponent({
155
- name: 'insertBlock',
156
- component: primaryToolbarComponent
157
- });
155
+ if (expValEquals('platform_editor_toolbar_aifc', 'isEnabled', true)) {
156
+ var _api$toolbar;
157
+ api === null || api === void 0 || (_api$toolbar = api.toolbar) === null || _api$toolbar === void 0 || _api$toolbar.actions.registerComponents(getToolbarComponents({
158
+ api: api,
159
+ tableSelectorSupported: options.tableSelectorSupported
160
+ }));
161
+ } else {
162
+ var _api$primaryToolbar;
163
+ api === null || api === void 0 || (_api$primaryToolbar = api.primaryToolbar) === null || _api$primaryToolbar === void 0 || _api$primaryToolbar.actions.registerComponent({
164
+ name: 'insertBlock',
165
+ component: primaryToolbarComponent
166
+ });
167
+ }
158
168
  var plugin = {
159
169
  name: 'insertBlock',
160
170
  actions: {
@@ -0,0 +1,123 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import React, { useRef, useState } from 'react';
3
+ import { useIntl } from 'react-intl-next';
4
+ import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE, INPUT_METHOD } from '@atlaskit/editor-common/analytics';
5
+ import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
6
+ import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
7
+ import { Popup } from '@atlaskit/editor-common/ui';
8
+ import { OutsideClickTargetRefContext, withReactEditorViewOuterListeners as withOuterListeners } from '@atlaskit/editor-common/ui-react';
9
+ import { akEditorMenuZIndex } from '@atlaskit/editor-shared-styles';
10
+ import { ToolbarButton, ToolbarTooltip, EmojiIcon } from '@atlaskit/editor-toolbar';
11
+ import { EmojiPicker as AkEmojiPicker } from '@atlaskit/emoji/picker';
12
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
13
+ import { isDetachedElement } from './utils/utils';
14
+ var EmojiPicker = function EmojiPicker(props) {
15
+ var setOutsideClickTargetRef = React.useContext(OutsideClickTargetRefContext);
16
+ return /*#__PURE__*/React.createElement(AkEmojiPicker, {
17
+ onPickerRef: setOutsideClickTargetRef,
18
+ emojiProvider: props.emojiProvider,
19
+ onSelection: props.onSelection
20
+ });
21
+ };
22
+ var EmojiPickerWithListeners = withOuterListeners(EmojiPicker);
23
+ export var EmojiButton = function EmojiButton(_ref) {
24
+ var api = _ref.api;
25
+ var _useIntl = useIntl(),
26
+ formatMessage = _useIntl.formatMessage;
27
+ var _useState = useState(false),
28
+ _useState2 = _slicedToArray(_useState, 2),
29
+ emojiPickerOpen = _useState2[0],
30
+ setEmojiPickerOpen = _useState2[1];
31
+ var emojiButtonRef = useRef(null);
32
+ var _useSharedPluginState = useSharedPluginStateWithSelector(api, ['emoji', 'typeAhead'], function (states) {
33
+ var _states$emojiState, _states$emojiState2, _states$typeAheadStat;
34
+ return {
35
+ emojiProviderSelector: (_states$emojiState = states.emojiState) === null || _states$emojiState === void 0 ? void 0 : _states$emojiState.emojiProvider,
36
+ emojiProviderPromise: (_states$emojiState2 = states.emojiState) === null || _states$emojiState2 === void 0 ? void 0 : _states$emojiState2.emojiProviderPromise,
37
+ isTypeAheadAllowed: (_states$typeAheadStat = states.typeAheadState) === null || _states$typeAheadStat === void 0 ? void 0 : _states$typeAheadStat.isAllowed
38
+ };
39
+ }),
40
+ emojiProviderSelector = _useSharedPluginState.emojiProviderSelector,
41
+ emojiProviderPromise = _useSharedPluginState.emojiProviderPromise,
42
+ isTypeAheadAllowed = _useSharedPluginState.isTypeAheadAllowed;
43
+ if (!(api !== null && api !== void 0 && api.emoji)) {
44
+ return null;
45
+ }
46
+ var toggleEmojiPickerOpen = function toggleEmojiPickerOpen(newState) {
47
+ var oldState = emojiPickerOpen;
48
+ if (newState === true && oldState === false) {
49
+ var _api$analytics;
50
+ api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || _api$analytics.actions.fireAnalyticsEvent({
51
+ action: ACTION.OPENED,
52
+ actionSubject: ACTION_SUBJECT.PICKER,
53
+ actionSubjectId: ACTION_SUBJECT_ID.PICKER_EMOJI,
54
+ attributes: {
55
+ inputMethod: INPUT_METHOD.TOOLBAR
56
+ },
57
+ eventType: EVENT_TYPE.UI
58
+ });
59
+ }
60
+ setEmojiPickerOpen(newState);
61
+ };
62
+ var getEmojiProvider = function getEmojiProvider() {
63
+ if (emojiProviderSelector) {
64
+ return Promise.resolve(emojiProviderSelector);
65
+ }
66
+ };
67
+ var emojiProvider = expValEquals('platform_editor_prevent_toolbar_layout_shifts', 'isEnabled', true) ? emojiProviderPromise : getEmojiProvider();
68
+ var onPopupUnmount = function onPopupUnmount() {
69
+ requestAnimationFrame(function () {
70
+ return api === null || api === void 0 ? void 0 : api.core.actions.focus();
71
+ });
72
+ };
73
+ var handleSelectedEmoji = function handleSelectedEmoji(emojiId) {
74
+ var _api$emoji;
75
+ api === null || api === void 0 || api.core.actions.focus();
76
+ api === null || api === void 0 || api.core.actions.execute(api === null || api === void 0 || (_api$emoji = api.emoji) === null || _api$emoji === void 0 ? void 0 : _api$emoji.commands.insertEmoji(emojiId, INPUT_METHOD.PICKER));
77
+ toggleEmojiPickerOpen(false);
78
+ return true;
79
+ };
80
+ var handleEmojiClickOutside = function handleEmojiClickOutside(e) {
81
+ // Ignore click events for detached elements.
82
+ // Workaround for FS-1322 - where two onClicks fire - one when the upload button is
83
+ // still in the document, and one once it's detached. Does not always occur, and
84
+ // may be a side effect of a react render optimisation
85
+ if (e.target instanceof HTMLElement && !isDetachedElement(e.target)) {
86
+ toggleEmojiPickerOpen(false);
87
+ }
88
+ };
89
+ var handleEmojiPressEscape = function handleEmojiPressEscape() {
90
+ var _emojiButtonRef$curre;
91
+ toggleEmojiPickerOpen(false);
92
+ emojiButtonRef === null || emojiButtonRef === void 0 || (_emojiButtonRef$curre = emojiButtonRef.current) === null || _emojiButtonRef$curre === void 0 || _emojiButtonRef$curre.focus();
93
+ };
94
+ var onClick = function onClick() {
95
+ toggleEmojiPickerOpen(!emojiPickerOpen);
96
+ };
97
+ return /*#__PURE__*/React.createElement(React.Fragment, null, emojiPickerOpen && emojiButtonRef.current && emojiProvider && /*#__PURE__*/React.createElement(Popup, {
98
+ target: emojiButtonRef.current,
99
+ fitHeight: 350,
100
+ fitWidth: 350,
101
+ offset: [0, 3],
102
+ mountTo: emojiButtonRef.current,
103
+ onUnmount: onPopupUnmount,
104
+ focusTrap: true,
105
+ zIndex: akEditorMenuZIndex
106
+ }, /*#__PURE__*/React.createElement(EmojiPickerWithListeners, {
107
+ emojiProvider: emojiProvider,
108
+ onSelection: handleSelectedEmoji,
109
+ handleClickOutside: handleEmojiClickOutside,
110
+ handleEscapeKeydown: handleEmojiPressEscape
111
+ })), /*#__PURE__*/React.createElement(ToolbarTooltip, {
112
+ content: formatMessage(messages.emoji)
113
+ }, /*#__PURE__*/React.createElement(ToolbarButton, {
114
+ iconBefore: /*#__PURE__*/React.createElement(EmojiIcon, {
115
+ label: formatMessage(messages.emoji)
116
+ }),
117
+ ariaKeyshortcuts: "Shift+;",
118
+ ref: emojiButtonRef,
119
+ onClick: onClick,
120
+ isSelected: emojiPickerOpen,
121
+ isDisabled: !isTypeAheadAllowed || !emojiProvider
122
+ })));
123
+ };
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl-next';
3
+ import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
4
+ import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
5
+ import { useEditorToolbar } from '@atlaskit/editor-common/toolbar';
6
+ import { ToolbarButton, ToolbarTooltip, ImageIcon } from '@atlaskit/editor-toolbar';
7
+ export var ImageButton = function ImageButton(_ref) {
8
+ var api = _ref.api;
9
+ var _useIntl = useIntl(),
10
+ formatMessage = _useIntl.formatMessage;
11
+ var _useSharedPluginState = useSharedPluginStateWithSelector(api, ['connectivity', 'imageUpload'], function (states) {
12
+ var _states$connectivityS, _states$imageUploadSt;
13
+ return {
14
+ connectivityMode: (_states$connectivityS = states.connectivityState) === null || _states$connectivityS === void 0 ? void 0 : _states$connectivityS.mode,
15
+ imageUploadEnabled: (_states$imageUploadSt = states.imageUploadState) === null || _states$imageUploadSt === void 0 ? void 0 : _states$imageUploadSt.enabled
16
+ };
17
+ }),
18
+ connectivityMode = _useSharedPluginState.connectivityMode,
19
+ imageUploadEnabled = _useSharedPluginState.imageUploadEnabled;
20
+ var _useEditorToolbar = useEditorToolbar(),
21
+ editorView = _useEditorToolbar.editorView;
22
+ var isOffline = connectivityMode === 'offline';
23
+ var onClick = function onClick() {
24
+ if (editorView) {
25
+ var _api$imageUpload;
26
+ var state = editorView.state,
27
+ dispatch = editorView.dispatch;
28
+ api === null || api === void 0 || (_api$imageUpload = api.imageUpload) === null || _api$imageUpload === void 0 || _api$imageUpload.actions.startUpload()(state, dispatch);
29
+ }
30
+ };
31
+ return /*#__PURE__*/React.createElement(ToolbarTooltip, {
32
+ content: formatMessage(messages.image)
33
+ }, /*#__PURE__*/React.createElement(ToolbarButton, {
34
+ iconBefore: /*#__PURE__*/React.createElement(ImageIcon, {
35
+ label: formatMessage(messages.image)
36
+ }),
37
+ onClick: onClick,
38
+ isDisabled: !imageUploadEnabled || isOffline
39
+ }));
40
+ };
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl-next';
3
+ import { INPUT_METHOD } from '@atlaskit/editor-common/analytics';
4
+ import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
5
+ import { useEditorToolbar } from '@atlaskit/editor-common/toolbar';
6
+ import { ToolbarButton, ToolbarTooltip, LayoutIcon } from '@atlaskit/editor-toolbar';
7
+ export var LayoutButton = function LayoutButton(_ref) {
8
+ var api = _ref.api;
9
+ var _useIntl = useIntl(),
10
+ formatMessage = _useIntl.formatMessage;
11
+ var _useEditorToolbar = useEditorToolbar(),
12
+ editorView = _useEditorToolbar.editorView;
13
+ if (!(api !== null && api !== void 0 && api.layout)) {
14
+ return null;
15
+ }
16
+ var onClick = function onClick() {
17
+ if (editorView) {
18
+ var _api$layout;
19
+ var state = editorView.state,
20
+ dispatch = editorView.dispatch;
21
+ api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 || _api$layout.actions.insertLayoutColumns(INPUT_METHOD.TOOLBAR)(state, dispatch);
22
+ }
23
+ };
24
+ return /*#__PURE__*/React.createElement(ToolbarTooltip, {
25
+ content: formatMessage(messages.columns)
26
+ }, /*#__PURE__*/React.createElement(ToolbarButton, {
27
+ iconBefore: /*#__PURE__*/React.createElement(LayoutIcon, {
28
+ label: formatMessage(messages.columns)
29
+ }),
30
+ onClick: onClick
31
+ }));
32
+ };
@@ -0,0 +1,63 @@
1
+ import React, { useRef } from 'react';
2
+ import { useIntl } from 'react-intl-next';
3
+ import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE, INPUT_METHOD } from '@atlaskit/editor-common/analytics';
4
+ import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
5
+ import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
6
+ import { ToolbarButton, ToolbarTooltip, ImageIcon } from '@atlaskit/editor-toolbar';
7
+ import { fg } from '@atlaskit/platform-feature-flags';
8
+ export var MediaButton = function MediaButton(_ref) {
9
+ var api = _ref.api;
10
+ var _useIntl = useIntl(),
11
+ formatMessage = _useIntl.formatMessage;
12
+ var _useSharedPluginState = useSharedPluginStateWithSelector(api, ['media', 'connectivity'], function (states) {
13
+ var _states$mediaState, _states$mediaState2, _states$connectivityS;
14
+ return {
15
+ showMediaPicker: (_states$mediaState = states.mediaState) === null || _states$mediaState === void 0 ? void 0 : _states$mediaState.showMediaPicker,
16
+ allowsUploads: (_states$mediaState2 = states.mediaState) === null || _states$mediaState2 === void 0 ? void 0 : _states$mediaState2.allowsUploads,
17
+ connectivityMode: (_states$connectivityS = states.connectivityState) === null || _states$connectivityS === void 0 ? void 0 : _states$connectivityS.mode
18
+ };
19
+ }),
20
+ showMediaPicker = _useSharedPluginState.showMediaPicker,
21
+ connectivityMode = _useSharedPluginState.connectivityMode,
22
+ allowsUploads = _useSharedPluginState.allowsUploads;
23
+ var mediaButtonRef = useRef(null);
24
+ if (!(api !== null && api !== void 0 && api.media)) {
25
+ return null;
26
+ }
27
+ var onClick = function onClick() {
28
+ var _api$mediaInsert, _api$analytics;
29
+ if (!showMediaPicker) {
30
+ return;
31
+ }
32
+ if (api !== null && api !== void 0 && (_api$mediaInsert = api.mediaInsert) !== null && _api$mediaInsert !== void 0 && (_api$mediaInsert = _api$mediaInsert.commands) !== null && _api$mediaInsert !== void 0 && _api$mediaInsert.showMediaInsertPopup && fg('platform_editor_add_media_from_url_rollout')) {
33
+ var _api$core, _api$mediaInsert2;
34
+ var mountInfo = mediaButtonRef.current ? {
35
+ ref: mediaButtonRef.current,
36
+ mountPoint: mediaButtonRef.current
37
+ } : undefined;
38
+ api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(api === null || api === void 0 || (_api$mediaInsert2 = api.mediaInsert) === null || _api$mediaInsert2 === void 0 ? void 0 : _api$mediaInsert2.commands.showMediaInsertPopup(mountInfo));
39
+ } else {
40
+ showMediaPicker();
41
+ }
42
+ api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || _api$analytics.actions.fireAnalyticsEvent({
43
+ action: ACTION.OPENED,
44
+ actionSubject: ACTION_SUBJECT.PICKER,
45
+ actionSubjectId: fg('platform_editor_add_media_from_url_rollout') ? ACTION_SUBJECT_ID.PICKER_MEDIA : ACTION_SUBJECT_ID.PICKER_CLOUD,
46
+ attributes: {
47
+ inputMethod: INPUT_METHOD.TOOLBAR
48
+ },
49
+ eventType: EVENT_TYPE.UI
50
+ });
51
+ };
52
+ var isOffline = connectivityMode === 'offline';
53
+ return /*#__PURE__*/React.createElement(ToolbarTooltip, {
54
+ content: formatMessage(messages.addMediaFiles)
55
+ }, /*#__PURE__*/React.createElement(ToolbarButton, {
56
+ iconBefore: /*#__PURE__*/React.createElement(ImageIcon, {
57
+ label: formatMessage(messages.addMediaFiles)
58
+ }),
59
+ onClick: onClick,
60
+ ref: mediaButtonRef,
61
+ isDisabled: isOffline || !allowsUploads
62
+ }));
63
+ };
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl-next';
3
+ import { INPUT_METHOD } from '@atlaskit/editor-common/analytics';
4
+ import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
5
+ import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
6
+ import { ToolbarButton, ToolbarTooltip, MentionIcon } from '@atlaskit/editor-toolbar';
7
+ export var MentionButton = function MentionButton(_ref) {
8
+ var api = _ref.api;
9
+ var _useIntl = useIntl(),
10
+ formatMessage = _useIntl.formatMessage;
11
+ var _useSharedPluginState = useSharedPluginStateWithSelector(api, ['mention', 'typeAhead'], function (states) {
12
+ var _states$mentionState, _states$mentionState2, _states$typeAheadStat;
13
+ return {
14
+ canInsertMention: (_states$mentionState = states.mentionState) === null || _states$mentionState === void 0 ? void 0 : _states$mentionState.canInsertMention,
15
+ mentionProvider: (_states$mentionState2 = states.mentionState) === null || _states$mentionState2 === void 0 ? void 0 : _states$mentionState2.mentionProvider,
16
+ isTypeAheadAllowed: (_states$typeAheadStat = states.typeAheadState) === null || _states$typeAheadStat === void 0 ? void 0 : _states$typeAheadStat.isAllowed
17
+ };
18
+ }),
19
+ canInsertMention = _useSharedPluginState.canInsertMention,
20
+ mentionProvider = _useSharedPluginState.mentionProvider,
21
+ isTypeAheadAllowed = _useSharedPluginState.isTypeAheadAllowed;
22
+ if (!(api !== null && api !== void 0 && api.mention)) {
23
+ return null;
24
+ }
25
+ var onClick = function onClick() {
26
+ var _api$mention;
27
+ api === null || api === void 0 || (_api$mention = api.mention) === null || _api$mention === void 0 || (_api$mention = _api$mention.actions) === null || _api$mention === void 0 || _api$mention.openTypeAhead(INPUT_METHOD.TOOLBAR);
28
+ };
29
+ return /*#__PURE__*/React.createElement(ToolbarTooltip, {
30
+ content: formatMessage(messages.mention)
31
+ }, /*#__PURE__*/React.createElement(ToolbarButton, {
32
+ iconBefore: /*#__PURE__*/React.createElement(MentionIcon, {
33
+ label: formatMessage(messages.mention)
34
+ }),
35
+ onClick: onClick,
36
+ ariaKeyshortcuts: "Shift+2 Space",
37
+ isDisabled: !canInsertMention || !mentionProvider || !isTypeAheadAllowed
38
+ }));
39
+ };
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl-next';
3
+ import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE, INPUT_METHOD } from '@atlaskit/editor-common/analytics';
4
+ import { formatShortcut, toggleTable } from '@atlaskit/editor-common/keymaps';
5
+ import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
6
+ import { useEditorToolbar } from '@atlaskit/editor-common/toolbar';
7
+ import { ToolbarButton, ToolbarTooltip, TableIcon } from '@atlaskit/editor-toolbar';
8
+ export var TableButton = function TableButton(_ref) {
9
+ var api = _ref.api;
10
+ var _useIntl = useIntl(),
11
+ formatMessage = _useIntl.formatMessage;
12
+ var _useEditorToolbar = useEditorToolbar(),
13
+ editorView = _useEditorToolbar.editorView;
14
+ if (!(editorView !== null && editorView !== void 0 && editorView.state.schema.nodes.table)) {
15
+ return null;
16
+ }
17
+ var onClick = function onClick() {
18
+ if (editorView) {
19
+ var state = editorView.state,
20
+ dispatch = editorView.dispatch;
21
+ // workaround to solve race condition where cursor is not placed correctly inside table
22
+ queueMicrotask(function () {
23
+ var _api$table, _api$table$actions$in, _api$table$actions;
24
+ api === null || api === void 0 || (_api$table = api.table) === null || _api$table === void 0 || (_api$table$actions$in = (_api$table$actions = _api$table.actions).insertTable) === null || _api$table$actions$in === void 0 || _api$table$actions$in.call(_api$table$actions, {
25
+ action: ACTION.INSERTED,
26
+ actionSubject: ACTION_SUBJECT.DOCUMENT,
27
+ actionSubjectId: ACTION_SUBJECT_ID.TABLE,
28
+ attributes: {
29
+ inputMethod: INPUT_METHOD.TOOLBAR
30
+ },
31
+ eventType: EVENT_TYPE.TRACK
32
+ })(state, dispatch);
33
+ });
34
+ }
35
+ };
36
+ return /*#__PURE__*/React.createElement(ToolbarTooltip, {
37
+ content: formatMessage(messages.table)
38
+ }, /*#__PURE__*/React.createElement(ToolbarButton, {
39
+ iconBefore: /*#__PURE__*/React.createElement(TableIcon, {
40
+ label: formatMessage(messages.table)
41
+ }),
42
+ onClick: onClick,
43
+ ariaKeyshortcuts: formatShortcut(toggleTable)
44
+ }));
45
+ };
@@ -0,0 +1,74 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import React, { useRef, useState } from 'react';
3
+ import { useIntl } from 'react-intl-next';
4
+ import { INPUT_METHOD } from '@atlaskit/editor-common/analytics';
5
+ import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
6
+ import { useEditorToolbar } from '@atlaskit/editor-common/toolbar';
7
+ import { TableSelectorPopup } from '@atlaskit/editor-common/ui';
8
+ import { MoreItemsIcon, ToolbarButton, ToolbarTooltip } from '@atlaskit/editor-toolbar';
9
+ import { isDetachedElement } from './utils/utils';
10
+ export var TableSizePicker = function TableSizePicker(_ref) {
11
+ var api = _ref.api,
12
+ tableSelectorSupported = _ref.tableSelectorSupported;
13
+ var _useIntl = useIntl(),
14
+ formatMessage = _useIntl.formatMessage;
15
+ var _useEditorToolbar = useEditorToolbar(),
16
+ editorView = _useEditorToolbar.editorView;
17
+ var _useState = useState(false),
18
+ _useState2 = _slicedToArray(_useState, 2),
19
+ tableSizePickerOpen = _useState2[0],
20
+ setTableSizePickerOpen = _useState2[1];
21
+ var _useState3 = useState(false),
22
+ _useState4 = _slicedToArray(_useState3, 2),
23
+ isOpenedByKeyboard = _useState4[0],
24
+ setIsOpenedByKeyboard = _useState4[1];
25
+ var tableSizePickerRef = useRef(null);
26
+ if (!(editorView !== null && editorView !== void 0 && editorView.state.schema.nodes.table) || !tableSelectorSupported) {
27
+ return null;
28
+ }
29
+ var handleSelectedTableSize = function handleSelectedTableSize(rowsCount, colsCount) {
30
+ // workaround to solve race condition where cursor is not placed correctly inside table
31
+ queueMicrotask(function () {
32
+ var _api$core, _api$table;
33
+ api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(api === null || api === void 0 || (_api$table = api.table) === null || _api$table === void 0 ? void 0 : _api$table.commands.insertTableWithSize(rowsCount, colsCount, INPUT_METHOD.PICKER));
34
+ });
35
+ setTableSizePickerOpen(false);
36
+ };
37
+ var handleTableSelectorClickOutside = function handleTableSelectorClickOutside(e) {
38
+ // Ignore click events for detached elements.
39
+ if (e.target instanceof HTMLElement && !isDetachedElement(e.target)) {
40
+ setTableSizePickerOpen(false);
41
+ }
42
+ };
43
+ var handleTableSelectorPressEscape = function handleTableSelectorPressEscape() {
44
+ var _tableSizePickerRef$c;
45
+ setTableSizePickerOpen(false);
46
+ (_tableSizePickerRef$c = tableSizePickerRef.current) === null || _tableSizePickerRef$c === void 0 || _tableSizePickerRef$c.focus();
47
+ };
48
+ var onUnmount = function onUnmount() {
49
+ api === null || api === void 0 || api.core.actions.focus();
50
+ };
51
+ var onClick = function onClick(event) {
52
+ setIsOpenedByKeyboard(event.detail === 0 ? true : false);
53
+ setTableSizePickerOpen(!tableSizePickerOpen);
54
+ };
55
+ return /*#__PURE__*/React.createElement(React.Fragment, null, tableSizePickerRef.current && tableSizePickerOpen && /*#__PURE__*/React.createElement(TableSelectorPopup, {
56
+ allowOutsideSelection: true,
57
+ target: tableSizePickerRef.current,
58
+ onUnmount: onUnmount,
59
+ onSelection: handleSelectedTableSize,
60
+ popupsMountPoint: tableSizePickerRef.current,
61
+ handleClickOutside: handleTableSelectorClickOutside,
62
+ handleEscapeKeydown: handleTableSelectorPressEscape,
63
+ isOpenedByKeyboard: isOpenedByKeyboard
64
+ }), /*#__PURE__*/React.createElement(ToolbarTooltip, {
65
+ content: formatMessage(messages.tableSelector)
66
+ }, /*#__PURE__*/React.createElement(ToolbarButton, {
67
+ iconBefore: /*#__PURE__*/React.createElement(MoreItemsIcon, {
68
+ label: formatMessage(messages.tableSelector)
69
+ }),
70
+ onClick: onClick,
71
+ isSelected: tableSizePickerOpen,
72
+ ref: tableSizePickerRef
73
+ })));
74
+ };