kms 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/kms/application/controllers/pages_controller.coffee.erb +1 -2
- data/app/assets/javascripts/templates/assets/index.html.slim +4 -12
- data/app/assets/javascripts/templates/help/scopes.html.slim +74 -0
- data/app/assets/javascripts/templates/pages/index.html.slim +4 -3
- data/app/assets/javascripts/templates/snippets/index.html.slim +4 -3
- data/app/assets/javascripts/templates/templates/index.html.slim +4 -3
- data/app/assets/javascripts/templates/users/index.html.slim +3 -2
- data/app/assets/stylesheets/kms/custom.css.scss +3 -0
- data/app/controllers/kms/pages_controller.rb +2 -2
- data/app/models/ability.rb +0 -1
- data/app/models/concerns/kms/positioned.rb +18 -0
- data/app/models/kms/page.rb +2 -12
- data/app/services/kms/functions_registry.rb +11 -0
- data/app/uploaders/kms/asset_uploader.rb +1 -1
- data/config/initializers/help.rb +1 -1
- data/config/initializers/liquor.rb +0 -47
- data/config/locales/en.yml +22 -0
- data/config/locales/ru.yml +22 -0
- data/lib/generators/kms/install/install_generator.rb +2 -0
- data/lib/generators/kms/install/templates/carrierwave.rb +14 -0
- data/lib/kms/dependencies.rb +2 -0
- data/lib/kms/engine.rb +1 -1
- data/lib/kms/version.rb +1 -1
- data/spec/controllers/kms/snippets_controller_spec.rb +6 -6
- data/spec/internal/log/test.log +2439 -0
- data/spec/services/kms/functions_registry_spec.rb +14 -0
- data/spec/spec_helper.rb +1 -1
- data/vendor/assets/bower.json +1 -1
- data/vendor/assets/bower_components/angular-ui-tree/CHANGELOG.md +164 -0
- data/vendor/assets/bower_components/angular-ui-tree/CONTRIBUTING.md +39 -0
- data/vendor/assets/bower_components/angular-ui-tree/README.md +145 -37
- data/vendor/assets/bower_components/angular-ui-tree/bower.json +28 -18
- data/vendor/assets/bower_components/angular-ui-tree/{source → dist}/angular-ui-tree.css +18 -16
- data/vendor/assets/bower_components/angular-ui-tree/dist/angular-ui-tree.js +1408 -822
- data/vendor/assets/bower_components/angular-ui-tree/dist/angular-ui-tree.min.css +1 -2
- data/vendor/assets/bower_components/angular-ui-tree/dist/angular-ui-tree.min.js +3 -3
- data/vendor/assets/bower_components/angular-ui-tree/e2e/basic-example/basic-example.js +81 -0
- data/vendor/assets/bower_components/angular-ui-tree/e2e/basic-example/page.js +42 -0
- data/vendor/assets/bower_components/angular-ui-tree/e2e/table-example/page.js +31 -0
- data/vendor/assets/bower_components/angular-ui-tree/e2e/table-example/table-example.js +34 -0
- data/vendor/assets/bower_components/angular-ui-tree/index.js +2 -0
- data/vendor/assets/bower_components/angular-ui-tree/protractor.conf.js +19 -0
- data/vendor/assets/bower_components/angular/angular.js +4880 -2111
- data/vendor/assets/bower_components/angular/angular.min.js +320 -297
- data/vendor/assets/bower_components/angular/angular.min.js.gzip +0 -0
- data/vendor/assets/bower_components/angular/angular.min.js.map +3 -3
- data/vendor/assets/bower_components/angular/bower.json +1 -1
- data/vendor/assets/bower_components/angular/package.json +1 -1
- metadata +32 -40
- data/vendor/assets/bower_components/angular-ui-tree/Gruntfile.js +0 -229
- data/vendor/assets/bower_components/angular-ui-tree/build/compiler.jar +0 -0
- data/vendor/assets/bower_components/angular-ui-tree/demo/css/demo-horizontal.css +0 -47
- data/vendor/assets/bower_components/angular-ui-tree/demo/css/demo.css +0 -31
- data/vendor/assets/bower_components/angular-ui-tree/demo/css/tree.css +0 -25
- data/vendor/assets/bower_components/angular-ui-tree/demo/dist/angular-ui-tree.js +0 -1243
- data/vendor/assets/bower_components/angular-ui-tree/demo/dist/angular-ui-tree.min.css +0 -2
- data/vendor/assets/bower_components/angular-ui-tree/demo/dist/angular-ui-tree.min.js +0 -6
- data/vendor/assets/bower_components/angular-ui-tree/demo/filter.html +0 -64
- data/vendor/assets/bower_components/angular-ui-tree/demo/groups.html +0 -100
- data/vendor/assets/bower_components/angular-ui-tree/demo/index.html +0 -101
- data/vendor/assets/bower_components/angular-ui-tree/demo/js/demo.js +0 -63
- data/vendor/assets/bower_components/angular-ui-tree/demo/js/filter.js +0 -91
- data/vendor/assets/bower_components/angular-ui-tree/demo/js/groups.js +0 -143
- data/vendor/assets/bower_components/angular-ui-tree/demo/js/tree.js +0 -102
- data/vendor/assets/bower_components/angular-ui-tree/demo/js/trees.js +0 -60
- data/vendor/assets/bower_components/angular-ui-tree/demo/test.html +0 -60
- data/vendor/assets/bower_components/angular-ui-tree/demo/tree-horizontal.html +0 -66
- data/vendor/assets/bower_components/angular-ui-tree/demo/tree.html +0 -66
- data/vendor/assets/bower_components/angular-ui-tree/demo/trees.html +0 -92
- data/vendor/assets/bower_components/angular-ui-tree/guide/00_usage.ngdoc +0 -78
- data/vendor/assets/bower_components/angular-ui-tree/guide/01_development_setup.ngdoc +0 -58
- data/vendor/assets/bower_components/angular-ui-tree/guide/index.ngdoc +0 -33
- data/vendor/assets/bower_components/angular-ui-tree/karma.conf.js +0 -49
- data/vendor/assets/bower_components/angular-ui-tree/package.json +0 -40
- data/vendor/assets/bower_components/angular-ui-tree/source/angular-ui-tree.scss +0 -63
- data/vendor/assets/bower_components/angular-ui-tree/source/controllers/handleCtrl.js +0 -16
- data/vendor/assets/bower_components/angular-ui-tree/source/controllers/nodeCtrl.js +0 -141
- data/vendor/assets/bower_components/angular-ui-tree/source/controllers/nodesCtrl.js +0 -100
- data/vendor/assets/bower_components/angular-ui-tree/source/controllers/treeCtrl.js +0 -63
- data/vendor/assets/bower_components/angular-ui-tree/source/directives/uiTree.js +0 -115
- data/vendor/assets/bower_components/angular-ui-tree/source/directives/uiTreeHandle.js +0 -27
- data/vendor/assets/bower_components/angular-ui-tree/source/directives/uiTreeNode.js +0 -427
- data/vendor/assets/bower_components/angular-ui-tree/source/directives/uiTreeNodes.js +0 -59
- data/vendor/assets/bower_components/angular-ui-tree/source/main.js +0 -23
- data/vendor/assets/bower_components/angular-ui-tree/source/services/helper.js +0 -265
@@ -1,2 +0,0 @@
|
|
1
|
-
/* angular-ui-tree css file */
|
2
|
-
.angular-ui-tree-empty{border:1px dashed #bbb;min-height:100px;background-color:#e5e5e5;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:-moz-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-moz-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-size:60px 60px;background-position:0 0,30px 30px}.angular-ui-tree-nodes{display:block;position:relative;margin:0;padding:0;list-style:none}.angular-ui-tree-nodes .angular-ui-tree-nodes{padding-left:20px}.angular-ui-tree-node,.angular-ui-tree-placeholder{display:block;position:relative;margin:0;padding:0;min-height:20px;line-height:20px}.angular-ui-tree-hidden{display:none}.angular-ui-tree-placeholder{margin:5px 0;padding:0;min-height:30px}.angular-ui-tree-handle{cursor:move;text-decoration:none;font-weight:700;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;min-height:20px;line-height:20px}.angular-ui-tree-drag{position:absolute;pointer-events:none;z-index:999;opacity:.8}
|
@@ -1,6 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @license Angular UI Tree v2.1.5
|
3
|
-
* (c) 2010-2014. https://github.com/JimLiu/angular-ui-tree
|
4
|
-
* License: MIT
|
5
|
-
*/
|
6
|
-
!function(){"use strict";angular.module("ui.tree",[]).constant("treeConfig",{treeClass:"angular-ui-tree",emptyTreeClass:"angular-ui-tree-empty",hiddenClass:"angular-ui-tree-hidden",nodesClass:"angular-ui-tree-nodes",nodeClass:"angular-ui-tree-node",handleClass:"angular-ui-tree-handle",placeHolderClass:"angular-ui-tree-placeholder",dragClass:"angular-ui-tree-drag",dragThreshold:3,levelThreshold:30})}(),function(){"use strict";angular.module("ui.tree").factory("$uiTreeHelper",["$document","$window",function($document,$window){return{nodesData:{},setNodeAttribute:function(scope,attrName,val){var data=this.nodesData[scope.$modelValue.$$hashKey];data||(data={},this.nodesData[scope.$modelValue.$$hashKey]=data),data[attrName]=val},getNodeAttribute:function(scope,attrName){var data=this.nodesData[scope.$modelValue.$$hashKey];return data?data[attrName]:null},nodrag:function(targetElm){return"undefined"!=typeof targetElm.attr("data-nodrag")},eventObj:function(e){var obj=e;return void 0!==e.targetTouches?obj=e.targetTouches.item(0):void 0!==e.originalEvent&&void 0!==e.originalEvent.targetTouches&&(obj=e.originalEvent.targetTouches.item(0)),obj},dragInfo:function(node){return{source:node,sourceInfo:{nodeScope:node,index:node.index(),nodesScope:node.$parentNodesScope},index:node.index(),siblings:node.siblings().slice(0),parent:node.$parentNodesScope,moveTo:function(parent,siblings,index){this.parent=parent,this.siblings=siblings.slice(0);var i=this.siblings.indexOf(this.source);i>-1&&(this.siblings.splice(i,1),this.source.index()<index&&index--),this.siblings.splice(index,0,this.source),this.index=index},parentNode:function(){return this.parent.$nodeScope},prev:function(){return this.index>0?this.siblings[this.index-1]:null},next:function(){return this.index<this.siblings.length-1?this.siblings[this.index+1]:null},isDirty:function(){return this.source.$parentNodesScope!=this.parent||this.source.index()!=this.index},eventArgs:function(elements,pos){return{source:this.sourceInfo,dest:{index:this.index,nodesScope:this.parent},elements:elements,pos:pos}},apply:function(){var nodeData=this.source.$modelValue;this.source.remove(),this.parent.insertNode(this.index,nodeData)}}},height:function(element){return element.prop("scrollHeight")},width:function(element){return element.prop("scrollWidth")},offset:function(element){var boundingClientRect=element[0].getBoundingClientRect();return{width:element.prop("offsetWidth"),height:element.prop("offsetHeight"),top:boundingClientRect.top+($window.pageYOffset||$document[0].body.scrollTop||$document[0].documentElement.scrollTop),left:boundingClientRect.left+($window.pageXOffset||$document[0].body.scrollLeft||$document[0].documentElement.scrollLeft)}},positionStarted:function(e,target){var pos={};return pos.offsetX=e.pageX-this.offset(target).left,pos.offsetY=e.pageY-this.offset(target).top,pos.startX=pos.lastX=e.pageX,pos.startY=pos.lastY=e.pageY,pos.nowX=pos.nowY=pos.distX=pos.distY=pos.dirAx=0,pos.dirX=pos.dirY=pos.lastDirX=pos.lastDirY=pos.distAxX=pos.distAxY=0,pos},positionMoved:function(e,pos,firstMoving){pos.lastX=pos.nowX,pos.lastY=pos.nowY,pos.nowX=e.pageX,pos.nowY=e.pageY,pos.distX=pos.nowX-pos.lastX,pos.distY=pos.nowY-pos.lastY,pos.lastDirX=pos.dirX,pos.lastDirY=pos.dirY,pos.dirX=0===pos.distX?0:pos.distX>0?1:-1,pos.dirY=0===pos.distY?0:pos.distY>0?1:-1;var newAx=Math.abs(pos.distX)>Math.abs(pos.distY)?1:0;return firstMoving?(pos.dirAx=newAx,void(pos.moving=!0)):(pos.dirAx!==newAx?(pos.distAxX=0,pos.distAxY=0):(pos.distAxX+=Math.abs(pos.distX),0!==pos.dirX&&pos.dirX!==pos.lastDirX&&(pos.distAxX=0),pos.distAxY+=Math.abs(pos.distY),0!==pos.dirY&&pos.dirY!==pos.lastDirY&&(pos.distAxY=0)),void(pos.dirAx=newAx))}}}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeController",["$scope","$element","$attrs","treeConfig",function($scope,$element){this.scope=$scope,$scope.$element=$element,$scope.$nodesScope=null,$scope.$type="uiTree",$scope.$emptyElm=null,$scope.$callbacks=null,$scope.dragEnabled=!0,$scope.emptyPlaceHolderEnabled=!0,$scope.maxDepth=0,$scope.dragDelay=0,$scope.isEmpty=function(){return $scope.$nodesScope&&$scope.$nodesScope.$modelValue&&0===$scope.$nodesScope.$modelValue.length},$scope.place=function(placeElm){$scope.$nodesScope.$element.append(placeElm),$scope.$emptyElm.remove()},$scope.resetEmptyElement=function(){0===$scope.$nodesScope.$modelValue.length&&$scope.emptyPlaceHolderEnabled?$element.append($scope.$emptyElm):$scope.$emptyElm.remove()};var collapseOrExpand=function(scope,collapsed){for(var nodes=scope.childNodes(),i=0;i<nodes.length;i++){collapsed?nodes[i].collapse():nodes[i].expand();var subScope=nodes[i].$childNodesScope;subScope&&collapseOrExpand(subScope,collapsed)}};$scope.collapseAll=function(){collapseOrExpand($scope.$nodesScope,!0)},$scope.expandAll=function(){collapseOrExpand($scope.$nodesScope,!1)}}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeNodesController",["$scope","$element","treeConfig",function($scope,$element){this.scope=$scope,$scope.$element=$element,$scope.$modelValue=null,$scope.$nodeScope=null,$scope.$treeScope=null,$scope.$type="uiTreeNodes",$scope.$nodesMap={},$scope.nodrop=!1,$scope.maxDepth=0,$scope.initSubNode=function(subNode){$scope.$nodesMap[subNode.$modelValue.$$hashKey]=subNode},$scope.destroySubNode=function(subNode){$scope.$nodesMap[subNode.$modelValue.$$hashKey]=null},$scope.accept=function(sourceNode,destIndex){return $scope.$treeScope.$callbacks.accept(sourceNode,$scope,destIndex)},$scope.beforeDrag=function(sourceNode){return $scope.$treeScope.$callbacks.beforeDrag(sourceNode)},$scope.isParent=function(node){return node.$parentNodesScope==$scope},$scope.hasChild=function(){return $scope.$modelValue.length>0},$scope.safeApply=function(fn){var phase=this.$root.$$phase;"$apply"==phase||"$digest"==phase?fn&&"function"==typeof fn&&fn():this.$apply(fn)},$scope.removeNode=function(node){var index=$scope.$modelValue.indexOf(node.$modelValue);return index>-1?($scope.safeApply(function(){$scope.$modelValue.splice(index,1)[0]}),node):null},$scope.insertNode=function(index,nodeData){$scope.safeApply(function(){$scope.$modelValue.splice(index,0,nodeData)})},$scope.childNodes=function(){var nodes=[];if($scope.$modelValue)for(var i=0;i<$scope.$modelValue.length;i++)nodes.push($scope.$nodesMap[$scope.$modelValue[i].$$hashKey]);return nodes},$scope.depth=function(){return $scope.$nodeScope?$scope.$nodeScope.depth():0},$scope.outOfDepth=function(sourceNode){var maxDepth=$scope.maxDepth||$scope.$treeScope.maxDepth;return maxDepth>0?$scope.depth()+sourceNode.maxSubDepth()+1>maxDepth:!1}}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeNodeController",["$scope","$element","$attrs","treeConfig",function($scope,$element){this.scope=$scope,$scope.$element=$element,$scope.$modelValue=null,$scope.$parentNodeScope=null,$scope.$childNodesScope=null,$scope.$parentNodesScope=null,$scope.$treeScope=null,$scope.$handleScope=null,$scope.$type="uiTreeNode",$scope.$$apply=!1,$scope.collapsed=!1,$scope.init=function(controllersArr){var treeNodesCtrl=controllersArr[0];$scope.$treeScope=controllersArr[1]?controllersArr[1].scope:null,$scope.$parentNodeScope=treeNodesCtrl.scope.$nodeScope,$scope.$modelValue=treeNodesCtrl.scope.$modelValue[$scope.$index],$scope.$parentNodesScope=treeNodesCtrl.scope,treeNodesCtrl.scope.initSubNode($scope),$element.on("$destroy",function(){treeNodesCtrl.scope.destroySubNode($scope)})},$scope.index=function(){return $scope.$parentNodesScope.$modelValue.indexOf($scope.$modelValue)},$scope.dragEnabled=function(){return!($scope.$treeScope&&!$scope.$treeScope.dragEnabled)},$scope.isSibling=function(targetNode){return $scope.$parentNodesScope==targetNode.$parentNodesScope},$scope.isChild=function(targetNode){var nodes=$scope.childNodes();return nodes&&nodes.indexOf(targetNode)>-1},$scope.prev=function(){var index=$scope.index();return index>0?$scope.siblings()[index-1]:null},$scope.siblings=function(){return $scope.$parentNodesScope.childNodes()},$scope.childNodesCount=function(){return $scope.childNodes()?$scope.childNodes().length:0},$scope.hasChild=function(){return $scope.childNodesCount()>0},$scope.childNodes=function(){return $scope.$childNodesScope&&$scope.$childNodesScope.$modelValue?$scope.$childNodesScope.childNodes():null},$scope.accept=function(sourceNode,destIndex){return $scope.$childNodesScope&&$scope.$childNodesScope.$modelValue&&$scope.$childNodesScope.accept(sourceNode,destIndex)},$scope.removeNode=function(){var node=$scope.remove();return $scope.$callbacks.removed(node),node},$scope.remove=function(){return $scope.$parentNodesScope.removeNode($scope)},$scope.toggle=function(){$scope.collapsed=!$scope.collapsed},$scope.collapse=function(){$scope.collapsed=!0},$scope.expand=function(){$scope.collapsed=!1},$scope.depth=function(){var parentNode=$scope.$parentNodeScope;return parentNode?parentNode.depth()+1:1};var subDepth=0,countSubDepth=function(scope){for(var count=0,nodes=scope.childNodes(),i=0;i<nodes.length;i++){var childNodes=nodes[i].$childNodesScope;childNodes&&(count=1,countSubDepth(childNodes))}subDepth+=count};$scope.maxSubDepth=function(){return subDepth=0,$scope.$childNodesScope&&countSubDepth($scope.$childNodesScope),subDepth}}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeHandleController",["$scope","$element","$attrs","treeConfig",function($scope,$element){this.scope=$scope,$scope.$element=$element,$scope.$nodeScope=null,$scope.$type="uiTreeHandle"}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTree",["treeConfig","$window",function(treeConfig,$window){return{restrict:"A",scope:!0,controller:"TreeController",link:function(scope,element,attrs){var callbacks={accept:null,beforeDrag:null},config={};angular.extend(config,treeConfig),config.treeClass&&element.addClass(config.treeClass),scope.$emptyElm=angular.element($window.document.createElement("div")),config.emptyTreeClass&&scope.$emptyElm.addClass(config.emptyTreeClass),scope.$watch("$nodesScope.$modelValue.length",function(){scope.$nodesScope.$modelValue&&scope.resetEmptyElement()},!0),scope.$watch(attrs.dragEnabled,function(val){"boolean"==typeof val&&(scope.dragEnabled=val)}),scope.$watch(attrs.emptyPlaceHolderEnabled,function(val){"boolean"==typeof val&&(scope.emptyPlaceHolderEnabled=val)}),scope.$watch(attrs.maxDepth,function(val){"number"==typeof val&&(scope.maxDepth=val)}),scope.$watch(attrs.dragDelay,function(val){"number"==typeof val&&(scope.dragDelay=val)}),callbacks.accept=function(sourceNodeScope,destNodesScope){return destNodesScope.nodrop||destNodesScope.outOfDepth(sourceNodeScope)?!1:!0},callbacks.beforeDrag=function(){return!0},callbacks.removed=function(){},callbacks.dropped=function(){},callbacks.dragStart=function(){},callbacks.dragMove=function(){},callbacks.dragStop=function(){},callbacks.beforeDrop=function(){},scope.$watch(attrs.uiTree,function(newVal){angular.forEach(newVal,function(value,key){callbacks[key]&&"function"==typeof value&&(callbacks[key]=value)}),scope.$callbacks=callbacks},!0)}}}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTreeNodes",["treeConfig","$window",function(treeConfig){return{require:["ngModel","?^uiTreeNode","^uiTree"],restrict:"A",scope:!0,controller:"TreeNodesController",link:function(scope,element,attrs,controllersArr){var config={};angular.extend(config,treeConfig),config.nodesClass&&element.addClass(config.nodesClass);var ngModel=controllersArr[0],treeNodeCtrl=controllersArr[1],treeCtrl=controllersArr[2];treeNodeCtrl?(treeNodeCtrl.scope.$childNodesScope=scope,scope.$nodeScope=treeNodeCtrl.scope):treeCtrl.scope.$nodesScope=scope,scope.$treeScope=treeCtrl.scope,ngModel&&(ngModel.$render=function(){ngModel.$modelValue&&angular.isArray(ngModel.$modelValue)||(scope.$modelValue=[]),scope.$modelValue=ngModel.$modelValue}),scope.$watch(attrs.maxDepth,function(val){"number"==typeof val&&(scope.maxDepth=val)}),attrs.$observe("nodrop",function(val){scope.nodrop="undefined"!=typeof val}),attrs.$observe("horizontal",function(val){scope.horizontal="undefined"!=typeof val})}}}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTreeNode",["treeConfig","$uiTreeHelper","$window","$document","$timeout",function(treeConfig,$uiTreeHelper,$window,$document,$timeout){return{require:["^uiTreeNodes","^uiTree"],restrict:"A",controller:"TreeNodeController",link:function(scope,element,attrs,controllersArr){var config={};angular.extend(config,treeConfig),config.nodeClass&&element.addClass(config.nodeClass),scope.init(controllersArr),scope.collapsed=!!$uiTreeHelper.getNodeAttribute(scope,"collapsed"),scope.$watch(attrs.collapsed,function(val){"boolean"==typeof val&&(scope.collapsed=val)}),scope.$watch("collapsed",function(val){$uiTreeHelper.setNodeAttribute(scope,"collapsed",val),attrs.$set("collapsed",val)});var firstMoving,dragInfo,pos,placeElm,hiddenPlaceElm,dragElm,elements,document_height,document_width,hasTouch="ontouchstart"in window,treeScope=null,dragDelaying=!0,dragStarted=!1,dragTimer=null,body=document.body,html=document.documentElement,dragStart=function(e){if((hasTouch||2!=e.button&&3!=e.which)&&!(e.uiTreeDragging||e.originalEvent&&e.originalEvent.uiTreeDragging)){var eventElm=angular.element(e.target),eventScope=eventElm.scope();if(eventScope&&eventScope.$type&&!("uiTreeNode"!=eventScope.$type&&"uiTreeHandle"!=eventScope.$type||"uiTreeNode"==eventScope.$type&&eventScope.$handleScope)){var eventElmTagName=eventElm.prop("tagName").toLowerCase();if("input"!=eventElmTagName&&"textarea"!=eventElmTagName&&"button"!=eventElmTagName&&"select"!=eventElmTagName){for(;eventElm&&eventElm[0]&&eventElm[0]!=element;){if($uiTreeHelper.nodrag(eventElm))return;eventElm=eventElm.parent()}if(scope.beforeDrag(scope)){e.uiTreeDragging=!0,e.originalEvent&&(e.originalEvent.uiTreeDragging=!0),e.preventDefault();var eventObj=$uiTreeHelper.eventObj(e);firstMoving=!0,dragInfo=$uiTreeHelper.dragInfo(scope);var tagName=scope.$element.prop("tagName");if("tr"===tagName.toLowerCase()){placeElm=angular.element($window.document.createElement(tagName));var tdElm=angular.element($window.document.createElement("td")).addClass(config.placeHolderClass);placeElm.append(tdElm)}else placeElm=angular.element($window.document.createElement(tagName)).addClass(config.placeHolderClass);hiddenPlaceElm=angular.element($window.document.createElement(tagName)),config.hiddenClass&&hiddenPlaceElm.addClass(config.hiddenClass),pos=$uiTreeHelper.positionStarted(eventObj,scope.$element),placeElm.css("height",$uiTreeHelper.height(scope.$element)+"px"),placeElm.css("width",$uiTreeHelper.width(scope.$element)+"px"),dragElm=angular.element($window.document.createElement(scope.$parentNodesScope.$element.prop("tagName"))).addClass(scope.$parentNodesScope.$element.attr("class")).addClass(config.dragClass),dragElm.css("width",$uiTreeHelper.width(scope.$element)+"px"),dragElm.css("z-index",9999);var hStyle=(scope.$element[0].querySelector(".angular-ui-tree-handle")||scope.$element[0]).currentStyle;hStyle&&(document.body.setAttribute("ui-tree-cursor",$document.find("body").css("cursor")||""),$document.find("body").css({cursor:hStyle.cursor+"!important"})),scope.$element.after(placeElm),scope.$element.after(hiddenPlaceElm),dragElm.append(scope.$element),$document.find("body").append(dragElm),dragElm.css({left:eventObj.pageX-pos.offsetX+"px",top:eventObj.pageY-pos.offsetY+"px"}),elements={placeholder:placeElm,dragging:dragElm},angular.element($document).bind("touchend",dragEndEvent),angular.element($document).bind("touchcancel",dragEndEvent),angular.element($document).bind("touchmove",dragMoveEvent),angular.element($document).bind("mouseup",dragEndEvent),angular.element($document).bind("mousemove",dragMoveEvent),angular.element($document).bind("mouseleave",dragCancelEvent),document_height=Math.max(body.scrollHeight,body.offsetHeight,html.clientHeight,html.scrollHeight,html.offsetHeight),document_width=Math.max(body.scrollWidth,body.offsetWidth,html.clientWidth,html.scrollWidth,html.offsetWidth)}}}}},dragMove=function(e){if(!dragStarted)return void(dragDelaying||(dragStarted=!0,scope.$apply(function(){scope.$callbacks.dragStart(dragInfo.eventArgs(elements,pos))})));var prev,leftElmPos,topElmPos,eventObj=$uiTreeHelper.eventObj(e);if(dragElm){e.preventDefault(),$window.getSelection?$window.getSelection().removeAllRanges():$window.document.selection&&$window.document.selection.empty(),leftElmPos=eventObj.pageX-pos.offsetX,topElmPos=eventObj.pageY-pos.offsetY,0>leftElmPos&&(leftElmPos=0),0>topElmPos&&(topElmPos=0),topElmPos+10>document_height&&(topElmPos=document_height-10),leftElmPos+10>document_width&&(leftElmPos=document_width-10),dragElm.css({left:leftElmPos+"px",top:topElmPos+"px"});var top_scroll=window.pageYOffset||$window.document.documentElement.scrollTop,bottom_scroll=top_scroll+(window.innerHeight||$window.document.clientHeight||$window.document.clientHeight);if(bottom_scroll<eventObj.pageY&&document_height>=bottom_scroll&&window.scrollBy(0,10),top_scroll>eventObj.pageY&&window.scrollBy(0,-10),$uiTreeHelper.positionMoved(e,pos,firstMoving),firstMoving)return void(firstMoving=!1);if(pos.dirAx&&pos.distAxX>=config.levelThreshold&&(pos.distAxX=0,pos.distX>0&&(prev=dragInfo.prev(),prev&&!prev.collapsed&&prev.accept(scope,prev.childNodesCount())&&(prev.$childNodesScope.$element.append(placeElm),dragInfo.moveTo(prev.$childNodesScope,prev.childNodes(),prev.childNodesCount()))),pos.distX<0)){var next=dragInfo.next();if(!next){var target=dragInfo.parentNode();target&&target.$parentNodesScope.accept(scope,target.index()+1)&&(target.$element.after(placeElm),dragInfo.moveTo(target.$parentNodesScope,target.siblings(),target.index()+1))}}var displayElm,targetX=($uiTreeHelper.offset(dragElm).left-$uiTreeHelper.offset(placeElm).left>=config.threshold,eventObj.pageX-$window.document.body.scrollLeft),targetY=eventObj.pageY-(window.pageYOffset||$window.document.documentElement.scrollTop);angular.isFunction(dragElm.hide)?dragElm.hide():(displayElm=dragElm[0].style.display,dragElm[0].style.display="none"),$window.document.elementFromPoint(targetX,targetY);var targetElm=angular.element($window.document.elementFromPoint(targetX,targetY));if(angular.isFunction(dragElm.show)?dragElm.show():dragElm[0].style.display=displayElm,!pos.dirAx){var targetBefore,targetNode;targetNode=targetElm.scope();var isEmpty=!1;if(!targetNode)return;if("uiTree"==targetNode.$type&&targetNode.dragEnabled&&(isEmpty=targetNode.isEmpty()),"uiTreeHandle"==targetNode.$type&&(targetNode=targetNode.$nodeScope),"uiTreeNode"!=targetNode.$type&&!isEmpty)return;if(treeScope&&placeElm.parent()[0]!=treeScope.$element[0]&&(treeScope.resetEmptyElement(),treeScope=null),isEmpty)treeScope=targetNode,targetNode.$nodesScope.accept(scope,0)&&(targetNode.place(placeElm),dragInfo.moveTo(targetNode.$nodesScope,targetNode.$nodesScope.childNodes(),0));else if(targetNode.dragEnabled()){targetElm=targetNode.$element;var targetOffset=$uiTreeHelper.offset(targetElm);targetBefore=targetNode.horizontal?eventObj.pageX<targetOffset.left+$uiTreeHelper.width(targetElm)/2:eventObj.pageY<targetOffset.top+$uiTreeHelper.height(targetElm)/2,targetNode.$parentNodesScope.accept(scope,targetNode.index())?targetBefore?(targetElm[0].parentNode.insertBefore(placeElm[0],targetElm[0]),dragInfo.moveTo(targetNode.$parentNodesScope,targetNode.siblings(),targetNode.index())):(targetElm.after(placeElm),dragInfo.moveTo(targetNode.$parentNodesScope,targetNode.siblings(),targetNode.index()+1)):!targetBefore&&targetNode.accept(scope,targetNode.childNodesCount())&&(targetNode.$childNodesScope.$element.append(placeElm),dragInfo.moveTo(targetNode.$childNodesScope,targetNode.childNodes(),targetNode.childNodesCount()))}}scope.$apply(function(){scope.$callbacks.dragMove(dragInfo.eventArgs(elements,pos))})}},dragEnd=function(e){e.preventDefault(),dragElm&&(scope.$treeScope.$apply(function(){scope.$callbacks.beforeDrop(dragInfo.eventArgs(elements,pos))}),hiddenPlaceElm.replaceWith(scope.$element),placeElm.remove(),dragElm.remove(),dragElm=null,scope.$$apply?(dragInfo.apply(),scope.$treeScope.$apply(function(){scope.$callbacks.dropped(dragInfo.eventArgs(elements,pos))})):bindDrag(),scope.$treeScope.$apply(function(){scope.$callbacks.dragStop(dragInfo.eventArgs(elements,pos))}),scope.$$apply=!1,dragInfo=null);var oldCur=document.body.getAttribute("ui-tree-cursor");null!==oldCur&&($document.find("body").css({cursor:oldCur}),document.body.removeAttribute("ui-tree-cursor")),angular.element($document).unbind("touchend",dragEndEvent),angular.element($document).unbind("touchcancel",dragEndEvent),angular.element($document).unbind("touchmove",dragMoveEvent),angular.element($document).unbind("mouseup",dragEndEvent),angular.element($document).unbind("mousemove",dragMoveEvent),angular.element($window.document.body).unbind("mouseleave",dragCancelEvent)},dragStartEvent=function(e){scope.dragEnabled()&&dragStart(e)},dragMoveEvent=function(e){dragMove(e)},dragEndEvent=function(e){scope.$$apply=!0,dragEnd(e)},dragCancelEvent=function(e){dragEnd(e)},bindDrag=function(){element.bind("touchstart mousedown",function(e){dragDelaying=!0,dragStarted=!1,dragStartEvent(e),dragTimer=$timeout(function(){dragDelaying=!1},scope.dragDelay)}),element.bind("touchend touchcancel mouseup",function(){$timeout.cancel(dragTimer)})};bindDrag(),angular.element($window.document.body).bind("keydown",function(e){27==e.keyCode&&(scope.$$apply=!1,dragEnd(e))})}}}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTreeHandle",["treeConfig","$window",function(treeConfig){return{require:"^uiTreeNode",restrict:"A",scope:!0,controller:"TreeHandleController",link:function(scope,element,attrs,treeNodeCtrl){var config={};angular.extend(config,treeConfig),config.handleClass&&element.addClass(config.handleClass),scope!=treeNodeCtrl.scope&&(scope.$nodeScope=treeNodeCtrl.scope,treeNodeCtrl.scope.$handleScope=scope)}}}])}();
|
@@ -1,64 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<title>AngularJS UI Tree demo</title>
|
6
|
-
|
7
|
-
<!-- Stylesheets -->
|
8
|
-
<link rel="stylesheet" type="text/css" href="bower_components/bootstrap/dist/css/bootstrap.min.css">
|
9
|
-
<link rel="stylesheet" href="dist/angular-ui-tree.min.css">
|
10
|
-
<link rel="stylesheet" href="css/demo.css">
|
11
|
-
</head>
|
12
|
-
<body ng-app="treeApp">
|
13
|
-
|
14
|
-
<div class="container" ng-controller="treeCtrl">
|
15
|
-
<h1 class="page-header">Tree - demo</h1>
|
16
|
-
<a href="index.html"><i class="glyphicon glyphicon-chevron-left"></i> Back to overview page</a>
|
17
|
-
|
18
|
-
<div class="row">
|
19
|
-
<div class="col-lg-6">
|
20
|
-
<h3>Tree view
|
21
|
-
</h3>
|
22
|
-
<p>
|
23
|
-
Search: <input ng-model="query" ng-change="findNodes()"/>
|
24
|
-
</p>
|
25
|
-
<!-- Nested node template -->
|
26
|
-
<script type="text/ng-template" id="nodes_renderer.html">
|
27
|
-
<div ui-tree-handle class="tree-node tree-node-content">
|
28
|
-
<a class="btn btn-success btn-xs" data-nodrag ng-click="toggle(this)"><span class="glyphicon" ng-class="{'glyphicon-chevron-right': collapsed, 'glyphicon-chevron-down': !collapsed}"></span></a>
|
29
|
-
{{node.title}}
|
30
|
-
<a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="remove(this)"><span class="glyphicon glyphicon-remove"></span></a>
|
31
|
-
<a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="newSubItem(this)" style="margin-right: 8px;"><span class="glyphicon glyphicon-plus"></span></a>
|
32
|
-
</div>
|
33
|
-
<ol ui-tree-nodes="" ng-model="node.nodes" ng-class="{hidden: collapsed}">
|
34
|
-
<li ng-repeat="node in node.nodes" ui-tree-node ng-include="'nodes_renderer.html'" ng-show="visible(node)">
|
35
|
-
</li>
|
36
|
-
</ol>
|
37
|
-
</script>
|
38
|
-
<div ui-tree id="tree-root">
|
39
|
-
<ol ui-tree-nodes="" ng-model="data">
|
40
|
-
<li ng-repeat="node in data" ui-tree-node ng-include="'nodes_renderer.html'" ng-show="visible(node)"></li>
|
41
|
-
</ol>
|
42
|
-
</div>
|
43
|
-
</div>
|
44
|
-
|
45
|
-
<div class="col-lg-6">
|
46
|
-
<h3>Data binding</h3>
|
47
|
-
<div class="info">
|
48
|
-
{{info}}
|
49
|
-
</div>
|
50
|
-
<pre class="code">{{ data | json }}</pre>
|
51
|
-
</div>
|
52
|
-
</div>
|
53
|
-
|
54
|
-
</div>
|
55
|
-
|
56
|
-
<!--[if IE 8]>
|
57
|
-
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
|
58
|
-
<script src="http://cdnjs.cloudflare.com/ajax/libs/es5-shim/3.4.0/es5-shim.min.js"></script>
|
59
|
-
<![endif]-->
|
60
|
-
<script src="bower_components/angular/angular.min.js"></script>
|
61
|
-
<script type="text/javascript" src="dist/angular-ui-tree.js"></script>
|
62
|
-
<script type="text/javascript" src="js/filter.js"></script>
|
63
|
-
</body>
|
64
|
-
</html>
|
@@ -1,100 +0,0 @@
|
|
1
|
-
|
2
|
-
<!DOCTYPE html>
|
3
|
-
<html>
|
4
|
-
<head>
|
5
|
-
<meta charset="utf-8">
|
6
|
-
<title>AngularJS UI Tree demo</title>
|
7
|
-
|
8
|
-
<!-- Stylesheets -->
|
9
|
-
<link rel="stylesheet" type="text/css" href="bower_components/bootstrap/dist/css/bootstrap.min.css">
|
10
|
-
<link rel="stylesheet" href="dist/angular-ui-tree.min.css">
|
11
|
-
<link rel="stylesheet" href="css/demo.css">
|
12
|
-
</head>
|
13
|
-
<body ng-app="groupsApp">
|
14
|
-
|
15
|
-
<div class="container" ng-controller="groupsCtrl">
|
16
|
-
<h1 class="page-header">Angular UI Tree - Groups & Categories</h1>
|
17
|
-
<a href="index.html"><i class="glyphicon glyphicon-chevron-left"></i> Back to overview page</a>
|
18
|
-
|
19
|
-
<div class="row">
|
20
|
-
<div class="col-lg-6" ui-tree="options">
|
21
|
-
<h3>Groups & Categories</h3>
|
22
|
-
<ol ui-tree-nodes ng-model="groups" data-type="group">
|
23
|
-
<li ng-repeat="group in groups" ui-tree-node>
|
24
|
-
<div class="group-title angular-ui-tree-handle" ng-show="!group.editing">
|
25
|
-
<a href="" class="btn btn-danger btn-xs pull-right" data-nodrag ng-click="removeGroup(group)"><i class="glyphicon glyphicon-remove"></i></a>
|
26
|
-
<a href="" class="btn btn-primary btn-xs pull-right" data-nodrag ng-click="editGroup(group)"><i class="glyphicon glyphicon-pencil"></i></a>
|
27
|
-
<div> {{group.name}}</div>
|
28
|
-
</div>
|
29
|
-
<div class="group-title angular-ui-tree-handle" data-nodrag ng-show="group.editing">
|
30
|
-
<form class="form-inline" role="form">
|
31
|
-
<div class="form-group">
|
32
|
-
<label class="sr-only" for="groupName">Group name</label>
|
33
|
-
<input type="text" class="form-control" placeholder="Group name" ng-model="group.name">
|
34
|
-
</div>
|
35
|
-
<button type="submit" class="btn btn-default" ng-click="saveGroup(group)">Save</button>
|
36
|
-
<button type="submit" class="btn btn-default" ng-click="cancelEditingGroup(group)">Cancel</button>
|
37
|
-
</form>
|
38
|
-
</div>
|
39
|
-
<ol ui-tree-nodes ng-model="group.categories" data-type="category">
|
40
|
-
<li ng-repeat="category in group.categories" ui-tree-node>
|
41
|
-
<div class="category-title angular-ui-tree-handle">
|
42
|
-
<a href="" class="btn btn-danger btn-xs pull-right" data-nodrag ng-click="removeCategory(group, category)"><i class="glyphicon glyphicon-remove"></i></a>
|
43
|
-
<div>
|
44
|
-
{{category.name}}
|
45
|
-
</div>
|
46
|
-
</div>
|
47
|
-
</li>
|
48
|
-
</ol>
|
49
|
-
<ol class="angular-ui-tree-nodes" data-nodrag>
|
50
|
-
<li class="angular-ui-tree-node">
|
51
|
-
<div class="category-title angular-ui-tree-handle">
|
52
|
-
<form class="form-inline" role="form">
|
53
|
-
<div class="form-group">
|
54
|
-
<label class="sr-only" for="categoryName">Category name</label>
|
55
|
-
<input type="text" class="form-control" ng-model="group.newCategoryName" placeholder="Category name">
|
56
|
-
</div>
|
57
|
-
<button type="submit" class="btn btn-default" ng-click="addCategory(group)">Add Category</button>
|
58
|
-
</form>
|
59
|
-
</div>
|
60
|
-
</li>
|
61
|
-
</ol>
|
62
|
-
</li>
|
63
|
-
</ol>
|
64
|
-
<ol class="angular-ui-tree-nodes">
|
65
|
-
<li class="angular-ui-tree-node">
|
66
|
-
<div class="group-title angular-ui-tree-handle">
|
67
|
-
<form class="form-inline" role="form">
|
68
|
-
<div class="form-group">
|
69
|
-
<label class="sr-only" for="groupName">Group name</label>
|
70
|
-
<input type="text" class="form-control" id="groupName" placeholder="Group name">
|
71
|
-
</div>
|
72
|
-
<button type="submit" class="btn btn-default" ng-click="addGroup()">Add Group</button>
|
73
|
-
</form>
|
74
|
-
</div>
|
75
|
-
</li>
|
76
|
-
</ol>
|
77
|
-
</div>
|
78
|
-
|
79
|
-
<div class="col-lg-6">
|
80
|
-
<h3>Data binding</h3>
|
81
|
-
<div class="info">
|
82
|
-
{{ info }}
|
83
|
-
</div>
|
84
|
-
<pre class="code">{{ groups | json }}</pre>
|
85
|
-
</div>
|
86
|
-
</div>
|
87
|
-
|
88
|
-
</div>
|
89
|
-
|
90
|
-
<!--[if IE 8]>
|
91
|
-
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
|
92
|
-
<script src="http://cdnjs.cloudflare.com/ajax/libs/es5-shim/3.4.0/es5-shim.min.js"></script>
|
93
|
-
<![endif]-->
|
94
|
-
<script src="bower_components/angular/angular.min.js"></script>
|
95
|
-
<script src="bower_components/firebase/firebase.js"></script>
|
96
|
-
<script src="bower_components/angularfire/angularfire.min.js"></script>
|
97
|
-
<script type="text/javascript" src="dist/angular-ui-tree.js"></script>
|
98
|
-
<script type="text/javascript" src="js/groups.js"></script>
|
99
|
-
</body>
|
100
|
-
</html>
|
@@ -1,101 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<title>AngularJS UI Tree demo</title>
|
6
|
-
|
7
|
-
<!-- Stylesheets -->
|
8
|
-
<link rel="stylesheet" type="text/css" href="bower_components/bootstrap/dist/css/bootstrap.min.css">
|
9
|
-
<link rel="stylesheet" href="dist/angular-ui-tree.min.css">
|
10
|
-
<link rel="stylesheet" href="css/demo.css">
|
11
|
-
</head>
|
12
|
-
<body ng-app="demoApp">
|
13
|
-
|
14
|
-
<div class="container">
|
15
|
-
|
16
|
-
<div class="jumbotron">
|
17
|
-
<h1>Tree component</h1>
|
18
|
-
<p class="lead">The AngularJS Tree component with drag and drop support.</p>
|
19
|
-
<p><a class="btn btn-lg btn-success" href="https://github.com/JimLiu/angular-ui-tree" role="button">Code on GitHub</a></p>
|
20
|
-
</div>
|
21
|
-
|
22
|
-
<div class="row">
|
23
|
-
<div class="col-md-4">
|
24
|
-
<h2>What?</h2>
|
25
|
-
<p>
|
26
|
-
Angular Tree is an AngularJS UI component that can sort nested lists, provides drag & drop support and doesn't depend on jQuery.
|
27
|
-
</p>
|
28
|
-
</div>
|
29
|
-
<div class="col-md-4">
|
30
|
-
<h2>Features</h2>
|
31
|
-
<ul>
|
32
|
-
<li>Uses the native AngularJS scope for data binding</li>
|
33
|
-
<li>Sorted and move items through the entire tree</li>
|
34
|
-
<li>Prevent elements from accepting child nodes</li>
|
35
|
-
</ul>
|
36
|
-
</div>
|
37
|
-
<div class="col-md-4">
|
38
|
-
<h2>Examples</h2>
|
39
|
-
<ol>
|
40
|
-
<li><a href="tree.html">Unlimited nesting</a></li>
|
41
|
-
<li><a href="tree-horizontal.html">Above with horizontal sorting</a></li>
|
42
|
-
<li><a href="trees.html">Connected trees</a></li>
|
43
|
-
<li><a href="groups.html">Groups & Categories</a></li>
|
44
|
-
<li><a href="filter.html">Filter</a></li>
|
45
|
-
</ol>
|
46
|
-
</div>
|
47
|
-
</div>
|
48
|
-
|
49
|
-
<div class="row">
|
50
|
-
<div class="col-md-12">
|
51
|
-
<h2>See it in action</h2>
|
52
|
-
</div>
|
53
|
-
</div>
|
54
|
-
|
55
|
-
<div class="row">
|
56
|
-
<div class="col-md-12">
|
57
|
-
<div class="row" ng-controller="MainCtrl">
|
58
|
-
<div class="col-lg-6">
|
59
|
-
<h3>Draggable Tree</h3>
|
60
|
-
|
61
|
-
<!-- Nested list template -->
|
62
|
-
<script type="text/ng-template" id="items_renderer.html">
|
63
|
-
<div ui-tree-handle>
|
64
|
-
<a class="btn btn-success btn-xs" data-nodrag ng-click="toggle(this)"><span class="glyphicon" ng-class="{'glyphicon-chevron-right': collapsed, 'glyphicon-chevron-down': !collapsed}"></span></a>
|
65
|
-
{{item.title}}
|
66
|
-
<a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="remove(this)"><span class="glyphicon glyphicon-remove"></span></a>
|
67
|
-
<a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="newSubItem(this)" style="margin-right: 8px;"><span class="glyphicon glyphicon-plus"></span></a>
|
68
|
-
</div>
|
69
|
-
<ol ui-tree-nodes="options" ng-model="item.items" ng-class="{hidden: collapsed}">
|
70
|
-
<li ng-repeat="item in item.items" ui-tree-node ng-include="'items_renderer.html'">
|
71
|
-
</li>
|
72
|
-
</ol>
|
73
|
-
</script>
|
74
|
-
<div ui-tree="options">
|
75
|
-
<ol ui-tree-nodes ng-model="list" >
|
76
|
-
<li ng-repeat="item in list" ui-tree-node ng-include="'items_renderer.html'"></li>
|
77
|
-
</ol>
|
78
|
-
</div>
|
79
|
-
</div>
|
80
|
-
|
81
|
-
<div class="col-lg-6">
|
82
|
-
<h3>Full tree</h3>
|
83
|
-
<pre class="code">{{ list | json }}</pre>
|
84
|
-
</div>
|
85
|
-
</div>
|
86
|
-
|
87
|
-
</div>
|
88
|
-
|
89
|
-
</div>
|
90
|
-
</div>
|
91
|
-
|
92
|
-
<!-- JavaScript -->
|
93
|
-
<!--[if IE 8]>
|
94
|
-
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
|
95
|
-
<script src="http://cdnjs.cloudflare.com/ajax/libs/es5-shim/3.4.0/es5-shim.min.js"></script>
|
96
|
-
<![endif]-->
|
97
|
-
<script src="bower_components/angular/angular.min.js"></script>
|
98
|
-
<script src="dist/angular-ui-tree.js"></script>
|
99
|
-
<script src="js/demo.js"></script>
|
100
|
-
</body>
|
101
|
-
</html>
|
@@ -1,63 +0,0 @@
|
|
1
|
-
(function() {
|
2
|
-
'use strict';
|
3
|
-
|
4
|
-
angular.module('demoApp', ['ui.tree'])
|
5
|
-
.controller('MainCtrl', function($scope) {
|
6
|
-
$scope.list = [{
|
7
|
-
"id": 1,
|
8
|
-
"title": "1. dragon-breath",
|
9
|
-
"items": []
|
10
|
-
}, {
|
11
|
-
"id": 2,
|
12
|
-
"title": "2. moiré-vision",
|
13
|
-
"items": [{
|
14
|
-
"id": 21,
|
15
|
-
"title": "2.1. tofu-animation",
|
16
|
-
"items": [{
|
17
|
-
"id": 211,
|
18
|
-
"title": "2.1.1. spooky-giraffe",
|
19
|
-
"items": []
|
20
|
-
}, {
|
21
|
-
"id": 212,
|
22
|
-
"title": "2.1.2. bubble-burst",
|
23
|
-
"items": []
|
24
|
-
}],
|
25
|
-
}, {
|
26
|
-
"id": 22,
|
27
|
-
"title": "2.2. barehand-atomsplitting",
|
28
|
-
"items": []
|
29
|
-
}],
|
30
|
-
}, {
|
31
|
-
"id": 3,
|
32
|
-
"title": "3. unicorn-zapper",
|
33
|
-
"items": []
|
34
|
-
}, {
|
35
|
-
"id": 4,
|
36
|
-
"title": "4. romantic-transclusion",
|
37
|
-
"items": []
|
38
|
-
}];
|
39
|
-
|
40
|
-
$scope.selectedItem = {};
|
41
|
-
|
42
|
-
$scope.options = {
|
43
|
-
};
|
44
|
-
|
45
|
-
$scope.remove = function(scope) {
|
46
|
-
scope.remove();
|
47
|
-
};
|
48
|
-
|
49
|
-
$scope.toggle = function(scope) {
|
50
|
-
scope.toggle();
|
51
|
-
};
|
52
|
-
|
53
|
-
$scope.newSubItem = function(scope) {
|
54
|
-
var nodeData = scope.$modelValue;
|
55
|
-
nodeData.items.push({
|
56
|
-
id: nodeData.id * 10 + nodeData.items.length,
|
57
|
-
title: nodeData.title + '.' + (nodeData.items.length + 1),
|
58
|
-
items: []
|
59
|
-
});
|
60
|
-
};
|
61
|
-
});
|
62
|
-
|
63
|
-
})();
|
@@ -1,91 +0,0 @@
|
|
1
|
-
(function() {
|
2
|
-
'use strict';
|
3
|
-
|
4
|
-
angular.module('treeApp', ['ui.tree'])
|
5
|
-
.controller('treeCtrl', function($scope, $filter) {
|
6
|
-
|
7
|
-
$scope.remove = function(scope) {
|
8
|
-
scope.remove();
|
9
|
-
};
|
10
|
-
|
11
|
-
$scope.newSubItem = function(scope) {
|
12
|
-
var nodeData = scope.$modelValue;
|
13
|
-
nodeData.nodes.push({
|
14
|
-
id: nodeData.id * 10 + nodeData.nodes.length,
|
15
|
-
title: nodeData.title + '.' + (nodeData.nodes.length + 1),
|
16
|
-
nodes: []
|
17
|
-
});
|
18
|
-
};
|
19
|
-
|
20
|
-
$scope.visible = function(item) {
|
21
|
-
if ($scope.query && $scope.query.length > 0
|
22
|
-
&& item.title.indexOf($scope.query) == -1) {
|
23
|
-
return false;
|
24
|
-
}
|
25
|
-
return true;
|
26
|
-
};
|
27
|
-
|
28
|
-
$scope.findNodes = function(){
|
29
|
-
|
30
|
-
};
|
31
|
-
|
32
|
-
$scope.data = [{
|
33
|
-
"id": 1,
|
34
|
-
"title": "node1",
|
35
|
-
"nodes": [
|
36
|
-
{
|
37
|
-
"id": 11,
|
38
|
-
"title": "node1.1",
|
39
|
-
"nodes": [
|
40
|
-
{
|
41
|
-
"id": 111,
|
42
|
-
"title": "node1.1.1",
|
43
|
-
"nodes": []
|
44
|
-
}
|
45
|
-
]
|
46
|
-
},
|
47
|
-
{
|
48
|
-
"id": 12,
|
49
|
-
"title": "node1.2",
|
50
|
-
"nodes": []
|
51
|
-
}
|
52
|
-
],
|
53
|
-
}, {
|
54
|
-
"id": 2,
|
55
|
-
"title": "node2",
|
56
|
-
"nodes": [
|
57
|
-
{
|
58
|
-
"id": 21,
|
59
|
-
"title": "node2.1",
|
60
|
-
"nodes": []
|
61
|
-
},
|
62
|
-
{
|
63
|
-
"id": 22,
|
64
|
-
"title": "node2.2",
|
65
|
-
"nodes": []
|
66
|
-
}
|
67
|
-
],
|
68
|
-
}, {
|
69
|
-
"id": 3,
|
70
|
-
"title": "node3",
|
71
|
-
"nodes": [
|
72
|
-
{
|
73
|
-
"id": 31,
|
74
|
-
"title": "node3.1",
|
75
|
-
"nodes": []
|
76
|
-
}
|
77
|
-
],
|
78
|
-
}, {
|
79
|
-
"id": 4,
|
80
|
-
"title": "node4",
|
81
|
-
"nodes": [
|
82
|
-
{
|
83
|
-
"id": 41,
|
84
|
-
"title": "node4.1",
|
85
|
-
"nodes": []
|
86
|
-
}
|
87
|
-
],
|
88
|
-
}];
|
89
|
-
});
|
90
|
-
|
91
|
-
})();
|
@@ -1,143 +0,0 @@
|
|
1
|
-
(function() {
|
2
|
-
'use strict';
|
3
|
-
|
4
|
-
angular.module('groupsApp', ['ui.tree', 'firebase'])
|
5
|
-
.value('fbURL', 'https://angular-ui-tree.firebaseio.com/demo/groups/')
|
6
|
-
.factory('Groups', function($firebase, fbURL) {
|
7
|
-
return $firebase(new Firebase(fbURL)); // jshint ignore:line
|
8
|
-
})
|
9
|
-
.controller('groupsCtrl', function($scope, $log, Groups, $firebase, fbURL) {
|
10
|
-
|
11
|
-
$scope.info = "";
|
12
|
-
$scope.groups = [];
|
13
|
-
$scope.$watch(function () {
|
14
|
-
return Groups.$getIndex();
|
15
|
-
},
|
16
|
-
function() {
|
17
|
-
$scope.groups = [];
|
18
|
-
var index = Groups.$getIndex();
|
19
|
-
if (index.length > 0) {
|
20
|
-
for (var i = 0; i < index.length; i++) {
|
21
|
-
var group = Groups[index[i]];
|
22
|
-
if (group) {
|
23
|
-
group.id = index[i];
|
24
|
-
group.editing = false;
|
25
|
-
if (!group.categories) {
|
26
|
-
group.categories = [];
|
27
|
-
}
|
28
|
-
group.$firebase = $firebase(new Firebase(fbURL + group.id)); // jshint ignore:line
|
29
|
-
group.destroy = function() {
|
30
|
-
this.$firebase.$remove();
|
31
|
-
};
|
32
|
-
group.save = function() {
|
33
|
-
this.$firebase.name = this.name;
|
34
|
-
this.$firebase.sortOrder = this.sortOrder;
|
35
|
-
this.$firebase.categories = this.categories;
|
36
|
-
this.$firebase.$save();
|
37
|
-
this.editing = false;
|
38
|
-
};
|
39
|
-
$scope.groups.push(group);
|
40
|
-
}
|
41
|
-
}
|
42
|
-
$scope.groups.sort(function(group1, group2) {
|
43
|
-
return group1.sortOrder - group2.sortOrder;
|
44
|
-
});
|
45
|
-
}
|
46
|
-
}, true);
|
47
|
-
|
48
|
-
$scope.addGroup = function() {
|
49
|
-
if ($scope.groups.length > 10) {
|
50
|
-
window.alert('You can\'t add more than 10 groups!');
|
51
|
-
return;
|
52
|
-
}
|
53
|
-
var groupName = document.getElementById("groupName").value;
|
54
|
-
if (groupName.length > 0) {
|
55
|
-
Groups.$add({
|
56
|
-
name: groupName,
|
57
|
-
type: "group",
|
58
|
-
categories: [],
|
59
|
-
sortOrder: $scope.groups.length
|
60
|
-
});
|
61
|
-
document.getElementById("groupName").value = '';
|
62
|
-
}
|
63
|
-
};
|
64
|
-
|
65
|
-
$scope.editGroup = function(group) {
|
66
|
-
group.editing = true;
|
67
|
-
};
|
68
|
-
|
69
|
-
$scope.cancelEditingGroup = function(group) {
|
70
|
-
group.editing = false;
|
71
|
-
};
|
72
|
-
|
73
|
-
$scope.saveGroup = function(group) {
|
74
|
-
group.save();
|
75
|
-
};
|
76
|
-
|
77
|
-
$scope.removeGroup = function(group) {
|
78
|
-
if (window.confirm('Are you sure to remove this group?')) {
|
79
|
-
group.destroy();
|
80
|
-
}
|
81
|
-
};
|
82
|
-
|
83
|
-
$scope.saveGroups = function() {
|
84
|
-
for (var i = $scope.groups.length - 1; i >= 0; i--) {
|
85
|
-
var group = $scope.groups[i];
|
86
|
-
group.sortOrder = i + 1;
|
87
|
-
group.save();
|
88
|
-
}
|
89
|
-
};
|
90
|
-
|
91
|
-
$scope.addCategory = function(group) {
|
92
|
-
if (!group.newCategoryName || group.newCategoryName.length === 0) {
|
93
|
-
return;
|
94
|
-
}
|
95
|
-
group.categories.push({
|
96
|
-
name: group.newCategoryName,
|
97
|
-
sortOrder: group.categories.length,
|
98
|
-
type: "category"
|
99
|
-
});
|
100
|
-
group.newCategoryName = '';
|
101
|
-
group.save();
|
102
|
-
};
|
103
|
-
|
104
|
-
$scope.removeCategory = function(group, category) {
|
105
|
-
if (window.confirm('Are you sure to remove this category?')) {
|
106
|
-
var index = group.categories.indexOf(category);
|
107
|
-
if (index > -1) {
|
108
|
-
group.categories.splice(index, 1)[0];
|
109
|
-
}
|
110
|
-
group.save();
|
111
|
-
}
|
112
|
-
};
|
113
|
-
|
114
|
-
$scope.options = {
|
115
|
-
accept: function(sourceNode, destNodes, destIndex) {
|
116
|
-
var data = sourceNode.$modelValue;
|
117
|
-
var destType = destNodes.$element.attr('data-type');
|
118
|
-
return (data.type == destType); // only accept the same type
|
119
|
-
},
|
120
|
-
dropped: function(event) {
|
121
|
-
console.log(event);
|
122
|
-
var sourceNode = event.source.nodeScope;
|
123
|
-
var destNodes = event.dest.nodesScope;
|
124
|
-
// update changes to server
|
125
|
-
if (destNodes.isParent(sourceNode)
|
126
|
-
&& destNodes.$element.attr('data-type') == 'category') { // If it moves in the same group, then only update group
|
127
|
-
var group = destNodes.$nodeScope.$modelValue;
|
128
|
-
group.save();
|
129
|
-
} else { // save all
|
130
|
-
$scope.saveGroups();
|
131
|
-
}
|
132
|
-
},
|
133
|
-
beforeDrop: function(event) {
|
134
|
-
if (!window.confirm('Are you sure you want to drop it here?')) {
|
135
|
-
event.source.nodeScope.$$apply = false;
|
136
|
-
}
|
137
|
-
}
|
138
|
-
};
|
139
|
-
|
140
|
-
|
141
|
-
});
|
142
|
-
|
143
|
-
})();
|