Skip to content

Commit bc40a66

Browse files
committed
PicklistEditModal: Fix issue with updating picklist, add error handling
Fix tests
1 parent aa871b5 commit bc40a66

2 files changed

Lines changed: 48 additions & 48 deletions

File tree

packages/components/src/internal/components/picklist/PicklistEditModal.test.tsx

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,34 @@ import { PRIVATE_PICKLIST_CATEGORY, PUBLIC_PICKLIST_CATEGORY } from './constants
1010

1111
import { PicklistEditModal, PicklistEditModalProps } from './PicklistEditModal';
1212
import { Picklist } from './models';
13+
import { waitFor } from '@testing-library/dom';
1314

1415
describe('PicklistEditModal', () => {
15-
const queryModel = makeTestQueryModel(new SchemaQuery('test', 'query'));
16-
1716
function defaultProps(): PicklistEditModalProps {
1817
return {
1918
onCancel: jest.fn(),
2019
onFinish: jest.fn(),
2120
};
2221
}
2322

24-
function validateText(expectedTitle: string, expectedFinishText: string): void {
23+
async function waitForLoaded() {
24+
await waitFor(() => {
25+
expect(document.querySelector('.fa-pulse')).not.toBeInTheDocument();
26+
});
27+
}
28+
29+
async function validateText(expectedTitle: string, expectedFinishText: string): Promise<void> {
30+
await waitForLoaded();
2531
const title = document.querySelector('.modal-title');
2632
expect(title.textContent).toBe(expectedTitle);
2733
const buttons = document.querySelectorAll('.modal-footer .btn');
2834
expect(buttons).toHaveLength(2);
2935
expect(buttons[1].textContent).toBe(expectedFinishText);
3036
}
3137

32-
test('create empty picklist', () => {
33-
renderWithAppContext(<PicklistEditModal onCancel={jest.fn()} onFinish={jest.fn()} />);
34-
validateText('Create an Empty Picklist', 'Create Picklist');
38+
test('create empty picklist', async () => {
39+
renderWithAppContext(<PicklistEditModal {...defaultProps()} />);
40+
await validateText('Create an Empty Picklist', 'Create Picklist');
3541

3642
const labels = document.querySelectorAll('label');
3743
expect(labels).toHaveLength(3);
@@ -45,46 +51,24 @@ describe('PicklistEditModal', () => {
4551
expect(inputs[1].checked).toBe(false);
4652
});
4753

48-
test('create picklist from multiple selections', () => {
49-
renderWithAppContext(
50-
<PicklistEditModal
51-
{...defaultProps()}
52-
queryModel={queryModel.mutate({ selections: new Set(['1', '2']) })}
53-
/>
54-
);
55-
validateText('Create a New Picklist with the 2 Selected Samples', 'Create Picklist');
56-
});
57-
58-
test('create picklist from one selection', () => {
59-
renderWithAppContext(
60-
<PicklistEditModal {...defaultProps()} queryModel={queryModel.mutate({ selections: new Set(['1']) })} />
61-
);
62-
validateText('Create a New Picklist with the 1 Selected Sample', 'Create Picklist');
63-
});
64-
65-
test('create empty picklist from sampleIds', () => {
66-
renderWithAppContext(<PicklistEditModal {...defaultProps()} sampleIds={[]} />);
67-
validateText('Create an Empty Picklist', 'Create Picklist');
68-
});
69-
70-
test('create picklist from one sampleId', () => {
71-
renderWithAppContext(<PicklistEditModal {...defaultProps()} sampleIds={['1']} />);
72-
validateText('Create a New Picklist with This Sample', 'Create Picklist');
54+
test('create picklist from multiple selections', async () => {
55+
renderWithAppContext(<PicklistEditModal {...defaultProps()} selectedRowIds={['1', '2']} />);
56+
await validateText('Create a New Picklist with the 2 Selected Samples', 'Create Picklist');
7357
});
7458

75-
test('create picklist from multiple sampleIds', () => {
76-
renderWithAppContext(<PicklistEditModal {...defaultProps()} sampleIds={['1', '2']} />);
77-
validateText('Create a New Picklist with These Samples', 'Create Picklist');
59+
test('create picklist from one selection', async () => {
60+
renderWithAppContext(<PicklistEditModal {...defaultProps()} selectedRowIds={['1']} />);
61+
await validateText('Create a New Picklist with This Sample', 'Create Picklist');
7862
});
7963

80-
test('Update private picklist', () => {
64+
test('Update private picklist', async () => {
8165
const existingList = new Picklist({
8266
Category: PRIVATE_PICKLIST_CATEGORY,
8367
name: 'Existing list',
8468
Description: 'My test description',
8569
});
8670
renderWithAppContext(<PicklistEditModal {...defaultProps()} picklist={existingList} />);
87-
validateText('Update Picklist Data', 'Update Picklist');
71+
await validateText('Update Picklist Data', 'Update Picklist');
8872

8973
const labels = document.querySelectorAll('label');
9074
expect(labels).toHaveLength(3);
@@ -101,13 +85,14 @@ describe('PicklistEditModal', () => {
10185
expect(textarea.value).toBe(existingList.Description);
10286
});
10387

104-
test('Update public picklist', () => {
88+
test('Update public picklist', async () => {
10589
const existingList = new Picklist({
10690
Category: PUBLIC_PICKLIST_CATEGORY,
10791
name: 'Existing list',
10892
Description: 'My test description',
10993
});
11094
renderWithAppContext(<PicklistEditModal {...defaultProps()} picklist={existingList} />);
95+
await waitForLoaded();
11196
const inputs = document.querySelectorAll('input');
11297
expect(inputs).toHaveLength(2);
11398
expect(inputs[1].checked).toBe(true);

packages/components/src/internal/components/picklist/PicklistEditModal.tsx

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { createPicklist, updatePicklist } from './actions';
1515
import { PRIVATE_PICKLIST_CATEGORY, PUBLIC_PICKLIST_CATEGORY } from './constants';
1616
import { SchemaQuery } from '../../../public/SchemaQuery';
1717
import { useSampleSelections } from './usePIcklistSelections';
18+
import { isLoading } from '../../../public/LoadingState';
19+
import { LoadingSpinner } from '../base/LoadingSpinner';
1820

1921
export interface SharedProps {
2022
metricFeatureArea?: string;
@@ -28,7 +30,7 @@ export interface ModalProps extends SharedProps {
2830
sampleIds: number[];
2931
}
3032

31-
const PicklistEditModalDisplay: FC<ModalProps> = memo(props => {
33+
export const PicklistEditModalDisplay: FC<ModalProps> = memo(props => {
3234
const { onCancel, onFinish, sampleIds, picklist, showNotification, metricFeatureArea } = props;
3335
const [name, setName] = useState<string>(picklist?.name ?? '');
3436
const onNameChange = useCallback((evt: ChangeEvent<HTMLInputElement>) => setName(evt.target.value), []);
@@ -173,27 +175,40 @@ export interface PicklistEditModalProps extends SharedProps {
173175
// If sampleFieldKey is present the modal queries the rowIds in order to fetch sampleIds via sampleFieldKey
174176
sampleFieldKey?: string;
175177
schemaQuery?: SchemaQuery;
176-
// The exported modal component accepts a generic rowIds prop and optionally converts those rowIds to sampleIds
177178
selectedRowIds?: number[] | string[];
178179
}
179180

180181
export const PicklistEditModal: FC<PicklistEditModalProps> = memo(props => {
181-
const { metricFeatureArea, onCancel, onFinish, sampleFieldKey, schemaQuery, selectedRowIds, showNotification } =
182-
props;
183-
184182
const {
185-
error: sampleIdsError,
186-
loadingState: sampleIdsLoadingState,
187-
value: sampleIds,
188-
} = useSampleSelections(selectedRowIds, sampleFieldKey, schemaQuery);
189-
190-
// TODO: Need some error handling
183+
metricFeatureArea,
184+
onCancel,
185+
onFinish,
186+
picklist,
187+
sampleFieldKey,
188+
schemaQuery,
189+
selectedRowIds,
190+
showNotification,
191+
} = props;
192+
193+
const { error, loadingState, value: sampleIds } = useSampleSelections(selectedRowIds, sampleFieldKey, schemaQuery);
194+
const loading = isLoading(loadingState);
195+
196+
if (loading || error !== undefined) {
197+
const title = loading ? 'Loading Selection Data' : 'Error Loading Selection Data';
198+
return (
199+
<Modal cancelText="Dismiss" onCancel={onCancel} title={title}>
200+
{loading && <LoadingSpinner />}
201+
{error}
202+
</Modal>
203+
);
204+
}
191205

192206
return (
193207
<PicklistEditModalDisplay
194208
metricFeatureArea={metricFeatureArea}
195209
onCancel={onCancel}
196210
onFinish={onFinish}
211+
picklist={picklist}
197212
sampleIds={sampleIds}
198213
showNotification={showNotification}
199214
/>

0 commit comments

Comments
 (0)