envoc-form 2.0.1-1 → 2.0.1-13

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 (155) hide show
  1. package/README.md +7 -7
  2. package/dist/css/envoc-form-styles.css +43 -5
  3. package/dist/css/envoc-form-styles.css.map +1 -1
  4. package/es/AddressInput/AddressInput.js +8 -7
  5. package/es/ConfirmBaseForm/ConfirmBaseForm.js +3 -2
  6. package/es/ConfirmDeleteForm/ConfirmDeleteForm.js +3 -2
  7. package/es/DatePickerInput/DatePickerInput.js +3 -2
  8. package/es/FileInput/DefaultFileList.js +36 -0
  9. package/es/FileInput/DropzoneFileInput.js +58 -0
  10. package/es/FileInput/FileInput.js +31 -9
  11. package/es/FileInput/index.js +2 -1
  12. package/es/Form/Form.js +11 -33
  13. package/es/Form/FormBasedPreventNavigation.js +1 -1
  14. package/es/FormGroupWrapper.js +2 -1
  15. package/es/FormInput/FormInput.js +29 -10
  16. package/es/FormInputArray/FormInputArray.js +39 -24
  17. package/es/IconInput.js +2 -1
  18. package/es/ReactSelectField/ReactSelectField.js +6 -3
  19. package/es/SubmitFormButton.js +2 -1
  20. package/es/__Tests__/FormTestBase.js +5 -2
  21. package/es/normalizers.js +10 -5
  22. package/es/useStandardFormInput.js +4 -2
  23. package/es/utils/index.js +3 -0
  24. package/es/utils/objectContainsNonSerializableProperty.js +16 -0
  25. package/es/utils/objectToFormData.js +65 -0
  26. package/es/utils/typeChecks.js +25 -0
  27. package/lib/AddressInput/AddressInput.js +15 -9
  28. package/lib/ConfirmBaseForm/ConfirmBaseForm.js +4 -2
  29. package/lib/ConfirmDeleteForm/ConfirmDeleteForm.js +6 -4
  30. package/lib/DatePickerInput/DatePickerInput.js +4 -2
  31. package/lib/FileInput/DefaultFileList.js +47 -0
  32. package/lib/FileInput/DropzoneFileInput.js +75 -0
  33. package/lib/FileInput/FileInput.js +39 -10
  34. package/lib/FileInput/index.js +13 -3
  35. package/lib/Form/Form.js +19 -39
  36. package/lib/Form/FormBasedPreventNavigation.js +7 -3
  37. package/lib/FormGroupWrapper.js +3 -1
  38. package/lib/FormInput/FormInput.js +31 -11
  39. package/lib/FormInputArray/FormInputArray.js +47 -26
  40. package/lib/FormSection.js +5 -1
  41. package/lib/IconInput.js +3 -1
  42. package/lib/ReactSelectField/ReactSelectField.js +13 -5
  43. package/lib/ReactSelectField/index.js +6 -2
  44. package/lib/SubmitFormButton.js +3 -1
  45. package/lib/__Tests__/FormTestBase.js +6 -2
  46. package/lib/index.js +7 -3
  47. package/lib/normalizers.js +10 -5
  48. package/lib/useStandardFormInput.js +5 -2
  49. package/lib/utils/index.js +23 -0
  50. package/lib/utils/objectContainsNonSerializableProperty.js +24 -0
  51. package/lib/utils/objectToFormData.js +73 -0
  52. package/lib/utils/typeChecks.js +58 -0
  53. package/lib/validators/index.js +5 -1
  54. package/package.json +99 -90
  55. package/src/AddressInput/AddesssInput.test.js +23 -23
  56. package/src/AddressInput/AddressInput.js +73 -73
  57. package/src/AddressInput/UsStates.js +53 -53
  58. package/src/AddressInput/__snapshots__/AddesssInput.test.js.snap +207 -207
  59. package/src/AddressInput/index.js +2 -2
  60. package/src/BoolInput/BoolInput.js +7 -7
  61. package/src/BoolInput/BoolInput.test.js +23 -23
  62. package/src/BoolInput/InlineBoolInput.js +7 -7
  63. package/src/BoolInput/__snapshots__/BoolInput.test.js.snap +89 -89
  64. package/src/BoolInput/boolOptions.js +6 -6
  65. package/src/BoolInput/index.js +4 -4
  66. package/src/ConfirmBaseForm/ConfirmBaseForm.js +37 -37
  67. package/src/ConfirmBaseForm/ConfirmBaseForm.test.js +14 -14
  68. package/src/ConfirmBaseForm/__snapshots__/ConfirmBaseForm.test.js.snap +23 -23
  69. package/src/ConfirmBaseForm/index.js +1 -1
  70. package/src/ConfirmDeleteForm/ConfirmDeleteForm.js +39 -39
  71. package/src/ConfirmDeleteForm/ConfirmDeleteForm.test.js +24 -24
  72. package/src/ConfirmDeleteForm/__snapshots__/ConfirmDeleteForm.test.js.snap +25 -25
  73. package/src/ConfirmDeleteForm/index.js +1 -1
  74. package/src/DatePickerInput/DatePickerInput.js +46 -46
  75. package/src/DatePickerInput/DatePickerInput.test.js +74 -74
  76. package/src/DatePickerInput/__snapshots__/DatePickerInput.test.js.snap +134 -131
  77. package/src/DatePickerInput/date-picker-input.scss +42 -42
  78. package/src/DatePickerInput/index.js +3 -3
  79. package/src/ErrorScrollTarget.js +6 -6
  80. package/src/FileInput/DefaultFileList.js +39 -0
  81. package/src/FileInput/DropzoneFileInput.js +56 -0
  82. package/src/FileInput/DropzoneFileInput.test.js +24 -0
  83. package/src/FileInput/FileInput.js +77 -49
  84. package/src/FileInput/FileInput.test.js +24 -15
  85. package/src/FileInput/__snapshots__/DropzoneFileInput.test.js.snap +57 -0
  86. package/src/FileInput/__snapshots__/FileInput.test.js.snap +58 -22
  87. package/src/FileInput/file-input.scss +58 -17
  88. package/src/FileInput/index.js +4 -3
  89. package/src/Form/FocusError.js +48 -48
  90. package/src/Form/Form.js +139 -161
  91. package/src/Form/Form.test.js +23 -23
  92. package/src/Form/FormBasedPreventNavigation.js +25 -25
  93. package/src/Form/ServerErrorContext.js +7 -7
  94. package/src/Form/__snapshots__/Form.test.js.snap +9 -9
  95. package/src/Form/index.js +3 -3
  96. package/src/FormGroup.js +30 -30
  97. package/src/FormGroupWrapper.js +28 -28
  98. package/src/FormInput/FormInput.js +144 -136
  99. package/src/FormInput/FormInput.test.js +66 -66
  100. package/src/FormInput/__snapshots__/FormInput.test.js.snap +323 -313
  101. package/src/FormInput/form-input.scss +9 -9
  102. package/src/FormInput/index.js +2 -2
  103. package/src/FormInputArray/FormInputArray.js +224 -210
  104. package/src/FormInputArray/FormInputArray.test.js +108 -59
  105. package/src/FormInputArray/__snapshots__/FormInputArray.test.js.snap +52 -40
  106. package/src/FormInputArray/form-input-array.scss +13 -8
  107. package/src/FormInputArray/index.js +2 -2
  108. package/src/FormSection.js +13 -13
  109. package/src/IconInput.js +31 -31
  110. package/src/InlineFormInput/InlineFormInput.js +6 -6
  111. package/src/InlineFormInput/InlineFormInput.test.js +23 -23
  112. package/src/InlineFormInput/__snapshots__/InlineFormInput.test.js.snap +26 -26
  113. package/src/InlineFormInput/index.js +3 -3
  114. package/src/InlineFormInput/inline-form-input.scss +3 -3
  115. package/src/MoneyInput/InlineMoneyInput.js +7 -7
  116. package/src/MoneyInput/MoneyInput.js +7 -7
  117. package/src/MoneyInput/MoneyInputs.test.js +43 -43
  118. package/src/MoneyInput/__snapshots__/MoneyInputs.test.js.snap +81 -81
  119. package/src/MoneyInput/index.js +4 -4
  120. package/src/MoneyInput/money-input.scss +3 -3
  121. package/src/MoneyInput/moneyInputProps.js +12 -12
  122. package/src/NestedFormFieldContext.js +6 -6
  123. package/src/ReactSelectField/ReactSelectField.js +122 -120
  124. package/src/ReactSelectField/index.js +6 -6
  125. package/src/ReactSelectField/react-select-field.scss +5 -5
  126. package/src/StandardFormActions.js +27 -27
  127. package/src/SubmitFormButton.js +28 -28
  128. package/src/__Tests__/FormTestBase.js +14 -11
  129. package/src/__Tests__/IconInput.test.js +23 -23
  130. package/src/__Tests__/StandardFormActions.test.js +23 -23
  131. package/src/__Tests__/SubmitFormButton.test.js +23 -23
  132. package/src/__Tests__/__snapshots__/IconInput.test.js.snap +38 -38
  133. package/src/__Tests__/__snapshots__/StandardFormActions.test.js.snap +25 -25
  134. package/src/__Tests__/__snapshots__/SubmitFormButton.test.js.snap +18 -18
  135. package/src/__Tests__/index.js +2 -2
  136. package/src/_variables.scss +11 -11
  137. package/src/index.js +33 -33
  138. package/src/normalizers.js +42 -32
  139. package/src/selectors.js +3 -3
  140. package/src/styles.scss +7 -7
  141. package/src/useStandardFormInput.js +118 -118
  142. package/src/utils/index.js +3 -0
  143. package/src/utils/objectContainsNonSerializableProperty.js +15 -0
  144. package/src/utils/objectContainsNonSerializableProperty.test.js +49 -0
  145. package/src/utils/objectToFormData.js +89 -0
  146. package/src/utils/objectToFormData.test.js +76 -0
  147. package/src/utils/typeChecks.js +18 -0
  148. package/src/validators/index.js +2 -2
  149. package/src/validators/validators.js +93 -93
  150. package/src/validators/validators.test.js +79 -79
  151. package/CHANGELOG.json +0 -95
  152. package/CHANGELOG.md +0 -58
  153. package/es/FormInput/utilities.js +0 -71
  154. package/lib/FormInput/utilities.js +0 -86
  155. package/src/FormInput/utilities.js +0 -26
@@ -1,74 +1,74 @@
1
- import React from 'react';
2
- import { render } from '@testing-library/react';
3
- import '@testing-library/jest-dom/extend-expect';
4
- import DatePickerInput from './DatePickerInput';
5
-
6
- //hack so the datepicker internals don't complain about this not existing in the context of jest
7
- HTMLCanvasElement.prototype.getContext = () => {};
8
-
9
- //Tell console.error to be quiet about the errors so jest output isn't super noisy
10
- //https://github.com/facebook/jest/pull/5267#issuecomment-356605468
11
- beforeEach(() => {
12
- jest.spyOn(console, 'error');
13
- console.error.mockImplementation(() => {});
14
- });
15
-
16
- afterEach(() => {
17
- console.error.mockRestore();
18
- });
19
-
20
- describe('DatePickerInput', () => {
21
- it('Renders without error', () => {
22
- render(
23
- <DatePickerInput
24
- minDate={new Date('9/23/2020')}
25
- maxDate={new Date('09/23/2021')}
26
- />
27
- );
28
- });
29
-
30
- it('Throws when given an invalid format date', () => {
31
- expect(() =>
32
- render(
33
- <DatePickerInput
34
- minDate={new Date('9/23/2020')}
35
- maxDate={new Date('09/23/2021')}
36
- value="09/25/2020"
37
- />
38
- )
39
- ).toThrow();
40
- });
41
-
42
- it('Throws when given a date with time included', () => {
43
- expect(() =>
44
- render(
45
- <DatePickerInput
46
- minDate={new Date('9/23/2020')}
47
- maxDate={new Date('09/23/2021')}
48
- value="2020-09-25T19:07:49.774Z"
49
- />
50
- )
51
- ).toThrow();
52
- });
53
-
54
- it('Accepts valid date only format', () => {
55
- render(
56
- <DatePickerInput
57
- minDate={new Date('9/23/2020')}
58
- maxDate={new Date('09/23/2021')}
59
- value="2020-09-25"
60
- />
61
- );
62
- });
63
-
64
- it('has matching snapshot', () => {
65
- const renderResult = render(
66
- <DatePickerInput
67
- minDate={new Date('9/23/2020')}
68
- maxDate={new Date('09/23/2021')}
69
- value="2020-09-25"
70
- />
71
- );
72
- expect(renderResult.asFragment()).toMatchSnapshot();
73
- });
74
- });
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import '@testing-library/jest-dom/extend-expect';
4
+ import DatePickerInput from './DatePickerInput';
5
+
6
+ //hack so the datepicker internals don't complain about this not existing in the context of jest
7
+ HTMLCanvasElement.prototype.getContext = () => {};
8
+
9
+ //Tell console.error to be quiet about the errors so jest output isn't super noisy
10
+ //https://github.com/facebook/jest/pull/5267#issuecomment-356605468
11
+ beforeEach(() => {
12
+ jest.spyOn(console, 'error');
13
+ console.error.mockImplementation(() => {});
14
+ });
15
+
16
+ afterEach(() => {
17
+ console.error.mockRestore();
18
+ });
19
+
20
+ describe('DatePickerInput', () => {
21
+ it('Renders without error', () => {
22
+ render(
23
+ <DatePickerInput
24
+ minDate={new Date('9/23/2020')}
25
+ maxDate={new Date('09/23/2021')}
26
+ />
27
+ );
28
+ });
29
+
30
+ it('Throws when given an invalid format date', () => {
31
+ expect(() =>
32
+ render(
33
+ <DatePickerInput
34
+ minDate={new Date('9/23/2020')}
35
+ maxDate={new Date('09/23/2021')}
36
+ value="09/25/2020"
37
+ />
38
+ )
39
+ ).toThrow();
40
+ });
41
+
42
+ it('Throws when given a date with time included', () => {
43
+ expect(() =>
44
+ render(
45
+ <DatePickerInput
46
+ minDate={new Date('9/23/2020')}
47
+ maxDate={new Date('09/23/2021')}
48
+ value="2020-09-25T19:07:49.774Z"
49
+ />
50
+ )
51
+ ).toThrow();
52
+ });
53
+
54
+ it('Accepts valid date only format', () => {
55
+ render(
56
+ <DatePickerInput
57
+ minDate={new Date('9/23/2020')}
58
+ maxDate={new Date('09/23/2021')}
59
+ value="2020-09-25"
60
+ />
61
+ );
62
+ });
63
+
64
+ it('has matching snapshot', () => {
65
+ const renderResult = render(
66
+ <DatePickerInput
67
+ minDate={new Date('9/23/2020')}
68
+ maxDate={new Date('09/23/2021')}
69
+ value="2020-09-25"
70
+ />
71
+ );
72
+ expect(renderResult.asFragment()).toMatchSnapshot();
73
+ });
74
+ });
@@ -1,131 +1,134 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`DatePickerInput has matching snapshot 1`] = `
4
- <DocumentFragment>
5
- <div
6
- class="react-date-picker react-date-picker--closed react-date-picker--enabled form-control"
7
- >
8
- <div
9
- class="react-date-picker__wrapper"
10
- >
11
- <div
12
- class="react-date-picker__inputGroup"
13
- >
14
- <input
15
- max="2021-09-23"
16
- min="2020-09-23"
17
- name="date"
18
- style="visibility: hidden; position: absolute; top: -9999px; left: -9999px;"
19
- type="date"
20
- value="2020-09-25"
21
- />
22
- <input
23
- autocomplete="off"
24
- class="react-date-picker__inputGroup__input react-date-picker__inputGroup__month"
25
- data-input="true"
26
- max="12"
27
- min="9"
28
- name="month"
29
- placeholder="--"
30
- type="number"
31
- value="9"
32
- />
33
- <span
34
- class="react-date-picker__inputGroup__divider"
35
- >
36
- /
37
- </span>
38
- <input
39
- autocomplete="off"
40
- class="react-date-picker__inputGroup__input react-date-picker__inputGroup__day"
41
- data-input="true"
42
- max="30"
43
- min="23"
44
- name="day"
45
- placeholder="--"
46
- type="number"
47
- value="25"
48
- />
49
- <span
50
- class="react-date-picker__inputGroup__divider"
51
- >
52
- /
53
- </span>
54
- <input
55
- autocomplete="off"
56
- class="react-date-picker__inputGroup__input react-date-picker__inputGroup__year"
57
- data-input="true"
58
- max="2021"
59
- min="2020"
60
- name="year"
61
- placeholder="----"
62
- step="1"
63
- type="number"
64
- value="2020"
65
- />
66
- </div>
67
- <button
68
- class="react-date-picker__clear-button react-date-picker__button"
69
- type="button"
70
- >
71
- <svg
72
- class="react-date-picker__clear-button__icon react-date-picker__button__icon"
73
- height="19"
74
- stroke="black"
75
- stroke-width="2"
76
- viewBox="0 0 19 19"
77
- width="19"
78
- xmlns="http://www.w3.org/2000/svg"
79
- >
80
- <line
81
- x1="4"
82
- x2="15"
83
- y1="4"
84
- y2="15"
85
- />
86
- <line
87
- x1="15"
88
- x2="4"
89
- y1="4"
90
- y2="15"
91
- />
92
- </svg>
93
- </button>
94
- <button
95
- class="react-date-picker__calendar-button react-date-picker__button"
96
- type="button"
97
- >
98
- <svg
99
- class="react-date-picker__calendar-button__icon react-date-picker__button__icon"
100
- height="19"
101
- stroke="black"
102
- stroke-width="2"
103
- viewBox="0 0 19 19"
104
- width="19"
105
- xmlns="http://www.w3.org/2000/svg"
106
- >
107
- <rect
108
- fill="none"
109
- height="15"
110
- width="15"
111
- x="2"
112
- y="2"
113
- />
114
- <line
115
- x1="6"
116
- x2="6"
117
- y1="0"
118
- y2="4"
119
- />
120
- <line
121
- x1="13"
122
- x2="13"
123
- y1="0"
124
- y2="4"
125
- />
126
- </svg>
127
- </button>
128
- </div>
129
- </div>
130
- </DocumentFragment>
131
- `;
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`DatePickerInput has matching snapshot 1`] = `
4
+ <DocumentFragment>
5
+ <div
6
+ class="react-date-picker react-date-picker--closed react-date-picker--enabled form-control"
7
+ >
8
+ <div
9
+ class="react-date-picker__wrapper"
10
+ >
11
+ <div
12
+ class="react-date-picker__inputGroup"
13
+ >
14
+ <input
15
+ max="2021-09-23"
16
+ min="2020-09-23"
17
+ name="date"
18
+ style="visibility: hidden; position: absolute; z-index: -999;"
19
+ type="date"
20
+ value="2020-09-25"
21
+ />
22
+ <input
23
+ autocomplete="off"
24
+ class="react-date-picker__inputGroup__input react-date-picker__inputGroup__month"
25
+ data-input="true"
26
+ inputmode="numeric"
27
+ max="12"
28
+ min="9"
29
+ name="month"
30
+ placeholder="--"
31
+ type="number"
32
+ value="9"
33
+ />
34
+ <span
35
+ class="react-date-picker__inputGroup__divider"
36
+ >
37
+ /
38
+ </span>
39
+ <input
40
+ autocomplete="off"
41
+ class="react-date-picker__inputGroup__input react-date-picker__inputGroup__day"
42
+ data-input="true"
43
+ inputmode="numeric"
44
+ max="30"
45
+ min="23"
46
+ name="day"
47
+ placeholder="--"
48
+ type="number"
49
+ value="25"
50
+ />
51
+ <span
52
+ class="react-date-picker__inputGroup__divider"
53
+ >
54
+ /
55
+ </span>
56
+ <input
57
+ autocomplete="off"
58
+ class="react-date-picker__inputGroup__input react-date-picker__inputGroup__year"
59
+ data-input="true"
60
+ inputmode="numeric"
61
+ max="2021"
62
+ min="2020"
63
+ name="year"
64
+ placeholder="----"
65
+ step="1"
66
+ type="number"
67
+ value="2020"
68
+ />
69
+ </div>
70
+ <button
71
+ class="react-date-picker__clear-button react-date-picker__button"
72
+ type="button"
73
+ >
74
+ <svg
75
+ class="react-date-picker__clear-button__icon react-date-picker__button__icon"
76
+ height="19"
77
+ stroke="black"
78
+ stroke-width="2"
79
+ viewBox="0 0 19 19"
80
+ width="19"
81
+ xmlns="http://www.w3.org/2000/svg"
82
+ >
83
+ <line
84
+ x1="4"
85
+ x2="15"
86
+ y1="4"
87
+ y2="15"
88
+ />
89
+ <line
90
+ x1="15"
91
+ x2="4"
92
+ y1="4"
93
+ y2="15"
94
+ />
95
+ </svg>
96
+ </button>
97
+ <button
98
+ class="react-date-picker__calendar-button react-date-picker__button"
99
+ type="button"
100
+ >
101
+ <svg
102
+ class="react-date-picker__calendar-button__icon react-date-picker__button__icon"
103
+ height="19"
104
+ stroke="black"
105
+ stroke-width="2"
106
+ viewBox="0 0 19 19"
107
+ width="19"
108
+ xmlns="http://www.w3.org/2000/svg"
109
+ >
110
+ <rect
111
+ fill="none"
112
+ height="15"
113
+ width="15"
114
+ x="2"
115
+ y="2"
116
+ />
117
+ <line
118
+ x1="6"
119
+ x2="6"
120
+ y1="0"
121
+ y2="4"
122
+ />
123
+ <line
124
+ x1="13"
125
+ x2="13"
126
+ y1="0"
127
+ y2="4"
128
+ />
129
+ </svg>
130
+ </button>
131
+ </div>
132
+ </div>
133
+ </DocumentFragment>
134
+ `;
@@ -1,42 +1,42 @@
1
- @import '../variables';
2
-
3
- .react-date-picker {
4
- padding: 0;
5
- &.react-date-picker--open {
6
- border: 1px solid $input-border-color--focused;
7
- box-shadow: $input-box-shadow--focused;
8
- }
9
- &.react-date-picker--disabled {
10
- background-color: $input-disabled-background-color;
11
- border-color: $input-disabled-border-color;
12
- }
13
-
14
- .react-date-picker__wrapper {
15
- width: 100%;
16
- border: none;
17
- }
18
-
19
- .react-date-picker__inputGroup {
20
- width: 100%;
21
- margin-left: 10px;
22
- }
23
-
24
- .is-invalid.react-date-picker {
25
- border: 1px solid $red;
26
- }
27
-
28
- .react-date-picker__calendar {
29
- z-index: 3;
30
- }
31
- .react-date-picker__inputGroup__input {
32
- min-width: 18px;
33
- text-align: center;
34
- &.react-date-picker__inputGroup__year {
35
- min-width: 40px;
36
- }
37
- }
38
-
39
- .react-calendar__tile--now {
40
- outline: 1px solid rgba(0, 0, 0, 0.5);
41
- }
42
- }
1
+ @import '../variables';
2
+
3
+ .react-date-picker {
4
+ padding: 0;
5
+ &.react-date-picker--open {
6
+ border: 1px solid $input-border-color--focused;
7
+ box-shadow: $input-box-shadow--focused;
8
+ }
9
+ &.react-date-picker--disabled {
10
+ background-color: $input-disabled-background-color;
11
+ border-color: $input-disabled-border-color;
12
+ }
13
+
14
+ .react-date-picker__wrapper {
15
+ width: 100%;
16
+ border: none;
17
+ }
18
+
19
+ .react-date-picker__inputGroup {
20
+ width: 100%;
21
+ margin-left: 10px;
22
+ }
23
+
24
+ .is-invalid.react-date-picker {
25
+ border: 1px solid $red;
26
+ }
27
+
28
+ .react-date-picker__calendar {
29
+ z-index: 3;
30
+ }
31
+ .react-date-picker__inputGroup__input {
32
+ min-width: 18px;
33
+ text-align: center;
34
+ &.react-date-picker__inputGroup__year {
35
+ min-width: 40px;
36
+ }
37
+ }
38
+
39
+ .react-calendar__tile--now {
40
+ outline: 1px solid rgba(0, 0, 0, 0.5);
41
+ }
42
+ }
@@ -1,3 +1,3 @@
1
- import DatePickerInput from './DatePickerInput';
2
-
3
- export default DatePickerInput;
1
+ import DatePickerInput from './DatePickerInput';
2
+
3
+ export default DatePickerInput;
@@ -1,6 +1,6 @@
1
- import React from 'react';
2
-
3
- export default function ErrorScrollTarget(props) {
4
- const divId = `${props.name.toLowerCase()}-error-scroll-target`;
5
- return <div id={divId} style={{ display: 'none' }} />;
6
- }
1
+ import React from 'react';
2
+
3
+ export default function ErrorScrollTarget(props) {
4
+ const divId = `${props.name.toLowerCase()}-error-scroll-target`;
5
+ return <div id={divId} style={{ display: 'none' }} />;
6
+ }
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { ListGroupItem, ListGroup } from 'reactstrap';
3
+
4
+ export default function DefaultFileList({ files, rejectedFiles = [] }) {
5
+ return (
6
+ <ListGroup>
7
+ {files.map((file) => (
8
+ <Group key={file.path} item={file} warning={false} />
9
+ ))}
10
+ {rejectedFiles.map(({ file }) => {
11
+ return <Group key={file.path} item={file} warning={true} />;
12
+ })}
13
+ </ListGroup>
14
+ );
15
+ }
16
+
17
+ function Group({ item, warning }) {
18
+ return (
19
+ <ListGroupItem
20
+ color={`d-flex ${
21
+ warning ? 'warning' : 'success'
22
+ } justify-content-between list-group-item ${
23
+ warning ? 'list-group-item-warning' : 'list-group-item-success'
24
+ } px-3 py-1 rounded-1`}>
25
+ <span className="d-flex justify-content-between w-100">
26
+ <span>{item.name}</span> <span>{humanFileSize(item.size)}</span>
27
+ </span>
28
+ </ListGroupItem>
29
+ );
30
+ }
31
+
32
+ function humanFileSize(size) {
33
+ const i = Math.floor(Math.log(size) / Math.log(1024));
34
+ return (
35
+ (size / Math.pow(1024, i)).toFixed(2) * 1 +
36
+ ' ' +
37
+ ['B', 'KB', 'MB', 'GB', 'TB'][i]
38
+ );
39
+ }
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+ import { useDropzone } from 'react-dropzone';
3
+ import classNames from 'classnames';
4
+ import DefaultFileList from './DefaultFileList';
5
+
6
+ export default function DropzoneFileInput({
7
+ className: classNameProp,
8
+ onChange,
9
+ value,
10
+ accept,
11
+ disabled,
12
+ multiple = false,
13
+ FileList = DefaultFileList,
14
+ placeholder = 'Drag and drop some file(s) here, or click to select file(s)',
15
+ dropzone,
16
+ ...props
17
+ }) {
18
+ const {
19
+ acceptedFiles = (acceptedFiles = acceptedFiles[0]),
20
+ fileRejections = fileRejections.push(
21
+ acceptedFiles.slice(1, acceptedFiles.length)
22
+ ),
23
+ getRootProps,
24
+ getInputProps,
25
+ isDragAccept,
26
+ isDragReject,
27
+ } = useDropzone({ accept, onDrop, disabled: disabled, multiple: multiple });
28
+
29
+ function onDrop(acceptedFiles) {
30
+ if (!acceptedFiles?.length > 1 && !multiple) {
31
+ onChange(null);
32
+ } else {
33
+ onChange(acceptedFiles);
34
+ }
35
+ }
36
+
37
+ const className = classNames('react-dropzone', classNameProp, {
38
+ accept: isDragAccept,
39
+ reject: isDragReject,
40
+ disabled: disabled,
41
+ });
42
+
43
+ return (
44
+ <section className={className}>
45
+ <div {...getRootProps()}>
46
+ <input {...props} {...getInputProps()} />
47
+ <>{placeholder}</>
48
+ {!multiple && <b>{`Only one file accepted.`}</b>}
49
+ {accept && <b>{`Files of type "${accept}" accepted`}</b>}
50
+ </div>
51
+ <aside>
52
+ <FileList files={acceptedFiles} rejectedFiles={fileRejections} />
53
+ </aside>
54
+ </section>
55
+ );
56
+ }
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+
4
+ import DropzoneFileInput from './DropzoneFileInput';
5
+
6
+ describe('DropZoneFileInput', () => {
7
+ it('Renders without error', () => {
8
+ render(<DropzoneFileInput name="myFile" />);
9
+ });
10
+
11
+ it('Renders multiple file without error', () => {
12
+ render(<DropzoneFileInput name="myFile" multiple />);
13
+ });
14
+
15
+ it('has matching snapshot', () => {
16
+ const renderResult = render(<DropzoneFileInput name="myFile" />);
17
+ expect(renderResult.asFragment()).toMatchSnapshot();
18
+ });
19
+
20
+ it('Multiple file input has matching snapshot', () => {
21
+ const renderResult = render(<DropzoneFileInput name="myFile" multiple />);
22
+ expect(renderResult.asFragment()).toMatchSnapshot();
23
+ });
24
+ });