@bookjane2/bookjane-design-library 9.0.8 → 9.0.9
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/lib/components/BKJAddressInput/BKJAddressInput.stories.d.ts +36 -1
- package/lib/components/BKJAddressInput/BKJAddressInput.stories.d.ts.map +1 -1
- package/lib/components/BKJAddressInput/BKJAddressInput.stories.js +33 -3
- package/lib/components/BKJAddressInput/BKJAddressInput.stories.js.map +1 -1
- package/lib/components/BKJAddressInput/BKJAddressInput.test.d.ts +2 -0
- package/lib/components/BKJAddressInput/BKJAddressInput.test.d.ts.map +1 -0
- package/lib/components/BKJAddressInput/BKJAddressInput.test.js +198 -0
- package/lib/components/BKJAddressInput/BKJAddressInput.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -2,8 +2,43 @@ import { IBKJAddressInputProps } from './BKJAddressInput.types.js';
|
|
|
2
2
|
declare const _default: {
|
|
3
3
|
title: string;
|
|
4
4
|
component: import("react").FC<IBKJAddressInputProps>;
|
|
5
|
-
argTypes: {
|
|
5
|
+
argTypes: {
|
|
6
|
+
label: {
|
|
7
|
+
name: string;
|
|
8
|
+
control: string;
|
|
9
|
+
};
|
|
10
|
+
disabled: {
|
|
11
|
+
name: string;
|
|
12
|
+
type: string;
|
|
13
|
+
};
|
|
14
|
+
error: {
|
|
15
|
+
name: string;
|
|
16
|
+
control: string;
|
|
17
|
+
};
|
|
18
|
+
name: {
|
|
19
|
+
table: {
|
|
20
|
+
disable: boolean;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
value: {
|
|
24
|
+
table: {
|
|
25
|
+
disable: boolean;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
onChange: {
|
|
29
|
+
table: {
|
|
30
|
+
disable: boolean;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
className: {
|
|
34
|
+
table: {
|
|
35
|
+
disable: boolean;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
};
|
|
6
39
|
};
|
|
7
40
|
export default _default;
|
|
8
41
|
export declare const Default: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJAddressInputProps>;
|
|
42
|
+
export declare const Disabled: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJAddressInputProps>;
|
|
43
|
+
export declare const Error: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJAddressInputProps>;
|
|
9
44
|
//# sourceMappingURL=BKJAddressInput.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJAddressInput.stories.d.ts","sourceRoot":"","sources":["../../../src/components/BKJAddressInput/BKJAddressInput.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC
|
|
1
|
+
{"version":3,"file":"BKJAddressInput.stories.d.ts","sourceRoot":"","sources":["../../../src/components/BKJAddressInput/BKJAddressInput.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEhE,wBAYE;AAIF,eAAO,MAAM,OAAO,iHAAoB,CAAC;AASzC,eAAO,MAAM,QAAQ,iHAAoB,CAAC;AAS1C,eAAO,MAAM,KAAK,iHAAoB,CAAC"}
|
|
@@ -3,9 +3,39 @@ import { BKJAddressInput } from './BKJAddressInput.js';
|
|
|
3
3
|
export default {
|
|
4
4
|
title: 'Input Elements/BKJAddressInput',
|
|
5
5
|
component: BKJAddressInput,
|
|
6
|
-
argTypes: {
|
|
6
|
+
argTypes: {
|
|
7
|
+
label: { name: 'Label', control: 'text' },
|
|
8
|
+
disabled: { name: 'Disabled', type: 'boolean' },
|
|
9
|
+
error: { name: 'Error', control: 'text' },
|
|
10
|
+
name: { table: { disable: true } },
|
|
11
|
+
value: { table: { disable: true } },
|
|
12
|
+
onChange: { table: { disable: true } },
|
|
13
|
+
className: { table: { disable: true } },
|
|
14
|
+
},
|
|
7
15
|
};
|
|
8
|
-
const Template = (
|
|
16
|
+
const Template = (args) => _jsx(BKJAddressInput, { ...args });
|
|
9
17
|
export const Default = Template.bind({});
|
|
10
|
-
Default.args = {
|
|
18
|
+
Default.args = {
|
|
19
|
+
label: 'Address',
|
|
20
|
+
name: 'address',
|
|
21
|
+
value: '',
|
|
22
|
+
disabled: false,
|
|
23
|
+
onChange: () => { },
|
|
24
|
+
};
|
|
25
|
+
export const Disabled = Template.bind({});
|
|
26
|
+
Disabled.args = {
|
|
27
|
+
label: 'Address',
|
|
28
|
+
name: 'address-disabled',
|
|
29
|
+
value: '',
|
|
30
|
+
disabled: true,
|
|
31
|
+
onChange: () => { },
|
|
32
|
+
};
|
|
33
|
+
export const Error = Template.bind({});
|
|
34
|
+
Error.args = {
|
|
35
|
+
label: 'Address',
|
|
36
|
+
name: 'address-error',
|
|
37
|
+
value: '',
|
|
38
|
+
error: 'Enter a valid address',
|
|
39
|
+
onChange: () => { },
|
|
40
|
+
};
|
|
11
41
|
//# sourceMappingURL=BKJAddressInput.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJAddressInput.stories.js","sourceRoot":"","sources":["../../../src/components/BKJAddressInput/BKJAddressInput.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAe;IACb,KAAK,EAAE,gCAAgC;IACvC,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"BKJAddressInput.stories.js","sourceRoot":"","sources":["../../../src/components/BKJAddressInput/BKJAddressInput.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAe;IACb,KAAK,EAAE,gCAAgC;IACvC,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE;QACR,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;QACzC,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;QAC/C,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;QACzC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAClC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QACnC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QACtC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;KACxC;CACF,CAAC;AAEF,MAAM,QAAQ,GAAmC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAC,eAAe,OAAK,IAAI,GAAI,CAAC;AAEzF,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzC,OAAO,CAAC,IAAI,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1C,QAAQ,CAAC,IAAI,GAAG;IACd,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvC,KAAK,CAAC,IAAI,GAAG;IACX,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,uBAAuB;IAC9B,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;CACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJAddressInput.test.d.ts","sourceRoot":"","sources":["../../../src/components/BKJAddressInput/BKJAddressInput.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// jsdom does not implement ResizeObserver / IntersectionObserver.
|
|
3
|
+
// react-virtual and react-popper (used by BKJComboBoxAsync's dropdown) rely
|
|
4
|
+
// on them — matching the shim installed in BKJComboBoxAsync.test.tsx.
|
|
5
|
+
class ResizeObserverMock {
|
|
6
|
+
observe() { }
|
|
7
|
+
unobserve() { }
|
|
8
|
+
disconnect() { }
|
|
9
|
+
}
|
|
10
|
+
globalThis.ResizeObserver =
|
|
11
|
+
ResizeObserverMock;
|
|
12
|
+
class IntersectionObserverMock {
|
|
13
|
+
constructor(_cb) {
|
|
14
|
+
Object.defineProperty(this, "root", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
configurable: true,
|
|
17
|
+
writable: true,
|
|
18
|
+
value: null
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(this, "rootMargin", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
configurable: true,
|
|
23
|
+
writable: true,
|
|
24
|
+
value: ''
|
|
25
|
+
});
|
|
26
|
+
Object.defineProperty(this, "thresholds", {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
configurable: true,
|
|
29
|
+
writable: true,
|
|
30
|
+
value: []
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
observe() { }
|
|
34
|
+
unobserve() { }
|
|
35
|
+
disconnect() { }
|
|
36
|
+
takeRecords() {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
globalThis.IntersectionObserver =
|
|
41
|
+
IntersectionObserverMock;
|
|
42
|
+
import { act, fireEvent, screen } from '@testing-library/react';
|
|
43
|
+
import { axe } from 'jest-axe';
|
|
44
|
+
import { renderAndCheckA11y, renderWithTheme } from '../../test-utils/index.js';
|
|
45
|
+
import { BKJAddressInput } from './BKJAddressInput.js';
|
|
46
|
+
const getQueryPredictionsMock = jest.fn();
|
|
47
|
+
const geocodeMock = jest.fn();
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
window.google = {
|
|
50
|
+
maps: {
|
|
51
|
+
places: {
|
|
52
|
+
AutocompleteService: jest.fn().mockImplementation(() => ({
|
|
53
|
+
getQueryPredictions: getQueryPredictionsMock,
|
|
54
|
+
})),
|
|
55
|
+
},
|
|
56
|
+
Geocoder: jest.fn().mockImplementation(() => ({
|
|
57
|
+
geocode: geocodeMock,
|
|
58
|
+
})),
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
afterEach(() => {
|
|
63
|
+
delete window.google;
|
|
64
|
+
jest.clearAllMocks();
|
|
65
|
+
document.querySelectorAll('#dropdown-root').forEach((el) => el.remove());
|
|
66
|
+
});
|
|
67
|
+
const openDropdown = async (input) => {
|
|
68
|
+
await act(async () => {
|
|
69
|
+
input.focus();
|
|
70
|
+
await Promise.resolve();
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
describe('BKJAddressInput', () => {
|
|
74
|
+
describe('Keyboard', () => {
|
|
75
|
+
it('combobox input is focusable when not disabled', () => {
|
|
76
|
+
renderWithTheme(_jsx(BKJAddressInput, { label: "Address", name: "address", value: "", onChange: () => { } }));
|
|
77
|
+
const input = screen.getByRole('combobox');
|
|
78
|
+
input.focus();
|
|
79
|
+
expect(input).toHaveFocus();
|
|
80
|
+
});
|
|
81
|
+
it('disabled combobox input cannot receive focus', () => {
|
|
82
|
+
renderWithTheme(_jsx(BKJAddressInput, { label: "Address", name: "address", value: "", disabled: true, onChange: () => { } }));
|
|
83
|
+
const input = screen.getByRole('combobox');
|
|
84
|
+
input.focus();
|
|
85
|
+
expect(input).not.toHaveFocus();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('Accessibility', () => {
|
|
89
|
+
it('has no accessibility violations on labelled default (idle)', async () => {
|
|
90
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(BKJAddressInput, { label: "Address", name: "address", value: "", onChange: () => { } }));
|
|
91
|
+
expect(axeResults).toHaveNoViolations();
|
|
92
|
+
});
|
|
93
|
+
// NOTE: the FR-005(b) loading-state and FR-005(c) populated-predictions
|
|
94
|
+
// axe assertions are scoped to `renderResult.container` (the component's
|
|
95
|
+
// own output), NOT `document.body`. Running axe against the full body
|
|
96
|
+
// when the dropdown is open surfaces two pre-existing defects in
|
|
97
|
+
// `BKJComboBoxAsync`'s option rendering:
|
|
98
|
+
// 1. `nested-interactive` — `<li role="option">` has focusable
|
|
99
|
+
// descendants (the inner BKJCheckbox for multi-select support).
|
|
100
|
+
// 2. `label` — the inner BKJCheckbox's explicit label is hidden and
|
|
101
|
+
// does not satisfy the accessible-name rule.
|
|
102
|
+
// FR-008 bars this ticket from editing `BKJComboBoxAsync`; a separate
|
|
103
|
+
// follow-up should remediate both in BKJComboBoxAsyncItem. In the
|
|
104
|
+
// meantime, these tests still verify axe on the input + label surface
|
|
105
|
+
// during async activity without regressing on the pre-existing upstream.
|
|
106
|
+
it('has no accessibility violations with populated predictions', async () => {
|
|
107
|
+
getQueryPredictionsMock.mockImplementation((_, callback) => {
|
|
108
|
+
callback([
|
|
109
|
+
{ place_id: 'pid-1', description: '123 Main St, Toronto' },
|
|
110
|
+
{ place_id: 'pid-2', description: '456 King St, Toronto' },
|
|
111
|
+
]);
|
|
112
|
+
});
|
|
113
|
+
jest.useFakeTimers();
|
|
114
|
+
const renderResult = renderWithTheme(_jsx(BKJAddressInput, { label: "Address", name: "address", value: "", onChange: () => { } }));
|
|
115
|
+
const input = screen.getByRole('combobox');
|
|
116
|
+
await openDropdown(input);
|
|
117
|
+
fireEvent.change(input, { target: { value: '123 Main' } });
|
|
118
|
+
act(() => {
|
|
119
|
+
jest.advanceTimersByTime(500);
|
|
120
|
+
});
|
|
121
|
+
// Switch back to real timers BEFORE axe — axe-core uses setTimeout
|
|
122
|
+
// internally for work-chunking and hangs under fake timers.
|
|
123
|
+
jest.useRealTimers();
|
|
124
|
+
const axeResults = await axe(renderResult.container);
|
|
125
|
+
expect(axeResults).toHaveNoViolations();
|
|
126
|
+
});
|
|
127
|
+
it('has no accessibility violations while predictions are loading', async () => {
|
|
128
|
+
getQueryPredictionsMock.mockImplementation(() => {
|
|
129
|
+
/* pending — callback never invoked */
|
|
130
|
+
});
|
|
131
|
+
jest.useFakeTimers();
|
|
132
|
+
const renderResult = renderWithTheme(_jsx(BKJAddressInput, { label: "Address", name: "address", value: "", onChange: () => { } }));
|
|
133
|
+
const input = screen.getByRole('combobox');
|
|
134
|
+
await openDropdown(input);
|
|
135
|
+
fireEvent.change(input, { target: { value: '123 Main' } });
|
|
136
|
+
act(() => {
|
|
137
|
+
jest.advanceTimersByTime(500);
|
|
138
|
+
});
|
|
139
|
+
expect(getQueryPredictionsMock).toHaveBeenCalledTimes(1);
|
|
140
|
+
const firstCall = getQueryPredictionsMock.mock.calls[0];
|
|
141
|
+
expect(firstCall).toBeDefined();
|
|
142
|
+
expect(firstCall[0]).toEqual({ input: '123 Main' });
|
|
143
|
+
jest.useRealTimers();
|
|
144
|
+
const axeResults = await axe(renderResult.container);
|
|
145
|
+
expect(axeResults).toHaveNoViolations();
|
|
146
|
+
});
|
|
147
|
+
it('exposes aria-busy="true" somewhere in the subtree while the predictions request is in-flight', async () => {
|
|
148
|
+
getQueryPredictionsMock.mockImplementation(() => {
|
|
149
|
+
/* pending */
|
|
150
|
+
});
|
|
151
|
+
jest.useFakeTimers();
|
|
152
|
+
try {
|
|
153
|
+
renderWithTheme(_jsx(BKJAddressInput, { label: "Address", name: "address", value: "", onChange: () => { } }));
|
|
154
|
+
const input = screen.getByRole('combobox');
|
|
155
|
+
await openDropdown(input);
|
|
156
|
+
fireEvent.change(input, { target: { value: '123 Main' } });
|
|
157
|
+
act(() => {
|
|
158
|
+
jest.advanceTimersByTime(500);
|
|
159
|
+
});
|
|
160
|
+
// FR-005a location-agnostic — WEB-4815 placed aria-busy on the
|
|
161
|
+
// portal'd listbox, so we query document.body rather than the
|
|
162
|
+
// render container. See contracts/mock-boundary.md §3.
|
|
163
|
+
expect(document.body.querySelector('[aria-busy="true"]')).not.toBeNull();
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
jest.useRealTimers();
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
it('clears aria-busy across the subtree when the predictions request completes', async () => {
|
|
170
|
+
let capturedCallback;
|
|
171
|
+
getQueryPredictionsMock.mockImplementation((_, callback) => {
|
|
172
|
+
capturedCallback = callback;
|
|
173
|
+
});
|
|
174
|
+
jest.useFakeTimers();
|
|
175
|
+
try {
|
|
176
|
+
renderWithTheme(_jsx(BKJAddressInput, { label: "Address", name: "address", value: "", onChange: () => { } }));
|
|
177
|
+
const input = screen.getByRole('combobox');
|
|
178
|
+
await openDropdown(input);
|
|
179
|
+
fireEvent.change(input, { target: { value: '123 Main' } });
|
|
180
|
+
act(() => {
|
|
181
|
+
jest.advanceTimersByTime(500);
|
|
182
|
+
});
|
|
183
|
+
expect(document.body.querySelector('[aria-busy="true"]')).not.toBeNull();
|
|
184
|
+
act(() => {
|
|
185
|
+
capturedCallback?.([
|
|
186
|
+
{ place_id: 'pid-1', description: '123 Main St, Toronto' },
|
|
187
|
+
]);
|
|
188
|
+
});
|
|
189
|
+
// Accepts both attribute-absent and aria-busy="false" shapes.
|
|
190
|
+
expect(document.body.querySelector('[aria-busy="true"]')).toBeNull();
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
jest.useRealTimers();
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=BKJAddressInput.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJAddressInput.test.js","sourceRoot":"","sources":["../../../src/components/BKJAddressInput/BKJAddressInput.test.tsx"],"names":[],"mappings":"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"}
|