123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- document.addEventListener('DOMContentLoaded', function () {
- function htmlEntities(str) {
- return String(str)
- .replace(/&/g, '&')
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/"/g, '"');
- }
- function foundLazyModuleWithPath(path) {
- //path is like app/customers/customers.module#CustomersModule
- var split = path.split('#'),
- lazyModulePath = split[0],
- lazyModuleName = split[1];
- return lazyModuleName;
- }
- function getBB(selection) {
- selection.each(function (d) {
- d.bbox = this.getBBox();
- });
- }
- var test_cases, test_case, test_case_num, engine;
- var tree = ROUTES_INDEX;
- function cleanStringChildren(obj) {
- for (var property in obj) {
- if (obj.hasOwnProperty(property)) {
- if (property === 'children' && typeof obj[property] === 'object') {
- for (var i = obj[property].length - 1; i >= 0; i--) {
- if (typeof obj[property][i] === 'string') {
- obj[property].splice(i, 1);
- }
- }
- }
- if (typeof obj[property] === 'object') {
- cleanStringChildren(obj[property]);
- }
- }
- }
- }
- cleanStringChildren(tree);
- engine = d3.layout.tree().setNodeSizes(true);
- engine.spacing(function (a, b) {
- return a.parent == b.parent ? 0 : engine.rootXSize();
- });
- engine.nodeSize(function (d) {
- return [
- document.getElementById(d.id).getBBox()['height'] + 70,
- document.getElementById(d.id).getBBox()['width'] + 30
- ];
- });
- var nodes = d3.layout.hierarchy()(tree),
- svg = d3.select('#body-routes').append('svg'),
- svg_g = svg.append('g'),
- svg_p = svg.append('g'),
- last_id = 0,
- node = svg_g
- .selectAll('.node')
- .data(nodes, function (d) {
- return d.id || (d.id = ++last_id);
- })
- .enter()
- .append('g')
- .attr('class', 'node');
- svg.attr('id', 'main');
- svg_g.attr('transform', 'translate(20,0)').attr('id', 'main-group');
- svg_p.attr('transform', 'translate(20,0)').attr('id', 'paths');
- var infos_group = node.append('g').attr({
- id: function (d) {
- return d.id;
- },
- dx: 0,
- dy: 0
- });
- //Node icon
- infos_group
- .append('text')
- .attr('font-family', 'Ionicons')
- .attr('y', 5)
- .attr('x', 0)
- .attr('class', function (d) {
- return d.children || d._children ? 'icon has-children' : 'icon';
- })
- .attr('font-size', function (d) {
- return '15px';
- })
- .text(function (d) {
- return '\uf183';
- });
- //node infos
- infos_group
- .append('svg:text')
- .attr('x', function (d) {
- return 0;
- })
- .attr('y', function (d) {
- return 10;
- })
- .attr('dy', '.35em')
- .attr('class', 'text')
- .attr('text-anchor', function (d) {
- return 'start';
- })
- .html(function (d) {
- // if kind === module name + module
- // if kind === component component + path
- var _name = '';
- if (d.kind === 'module') {
- if (d.module) {
- _name +=
- '<tspan x="0" dy="1.4em"><a href="./modules/' +
- d.module +
- '.html">' +
- d.module +
- '</a></tspan>';
- if (d.name) {
- _name += '<tspan x="0" dy="1.4em">' + d.name + '</tspan>';
- }
- } else {
- _name += '<tspan x="0" dy="1.4em">' + htmlEntities(d.name) + '</tspan>';
- }
- } else if (d.kind === 'component') {
- _name += '<tspan x="0" dy="1.4em">' + d.path + '</tspan>';
- _name +=
- '<tspan x="0" dy="1.4em"><a href="./components/' +
- d.component +
- '.html">' +
- d.component +
- '</a></tspan>';
- if (d.outlet) {
- _name += '<tspan x="0" dy="1.4em"><outlet> : ' + d.outlet + '</tspan>';
- }
- } else {
- _name += '<tspan x="0" dy="1.4em">/' + d.path + '</tspan>';
- if (d.component) {
- _name +=
- '<tspan x="0" dy="1.4em"><a href="./components/' +
- d.component +
- '.html">' +
- d.component +
- '</a></tspan>';
- }
- if (d.loadChildren) {
- var moduleName = foundLazyModuleWithPath(d.loadChildren);
- _name +=
- '<tspan x="0" dy="1.4em"><a href="./modules/' +
- moduleName +
- '.html">' +
- moduleName +
- '</a></tspan>';
- }
- if (d.canActivate) {
- _name += '<tspan x="0" dy="1.4em">✓ canActivate</tspan>';
- }
- if (d.canDeactivate) {
- _name += '<tspan x="0" dy="1.4em">× canDeactivate</tspan>';
- }
- if (d.canActivateChild) {
- _name += '<tspan x="0" dy="1.4em">✓ canActivateChild</tspan>';
- }
- if (d.canLoad) {
- _name += '<tspan x="0" dy="1.4em">→ canLoad</tspan>';
- }
- if (d.redirectTo) {
- _name += '<tspan x="0" dy="1.4em">→ ' + d.redirectTo + '</tspan>';
- }
- if (d.pathMatch) {
- _name += '<tspan x="0" dy="1.4em">> ' + d.pathMatch + '</tspan>';
- }
- if (d.outlet) {
- _name += '<tspan x="0" dy="1.4em"><outlet> : ' + d.outlet + '</tspan>';
- }
- }
- return _name;
- })
- .call(getBB);
- //
- // Node lazy loaded ?
- //
- infos_group
- .append('svg:text')
- .attr('y', function (d) {
- return 45;
- })
- .attr('x', function (d) {
- return -18;
- })
- .attr('font-family', 'Ionicons')
- .attr('class', function (d) {
- return 'icon';
- })
- .attr('font-size', function (d) {
- return '15px';
- })
- .text(function (d) {
- var _text = '';
- if (d.loadChildren || d.loadComponent) {
- _text = '\uf4c1';
- }
- if (d.guarded) {
- _text = '\uf1b0';
- }
- return _text;
- });
- //Node text background
- infos_group
- .insert('rect', 'text')
- .attr('width', function (d) {
- return d.bbox.width;
- })
- .attr('height', function (d) {
- return d.bbox.height;
- })
- .attr('y', function (d) {
- return 15;
- })
- .style('fill', 'white')
- .style('fill-opacity', 0.75);
- nodes = engine.nodes(tree);
- function node_extents(n) {
- return [n.x - n.x_size / 2, n.y, n.x + n.x_size / 2, n.y + n.y_size];
- }
- var root_extents = node_extents(nodes[0]);
- var xmin = root_extents[0],
- ymin = root_extents[1],
- xmax = root_extents[2],
- ymax = root_extents[3],
- area_sum = (xmax - xmin) * (ymax - ymin),
- x_size_min = nodes[0].x_size,
- y_size_min = nodes[0].y_size;
- nodes.slice(1).forEach(function (n) {
- var ne = node_extents(n);
- xmin = Math.min(xmin, ne[0]);
- ymin = Math.min(ymin, ne[1]);
- xmax = Math.max(xmax, ne[2]);
- ymax = Math.max(ymax, ne[3]);
- area_sum += (ne[2] - ne[0]) * (ne[3] - ne[1]);
- x_size_min = Math.min(x_size_min, n.x_size);
- y_size_min = Math.min(y_size_min, n.y_size);
- });
- var area_ave = area_sum / nodes.length;
- var scale = 80 / Math.sqrt(area_ave);
- function svg_x(node_y) {
- return node_y - ymin;
- }
- function svg_y(node_x) {
- return (node_x - xmin) * scale;
- }
- var nodebox_right_margin = Math.min(x_size_min * scale, 10);
- var nodebox_vertical_margin = Math.min(y_size_min * scale, 3);
- node.attr('transform', function (d) {
- return 'translate(' + svg_x(d.y) + ',' + svg_y(d.x) + ')';
- });
- var diagonal = d3.svg.diagonal().projection(function (d) {
- return [svg_x(d.y), svg_y(d.x)];
- });
- var links = engine.links(nodes);
- var links = svg_p
- .selectAll('.link')
- .data(links)
- .enter()
- .append('path')
- .attr('class', 'link')
- .attr('d', diagonal);
- var _svg = document.getElementById('main'),
- main_g = _svg.childNodes[0];
- _svg.removeChild(main_g);
- _svg.appendChild(main_g);
- svg.attr({
- width: document.getElementById('main-group').getBBox()['width'] + 30,
- height: document.getElementById('main-group').getBBox()['height'] + 50
- });
- });
|