Skip to content

Commit ee23a37

Browse files
committed
AddToPicklistMenuItem / PicklistCreationMenuItem: Disable when there are no selected rows
1 parent 5a86587 commit ee23a37

3 files changed

Lines changed: 37 additions & 66 deletions

File tree

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

Lines changed: 11 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -23,42 +23,12 @@ jest.mock('../../query/api', () => ({
2323
}));
2424

2525
describe('AddToPicklistMenuItem', () => {
26-
const expectedText = 'Add to Picklist';
27-
const queryModelWithoutSelections = makeTestQueryModel(new SchemaQuery('test', 'query'));
28-
let queryModelWithSelections = makeTestQueryModel(new SchemaQuery('test', 'query'));
29-
queryModelWithSelections = queryModelWithSelections.mutate({
30-
rowCount: 2,
31-
selections: new Set(['1', '2']),
32-
});
33-
34-
test('with queryModel', async () => {
35-
renderWithAppContext(<AddToPicklistMenuItem queryModel={queryModelWithSelections} user={TEST_USER_EDITOR} />);
36-
const menuItem = document.querySelectorAll('.lk-menu-item');
37-
expect(menuItem).toHaveLength(1);
38-
expect(menuItem[0]).toHaveTextContent(expectedText);
39-
40-
await validateMenuItemClick(true);
41-
const picklistModal = document.querySelectorAll('.modal');
42-
expect(picklistModal).toHaveLength(1);
43-
expect(document.querySelector('.alert-info')).toHaveTextContent('Adding 2 samples to selected picklist.');
44-
});
26+
const schemaQuery = new SchemaQuery('test', 'query');
4527

46-
test('with selectedIds', async () => {
28+
test('not Editor', () => {
4729
renderWithAppContext(
48-
<AddToPicklistMenuItem queryModel={queryModelWithoutSelections} sampleIds={[1]} user={TEST_USER_EDITOR} />
30+
<AddToPicklistMenuItem schemaQuery={schemaQuery} selectedRowIds={['1', '2']} user={TEST_USER_READER} />
4931
);
50-
const menuItem = document.querySelectorAll('.lk-menu-item');
51-
expect(menuItem).toHaveLength(1);
52-
expect(menuItem[0]).toHaveTextContent(expectedText);
53-
54-
await validateMenuItemClick(true);
55-
const picklistModal = document.querySelectorAll('.modal');
56-
expect(picklistModal).toHaveLength(1);
57-
expect(document.querySelector('.alert-info')).toHaveTextContent('Adding 1 sample to selected picklist.');
58-
});
59-
60-
test('not Editor', () => {
61-
renderWithAppContext(<AddToPicklistMenuItem sampleIds={[1]} user={TEST_USER_READER} />);
6232
expect(document.querySelectorAll('.lk-menu-item')).toHaveLength(0);
6333
});
6434

@@ -73,37 +43,22 @@ describe('AddToPicklistMenuItem', () => {
7343
});
7444
}
7545

76-
test('modal open on click, queryModel without selections', async () => {
46+
test('modal opens when there are selectedRowIds', async () => {
7747
renderWithAppContext(
78-
<AddToPicklistMenuItem queryModel={queryModelWithoutSelections} user={TEST_USER_EDITOR} />
48+
<AddToPicklistMenuItem schemaQuery={schemaQuery} selectedRowIds={[1]} user={TEST_USER_EDITOR} />
7949
);
80-
await validateMenuItemClick(false);
81-
});
82-
83-
test('modal open on click, queryModel with selections', async () => {
84-
renderWithAppContext(<AddToPicklistMenuItem queryModel={queryModelWithSelections} user={TEST_USER_EDITOR} />);
8550
await validateMenuItemClick(true);
8651
});
8752

88-
test('modal open on click, sampleIds', async () => {
53+
test('modal does not open when there are no selectedRowIds', async () => {
8954
renderWithAppContext(
90-
<AddToPicklistMenuItem queryModel={queryModelWithoutSelections} sampleIds={[1]} user={TEST_USER_EDITOR} />
55+
<AddToPicklistMenuItem schemaQuery={schemaQuery} selectedRowIds={[]} user={TEST_USER_EDITOR} />
9156
);
92-
await validateMenuItemClick(true);
57+
await validateMenuItemClick(false);
9358
});
9459

95-
test('sample with status', async () => {
96-
let model = makeTestQueryModel(new SchemaQuery('test', 'query'));
97-
model = model.mutate({
98-
rows: {
99-
'1': {
100-
RowId: { value: 1 },
101-
[SAMPLE_STATE_TYPE_COLUMN_NAME]: { value: 'Locked' },
102-
},
103-
},
104-
orderedRows: ['1'],
105-
});
106-
renderWithAppContext(<AddToPicklistMenuItem queryModel={model} sampleIds={[1]} user={TEST_USER_EDITOR} />);
107-
await validateMenuItemClick(true);
60+
test('modal does not open when selectedRowIds is undefined', async () => {
61+
renderWithAppContext(<AddToPicklistMenuItem schemaQuery={schemaQuery} user={TEST_USER_EDITOR} />);
62+
await validateMenuItemClick(false);
10863
});
10964
});

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,18 @@ export const AddToPicklistMenuItem: FC<Props> = memo(props => {
3636
return null;
3737
}
3838

39+
const disabled = !selectedRowIds || selectedRowIds.length === 0 || selectedRowIds.length > MAX_SELECTIONS_PER_ADD;
40+
let disabledMessage: string;
41+
42+
if (!selectedRowIds || selectedRowIds.length === 0) {
43+
disabledMessage = 'Select one or more samples.';
44+
} else if (selectedRowIds.length > MAX_SELECTIONS_PER_ADD) {
45+
disabledMessage = MAX_SELECTIONS_MESSAGE;
46+
}
47+
3948
return (
4049
<>
41-
<DisableableMenuItem
42-
disabled={selectedRowIds?.length > MAX_SELECTIONS_PER_ADD}
43-
disabledMessage={MAX_SELECTIONS_MESSAGE}
44-
onClick={openChoose}
45-
>
50+
<DisableableMenuItem disabled={disabled} disabledMessage={disabledMessage} onClick={openChoose} placement="right">
4651
Add to Picklist
4752
</DisableableMenuItem>
4853

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

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,22 +38,33 @@ export const PicklistCreationMenuItem: FC<Props> = props => {
3838
return null;
3939
}
4040

41-
const numSamples = selectedRowIds?.length ?? 0;
42-
const excessSamples = numSamples > MAX_SELECTIONS_PER_ADD;
41+
const disabled = !selectedRowIds || selectedRowIds.length === 0 || selectedRowIds.length > MAX_SELECTIONS_PER_ADD;
42+
let disabledMessage: string;
43+
44+
if (!selectedRowIds || selectedRowIds.length === 0) {
45+
disabledMessage = 'Select one or more samples.';
46+
} else if (selectedRowIds.length > MAX_SELECTIONS_PER_ADD) {
47+
disabledMessage = MAX_SELECTIONS_MESSAGE;
48+
}
4349

4450
return (
4551
<>
4652
{asMenuItem && (
47-
<DisableableMenuItem disabled={excessSamples} disabledMessage={MAX_SELECTIONS_MESSAGE} onClick={open}>
53+
<DisableableMenuItem
54+
disabled={disabled}
55+
disabledMessage={disabledMessage}
56+
onClick={open}
57+
placement="right"
58+
>
4859
{itemText}
4960
</DisableableMenuItem>
5061
)}
5162
{!asMenuItem && (
5263
<button
5364
className="btn btn-success"
54-
disabled={excessSamples}
65+
disabled={disabled}
5566
onClick={open}
56-
title={excessSamples ? MAX_SELECTIONS_MESSAGE : undefined}
67+
title={disabledMessage}
5768
type="button"
5869
>
5970
{itemText}

0 commit comments

Comments
 (0)