buildPathTreeData static method

List<TreeNode> buildPathTreeData(
  1. List<Map<String, dynamic>> data
)

Implementation

static List<TreeNode> buildPathTreeData(
  List<Map<String, dynamic>> data,
) {
  final nodesMap = <String, TreeNode>{};
  final rootNodes = <TreeNode>[];

  for (final item in data) {
    final paths = item['path']?.trim().split(r'\\');
    TreeNode? currentParent;

    for (var i = 0; i < (paths?.length ?? 0); i++) {
      final path = paths![i];

      final hierarchyLevel = i;

      final currentNode = nodesMap.putIfAbsent(path, () {
        final newNode = TreeNode(
          title: path,
          code: path,
          children: [],
          hierarchy: hierarchyLevel,
          parent: currentParent,
        );

        if (currentParent != null) {
          currentParent.children.add(newNode);
        } else {
          rootNodes.add(newNode);
        }

        return newNode;
      });

      currentParent = currentNode;
    }

    final permissionNode = TreeNode(
      title: item['name'],
      code: item['code'],
      parent: currentParent,
      hierarchy: (currentParent?.hierarchy ?? 0) + 1,
      children: [],
    );

    currentParent?.children.add(permissionNode);
  }

  return rootNodes;
}