@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.
Files changed (47) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/cjs/components/input-masked/InputMasked.js +13 -1
  3. package/cjs/components/input-masked/InputMaskedHooks.js +1 -1
  4. package/cjs/components/input-masked/InputMaskedUtils.js +3 -3
  5. package/cjs/components/upload/Upload.js +0 -1
  6. package/cjs/components/upload/UploadFileInput.js +2 -10
  7. package/cjs/components/upload/UploadFileList.js +0 -1
  8. package/cjs/components/upload/UploadFileListCell.js +22 -23
  9. package/cjs/components/upload/UploadInfo.js +1 -9
  10. package/cjs/components/upload/UploadVerify.d.ts +3 -0
  11. package/cjs/components/upload/UploadVerify.js +27 -3
  12. package/cjs/shared/Eufemia.js +1 -1
  13. package/components/input-masked/InputMasked.js +13 -1
  14. package/components/input-masked/InputMaskedHooks.js +1 -1
  15. package/components/input-masked/InputMaskedUtils.js +3 -3
  16. package/components/upload/Upload.js +0 -1
  17. package/components/upload/UploadFileInput.js +3 -10
  18. package/components/upload/UploadFileList.js +0 -1
  19. package/components/upload/UploadFileListCell.js +17 -19
  20. package/components/upload/UploadInfo.js +1 -9
  21. package/components/upload/UploadVerify.d.ts +3 -0
  22. package/components/upload/UploadVerify.js +18 -1
  23. package/es/components/input-masked/InputMasked.js +12 -1
  24. package/es/components/input-masked/InputMaskedHooks.js +1 -1
  25. package/es/components/input-masked/InputMaskedUtils.js +3 -3
  26. package/es/components/upload/Upload.js +0 -1
  27. package/es/components/upload/UploadFileInput.js +3 -7
  28. package/es/components/upload/UploadFileList.js +0 -1
  29. package/es/components/upload/UploadFileListCell.js +14 -18
  30. package/es/components/upload/UploadInfo.js +1 -9
  31. package/es/components/upload/UploadVerify.d.ts +3 -0
  32. package/es/components/upload/UploadVerify.js +11 -1
  33. package/es/shared/Eufemia.js +1 -1
  34. package/esm/dnb-ui-basis.min.mjs +1 -1
  35. package/esm/dnb-ui-components.min.mjs +1 -1
  36. package/esm/dnb-ui-elements.min.mjs +1 -1
  37. package/esm/dnb-ui-extensions.min.mjs +1 -1
  38. package/esm/dnb-ui-lib.min.mjs +2 -2
  39. package/esm/dnb-ui-web-components.min.mjs +2 -2
  40. package/package.json +1 -1
  41. package/shared/Eufemia.js +1 -1
  42. package/umd/dnb-ui-basis.min.js +1 -1
  43. package/umd/dnb-ui-components.min.js +1 -1
  44. package/umd/dnb-ui-elements.min.js +1 -1
  45. package/umd/dnb-ui-extensions.min.js +1 -1
  46. package/umd/dnb-ui-lib.min.js +2 -2
  47. 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,.]/g, '');
167
- var numberValue = value.replace(/[^\d,.]/g, '');
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 (/^-|-0$/.test(localValue)) {
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.extendWithAbbreviation)(acceptedFileTypes).map(function (type) {
75
- return ".".concat(type);
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",
@@ -41,7 +41,6 @@ function UploadFileList() {
41
41
  }
42
42
 
43
43
  return _react.default.createElement("ul", {
44
- "data-testid": "upload-file-list",
45
44
  className: "dnb-upload__file-list",
46
45
  "aria-label": fileListAriaLabel
47
46
  }, files.map(function (uploadFile, index) {
@@ -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 _P = _interopRequireDefault(require("../../elements/P"));
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, _a, _FormStatus;
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 (!Object.prototype.hasOwnProperty.call(images, fileType)) {
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
- }, _a || (_a = _react.default.createElement("a", {
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)), _react.default.createElement(_P.default, {
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
- }, fileType.toUpperCase()));
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 file.type.includes(type);
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'
@@ -21,7 +21,7 @@ function init() {
21
21
  _createClass(Eufemia, [{
22
22
  key: "version",
23
23
  get: function get() {
24
- return '9.47.0';
24
+ return '9.47.1';
25
25
  }
26
26
  }]);
27
27
 
@@ -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,.]/g, '');
98
- var numberValue = value.replace(/[^\d,.]/g, '');
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 (/^-|-0$/.test(localValue)) {
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 { extendWithAbbreviation } from './UploadVerify';
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 = extendWithAbbreviation(acceptedFileTypes).map(function (type) {
32
- return ".".concat(type);
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",
@@ -25,7 +25,6 @@ function UploadFileList() {
25
25
  }
26
26
 
27
27
  return React.createElement("ul", {
28
- "data-testid": "upload-file-list",
29
28
  className: "dnb-upload__file-list",
30
29
  "aria-label": fileListAriaLabel
31
30
  }, files.map(function (uploadFile, index) {
@@ -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, _a, _FormStatus;
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 (!Object.prototype.hasOwnProperty.call(images, fileType)) {
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
- }, _a || (_a = React.createElement("a", {
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)), React.createElement(P, {
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
- }, fileType.toUpperCase()));
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[];