@arbor-education/design-system.components 4.9.1 → 4.9.2
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 +6 -0
- package/dist/components/table/cellEditors/NumberCellEditor.d.ts +2 -2
- package/dist/components/table/cellEditors/NumberCellEditor.d.ts.map +1 -1
- package/dist/components/table/cellEditors/NumberCellEditor.js +1 -1
- package/dist/components/table/cellEditors/NumberCellEditor.js.map +1 -1
- package/dist/components/table/cellEditors/NumberCellEditor.test.d.ts +2 -0
- package/dist/components/table/cellEditors/NumberCellEditor.test.d.ts.map +1 -0
- package/dist/components/table/cellEditors/NumberCellEditor.test.js +57 -0
- package/dist/components/table/cellEditors/NumberCellEditor.test.js.map +1 -0
- package/package.json +1 -1
- package/src/components/table/cellEditors/NumberCellEditor.test.tsx +74 -0
- package/src/components/table/cellEditors/NumberCellEditor.tsx +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.9.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#306](https://github.com/arbor-education/design-system.components/pull/306) [`16dd3fb`](https://github.com/arbor-education/design-system.components/commit/16dd3fb0179b03dcd26771fdff8de8107aa90f9f) Thanks [@rickbairstow](https://github.com/rickbairstow)! - MIS-74129 🐛 Fix NaN committed by number cell editor when min or max is omitted
|
|
8
|
+
|
|
3
9
|
## 4.9.1
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberCellEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/table/cellEditors/NumberCellEditor.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,GAAG,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"NumberCellEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/table/cellEditors/NumberCellEditor.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAMF,eAAO,MAAM,gBAAgB;YAAW,qBAAqB;;CA6D5D,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { NumberInput } from '../../formField/inputs/number/NumberInput.js';
|
|
|
3
3
|
import {} from 'react';
|
|
4
4
|
const clampValue = (value, min, max) => (Math.min(Math.max(value, min), max));
|
|
5
5
|
export const NumberCellEditor = (props) => {
|
|
6
|
-
const { value, onValueChange, min, max, step, disableSpinners, } = props;
|
|
6
|
+
const { value, onValueChange, min = -Infinity, max = Infinity, step, disableSpinners, } = props;
|
|
7
7
|
const handleChange = (event) => {
|
|
8
8
|
const nextValue = event.currentTarget.value.trim();
|
|
9
9
|
if (nextValue === '') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberCellEditor.js","sourceRoot":"","sources":["../../../../src/components/table/cellEditors/NumberCellEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gDAAgD,CAAC;AAC7E,OAAO,EAGN,MAAM,OAAO,CAAC;AAWf,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,CAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAA4B,EAAE,EAAE;IAC/D,MAAM,EACJ,KAAK,EACL,aAAa,EACb,GAAG,
|
|
1
|
+
{"version":3,"file":"NumberCellEditor.js","sourceRoot":"","sources":["../../../../src/components/table/cellEditors/NumberCellEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gDAAgD,CAAC;AAC7E,OAAO,EAGN,MAAM,OAAO,CAAC;AAWf,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,CAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAA4B,EAAE,EAAE;IAC/D,MAAM,EACJ,KAAK,EACL,aAAa,EACb,GAAG,GAAG,CAAC,QAAQ,EACf,GAAG,GAAG,QAAQ,EACd,IAAI,EACJ,eAAe,GAChB,GAAG,KAAK,CAAC;IAEV,MAAM,YAAY,GAAG,CAAC,KAAoC,EAAE,EAAE;QAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAEnD,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACrB,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,aAAa,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,KAAsC,EAAE,EAAE;QAC/D,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAElD,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAErC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,aAAa,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,cACE,SAAS,EAAC,gCAAgC,YAE1C,KAAC,WAAW,IACV,kBAAkB,EAAC,kCAAkC,EACrD,YAAY,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAChD,SAAS,QACT,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,aAAa,GACxB,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,gBAAgB,CAAC,WAAW,GAAG,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberCellEditor.test.d.ts","sourceRoot":"","sources":["../../../../src/components/table/cellEditors/NumberCellEditor.test.tsx"],"names":[],"mappings":"AAGA,OAAO,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { describe, expect, test, vi } from 'vitest';
|
|
3
|
+
import { render, screen } from '@testing-library/react';
|
|
4
|
+
import userEvent from '@testing-library/user-event';
|
|
5
|
+
import '@testing-library/jest-dom/vitest';
|
|
6
|
+
import { NumberCellEditor } from './NumberCellEditor.js';
|
|
7
|
+
const createProps = (overrides = {}) => ({
|
|
8
|
+
value: undefined,
|
|
9
|
+
onValueChange: vi.fn(),
|
|
10
|
+
step: 1,
|
|
11
|
+
disableSpinners: true,
|
|
12
|
+
...overrides,
|
|
13
|
+
});
|
|
14
|
+
const lastCommittedValue = (onValueChange) => (onValueChange.mock.calls.at(-1)?.[0]);
|
|
15
|
+
describe('NumberCellEditor', () => {
|
|
16
|
+
test('commits typed numbers unchanged when no min or max is supplied', async () => {
|
|
17
|
+
const onValueChange = vi.fn();
|
|
18
|
+
render(_jsx(NumberCellEditor, { ...createProps({ onValueChange }) }));
|
|
19
|
+
await userEvent.type(screen.getByRole('textbox'), '42');
|
|
20
|
+
expect(onValueChange).toHaveBeenCalledWith(4);
|
|
21
|
+
expect(onValueChange).toHaveBeenLastCalledWith(42);
|
|
22
|
+
});
|
|
23
|
+
test('commits the typed number on Enter when no min or max is supplied', async () => {
|
|
24
|
+
const onValueChange = vi.fn();
|
|
25
|
+
render(_jsx(NumberCellEditor, { ...createProps({ onValueChange }) }));
|
|
26
|
+
await userEvent.type(screen.getByRole('textbox'), '-1234.5{Enter}');
|
|
27
|
+
expect(lastCommittedValue(onValueChange)).toBe(-1234.5);
|
|
28
|
+
});
|
|
29
|
+
test('clamps to min and leaves values above min unchanged when only min is supplied', async () => {
|
|
30
|
+
const onValueChange = vi.fn();
|
|
31
|
+
render(_jsx(NumberCellEditor, { ...createProps({ onValueChange, min: 10 }) }));
|
|
32
|
+
await userEvent.type(screen.getByRole('textbox'), '5');
|
|
33
|
+
expect(lastCommittedValue(onValueChange)).toBe(10);
|
|
34
|
+
await userEvent.clear(screen.getByRole('textbox'));
|
|
35
|
+
await userEvent.type(screen.getByRole('textbox'), '500');
|
|
36
|
+
expect(lastCommittedValue(onValueChange)).toBe(500);
|
|
37
|
+
});
|
|
38
|
+
test('clamps to max and leaves values below max unchanged when only max is supplied', async () => {
|
|
39
|
+
const onValueChange = vi.fn();
|
|
40
|
+
render(_jsx(NumberCellEditor, { ...createProps({ onValueChange, max: 100 }) }));
|
|
41
|
+
await userEvent.type(screen.getByRole('textbox'), '500');
|
|
42
|
+
expect(lastCommittedValue(onValueChange)).toBe(100);
|
|
43
|
+
await userEvent.clear(screen.getByRole('textbox'));
|
|
44
|
+
await userEvent.type(screen.getByRole('textbox'), '-500');
|
|
45
|
+
expect(lastCommittedValue(onValueChange)).toBe(-500);
|
|
46
|
+
});
|
|
47
|
+
test('clamps out-of-range values when both min and max are supplied', async () => {
|
|
48
|
+
const onValueChange = vi.fn();
|
|
49
|
+
render(_jsx(NumberCellEditor, { ...createProps({ onValueChange, min: 0, max: 100 }) }));
|
|
50
|
+
await userEvent.type(screen.getByRole('textbox'), '-5');
|
|
51
|
+
expect(lastCommittedValue(onValueChange)).toBe(0);
|
|
52
|
+
await userEvent.clear(screen.getByRole('textbox'));
|
|
53
|
+
await userEvent.type(screen.getByRole('textbox'), '250{Enter}');
|
|
54
|
+
expect(lastCommittedValue(onValueChange)).toBe(100);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=NumberCellEditor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberCellEditor.test.js","sourceRoot":"","sources":["../../../../src/components/table/cellEditors/NumberCellEditor.test.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { describe, expect, test, vi } from 'vitest';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
4
|
+
import '@testing-library/jest-dom/vitest';
|
|
5
|
+
import { NumberCellEditor, type NumberCellEditorProps } from './NumberCellEditor.js';
|
|
6
|
+
|
|
7
|
+
const createProps = (overrides: Partial<NumberCellEditorProps> = {}): NumberCellEditorProps => ({
|
|
8
|
+
value: undefined,
|
|
9
|
+
onValueChange: vi.fn(),
|
|
10
|
+
step: 1,
|
|
11
|
+
disableSpinners: true,
|
|
12
|
+
...overrides,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const lastCommittedValue = (onValueChange: ReturnType<typeof vi.fn>) => (
|
|
16
|
+
onValueChange.mock.calls.at(-1)?.[0]
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
describe('NumberCellEditor', () => {
|
|
20
|
+
test('commits typed numbers unchanged when no min or max is supplied', async () => {
|
|
21
|
+
const onValueChange = vi.fn();
|
|
22
|
+
render(<NumberCellEditor {...createProps({ onValueChange })} />);
|
|
23
|
+
|
|
24
|
+
await userEvent.type(screen.getByRole('textbox'), '42');
|
|
25
|
+
|
|
26
|
+
expect(onValueChange).toHaveBeenCalledWith(4);
|
|
27
|
+
expect(onValueChange).toHaveBeenLastCalledWith(42);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('commits the typed number on Enter when no min or max is supplied', async () => {
|
|
31
|
+
const onValueChange = vi.fn();
|
|
32
|
+
render(<NumberCellEditor {...createProps({ onValueChange })} />);
|
|
33
|
+
|
|
34
|
+
await userEvent.type(screen.getByRole('textbox'), '-1234.5{Enter}');
|
|
35
|
+
|
|
36
|
+
expect(lastCommittedValue(onValueChange)).toBe(-1234.5);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('clamps to min and leaves values above min unchanged when only min is supplied', async () => {
|
|
40
|
+
const onValueChange = vi.fn();
|
|
41
|
+
render(<NumberCellEditor {...createProps({ onValueChange, min: 10 })} />);
|
|
42
|
+
|
|
43
|
+
await userEvent.type(screen.getByRole('textbox'), '5');
|
|
44
|
+
expect(lastCommittedValue(onValueChange)).toBe(10);
|
|
45
|
+
|
|
46
|
+
await userEvent.clear(screen.getByRole('textbox'));
|
|
47
|
+
await userEvent.type(screen.getByRole('textbox'), '500');
|
|
48
|
+
expect(lastCommittedValue(onValueChange)).toBe(500);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('clamps to max and leaves values below max unchanged when only max is supplied', async () => {
|
|
52
|
+
const onValueChange = vi.fn();
|
|
53
|
+
render(<NumberCellEditor {...createProps({ onValueChange, max: 100 })} />);
|
|
54
|
+
|
|
55
|
+
await userEvent.type(screen.getByRole('textbox'), '500');
|
|
56
|
+
expect(lastCommittedValue(onValueChange)).toBe(100);
|
|
57
|
+
|
|
58
|
+
await userEvent.clear(screen.getByRole('textbox'));
|
|
59
|
+
await userEvent.type(screen.getByRole('textbox'), '-500');
|
|
60
|
+
expect(lastCommittedValue(onValueChange)).toBe(-500);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('clamps out-of-range values when both min and max are supplied', async () => {
|
|
64
|
+
const onValueChange = vi.fn();
|
|
65
|
+
render(<NumberCellEditor {...createProps({ onValueChange, min: 0, max: 100 })} />);
|
|
66
|
+
|
|
67
|
+
await userEvent.type(screen.getByRole('textbox'), '-5');
|
|
68
|
+
expect(lastCommittedValue(onValueChange)).toBe(0);
|
|
69
|
+
|
|
70
|
+
await userEvent.clear(screen.getByRole('textbox'));
|
|
71
|
+
await userEvent.type(screen.getByRole('textbox'), '250{Enter}');
|
|
72
|
+
expect(lastCommittedValue(onValueChange)).toBe(100);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
@@ -7,8 +7,8 @@ import {
|
|
|
7
7
|
export type NumberCellEditorProps = {
|
|
8
8
|
value: number | null | undefined;
|
|
9
9
|
onValueChange: (value: number | null) => void;
|
|
10
|
-
min
|
|
11
|
-
max
|
|
10
|
+
min?: number;
|
|
11
|
+
max?: number;
|
|
12
12
|
step: number;
|
|
13
13
|
disableSpinners: boolean;
|
|
14
14
|
};
|
|
@@ -21,8 +21,8 @@ export const NumberCellEditor = (props: NumberCellEditorProps) => {
|
|
|
21
21
|
const {
|
|
22
22
|
value,
|
|
23
23
|
onValueChange,
|
|
24
|
-
min,
|
|
25
|
-
max,
|
|
24
|
+
min = -Infinity,
|
|
25
|
+
max = Infinity,
|
|
26
26
|
step,
|
|
27
27
|
disableSpinners,
|
|
28
28
|
} = props;
|