Skip to content

Commit be42398

Browse files
author
Georgii Rychko
authored
feat(tree): make it possible to collapse a tree on a first load. Closes #102
1 parent c1b8a3e commit be42398

File tree

7 files changed

+72
-43
lines changed

7 files changed

+72
-43
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ Here is an example of its usage:
345345
```
346346

347347
* `static` - Boolean - This option makes it impossible to drag a tree or modify it in a some way, though you still can select nodes in the static tree and appropriate events will be generated.
348+
* `isCollapsedOnInit` - Boolean - This option makes a tree to be collapsed on first load (this option cascades to its children).
348349
* `rightMenu` - Boolean - This option allows you to activate (true, by default) or deactivate (false) right menu when clicking with right button of a mouse.
349350
* `leftMenu` - Boolean - This option allows you to activate (true) or deactivate (false, by default) left menu.
350351
* `cssClasses` - Object:

package.json

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,27 +49,27 @@
4949
"webdriver-update": "node ./node_modules/protractor/bin/webdriver-manager update"
5050
},
5151
"devDependencies": {
52-
"@angular/cli": "1.5.0",
53-
"@angular/common": "5.0.0",
54-
"@angular/compiler": "5.0.0",
55-
"@angular/compiler-cli": "5.0.0",
56-
"@angular/core": "5.0.0",
57-
"@angular/forms": "5.0.0",
58-
"@angular/http": "5.0.0",
59-
"@angular/language-service": "5.0.0",
60-
"@angular/platform-browser": "5.0.0",
61-
"@angular/platform-browser-dynamic": "5.0.0",
62-
"@angular/router": "5.0.0",
63-
"@types/jasmine": "2.6.2",
64-
"@types/node": "8.0.47",
52+
"@angular/cli": "1.5.2",
53+
"@angular/common": "5.0.2",
54+
"@angular/compiler": "5.0.2",
55+
"@angular/compiler-cli": "5.0.2",
56+
"@angular/core": "5.0.2",
57+
"@angular/forms": "5.0.2",
58+
"@angular/http": "5.0.2",
59+
"@angular/language-service": "5.0.2",
60+
"@angular/platform-browser": "5.0.2",
61+
"@angular/platform-browser-dynamic": "5.0.2",
62+
"@angular/router": "5.0.2",
63+
"@types/jasmine": "2.8.2",
64+
"@types/node": "8.0.53",
6565
"alertifyjs": "1.10.0",
6666
"codelyzer": "3.0.1",
67-
"conventional-changelog": "1.1.6",
68-
"conventional-changelog-cli": "1.3.4",
67+
"conventional-changelog": "1.1.7",
68+
"conventional-changelog-cli": "1.3.5",
6969
"conventional-github-releaser": "2.0.0",
7070
"core-js": "2.5.1",
7171
"font-awesome": "4.7.0",
72-
"gh-pages": "1.0.0",
72+
"gh-pages": "1.1.0",
7373
"jasmine-core": "2.8.0",
7474
"jasmine-data-provider": "2.2.0",
7575
"jasmine-spec-reporter": "4.2.1",
@@ -90,7 +90,7 @@
9090
"ts-node": "3.3.0",
9191
"tslint": "5.4.3",
9292
"tslint-config-valorsoft": "2.0.1",
93-
"typescript": "2.5.0",
93+
"typescript": "2.4.2",
9494
"webpack": "3.8.1",
9595
"zone.js": "0.8.18"
9696
}

src/demo/app/app.component.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,10 @@ export class AppComponent implements OnInit {
269269
{value: 'chmod', id: 10},
270270
{value: 'chown', id: 11},
271271
{value: 'nano', id: 12}
272-
]
272+
],
273+
settings: {
274+
isCollapsedOnInit: true
275+
}
273276
},
274277
{
275278
value: 'boot',

src/tree.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,14 @@ export class Tree {
256256
* @returns {Tree} A newly inserted child.
257257
*/
258258
public addChild(child: Tree, position?: number): Tree {
259-
return this._addChild(Tree.cloneTreeShallow(child), position);
259+
const newborn = this._addChild(Tree.cloneTreeShallow(child), position);
260+
261+
this._setFoldingType();
262+
if (this.isNodeCollapsed()) {
263+
this.switchFoldingType();
264+
}
265+
266+
return newborn;
260267
}
261268

262269
private _addChild(child: Tree, position: number = size(this._children) || 0): Tree {
@@ -268,10 +275,6 @@ export class Tree {
268275
this._children = [child];
269276
}
270277

271-
this._setFoldingType();
272-
if (this.isNodeCollapsed()) {
273-
this.switchFoldingType();
274-
}
275278
return child;
276279
}
277280

@@ -414,6 +417,9 @@ export class Tree {
414417
if (this.isLeaf() || !this.hasChildren()) {
415418
return;
416419
}
420+
421+
this.disableCollapseOnInit();
422+
417423
this.node._foldingType = this.isNodeExpanded() ? FoldingType.Collapsed : FoldingType.Expanded;
418424
}
419425

@@ -440,7 +446,7 @@ export class Tree {
440446
if (this.childrenShouldBeLoaded()) {
441447
this.node._foldingType = FoldingType.Collapsed;
442448
} else if (this._children && !isEmpty(this._children)) {
443-
this.node._foldingType = FoldingType.Expanded;
449+
this.node._foldingType = this.isCollapsedOnInit() ? FoldingType.Collapsed : FoldingType.Expanded;
444450
} else if (Array.isArray(this._children)) {
445451
this.node._foldingType = FoldingType.Empty;
446452
} else {
@@ -510,6 +516,16 @@ export class Tree {
510516
return '';
511517
}
512518

519+
private disableCollapseOnInit() {
520+
if (this.node.settings) {
521+
this.node.settings.isCollapsedOnInit = false;
522+
}
523+
}
524+
525+
public isCollapsedOnInit() {
526+
return !!get(this.node.settings, 'isCollapsedOnInit');
527+
}
528+
513529
/**
514530
* Check that current tree is newly created (added by user via menu for example). Tree that was built from the TreeModel is not marked as new.
515531
* @returns {boolean} A flag whether the tree is new.

src/tree.types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,15 @@ export class TreeModelSettings {
8484
*/
8585
public static?: boolean;
8686

87+
public isCollapsedOnInit?: boolean;
88+
8789
public static merge(sourceA: TreeModel, sourceB: TreeModel): TreeModelSettings {
88-
return defaultsDeep({}, get(sourceA, 'settings'), get(sourceB, 'settings'), {static: false, leftMenu: false, rightMenu: true});
90+
return defaultsDeep(
91+
{},
92+
get(sourceA, 'settings'),
93+
get(sourceB, 'settings'),
94+
{static: false, leftMenu: false, rightMenu: true, isCollapsedOnInit: false}
95+
);
8996
}
9097
}
9198

test/data-provider/tree.data-provider.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,72 +3,72 @@ export class TreeDataProvider {
33
'default values': {
44
treeModelA: { value: '42' },
55
treeModelB: { value: '12' },
6-
result: { static: false, leftMenu: false, rightMenu: true }
6+
result: { static: false, leftMenu: false, rightMenu: true, isCollapsedOnInit: false }
77
},
88
'first settings source has higher priority': {
9-
treeModelA: { value: '42', settings: { static: true, leftMenu: true, rightMenu: true } },
10-
treeModelB: { value: '12', settings: { static: false, leftMenu: false, rightMenu: false } },
11-
result: { static: true, leftMenu: true, rightMenu: true }
9+
treeModelA: { value: '42', settings: { static: true, leftMenu: true, rightMenu: true, isCollapsedOnInit: true } },
10+
treeModelB: { value: '12', settings: { static: false, leftMenu: false, rightMenu: false, isCollapsedOnInit: false } },
11+
result: { static: true, leftMenu: true, rightMenu: true, isCollapsedOnInit: true }
1212
},
1313
'second settings source has priority if first settings source doesn\'t have the option': {
1414
treeModelA: { value: '42' },
15-
treeModelB: { value: '12', settings: { static: true, leftMenu: true, rightMenu: false } },
16-
result: { static: true, leftMenu: true, rightMenu: false }
15+
treeModelB: { value: '12', settings: { static: true, leftMenu: true, rightMenu: false, isCollapsedOnInit: true } },
16+
result: { static: true, leftMenu: true, rightMenu: false, isCollapsedOnInit: true }
1717
},
1818
'first expanded property of cssClasses has higher priority': {
1919
treeModelA: { value: '12', settings: { cssClasses: { expanded: 'arrow-down-o' } } },
2020
treeModelB: { value: '42', settings: { cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right', empty: 'arrow-gray', leaf: 'dot' } } },
21-
result: { static: false, leftMenu: false, rightMenu: true, cssClasses: { expanded: 'arrow-down-o', collapsed: 'arrow-right', empty: 'arrow-gray', leaf: 'dot' } }
21+
result: { isCollapsedOnInit: false, static: false, leftMenu: false, rightMenu: true, cssClasses: { expanded: 'arrow-down-o', collapsed: 'arrow-right', empty: 'arrow-gray', leaf: 'dot' } }
2222
},
2323
'first collapsed property of cssClasses has higher priority': {
2424
treeModelA: { value: '12', settings: { cssClasses: { collapsed: 'arrow-right-o' } } },
2525
treeModelB: { value: '42', settings: { cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right', empty: 'arrow-gray', leaf: 'dot' } } },
26-
result: { static: false, leftMenu: false, rightMenu: true, cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right-o', empty: 'arrow-gray', leaf: 'dot' } }
26+
result: { isCollapsedOnInit: false, static: false, leftMenu: false, rightMenu: true, cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right-o', empty: 'arrow-gray', leaf: 'dot' } }
2727
},
2828
'first empty property of cssClasses has higher priority': {
2929
treeModelA: { value: '12', settings: { cssClasses: { empty: 'arrow-gray-o' } } },
3030
treeModelB: { value: '42', settings: { cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right', empty: 'arrow-gray', leaf: 'dot' } } },
31-
result: { static: false, leftMenu: false, rightMenu: true, cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right', empty: 'arrow-gray-o', leaf: 'dot' } }
31+
result: { isCollapsedOnInit: false, static: false, leftMenu: false, rightMenu: true, cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right', empty: 'arrow-gray-o', leaf: 'dot' } }
3232
},
3333
'first leaf property of cssClasses has higher priority': {
3434
treeModelA: { value: '12', settings: { cssClasses: { leaf: 'dot-o' } } },
3535
treeModelB: { value: '42', settings: { cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right', empty: 'arrow-gray', leaf: 'dot' } } },
36-
result: { static: false, leftMenu: false, rightMenu: true, cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right', empty: 'arrow-gray', leaf: 'dot-o' } }
36+
result: { isCollapsedOnInit: false, static: false, leftMenu: false, rightMenu: true, cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right', empty: 'arrow-gray', leaf: 'dot-o' } }
3737
},
3838
'first properties of cssClasses has higher priority': {
3939
treeModelA: { value: '12', settings: { cssClasses: { expanded: 'arrow-down-o', collapsed: 'arrow-right-o', empty: 'arrow-gray-o', leaf: 'dot-o' } } },
4040
treeModelB: { value: '42', settings: { cssClasses: { expanded: 'arrow-down', collapsed: 'arrow-right', empty: 'arrow-gray', leaf: 'dot' } } },
41-
result: { static: false, leftMenu: false, rightMenu: true, cssClasses: { expanded: 'arrow-down-o', collapsed: 'arrow-right-o', empty: 'arrow-gray-o', leaf: 'dot-o' } }
41+
result: { isCollapsedOnInit: false, static: false, leftMenu: false, rightMenu: true, cssClasses: { expanded: 'arrow-down-o', collapsed: 'arrow-right-o', empty: 'arrow-gray-o', leaf: 'dot-o' } }
4242
},
4343
'second properties of cssClasses in settings has priority, if first source doesn\'t have them': {
4444
treeModelA: { value: '42', settings: { static: true, leftMenu: true, rightMenu: false } },
4545
treeModelB: { value: '12', settings: { cssClasses: { expanded: 'arrow-down-o', collapsed: 'arrow-right-o', empty: 'arrow-gray-o', leaf: 'dot-o' } } },
46-
result: { static: true, leftMenu: true, rightMenu: false, cssClasses: { expanded: 'arrow-down-o', collapsed: 'arrow-right-o', empty: 'arrow-gray-o', leaf: 'dot-o' } }
46+
result: { isCollapsedOnInit: false, static: true, leftMenu: true, rightMenu: false, cssClasses: { expanded: 'arrow-down-o', collapsed: 'arrow-right-o', empty: 'arrow-gray-o', leaf: 'dot-o' } }
4747
},
4848
'first node property of templates has higher priority': {
4949
treeModelA: { value: '12', settings: { templates: { node: '<i class="folder-o"></i>' } } },
5050
treeModelB: { value: '42', settings: { templates: { node: '<i class="folder"></i>', leaf: '<i class="file"></i>', leftMenu: '<i class="navigation"></i>' } } },
51-
result: { static: false, leftMenu: false, rightMenu: true, templates: { node: '<i class="folder-o"></i>', leaf: '<i class="file"></i>', leftMenu: '<i class="navigation"></i>' } }
51+
result: { isCollapsedOnInit: false, static: false, leftMenu: false, rightMenu: true, templates: { node: '<i class="folder-o"></i>', leaf: '<i class="file"></i>', leftMenu: '<i class="navigation"></i>' } }
5252
},
5353
'first leaf property in templates has higher priority': {
5454
treeModelA: { value: '12', settings: { templates: { leaf: '<i class="file-o"></i>' } } },
5555
treeModelB: { value: '42', settings: { templates: { node: '<i class="folder"></i>', leaf: '<i class="file"></i>', leftMenu: '<i class="navigation"></i>' } } },
56-
result: { static: false, leftMenu: false, rightMenu: true, templates: { node: '<i class="folder"></i>', leaf: '<i class="file-o"></i>', leftMenu: '<i class="navigation"></i>' } }
56+
result: { isCollapsedOnInit: false, static: false, leftMenu: false, rightMenu: true, templates: { node: '<i class="folder"></i>', leaf: '<i class="file-o"></i>', leftMenu: '<i class="navigation"></i>' } }
5757
},
5858
'first leftMenu property in templates has higher priority': {
5959
treeModelA: { value: '12', settings: { templates: { leftMenu: '<i class="navigation-o"></i>' } } },
6060
treeModelB: { value: '42', settings: { templates: { node: '<i class="folder"></i>', leaf: '<i class="file"></i>', leftMenu: '<i class="navigation"></i>' } } },
61-
result: { static: false, leftMenu: false, rightMenu: true, templates: { node: '<i class="folder"></i>', leaf: '<i class="file"></i>', leftMenu: '<i class="navigation-o"></i>' } }
61+
result: { isCollapsedOnInit: false, static: false, leftMenu: false, rightMenu: true, templates: { node: '<i class="folder"></i>', leaf: '<i class="file"></i>', leftMenu: '<i class="navigation-o"></i>' } }
6262
},
6363
'first properties of templates has higher priority': {
6464
treeModelA: { value: '12', settings: { templates: { node: '<i class="folder-o"></i>', leaf: '<i class="file-o"></i>', leftMenu: '<i class="navigation-o"></i>' } } },
6565
treeModelB: { value: '42', settings: { templates: { node: '<i class="folder"></i>', leaf: '<i class="file"></i>', leftMenu: '<i class="navigation"></i>' } } },
66-
result: { static: false, leftMenu: false, rightMenu: true, templates: { node: '<i class="folder-o"></i>', leaf: '<i class="file-o"></i>', leftMenu: '<i class="navigation-o"></i>' } }
66+
result: { isCollapsedOnInit: false, static: false, leftMenu: false, rightMenu: true, templates: { node: '<i class="folder-o"></i>', leaf: '<i class="file-o"></i>', leftMenu: '<i class="navigation-o"></i>' } }
6767
},
6868
'second properties of templates in settings has priority, if first source doesn\'t have them': {
6969
treeModelA: { value: '42', settings: { static: true, leftMenu: true, rightMenu: false } },
7070
treeModelB: { value: '12', settings: { templates: { node: '<i class="folder-o"></i>', leaf: '<i class="file-o"></i>', leftMenu: '<i class="navigation-o"></i>' } } },
71-
result: { static: true, leftMenu: true, rightMenu: false, templates: { node: '<i class="folder-o"></i>', leaf: '<i class="file-o"></i>', leftMenu: '<i class="navigation-o"></i>' } }
71+
result: { isCollapsedOnInit: false, static: true, leftMenu: true, rightMenu: false, templates: { node: '<i class="folder-o"></i>', leaf: '<i class="file-o"></i>', leftMenu: '<i class="navigation-o"></i>' } }
7272
}
7373
};
7474
}

tsconfig-aot.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
"./index.ts"
1818
],
1919
"angularCompilerOptions": {
20-
"genDir": "factories"
20+
"strictMetadataEmit" : true,
21+
"skipMetadataEmit" : false,
22+
"preserveWhitespaces": false
2123
}
2224
}

0 commit comments

Comments
 (0)