router.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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:" + d.node.nodeinfo.node_id
  11. if ("link" in d)
  12. s += "l:" + 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. targets.forEach( function (t) {
  26. t.gotoNode(d)
  27. })
  28. }
  29. function gotoLink(d) {
  30. targets.forEach( function (t) {
  31. t.gotoLink(d)
  32. })
  33. }
  34. function loadState(s) {
  35. if (!s)
  36. return false
  37. if (!s.startsWith("#!"))
  38. return false
  39. var args = s.slice(2).split(":")
  40. var id
  41. if (args[0] === "n") {
  42. id = args[1]
  43. if (id in objects.nodes) {
  44. gotoNode(objects.nodes[id])
  45. return true
  46. }
  47. }
  48. if (args[0] === "l") {
  49. id = args[1]
  50. if (id in objects.links) {
  51. gotoLink(objects.links[id])
  52. return true
  53. }
  54. }
  55. return false
  56. }
  57. self.start = function () {
  58. if (!loadState(window.location.hash))
  59. resetView(false)
  60. window.onpopstate = function (d) {
  61. if (!loadState(d.state))
  62. resetView(false)
  63. }
  64. }
  65. self.node = function (d) {
  66. return function () {
  67. gotoNode(d)
  68. saveState({ node: d })
  69. return false
  70. }
  71. }
  72. self.link = function (d) {
  73. return function () {
  74. gotoLink(d)
  75. saveState({ link: d })
  76. return false
  77. }
  78. }
  79. self.reset = function () {
  80. resetView()
  81. saveState()
  82. }
  83. self.addTarget = function (d) { targets.push(d) }
  84. self.setData = function (nodes, links) {
  85. objects.nodes = {}
  86. objects.links = {}
  87. nodes.forEach( function (d) {
  88. objects.nodes[d.nodeinfo.node_id] = d
  89. })
  90. links.forEach( function (d) {
  91. objects.links[linkId(d)] = d
  92. })
  93. }
  94. return self
  95. }
  96. })