@skbkontur/markdown 2.6.3 → 2.7.0-alpha.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/package.json +2 -2
- package/src/Markdown/Emoji/Emoji.logic.js +4 -4
- package/src/Markdown/Emoji/Emoji.styled.js +14 -21
- package/src/Markdown/Emoji/EmojiDropdown.js +6 -11
- package/src/Markdown/Emoji/helpers.js +4 -4
- package/src/Markdown/Files/Files.logic.js +46 -108
- package/src/Markdown/Markdown.creevey.js +73 -221
- package/src/Markdown/Markdown.js +62 -86
- package/src/Markdown/Markdown.styled.js +251 -90
- package/src/Markdown/MarkdownActions/AIActionsDropdown/AIActionsDropdown.js +45 -111
- package/src/Markdown/MarkdownActions/AIActionsDropdown/AIActionsDropdown.styled.js +16 -8
- package/src/Markdown/MarkdownActions/AIActionsDropdown/constants.js +2 -2
- package/src/Markdown/MarkdownActions/MarkdownActions.js +24 -37
- package/src/Markdown/MarkdownActions/MarkdownDropdown/MarkdownDropdown.js +3 -7
- package/src/Markdown/MarkdownActions/MarkdownDropdown/MarkdownDropdown.styled.js +8 -6
- package/src/Markdown/MarkdownEditor.js +6 -28
- package/src/Markdown/MarkdownHelpItems.js +61 -63
- package/src/Markdown/MarkdownHelpers/EmptyPreview.js +1 -1
- package/src/Markdown/MarkdownHelpers/MarkdownFormatButton.js +6 -7
- package/src/Markdown/MarkdownHelpers/constants.js +2 -2
- package/src/Markdown/MarkdownHelpers/markdownHelpers.d.ts +1 -0
- package/src/Markdown/MarkdownHelpers/markdownHelpers.js +50 -47
- package/src/Markdown/MarkdownHelpers/markdownListEnterHelpers.d.ts +2 -0
- package/src/Markdown/MarkdownHelpers/markdownListEnterHelpers.js +45 -0
- package/src/Markdown/MarkdownHelpers/markdownMentionHelpers.js +12 -12
- package/src/Markdown/MarkdownHelpers/markdownTextareaHelpers.js +34 -36
- package/src/Markdown/MarkdownMention.js +18 -64
- package/src/Markdown/constants.js +6 -6
- package/src/Markdown/utils/guid.js +13 -18
- package/src/Markdown/utils/htmlToMd.js +2 -2
- package/src/Markdown/utils/onInsertText.d.ts +1 -0
- package/src/Markdown/utils/onInsertText.js +3 -0
- package/src/Markdown/utils/saveFile.js +4 -4
- package/src/MarkdownCombination/MarkdownCombination.js +8 -9
- package/src/MarkdownCombination/MarkdownCombination.styled.js +7 -6
- package/src/MarkdownIcons/AttachLink.js +2 -2
- package/src/MarkdownIcons/AttachPaperclip.js +2 -2
- package/src/MarkdownIcons/CheckboxCheckedIcon.js +2 -2
- package/src/MarkdownIcons/CheckboxUncheckedIcon.js +2 -2
- package/src/MarkdownIcons/CheckedList.js +2 -2
- package/src/MarkdownIcons/Collapse.js +2 -2
- package/src/MarkdownIcons/Copy.js +1 -1
- package/src/MarkdownIcons/DocIcon.js +2 -2
- package/src/MarkdownIcons/EmojiFace.js +2 -2
- package/src/MarkdownIcons/EmptyPrviewArrow.js +1 -1
- package/src/MarkdownIcons/Expand.js +2 -2
- package/src/MarkdownIcons/EyeOpen.js +2 -2
- package/src/MarkdownIcons/List.js +2 -2
- package/src/MarkdownIcons/MarkdownIcons.styled.js +3 -6
- package/src/MarkdownIcons/NatureFxSparkleA2.js +1 -1
- package/src/MarkdownIcons/NumberedList.js +2 -2
- package/src/MarkdownIcons/SplitView.js +1 -1
- package/src/MarkdownIcons/Table.js +2 -2
- package/src/MarkdownIcons/ToolPencil.js +2 -2
- package/src/MarkdownViewer/Helpers/MarkdownImage.js +1 -2
- package/src/MarkdownViewer/Helpers/MarkdownLink.js +1 -4
- package/src/MarkdownViewer/Helpers/MarkdownTable.js +1 -2
- package/src/MarkdownViewer/MarkdownViewer.js +18 -26
- package/src/MarkdownViewer/MarkdownViewer.styles.js +163 -19
- package/src/styles/styled-components.js +1 -1
- package/src/styles/theme.js +5 -5
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skbkontur/markdown",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.0-alpha.0",
|
|
4
|
+
"packageManager": "yarn@4.13.0",
|
|
4
5
|
"publishConfig": {
|
|
5
6
|
"registry": "https://registry.npmjs.org/",
|
|
6
7
|
"access": "public"
|
|
7
8
|
},
|
|
8
9
|
"repository": "https://github.com/skbkontur/markdown",
|
|
9
|
-
"private": false,
|
|
10
10
|
"license": "UNLICENSED",
|
|
11
11
|
"author": "tsypilov",
|
|
12
12
|
"dependencies": {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { setMarkdownPastedHtml } from '../MarkdownHelpers/markdownHelpers';
|
|
2
|
-
export
|
|
3
|
-
|
|
2
|
+
export const useEmojiLogic = (textarea) => {
|
|
3
|
+
const onSelectEmoji = (emoji) => {
|
|
4
4
|
if (textarea) {
|
|
5
|
-
|
|
5
|
+
const textareaNode = textarea.node;
|
|
6
6
|
setMarkdownPastedHtml(emoji.native, textareaNode);
|
|
7
7
|
}
|
|
8
8
|
};
|
|
9
9
|
return {
|
|
10
|
-
onSelectEmoji
|
|
10
|
+
onSelectEmoji,
|
|
11
11
|
};
|
|
12
12
|
};
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
2
|
-
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
3
|
-
return cooked;
|
|
4
|
-
};
|
|
5
1
|
import { getColor } from './helpers';
|
|
6
2
|
import styled from '../../styles/styled-components';
|
|
7
3
|
/**
|
|
@@ -9,20 +5,17 @@ import styled from '../../styles/styled-components';
|
|
|
9
5
|
* https://github.com/missive/emoji-mart/blob/main/packages/emoji-mart-website/example-custom-styles.html
|
|
10
6
|
*/
|
|
11
7
|
/* stylelint-disable function-name-case */
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return getColor(theme.colors.text);
|
|
27
|
-
});
|
|
28
|
-
var templateObject_1;
|
|
8
|
+
export const EmojiPickerWrapper = styled.div `
|
|
9
|
+
em-emoji-picker {
|
|
10
|
+
--font-family: inherit;
|
|
11
|
+
--shadow: unset;
|
|
12
|
+
--rgb-accent: ${({ theme }) => getColor(theme.colors.brand)};
|
|
13
|
+
--color-border: ${({ theme }) => getColor(theme.colors.grayDefault)};
|
|
14
|
+
--rgb-background: ${({ theme }) => getColor(theme.colors.emojiPickerBackgroundRGBColor)};
|
|
15
|
+
--rgb-input: ${({ theme }) => getColor(theme.colors.emojiPickerBackgroundRGBColor)};
|
|
16
|
+
--rgb-color: ${({ theme }) => getColor(theme.colors.text)};
|
|
17
|
+
|
|
18
|
+
max-height: 300px;
|
|
19
|
+
width: 100%;
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
@@ -9,21 +9,16 @@ import { DEFAULT_MARKDOWN_THEME, MarkdownThemeConsumer } from '../../styles/them
|
|
|
9
9
|
import { MarkdownFormatButton } from '../MarkdownHelpers/MarkdownFormatButton';
|
|
10
10
|
import { MarkdownTids } from '../MarkdownTids';
|
|
11
11
|
emojiLocale.search = 'Поиск на английском';
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return (React.createElement(DropdownMenu, { ref: dropdownMenuRef, caption: function (_a) {
|
|
18
|
-
var toggleMenu = _a.toggleMenu;
|
|
19
|
-
return (React.createElement(MarkdownFormatButton, { dataTid: MarkdownTids.Emoji, showShortKey: showShortKey, showActionHint: showActionHint, hintText: "Emoji", disabled: isPreviewMode, icon: React.createElement(EmojiFace, null), text: "Emoji", onClick: toggleMenu }));
|
|
20
|
-
}, menuWidth: 300, positions: ['bottom right', 'bottom left', 'top right', 'top right'] },
|
|
12
|
+
export const EmojiDropdown = ({ isPreviewMode, showShortKey, onSelect, showActionHint }) => {
|
|
13
|
+
const dropdownMenuRef = useRef(null);
|
|
14
|
+
return (React.createElement(MarkdownThemeConsumer, null, theme => {
|
|
15
|
+
const currentTheme = theme ?? DEFAULT_MARKDOWN_THEME;
|
|
16
|
+
return (React.createElement(DropdownMenu, { ref: dropdownMenuRef, caption: ({ toggleMenu }) => (React.createElement(MarkdownFormatButton, { dataTid: MarkdownTids.Emoji, showShortKey: showShortKey, showActionHint: showActionHint, hintText: "Emoji", disabled: isPreviewMode, icon: React.createElement(EmojiFace, null), text: "Emoji", onClick: toggleMenu })), menuWidth: 300, positions: ['bottom right', 'bottom left', 'top right', 'top right'] },
|
|
21
17
|
React.createElement(EmojiPickerWrapper, null,
|
|
22
18
|
React.createElement(EmojiPicker, { dynamicWidth: true, data: data, i18n: emojiLocale, locale: "ru", theme: currentTheme.themeMode, skinTonePosition: "none", previewPosition: "none", onEmojiSelect: handleSelectEmoji }))));
|
|
23
19
|
}));
|
|
24
20
|
function handleSelectEmoji(data) {
|
|
25
|
-
var _a;
|
|
26
21
|
onSelect(data);
|
|
27
|
-
|
|
22
|
+
dropdownMenuRef.current?.close();
|
|
28
23
|
}
|
|
29
24
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export
|
|
1
|
+
const RGB_KEY = 'rgb';
|
|
2
|
+
const regExp = /\((.*)\)/;
|
|
3
|
+
const rgbDefaultWhite = '255, 255, 255';
|
|
4
|
+
export const getColor = (color) => color.startsWith(RGB_KEY) ? color.match(regExp)?.pop() ?? rgbDefaultWhite : `from ${color} r g b / 1`;
|
|
@@ -1,39 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
-
function step(op) {
|
|
15
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
-
switch (op[0]) {
|
|
20
|
-
case 0: case 1: t = op; break;
|
|
21
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
-
default:
|
|
25
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
-
if (t[2]) _.ops.pop();
|
|
30
|
-
_.trys.pop(); continue;
|
|
31
|
-
}
|
|
32
|
-
op = body.call(thisArg, _);
|
|
33
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
1
|
import { Toast } from '@skbkontur/react-ui';
|
|
38
2
|
import { useState } from 'react';
|
|
39
3
|
import { useDropzone } from 'react-dropzone';
|
|
@@ -41,84 +5,58 @@ import { MarkdownFormat } from '../MarkdownFormat';
|
|
|
41
5
|
import { setMarkdownFiles } from '../MarkdownHelpers/markdownHelpers';
|
|
42
6
|
import { RequestStatus } from '../utils/requestStatus';
|
|
43
7
|
import { saveFile } from '../utils/saveFile';
|
|
44
|
-
|
|
45
|
-
export
|
|
46
|
-
|
|
8
|
+
const PARENTHESES_REGEXP = /[()[\]]/gm;
|
|
9
|
+
export const useFileLogic = (fileUploadApi, fileDownloadApi, fileApiUrl, textarea, cursorPosition, disabled) => {
|
|
10
|
+
const { getRootProps, getInputProps, isDragActive, open } = useDropzone({
|
|
47
11
|
multiple: false,
|
|
48
12
|
noClick: true,
|
|
49
13
|
disabled: disabled || !fileUploadApi || !fileDownloadApi,
|
|
50
|
-
onDrop:
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
function uploadFile(file) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
case 1:
|
|
68
|
-
_a.trys.push([1, 3, , 4]);
|
|
69
|
-
setError(false);
|
|
70
|
-
return [4 /*yield*/, fileUploadApi(new File([file], file.name.replace(PARENTHESES_REGEXP, '')))];
|
|
71
|
-
case 2:
|
|
72
|
-
response = _a.sent();
|
|
73
|
-
isImage = file.type.includes('image');
|
|
74
|
-
if (response && textarea) {
|
|
75
|
-
setMarkdownFiles(response, textarea, isImage ? MarkdownFormat.image : MarkdownFormat.file, cursorPosition, fileApiUrl);
|
|
76
|
-
}
|
|
77
|
-
setRequestStatus(RequestStatus.isLoaded);
|
|
78
|
-
return [3 /*break*/, 4];
|
|
79
|
-
case 3:
|
|
80
|
-
e_1 = _a.sent();
|
|
81
|
-
Toast.push('Ошибка загрузки файла');
|
|
82
|
-
setRequestStatus(RequestStatus.isFailed);
|
|
83
|
-
return [3 /*break*/, 4];
|
|
84
|
-
case 4: return [2 /*return*/];
|
|
14
|
+
onDrop: files => void uploadFile(files[0]),
|
|
15
|
+
});
|
|
16
|
+
const [requestStatus, setRequestStatus] = useState(RequestStatus.Default);
|
|
17
|
+
const [error, setError] = useState(false);
|
|
18
|
+
async function uploadFile(file) {
|
|
19
|
+
if (fileUploadApi) {
|
|
20
|
+
if (file.size / Math.pow(1024, 2) >= 10) {
|
|
21
|
+
setError(true);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
setRequestStatus(RequestStatus.isFetching);
|
|
25
|
+
try {
|
|
26
|
+
setError(false);
|
|
27
|
+
const response = await fileUploadApi(new File([file], file.name.replace(PARENTHESES_REGEXP, '')));
|
|
28
|
+
const isImage = file.type.includes('image');
|
|
29
|
+
if (response && textarea) {
|
|
30
|
+
setMarkdownFiles(response, textarea, isImage ? MarkdownFormat.image : MarkdownFormat.file, cursorPosition, fileApiUrl);
|
|
85
31
|
}
|
|
86
|
-
|
|
87
|
-
|
|
32
|
+
setRequestStatus(RequestStatus.isLoaded);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
Toast.push('Ошибка загрузки файла');
|
|
36
|
+
setRequestStatus(RequestStatus.isFailed);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
88
39
|
}
|
|
89
|
-
function downloadFile(id) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return [4 /*yield*/, fileDownloadApi(id)];
|
|
100
|
-
case 2:
|
|
101
|
-
response = _a.sent();
|
|
102
|
-
saveFile(response);
|
|
103
|
-
return [3 /*break*/, 4];
|
|
104
|
-
case 3:
|
|
105
|
-
e_2 = _a.sent();
|
|
106
|
-
Toast.push('Ошибка скачивания файла');
|
|
107
|
-
return [3 /*break*/, 4];
|
|
108
|
-
case 4: return [2 /*return*/];
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
});
|
|
40
|
+
async function downloadFile(id) {
|
|
41
|
+
if (fileDownloadApi) {
|
|
42
|
+
try {
|
|
43
|
+
const response = await fileDownloadApi(id);
|
|
44
|
+
saveFile(response);
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
Toast.push('Ошибка скачивания файла');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
112
50
|
}
|
|
113
51
|
return {
|
|
114
|
-
requestStatus
|
|
115
|
-
error
|
|
116
|
-
getRootProps
|
|
117
|
-
getInputProps
|
|
118
|
-
isDragActive
|
|
119
|
-
open
|
|
120
|
-
uploadFile
|
|
121
|
-
downloadFile
|
|
122
|
-
onResetError:
|
|
52
|
+
requestStatus,
|
|
53
|
+
error,
|
|
54
|
+
getRootProps,
|
|
55
|
+
getInputProps,
|
|
56
|
+
isDragActive,
|
|
57
|
+
open,
|
|
58
|
+
uploadFile,
|
|
59
|
+
downloadFile,
|
|
60
|
+
onResetError: () => setError(false),
|
|
123
61
|
};
|
|
124
62
|
};
|
|
@@ -1,234 +1,86 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
-
function step(op) {
|
|
15
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
-
switch (op[0]) {
|
|
20
|
-
case 0: case 1: t = op; break;
|
|
21
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
-
default:
|
|
25
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
-
if (t[2]) _.ops.pop();
|
|
30
|
-
_.trys.pop(); continue;
|
|
31
|
-
}
|
|
32
|
-
op = body.call(thisArg, _);
|
|
33
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
1
|
import { delay } from '@skbkontur/react-ui/lib/utils';
|
|
38
2
|
import { story, kind, test } from 'creevey';
|
|
39
3
|
import { MarkdownTids } from './MarkdownTids';
|
|
40
|
-
|
|
41
|
-
kind('Markdown',
|
|
42
|
-
story('CustomWidth',
|
|
43
|
-
var setStoryParameters = _a.setStoryParameters;
|
|
4
|
+
const getByTid = (tid) => `[data-tid="${tid}"]`;
|
|
5
|
+
kind('Markdown', () => {
|
|
6
|
+
story('CustomWidth', ({ setStoryParameters }) => {
|
|
44
7
|
setStoryParameters({ skip: !!process.env.STORYBOOK_TEAMCITY_VERSION });
|
|
45
|
-
test('withPreview',
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}); });
|
|
67
|
-
test('withFullscreen', function (context) { return __awaiter(void 0, void 0, void 0, function () {
|
|
68
|
-
var fullscreenButton, previewButton, editButton, fullscreenSplit, fullscreenPreview, fullscreenEdit;
|
|
69
|
-
return __generator(this, function (_a) {
|
|
70
|
-
switch (_a.label) {
|
|
71
|
-
case 0:
|
|
72
|
-
fullscreenButton = context.webdriver.locator(getByTid(MarkdownTids.FullscreenToggle));
|
|
73
|
-
previewButton = context.webdriver.locator(getByTid(MarkdownTids.PreviewView));
|
|
74
|
-
editButton = context.webdriver.locator(getByTid(MarkdownTids.EditView));
|
|
75
|
-
return [4 /*yield*/, fullscreenButton.click()];
|
|
76
|
-
case 1:
|
|
77
|
-
_a.sent();
|
|
78
|
-
return [4 /*yield*/, context.takeScreenshot()];
|
|
79
|
-
case 2:
|
|
80
|
-
fullscreenSplit = _a.sent();
|
|
81
|
-
return [4 /*yield*/, previewButton.click()];
|
|
82
|
-
case 3:
|
|
83
|
-
_a.sent();
|
|
84
|
-
return [4 /*yield*/, context.takeScreenshot()];
|
|
85
|
-
case 4:
|
|
86
|
-
fullscreenPreview = _a.sent();
|
|
87
|
-
return [4 /*yield*/, editButton.click()];
|
|
88
|
-
case 5:
|
|
89
|
-
_a.sent();
|
|
90
|
-
return [4 /*yield*/, context.takeScreenshot()];
|
|
91
|
-
case 6:
|
|
92
|
-
fullscreenEdit = _a.sent();
|
|
93
|
-
return [4 /*yield*/, context.matchImages({
|
|
94
|
-
fullscreenSplit: fullscreenSplit,
|
|
95
|
-
fullscreenPreview: fullscreenPreview,
|
|
96
|
-
fullscreenEdit: fullscreenEdit,
|
|
97
|
-
})];
|
|
98
|
-
case 7:
|
|
99
|
-
_a.sent();
|
|
100
|
-
return [2 /*return*/];
|
|
101
|
-
}
|
|
8
|
+
test('withPreview', async (context) => {
|
|
9
|
+
const previewButton = context.webdriver.locator(getByTid(MarkdownTids.PreviewView));
|
|
10
|
+
const idle = await context.takeScreenshot();
|
|
11
|
+
await previewButton.click();
|
|
12
|
+
const preview = await context.takeScreenshot();
|
|
13
|
+
await context.matchImages({ idle, preview });
|
|
14
|
+
});
|
|
15
|
+
test('withFullscreen', async (context) => {
|
|
16
|
+
const fullscreenButton = context.webdriver.locator(getByTid(MarkdownTids.FullscreenToggle));
|
|
17
|
+
const previewButton = context.webdriver.locator(getByTid(MarkdownTids.PreviewView));
|
|
18
|
+
const editButton = context.webdriver.locator(getByTid(MarkdownTids.EditView));
|
|
19
|
+
await fullscreenButton.click();
|
|
20
|
+
const fullscreenSplit = await context.takeScreenshot();
|
|
21
|
+
await previewButton.click();
|
|
22
|
+
const fullscreenPreview = await context.takeScreenshot();
|
|
23
|
+
await editButton.click();
|
|
24
|
+
const fullscreenEdit = await context.takeScreenshot();
|
|
25
|
+
await context.matchImages({
|
|
26
|
+
fullscreenSplit,
|
|
27
|
+
fullscreenPreview,
|
|
28
|
+
fullscreenEdit,
|
|
102
29
|
});
|
|
103
|
-
});
|
|
30
|
+
});
|
|
104
31
|
});
|
|
105
|
-
for (
|
|
106
|
-
|
|
107
|
-
story(storyName, function (_a) {
|
|
108
|
-
var setStoryParameters = _a.setStoryParameters;
|
|
32
|
+
for (const storyName of ['WithoutHints', 'WithActionHint', 'WithShortKeyHint', 'WithActionAndShortKeyHints']) {
|
|
33
|
+
story(storyName, ({ setStoryParameters }) => {
|
|
109
34
|
setStoryParameters({ skip: !!process.env.STORYBOOK_TEAMCITY_VERSION });
|
|
110
|
-
test('hint',
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
case 1:
|
|
118
|
-
_a.sent();
|
|
119
|
-
return [4 /*yield*/, delay(500)];
|
|
120
|
-
case 2:
|
|
121
|
-
_a.sent();
|
|
122
|
-
return [4 /*yield*/, context.takeScreenshot()];
|
|
123
|
-
case 3:
|
|
124
|
-
hint = _a.sent();
|
|
125
|
-
return [4 /*yield*/, context.matchImages({ hint: hint })];
|
|
126
|
-
case 4:
|
|
127
|
-
_a.sent();
|
|
128
|
-
return [2 /*return*/];
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
}); });
|
|
35
|
+
test('hint', async (context) => {
|
|
36
|
+
const boldButton = context.webdriver.locator(getByTid(MarkdownTids.Bold));
|
|
37
|
+
await boldButton.hover();
|
|
38
|
+
await delay(500);
|
|
39
|
+
const hint = await context.takeScreenshot();
|
|
40
|
+
await context.matchImages({ hint });
|
|
41
|
+
});
|
|
132
42
|
});
|
|
133
43
|
}
|
|
134
|
-
story('Editable',
|
|
135
|
-
var setStoryParameters = _a.setStoryParameters;
|
|
44
|
+
story('Editable', ({ setStoryParameters }) => {
|
|
136
45
|
setStoryParameters({ skip: !!process.env.STORYBOOK_TEAMCITY_VERSION });
|
|
137
|
-
test('markdownTests',
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
return [4 /*yield*/, textarea.press('Control+A')];
|
|
175
|
-
case 10:
|
|
176
|
-
_a.sent();
|
|
177
|
-
return [4 /*yield*/, textarea.press('Control+Shift+2')];
|
|
178
|
-
case 11:
|
|
179
|
-
_a.sent();
|
|
180
|
-
return [4 /*yield*/, context.takeScreenshot()];
|
|
181
|
-
case 12:
|
|
182
|
-
h2FromKeyboard = _a.sent();
|
|
183
|
-
return [4 /*yield*/, textarea.press('Control+A')];
|
|
184
|
-
case 13:
|
|
185
|
-
_a.sent();
|
|
186
|
-
return [4 /*yield*/, textarea.type('Жирный')];
|
|
187
|
-
case 14:
|
|
188
|
-
_a.sent();
|
|
189
|
-
return [4 /*yield*/, textarea.press('Control+A')];
|
|
190
|
-
case 15:
|
|
191
|
-
_a.sent();
|
|
192
|
-
return [4 /*yield*/, boldButton.click()];
|
|
193
|
-
case 16:
|
|
194
|
-
_a.sent();
|
|
195
|
-
return [4 /*yield*/, context.takeScreenshot()];
|
|
196
|
-
case 17:
|
|
197
|
-
boldFromButton = _a.sent();
|
|
198
|
-
return [4 /*yield*/, textarea.press('Control+A')];
|
|
199
|
-
case 18:
|
|
200
|
-
_a.sent();
|
|
201
|
-
return [4 /*yield*/, textarea.type('Жирный')];
|
|
202
|
-
case 19:
|
|
203
|
-
_a.sent();
|
|
204
|
-
return [4 /*yield*/, textarea.press('Control+A')];
|
|
205
|
-
case 20:
|
|
206
|
-
_a.sent();
|
|
207
|
-
return [4 /*yield*/, textarea.press('Control+B')];
|
|
208
|
-
case 21:
|
|
209
|
-
_a.sent();
|
|
210
|
-
return [4 /*yield*/, context.takeScreenshot()];
|
|
211
|
-
case 22:
|
|
212
|
-
boldFromKeyboard = _a.sent();
|
|
213
|
-
return [4 /*yield*/, emojiButton.click()];
|
|
214
|
-
case 23:
|
|
215
|
-
_a.sent();
|
|
216
|
-
return [4 /*yield*/, context.takeScreenshot()];
|
|
217
|
-
case 24:
|
|
218
|
-
openedEmojiPicker = _a.sent();
|
|
219
|
-
return [4 /*yield*/, context.matchImages({
|
|
220
|
-
openedDropdown: openedDropdown,
|
|
221
|
-
h2FromButton: h2FromButton,
|
|
222
|
-
h2FromKeyboard: h2FromKeyboard,
|
|
223
|
-
boldFromButton: boldFromButton,
|
|
224
|
-
boldFromKeyboard: boldFromKeyboard,
|
|
225
|
-
openedEmojiPicker: openedEmojiPicker,
|
|
226
|
-
})];
|
|
227
|
-
case 25:
|
|
228
|
-
_a.sent();
|
|
229
|
-
return [2 /*return*/];
|
|
230
|
-
}
|
|
46
|
+
test('markdownTests', async (context) => {
|
|
47
|
+
const textarea = context.webdriver.locator('textarea').nth(0);
|
|
48
|
+
const headingDropdown = context.webdriver.locator(getByTid(MarkdownTids.HeadingDropdown));
|
|
49
|
+
const headingH2 = context.webdriver.locator(getByTid(MarkdownTids.HeadingH2));
|
|
50
|
+
const boldButton = context.webdriver.locator(getByTid(MarkdownTids.Bold));
|
|
51
|
+
const emojiButton = context.webdriver.locator(getByTid(MarkdownTids.Emoji));
|
|
52
|
+
await textarea.click();
|
|
53
|
+
await textarea.type('Заголовок');
|
|
54
|
+
await textarea.press('Control+A');
|
|
55
|
+
await headingDropdown.click();
|
|
56
|
+
const openedDropdown = await context.takeScreenshot();
|
|
57
|
+
await headingH2.click();
|
|
58
|
+
const h2FromButton = await context.takeScreenshot();
|
|
59
|
+
await textarea.press('Control+A');
|
|
60
|
+
await textarea.type('Заголовок');
|
|
61
|
+
await textarea.press('Control+A');
|
|
62
|
+
await textarea.press('Control+Shift+2');
|
|
63
|
+
const h2FromKeyboard = await context.takeScreenshot();
|
|
64
|
+
await textarea.press('Control+A');
|
|
65
|
+
await textarea.type('Жирный');
|
|
66
|
+
await textarea.press('Control+A');
|
|
67
|
+
await boldButton.click();
|
|
68
|
+
const boldFromButton = await context.takeScreenshot();
|
|
69
|
+
await textarea.press('Control+A');
|
|
70
|
+
await textarea.type('Жирный');
|
|
71
|
+
await textarea.press('Control+A');
|
|
72
|
+
await textarea.press('Control+B');
|
|
73
|
+
const boldFromKeyboard = await context.takeScreenshot();
|
|
74
|
+
await emojiButton.click();
|
|
75
|
+
const openedEmojiPicker = await context.takeScreenshot();
|
|
76
|
+
await context.matchImages({
|
|
77
|
+
openedDropdown,
|
|
78
|
+
h2FromButton,
|
|
79
|
+
h2FromKeyboard,
|
|
80
|
+
boldFromButton,
|
|
81
|
+
boldFromKeyboard,
|
|
82
|
+
openedEmojiPicker,
|
|
231
83
|
});
|
|
232
|
-
});
|
|
84
|
+
});
|
|
233
85
|
});
|
|
234
86
|
});
|