kms 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
- })();