@vertexvis/viewer 0.21.0-testing.2 → 0.21.0-testing.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/cjs/{controller-9e5744ec.js → controller-004b9f2c.js} +197 -4
  2. package/dist/cjs/controller-004b9f2c.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +2 -2
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/{queries-b9bf26dd.js → queries-731d8cf1.js} +40 -12
  6. package/dist/cjs/queries-731d8cf1.js.map +1 -0
  7. package/dist/cjs/vertex-scene-tree.cjs.entry.js +24 -11
  8. package/dist/cjs/vertex-scene-tree.cjs.entry.js.map +1 -1
  9. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js +6 -0
  10. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js.map +1 -1
  11. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +1 -1
  12. package/dist/cjs/vertex-viewer.cjs.entry.js +1 -1
  13. package/dist/cjs/viewer.cjs.js +1 -1
  14. package/dist/collection/components/scene-tree/lib/controller.js +5 -0
  15. package/dist/collection/components/scene-tree/lib/controller.js.map +1 -1
  16. package/dist/collection/components/scene-tree/lib/viewer-ops.js +4 -2
  17. package/dist/collection/components/scene-tree/lib/viewer-ops.js.map +1 -1
  18. package/dist/collection/components/scene-tree/scene-tree.js +50 -12
  19. package/dist/collection/components/scene-tree/scene-tree.js.map +1 -1
  20. package/dist/collection/components/scene-tree/types.js.map +1 -1
  21. package/dist/collection/components/viewer-measurement-distance/viewer-measurement-distance.js +6 -0
  22. package/dist/collection/components/viewer-measurement-distance/viewer-measurement-distance.js.map +1 -1
  23. package/dist/collection/lib/scenes/mapper.js +34 -8
  24. package/dist/collection/lib/scenes/mapper.js.map +1 -1
  25. package/dist/collection/lib/scenes/queries.js +5 -3
  26. package/dist/collection/lib/scenes/queries.js.map +1 -1
  27. package/dist/components/controller.js +196 -3
  28. package/dist/components/controller.js.map +1 -1
  29. package/dist/components/queries.js +39 -11
  30. package/dist/components/queries.js.map +1 -1
  31. package/dist/components/vertex-scene-tree.js +24 -10
  32. package/dist/components/vertex-scene-tree.js.map +1 -1
  33. package/dist/components/vertex-viewer-measurement-distance.js +6 -0
  34. package/dist/components/vertex-viewer-measurement-distance.js.map +1 -1
  35. package/dist/esm/{controller-f2beee15.js → controller-6d2fbb9b.js} +197 -4
  36. package/dist/esm/controller-6d2fbb9b.js.map +1 -0
  37. package/dist/esm/index.js +2 -2
  38. package/dist/esm/index.mjs +2 -2
  39. package/dist/esm/loader.js +1 -1
  40. package/dist/esm/loader.mjs +1 -1
  41. package/dist/esm/{queries-78f566c5.js → queries-3bd4cfe1.js} +40 -12
  42. package/dist/esm/queries-3bd4cfe1.js.map +1 -0
  43. package/dist/esm/vertex-scene-tree.entry.js +24 -11
  44. package/dist/esm/vertex-scene-tree.entry.js.map +1 -1
  45. package/dist/esm/vertex-viewer-measurement-distance.entry.js +6 -0
  46. package/dist/esm/vertex-viewer-measurement-distance.entry.js.map +1 -1
  47. package/dist/esm/vertex-viewer-pin-group.entry.js +1 -1
  48. package/dist/esm/vertex-viewer.entry.js +1 -1
  49. package/dist/esm/viewer.js +1 -1
  50. package/dist/types/components/scene-tree/lib/controller.d.ts +4 -0
  51. package/dist/types/components/scene-tree/lib/viewer-ops.d.ts +1 -1
  52. package/dist/types/components/scene-tree/scene-tree.d.ts +7 -1
  53. package/dist/types/components/scene-tree/types.d.ts +5 -0
  54. package/dist/types/components.d.ts +13 -5
  55. package/dist/types/lib/scenes/queries.d.ts +4 -2
  56. package/dist/viewer/index.esm.js +1 -1
  57. package/dist/viewer/p-0f4f3757.js +5 -0
  58. package/dist/viewer/p-0f4f3757.js.map +1 -0
  59. package/dist/viewer/{p-1486ba3d.entry.js → p-70d29252.entry.js} +2 -2
  60. package/dist/viewer/{p-33627452.entry.js → p-be1fd8a7.entry.js} +2 -2
  61. package/dist/viewer/p-ccb5ff47.js +5 -0
  62. package/dist/viewer/p-ccb5ff47.js.map +1 -0
  63. package/dist/viewer/p-d41913d2.entry.js +5 -0
  64. package/dist/viewer/p-d41913d2.entry.js.map +1 -0
  65. package/dist/viewer/{p-f8c3e667.entry.js → p-d8626aa7.entry.js} +2 -2
  66. package/dist/viewer/p-d8626aa7.entry.js.map +1 -0
  67. package/dist/viewer/viewer.esm.js +1 -1
  68. package/dist/viewer/viewer.esm.js.map +1 -1
  69. package/package.json +8 -8
  70. package/dist/cjs/controller-9e5744ec.js.map +0 -1
  71. package/dist/cjs/queries-b9bf26dd.js.map +0 -1
  72. package/dist/esm/controller-f2beee15.js.map +0 -1
  73. package/dist/esm/queries-78f566c5.js.map +0 -1
  74. package/dist/viewer/p-07b05774.entry.js +0 -5
  75. package/dist/viewer/p-07b05774.entry.js.map +0 -1
  76. package/dist/viewer/p-564f9027.js +0 -5
  77. package/dist/viewer/p-564f9027.js.map +0 -1
  78. package/dist/viewer/p-949afb47.js +0 -5
  79. package/dist/viewer/p-949afb47.js.map +0 -1
  80. package/dist/viewer/p-f8c3e667.entry.js.map +0 -1
  81. /package/dist/viewer/{p-1486ba3d.entry.js.map → p-70d29252.entry.js.map} +0 -0
  82. /package/dist/viewer/{p-33627452.entry.js.map → p-be1fd8a7.entry.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scene-tree.js","sourceRoot":"","sources":["../../../../../src/components/scene-tree/scene-tree.tsx"],"names":[],"mappings":";AAAA,OAAO,8BAA8B,CAAC;AAEtC,OAAO,EACL,SAAS,EACT,OAAO,EACP,KAAK,EAEL,WAAW,EACX,CAAC,EACD,IAAI,EACJ,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,GACN,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAG7G,OAAO,EAAU,WAAW,EAAiB,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAEL,mBAAmB,GAEpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,qCAAqC,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,WAAW,EAAO,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,mBAAmB,EACnB,UAAU,EACV,sBAAsB,EACtB,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAU1B;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,EAAE,CAAC;AA4BpC;;;;;;GAMG;AAMH,MAAM,OAAO,SAAS;EALtB;IAME;;;;OAIG;IAEI,kBAAa,GAAG,EAAE,CAAC;IAmD1B;;;;;OAKG;IAEI,cAAS,GAAgB,UAAU,CAAC;IAK3C;;OAEG;IAEI,6BAAwB,GAAG,KAAK,CAAC;IAExC;;OAEG;IAEI,uBAAkB,GAAkB,EAAE,CAAC;IAE9C;;;OAGG;IAEI,iBAAY,GAAkB,EAAE,CAAC;IAiBhC,SAAI,GAAU,EAAE,CAAC;IAGjB,cAAS,GAAG,CAAC,CAAC;IAGd,eAAU,GAAG,KAAK,CAAC;IAGnB,qBAAgB,GAAG,KAAK,CAAC;IAEjC;;;;OAIG;IAEK,aAAQ,GAAa;MAC3B,eAAe,EAAE,KAAK;KACvB,CAAC;IAMM,oBAAe,GAAG,KAAK,CAAC;IAMxB,sBAAiB,GAAG,KAAK,CAAC;GAytBnC;EAvtBC;;;;;;;KAOG;EAEI,KAAK,CAAC,cAAc;IACzB,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;EACvC,CAAC;EAED;;;;;KAKG;EAEI,KAAK,CAAC,aAAa,CACxB,KAAa,EACb,UAA2B,EAAE;IAE7B,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAEvD,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAElD,IAAI,CAAC,gBAAgB,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE;MAC5C,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACzC,CAAC,CAAC;EACL,CAAC;EAED;;;;;;;KAOG;EAEI,KAAK,CAAC,YAAY,CACvB,MAAc,EACd,UAA2B,EAAE;;IAE7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,iBAAiB,CAAC,MAAM,CAAC,CAAA,CAAC;IAE/D,IAAI,KAAK,IAAI,IAAI,IAAI,gBAAgB,KAAK,IAAI,CAAC,SAAS,EAAE;MACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,MAAM,oBAAoB,GAAG,KAAK,IAAmB,EAAE;UACrD,QAAQ,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;UACrE,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;UACzC,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;MACpE,CAAC,CAAC,CAAC;KACJ;SAAM,IAAI,KAAK,IAAI,IAAI,EAAE;MACxB,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;KAC1C;EACH,CAAC;EAED;;KAEG;EAEI,KAAK,CAAC,SAAS;;IACpB,MAAM,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,SAAS,EAAE,CAAA,CAAC;EACrC,CAAC;EAED;;KAEG;EAEI,KAAK,CAAC,WAAW;;IACtB,MAAM,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,WAAW,EAAE,CAAA,CAAC;EACvC,CAAC;EAED;;;;;KAKG;EAEI,KAAK,CAAC,UAAU,CAAC,GAAW;IACjC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;;MACzD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;QAClB,MAAM,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,UAAU,CAAC,EAAE,CAAC,CAAA,CAAC;OACvC;IACH,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;KAKG;EAEI,KAAK,CAAC,YAAY,CAAC,GAAW;IACnC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;;MACzD,IAAI,IAAI,CAAC,QAAQ,EAAE;QACjB,MAAM,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,YAAY,CAAC,EAAE,CAAC,CAAA,CAAC;OACzC;IACH,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;KAKG;EAEI,KAAK,CAAC,gBAAgB,CAAC,GAAW;IACvC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;MACrD,IAAI,IAAI,CAAC,QAAQ,EAAE;QACjB,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;OAC/B;WAAM;QACL,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;OAC7B;IACH,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;KAKG;EAEI,KAAK,CAAC,oBAAoB,CAAC,GAAW;IAC3C,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;MACjE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE;QACzC,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;OAC5B;WAAM;QACL,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;OAC5B;IACH,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;KAKG;EAEI,KAAK,CAAC,QAAQ,CAAC,GAAW;IAC/B,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;MACjE,IAAI,IAAI,CAAC,OAAO,EAAE;QAChB,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;OAC5B;IACH,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;KAKG;EAEI,KAAK,CAAC,QAAQ,CAAC,GAAW;IAC/B,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;MACjE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACjB,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;OAC5B;IACH,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;;;;;;;;;KAaG;EAEI,KAAK,CAAC,UAAU,CACrB,GAAW,EACX,KAAmD,EAAE;QAArD,EAAE,aAAa,OAAsC,EAAjC,OAAO,cAA3B,iBAA6B,CAAF;IAE3B,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE;;MAC3D,MAAM,SAAS,GAAG,CAAC,MAAM,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,kBAAkB,CAAC,EAAE,CAAC,CAAA,CAAC,IAAI,EAAE,CAAC;MACxE,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,0CAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;MAE3D,IAAI,aAAa,IAAI,QAAQ,EAAE;QAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,QAAQ,IAAI,IAAI,EAAE;UACpB,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;UACzC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;SAC9B;OACF;WAAM,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,EAAE;QAC3D,MAAM,eAAe,GAAG,MAAM,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,iBAAiB,CAAC,EAAE,CAAC,CAAA,CAAC;QACrE,MAAM,uBAAuB,GAC3B,MAAM,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA,CAAC;QAEpE,IAAI,uBAAuB,IAAI,eAAe,EAAE;UAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;UACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;UAC/D,MAAM,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;SAC3D;OACF;WAAM;QACL,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;OAC9B;MAED,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG;QAC5B,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,GAAG,KAAI,EAAE,CAAC;QAC3C,EAAE;OACH,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;KAKG;EAEI,KAAK,CAAC,YAAY,CAAC,GAAW;IACnC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;MACjE,IAAI,IAAI,CAAC,QAAQ,EAAE;QACjB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,MAAM,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;OAChC;IACH,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;;KAMG;EAEI,KAAK,CAAC,aAAa,CAAC,KAAa;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EAC1B,CAAC;EAED;;;;;;;KAOG;EAEI,KAAK,CAAC,cAAc,CAAC,KAAgC;IAC1D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAElC,IACE,MAAM,IAAI,IAAI;MACd,IAAI,CAAC,YAAY,IAAI,IAAI;MACzB,2BAA2B,CAAC,IAAI,CAAC,EAAE,EAAE,MAAqB,CAAC;MAC3D,2BAA2B,CAAC,MAAM,CAAC,EACnC;MACA,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;KACtC;SAAM;MACL,OAAO,SAAS,CAAC;KAClB;EACH,CAAC;EAED;;;;;KAKG;EAEI,eAAe,CAAC,OAAe;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,CAAC,OAAO,GAAG,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC,SAAS,CAC7D,CAAC;IACF,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;EACnC,CAAC;EAED;;;;;;;;;KASG;EAEI,KAAK,CAAC,WAAW,CACtB,IAAY,EACZ,UAA6B,EAAE;;IAE/B,OAAO,MAAA,IAAI,CAAC,UAAU,0CAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;EAChD,CAAC;EAED;;;;;;KAMG;EAEI,KAAK,CAAC,mBAAmB,CAC9B,IAAY,EACZ,OAAmC;IAEnC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;MACvB,MAAM,mBAAmB,GACvB,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;QAChC,CAAC,CAAC,IAAI,CAAC,kBAAkB;QACzB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;MAExB,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;QACpC,OAAO,CAAC,IAAI,CACV,gGAAgG,CACjG,CAAC;OACH;MAED,MAAM,eAAe,GACnB,mBAAmB,CAAC,MAAM,GAAG,CAAC;QAC5B,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;MAEjC,MAAM,mBAAmB,CACvB,IAAI,CAAC,MAAM,EACX,IAAI,EACJ,eAAe,EACf,IAAI,CAAC,wBAAwB,kBAE3B,MAAM,EAAE,KAAK,IACV,OAAO,EAEb,CAAC;KACH;EACH,CAAC;EAED;;;;;;;KAOG;EAEI,KAAK,CAAC,iBAAiB;;IAC5B,OAAO,MAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,iBAAiB,EAAE,mCAAI,EAAE,CAAC;EACpD,CAAC;EAED;;KAEG;EACO,oBAAoB;;IAC5B,MAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,0CAAE,OAAO,EAAE,CAAC;IAC1C,MAAA,IAAI,CAAC,UAAU,0CAAE,MAAM,EAAE,CAAC;EAC5B,CAAC;EAED;;KAEG;EACO,iBAAiB;;IACzB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE;MAC3B,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC;MACnD,MAAM,MAAM,GAAG,IAAI,kBAAkB,CACnC,aAAa,EACb,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,kCAAkC;QACvD,CAAC,CAAC;UACE,SAAS,EAAE,qCAAqC;SACjD;QACH,CAAC,CAAC,SAAS,CACd,CAAC;MACF,IAAI,CAAC,UAAU,GAAG,IAAI,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;MACvD,MAAA,IAAI,CAAC,UAAU,0CAAE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;KACrD;IAED,IAAI,CAAC,QAAQ,CAAC,uBAAuB,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CACtE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CACnD,CAAC;IAEF,IAAI,CAAC,eAAe,EAAE,CAAC;EACzB,CAAC;EAED;;KAEG;EACO,KAAK,CAAC,gBAAgB;;IAC9B,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC3B,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE;MAC7C,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,cAAc,CAAC;IAE9C,IAAI,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC;IAErC,MAAA,IAAI,CAAC,UAAU,0CAAE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAEpD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;MACvB,IAAI,CAAC,YAAY,GAAG,IAAI,qBAAqB,CAC3C,gBAAgB,EAChB,kBAAkB,CAAC,cAAc,CAClC,CAAC;KACH;EACH,CAAC;EAEM,mBAAmB;IACxB,yDAAyD;IACzD,uDAAuD;IACvD,IAAI,CAAC,mBAAmB,EAAE,CAAC;EAC7B,CAAC;EAED;;KAEG;EACO,MAAM;IACd,OAAO,CACL,EAAC,IAAI;MACH,WAAK,KAAK,EAAC,QAAQ;QACjB,YAAM,IAAI,EAAC,QAAQ;UACjB,iCAA2B,KAAK,EAAC,gBAAgB;YAC/C,gCAA0B,UAAU,EAAE,IAAI,CAAC,UAAU,GAAI,CAC/B,CACvB,CACH;MAEL,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;MAEhE,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,CAC5B,WAAK,KAAK,EAAC,aAAa;QACrB,IAAI,CAAC,UAAU,IAAI,CAClB,YAAM,IAAI,EAAC,SAAS;UAClB,6BAAuB,KAAK,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,GAAG,CAC9C,CACR;QACD,eAAQ;QACP,IAAI,CAAC,gBAAgB,IAAI,CACxB,YAAM,IAAI,EAAC,eAAe;UACxB,WAAK,KAAK,EAAC,eAAe,wBAAwB,CAC7C,CACR,CACG,CACP;MAED,WAAK,KAAK,EAAC,QAAQ;QACjB,YAAM,IAAI,EAAC,QAAQ,GAAG,CAClB,CACD,CACR,CAAC;EACJ,CAAC;EAEO,WAAW,CAAC,OAA8B;IAChD,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,CAAC,mBAAmB,EAAE;MAC3D,OAAO,CACL,EAAC,cAAc,IAAC,OAAO,EAAE,OAAO;QAC9B,cACE,KAAK,EAAC,yBAAyB,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAC1C,QAAQ,EAAE,IAAI,CAAC,eAAe,YAGvB,CACM,CAClB,CAAC;KACH;SAAM;MACL,OAAO,EAAC,cAAc,IAAC,OAAO,EAAE,OAAO,GAAI,CAAC;KAC7C;EACH,CAAC;EAED;;KAEG;EAEO,mBAAmB,CAC3B,SAA8C,EAC9C,SAA8C;IAE9C,yEAAyE;IACzE,wEAAwE;IACxE,gCAAgC;IAChC,+DAA+D;IAC/D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE;MAClC,OAAO;KACR;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;EACzB,CAAC;EAED;;KAEG;EAEO,uBAAuB,CAAC,aAAkC;;IAClE,yEAAyE;IACzE,wEAAwE;IACxE,gCAAgC;IAChC,+DAA+D;IAC/D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE;MAClC,OAAO;KACR;IAED,MAAA,IAAI,CAAC,QAAQ,CAAC,uBAAuB,0CAAE,OAAO,EAAE,CAAC;IAEjD,IAAI,CAAC,QAAQ,CAAC,uBAAuB,GAAG,aAAa,CAAC,aAAa,CAAC,EAAE,CACpE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CACnD,CAAC;IAEF,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;EACnD,CAAC;EAED;;KAEG;EAEO,yBAAyB;;IACjC,MAAA,IAAI,CAAC,UAAU,0CAAE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;EACtD,CAAC;EAEO,oBAAoB;IAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,eAAe,EAAE,CAAC;EACzB,CAAC;EAEO,eAAe;;IACrB,MAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,0CAAE,OAAO,EAAE,CAAC;IAE1C,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;MACtD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAE3C,CAAC;KACf;IAED,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;MACvB,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,eAAe,CAC/D,IAAI,CAAC,MAAM,CACZ,CAAC;KACH;SAAM;MACL,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;KAC9B;EACH,CAAC;EAEO,uBAAuB;IAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,IAAI,EAAE;MACxC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;KACzD;IAED,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAAE,EAAE;;MAChE,MAAM,SAAS,GAAG,MAAA,GAAG,CAAC,aAAa,+CAAjB,GAAG,CAAkB,CAAC;MAExC,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI,wBAAwB,EAAE;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,kBAAkB,CAAC;QAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC;QAC3C,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAChB,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAI,EAAE,CAAC;QAEtE,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE;UAChC,MAAA,IAAI,CAAC,UAAU,0CAAE,2BAA2B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;SAC9D;OACF;WAAM;QACL,IAAI,CAAC,uBAAuB,EAAE,CAAC;OAChC;IACH,CAAC,CAAC,CAAC;EACL,CAAC;EAEO,2BAA2B,CAAC,KAAqB;IACvD,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC5C,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC;IACvD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACvB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAEjC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE;MACvC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;MAC7C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;KACrD;SAAM,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,cAAc,EAAE;MACnD,IAAI,CAAC,YAAY,GAAG,IAAI,qBAAqB,CAC3C,cAAc,EACd,kBAAkB,CAAC,YAAY,CAChC,CAAC;KACH;SAAM;MACL,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;KAC/B;IAED,IACE,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW;MACrC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,EACnC;MACA,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;KAC9B;EACH,CAAC;EAEO,KAAK,CAAC,mBAAmB,CAC/B,UAAwC,EACxC,EAAoB;IAEpB,MAAM,GAAG,GACP,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEtE,IAAI,GAAG,IAAI,IAAI,EAAE;MACf,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;KACxE;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAE/C,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE;MACnB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;KAC1E;IAED,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;MACvB,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;KACH;IAED,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;EAC3D,CAAC;EAGS,KAAK,CAAC,YAAY,CAAC,KAA0B;IACrD,MAAM,eAAe,GACnB,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;MAChC,CAAC,CAAC,IAAI,CAAC,kBAAkB;MACzB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;IAExB,IAAI;MACF,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE;QACnC,OAAO,EAAE,eAAe;QACxB,UAAU,EAAE,IAAI,CAAC,wBAAwB;OAC1C,CAAC,CAAC;KACJ;IAAC,OAAO,CAAC,EAAE;MACV,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,CAAC,CAAC,CAAC;KAC5D;EACH,CAAC;EAGS,KAAK,CAAC,gBAAgB;IAC9B,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;MACnD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;MAC9B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;KAC9B;EACH,CAAC;EAEO,mBAAmB,CACzB,KAAa,EACb,QAAqC;;IAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,MAAA,QAAQ,CAAC,YAAY,mCAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IAErC,IAAI,QAAQ,KAAK,OAAO,EAAE;MACxB,OAAO,gBAAgB,GAAG,SAAS,CAAC;KACrC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE;MAChC,MAAM,UAAU,GAAG,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;MAChE,OAAO,UAAU,GAAG,cAAc,GAAG,CAAC,CAAC;KACxC;SAAM;MACL,MAAM,UAAU,GAAG,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;MAC5D,OAAO,UAAU,GAAG,cAAc,CAAC;KACpC;EACH,CAAC;EAEO,SAAS;IACf,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;EAClD,CAAC;EAEO,mBAAmB;IACzB,IAAI,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC;IACrE,IAAI,MAAM,IAAI,IAAI,EAAE;MAClB,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC;MAClE,MAAM,CAAC,SAAS,GAAG;;;;;;OAMlB,CAAC;MAEF,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;KAC7B;IACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC;EAClC,CAAC;EAEO,mBAAmB;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACtC,IAAI,MAAM,IAAI,IAAI,EAAE;MAClB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;MACxB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,EAAgC,CAAC;MACpD,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;MAClC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;MACpC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;KAC/B;SAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE;MAC/D,OAAO,CAAC,KAAK,CACX,6DAA6D,CAC9D,CAAC;KACH;EACH,CAAC;EAEO,gBAAgB;IACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,EAAE;MAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;KAC/B;SAAM;MACL,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;KAChD;EACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import 'requestidlecallback-polyfill';\n\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n forceUpdate,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { ElementPool } from '@vertexvis/html-templates';\nimport { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\nimport { SceneTreeAPIClient } from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb_service';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { Config, parseConfig, PartialConfig } from '../../lib/config';\nimport { Environment } from '../../lib/environment';\nimport { isSceneTreeTableCellElement } from '../scene-tree-table-cell/utils';\nimport { SceneTreeError } from './errors';\nimport {\n FilterTreeOptions,\n SceneTreeController,\n SceneTreeState,\n} from './lib/controller';\nimport { getSceneTreeContainsElement } from './lib/dom';\nimport { SceneTreeErrorCode, SceneTreeErrorDetails } from './lib/errors';\nimport { webSocketSubscriptionTransportFactory } from './lib/grpc';\nimport { isLoadedRow, Row } from './lib/row';\nimport {\n deselectItem,\n hideItem,\n selectFilterResults,\n selectItem,\n selectRangeInSceneTree,\n showItem,\n} from './lib/viewer-ops';\nimport {\n MetadataKey,\n RowArg,\n RowDataProvider,\n SceneTreeOperationOptions,\n ScrollToOptions,\n SelectItemOptions,\n} from './types';\n\n/**\n * The minimum amount of time provided by requestIdleCallback to clear purged\n * data. A value too low may cause contention with browser rendering. A value\n * too high will cause too many items to be accumulated.\n */\nconst MIN_CLEAR_UNUSED_DATA_MS = 25;\n\ninterface StateMap {\n idleCallbackId?: number;\n resizeObserver?: ResizeObserver;\n componentLoaded: boolean;\n\n client?: SceneTreeAPIClient;\n jwt?: string;\n\n onStateChangeDisposable?: Disposable;\n subscribeDisposable?: Disposable;\n viewerDisposable?: Disposable;\n\n elementPool?: ElementPool;\n template?: HTMLTemplateElement;\n\n selectionPath?: string[];\n\n layoutEl?: HTMLVertexSceneTreeTableLayoutElement;\n}\n\ntype OperationHandler = (data: {\n viewer: HTMLVertexViewerElement;\n id: string;\n node: Node.AsObject;\n}) => void | Promise<void>;\n\n/**\n * @slot header - A slot that places content above the rows in the tree. By\n * default, a search toolbar will be placed in this slot. Elements can be\n * stacked by assigning multiple elements to this slot.\n * @slot footer - A slot that places content below the rows in the tree.\n * Elements can be stacked by assigning multiple elements to this slot.\n */\n@Component({\n tag: 'vertex-scene-tree',\n styleUrl: 'scene-tree.css',\n shadow: true,\n})\nexport class SceneTree {\n /**\n * The number of offscreen rows above and below the viewport to render. Having\n * a higher number reduces the chance of the browser not displaying a row\n * while scrolling.\n */\n @Prop()\n public overScanCount = 25;\n\n /**\n * A CSS selector that points to a `<vertex-viewer>` element. Either this\n * property or `viewer` must be set.\n */\n @Prop()\n public viewerSelector?: string;\n\n /**\n * An instance of a `<vertex-viewer>` element. Either this property or\n * `viewerSelector` must be set.\n */\n @Prop({ reflect: true, mutable: true })\n public viewer?: HTMLVertexViewerElement | null;\n\n /**\n * A callback that is invoked immediately before a row is about to rendered.\n * This callback can return additional data that can be bound to in a\n * template.\n *\n * @example\n *\n * ```html\n * <script>\n * const table = document.querySelector('vertex-scene-tree-table');\n * table.rowData = (row) => {\n * return { func: () => console.log('row', row.node.name) };\n * }\n * </script>\n *\n * <vertex-scene-tree>\n * <vertex-scene-tree-table>\n * <vertex-scene-tree-table-column>\n * <template>\n * <button event:click=\"{{row.data.func}}\">Hi</button>\n * </template>\n * </vertex-scene-tree-table-column>\n * </vertex-scene-tree-table>\n * </vertex-scene-tree>\n * ```\n */\n @Prop()\n public rowData?: RowDataProvider;\n\n /**\n * An object to configure the scene tree.\n */\n @Prop()\n public config?: PartialConfig | string;\n\n /**\n * Sets the default environment for the viewer. This setting is used for\n * auto-configuring network hosts.\n *\n * Use the `config` property for manually setting hosts.\n */\n @Prop()\n public configEnv: Environment = 'platprod';\n\n @Prop({ mutable: true })\n public controller?: SceneTreeController;\n\n /**\n * Indicates whether the metadata search should use an exact match.\n */\n @Prop({ mutable: true })\n public metadataSearchExactMatch = false;\n\n /**\n * A list of the metadata keys that a scene tree search should be performed on.\n */\n @Prop({ mutable: true })\n public metadataSearchKeys: MetadataKey[] = [];\n\n /**\n * A list of part metadata keys that will be made available to each row. This\n * metadata can be used for data binding inside the scene tree's template.\n */\n @Prop()\n public metadataKeys: MetadataKey[] = [];\n\n /**\n * An event that is emitted when this <vertex-scene-tree> encounters a connection\n * error.\n */\n @Event()\n public connectionError!: EventEmitter<SceneTreeErrorDetails>;\n\n /**\n * An event that is emitted when the first row of this <vertex-scene-tree> has\n * been rendered.\n */\n @Event()\n public firstRowRendered!: EventEmitter<void>;\n\n @State()\n private rows: Row[] = [];\n\n @State()\n private totalRows = 0;\n\n @State()\n private showLoader = false;\n\n @State()\n private showEmptyResults = false;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State()\n private stateMap: StateMap = {\n componentLoaded: false,\n };\n\n @State()\n private errorDetails: SceneTreeErrorDetails | undefined;\n\n @State()\n private attemptingRetry = false;\n\n @Element()\n private el!: HTMLElement;\n\n private lastSelectedItemId?: string;\n private firstCellRendered = false;\n\n /**\n * Schedules a render of the rows in the scene tree. Useful if any custom\n * data in your scene tree has changed, and you want to update the row's\n * contents.\n *\n * **Note:** This is an asynchronous operation. The update may happen on the\n * next frame.\n */\n @Method()\n public async invalidateRows(): Promise<void> {\n forceUpdate(this.getLayoutElement());\n }\n\n /**\n * Scrolls the tree to the given row index.\n *\n * @param index An index of the row to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n */\n @Method()\n public async scrollToIndex(\n index: number,\n options: ScrollToOptions = {}\n ): Promise<void> {\n const { animate, position = 'middle' } = options;\n const i = Math.max(0, Math.min(index, this.totalRows));\n\n const top = this.getScrollToPosition(i, position);\n\n this.getLayoutElement().scrollToPosition(top, {\n behavior: animate ? 'smooth' : undefined,\n });\n }\n\n /**\n * Scrolls the tree to an item with the given ID. If the node for the item is\n * not expanded, the tree will expand each of its parent nodes.\n *\n * @param itemId An ID of an item to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n * @returns A promise that resolves when the operation is finished.\n */\n @Method()\n public async scrollToItem(\n itemId: string,\n options: ScrollToOptions = {}\n ): Promise<void> {\n const rowsBeforeExpand = this.totalRows;\n const index = await this.controller?.expandParentNodes(itemId);\n\n if (index != null && rowsBeforeExpand !== this.totalRows) {\n return new Promise((resolve) => {\n const layoutEl = this.getLayoutElement();\n const handleLayoutRendered = async (): Promise<void> => {\n layoutEl.removeEventListener('layoutRendered', handleLayoutRendered);\n await this.scrollToIndex(index, options);\n resolve();\n };\n\n layoutEl.addEventListener('layoutRendered', handleLayoutRendered);\n });\n } else if (index != null) {\n await this.scrollToIndex(index, options);\n }\n }\n\n /**\n * Performs an API call to expand all nodes in the tree.\n */\n @Method()\n public async expandAll(): Promise<void> {\n await this.controller?.expandAll();\n }\n\n /**\n * Performs an API call to collapse all nodes in the tree.\n */\n @Method()\n public async collapseAll(): Promise<void> {\n await this.controller?.collapseAll();\n }\n\n /**\n * Performs an API call that will expand the node associated to the specified\n * row or row index.\n *\n * @param row A row, row index, or node to expand.\n */\n @Method()\n public async expandItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ id, node }) => {\n if (!node.expanded) {\n await this.controller?.expandNode(id);\n }\n });\n }\n\n /**\n * Performs an API call that will collapse the node associated to the\n * specified row or row index.\n *\n * @param row A row, row index, or node to collapse.\n */\n @Method()\n public async collapseItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ id, node }) => {\n if (node.expanded) {\n await this.controller?.collapseNode(id);\n }\n });\n }\n\n /**\n * Performs an API call that will either expand or collapse the node\n * associated to the given row or row index.\n *\n * @param row The row, row index, or node to collapse or expand.\n */\n @Method()\n public async toggleExpandItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ node }) => {\n if (node.expanded) {\n await this.collapseItem(node);\n } else {\n await this.expandItem(node);\n }\n });\n }\n\n /**\n * Performs an API call that will either hide or show the item associated to\n * the given row or row index.\n *\n * @param row The row, row index, or node to toggle visibility.\n */\n @Method()\n public async toggleItemVisibility(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.visible || node.partiallyVisible) {\n await hideItem(viewer, id);\n } else {\n await showItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will hide the item associated to the given row\n * or row index.\n *\n * @param row The row, row index, or node to hide.\n */\n @Method()\n public async hideItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.visible) {\n await hideItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will show the item associated to the given row\n * or row index.\n *\n * @param row The row, row index, or node to show.\n */\n @Method()\n public async showItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (!node.visible) {\n await showItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will select the item associated to the given row\n * or row index.\n *\n * This method supports a `recurseParent` option that allows for recursively\n * selecting the next unselected parent node. This behavior is considered\n * stateful. Each call to `selectItem` will track the ancestry of the passed\n * in `rowArg`. If calling `selectItem` with a row not belonging to the\n * ancestry of a previous selection, then this method will perform a standard\n * selection.\n *\n * @param row The row, row index or node to select.\n * @param options A set of options to configure selection behavior.\n */\n @Method()\n public async selectItem(\n row: RowArg,\n { recurseParent, ...options }: SelectItemOptions = {}\n ): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id }) => {\n const ancestors = (await this.controller?.fetchNodeAncestors(id)) || [];\n const isInPath = this.stateMap.selectionPath?.includes(id);\n\n if (recurseParent && isInPath) {\n const nextNode = ancestors.find(({ selected }) => !selected);\n if (nextNode != null) {\n await this.selectItem(nextNode, options);\n this.lastSelectedItemId = id;\n }\n } else if (options.range && this.lastSelectedItemId != null) {\n const currentRowIndex = await this.controller?.expandParentNodes(id);\n const previouslySelectedIndex =\n await this.controller?.expandParentNodes(this.lastSelectedItemId);\n\n if (previouslySelectedIndex && currentRowIndex) {\n const start = Math.min(previouslySelectedIndex, currentRowIndex);\n const end = Math.max(previouslySelectedIndex, currentRowIndex);\n await selectRangeInSceneTree(viewer, start, end, options);\n }\n } else {\n await selectItem(viewer, id, options);\n this.lastSelectedItemId = id;\n }\n\n this.stateMap.selectionPath = [\n ...ancestors.map(({ id }) => id?.hex || ''),\n id,\n ];\n });\n }\n\n /**\n * Performs an API call that will deselect the item associated to the given\n * row or row index.\n *\n * @param row The row, row index, or node to deselect.\n */\n @Method()\n public async deselectItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.selected) {\n this.lastSelectedItemId = undefined;\n await deselectItem(viewer, id);\n }\n });\n }\n\n /**\n * Returns a row at the given index. If the row data has not been loaded,\n * returns `undefined`.\n *\n * @param index The index of the row.\n * @returns A row, or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public async getRowAtIndex(index: number): Promise<Row> {\n return this.rows[index];\n }\n\n /**\n * Returns the row data from the given mouse or pointer event. The event must\n * originate from a `vertex-scene-tree-table-cell` contained by this element,\n * otherwise `undefined` is returned.\n *\n * @param event A mouse or pointer event that originated from this component.\n * @returns A row, or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public async getRowForEvent(event: MouseEvent | PointerEvent): Promise<Row> {\n const { clientY, target } = event;\n\n if (\n target != null &&\n this.errorDetails == null &&\n getSceneTreeContainsElement(this.el, target as HTMLElement) &&\n isSceneTreeTableCellElement(target)\n ) {\n return this.getRowAtClientY(clientY);\n } else {\n return undefined;\n }\n }\n\n /**\n * Returns the row data from the given vertical client position.\n *\n * @param clientY The vertical client position.\n * @returns A row or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public getRowAtClientY(clientY: number): Promise<Row> {\n const layoutEl = this.getLayoutElement();\n const top = layoutEl.layoutOffset;\n const index = Math.floor(\n (clientY - top + layoutEl.scrollOffset) / layoutEl.rowHeight\n );\n return this.getRowAtIndex(index);\n }\n\n /**\n * Performs an async request that will filter the displayed items in the tree\n * that match the given term and options.\n *\n * @param term The filter term.\n * @param options The options to apply to the filter.\n * @returns A promise that completes when the request has completed. Note,\n * items are displayed asynchronously. So the displayed items may not reflect\n * the result of this filter when the promise completes.\n */\n @Method()\n public async filterItems(\n term: string,\n options: FilterTreeOptions = {}\n ): Promise<void> {\n return this.controller?.filter(term, options);\n }\n\n /**\n * Performs an async request that will select the filtered items in the tree\n * that match the given term.\n *\n * @param term The filter term.\n * @returns A promise that completes when the request has completed.\n */\n @Method()\n public async selectFilteredItems(\n term: string,\n options?: SceneTreeOperationOptions\n ): Promise<void> {\n if (this.viewer != null) {\n const definedMetadataKeys =\n this.metadataSearchKeys.length > 0\n ? this.metadataSearchKeys\n : this.metadataKeys;\n\n if (definedMetadataKeys.length === 0) {\n console.warn(\n \"No metadata keys were found to perform the selection. Defaulting to ['VERTEX_SCENE_ITEM_NAME']\"\n );\n }\n\n const columnsToSearch =\n definedMetadataKeys.length > 0\n ? definedMetadataKeys\n : ['VERTEX_SCENE_ITEM_NAME'];\n\n await selectFilterResults(\n this.viewer,\n term,\n columnsToSearch,\n this.metadataSearchExactMatch,\n {\n append: false,\n ...options,\n }\n );\n }\n }\n\n /**\n * Fetches the metadata keys that are available to the scene tree. Metadata\n * keys can be assigned to the scene tree using the `metadataKeys` property.\n * The scene tree will fetch this metadata and make these values available\n * for data binding.\n *\n * @returns A promise that resolves with the names of available keys.\n */\n @Method()\n public async fetchMetadataKeys(): Promise<MetadataKey[]> {\n return this.controller?.fetchMetadataKeys() ?? [];\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.stateMap.viewerDisposable?.dispose();\n this.controller?.cancel();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n if (this.controller == null) {\n const { sceneTreeHost } = this.getConfig().network;\n const client = new SceneTreeAPIClient(\n sceneTreeHost,\n this.getConfig().flags.grpcUseStreamingWebSocketTransport\n ? {\n transport: webSocketSubscriptionTransportFactory,\n }\n : undefined\n );\n this.controller = new SceneTreeController(client, 100);\n this.controller?.setMetadataKeys(this.metadataKeys);\n }\n\n this.stateMap.onStateChangeDisposable = this.controller.onStateChange.on(\n (state) => this.handleControllerStateChange(state)\n );\n\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n protected async componentDidLoad(): Promise<void> {\n this.ensureLayoutDefined();\n this.updateLayoutElement();\n\n const layoutEl = this.getLayoutElement();\n const resizeObserver = new ResizeObserver(() => {\n this.invalidateRows();\n });\n resizeObserver.observe(layoutEl);\n this.stateMap.resizeObserver = resizeObserver;\n\n this.stateMap.componentLoaded = true;\n\n this.controller?.setMetadataKeys(this.metadataKeys);\n\n if (this.viewer == null) {\n this.errorDetails = new SceneTreeErrorDetails(\n 'MISSING_VIEWER',\n SceneTreeErrorCode.MISSING_VIEWER\n );\n }\n }\n\n public componentWillRender(): void {\n // The controller can load data prior to the first render\n // ensure that this renders any time the state changes.\n this.updateLayoutElement();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"header\">\n <slot name=\"header\">\n <vertex-scene-tree-toolbar class=\"search-toolbar\">\n <vertex-scene-tree-search controller={this.controller} />\n </vertex-scene-tree-toolbar>\n </slot>\n </div>\n\n {this.errorDetails != null && this.renderError(this.errorDetails)}\n\n {this.errorDetails == null && (\n <div class=\"rows-scroll\">\n {this.showLoader && (\n <slot name=\"loading\">\n <vertex-viewer-spinner class=\"loading\" size=\"md\" />\n </slot>\n )}\n <slot />\n {this.showEmptyResults && (\n <slot name=\"empty-results\">\n <div class=\"empty-results\">No Results Found.</div>\n </slot>\n )}\n </div>\n )}\n\n <div class=\"footer\">\n <slot name=\"footer\" />\n </div>\n </Host>\n );\n }\n\n private renderError(details: SceneTreeErrorDetails): h.JSX.IntrinsicElements {\n if (details.code !== SceneTreeErrorCode.SCENE_TREE_DISABLED) {\n return (\n <SceneTreeError details={details}>\n <button\n class=\"button button-secondary\"\n onClick={() => this.retryConnectToViewer()}\n disabled={this.attemptingRetry}\n >\n Retry\n </button>\n </SceneTreeError>\n );\n } else {\n return <SceneTreeError details={details} />;\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer: HTMLVertexViewerElement | undefined,\n oldViewer: HTMLVertexViewerElement | undefined\n ): void {\n // StencilJS will invoke this callback even before the component has been\n // loaded. According to their docs, this shouldn't happen. Return if the\n // component hasn't been loaded.\n // See https://stenciljs.com/docs/reactive-data#watch-decorator\n if (!this.stateMap.componentLoaded) {\n return;\n }\n\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n protected handleControllerChanged(newController: SceneTreeController): void {\n // StencilJS will invoke this callback even before the component has been\n // loaded. According to their docs, this shouldn't happen. Return if the\n // component hasn't been loaded.\n // See https://stenciljs.com/docs/reactive-data#watch-decorator\n if (!this.stateMap.componentLoaded) {\n return;\n }\n\n this.stateMap.onStateChangeDisposable?.dispose();\n\n this.stateMap.onStateChangeDisposable = newController.onStateChange.on(\n (state) => this.handleControllerStateChange(state)\n );\n\n newController.setMetadataKeys(this.metadataKeys);\n }\n\n /**\n * @ignore\n */\n @Watch('metadataKeys')\n protected handleMetadataKeysChanged(): void {\n this.controller?.setMetadataKeys(this.metadataKeys);\n }\n\n private retryConnectToViewer(): void {\n this.attemptingRetry = true;\n this.errorDetails = undefined;\n this.connectToViewer();\n }\n\n private connectToViewer(): void {\n this.stateMap.viewerDisposable?.dispose();\n\n if (this.viewer == null && this.viewerSelector != null) {\n this.viewer = document.querySelector(this.viewerSelector) as\n | HTMLVertexViewerElement\n | undefined;\n }\n\n if (this.viewer != null) {\n this.stateMap.viewerDisposable = this.controller?.connectToViewer(\n this.viewer\n );\n } else {\n this.attemptingRetry = false;\n }\n }\n\n private scheduleClearUnusedData(): void {\n if (this.stateMap.idleCallbackId != null) {\n window.cancelIdleCallback(this.stateMap.idleCallbackId);\n }\n\n this.stateMap.idleCallbackId = window.requestIdleCallback((foo) => {\n const remaining = foo.timeRemaining?.();\n\n if (remaining == null || remaining >= MIN_CLEAR_UNUSED_DATA_MS) {\n const layoutEl = this.getLayoutElement();\n const startIndex = layoutEl.viewportStartIndex;\n const endIndex = layoutEl.viewportEndIndex;\n const [start, end] =\n this.controller?.getPageIndexesForRange(startIndex, endIndex) || [];\n\n if (start != null && end != null) {\n this.controller?.invalidatePagesOutsideRange(start, end, 50);\n }\n } else {\n this.scheduleClearUnusedData();\n }\n });\n }\n\n private handleControllerStateChange(state: SceneTreeState): void {\n this.showLoader = !!state.shouldShowLoading;\n this.showEmptyResults = !!state.shouldShowEmptyResults;\n this.rows = state.rows;\n this.totalRows = state.totalRows;\n\n if (state.connection.type === 'failure') {\n this.errorDetails = state.connection.details;\n this.connectionError.emit(state.connection.details);\n } else if (state.connection.type === 'disconnected') {\n this.errorDetails = new SceneTreeErrorDetails(\n 'DISCONNECTED',\n SceneTreeErrorCode.DISCONNECTED\n );\n } else {\n this.errorDetails = undefined;\n }\n\n if (\n state.connection.type === 'connected' ||\n state.connection.type === 'failure'\n ) {\n this.attemptingRetry = false;\n }\n }\n\n private async performRowOperation(\n rowOrIndex: number | Row | Node.AsObject,\n op: OperationHandler\n ): Promise<void> {\n const row =\n typeof rowOrIndex === 'number' ? this.rows[rowOrIndex] : rowOrIndex;\n\n if (row == null) {\n throw new Error(`Cannot perform scene tree operation. Row not found.`);\n }\n\n const node = isLoadedRow(row) ? row.node : row;\n\n if (node.id == null) {\n throw new Error(`Cannot perform scene tree operation. ID is undefined.`);\n }\n\n if (this.viewer == null) {\n throw new Error(\n `Cannot perform scene tree operation. Cannot get reference to viewer.`\n );\n }\n\n await op({ viewer: this.viewer, id: node.id.hex, node });\n }\n\n @Listen('search')\n protected async handleSearch(event: CustomEvent<string>): Promise<void> {\n const columnsToSearch =\n this.metadataSearchKeys.length > 0\n ? this.metadataSearchKeys\n : this.metadataKeys;\n\n try {\n await this.filterItems(event.detail, {\n columns: columnsToSearch,\n exactMatch: this.metadataSearchExactMatch,\n });\n } catch (e) {\n console.error('Failed to filter tree with exception: ', e);\n }\n }\n\n @Listen('cellLoaded')\n protected async handleCellLoaded(): Promise<void> {\n if (!this.firstCellRendered && this.rows.length > 0) {\n this.firstCellRendered = true;\n this.firstRowRendered.emit();\n }\n }\n\n private getScrollToPosition(\n index: number,\n position: ScrollToOptions['position']\n ): number {\n const layoutEl = this.getLayoutElement();\n const constrainedIndex = Math.max(0, Math.min(index, this.totalRows - 1));\n const viewportHeight = layoutEl.layoutHeight ?? 0;\n const rowHeight = layoutEl.rowHeight;\n\n if (position === 'start') {\n return constrainedIndex * rowHeight;\n } else if (position === 'middle') {\n const rowCenterY = constrainedIndex * rowHeight + rowHeight / 2;\n return rowCenterY - viewportHeight / 2;\n } else {\n const rowBottomY = constrainedIndex * rowHeight + rowHeight;\n return rowBottomY - viewportHeight;\n }\n }\n\n private getConfig(): Config {\n return parseConfig(this.configEnv, this.config);\n }\n\n private ensureLayoutDefined(): void {\n let layout = this.el.querySelector('vertex-scene-tree-table-layout');\n if (layout == null) {\n layout = document.createElement('vertex-scene-tree-table-layout');\n layout.innerHTML = `\n <vertex-scene-tree-table-column>\n <template>\n <vertex-scene-tree-table-cell prop:value=\"{{row.node.name}}\" expand-toggle visibility-toggle></vertex-scene-tree-table-cell>\n </template>\n </vertex-scene-tree-table-column>\n `;\n\n this.el.appendChild(layout);\n }\n this.stateMap.layoutEl = layout;\n }\n\n private updateLayoutElement(): void {\n const layout = this.stateMap.layoutEl;\n if (layout != null) {\n layout.rows = this.rows;\n layout.tree = this.el as HTMLVertexSceneTreeElement;\n layout.totalRows = this.totalRows;\n layout.controller = this.controller;\n layout.rowData = this.rowData;\n } else if (!this.stateMap.componentLoaded && this.totalRows > 0) {\n console.debug(\n 'Scene tree has rows, but the component has not yet rendered'\n );\n }\n }\n\n private getLayoutElement(): HTMLVertexSceneTreeTableLayoutElement {\n if (this.stateMap.layoutEl != null) {\n return this.stateMap.layoutEl;\n } else {\n throw new Error('Layout element is undefined');\n }\n }\n}\n"]}
1
+ {"version":3,"file":"scene-tree.js","sourceRoot":"","sources":["../../../../../src/components/scene-tree/scene-tree.tsx"],"names":[],"mappings":"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","sourcesContent":["import 'requestidlecallback-polyfill';\n\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n forceUpdate,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { ElementPool } from '@vertexvis/html-templates';\nimport { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\nimport { SceneTreeAPIClient } from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb_service';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { Config, parseConfig, PartialConfig } from '../../lib/config';\nimport { Environment } from '../../lib/environment';\nimport { isSceneTreeTableCellElement } from '../scene-tree-table-cell/utils';\nimport { SceneTreeError } from './errors';\nimport {\n FilterTreeOptions,\n SceneTreeController,\n SceneTreeState,\n} from './lib/controller';\nimport { getSceneTreeContainsElement } from './lib/dom';\nimport { SceneTreeErrorCode, SceneTreeErrorDetails } from './lib/errors';\nimport { webSocketSubscriptionTransportFactory } from './lib/grpc';\nimport { isLoadedRow, Row } from './lib/row';\nimport {\n deselectItem,\n hideItem,\n selectFilterResults,\n selectItem,\n selectRangeInSceneTree,\n showItem,\n} from './lib/viewer-ops';\nimport {\n FilterOptions,\n MetadataKey,\n RowArg,\n RowDataProvider,\n SceneTreeOperationOptions,\n ScrollToOptions,\n SelectItemOptions,\n} from './types';\n\n/**\n * The minimum amount of time provided by requestIdleCallback to clear purged\n * data. A value too low may cause contention with browser rendering. A value\n * too high will cause too many items to be accumulated.\n */\nconst MIN_CLEAR_UNUSED_DATA_MS = 25;\n\ninterface StateMap {\n idleCallbackId?: number;\n resizeObserver?: ResizeObserver;\n componentLoaded: boolean;\n\n client?: SceneTreeAPIClient;\n jwt?: string;\n\n onStateChangeDisposable?: Disposable;\n subscribeDisposable?: Disposable;\n viewerDisposable?: Disposable;\n\n elementPool?: ElementPool;\n template?: HTMLTemplateElement;\n\n selectionPath?: string[];\n\n layoutEl?: HTMLVertexSceneTreeTableLayoutElement;\n}\n\ntype OperationHandler = (data: {\n viewer: HTMLVertexViewerElement;\n id: string;\n node: Node.AsObject;\n}) => void | Promise<void>;\n\n/**\n * @slot header - A slot that places content above the rows in the tree. By\n * default, a search toolbar will be placed in this slot. Elements can be\n * stacked by assigning multiple elements to this slot.\n * @slot footer - A slot that places content below the rows in the tree.\n * Elements can be stacked by assigning multiple elements to this slot.\n */\n@Component({\n tag: 'vertex-scene-tree',\n styleUrl: 'scene-tree.css',\n shadow: true,\n})\nexport class SceneTree {\n /**\n * The number of offscreen rows above and below the viewport to render. Having\n * a higher number reduces the chance of the browser not displaying a row\n * while scrolling.\n */\n @Prop()\n public overScanCount = 25;\n\n /**\n * A CSS selector that points to a `<vertex-viewer>` element. Either this\n * property or `viewer` must be set.\n */\n @Prop()\n public viewerSelector?: string;\n\n /**\n * An instance of a `<vertex-viewer>` element. Either this property or\n * `viewerSelector` must be set.\n */\n @Prop({ reflect: true, mutable: true })\n public viewer?: HTMLVertexViewerElement | null;\n\n /**\n * A callback that is invoked immediately before a row is about to rendered.\n * This callback can return additional data that can be bound to in a\n * template.\n *\n * @example\n *\n * ```html\n * <script>\n * const table = document.querySelector('vertex-scene-tree-table');\n * table.rowData = (row) => {\n * return { func: () => console.log('row', row.node.name) };\n * }\n * </script>\n *\n * <vertex-scene-tree>\n * <vertex-scene-tree-table>\n * <vertex-scene-tree-table-column>\n * <template>\n * <button event:click=\"{{row.data.func}}\">Hi</button>\n * </template>\n * </vertex-scene-tree-table-column>\n * </vertex-scene-tree-table>\n * </vertex-scene-tree>\n * ```\n */\n @Prop()\n public rowData?: RowDataProvider;\n\n /**\n * An object to configure the scene tree.\n */\n @Prop()\n public config?: PartialConfig | string;\n\n /**\n * Sets the default environment for the viewer. This setting is used for\n * auto-configuring network hosts.\n *\n * Use the `config` property for manually setting hosts.\n */\n @Prop()\n public configEnv: Environment = 'platprod';\n\n @Prop({ mutable: true })\n public controller?: SceneTreeController;\n\n /**\n * A set of options to configure scene tree searching behavior.\n */\n @Prop({ mutable: true })\n public searchOptions: FilterOptions = {};\n\n /**\n * @deprecated Use `searchOptions`\n * Indicates whether the metadata search should use an exact match.\n */\n @Prop({ mutable: true })\n public metadataSearchExactMatch = false;\n\n /**\n * @deprecated Use `searchOptions`\n * A list of the metadata keys that a scene tree search should be performed on.\n */\n @Prop({ mutable: true })\n public metadataSearchKeys: MetadataKey[] = [];\n\n /**\n * A list of part metadata keys that will be made available to each row. This\n * metadata can be used for data binding inside the scene tree's template.\n */\n @Prop()\n public metadataKeys: MetadataKey[] = [];\n\n /**\n * An event that is emitted when this <vertex-scene-tree> encounters a connection\n * error.\n */\n @Event()\n public connectionError!: EventEmitter<SceneTreeErrorDetails>;\n\n /**\n * An event that is emitted when the first row of this <vertex-scene-tree> has\n * been rendered.\n */\n @Event()\n public firstRowRendered!: EventEmitter<void>;\n\n @State()\n private rows: Row[] = [];\n\n @State()\n private totalRows = 0;\n\n @State()\n private showLoader = false;\n\n @State()\n private showEmptyResults = false;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State()\n private stateMap: StateMap = {\n componentLoaded: false,\n };\n\n @State()\n private errorDetails: SceneTreeErrorDetails | undefined;\n\n @State()\n private attemptingRetry = false;\n\n @Element()\n private el!: HTMLElement;\n\n private lastSelectedItemId?: string;\n private firstCellRendered = false;\n\n /**\n * Schedules a render of the rows in the scene tree. Useful if any custom\n * data in your scene tree has changed, and you want to update the row's\n * contents.\n *\n * **Note:** This is an asynchronous operation. The update may happen on the\n * next frame.\n */\n @Method()\n public async invalidateRows(): Promise<void> {\n forceUpdate(this.getLayoutElement());\n }\n\n /**\n * Scrolls the tree to the given row index.\n *\n * @param index An index of the row to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n */\n @Method()\n public async scrollToIndex(\n index: number,\n options: ScrollToOptions = {}\n ): Promise<void> {\n const { animate, position = 'middle' } = options;\n const i = Math.max(0, Math.min(index, this.totalRows));\n\n const top = this.getScrollToPosition(i, position);\n\n this.getLayoutElement().scrollToPosition(top, {\n behavior: animate ? 'smooth' : undefined,\n });\n }\n\n /**\n * Scrolls the tree to an item with the given ID. If the node for the item is\n * not expanded, the tree will expand each of its parent nodes.\n *\n * @param itemId An ID of an item to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n * @returns A promise that resolves when the operation is finished.\n */\n @Method()\n public async scrollToItem(\n itemId: string,\n options: ScrollToOptions = {}\n ): Promise<void> {\n const rowsBeforeExpand = this.totalRows;\n const index = await this.controller?.expandParentNodes(itemId);\n\n if (index != null && rowsBeforeExpand !== this.totalRows) {\n return new Promise((resolve) => {\n const layoutEl = this.getLayoutElement();\n const handleLayoutRendered = async (): Promise<void> => {\n layoutEl.removeEventListener('layoutRendered', handleLayoutRendered);\n await this.scrollToIndex(index, options);\n resolve();\n };\n\n layoutEl.addEventListener('layoutRendered', handleLayoutRendered);\n });\n } else if (index != null) {\n await this.scrollToIndex(index, options);\n }\n }\n\n /**\n * Performs an API call to expand all nodes in the tree.\n */\n @Method()\n public async expandAll(): Promise<void> {\n await this.controller?.expandAll();\n }\n\n /**\n * Performs an API call to collapse all nodes in the tree.\n */\n @Method()\n public async collapseAll(): Promise<void> {\n await this.controller?.collapseAll();\n }\n\n /**\n * Performs an API call that will expand the node associated to the specified\n * row or row index.\n *\n * @param row A row, row index, or node to expand.\n */\n @Method()\n public async expandItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ id, node }) => {\n if (!node.expanded) {\n await this.controller?.expandNode(id);\n }\n });\n }\n\n /**\n * Performs an API call that will collapse the node associated to the\n * specified row or row index.\n *\n * @param row A row, row index, or node to collapse.\n */\n @Method()\n public async collapseItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ id, node }) => {\n if (node.expanded) {\n await this.controller?.collapseNode(id);\n }\n });\n }\n\n /**\n * Performs an API call that will either expand or collapse the node\n * associated to the given row or row index.\n *\n * @param row The row, row index, or node to collapse or expand.\n */\n @Method()\n public async toggleExpandItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ node }) => {\n if (node.expanded) {\n await this.collapseItem(node);\n } else {\n await this.expandItem(node);\n }\n });\n }\n\n /**\n * Performs an API call that will either hide or show the item associated to\n * the given row or row index.\n *\n * @param row The row, row index, or node to toggle visibility.\n */\n @Method()\n public async toggleItemVisibility(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.visible || node.partiallyVisible) {\n await hideItem(viewer, id);\n } else {\n await showItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will hide the item associated to the given row\n * or row index.\n *\n * @param row The row, row index, or node to hide.\n */\n @Method()\n public async hideItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.visible) {\n await hideItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will show the item associated to the given row\n * or row index.\n *\n * @param row The row, row index, or node to show.\n */\n @Method()\n public async showItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (!node.visible) {\n await showItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will select the item associated to the given row\n * or row index.\n *\n * This method supports a `recurseParent` option that allows for recursively\n * selecting the next unselected parent node. This behavior is considered\n * stateful. Each call to `selectItem` will track the ancestry of the passed\n * in `rowArg`. If calling `selectItem` with a row not belonging to the\n * ancestry of a previous selection, then this method will perform a standard\n * selection.\n *\n * @param row The row, row index or node to select.\n * @param options A set of options to configure selection behavior.\n */\n @Method()\n public async selectItem(\n row: RowArg,\n { recurseParent, ...options }: SelectItemOptions = {}\n ): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id }) => {\n const ancestors = (await this.controller?.fetchNodeAncestors(id)) || [];\n const isInPath = this.stateMap.selectionPath?.includes(id);\n\n if (recurseParent && isInPath) {\n const nextNode = ancestors.find(({ selected }) => !selected);\n if (nextNode != null) {\n await this.selectItem(nextNode, options);\n this.lastSelectedItemId = id;\n }\n } else if (options.range && this.lastSelectedItemId != null) {\n const currentRowIndex = await this.controller?.expandParentNodes(id);\n const previouslySelectedIndex =\n await this.controller?.expandParentNodes(this.lastSelectedItemId);\n\n if (previouslySelectedIndex && currentRowIndex) {\n const start = Math.min(previouslySelectedIndex, currentRowIndex);\n const end = Math.max(previouslySelectedIndex, currentRowIndex);\n await selectRangeInSceneTree(viewer, start, end, options);\n }\n } else {\n await selectItem(viewer, id, options);\n this.lastSelectedItemId = id;\n }\n\n this.stateMap.selectionPath = [\n ...ancestors.map(({ id }) => id?.hex || ''),\n id,\n ];\n });\n }\n\n /**\n * Performs an API call that will deselect the item associated to the given\n * row or row index.\n *\n * @param row The row, row index, or node to deselect.\n */\n @Method()\n public async deselectItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.selected) {\n this.lastSelectedItemId = undefined;\n await deselectItem(viewer, id);\n }\n });\n }\n\n /**\n * Returns a row at the given index. If the row data has not been loaded,\n * returns `undefined`.\n *\n * @param index The index of the row.\n * @returns A row, or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public async getRowAtIndex(index: number): Promise<Row> {\n return this.rows[index];\n }\n\n /**\n * Returns the row data from the given mouse or pointer event. The event must\n * originate from a `vertex-scene-tree-table-cell` contained by this element,\n * otherwise `undefined` is returned.\n *\n * @param event A mouse or pointer event that originated from this component.\n * @returns A row, or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public async getRowForEvent(event: MouseEvent | PointerEvent): Promise<Row> {\n const { clientY, target } = event;\n\n if (\n target != null &&\n this.errorDetails == null &&\n getSceneTreeContainsElement(this.el, target as HTMLElement) &&\n isSceneTreeTableCellElement(target)\n ) {\n return this.getRowAtClientY(clientY);\n } else {\n return undefined;\n }\n }\n\n /**\n * Returns the row data from the given vertical client position.\n *\n * @param clientY The vertical client position.\n * @returns A row or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public getRowAtClientY(clientY: number): Promise<Row> {\n const layoutEl = this.getLayoutElement();\n const top = layoutEl.layoutOffset;\n const index = Math.floor(\n (clientY - top + layoutEl.scrollOffset) / layoutEl.rowHeight\n );\n return this.getRowAtIndex(index);\n }\n\n /**\n * Performs an async request that will filter the displayed items in the tree\n * that match the given term and options.\n *\n * @param term The filter term.\n * @param options The options to apply to the filter.\n * @returns A promise that completes when the request has completed. Note,\n * items are displayed asynchronously. So the displayed items may not reflect\n * the result of this filter when the promise completes.\n */\n @Method()\n public async filterItems(\n term: string,\n options: FilterTreeOptions = {}\n ): Promise<void> {\n return this.controller?.filter(term, options);\n }\n\n /**\n * Performs an async request that will select the filtered items in the tree\n * that match the given term.\n *\n * @param term The filter term.\n * @returns A promise that completes when the request has completed.\n */\n @Method()\n public async selectFilteredItems(\n term: string,\n options?: SceneTreeOperationOptions\n ): Promise<void> {\n if (this.viewer != null) {\n const metadataSearchKeys =\n this.searchOptions?.metadataSearchKeys ?? this.metadataSearchKeys;\n const definedMetadataKeys =\n metadataSearchKeys.length > 0 ? metadataSearchKeys : this.metadataKeys;\n\n if (definedMetadataKeys.length === 0) {\n console.warn(\n \"No metadata keys were found to perform the selection. Defaulting to ['VERTEX_SCENE_ITEM_NAME']\"\n );\n }\n\n const columnsToSearch =\n definedMetadataKeys.length > 0\n ? definedMetadataKeys\n : ['VERTEX_SCENE_ITEM_NAME'];\n\n const shouldSearchExactMatch =\n this.searchOptions?.exactMatch ?? this.metadataSearchExactMatch;\n const shouldSearchRemoveHiddenItems =\n this.searchOptions?.removeHiddenItems ?? false;\n\n await selectFilterResults(\n this.viewer,\n term,\n columnsToSearch,\n shouldSearchExactMatch,\n shouldSearchRemoveHiddenItems,\n {\n append: false,\n ...options,\n }\n );\n }\n }\n\n /**\n * Fetches the metadata keys that are available to the scene tree. Metadata\n * keys can be assigned to the scene tree using the `metadataKeys` property.\n * The scene tree will fetch this metadata and make these values available\n * for data binding.\n *\n * @returns A promise that resolves with the names of available keys.\n */\n @Method()\n public async fetchMetadataKeys(): Promise<MetadataKey[]> {\n return this.controller?.fetchMetadataKeys() ?? [];\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.stateMap.viewerDisposable?.dispose();\n this.controller?.cancel();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n if (this.controller == null) {\n const { sceneTreeHost } = this.getConfig().network;\n const client = new SceneTreeAPIClient(\n sceneTreeHost,\n this.getConfig().flags.grpcUseStreamingWebSocketTransport\n ? {\n transport: webSocketSubscriptionTransportFactory,\n }\n : undefined\n );\n this.controller = new SceneTreeController(client, 100);\n this.controller?.setMetadataKeys(this.metadataKeys);\n }\n\n this.stateMap.onStateChangeDisposable = this.controller.onStateChange.on(\n (state) => this.handleControllerStateChange(state)\n );\n\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n protected async componentDidLoad(): Promise<void> {\n this.ensureLayoutDefined();\n this.updateLayoutElement();\n\n const layoutEl = this.getLayoutElement();\n const resizeObserver = new ResizeObserver(() => {\n this.invalidateRows();\n });\n resizeObserver.observe(layoutEl);\n this.stateMap.resizeObserver = resizeObserver;\n\n this.stateMap.componentLoaded = true;\n\n this.controller?.setMetadataKeys(this.metadataKeys);\n\n if (this.viewer == null) {\n this.errorDetails = new SceneTreeErrorDetails(\n 'MISSING_VIEWER',\n SceneTreeErrorCode.MISSING_VIEWER\n );\n }\n }\n\n public componentWillRender(): void {\n // The controller can load data prior to the first render\n // ensure that this renders any time the state changes.\n this.updateLayoutElement();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"header\">\n <slot name=\"header\">\n <vertex-scene-tree-toolbar class=\"search-toolbar\">\n <vertex-scene-tree-search controller={this.controller} />\n </vertex-scene-tree-toolbar>\n </slot>\n </div>\n\n {this.errorDetails != null && this.renderError(this.errorDetails)}\n\n {this.errorDetails == null && (\n <div class=\"rows-scroll\">\n {this.showLoader && (\n <slot name=\"loading\">\n <vertex-viewer-spinner class=\"loading\" size=\"md\" />\n </slot>\n )}\n <slot />\n {this.showEmptyResults && (\n <slot name=\"empty-results\">\n <div class=\"empty-results\">No Results Found.</div>\n </slot>\n )}\n </div>\n )}\n\n <div class=\"footer\">\n <slot name=\"footer\" />\n </div>\n </Host>\n );\n }\n\n private renderError(details: SceneTreeErrorDetails): h.JSX.IntrinsicElements {\n if (details.code !== SceneTreeErrorCode.SCENE_TREE_DISABLED) {\n return (\n <SceneTreeError details={details}>\n <button\n class=\"button button-secondary\"\n onClick={() => this.retryConnectToViewer()}\n disabled={this.attemptingRetry}\n >\n Retry\n </button>\n </SceneTreeError>\n );\n } else {\n return <SceneTreeError details={details} />;\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer: HTMLVertexViewerElement | undefined,\n oldViewer: HTMLVertexViewerElement | undefined\n ): void {\n // StencilJS will invoke this callback even before the component has been\n // loaded. According to their docs, this shouldn't happen. Return if the\n // component hasn't been loaded.\n // See https://stenciljs.com/docs/reactive-data#watch-decorator\n if (!this.stateMap.componentLoaded) {\n return;\n }\n\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n protected handleControllerChanged(newController: SceneTreeController): void {\n // StencilJS will invoke this callback even before the component has been\n // loaded. According to their docs, this shouldn't happen. Return if the\n // component hasn't been loaded.\n // See https://stenciljs.com/docs/reactive-data#watch-decorator\n if (!this.stateMap.componentLoaded) {\n return;\n }\n\n this.stateMap.onStateChangeDisposable?.dispose();\n\n this.stateMap.onStateChangeDisposable = newController.onStateChange.on(\n (state) => this.handleControllerStateChange(state)\n );\n\n newController.setMetadataKeys(this.metadataKeys);\n }\n\n /**\n * @ignore\n */\n @Watch('metadataKeys')\n protected handleMetadataKeysChanged(): void {\n this.controller?.setMetadataKeys(this.metadataKeys);\n }\n\n private retryConnectToViewer(): void {\n this.attemptingRetry = true;\n this.errorDetails = undefined;\n this.connectToViewer();\n }\n\n private connectToViewer(): void {\n this.stateMap.viewerDisposable?.dispose();\n\n if (this.viewer == null && this.viewerSelector != null) {\n this.viewer = document.querySelector(this.viewerSelector) as\n | HTMLVertexViewerElement\n | undefined;\n }\n\n if (this.viewer != null) {\n this.stateMap.viewerDisposable = this.controller?.connectToViewer(\n this.viewer\n );\n } else {\n this.attemptingRetry = false;\n }\n }\n\n private scheduleClearUnusedData(): void {\n if (this.stateMap.idleCallbackId != null) {\n window.cancelIdleCallback(this.stateMap.idleCallbackId);\n }\n\n this.stateMap.idleCallbackId = window.requestIdleCallback((foo) => {\n const remaining = foo.timeRemaining?.();\n\n if (remaining == null || remaining >= MIN_CLEAR_UNUSED_DATA_MS) {\n const layoutEl = this.getLayoutElement();\n const startIndex = layoutEl.viewportStartIndex;\n const endIndex = layoutEl.viewportEndIndex;\n const [start, end] =\n this.controller?.getPageIndexesForRange(startIndex, endIndex) || [];\n\n if (start != null && end != null) {\n this.controller?.invalidatePagesOutsideRange(start, end, 50);\n }\n } else {\n this.scheduleClearUnusedData();\n }\n });\n }\n\n private handleControllerStateChange(state: SceneTreeState): void {\n this.showLoader = !!state.shouldShowLoading;\n this.showEmptyResults = !!state.shouldShowEmptyResults;\n this.rows = state.rows;\n this.totalRows = state.totalRows;\n\n if (state.connection.type === 'failure') {\n this.errorDetails = state.connection.details;\n this.connectionError.emit(state.connection.details);\n } else if (state.connection.type === 'disconnected') {\n this.errorDetails = new SceneTreeErrorDetails(\n 'DISCONNECTED',\n SceneTreeErrorCode.DISCONNECTED\n );\n } else {\n this.errorDetails = undefined;\n }\n\n if (\n state.connection.type === 'connected' ||\n state.connection.type === 'failure'\n ) {\n this.attemptingRetry = false;\n }\n }\n\n private async performRowOperation(\n rowOrIndex: number | Row | Node.AsObject,\n op: OperationHandler\n ): Promise<void> {\n const row =\n typeof rowOrIndex === 'number' ? this.rows[rowOrIndex] : rowOrIndex;\n\n if (row == null) {\n throw new Error(`Cannot perform scene tree operation. Row not found.`);\n }\n\n const node = isLoadedRow(row) ? row.node : row;\n\n if (node.id == null) {\n throw new Error(`Cannot perform scene tree operation. ID is undefined.`);\n }\n\n if (this.viewer == null) {\n throw new Error(\n `Cannot perform scene tree operation. Cannot get reference to viewer.`\n );\n }\n\n await op({ viewer: this.viewer, id: node.id.hex, node });\n }\n\n @Listen('search')\n protected async handleSearch(event: CustomEvent<string>): Promise<void> {\n const metadataSearchKeys =\n this.searchOptions?.metadataSearchKeys ?? this.metadataSearchKeys;\n const columnsToSearch =\n metadataSearchKeys.length > 0 ? metadataSearchKeys : this.metadataKeys;\n\n const shouldSearchExactMatch =\n this.searchOptions?.exactMatch ?? this.metadataSearchExactMatch;\n const shouldSearchRemoveHiddenItems =\n this.searchOptions?.removeHiddenItems ?? false;\n\n try {\n await this.filterItems(event.detail, {\n columns: columnsToSearch,\n exactMatch: shouldSearchExactMatch,\n removeHiddenItems: shouldSearchRemoveHiddenItems,\n });\n } catch (e) {\n console.error('Failed to filter tree with exception: ', e);\n }\n }\n\n @Listen('cellLoaded')\n protected async handleCellLoaded(): Promise<void> {\n if (!this.firstCellRendered && this.rows.length > 0) {\n this.firstCellRendered = true;\n this.firstRowRendered.emit();\n }\n }\n\n private getScrollToPosition(\n index: number,\n position: ScrollToOptions['position']\n ): number {\n const layoutEl = this.getLayoutElement();\n const constrainedIndex = Math.max(0, Math.min(index, this.totalRows - 1));\n const viewportHeight = layoutEl.layoutHeight ?? 0;\n const rowHeight = layoutEl.rowHeight;\n\n if (position === 'start') {\n return constrainedIndex * rowHeight;\n } else if (position === 'middle') {\n const rowCenterY = constrainedIndex * rowHeight + rowHeight / 2;\n return rowCenterY - viewportHeight / 2;\n } else {\n const rowBottomY = constrainedIndex * rowHeight + rowHeight;\n return rowBottomY - viewportHeight;\n }\n }\n\n private getConfig(): Config {\n return parseConfig(this.configEnv, this.config);\n }\n\n private ensureLayoutDefined(): void {\n let layout = this.el.querySelector('vertex-scene-tree-table-layout');\n if (layout == null) {\n layout = document.createElement('vertex-scene-tree-table-layout');\n layout.innerHTML = `\n <vertex-scene-tree-table-column>\n <template>\n <vertex-scene-tree-table-cell prop:value=\"{{row.node.name}}\" expand-toggle visibility-toggle></vertex-scene-tree-table-cell>\n </template>\n </vertex-scene-tree-table-column>\n `;\n\n this.el.appendChild(layout);\n }\n this.stateMap.layoutEl = layout;\n }\n\n private updateLayoutElement(): void {\n const layout = this.stateMap.layoutEl;\n if (layout != null) {\n layout.rows = this.rows;\n layout.tree = this.el as HTMLVertexSceneTreeElement;\n layout.totalRows = this.totalRows;\n layout.controller = this.controller;\n layout.rowData = this.rowData;\n } else if (!this.stateMap.componentLoaded && this.totalRows > 0) {\n console.debug(\n 'Scene tree has rows, but the component has not yet rendered'\n );\n }\n }\n\n private getLayoutElement(): HTMLVertexSceneTreeTableLayoutElement {\n if (this.stateMap.layoutEl != null) {\n return this.stateMap.layoutEl;\n } else {\n throw new Error('Layout element is undefined');\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/components/scene-tree/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\n\nimport { Row } from './lib';\nimport { ViewerSelectItemOptions } from './lib/viewer-ops';\n\nexport type MetadataKey = string;\n\nexport type RowDataProvider = (row: Row) => Record<string, unknown>;\n\nexport type RowArg = number | Row | Node.AsObject;\n\n/**\n * A set of options to configure the scroll to index behavior.\n */\nexport interface ScrollToOptions {\n /**\n * Indicates if this operation will be animated. Defaults to `false`.\n */\n animate?: boolean;\n\n /**\n * Indicates where in the viewport the scrolled to item should be placed.\n * Defaults to `middle`.\n */\n position?: 'start' | 'middle' | 'end';\n}\n\nexport interface SceneTreeOperationOptions {\n suppliedCorrelationId?: string;\n}\n\n/**\n * A set of options to configure selection behavior.\n */\nexport interface SelectItemOptions extends ViewerSelectItemOptions {\n /**\n * Specifies that the next deselected ancestor node should be selected.\n */\n recurseParent?: boolean;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/components/scene-tree/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\n\nimport { Row } from './lib';\nimport { ViewerSelectItemOptions } from './lib/viewer-ops';\n\nexport type MetadataKey = string;\n\nexport type RowDataProvider = (row: Row) => Record<string, unknown>;\n\nexport type RowArg = number | Row | Node.AsObject;\n\nexport interface FilterOptions {\n metadataSearchKeys?: MetadataKey[];\n exactMatch?: boolean;\n removeHiddenItems?: boolean;\n}\n\n/**\n * A set of options to configure the scroll to index behavior.\n */\nexport interface ScrollToOptions {\n /**\n * Indicates if this operation will be animated. Defaults to `false`.\n */\n animate?: boolean;\n\n /**\n * Indicates where in the viewport the scrolled to item should be placed.\n * Defaults to `middle`.\n */\n position?: 'start' | 'middle' | 'end';\n}\n\nexport interface SceneTreeOperationOptions {\n suppliedCorrelationId?: string;\n}\n\n/**\n * A set of options to configure selection behavior.\n */\nexport interface SelectItemOptions extends ViewerSelectItemOptions {\n /**\n * Specifies that the next deselected ancestor node should be selected.\n */\n recurseParent?: boolean;\n}\n"]}
@@ -309,7 +309,13 @@ export class ViewerMeasurementDistance {
309
309
  * @ignore
310
310
  */
311
311
  handleModeChanged() {
312
+ var _a;
312
313
  this.warnIfDepthBuffersDisabled();
314
+ // If we're not in edit or replace mode, ensure that the measurement
315
+ // cursor is removed.
316
+ if (this.mode === '') {
317
+ (_a = this.stateMap.hoverCursor) === null || _a === void 0 ? void 0 : _a.dispose();
318
+ }
313
319
  if (this.viewer != null) {
314
320
  this.removeInteractionListeners(this.viewer);
315
321
  this.addInteractionListeners(this.viewer);
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-measurement-distance.js","sourceRoot":"","sources":["../../../../../src/components/viewer-measurement-distance/viewer-measurement-distance.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Line3, Point, Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport {\n MEASUREMENT_LINE_CAP_LENGTH,\n MEASUREMENT_SNAP_DISTANCE,\n} from '../../lib/constants';\nimport { Cursor, measurementCursor } from '../../lib/cursors';\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { Formatter } from '../../lib/formatter';\nimport {\n makeMinimumDistanceResult,\n MeasurementModel,\n MeasurementOverlay,\n MeasurementOverlayManager,\n} from '../../lib/measurement';\nimport {\n DepthBuffer,\n DistanceUnits,\n DistanceUnitType,\n FrameCameraBase,\n StencilBuffer,\n Viewport,\n} from '../../lib/types';\nimport { getMeasurementBoundingClientRect } from './dom';\nimport { PointToPointHitTester } from './hitTest';\nimport {\n PointToPointHitProvider,\n PointToPointInteraction,\n PointToPointInteractionController,\n PointToPointInteractionModel,\n} from './interactions';\nimport {\n Anchor,\n getViewingElementPositions,\n MeasurementElementPositions,\n} from './utils';\nimport { DistanceMeasurementRenderer } from './viewer-measurement-distance-components';\n\n/**\n * Contains the bounding boxes of child elements of this component. This\n * information is useful for positioning popups or other elements around the\n * measurement.\n *\n * @see {@link ViewerDistanceMeasurement.computeElementMetrics} - For\n * calculating element metrics.\n */\nexport interface ViewerMeasurementDistanceElementMetrics {\n startAnchor: DOMRect;\n endAnchor: DOMRect;\n label: DOMRect;\n}\n\n/**\n * The supported measurement modes.\n *\n * @see {@link ViewerDistanceMeasurement.mode} - For more details about modes.\n */\nexport type ViewerMeasurementDistanceMode = 'edit' | 'replace' | '';\n\n/**\n * A details object describing the edit begin event.\n */\nexport interface EditBeginEventDetails {\n type: Exclude<ViewerMeasurementDistanceMode, ''>;\n anchor: Anchor;\n}\n/**\n * A details object describing the edit end event.\n */\nexport interface EditEndEventDetails {\n start: Vector3.Vector3;\n end: Vector3.Vector3;\n valid: boolean;\n}\n\ninterface StateMap {\n hoverCursor?: Disposable;\n stencil?: StencilBuffer;\n depthBuffer?: DepthBuffer;\n}\n\nconst INTERACTION_THRESHOLD = 3;\n\n/**\n * @slot start-anchor - An HTML element for the starting point anchor.\n *\n * @slot start-label - An HTML or text element that displays next to the start\n * anchor.\n *\n * @slot end-anchor - An HTML element for the ending point anchor.\n *\n * @slot end-label - An HTML or text element that displays next to the end\n * anchor.\n *\n * @slot indicator - An HTML element for the measurement indicator. The\n * indicator represents the position where a measurement will be placed while\n * editing.\n */\n@Component({\n tag: 'vertex-viewer-measurement-distance',\n styleUrl: 'viewer-measurement-distance.css',\n shadow: true,\n})\nexport class ViewerMeasurementDistance {\n /**\n * The world position of the starting anchor.\n */\n @Prop({ mutable: true })\n public start?: Vector3.Vector3;\n\n /**\n * The world position of the starting anchor, as a JSON string. The JSON\n * string can be an array or object representation in the format of `[x, y,\n * z]` or `{\"x\": 0, \"y\": 0, \"z\": 0}`.\n */\n @Prop()\n public startJson?: string;\n\n /**\n * The world position of the ending anchor.\n */\n @Prop({ mutable: true })\n public end?: Vector3.Vector3;\n\n /**\n * The world position of the ending anchor, as a JSON string. The JSON string\n * can be an array or object representation in the format of `[x, y, z]` or\n * `{\"x\": 0, \"y\": 0, \"z\": 0}`.\n */\n @Prop()\n public endJson?: string;\n\n /**\n * The distance between `start` and `end` in real world units. Value will be\n * undefined if the start and end positions are undefined, or if the\n * measurement is invalid.\n */\n @Prop({ mutable: true })\n public distance?: number;\n\n /**\n * Enables the display of axis reference lines between the start and end\n * point.\n */\n @Prop()\n public showAxisReferenceLines = false;\n\n /**\n * The distance, in pixels, between the mouse and nearest snappable edge. A\n * value of 0 disables snapping.\n */\n @Prop()\n public snapDistance: number = MEASUREMENT_SNAP_DISTANCE;\n\n /**\n * The unit of measurement.\n */\n @Prop()\n public units: DistanceUnitType = 'millimeters';\n\n /**\n * The number of fraction digits to display.\n */\n @Prop()\n public fractionalDigits = 2;\n\n /**\n * An optional formatter that can be used to format the display of a distance.\n * The formatting function is passed a calculated real-world distance and is\n * expected to return a string.\n */\n @Prop()\n public labelFormatter?: Formatter<number | undefined>;\n\n /**\n * The distance from an anchor to its label.\n */\n @Prop()\n public anchorLabelOffset = 20;\n\n /**\n * The length of the caps at each end of the distance measurement.\n */\n @Prop()\n public lineCapLength = MEASUREMENT_LINE_CAP_LENGTH;\n\n /**\n * A mode that specifies how the measurement component should behave.\n *\n * When unset, the component will not respond to interactions with the\n * handles.\n *\n * When `edit`, the measurement anchors are interactive and the user is able\n * to reposition them.\n *\n * When `replace`, anytime the user clicks on the canvas, a new measurement\n * will be created and replace any existing measurement. After a measurement\n * is created, the measurement will be editable.\n */\n @Prop({ reflect: true })\n public mode: ViewerMeasurementDistanceMode = '';\n\n /**\n * A property that reflects which anchor is currently being interacted with.\n */\n @Prop({ reflect: true, mutable: true })\n public interactingAnchor: Anchor | 'none' = 'none';\n\n /**\n * Indicates if the measurement is invalid. A measurement is invalid if either\n * the start or end position are not on the surface of the model.\n */\n @Prop({ mutable: true, reflect: true })\n public invalid = false;\n\n /**\n * The camera used to position the anchors. If `viewer` is defined, then the\n * projection view matrix of the viewer will be used.\n */\n @Prop()\n public camera?: FrameCameraBase;\n\n /**\n * @internal\n */\n @Prop()\n public hitProvider?: PointToPointHitProvider;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public indicatorPt?: Vector3.Vector3;\n\n /**\n * The viewer to connect to this measurement. The measurement will redraw any\n * time the viewer redraws the scene.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The measurement model that will be updated when this measurement changes.\n * You can pass this to a <vertex-viewer-measurement-details> component to\n * display measurement outcomes.\n */\n @Prop()\n public measurementModel: MeasurementModel = new MeasurementModel();\n\n /**\n * An event that is dispatched anytime the user begins editing the\n * measurement.\n */\n @Event()\n public editBegin!: EventEmitter<EditBeginEventDetails>;\n\n /**\n * An event that is dispatched when the user has finished editing the\n * measurement.\n */\n @Event()\n public editEnd!: EventEmitter<EditEndEventDetails>;\n\n @State()\n private viewport: Viewport = new Viewport(0, 0);\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private interactionCount = 0;\n\n @State()\n private internalCamera?: FrameCameraBase;\n\n @State()\n private invalidateStateCounter = 0;\n\n @State()\n // Any data that should be preserved across live-reloads, but should not cause\n // a rerender if changed.\n private stateMap: StateMap = {};\n\n @State()\n private measurementUnits = new DistanceUnits(this.units);\n\n @Element()\n private hostEl!: HTMLElement;\n\n private model = PointToPointInteractionModel.empty();\n private controller = new PointToPointInteractionController(this.model);\n private interaction?: PointToPointInteraction;\n\n private overlays = new MeasurementOverlayManager();\n private overlay?: MeasurementOverlay;\n\n private isUserInteractingWithModel = false;\n\n private newInteractionHandler?: Disposable;\n\n /**\n * Computes the bounding boxes of the anchors and label. **Note:** invoking\n * this function uses `getBoundingClientRect` internally and will cause a\n * relayout of the DOM.\n */\n @Method()\n public async computeElementMetrics(): Promise<\n ViewerMeasurementDistanceElementMetrics | undefined\n > {\n const startAnchorEl =\n this.hostEl.shadowRoot?.getElementById('start-anchor');\n const endAnchorEl = this.hostEl.shadowRoot?.getElementById('end-anchor');\n const labelEl = this.hostEl.shadowRoot?.getElementById('label');\n\n if (startAnchorEl != null && endAnchorEl != null && labelEl != null) {\n return {\n startAnchor: startAnchorEl.getBoundingClientRect(),\n endAnchor: endAnchorEl.getBoundingClientRect(),\n label: labelEl.getBoundingClientRect(),\n };\n } else {\n return undefined;\n }\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.stateMap.hoverCursor?.dispose();\n this.newInteractionHandler?.dispose();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updatePropsFromJson();\n this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);\n\n this.getStencilBuffer();\n this.updateViewport();\n\n this.handleViewerChanged(this.viewer);\n this.handleModeChanged();\n\n this.computePropsAndState();\n\n this.model.onIndicatorChanged((pt) => {\n this.indicatorPt = pt;\n });\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n }\n\n /**\n * @ignore\n */\n protected componentWillUpdate(): void {\n this.computePropsAndState();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n {this.showAxisReferenceLines && (\n <vertex-viewer-measurement-overlays\n measurementOverlays={this.overlays}\n viewer={this.viewer}\n />\n )}\n {this.renderMeasurement()}\n </Host>\n );\n }\n\n private renderMeasurement(): h.JSX.IntrinsicElements {\n const positions = this.computeElementPositions();\n const { startPt, endPt, labelPt, indicatorPt, hideStart, hideEnd } =\n positions;\n const distance = this.formatDistance(this.distance);\n\n if (this.mode === 'edit' || this.mode === 'replace') {\n return (\n <DistanceMeasurementRenderer\n startPt={startPt}\n endPt={endPt}\n centerPt={labelPt}\n indicatorPt={indicatorPt}\n distance={distance}\n anchorLabelOffset={this.anchorLabelOffset}\n lineCapLength={this.lineCapLength}\n hideStartAnchor={hideStart}\n hideEndAnchor={hideEnd}\n onStartAnchorPointerDown={this.handleEditAnchor('start')}\n onEndAnchorPointerDown={this.handleEditAnchor('end')}\n />\n );\n } else {\n return (\n <DistanceMeasurementRenderer\n startPt={startPt}\n endPt={endPt}\n centerPt={labelPt}\n indicatorPt={this.indicatorPt}\n distance={distance}\n hideStartAnchor={hideStart}\n hideEndAnchor={hideEnd}\n anchorLabelOffset={this.anchorLabelOffset}\n lineCapLength={this.lineCapLength}\n linePointerEvents=\"painted\"\n />\n );\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n if (oldViewer != null) {\n oldViewer.removeEventListener('frameDrawn', this.handleFrameDrawn);\n this.removeInteractionListeners(oldViewer);\n }\n\n if (newViewer != null) {\n newViewer.addEventListener('frameDrawn', this.handleFrameDrawn);\n this.addInteractionListeners(newViewer);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('units')\n protected handleUnitsChanged(): void {\n this.measurementUnits = new DistanceUnits(this.units);\n }\n\n /**\n * @ignore\n */\n @Watch('camera')\n protected handleCameraChanged(): void {\n this.updateCamera();\n }\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected handleModeChanged(): void {\n this.warnIfDepthBuffersDisabled();\n\n if (this.viewer != null) {\n this.removeInteractionListeners(this.viewer);\n this.addInteractionListeners(this.viewer);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('start')\n protected handleStartChanged(): void {\n this.updateInteractionModel();\n }\n\n /**\n * @ignore\n */\n @Watch('end')\n protected handleEndChanged(): void {\n this.updateInteractionModel();\n }\n\n /**\n * @ignore\n */\n @Watch('invalid')\n protected handleInvalidChanged(): void {\n this.updateInteractionModel();\n }\n\n private computePropsAndState(): void {\n this.updateCamera();\n this.updateDepthBuffer();\n this.updateMeasurementPropsFromModel();\n this.updateOverlays();\n }\n\n private updateOverlays(): void {\n this.overlay?.dispose();\n\n if (\n this.showAxisReferenceLines &&\n this.interactionCount === 0 &&\n !this.invalid &&\n this.start != null &&\n this.end != null\n ) {\n this.overlay = this.overlays.addDistanceVector(this.start, this.end);\n }\n }\n\n private async setCursor(cursor: Cursor): Promise<void> {\n this.stateMap.hoverCursor?.dispose();\n\n if (!this.isUserInteractingWithModel) {\n this.stateMap.hoverCursor = await this.viewer?.addCursor(cursor);\n }\n }\n\n private computeElementPositions(): MeasurementElementPositions {\n if (this.mode === 'replace') {\n return this.computeReplaceElementPositions();\n } else {\n return this.computeEditOrViewElementPositions();\n }\n }\n\n private computeEditOrViewElementPositions(): MeasurementElementPositions {\n const measurement = this.model.getMeasurement();\n if (this.internalCamera != null && measurement != null) {\n return this.computeLineElementPositions(Line3.create(measurement));\n } else {\n return {};\n }\n }\n\n private computeReplaceElementPositions(): MeasurementElementPositions {\n if (this.internalCamera != null) {\n const measurement = this.model.getMeasurement();\n\n const line =\n measurement != null\n ? this.computeLineElementPositions(Line3.create(measurement))\n : {};\n const indicator =\n this.indicatorPt != null\n ? {\n indicatorPt: this.viewport.transformWorldToViewport(\n this.indicatorPt,\n this.internalCamera.projectionViewMatrix\n ),\n }\n : {};\n\n return { ...line, ...indicator };\n } else {\n return {};\n }\n }\n\n private computeLineElementPositions(\n line: Line3.Line3\n ): MeasurementElementPositions {\n if (this.internalCamera != null) {\n return getViewingElementPositions(line, this.interactingAnchor, {\n viewport: this.viewport,\n camera: this.internalCamera,\n });\n } else {\n return {};\n }\n }\n\n private updateCamera(): void {\n this.internalCamera = this.camera || this.viewer?.frame?.scene.camera;\n }\n\n private async updateDepthBuffer(): Promise<void> {\n this.stateMap.depthBuffer = await this.viewer?.frame?.depthBuffer();\n }\n\n private updateViewport(): void {\n const rect = getMeasurementBoundingClientRect(this.hostEl);\n this.viewport = new Viewport(rect.width, rect.height);\n this.elementBounds = rect;\n }\n\n private updatePropsFromJson(): void {\n this.start = parseVector3(this.startJson ?? this.start);\n this.end = parseVector3(this.endJson ?? this.end);\n }\n\n private updateInteractionModel(): void {\n this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);\n }\n\n private handleFrameDrawn = (): void => {\n this.invalidateState();\n };\n\n private invalidateState(): void {\n this.invalidateStateCounter = this.invalidateStateCounter + 1;\n }\n\n private async addInteractionListeners(\n viewer: HTMLVertexViewerElement\n ): Promise<void> {\n const interactionTarget = await viewer.getInteractionTarget_DEPRECATED();\n if (this.mode === 'replace') {\n interactionTarget.addEventListener('pointermove', this.updateStartAnchor);\n interactionTarget.addEventListener('pointerdown', this.newMeasurement);\n interactionTarget.addEventListener('pointerleave', this.clearIndicator);\n }\n }\n\n private async removeInteractionListeners(\n viewer: HTMLVertexViewerElement\n ): Promise<void> {\n const interactionTarget = await viewer.getInteractionTarget_DEPRECATED();\n interactionTarget.removeEventListener(\n 'pointermove',\n this.updateStartAnchor\n );\n interactionTarget.removeEventListener('pointerdown', this.newMeasurement);\n interactionTarget.removeEventListener('pointerleave', this.clearIndicator);\n }\n\n private clearIndicator = (): void => {\n this.controller.clearIndicator();\n };\n\n private updateStartAnchor = async (event: PointerEvent): Promise<void> => {\n this.getStencilBuffer();\n\n if (this.interactionCount === 0) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n this.updateIndicator(snapPt);\n }\n };\n\n private newMeasurement = (event: PointerEvent): void => {\n if (this.interactionCount === 0 && event.button === 0) {\n // Function that registers event listeners to perform a new measurement.\n const startMeasurement = (start: () => void): void => {\n const dispose = (): void => {\n window.removeEventListener('pointerup', pointerUp);\n window.removeEventListener('pointermove', pointerMove);\n };\n const pointerUp = async (): Promise<void> => {\n dispose();\n start();\n };\n const pointerMove = (event: PointerEvent): void => {\n if (event.buttons > 0) {\n dispose();\n }\n };\n\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n // Function that registers event listeners to detect if a user is\n // interacting with the model. If so, we temporarily disable measurement\n // updates until the user finishes.\n const pointerDownAndMove = (callback: () => void): Disposable => {\n let downPt: Point.Point = Point.create(0, 0);\n\n const pointerMove = (event: PointerEvent): void => {\n const dist = Point.distance(downPt, getMouseClientPosition(event));\n if (dist >= INTERACTION_THRESHOLD) {\n callback();\n }\n };\n\n const dispose = (): void => {\n window.removeEventListener('pointermove', pointerMove);\n window.removeEventListener('pointerup', pointerUp);\n };\n\n const pointerUp = (): void => dispose();\n\n const pointerDown = (event: PointerEvent): void => {\n downPt = getMouseClientPosition(event);\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n window.addEventListener('pointerdown', pointerDown);\n\n return {\n dispose: () => window.removeEventListener('pointerdown', pointerDown),\n };\n };\n\n // Function that registers event listeners to finish a measurement.\n const measureInteraction = (): void => {\n const handleDownAndMove = pointerDownAndMove(() => {\n this.isUserInteractingWithModel = true;\n this.stateMap.hoverCursor?.dispose();\n });\n\n const dispose = (): void => {\n window.removeEventListener('pointermove', pointerMove);\n window.removeEventListener('pointerup', pointerUp);\n handleDownAndMove.dispose();\n };\n\n const pointerMove = this.createInteractionMoveHandler();\n const pointerUp = async (event: PointerEvent): Promise<void> => {\n if (event.button === 0) {\n if (this.isUserInteractingWithModel) {\n this.isUserInteractingWithModel = false;\n } else {\n const hits = this.getHitProvider();\n if (hits != null) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n await this.interaction?.finish(snapPt, hits);\n\n dispose();\n this.updateMeasurementPropsFromModel();\n this.endEditing();\n }\n }\n }\n };\n\n this.beginEditing('replace', 'end');\n this.newInteractionHandler = { dispose };\n\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n const hits = this.getHitProvider();\n if (hits != null) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n this.interaction = this.controller.newMeasurement(snapPt, hits);\n\n if (this.interaction != null) {\n startMeasurement(measureInteraction);\n }\n }\n }\n };\n\n private handleEditAnchor(\n anchor: Anchor\n ): ((event: PointerEvent) => void) | undefined {\n if (this.mode === 'edit' || this.mode === 'replace') {\n const handlePointerMove = this.createInteractionMoveHandler();\n const handlePointerUp = async (event: PointerEvent): Promise<void> => {\n const hits = this.getHitProvider();\n if (hits != null) {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n await this.interaction?.finish(snapPt, hits);\n\n this.updateMeasurementPropsFromModel();\n this.endEditing();\n }\n };\n\n return (event) => {\n this.getStencilBuffer();\n\n if (event.button === 0) {\n this.beginEditing('edit', anchor);\n\n this.interaction = this.controller.editMeasurement(anchor);\n\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n }\n };\n }\n }\n\n private createInteractionMoveHandler(): (event: PointerEvent) => void {\n return (event) => {\n const hits = this.getHitProvider();\n if (this.elementBounds != null && hits != null) {\n event.preventDefault();\n this.getStencilBuffer();\n\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n this.interaction?.update(snapPt, hits);\n this.updateMeasurementPropsFromModel();\n }\n };\n }\n\n private async getStencilBuffer(): Promise<void> {\n const stencil = await this.viewer?.stencilBuffer.latestAfterInteraction();\n this.stateMap.stencil = stencil;\n }\n\n private snapPoint(pt: Point.Point, event: MouseEvent): Point.Point {\n const hits = this.getHitProvider();\n if (hits != null && !event.shiftKey) {\n const snapDistance = Math.max(0, this.snapDistance);\n return hits.hitTester().snapToNearestPixel(pt, snapDistance);\n }\n return pt;\n }\n\n private formatDistance(distance: number | undefined): string {\n const dist =\n distance != null\n ? this.measurementUnits.convertWorldValueToReal(distance)\n : undefined;\n\n if (this.labelFormatter != null) {\n return this.labelFormatter(dist);\n } else {\n const abbreviated = this.measurementUnits.unit.abbreviatedName;\n return dist == null\n ? '---'\n : `~${dist.toFixed(this.fractionalDigits)} ${abbreviated}`;\n }\n }\n\n private beginEditing(\n type: EditBeginEventDetails['type'],\n anchor: EditBeginEventDetails['anchor']\n ): void {\n if (this.interactionCount === 0) {\n this.interactingAnchor = anchor;\n this.editBegin.emit({ type, anchor });\n }\n this.interactionCount = this.interactionCount + 1;\n }\n\n private endEditing(): void {\n if (this.interactionCount === 1) {\n const measurement = this.model.getMeasurement();\n\n this.interactingAnchor = 'none';\n this.updateMeasurementModel();\n\n if (measurement != null) {\n this.editEnd.emit(measurement);\n }\n }\n this.interactionCount = this.interactionCount - 1;\n }\n\n private updateMeasurementModel(): void {\n this.measurementModel.clearOutcome();\n\n if (!this.invalid && this.start != null && this.end != null) {\n this.measurementModel.setOutcome({\n isApproximate: true,\n results: [makeMinimumDistanceResult(this.start, this.end)],\n });\n }\n }\n\n private getHitProvider(): PointToPointHitProvider | undefined {\n if (this.hitProvider == null) {\n const hitTester = this.getHitTester();\n const viewer = this.viewer;\n if (viewer != null && hitTester != null) {\n return {\n hitTester: () => hitTester,\n raycaster: async () => (await viewer.scene()).raycaster(),\n };\n }\n } else return this.hitProvider;\n }\n\n private getHitTester(): PointToPointHitTester | undefined {\n const { stencil, depthBuffer } = this.stateMap;\n if (depthBuffer != null) {\n return new PointToPointHitTester(\n stencil,\n depthBuffer,\n this.viewport,\n this.internalCamera\n );\n }\n }\n\n private updateMeasurementPropsFromModel(): void {\n const measurement = this.model.getMeasurement();\n this.start = measurement?.start;\n this.end = measurement?.end;\n this.distance = measurement?.distance;\n this.invalid = measurement != null && !measurement.valid;\n }\n\n private updateIndicator(pt: Point.Point): void {\n const hits = this.getHitProvider();\n const clearCursor =\n hits == null || !this.controller.moveIndicator(pt, hits);\n if (clearCursor) {\n this.stateMap.hoverCursor?.dispose();\n } else {\n this.setCursor(measurementCursor);\n }\n }\n\n private warnIfDepthBuffersDisabled(): void {\n if (this.viewer != null && this.viewer.depthBuffers == null) {\n console.warn(\n 'Measurement editing is disabled. <vertex-viewer> must have its `depth-buffers` attribute set.'\n );\n }\n }\n}\n\nfunction parseVector3(\n value: string | Vector3.Vector3 | undefined\n): Vector3.Vector3 | undefined {\n return typeof value === 'string' ? Vector3.fromJson(value) : value;\n}\n"]}
1
+ {"version":3,"file":"viewer-measurement-distance.js","sourceRoot":"","sources":["../../../../../src/components/viewer-measurement-distance/viewer-measurement-distance.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Line3, Point, Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport {\n MEASUREMENT_LINE_CAP_LENGTH,\n MEASUREMENT_SNAP_DISTANCE,\n} from '../../lib/constants';\nimport { Cursor, measurementCursor } from '../../lib/cursors';\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { Formatter } from '../../lib/formatter';\nimport {\n makeMinimumDistanceResult,\n MeasurementModel,\n MeasurementOverlay,\n MeasurementOverlayManager,\n} from '../../lib/measurement';\nimport {\n DepthBuffer,\n DistanceUnits,\n DistanceUnitType,\n FrameCameraBase,\n StencilBuffer,\n Viewport,\n} from '../../lib/types';\nimport { getMeasurementBoundingClientRect } from './dom';\nimport { PointToPointHitTester } from './hitTest';\nimport {\n PointToPointHitProvider,\n PointToPointInteraction,\n PointToPointInteractionController,\n PointToPointInteractionModel,\n} from './interactions';\nimport {\n Anchor,\n getViewingElementPositions,\n MeasurementElementPositions,\n} from './utils';\nimport { DistanceMeasurementRenderer } from './viewer-measurement-distance-components';\n\n/**\n * Contains the bounding boxes of child elements of this component. This\n * information is useful for positioning popups or other elements around the\n * measurement.\n *\n * @see {@link ViewerDistanceMeasurement.computeElementMetrics} - For\n * calculating element metrics.\n */\nexport interface ViewerMeasurementDistanceElementMetrics {\n startAnchor: DOMRect;\n endAnchor: DOMRect;\n label: DOMRect;\n}\n\n/**\n * The supported measurement modes.\n *\n * @see {@link ViewerDistanceMeasurement.mode} - For more details about modes.\n */\nexport type ViewerMeasurementDistanceMode = 'edit' | 'replace' | '';\n\n/**\n * A details object describing the edit begin event.\n */\nexport interface EditBeginEventDetails {\n type: Exclude<ViewerMeasurementDistanceMode, ''>;\n anchor: Anchor;\n}\n/**\n * A details object describing the edit end event.\n */\nexport interface EditEndEventDetails {\n start: Vector3.Vector3;\n end: Vector3.Vector3;\n valid: boolean;\n}\n\ninterface StateMap {\n hoverCursor?: Disposable;\n stencil?: StencilBuffer;\n depthBuffer?: DepthBuffer;\n}\n\nconst INTERACTION_THRESHOLD = 3;\n\n/**\n * @slot start-anchor - An HTML element for the starting point anchor.\n *\n * @slot start-label - An HTML or text element that displays next to the start\n * anchor.\n *\n * @slot end-anchor - An HTML element for the ending point anchor.\n *\n * @slot end-label - An HTML or text element that displays next to the end\n * anchor.\n *\n * @slot indicator - An HTML element for the measurement indicator. The\n * indicator represents the position where a measurement will be placed while\n * editing.\n */\n@Component({\n tag: 'vertex-viewer-measurement-distance',\n styleUrl: 'viewer-measurement-distance.css',\n shadow: true,\n})\nexport class ViewerMeasurementDistance {\n /**\n * The world position of the starting anchor.\n */\n @Prop({ mutable: true })\n public start?: Vector3.Vector3;\n\n /**\n * The world position of the starting anchor, as a JSON string. The JSON\n * string can be an array or object representation in the format of `[x, y,\n * z]` or `{\"x\": 0, \"y\": 0, \"z\": 0}`.\n */\n @Prop()\n public startJson?: string;\n\n /**\n * The world position of the ending anchor.\n */\n @Prop({ mutable: true })\n public end?: Vector3.Vector3;\n\n /**\n * The world position of the ending anchor, as a JSON string. The JSON string\n * can be an array or object representation in the format of `[x, y, z]` or\n * `{\"x\": 0, \"y\": 0, \"z\": 0}`.\n */\n @Prop()\n public endJson?: string;\n\n /**\n * The distance between `start` and `end` in real world units. Value will be\n * undefined if the start and end positions are undefined, or if the\n * measurement is invalid.\n */\n @Prop({ mutable: true })\n public distance?: number;\n\n /**\n * Enables the display of axis reference lines between the start and end\n * point.\n */\n @Prop()\n public showAxisReferenceLines = false;\n\n /**\n * The distance, in pixels, between the mouse and nearest snappable edge. A\n * value of 0 disables snapping.\n */\n @Prop()\n public snapDistance: number = MEASUREMENT_SNAP_DISTANCE;\n\n /**\n * The unit of measurement.\n */\n @Prop()\n public units: DistanceUnitType = 'millimeters';\n\n /**\n * The number of fraction digits to display.\n */\n @Prop()\n public fractionalDigits = 2;\n\n /**\n * An optional formatter that can be used to format the display of a distance.\n * The formatting function is passed a calculated real-world distance and is\n * expected to return a string.\n */\n @Prop()\n public labelFormatter?: Formatter<number | undefined>;\n\n /**\n * The distance from an anchor to its label.\n */\n @Prop()\n public anchorLabelOffset = 20;\n\n /**\n * The length of the caps at each end of the distance measurement.\n */\n @Prop()\n public lineCapLength = MEASUREMENT_LINE_CAP_LENGTH;\n\n /**\n * A mode that specifies how the measurement component should behave.\n *\n * When unset, the component will not respond to interactions with the\n * handles.\n *\n * When `edit`, the measurement anchors are interactive and the user is able\n * to reposition them.\n *\n * When `replace`, anytime the user clicks on the canvas, a new measurement\n * will be created and replace any existing measurement. After a measurement\n * is created, the measurement will be editable.\n */\n @Prop({ reflect: true })\n public mode: ViewerMeasurementDistanceMode = '';\n\n /**\n * A property that reflects which anchor is currently being interacted with.\n */\n @Prop({ reflect: true, mutable: true })\n public interactingAnchor: Anchor | 'none' = 'none';\n\n /**\n * Indicates if the measurement is invalid. A measurement is invalid if either\n * the start or end position are not on the surface of the model.\n */\n @Prop({ mutable: true, reflect: true })\n public invalid = false;\n\n /**\n * The camera used to position the anchors. If `viewer` is defined, then the\n * projection view matrix of the viewer will be used.\n */\n @Prop()\n public camera?: FrameCameraBase;\n\n /**\n * @internal\n */\n @Prop()\n public hitProvider?: PointToPointHitProvider;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public indicatorPt?: Vector3.Vector3;\n\n /**\n * The viewer to connect to this measurement. The measurement will redraw any\n * time the viewer redraws the scene.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The measurement model that will be updated when this measurement changes.\n * You can pass this to a <vertex-viewer-measurement-details> component to\n * display measurement outcomes.\n */\n @Prop()\n public measurementModel: MeasurementModel = new MeasurementModel();\n\n /**\n * An event that is dispatched anytime the user begins editing the\n * measurement.\n */\n @Event()\n public editBegin!: EventEmitter<EditBeginEventDetails>;\n\n /**\n * An event that is dispatched when the user has finished editing the\n * measurement.\n */\n @Event()\n public editEnd!: EventEmitter<EditEndEventDetails>;\n\n @State()\n private viewport: Viewport = new Viewport(0, 0);\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private interactionCount = 0;\n\n @State()\n private internalCamera?: FrameCameraBase;\n\n @State()\n private invalidateStateCounter = 0;\n\n @State()\n // Any data that should be preserved across live-reloads, but should not cause\n // a rerender if changed.\n private stateMap: StateMap = {};\n\n @State()\n private measurementUnits = new DistanceUnits(this.units);\n\n @Element()\n private hostEl!: HTMLElement;\n\n private model = PointToPointInteractionModel.empty();\n private controller = new PointToPointInteractionController(this.model);\n private interaction?: PointToPointInteraction;\n\n private overlays = new MeasurementOverlayManager();\n private overlay?: MeasurementOverlay;\n\n private isUserInteractingWithModel = false;\n\n private newInteractionHandler?: Disposable;\n\n /**\n * Computes the bounding boxes of the anchors and label. **Note:** invoking\n * this function uses `getBoundingClientRect` internally and will cause a\n * relayout of the DOM.\n */\n @Method()\n public async computeElementMetrics(): Promise<\n ViewerMeasurementDistanceElementMetrics | undefined\n > {\n const startAnchorEl =\n this.hostEl.shadowRoot?.getElementById('start-anchor');\n const endAnchorEl = this.hostEl.shadowRoot?.getElementById('end-anchor');\n const labelEl = this.hostEl.shadowRoot?.getElementById('label');\n\n if (startAnchorEl != null && endAnchorEl != null && labelEl != null) {\n return {\n startAnchor: startAnchorEl.getBoundingClientRect(),\n endAnchor: endAnchorEl.getBoundingClientRect(),\n label: labelEl.getBoundingClientRect(),\n };\n } else {\n return undefined;\n }\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.stateMap.hoverCursor?.dispose();\n this.newInteractionHandler?.dispose();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updatePropsFromJson();\n this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);\n\n this.getStencilBuffer();\n this.updateViewport();\n\n this.handleViewerChanged(this.viewer);\n this.handleModeChanged();\n\n this.computePropsAndState();\n\n this.model.onIndicatorChanged((pt) => {\n this.indicatorPt = pt;\n });\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n }\n\n /**\n * @ignore\n */\n protected componentWillUpdate(): void {\n this.computePropsAndState();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n {this.showAxisReferenceLines && (\n <vertex-viewer-measurement-overlays\n measurementOverlays={this.overlays}\n viewer={this.viewer}\n />\n )}\n {this.renderMeasurement()}\n </Host>\n );\n }\n\n private renderMeasurement(): h.JSX.IntrinsicElements {\n const positions = this.computeElementPositions();\n const { startPt, endPt, labelPt, indicatorPt, hideStart, hideEnd } =\n positions;\n const distance = this.formatDistance(this.distance);\n\n if (this.mode === 'edit' || this.mode === 'replace') {\n return (\n <DistanceMeasurementRenderer\n startPt={startPt}\n endPt={endPt}\n centerPt={labelPt}\n indicatorPt={indicatorPt}\n distance={distance}\n anchorLabelOffset={this.anchorLabelOffset}\n lineCapLength={this.lineCapLength}\n hideStartAnchor={hideStart}\n hideEndAnchor={hideEnd}\n onStartAnchorPointerDown={this.handleEditAnchor('start')}\n onEndAnchorPointerDown={this.handleEditAnchor('end')}\n />\n );\n } else {\n return (\n <DistanceMeasurementRenderer\n startPt={startPt}\n endPt={endPt}\n centerPt={labelPt}\n indicatorPt={this.indicatorPt}\n distance={distance}\n hideStartAnchor={hideStart}\n hideEndAnchor={hideEnd}\n anchorLabelOffset={this.anchorLabelOffset}\n lineCapLength={this.lineCapLength}\n linePointerEvents=\"painted\"\n />\n );\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n if (oldViewer != null) {\n oldViewer.removeEventListener('frameDrawn', this.handleFrameDrawn);\n this.removeInteractionListeners(oldViewer);\n }\n\n if (newViewer != null) {\n newViewer.addEventListener('frameDrawn', this.handleFrameDrawn);\n this.addInteractionListeners(newViewer);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('units')\n protected handleUnitsChanged(): void {\n this.measurementUnits = new DistanceUnits(this.units);\n }\n\n /**\n * @ignore\n */\n @Watch('camera')\n protected handleCameraChanged(): void {\n this.updateCamera();\n }\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected handleModeChanged(): void {\n this.warnIfDepthBuffersDisabled();\n\n // If we're not in edit or replace mode, ensure that the measurement\n // cursor is removed.\n if (this.mode === '') {\n this.stateMap.hoverCursor?.dispose();\n }\n\n if (this.viewer != null) {\n this.removeInteractionListeners(this.viewer);\n this.addInteractionListeners(this.viewer);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('start')\n protected handleStartChanged(): void {\n this.updateInteractionModel();\n }\n\n /**\n * @ignore\n */\n @Watch('end')\n protected handleEndChanged(): void {\n this.updateInteractionModel();\n }\n\n /**\n * @ignore\n */\n @Watch('invalid')\n protected handleInvalidChanged(): void {\n this.updateInteractionModel();\n }\n\n private computePropsAndState(): void {\n this.updateCamera();\n this.updateDepthBuffer();\n this.updateMeasurementPropsFromModel();\n this.updateOverlays();\n }\n\n private updateOverlays(): void {\n this.overlay?.dispose();\n\n if (\n this.showAxisReferenceLines &&\n this.interactionCount === 0 &&\n !this.invalid &&\n this.start != null &&\n this.end != null\n ) {\n this.overlay = this.overlays.addDistanceVector(this.start, this.end);\n }\n }\n\n private async setCursor(cursor: Cursor): Promise<void> {\n this.stateMap.hoverCursor?.dispose();\n\n if (!this.isUserInteractingWithModel) {\n this.stateMap.hoverCursor = await this.viewer?.addCursor(cursor);\n }\n }\n\n private computeElementPositions(): MeasurementElementPositions {\n if (this.mode === 'replace') {\n return this.computeReplaceElementPositions();\n } else {\n return this.computeEditOrViewElementPositions();\n }\n }\n\n private computeEditOrViewElementPositions(): MeasurementElementPositions {\n const measurement = this.model.getMeasurement();\n if (this.internalCamera != null && measurement != null) {\n return this.computeLineElementPositions(Line3.create(measurement));\n } else {\n return {};\n }\n }\n\n private computeReplaceElementPositions(): MeasurementElementPositions {\n if (this.internalCamera != null) {\n const measurement = this.model.getMeasurement();\n\n const line =\n measurement != null\n ? this.computeLineElementPositions(Line3.create(measurement))\n : {};\n const indicator =\n this.indicatorPt != null\n ? {\n indicatorPt: this.viewport.transformWorldToViewport(\n this.indicatorPt,\n this.internalCamera.projectionViewMatrix\n ),\n }\n : {};\n\n return { ...line, ...indicator };\n } else {\n return {};\n }\n }\n\n private computeLineElementPositions(\n line: Line3.Line3\n ): MeasurementElementPositions {\n if (this.internalCamera != null) {\n return getViewingElementPositions(line, this.interactingAnchor, {\n viewport: this.viewport,\n camera: this.internalCamera,\n });\n } else {\n return {};\n }\n }\n\n private updateCamera(): void {\n this.internalCamera = this.camera || this.viewer?.frame?.scene.camera;\n }\n\n private async updateDepthBuffer(): Promise<void> {\n this.stateMap.depthBuffer = await this.viewer?.frame?.depthBuffer();\n }\n\n private updateViewport(): void {\n const rect = getMeasurementBoundingClientRect(this.hostEl);\n this.viewport = new Viewport(rect.width, rect.height);\n this.elementBounds = rect;\n }\n\n private updatePropsFromJson(): void {\n this.start = parseVector3(this.startJson ?? this.start);\n this.end = parseVector3(this.endJson ?? this.end);\n }\n\n private updateInteractionModel(): void {\n this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);\n }\n\n private handleFrameDrawn = (): void => {\n this.invalidateState();\n };\n\n private invalidateState(): void {\n this.invalidateStateCounter = this.invalidateStateCounter + 1;\n }\n\n private async addInteractionListeners(\n viewer: HTMLVertexViewerElement\n ): Promise<void> {\n const interactionTarget = await viewer.getInteractionTarget_DEPRECATED();\n if (this.mode === 'replace') {\n interactionTarget.addEventListener('pointermove', this.updateStartAnchor);\n interactionTarget.addEventListener('pointerdown', this.newMeasurement);\n interactionTarget.addEventListener('pointerleave', this.clearIndicator);\n }\n }\n\n private async removeInteractionListeners(\n viewer: HTMLVertexViewerElement\n ): Promise<void> {\n const interactionTarget = await viewer.getInteractionTarget_DEPRECATED();\n interactionTarget.removeEventListener(\n 'pointermove',\n this.updateStartAnchor\n );\n interactionTarget.removeEventListener('pointerdown', this.newMeasurement);\n interactionTarget.removeEventListener('pointerleave', this.clearIndicator);\n }\n\n private clearIndicator = (): void => {\n this.controller.clearIndicator();\n };\n\n private updateStartAnchor = async (event: PointerEvent): Promise<void> => {\n this.getStencilBuffer();\n\n if (this.interactionCount === 0) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n this.updateIndicator(snapPt);\n }\n };\n\n private newMeasurement = (event: PointerEvent): void => {\n if (this.interactionCount === 0 && event.button === 0) {\n // Function that registers event listeners to perform a new measurement.\n const startMeasurement = (start: () => void): void => {\n const dispose = (): void => {\n window.removeEventListener('pointerup', pointerUp);\n window.removeEventListener('pointermove', pointerMove);\n };\n const pointerUp = async (): Promise<void> => {\n dispose();\n start();\n };\n const pointerMove = (event: PointerEvent): void => {\n if (event.buttons > 0) {\n dispose();\n }\n };\n\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n // Function that registers event listeners to detect if a user is\n // interacting with the model. If so, we temporarily disable measurement\n // updates until the user finishes.\n const pointerDownAndMove = (callback: () => void): Disposable => {\n let downPt: Point.Point = Point.create(0, 0);\n\n const pointerMove = (event: PointerEvent): void => {\n const dist = Point.distance(downPt, getMouseClientPosition(event));\n if (dist >= INTERACTION_THRESHOLD) {\n callback();\n }\n };\n\n const dispose = (): void => {\n window.removeEventListener('pointermove', pointerMove);\n window.removeEventListener('pointerup', pointerUp);\n };\n\n const pointerUp = (): void => dispose();\n\n const pointerDown = (event: PointerEvent): void => {\n downPt = getMouseClientPosition(event);\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n window.addEventListener('pointerdown', pointerDown);\n\n return {\n dispose: () => window.removeEventListener('pointerdown', pointerDown),\n };\n };\n\n // Function that registers event listeners to finish a measurement.\n const measureInteraction = (): void => {\n const handleDownAndMove = pointerDownAndMove(() => {\n this.isUserInteractingWithModel = true;\n this.stateMap.hoverCursor?.dispose();\n });\n\n const dispose = (): void => {\n window.removeEventListener('pointermove', pointerMove);\n window.removeEventListener('pointerup', pointerUp);\n handleDownAndMove.dispose();\n };\n\n const pointerMove = this.createInteractionMoveHandler();\n const pointerUp = async (event: PointerEvent): Promise<void> => {\n if (event.button === 0) {\n if (this.isUserInteractingWithModel) {\n this.isUserInteractingWithModel = false;\n } else {\n const hits = this.getHitProvider();\n if (hits != null) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n await this.interaction?.finish(snapPt, hits);\n\n dispose();\n this.updateMeasurementPropsFromModel();\n this.endEditing();\n }\n }\n }\n };\n\n this.beginEditing('replace', 'end');\n this.newInteractionHandler = { dispose };\n\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n const hits = this.getHitProvider();\n if (hits != null) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n this.interaction = this.controller.newMeasurement(snapPt, hits);\n\n if (this.interaction != null) {\n startMeasurement(measureInteraction);\n }\n }\n }\n };\n\n private handleEditAnchor(\n anchor: Anchor\n ): ((event: PointerEvent) => void) | undefined {\n if (this.mode === 'edit' || this.mode === 'replace') {\n const handlePointerMove = this.createInteractionMoveHandler();\n const handlePointerUp = async (event: PointerEvent): Promise<void> => {\n const hits = this.getHitProvider();\n if (hits != null) {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n await this.interaction?.finish(snapPt, hits);\n\n this.updateMeasurementPropsFromModel();\n this.endEditing();\n }\n };\n\n return (event) => {\n this.getStencilBuffer();\n\n if (event.button === 0) {\n this.beginEditing('edit', anchor);\n\n this.interaction = this.controller.editMeasurement(anchor);\n\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n }\n };\n }\n }\n\n private createInteractionMoveHandler(): (event: PointerEvent) => void {\n return (event) => {\n const hits = this.getHitProvider();\n if (this.elementBounds != null && hits != null) {\n event.preventDefault();\n this.getStencilBuffer();\n\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n this.interaction?.update(snapPt, hits);\n this.updateMeasurementPropsFromModel();\n }\n };\n }\n\n private async getStencilBuffer(): Promise<void> {\n const stencil = await this.viewer?.stencilBuffer.latestAfterInteraction();\n this.stateMap.stencil = stencil;\n }\n\n private snapPoint(pt: Point.Point, event: MouseEvent): Point.Point {\n const hits = this.getHitProvider();\n if (hits != null && !event.shiftKey) {\n const snapDistance = Math.max(0, this.snapDistance);\n return hits.hitTester().snapToNearestPixel(pt, snapDistance);\n }\n return pt;\n }\n\n private formatDistance(distance: number | undefined): string {\n const dist =\n distance != null\n ? this.measurementUnits.convertWorldValueToReal(distance)\n : undefined;\n\n if (this.labelFormatter != null) {\n return this.labelFormatter(dist);\n } else {\n const abbreviated = this.measurementUnits.unit.abbreviatedName;\n return dist == null\n ? '---'\n : `~${dist.toFixed(this.fractionalDigits)} ${abbreviated}`;\n }\n }\n\n private beginEditing(\n type: EditBeginEventDetails['type'],\n anchor: EditBeginEventDetails['anchor']\n ): void {\n if (this.interactionCount === 0) {\n this.interactingAnchor = anchor;\n this.editBegin.emit({ type, anchor });\n }\n this.interactionCount = this.interactionCount + 1;\n }\n\n private endEditing(): void {\n if (this.interactionCount === 1) {\n const measurement = this.model.getMeasurement();\n\n this.interactingAnchor = 'none';\n this.updateMeasurementModel();\n\n if (measurement != null) {\n this.editEnd.emit(measurement);\n }\n }\n this.interactionCount = this.interactionCount - 1;\n }\n\n private updateMeasurementModel(): void {\n this.measurementModel.clearOutcome();\n\n if (!this.invalid && this.start != null && this.end != null) {\n this.measurementModel.setOutcome({\n isApproximate: true,\n results: [makeMinimumDistanceResult(this.start, this.end)],\n });\n }\n }\n\n private getHitProvider(): PointToPointHitProvider | undefined {\n if (this.hitProvider == null) {\n const hitTester = this.getHitTester();\n const viewer = this.viewer;\n if (viewer != null && hitTester != null) {\n return {\n hitTester: () => hitTester,\n raycaster: async () => (await viewer.scene()).raycaster(),\n };\n }\n } else return this.hitProvider;\n }\n\n private getHitTester(): PointToPointHitTester | undefined {\n const { stencil, depthBuffer } = this.stateMap;\n if (depthBuffer != null) {\n return new PointToPointHitTester(\n stencil,\n depthBuffer,\n this.viewport,\n this.internalCamera\n );\n }\n }\n\n private updateMeasurementPropsFromModel(): void {\n const measurement = this.model.getMeasurement();\n this.start = measurement?.start;\n this.end = measurement?.end;\n this.distance = measurement?.distance;\n this.invalid = measurement != null && !measurement.valid;\n }\n\n private updateIndicator(pt: Point.Point): void {\n const hits = this.getHitProvider();\n const clearCursor =\n hits == null || !this.controller.moveIndicator(pt, hits);\n if (clearCursor) {\n this.stateMap.hoverCursor?.dispose();\n } else {\n this.setCursor(measurementCursor);\n }\n }\n\n private warnIfDepthBuffersDisabled(): void {\n if (this.viewer != null && this.viewer.depthBuffers == null) {\n console.warn(\n 'Measurement editing is disabled. <vertex-viewer> must have its `depth-buffers` attribute set.'\n );\n }\n }\n}\n\nfunction parseVector3(\n value: string | Vector3.Vector3 | undefined\n): Vector3.Vector3 | undefined {\n return typeof value === 'string' ? Vector3.fromJson(value) : value;\n}\n"]}
@@ -63,15 +63,41 @@ export function buildQueryExpression(query, context) {
63
63
  },
64
64
  };
65
65
  case 'metadata':
66
- return {
67
- operand: {
68
- metadata: {
69
- valueFilter: query.filter,
70
- keys: query.keys,
71
- exactMatch: query.exactMatch,
66
+ if (query.removeHiddenItems) {
67
+ return {
68
+ and: {
69
+ first: {
70
+ operand: {
71
+ metadata: {
72
+ valueFilter: query.filter,
73
+ keys: query.keys,
74
+ exactMatch: query.exactMatch,
75
+ },
76
+ },
77
+ },
78
+ second: {
79
+ operand: {
80
+ override: {
81
+ visibility: {
82
+ visibilityState: true,
83
+ },
84
+ },
85
+ },
86
+ },
72
87
  },
73
- },
74
- };
88
+ };
89
+ }
90
+ else {
91
+ return {
92
+ operand: {
93
+ metadata: {
94
+ valueFilter: query.filter,
95
+ keys: query.keys,
96
+ exactMatch: query.exactMatch,
97
+ },
98
+ },
99
+ };
100
+ }
75
101
  case 'all-selected':
76
102
  return {
77
103
  operand: {