( view: SheetViewMode, parent: WorksheetFolderNode, worksheetsByFolder: Map<string, WorksheetLikeItem[]>, hideEmpty: boolean )
| 570 | }; |
| 571 | |
| 572 | const buildTree = ( |
| 573 | view: SheetViewMode, |
| 574 | parent: WorksheetFolderNode, |
| 575 | worksheetsByFolder: Map<string, WorksheetLikeItem[]>, |
| 576 | hideEmpty: boolean |
| 577 | ): WorksheetFolderNode => { |
| 578 | const folderContext = getFolderContext(view); |
| 579 | const subfolders: WorksheetFolderNode[] = folderContext |
| 580 | .listSubFolders(parent.key) |
| 581 | .map((folder) => ({ |
| 582 | isLeaf: false, |
| 583 | children: [], |
| 584 | key: folder, |
| 585 | label: folder.split("/").slice(-1)[0], |
| 586 | editable: true, |
| 587 | })); |
| 588 | |
| 589 | let empty = true; |
| 590 | for (const childNode of subfolders) { |
| 591 | const subtree = buildTree(view, childNode, worksheetsByFolder, hideEmpty); |
| 592 | if (!subtree.empty || !hideEmpty) { |
| 593 | parent.children.push(subtree); |
| 594 | } |
| 595 | if (!subtree.empty) { |
| 596 | empty = false; |
| 597 | } |
| 598 | } |
| 599 | |
| 600 | const sheets = orderBy( |
| 601 | worksheetsByFolder.get(parent.key) ?? [], |
| 602 | (item) => item.title |
| 603 | ).map<WorksheetFolderNode>((worksheet) => ({ |
| 604 | isLeaf: true, |
| 605 | key: getKeyForWorksheet(view, worksheet), |
| 606 | label: worksheet.title, |
| 607 | worksheet, |
| 608 | editable: true, |
| 609 | children: [], |
| 610 | })); |
| 611 | |
| 612 | parent.children.push(...sheets); |
| 613 | parent.empty = sheets.length === 0 && empty; |
| 614 | if (parent.key !== folderContext.rootPath) { |
| 615 | parent.isLeaf = parent.children.length === 0; |
| 616 | } |
| 617 | return parent; |
| 618 | }; |
| 619 | |
| 620 | const worksheetsForView = (view: SheetViewMode): Worksheet[] => { |
| 621 | if (view !== "my" && view !== "shared") return []; |
no test coverage detected