Skip to content

Commit

Permalink
add rxjs
Browse files Browse the repository at this point in the history
  • Loading branch information
wkw307 committed Oct 30, 2019
1 parent c0545e5 commit f683dca
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 107 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
"d3": "^5.7.0",
"jest-cli": "^24.9.0",
"jquery": "^3.3.1",
"lodash": "^4.17.15"
"lodash": "^4.17.15",
"rxjs": "^6.5.3"
},
"devDependencies": {
"@types/jest": "^24.0.19",
Expand Down
125 changes: 125 additions & 0 deletions src/draw-tree.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import * as d3 from 'd3';
import { map, distinctUntilChanged, debounce, filter } from 'rxjs/operators';
import { interval } from 'rxjs';

import { buildTree } from './facet-tree-ng';
import { drawFacetPieChart } from './facet-pie-chart';
import { drawFacetForceLayout } from './facet-force-layout';
import { globalState } from './state';

function drawTree(svg, data, clickFacet): void {
const canvas = d3.select(svg);
const treeData = buildTree(data, svg);

globalState.pipe(
debounce(() => interval(1000)),
map(state => state.currentFacetId),
distinctUntilChanged()
).subscribe(currentFacetId => {
clickFacet(currentFacetId);
});

globalState.pipe(
debounce(() => interval(1000)),
map(state => state.expandedFacetId),
filter(expandedFacetId => {
const [prev, curr] = expandedFacetId.split(',');
return prev !== curr;
}),
distinctUntilChanged()
).subscribe(expandedFacetId => {
const [prev, curr] = expandedFacetId.split(',');
if (prev !== '-2') {
// delete force layout
const expandedNodes = document.getElementsByClassName(prev);
while (expandedNodes.length) {
expandedNodes[0].parentNode.removeChild(expandedNodes[0]);
}
// draw pie chart
drawFacetPieChart(treeData.facetChart.filter(x => x.facetId.toString() === prev)[0], svg, treeData, clickFacet);
}
if (curr !== '-2') {
// delete pie chart
const expandedNodes = document.getElementsByClassName(curr);
while (expandedNodes.length) {
expandedNodes[0].parentNode.removeChild(expandedNodes[0]);
}
// draw force layout
drawFacetForceLayout(treeData.facetChart.filter(x => x.facetId.toString() === curr)[0], svg, clickFacet);
}
});


// draw branches
canvas.append('g')
.selectAll('rect')
.data(treeData.branches)
.enter()
.append('rect')
.attr('y', function (d) { return d.y })
.attr('x', function (d) { return d.x })
.attr('height', function (d) { return d.height })
.attr('width', function (d) { return d.width })
.attr('fill', function (d) { return d.color });
// draw foldBranches
canvas.append('g')
.selectAll('rect')
.data(treeData.foldBranches)
.enter()
.append('rect')
.attr('y', function (d) { return d.y })
.attr('x', function (d) { return d.x })
.attr('height', function (d) { return d.height })
.attr('width', function (d) { return d.width })
.attr('fill', function (d) { return d.color })
.attr('transform', function (d) { return d.transform });
// draw first layer facet
canvas.append('g')
.selectAll('circle')
.data(treeData.leaves)
.enter()
.append('circle')
.attr('cx', (d) => d.cx)
.attr('cy', d => d.cy)
.attr('r', (d, i) => {
return treeData.treeData[i].containChildrenFacet ? 0 : d.r * 1.5;
})
.attr('fill', d => d.color)
.style('cursor', 'pointer')
.on('click', (d, i) => clickFacet(treeData.branches[i].facetId, treeData.branches[i].facetName));
// draw second layer facet
treeData.facetChart.forEach(element => {
// 饼图
drawFacetPieChart(element, svg, treeData, clickFacet);
// 力导向图
// drawFacetForceLayout(element, svg);
});
// draw first layer facet name
const texts = canvas.append('g')
.selectAll('text')
.data(treeData.texts)
.enter()
.append('text')
.attr('font-size', d => d.fontSize + 'px')
.attr('x', d => d.x)
.attr('y', d => d.y)
.attr('fill', '#fff');
treeData.texts.forEach((element, index) => {
d3.select((texts as any)._groups[0][index])
.selectAll('tspan')
.data(element.text.split(''))
.enter()
.append('tspan')
.attr('x', element.x)
.attr('dy', '1.2em')
.text(d => d);
});
// draw topic name
canvas.append('g')
.append('text')
.attr('x', svg.clientWidth / 2 - 24 * data.topicName.length / 2)
.attr('y', svg.clientHeight - 10)
.text(data.topicName)
.attr('fill', '#000')
.attr('font-size', '24px');
}
109 changes: 4 additions & 105 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,43 +8,16 @@ import { drawFacetPieChart } from './facet-pie-chart';
import { drawFacetForceLayout } from './facet-force-layout';

const svg = document.getElementById('mysvg');
const treeData = buildTree(data, svg);
console.log('data', data);
console.log('treeData:', treeData);

let currentFacetId = -1;
let expandedFacetId = -2;

async function clickFacet(facetId: number, facetName: string, parentFacetId = -2) {
// return when facetId not change
if (currentFacetId === facetId) return;

// save facetId
currentFacetId = facetId;

if (expandedFacetId !== -2 && expandedFacetId !== parentFacetId) {
// delete force layout
const expandedNodes = document.getElementsByClassName(expandedFacetId.toString());
while (expandedNodes.length) {
expandedNodes[0].parentNode.removeChild(expandedNodes[0]);
}
// draw pie chart
drawFacetPieChart(treeData.facetChart.filter(x => x.facetId === expandedFacetId)[0], svg, treeData, clickFacet);
// reset expandedFacetId
expandedFacetId = -2;
}

if (parentFacetId !== -2 && expandedFacetId !== parentFacetId) {
expandedFacetId = parentFacetId;
// delete pie chart
const expandedNodes = document.getElementsByClassName(expandedFacetId.toString());
while (expandedNodes.length) {
expandedNodes[0].parentNode.removeChild(expandedNodes[0]);
}
// draw force layout
drawFacetForceLayout(treeData.facetChart.filter(x => x.facetId === expandedFacetId)[0], svg, clickFacet);
}

// empty list
const list = document.getElementById('list');
const children = list.childNodes;
Expand All @@ -61,7 +34,7 @@ async function clickFacet(facetId: number, facetName: string, parentFacetId = -2
facetId: facetId,
},
});

if ((res as any).data.code === 200) {
const assembleList = res.data.data;
(assembleList as any).forEach(element => {
Expand All @@ -77,7 +50,7 @@ async function clickFacet(facetId: number, facetName: string, parentFacetId = -2
});
assembleNumber = assembleList.length;
} else {
throw('api error');
throw ('api error');
}
} catch (e) {
console.log(e);
Expand All @@ -88,78 +61,4 @@ async function clickFacet(facetId: number, facetName: string, parentFacetId = -2
document.getElementById('facet').innerHTML = facetName;
document.getElementById('assembleNumber').innerHTML = assembleNumber.toString();
}
}

const canvas = d3.select('#mysvg');
canvas.append('g')
.selectAll('rect')
.data(treeData.branches)
.enter()
.append('rect')
.attr('y', function(d) {return d.y})
.attr('x', function(d) {return d.x})
.attr('height', function(d) {return d.height})
.attr('width', function(d) {return d.width})
.attr('fill', function(d) {return d.color});

canvas.append('g')
.selectAll('rect')
.data(treeData.foldBranches)
.enter()
.append('rect')
.attr('y', function(d) {return d.y})
.attr('x', function(d) {return d.x})
.attr('height', function(d) {return d.height})
.attr('width', function(d) {return d.width})
.attr('fill', function(d) {return d.color})
.attr('transform', function(d) {return d.transform});

canvas.append('g')
.selectAll('circle')
.data(treeData.leaves)
.enter()
.append('circle')
.attr('cx', (d) => d.cx)
.attr('cy', d => d.cy)
.attr('r', (d, i) => {
return treeData.treeData[i].containChildrenFacet ? 0 : d.r * 1.5;
})
.attr('fill', d => d.color)
.style('cursor', 'pointer')
.on('click',(d, i) => clickFacet(treeData.branches[i].facetId, treeData.branches[i].facetName));

treeData.facetChart.forEach(element => {
// 饼图
drawFacetPieChart(element, svg, treeData, clickFacet);
// 力导向图
// drawFacetForceLayout(element, svg);
});

const texts = canvas.append('g')
.selectAll('text')
.data(treeData.texts)
.enter()
.append('text')
.attr('font-size', d => d.fontSize + 'px')
.attr('x', d => d.x)
.attr('y', d => d.y)
.attr('fill', '#fff');

treeData.texts.forEach((element, index) => {
d3.select((texts as any)._groups[0][index])
.selectAll('tspan')
.data(element.text.split(''))
.enter()
.append('tspan')
.attr('x', element.x)
.attr('dy', '1.2em')
.text(d => d);
});

canvas.append('g')
.append('text')
.attr('x', svg.clientWidth / 2 - 24 * data.topicName.length / 2)
.attr('y', svg.clientHeight - 10)
.text(data.topicName)
.attr('fill', '#000')
.attr('font-size', '24px');
}
6 changes: 6 additions & 0 deletions src/state.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { BehaviorSubject } from 'rxjs';

export const globalState = new BehaviorSubject({
currentFacetId: -1,
expandedFacetId: '-2,-2',
});
2 changes: 1 addition & 1 deletion yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4904,7 +4904,7 @@ rw@1:
resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=

rxjs@^6.4.0:
rxjs@^6.4.0, rxjs@^6.5.3:
version "6.5.3"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a"
integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==
Expand Down

0 comments on commit f683dca

Please sign in to comment.