MCPcopy Create free account
hub / github.com/apitable/apitable / dfs

Function dfs

packages/components/src/components/context_menu/context_menu.tsx:181–233  ·  view source on GitHub ↗
(source: IContextMenuItemProps[], results: { key: string; label: JSX.Element }[][], index = 0)

Source from the content-addressed store, hash-verified

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(

Callers 1

renderChildrenFunction · 0.70

Calls 5

getExtraInfoFunction · 0.85
handleClickFunction · 0.70
handleMouseEnterFunction · 0.70
filterMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected