11angular
22 . module ( 'angular-material-tree' )
3- . directive ( 'mdBranch' , branchDirective )
4- . controller ( 'BranchController' , branchController ) ;
3+ . directive ( 'mdBranch' , branchDirective ) ;
54
65
76var CHECKBOX_SELECTION_INDICATOR = angular . element ( '<div class="checkbox-container"><div class="checkbox-icon"></div></div>' ) ;
@@ -22,8 +21,7 @@ function branchDirective($parse, $document, $mdUtil) {
2221 priority : 1000 ,
2322 terminal : true ,
2423 transclude : 'element' ,
25- compile : compile ,
26- // controller: 'BranchController'
24+ compile : compile
2725 } ;
2826
2927
@@ -58,13 +56,6 @@ function branchDirective($parse, $document, $mdUtil) {
5856 }
5957 scope . startWatching = startWatching ;
6058 scope . killWatching = killWatching ;
61- // ctrl.setOpenState(isOpen);
62- //
63- // // add tree controller and register if available
64- // if (ctrls[2]) {
65- // ctrl.treeCtrl = ctrls[2];
66- // ctrl.registerBranch();
67- // }
6859
6960
7061 function updateBranch ( newItems , oldItems ) {
@@ -194,6 +185,8 @@ function branchDirective($parse, $document, $mdUtil) {
194185 $scope . repeatName = repeatName ;
195186 $scope [ repeatName ] = items && items [ index ] ;
196187 $scope . $odd = ! ( $scope . $even = ( index & 1 ) === 0 ) ;
188+ $scope . $depth = ( $scope . $parent . $depth + 1 ) || 0 ;
189+ items [ index ] . $$depth = $scope . $depth ;
197190 }
198191
199192 function updateState ( $scope , index ) {
@@ -203,28 +196,8 @@ function branchDirective($parse, $document, $mdUtil) {
203196 element . toggleClass ( 'md-open' , item . $$isOpen ) ;
204197 if ( item . $$isOpen ) {
205198 $mdUtil . reconnectScope ( $scope ) ;
206- } else {
207- // disconnectScope($scope);
208- }
209-
210- if ( item . $$isOpen !== undefined && item . $$isOpen !== $scope . isOpen ) {
211- // $scope.isOpen = item.$$isOpen;
212- // console.log($scope.$element[0])
213- // console.log('a', item.$$isOpen);
214- setTimeout ( function ( ) {
215- // console.log($scope.$element[0])
216- // console.log('b', item.$$isOpen, item, $scope[$scope.repeatName])
217- // $scope.$element.controller('md').setOpenState(item.$$isOpen, true);
218- } , 100 ) ;
199+ $scope . startWatching ( ) ;
219200 }
220-
221- // console.log('-- begin');
222- // console.log(element[0])
223- // console.log('pooled', pooled, item.$$isOpen !== undefined, item.$$isOpen !== $scope.isOpen);
224- // console.log($scope);
225- // console.log(item);
226- // console.log('--');
227- // console.log();
228201 }
229202
230203 function initState ( item ) {
@@ -272,204 +245,3 @@ function branchDirective($parse, $document, $mdUtil) {
272245 }
273246
274247}
275-
276-
277-
278-
279-
280-
281-
282-
283- // --- Controller ---
284-
285- /*@ngInject */
286- function branchController ( $scope , $mdUtil , $animateCss ) {
287- /*jshint validthis: true*/
288- var vm = this ;
289- $scope . isOpen = false ;
290-
291- // injected $element is holds refernce to the comment. heres how to get arround this
292- var $element = $scope . $element ;
293-
294- // vm.startWatching; set in link function
295- // vm.killWatching; set in link function
296- vm . setOpenState = setOpenState ;
297- vm . setSelected = setSelected ;
298- vm . registerBranch = registerBranch ;
299-
300- if ( ! $element ) { return ; }
301- var arrow = $element [ 0 ] . querySelector ( '.md-branch-icon' ) ;
302- var ngClick = $element . attr ( 'ng-click' ) ;
303-
304- if ( ! ngClick ) {
305- $element . on ( 'click' , handleClick ) ;
306- }
307-
308- $scope . $on ( '$destroy' , function ( ) {
309- // tree controller may not exist if branch was never opened
310- if ( vm . treeCtrl ) {
311- vm . treeCtrl . unregisterBranch ( vm . treeCtrl . hashGetter ( $scope [ $scope . repeatName ] ) ) ;
312- }
313- } ) ;
314-
315-
316- function handleClick ( e ) {
317- // toggel branch
318- if ( e . target . classList . contains ( 'md-branch-icon-container' ) ) {
319- toggleBranchClick ( e ) ;
320- return ;
321- }
322-
323- // handle select
324- var isSelect = $element . attr ( 'select' ) !== undefined ;
325- if ( isSelect && branchContainsElement ( e . target ) ) {
326- var selected = $element . attr ( 'selected' ) !== undefined ;
327-
328- // deselect all if user did not click the checkbox
329- // var hadMultiple = false;
330- if ( ! e . target . classList . contains ( 'checkbox-container' ) ) { // clicked on checkbox
331- if ( Object . keys ( getTreeCtrl ( ) . selected ) . length > 1 ) {
332- selected = false ;
333- }
334- getTreeCtrl ( ) . deselectAll ( ) ;
335- }
336-
337- $element . attr ( 'selected' , ! selected ) ;
338- getTreeCtrl ( ) . toggleSelect ( ! selected , getTreeCtrl ( ) . hashGetter ( $scope [ $scope . repeatName ] ) , $scope [ $scope . repeatName ] ) ;
339- e . stopPropagation ( ) ;
340- } else {
341- toggleBranchClick ( e ) ;
342- }
343- }
344-
345- function setOpenState ( value , force ) {
346- // if (isOpen == false) { disconnectScope($scope); }
347- if ( force !== true && value === $scope . isOpen ) { return ; }
348- $scope . isOpen = value ;
349- if ( $scope . isOpen === true ) { open ( true , force ) ; }
350- else { close ( true , force ) ; }
351- }
352-
353- function toggleBranchClick ( e ) {
354- if ( ! branchContainsElement ( e . target ) ) { return ; }
355- if ( $scope . isOpen !== true ) { open ( ) ; }
356- else { close ( ) ; }
357- e . stopPropagation ( ) ;
358- }
359-
360- function branchContainsElement ( el ) {
361- var innerContainer = $element [ 0 ] . querySelector ( '.md-branch-inner' ) ;
362- if ( el === innerContainer ) { return true ; } // check if el is container be preceding
363- var parent = el . parentNode ;
364-
365- while ( parent && parent !== document . body ) {
366- if ( parent === innerContainer ) { return true ; }
367- if ( parent . nodeName === 'MD-BRANCH' ) { return false ; }
368- parent = parent . parentNode ;
369- }
370- return false ;
371- }
372-
373-
374- function open ( noAnimation , force ) {
375- if ( force !== true && $scope . isOpen ) { return ; }
376- $mdUtil . reconnectScope ( $scope ) ;
377- $scope . isOpen = true ;
378- setItemOpenState ( ) ;
379- vm . startWatching ( ) ;
380- $element . toggleClass ( 'md-no-animation' , noAnimation || false ) ;
381-
382- $mdUtil . nextTick ( function ( ) {
383- var container = angular . element ( $element [ 0 ] . querySelector ( '.md-branch-container' ) ) ;
384- $element . addClass ( 'md-open' ) ;
385- container . addClass ( 'md-overflow md-show' ) ;
386-
387- $animateCss ( container , {
388- from : { 'max-height' : '0px' , opacity : 0 } ,
389- to : { 'max-height' : getHeight ( ) , opacity : 1 }
390- } )
391- . start ( )
392- . then ( function ( ) {
393- container . css ( 'max-height' , 'none' ) ;
394- container . removeClass ( 'md-overflow md-show' ) ;
395- } ) ;
396- } ) ;
397- }
398-
399- function close ( noAnimation , force ) {
400- if ( force !== true && ! $scope . isOpen ) { return ; }
401- $scope . isOpen = false ;
402- setItemOpenState ( ) ;
403- vm . killWatching ( ) ;
404- $element . toggleClass ( 'md-no-animation' , noAnimation || false ) ;
405-
406- $mdUtil . nextTick ( function ( ) {
407- var container = angular . element ( $element [ 0 ] . querySelector ( '.md-branch-container' ) ) ;
408- $element . removeClass ( 'md-open' ) ;
409- container . addClass ( 'md-overflow md-hide' ) ;
410- $animateCss ( container , {
411- from : { 'max-height' : getHeight ( ) , opacity : 1 } ,
412- to : { 'max-height' : '0px' , opacity : 0 }
413- } )
414- . start ( )
415- . then ( function ( ) {
416- container . removeClass ( 'md-overflow md-hide' ) ;
417- $mdUtil . disconnectScope ( $scope ) ;
418- } ) ;
419- } ) ;
420- }
421-
422- function setItemOpenState ( ) {
423- var item = $scope [ $scope . repeatName ] ;
424- item . $$isOpen = $scope . isOpen ;
425- }
426-
427- function getHeight ( ) {
428- return $element [ 0 ] . scrollHeight + 'px' ;
429- }
430-
431- // nested, nested branches cannot access the tree controller due to their parents not being added to the dom.
432- // To fix this we will walk the dom to find the tree and grab its controller
433- function getTreeCtrl ( ) {
434- if ( vm . treeCtrl ) { return vm . treeCtrl ; }
435-
436- var parent = $element [ 0 ] . parentNode ;
437- while ( parent && parent !== document . body ) {
438- if ( parent . nodeName === 'MD-TREE' ) {
439- vm . treeCtrl = angular . element ( parent ) . controller ( 'mdTree' ) ;
440- registerBranch ( ) ;
441- return vm . treeCtrl ;
442- }
443- parent = parent . parentNode ;
444- }
445-
446- console . error ( '`<md-branch>` element is not nested in a `<md-tree>` element. Selection will not work' ) ;
447- }
448-
449- // register branch if tree controller is accesable
450- function registerBranch ( ) {
451- vm . treeCtrl . registerBranch ( vm . treeCtrl . hashGetter ( $scope [ $scope . repeatName ] ) , {
452- setSelected : setSelected ,
453- getDepth : getDepth
454- } ) ;
455- setSelected ( vm . treeCtrl . selected [ vm . treeCtrl . hashGetter ( $scope [ $scope . repeatName ] ) ] !== undefined ) ;
456- }
457-
458- function getDepth ( ) {
459- if ( $scope . $depth ) { return $scope . $depth ; }
460- var depth = 0 ;
461- var parent = $element [ 0 ] . parentNode ;
462- while ( parent && parent !== document . body ) {
463- if ( parent . nodeName === 'MD-TREE' ) { break ; }
464- if ( parent . nodeName === 'MD-BRANCH' ) { depth += 1 ; }
465- parent = parent . parentNode ;
466- }
467- $scope . $depth = depth ;
468- return depth ;
469- }
470-
471- // set select state
472- function setSelected ( isSelected ) {
473- if ( $element ) { $element . attr ( 'selected' , isSelected ) ; }
474- }
475- }
0 commit comments