kms 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/kms/application/controllers/pages_controller.coffee.erb +1 -2
  3. data/app/assets/javascripts/templates/assets/index.html.slim +4 -12
  4. data/app/assets/javascripts/templates/help/scopes.html.slim +74 -0
  5. data/app/assets/javascripts/templates/pages/index.html.slim +4 -3
  6. data/app/assets/javascripts/templates/snippets/index.html.slim +4 -3
  7. data/app/assets/javascripts/templates/templates/index.html.slim +4 -3
  8. data/app/assets/javascripts/templates/users/index.html.slim +3 -2
  9. data/app/assets/stylesheets/kms/custom.css.scss +3 -0
  10. data/app/controllers/kms/pages_controller.rb +2 -2
  11. data/app/models/ability.rb +0 -1
  12. data/app/models/concerns/kms/positioned.rb +18 -0
  13. data/app/models/kms/page.rb +2 -12
  14. data/app/services/kms/functions_registry.rb +11 -0
  15. data/app/uploaders/kms/asset_uploader.rb +1 -1
  16. data/config/initializers/help.rb +1 -1
  17. data/config/initializers/liquor.rb +0 -47
  18. data/config/locales/en.yml +22 -0
  19. data/config/locales/ru.yml +22 -0
  20. data/lib/generators/kms/install/install_generator.rb +2 -0
  21. data/lib/generators/kms/install/templates/carrierwave.rb +14 -0
  22. data/lib/kms/dependencies.rb +2 -0
  23. data/lib/kms/engine.rb +1 -1
  24. data/lib/kms/version.rb +1 -1
  25. data/spec/controllers/kms/snippets_controller_spec.rb +6 -6
  26. data/spec/internal/log/test.log +2439 -0
  27. data/spec/services/kms/functions_registry_spec.rb +14 -0
  28. data/spec/spec_helper.rb +1 -1
  29. data/vendor/assets/bower.json +1 -1
  30. data/vendor/assets/bower_components/angular-ui-tree/CHANGELOG.md +164 -0
  31. data/vendor/assets/bower_components/angular-ui-tree/CONTRIBUTING.md +39 -0
  32. data/vendor/assets/bower_components/angular-ui-tree/README.md +145 -37
  33. data/vendor/assets/bower_components/angular-ui-tree/bower.json +28 -18
  34. data/vendor/assets/bower_components/angular-ui-tree/{source → dist}/angular-ui-tree.css +18 -16
  35. data/vendor/assets/bower_components/angular-ui-tree/dist/angular-ui-tree.js +1408 -822
  36. data/vendor/assets/bower_components/angular-ui-tree/dist/angular-ui-tree.min.css +1 -2
  37. data/vendor/assets/bower_components/angular-ui-tree/dist/angular-ui-tree.min.js +3 -3
  38. data/vendor/assets/bower_components/angular-ui-tree/e2e/basic-example/basic-example.js +81 -0
  39. data/vendor/assets/bower_components/angular-ui-tree/e2e/basic-example/page.js +42 -0
  40. data/vendor/assets/bower_components/angular-ui-tree/e2e/table-example/page.js +31 -0
  41. data/vendor/assets/bower_components/angular-ui-tree/e2e/table-example/table-example.js +34 -0
  42. data/vendor/assets/bower_components/angular-ui-tree/index.js +2 -0
  43. data/vendor/assets/bower_components/angular-ui-tree/protractor.conf.js +19 -0
  44. data/vendor/assets/bower_components/angular/angular.js +4880 -2111
  45. data/vendor/assets/bower_components/angular/angular.min.js +320 -297
  46. data/vendor/assets/bower_components/angular/angular.min.js.gzip +0 -0
  47. data/vendor/assets/bower_components/angular/angular.min.js.map +3 -3
  48. data/vendor/assets/bower_components/angular/bower.json +1 -1
  49. data/vendor/assets/bower_components/angular/package.json +1 -1
  50. metadata +32 -40
  51. data/vendor/assets/bower_components/angular-ui-tree/Gruntfile.js +0 -229
  52. data/vendor/assets/bower_components/angular-ui-tree/build/compiler.jar +0 -0
  53. data/vendor/assets/bower_components/angular-ui-tree/demo/css/demo-horizontal.css +0 -47
  54. data/vendor/assets/bower_components/angular-ui-tree/demo/css/demo.css +0 -31
  55. data/vendor/assets/bower_components/angular-ui-tree/demo/css/tree.css +0 -25
  56. data/vendor/assets/bower_components/angular-ui-tree/demo/dist/angular-ui-tree.js +0 -1243
  57. data/vendor/assets/bower_components/angular-ui-tree/demo/dist/angular-ui-tree.min.css +0 -2
  58. data/vendor/assets/bower_components/angular-ui-tree/demo/dist/angular-ui-tree.min.js +0 -6
  59. data/vendor/assets/bower_components/angular-ui-tree/demo/filter.html +0 -64
  60. data/vendor/assets/bower_components/angular-ui-tree/demo/groups.html +0 -100
  61. data/vendor/assets/bower_components/angular-ui-tree/demo/index.html +0 -101
  62. data/vendor/assets/bower_components/angular-ui-tree/demo/js/demo.js +0 -63
  63. data/vendor/assets/bower_components/angular-ui-tree/demo/js/filter.js +0 -91
  64. data/vendor/assets/bower_components/angular-ui-tree/demo/js/groups.js +0 -143
  65. data/vendor/assets/bower_components/angular-ui-tree/demo/js/tree.js +0 -102
  66. data/vendor/assets/bower_components/angular-ui-tree/demo/js/trees.js +0 -60
  67. data/vendor/assets/bower_components/angular-ui-tree/demo/test.html +0 -60
  68. data/vendor/assets/bower_components/angular-ui-tree/demo/tree-horizontal.html +0 -66
  69. data/vendor/assets/bower_components/angular-ui-tree/demo/tree.html +0 -66
  70. data/vendor/assets/bower_components/angular-ui-tree/demo/trees.html +0 -92
  71. data/vendor/assets/bower_components/angular-ui-tree/guide/00_usage.ngdoc +0 -78
  72. data/vendor/assets/bower_components/angular-ui-tree/guide/01_development_setup.ngdoc +0 -58
  73. data/vendor/assets/bower_components/angular-ui-tree/guide/index.ngdoc +0 -33
  74. data/vendor/assets/bower_components/angular-ui-tree/karma.conf.js +0 -49
  75. data/vendor/assets/bower_components/angular-ui-tree/package.json +0 -40
  76. data/vendor/assets/bower_components/angular-ui-tree/source/angular-ui-tree.scss +0 -63
  77. data/vendor/assets/bower_components/angular-ui-tree/source/controllers/handleCtrl.js +0 -16
  78. data/vendor/assets/bower_components/angular-ui-tree/source/controllers/nodeCtrl.js +0 -141
  79. data/vendor/assets/bower_components/angular-ui-tree/source/controllers/nodesCtrl.js +0 -100
  80. data/vendor/assets/bower_components/angular-ui-tree/source/controllers/treeCtrl.js +0 -63
  81. data/vendor/assets/bower_components/angular-ui-tree/source/directives/uiTree.js +0 -115
  82. data/vendor/assets/bower_components/angular-ui-tree/source/directives/uiTreeHandle.js +0 -27
  83. data/vendor/assets/bower_components/angular-ui-tree/source/directives/uiTreeNode.js +0 -427
  84. data/vendor/assets/bower_components/angular-ui-tree/source/directives/uiTreeNodes.js +0 -59
  85. data/vendor/assets/bower_components/angular-ui-tree/source/main.js +0 -23
  86. 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 &amp; 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 &amp; 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>&nbsp;{{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
- &nbsp;{{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 &amp; 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 &amp; 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
- })();