Skip to content

Commit c39e999

Browse files
committed
Add PicklistMenuItem: reduces duplicate code
Fix issue with PicklistCreationMenuItem being incorrectly disabled when acting as a button
1 parent 98e6619 commit c39e999

3 files changed

Lines changed: 33 additions & 49 deletions

File tree

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

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
import React, { FC, memo, useCallback } from 'react';
22

33
import { userCanManagePicklists } from '../../app/utils';
4-
import { DisableableMenuItem } from '../samples/DisableableMenuItem';
54

65
import { User } from '../base/models/User';
76

87
import { PicklistEditModal } from './PicklistEditModal';
98
import { ChoosePicklistModal } from './ChoosePicklistModal';
10-
import { MAX_SELECTIONS_MESSAGE, MAX_SELECTIONS_PER_ADD } from './constants';
119
import { useModalState } from '../../hooks';
1210
import { SchemaQuery } from '../../../public/SchemaQuery';
11+
import { PicklistMenuItem } from './PicklistMenuItem';
1312

1413
interface Props {
1514
metricFeatureArea?: string;
@@ -32,24 +31,11 @@ export const AddToPicklistMenuItem: FC<Props> = memo(props => {
3231
[closeChoose, openCreate]
3332
);
3433

35-
if (!userCanManagePicklists(user)) {
36-
return null;
37-
}
38-
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-
}
34+
if (!userCanManagePicklists(user)) return null;
4735

4836
return (
4937
<>
50-
<DisableableMenuItem disabled={disabled} disabledMessage={disabledMessage} onClick={openChoose} placement="right">
51-
Add to Picklist
52-
</DisableableMenuItem>
38+
<PicklistMenuItem itemText="Add to Picklist" open={openChoose} selectedRowIds={selectedRowIds} />
5339

5440
{showChoose && (
5541
<ChoosePicklistModal

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

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@ import { userCanManagePicklists } from '../../app/utils';
44

55
import { User } from '../base/models/User';
66

7-
import { DisableableMenuItem } from '../samples/DisableableMenuItem';
8-
97
import { PicklistEditModal, PicklistEditModalProps } from './PicklistEditModal';
10-
import { MAX_SELECTIONS_MESSAGE, MAX_SELECTIONS_PER_ADD } from './constants';
118
import { useModalState } from '../../hooks';
9+
import { PicklistMenuItem } from './PicklistMenuItem';
1210

1311
interface Props extends Omit<PicklistEditModalProps, 'onCancel' | 'onFinish' | 'showNotification'> {
1412
asMenuItem?: boolean;
@@ -34,39 +32,13 @@ export const PicklistCreationMenuItem: FC<Props> = props => {
3432
onCreatePicklist?.();
3533
}, [close, onCreatePicklist]);
3634

37-
if (!userCanManagePicklists(user)) {
38-
return null;
39-
}
40-
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-
}
35+
if (!userCanManagePicklists(user)) return null;
4936

5037
return (
5138
<>
52-
{asMenuItem && (
53-
<DisableableMenuItem
54-
disabled={disabled}
55-
disabledMessage={disabledMessage}
56-
onClick={open}
57-
placement="right"
58-
>
59-
{itemText}
60-
</DisableableMenuItem>
61-
)}
39+
{asMenuItem && <PicklistMenuItem itemText={itemText} open={open} selectedRowIds={selectedRowIds} />}
6240
{!asMenuItem && (
63-
<button
64-
className="btn btn-success"
65-
disabled={disabled}
66-
onClick={open}
67-
title={disabledMessage}
68-
type="button"
69-
>
41+
<button className="btn btn-success" onClick={open} type="button">
7042
{itemText}
7143
</button>
7244
)}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React, { FC, memo } from 'react';
2+
import { MAX_SELECTIONS_MESSAGE, MAX_SELECTIONS_PER_ADD } from './constants';
3+
import { DisableableMenuItem } from '../samples/DisableableMenuItem';
4+
5+
interface Props {
6+
itemText: string;
7+
open: () => void;
8+
selectedRowIds: number[] | string[];
9+
}
10+
export const PicklistMenuItem: FC<Props> = memo(({ itemText, open, selectedRowIds }) => {
11+
const disabled = !selectedRowIds || selectedRowIds.length === 0 || selectedRowIds.length > MAX_SELECTIONS_PER_ADD;
12+
let disabledMessage: string;
13+
14+
if (!selectedRowIds || selectedRowIds.length === 0) {
15+
disabledMessage = 'Select one or more samples.';
16+
} else if (selectedRowIds.length > MAX_SELECTIONS_PER_ADD) {
17+
disabledMessage = MAX_SELECTIONS_MESSAGE;
18+
}
19+
20+
return (
21+
<DisableableMenuItem disabled={disabled} disabledMessage={disabledMessage} onClick={open} placement="right">
22+
{itemText}
23+
</DisableableMenuItem>
24+
);
25+
});
26+
PicklistMenuItem.displayName = 'PicklistMenuItem';

0 commit comments

Comments
 (0)