@megafon/ui-core 7.2.1 → 7.4.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/dist/es/components/Banner/Banner.css +1 -1
- package/dist/es/components/Banner/Banner.d.ts +2 -0
- package/dist/es/components/Banner/Banner.js +4 -1
- package/dist/es/components/Calendar/Calendar.css +1 -1
- package/dist/es/components/Calendar/Calendar.js +2 -2
- package/dist/es/components/Calendar/components/_Day/Day.css +1 -1
- package/dist/es/components/Calendar/components/_Month/Month.css +1 -1
- package/dist/es/components/Search/Search.css +1 -1
- package/dist/es/components/Search/Search.d.ts +15 -2
- package/dist/es/components/Search/Search.js +173 -23
- package/dist/es/components/Search/i/textarea-resizer.svg +4 -0
- package/dist/es/components/Tooltip/Tooltip.css +1 -1
- package/dist/es/components/Tooltip/Tooltip.d.ts +8 -0
- package/dist/es/components/Tooltip/Tooltip.js +9 -2
- package/dist/es/components/UploadForm/UploadField/UploadField.css +1 -0
- package/dist/es/components/UploadForm/UploadField/UploadField.d.ts +22 -0
- package/dist/es/components/UploadForm/UploadField/UploadField.js +56 -0
- package/dist/es/components/UploadForm/UploadField/components/_UploadFieldDropArea/UploadFieldDropArea.css +1 -0
- package/dist/es/components/UploadForm/UploadField/components/_UploadFieldDropArea/UploadFieldDropArea.d.ts +21 -0
- package/dist/es/components/UploadForm/UploadField/components/_UploadFieldDropArea/UploadFieldDropArea.js +50 -0
- package/dist/es/components/UploadForm/UploadField/components/useDragAndDrop.d.ts +3 -0
- package/dist/es/components/UploadForm/UploadField/components/useDragAndDrop.js +50 -0
- package/dist/es/components/UploadForm/UploadFileItem/UploadFileItem.css +1 -0
- package/dist/es/components/UploadForm/UploadFileItem/UploadFileItem.d.ts +25 -0
- package/dist/es/components/UploadForm/UploadFileItem/UploadFileItem.js +96 -0
- package/dist/es/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/UploadFileItemIcon.d.ts +7 -0
- package/dist/es/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/UploadFileItemIcon.js +279 -0
- package/dist/es/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/attach.svg +3 -0
- package/dist/es/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/excel.svg +25 -0
- package/dist/es/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/image.svg +3 -0
- package/dist/es/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/pdf.svg +4 -0
- package/dist/es/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/power.svg +21 -0
- package/dist/es/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/word.svg +22 -0
- package/dist/es/components/UploadForm/UploadFileItem/helpers.d.ts +5 -0
- package/dist/es/components/UploadForm/UploadFileItem/helpers.js +27 -0
- package/dist/es/index.d.ts +5 -0
- package/dist/es/index.js +5 -0
- package/dist/lib/components/Banner/Banner.css +1 -1
- package/dist/lib/components/Banner/Banner.d.ts +2 -0
- package/dist/lib/components/Banner/Banner.js +4 -1
- package/dist/lib/components/Calendar/Calendar.css +1 -1
- package/dist/lib/components/Calendar/Calendar.js +2 -2
- package/dist/lib/components/Calendar/components/_Day/Day.css +1 -1
- package/dist/lib/components/Calendar/components/_Month/Month.css +1 -1
- package/dist/lib/components/Search/Search.css +1 -1
- package/dist/lib/components/Search/Search.d.ts +15 -2
- package/dist/lib/components/Search/Search.js +174 -24
- package/dist/lib/components/Search/i/textarea-resizer.svg +4 -0
- package/dist/lib/components/Tooltip/Tooltip.css +1 -1
- package/dist/lib/components/Tooltip/Tooltip.d.ts +8 -0
- package/dist/lib/components/Tooltip/Tooltip.js +10 -3
- package/dist/lib/components/UploadForm/UploadField/UploadField.css +1 -0
- package/dist/lib/components/UploadForm/UploadField/UploadField.d.ts +22 -0
- package/dist/lib/components/UploadForm/UploadField/UploadField.js +65 -0
- package/dist/lib/components/UploadForm/UploadField/components/_UploadFieldDropArea/UploadFieldDropArea.css +1 -0
- package/dist/lib/components/UploadForm/UploadField/components/_UploadFieldDropArea/UploadFieldDropArea.d.ts +21 -0
- package/dist/lib/components/UploadForm/UploadField/components/_UploadFieldDropArea/UploadFieldDropArea.js +59 -0
- package/dist/lib/components/UploadForm/UploadField/components/useDragAndDrop.d.ts +3 -0
- package/dist/lib/components/UploadForm/UploadField/components/useDragAndDrop.js +57 -0
- package/dist/lib/components/UploadForm/UploadFileItem/UploadFileItem.css +1 -0
- package/dist/lib/components/UploadForm/UploadFileItem/UploadFileItem.d.ts +25 -0
- package/dist/lib/components/UploadForm/UploadFileItem/UploadFileItem.js +105 -0
- package/dist/lib/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/UploadFileItemIcon.d.ts +7 -0
- package/dist/lib/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/UploadFileItemIcon.js +289 -0
- package/dist/lib/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/attach.svg +3 -0
- package/dist/lib/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/excel.svg +25 -0
- package/dist/lib/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/image.svg +3 -0
- package/dist/lib/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/pdf.svg +4 -0
- package/dist/lib/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/power.svg +21 -0
- package/dist/lib/components/UploadForm/UploadFileItem/components/_UploadFileItemIcon/i/word.svg +22 -0
- package/dist/lib/components/UploadForm/UploadFileItem/helpers.d.ts +5 -0
- package/dist/lib/components/UploadForm/UploadFileItem/helpers.js +33 -0
- package/dist/lib/index.d.ts +5 -0
- package/dist/lib/index.js +35 -0
- package/package.json +3 -3
|
@@ -54,6 +54,9 @@ export var Paddings = {
|
|
|
54
54
|
SMALL: 'small',
|
|
55
55
|
MEDIUM: 'medium'
|
|
56
56
|
};
|
|
57
|
+
export var Offset = {
|
|
58
|
+
SMALL: 'small'
|
|
59
|
+
};
|
|
57
60
|
export var TriggerEvent = {
|
|
58
61
|
HOVER: 'hover',
|
|
59
62
|
CLICK: 'click',
|
|
@@ -90,6 +93,7 @@ var Tooltip = function Tooltip(_ref) {
|
|
|
90
93
|
fallbackPlacements = _ref$fallbackPlacemen === void 0 ? ['left', 'right', 'top', 'bottom'] : _ref$fallbackPlacemen,
|
|
91
94
|
_ref$paddings = _ref.paddings,
|
|
92
95
|
paddings = _ref$paddings === void 0 ? 'small' : _ref$paddings,
|
|
96
|
+
offset = _ref.offset,
|
|
93
97
|
_ref$triggerEvent = _ref.triggerEvent,
|
|
94
98
|
triggerEvent = _ref$triggerEvent === void 0 ? 'hover' : _ref$triggerEvent,
|
|
95
99
|
boundaryElement = _ref.boundaryElement,
|
|
@@ -97,6 +101,8 @@ var Tooltip = function Tooltip(_ref) {
|
|
|
97
101
|
targetElement = _ref.targetElement,
|
|
98
102
|
_ref$isOpened = _ref.isOpened,
|
|
99
103
|
isOpened = _ref$isOpened === void 0 ? false : _ref$isOpened,
|
|
104
|
+
_ref$isHiddenResize = _ref.isHiddenResize,
|
|
105
|
+
isHiddenResize = _ref$isHiddenResize === void 0 ? false : _ref$isHiddenResize,
|
|
100
106
|
_ref$isPortal = _ref.isPortal,
|
|
101
107
|
isPortal = _ref$isPortal === void 0 ? false : _ref$isPortal,
|
|
102
108
|
portalSelector = _ref.portalSelector,
|
|
@@ -169,7 +175,7 @@ var Tooltip = function Tooltip(_ref) {
|
|
|
169
175
|
name: 'eventListeners',
|
|
170
176
|
options: {
|
|
171
177
|
scroll: isOpen,
|
|
172
|
-
resize: isOpen
|
|
178
|
+
resize: isHiddenResize || isOpen
|
|
173
179
|
}
|
|
174
180
|
}, {
|
|
175
181
|
name: 'preventOverflow',
|
|
@@ -178,7 +184,7 @@ var Tooltip = function Tooltip(_ref) {
|
|
|
178
184
|
}
|
|
179
185
|
}]
|
|
180
186
|
};
|
|
181
|
-
}, [placement, arrowElement,
|
|
187
|
+
}, [placement, arrowElement, fallbackPlacements, isOpen, isHiddenResize, currentBoundary]);
|
|
182
188
|
var _usePopper = usePopper(currentTarget, popperElement, options),
|
|
183
189
|
styles = _usePopper.styles,
|
|
184
190
|
attributes = _usePopper.attributes,
|
|
@@ -312,6 +318,7 @@ var Tooltip = function Tooltip(_ref) {
|
|
|
312
318
|
className: cn({
|
|
313
319
|
theme: theme,
|
|
314
320
|
paddings: paddings,
|
|
321
|
+
offset: offset,
|
|
315
322
|
open: isOpen,
|
|
316
323
|
small: !isBigSize,
|
|
317
324
|
'has-escape': !targetElement
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
h1,h2,h3,h4,h5{margin:0}.mfui-upload-field{-webkit-box-sizing:border-box;box-sizing:border-box;max-width:455px;position:relative;width:100%}.mfui-upload-field__input{border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px;clip:rect(0 0 0 0);clip-path:inset(100%)}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import './UploadField.scss';
|
|
3
|
+
export interface IUploadDropField {
|
|
4
|
+
/** Дополнительный класс корневого элемента */
|
|
5
|
+
className?: string;
|
|
6
|
+
/** Обязательность поля */
|
|
7
|
+
required?: boolean;
|
|
8
|
+
/** Заблокированное состояние */
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
/** Действие при выборе файла */
|
|
11
|
+
onChange: (files: File[]) => void;
|
|
12
|
+
/** Дополнительная информация */
|
|
13
|
+
description?: string;
|
|
14
|
+
/** Дополнительные data атрибуты к внутренним элементам */
|
|
15
|
+
dataAttrs?: {
|
|
16
|
+
root?: Record<string, string>;
|
|
17
|
+
input?: Record<string, string>;
|
|
18
|
+
dropArea?: Record<string, string>;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
declare const UploadField: React.FC<IUploadDropField>;
|
|
22
|
+
export default UploadField;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import "core-js/modules/es.symbol.js";
|
|
3
|
+
import "core-js/modules/es.symbol.description.js";
|
|
4
|
+
import "core-js/modules/es.array.from.js";
|
|
5
|
+
import "core-js/modules/es.string.iterator.js";
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import { cnCreate, filterDataAttrs } from '@megafon/ui-helpers';
|
|
8
|
+
import UploadFieldDropArea from "./components/_UploadFieldDropArea/UploadFieldDropArea";
|
|
9
|
+
import "./UploadField.css";
|
|
10
|
+
var cn = cnCreate('mfui-upload-field');
|
|
11
|
+
var UploadField = function UploadField(_ref) {
|
|
12
|
+
var className = _ref.className,
|
|
13
|
+
_ref$required = _ref.required,
|
|
14
|
+
required = _ref$required === void 0 ? false : _ref$required,
|
|
15
|
+
_ref$disabled = _ref.disabled,
|
|
16
|
+
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
|
|
17
|
+
onChange = _ref.onChange,
|
|
18
|
+
description = _ref.description,
|
|
19
|
+
dataAttrs = _ref.dataAttrs;
|
|
20
|
+
var inputRef = React.useRef(null);
|
|
21
|
+
var handleInputChange = React.useCallback(function (e) {
|
|
22
|
+
var uploadFiles = Array.from(e.target.files || []);
|
|
23
|
+
onChange(uploadFiles);
|
|
24
|
+
e.target.value = '';
|
|
25
|
+
}, [onChange]);
|
|
26
|
+
var handleFileDrop = React.useCallback(function (uploadFiles) {
|
|
27
|
+
onChange(uploadFiles);
|
|
28
|
+
}, [onChange]);
|
|
29
|
+
var handleSelectButtonClick = React.useCallback(function () {
|
|
30
|
+
if (!inputRef || !inputRef.current) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
inputRef.current.click();
|
|
34
|
+
}, []);
|
|
35
|
+
return /*#__PURE__*/React.createElement("div", _extends({
|
|
36
|
+
className: cn([className])
|
|
37
|
+
}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root)), /*#__PURE__*/React.createElement("input", _extends({
|
|
38
|
+
className: cn('input')
|
|
39
|
+
}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.input), {
|
|
40
|
+
multiple: true,
|
|
41
|
+
type: "file",
|
|
42
|
+
ref: inputRef,
|
|
43
|
+
onChange: handleInputChange,
|
|
44
|
+
disabled: disabled
|
|
45
|
+
})), /*#__PURE__*/React.createElement(UploadFieldDropArea, {
|
|
46
|
+
description: description,
|
|
47
|
+
required: required,
|
|
48
|
+
disabled: disabled,
|
|
49
|
+
onDrop: handleFileDrop,
|
|
50
|
+
onSelectButtonClick: handleSelectButtonClick,
|
|
51
|
+
dataAttrs: {
|
|
52
|
+
root: dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.dropArea
|
|
53
|
+
}
|
|
54
|
+
}));
|
|
55
|
+
};
|
|
56
|
+
export default UploadField;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
h1,h2,h3,h4,h5{margin:0}.mfui-upload-field-drop-area{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:8px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:1px dashed var(--spbSky2);border-radius:12px;padding:12px 32px 20px;width:100%}.mfui-upload-field-drop-area__upload-icon{height:40px;width:40px;fill:var(--spbSky3)}.mfui-upload-field-drop-area__content{text-align:center}.mfui-upload-field-drop-area__select-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:none;border-radius:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--brandGreen);cursor:pointer;display:inline-block;font-family:inherit;font-weight:500;margin-right:4px;outline:none;padding:0;text-align:center;text-decoration:none}.mfui-upload-field-drop-area__description{color:var(--spbSky3);font-size:12px;font-weight:400;line-height:18px;text-align:center}.mfui-upload-field-drop-area__select-button:hover{color:var(--buttonHoverGreen)}.mfui-upload-field-drop-area__mark{color:var(--fury)}.mfui-upload-field-drop-area_dragging{border-color:var(--brandGreen)}.mfui-upload-field-drop-area_dragging *{pointer-events:none}.mfui-upload-field-drop-area_disabled{background-color:var(--spbSky0);color:var(--spbSky3)}.mfui-upload-field-drop-area_disabled .mfui-upload-field-drop-area__select-button{color:var(--spbSky3);cursor:not-allowed}.mfui-upload-field-drop-area_disabled .mfui-upload-field-drop-area__mark{color:var(--spbSky3)}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import './UploadFieldDropArea.scss';
|
|
3
|
+
export interface IUploadFieldDropArea {
|
|
4
|
+
/** Дополнительная информация */
|
|
5
|
+
description?: string;
|
|
6
|
+
/** Обязательность поля */
|
|
7
|
+
required: boolean;
|
|
8
|
+
/** Заблокированное состояние */
|
|
9
|
+
disabled: boolean;
|
|
10
|
+
/** Обработчик события 'drop' */
|
|
11
|
+
onDrop: (files: File[]) => void;
|
|
12
|
+
/** Обработчик нажатия на кнопку выбора файлов */
|
|
13
|
+
onSelectButtonClick: () => void;
|
|
14
|
+
/** Дополнительные data атрибуты к внутренним элементам */
|
|
15
|
+
dataAttrs?: {
|
|
16
|
+
root?: Record<string, string>;
|
|
17
|
+
button?: Record<string, string>;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
declare const UploadFieldDropArea: React.FC<IUploadFieldDropArea>;
|
|
21
|
+
export default UploadFieldDropArea;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import "core-js/modules/es.symbol.js";
|
|
3
|
+
import "core-js/modules/es.symbol.description.js";
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { cnCreate, filterDataAttrs } from '@megafon/ui-helpers';
|
|
6
|
+
import useDragAndDrop from "../useDragAndDrop";
|
|
7
|
+
import "./UploadFieldDropArea.css";
|
|
8
|
+
var CloudUpload = function CloudUpload(props) {
|
|
9
|
+
return /*#__PURE__*/React.createElement("svg", _extends({
|
|
10
|
+
viewBox: "0 0 40 40"
|
|
11
|
+
}, props), /*#__PURE__*/React.createElement("path", {
|
|
12
|
+
d: "M19 36V22l-2.38 3.9-1.71-1L19 18h1.88l4.14 6.85-1.71 1L21 22v14zM8.21 32H14v-2H8.21A4.27 4.27 0 014 25.6a4.27 4.27 0 014.21-4.4h2.07V18a9.94 9.94 0 019.66-10 9.94 9.94 0 019.66 10v1h1a5.49 5.49 0 010 11H26v2h4.6a7.49 7.49 0 001-14.91A11.94 11.94 0 0019.94 6 11.94 11.94 0 008.27 18v1.16h-.06A6.27 6.27 0 002 25.6 6.27 6.27 0 008.21 32z"
|
|
13
|
+
}));
|
|
14
|
+
};
|
|
15
|
+
var cn = cnCreate('mfui-upload-field-drop-area');
|
|
16
|
+
var UploadFieldDropArea = function UploadFieldDropArea(_ref) {
|
|
17
|
+
var description = _ref.description,
|
|
18
|
+
required = _ref.required,
|
|
19
|
+
disabled = _ref.disabled,
|
|
20
|
+
onDrop = _ref.onDrop,
|
|
21
|
+
onSelectButtonClick = _ref.onSelectButtonClick,
|
|
22
|
+
dataAttrs = _ref.dataAttrs;
|
|
23
|
+
var dropAreaRef = React.useRef(null);
|
|
24
|
+
var currentDropAreaRef = !disabled ? dropAreaRef : {
|
|
25
|
+
current: null
|
|
26
|
+
};
|
|
27
|
+
var isDragging = useDragAndDrop(currentDropAreaRef, onDrop);
|
|
28
|
+
return /*#__PURE__*/React.createElement("div", _extends({
|
|
29
|
+
className: cn({
|
|
30
|
+
disabled: disabled,
|
|
31
|
+
dragging: isDragging
|
|
32
|
+
}),
|
|
33
|
+
ref: dropAreaRef
|
|
34
|
+
}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root)), /*#__PURE__*/React.createElement(CloudUpload, {
|
|
35
|
+
className: cn('upload-icon')
|
|
36
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
37
|
+
className: cn('content')
|
|
38
|
+
}, /*#__PURE__*/React.createElement("button", _extends({
|
|
39
|
+
className: cn('select-button')
|
|
40
|
+
}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.button), {
|
|
41
|
+
type: "button",
|
|
42
|
+
disabled: disabled,
|
|
43
|
+
onClick: !disabled ? onSelectButtonClick : undefined
|
|
44
|
+
}), "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043B\u044B"), /*#__PURE__*/React.createElement("span", null, "\u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u0435 \u0438\u0445 \u0441\u044E\u0434\u0430", required && /*#__PURE__*/React.createElement("span", {
|
|
45
|
+
className: cn('mark')
|
|
46
|
+
}, "*"))), !!description && /*#__PURE__*/React.createElement("div", {
|
|
47
|
+
className: cn('description')
|
|
48
|
+
}, description));
|
|
49
|
+
};
|
|
50
|
+
export default UploadFieldDropArea;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import "core-js/modules/es.array.from.js";
|
|
3
|
+
import "core-js/modules/es.string.iterator.js";
|
|
4
|
+
import React from 'react';
|
|
5
|
+
var useDragAndDrop = function useDragAndDrop(dropAreaRef, onDrop) {
|
|
6
|
+
var _React$useState = React.useState(false),
|
|
7
|
+
_React$useState2 = _slicedToArray(_React$useState, 2),
|
|
8
|
+
isDragging = _React$useState2[0],
|
|
9
|
+
setIsDragging = _React$useState2[1];
|
|
10
|
+
var dragEnterHandler = React.useCallback(function (e) {
|
|
11
|
+
e.preventDefault();
|
|
12
|
+
e.stopPropagation();
|
|
13
|
+
setIsDragging(true);
|
|
14
|
+
}, []);
|
|
15
|
+
var dragLeaveHandler = React.useCallback(function (e) {
|
|
16
|
+
e.preventDefault();
|
|
17
|
+
e.stopPropagation();
|
|
18
|
+
setIsDragging(false);
|
|
19
|
+
}, []);
|
|
20
|
+
var dragOverHandler = React.useCallback(function (e) {
|
|
21
|
+
e.preventDefault();
|
|
22
|
+
e.stopPropagation();
|
|
23
|
+
}, []);
|
|
24
|
+
var dropHandler = React.useCallback(function (e) {
|
|
25
|
+
e.preventDefault();
|
|
26
|
+
e.stopPropagation();
|
|
27
|
+
setIsDragging(false);
|
|
28
|
+
if (e.dataTransfer) {
|
|
29
|
+
onDrop(Array.from(e.dataTransfer.files));
|
|
30
|
+
}
|
|
31
|
+
}, [onDrop]);
|
|
32
|
+
React.useEffect(function () {
|
|
33
|
+
if (!dropAreaRef.current) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
var dropArea = dropAreaRef.current;
|
|
37
|
+
dropArea.addEventListener('dragenter', dragEnterHandler);
|
|
38
|
+
dropArea.addEventListener('dragleave', dragLeaveHandler);
|
|
39
|
+
dropArea.addEventListener('dragover', dragOverHandler);
|
|
40
|
+
dropArea.addEventListener('drop', dropHandler);
|
|
41
|
+
return function () {
|
|
42
|
+
dropArea.removeEventListener('dragenter', dragEnterHandler);
|
|
43
|
+
dropArea.removeEventListener('dragleave', dragLeaveHandler);
|
|
44
|
+
dropArea.removeEventListener('dragover', dragOverHandler);
|
|
45
|
+
dropArea.removeEventListener('drop', dropHandler);
|
|
46
|
+
};
|
|
47
|
+
}, [dragEnterHandler, dragLeaveHandler, dragOverHandler, dropHandler, dropAreaRef]);
|
|
48
|
+
return isDragging;
|
|
49
|
+
};
|
|
50
|
+
export default useDragAndDrop;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
h1,h2,h3,h4,h5{margin:0}.mfui-upload-file-item{display:-webkit-box;display:-ms-flexbox;display:flex;gap:12px;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;border-color:var(--spbSky1);border-radius:12px;border-style:solid;border-width:1px;-webkit-box-sizing:border-box;box-sizing:border-box;max-width:455px;padding:12px;width:100%}.mfui-upload-file-item__cancel-icon-box,.mfui-upload-file-item__file-icon-box{-ms-flex-negative:0;flex-shrink:0;height:32px;margin-top:5px;width:32px}.mfui-upload-file-item__cancel-icon-box{background-color:var(--spbSky0);border:none;border-radius:50%;cursor:pointer;padding:0}.mfui-upload-file-item__cancel-icon-box svg{fill:var(--spbSky3)}.mfui-upload-file-item__cancel-icon-box:hover{background-color:var(--spbSky1)}.mfui-upload-file-item__cancel-icon-box:active{background-color:var(--spbSky2)}.mfui-upload-file-item__icon{height:100%;width:100%}.mfui-upload-file-item__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden}.mfui-upload-file-item__name{font-size:15px;font-weight:500;line-height:24px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.mfui-upload-file-item__description{color:var(--spbSky3);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;font-weight:400;gap:4px;line-height:18px}.mfui-upload-file-item__progress-bar{background-color:var(--spbSky1);border-radius:2px;height:4px;margin-top:12px;width:100%}.mfui-upload-file-item__progress-bar-fill{background-color:var(--brandGreen);border-radius:2px;height:100%;-webkit-transition:width .3s ease;transition:width .3s ease;width:0}.mfui-upload-file-item__service-message{color:var(--content)}.mfui-upload-file-item__error-message{color:var(--fury);cursor:pointer;-webkit-text-decoration-color:var(--fury);text-decoration-color:var(--fury);-webkit-text-decoration-line:underline;text-decoration-line:underline;-webkit-text-decoration-style:dotted;text-decoration-style:dotted;text-underline-offset:2px}.mfui-upload-file-item__error-tooltip{font-size:15px;font-weight:500;line-height:24px;max-width:260px}.mfui-upload-file-item_error{border-color:var(--fury20)}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import './UploadFileItem.scss';
|
|
3
|
+
export interface IUploadFileItem {
|
|
4
|
+
/** Дополнительный класс корневого элемента */
|
|
5
|
+
className?: string;
|
|
6
|
+
/** Имя файла с расширением */
|
|
7
|
+
fileName: string;
|
|
8
|
+
/** Размер файла в байтах */
|
|
9
|
+
fileSize?: string | number;
|
|
10
|
+
/** Процент загрузки файла */
|
|
11
|
+
loadingProgress?: number;
|
|
12
|
+
/** Сообщение об ошибке */
|
|
13
|
+
errorText?: string;
|
|
14
|
+
/** Проверка файла */
|
|
15
|
+
isChecking?: string;
|
|
16
|
+
/** Обработчик удаления файла */
|
|
17
|
+
onDelete?: (e: React.SyntheticEvent<EventTarget>) => void;
|
|
18
|
+
/** Дополнительные data атрибуты к внутренним элементам */
|
|
19
|
+
dataAttrs?: {
|
|
20
|
+
root?: Record<string, string>;
|
|
21
|
+
deleteButton?: Record<string, string>;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
declare const UploadFileItem: React.FC<IUploadFileItem>;
|
|
25
|
+
export default UploadFileItem;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import "core-js/modules/es.function.name.js";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cnCreate, filterDataAttrs } from '@megafon/ui-helpers';
|
|
5
|
+
import Tooltip from "../../Tooltip/Tooltip";
|
|
6
|
+
import UploadFileItemIcon from "./components/_UploadFileItemIcon/UploadFileItemIcon";
|
|
7
|
+
import { getReadableFileSize, splitFileName } from "./helpers";
|
|
8
|
+
import "./UploadFileItem.css";
|
|
9
|
+
var CancelIcon = function CancelIcon(props) {
|
|
10
|
+
return /*#__PURE__*/React.createElement("svg", _extends({
|
|
11
|
+
viewBox: "0 0 32 32"
|
|
12
|
+
}, props), /*#__PURE__*/React.createElement("path", {
|
|
13
|
+
className: "CancelIcon__st0",
|
|
14
|
+
d: "M16 14.5L11.5 10 10 11.5l4.5 4.5-4.5 4.5 1.5 1.5 4.5-4.5 4.5 4.5 1.5-1.5-4.5-4.5 4.5-4.5-1.5-1.5-4.5 4.5z"
|
|
15
|
+
}));
|
|
16
|
+
};
|
|
17
|
+
var MAX_PROGRESS = 100;
|
|
18
|
+
var cn = cnCreate('mfui-upload-file-item');
|
|
19
|
+
var UploadFileItem = function UploadFileItem(_ref) {
|
|
20
|
+
var className = _ref.className,
|
|
21
|
+
fileName = _ref.fileName,
|
|
22
|
+
_ref$fileSize = _ref.fileSize,
|
|
23
|
+
fileSize = _ref$fileSize === void 0 ? 0 : _ref$fileSize,
|
|
24
|
+
_ref$loadingProgress = _ref.loadingProgress,
|
|
25
|
+
loadingProgress = _ref$loadingProgress === void 0 ? 0 : _ref$loadingProgress,
|
|
26
|
+
errorText = _ref.errorText,
|
|
27
|
+
_ref$isChecking = _ref.isChecking,
|
|
28
|
+
isChecking = _ref$isChecking === void 0 ? false : _ref$isChecking,
|
|
29
|
+
onDelete = _ref.onDelete,
|
|
30
|
+
dataAttrs = _ref.dataAttrs;
|
|
31
|
+
var tooltipTriggerElement = React.useRef(null);
|
|
32
|
+
var _splitFileName = splitFileName(fileName),
|
|
33
|
+
name = _splitFileName.name,
|
|
34
|
+
extension = _splitFileName.extension;
|
|
35
|
+
var readableFileSize = getReadableFileSize(fileSize);
|
|
36
|
+
var isError = !!errorText;
|
|
37
|
+
var handleDelete = function handleDelete(e) {
|
|
38
|
+
onDelete === null || onDelete === void 0 ? void 0 : onDelete(e);
|
|
39
|
+
};
|
|
40
|
+
var loadingStatusText = function loadingStatusText() {
|
|
41
|
+
if (isChecking) {
|
|
42
|
+
return 'проверка файла…';
|
|
43
|
+
}
|
|
44
|
+
if (loadingProgress === MAX_PROGRESS) {
|
|
45
|
+
return 'файл загружен';
|
|
46
|
+
}
|
|
47
|
+
return "\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430 ".concat(loadingProgress, "%");
|
|
48
|
+
};
|
|
49
|
+
var renderExtraContent = function renderExtraContent() {
|
|
50
|
+
if (isError) {
|
|
51
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
|
|
52
|
+
className: cn('error-message'),
|
|
53
|
+
ref: tooltipTriggerElement
|
|
54
|
+
}, "\u041E\u0448\u0438\u0431\u043A\u0430"), /*#__PURE__*/React.createElement(Tooltip, {
|
|
55
|
+
className: cn('error-tooltip'),
|
|
56
|
+
triggerElement: tooltipTriggerElement,
|
|
57
|
+
colorTheme: "blue",
|
|
58
|
+
placement: "bottom"
|
|
59
|
+
}, errorText));
|
|
60
|
+
}
|
|
61
|
+
return /*#__PURE__*/React.createElement("span", {
|
|
62
|
+
className: cn('service-message')
|
|
63
|
+
}, loadingStatusText());
|
|
64
|
+
};
|
|
65
|
+
return /*#__PURE__*/React.createElement("div", _extends({
|
|
66
|
+
className: cn({
|
|
67
|
+
error: isError
|
|
68
|
+
}, [className])
|
|
69
|
+
}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root)), /*#__PURE__*/React.createElement("div", {
|
|
70
|
+
className: cn('file-icon-box')
|
|
71
|
+
}, /*#__PURE__*/React.createElement(UploadFileItemIcon, {
|
|
72
|
+
fileExtension: extension,
|
|
73
|
+
className: cn('icon')
|
|
74
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
75
|
+
className: cn('content')
|
|
76
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
77
|
+
className: cn('name')
|
|
78
|
+
}, name), /*#__PURE__*/React.createElement("div", {
|
|
79
|
+
className: cn('description')
|
|
80
|
+
}, !!extension && /*#__PURE__*/React.createElement("span", null, extension.toUpperCase()), /*#__PURE__*/React.createElement("span", null, readableFileSize), renderExtraContent()), /*#__PURE__*/React.createElement("div", {
|
|
81
|
+
className: cn('progress-bar')
|
|
82
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
83
|
+
className: cn('progress-bar-fill'),
|
|
84
|
+
style: {
|
|
85
|
+
width: "".concat(loadingProgress, "%")
|
|
86
|
+
}
|
|
87
|
+
}))), /*#__PURE__*/React.createElement("button", _extends({
|
|
88
|
+
type: "button",
|
|
89
|
+
className: cn('cancel-icon-box')
|
|
90
|
+
}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.deleteButton), {
|
|
91
|
+
onClick: handleDelete
|
|
92
|
+
}), /*#__PURE__*/React.createElement(CancelIcon, {
|
|
93
|
+
className: cn('icon')
|
|
94
|
+
})));
|
|
95
|
+
};
|
|
96
|
+
export default UploadFileItem;
|