create-clusters.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import * as d3 from 'd3'
  2. import util from './util'
  3. import addLabel from './label/add-label'
  4. function createClusters (selection, g) {
  5. const clusters = g.nodes().filter(function (v) { return util.isSubgraph(g, v) })
  6. let svgClusters = selection.selectAll('g.cluster')
  7. .data(clusters, function (v) { return v })
  8. svgClusters.selectAll('*').remove()
  9. svgClusters.enter()
  10. .append('g')
  11. .attr('class', 'cluster')
  12. .attr('id', function (v) {
  13. const node = g.node(v)
  14. return node.id
  15. })
  16. .style('opacity', 0)
  17. svgClusters = selection.selectAll('g.cluster')
  18. util.applyTransition(svgClusters, g)
  19. .style('opacity', 1)
  20. svgClusters.each(function (v) {
  21. const node = g.node(v)
  22. const thisGroup = d3.select(this)
  23. d3.select(this).append('rect')
  24. const labelGroup = thisGroup.append('g').attr('class', 'label')
  25. addLabel(labelGroup, node, node.clusterLabelPos)
  26. })
  27. svgClusters.selectAll('rect').each(function (c) {
  28. const node = g.node(c)
  29. const domCluster = d3.select(this)
  30. util.applyStyle(domCluster, node.style)
  31. })
  32. util.applyTransition(svgClusters.exit(), g)
  33. .style('opacity', 0)
  34. .remove()
  35. return svgClusters
  36. }
  37. export default createClusters