router.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. define(function () {
  2. return function () {
  3. var objects = { nodes: {}, links: {} }
  4. var targets = []
  5. var self = this
  6. function saveState(d) {
  7. var s = "#!"
  8. if (d) {
  9. if ("node" in d)
  10. s += "n:" + encodeURIComponent(d.node.nodeinfo.node_id)
  11. if ("link" in d)
  12. s += "l:" + encodeURIComponent(linkId(d.link))
  13. }
  14. window.history.pushState(s, undefined, s)
  15. }
  16. function resetView(push) {
  17. push = trueDefault(push)
  18. targets.forEach( function (t) {
  19. t.resetView()
  20. })
  21. if (push)
  22. saveState()
  23. }
  24. function gotoNode(d) {
  25. if (!d)
  26. return false
  27. targets.forEach( function (t) {
  28. t.gotoNode(d)
  29. })
  30. return true
  31. }
  32. function gotoLink(d) {
  33. if (!d)
  34. return false
  35. targets.forEach( function (t) {
  36. t.gotoLink(d)
  37. })
  38. return true
  39. }
  40. function loadState(s) {
  41. if (!s)
  42. return false
  43. if (!s.startsWith("#!"))
  44. return false
  45. var args = s.slice(2).split(":")
  46. var id
  47. if (args[1] !== undefined) {
  48. id = decodeURIComponent(args[1])
  49. if (args[0] === "n" && id in objects.nodes) {
  50. gotoNode(objects.nodes[id])
  51. return true
  52. }
  53. if (args[0] === "l" && id in objects.links) {
  54. gotoLink(objects.links[id])
  55. return true
  56. }
  57. }
  58. return false
  59. }
  60. self.start = function () {
  61. if (!loadState(window.location.hash))
  62. resetView(false)
  63. window.onpopstate = function (d) {
  64. if (!loadState(d.state))
  65. resetView(false)
  66. }
  67. }
  68. self.node = function (d) {
  69. return function () {
  70. if (gotoNode(d))
  71. saveState({ node: d })
  72. return false
  73. }
  74. }
  75. self.link = function (d) {
  76. return function () {
  77. if (gotoLink(d))
  78. saveState({ link: d })
  79. return false
  80. }
  81. }
  82. self.reset = function () {
  83. resetView()
  84. saveState()
  85. }
  86. self.addTarget = function (d) { targets.push(d) }
  87. self.setData = function (data) {
  88. objects.nodes = {}
  89. objects.links = {}
  90. data.nodes.all.forEach( function (d) {
  91. objects.nodes[d.nodeinfo.node_id] = d
  92. })
  93. data.graph.links.forEach( function (d) {
  94. objects.links[linkId(d)] = d
  95. })
  96. }
  97. return self
  98. }
  99. })