@atlaskit/editor-plugin-code-block 12.1.3 → 12.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/cjs/editor-commands/index.js +1 -1
- package/dist/cjs/pm-plugins/toolbar.js +32 -1
- package/dist/cjs/ui/LanguagePicker.compiled.css +12 -0
- package/dist/cjs/ui/LanguagePicker.js +127 -0
- package/dist/cjs/ui/language-picker-options.js +45 -0
- package/dist/es2019/editor-commands/index.js +1 -1
- package/dist/es2019/pm-plugins/toolbar.js +31 -2
- package/dist/es2019/ui/LanguagePicker.compiled.css +12 -0
- package/dist/es2019/ui/LanguagePicker.js +110 -0
- package/dist/es2019/ui/language-picker-options.js +31 -0
- package/dist/esm/editor-commands/index.js +1 -1
- package/dist/esm/pm-plugins/toolbar.js +32 -1
- package/dist/esm/ui/LanguagePicker.compiled.css +12 -0
- package/dist/esm/ui/LanguagePicker.js +118 -0
- package/dist/esm/ui/language-picker-options.js +38 -0
- package/dist/types/editor-commands/index.d.ts +1 -1
- package/dist/types/ui/LanguagePicker.d.ts +20 -0
- package/dist/types/ui/language-picker-options.d.ts +19 -0
- package/dist/types-ts4.5/editor-commands/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/LanguagePicker.d.ts +20 -0
- package/dist/types-ts4.5/ui/language-picker-options.d.ts +19 -0
- package/package.json +13 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-code-block
|
|
2
2
|
|
|
3
|
+
## 12.1.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`47e7189edb428`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/47e7189edb428) -
|
|
8
|
+
Refresh code block language picker UI
|
|
9
|
+
- Updated dependencies
|
|
10
|
+
|
|
11
|
+
## 12.1.4
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies
|
|
16
|
+
|
|
3
17
|
## 12.1.3
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
|
@@ -70,7 +70,7 @@ var changeLanguage = exports.changeLanguage = function changeLanguage(editorAnal
|
|
|
70
70
|
action: _analytics.ACTION.LANGUAGE_SELECTED,
|
|
71
71
|
actionSubject: _analytics.ACTION_SUBJECT.CODE_BLOCK,
|
|
72
72
|
attributes: {
|
|
73
|
-
language: language
|
|
73
|
+
language: language !== null && language !== void 0 ? language : 'none'
|
|
74
74
|
},
|
|
75
75
|
eventType: _analytics.EVENT_TYPE.TRACK
|
|
76
76
|
})(result);
|
|
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.languageListFilter = exports.getToolbarConfig = void 0;
|
|
9
9
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
10
10
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
12
|
var _codeBlock = require("@atlaskit/editor-common/code-block");
|
|
12
13
|
var _messages = _interopRequireWildcard(require("@atlaskit/editor-common/messages"));
|
|
13
14
|
var _toolbarFlagCheck = require("@atlaskit/editor-common/toolbar-flag-check");
|
|
@@ -20,6 +21,8 @@ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
|
20
21
|
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
|
|
21
22
|
var _editorCommands = require("../editor-commands");
|
|
22
23
|
var _WrapIcon = require("../ui/icons/WrapIcon");
|
|
24
|
+
var _languagePickerOptions = require("../ui/language-picker-options");
|
|
25
|
+
var _LanguagePicker = require("../ui/LanguagePicker");
|
|
23
26
|
var _codeBlockCopySelectionPlugin = require("./codeBlockCopySelectionPlugin");
|
|
24
27
|
var _languageList = require("./language-list");
|
|
25
28
|
var _pluginKey = require("./plugin-key");
|
|
@@ -81,6 +84,34 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig() {
|
|
|
81
84
|
options: options,
|
|
82
85
|
filterOption: languageListFilter
|
|
83
86
|
};
|
|
87
|
+
var languagePicker;
|
|
88
|
+
if ((0, _expValEquals.expValEquals)('platform_editor_code_block_q4_lovability', 'isEnabled', true) && (0, _platformFeatureFlags.fg)('platform_editor_code_block_add_line_number_button')) {
|
|
89
|
+
var languagePickerOptions = options;
|
|
90
|
+
var groupedOptions = (0, _languagePickerOptions.createGroupedLanguageOptions)({
|
|
91
|
+
formatMessage: formatMessage,
|
|
92
|
+
languages: languagePickerOptions
|
|
93
|
+
});
|
|
94
|
+
var defaultPickerValue = language ? languagePickerOptions.find(function (option) {
|
|
95
|
+
return language === _languagePickerOptions.NONE_LANGUAGE_VALUE ? option.value === _languagePickerOptions.PLAIN_TEXT_LANGUAGE_VALUE : option.value === language || option.alias.includes(language);
|
|
96
|
+
}) : undefined;
|
|
97
|
+
languagePicker = {
|
|
98
|
+
type: 'custom',
|
|
99
|
+
fallback: [],
|
|
100
|
+
render: function render(view) {
|
|
101
|
+
if (!view) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
return /*#__PURE__*/_react.default.createElement(_LanguagePicker.LanguagePicker, {
|
|
105
|
+
api: api,
|
|
106
|
+
defaultValue: defaultPickerValue,
|
|
107
|
+
editorView: view,
|
|
108
|
+
filterOption: languageListFilter,
|
|
109
|
+
formatMessage: formatMessage,
|
|
110
|
+
options: groupedOptions
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
84
115
|
var separator = {
|
|
85
116
|
type: 'separator'
|
|
86
117
|
};
|
|
@@ -188,7 +219,7 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig() {
|
|
|
188
219
|
return (0, _utils.findDomRefAtPos)(pos, view.domAtPos.bind(view));
|
|
189
220
|
},
|
|
190
221
|
nodeType: nodeType,
|
|
191
|
-
items: [languageSelect].concat((0, _toConsumableArray2.default)(areAnyNewToolbarFlagsEnabled ? [] : [separator]), [codeBlockWrapButton], (0, _toConsumableArray2.default)((0, _expValEquals.expValEquals)('platform_editor_code_block_q4_lovability', 'isEnabled', true) && (0, _platformFeatureFlags.fg)('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), (0, _toConsumableArray2.default)(copyAndDeleteButtonMenuItems)),
|
|
222
|
+
items: [languagePicker !== null && languagePicker !== void 0 ? languagePicker : languageSelect].concat((0, _toConsumableArray2.default)(areAnyNewToolbarFlagsEnabled ? [] : [separator]), [codeBlockWrapButton], (0, _toConsumableArray2.default)((0, _expValEquals.expValEquals)('platform_editor_code_block_q4_lovability', 'isEnabled', true) && (0, _platformFeatureFlags.fg)('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), (0, _toConsumableArray2.default)(copyAndDeleteButtonMenuItems)),
|
|
192
223
|
scrollable: true
|
|
193
224
|
};
|
|
194
225
|
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
._h7alglyw{border-inline:none}._179rglyw{border-block-end:none}
|
|
3
|
+
._mqm2ia51{border-block-start:var(--ds-border-width,1px) solid var(--ds-border,#0b120e24)}
|
|
4
|
+
._18m915vq{overflow-y:hidden}
|
|
5
|
+
._1bsb1osq{width:100%}
|
|
6
|
+
._1bsbuuw1{width:200px}
|
|
7
|
+
._1bto1l2s{text-overflow:ellipsis}
|
|
8
|
+
._1reo15vq{overflow-x:hidden}
|
|
9
|
+
._1xw9glyw button:after{content:none}
|
|
10
|
+
._ficf1e5h button{text-align:left}
|
|
11
|
+
._o5721q9c{white-space:nowrap}
|
|
12
|
+
._vwz478tn{line-height:1.714}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/* LanguagePicker.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
Object.defineProperty(exports, "__esModule", {
|
|
7
|
+
value: true
|
|
8
|
+
});
|
|
9
|
+
exports.LanguagePicker = void 0;
|
|
10
|
+
require("./LanguagePicker.compiled.css");
|
|
11
|
+
var _runtime = require("@compiled/react/runtime");
|
|
12
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
14
|
+
var _new = _interopRequireDefault(require("@atlaskit/button/new"));
|
|
15
|
+
var _messages = require("@atlaskit/editor-common/messages");
|
|
16
|
+
var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
|
|
17
|
+
var _chevronDown = _interopRequireDefault(require("@atlaskit/icon/core/chevron-down"));
|
|
18
|
+
var _compiled = require("@atlaskit/primitives/compiled");
|
|
19
|
+
var _select = require("@atlaskit/select");
|
|
20
|
+
var _editorCommands = require("../editor-commands");
|
|
21
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
22
|
+
var pickerOptionStyles = null;
|
|
23
|
+
var styles = {
|
|
24
|
+
divider: "_h7alglyw _179rglyw _mqm2ia51 _1bsb1osq",
|
|
25
|
+
trigger: "_1reo15vq _18m915vq _1bsbuuw1 _1bto1l2s _o5721q9c _ficf1e5h _1xw9glyw"
|
|
26
|
+
};
|
|
27
|
+
var CustomGroup = function CustomGroup(props) {
|
|
28
|
+
var allGroups = props.selectProps.options;
|
|
29
|
+
var isFirstGroup = allGroups.length > 0 && allGroups[0] === props.data;
|
|
30
|
+
return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, !isFirstGroup && /*#__PURE__*/_react.default.createElement(_compiled.Box, {
|
|
31
|
+
as: "hr",
|
|
32
|
+
xcss: styles.divider,
|
|
33
|
+
role: "presentation"
|
|
34
|
+
}), /*#__PURE__*/_react.default.createElement(_select.components.Group, props));
|
|
35
|
+
};
|
|
36
|
+
var CustomOption = function CustomOption(props) {
|
|
37
|
+
return (
|
|
38
|
+
/*#__PURE__*/
|
|
39
|
+
// eslint-disable-next-line react/jsx-props-no-spreading -- react-select custom components must forward all props to the default Option.
|
|
40
|
+
_react.default.createElement(_select.components.Option, props, /*#__PURE__*/_react.default.createElement("span", {
|
|
41
|
+
className: (0, _runtime.ax)(["_vwz478tn"])
|
|
42
|
+
}, props.children))
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
var popupSelectComponents = {
|
|
46
|
+
Group: CustomGroup,
|
|
47
|
+
Option: CustomOption
|
|
48
|
+
};
|
|
49
|
+
var menuPopperProps = {
|
|
50
|
+
modifiers: [{
|
|
51
|
+
name: 'offset',
|
|
52
|
+
options: {
|
|
53
|
+
offset: [0, 8]
|
|
54
|
+
}
|
|
55
|
+
}, {
|
|
56
|
+
name: 'preventOverflow',
|
|
57
|
+
enabled: false
|
|
58
|
+
}]
|
|
59
|
+
};
|
|
60
|
+
var LanguagePicker = exports.LanguagePicker = function LanguagePicker(_ref) {
|
|
61
|
+
var _api$analytics, _defaultValue$label;
|
|
62
|
+
var api = _ref.api,
|
|
63
|
+
defaultValue = _ref.defaultValue,
|
|
64
|
+
editorView = _ref.editorView,
|
|
65
|
+
filterOption = _ref.filterOption,
|
|
66
|
+
formatMessage = _ref.formatMessage,
|
|
67
|
+
options = _ref.options;
|
|
68
|
+
var editorAnalyticsAPI = api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions;
|
|
69
|
+
var label = (_defaultValue$label = defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.label) !== null && _defaultValue$label !== void 0 ? _defaultValue$label : formatMessage(_messages.codeBlockButtonMessages.selectLanguage);
|
|
70
|
+
var selectLanguageLabel = formatMessage(_messages.codeBlockButtonMessages.selectLanguage);
|
|
71
|
+
var _useState = (0, _react.useState)(''),
|
|
72
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
73
|
+
inputValue = _useState2[0],
|
|
74
|
+
setInputValue = _useState2[1];
|
|
75
|
+
var searchOptions = (0, _react.useMemo)(function () {
|
|
76
|
+
return options.flatMap(function (group) {
|
|
77
|
+
return group.options;
|
|
78
|
+
});
|
|
79
|
+
}, [options]);
|
|
80
|
+
var hasSearchQuery = inputValue.trim().length > 0;
|
|
81
|
+
var handleChange = (0, _react.useCallback)(function (option) {
|
|
82
|
+
if (!option) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
(0, _editorCommands.changeLanguage)(editorAnalyticsAPI)(option.value)(editorView.state, editorView.dispatch);
|
|
86
|
+
}, [editorAnalyticsAPI, editorView]);
|
|
87
|
+
var handleInputChange = (0, _react.useCallback)(function (newInputValue) {
|
|
88
|
+
setInputValue(newInputValue);
|
|
89
|
+
return newInputValue;
|
|
90
|
+
}, []);
|
|
91
|
+
var renderTarget = (0, _react.useCallback)(function (_ref2) {
|
|
92
|
+
var isOpen = _ref2.isOpen,
|
|
93
|
+
ref = _ref2.ref,
|
|
94
|
+
onKeyDown = _ref2.onKeyDown,
|
|
95
|
+
ariaControls = _ref2['aria-controls'];
|
|
96
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
97
|
+
className: (0, _runtime.ax)([styles.trigger])
|
|
98
|
+
}, /*#__PURE__*/_react.default.createElement(_new.default, {
|
|
99
|
+
shouldFitContainer: true,
|
|
100
|
+
onKeyDown: onKeyDown,
|
|
101
|
+
ref: ref,
|
|
102
|
+
iconAfter: _chevronDown.default,
|
|
103
|
+
appearance: "subtle",
|
|
104
|
+
isSelected: isOpen,
|
|
105
|
+
"aria-controls": ariaControls,
|
|
106
|
+
"aria-label": selectLanguageLabel,
|
|
107
|
+
testId: "code-block-language-picker-trigger"
|
|
108
|
+
}, label));
|
|
109
|
+
}, [label, selectLanguageLabel]);
|
|
110
|
+
return /*#__PURE__*/_react.default.createElement(_select.PopupSelect, {
|
|
111
|
+
components: popupSelectComponents,
|
|
112
|
+
filterOption: filterOption,
|
|
113
|
+
inputValue: inputValue,
|
|
114
|
+
label: selectLanguageLabel,
|
|
115
|
+
maxMenuHeight: 300,
|
|
116
|
+
minMenuWidth: 200,
|
|
117
|
+
menuPlacement: "auto",
|
|
118
|
+
onChange: handleChange,
|
|
119
|
+
onInputChange: handleInputChange,
|
|
120
|
+
options: hasSearchQuery ? searchOptions : options,
|
|
121
|
+
popperProps: menuPopperProps,
|
|
122
|
+
searchThreshold: -1,
|
|
123
|
+
target: renderTarget,
|
|
124
|
+
testId: "code-block-language-picker",
|
|
125
|
+
defaultValue: defaultValue
|
|
126
|
+
});
|
|
127
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getDetectLanguageOption = exports.createGroupedLanguageOptions = exports.PLAIN_TEXT_LANGUAGE_VALUE = exports.NONE_LANGUAGE_VALUE = exports.DETECT_LANGUAGE_VALUE = void 0;
|
|
8
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
var _messages = require("@atlaskit/editor-common/messages");
|
|
10
|
+
var NONE_LANGUAGE_VALUE = exports.NONE_LANGUAGE_VALUE = 'none';
|
|
11
|
+
var DETECT_LANGUAGE_VALUE = exports.DETECT_LANGUAGE_VALUE = 'autodetect';
|
|
12
|
+
var PLAIN_TEXT_LANGUAGE_VALUE = exports.PLAIN_TEXT_LANGUAGE_VALUE = 'text';
|
|
13
|
+
var getDetectLanguageOption = exports.getDetectLanguageOption = function getDetectLanguageOption(formatMessage) {
|
|
14
|
+
return {
|
|
15
|
+
alias: [DETECT_LANGUAGE_VALUE],
|
|
16
|
+
label: formatMessage(_messages.codeBlockButtonMessages.detectLanguage),
|
|
17
|
+
value: DETECT_LANGUAGE_VALUE
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
var createGroupedLanguageOptions = exports.createGroupedLanguageOptions = function createGroupedLanguageOptions(_ref) {
|
|
21
|
+
var formatMessage = _ref.formatMessage,
|
|
22
|
+
languages = _ref.languages,
|
|
23
|
+
_ref$recentlyUsedLang = _ref.recentlyUsedLanguages,
|
|
24
|
+
recentlyUsedLanguages = _ref$recentlyUsedLang === void 0 ? [] : _ref$recentlyUsedLang;
|
|
25
|
+
var allLanguages = languages.filter(function (language) {
|
|
26
|
+
return language.value !== NONE_LANGUAGE_VALUE && language.value !== PLAIN_TEXT_LANGUAGE_VALUE;
|
|
27
|
+
});
|
|
28
|
+
var plainTextOption = languages.find(function (language) {
|
|
29
|
+
return language.value === PLAIN_TEXT_LANGUAGE_VALUE;
|
|
30
|
+
});
|
|
31
|
+
var pinnedOptions = [getDetectLanguageOption(formatMessage)];
|
|
32
|
+
if (plainTextOption) {
|
|
33
|
+
pinnedOptions.push(plainTextOption);
|
|
34
|
+
}
|
|
35
|
+
return [{
|
|
36
|
+
label: '',
|
|
37
|
+
options: pinnedOptions
|
|
38
|
+
}].concat((0, _toConsumableArray2.default)(recentlyUsedLanguages.length > 0 ? [{
|
|
39
|
+
label: formatMessage(_messages.codeBlockButtonMessages.recentlyUsed),
|
|
40
|
+
options: recentlyUsedLanguages
|
|
41
|
+
}] : []), [{
|
|
42
|
+
label: formatMessage(_messages.codeBlockButtonMessages.all),
|
|
43
|
+
options: allLanguages
|
|
44
|
+
}]);
|
|
45
|
+
};
|
|
@@ -61,7 +61,7 @@ export const changeLanguage = editorAnalyticsAPI => language => (state, dispatch
|
|
|
61
61
|
action: ACTION.LANGUAGE_SELECTED,
|
|
62
62
|
actionSubject: ACTION_SUBJECT.CODE_BLOCK,
|
|
63
63
|
attributes: {
|
|
64
|
-
language
|
|
64
|
+
language: language !== null && language !== void 0 ? language : 'none'
|
|
65
65
|
},
|
|
66
66
|
eventType: EVENT_TYPE.TRACK
|
|
67
67
|
})(result);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
import { areCodeBlockLineNumbersVisible, isCodeBlockWordWrapEnabled } from '@atlaskit/editor-common/code-block';
|
|
2
3
|
import commonMessages, { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
|
|
3
4
|
import { areToolbarFlagsEnabled } from '@atlaskit/editor-common/toolbar-flag-check';
|
|
@@ -10,13 +11,15 @@ import { fg } from '@atlaskit/platform-feature-flags';
|
|
|
10
11
|
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
|
|
11
12
|
import { changeLanguage, copyContentToClipboardWithAnalytics, removeCodeBlockWithAnalytics, resetCopiedState, toggleLineNumbersForCodeBlockNode, toggleWordWrapStateForCodeBlockNode } from '../editor-commands';
|
|
12
13
|
import { WrapIcon } from '../ui/icons/WrapIcon';
|
|
14
|
+
import { createGroupedLanguageOptions, NONE_LANGUAGE_VALUE, PLAIN_TEXT_LANGUAGE_VALUE } from '../ui/language-picker-options';
|
|
15
|
+
import { LanguagePicker } from '../ui/LanguagePicker';
|
|
13
16
|
import { provideVisualFeedbackForCopyButton, removeVisualFeedbackForCopyButton } from './codeBlockCopySelectionPlugin';
|
|
14
17
|
import { createLanguageList, DEFAULT_LANGUAGES, getLanguageIdentifier } from './language-list';
|
|
15
18
|
import { pluginKey } from './plugin-key';
|
|
16
19
|
export const getToolbarConfig = (allowCopyToClipboard = false, api, overrideLanguageName = undefined) => (state, {
|
|
17
20
|
formatMessage
|
|
18
21
|
}) => {
|
|
19
|
-
var _api$editorViewMode, _api$editorViewMode$s, _api$decorations$acti, _api$decorations, _api$analytics, _codeBlockState$pos, _node$attrs;
|
|
22
|
+
var _api$editorViewMode, _api$editorViewMode$s, _api$decorations$acti, _api$decorations, _api$analytics, _codeBlockState$pos, _node$attrs, _languagePicker;
|
|
20
23
|
const isViewMode = (api === null || api === void 0 ? void 0 : (_api$editorViewMode = api.editorViewMode) === null || _api$editorViewMode === void 0 ? void 0 : (_api$editorViewMode$s = _api$editorViewMode.sharedState.currentState()) === null || _api$editorViewMode$s === void 0 ? void 0 : _api$editorViewMode$s.mode) === 'view';
|
|
21
24
|
const {
|
|
22
25
|
hoverDecoration
|
|
@@ -57,6 +60,32 @@ export const getToolbarConfig = (allowCopyToClipboard = false, api, overrideLang
|
|
|
57
60
|
options,
|
|
58
61
|
filterOption: languageListFilter
|
|
59
62
|
};
|
|
63
|
+
let languagePicker;
|
|
64
|
+
if (expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button')) {
|
|
65
|
+
const languagePickerOptions = options;
|
|
66
|
+
const groupedOptions = createGroupedLanguageOptions({
|
|
67
|
+
formatMessage,
|
|
68
|
+
languages: languagePickerOptions
|
|
69
|
+
});
|
|
70
|
+
const defaultPickerValue = language ? languagePickerOptions.find(option => language === NONE_LANGUAGE_VALUE ? option.value === PLAIN_TEXT_LANGUAGE_VALUE : option.value === language || option.alias.includes(language)) : undefined;
|
|
71
|
+
languagePicker = {
|
|
72
|
+
type: 'custom',
|
|
73
|
+
fallback: [],
|
|
74
|
+
render: view => {
|
|
75
|
+
if (!view) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return /*#__PURE__*/React.createElement(LanguagePicker, {
|
|
79
|
+
api: api,
|
|
80
|
+
defaultValue: defaultPickerValue,
|
|
81
|
+
editorView: view,
|
|
82
|
+
filterOption: languageListFilter,
|
|
83
|
+
formatMessage: formatMessage,
|
|
84
|
+
options: groupedOptions
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
60
89
|
const separator = {
|
|
61
90
|
type: 'separator'
|
|
62
91
|
};
|
|
@@ -162,7 +191,7 @@ export const getToolbarConfig = (allowCopyToClipboard = false, api, overrideLang
|
|
|
162
191
|
// eslint-disable-next-line @atlaskit/editor/no-as-casting
|
|
163
192
|
getDomRef: view => findDomRefAtPos(pos, view.domAtPos.bind(view)),
|
|
164
193
|
nodeType,
|
|
165
|
-
items: [languageSelect, ...(areAnyNewToolbarFlagsEnabled ? [] : [separator]), codeBlockWrapButton, ...(expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), ...copyAndDeleteButtonMenuItems],
|
|
194
|
+
items: [(_languagePicker = languagePicker) !== null && _languagePicker !== void 0 ? _languagePicker : languageSelect, ...(areAnyNewToolbarFlagsEnabled ? [] : [separator]), codeBlockWrapButton, ...(expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), ...copyAndDeleteButtonMenuItems],
|
|
166
195
|
scrollable: true
|
|
167
196
|
};
|
|
168
197
|
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
._h7alglyw{border-inline:none}._179rglyw{border-block-end:none}
|
|
3
|
+
._mqm2ia51{border-block-start:var(--ds-border-width,1px) solid var(--ds-border,#0b120e24)}
|
|
4
|
+
._18m915vq{overflow-y:hidden}
|
|
5
|
+
._1bsb1osq{width:100%}
|
|
6
|
+
._1bsbuuw1{width:200px}
|
|
7
|
+
._1bto1l2s{text-overflow:ellipsis}
|
|
8
|
+
._1reo15vq{overflow-x:hidden}
|
|
9
|
+
._1xw9glyw button:after{content:none}
|
|
10
|
+
._ficf1e5h button{text-align:left}
|
|
11
|
+
._o5721q9c{white-space:nowrap}
|
|
12
|
+
._vwz478tn{line-height:1.714}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/* LanguagePicker.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
import "./LanguagePicker.compiled.css";
|
|
3
|
+
import { ax, ix } from "@compiled/react/runtime";
|
|
4
|
+
import React, { Fragment, useCallback, useMemo, useState } from 'react';
|
|
5
|
+
import Button from '@atlaskit/button/new';
|
|
6
|
+
import { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
|
|
7
|
+
import { akEditorLineHeight } from '@atlaskit/editor-shared-styles';
|
|
8
|
+
import ChevronDownIcon from '@atlaskit/icon/core/chevron-down';
|
|
9
|
+
import { Box } from '@atlaskit/primitives/compiled';
|
|
10
|
+
import { PopupSelect, components } from '@atlaskit/select';
|
|
11
|
+
import { changeLanguage } from '../editor-commands';
|
|
12
|
+
const pickerOptionStyles = null;
|
|
13
|
+
const styles = {
|
|
14
|
+
divider: "_h7alglyw _179rglyw _mqm2ia51 _1bsb1osq",
|
|
15
|
+
trigger: "_1reo15vq _18m915vq _1bsbuuw1 _1bto1l2s _o5721q9c _ficf1e5h _1xw9glyw"
|
|
16
|
+
};
|
|
17
|
+
const CustomGroup = props => {
|
|
18
|
+
const allGroups = props.selectProps.options;
|
|
19
|
+
const isFirstGroup = allGroups.length > 0 && allGroups[0] === props.data;
|
|
20
|
+
return /*#__PURE__*/React.createElement(Fragment, null, !isFirstGroup && /*#__PURE__*/React.createElement(Box, {
|
|
21
|
+
as: "hr",
|
|
22
|
+
xcss: styles.divider,
|
|
23
|
+
role: "presentation"
|
|
24
|
+
}), /*#__PURE__*/React.createElement(components.Group, props));
|
|
25
|
+
};
|
|
26
|
+
const CustomOption = props => {
|
|
27
|
+
return (
|
|
28
|
+
/*#__PURE__*/
|
|
29
|
+
// eslint-disable-next-line react/jsx-props-no-spreading -- react-select custom components must forward all props to the default Option.
|
|
30
|
+
React.createElement(components.Option, props, /*#__PURE__*/React.createElement("span", {
|
|
31
|
+
className: ax(["_vwz478tn"])
|
|
32
|
+
}, props.children))
|
|
33
|
+
);
|
|
34
|
+
};
|
|
35
|
+
const popupSelectComponents = {
|
|
36
|
+
Group: CustomGroup,
|
|
37
|
+
Option: CustomOption
|
|
38
|
+
};
|
|
39
|
+
const menuPopperProps = {
|
|
40
|
+
modifiers: [{
|
|
41
|
+
name: 'offset',
|
|
42
|
+
options: {
|
|
43
|
+
offset: [0, 8]
|
|
44
|
+
}
|
|
45
|
+
}, {
|
|
46
|
+
name: 'preventOverflow',
|
|
47
|
+
enabled: false
|
|
48
|
+
}]
|
|
49
|
+
};
|
|
50
|
+
export const LanguagePicker = ({
|
|
51
|
+
api,
|
|
52
|
+
defaultValue,
|
|
53
|
+
editorView,
|
|
54
|
+
filterOption,
|
|
55
|
+
formatMessage,
|
|
56
|
+
options
|
|
57
|
+
}) => {
|
|
58
|
+
var _api$analytics, _defaultValue$label;
|
|
59
|
+
const editorAnalyticsAPI = api === null || api === void 0 ? void 0 : (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions;
|
|
60
|
+
const label = (_defaultValue$label = defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.label) !== null && _defaultValue$label !== void 0 ? _defaultValue$label : formatMessage(codeBlockButtonMessages.selectLanguage);
|
|
61
|
+
const selectLanguageLabel = formatMessage(codeBlockButtonMessages.selectLanguage);
|
|
62
|
+
const [inputValue, setInputValue] = useState('');
|
|
63
|
+
const searchOptions = useMemo(() => options.flatMap(group => group.options), [options]);
|
|
64
|
+
const hasSearchQuery = inputValue.trim().length > 0;
|
|
65
|
+
const handleChange = useCallback(option => {
|
|
66
|
+
if (!option) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
changeLanguage(editorAnalyticsAPI)(option.value)(editorView.state, editorView.dispatch);
|
|
70
|
+
}, [editorAnalyticsAPI, editorView]);
|
|
71
|
+
const handleInputChange = useCallback(newInputValue => {
|
|
72
|
+
setInputValue(newInputValue);
|
|
73
|
+
return newInputValue;
|
|
74
|
+
}, []);
|
|
75
|
+
const renderTarget = useCallback(({
|
|
76
|
+
isOpen,
|
|
77
|
+
ref,
|
|
78
|
+
onKeyDown,
|
|
79
|
+
'aria-controls': ariaControls
|
|
80
|
+
}) => /*#__PURE__*/React.createElement("div", {
|
|
81
|
+
className: ax([styles.trigger])
|
|
82
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
83
|
+
shouldFitContainer: true,
|
|
84
|
+
onKeyDown: onKeyDown,
|
|
85
|
+
ref: ref,
|
|
86
|
+
iconAfter: ChevronDownIcon,
|
|
87
|
+
appearance: "subtle",
|
|
88
|
+
isSelected: isOpen,
|
|
89
|
+
"aria-controls": ariaControls,
|
|
90
|
+
"aria-label": selectLanguageLabel,
|
|
91
|
+
testId: "code-block-language-picker-trigger"
|
|
92
|
+
}, label)), [label, selectLanguageLabel]);
|
|
93
|
+
return /*#__PURE__*/React.createElement(PopupSelect, {
|
|
94
|
+
components: popupSelectComponents,
|
|
95
|
+
filterOption: filterOption,
|
|
96
|
+
inputValue: inputValue,
|
|
97
|
+
label: selectLanguageLabel,
|
|
98
|
+
maxMenuHeight: 300,
|
|
99
|
+
minMenuWidth: 200,
|
|
100
|
+
menuPlacement: "auto",
|
|
101
|
+
onChange: handleChange,
|
|
102
|
+
onInputChange: handleInputChange,
|
|
103
|
+
options: hasSearchQuery ? searchOptions : options,
|
|
104
|
+
popperProps: menuPopperProps,
|
|
105
|
+
searchThreshold: -1,
|
|
106
|
+
target: renderTarget,
|
|
107
|
+
testId: "code-block-language-picker",
|
|
108
|
+
defaultValue: defaultValue
|
|
109
|
+
});
|
|
110
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
|
|
2
|
+
export const NONE_LANGUAGE_VALUE = 'none';
|
|
3
|
+
export const DETECT_LANGUAGE_VALUE = 'autodetect';
|
|
4
|
+
export const PLAIN_TEXT_LANGUAGE_VALUE = 'text';
|
|
5
|
+
export const getDetectLanguageOption = formatMessage => ({
|
|
6
|
+
alias: [DETECT_LANGUAGE_VALUE],
|
|
7
|
+
label: formatMessage(codeBlockButtonMessages.detectLanguage),
|
|
8
|
+
value: DETECT_LANGUAGE_VALUE
|
|
9
|
+
});
|
|
10
|
+
export const createGroupedLanguageOptions = ({
|
|
11
|
+
formatMessage,
|
|
12
|
+
languages,
|
|
13
|
+
recentlyUsedLanguages = []
|
|
14
|
+
}) => {
|
|
15
|
+
const allLanguages = languages.filter(language => language.value !== NONE_LANGUAGE_VALUE && language.value !== PLAIN_TEXT_LANGUAGE_VALUE);
|
|
16
|
+
const plainTextOption = languages.find(language => language.value === PLAIN_TEXT_LANGUAGE_VALUE);
|
|
17
|
+
const pinnedOptions = [getDetectLanguageOption(formatMessage)];
|
|
18
|
+
if (plainTextOption) {
|
|
19
|
+
pinnedOptions.push(plainTextOption);
|
|
20
|
+
}
|
|
21
|
+
return [{
|
|
22
|
+
label: '',
|
|
23
|
+
options: pinnedOptions
|
|
24
|
+
}, ...(recentlyUsedLanguages.length > 0 ? [{
|
|
25
|
+
label: formatMessage(codeBlockButtonMessages.recentlyUsed),
|
|
26
|
+
options: recentlyUsedLanguages
|
|
27
|
+
}] : []), {
|
|
28
|
+
label: formatMessage(codeBlockButtonMessages.all),
|
|
29
|
+
options: allLanguages
|
|
30
|
+
}];
|
|
31
|
+
};
|
|
@@ -59,7 +59,7 @@ export var changeLanguage = function changeLanguage(editorAnalyticsAPI) {
|
|
|
59
59
|
action: ACTION.LANGUAGE_SELECTED,
|
|
60
60
|
actionSubject: ACTION_SUBJECT.CODE_BLOCK,
|
|
61
61
|
attributes: {
|
|
62
|
-
language: language
|
|
62
|
+
language: language !== null && language !== void 0 ? language : 'none'
|
|
63
63
|
},
|
|
64
64
|
eventType: EVENT_TYPE.TRACK
|
|
65
65
|
})(result);
|
|
@@ -2,6 +2,7 @@ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
|
2
2
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
3
|
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
4
|
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
|
+
import React from 'react';
|
|
5
6
|
import { areCodeBlockLineNumbersVisible, isCodeBlockWordWrapEnabled } from '@atlaskit/editor-common/code-block';
|
|
6
7
|
import commonMessages, { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
|
|
7
8
|
import { areToolbarFlagsEnabled } from '@atlaskit/editor-common/toolbar-flag-check';
|
|
@@ -14,6 +15,8 @@ import { fg } from '@atlaskit/platform-feature-flags';
|
|
|
14
15
|
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
|
|
15
16
|
import { changeLanguage, copyContentToClipboardWithAnalytics, removeCodeBlockWithAnalytics, resetCopiedState, toggleLineNumbersForCodeBlockNode, toggleWordWrapStateForCodeBlockNode } from '../editor-commands';
|
|
16
17
|
import { WrapIcon } from '../ui/icons/WrapIcon';
|
|
18
|
+
import { createGroupedLanguageOptions, NONE_LANGUAGE_VALUE, PLAIN_TEXT_LANGUAGE_VALUE } from '../ui/language-picker-options';
|
|
19
|
+
import { LanguagePicker } from '../ui/LanguagePicker';
|
|
17
20
|
import { provideVisualFeedbackForCopyButton, removeVisualFeedbackForCopyButton } from './codeBlockCopySelectionPlugin';
|
|
18
21
|
import { createLanguageList, DEFAULT_LANGUAGES, getLanguageIdentifier } from './language-list';
|
|
19
22
|
import { pluginKey } from './plugin-key';
|
|
@@ -72,6 +75,34 @@ export var getToolbarConfig = function getToolbarConfig() {
|
|
|
72
75
|
options: options,
|
|
73
76
|
filterOption: languageListFilter
|
|
74
77
|
};
|
|
78
|
+
var languagePicker;
|
|
79
|
+
if (expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button')) {
|
|
80
|
+
var languagePickerOptions = options;
|
|
81
|
+
var groupedOptions = createGroupedLanguageOptions({
|
|
82
|
+
formatMessage: formatMessage,
|
|
83
|
+
languages: languagePickerOptions
|
|
84
|
+
});
|
|
85
|
+
var defaultPickerValue = language ? languagePickerOptions.find(function (option) {
|
|
86
|
+
return language === NONE_LANGUAGE_VALUE ? option.value === PLAIN_TEXT_LANGUAGE_VALUE : option.value === language || option.alias.includes(language);
|
|
87
|
+
}) : undefined;
|
|
88
|
+
languagePicker = {
|
|
89
|
+
type: 'custom',
|
|
90
|
+
fallback: [],
|
|
91
|
+
render: function render(view) {
|
|
92
|
+
if (!view) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
return /*#__PURE__*/React.createElement(LanguagePicker, {
|
|
96
|
+
api: api,
|
|
97
|
+
defaultValue: defaultPickerValue,
|
|
98
|
+
editorView: view,
|
|
99
|
+
filterOption: languageListFilter,
|
|
100
|
+
formatMessage: formatMessage,
|
|
101
|
+
options: groupedOptions
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
75
106
|
var separator = {
|
|
76
107
|
type: 'separator'
|
|
77
108
|
};
|
|
@@ -179,7 +210,7 @@ export var getToolbarConfig = function getToolbarConfig() {
|
|
|
179
210
|
return findDomRefAtPos(pos, view.domAtPos.bind(view));
|
|
180
211
|
},
|
|
181
212
|
nodeType: nodeType,
|
|
182
|
-
items: [languageSelect].concat(_toConsumableArray(areAnyNewToolbarFlagsEnabled ? [] : [separator]), [codeBlockWrapButton], _toConsumableArray(expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), _toConsumableArray(copyAndDeleteButtonMenuItems)),
|
|
213
|
+
items: [languagePicker !== null && languagePicker !== void 0 ? languagePicker : languageSelect].concat(_toConsumableArray(areAnyNewToolbarFlagsEnabled ? [] : [separator]), [codeBlockWrapButton], _toConsumableArray(expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), _toConsumableArray(copyAndDeleteButtonMenuItems)),
|
|
183
214
|
scrollable: true
|
|
184
215
|
};
|
|
185
216
|
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
._h7alglyw{border-inline:none}._179rglyw{border-block-end:none}
|
|
3
|
+
._mqm2ia51{border-block-start:var(--ds-border-width,1px) solid var(--ds-border,#0b120e24)}
|
|
4
|
+
._18m915vq{overflow-y:hidden}
|
|
5
|
+
._1bsb1osq{width:100%}
|
|
6
|
+
._1bsbuuw1{width:200px}
|
|
7
|
+
._1bto1l2s{text-overflow:ellipsis}
|
|
8
|
+
._1reo15vq{overflow-x:hidden}
|
|
9
|
+
._1xw9glyw button:after{content:none}
|
|
10
|
+
._ficf1e5h button{text-align:left}
|
|
11
|
+
._o5721q9c{white-space:nowrap}
|
|
12
|
+
._vwz478tn{line-height:1.714}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/* LanguagePicker.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
import "./LanguagePicker.compiled.css";
|
|
4
|
+
import { ax, ix } from "@compiled/react/runtime";
|
|
5
|
+
import React, { Fragment, useCallback, useMemo, useState } from 'react';
|
|
6
|
+
import Button from '@atlaskit/button/new';
|
|
7
|
+
import { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
|
|
8
|
+
import { akEditorLineHeight } from '@atlaskit/editor-shared-styles';
|
|
9
|
+
import ChevronDownIcon from '@atlaskit/icon/core/chevron-down';
|
|
10
|
+
import { Box } from '@atlaskit/primitives/compiled';
|
|
11
|
+
import { PopupSelect, components } from '@atlaskit/select';
|
|
12
|
+
import { changeLanguage } from '../editor-commands';
|
|
13
|
+
var pickerOptionStyles = null;
|
|
14
|
+
var styles = {
|
|
15
|
+
divider: "_h7alglyw _179rglyw _mqm2ia51 _1bsb1osq",
|
|
16
|
+
trigger: "_1reo15vq _18m915vq _1bsbuuw1 _1bto1l2s _o5721q9c _ficf1e5h _1xw9glyw"
|
|
17
|
+
};
|
|
18
|
+
var CustomGroup = function CustomGroup(props) {
|
|
19
|
+
var allGroups = props.selectProps.options;
|
|
20
|
+
var isFirstGroup = allGroups.length > 0 && allGroups[0] === props.data;
|
|
21
|
+
return /*#__PURE__*/React.createElement(Fragment, null, !isFirstGroup && /*#__PURE__*/React.createElement(Box, {
|
|
22
|
+
as: "hr",
|
|
23
|
+
xcss: styles.divider,
|
|
24
|
+
role: "presentation"
|
|
25
|
+
}), /*#__PURE__*/React.createElement(components.Group, props));
|
|
26
|
+
};
|
|
27
|
+
var CustomOption = function CustomOption(props) {
|
|
28
|
+
return (
|
|
29
|
+
/*#__PURE__*/
|
|
30
|
+
// eslint-disable-next-line react/jsx-props-no-spreading -- react-select custom components must forward all props to the default Option.
|
|
31
|
+
React.createElement(components.Option, props, /*#__PURE__*/React.createElement("span", {
|
|
32
|
+
className: ax(["_vwz478tn"])
|
|
33
|
+
}, props.children))
|
|
34
|
+
);
|
|
35
|
+
};
|
|
36
|
+
var popupSelectComponents = {
|
|
37
|
+
Group: CustomGroup,
|
|
38
|
+
Option: CustomOption
|
|
39
|
+
};
|
|
40
|
+
var menuPopperProps = {
|
|
41
|
+
modifiers: [{
|
|
42
|
+
name: 'offset',
|
|
43
|
+
options: {
|
|
44
|
+
offset: [0, 8]
|
|
45
|
+
}
|
|
46
|
+
}, {
|
|
47
|
+
name: 'preventOverflow',
|
|
48
|
+
enabled: false
|
|
49
|
+
}]
|
|
50
|
+
};
|
|
51
|
+
export var LanguagePicker = function LanguagePicker(_ref) {
|
|
52
|
+
var _api$analytics, _defaultValue$label;
|
|
53
|
+
var api = _ref.api,
|
|
54
|
+
defaultValue = _ref.defaultValue,
|
|
55
|
+
editorView = _ref.editorView,
|
|
56
|
+
filterOption = _ref.filterOption,
|
|
57
|
+
formatMessage = _ref.formatMessage,
|
|
58
|
+
options = _ref.options;
|
|
59
|
+
var editorAnalyticsAPI = api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions;
|
|
60
|
+
var label = (_defaultValue$label = defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.label) !== null && _defaultValue$label !== void 0 ? _defaultValue$label : formatMessage(codeBlockButtonMessages.selectLanguage);
|
|
61
|
+
var selectLanguageLabel = formatMessage(codeBlockButtonMessages.selectLanguage);
|
|
62
|
+
var _useState = useState(''),
|
|
63
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
64
|
+
inputValue = _useState2[0],
|
|
65
|
+
setInputValue = _useState2[1];
|
|
66
|
+
var searchOptions = useMemo(function () {
|
|
67
|
+
return options.flatMap(function (group) {
|
|
68
|
+
return group.options;
|
|
69
|
+
});
|
|
70
|
+
}, [options]);
|
|
71
|
+
var hasSearchQuery = inputValue.trim().length > 0;
|
|
72
|
+
var handleChange = useCallback(function (option) {
|
|
73
|
+
if (!option) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
changeLanguage(editorAnalyticsAPI)(option.value)(editorView.state, editorView.dispatch);
|
|
77
|
+
}, [editorAnalyticsAPI, editorView]);
|
|
78
|
+
var handleInputChange = useCallback(function (newInputValue) {
|
|
79
|
+
setInputValue(newInputValue);
|
|
80
|
+
return newInputValue;
|
|
81
|
+
}, []);
|
|
82
|
+
var renderTarget = useCallback(function (_ref2) {
|
|
83
|
+
var isOpen = _ref2.isOpen,
|
|
84
|
+
ref = _ref2.ref,
|
|
85
|
+
onKeyDown = _ref2.onKeyDown,
|
|
86
|
+
ariaControls = _ref2['aria-controls'];
|
|
87
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
88
|
+
className: ax([styles.trigger])
|
|
89
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
90
|
+
shouldFitContainer: true,
|
|
91
|
+
onKeyDown: onKeyDown,
|
|
92
|
+
ref: ref,
|
|
93
|
+
iconAfter: ChevronDownIcon,
|
|
94
|
+
appearance: "subtle",
|
|
95
|
+
isSelected: isOpen,
|
|
96
|
+
"aria-controls": ariaControls,
|
|
97
|
+
"aria-label": selectLanguageLabel,
|
|
98
|
+
testId: "code-block-language-picker-trigger"
|
|
99
|
+
}, label));
|
|
100
|
+
}, [label, selectLanguageLabel]);
|
|
101
|
+
return /*#__PURE__*/React.createElement(PopupSelect, {
|
|
102
|
+
components: popupSelectComponents,
|
|
103
|
+
filterOption: filterOption,
|
|
104
|
+
inputValue: inputValue,
|
|
105
|
+
label: selectLanguageLabel,
|
|
106
|
+
maxMenuHeight: 300,
|
|
107
|
+
minMenuWidth: 200,
|
|
108
|
+
menuPlacement: "auto",
|
|
109
|
+
onChange: handleChange,
|
|
110
|
+
onInputChange: handleInputChange,
|
|
111
|
+
options: hasSearchQuery ? searchOptions : options,
|
|
112
|
+
popperProps: menuPopperProps,
|
|
113
|
+
searchThreshold: -1,
|
|
114
|
+
target: renderTarget,
|
|
115
|
+
testId: "code-block-language-picker",
|
|
116
|
+
defaultValue: defaultValue
|
|
117
|
+
});
|
|
118
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
2
|
+
import { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
|
|
3
|
+
export var NONE_LANGUAGE_VALUE = 'none';
|
|
4
|
+
export var DETECT_LANGUAGE_VALUE = 'autodetect';
|
|
5
|
+
export var PLAIN_TEXT_LANGUAGE_VALUE = 'text';
|
|
6
|
+
export var getDetectLanguageOption = function getDetectLanguageOption(formatMessage) {
|
|
7
|
+
return {
|
|
8
|
+
alias: [DETECT_LANGUAGE_VALUE],
|
|
9
|
+
label: formatMessage(codeBlockButtonMessages.detectLanguage),
|
|
10
|
+
value: DETECT_LANGUAGE_VALUE
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export var createGroupedLanguageOptions = function createGroupedLanguageOptions(_ref) {
|
|
14
|
+
var formatMessage = _ref.formatMessage,
|
|
15
|
+
languages = _ref.languages,
|
|
16
|
+
_ref$recentlyUsedLang = _ref.recentlyUsedLanguages,
|
|
17
|
+
recentlyUsedLanguages = _ref$recentlyUsedLang === void 0 ? [] : _ref$recentlyUsedLang;
|
|
18
|
+
var allLanguages = languages.filter(function (language) {
|
|
19
|
+
return language.value !== NONE_LANGUAGE_VALUE && language.value !== PLAIN_TEXT_LANGUAGE_VALUE;
|
|
20
|
+
});
|
|
21
|
+
var plainTextOption = languages.find(function (language) {
|
|
22
|
+
return language.value === PLAIN_TEXT_LANGUAGE_VALUE;
|
|
23
|
+
});
|
|
24
|
+
var pinnedOptions = [getDetectLanguageOption(formatMessage)];
|
|
25
|
+
if (plainTextOption) {
|
|
26
|
+
pinnedOptions.push(plainTextOption);
|
|
27
|
+
}
|
|
28
|
+
return [{
|
|
29
|
+
label: '',
|
|
30
|
+
options: pinnedOptions
|
|
31
|
+
}].concat(_toConsumableArray(recentlyUsedLanguages.length > 0 ? [{
|
|
32
|
+
label: formatMessage(codeBlockButtonMessages.recentlyUsed),
|
|
33
|
+
options: recentlyUsedLanguages
|
|
34
|
+
}] : []), [{
|
|
35
|
+
label: formatMessage(codeBlockButtonMessages.all),
|
|
36
|
+
options: allLanguages
|
|
37
|
+
}]);
|
|
38
|
+
};
|
|
@@ -4,7 +4,7 @@ import type { Command, EditorCommand } from '@atlaskit/editor-common/types';
|
|
|
4
4
|
import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
|
|
5
5
|
export declare const removeCodeBlockWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
|
|
6
6
|
export declare const removeCodeBlock: Command;
|
|
7
|
-
export declare const changeLanguage: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (language: string) => Command;
|
|
7
|
+
export declare const changeLanguage: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (language: string | null) => Command;
|
|
8
8
|
export declare const copyContentToClipboardWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
|
|
9
9
|
export declare const copyContentToClipboard: Command;
|
|
10
10
|
export declare const resetCopiedState: Command;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jsxRuntime classic
|
|
3
|
+
* @jsx jsx
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import type { IntlShape } from 'react-intl';
|
|
7
|
+
import type { ExtractInjectionAPI, SelectOption } from '@atlaskit/editor-common/types';
|
|
8
|
+
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
9
|
+
import type { CodeBlockPlugin } from '../index';
|
|
10
|
+
import type { LanguagePickerOption, LanguagePickerOptionGroup } from './language-picker-options';
|
|
11
|
+
type LanguagePickerProps = {
|
|
12
|
+
api: ExtractInjectionAPI<CodeBlockPlugin> | undefined;
|
|
13
|
+
defaultValue?: LanguagePickerOption;
|
|
14
|
+
editorView: EditorView;
|
|
15
|
+
filterOption: (option: SelectOption<LanguagePickerOption>, rawInput: string) => boolean;
|
|
16
|
+
formatMessage: IntlShape['formatMessage'];
|
|
17
|
+
options: LanguagePickerOptionGroup[];
|
|
18
|
+
};
|
|
19
|
+
export declare const LanguagePicker: ({ api, defaultValue, editorView, filterOption, formatMessage, options, }: LanguagePickerProps) => React.JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IntlShape } from 'react-intl';
|
|
2
|
+
import type { GroupType } from '@atlaskit/select';
|
|
3
|
+
export declare const NONE_LANGUAGE_VALUE = "none";
|
|
4
|
+
export declare const DETECT_LANGUAGE_VALUE = "autodetect";
|
|
5
|
+
export declare const PLAIN_TEXT_LANGUAGE_VALUE = "text";
|
|
6
|
+
export type LanguagePickerOption = {
|
|
7
|
+
alias: readonly string[];
|
|
8
|
+
label: string;
|
|
9
|
+
value: string;
|
|
10
|
+
};
|
|
11
|
+
export type LanguagePickerOptionGroup = GroupType<LanguagePickerOption>;
|
|
12
|
+
type CreateGroupedLanguageOptionsProps = {
|
|
13
|
+
formatMessage: IntlShape['formatMessage'];
|
|
14
|
+
languages: LanguagePickerOption[];
|
|
15
|
+
recentlyUsedLanguages?: LanguagePickerOption[];
|
|
16
|
+
};
|
|
17
|
+
export declare const getDetectLanguageOption: (formatMessage: IntlShape["formatMessage"]) => LanguagePickerOption;
|
|
18
|
+
export declare const createGroupedLanguageOptions: ({ formatMessage, languages, recentlyUsedLanguages, }: CreateGroupedLanguageOptionsProps) => LanguagePickerOptionGroup[];
|
|
19
|
+
export {};
|
|
@@ -4,7 +4,7 @@ import type { Command, EditorCommand } from '@atlaskit/editor-common/types';
|
|
|
4
4
|
import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
|
|
5
5
|
export declare const removeCodeBlockWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
|
|
6
6
|
export declare const removeCodeBlock: Command;
|
|
7
|
-
export declare const changeLanguage: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (language: string) => Command;
|
|
7
|
+
export declare const changeLanguage: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (language: string | null) => Command;
|
|
8
8
|
export declare const copyContentToClipboardWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
|
|
9
9
|
export declare const copyContentToClipboard: Command;
|
|
10
10
|
export declare const resetCopiedState: Command;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jsxRuntime classic
|
|
3
|
+
* @jsx jsx
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import type { IntlShape } from 'react-intl';
|
|
7
|
+
import type { ExtractInjectionAPI, SelectOption } from '@atlaskit/editor-common/types';
|
|
8
|
+
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
9
|
+
import type { CodeBlockPlugin } from '../index';
|
|
10
|
+
import type { LanguagePickerOption, LanguagePickerOptionGroup } from './language-picker-options';
|
|
11
|
+
type LanguagePickerProps = {
|
|
12
|
+
api: ExtractInjectionAPI<CodeBlockPlugin> | undefined;
|
|
13
|
+
defaultValue?: LanguagePickerOption;
|
|
14
|
+
editorView: EditorView;
|
|
15
|
+
filterOption: (option: SelectOption<LanguagePickerOption>, rawInput: string) => boolean;
|
|
16
|
+
formatMessage: IntlShape['formatMessage'];
|
|
17
|
+
options: LanguagePickerOptionGroup[];
|
|
18
|
+
};
|
|
19
|
+
export declare const LanguagePicker: ({ api, defaultValue, editorView, filterOption, formatMessage, options, }: LanguagePickerProps) => React.JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IntlShape } from 'react-intl';
|
|
2
|
+
import type { GroupType } from '@atlaskit/select';
|
|
3
|
+
export declare const NONE_LANGUAGE_VALUE = "none";
|
|
4
|
+
export declare const DETECT_LANGUAGE_VALUE = "autodetect";
|
|
5
|
+
export declare const PLAIN_TEXT_LANGUAGE_VALUE = "text";
|
|
6
|
+
export type LanguagePickerOption = {
|
|
7
|
+
alias: readonly string[];
|
|
8
|
+
label: string;
|
|
9
|
+
value: string;
|
|
10
|
+
};
|
|
11
|
+
export type LanguagePickerOptionGroup = GroupType<LanguagePickerOption>;
|
|
12
|
+
type CreateGroupedLanguageOptionsProps = {
|
|
13
|
+
formatMessage: IntlShape['formatMessage'];
|
|
14
|
+
languages: LanguagePickerOption[];
|
|
15
|
+
recentlyUsedLanguages?: LanguagePickerOption[];
|
|
16
|
+
};
|
|
17
|
+
export declare const getDetectLanguageOption: (formatMessage: IntlShape["formatMessage"]) => LanguagePickerOption;
|
|
18
|
+
export declare const createGroupedLanguageOptions: ({ formatMessage, languages, recentlyUsedLanguages, }: CreateGroupedLanguageOptionsProps) => LanguagePickerOptionGroup[];
|
|
19
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/editor-plugin-code-block",
|
|
3
|
-
"version": "12.1.
|
|
3
|
+
"version": "12.1.5",
|
|
4
4
|
"description": "Code block plugin for @atlaskit/editor-core",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -27,8 +27,10 @@
|
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"atlaskit:src": "src/index.ts",
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@atlaskit/adf-schema": "^52.
|
|
30
|
+
"@atlaskit/adf-schema": "^52.13.0",
|
|
31
|
+
"@atlaskit/button": "^23.11.0",
|
|
31
32
|
"@atlaskit/code": "^17.5.0",
|
|
33
|
+
"@atlaskit/css": "^0.19.0",
|
|
32
34
|
"@atlaskit/editor-plugin-analytics": "^10.1.0",
|
|
33
35
|
"@atlaskit/editor-plugin-block-menu": "^9.2.0",
|
|
34
36
|
"@atlaskit/editor-plugin-composition": "^9.1.0",
|
|
@@ -39,15 +41,20 @@
|
|
|
39
41
|
"@atlaskit/editor-plugin-selection": "^10.1.0",
|
|
40
42
|
"@atlaskit/editor-plugin-toolbar": "^7.3.0",
|
|
41
43
|
"@atlaskit/editor-prosemirror": "^7.3.0",
|
|
42
|
-
"@atlaskit/editor-
|
|
44
|
+
"@atlaskit/editor-shared-styles": "^3.11.0",
|
|
45
|
+
"@atlaskit/editor-toolbar": "^1.7.0",
|
|
43
46
|
"@atlaskit/icon": "^35.0.0",
|
|
44
47
|
"@atlaskit/platform-feature-flags": "^1.1.0",
|
|
48
|
+
"@atlaskit/primitives": "^19.0.0",
|
|
45
49
|
"@atlaskit/prosemirror-input-rules": "^3.7.0",
|
|
46
|
-
"@atlaskit/
|
|
47
|
-
"@
|
|
50
|
+
"@atlaskit/select": "^21.12.0",
|
|
51
|
+
"@atlaskit/tmp-editor-statsig": "^82.0.0",
|
|
52
|
+
"@atlaskit/tokens": "^13.0.0",
|
|
53
|
+
"@babel/runtime": "^7.0.0",
|
|
54
|
+
"@compiled/react": "^0.20.0"
|
|
48
55
|
},
|
|
49
56
|
"peerDependencies": {
|
|
50
|
-
"@atlaskit/editor-common": "^114.
|
|
57
|
+
"@atlaskit/editor-common": "^114.38.0",
|
|
51
58
|
"react": "^18.2.0",
|
|
52
59
|
"react-intl": "^5.25.1 || ^6.0.0 || ^7.0.0"
|
|
53
60
|
},
|