| 172 | |
| 173 | @singleton() |
| 174 | export class FolderTreeService |
| 175 | extends Component<IFolderTree> |
| 176 | implements IFolderTreeService |
| 177 | { |
| 178 | protected state: IFolderTree; |
| 179 | private readonly explorerService: IExplorerService; |
| 180 | private readonly builtinService: IBuiltinService; |
| 181 | private fileContextMenu: IMenuItemProps[] = []; |
| 182 | private folderContextMenu: IMenuItemProps[] = []; |
| 183 | |
| 184 | constructor() { |
| 185 | super(); |
| 186 | this.state = container.resolve(IFolderTreeModel); |
| 187 | this.explorerService = container.resolve(ExplorerService); |
| 188 | this.builtinService = container.resolve(BuiltinService); |
| 189 | } |
| 190 | |
| 191 | private isHiddenFile(file: IFolderTreeNodeProps) { |
| 192 | return !!file.name?.startsWith('.'); |
| 193 | } |
| 194 | |
| 195 | private sortTree(tree: IFolderTreeNodeProps[]) { |
| 196 | tree.sort((pre, cur) => { |
| 197 | // folder before file |
| 198 | if (pre.isLeaf !== cur.isLeaf) { |
| 199 | return pre.isLeaf! > cur.isLeaf! ? 1 : -1; |
| 200 | } |
| 201 | |
| 202 | // in general, both have name |
| 203 | if (pre.name && cur.name) { |
| 204 | const isHiddenFilePre = Number(this.isHiddenFile(pre)); |
| 205 | const isHiddenFileCur = Number(this.isHiddenFile(cur)); |
| 206 | // one is hidden file and another is not |
| 207 | if (isHiddenFilePre ^ isHiddenFileCur) { |
| 208 | return isHiddenFilePre ? -1 : 1; |
| 209 | } |
| 210 | // both are hidden files |
| 211 | if (isHiddenFilePre & isHiddenFilePre) { |
| 212 | // hidden file |
| 213 | return pre.name |
| 214 | .substring(1) |
| 215 | .localeCompare(cur.name.substring(1)); |
| 216 | } |
| 217 | return pre.name.localeCompare(cur.name!); |
| 218 | } |
| 219 | |
| 220 | // the node which is creating would without name |
| 221 | return pre.isEditable ? -1 : 1; |
| 222 | }); |
| 223 | |
| 224 | tree.forEach((treeNode) => this.sortTree(treeNode.children || [])); |
| 225 | } |
| 226 | |
| 227 | public reset() { |
| 228 | this.setState({ |
| 229 | folderTree: { |
| 230 | contextMenu: [], |
| 231 | current: null, |