@dnb/eufemia 9.47.0 → 9.47.1
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 +9 -0
- package/cjs/components/input-masked/InputMasked.js +13 -1
- package/cjs/components/input-masked/InputMaskedHooks.js +1 -1
- package/cjs/components/input-masked/InputMaskedUtils.js +3 -3
- package/cjs/components/upload/Upload.js +0 -1
- package/cjs/components/upload/UploadFileInput.js +2 -10
- package/cjs/components/upload/UploadFileList.js +0 -1
- package/cjs/components/upload/UploadFileListCell.js +22 -23
- package/cjs/components/upload/UploadInfo.js +1 -9
- package/cjs/components/upload/UploadVerify.d.ts +3 -0
- package/cjs/components/upload/UploadVerify.js +27 -3
- package/cjs/shared/Eufemia.js +1 -1
- package/components/input-masked/InputMasked.js +13 -1
- package/components/input-masked/InputMaskedHooks.js +1 -1
- package/components/input-masked/InputMaskedUtils.js +3 -3
- package/components/upload/Upload.js +0 -1
- package/components/upload/UploadFileInput.js +3 -10
- package/components/upload/UploadFileList.js +0 -1
- package/components/upload/UploadFileListCell.js +17 -19
- package/components/upload/UploadInfo.js +1 -9
- package/components/upload/UploadVerify.d.ts +3 -0
- package/components/upload/UploadVerify.js +18 -1
- package/es/components/input-masked/InputMasked.js +12 -1
- package/es/components/input-masked/InputMaskedHooks.js +1 -1
- package/es/components/input-masked/InputMaskedUtils.js +3 -3
- package/es/components/upload/Upload.js +0 -1
- package/es/components/upload/UploadFileInput.js +3 -7
- package/es/components/upload/UploadFileList.js +0 -1
- package/es/components/upload/UploadFileListCell.js +14 -18
- package/es/components/upload/UploadInfo.js +1 -9
- package/es/components/upload/UploadVerify.d.ts +3 -0
- package/es/components/upload/UploadVerify.js +11 -1
- package/es/shared/Eufemia.js +1 -1
- package/esm/dnb-ui-basis.min.mjs +1 -1
- package/esm/dnb-ui-components.min.mjs +1 -1
- package/esm/dnb-ui-elements.min.mjs +1 -1
- package/esm/dnb-ui-extensions.min.mjs +1 -1
- package/esm/dnb-ui-lib.min.mjs +2 -2
- package/esm/dnb-ui-web-components.min.mjs +2 -2
- package/package.json +1 -1
- package/shared/Eufemia.js +1 -1
- package/umd/dnb-ui-basis.min.js +1 -1
- package/umd/dnb-ui-components.min.js +1 -1
- package/umd/dnb-ui-elements.min.js +1 -1
- package/umd/dnb-ui-extensions.min.js +1 -1
- package/umd/dnb-ui-lib.min.js +2 -2
- package/umd/dnb-ui-web-components.min.js +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,15 @@
|
|
|
3
3
|
All notable changes to @dnb/eufemia will be documented in this file. See
|
|
4
4
|
[Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [9.47.1](https://github.com/dnbexperience/eufemia/compare/v9.47.0...v9.47.1) (2023-02-13)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **InputMasked:** avoid inherit mask options and types when custom mask is used ([#1988](https://github.com/dnbexperience/eufemia/issues/1988)) ([8937bcc](https://github.com/dnbexperience/eufemia/commit/8937bcc7842ba079318215c23d5e47c38fc91aeb))
|
|
12
|
+
* **InputMasked:** fix negative value updates (number mask) ([#1792](https://github.com/dnbexperience/eufemia/issues/1792)) ([e2b9482](https://github.com/dnbexperience/eufemia/commit/e2b94826d08572cb3008cb837658186644b8d0ba))
|
|
13
|
+
* **Upload:** fix handling of file types in combination with file extension ([#1986](https://github.com/dnbexperience/eufemia/issues/1986)) ([3fd9bfa](https://github.com/dnbexperience/eufemia/commit/3fd9bfab541dba28980edb1ef00c403723d8b4e7))
|
|
14
|
+
|
|
6
15
|
# [9.47.0](https://github.com/dnbexperience/eufemia/compare/v9.46.2...v9.47.0) (2023-02-05)
|
|
7
16
|
|
|
8
17
|
|
|
@@ -33,6 +33,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
33
33
|
});
|
|
34
34
|
exports.default = void 0;
|
|
35
35
|
|
|
36
|
+
require("core-js/modules/es.regexp.exec.js");
|
|
37
|
+
|
|
36
38
|
var _react = _interopRequireDefault(require("react"));
|
|
37
39
|
|
|
38
40
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
@@ -64,6 +66,16 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
64
66
|
var InputMasked = _react.default.forwardRef(function (props, ref) {
|
|
65
67
|
var context = _react.default.useContext(_Context.default);
|
|
66
68
|
|
|
69
|
+
if (props !== null && props !== void 0 && props.mask) {
|
|
70
|
+
var alias = context === null || context === void 0 ? void 0 : context.InputMasked;
|
|
71
|
+
|
|
72
|
+
for (var key in alias) {
|
|
73
|
+
if (/^as[_A-Z]|number_mask|currency_mask/.test(key)) {
|
|
74
|
+
delete alias[key];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
67
79
|
var contextAndProps = _react.default.useCallback((0, _componentHelper.extendPropsWithContext)(props, InputMasked.defaultProps, context === null || context === void 0 ? void 0 : context.InputMasked), [props, InputMasked.defaultProps, context === null || context === void 0 ? void 0 : context.InputMasked]);
|
|
68
80
|
|
|
69
81
|
return _react.default.createElement(_InputMaskedContext.default.Provider, {
|
|
@@ -107,7 +119,7 @@ process.env.NODE_ENV !== "production" ? InputMasked.propTypes = _objectSpread({
|
|
|
107
119
|
on_submit_blur: _propTypes.default.func
|
|
108
120
|
}, _Input.inputPropTypes) : void 0;
|
|
109
121
|
InputMasked.defaultProps = _objectSpread(_objectSpread({}, _Input.default.defaultProps), {}, {
|
|
110
|
-
mask:
|
|
122
|
+
mask: null,
|
|
111
123
|
number_mask: null,
|
|
112
124
|
currency_mask: null,
|
|
113
125
|
mask_options: null,
|
|
@@ -286,7 +286,7 @@ var useInputElement = function useInputElement() {
|
|
|
286
286
|
inputRef: ref,
|
|
287
287
|
inputElement: inputElementRef.current,
|
|
288
288
|
pipe: pipe,
|
|
289
|
-
mask: mask,
|
|
289
|
+
mask: mask || [],
|
|
290
290
|
showMask: showMask,
|
|
291
291
|
guide: showGuide,
|
|
292
292
|
keepCharPositions: keepCharPositions,
|
|
@@ -163,8 +163,8 @@ var correctNumberValue = function correctNumberValue(_ref5) {
|
|
|
163
163
|
value = value.replace('.', decimalSymbol);
|
|
164
164
|
|
|
165
165
|
if (localValue !== null) {
|
|
166
|
-
var localNumberValue = localValue.replace(/[^\d
|
|
167
|
-
var numberValue = value.replace(/[^\d
|
|
166
|
+
var localNumberValue = localValue.replace(/[^\d,.-]/g, '');
|
|
167
|
+
var numberValue = value.replace(/[^\d,.-]/g, '');
|
|
168
168
|
var endsWithDecimal = localNumberValue.endsWith(decimalSymbol);
|
|
169
169
|
var endsWithZeroAndDecimal = localNumberValue.endsWith("".concat(decimalSymbol, "0"));
|
|
170
170
|
|
|
@@ -178,7 +178,7 @@ var correctNumberValue = function correctNumberValue(_ref5) {
|
|
|
178
178
|
value = localValue;
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
-
if (
|
|
181
|
+
if (/^(-|-0)$/.test(localValue.replace(/[^\d-0]/g, ''))) {
|
|
182
182
|
value = localValue;
|
|
183
183
|
} else if (localNumberValue === '' && numberValue === '0') {
|
|
184
184
|
value = '';
|
|
@@ -159,7 +159,6 @@ var Upload = function Upload(localProps) {
|
|
|
159
159
|
}, _react.default.createElement(_Provider.default, {
|
|
160
160
|
skeleton: skeleton
|
|
161
161
|
}, _react.default.createElement(_UploadDropzone.default, _extends({
|
|
162
|
-
"data-testid": "upload",
|
|
163
162
|
className: (0, _classnames.default)('dnb-upload', spacingClasses, className)
|
|
164
163
|
}, props), _UploadInfo || (_UploadInfo = _react.default.createElement(_UploadInfo2.default, null)), _UploadFileInput || (_UploadFileInput = _react.default.createElement(_UploadFileInput2.default, null)), _UploadFileList || (_UploadFileList = _react.default.createElement(_UploadFileList2.default, null)))));
|
|
165
164
|
|
|
@@ -23,8 +23,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
23
23
|
});
|
|
24
24
|
exports.default = void 0;
|
|
25
25
|
|
|
26
|
-
require("core-js/modules/es.array.join.js");
|
|
27
|
-
|
|
28
26
|
require("core-js/modules/es.array.map.js");
|
|
29
27
|
|
|
30
28
|
require("core-js/modules/es.array.from.js");
|
|
@@ -71,15 +69,10 @@ var UploadFileInput = function UploadFileInput() {
|
|
|
71
69
|
};
|
|
72
70
|
|
|
73
71
|
var sharedId = id || (0, _componentHelper.makeUniqueId)();
|
|
74
|
-
var accept = (0, _UploadVerify.
|
|
75
|
-
|
|
76
|
-
}).join(',');
|
|
77
|
-
return _react.default.createElement("div", {
|
|
78
|
-
"data-testid": "upload-file-input"
|
|
79
|
-
}, _react.default.createElement(_Button.default, {
|
|
72
|
+
var accept = (0, _UploadVerify.getAcceptedFileTypes)(acceptedFileTypes);
|
|
73
|
+
return _react.default.createElement("div", null, _react.default.createElement(_Button.default, {
|
|
80
74
|
top: "medium",
|
|
81
75
|
id: "".concat(sharedId, "-input"),
|
|
82
|
-
"data-testid": "upload-file-input-button",
|
|
83
76
|
className: "dnb-upload__file-input-button",
|
|
84
77
|
icon: _icons.folder,
|
|
85
78
|
icon_position: "left",
|
|
@@ -88,7 +81,6 @@ var UploadFileInput = function UploadFileInput() {
|
|
|
88
81
|
onClick: openFileDialog
|
|
89
82
|
}, buttonText), _UploadStatus || (_UploadStatus = _react.default.createElement(_UploadStatus2.default, null)), _react.default.createElement("input", {
|
|
90
83
|
"aria-labelledby": "".concat(sharedId, "-input"),
|
|
91
|
-
"data-testid": "upload-file-input-input",
|
|
92
84
|
ref: fileInput,
|
|
93
85
|
accept: accept,
|
|
94
86
|
className: "dnb-upload__file-input",
|
|
@@ -21,12 +21,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
21
21
|
});
|
|
22
22
|
exports.default = void 0;
|
|
23
23
|
|
|
24
|
-
require("core-js/modules/es.function.name.js");
|
|
25
|
-
|
|
26
|
-
require("core-js/modules/es.regexp.exec.js");
|
|
27
|
-
|
|
28
|
-
require("core-js/modules/es.string.split.js");
|
|
29
|
-
|
|
30
24
|
require("core-js/modules/es.array.iterator.js");
|
|
31
25
|
|
|
32
26
|
require("core-js/modules/es.object.to-string.js");
|
|
@@ -39,6 +33,12 @@ require("core-js/modules/web.url.js");
|
|
|
39
33
|
|
|
40
34
|
require("core-js/modules/web.url-search-params.js");
|
|
41
35
|
|
|
36
|
+
require("core-js/modules/es.regexp.exec.js");
|
|
37
|
+
|
|
38
|
+
require("core-js/modules/es.string.split.js");
|
|
39
|
+
|
|
40
|
+
require("core-js/modules/es.function.name.js");
|
|
41
|
+
|
|
42
42
|
var _react = _interopRequireWildcard(require("react"));
|
|
43
43
|
|
|
44
44
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
@@ -51,7 +51,7 @@ var _FormStatus2 = _interopRequireDefault(require("../../components/FormStatus")
|
|
|
51
51
|
|
|
52
52
|
var _progressIndicator = _interopRequireDefault(require("../../components/progress-indicator"));
|
|
53
53
|
|
|
54
|
-
var
|
|
54
|
+
var _P2 = _interopRequireDefault(require("../../elements/P"));
|
|
55
55
|
|
|
56
56
|
var _icons = require("../../icons");
|
|
57
57
|
|
|
@@ -59,6 +59,8 @@ var _componentHelper = require("../../shared/component-helper");
|
|
|
59
59
|
|
|
60
60
|
var _useUpload2 = _interopRequireDefault(require("./useUpload"));
|
|
61
61
|
|
|
62
|
+
var _UploadVerify = require("./UploadVerify");
|
|
63
|
+
|
|
62
64
|
var _ProgressIndicator, _Icon;
|
|
63
65
|
|
|
64
66
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -90,7 +92,7 @@ var images = {
|
|
|
90
92
|
};
|
|
91
93
|
|
|
92
94
|
var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
93
|
-
var _div,
|
|
95
|
+
var _div, _P, _FormStatus;
|
|
94
96
|
|
|
95
97
|
var id = _ref.id,
|
|
96
98
|
uploadFile = _ref.uploadFile,
|
|
@@ -100,10 +102,9 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
100
102
|
var file = uploadFile.file,
|
|
101
103
|
errorMessage = uploadFile.errorMessage,
|
|
102
104
|
isLoading = uploadFile.isLoading;
|
|
103
|
-
var name = file.name,
|
|
104
|
-
type = file.type;
|
|
105
|
-
var fileType = type.split('/')[1] || '';
|
|
106
105
|
var hasWarning = errorMessage != null;
|
|
106
|
+
var fileType = (0, _UploadVerify.getFileTypeFromExtension)(file);
|
|
107
|
+
var humanFileType = fileType.toUpperCase();
|
|
107
108
|
var imageUrl = URL.createObjectURL(file);
|
|
108
109
|
var cellRef = (0, _react.useRef)();
|
|
109
110
|
var exists = useExistsHighlight(id, file);
|
|
@@ -124,7 +125,6 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
124
125
|
};
|
|
125
126
|
|
|
126
127
|
return _react.default.createElement("li", {
|
|
127
|
-
"data-testid": "upload-file-list-cell",
|
|
128
128
|
className: (0, _classnames.default)('dnb-upload__file-cell', hasWarning && 'dnb-upload__file-cell--warning', exists && 'dnb-upload__file-cell--highlight'),
|
|
129
129
|
ref: cellRef
|
|
130
130
|
}, _react.default.createElement("div", {
|
|
@@ -132,7 +132,6 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
132
132
|
}, _react.default.createElement("div", {
|
|
133
133
|
className: "dnb-upload__file-cell__content__left"
|
|
134
134
|
}, getIcon(), getTitle()), _react.default.createElement("div", null, _react.default.createElement(_Button.default, {
|
|
135
|
-
"data-testid": "upload-delete-button",
|
|
136
135
|
icon: _icons.trash,
|
|
137
136
|
variant: "tertiary",
|
|
138
137
|
onClick: onDeleteHandler,
|
|
@@ -141,9 +140,7 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
141
140
|
|
|
142
141
|
function getIcon() {
|
|
143
142
|
if (isLoading) {
|
|
144
|
-
return _ProgressIndicator || (_ProgressIndicator = _react.default.createElement(_progressIndicator.default,
|
|
145
|
-
"data-testid": "upload-progress-indicator"
|
|
146
|
-
}));
|
|
143
|
+
return _ProgressIndicator || (_ProgressIndicator = _react.default.createElement(_progressIndicator.default, null));
|
|
147
144
|
}
|
|
148
145
|
|
|
149
146
|
if (hasWarning) return _Icon || (_Icon = _react.default.createElement(_Icon2.default, {
|
|
@@ -151,7 +148,12 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
151
148
|
}));
|
|
152
149
|
var iconFileType = fileType;
|
|
153
150
|
|
|
154
|
-
if (!
|
|
151
|
+
if (!iconFileType) {
|
|
152
|
+
var mimeParts = file.type.split('/');
|
|
153
|
+
iconFileType = images[mimeParts[0]] || images[mimeParts[1]];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (!Object.prototype.hasOwnProperty.call(images, iconFileType)) {
|
|
155
157
|
iconFileType = 'file';
|
|
156
158
|
}
|
|
157
159
|
|
|
@@ -165,23 +167,20 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
165
167
|
className: "dnb-upload__file-cell__text-container dnb-upload__file-cell__text-container--loading"
|
|
166
168
|
}, loadingText)) : _react.default.createElement("div", {
|
|
167
169
|
className: "dnb-upload__file-cell__text-container"
|
|
168
|
-
},
|
|
169
|
-
"data-testid": "upload-file-anchor",
|
|
170
|
+
}, _react.default.createElement("a", {
|
|
170
171
|
target: "_blank",
|
|
171
172
|
href: imageUrl,
|
|
172
173
|
className: "dnb-anchor dnb-upload__file-cell__title",
|
|
173
174
|
rel: "noopener noreferrer"
|
|
174
|
-
}, name)
|
|
175
|
-
"data-testid": "upload-subtitle",
|
|
175
|
+
}, file.name), _P || (_P = _react.default.createElement(_P2.default, {
|
|
176
176
|
className: "dnb-upload__file-cell__subtitle",
|
|
177
177
|
size: "x-small",
|
|
178
178
|
top: "xx-small"
|
|
179
|
-
},
|
|
179
|
+
}, humanFileType)));
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
function getWarning() {
|
|
183
183
|
return hasWarning ? _FormStatus || (_FormStatus = _react.default.createElement(_FormStatus2.default, {
|
|
184
|
-
"data-testid": "upload-warning",
|
|
185
184
|
top: "small",
|
|
186
185
|
text: errorMessage,
|
|
187
186
|
stretch: true
|
|
@@ -47,10 +47,8 @@ var UploadInfo = function UploadInfo() {
|
|
|
47
47
|
fileMaxSize = context.fileMaxSize;
|
|
48
48
|
var prettyfiedAcceptedFileFormats = acceptedFileTypes.join(', ').toUpperCase();
|
|
49
49
|
return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_Lead.default, {
|
|
50
|
-
"data-testid": "upload-title",
|
|
51
50
|
space: "0"
|
|
52
51
|
}, title), _react.default.createElement(_P.default, {
|
|
53
|
-
"data-testid": "upload-text",
|
|
54
52
|
top: "xx-small",
|
|
55
53
|
className: "dnb-upload__text"
|
|
56
54
|
}, text), _react.default.createElement(_Dl.default, {
|
|
@@ -58,13 +56,7 @@ var UploadInfo = function UploadInfo() {
|
|
|
58
56
|
bottom: 0,
|
|
59
57
|
direction: "horizontal",
|
|
60
58
|
className: "dnb-upload__condition-list"
|
|
61
|
-
}, _react.default.createElement(_Dl.default.Item, null, _react.default.createElement(_Dt.default,
|
|
62
|
-
"data-testid": "upload-accepted-formats"
|
|
63
|
-
}, fileTypeDescription), _react.default.createElement(_Dd.default, null, prettyfiedAcceptedFileFormats)), _react.default.createElement(_Dl.default.Item, null, _react.default.createElement(_Dt.default, {
|
|
64
|
-
"data-testid": "upload-file-size"
|
|
65
|
-
}, fileSizeDescription), _react.default.createElement(_Dd.default, null, String(fileSizeContent).replace('%size', (0, _NumberUtils.format)(fileMaxSize).toString()))), filesAmountLimit < _UploadContext.defaultProps.filesAmountLimit && _react.default.createElement(_Dl.default.Item, null, _react.default.createElement(_Dt.default, {
|
|
66
|
-
"data-testid": "upload-file-amount-limit"
|
|
67
|
-
}, fileAmountDescription), _react.default.createElement(_Dd.default, null, filesAmountLimit))));
|
|
59
|
+
}, prettyfiedAcceptedFileFormats && _react.default.createElement(_Dl.default.Item, null, _react.default.createElement(_Dt.default, null, fileTypeDescription), _react.default.createElement(_Dd.default, null, prettyfiedAcceptedFileFormats)), _react.default.createElement(_Dl.default.Item, null, _react.default.createElement(_Dt.default, null, fileSizeDescription), _react.default.createElement(_Dd.default, null, String(fileSizeContent).replace('%size', (0, _NumberUtils.format)(fileMaxSize).toString()))), filesAmountLimit < _UploadContext.defaultProps.filesAmountLimit && _react.default.createElement(_Dl.default.Item, null, _react.default.createElement(_Dt.default, null, fileAmountDescription), _react.default.createElement(_Dd.default, null, filesAmountLimit))));
|
|
68
60
|
};
|
|
69
61
|
|
|
70
62
|
var _default = UploadInfo;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { UploadFile, UploadContextProps, UploadAcceptedFileTypes } from './types';
|
|
2
2
|
export declare function verifyFiles(files: UploadFile[], context: Pick<UploadContextProps, 'errorUnsupportedFile' | 'errorLargeFile' | 'acceptedFileTypes' | 'fileMaxSize'>): UploadFile[];
|
|
3
|
+
export declare function getFileTypeFromExtension(file: File): string;
|
|
4
|
+
export declare function getAcceptedFileTypes(acceptedFileTypes: UploadAcceptedFileTypes): string;
|
|
5
|
+
export declare function hasPreferredMimeType(acceptedFileTypes: UploadAcceptedFileTypes, file: File): boolean;
|
|
3
6
|
export declare function extendWithAbbreviation(acceptedFileTypes: UploadAcceptedFileTypes, abbreviations?: {
|
|
4
7
|
jpg: string;
|
|
5
8
|
}): string[];
|
|
@@ -16,12 +16,13 @@ require("core-js/modules/es.array.from.js");
|
|
|
16
16
|
|
|
17
17
|
require("core-js/modules/es.array.slice.js");
|
|
18
18
|
|
|
19
|
-
require("core-js/modules/es.function.name.js");
|
|
20
|
-
|
|
21
19
|
Object.defineProperty(exports, "__esModule", {
|
|
22
20
|
value: true
|
|
23
21
|
});
|
|
24
22
|
exports.extendWithAbbreviation = extendWithAbbreviation;
|
|
23
|
+
exports.getAcceptedFileTypes = getAcceptedFileTypes;
|
|
24
|
+
exports.getFileTypeFromExtension = getFileTypeFromExtension;
|
|
25
|
+
exports.hasPreferredMimeType = hasPreferredMimeType;
|
|
25
26
|
exports.verifyFiles = verifyFiles;
|
|
26
27
|
|
|
27
28
|
require("core-js/modules/es.regexp.exec.js");
|
|
@@ -38,6 +39,12 @@ require("core-js/modules/es.string.includes.js");
|
|
|
38
39
|
|
|
39
40
|
require("core-js/modules/es.array.map.js");
|
|
40
41
|
|
|
42
|
+
require("core-js/modules/es.function.name.js");
|
|
43
|
+
|
|
44
|
+
require("core-js/modules/es.array.join.js");
|
|
45
|
+
|
|
46
|
+
require("core-js/modules/es.string.split.js");
|
|
47
|
+
|
|
41
48
|
require("core-js/modules/web.dom-collections.for-each.js");
|
|
42
49
|
|
|
43
50
|
require("core-js/modules/es.object.entries.js");
|
|
@@ -81,8 +88,9 @@ function verifyFiles(files, context) {
|
|
|
81
88
|
return false;
|
|
82
89
|
}
|
|
83
90
|
|
|
91
|
+
var fileType = hasPreferredMimeType(acceptedFileTypes, file) ? file.type : getFileTypeFromExtension(file) || file.type;
|
|
84
92
|
var foundType = extendWithAbbreviation(acceptedFileTypes).some(function (type) {
|
|
85
|
-
return
|
|
93
|
+
return fileType.includes(type);
|
|
86
94
|
});
|
|
87
95
|
return !foundType ? errorUnsupportedFile : null;
|
|
88
96
|
};
|
|
@@ -100,6 +108,22 @@ function verifyFiles(files, context) {
|
|
|
100
108
|
return cleanedFiles;
|
|
101
109
|
}
|
|
102
110
|
|
|
111
|
+
function getFileTypeFromExtension(file) {
|
|
112
|
+
return file.name.includes('.') && file.name.replace(/.*\.([^.]+)$/, '$1') || null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function getAcceptedFileTypes(acceptedFileTypes) {
|
|
116
|
+
return extendWithAbbreviation(acceptedFileTypes).map(function (type) {
|
|
117
|
+
return type.includes('/') ? type : ".".concat(type);
|
|
118
|
+
}).join(',');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function hasPreferredMimeType(acceptedFileTypes, file) {
|
|
122
|
+
return file.type.split('/')[1] && (!(acceptedFileTypes !== null && acceptedFileTypes !== void 0 && acceptedFileTypes.length) || (acceptedFileTypes === null || acceptedFileTypes === void 0 ? void 0 : acceptedFileTypes.some(function (type) {
|
|
123
|
+
return type.toLowerCase() === file.type.toLowerCase();
|
|
124
|
+
})));
|
|
125
|
+
}
|
|
126
|
+
|
|
103
127
|
function extendWithAbbreviation(acceptedFileTypes) {
|
|
104
128
|
var abbreviations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
|
105
129
|
jpg: 'jpeg'
|
package/cjs/shared/Eufemia.js
CHANGED
|
@@ -13,6 +13,7 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
|
|
|
13
13
|
|
|
14
14
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
15
15
|
|
|
16
|
+
import "core-js/modules/es.regexp.exec.js";
|
|
16
17
|
import React from 'react';
|
|
17
18
|
import PropTypes from 'prop-types';
|
|
18
19
|
import { registerElement, extendPropsWithContext } from '../../shared/component-helper';
|
|
@@ -22,6 +23,17 @@ import Input, { inputPropTypes } from '../input/Input';
|
|
|
22
23
|
import Context from '../../shared/Context';
|
|
23
24
|
var InputMasked = React.forwardRef(function (props, ref) {
|
|
24
25
|
var context = React.useContext(Context);
|
|
26
|
+
|
|
27
|
+
if (props !== null && props !== void 0 && props.mask) {
|
|
28
|
+
var alias = context === null || context === void 0 ? void 0 : context.InputMasked;
|
|
29
|
+
|
|
30
|
+
for (var key in alias) {
|
|
31
|
+
if (/^as[_A-Z]|number_mask|currency_mask/.test(key)) {
|
|
32
|
+
delete alias[key];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
25
37
|
var contextAndProps = React.useCallback(extendPropsWithContext(props, InputMasked.defaultProps, context === null || context === void 0 ? void 0 : context.InputMasked), [props, InputMasked.defaultProps, context === null || context === void 0 ? void 0 : context.InputMasked]);
|
|
26
38
|
return React.createElement(InputMaskedContext.Provider, {
|
|
27
39
|
value: {
|
|
@@ -62,7 +74,7 @@ process.env.NODE_ENV !== "production" ? InputMasked.propTypes = _objectSpread({
|
|
|
62
74
|
on_submit_blur: PropTypes.func
|
|
63
75
|
}, inputPropTypes) : void 0;
|
|
64
76
|
InputMasked.defaultProps = _objectSpread(_objectSpread({}, Input.defaultProps), {}, {
|
|
65
|
-
mask:
|
|
77
|
+
mask: null,
|
|
66
78
|
number_mask: null,
|
|
67
79
|
currency_mask: null,
|
|
68
80
|
mask_options: null,
|
|
@@ -198,7 +198,7 @@ export var useInputElement = function useInputElement() {
|
|
|
198
198
|
inputRef: ref,
|
|
199
199
|
inputElement: inputElementRef.current,
|
|
200
200
|
pipe: pipe,
|
|
201
|
-
mask: mask,
|
|
201
|
+
mask: mask || [],
|
|
202
202
|
showMask: showMask,
|
|
203
203
|
guide: showGuide,
|
|
204
204
|
keepCharPositions: keepCharPositions,
|
|
@@ -94,8 +94,8 @@ export var correctNumberValue = function correctNumberValue(_ref5) {
|
|
|
94
94
|
value = value.replace('.', decimalSymbol);
|
|
95
95
|
|
|
96
96
|
if (localValue !== null) {
|
|
97
|
-
var localNumberValue = localValue.replace(/[^\d
|
|
98
|
-
var numberValue = value.replace(/[^\d
|
|
97
|
+
var localNumberValue = localValue.replace(/[^\d,.-]/g, '');
|
|
98
|
+
var numberValue = value.replace(/[^\d,.-]/g, '');
|
|
99
99
|
var endsWithDecimal = localNumberValue.endsWith(decimalSymbol);
|
|
100
100
|
var endsWithZeroAndDecimal = localNumberValue.endsWith("".concat(decimalSymbol, "0"));
|
|
101
101
|
|
|
@@ -109,7 +109,7 @@ export var correctNumberValue = function correctNumberValue(_ref5) {
|
|
|
109
109
|
value = localValue;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
if (
|
|
112
|
+
if (/^(-|-0)$/.test(localValue.replace(/[^\d-0]/g, ''))) {
|
|
113
113
|
value = localValue;
|
|
114
114
|
} else if (localNumberValue === '' && numberValue === '0') {
|
|
115
115
|
value = '';
|
|
@@ -85,7 +85,6 @@ var Upload = function Upload(localProps) {
|
|
|
85
85
|
}, React.createElement(Provider, {
|
|
86
86
|
skeleton: skeleton
|
|
87
87
|
}, React.createElement(UploadDropzone, _extends({
|
|
88
|
-
"data-testid": "upload",
|
|
89
88
|
className: classnames('dnb-upload', spacingClasses, className)
|
|
90
89
|
}, props), _UploadInfo || (_UploadInfo = React.createElement(UploadInfo, null)), _UploadFileInput || (_UploadFileInput = React.createElement(UploadFileInput, null)), _UploadFileList || (_UploadFileList = React.createElement(UploadFileList, null)))));
|
|
91
90
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
var _UploadStatus;
|
|
2
2
|
|
|
3
|
-
import "core-js/modules/es.array.join.js";
|
|
4
3
|
import "core-js/modules/es.array.map.js";
|
|
5
4
|
import "core-js/modules/es.array.from.js";
|
|
6
5
|
import "core-js/modules/es.string.iterator.js";
|
|
@@ -10,7 +9,7 @@ import { folder as FolderIcon } from '../../icons';
|
|
|
10
9
|
import { makeUniqueId } from '../../shared/component-helper';
|
|
11
10
|
import { UploadContext } from './UploadContext';
|
|
12
11
|
import UploadStatus from './UploadStatus';
|
|
13
|
-
import {
|
|
12
|
+
import { getAcceptedFileTypes } from './UploadVerify';
|
|
14
13
|
|
|
15
14
|
var UploadFileInput = function UploadFileInput() {
|
|
16
15
|
var fileInput = useRef(null);
|
|
@@ -28,15 +27,10 @@ var UploadFileInput = function UploadFileInput() {
|
|
|
28
27
|
};
|
|
29
28
|
|
|
30
29
|
var sharedId = id || makeUniqueId();
|
|
31
|
-
var accept =
|
|
32
|
-
|
|
33
|
-
}).join(',');
|
|
34
|
-
return React.createElement("div", {
|
|
35
|
-
"data-testid": "upload-file-input"
|
|
36
|
-
}, React.createElement(Button, {
|
|
30
|
+
var accept = getAcceptedFileTypes(acceptedFileTypes);
|
|
31
|
+
return React.createElement("div", null, React.createElement(Button, {
|
|
37
32
|
top: "medium",
|
|
38
33
|
id: "".concat(sharedId, "-input"),
|
|
39
|
-
"data-testid": "upload-file-input-button",
|
|
40
34
|
className: "dnb-upload__file-input-button",
|
|
41
35
|
icon: FolderIcon,
|
|
42
36
|
icon_position: "left",
|
|
@@ -45,7 +39,6 @@ var UploadFileInput = function UploadFileInput() {
|
|
|
45
39
|
onClick: openFileDialog
|
|
46
40
|
}, buttonText), _UploadStatus || (_UploadStatus = React.createElement(UploadStatus, null)), React.createElement("input", {
|
|
47
41
|
"aria-labelledby": "".concat(sharedId, "-input"),
|
|
48
|
-
"data-testid": "upload-file-input-input",
|
|
49
42
|
ref: fileInput,
|
|
50
43
|
accept: accept,
|
|
51
44
|
className: "dnb-upload__file-input",
|
|
@@ -2,15 +2,15 @@ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
|
2
2
|
|
|
3
3
|
var _ProgressIndicator, _Icon;
|
|
4
4
|
|
|
5
|
-
import "core-js/modules/es.function.name.js";
|
|
6
|
-
import "core-js/modules/es.regexp.exec.js";
|
|
7
|
-
import "core-js/modules/es.string.split.js";
|
|
8
5
|
import "core-js/modules/es.array.iterator.js";
|
|
9
6
|
import "core-js/modules/es.object.to-string.js";
|
|
10
7
|
import "core-js/modules/es.string.iterator.js";
|
|
11
8
|
import "core-js/modules/web.dom-collections.iterator.js";
|
|
12
9
|
import "core-js/modules/web.url.js";
|
|
13
10
|
import "core-js/modules/web.url-search-params.js";
|
|
11
|
+
import "core-js/modules/es.regexp.exec.js";
|
|
12
|
+
import "core-js/modules/es.string.split.js";
|
|
13
|
+
import "core-js/modules/es.function.name.js";
|
|
14
14
|
import React, { useRef } from 'react';
|
|
15
15
|
import classnames from 'classnames';
|
|
16
16
|
import Button from '../button/Button';
|
|
@@ -21,6 +21,7 @@ import P from '../../elements/P';
|
|
|
21
21
|
import { trash as TrashIcon, exclamation_medium as ExclamationIcon, file_pdf_medium as pdf, file_xls_medium as xls, file_ppt_medium as ppt, file_csv_medium as csv, file_txt_medium as txt, file_xml_medium as xml, file_medium as file } from '../../icons';
|
|
22
22
|
import { getPreviousSibling, warn } from '../../shared/component-helper';
|
|
23
23
|
import useUpload from './useUpload';
|
|
24
|
+
import { getFileTypeFromExtension } from './UploadVerify';
|
|
24
25
|
var images = {
|
|
25
26
|
pdf: pdf,
|
|
26
27
|
xls: xls,
|
|
@@ -32,7 +33,7 @@ var images = {
|
|
|
32
33
|
};
|
|
33
34
|
|
|
34
35
|
var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
35
|
-
var _div,
|
|
36
|
+
var _div, _P, _FormStatus;
|
|
36
37
|
|
|
37
38
|
var id = _ref.id,
|
|
38
39
|
uploadFile = _ref.uploadFile,
|
|
@@ -42,10 +43,9 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
42
43
|
var file = uploadFile.file,
|
|
43
44
|
errorMessage = uploadFile.errorMessage,
|
|
44
45
|
isLoading = uploadFile.isLoading;
|
|
45
|
-
var name = file.name,
|
|
46
|
-
type = file.type;
|
|
47
|
-
var fileType = type.split('/')[1] || '';
|
|
48
46
|
var hasWarning = errorMessage != null;
|
|
47
|
+
var fileType = getFileTypeFromExtension(file);
|
|
48
|
+
var humanFileType = fileType.toUpperCase();
|
|
49
49
|
var imageUrl = URL.createObjectURL(file);
|
|
50
50
|
var cellRef = useRef();
|
|
51
51
|
var exists = useExistsHighlight(id, file);
|
|
@@ -66,7 +66,6 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
return React.createElement("li", {
|
|
69
|
-
"data-testid": "upload-file-list-cell",
|
|
70
69
|
className: classnames('dnb-upload__file-cell', hasWarning && 'dnb-upload__file-cell--warning', exists && 'dnb-upload__file-cell--highlight'),
|
|
71
70
|
ref: cellRef
|
|
72
71
|
}, React.createElement("div", {
|
|
@@ -74,7 +73,6 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
74
73
|
}, React.createElement("div", {
|
|
75
74
|
className: "dnb-upload__file-cell__content__left"
|
|
76
75
|
}, getIcon(), getTitle()), React.createElement("div", null, React.createElement(Button, {
|
|
77
|
-
"data-testid": "upload-delete-button",
|
|
78
76
|
icon: TrashIcon,
|
|
79
77
|
variant: "tertiary",
|
|
80
78
|
onClick: onDeleteHandler,
|
|
@@ -83,9 +81,7 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
83
81
|
|
|
84
82
|
function getIcon() {
|
|
85
83
|
if (isLoading) {
|
|
86
|
-
return _ProgressIndicator || (_ProgressIndicator = React.createElement(ProgressIndicator,
|
|
87
|
-
"data-testid": "upload-progress-indicator"
|
|
88
|
-
}));
|
|
84
|
+
return _ProgressIndicator || (_ProgressIndicator = React.createElement(ProgressIndicator, null));
|
|
89
85
|
}
|
|
90
86
|
|
|
91
87
|
if (hasWarning) return _Icon || (_Icon = React.createElement(Icon, {
|
|
@@ -93,7 +89,12 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
93
89
|
}));
|
|
94
90
|
var iconFileType = fileType;
|
|
95
91
|
|
|
96
|
-
if (!
|
|
92
|
+
if (!iconFileType) {
|
|
93
|
+
var mimeParts = file.type.split('/');
|
|
94
|
+
iconFileType = images[mimeParts[0]] || images[mimeParts[1]];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (!Object.prototype.hasOwnProperty.call(images, iconFileType)) {
|
|
97
98
|
iconFileType = 'file';
|
|
98
99
|
}
|
|
99
100
|
|
|
@@ -107,23 +108,20 @@ var UploadFileListCell = function UploadFileListCell(_ref) {
|
|
|
107
108
|
className: "dnb-upload__file-cell__text-container dnb-upload__file-cell__text-container--loading"
|
|
108
109
|
}, loadingText)) : React.createElement("div", {
|
|
109
110
|
className: "dnb-upload__file-cell__text-container"
|
|
110
|
-
},
|
|
111
|
-
"data-testid": "upload-file-anchor",
|
|
111
|
+
}, React.createElement("a", {
|
|
112
112
|
target: "_blank",
|
|
113
113
|
href: imageUrl,
|
|
114
114
|
className: "dnb-anchor dnb-upload__file-cell__title",
|
|
115
115
|
rel: "noopener noreferrer"
|
|
116
|
-
}, name)
|
|
117
|
-
"data-testid": "upload-subtitle",
|
|
116
|
+
}, file.name), _P || (_P = React.createElement(P, {
|
|
118
117
|
className: "dnb-upload__file-cell__subtitle",
|
|
119
118
|
size: "x-small",
|
|
120
119
|
top: "xx-small"
|
|
121
|
-
},
|
|
120
|
+
}, humanFileType)));
|
|
122
121
|
}
|
|
123
122
|
|
|
124
123
|
function getWarning() {
|
|
125
124
|
return hasWarning ? _FormStatus || (_FormStatus = React.createElement(FormStatus, {
|
|
126
|
-
"data-testid": "upload-warning",
|
|
127
125
|
top: "small",
|
|
128
126
|
text: errorMessage,
|
|
129
127
|
stretch: true
|
|
@@ -25,10 +25,8 @@ var UploadInfo = function UploadInfo() {
|
|
|
25
25
|
fileMaxSize = context.fileMaxSize;
|
|
26
26
|
var prettyfiedAcceptedFileFormats = acceptedFileTypes.join(', ').toUpperCase();
|
|
27
27
|
return React.createElement(React.Fragment, null, React.createElement(Lead, {
|
|
28
|
-
"data-testid": "upload-title",
|
|
29
28
|
space: "0"
|
|
30
29
|
}, title), React.createElement(P, {
|
|
31
|
-
"data-testid": "upload-text",
|
|
32
30
|
top: "xx-small",
|
|
33
31
|
className: "dnb-upload__text"
|
|
34
32
|
}, text), React.createElement(Dl, {
|
|
@@ -36,13 +34,7 @@ var UploadInfo = function UploadInfo() {
|
|
|
36
34
|
bottom: 0,
|
|
37
35
|
direction: "horizontal",
|
|
38
36
|
className: "dnb-upload__condition-list"
|
|
39
|
-
}, React.createElement(Dl.Item, null, React.createElement(Dt,
|
|
40
|
-
"data-testid": "upload-accepted-formats"
|
|
41
|
-
}, fileTypeDescription), React.createElement(Dd, null, prettyfiedAcceptedFileFormats)), React.createElement(Dl.Item, null, React.createElement(Dt, {
|
|
42
|
-
"data-testid": "upload-file-size"
|
|
43
|
-
}, fileSizeDescription), React.createElement(Dd, null, String(fileSizeContent).replace('%size', format(fileMaxSize).toString()))), filesAmountLimit < defaultProps.filesAmountLimit && React.createElement(Dl.Item, null, React.createElement(Dt, {
|
|
44
|
-
"data-testid": "upload-file-amount-limit"
|
|
45
|
-
}, fileAmountDescription), React.createElement(Dd, null, filesAmountLimit))));
|
|
37
|
+
}, prettyfiedAcceptedFileFormats && React.createElement(Dl.Item, null, React.createElement(Dt, null, fileTypeDescription), React.createElement(Dd, null, prettyfiedAcceptedFileFormats)), React.createElement(Dl.Item, null, React.createElement(Dt, null, fileSizeDescription), React.createElement(Dd, null, String(fileSizeContent).replace('%size', format(fileMaxSize).toString()))), filesAmountLimit < defaultProps.filesAmountLimit && React.createElement(Dl.Item, null, React.createElement(Dt, null, fileAmountDescription), React.createElement(Dd, null, filesAmountLimit))));
|
|
46
38
|
};
|
|
47
39
|
|
|
48
40
|
export default UploadInfo;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { UploadFile, UploadContextProps, UploadAcceptedFileTypes } from './types';
|
|
2
2
|
export declare function verifyFiles(files: UploadFile[], context: Pick<UploadContextProps, 'errorUnsupportedFile' | 'errorLargeFile' | 'acceptedFileTypes' | 'fileMaxSize'>): UploadFile[];
|
|
3
|
+
export declare function getFileTypeFromExtension(file: File): string;
|
|
4
|
+
export declare function getAcceptedFileTypes(acceptedFileTypes: UploadAcceptedFileTypes): string;
|
|
5
|
+
export declare function hasPreferredMimeType(acceptedFileTypes: UploadAcceptedFileTypes, file: File): boolean;
|
|
3
6
|
export declare function extendWithAbbreviation(acceptedFileTypes: UploadAcceptedFileTypes, abbreviations?: {
|
|
4
7
|
jpg: string;
|
|
5
8
|
}): string[];
|