1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-03 16:10:26 +00:00
Files
seahub/frontend/src/components/tree-view/tree.js

264 lines
5.9 KiB
JavaScript
Raw Normal View History

2018-09-04 17:16:50 +08:00
import Node from './node';
import moment from 'moment';
import { bytesToSize } from '../utils';
2018-08-06 18:29:12 +08:00
2018-09-07 10:31:46 +08:00
const lang = window.app.config.lang;
moment.locale(lang);
2018-09-07 10:31:46 +08:00
2018-08-06 18:29:12 +08:00
class Tree {
2018-09-04 17:16:50 +08:00
2018-08-06 18:29:12 +08:00
constructor() {
this.root = null;
}
2018-09-04 17:16:50 +08:00
clone() {
2018-08-06 18:29:12 +08:00
var t = new Tree();
if (this.root)
2018-09-04 17:16:50 +08:00
t.root = this.root.clone();
2018-08-06 18:29:12 +08:00
return t;
}
2018-09-04 17:16:50 +08:00
setRoot(node) {
this.root = node;
2018-08-06 18:29:12 +08:00
}
2018-09-04 17:16:50 +08:00
addNodeToParent(node, parentNode) {
node.parent = parentNode;
parentNode.children.push(node);
return node;
2018-08-06 18:29:12 +08:00
}
2018-09-04 17:16:50 +08:00
removeNodeFromParent(node, parentNode) {
let children = parentNode.children;
2018-08-29 12:25:22 +08:00
let removeNode = null;
let index = null;
for (let i = 0; i < children.length; i++) {
2018-09-04 17:16:50 +08:00
if (node.path === children[i].path) {
2018-08-29 12:25:22 +08:00
removeNode = children[i];
index = i;
break;
}
}
2018-09-04 17:16:50 +08:00
node.parent = null;
parentNode.children.splice(index, 1);
2018-08-29 12:25:22 +08:00
return removeNode ? removeNode : null;
}
2018-09-04 17:16:50 +08:00
addNode(node) {
let treeNodeParent = this.findNodeParentFromTree(node);
if (treeNodeParent) {
this.addNodeToParent(node, treeNodeParent);
return true;
}
return false;
}
deleteNode(node) {
let treeNodeParent = this.findNodeParentFromTree(node);
if (treeNodeParent) {
this.removeNodeFromParent(node, treeNodeParent);
return true;
}
return false;
}
updateNodeParam(node, param, newValue) {
let treeNode = this.findNodeFromTree(node);
if (treeNode && treeNode[param]) {
treeNode[param] = newValue;
return true;
}
return false;
}
findNode(node) {
return this.findNodeFromTree(node);
2018-08-29 12:25:22 +08:00
}
2018-09-04 17:16:50 +08:00
findNodeFromTree(node) {
let findNode = this.getNodeByPath(node.path);
return findNode;
2018-08-29 12:25:22 +08:00
}
2018-09-04 17:16:50 +08:00
findNodeParentFromTree(node) {
2018-08-29 12:25:22 +08:00
let parentNode = node.parent;
let findNode = null;
2018-09-04 17:16:50 +08:00
function cb(treeNode) {
if (treeNode.path === parentNode.path) {
findNode = treeNode;
2018-08-29 12:25:22 +08:00
return true;
}
return false;
}
2018-09-04 17:16:50 +08:00
this.traverseDF(cb);
2018-08-29 12:25:22 +08:00
return findNode;
}
2018-09-12 11:50:41 +08:00
expandNode(node) {
2018-09-04 17:16:50 +08:00
let treeNode = this.findNodeFromTree(node);
if (treeNode) {
treeNode.isExpanded = true;
while (treeNode.parent) {
treeNode.parent.isExpanded = true;
treeNode = treeNode.parent;
}
return true;
}
return false;
}
2018-09-12 11:50:41 +08:00
collapseNode(node) {
let treeNode = this.findNodeFromTree(node);
if (treeNode) {
treeNode.isExpanded = false;
return true;
}
return false;
}
resetTreeState() {
2018-09-04 17:16:50 +08:00
function cb(treeNode) {
treeNode.isExpanded = false;
return false;
}
this.traverseBF(cb);
this.root.isExpanded = true;
return true;
}
2018-08-29 12:25:22 +08:00
getNodeByPath(path) {
let findNode = null;
2018-09-04 17:16:50 +08:00
function cb(treeNode) {
if (treeNode.path === path) {
findNode = treeNode;
2018-08-29 12:25:22 +08:00
return true;
}
return false;
}
this.traverseBF(cb);
return findNode;
}
2018-09-04 17:16:50 +08:00
isNodeChild(parentNode, node) {
let isChild = false;
while(node.parent){
if(node.parent.path === parentNode.path){
isChild = true;
break;
}
node = node.parent;
}
2018-09-04 17:16:50 +08:00
return isChild;
}
2018-09-04 17:16:50 +08:00
2018-08-29 12:25:22 +08:00
traverseDF(callback) {
let stack = [];
let found = false;
stack.unshift(this.root);
let currentNode = stack.shift();
while (!found && currentNode) {
found = callback(currentNode) == true ? true : false;
if (!found) {
stack.unshift(...currentNode.children);
currentNode = stack.shift();
}
}
}
traverseBF(callback) {
let queue = [];
let found = false;
queue.push(this.root);
let currentNode = queue.shift();
while (!found && currentNode) {
found = callback(currentNode) === true ? true : false;
if (!found) {
queue.push(...currentNode.children);
currentNode = queue.shift();
}
}
}
2018-09-04 17:16:50 +08:00
parseModelToTree(model) {
2018-08-06 18:29:12 +08:00
var node = new Node({
name: model.name,
type: model.type,
size: bytesToSize(model.size),
2018-09-04 17:16:50 +08:00
last_update_time: moment.unix(model.last_update_time).fromNow(),
2018-09-29 15:47:53 +08:00
permission: model.permission,
parent_path: model.parent_path,
2018-09-04 17:16:50 +08:00
isExpanded: false
2018-08-06 18:29:12 +08:00
});
2018-09-04 17:16:50 +08:00
if (model.children instanceof Array) {
for (let child of model.children) {
this.addNodeToParent(this.parseNodeToTree(child), node);
}
2018-08-06 18:29:12 +08:00
}
2018-09-04 17:16:50 +08:00
return node;
2018-08-06 18:29:12 +08:00
}
2018-09-04 17:16:50 +08:00
parseListToTree(nodeList) {
function getNodePath(parentPath, nodeName) {
return parentPath === '/' ? (parentPath + nodeName) : (parentPath + '/' + nodeName);
2018-09-04 17:16:50 +08:00
}
let root = new Node({name: '/', type: 'dir', isExpanded: true});
2018-08-06 18:29:12 +08:00
this.root = root;
2018-09-04 17:16:50 +08:00
let map = new Map();
2018-08-06 18:29:12 +08:00
map.set(root.name, root);
2018-09-04 17:16:50 +08:00
let treeNodeList = [];
2018-08-06 18:29:12 +08:00
for (let nodeObj of nodeList) {
2018-09-04 17:16:50 +08:00
let node = new Node({
2018-08-06 18:29:12 +08:00
name: nodeObj.name,
type: nodeObj.type,
size: bytesToSize(nodeObj.size),
2018-09-04 17:16:50 +08:00
last_update_time: moment.unix(nodeObj.last_update_time).fromNow(),
2018-09-29 15:47:53 +08:00
permission: nodeObj.permission,
parent_path: nodeObj.parent_path,
2018-08-06 18:29:12 +08:00
isExpanded: false
});
node.parent_path = nodeObj.parent_path;
treeNodeList.push(node);
2018-09-04 17:16:50 +08:00
if (node.isDir()) {
map.set(getNodePath(node.parent_path, node.name), node);
2018-08-06 18:29:12 +08:00
}
}
for (let node of treeNodeList) {
let p = map.get(node.parent_path);
if (p === undefined) {
/* eslint-disable */
console.log('warning: node ' + node.parent_path + ' not exist');
/* eslint-enable */
2018-08-06 18:29:12 +08:00
} else {
2018-09-04 17:16:50 +08:00
this.addNodeToParent(node, p);
2018-08-06 18:29:12 +08:00
}
}
2018-09-04 17:16:50 +08:00
2018-08-06 18:29:12 +08:00
}
2018-09-04 17:16:50 +08:00
parseNodeToTree(node) {
var newNode = new Node({
2018-09-04 17:16:50 +08:00
name: node.name,
type: node.type,
size: bytesToSize(node.size),
2018-09-04 17:16:50 +08:00
last_update_time: moment.unix(node.last_update_time).fromNow(),
2018-09-29 15:47:53 +08:00
permission: node.permission,
parent_path: node.parent_path,
2018-09-04 17:16:50 +08:00
isExpanded: false
2018-08-06 18:29:12 +08:00
});
2018-09-04 17:16:50 +08:00
if (node.children instanceof Array) {
for (let child of node.children) {
this.addNodeToParent(this.parseNodeToTree(child), newNode);
2018-08-06 18:29:12 +08:00
}
}
return newNode;
2018-08-06 18:29:12 +08:00
}
}
export default Tree;