@norges-domstoler/dds-components 11.2.0 → 11.3.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.
@@ -3,8 +3,12 @@ import { FileUploaderFile } from './fileUploaderReducer';
3
3
  import { Accept, FileList } from './types';
4
4
  export type FileUploaderHookProps = {
5
5
  id: string | undefined;
6
- /**Dersom komponenten styres utenfra. En liste over filer som skal være med ved første render. */
6
+ /**Dersom komponenten skal styres internt. Utgangspunktet for filene som har blitt lastet opp. */
7
7
  initialFiles: FileList | undefined;
8
+ /**Dersom komponenten styres utenfra. Filene som har blitt lastet opp. */
9
+ value: FileList | undefined;
10
+ /**Callback for når fil-listen endres. */
11
+ onChange: (newFiles: FileList) => void;
8
12
  /**Hvilke filendelser eller mime-typer som filopplasteren skal akseptere. */
9
13
  accept: Accept[] | undefined;
10
14
  /**Om filopplasteren er avslått eller ikke */
package/dist/cjs/index.js CHANGED
@@ -11251,6 +11251,8 @@ var calcRootErrors = function calcRootErrors(files, maxFiles, errorMessage) {
11251
11251
  };
11252
11252
  var useFileUploader = function useFileUploader(props) {
11253
11253
  var initialFiles = props.initialFiles,
11254
+ value = props.value,
11255
+ onChange = props.onChange,
11254
11256
  accept = props.accept,
11255
11257
  maxFiles = props.maxFiles,
11256
11258
  disabled = props.disabled,
@@ -11258,6 +11260,7 @@ var useFileUploader = function useFileUploader(props) {
11258
11260
  var rootRef = React.useRef(null);
11259
11261
  var inputRef = React.useRef(null);
11260
11262
  var buttonRef = React.useRef(null);
11263
+ var isControlled = !!value;
11261
11264
  var initialFileUploaderFiles = React.useMemo(function () {
11262
11265
  return (initialFiles !== null && initialFiles !== void 0 ? initialFiles : []).map(function (f) {
11263
11266
  return {
@@ -11277,6 +11280,21 @@ var useFileUploader = function useFileUploader(props) {
11277
11280
  state = _useReducer2[0],
11278
11281
  dispatch = _useReducer2[1];
11279
11282
  var stateFiles = state.files;
11283
+ React.useEffect(function () {
11284
+ if (isControlled) {
11285
+ var files = value.map(function (file) {
11286
+ var accepted = isFileAccepted(file, accept);
11287
+ return {
11288
+ file: file,
11289
+ errors: accepted ? [] : [getInvalidFileTypeErrorMessage()]
11290
+ };
11291
+ });
11292
+ dispatch({
11293
+ type: 'onSetFiles',
11294
+ payload: files
11295
+ });
11296
+ }
11297
+ }, [value, isControlled, accept, dispatch]);
11280
11298
  React.useEffect(function () {
11281
11299
  dispatch({
11282
11300
  type: 'setRootErrors',
@@ -11349,7 +11367,7 @@ var useFileUploader = function useFileUploader(props) {
11349
11367
  case 0:
11350
11368
  evt.preventDefault();
11351
11369
  if (!isEventWithFiles(evt)) {
11352
- _context2.next = 8;
11370
+ _context2.next = 9;
11353
11371
  break;
11354
11372
  }
11355
11373
  existingFileNames = stateFiles.map(function (f) {
@@ -11368,17 +11386,22 @@ var useFileUploader = function useFileUploader(props) {
11368
11386
  errors: accepted ? [] : [getInvalidFileTypeErrorMessage()]
11369
11387
  };
11370
11388
  }).concat(stateFiles);
11371
- dispatch({
11372
- type: 'onSetFiles',
11373
- payload: newFiles
11374
- });
11375
- case 8:
11389
+ onChange(newFiles.map(function (f) {
11390
+ return f.file;
11391
+ }));
11392
+ if (!isControlled) {
11393
+ dispatch({
11394
+ type: 'onSetFiles',
11395
+ payload: newFiles
11396
+ });
11397
+ }
11398
+ case 9:
11376
11399
  case "end":
11377
11400
  return _context2.stop();
11378
11401
  }
11379
11402
  }, _callee2);
11380
11403
  }));
11381
- }, [stateFiles, maxFiles, accept, errorMessage, dispatch]);
11404
+ }, [stateFiles, isControlled, accept, errorMessage, maxFiles, onChange, dispatch]);
11382
11405
  var openFileDialog = React.useCallback(function () {
11383
11406
  if (inputRef.current) {
11384
11407
  inputRef.current.value = '';
@@ -11388,11 +11411,16 @@ var useFileUploader = function useFileUploader(props) {
11388
11411
  var removeFile = React.useCallback(function (file) {
11389
11412
  var newFiles = _toConsumableArray(stateFiles);
11390
11413
  newFiles.splice(stateFiles.indexOf(file), 1);
11391
- dispatch({
11392
- type: 'onRemoveFile',
11393
- payload: newFiles
11394
- });
11395
- }, [stateFiles, maxFiles, errorMessage]);
11414
+ onChange(newFiles.map(function (f) {
11415
+ return f.file;
11416
+ }));
11417
+ if (!isControlled) {
11418
+ dispatch({
11419
+ type: 'onRemoveFile',
11420
+ payload: newFiles
11421
+ });
11422
+ }
11423
+ }, [stateFiles, isControlled, maxFiles, errorMessage, onChange, dispatch]);
11396
11424
  var getRootProps = React.useCallback(function () {
11397
11425
  return {
11398
11426
  onBlur: onRootBlur,
@@ -11473,6 +11501,7 @@ var FileUploader = function FileUploader(props) {
11473
11501
  _props$required = props.required,
11474
11502
  required = _props$required === void 0 ? false : _props$required,
11475
11503
  initialFiles = props.initialFiles,
11504
+ value = props.value,
11476
11505
  accept = props.accept,
11477
11506
  maxFiles = props.maxFiles,
11478
11507
  disabled = props.disabled,
@@ -11484,6 +11513,8 @@ var FileUploader = function FileUploader(props) {
11484
11513
  var _useFileUploader = useFileUploader({
11485
11514
  id: id,
11486
11515
  initialFiles: initialFiles,
11516
+ value: value,
11517
+ onChange: onChange,
11487
11518
  accept: accept,
11488
11519
  disabled: disabled,
11489
11520
  maxFiles: maxFiles,
@@ -11497,11 +11528,6 @@ var FileUploader = function FileUploader(props) {
11497
11528
  getInputProps = _useFileUploader.getInputProps,
11498
11529
  getButtonProps = _useFileUploader.getButtonProps,
11499
11530
  _removeFile = _useFileUploader.removeFile;
11500
- React.useEffect(function () {
11501
- onChange(stateFiles.map(function (f) {
11502
- return f.file;
11503
- }));
11504
- }, [stateFiles]);
11505
11531
  var hasLabel = label !== undefined;
11506
11532
  var hasTip = tip !== undefined;
11507
11533
  var hasRootErrors = rootErrors.length > 0;
@@ -1,6 +1,6 @@
1
1
  import { toConsumableArray as _toConsumableArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
2
  import { jsx, jsxs } from 'react/jsx-runtime';
3
- import { useId, useEffect } from 'react';
3
+ import { useId } from 'react';
4
4
  import styled from 'styled-components';
5
5
  import 'tslib';
6
6
  import '../../icons/utils/StyledSvg.js';
@@ -58,6 +58,7 @@ var FileUploader = function FileUploader(props) {
58
58
  _props$required = props.required,
59
59
  required = _props$required === void 0 ? false : _props$required,
60
60
  initialFiles = props.initialFiles,
61
+ value = props.value,
61
62
  accept = props.accept,
62
63
  maxFiles = props.maxFiles,
63
64
  disabled = props.disabled,
@@ -69,6 +70,8 @@ var FileUploader = function FileUploader(props) {
69
70
  var _useFileUploader = useFileUploader({
70
71
  id: id,
71
72
  initialFiles: initialFiles,
73
+ value: value,
74
+ onChange: onChange,
72
75
  accept: accept,
73
76
  disabled: disabled,
74
77
  maxFiles: maxFiles,
@@ -82,11 +85,6 @@ var FileUploader = function FileUploader(props) {
82
85
  getInputProps = _useFileUploader.getInputProps,
83
86
  getButtonProps = _useFileUploader.getButtonProps,
84
87
  _removeFile = _useFileUploader.removeFile;
85
- useEffect(function () {
86
- onChange(stateFiles.map(function (f) {
87
- return f.file;
88
- }));
89
- }, [stateFiles]);
90
88
  var hasLabel = label !== undefined;
91
89
  var hasTip = tip !== undefined;
92
90
  var hasRootErrors = rootErrors.length > 0;
@@ -3,8 +3,12 @@ import { FileUploaderFile } from './fileUploaderReducer';
3
3
  import { Accept, FileList } from './types';
4
4
  export type FileUploaderHookProps = {
5
5
  id: string | undefined;
6
- /**Dersom komponenten styres utenfra. En liste over filer som skal være med ved første render. */
6
+ /**Dersom komponenten skal styres internt. Utgangspunktet for filene som har blitt lastet opp. */
7
7
  initialFiles: FileList | undefined;
8
+ /**Dersom komponenten styres utenfra. Filene som har blitt lastet opp. */
9
+ value: FileList | undefined;
10
+ /**Callback for når fil-listen endres. */
11
+ onChange: (newFiles: FileList) => void;
8
12
  /**Hvilke filendelser eller mime-typer som filopplasteren skal akseptere. */
9
13
  accept: Accept[] | undefined;
10
14
  /**Om filopplasteren er avslått eller ikke */
@@ -3,7 +3,7 @@ import { __awaiter } from 'tslib';
3
3
  import { useRef, useMemo, useReducer, useEffect, useCallback } from 'react';
4
4
  import { fileUploaderReducer } from './fileUploaderReducer.js';
5
5
  import { fromEvent } from 'file-selector';
6
- import { preventDefaults, isEventWithFiles, isFileAccepted, getInvalidFileTypeErrorMessage, getTooManyFilesErrorMessage } from './utils.js';
6
+ import { isFileAccepted, getInvalidFileTypeErrorMessage, preventDefaults, isEventWithFiles, getTooManyFilesErrorMessage } from './utils.js';
7
7
 
8
8
  var calcRootErrors = function calcRootErrors(files, maxFiles, errorMessage) {
9
9
  var errors = [];
@@ -17,6 +17,8 @@ var calcRootErrors = function calcRootErrors(files, maxFiles, errorMessage) {
17
17
  };
18
18
  var useFileUploader = function useFileUploader(props) {
19
19
  var initialFiles = props.initialFiles,
20
+ value = props.value,
21
+ onChange = props.onChange,
20
22
  accept = props.accept,
21
23
  maxFiles = props.maxFiles,
22
24
  disabled = props.disabled,
@@ -24,6 +26,7 @@ var useFileUploader = function useFileUploader(props) {
24
26
  var rootRef = useRef(null);
25
27
  var inputRef = useRef(null);
26
28
  var buttonRef = useRef(null);
29
+ var isControlled = !!value;
27
30
  var initialFileUploaderFiles = useMemo(function () {
28
31
  return (initialFiles !== null && initialFiles !== void 0 ? initialFiles : []).map(function (f) {
29
32
  return {
@@ -43,6 +46,21 @@ var useFileUploader = function useFileUploader(props) {
43
46
  state = _useReducer2[0],
44
47
  dispatch = _useReducer2[1];
45
48
  var stateFiles = state.files;
49
+ useEffect(function () {
50
+ if (isControlled) {
51
+ var files = value.map(function (file) {
52
+ var accepted = isFileAccepted(file, accept);
53
+ return {
54
+ file: file,
55
+ errors: accepted ? [] : [getInvalidFileTypeErrorMessage()]
56
+ };
57
+ });
58
+ dispatch({
59
+ type: 'onSetFiles',
60
+ payload: files
61
+ });
62
+ }
63
+ }, [value, isControlled, accept, dispatch]);
46
64
  useEffect(function () {
47
65
  dispatch({
48
66
  type: 'setRootErrors',
@@ -115,7 +133,7 @@ var useFileUploader = function useFileUploader(props) {
115
133
  case 0:
116
134
  evt.preventDefault();
117
135
  if (!isEventWithFiles(evt)) {
118
- _context2.next = 8;
136
+ _context2.next = 9;
119
137
  break;
120
138
  }
121
139
  existingFileNames = stateFiles.map(function (f) {
@@ -134,17 +152,22 @@ var useFileUploader = function useFileUploader(props) {
134
152
  errors: accepted ? [] : [getInvalidFileTypeErrorMessage()]
135
153
  };
136
154
  }).concat(stateFiles);
137
- dispatch({
138
- type: 'onSetFiles',
139
- payload: newFiles
140
- });
141
- case 8:
155
+ onChange(newFiles.map(function (f) {
156
+ return f.file;
157
+ }));
158
+ if (!isControlled) {
159
+ dispatch({
160
+ type: 'onSetFiles',
161
+ payload: newFiles
162
+ });
163
+ }
164
+ case 9:
142
165
  case "end":
143
166
  return _context2.stop();
144
167
  }
145
168
  }, _callee2);
146
169
  }));
147
- }, [stateFiles, maxFiles, accept, errorMessage, dispatch]);
170
+ }, [stateFiles, isControlled, accept, errorMessage, maxFiles, onChange, dispatch]);
148
171
  var openFileDialog = useCallback(function () {
149
172
  if (inputRef.current) {
150
173
  inputRef.current.value = '';
@@ -154,11 +177,16 @@ var useFileUploader = function useFileUploader(props) {
154
177
  var removeFile = useCallback(function (file) {
155
178
  var newFiles = _toConsumableArray(stateFiles);
156
179
  newFiles.splice(stateFiles.indexOf(file), 1);
157
- dispatch({
158
- type: 'onRemoveFile',
159
- payload: newFiles
160
- });
161
- }, [stateFiles, maxFiles, errorMessage]);
180
+ onChange(newFiles.map(function (f) {
181
+ return f.file;
182
+ }));
183
+ if (!isControlled) {
184
+ dispatch({
185
+ type: 'onRemoveFile',
186
+ payload: newFiles
187
+ });
188
+ }
189
+ }, [stateFiles, isControlled, maxFiles, errorMessage, onChange, dispatch]);
162
190
  var getRootProps = useCallback(function () {
163
191
  return {
164
192
  onBlur: onRootBlur,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@norges-domstoler/dds-components",
3
- "version": "11.2.0",
3
+ "version": "11.3.0",
4
4
  "description": "React components used in Elsa - domstolenes designsystem",
5
5
  "author": "Elsa team",
6
6
  "license": "MIT",
@@ -71,13 +71,13 @@
71
71
  "@types/react": "^18.0.21",
72
72
  "@types/react-dom": "^18.0.11",
73
73
  "@types/styled-components": "^5.1.26",
74
- "@typescript-eslint/eslint-plugin": "^5.52.0",
74
+ "@typescript-eslint/eslint-plugin": "^5.54.1",
75
75
  "@typescript-eslint/parser": "^5.54.0",
76
76
  "babel-loader": "^9.1.2",
77
77
  "babel-plugin-styled-components": "^2.0.7",
78
78
  "concurrently": "^7.4.0",
79
79
  "eslint": "^8.24.0",
80
- "eslint-config-prettier": "^8.5.0",
80
+ "eslint-config-prettier": "^8.7.0",
81
81
  "eslint-plugin-prettier": "^4.2.1",
82
82
  "eslint-plugin-react": "^7.32.2",
83
83
  "eslint-plugin-storybook": "^0.6.4",