Compare commits

...

7 Commits
1.0.3 ... 1.0.6

Author SHA1 Message Date
ayou
2367a7d1e6 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	readme.md
2018-03-07 22:03:26 +08:00
ayou
01eca7d2a3 add dev mode, update readme 2018-03-07 22:03:07 +08:00
ayou
2f1205ae02 Update readme.md 2018-03-07 21:39:46 +08:00
ayou
fc5b9f58ff 1.0.5 2018-02-11 21:37:56 +08:00
ayou
c846f7a9c1 add node click event 2018-02-11 21:35:53 +08:00
ayou
1580a3524d 1.0.4 2018-02-06 21:58:05 +08:00
ayou
6812b1eb30 remove jquery 2018-02-06 21:51:45 +08:00
13 changed files with 1371 additions and 127 deletions

View File

@@ -9,4 +9,4 @@ test
.babelrc .babelrc
.travis.yml .travis.yml
karma.conf.js karma.conf.js
webpack.config.js build

View File

@@ -1,14 +1,9 @@
var webpack = require('webpack'); var webpack = require('webpack');
var path = require('path'); var path = require('path');
var projectRoot = path.resolve(__dirname, '../')
module.exports = { module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'vue-tree-list.min.js',
library: 'VueTreeList',
libraryTarget: 'umd'
},
module: { module: {
loaders: [ loaders: [
{ {
@@ -18,7 +13,7 @@ module.exports = {
{ {
test: /\.js$/, test: /\.js$/,
loader: 'babel', loader: 'babel',
include: [path.join(__dirname, 'src')], include: [path.join(projectRoot, 'src'), path.join(projectRoot, 'dev')],
exclude: /node_modules/ exclude: /node_modules/
}, },
{ {
@@ -40,12 +35,5 @@ module.exports = {
browsers: ['iOS >= 7', 'Android >= 4.1'] browsers: ['iOS >= 7', 'Android >= 4.1']
}) })
] ]
},
plugins: [
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
} }
})
]
} }

View File

@@ -0,0 +1,16 @@
var webpack = require('webpack')
var merge = require('webpack-merge')
var baseConfig = require('./webpack.base.conf')
var path = require('path')
var projectRoot = path.resolve(__dirname, '../')
module.exports = merge(baseConfig, {
entry: './src/index.js',
output: {
path: path.resolve(projectRoot, 'dist'),
filename: 'vue-tree-list.min.js',
library: 'VueTreeList',
libraryTarget: 'umd'
}
})

28
build/webpack.dev.conf.js Normal file
View File

@@ -0,0 +1,28 @@
var webpack = require('webpack')
var merge = require('webpack-merge')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var baseConfig = require('./webpack.base.conf')
var path = require('path')
var projectRoot = path.resolve(__dirname, '../')
module.exports = merge(baseConfig, {
entry: './dev/index.js',
devServer: {
historyApiFallback: true,
noInfo: true,
overlay: true,
open: true,
hot: true,
inline: true
},
devtool: '#eval-source-map',
plugins: [
new HtmlWebpackPlugin({
template: './dev/index.html',
filename: 'index.html',
inject: true
}),
new webpack.HotModuleReplacementPlugin()
]
})

84
dev/App.vue Normal file
View File

@@ -0,0 +1,84 @@
<template>
<div>
<button @click="addNode">Add Node</button>
<vue-tree-list @click="onClick" :model="data" default-tree-node-name="new node" default-leaf-node-name="new leaf"></vue-tree-list>
<button @click="getNewTree">Get new tree</button>
<pre>
{{newTree}}
</pre>
</div>
</template>
<script>
import { VueTreeList, Tree, TreeNode } from '../src'
export default {
components: {
VueTreeList
},
data () {
return {
newTree: {},
data: new Tree([
{
name: 'Node 1',
id: 1,
pid: 0,
dragDisabled: true,
children: [
{
name: 'Node 1-2',
id: 2,
isLeaf: true,
pid: 1
}
]
},
{
name: 'Node 2',
id: 3,
pid: 0,
dragDisabled: true
},
{
name: 'Node 3',
id: 4,
pid: 0
}
])
}
},
methods: {
addNode: function () {
var node = new TreeNode({ name: 'new node', isLeaf: false })
if (!this.data.children) this.data.children = []
this.data.addChildren(node)
},
getNewTree: function () {
var vm = this
function _dfs (oldNode) {
var newNode = {}
for (var k in oldNode) {
if (k !== 'children' && k !== 'parent') {
newNode[k] = oldNode[k]
}
}
if (oldNode.children && oldNode.children.length > 0) {
newNode.children = []
for (var i = 0, len = oldNode.children.length; i < len; i++) {
newNode.children.push(_dfs(oldNode.children[i]))
}
}
return newNode
}
vm.newTree = _dfs(vm.data)
},
onClick(model) {
console.log(model)
}
}
}
</script>

11
dev/index.html Normal file
View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="with=device-width,initial-scale=1.0,
maximum-scale=1.0,minimum-scale=1.0,uses-scalable=no">
<title>vue-date-range</title>
</head>
<body>
<div id="app"></div>
</body>
</html>

9
dev/index.js Normal file
View File

@@ -0,0 +1,9 @@
/**
* Created by ayou on 18/3/7.
*/
import Vue from 'vue'
import App from './App.vue'
new Vue({
render: h => h(App)
}).$mount('#app')

File diff suppressed because one or more lines are too long

View File

@@ -78,7 +78,7 @@
</span> </span>
New Treenode New Treenode
</button> </button>
<vue-tree-list :model="data" default-tree-node-name="new node" default-leaf-node-name="new leaf"></vue-tree-list> <vue-tree-list @click="onClick" :model="data" default-tree-node-name="new node" default-leaf-node-name="new leaf"></vue-tree-list>
</div> </div>
<div class="container"> <div class="container">
@@ -163,9 +163,9 @@
}, },
getNewTree: function () { getNewTree: function () {
const vm = this var vm = this
function _dfs (oldNode) { function _dfs (oldNode) {
let newNode = {} var newNode = {}
for (var k in oldNode) { for (var k in oldNode) {
if (k !== 'children' && k !== 'parent') { if (k !== 'children' && k !== 'parent') {
@@ -175,7 +175,7 @@
if (oldNode.children && oldNode.children.length > 0) { if (oldNode.children && oldNode.children.length > 0) {
newNode.children = [] newNode.children = []
for (let i = 0, len = oldNode.children.length; i < len; i++) { for (var i = 0, len = oldNode.children.length; i < len; i++) {
newNode.children.push(_dfs(oldNode.children[i])) newNode.children.push(_dfs(oldNode.children[i]))
} }
} }
@@ -183,6 +183,10 @@
} }
vm.newTree = _dfs(vm.data) vm.newTree = _dfs(vm.data)
},
onClick(model) {
console.log(model)
} }
} }
}) })

View File

@@ -1,13 +1,14 @@
{ {
"name": "vue-tree-list", "name": "vue-tree-list",
"version": "1.0.3", "version": "1.0.6",
"description": "A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.", "description": "A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.",
"main": "dist/vue-tree-list.min.js", "main": "dist/vue-tree-list.min.js",
"scripts": { "scripts": {
"test": "karma start --single-run", "test": "karma start --single-run",
"unit": "karma start --watch", "unit": "karma start --watch",
"coveralls": "npm run test -- --report lcovonly && cat ./coverage/lcov.info | coveralls", "coveralls": "npm run test -- --report lcovonly && cat ./coverage/lcov.info | coveralls",
"build": "webpack" "build": "webpack --config build/webpack.build.conf.js",
"dev": "webpack-dev-server --config build/webpack.dev.conf.js"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -23,9 +24,6 @@
"url": "https://github.com/ParadeTo/vue-tree-list/issues" "url": "https://github.com/ParadeTo/vue-tree-list/issues"
}, },
"homepage": "https://github.com/ParadeTo/vue-tree-list#readme", "homepage": "https://github.com/ParadeTo/vue-tree-list#readme",
"dependencies": {
"jquery": "^3.2.1"
},
"devDependencies": { "devDependencies": {
"autoprefixer": "^6.4.0", "autoprefixer": "^6.4.0",
"babel-core": "^6.0.0", "babel-core": "^6.0.0",
@@ -42,17 +40,8 @@
"file-loader": "^0.10.1", "file-loader": "^0.10.1",
"isparta": "^4.0.0", "isparta": "^4.0.0",
"isparta-loader": "^2.0.0", "isparta-loader": "^2.0.0",
"karma": "^1.7.0",
"karma-coverage": "^1.1.1",
"karma-coveralls": "^1.1.2",
"karma-mocha": "^1.3.0",
"karma-phantomjs-launcher": "^1.0.4",
"karma-sinon-chai": "^1.3.1",
"karma-webpack": "^2.0.3",
"less": "^2.7.2", "less": "^2.7.2",
"less-loader": "^2.2.3", "less-loader": "^2.2.3",
"mocha": "^3.4.2",
"phantomjs-prebuilt": "^2.1.14",
"sinon": "^2.3.5", "sinon": "^2.3.5",
"sinon-chai": "^2.11.0", "sinon-chai": "^2.11.0",
"sourcemap": "^0.1.0", "sourcemap": "^0.1.0",
@@ -61,6 +50,9 @@
"vue-loader": "^11.1.3", "vue-loader": "^11.1.3",
"vue-style-loader": "^2.0.3", "vue-style-loader": "^2.0.3",
"vue-template-compiler": "^2.2.0", "vue-template-compiler": "^2.2.0",
"webpack": "^1.13.2" "webpack": "^1.13.2",
"webpack-dev-server": "1.14.0",
"webpack-merge": "^0.14.1",
"html-webpack-plugin": "^2.8.1"
} }
} }

View File

@@ -10,13 +10,13 @@ A vue component for tree structure. Support adding treenode/leafnode, editing no
```javascript ```javascript
<button @click="addNode">Add Node</button> <button @click="addNode">Add Node</button>
<vue-tree-list :model="data" default-tree-node-name="new node" default-leaf-node-name="new leaf"></vue-tree-list> <vue-tree-list @click="onClick" :model="data" default-tree-node-name="new node" default-leaf-node-name="new leaf"></vue-tree-list>
<button @click="getNewTree">Get new tree</button> <button @click="getNewTree">Get new tree</button>
<pre> <pre>
{{newTree}} {{newTree}}
</pre> </pre>
... ...
import { VueTreeList, Tree, TreeNode } from 'vue-tree-list' import { VueTreeList, Tree, TreeNode } from '../src'
export default { export default {
components: { components: {
VueTreeList VueTreeList
@@ -29,6 +29,7 @@ export default {
name: 'Node 1', name: 'Node 1',
id: 1, id: 1,
pid: 0, pid: 0,
dragDisabled: true,
children: [ children: [
{ {
name: 'Node 1-2', name: 'Node 1-2',
@@ -41,7 +42,8 @@ export default {
{ {
name: 'Node 2', name: 'Node 2',
id: 3, id: 3,
pid: 0 pid: 0,
dragDisabled: true
}, },
{ {
name: 'Node 3', name: 'Node 3',
@@ -53,24 +55,25 @@ export default {
}, },
methods: { methods: {
addNode: function () { addNode: function () {
var node = new TreeNode('new node', false) var node = new TreeNode({ name: 'new node', isLeaf: false })
if (!this.data.children) this.data.children = [] if (!this.data.children) this.data.children = []
this.data.addChildren(node) this.data.addChildren(node)
}, },
getNewTree: function () { getNewTree: function () {
const vm = this var vm = this
function _dfs (oldNode) { function _dfs (oldNode) {
let newNode = {} var newNode = {}
newNode.name = oldNode.name for (var k in oldNode) {
newNode.pid = oldNode.pid if (k !== 'children' && k !== 'parent') {
newNode.isLeaf = oldNode.isLeaf newNode[k] = oldNode[k]
newNode.id = oldNode.id }
}
if (oldNode.children && oldNode.children.length > 0) { if (oldNode.children && oldNode.children.length > 0) {
newNode.children = [] newNode.children = []
for (let i = 0, len = oldNode.children.length; i < len; i++) { for (var i = 0, len = oldNode.children.length; i < len; i++) {
newNode.children.push(_dfs(oldNode.children[i])) newNode.children.push(_dfs(oldNode.children[i]))
} }
} }
@@ -78,15 +81,35 @@ export default {
} }
vm.newTree = _dfs(vm.data) vm.newTree = _dfs(vm.data)
},
onClick(model) {
console.log(model)
} }
} }
} }
``` ```
# props # props
default-tree-node-name: Default name for new treenode. **default-tree-node-name**
default-leaf-node-name: Default name for new leafnode. Default name for new treenode.
**default-leaf-node-name**
Default name for new leafnode.
# events
**click**
```javascript
<vue-tree-list @click="onClick" ...
...
onClick(model) {
console.log(model)
}
...
```
# Forbid dragging # Forbid dragging
Use `dragDisabled` to forbid dragging: Use `dragDisabled` to forbid dragging:
@@ -99,3 +122,4 @@ data: new Tree([
dragDisabled: true, dragDisabled: true,
... ...
``` ```

View File

@@ -15,7 +15,8 @@
@drop='drop' @drop='drop'
@dragend='dragEnd' @dragend='dragEnd'
@mouseover='mouseOver' @mouseover='mouseOver'
@mouseout='mouseOut'> @mouseout='mouseOut'
@click.stop='click'>
<span class="caret icon is-small" v-if="model.children && model.children.length > 0"> <span class="caret icon is-small" v-if="model.children && model.children.length > 0">
<i class="vue-tree-icon" :class="caretClass" @click.prevent.stop="toggle"></i> <i class="vue-tree-icon" :class="caretClass" @click.prevent.stop="toggle"></i>
</span> </span>
@@ -81,9 +82,10 @@
<script> <script>
import { Tree, TreeNode } from './Tree.js' import { Tree, TreeNode } from './Tree.js'
import $ from 'jquery' import { addHandler, removeHandler } from './tools.js'
let fromComp = null let fromComp = null
export default { export default {
data: function () { data: function () {
return { return {
@@ -124,7 +126,7 @@
}, },
mounted () { mounted () {
const vm = this const vm = this
$(window).on('keyup', function (e) { addHandler(window, 'keyup', function (e) {
// click enter // click enter
if (e.keyCode === 13 && vm.editable) { if (e.keyCode === 13 && vm.editable) {
vm.editable = false vm.editable = false
@@ -132,7 +134,7 @@
}) })
}, },
beforeDestroy () { beforeDestroy () {
$(window).off('keyup') removeHandler(window, 'keyup')
}, },
methods: { methods: {
updateName (e) { updateName (e) {
@@ -149,7 +151,8 @@
setEditable () { setEditable () {
this.editable = true this.editable = true
this.$nextTick(() => { this.$nextTick(() => {
$(this.$refs.nodeInput).trigger('focus') this.$refs.nodeInput.focus()
// fireFocusEvent(this.$refs.nodeInput)
}) })
}, },
@@ -171,6 +174,15 @@
this.isHover = false this.isHover = false
}, },
click() {
var node = this.$parent
var clickModel = this.model
while (node._props.model.name !== 'root') {
node = node.$parent
}
node.$emit('click', clickModel)
},
addChild(isLeaf) { addChild(isLeaf) {
const name = isLeaf ? this.defaultLeafNodeName : this.defaultTreeNodeName const name = isLeaf ? this.defaultLeafNodeName : this.defaultTreeNodeName
this.expanded = true this.expanded = true

31
src/tools.js Normal file
View File

@@ -0,0 +1,31 @@
/**
* Created by ayou on 18/2/6.
*/
var handlerCache
exports.addHandler = function(element, type, handler) {
handlerCache = handler
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent("on" + type, handler);
} else {
element["on" + type] = handler;
}
}
exports.removeHandler = function (element, type) {
if (element.removeEventListener) {
element.removeEventListener(type, handlerCache, false);
} else if (element.detachEvent) {
element.detachEvent("on" + type, handlerCache);
} else {
element["on" + type] = null;
}
}
// exports.fireFocusEvent = function (ele) {
// var event = new FocusEvent()
// ele.dispatch(event)
// }