Skip to content

Commit d322c54

Browse files
committed
working with collapsing nodes
1 parent a0496fe commit d322c54

File tree

5 files changed

+364
-187
lines changed

5 files changed

+364
-187
lines changed

build.js

+51-3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,30 @@ function build (people, pairs) {
2626
}
2727
})
2828

29+
// get a flattened list of all people who are parents
30+
var names
31+
var allnames = []
32+
_.forEach(groups, function (v, k) {
33+
if (k != '') {
34+
names = k.split(',')
35+
allnames.push(names)
36+
}
37+
})
38+
allnames = _.flatten(allnames)
39+
40+
// tag everyone who is a parent
41+
people = _.map(people, function (p) {
42+
if (_.includes(allnames, p.name)) {
43+
p.is_parent = true
44+
} else {
45+
p.is_parent = false
46+
}
47+
return p
48+
})
49+
50+
// regenerate groups
51+
var groups = _.groupBy(people, 'parents')
52+
2953
// for anyone in the empty group
3054
// add them to the group with their spouse
3155
var spouse
@@ -66,6 +90,8 @@ function build (people, pairs) {
6690
groups[''].splice(foundIndex, 1)
6791
}
6892

93+
94+
6995
// go up the tree inserting groups of children
7096
// in between their parents
7197
var child
@@ -94,7 +120,7 @@ function build (people, pairs) {
94120
}
95121

96122
groups[''] = sort(groups[''], max)
97-
123+
98124
// wrap elements in arrays based on depth
99125
var level
100126
var diff
@@ -198,12 +224,23 @@ function build (people, pairs) {
198224
}
199225

200226
// build the tree
227+
//
228+
// warning:
229+
// super hacky handling of cousin marriage
230+
// manually specifying that a parent node is associated
231+
// with cousin marriage if the first child is
232+
// and basing the parents off the first child
233+
var check
234+
var cousin
201235
function buildTree (array, root) {
202236
if (!root) {
203237
root = {
204238
name: '',
205239
hidden: true,
206240
no_parent: true,
241+
is_parent: true,
242+
cousin_marriage: array[0].cousin_marriage,
243+
parents: array[0].cousin_marriage ? array[0].parents : null,
207244
id: id
208245
}
209246
id += 1
@@ -213,7 +250,10 @@ function build (people, pairs) {
213250
if (!_.isArray(d)) {
214251
subtree = {
215252
name: d.name,
253+
is_parent: d.is_parent,
216254
no_parent: (d.parents.length == 0) ? true : false,
255+
parents: d.parents,
256+
cousin_marriage: d.cousin_marriage,
217257
id: id
218258
}
219259
id += 1
@@ -228,6 +268,7 @@ function build (people, pairs) {
228268
}
229269

230270
var id = 0
271+
231272
var root = buildTree(groups[''])
232273

233274
var married = _.map(pairs, function (d) {
@@ -237,22 +278,29 @@ function build (people, pairs) {
237278
//display(root)
238279
//display(married)
239280

240-
return {root: root, married: married}
281+
return {data: root, married: married}
241282
}
242283

243284
function sort (input, max) {
244285

245286
var level = 0
246287
var iter = 0
247288

289+
//console.log(input)
290+
248291
// loop over levels
249292
// for each level keep finding nodes that need to be reordered
250293
// when no more are found advance to the next level
251294
while ((level < max) & iter < 5000) {
252295
var selected = _.findIndex(input, function (d, k) {
253296
if (getLevel(d) == level) {
254297
var parents = getParents(input[k])
255-
if ((parents.length > 0) &&
298+
if (parents.length == 1) {
299+
// hacky flag to indicate the individual is the result of cousin marriage
300+
display('warning! length 1 parent, probably due to cousin marriage')
301+
input[k][0].cousin_marriage = true
302+
}
303+
if ((parents.length == 2) &&
256304
(!((parents[0] == (k - 1)) && (parents[1] == (k + 1)))) &&
257305
(!((parents[0] == (k + 1)) && (parents[1] == (k - 1))))) {
258306
return true

components/graph.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,5 @@ module.exports = function () {
1616
})
1717
document.body.appendChild(container)
1818

19-
function graph () {}
20-
21-
return graph
19+
return container
2220
}

examples/kk.js

+27-12
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,40 @@
11
var people = [
22
{name: 'sam', parents: ['brad', 'karen'], level: 0},
33
{name: 'emily', parents: ['brad', 'karen'], level: 0},
4+
{name: 'willem', parents: ['cherie', 'aj'], level: 0},
5+
{name: 'audrey', parents: ['cherie', 'aj'], level: 0},
46
{name: 'brad', parents: ['jim', 'liz'], level: 1},
57
{name: 'karen', parents: [], level: 1},
68
{name: 'andrew', parents: ['richard', 'marie'], level: 1},
79
{name: 'kk', parents: ['richard', 'marie'], level: 1},
8-
{name: 'cheri', parents: ['marie', 'dick'], level: 1},
9-
{name: 'son', parents: ['cynthia', 'husband'], level: 1},
10-
{name: 'daughter', parents: ['cynthia', 'husband'], level: 1},
10+
{name: 'aj', parents: [], level: 1},
11+
{name: 'cherie', parents: ['marie', 'dick'], level: 1},
12+
{name: 'cody', parents: ['cindy', 'paul miller'], level: 1},
13+
{name: 'eiann', parents: ['cindy', 'paul miller'], level: 1},
14+
{name: 'rebecca', parents: ['susan', 'padre'], level: 1},
1115
{name: 'richard', parents: ['leonard', 'catherine'], level: 2},
1216
{name: 'marie', parents: ['barton', 'jean'], level: 2},
1317
{name: 'liz', parents: ['barton', 'jean'], level: 2},
1418
{name: 'jim', parents: [], order: -1, level: 2},
1519
{name: 'dick', parents: [], order: 0, level: 2},
16-
{name: 'cynthia', parents: ['barton', 'housekeeper'], level: 2},
17-
{name: 'husband', parents: [], level: 2},
20+
{name: 'paul miller', parents: [], order: -1, level: 2},
21+
{name: 'cindy', parents: ['barton', 'dede'], level: 2},
22+
{name: 'susan', parents: ['barton', 'dede'], level: 2},
23+
{name: 'padre', parents: [], level: 2},
24+
//{name: 'mary jean', parents: ['dr jim', 'ruth'], level: 2},
25+
{name: 'georganna', parents: ['lois', 'robert jr'], level: 2},
1826
// {name: 'michelene', parents: ['william yates', 'micky'], offset: 10, level: 2},
1927
// {name: 'michelene husband', parents: [], level: 2},
2028
// {name: 'monica erlich', parents: ['mary jean', 'ehrlich'], level: 3},
2129
// {name: 'ehrlich', parents: [], level: 3},
22-
{name: 'mary jean', parents: ['ruth', 'dr jim'], level: 3},
2330
{name: 'lawrence', parents: ['mary lynn', 'hulet'], level: 1},
2431
{name: 'catherine', parents: ['james', 'annie'], level: 3},
2532
{name: 'bill', parents: ['james', 'annie'], level: 3},
2633
{name: 'richard pepper', parents: ['james', 'annie'], level: 3},
2734
{name: 'emil', parents: ['dora', 'lukas'], level: 3},
2835
{name: 'leonard', parents: ['dora', 'lukas'], level: 3},
2936
{name: 'barton', parents: ['marie swift', 'laurence'], level: 3},
30-
{name: 'housekeeper', parents: [], order: 0, level: 3},
37+
{name: 'dede', parents: [], order: 0, level: 3},
3138
{name: 'mary lynn', parents: ['marie swift', 'laurence'], level: 3},
3239
{name: 'beatrice', parents: ['marie swift', 'laurence'], level: 3},
3340
{name: 'frederick', parents: [], level: 3},
@@ -39,18 +46,18 @@ var people = [
3946
{name: 'micky', parents: [], level: 3},
4047
{name: 'thomas spens', parents: ['james andrew', 'honora'], level: 3},
4148
{name: 'jean', parents: ['james andrew', 'honora'], level: 3},
49+
{name: 'robert jr', parents: ['lilian frances', 'robert'], level: 3},
4250
{name: 'jimmy', parents: ['lilian frances', 'robert'], level: 3},
4351
{name: 'hulet', parents: [], order: 0, level: 3},
4452
{name: 'gray 1', parents: ['margurite ellen', 'harold'], level: 3},
4553
{name: 'gray 2', parents: ['margurite ellen', 'harold'], level: 3},
54+
{name: 'lois', parents: ['george a', 'leora'], level: 3},
4655
{name: 'boy', parents: ['clark', 'beatrice alice'], level: 4},
4756
{name: 'james andrew', parents: ['josephine', 'ec'], level: 4},
4857
{name: 'honora', parents: [], level: 4},
4958
{name: 'dora', parents: [], level: 4},
5059
{name: 'lukas', parents: [], level: 4},
5160
{name: 'marie swift', parents: ['samuel george', 'beatrice ann'], level: 4},
52-
{name: 'george a', parents: ['samuel george', 'beatrice ann'], level: 4},
53-
{name: 'leora', parents: [], level: 4},
5461
{name: 'cecil', parents: ['samuel george', 'beatrice ann'], level: 4},
5562
{name: 'edwin', parents: ['samuel george', 'beatrice ann'], level: 4},
5663
{name: 'samuel george II', parents: ['samuel george', 'beatrice ann'], level: 4},
@@ -66,23 +73,31 @@ var people = [
6673
{name: 'raymond', parents: [], order: 0, level: 4},
6774
{name: 'alma dean', parents: ['samuel george', 'beatrice ann'], level: 4},
6875
{name: 'wilford', parents: ['samuel george', 'beatrice ann'], level: 4},
76+
{name: 'george a', parents: ['samuel george', 'beatrice ann'], level: 4},
77+
{name: 'leora', parents: [], level: 4},
6978
{name: 'lilian frances', parents: ['samuel george', 'beatrice ann'], level: 4},
7079
{name: 'laurence', parents: ['albert joseph', 'mary ladoiska'], level: 4},
7180
{name: 'robert', parents: [], level: 4},
7281
{name: 'james', parents: [], level: 4},
7382
{name: 'annie', parents: [], level: 4},
74-
{name: 'josephine', parents: [], level: 5},
83+
{name: 'josephine', parents: ['caroline leroux', 'james yates'], level: 5},
7584
{name: 'ec', parents: [], level: 5},
7685
{name: 'samuel george', parents: ['george r', 'mary anne'], level: 5},
7786
{name: 'beatrice ann', parents: ['hannah marie', 'alfred swift'], level: 5},
7887
{name: 'albert joseph', parents: ['henry talbot', 'ruth sweetnam'], level: 5},
7988
{name: 'henry talbot', parents: ['jst', 'priscilla'], level: 6},
89+
{name: 'caroline leroux', parents: [], level: 6},
90+
{name: 'james yates', parents: ['richard yates', 'caroline nicolson'], level: 6},
8091
{name: 'ruth sweetnam', parents: [], level: 6},
8192
{name: 'mary ladoiska', parents: [], level: 5},
8293
{name: 'hannah marie', parents: [], level: 6},
8394
{name: 'alfred swift', parents: [], level: 6},
8495
{name: 'george r', parents: [], level: 6},
8596
{name: 'mary anne', parents: [], level: 6},
97+
{name: 'richard yates', parents: [], level: 7},
98+
{name: 'caroline nicolson', parents: [], level: 7},
99+
// {name: 'benjamin leroux', parents: [], level: 7},
100+
// {name: 'mary gauthier', parents: [], level: 7},
86101
{name: 'jst', parents: [], level: 7},
87102
{name: 'priscilla', parents: [], level: 7}
88103
]
@@ -91,13 +106,13 @@ var pairs = [
91106
{married: ['marie', 'dick']},
92107
{married: ['frederick', 'beatrice']},
93108
{married: ['margurite', 'paul']},
94-
{married: ['cynthia', 'husband']},
95109
{married: ['leora', 'george a']},
96110
{married: ['anona', 'arlos']},
97111
{married: ['anona', 'raymond']},
98112
{married: ['babe', 'frank']},
99113
{married: ['william yates', 'micky']},
100-
{married: ['ruth', 'dr jim']}
114+
{married: ['ruth', 'dr jim']},
115+
{married: ['lois', 'robert jr']}
101116
]
102117

103118
var metadata = {

0 commit comments

Comments
 (0)