/
GroupHeader.tsx
113 lines (103 loc) · 3.12 KB
/
GroupHeader.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// FIXME: This is mostly a clone from https://github.com/microsoft/fluentui/blob/master/packages/office-ui-fabric-react/src/components/GroupedList/GroupHeader.base.tsx, but replaced with Ant'd Checkbox
// Drop it after https://github.com/microsoft/fluentui/issues/13144 is resolved
import React from 'react'
import {
classNamesFunction,
styled,
} from 'office-ui-fabric-react/lib/Utilities'
import {
IGroupHeaderStyleProps,
IGroupHeaderStyles,
IGroupHeaderProps,
GroupSpacer,
} from 'office-ui-fabric-react/lib/GroupedList'
import {
FocusZone,
FocusZoneDirection,
} from 'office-ui-fabric-react/lib/FocusZone'
import { getStyles } from 'office-ui-fabric-react/lib/components/GroupedList/GroupHeader.styles'
import { Icon } from 'office-ui-fabric-react/lib/Icon'
import { Checkbox } from 'antd'
import { usePersistFn } from 'ahooks'
const getClassNames = classNamesFunction<
IGroupHeaderStyleProps,
IGroupHeaderStyles
>()
function BaseAntCheckboxGroupHeader(props: IGroupHeaderProps) {
const _classNames = getClassNames(props.styles, {
theme: props.theme!,
className: props.className,
selected: props.selected,
isCollapsed: props.group?.isCollapsed,
compact: props.compact,
})
const _onHeaderClick = usePersistFn(() => {
if (props.onToggleSelectGroup) {
props.onToggleSelectGroup(props.group!)
}
})
const _onToggleSelectGroupClick = usePersistFn(
(ev: React.MouseEvent<HTMLElement>) => {
if (props.onToggleSelectGroup) {
props.onToggleSelectGroup(props.group!)
}
ev.preventDefault()
ev.stopPropagation()
}
)
const _onToggleCollapse = usePersistFn(
(ev: React.MouseEvent<HTMLElement>) => {
if (props.onToggleCollapse) {
props.onToggleCollapse(props.group!)
}
ev.stopPropagation()
ev.preventDefault()
}
)
return (
<div
className={_classNames.root}
style={props.viewport ? { minWidth: props.viewport.width } : {}}
onClick={_onHeaderClick}
>
<FocusZone
className={_classNames.groupHeaderContainer}
direction={FocusZoneDirection.horizontal}
>
<button
type="button"
className={_classNames.check}
onClick={_onToggleSelectGroupClick}
{...props.selectAllButtonProps}
>
<Checkbox checked={props.selected} />
</button>
<GroupSpacer
indentWidth={props.indentWidth}
count={props.groupLevel!}
/>
<button
type="button"
className={_classNames.expand}
onClick={_onToggleCollapse}
{...props.expandButtonProps}
>
<Icon
className={_classNames.expandIsCollapsed}
iconName={'ChevronRightMed'}
/>
</button>
<div className={_classNames.title}>
<span>{props.group?.name}</span>
</div>
</FocusZone>
</div>
)
}
export const AntCheckboxGroupHeader: React.FunctionComponent<IGroupHeaderProps> = styled<
IGroupHeaderProps,
IGroupHeaderStyleProps,
IGroupHeaderStyles
>(BaseAntCheckboxGroupHeader, getStyles, undefined, {
scope: 'GroupHeader',
})