router.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. 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[1] !== undefined) {
  42. id = decodeURIComponent(args[1])
  43. if (args[0] === "n" && id in objects.nodes) {
  44. gotoNode(objects.nodes[id])
  45. return true
  46. }
  47. if (args[0] === "l" && id in objects.links) {
  48. gotoLink(objects.links[id])
  49. return true
  50. }
  51. }
  52. return false
  53. }
  54. self.start = function () {
  55. if (!loadState(window.location.hash))
  56. resetView(false)
  57. window.onpopstate = function (d) {
  58. if (!loadState(d.state))
  59. resetView(false)
  60. }
  61. }
  62. self.node = function (d) {
  63. return function () {
  64. gotoNode(d)
  65. saveState({ node: d })
  66. return false
  67. }
  68. }
  69. self.link = function (d) {
  70. return function () {
  71. gotoLink(d)
  72. saveState({ link: d })
  73. return false
  74. }
  75. }
  76. self.reset = function () {
  77. resetView()
  78. saveState()
  79. }
  80. self.addTarget = function (d) { targets.push(d) }
  81. self.setData = function (data) {
  82. objects.nodes = {}
  83. objects.links = {}
  84. data.nodes.all.forEach( function (d) {
  85. objects.nodes[d.nodeinfo.node_id] = d
  86. })
  87. data.links.forEach( function (d) {
  88. objects.links[linkId(d)] = d
  89. })
  90. }
  91. return self
  92. }
  93. })