Skip to content

Commit 8f7e5e5

Browse files
authored
Merge branch 'main' into fix_contingency_grid
2 parents 77a6a80 + e29530a commit 8f7e5e5

12 files changed

+156
-67
lines changed

demo/src/app.jsx

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -569,11 +569,12 @@ function AppContent({ language, onLanguageClick }) {
569569
},
570570
]);
571571

572-
const secondaryAction = () => (
573-
<IconButton aria-label="comment">
574-
<CommentIcon />
575-
</IconButton>
576-
);
572+
const secondaryAction = (item, isItemHovered) =>
573+
isItemHovered && (
574+
<IconButton aria-label="comment">
575+
<CommentIcon />
576+
</IconButton>
577+
);
577578
const defaultTab = (
578579
<div>
579580
<Box mt={3}>
@@ -613,8 +614,6 @@ function AppContent({ language, onLanguageClick }) {
613614
divider
614615
secondaryAction={secondaryAction}
615616
addSelectAllCheckbox
616-
isCheckboxClickableOnly
617-
enableSecondaryActionOnHover
618617
/>
619618

620619
<Button
@@ -639,7 +638,6 @@ function AppContent({ language, onLanguageClick }) {
639638
divider
640639
secondaryAction={secondaryAction}
641640
isDndDragAndDropActive
642-
enableSecondaryActionOnHover
643641
onDragEnd={({ source, destination }) => {
644642
if (destination !== null && source.index !== destination.index) {
645643
const res = [...checkBoxListOption];
@@ -648,6 +646,15 @@ function AppContent({ language, onLanguageClick }) {
648646
setCheckBoxListOption(res);
649647
}
650648
}}
649+
onItemClick={(item) => console.log('clicked', item)}
650+
isItemClickable={(item) => item.id.indexOf('i') >= 0}
651+
sx={{
652+
items: (item) => ({
653+
label: {
654+
color: item.id.indexOf('i') >= 0 ? 'blue' : 'red',
655+
},
656+
}),
657+
}}
651658
/>
652659
<div
653660
style={{

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gridsuite/commons-ui",
3-
"version": "0.65.1",
3+
"version": "0.65.2",
44
"description": "common react components for gridsuite applications",
55
"engines": {
66
"npm": ">=9",

src/components/checkBoxList/CheckBoxListItem.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,31 @@ export function CheckBoxListItem<T>({
1717
secondaryAction,
1818
getItemId,
1919
divider,
20-
isCheckboxClickableOnly,
20+
onItemClick,
21+
isItemClickable,
2122
...props
22-
}: CheckBoxListItemProps<T>) {
23+
}: Readonly<CheckBoxListItemProps<T>>) {
2324
const [hover, setHover] = useState<string>('');
2425
return (
2526
<ListItem
2627
secondaryAction={secondaryAction?.(item, hover)}
2728
sx={{ minWidth: 0, ...sx?.checkboxListItem }}
2829
onMouseEnter={() => setHover(getItemId(item))}
2930
onMouseLeave={() => setHover('')}
30-
disablePadding={!isCheckboxClickableOnly}
31+
disablePadding={!!onItemClick}
3132
disableGutters
3233
divider={divider}
3334
>
34-
{isCheckboxClickableOnly ? <ClickableCheckBoxItem {...props} /> : <ClickableRowItem {...props} />}
35+
{!onItemClick ? (
36+
<ClickableCheckBoxItem sx={sx} {...props} />
37+
) : (
38+
<ClickableRowItem
39+
isItemClickable={isItemClickable?.(item)}
40+
onItemClick={() => onItemClick(item)}
41+
sx={sx}
42+
{...props}
43+
/>
44+
)}
3545
</ListItem>
3646
);
3747
}

src/components/checkBoxList/CheckBoxListItems.tsx

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ export function CheckBoxListItems<T>({
2121
getItemId,
2222
sx,
2323
secondaryAction,
24-
enableSecondaryActionOnHover,
2524
addSelectAllCheckbox,
2625
selectAllCheckBoxLabel,
2726
getItemLabel,
2827
isDisabled,
2928
isDndDragAndDropActive,
3029
isDragDisable,
3130
divider,
32-
isCheckboxClickableOnly,
31+
onItemClick,
32+
isItemClickable,
3333
...props
34-
}: CheckBoxListItemsProps<T>) {
34+
}: Readonly<CheckBoxListItemsProps<T>>) {
3535
const handleOnchange = useCallback(
3636
(newValues: T[]) => {
3737
if (onSelectionChange) {
@@ -77,16 +77,8 @@ export function CheckBoxListItems<T>({
7777
if (!secondaryAction) {
7878
return null;
7979
}
80-
81-
if (!enableSecondaryActionOnHover) {
82-
return secondaryAction(item);
83-
}
84-
85-
if (hover === getItemId(item)) {
86-
return secondaryAction(item);
87-
}
88-
89-
return null;
80+
const isItemHovered = hover === getItemId(item);
81+
return secondaryAction(item, isItemHovered);
9082
};
9183

9284
const selectAllLabel = useMemo(
@@ -126,6 +118,8 @@ export function CheckBoxListItems<T>({
126118
const label = getItemLabel ? getItemLabel(item) : getItemId(item);
127119
const disabled = isDisabled ? isDisabled(item) : false;
128120
const addDivider = divider && index < items.length - 1;
121+
// sx can be dependent on item or not
122+
const calculatedItemSx = typeof sx?.items === 'function' ? sx?.items(item) : sx?.items;
129123

130124
if (isDndDragAndDropActive) {
131125
return (
@@ -142,14 +136,15 @@ export function CheckBoxListItems<T>({
142136
checked={isChecked(item)}
143137
label={label}
144138
onClick={() => toggleSelection(getItemId(item))}
145-
sx={sx}
139+
sx={calculatedItemSx}
146140
disabled={disabled}
147141
getItemId={getItemId}
148142
secondaryAction={handleSecondaryAction}
149143
isDragDisable={isDragDisable}
150144
provided={provided}
151145
divider={addDivider}
152-
isCheckboxClickableOnly={isCheckboxClickableOnly}
146+
onItemClick={onItemClick}
147+
isItemClickable={isItemClickable}
153148
/>
154149
)}
155150
</Draggable>
@@ -164,10 +159,11 @@ export function CheckBoxListItems<T>({
164159
onClick={() => toggleSelection(getItemId(item))}
165160
disabled={disabled}
166161
getItemId={getItemId}
167-
sx={sx}
162+
sx={calculatedItemSx}
168163
secondaryAction={handleSecondaryAction}
169164
divider={addDivider}
170-
isCheckboxClickableOnly={isCheckboxClickableOnly}
165+
onItemClick={onItemClick}
166+
isItemClickable={isItemClickable}
171167
/>
172168
);
173169
})}

src/components/checkBoxList/ClickableCheckBoxItem.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
*/
77
import { Checkbox, ListItemIcon, ListItemText } from '@mui/material';
88
import OverflowableText from '../overflowableText';
9-
import { ClickableItemProps } from './checkBoxList.type';
9+
import { ClickableCheckBoxItemProps } from './checkBoxList.type';
1010

11-
export function ClickableCheckBoxItem({ sx, label, ...props }: ClickableItemProps) {
11+
export function ClickableCheckBoxItem({ sx, label, ...props }: ClickableCheckBoxItemProps) {
1212
return (
1313
<>
1414
<ListItemIcon sx={{ minWidth: 0, ...sx?.checkBoxIcon }}>

src/components/checkBoxList/ClickableRowItem.tsx

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,42 @@
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
*/
77
import { Checkbox, ListItemButton, ListItemIcon, ListItemText } from '@mui/material';
8+
import { ClickableRowItemProps } from './checkBoxList.type';
89
import OverflowableText from '../overflowableText';
9-
import { ClickableItemProps } from './checkBoxList.type';
1010

11-
export function ClickableRowItem({ sx, disabled, label, onClick, ...props }: ClickableItemProps) {
11+
const styles = {
12+
unclickableItem: {
13+
'&:hover': {
14+
backgroundColor: 'transparent',
15+
},
16+
cursor: 'inherit',
17+
},
18+
};
19+
20+
export function ClickableRowItem({
21+
sx,
22+
disabled,
23+
label,
24+
onClick,
25+
onItemClick,
26+
isItemClickable = true,
27+
...props
28+
}: Readonly<ClickableRowItemProps>) {
29+
const onCheckboxClick = (event: React.MouseEvent<HTMLButtonElement>) => {
30+
event.stopPropagation();
31+
onClick();
32+
};
33+
const handleItemClick = () => isItemClickable && onItemClick();
34+
1235
return (
13-
<ListItemButton sx={{ paddingLeft: 0, ...sx?.checkboxButton }} disabled={disabled} onClick={onClick}>
36+
<ListItemButton
37+
disableTouchRipple={!isItemClickable}
38+
sx={{ paddingLeft: 0, ...sx?.checkboxButton, ...(!isItemClickable && styles.unclickableItem) }}
39+
disabled={disabled}
40+
onClick={handleItemClick}
41+
>
1442
<ListItemIcon sx={{ minWidth: 0, ...sx?.checkBoxIcon }}>
15-
<Checkbox disableRipple sx={{ paddingLeft: 0, ...sx?.checkbox }} {...props} />
43+
<Checkbox disableRipple sx={{ paddingLeft: 0, ...sx?.checkbox }} onClick={onCheckboxClick} {...props} />
1644
</ListItemIcon>
1745
<ListItemText
1846
sx={{

src/components/checkBoxList/DraggableCheckBoxListItem.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,37 @@ export function DraggableCheckBoxListItem<T>({
1919
isDragDisable,
2020
provided,
2121
divider,
22-
isCheckboxClickableOnly,
22+
onItemClick,
23+
isItemClickable,
2324
...props
24-
}: DraggableCheckBoxListItemProps<T>) {
25+
}: Readonly<DraggableCheckBoxListItemProps<T>>) {
2526
const [hover, setHover] = useState<string>('');
2627
return (
2728
<ListItem
2829
secondaryAction={secondaryAction?.(item, hover)}
2930
sx={{ minWidth: 0, ...sx?.checkboxListItem }}
3031
onMouseEnter={() => setHover(getItemId(item))}
3132
onMouseLeave={() => setHover('')}
32-
disablePadding={!isCheckboxClickableOnly}
33+
disablePadding={!!onItemClick}
3334
disableGutters
3435
divider={divider}
3536
ref={provided.innerRef}
3637
{...provided.draggableProps}
3738
>
38-
{isCheckboxClickableOnly ? (
39+
{!onItemClick ? (
3940
<DraggableClickableCheckBoxItem
4041
provided={provided}
4142
isHighlighted={hover === getItemId(item) && !isDragDisable}
43+
sx={sx}
4244
{...props}
4345
/>
4446
) : (
4547
<DraggableClickableRowItem
4648
provided={provided}
4749
isHighlighted={hover === getItemId(item) && !isDragDisable}
50+
onItemClick={() => onItemClick(item)}
51+
isItemClickable={isItemClickable?.(item)}
52+
sx={sx}
4853
{...props}
4954
/>
5055
)}

src/components/checkBoxList/DraggableClickableCheckBoxItem.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import { Checkbox, IconButton, ListItemIcon, ListItemText } from '@mui/material';
99
import DragIndicatorIcon from '@mui/icons-material/DragIndicator';
1010
import OverflowableText from '../overflowableText';
11-
import { DraggableClickableItemProps } from './checkBoxList.type';
11+
import { DraggableClickableCheckBoxItemProps } from './checkBoxList.type';
1212

1313
const styles = {
1414
dragIcon: (theme: any) => ({
@@ -26,7 +26,7 @@ export function DraggableClickableCheckBoxItem({
2626
isHighlighted,
2727
label,
2828
...props
29-
}: DraggableClickableItemProps) {
29+
}: Readonly<DraggableClickableCheckBoxItemProps>) {
3030
return (
3131
<>
3232
<IconButton

src/components/checkBoxList/DraggableClickableRowItem.tsx

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
import { Checkbox, IconButton, ListItemButton, ListItemIcon, ListItemText } from '@mui/material';
99
import DragIndicatorIcon from '@mui/icons-material/DragIndicator';
10+
import { DraggableClickableRowItemProps } from './checkBoxList.type';
1011
import OverflowableText from '../overflowableText';
11-
import { DraggableClickableItemProps } from './checkBoxList.type';
1212

1313
const styles = {
1414
dragIcon: (theme: any) => ({
@@ -17,6 +17,12 @@ const styles = {
1717
borderRadius: theme.spacing(0),
1818
zIndex: 90,
1919
}),
20+
unclickableItem: {
21+
'&:hover': {
22+
backgroundColor: 'transparent',
23+
},
24+
cursor: 'inherit',
25+
},
2026
};
2127

2228
export function DraggableClickableRowItem({
@@ -26,10 +32,27 @@ export function DraggableClickableRowItem({
2632
provided,
2733
isHighlighted,
2834
label,
35+
onItemClick,
36+
isItemClickable = true,
2937
...props
30-
}: DraggableClickableItemProps) {
38+
}: Readonly<DraggableClickableRowItemProps>) {
39+
const onCheckboxClick = (event: React.MouseEvent<HTMLButtonElement>) => {
40+
event.stopPropagation();
41+
onClick();
42+
};
43+
const handleItemClick = () => isItemClickable && onItemClick();
44+
3145
return (
32-
<ListItemButton sx={{ paddingLeft: 0, ...sx?.checkboxButton }} disabled={disabled} onClick={onClick}>
46+
<ListItemButton
47+
disableTouchRipple={!isItemClickable}
48+
sx={{
49+
paddingLeft: 0,
50+
...sx?.checkboxButton,
51+
...(!isItemClickable && styles.unclickableItem),
52+
}}
53+
disabled={disabled}
54+
onClick={handleItemClick}
55+
>
3356
<IconButton
3457
{...provided.dragHandleProps}
3558
size="small"
@@ -42,7 +65,7 @@ export function DraggableClickableRowItem({
4265
<DragIndicatorIcon spacing={0} />
4366
</IconButton>
4467
<ListItemIcon sx={{ minWidth: 0, ...sx?.checkBoxIcon }}>
45-
<Checkbox disableRipple sx={{ paddingLeft: 0, ...sx?.checkbox }} {...props} />
68+
<Checkbox disableRipple sx={{ paddingLeft: 0, ...sx?.checkbox }} onClick={onCheckboxClick} {...props} />
4669
</ListItemIcon>
4770
<ListItemText
4871
sx={{

0 commit comments

Comments
 (0)