export default function parseItem()

in packages-rc/console-base-rc-aside-nav/src/model/util/parse-item.ts [26:107]


export default function parseItem(o: TNavItem, options: IParseOptions): TParsedItemOrDivider | null {
  if (!o) {
    return null;
  }
  
  const {
    defaultUnfolded,
    filterValue,
    // onItemClick,
    parentCheckResult,
    indexes,
    indent = 0
  } = options;
  
  if (o === '-') {
    return createDividerItem(indexes, indent);
  }
  
  // 如果父级命中过滤,则子项全部命中
  const checkResult = parentCheckResult === ECheckFilterResult.YES ? ECheckFilterResult.YES : checkAgainstFilterValue(o, filterValue);
  
  if (checkResult === ECheckFilterResult.NO) {
    return null;
  }
  
  const itemParsed: IParsedItem = {
    ...o,
    key: getItemKey(o),
    props: o,
    divider: undefined,
    mark: getItemMark(o),
    indent,
    subItems: o.subItems?.reduce((result: TParsedItemOrDivider[], v, i) => {
      const o2 = parseItem(v, {
        defaultUnfolded,
        filterValue,
        parentCheckResult: checkResult,
        indexes: [...indexes, i],
        indent: indent + 1
      });
      
      if (o2) {
        result.push(o2);
      }
      
      return result;
    }, []) || []
  };
  
  // 有子菜单项,判断需子菜单的展开行为
  if (itemParsed.subItems.length) {
    if (filterValue) {
      itemParsed.defaultUnfolded = true;
    } else {
      switch (defaultUnfolded) {
        case true:
          itemParsed.defaultUnfolded = itemParsed.defaultUnfolded ?? true;
          
          break;
        case false:
          itemParsed.defaultUnfolded = itemParsed.defaultUnfolded ?? false;
          
          break;
        case 'first-level':
          itemParsed.defaultUnfolded = itemParsed.defaultUnfolded ?? indent < 1;
          
          break;
        default:
          break;
      }
    }
  } else if (!isItemInteractive(itemParsed)) { // 没有子菜单,且本身不可操作(无 href、无事件)则忽略该项
    return null;
  }
  
  // 本身未展开,但其下有选中的菜单,则默认打开该菜单(保证选中的默认可见)
  if (!itemParsed.defaultUnfolded && itemParsed.subItems.length) {
    itemParsed.defaultUnfolded = hasSelectedSubItem(itemParsed);
  }
  
  return itemParsed;
}