(source: IContextMenuItemProps[], results: { key: string; label: JSX.Element }[][], index = 0)
| 179 | |
| 180 | // recursion |
| 181 | const dfs = (source: IContextMenuItemProps[], results: { key: string; label: JSX.Element }[][], index = 0) => { |
| 182 | if (!results[index]) { |
| 183 | results[index] = []; |
| 184 | } |
| 185 | const filterHiddenSource = source.filter((v) => !getHidden(v.hidden)); |
| 186 | for (let i = 0; i < filterHiddenSource.length; i++) { |
| 187 | const item = filterHiddenSource[i]!; |
| 188 | // filter hidden key |
| 189 | const newItem = omit(item, 'hidden'); |
| 190 | const { key, id, disabled = false, icon, label, arrow, children, groupId, extraElement, disabledTip, ...rest } = newItem; |
| 191 | const selected = paths[index] === key; |
| 192 | let isGroup = false; |
| 193 | const nextItem = filterHiddenSource[i + 1]; |
| 194 | // Whether grouping exists |
| 195 | if (groupId && nextItem && nextItem.groupId !== groupId) { |
| 196 | isGroup = true; |
| 197 | } |
| 198 | |
| 199 | const isDisabled = typeof disabled === 'function' ? disabled(getExtraInfo(extraInfo)) : disabled; |
| 200 | |
| 201 | let labelElement = ( |
| 202 | <StyledMenuItem |
| 203 | {...rest} |
| 204 | key={id || key} |
| 205 | onClick={(e) => handleClick(item, paths, e)} |
| 206 | onMouseEnter={() => handleMouseEnter(item, index)} |
| 207 | onTouchStart={() => handleMouseEnter(item, index)} |
| 208 | disabled={isDisabled} |
| 209 | isGroup={isGroup} |
| 210 | role="menuitem" |
| 211 | > |
| 212 | {icon} |
| 213 | <StyledMenuItemContent variant="body2" ellipsis> |
| 214 | {typeof label === 'function' ? label(getExtraInfo(extraInfo)) : label} |
| 215 | </StyledMenuItemContent> |
| 216 | {extraElement && <StyledMenuItemExtra>{extraElement}</StyledMenuItemExtra>} |
| 217 | {!extraElement && arrow && <StyledMenuItemArrow>{arrow}</StyledMenuItemArrow>} |
| 218 | </StyledMenuItem> |
| 219 | ); |
| 220 | |
| 221 | if (isDisabled && disabledTip) { |
| 222 | labelElement = <Tooltip content={disabledTip}>{labelElement}</Tooltip>; |
| 223 | } |
| 224 | |
| 225 | results[index]!.push({ |
| 226 | key, |
| 227 | label: labelElement, |
| 228 | }); |
| 229 | if (selected && children) { |
| 230 | dfs(children, results, index + 1); |
| 231 | } |
| 232 | } |
| 233 | }; |
| 234 | |
| 235 | // Compatible with the usage of menuId and show |
| 236 | const handler = React.useCallback( |
no test coverage detected