Skip to content

Commit 6ddc57c

Browse files
committed
Added getExtendedNodes (v1.2.0)
1 parent cb560da commit 6ddc57c

10 files changed

+50
-13
lines changed

index.d.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Family, IFamilyNode, IFamilyData } from './src/types';
1+
import { Family, IFamilyNode, IFamilyExtNode, IFamilyData } from './src/types';
22

33
export {
44
Gender,
@@ -9,11 +9,9 @@ export {
99
ICanvasSize,
1010
IRelation,
1111
IFamilyNode,
12+
IFamilyExtNode,
1213
IConnector,
1314
IFamilyData,
1415
} from './src/types';
1516

16-
declare const hasHiddenRelatives: (family: Family, node: IFamilyNode) => boolean;
17-
export { hasHiddenRelatives };
18-
1917
export default function (nodes: IFamilyNode[], rootId: string): IFamilyData;

package-lock.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "relatives-tree",
3-
"version": "1.1.0",
3+
"version": "1.2.0",
44
"description": "Calculates families and nodes positions for rendering a family tree",
55
"main": "lib/index.js",
66
"typings": "index.d.ts",

src/children/byParents.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ export default (store: Store, parentIDs: string[], type: FamilyType = 'root', is
3333
if (child.spouses.length) {
3434
const { left, middle, right } = getSpouses(store, [child]);
3535
[...left.map(node => [node]), middle, ...right.map(node => [node])].forEach(nodes => (
36-
family.cUnits.push(new Unit(family.id, nodes))
36+
family.cUnits.push(new Unit(family.id, nodes, true))
3737
));
3838
} else {
39-
family.cUnits.push(new Unit(family.id, [child]));
39+
family.cUnits.push(new Unit(family.id, [child], true));
4040
}
4141
});
4242

src/index.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ import createChildren from './children/create';
66
import connectors from './connectors';
77
import correctPositions from './utils/correctPositions';
88
import getCanvasSize from './utils/getCanvasSize';
9+
import getExtendedNodes from './utils/getExtendedNodes';
910
import { IFamilyNode, IFamilyData } from './types';
1011

11-
import hasHiddenRelatives from './utils/hasHiddenRelatives';
12-
export { hasHiddenRelatives };
13-
1412
export default (nodes: IFamilyNode[], rootId: string): IFamilyData => {
1513
const store = new Store(nodes, rootId);
1614

@@ -25,6 +23,7 @@ export default (nodes: IFamilyNode[], rootId: string): IFamilyData => {
2523
return {
2624
families: families,
2725
canvas: getCanvasSize(store),
26+
nodes: getExtendedNodes(families),
2827
connectors: connectors(families),
2928
};
3029
}

src/models/unit.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ import { IFamilyNode } from '../types';
33
class Unit {
44

55
familyId: number;
6+
isChild: boolean;
67
nodes: IFamilyNode[];
78
shift: number;
89

9-
constructor(familyId: number, nodes: IFamilyNode[]) {
10+
constructor(familyId: number, nodes: IFamilyNode[], isChild: boolean = false) {
1011
this.familyId = familyId;
12+
this.isChild = isChild;
1113
this.nodes = nodes;
1214
this.shift = 0;
1315
}

src/parents/byChildren.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Unit from '../models/unit';
44

55
export default (store: Store, childIDs: string[]): Family => {
66
const family = new Family(store.getNextId(), 'parent');
7-
const cUnit = new Unit(family.id, store.getNodes(childIDs));
7+
const cUnit = new Unit(family.id, store.getNodes(childIDs), true);
88

99
cUnit.nodes.forEach((child, cIndex) => {
1010
const parents = store

src/types.ts

+7
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,19 @@ export interface IFamilyNode {
2727
placeholder?: boolean;
2828
}
2929

30+
export interface IFamilyExtNode extends IFamilyNode {
31+
top: number;
32+
left: number;
33+
hasSubTree: boolean;
34+
}
35+
3036
export interface IConnector {
3137
points: [number, number, number, number];
3238
}
3339

3440
export interface IFamilyData {
3541
canvas: ICanvasSize;
3642
families: Family[];
43+
nodes: IFamilyExtNode[];
3744
connectors: IConnector[];
3845
}

src/utils/getExtendedNodes.ts

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import hasHiddenRelatives from './hasHiddenRelatives';
2+
import { flat } from './index';
3+
import Family from '../models/family';
4+
import Unit from '../models/unit';
5+
import { IFamilyNode, IFamilyExtNode } from '../types';
6+
7+
const PARENTS = ['root', 'parent'];
8+
const CHILDREN = ['root', 'child'];
9+
10+
const extendNode = (family: Family) => (unit: Unit) => (
11+
unit.nodes.map((node: IFamilyNode, idx: number) => ({
12+
...node,
13+
top: family.top + (unit.isChild ? 2 : 0),
14+
left: family.left + unit.shift + (idx * 2),
15+
hasSubTree: hasHiddenRelatives(family, node),
16+
}))
17+
);
18+
19+
const getParentNodes = (family: Family) =>
20+
(~PARENTS.indexOf(family.type) ? family.pUnits : []).map(extendNode(family));
21+
22+
const getChildNodes = (family: Family) =>
23+
(~CHILDREN.indexOf(family.type) ? family.cUnits : []).map(extendNode(family));
24+
25+
const mapFamily = (family: Family) =>
26+
[...getParentNodes(family), ...getChildNodes(family)].reduce(flat, []);
27+
28+
export default (families: Family[]): IFamilyExtNode[] =>
29+
families.map(mapFamily).reduce(flat, []);

src/utils/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Store from '../store';
22
import { IRelation, IFamilyNode } from '../types';
33

4+
const flat = (items: any[], item: any) => items.concat(item);
45
const unique = (item: any, index: number, arr: any[]): boolean => arr.indexOf(item) === index;
56

67
const relToNode = (store: Store) => (rel: IRelation) => store.getNode(rel.id);
@@ -9,6 +10,7 @@ const hasDiffParents = (node: IFamilyNode): boolean =>
910
node.parents.map(rel => rel.type).filter(unique).length > 1;
1011

1112
export {
13+
flat,
1214
relToNode,
1315
hasDiffParents,
1416
};

0 commit comments

Comments
 (0)