@itwin/map-layers 3.0.0-extension.0 → 3.1.0-dev.5

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 (72) hide show
  1. package/CHANGELOG.md +82 -1
  2. package/README.md +1 -1
  3. package/lib/cjs/MapLayerPreferences.d.ts +89 -0
  4. package/lib/cjs/MapLayerPreferences.d.ts.map +1 -0
  5. package/lib/cjs/MapLayerPreferences.js +312 -0
  6. package/lib/cjs/MapLayerPreferences.js.map +1 -0
  7. package/lib/cjs/mapLayers.d.ts +18 -13
  8. package/lib/cjs/mapLayers.d.ts.map +1 -1
  9. package/lib/cjs/mapLayers.js +25 -17
  10. package/lib/cjs/mapLayers.js.map +1 -1
  11. package/lib/cjs/public/locales/en/mapLayers.json +5 -2
  12. package/lib/cjs/ui/MapLayersUiItemsProvider.js +1 -1
  13. package/lib/cjs/ui/MapLayersUiItemsProvider.js.map +1 -1
  14. package/lib/cjs/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
  15. package/lib/cjs/ui/widget/AttachLayerPopupButton.js +5 -3
  16. package/lib/cjs/ui/widget/AttachLayerPopupButton.js.map +1 -1
  17. package/lib/cjs/ui/widget/BasemapPanel.d.ts.map +1 -1
  18. package/lib/cjs/ui/widget/BasemapPanel.js +5 -4
  19. package/lib/cjs/ui/widget/BasemapPanel.js.map +1 -1
  20. package/lib/cjs/ui/widget/MapLayerManager.d.ts +2 -2
  21. package/lib/cjs/ui/widget/MapLayerManager.d.ts.map +1 -1
  22. package/lib/cjs/ui/widget/MapLayerManager.js +24 -10
  23. package/lib/cjs/ui/widget/MapLayerManager.js.map +1 -1
  24. package/lib/cjs/ui/widget/MapLayerManager.scss +0 -7
  25. package/lib/cjs/ui/widget/MapManagerSettings.d.ts.map +1 -1
  26. package/lib/cjs/ui/widget/MapManagerSettings.js +51 -22
  27. package/lib/cjs/ui/widget/MapManagerSettings.js.map +1 -1
  28. package/lib/cjs/ui/widget/MapManagerSettings.scss +1 -1
  29. package/lib/cjs/ui/widget/MapUrlDialog.d.ts.map +1 -1
  30. package/lib/cjs/ui/widget/MapUrlDialog.js +231 -161
  31. package/lib/cjs/ui/widget/MapUrlDialog.js.map +1 -1
  32. package/lib/cjs/ui/widget/SubLayersTree.d.ts.map +1 -1
  33. package/lib/cjs/ui/widget/SubLayersTree.js +1 -1
  34. package/lib/cjs/ui/widget/SubLayersTree.js.map +1 -1
  35. package/lib/cjs/ui/widget/TransparencyPopupButton.js +2 -2
  36. package/lib/cjs/ui/widget/TransparencyPopupButton.js.map +1 -1
  37. package/lib/esm/MapLayerPreferences.d.ts +89 -0
  38. package/lib/esm/MapLayerPreferences.d.ts.map +1 -0
  39. package/lib/esm/MapLayerPreferences.js +308 -0
  40. package/lib/esm/MapLayerPreferences.js.map +1 -0
  41. package/lib/esm/mapLayers.d.ts +18 -13
  42. package/lib/esm/mapLayers.d.ts.map +1 -1
  43. package/lib/esm/mapLayers.js +26 -18
  44. package/lib/esm/mapLayers.js.map +1 -1
  45. package/lib/esm/public/locales/en/mapLayers.json +5 -2
  46. package/lib/esm/ui/MapLayersUiItemsProvider.js +1 -1
  47. package/lib/esm/ui/MapLayersUiItemsProvider.js.map +1 -1
  48. package/lib/esm/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
  49. package/lib/esm/ui/widget/AttachLayerPopupButton.js +6 -4
  50. package/lib/esm/ui/widget/AttachLayerPopupButton.js.map +1 -1
  51. package/lib/esm/ui/widget/BasemapPanel.d.ts.map +1 -1
  52. package/lib/esm/ui/widget/BasemapPanel.js +6 -5
  53. package/lib/esm/ui/widget/BasemapPanel.js.map +1 -1
  54. package/lib/esm/ui/widget/MapLayerManager.d.ts +2 -2
  55. package/lib/esm/ui/widget/MapLayerManager.d.ts.map +1 -1
  56. package/lib/esm/ui/widget/MapLayerManager.js +21 -7
  57. package/lib/esm/ui/widget/MapLayerManager.js.map +1 -1
  58. package/lib/esm/ui/widget/MapLayerManager.scss +0 -7
  59. package/lib/esm/ui/widget/MapManagerSettings.d.ts.map +1 -1
  60. package/lib/esm/ui/widget/MapManagerSettings.js +53 -24
  61. package/lib/esm/ui/widget/MapManagerSettings.js.map +1 -1
  62. package/lib/esm/ui/widget/MapManagerSettings.scss +1 -1
  63. package/lib/esm/ui/widget/MapUrlDialog.d.ts.map +1 -1
  64. package/lib/esm/ui/widget/MapUrlDialog.js +233 -163
  65. package/lib/esm/ui/widget/MapUrlDialog.js.map +1 -1
  66. package/lib/esm/ui/widget/SubLayersTree.d.ts.map +1 -1
  67. package/lib/esm/ui/widget/SubLayersTree.js +1 -1
  68. package/lib/esm/ui/widget/SubLayersTree.js.map +1 -1
  69. package/lib/esm/ui/widget/TransparencyPopupButton.js +2 -2
  70. package/lib/esm/ui/widget/TransparencyPopupButton.js.map +1 -1
  71. package/lib/public/locales/en/mapLayers.json +5 -2
  72. package/package.json +34 -39
@@ -1 +1 @@
1
- {"version":3,"file":"AttachLayerPopupButton.js","sourceRoot":"","sources":["../../../../src/ui/widget/AttachLayerPopupButton.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAkB,oBAAoB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7J,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AASrD,gEAAgE;AAChE,SAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,eAAe,EAAyB;;IAC7E,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAsB,CAAC;IACjF,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAsB,CAAC;IACzF,MAAM,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAChJ,MAAM,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACxI,MAAM,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACrJ,MAAM,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACjJ,MAAM,CAAC,yBAAyB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,kDAAkD,CAAC,CAAC,CAAC;IACjK,MAAM,CAAC,uBAAuB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC7J,MAAM,CAAC,yBAAyB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,kDAAkD,CAAC,CAAC,CAAC;IACjK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAsB,CAAC;IAE7F,4EAA4E;IAC5E,wHAAwH;IACxH,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;YAE1B,sDAAsD;YACtD,iGAAiG;YACjG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QACnC,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,uBAAuB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAA0C,EAAE,EAAE;QAC/F,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAC5H,MAAM,OAAO,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,0CAAE,OAAO,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,0CAAE,QAAQ,CAAC;IAElD,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,IAAY,EAAE,EAAE;QAC5D,IAAI,gBAAgB,EAAE;YACpB,IAAI,CAAC,CAAC,KAAK,gBAAgB,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;gBACnE,OAAO,IAAI,CAAC;SACf;QACD,IAAI,aAAa,EAAE;YACjB,IAAI,CAAC,CAAC,KAAK,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;gBAChE,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAC;IAEtC,MAAM,sBAAsB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACpD,6BAA6B;QAC7B,eAAe,EAAE,CAAC;IACpB,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,MAAM,0BAA0B,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACxD,6BAA6B;QAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,kBAAkB,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,UAAU,iBAAiB,CAAC,SAAiB;YAChD,IAAI,SAAS,IAAI,cAAc,EAAE;gBAC/B,+CAA+C;gBAC/C,IAAI,SAAS,MAAK,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,CAAA,IAAI,SAAS,MAAK,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,CAAA,EAAE;oBACvJ,MAAM,gBAAgB,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;oBAC9E,IAAI,gBAAgB,KAAK,SAAS,EAAE;wBAClC,OAAO;qBACR;oBAED,IAAI;wBACF,IAAI,SAAS,CAAC,OAAO,EAAE;4BACrB,UAAU,CAAC,IAAI,CAAC,CAAC;yBAClB;wBAED,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,gBAAgB,CAAC,cAAc,EAAE,CAAC;wBACtE,IAAI,MAAM,KAAK,oBAAoB,CAAC,KAAK,IAAI,MAAM,KAAK,oBAAoB,CAAC,WAAW,EAAE;4BAExF,IAAI,MAAM,KAAK,oBAAoB,CAAC,KAAK,EAAE;gCACzC,MAAM,aAAa,GAAG,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gCAElE,IAAI,aAAa,EAAE;oCACjB,cAAc,CAAC,YAAY,CAAC,sBAAsB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;oCAE7E,cAAc,CAAC,oBAAoB,EAAE,CAAC;oCAEtC,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,qCAAqC,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC;oCAC/J,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;iCAClG;gCAED,IAAI,SAAS,CAAC,OAAO,EAAE;oCACrB,UAAU,CAAC,KAAK,CAAC,CAAC;iCACnB;gCACD,IAAI,eAAe,EAAE;oCACnB,eAAe,EAAE,CAAC;iCACnB;6BAEF;iCAAM,IAAI,MAAM,KAAK,oBAAoB,CAAC,WAAW,IAAI,SAAS,CAAC,OAAO,EAAE;gCAC3E,kBAAkB,CAAC,UAAU,CAC3B,oBAAC,YAAY,IACX,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,yBAAyB,EAAE,gBAAgB,CAAC,MAAM,EAAE,EACpD,UAAU,EAAE,sBAAsB,EAClC,cAAc,EAAE,0BAA0B,EAC1C,eAAe,EAAE,eAAe,GAAI,CACvC,CAAC;6BACH;yBAEF;6BAAM;4BACL,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,6CAA6C,EAAE,EAAE,SAAS,EAAE,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC;4BAC1I,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,qBAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;4BAClG,IAAI,SAAS,CAAC,OAAO,EAAE;gCACrB,UAAU,CAAC,KAAK,CAAC,CAAC;6BACnB;yBACF;qBACF;oBAAC,OAAO,GAAG,EAAE;wBACZ,IAAI,SAAS,CAAC,OAAO,EAAE;4BACrB,UAAU,CAAC,KAAK,CAAC,CAAC;yBACnB;wBACD,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,wCAAwC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC;wBACjJ,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,qBAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;qBACnG;iBACF;aAEF;YACD,OAAO;QACT,CAAC;QAED,IAAI,cAAc,EAAE;YAClB,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,8DAA8D;YAEjG,IAAI,SAAS,CAAC,OAAO,EAAE;gBACrB,iBAAiB,CAAC,SAAS,CAAC,CAAC;aAC9B;SACF;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,sBAAsB,EAAE,eAAe,EAAE,0BAA0B,CAAC,CAAC,CAAC;IAEnM,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAClI,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACzC,IAAI,SAAS,KAAK,kBAAkB,IAAI,CAAC,KAAK,kBAAkB,CAAC,MAAM,EAAE;YACvE,OAAO,OAAO,CAAC;SAChB;aAAM;YACL,OAAO,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,WAAW,EAAE,CAAC,CAAC,CAAC;SAC3G;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAElC,MAAM,qBAAqB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACnD,kBAAkB,CAAC,UAAU,CAAC,oBAAC,YAAY,IAAC,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,eAAe,GAAI,CAAC,CAAC;QAC5K,OAAO;IACT,CAAC,EAAE,CAAC,cAAc,EAAE,sBAAsB,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;IAEzE,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,OAAe,EAAE,EAAE;QACzD,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,0BAA0B,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAA4C,EAAE,EAAE;;QACpG,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,IAAI,GAAG,KAAK,OAAO,EAAE;YACnB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAA,MAAA,KAAK,CAAC,aAAa,0CAAE,OAAO,0CAAE,KAAK,CAAC;YACpD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;gBAC7B,YAAY,CAAC,OAAO,CAAC,CAAC;aACvB;SACF;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,oBAAoB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,OAAe,EAAE,EAAE;QACjE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,oBAAoB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,UAAkB,EAAE,EAAE;QACpE,kBAAkB,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,qBAAqB,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,MAAsB,EAAE,EAAE;QAE/E,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,EAAE;YAC3B,IAAI,MAAM,uBAAuB,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;gBACjF,MAAM,GAAG,GAAG,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,8CAA8C,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBACpI,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;aAClG;iBAAM;gBACL,MAAM,GAAG,GAAG,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,4CAA4C,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBAClI,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,qBAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;aACnG;SACF;QAED,kBAAkB,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAExB;;OAEG;IACH,MAAM,yBAAyB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACpE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAE,4DAA4D;QAEtF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;QAE9B,MAAM,GAAG,GAAG,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,oDAAoD,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1I,kBAAkB,CAAC,UAAU,CAC3B,oBAAC,oBAAoB,IACnB,SAAS,EAAC,iCAAiC,EAC3C,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAC9C,QAAQ,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAC/C,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,EACtD,UAAU,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,GACjD,CACH,CAAC;IACJ,CAAC,EAAE,CAAC,oBAAoB,EAAE,qBAAqB,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAE7E;;KAEC;IACD,MAAM,uBAAuB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE;;QAC1D,KAAK,CAAC,eAAe,EAAE,CAAC,CAAE,4DAA4D;QAEtF,MAAM,eAAe,GAAG,MAAA,MAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,UAAU,0CAAE,OAAO,0CAAE,KAAK,CAAC;QACzE,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;QAE3F,qDAAqD;QACrD,IAAI,cAAc,KAAK,SAAS,EAAE;YAChC,OAAO;SACR;QACD,kBAAkB,CAAC,UAAU,CAAC,oBAAC,YAAY,IACzC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,oBAAoB,EAAE,cAAc,EACpC,UAAU,EAAE,sBAAsB,EAClC,eAAe,EAAE,eAAe,GAAI,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,cAAc,EAAE,sBAAsB,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAElF,OAAO,CACL,6BAAK,SAAS,EAAC,oBAAoB;QAChC,CAAC,OAAO,IAAI,cAAc,CAAC,IAAI,oBAAC,MAAM,CAAC,cAAc,IAAC,OAAO,EAAE,iBAAiB,GAAI;QACrF,6BAAK,SAAS,EAAC,mCAAmC;YAChD,oBAAC,KAAK,IAAC,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,gCAAgC,EAC3D,WAAW,EAAE,gBAAgB,EAC7B,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,uBAAuB,GAAI;YACvC,oBAAC,MAAM,IAAC,SAAS,EAAC,+BAA+B,EAAC,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,qBAAqB,IAC3G,mBAAmB,CAAU,CAC5B;QACN,6BAAK,SAAS,EAAC,qBAAqB;YAClC,oBAAC,MAAM,CAAC,OAAO,IACb,EAAE,EAAC,aAAa,EAChB,aAAa,EAAE,cAAc,EAC7B,SAAS,EAAC,yBAAyB,EACnC,UAAU,EAAE,0BAA0B,EACtC,oBAAoB,EAAE,oBAAoB,IAExC,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC9B,oBAAC,MAAM,CAAC,WAAW,IACjB,GAAG,EAAE,MAAM,CAAC,IAAI,EAChB,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE,MAAM,CAAC,IAAI,EAClB,YAAY,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,EACxD,YAAY,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,SAAS,CAAC;gBACtD,8BAAM,SAAS,EAAC,4BAA4B,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAG,MAAM,CAAC,IAAI,CAAQ;gBAGnF,kCAAkC;gBAClC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,IAAI,oBAAoB,IAAI,oBAAoB,KAAK,MAAM,CAAC,IAAI,CAAC;oBACzF;wBACE,oBAAC,MAAM,IACL,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,uBAAuB;4BAChC,oBAAC,MAAM,CAAC,IAAI,IAAC,QAAQ,EAAC,WAAW,GAAG,CAC7B;wBACT,oBAAC,MAAM,IACL,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,CAAC,KAAuB,EAAE,EAAE,GAAG,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;4BACnF,oBAAC,MAAM,CAAC,IAAI,IAAC,QAAQ,EAAC,aAAa,GAAG,CAC/B,CACR,CAEc,CACtB,CAEY,CACb,CACF,CAEP,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAN,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,uEAAO,CAAA;IACP,iEAAI,CAAA;IACJ,iEAAI,CAAA;AACN,CAAC,EAJW,qBAAqB,KAArB,qBAAqB,QAIhC;AAMD,gBAAgB;AAChB,gEAAgE;AAChE,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACvE,MAAM,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAC7I,MAAM,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAC5I,MAAM,CAAC,yBAAyB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,kDAAkD,CAAC,CAAC,CAAC;IACjK,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAoB,IAAI,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEpD,4EAA4E;IAC5E,wHAAwH;IACxH,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACzC,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC9C,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,OAAoB,EAAE,EAAE;QACpE,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE;YAC9B,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAChE,OAAO,IAAI,CAAC;YACd,IAAI,OAAO,CAAC,aAAa,IAAI,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC;gBACpE,OAAO,IAAI,CAAC;SACf;aAAM;YACL,uBAAuB;YACvB,IAAI,OAAO,CAAC,aAAa,IAAI,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC;gBACpE,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAiB,EAAE,EAAE;QACjE,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAqB,CAAC,EAAE;YACnD,OAAO;SACR;QAED,kFAAkF;QAClF,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,OAAO,MAAI,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,CAAA,EAAE;YAC3E,OAAO;SACR;QAED,wDAAwD;QACxD,IAAI,QAAQ,CAAC,OAAO,KAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,CAAA,EAAE;YACxE,OAAO;SACR;QAED,wEAAwE;QACxE,YAAY,CAAC,KAAK,CAAC,CAAC;IAEtB,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAEzB,MAAM,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAEnD,MAAM,mBAAmB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACjD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;YACtB,OAAO;SACR;QACD,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,gBAAgB,EAAE,CAAC;IACrB,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,SAAS,YAAY;QACnB,IAAI,MAAuB,CAAC;QAE5B,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,qBAAqB,CAAC,IAAI,EAAE;YACrF,MAAM,GAAG,CACP,gCAAQ,GAAG,EAAE,SAAS,EAAE,SAAS,EAAC,iCAAiC,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,EAChI,OAAO,EAAE,WAAW;gBACpB,oBAAC,MAAM,CAAC,WAAW,IAAC,QAAQ,EAAC,UAAU,GAAG,CACnC,CACV,CAAC;SACH;aAAM;YACL,MAAM,kBAAkB,GAAG,GAAG,EAAE;gBAC9B,QAAQ,KAAK,CAAC,UAAU,EAAE;oBACxB,KAAK,qBAAqB,CAAC,IAAI;wBAC7B,OAAO,iBAAiB,CAAC;oBAC3B,KAAK,qBAAqB,CAAC,OAAO,CAAC;oBACnC;wBACE,OAAO,KAAK,CAAC;iBAChB;YACH,CAAC,CAAC;YACF,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACvC,MAAM,GAAG,CACP,oBAAC,MAAM,IAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,EAC1G,OAAO,EAAE,WAAW,IAAG,yBAAyB,CAAU,CAC7D,CAAC;SACH;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CACL;QACG,YAAY,EAAE;QACf,oBAAC,MAAM,CAAC,KAAK,IACX,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,gBAAgB,CAAC,WAAW,EACtC,OAAO,EAAE,gBAAgB,EACzB,cAAc,EAAE,kBAAkB,EAClC,MAAM,EAAE,SAAS,CAAC,OAAO,EACzB,YAAY,EAAE,KAAK;YAEnB,6BAAK,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAC,yBAAyB;gBACrD,oBAAC,gBAAgB,IAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,eAAe,EAAE,mBAAmB,GAAI,CAClF,CACQ,CACf,CACJ,CAAC;AACJ,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport * as React from \"react\";\r\nimport { IModelApp, MapLayerSettingsService, MapLayerSource, MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority } from \"@itwin/core-frontend\";\r\nimport { RelativePosition } from \"@itwin/appui-abstract\";\r\nimport * as UiCore from \"@itwin/core-react\";\r\nimport { ModalDialogManager } from \"@itwin/appui-react\";\r\nimport { useSourceMapContext } from \"./MapLayerManager\";\r\nimport { MapUrlDialog } from \"./MapUrlDialog\";\r\nimport { MapLayersUiItemsProvider } from \"../MapLayersUiItemsProvider\";\r\nimport { ConfirmMessageDialog } from \"./ConfirmMessageDialog\";\r\nimport { Button, Input } from \"@itwin/itwinui-react\";\r\n\r\n// cSpell:ignore droppable Sublayer\r\n\r\ninterface AttachLayerPanelProps {\r\n isOverlay: boolean;\r\n onLayerAttached: () => void;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nfunction AttachLayerPanel({ isOverlay, onLayerAttached }: AttachLayerPanelProps) {\r\n const [layerNameToAdd, setLayerNameToAdd] = React.useState<string | undefined>();\r\n const [sourceFilterString, setSourceFilterString] = React.useState<string | undefined>();\r\n const [placeholderLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.SearchPlaceholder\"));\r\n const [addCustomLayerLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.Custom\"));\r\n const [addCustomLayerToolTip] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.AttachCustomLayer\"));\r\n const [loadingMapSources] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.LoadingMapSources\"));\r\n const [removeLayerDefButtonTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefButtonTitle\"));\r\n const [editLayerDefButtonTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.EditLayerDefButtonTitle\"));\r\n const [removeLayerDefDialogTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefDialogTitle\"));\r\n const [loading, setLoading] = React.useState(false);\r\n const [layerNameUnderCursor, setLayerNameUnderCursor] = React.useState<string | undefined>();\r\n\r\n // 'isMounted' is used to prevent any async operation once the hook has been\r\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\r\n const isMounted = React.useRef(false);\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n return () => {\r\n isMounted.current = false;\r\n\r\n // We close any open dialogs that we might have opened\r\n // This was added because the modal dialog remained remained displayed after the session expired.\r\n ModalDialogManager.closeDialog();\r\n };\r\n }, []);\r\n\r\n const handleFilterTextChanged = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setSourceFilterString(event.target.value);\r\n }, []);\r\n\r\n const { loadingSources, sources, activeViewport, backgroundLayers, overlayLayers, mapTypesOptions } = useSourceMapContext();\r\n const iTwinId = activeViewport?.iModel?.iTwinId;\r\n const iModelId = activeViewport?.iModel?.iModelId;\r\n\r\n const styleContainsLayer = React.useCallback((name: string) => {\r\n if (backgroundLayers) {\r\n if (-1 !== backgroundLayers.findIndex((layer) => layer.name === name))\r\n return true;\r\n }\r\n if (overlayLayers) {\r\n if (-1 !== overlayLayers.findIndex((layer) => layer.name === name))\r\n return true;\r\n }\r\n return false;\r\n }, [backgroundLayers, overlayLayers]);\r\n\r\n const handleModalUrlDialogOk = React.useCallback(() => {\r\n // close popup and refresh UI\r\n onLayerAttached();\r\n }, [onLayerAttached]);\r\n\r\n const handleModalUrlDialogCancel = React.useCallback(() => {\r\n // close popup and refresh UI\r\n setLoading(false);\r\n ModalDialogManager.closeDialog();\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n async function attemptToAddLayer(layerName: string) {\r\n if (layerName && activeViewport) {\r\n // if the layer is not in the style add it now.\r\n if (undefined === backgroundLayers?.find((layer) => layerName === layer.name) && undefined === overlayLayers?.find((layer) => layerName === layer.name)) {\r\n const mapLayerSettings = sources?.find((source) => source.name === layerName);\r\n if (mapLayerSettings === undefined) {\r\n return;\r\n }\r\n\r\n try {\r\n if (isMounted.current) {\r\n setLoading(true);\r\n }\r\n\r\n const { status, subLayers } = await mapLayerSettings.validateSource();\r\n if (status === MapLayerSourceStatus.Valid || status === MapLayerSourceStatus.RequireAuth) {\r\n\r\n if (status === MapLayerSourceStatus.Valid) {\r\n const layerSettings = mapLayerSettings.toLayerSettings(subLayers);\r\n\r\n if (layerSettings) {\r\n activeViewport.displayStyle.attachMapLayerSettings(layerSettings, isOverlay);\r\n\r\n activeViewport.invalidateRenderPlan();\r\n\r\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttached\", { sourceName: layerSettings.name, sourceUrl: layerSettings.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\r\n }\r\n\r\n if (isMounted.current) {\r\n setLoading(false);\r\n }\r\n if (onLayerAttached) {\r\n onLayerAttached();\r\n }\r\n\r\n } else if (status === MapLayerSourceStatus.RequireAuth && isMounted.current) {\r\n ModalDialogManager.openDialog(\r\n <MapUrlDialog\r\n activeViewport={activeViewport}\r\n isOverlay={isOverlay}\r\n layerRequiringCredentials={mapLayerSettings.toJSON()}\r\n onOkResult={handleModalUrlDialogOk}\r\n onCancelResult={handleModalUrlDialogCancel}\r\n mapTypesOptions={mapTypesOptions} />\r\n );\r\n }\r\n\r\n } else {\r\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerValidationFailed\", { sourceUrl: mapLayerSettings.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n if (isMounted.current) {\r\n setLoading(false);\r\n }\r\n }\r\n } catch (err) {\r\n if (isMounted.current) {\r\n setLoading(false);\r\n }\r\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error: err, sourceUrl: mapLayerSettings.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n }\r\n }\r\n\r\n }\r\n return;\r\n }\r\n\r\n if (layerNameToAdd) {\r\n attemptToAddLayer(layerNameToAdd); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n\r\n if (isMounted.current) {\r\n setLayerNameToAdd(undefined);\r\n }\r\n }\r\n }, [setLayerNameToAdd, layerNameToAdd, activeViewport, sources, backgroundLayers, isOverlay, overlayLayers, onLayerAttached, handleModalUrlDialogOk, mapTypesOptions, handleModalUrlDialogCancel]);\r\n\r\n const options = React.useMemo(() => sources?.filter((source) => !styleContainsLayer(source.name)), [sources, styleContainsLayer]);\r\n const filteredOptions = React.useMemo(() => {\r\n if (undefined === sourceFilterString || 0 === sourceFilterString.length) {\r\n return options;\r\n } else {\r\n return options?.filter((option) => option.name.toLowerCase().includes(sourceFilterString?.toLowerCase()));\r\n }\r\n }, [options, sourceFilterString]);\r\n\r\n const handleAddNewMapSource = React.useCallback(() => {\r\n ModalDialogManager.openDialog(<MapUrlDialog activeViewport={activeViewport} isOverlay={isOverlay} onOkResult={handleModalUrlDialogOk} mapTypesOptions={mapTypesOptions} />);\r\n return;\r\n }, [activeViewport, handleModalUrlDialogOk, isOverlay, mapTypesOptions]);\r\n\r\n const handleAttach = React.useCallback((mapName: string) => {\r\n setLayerNameToAdd(mapName);\r\n }, []);\r\n\r\n const handleKeypressOnSourceList = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\r\n const key = event.key;\r\n if (key === \"Enter\") {\r\n event.preventDefault();\r\n const mapName = event.currentTarget?.dataset?.value;\r\n if (mapName && mapName.length) {\r\n handleAttach(mapName);\r\n }\r\n }\r\n }, [handleAttach]);\r\n\r\n const onListboxValueChange = React.useCallback((mapName: string) => {\r\n setLayerNameToAdd(mapName);\r\n }, []);\r\n\r\n const handleNoConfirmation = React.useCallback((_layerName: string) => {\r\n ModalDialogManager.closeDialog();\r\n }, []);\r\n\r\n const handleYesConfirmation = React.useCallback(async (source: MapLayerSource) => {\r\n\r\n const layerName = source.name;\r\n if (!!iTwinId && !!iModelId) {\r\n if (await MapLayerSettingsService.deleteSharedSettings(source, iTwinId, iModelId)) {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefSuccess\", { layerName });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\r\n } else {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefError\", { layerName });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n }\r\n }\r\n\r\n ModalDialogManager.closeDialog();\r\n }, [iTwinId, iModelId]);\r\n\r\n /*\r\n Handle Remove layer button clicked\r\n */\r\n const onItemRemoveButtonClicked = React.useCallback((source, event) => {\r\n event.stopPropagation(); // We don't want the owning ListBox to react on mouse click.\r\n\r\n const layerName = source.name;\r\n\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefDialogMessage\", { layerName });\r\n ModalDialogManager.openDialog(\r\n <ConfirmMessageDialog\r\n className=\"map-sources-delete-confirmation\"\r\n title={removeLayerDefDialogTitle}\r\n message={msg}\r\n maxWidth={400}\r\n onClose={() => handleNoConfirmation(layerName)}\r\n onEscape={() => handleNoConfirmation(layerName)}\r\n onYesResult={async () => handleYesConfirmation(source)}\r\n onNoResult={() => handleNoConfirmation(layerName)}\r\n />\r\n );\r\n }, [handleNoConfirmation, handleYesConfirmation, removeLayerDefDialogTitle]);\r\n\r\n /*\r\n Handle Edit layer button clicked\r\n */\r\n const onItemEditButtonClicked = React.useCallback((event) => {\r\n event.stopPropagation(); // We don't want the owning ListBox to react on mouse click.\r\n\r\n const targetLayerName = event?.currentTarget?.parentNode?.dataset?.value;\r\n const matchingSource = sources.find((layerSource) => layerSource.name === targetLayerName);\r\n\r\n // we expect a single layer source matching this name\r\n if (matchingSource === undefined) {\r\n return;\r\n }\r\n ModalDialogManager.openDialog(<MapUrlDialog\r\n activeViewport={activeViewport}\r\n isOverlay={isOverlay}\r\n mapLayerSourceToEdit={matchingSource}\r\n onOkResult={handleModalUrlDialogOk}\r\n mapTypesOptions={mapTypesOptions} />);\r\n }, [activeViewport, handleModalUrlDialogOk, isOverlay, mapTypesOptions, sources]);\r\n\r\n return (\r\n <div className=\"map-manager-header\">\r\n {(loading || loadingSources) && <UiCore.LoadingSpinner message={loadingMapSources} />}\r\n <div className=\"map-manager-source-listbox-header\">\r\n <Input type=\"text\" className=\"map-manager-source-list-filter\"\r\n placeholder={placeholderLabel}\r\n value={sourceFilterString}\r\n onChange={handleFilterTextChanged} />\r\n <Button className=\"map-manager-add-source-button\" title={addCustomLayerToolTip} onClick={handleAddNewMapSource}>\r\n {addCustomLayerLabel}</Button>\r\n </div>\r\n <div className=\"map-manager-sources\">\r\n <UiCore.Listbox\r\n id=\"map-sources\"\r\n selectedValue={layerNameToAdd}\r\n className=\"map-manager-source-list\"\r\n onKeyPress={handleKeypressOnSourceList}\r\n onListboxValueChange={onListboxValueChange} >\r\n {\r\n filteredOptions?.map((source) =>\r\n <UiCore.ListboxItem\r\n key={source.name}\r\n className=\"map-source-list-entry\"\r\n value={source.name}\r\n onMouseEnter={() => setLayerNameUnderCursor(source.name)}\r\n onMouseLeave={() => setLayerNameUnderCursor(undefined)}>\r\n <span className=\"map-source-list-entry-name\" title={source.name}>{source.name}</span>\r\n\r\n { // Display the delete icon only when the mouse over a specific item\r\n // otherwise list feels cluttered.\r\n (!!iTwinId && !!iModelId && layerNameUnderCursor && layerNameUnderCursor === source.name) &&\r\n <>\r\n <Button\r\n className=\"map-source-list-entry-button\"\r\n title={editLayerDefButtonTitle}\r\n onClick={onItemEditButtonClicked}>\r\n <UiCore.Icon iconSpec=\"icon-edit\" />\r\n </Button>\r\n <Button\r\n className=\"map-source-list-entry-button\"\r\n title={removeLayerDefButtonTitle}\r\n onClick={(event: React.MouseEvent) => { onItemRemoveButtonClicked(source, event); }}>\r\n <UiCore.Icon iconSpec=\"icon-delete\" />\r\n </Button>\r\n </>}\r\n\r\n </UiCore.ListboxItem>\r\n )\r\n }\r\n </UiCore.Listbox>\r\n </div>\r\n </div>\r\n\r\n );\r\n}\r\n\r\n/** @internal */\r\nexport enum AttachLayerButtonType {\r\n Primary,\r\n Blue,\r\n Icon\r\n}\r\nexport interface AttachLayerPopupButtonProps {\r\n isOverlay: boolean;\r\n buttonType?: AttachLayerButtonType;\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function AttachLayerPopupButton(props: AttachLayerPopupButtonProps) {\r\n const [showAttachLayerLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AttachLayerPopup.Attach\"));\r\n const [hideAttachLayerLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AttachLayerPopup.Close\"));\r\n const [addCustomLayerButtonLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.AddCustomLayerButtonLabel\"));\r\n const [popupOpen, setPopupOpen] = React.useState(false);\r\n const buttonRef = React.useRef<HTMLButtonElement>(null);\r\n const panelRef = React.useRef<HTMLDivElement>(null);\r\n\r\n // 'isMounted' is used to prevent any async operation once the hook has been\r\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\r\n const isMounted = React.useRef(false);\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n const togglePopup = React.useCallback(() => {\r\n setPopupOpen(!popupOpen);\r\n }, [popupOpen]);\r\n\r\n const handleClosePopup = React.useCallback(() => {\r\n setPopupOpen(false);\r\n }, []);\r\n\r\n const isInsideCoreDialog = React.useCallback((element: HTMLElement) => {\r\n if (element.nodeName === \"DIV\") {\r\n if (element.classList && element.classList.contains(\"core-dialog\"))\r\n return true;\r\n if (element.parentElement && isInsideCoreDialog(element.parentElement))\r\n return true;\r\n } else {\r\n // istanbul ignore else\r\n if (element.parentElement && isInsideCoreDialog(element.parentElement))\r\n return true;\r\n }\r\n return false;\r\n }, []);\r\n\r\n const handleOutsideClick = React.useCallback((event: MouseEvent) => {\r\n if (isInsideCoreDialog(event.target as HTMLElement)) {\r\n return;\r\n }\r\n\r\n // If clicking on button that open panel - don't trigger outside click processing\r\n if (buttonRef?.current && buttonRef?.current.contains(event.target as Node)) {\r\n return;\r\n }\r\n\r\n // If clicking the panel, this is not an outside clicked\r\n if (panelRef.current && panelRef?.current.contains(event.target as Node)) {\r\n return;\r\n }\r\n\r\n // If we reach this point, we got an outside clicked, no close the popup\r\n setPopupOpen(false);\r\n\r\n }, [isInsideCoreDialog]);\r\n\r\n const { refreshFromStyle } = useSourceMapContext();\r\n\r\n const handleLayerAttached = React.useCallback(() => {\r\n if (!isMounted.current) {\r\n return;\r\n }\r\n setPopupOpen(false);\r\n refreshFromStyle();\r\n }, [refreshFromStyle]);\r\n\r\n function renderButton(): React.ReactNode {\r\n let button: React.ReactNode;\r\n\r\n if (props.buttonType === undefined || props.buttonType === AttachLayerButtonType.Icon) {\r\n button = (\r\n <button ref={buttonRef} className=\"map-manager-attach-layer-button\" title={popupOpen ? hideAttachLayerLabel : showAttachLayerLabel}\r\n onClick={togglePopup}>\r\n <UiCore.WebFontIcon iconName=\"icon-add\" />\r\n </button>\r\n );\r\n } else {\r\n const determineStyleType = () => {\r\n switch (props.buttonType) {\r\n case AttachLayerButtonType.Blue:\r\n return \"high-visibility\";\r\n case AttachLayerButtonType.Primary:\r\n default:\r\n return \"cta\";\r\n }\r\n };\r\n const styleType = determineStyleType();\r\n button = (\r\n <Button ref={buttonRef} styleType={styleType} title={popupOpen ? hideAttachLayerLabel : showAttachLayerLabel}\r\n onClick={togglePopup}>{addCustomLayerButtonLabel}</Button>\r\n );\r\n }\r\n\r\n return button;\r\n }\r\n\r\n return (\r\n <>\r\n {renderButton()}\r\n <UiCore.Popup\r\n isOpen={popupOpen}\r\n position={RelativePosition.BottomRight}\r\n onClose={handleClosePopup}\r\n onOutsideClick={handleOutsideClick}\r\n target={buttonRef.current}\r\n closeOnEnter={false}\r\n >\r\n <div ref={panelRef} className=\"map-sources-popup-panel\" >\r\n <AttachLayerPanel isOverlay={props.isOverlay} onLayerAttached={handleLayerAttached} />\r\n </div>\r\n </UiCore.Popup >\r\n </>\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"AttachLayerPopupButton.js","sourceRoot":"","sources":["../../../../src/ui/widget/AttachLayerPopupButton.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport * as React from \"react\";\r\nimport { IModelApp, MapLayerSource, MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority } from \"@itwin/core-frontend\";\r\nimport { RelativePosition } from \"@itwin/appui-abstract\";\r\nimport * as UiCore from \"@itwin/core-react\";\r\nimport { ModalDialogManager } from \"@itwin/appui-react\";\r\nimport { useSourceMapContext } from \"./MapLayerManager\";\r\nimport { MapUrlDialog } from \"./MapUrlDialog\";\r\nimport { MapLayersUiItemsProvider } from \"../MapLayersUiItemsProvider\";\r\nimport { ConfirmMessageDialog } from \"./ConfirmMessageDialog\";\r\nimport { Button, Input } from \"@itwin/itwinui-react\";\r\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\r\n\r\n// cSpell:ignore droppable Sublayer\r\n\r\ninterface AttachLayerPanelProps {\r\n isOverlay: boolean;\r\n onLayerAttached: () => void;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nfunction AttachLayerPanel({ isOverlay, onLayerAttached }: AttachLayerPanelProps) {\r\n const [layerNameToAdd, setLayerNameToAdd] = React.useState<string | undefined>();\r\n const [sourceFilterString, setSourceFilterString] = React.useState<string | undefined>();\r\n const [placeholderLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.SearchPlaceholder\"));\r\n const [addCustomLayerLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.Custom\"));\r\n const [addCustomLayerToolTip] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.AttachCustomLayer\"));\r\n const [loadingMapSources] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.LoadingMapSources\"));\r\n const [removeLayerDefButtonTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefButtonTitle\"));\r\n const [editLayerDefButtonTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.EditLayerDefButtonTitle\"));\r\n const [removeLayerDefDialogTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefDialogTitle\"));\r\n const [loading, setLoading] = React.useState(false);\r\n const [layerNameUnderCursor, setLayerNameUnderCursor] = React.useState<string | undefined>();\r\n\r\n // 'isMounted' is used to prevent any async operation once the hook has been\r\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\r\n const isMounted = React.useRef(false);\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n return () => {\r\n isMounted.current = false;\r\n\r\n // We close any open dialogs that we might have opened\r\n // This was added because the modal dialog remained remained displayed after the session expired.\r\n ModalDialogManager.closeDialog();\r\n };\r\n }, []);\r\n\r\n const handleFilterTextChanged = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setSourceFilterString(event.target.value);\r\n }, []);\r\n\r\n const { loadingSources, sources, activeViewport, backgroundLayers, overlayLayers, mapTypesOptions } = useSourceMapContext();\r\n const iTwinId = activeViewport?.iModel?.iTwinId;\r\n const iModelId = activeViewport?.iModel?.iModelId;\r\n\r\n const styleContainsLayer = React.useCallback((name: string) => {\r\n if (backgroundLayers) {\r\n if (-1 !== backgroundLayers.findIndex((layer) => layer.name === name))\r\n return true;\r\n }\r\n if (overlayLayers) {\r\n if (-1 !== overlayLayers.findIndex((layer) => layer.name === name))\r\n return true;\r\n }\r\n return false;\r\n }, [backgroundLayers, overlayLayers]);\r\n\r\n const handleModalUrlDialogOk = React.useCallback(() => {\r\n // close popup and refresh UI\r\n onLayerAttached();\r\n }, [onLayerAttached]);\r\n\r\n const handleModalUrlDialogCancel = React.useCallback(() => {\r\n // close popup and refresh UI\r\n setLoading(false);\r\n ModalDialogManager.closeDialog();\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n async function attemptToAddLayer(layerName: string) {\r\n if (layerName && activeViewport) {\r\n // if the layer is not in the style add it now.\r\n if (undefined === backgroundLayers?.find((layer) => layerName === layer.name) && undefined === overlayLayers?.find((layer) => layerName === layer.name)) {\r\n const mapLayerSettings = sources?.find((source) => source.name === layerName);\r\n if (mapLayerSettings === undefined) {\r\n return;\r\n }\r\n\r\n try {\r\n if (isMounted.current) {\r\n setLoading(true);\r\n }\r\n\r\n const { status, subLayers } = await mapLayerSettings.validateSource();\r\n if (status === MapLayerSourceStatus.Valid || status === MapLayerSourceStatus.RequireAuth) {\r\n\r\n if (status === MapLayerSourceStatus.Valid) {\r\n const layerSettings = mapLayerSettings.toLayerSettings(subLayers);\r\n\r\n if (layerSettings) {\r\n activeViewport.displayStyle.attachMapLayerSettings(layerSettings, isOverlay);\r\n\r\n activeViewport.invalidateRenderPlan();\r\n\r\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttached\", { sourceName: layerSettings.name, sourceUrl: layerSettings.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\r\n }\r\n\r\n if (isMounted.current) {\r\n setLoading(false);\r\n }\r\n if (onLayerAttached) {\r\n onLayerAttached();\r\n }\r\n\r\n } else if (status === MapLayerSourceStatus.RequireAuth && isMounted.current) {\r\n ModalDialogManager.openDialog(\r\n <MapUrlDialog\r\n activeViewport={activeViewport}\r\n isOverlay={isOverlay}\r\n layerRequiringCredentials={mapLayerSettings.toJSON()}\r\n onOkResult={handleModalUrlDialogOk}\r\n onCancelResult={handleModalUrlDialogCancel}\r\n mapTypesOptions={mapTypesOptions} />\r\n );\r\n }\r\n\r\n } else {\r\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerValidationFailed\", { sourceUrl: mapLayerSettings.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n if (isMounted.current) {\r\n setLoading(false);\r\n }\r\n }\r\n } catch (err) {\r\n if (isMounted.current) {\r\n setLoading(false);\r\n }\r\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error: err, sourceUrl: mapLayerSettings.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n }\r\n }\r\n\r\n }\r\n return;\r\n }\r\n\r\n if (layerNameToAdd) {\r\n attemptToAddLayer(layerNameToAdd); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n\r\n if (isMounted.current) {\r\n setLayerNameToAdd(undefined);\r\n }\r\n }\r\n }, [setLayerNameToAdd, layerNameToAdd, activeViewport, sources, backgroundLayers, isOverlay, overlayLayers, onLayerAttached, handleModalUrlDialogOk, mapTypesOptions, handleModalUrlDialogCancel]);\r\n\r\n const options = React.useMemo(() => sources?.filter((source) => !styleContainsLayer(source.name)), [sources, styleContainsLayer]);\r\n const filteredOptions = React.useMemo(() => {\r\n if (undefined === sourceFilterString || 0 === sourceFilterString.length) {\r\n return options;\r\n } else {\r\n return options?.filter((option) => option.name.toLowerCase().includes(sourceFilterString?.toLowerCase()));\r\n }\r\n }, [options, sourceFilterString]);\r\n\r\n const handleAddNewMapSource = React.useCallback(() => {\r\n ModalDialogManager.openDialog(<MapUrlDialog activeViewport={activeViewport} isOverlay={isOverlay} onOkResult={handleModalUrlDialogOk} mapTypesOptions={mapTypesOptions} />);\r\n return;\r\n }, [activeViewport, handleModalUrlDialogOk, isOverlay, mapTypesOptions]);\r\n\r\n const handleAttach = React.useCallback((mapName: string) => {\r\n setLayerNameToAdd(mapName);\r\n }, []);\r\n\r\n const handleKeypressOnSourceList = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\r\n const key = event.key;\r\n if (key === \"Enter\") {\r\n event.preventDefault();\r\n const mapName = event.currentTarget?.dataset?.value;\r\n if (mapName && mapName.length) {\r\n handleAttach(mapName);\r\n }\r\n }\r\n }, [handleAttach]);\r\n\r\n const onListboxValueChange = React.useCallback((mapName: string) => {\r\n setLayerNameToAdd(mapName);\r\n }, []);\r\n\r\n const handleNoConfirmation = React.useCallback((_layerName: string) => {\r\n ModalDialogManager.closeDialog();\r\n }, []);\r\n\r\n const handleYesConfirmation = React.useCallback(async (source: MapLayerSource) => {\r\n const layerName = source.name;\r\n if (!!iTwinId && !!iModelId) {\r\n try {\r\n await MapLayerPreferences.deleteByName(source, iTwinId, iModelId);\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefSuccess\", { layerName });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\r\n } catch (err: any) {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefError\", { layerName });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n }\r\n }\r\n\r\n ModalDialogManager.closeDialog();\r\n }, [iTwinId, iModelId]);\r\n\r\n /*\r\n Handle Remove layer button clicked\r\n */\r\n const onItemRemoveButtonClicked = React.useCallback((source, event) => {\r\n event.stopPropagation(); // We don't want the owning ListBox to react on mouse click.\r\n\r\n const layerName = source.name;\r\n\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefDialogMessage\", { layerName });\r\n ModalDialogManager.openDialog(\r\n <ConfirmMessageDialog\r\n className=\"map-sources-delete-confirmation\"\r\n title={removeLayerDefDialogTitle}\r\n message={msg}\r\n maxWidth={400}\r\n onClose={() => handleNoConfirmation(layerName)}\r\n onEscape={() => handleNoConfirmation(layerName)}\r\n onYesResult={async () => handleYesConfirmation(source)}\r\n onNoResult={() => handleNoConfirmation(layerName)}\r\n />\r\n );\r\n }, [handleNoConfirmation, handleYesConfirmation, removeLayerDefDialogTitle]);\r\n\r\n /*\r\n Handle Edit layer button clicked\r\n */\r\n const onItemEditButtonClicked = React.useCallback((event) => {\r\n event.stopPropagation(); // We don't want the owning ListBox to react on mouse click.\r\n\r\n const targetLayerName = event?.currentTarget?.parentNode?.dataset?.value;\r\n const matchingSource = sources.find((layerSource) => layerSource.name === targetLayerName);\r\n\r\n // we expect a single layer source matching this name\r\n if (matchingSource === undefined) {\r\n return;\r\n }\r\n ModalDialogManager.openDialog(<MapUrlDialog\r\n activeViewport={activeViewport}\r\n isOverlay={isOverlay}\r\n mapLayerSourceToEdit={matchingSource}\r\n onOkResult={handleModalUrlDialogOk}\r\n mapTypesOptions={mapTypesOptions} />);\r\n }, [activeViewport, handleModalUrlDialogOk, isOverlay, mapTypesOptions, sources]);\r\n\r\n return (\r\n <div className=\"map-manager-header\">\r\n {(loading || loadingSources) && <UiCore.LoadingSpinner message={loadingMapSources} />}\r\n <div className=\"map-manager-source-listbox-header\">\r\n <Input type=\"text\" className=\"map-manager-source-list-filter\"\r\n placeholder={placeholderLabel}\r\n value={sourceFilterString}\r\n onChange={handleFilterTextChanged}\r\n size=\"small\" />\r\n <Button className=\"map-manager-add-source-button\" title={addCustomLayerToolTip} onClick={handleAddNewMapSource}>\r\n {addCustomLayerLabel}</Button>\r\n </div>\r\n <div className=\"map-manager-sources\">\r\n <UiCore.Listbox\r\n id=\"map-sources\"\r\n selectedValue={layerNameToAdd}\r\n className=\"map-manager-source-list\"\r\n onKeyPress={handleKeypressOnSourceList}\r\n onListboxValueChange={onListboxValueChange} >\r\n {\r\n filteredOptions?.map((source) =>\r\n <UiCore.ListboxItem\r\n key={source.name}\r\n className=\"map-source-list-entry\"\r\n value={source.name}\r\n onMouseEnter={() => setLayerNameUnderCursor(source.name)}\r\n onMouseLeave={() => setLayerNameUnderCursor(undefined)}>\r\n <span className=\"map-source-list-entry-name\" title={source.name}>{source.name}</span>\r\n\r\n { // Display the delete icon only when the mouse over a specific item\r\n // otherwise list feels cluttered.\r\n (!!iTwinId && !!iModelId && layerNameUnderCursor && layerNameUnderCursor === source.name) &&\r\n <>\r\n <Button\r\n className=\"map-source-list-entry-button\"\r\n title={editLayerDefButtonTitle}\r\n onClick={onItemEditButtonClicked}>\r\n <UiCore.Icon iconSpec=\"icon-edit\" />\r\n </Button>\r\n <Button\r\n className=\"map-source-list-entry-button\"\r\n title={removeLayerDefButtonTitle}\r\n onClick={(event: React.MouseEvent) => { onItemRemoveButtonClicked(source, event); }}>\r\n <UiCore.Icon iconSpec=\"icon-delete\" />\r\n </Button>\r\n </>}\r\n\r\n </UiCore.ListboxItem>\r\n )\r\n }\r\n </UiCore.Listbox>\r\n </div>\r\n </div>\r\n\r\n );\r\n}\r\n\r\n/** @internal */\r\nexport enum AttachLayerButtonType {\r\n Primary,\r\n Blue,\r\n Icon\r\n}\r\nexport interface AttachLayerPopupButtonProps {\r\n isOverlay: boolean;\r\n buttonType?: AttachLayerButtonType;\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function AttachLayerPopupButton(props: AttachLayerPopupButtonProps) {\r\n const [showAttachLayerLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AttachLayerPopup.Attach\"));\r\n const [hideAttachLayerLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AttachLayerPopup.Close\"));\r\n const [addCustomLayerButtonLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.AddCustomLayerButtonLabel\"));\r\n const [popupOpen, setPopupOpen] = React.useState(false);\r\n const buttonRef = React.useRef<HTMLButtonElement>(null);\r\n const panelRef = React.useRef<HTMLDivElement>(null);\r\n\r\n // 'isMounted' is used to prevent any async operation once the hook has been\r\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\r\n const isMounted = React.useRef(false);\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n const togglePopup = React.useCallback(() => {\r\n setPopupOpen(!popupOpen);\r\n }, [popupOpen]);\r\n\r\n const handleClosePopup = React.useCallback(() => {\r\n setPopupOpen(false);\r\n }, []);\r\n\r\n const isInsideCoreDialog = React.useCallback((element: HTMLElement) => {\r\n if (element.nodeName === \"DIV\") {\r\n if (element.classList && element.classList.contains(\"core-dialog\"))\r\n return true;\r\n if (element.parentElement && isInsideCoreDialog(element.parentElement))\r\n return true;\r\n } else {\r\n // istanbul ignore else\r\n if (element.parentElement && isInsideCoreDialog(element.parentElement))\r\n return true;\r\n }\r\n return false;\r\n }, []);\r\n\r\n const handleOutsideClick = React.useCallback((event: MouseEvent) => {\r\n if (isInsideCoreDialog(event.target as HTMLElement)) {\r\n return;\r\n }\r\n\r\n // If clicking on button that open panel - don't trigger outside click processing\r\n if (buttonRef?.current && buttonRef?.current.contains(event.target as Node)) {\r\n return;\r\n }\r\n\r\n // If clicking the panel, this is not an outside clicked\r\n if (panelRef.current && panelRef?.current.contains(event.target as Node)) {\r\n return;\r\n }\r\n\r\n // If we reach this point, we got an outside clicked, no close the popup\r\n setPopupOpen(false);\r\n\r\n }, [isInsideCoreDialog]);\r\n\r\n const { refreshFromStyle } = useSourceMapContext();\r\n\r\n const handleLayerAttached = React.useCallback(() => {\r\n if (!isMounted.current) {\r\n return;\r\n }\r\n setPopupOpen(false);\r\n refreshFromStyle();\r\n }, [refreshFromStyle]);\r\n\r\n function renderButton(): React.ReactNode {\r\n let button: React.ReactNode;\r\n\r\n if (props.buttonType === undefined || props.buttonType === AttachLayerButtonType.Icon) {\r\n button = (\r\n <button ref={buttonRef} className=\"map-manager-attach-layer-button\" title={popupOpen ? hideAttachLayerLabel : showAttachLayerLabel}\r\n onClick={togglePopup}>\r\n <UiCore.WebFontIcon iconName=\"icon-add\" />\r\n </button>\r\n );\r\n } else {\r\n const determineStyleType = () => {\r\n switch (props.buttonType) {\r\n case AttachLayerButtonType.Blue:\r\n return \"high-visibility\";\r\n case AttachLayerButtonType.Primary:\r\n default:\r\n return \"cta\";\r\n }\r\n };\r\n const styleType = determineStyleType();\r\n button = (\r\n <Button ref={buttonRef} styleType={styleType} title={popupOpen ? hideAttachLayerLabel : showAttachLayerLabel}\r\n onClick={togglePopup}>{addCustomLayerButtonLabel}</Button>\r\n );\r\n }\r\n\r\n return button;\r\n }\r\n\r\n return (\r\n <>\r\n {renderButton()}\r\n <UiCore.Popup\r\n isOpen={popupOpen}\r\n position={RelativePosition.BottomRight}\r\n onClose={handleClosePopup}\r\n onOutsideClick={handleOutsideClick}\r\n target={buttonRef.current}\r\n closeOnEnter={false}\r\n >\r\n <div ref={panelRef} className=\"map-sources-popup-panel\" >\r\n <AttachLayerPanel isOverlay={props.isOverlay} onLayerAttached={handleLayerAttached} />\r\n </div>\r\n </UiCore.Popup >\r\n </>\r\n );\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BasemapPanel.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/BasemapPanel.tsx"],"names":[],"mappings":";AAgBA,OAAO,qBAAqB,CAAC;AAiB7B,gBAAgB;AAEhB,wBAAgB,YAAY,gBAwI3B"}
1
+ {"version":3,"file":"BasemapPanel.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/BasemapPanel.tsx"],"names":[],"mappings":";AAgBA,OAAO,qBAAqB,CAAC;AAa7B,gBAAgB;AAEhB,wBAAgB,YAAY,gBAwI3B"}
@@ -7,7 +7,8 @@
7
7
  import * as React from "react";
8
8
  import { BaseMapLayerSettings, ColorByName, ColorDef, MapLayerSettings } from "@itwin/core-common";
9
9
  import { ColorPickerDialog, ColorSwatch } from "@itwin/imodel-components-react";
10
- import { ThemedSelect, WebFontIcon } from "@itwin/core-react";
10
+ import { WebFontIcon } from "@itwin/core-react";
11
+ import { Select } from "@itwin/itwinui-react";
11
12
  import { ModalDialogManager } from "@itwin/appui-react";
12
13
  import { TransparencyPopupButton } from "./TransparencyPopupButton";
13
14
  import { useSourceMapContext } from "./MapLayerManager";
@@ -85,9 +86,9 @@ export function BasemapPanel() {
85
86
  e.preventDefault();
86
87
  ModalDialogManager.openDialog(React.createElement(ColorPickerDialog, { dialogTitle: colorDialogTitle, color: newColor, colorPresets: presetColors, onOkResult: handleBackgroundColorDialogOk, onCancelResult: handleBackgroundColorDialogCancel }));
87
88
  }, [presetColors, handleBackgroundColorDialogOk]); // eslint-disable-line react-hooks/exhaustive-deps
88
- const handleBaseMapSelection = React.useCallback((value, action) => {
89
- if (bases && activeViewport && action.action === "select-option" && value) {
90
- const baseMap = bases.find((map) => map.name === value.label);
89
+ const handleBaseMapSelection = React.useCallback((value) => {
90
+ if (bases && activeViewport && value) {
91
+ const baseMap = bases.find((map) => map.name === value);
91
92
  if (baseMap) {
92
93
  const baseProps = baseMap.toJSON();
93
94
  if (activeViewport.displayStyle.backgroundMapBase instanceof BaseMapLayerSettings) {
@@ -133,7 +134,7 @@ export function BasemapPanel() {
133
134
  React.createElement("button", { className: "map-manager-item-visibility", title: toggleVisibility, onClick: handleVisibilityChange },
134
135
  React.createElement(WebFontIcon, { iconName: baseMapVisible ? "icon-visibility" : "icon-visibility-hide-2" })),
135
136
  React.createElement("span", { className: "map-manager-base-label" }, baseLayerLabel),
136
- React.createElement(ThemedSelect, { options: baseMapOptions, closeMenuOnSelect: true, placeholder: selectBaseMapLabel, value: selectedBaseMapValue, onChange: handleBaseMapSelection }),
137
+ React.createElement(Select, { options: baseMapOptions, placeholder: selectBaseMapLabel, value: selectedBaseMapValue.value, onChange: handleBaseMapSelection, size: "small" }),
137
138
  baseIsColor &&
138
139
  React.createElement(ColorSwatch, { className: "map-manager-base-item-color", colorDef: ColorDef.fromJSON(bgColor), round: false, onColorPick: handleBgColorClick }),
139
140
  React.createElement(TransparencyPopupButton, { transparency: baseMapTransparencyValue, onTransparencyChange: handleBasemapTransparencyChange }))));
@@ -1 +1 @@
1
- {"version":3,"file":"BasemapPanel.js","sourceRoot":"","sources":["../../../../src/ui/widget/BasemapPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable deprecation/deprecation */\r\n// cSpell:ignore droppable Sublayer Basemap\r\n\r\nimport * as React from \"react\";\r\nimport { BaseMapLayerSettings, ColorByName, ColorDef, MapLayerProps, MapLayerSettings } from \"@itwin/core-common\";\r\nimport { DisplayStyleState } from \"@itwin/core-frontend\";\r\nimport { ColorPickerDialog, ColorSwatch } from \"@itwin/imodel-components-react\";\r\nimport { OptionType, ThemedSelect, WebFontIcon } from \"@itwin/core-react\";\r\nimport { ActionMeta, ValueType } from \"react-select/src/types\";\r\nimport { ModalDialogManager } from \"@itwin/appui-react\";\r\nimport { TransparencyPopupButton } from \"./TransparencyPopupButton\";\r\nimport { useSourceMapContext } from \"./MapLayerManager\";\r\nimport \"./BasemapPanel.scss\";\r\nimport { MapLayersUiItemsProvider } from \"../MapLayersUiItemsProvider\";\r\n\r\nfunction getBaseMapFromStyle(displayStyle: DisplayStyleState | undefined) {\r\n if (!displayStyle)\r\n return undefined;\r\n\r\n if (displayStyle.settings.mapImagery.backgroundBase instanceof MapLayerSettings || displayStyle.settings.mapImagery.backgroundBase instanceof ColorDef)\r\n return displayStyle.settings.mapImagery.backgroundBase.toJSON();\r\n\r\n return undefined;\r\n}\r\n\r\ninterface BaseOption extends OptionType {\r\n color?: string;\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function BasemapPanel() {\r\n const [useColorLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Basemap.ColorFill\"));\r\n const { activeViewport, bases } = useSourceMapContext();\r\n\r\n const [baseMapTransparencyValue, setBaseMapTransparencyValue] = React.useState(() => {\r\n if (activeViewport)\r\n return activeViewport.displayStyle.baseMapTransparency;\r\n return 0;\r\n });\r\n\r\n const handleBasemapTransparencyChange = React.useCallback((transparency: number) => {\r\n if (activeViewport) {\r\n activeViewport.displayStyle.changeBaseMapTransparency(transparency);\r\n activeViewport.invalidateRenderPlan();\r\n setBaseMapTransparencyValue(transparency);\r\n }\r\n }, [activeViewport]);\r\n\r\n const baseMapOptions = React.useMemo<BaseOption[]>(() => {\r\n const baseOptions: BaseOption[] = [];\r\n\r\n baseOptions.push({ value: useColorLabel, label: useColorLabel });\r\n\r\n if (bases)\r\n baseOptions.push(...bases.map((value) => ({ value: value.name, label: value.name })));\r\n return baseOptions;\r\n }, [bases, useColorLabel]);\r\n\r\n const [presetColors] = React.useState([\r\n ColorDef.create(ColorByName.grey),\r\n ColorDef.create(ColorByName.lightGrey),\r\n ColorDef.create(ColorByName.darkGrey),\r\n ColorDef.create(ColorByName.lightBlue),\r\n ColorDef.create(ColorByName.lightGreen),\r\n ColorDef.create(ColorByName.darkGreen),\r\n ColorDef.create(ColorByName.tan),\r\n ColorDef.create(ColorByName.darkBrown),\r\n ]);\r\n\r\n const [selectedBaseMap, setSelectedBaseMap] = React.useState<MapLayerProps | number | undefined>(getBaseMapFromStyle(activeViewport?.displayStyle));\r\n const baseIsColor = React.useMemo(() => typeof selectedBaseMap === \"number\", [selectedBaseMap]);\r\n const baseIsMap = React.useMemo(() => !baseIsColor && (selectedBaseMap !== undefined), [baseIsColor, selectedBaseMap]);\r\n const bgColor = React.useMemo(() => baseIsColor ? selectedBaseMap as number : presetColors[0].toJSON(), [baseIsColor, selectedBaseMap, presetColors]);\r\n const [colorDialogTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:ColorDialog.Title\"));\r\n const selectedBaseMapValue = React.useMemo(() => {\r\n if (baseIsMap) {\r\n const mapName = (selectedBaseMap! as MapLayerProps).name;\r\n const foundItem = baseMapOptions.find((value) => value.label === mapName);\r\n if (foundItem)\r\n return foundItem;\r\n }\r\n return baseMapOptions[0];\r\n }, [selectedBaseMap, baseMapOptions, baseIsMap]);\r\n\r\n const handleBackgroundColorDialogOk = React.useCallback((bgColorDef: ColorDef) => {\r\n ModalDialogManager.closeDialog();\r\n if (activeViewport) {\r\n // change color and make sure previously set transparency is not lost.\r\n const curTransparency = activeViewport.displayStyle.backgroundMapBase instanceof ColorDef ? activeViewport.displayStyle.backgroundMapBase.getTransparency() : 0;\r\n activeViewport.displayStyle.backgroundMapBase = bgColorDef.withTransparency(curTransparency);\r\n activeViewport.invalidateRenderPlan();\r\n setSelectedBaseMap(bgColorDef.toJSON());\r\n }\r\n }, [activeViewport]);\r\n\r\n const handleBackgroundColorDialogCancel = React.useCallback(() => {\r\n ModalDialogManager.closeDialog();\r\n }, []);\r\n\r\n const handleBgColorClick = React.useCallback((newColor: ColorDef, e: React.MouseEvent<Element, MouseEvent>) => {\r\n e.preventDefault();\r\n ModalDialogManager.openDialog(<ColorPickerDialog dialogTitle={colorDialogTitle} color={newColor} colorPresets={presetColors}\r\n onOkResult={handleBackgroundColorDialogOk} onCancelResult={handleBackgroundColorDialogCancel} />);\r\n }, [presetColors, handleBackgroundColorDialogOk]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const handleBaseMapSelection = React.useCallback((value: ValueType<BaseOption>, action: ActionMeta<BaseOption>) => {\r\n if (bases && activeViewport && action.action === \"select-option\" && value) {\r\n const baseMap = bases.find((map) => map.name === (value as BaseOption).label);\r\n if (baseMap) {\r\n const baseProps: MapLayerProps = baseMap.toJSON();\r\n if (activeViewport.displayStyle.backgroundMapBase instanceof BaseMapLayerSettings) {\r\n activeViewport.displayStyle.backgroundMapBase = activeViewport.displayStyle.backgroundMapBase.clone(baseProps);\r\n } else {\r\n activeViewport.displayStyle.backgroundMapBase = BaseMapLayerSettings.fromJSON(baseProps);\r\n }\r\n activeViewport.invalidateRenderPlan();\r\n setSelectedBaseMap(baseProps);\r\n } else {\r\n const bgColorDef = ColorDef.fromJSON(bgColor);\r\n const curTransparency = activeViewport.displayStyle.backgroundMapBase instanceof ColorDef ? activeViewport.displayStyle.backgroundMapBase.getTransparency() : 0;\r\n activeViewport.displayStyle.backgroundMapBase = bgColorDef.withTransparency(curTransparency);\r\n activeViewport.invalidateRenderPlan();\r\n setSelectedBaseMap(bgColorDef.toJSON());\r\n }\r\n }\r\n }, [bases, activeViewport, bgColor]);\r\n\r\n const [baseMapVisible, setBaseMapVisible] = React.useState(() => {\r\n if (activeViewport && activeViewport.displayStyle.backgroundMapBase instanceof MapLayerSettings) {\r\n return activeViewport.displayStyle.backgroundMapBase.visible;\r\n }\r\n return false;\r\n });\r\n\r\n const handleVisibilityChange = React.useCallback(() => {\r\n if (activeViewport) {\r\n const newState = !baseMapVisible;\r\n // BaseMap visibility is only support when backgroundBase is an instance of BaseMapLayerSettings (i.e not a color)...\r\n if (activeViewport.displayStyle.backgroundMapBase instanceof BaseMapLayerSettings) {\r\n activeViewport.displayStyle.backgroundMapBase = activeViewport.displayStyle.backgroundMapBase.clone({ visible: newState });\r\n activeViewport.invalidateRenderPlan();\r\n }\r\n setBaseMapVisible(newState);\r\n }\r\n }, [baseMapVisible, activeViewport]);\r\n\r\n const [baseLayerLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Basemap.BaseLayer\"));\r\n const [selectBaseMapLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Basemap.SelectBaseMap\"));\r\n const [toggleVisibility] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Widget.ToggleVisibility\"));\r\n\r\n return (\r\n <>\r\n <div className=\"map-manager-base-item\" >\r\n <button className=\"map-manager-item-visibility\" title={toggleVisibility} onClick={handleVisibilityChange}>\r\n <WebFontIcon iconName={baseMapVisible ? \"icon-visibility\" : \"icon-visibility-hide-2\"} />\r\n </button>\r\n <span className=\"map-manager-base-label\">{baseLayerLabel}</span>\r\n <ThemedSelect options={baseMapOptions} closeMenuOnSelect placeholder={selectBaseMapLabel} value={selectedBaseMapValue} onChange={handleBaseMapSelection} />\r\n {\r\n baseIsColor &&\r\n <ColorSwatch className=\"map-manager-base-item-color\" colorDef={ColorDef.fromJSON(bgColor)} round={false} onColorPick={handleBgColorClick} />\r\n }\r\n <TransparencyPopupButton transparency={baseMapTransparencyValue} onTransparencyChange={handleBasemapTransparencyChange} />\r\n </div>\r\n </>\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"BasemapPanel.js","sourceRoot":"","sources":["../../../../src/ui/widget/BasemapPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable deprecation/deprecation */\r\n// cSpell:ignore droppable Sublayer Basemap\r\n\r\nimport * as React from \"react\";\r\nimport { BaseMapLayerSettings, ColorByName, ColorDef, MapLayerProps, MapLayerSettings } from \"@itwin/core-common\";\r\nimport { DisplayStyleState } from \"@itwin/core-frontend\";\r\nimport { ColorPickerDialog, ColorSwatch } from \"@itwin/imodel-components-react\";\r\nimport { WebFontIcon } from \"@itwin/core-react\";\r\nimport { Select, SelectOption } from \"@itwin/itwinui-react\";\r\nimport { ModalDialogManager } from \"@itwin/appui-react\";\r\nimport { TransparencyPopupButton } from \"./TransparencyPopupButton\";\r\nimport { useSourceMapContext } from \"./MapLayerManager\";\r\nimport \"./BasemapPanel.scss\";\r\nimport { MapLayersUiItemsProvider } from \"../MapLayersUiItemsProvider\";\r\n\r\nfunction getBaseMapFromStyle(displayStyle: DisplayStyleState | undefined) {\r\n if (!displayStyle)\r\n return undefined;\r\n\r\n if (displayStyle.settings.mapImagery.backgroundBase instanceof MapLayerSettings || displayStyle.settings.mapImagery.backgroundBase instanceof ColorDef)\r\n return displayStyle.settings.mapImagery.backgroundBase.toJSON();\r\n\r\n return undefined;\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function BasemapPanel() {\r\n const [useColorLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Basemap.ColorFill\"));\r\n const { activeViewport, bases } = useSourceMapContext();\r\n\r\n const [baseMapTransparencyValue, setBaseMapTransparencyValue] = React.useState(() => {\r\n if (activeViewport)\r\n return activeViewport.displayStyle.baseMapTransparency;\r\n return 0;\r\n });\r\n\r\n const handleBasemapTransparencyChange = React.useCallback((transparency: number) => {\r\n if (activeViewport) {\r\n activeViewport.displayStyle.changeBaseMapTransparency(transparency);\r\n activeViewport.invalidateRenderPlan();\r\n setBaseMapTransparencyValue(transparency);\r\n }\r\n }, [activeViewport]);\r\n\r\n const baseMapOptions = React.useMemo<SelectOption<string>[]>(() => {\r\n const baseOptions: SelectOption<string>[] = [];\r\n\r\n baseOptions.push({ value: useColorLabel, label: useColorLabel });\r\n\r\n if (bases)\r\n baseOptions.push(...bases.map((value) => ({ value: value.name, label: value.name })));\r\n return baseOptions;\r\n }, [bases, useColorLabel]);\r\n\r\n const [presetColors] = React.useState([\r\n ColorDef.create(ColorByName.grey),\r\n ColorDef.create(ColorByName.lightGrey),\r\n ColorDef.create(ColorByName.darkGrey),\r\n ColorDef.create(ColorByName.lightBlue),\r\n ColorDef.create(ColorByName.lightGreen),\r\n ColorDef.create(ColorByName.darkGreen),\r\n ColorDef.create(ColorByName.tan),\r\n ColorDef.create(ColorByName.darkBrown),\r\n ]);\r\n\r\n const [selectedBaseMap, setSelectedBaseMap] = React.useState<MapLayerProps | number | undefined>(getBaseMapFromStyle(activeViewport?.displayStyle));\r\n const baseIsColor = React.useMemo(() => typeof selectedBaseMap === \"number\", [selectedBaseMap]);\r\n const baseIsMap = React.useMemo(() => !baseIsColor && (selectedBaseMap !== undefined), [baseIsColor, selectedBaseMap]);\r\n const bgColor = React.useMemo(() => baseIsColor ? selectedBaseMap as number : presetColors[0].toJSON(), [baseIsColor, selectedBaseMap, presetColors]);\r\n const [colorDialogTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:ColorDialog.Title\"));\r\n const selectedBaseMapValue = React.useMemo(() => {\r\n if (baseIsMap) {\r\n const mapName = (selectedBaseMap! as MapLayerProps).name;\r\n const foundItem = baseMapOptions.find((value) => value.label === mapName);\r\n if (foundItem)\r\n return foundItem;\r\n }\r\n return baseMapOptions[0];\r\n }, [selectedBaseMap, baseMapOptions, baseIsMap]);\r\n\r\n const handleBackgroundColorDialogOk = React.useCallback((bgColorDef: ColorDef) => {\r\n ModalDialogManager.closeDialog();\r\n if (activeViewport) {\r\n // change color and make sure previously set transparency is not lost.\r\n const curTransparency = activeViewport.displayStyle.backgroundMapBase instanceof ColorDef ? activeViewport.displayStyle.backgroundMapBase.getTransparency() : 0;\r\n activeViewport.displayStyle.backgroundMapBase = bgColorDef.withTransparency(curTransparency);\r\n activeViewport.invalidateRenderPlan();\r\n setSelectedBaseMap(bgColorDef.toJSON());\r\n }\r\n }, [activeViewport]);\r\n\r\n const handleBackgroundColorDialogCancel = React.useCallback(() => {\r\n ModalDialogManager.closeDialog();\r\n }, []);\r\n\r\n const handleBgColorClick = React.useCallback((newColor: ColorDef, e: React.MouseEvent<Element, MouseEvent>) => {\r\n e.preventDefault();\r\n ModalDialogManager.openDialog(<ColorPickerDialog dialogTitle={colorDialogTitle} color={newColor} colorPresets={presetColors}\r\n onOkResult={handleBackgroundColorDialogOk} onCancelResult={handleBackgroundColorDialogCancel} />);\r\n }, [presetColors, handleBackgroundColorDialogOk]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const handleBaseMapSelection = React.useCallback((value: string) => {\r\n if (bases && activeViewport && value) {\r\n const baseMap = bases.find((map) => map.name === value);\r\n if (baseMap) {\r\n const baseProps: MapLayerProps = baseMap.toJSON();\r\n if (activeViewport.displayStyle.backgroundMapBase instanceof BaseMapLayerSettings) {\r\n activeViewport.displayStyle.backgroundMapBase = activeViewport.displayStyle.backgroundMapBase.clone(baseProps);\r\n } else {\r\n activeViewport.displayStyle.backgroundMapBase = BaseMapLayerSettings.fromJSON(baseProps);\r\n }\r\n activeViewport.invalidateRenderPlan();\r\n setSelectedBaseMap(baseProps);\r\n } else {\r\n const bgColorDef = ColorDef.fromJSON(bgColor);\r\n const curTransparency = activeViewport.displayStyle.backgroundMapBase instanceof ColorDef ? activeViewport.displayStyle.backgroundMapBase.getTransparency() : 0;\r\n activeViewport.displayStyle.backgroundMapBase = bgColorDef.withTransparency(curTransparency);\r\n activeViewport.invalidateRenderPlan();\r\n setSelectedBaseMap(bgColorDef.toJSON());\r\n }\r\n }\r\n }, [bases, activeViewport, bgColor]);\r\n\r\n const [baseMapVisible, setBaseMapVisible] = React.useState(() => {\r\n if (activeViewport && activeViewport.displayStyle.backgroundMapBase instanceof MapLayerSettings) {\r\n return activeViewport.displayStyle.backgroundMapBase.visible;\r\n }\r\n return false;\r\n });\r\n\r\n const handleVisibilityChange = React.useCallback(() => {\r\n if (activeViewport) {\r\n const newState = !baseMapVisible;\r\n // BaseMap visibility is only support when backgroundBase is an instance of BaseMapLayerSettings (i.e not a color)...\r\n if (activeViewport.displayStyle.backgroundMapBase instanceof BaseMapLayerSettings) {\r\n activeViewport.displayStyle.backgroundMapBase = activeViewport.displayStyle.backgroundMapBase.clone({ visible: newState });\r\n activeViewport.invalidateRenderPlan();\r\n }\r\n setBaseMapVisible(newState);\r\n }\r\n }, [baseMapVisible, activeViewport]);\r\n\r\n const [baseLayerLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Basemap.BaseLayer\"));\r\n const [selectBaseMapLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Basemap.SelectBaseMap\"));\r\n const [toggleVisibility] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Widget.ToggleVisibility\"));\r\n\r\n return (\r\n <>\r\n <div className=\"map-manager-base-item\" >\r\n <button className=\"map-manager-item-visibility\" title={toggleVisibility} onClick={handleVisibilityChange}>\r\n <WebFontIcon iconName={baseMapVisible ? \"icon-visibility\" : \"icon-visibility-hide-2\"} />\r\n </button>\r\n <span className=\"map-manager-base-label\">{baseLayerLabel}</span>\r\n <Select options={baseMapOptions} placeholder={selectBaseMapLabel} value={selectedBaseMapValue.value} onChange={handleBaseMapSelection} size=\"small\" />\r\n {\r\n baseIsColor &&\r\n <ColorSwatch className=\"map-manager-base-item-color\" colorDef={ColorDef.fromJSON(bgColor)} round={false} onColorPick={handleBgColorClick} />\r\n }\r\n <TransparencyPopupButton transparency={baseMapTransparencyValue} onTransparencyChange={handleBasemapTransparencyChange} />\r\n </div>\r\n </>\r\n );\r\n}\r\n"]}
@@ -1,7 +1,7 @@
1
- import { MapLayerSource, ScreenViewport } from "@itwin/core-frontend";
1
+ import "./MapLayerManager.scss";
2
2
  import * as React from "react";
3
+ import { MapLayerSource, ScreenViewport } from "@itwin/core-frontend";
3
4
  import { MapLayerOptions, MapTypesOptions, StyleMapLayerSettings } from "../Interfaces";
4
- import "./MapLayerManager.scss";
5
5
  /** @internal */
6
6
  export interface SourceMapContextProps {
7
7
  readonly sources: MapLayerSource[];
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerManager.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapLayerManager.tsx"],"names":[],"mappings":"AAUA,OAAO,EAC4E,cAAc,EACjC,cAAc,EAC7E,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAKxF,OAAO,wBAAwB,CAAC;AAGhC,gBAAgB;AAChB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACpD,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACjD,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;CAC5C;AAED,gBAAgB;AAChB,eAAO,MAAM,gBAAgB,sCAK3B,CAAC;AAEH,gBAAgB;AAChB,wBAAgB,mBAAmB,IAAI,qBAAqB,CAE3D;AAmCD,UAAU,oBAAoB;IAC5B,oBAAoB,EAAE,MAAM,WAAW,CAAC;IACxC,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,eA6W1D"}
1
+ {"version":3,"file":"MapLayerManager.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapLayerManager.tsx"],"names":[],"mappings":"AASA,OAAO,wBAAwB,CAAC;AAChC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EACmD,cAAc,EACtE,cAAc,EACf,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAOxF,gBAAgB;AAChB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACpD,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACjD,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;CAC5C;AAED,gBAAgB;AAChB,eAAO,MAAM,gBAAgB,sCAK3B,CAAC;AAEH,gBAAgB;AAChB,wBAAgB,mBAAmB,IAAI,qBAAqB,CAE3D;AAmCD,UAAU,oBAAoB;IAC5B,oBAAoB,EAAE,MAAM,WAAW,CAAC;IACxC,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,eAyX1D"}
@@ -3,16 +3,19 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  // cSpell:ignore droppable Sublayer Basemap
6
- import { ImageryMapTileTree, IModelApp, MapLayerSettingsService, MapLayerSourceChangeType, MapLayerSources, NotifyMessageDetails, OutputMessagePriority, } from "@itwin/core-frontend";
7
- import { ToggleSwitch } from "@itwin/itwinui-react";
8
- import { assert } from "@itwin/core-bentley";
6
+ // the following quiet warning caused by react-beautiful-dnd package
7
+ /* eslint-disable @typescript-eslint/unbound-method */
8
+ import "./MapLayerManager.scss";
9
9
  import * as React from "react";
10
10
  import { DragDropContext } from "react-beautiful-dnd";
11
+ import { assert, BentleyError } from "@itwin/core-bentley";
12
+ import { ImageryMapTileTree, IModelApp, MapLayerSources, NotifyMessageDetails, OutputMessagePriority, } from "@itwin/core-frontend";
13
+ import { ToggleSwitch } from "@itwin/itwinui-react";
14
+ import { MapLayerPreferences, MapLayerSourceChangeType } from "../../MapLayerPreferences";
11
15
  import { MapLayersUiItemsProvider } from "../MapLayersUiItemsProvider";
12
16
  import { AttachLayerPopupButton } from "./AttachLayerPopupButton";
13
17
  import { BasemapPanel } from "./BasemapPanel";
14
18
  import { MapLayerDroppable } from "./MapLayerDroppable";
15
- import "./MapLayerManager.scss";
16
19
  import { MapLayerSettingsPopupButton } from "./MapLayerSettingsPopupButton";
17
20
  /** @internal */
18
21
  export const SourceMapContext = React.createContext({
@@ -131,6 +134,17 @@ export function MapLayerManager(props) {
131
134
  const sources = [];
132
135
  const bases = [];
133
136
  const sourceLayers = await MapLayerSources.create(undefined, (fetchPublicMapLayerSources && !hideExternalMapLayersSection));
137
+ const iModel = IModelApp.viewManager.selectedView ? IModelApp.viewManager.selectedView.iModel : undefined;
138
+ if (iModel && iModel.iTwinId && iModel.iModelId) {
139
+ try {
140
+ const preferenceSources = await MapLayerPreferences.getSources(iModel.iTwinId, iModel.iModelId);
141
+ for (const source of preferenceSources)
142
+ await MapLayerSources.addSourceToMapLayerSources(source);
143
+ }
144
+ catch (err) {
145
+ IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, IModelApp.localization.getLocalizedString("mapLayers:CustomAttach.ErrorLoadingLayers"), BentleyError.getErrorMessage(err)));
146
+ }
147
+ }
134
148
  if (!isMounted.current) {
135
149
  return;
136
150
  }
@@ -160,7 +174,7 @@ export function MapLayerManager(props) {
160
174
  setMapSources(newSources);
161
175
  }, [setMapSources]);
162
176
  /**
163
- * Handle change events in the MapLayerSettingsService
177
+ * Handle change events in the MapLayerPreferences
164
178
  */
165
179
  React.useEffect(() => {
166
180
  const handleLayerSourceChange = async (changeType, oldSource, newSource) => {
@@ -188,9 +202,9 @@ export function MapLayerManager(props) {
188
202
  }
189
203
  }
190
204
  };
191
- MapLayerSettingsService.onLayerSourceChanged.addListener(handleLayerSourceChange);
205
+ MapLayerPreferences.onLayerSourceChanged.addListener(handleLayerSourceChange);
192
206
  return (() => {
193
- MapLayerSettingsService.onLayerSourceChanged.removeListener(handleLayerSourceChange);
207
+ MapLayerPreferences.onLayerSourceChanged.removeListener(handleLayerSourceChange);
194
208
  });
195
209
  }, [updateMapSources]);
196
210
  // update when a different display style is loaded.
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerManager.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapLayerManager.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,2CAA2C;AAM3C,OAAO,EACL,kBAAkB,EAAE,SAAS,EAA2B,uBAAuB,EAAkB,wBAAwB,EACzH,eAAe,EAAE,oBAAoB,EAAE,qBAAqB,GAC7D,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAc,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,wBAAwB,CAAC;AAChC,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAc5E,gBAAgB;AAChB,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAwB;IACzE,OAAO,EAAE,EAAE;IACX,cAAc,EAAE,KAAK;IACrB,KAAK,EAAE,EAAE;IACT,gBAAgB,EAAE,GAAG,EAAE,GAAG,CAAC;CAC5B,CAAC,CAAC;AAEH,gBAAgB;AAChB,MAAM,UAAU,mBAAmB;IACjC,OAAO,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,gBAAgB,CAAC,gBAAuC;IAC/D,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,+BAA+B,CAAC,QAAkB,EAAE,gBAAyB,EAAE,iBAAiB,GAAG,IAAI;IAC9G,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;IAC3C,IAAI,CAAC,YAAY;QACf,OAAO,SAAS,CAAC;IAEnB,MAAM,MAAM,GAAG,IAAI,KAAK,EAAyB,CAAC;IAElD,MAAM,kBAAkB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;IACjH,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QACvE,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,CAAC,gBAAgB,CAAC;QACpC,MAAM,aAAa,GAAG,QAAQ,CAAC,0BAA0B,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,IAAI,EAAE,aAAa,CAAC,IAAI;YACxB,GAAG,EAAE,aAAa,CAAC,GAAG;YACtB,YAAY,EAAE,aAAa,CAAC,YAAY;YACxC,qBAAqB,EAAE,aAAa,CAAC,qBAAqB;YAC1D,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;YACpF,aAAa,EAAE,KAAK;YACpB,SAAS;YACT,QAAQ,EAAE,aAAa;SACxB,CAAC,CAAC;KACJ;IAED,8FAA8F;IAC9F,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAQD,gEAAgE;AAChE,MAAM,UAAU,eAAe,CAAC,KAA2B;;IACzD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAgC,CAAC;IACnF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAgC,CAAC;IACrF,MAAM,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,gCAAgC,CAAC,CAAC,CAAC;IACnI,MAAM,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACvI,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IAClD,MAAM,4BAA4B,GAAG,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,qBAAqB,EAAC,CAAC,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5H,MAAM,0BAA0B,GAAG,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,0BAA0B,EAAC,CAAC,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC,CAAC,KAAK,CAAC;IAEpI,wCAAwC;IACxC,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAsC,+BAA+B,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;IACjK,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAsC,+BAA+B,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;IAE5J,MAAM,gCAAgC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,QAAkB,EAAE,EAAE;QAChF,sBAAsB,CAAC,+BAA+B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACxE,mBAAmB,CAAC,+BAA+B,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC,EAAE,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAElD,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC1E,IAAI,cAAc,EAAE;YAClB,OAAO,cAAc,CAAC,SAAS,CAAC,aAAa,CAAC;SAC/C;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,wHAAwH;IACxH,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,yCAAyC;IACzC,mEAAmE;IACnE,uDAAuD;IACvD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,kBAAkB,GAAG,CAAC,IAAmB,EAAE,EAAE;YAEjD,4BAA4B;YAC5B,IAAI,IAAI,CAAC,QAAQ,YAAY,kBAAkB,EAAE;gBAC/C,gCAAgC,CAAC,cAAc,CAAC,CAAC;aAClD;QACH,CAAC,CAAC;QAEF,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAEnE,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACxE,CAAC,CAAC;IAEJ,CAAC,EAAE,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC,CAAC;IAEvD,8CAA8C;IAE9C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,uBAAuB,GAAG,CAAC,IAAkC,EAAE,EAAE;YAErE,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;mBACtF,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnF,gCAAgC,CAAC,cAAc,CAAC,CAAC;aAClD;QACH,CAAC,CAAC;QACF,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;QAE/F,OAAO,GAAG,EAAE;YACV,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;QACpG,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,gCAAgC,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE9F,MAAM,2BAA2B,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAA8B,EAAE,EAAE;QACvF,gCAAgC,CAAC,cAAc,CAAC,CAAC;IACnD,CAAC,EAAE,CAAC,gCAAgC,EAAE,cAAc,CAAC,CAAC,CAAC;IAEvD,8CAA8C;IAC9C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,WAAG,MAAA,KAAK,CAAC,QAAQ,0CAAE,eAAe,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvH,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,WAAG,MAAA,KAAK,CAAC,QAAQ,0CAAE,eAAe,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpH,OAAO,GAAG,EAAE;YACV,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,WAAG,MAAA,KAAK,CAAC,QAAQ,0CAAE,eAAe,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1H,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,WAAG,MAAA,KAAK,CAAC,QAAQ,0CAAE,eAAe,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzH,CAAC,CAAC;IAEJ,CAAC,EAAE,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,gCAAgC,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAE3H,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,UAAU,eAAe;YAC5B,MAAM,OAAO,GAAqB,EAAE,CAAC;YACrC,MAAM,KAAK,GAAqB,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,0BAA0B,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;YAC5H,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;gBACtB,OAAO;aACR;YAED,+EAA+E;YAC/E,wJAAwJ;YACxJ,8FAA8F;YAC9F,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,CAAC,OAAO,CAAC,CAAC,MAAsB,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,OAAO,CAAC,CAAC,MAAsB,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjF,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QAED,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,eAAe,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC1B,IAAI,SAAS,CAAC,OAAO,EAAE;gBACrB,iBAAiB,CAAC,KAAK,CAAC,CAAC;aAC1B;QAEH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACZ,IAAI,SAAS,CAAC,OAAO,EAAE;gBACrB,iBAAiB,CAAC,KAAK,CAAC,CAAC;aAC1B;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,aAAa,EAAE,0BAA0B,EAAE,4BAA4B,CAAC,CAAC,CAAC;IAE9E,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;;QAC9C,MAAM,UAAU,GAAqB,EAAE,CAAC;QACxC,MAAA,MAAA,eAAe,CAAC,WAAW,EAAE,0CAAE,MAAM,0CAAE,OAAO,CAAC,CAAC,WAA2B,EAAE,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnH,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB;;MAEE;IACF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,uBAAuB,GAAG,KAAK,EAAE,UAAoC,EAAE,SAA0B,EAAE,SAA0B,EAAE,EAAE;YACrI,MAAM,gBAAgB,GAAG,CAAC,UAAU,KAAK,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC3E,MAAM,YAAY,GAAG,CAAC,UAAU,KAAK,wBAAwB,CAAC,QAAQ,IAAI,UAAU,KAAK,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC3H,MAAM,SAAS,GAAG,CAAC,UAAU,KAAK,wBAAwB,CAAC,QAAQ,IAAI,UAAU,KAAK,wBAAwB,CAAC,KAAK,CAAC,CAAC;YAEtH,IAAI,YAAY,EAAE;gBAChB,IAAI,SAAS,EAAE;oBACb,MAAM,SAAS,GAAG,eAAe,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACpE,MAAM,CAAC,SAAS,CAAC,CAAC;oBAClB,IAAI,CAAC,SAAS,EAAE;wBACd,OAAO;qBACR;oBAED,IAAI,gBAAgB,EAAE;wBACpB,gBAAgB,EAAE,CAAC;wBACnB,OAAO;qBACR;iBACF;aACF;YAED,IAAI,SAAS,EAAE;gBACb,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;gBAC5E,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;gBAC9B,IAAI,OAAO,EAAE;oBACX,gBAAgB,EAAE,CAAC;iBACpB;aACF;QACH,CAAC,CAAC;QACF,uBAAuB,CAAC,oBAAoB,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,EAAE;YACX,uBAAuB,CAAC,oBAAoB,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,mDAAmD;IACnD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,wBAAwB,GAAG,CAAC,EAAY,EAAE,EAAE;YAChD,gCAAgC,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC;QACF,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,qBAAqB,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;QAC5E,OAAO,GAAG,EAAE;YACV,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,qBAAqB,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC;QACjF,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC,CAAC;IAEvD,MAAM,yBAAyB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,MAAc,EAAE,gBAAuC,EAAE,EAAE;QAC9G,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,YAAY;YACjD,OAAO;QAET,MAAM,mBAAmB,GAAG,cAAc,CAAC,YAAY,CAAC,6BAA6B,CAAC,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC/J,IAAI,mBAAmB,GAAG,CAAC;YACzB,OAAO;QAET,QAAQ,MAAM,EAAE;YACd,KAAK,QAAQ;gBACX,cAAc,CAAC,YAAY,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBACnG,MAAM;YACR,KAAK,eAAe;gBAClB,cAAc,CAAC,YAAY,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC7H,IAAI,CAAC,MAAM,EAAE;wBACX,MAAM,GAAG,GAAG,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,mCAAmC,CAAC,CAAC;wBAC1G,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,qBAAqB,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;qBACnI;gBACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC1B,MAAM;SACT;QACD,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAEtC,qBAAqB;QACrB,gCAAgC,CAAC,cAAc,CAAC,CAAC;IACnD,CAAC,EAAE,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC,CAAC;IAEvD,MAAM,2BAA2B,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,gBAAuC,EAAE,EAAE;QAChG,IAAI,cAAc,EAAE;YAClB,MAAM,SAAS,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAE5C,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC;YACjD,MAAM,mBAAmB,GAAG,YAAY,CAAC,6BAA6B,CAAC,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAChJ,IAAI,CAAC,CAAC,KAAK,mBAAmB,EAAE;gBAC9B,2BAA2B;gBAC3B,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBAC1G,cAAc,CAAC,oBAAoB,EAAE,CAAC;gBAEtC,qBAAqB;gBACrB,gCAAgC,CAAC,cAAc,CAAC,CAAC;aAClD;SACF;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC,CAAC;IAEvD,MAAM,qBAAqB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACnD,IAAI,cAAc,EAAE;YAClB,MAAM,QAAQ,GAAG,CAAC,oBAAoB,CAAC;YACvC,cAAc,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;YACpF,uBAAuB,CAAC,QAAQ,CAAC,CAAC;SACnC;IACH,CAAC,EAAE,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,cAAc,CAAC,CAAC,CAAC;IAEpE,MAAM,uBAAuB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,MAAkB,CAAC,oCAAoC,EAAE,EAAE;QAC5G,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAEvC,IAAI,CAAC,WAAW,EAAE,0BAA0B;YAC1C,OAAO;QAET,qBAAqB;QACrB,IAAI,WAAW,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,IAAI,WAAW,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;YACtF,OAAO;QAET,IAAI,YAA+C,CAAC;QACpD,IAAI,MAAM,CAAC,WAAW,KAAK,kBAAkB,IAAI,gBAAgB;YAC/D,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC3C,IAAI,MAAM,CAAC,WAAW,KAAK,qBAAqB,IAAI,mBAAmB;YAC1E,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEnD,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc;YAClC,OAAO;QAET,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC;QACjD,IAAI,UAA6C,CAAC;QAClD,IAAI,qBAAqB,GAAG,CAAC,CAAC,CAAC;QAE/B,sKAAsK;QACtK,gHAAgH;QAChH,IAAI,SAAS,KAAK,WAAW,CAAC,KAAK,EAAE;YACnC,IAAI,WAAW,CAAC,WAAW,KAAK,kBAAkB,IAAI,gBAAgB;gBACpE,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;iBAC9C,IAAI,WAAW,CAAC,WAAW,KAAK,qBAAqB,IAAI,mBAAmB;gBAC/E,UAAU,GAAG,mBAAmB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACtD,IAAI,UAAU;gBACZ,qBAAqB,GAAG,YAAY,CAAC,6BAA6B,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;SAC7H;QAED,MAAM,uBAAuB,GAAG,YAAY,CAAC,6BAA6B,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QACxI,IAAI,uBAAuB,GAAG,CAAC;YAC7B,OAAO;QAET,IAAI,WAAW,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,EAAE;YAClD,iFAAiF;YACjF,MAAM,aAAa,GAAG,cAAc,CAAC,YAAY,CAAC,eAAe,CAAC,uBAAuB,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACnH,IAAI,aAAa,EAAE;gBACjB,cAAc,CAAC,YAAY,CAAC,qBAAqB,CAAC,uBAAuB,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;gBAEnG,kEAAkE;gBAClE,IAAI,YAAY,CAAC,SAAS,IAAI,mBAAmB,EAAE;oBACjD,qBAAqB,GAAG,YAAY,CAAC,mBAAmB,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC;iBACrF;qBAAM,IAAI,CAAC,YAAY,CAAC,SAAS,IAAI,gBAAgB,EAAE;oBACtD,qBAAqB,GAAG,gBAAgB,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC;iBACrE;gBAED,cAAc,CAAC,YAAY,CAAC,sBAAsB,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;aACnH;SACF;aAAM;YACL,IAAI,SAAS,KAAK,WAAW,CAAC,KAAK,EAAE;gBACnC,YAAY,CAAC,oBAAoB,CAAC,uBAAuB,EAAE,WAAW,CAAC,WAAW,KAAK,kBAAkB,CAAC,CAAC;aAC5G;iBAAM;gBACL,IAAI,UAAU,EAAE;oBACd,IAAI,qBAAqB,KAAK,CAAC,CAAC;wBAC9B,YAAY,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,qBAAqB,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;iBAC1G;aACF;SACF;QAED,qCAAqC;QACrC,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAEtC,qBAAqB;QACrB,gCAAgC,CAAC,cAAc,CAAC,CAAC;IACnD,CAAC,EAAE,CAAC,gCAAgC,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE9F,MAAM,sBAAsB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACpD,IAAI,cAAc;YAChB,gCAAgC,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC,EAAE,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC,CAAC;IAEvD,MAAM,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAE5I,OAAO,CACL,oBAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE;YAChC,cAAc;YACd,cAAc;YACd,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;YACrC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YACrC,gBAAgB,EAAE,sBAAsB;YACxC,gBAAgB,EAAE,mBAAmB;YACrC,aAAa,EAAE,gBAAgB;YAC/B,eAAe,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,cAAc;SACjD;QACC,6BAAK,SAAS,EAAC,wBAAwB;YACrC,8BAAM,SAAS,EAAC,0BAA0B,IAAE,iBAAiB,CAAQ;YACrE,6BAAK,SAAS,EAAC,kCAAkC;gBAC/C,oBAAC,YAAY,IAAC,SAAS,EAAC,oBAAoB,EAAC,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,qBAAqB,GAAI;gBAC/G,oBAAC,2BAA2B,OAAG,CAC3B,CACF;QAEN,6BAAK,SAAS,EAAC,uBAAuB;YAEpC,6BAAK,SAAS,EAAC,qBAAqB;gBAClC,oBAAC,YAAY,OAAG,CACZ;YACL,CAAC,4BAA4B;gBAC5B,oBAAC,eAAe,IAAC,SAAS,EAAE,uBAAuB;oBACjD,6BAAK,SAAS,EAAC,2BAA2B;wBACxC,6BAAK,SAAS,EAAC,uBAAuB;4BACpC,8BAAM,SAAS,EAAC,6BAA6B,IAAE,cAAc,CAAQ;4BAAA,oBAAC,sBAAsB,IAAC,SAAS,EAAE,KAAK,GAAI,CAC7G;wBACN,oBAAC,iBAAiB,IAChB,SAAS,EAAE,KAAK,EAChB,UAAU,EAAE,mBAAmB,EAC/B,eAAe,EAAE,MAAA,KAAK,CAAC,eAAe,0CAAE,cAAc,EACtD,oBAAoB,EAAE,KAAK,CAAC,oBAA2B,EACvD,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,kBAAkB,EAAE,yBAAyB,EAC7C,6BAA6B,EAAE,2BAA2B,EAC1D,YAAY,EAAE,sBAAsB,GAAI,CACtC;oBAEN,6BAAK,SAAS,EAAC,2BAA2B;wBACxC,6BAAK,SAAS,EAAC,sBAAsB;4BACnC,8BAAM,SAAS,EAAC,4BAA4B,IAAE,aAAa,CAAQ;4BAAA,oBAAC,sBAAsB,IAAC,SAAS,EAAE,IAAI,GAAI,CAC1G;wBACN,oBAAC,iBAAiB,IAChB,SAAS,EAAE,IAAI,EACf,UAAU,EAAE,gBAAgB,EAC5B,eAAe,EAAE,MAAA,KAAK,CAAC,eAAe,0CAAE,cAAc,EACtD,oBAAoB,EAAE,KAAK,CAAC,oBAA2B,EACvD,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,kBAAkB,EAAE,yBAAyB,EAC7C,6BAA6B,EAAE,2BAA2B,EAC1D,YAAY,EAAE,sBAAsB,GAAI,CACtC,CACU,CAEf,CACoB,CAC9B,CAAC;AACJ,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n// cSpell:ignore droppable Sublayer Basemap\r\n\r\n// the following quiet warning caused by react-beautiful-dnd package\r\n/* eslint-disable @typescript-eslint/unbound-method */\r\n\r\nimport { MapImagerySettings, MapSubLayerProps, MapSubLayerSettings } from \"@itwin/core-common\";\r\nimport {\r\n ImageryMapTileTree, IModelApp, MapLayerImageryProvider, MapLayerSettingsService, MapLayerSource, MapLayerSourceChangeType,\r\n MapLayerSources, NotifyMessageDetails, OutputMessagePriority, ScreenViewport, TileTreeOwner, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { ToggleSwitch } from \"@itwin/itwinui-react\";\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport * as React from \"react\";\r\nimport { DragDropContext, DropResult } from \"react-beautiful-dnd\";\r\nimport { MapLayerOptions, MapTypesOptions, StyleMapLayerSettings } from \"../Interfaces\";\r\nimport { MapLayersUiItemsProvider } from \"../MapLayersUiItemsProvider\";\r\nimport { AttachLayerPopupButton } from \"./AttachLayerPopupButton\";\r\nimport { BasemapPanel } from \"./BasemapPanel\";\r\nimport { MapLayerDroppable } from \"./MapLayerDroppable\";\r\nimport \"./MapLayerManager.scss\";\r\nimport { MapLayerSettingsPopupButton } from \"./MapLayerSettingsPopupButton\";\r\n\r\n/** @internal */\r\nexport interface SourceMapContextProps {\r\n readonly sources: MapLayerSource[];\r\n readonly loadingSources: boolean;\r\n readonly bases: MapLayerSource[];\r\n readonly refreshFromStyle: () => void;\r\n readonly activeViewport?: ScreenViewport;\r\n readonly backgroundLayers?: StyleMapLayerSettings[];\r\n readonly overlayLayers?: StyleMapLayerSettings[];\r\n readonly mapTypesOptions?: MapTypesOptions;\r\n}\r\n\r\n/** @internal */\r\nexport const SourceMapContext = React.createContext<SourceMapContextProps>({ // eslint-disable-line @typescript-eslint/naming-convention\r\n sources: [],\r\n loadingSources: false,\r\n bases: [],\r\n refreshFromStyle: () => { },\r\n});\r\n\r\n/** @internal */\r\nexport function useSourceMapContext(): SourceMapContextProps {\r\n return React.useContext(SourceMapContext);\r\n}\r\n\r\nfunction getSubLayerProps(subLayerSettings: MapSubLayerSettings[]): MapSubLayerProps[] {\r\n return subLayerSettings.map((subLayer) => subLayer.toJSON());\r\n}\r\n\r\nfunction getMapLayerSettingsFromViewport(viewport: Viewport, getBackgroundMap: boolean, populateSubLayers = true): StyleMapLayerSettings[] | undefined {\r\n const displayStyle = viewport.displayStyle;\r\n if (!displayStyle)\r\n return undefined;\r\n\r\n const layers = new Array<StyleMapLayerSettings>();\r\n\r\n const displayStyleLayers = (getBackgroundMap ? displayStyle.backgroundMapLayers : displayStyle.overlayMapLayers);\r\n for (let layerIdx = 0; layerIdx < displayStyleLayers.length; layerIdx++) {\r\n const layerSettings = displayStyleLayers[layerIdx];\r\n const isOverlay = !getBackgroundMap;\r\n const layerProvider = viewport.getMapLayerImageryProvider(layerIdx, isOverlay);\r\n layers.push({\r\n visible: layerSettings.visible,\r\n name: layerSettings.name,\r\n url: layerSettings.url,\r\n transparency: layerSettings.transparency,\r\n transparentBackground: layerSettings.transparentBackground,\r\n subLayers: populateSubLayers ? getSubLayerProps(layerSettings.subLayers) : undefined,\r\n showSubLayers: false,\r\n isOverlay,\r\n provider: layerProvider,\r\n });\r\n }\r\n\r\n // since we want to display higher level maps above lower maps in UI reverse their order here.\r\n return layers.reverse();\r\n}\r\n\r\ninterface MapLayerManagerProps {\r\n getContainerForClone: () => HTMLElement;\r\n activeViewport: ScreenViewport;\r\n mapLayerOptions?: MapLayerOptions;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function MapLayerManager(props: MapLayerManagerProps) {\r\n const [mapSources, setMapSources] = React.useState<MapLayerSource[] | undefined>();\r\n const [loadingSources, setLoadingSources] = React.useState(false);\r\n const [baseSources, setBaseSources] = React.useState<MapLayerSource[] | undefined>();\r\n const [overlaysLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Widget.OverlayLayers\"));\r\n const [underlaysLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Widget.BackgroundLayers\"));\r\n const { activeViewport, mapLayerOptions } = props;\r\n const hideExternalMapLayersSection = mapLayerOptions?.hideExternalMapLayers ? mapLayerOptions.hideExternalMapLayers : false;\r\n const fetchPublicMapLayerSources = mapLayerOptions?.fetchPublicMapLayerSources ? mapLayerOptions.fetchPublicMapLayerSources : false;\r\n\r\n // map layer settings from display style\r\n const [backgroundMapLayers, setBackgroundMapLayers] = React.useState<StyleMapLayerSettings[] | undefined>(getMapLayerSettingsFromViewport(activeViewport, true));\r\n const [overlayMapLayers, setOverlayMapLayers] = React.useState<StyleMapLayerSettings[] | undefined>(getMapLayerSettingsFromViewport(activeViewport, false));\r\n\r\n const loadMapLayerSettingsFromViewport = React.useCallback((viewport: Viewport) => {\r\n setBackgroundMapLayers(getMapLayerSettingsFromViewport(viewport, true));\r\n setOverlayMapLayers(getMapLayerSettingsFromViewport(viewport, false));\r\n }, [setBackgroundMapLayers, setOverlayMapLayers]);\r\n\r\n const [backgroundMapVisible, setBackgroundMapVisible] = React.useState(() => {\r\n if (activeViewport) {\r\n return activeViewport.viewFlags.backgroundMap;\r\n }\r\n return false;\r\n });\r\n\r\n // 'isMounted' is used to prevent any async operation once the hook has been\r\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\r\n const isMounted = React.useRef(false);\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n });\r\n\r\n // Setup onTileTreeLoad events listening.\r\n // This is needed because we need to know when the imagery provider\r\n // is created, and be able to monitor to status change.\r\n React.useEffect(() => {\r\n const handleTileTreeLoad = (args: TileTreeOwner) => {\r\n\r\n // Ignore non-map tile trees\r\n if (args.tileTree instanceof ImageryMapTileTree) {\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }\r\n };\r\n\r\n IModelApp.tileAdmin.onTileTreeLoad.addListener(handleTileTreeLoad);\r\n\r\n return () => {\r\n IModelApp.tileAdmin.onTileTreeLoad.removeListener(handleTileTreeLoad);\r\n };\r\n\r\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\r\n\r\n // Setup onMapImageryChanged events listening.\r\n\r\n React.useEffect(() => {\r\n const handleMapImageryChanged = (args: Readonly<MapImagerySettings>) => {\r\n\r\n if (args.backgroundLayers.length !== (backgroundMapLayers ? backgroundMapLayers.length : 0)\r\n || args.overlayLayers.length !== (overlayMapLayers ? overlayMapLayers.length : 0)) {\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }\r\n };\r\n activeViewport?.displayStyle.settings.onMapImageryChanged.addListener(handleMapImageryChanged);\r\n\r\n return () => {\r\n activeViewport?.displayStyle.settings.onMapImageryChanged.removeListener(handleMapImageryChanged);\r\n };\r\n }, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);\r\n\r\n const handleProviderStatusChanged = React.useCallback((_args: MapLayerImageryProvider) => {\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }, [loadMapLayerSettingsFromViewport, activeViewport]);\r\n\r\n // Triggered whenever a provider status change\r\n React.useEffect(() => {\r\n backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });\r\n overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });\r\n\r\n return () => {\r\n backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });\r\n overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });\r\n };\r\n\r\n }, [backgroundMapLayers, overlayMapLayers, activeViewport, loadMapLayerSettingsFromViewport, handleProviderStatusChanged]);\r\n\r\n React.useEffect(() => {\r\n async function fetchWmsMapData() {\r\n const sources: MapLayerSource[] = [];\r\n const bases: MapLayerSource[] = [];\r\n const sourceLayers = await MapLayerSources.create(undefined, (fetchPublicMapLayerSources && !hideExternalMapLayersSection));\r\n if (!isMounted.current) {\r\n return;\r\n }\r\n\r\n // This is where the list of layers first gets populated... I need to update it\r\n // MapUrlDialog gets around knowing MapLayerManager exists and vice versa by affecting the viewports displayStyle which MapLayerManager is listening for\r\n // We know when displayStyle changes we've added a layer, this layer may not be a custom layer\r\n sourceLayers?.layers.forEach((source: MapLayerSource) => { sources.push(source); });\r\n setMapSources(sources);\r\n sourceLayers?.bases.forEach((source: MapLayerSource) => { bases.push(source); });\r\n setBaseSources(bases);\r\n }\r\n\r\n setLoadingSources(true);\r\n fetchWmsMapData().then(() => {\r\n if (isMounted.current) {\r\n setLoadingSources(false);\r\n }\r\n\r\n }).catch(() => {\r\n if (isMounted.current) {\r\n setLoadingSources(false);\r\n }\r\n });\r\n }, [setMapSources, fetchPublicMapLayerSources, hideExternalMapLayersSection]);\r\n\r\n const updateMapSources = React.useCallback(() => {\r\n const newSources: MapLayerSource[] = [];\r\n MapLayerSources.getInstance()?.layers?.forEach((sourceLayer: MapLayerSource) => { newSources.push(sourceLayer); });\r\n setMapSources(newSources);\r\n }, [setMapSources]);\r\n\r\n /**\r\n * Handle change events in the MapLayerSettingsService\r\n */\r\n React.useEffect(() => {\r\n const handleLayerSourceChange = async (changeType: MapLayerSourceChangeType, oldSource?: MapLayerSource, newSource?: MapLayerSource) => {\r\n const removeSourceOnly = (changeType === MapLayerSourceChangeType.Removed);\r\n const removeSource = (changeType === MapLayerSourceChangeType.Replaced || changeType === MapLayerSourceChangeType.Removed);\r\n const addSource = (changeType === MapLayerSourceChangeType.Replaced || changeType === MapLayerSourceChangeType.Added);\r\n\r\n if (removeSource) {\r\n if (oldSource) {\r\n const succeeded = MapLayerSources.removeLayerByName(oldSource.name);\r\n assert(succeeded);\r\n if (!succeeded) {\r\n return;\r\n }\r\n\r\n if (removeSourceOnly) {\r\n updateMapSources();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (addSource) {\r\n const sources = await MapLayerSources.addSourceToMapLayerSources(newSource);\r\n assert(sources !== undefined);\r\n if (sources) {\r\n updateMapSources();\r\n }\r\n }\r\n };\r\n MapLayerSettingsService.onLayerSourceChanged.addListener(handleLayerSourceChange);\r\n return (() => {\r\n MapLayerSettingsService.onLayerSourceChanged.removeListener(handleLayerSourceChange);\r\n });\r\n }, [updateMapSources]);\r\n\r\n // update when a different display style is loaded.\r\n React.useEffect(() => {\r\n const handleDisplayStyleChange = (vp: Viewport) => {\r\n loadMapLayerSettingsFromViewport(vp);\r\n };\r\n activeViewport?.onDisplayStyleChanged.addListener(handleDisplayStyleChange);\r\n return () => {\r\n activeViewport?.onDisplayStyleChanged.removeListener(handleDisplayStyleChange);\r\n };\r\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\r\n\r\n const handleOnMenuItemSelection = React.useCallback((action: string, mapLayerSettings: StyleMapLayerSettings) => {\r\n if (!activeViewport || !activeViewport.displayStyle)\r\n return;\r\n\r\n const indexInDisplayStyle = activeViewport.displayStyle.findMapLayerIndexByNameAndUrl(mapLayerSettings.name, mapLayerSettings.url, mapLayerSettings.isOverlay);\r\n if (indexInDisplayStyle < 0)\r\n return;\r\n\r\n switch (action) {\r\n case \"delete\":\r\n activeViewport.displayStyle.detachMapLayerByIndex(indexInDisplayStyle, mapLayerSettings.isOverlay);\r\n break;\r\n case \"zoom-to-layer\":\r\n activeViewport.displayStyle.viewMapLayerRange(indexInDisplayStyle, mapLayerSettings.isOverlay, activeViewport).then((status) => {\r\n if (!status) {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.NoRangeDefined\");\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} [${mapLayerSettings.name}]`));\r\n }\r\n }).catch((_error) => { });\r\n break;\r\n }\r\n activeViewport.invalidateRenderPlan();\r\n\r\n // force UI to update\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\r\n\r\n const handleLayerVisibilityChange = React.useCallback((mapLayerSettings: StyleMapLayerSettings) => {\r\n if (activeViewport) {\r\n const isVisible = !mapLayerSettings.visible;\r\n\r\n const displayStyle = activeViewport.displayStyle;\r\n const indexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndUrl(mapLayerSettings.name, mapLayerSettings.url, mapLayerSettings.isOverlay);\r\n if (-1 !== indexInDisplayStyle) {\r\n // update the display style\r\n displayStyle.changeMapLayerProps({ visible: isVisible }, indexInDisplayStyle, mapLayerSettings.isOverlay);\r\n activeViewport.invalidateRenderPlan();\r\n\r\n // force UI to update\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }\r\n }\r\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\r\n\r\n const handleMapLayersToggle = React.useCallback(() => {\r\n if (activeViewport) {\r\n const newState = !backgroundMapVisible;\r\n activeViewport.viewFlags = activeViewport.viewFlags.with(\"backgroundMap\", newState);\r\n setBackgroundMapVisible(newState);\r\n }\r\n }, [backgroundMapVisible, setBackgroundMapVisible, activeViewport]);\r\n\r\n const handleOnMapLayerDragEnd = React.useCallback((result: DropResult /* , _provided: ResponderProvided*/) => {\r\n const { destination, source } = result;\r\n\r\n if (!destination) // dropped outside of list\r\n return;\r\n\r\n // item was not moved\r\n if (destination.droppableId === source.droppableId && destination.index === source.index)\r\n return;\r\n\r\n let fromMapLayer: StyleMapLayerSettings | undefined;\r\n if (source.droppableId === \"overlayMapLayers\" && overlayMapLayers)\r\n fromMapLayer = overlayMapLayers[source.index];\r\n else if (source.droppableId === \"backgroundMapLayers\" && backgroundMapLayers)\r\n fromMapLayer = backgroundMapLayers[source.index];\r\n\r\n if (!fromMapLayer || !activeViewport)\r\n return;\r\n\r\n const displayStyle = activeViewport.displayStyle;\r\n let toMapLayer: StyleMapLayerSettings | undefined;\r\n let toIndexInDisplayStyle = -1;\r\n\r\n // If destination.index is undefined then the user dropped the map at the end of list of maps. To get the \"actual\" index in the style, look up index in style by name.\r\n // We need to do this because the order of layers in UI are reversed so higher layers appear above lower layers.\r\n if (undefined !== destination.index) {\r\n if (destination.droppableId === \"overlayMapLayers\" && overlayMapLayers)\r\n toMapLayer = overlayMapLayers[destination.index];\r\n else if (destination.droppableId === \"backgroundMapLayers\" && backgroundMapLayers)\r\n toMapLayer = backgroundMapLayers[destination.index];\r\n if (toMapLayer)\r\n toIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndUrl(toMapLayer.name, toMapLayer.url, toMapLayer.isOverlay);\r\n }\r\n\r\n const fromIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndUrl(fromMapLayer.name, fromMapLayer.url, fromMapLayer.isOverlay);\r\n if (fromIndexInDisplayStyle < 0)\r\n return;\r\n\r\n if (destination.droppableId !== source.droppableId) {\r\n // see if we moved from \"overlayMapLayers\" to \"backgroundMapLayers\" or vice-versa\r\n const layerSettings = activeViewport.displayStyle.mapLayerAtIndex(fromIndexInDisplayStyle, fromMapLayer.isOverlay);\r\n if (layerSettings) {\r\n activeViewport.displayStyle.detachMapLayerByIndex(fromIndexInDisplayStyle, fromMapLayer.isOverlay);\r\n\r\n // Manually reverse index when moved from one section to the other\r\n if (fromMapLayer.isOverlay && backgroundMapLayers) {\r\n toIndexInDisplayStyle = displayStyle.backgroundMapLayers.length - destination.index;\r\n } else if (!fromMapLayer.isOverlay && overlayMapLayers) {\r\n toIndexInDisplayStyle = overlayMapLayers.length - destination.index;\r\n }\r\n\r\n activeViewport.displayStyle.attachMapLayerSettings(layerSettings, !fromMapLayer.isOverlay, toIndexInDisplayStyle);\r\n }\r\n } else {\r\n if (undefined === destination.index) {\r\n displayStyle.moveMapLayerToBottom(fromIndexInDisplayStyle, destination.droppableId === \"overlayMapLayers\");\r\n } else {\r\n if (toMapLayer) {\r\n if (toIndexInDisplayStyle !== -1)\r\n displayStyle.moveMapLayerToIndex(fromIndexInDisplayStyle, toIndexInDisplayStyle, toMapLayer.isOverlay);\r\n }\r\n }\r\n }\r\n\r\n // apply display style change to view\r\n activeViewport.invalidateRenderPlan();\r\n\r\n // force UI to update\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }, [loadMapLayerSettingsFromViewport, activeViewport, overlayMapLayers, backgroundMapLayers]);\r\n\r\n const handleRefreshFromStyle = React.useCallback(() => {\r\n if (activeViewport)\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\r\n\r\n const [baseMapPanelLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Basemap.BaseMapPanelTitle\"));\r\n\r\n return (\r\n <SourceMapContext.Provider value={{\r\n activeViewport,\r\n loadingSources,\r\n sources: mapSources ? mapSources : [],\r\n bases: baseSources ? baseSources : [],\r\n refreshFromStyle: handleRefreshFromStyle,\r\n backgroundLayers: backgroundMapLayers,\r\n overlayLayers: overlayMapLayers,\r\n mapTypesOptions: mapLayerOptions?.mapTypeOptions,\r\n }}>\r\n <div className=\"map-manager-top-header\">\r\n <span className=\"map-manager-header-label\">{baseMapPanelLabel}</span>\r\n <div className=\"map-manager-header-buttons-group\">\r\n <ToggleSwitch className=\"map-manager-toggle\" checked={backgroundMapVisible} onChange={handleMapLayersToggle} />\r\n <MapLayerSettingsPopupButton />\r\n </div>\r\n </div>\r\n\r\n <div className=\"map-manager-container\">\r\n\r\n <div className=\"map-manager-basemap\">\r\n <BasemapPanel />\r\n </div>\r\n {!hideExternalMapLayersSection &&\r\n <DragDropContext onDragEnd={handleOnMapLayerDragEnd}>\r\n <div className=\"map-manager-layer-wrapper\">\r\n <div className=\"map-manager-underlays\" >\r\n <span className=\"map-manager-underlays-label\">{underlaysLabel}</span><AttachLayerPopupButton isOverlay={false} />\r\n </div>\r\n <MapLayerDroppable\r\n isOverlay={false}\r\n layersList={backgroundMapLayers}\r\n mapTypesOptions={props.mapLayerOptions?.mapTypeOptions}\r\n getContainerForClone={props.getContainerForClone as any}\r\n activeViewport={props.activeViewport}\r\n onMenuItemSelected={handleOnMenuItemSelection}\r\n onItemVisibilityToggleClicked={handleLayerVisibilityChange}\r\n onItemEdited={handleRefreshFromStyle} />\r\n </div>\r\n\r\n <div className=\"map-manager-layer-wrapper\">\r\n <div className=\"map-manager-overlays\" >\r\n <span className=\"map-manager-overlays-label\">{overlaysLabel}</span><AttachLayerPopupButton isOverlay={true} />\r\n </div>\r\n <MapLayerDroppable\r\n isOverlay={true}\r\n layersList={overlayMapLayers}\r\n mapTypesOptions={props.mapLayerOptions?.mapTypeOptions}\r\n getContainerForClone={props.getContainerForClone as any}\r\n activeViewport={props.activeViewport}\r\n onMenuItemSelected={handleOnMenuItemSelection}\r\n onItemVisibilityToggleClicked={handleLayerVisibilityChange}\r\n onItemEdited={handleRefreshFromStyle} />\r\n </div>\r\n </DragDropContext>\r\n }\r\n </div >\r\n </SourceMapContext.Provider >\r\n );\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"MapLayerManager.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapLayerManager.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n// cSpell:ignore droppable Sublayer Basemap\r\n\r\n// the following quiet warning caused by react-beautiful-dnd package\r\n/* eslint-disable @typescript-eslint/unbound-method */\r\n\r\nimport \"./MapLayerManager.scss\";\r\nimport * as React from \"react\";\r\nimport { DragDropContext, DropResult } from \"react-beautiful-dnd\";\r\nimport { assert, BentleyError } from \"@itwin/core-bentley\";\r\nimport { MapImagerySettings, MapSubLayerProps, MapSubLayerSettings } from \"@itwin/core-common\";\r\nimport {\r\n ImageryMapTileTree, IModelApp, MapLayerImageryProvider, MapLayerSource, MapLayerSources, NotifyMessageDetails, OutputMessagePriority,\r\n ScreenViewport, TileTreeOwner, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { ToggleSwitch } from \"@itwin/itwinui-react\";\r\nimport { MapLayerPreferences, MapLayerSourceChangeType } from \"../../MapLayerPreferences\";\r\nimport { MapLayerOptions, MapTypesOptions, StyleMapLayerSettings } from \"../Interfaces\";\r\nimport { MapLayersUiItemsProvider } from \"../MapLayersUiItemsProvider\";\r\nimport { AttachLayerPopupButton } from \"./AttachLayerPopupButton\";\r\nimport { BasemapPanel } from \"./BasemapPanel\";\r\nimport { MapLayerDroppable } from \"./MapLayerDroppable\";\r\nimport { MapLayerSettingsPopupButton } from \"./MapLayerSettingsPopupButton\";\r\n\r\n/** @internal */\r\nexport interface SourceMapContextProps {\r\n readonly sources: MapLayerSource[];\r\n readonly loadingSources: boolean;\r\n readonly bases: MapLayerSource[];\r\n readonly refreshFromStyle: () => void;\r\n readonly activeViewport?: ScreenViewport;\r\n readonly backgroundLayers?: StyleMapLayerSettings[];\r\n readonly overlayLayers?: StyleMapLayerSettings[];\r\n readonly mapTypesOptions?: MapTypesOptions;\r\n}\r\n\r\n/** @internal */\r\nexport const SourceMapContext = React.createContext<SourceMapContextProps>({ // eslint-disable-line @typescript-eslint/naming-convention\r\n sources: [],\r\n loadingSources: false,\r\n bases: [],\r\n refreshFromStyle: () => { },\r\n});\r\n\r\n/** @internal */\r\nexport function useSourceMapContext(): SourceMapContextProps {\r\n return React.useContext(SourceMapContext);\r\n}\r\n\r\nfunction getSubLayerProps(subLayerSettings: MapSubLayerSettings[]): MapSubLayerProps[] {\r\n return subLayerSettings.map((subLayer) => subLayer.toJSON());\r\n}\r\n\r\nfunction getMapLayerSettingsFromViewport(viewport: Viewport, getBackgroundMap: boolean, populateSubLayers = true): StyleMapLayerSettings[] | undefined {\r\n const displayStyle = viewport.displayStyle;\r\n if (!displayStyle)\r\n return undefined;\r\n\r\n const layers = new Array<StyleMapLayerSettings>();\r\n\r\n const displayStyleLayers = (getBackgroundMap ? displayStyle.backgroundMapLayers : displayStyle.overlayMapLayers);\r\n for (let layerIdx = 0; layerIdx < displayStyleLayers.length; layerIdx++) {\r\n const layerSettings = displayStyleLayers[layerIdx];\r\n const isOverlay = !getBackgroundMap;\r\n const layerProvider = viewport.getMapLayerImageryProvider(layerIdx, isOverlay);\r\n layers.push({\r\n visible: layerSettings.visible,\r\n name: layerSettings.name,\r\n url: layerSettings.url,\r\n transparency: layerSettings.transparency,\r\n transparentBackground: layerSettings.transparentBackground,\r\n subLayers: populateSubLayers ? getSubLayerProps(layerSettings.subLayers) : undefined,\r\n showSubLayers: false,\r\n isOverlay,\r\n provider: layerProvider,\r\n });\r\n }\r\n\r\n // since we want to display higher level maps above lower maps in UI reverse their order here.\r\n return layers.reverse();\r\n}\r\n\r\ninterface MapLayerManagerProps {\r\n getContainerForClone: () => HTMLElement;\r\n activeViewport: ScreenViewport;\r\n mapLayerOptions?: MapLayerOptions;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function MapLayerManager(props: MapLayerManagerProps) {\r\n const [mapSources, setMapSources] = React.useState<MapLayerSource[] | undefined>();\r\n const [loadingSources, setLoadingSources] = React.useState(false);\r\n const [baseSources, setBaseSources] = React.useState<MapLayerSource[] | undefined>();\r\n const [overlaysLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Widget.OverlayLayers\"));\r\n const [underlaysLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Widget.BackgroundLayers\"));\r\n const { activeViewport, mapLayerOptions } = props;\r\n const hideExternalMapLayersSection = mapLayerOptions?.hideExternalMapLayers ? mapLayerOptions.hideExternalMapLayers : false;\r\n const fetchPublicMapLayerSources = mapLayerOptions?.fetchPublicMapLayerSources ? mapLayerOptions.fetchPublicMapLayerSources : false;\r\n\r\n // map layer settings from display style\r\n const [backgroundMapLayers, setBackgroundMapLayers] = React.useState<StyleMapLayerSettings[] | undefined>(getMapLayerSettingsFromViewport(activeViewport, true));\r\n const [overlayMapLayers, setOverlayMapLayers] = React.useState<StyleMapLayerSettings[] | undefined>(getMapLayerSettingsFromViewport(activeViewport, false));\r\n\r\n const loadMapLayerSettingsFromViewport = React.useCallback((viewport: Viewport) => {\r\n setBackgroundMapLayers(getMapLayerSettingsFromViewport(viewport, true));\r\n setOverlayMapLayers(getMapLayerSettingsFromViewport(viewport, false));\r\n }, [setBackgroundMapLayers, setOverlayMapLayers]);\r\n\r\n const [backgroundMapVisible, setBackgroundMapVisible] = React.useState(() => {\r\n if (activeViewport) {\r\n return activeViewport.viewFlags.backgroundMap;\r\n }\r\n return false;\r\n });\r\n\r\n // 'isMounted' is used to prevent any async operation once the hook has been\r\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\r\n const isMounted = React.useRef(false);\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n });\r\n\r\n // Setup onTileTreeLoad events listening.\r\n // This is needed because we need to know when the imagery provider\r\n // is created, and be able to monitor to status change.\r\n React.useEffect(() => {\r\n const handleTileTreeLoad = (args: TileTreeOwner) => {\r\n\r\n // Ignore non-map tile trees\r\n if (args.tileTree instanceof ImageryMapTileTree) {\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }\r\n };\r\n\r\n IModelApp.tileAdmin.onTileTreeLoad.addListener(handleTileTreeLoad);\r\n\r\n return () => {\r\n IModelApp.tileAdmin.onTileTreeLoad.removeListener(handleTileTreeLoad);\r\n };\r\n\r\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\r\n\r\n // Setup onMapImageryChanged events listening.\r\n\r\n React.useEffect(() => {\r\n const handleMapImageryChanged = (args: Readonly<MapImagerySettings>) => {\r\n\r\n if (args.backgroundLayers.length !== (backgroundMapLayers ? backgroundMapLayers.length : 0)\r\n || args.overlayLayers.length !== (overlayMapLayers ? overlayMapLayers.length : 0)) {\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }\r\n };\r\n activeViewport?.displayStyle.settings.onMapImageryChanged.addListener(handleMapImageryChanged);\r\n\r\n return () => {\r\n activeViewport?.displayStyle.settings.onMapImageryChanged.removeListener(handleMapImageryChanged);\r\n };\r\n }, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);\r\n\r\n const handleProviderStatusChanged = React.useCallback((_args: MapLayerImageryProvider) => {\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }, [loadMapLayerSettingsFromViewport, activeViewport]);\r\n\r\n // Triggered whenever a provider status change\r\n React.useEffect(() => {\r\n backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });\r\n overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });\r\n\r\n return () => {\r\n backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });\r\n overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });\r\n };\r\n\r\n }, [backgroundMapLayers, overlayMapLayers, activeViewport, loadMapLayerSettingsFromViewport, handleProviderStatusChanged]);\r\n\r\n React.useEffect(() => {\r\n async function fetchWmsMapData() {\r\n const sources: MapLayerSource[] = [];\r\n const bases: MapLayerSource[] = [];\r\n const sourceLayers = await MapLayerSources.create(undefined, (fetchPublicMapLayerSources && !hideExternalMapLayersSection));\r\n\r\n const iModel = IModelApp.viewManager.selectedView ? IModelApp.viewManager.selectedView.iModel : undefined;\r\n if (iModel && iModel.iTwinId && iModel.iModelId) {\r\n try {\r\n const preferenceSources = await MapLayerPreferences.getSources(iModel.iTwinId, iModel.iModelId);\r\n for (const source of preferenceSources)\r\n await MapLayerSources.addSourceToMapLayerSources(source);\r\n } catch (err) {\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.ErrorLoadingLayers\"), BentleyError.getErrorMessage(err)));\r\n }\r\n }\r\n\r\n if (!isMounted.current) {\r\n return;\r\n }\r\n\r\n // This is where the list of layers first gets populated... I need to update it\r\n // MapUrlDialog gets around knowing MapLayerManager exists and vice versa by affecting the viewports displayStyle which MapLayerManager is listening for\r\n // We know when displayStyle changes we've added a layer, this layer may not be a custom layer\r\n sourceLayers?.layers.forEach((source: MapLayerSource) => { sources.push(source); });\r\n setMapSources(sources);\r\n sourceLayers?.bases.forEach((source: MapLayerSource) => { bases.push(source); });\r\n setBaseSources(bases);\r\n }\r\n\r\n setLoadingSources(true);\r\n fetchWmsMapData().then(() => {\r\n if (isMounted.current) {\r\n setLoadingSources(false);\r\n }\r\n\r\n }).catch(() => {\r\n if (isMounted.current) {\r\n setLoadingSources(false);\r\n }\r\n });\r\n }, [setMapSources, fetchPublicMapLayerSources, hideExternalMapLayersSection]);\r\n\r\n const updateMapSources = React.useCallback(() => {\r\n const newSources: MapLayerSource[] = [];\r\n MapLayerSources.getInstance()?.layers?.forEach((sourceLayer: MapLayerSource) => { newSources.push(sourceLayer); });\r\n setMapSources(newSources);\r\n }, [setMapSources]);\r\n\r\n /**\r\n * Handle change events in the MapLayerPreferences\r\n */\r\n React.useEffect(() => {\r\n const handleLayerSourceChange = async (changeType: MapLayerSourceChangeType, oldSource?: MapLayerSource, newSource?: MapLayerSource) => {\r\n const removeSourceOnly = (changeType === MapLayerSourceChangeType.Removed);\r\n const removeSource = (changeType === MapLayerSourceChangeType.Replaced || changeType === MapLayerSourceChangeType.Removed);\r\n const addSource = (changeType === MapLayerSourceChangeType.Replaced || changeType === MapLayerSourceChangeType.Added);\r\n\r\n if (removeSource) {\r\n if (oldSource) {\r\n const succeeded = MapLayerSources.removeLayerByName(oldSource.name);\r\n assert(succeeded);\r\n if (!succeeded) {\r\n return;\r\n }\r\n\r\n if (removeSourceOnly) {\r\n updateMapSources();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (addSource) {\r\n const sources = await MapLayerSources.addSourceToMapLayerSources(newSource);\r\n assert(sources !== undefined);\r\n if (sources) {\r\n updateMapSources();\r\n }\r\n }\r\n };\r\n MapLayerPreferences.onLayerSourceChanged.addListener(handleLayerSourceChange);\r\n return (() => {\r\n MapLayerPreferences.onLayerSourceChanged.removeListener(handleLayerSourceChange);\r\n });\r\n }, [updateMapSources]);\r\n\r\n // update when a different display style is loaded.\r\n React.useEffect(() => {\r\n const handleDisplayStyleChange = (vp: Viewport) => {\r\n loadMapLayerSettingsFromViewport(vp);\r\n };\r\n activeViewport?.onDisplayStyleChanged.addListener(handleDisplayStyleChange);\r\n return () => {\r\n activeViewport?.onDisplayStyleChanged.removeListener(handleDisplayStyleChange);\r\n };\r\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\r\n\r\n const handleOnMenuItemSelection = React.useCallback((action: string, mapLayerSettings: StyleMapLayerSettings) => {\r\n if (!activeViewport || !activeViewport.displayStyle)\r\n return;\r\n\r\n const indexInDisplayStyle = activeViewport.displayStyle.findMapLayerIndexByNameAndUrl(mapLayerSettings.name, mapLayerSettings.url, mapLayerSettings.isOverlay);\r\n if (indexInDisplayStyle < 0)\r\n return;\r\n\r\n switch (action) {\r\n case \"delete\":\r\n activeViewport.displayStyle.detachMapLayerByIndex(indexInDisplayStyle, mapLayerSettings.isOverlay);\r\n break;\r\n case \"zoom-to-layer\":\r\n activeViewport.displayStyle.viewMapLayerRange(indexInDisplayStyle, mapLayerSettings.isOverlay, activeViewport).then((status) => {\r\n if (!status) {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.NoRangeDefined\");\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} [${mapLayerSettings.name}]`));\r\n }\r\n }).catch((_error) => { });\r\n break;\r\n }\r\n activeViewport.invalidateRenderPlan();\r\n\r\n // force UI to update\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\r\n\r\n const handleLayerVisibilityChange = React.useCallback((mapLayerSettings: StyleMapLayerSettings) => {\r\n if (activeViewport) {\r\n const isVisible = !mapLayerSettings.visible;\r\n\r\n const displayStyle = activeViewport.displayStyle;\r\n const indexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndUrl(mapLayerSettings.name, mapLayerSettings.url, mapLayerSettings.isOverlay);\r\n if (-1 !== indexInDisplayStyle) {\r\n // update the display style\r\n displayStyle.changeMapLayerProps({ visible: isVisible }, indexInDisplayStyle, mapLayerSettings.isOverlay);\r\n activeViewport.invalidateRenderPlan();\r\n\r\n // force UI to update\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }\r\n }\r\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\r\n\r\n const handleMapLayersToggle = React.useCallback(() => {\r\n if (activeViewport) {\r\n const newState = !backgroundMapVisible;\r\n activeViewport.viewFlags = activeViewport.viewFlags.with(\"backgroundMap\", newState);\r\n setBackgroundMapVisible(newState);\r\n }\r\n }, [backgroundMapVisible, setBackgroundMapVisible, activeViewport]);\r\n\r\n const handleOnMapLayerDragEnd = React.useCallback((result: DropResult /* , _provided: ResponderProvided*/) => {\r\n const { destination, source } = result;\r\n\r\n if (!destination) // dropped outside of list\r\n return;\r\n\r\n // item was not moved\r\n if (destination.droppableId === source.droppableId && destination.index === source.index)\r\n return;\r\n\r\n let fromMapLayer: StyleMapLayerSettings | undefined;\r\n if (source.droppableId === \"overlayMapLayers\" && overlayMapLayers)\r\n fromMapLayer = overlayMapLayers[source.index];\r\n else if (source.droppableId === \"backgroundMapLayers\" && backgroundMapLayers)\r\n fromMapLayer = backgroundMapLayers[source.index];\r\n\r\n if (!fromMapLayer || !activeViewport)\r\n return;\r\n\r\n const displayStyle = activeViewport.displayStyle;\r\n let toMapLayer: StyleMapLayerSettings | undefined;\r\n let toIndexInDisplayStyle = -1;\r\n\r\n // If destination.index is undefined then the user dropped the map at the end of list of maps. To get the \"actual\" index in the style, look up index in style by name.\r\n // We need to do this because the order of layers in UI are reversed so higher layers appear above lower layers.\r\n if (undefined !== destination.index) {\r\n if (destination.droppableId === \"overlayMapLayers\" && overlayMapLayers)\r\n toMapLayer = overlayMapLayers[destination.index];\r\n else if (destination.droppableId === \"backgroundMapLayers\" && backgroundMapLayers)\r\n toMapLayer = backgroundMapLayers[destination.index];\r\n if (toMapLayer)\r\n toIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndUrl(toMapLayer.name, toMapLayer.url, toMapLayer.isOverlay);\r\n }\r\n\r\n const fromIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndUrl(fromMapLayer.name, fromMapLayer.url, fromMapLayer.isOverlay);\r\n if (fromIndexInDisplayStyle < 0)\r\n return;\r\n\r\n if (destination.droppableId !== source.droppableId) {\r\n // see if we moved from \"overlayMapLayers\" to \"backgroundMapLayers\" or vice-versa\r\n const layerSettings = activeViewport.displayStyle.mapLayerAtIndex(fromIndexInDisplayStyle, fromMapLayer.isOverlay);\r\n if (layerSettings) {\r\n activeViewport.displayStyle.detachMapLayerByIndex(fromIndexInDisplayStyle, fromMapLayer.isOverlay);\r\n\r\n // Manually reverse index when moved from one section to the other\r\n if (fromMapLayer.isOverlay && backgroundMapLayers) {\r\n toIndexInDisplayStyle = displayStyle.backgroundMapLayers.length - destination.index;\r\n } else if (!fromMapLayer.isOverlay && overlayMapLayers) {\r\n toIndexInDisplayStyle = overlayMapLayers.length - destination.index;\r\n }\r\n\r\n activeViewport.displayStyle.attachMapLayerSettings(layerSettings, !fromMapLayer.isOverlay, toIndexInDisplayStyle);\r\n }\r\n } else {\r\n if (undefined === destination.index) {\r\n displayStyle.moveMapLayerToBottom(fromIndexInDisplayStyle, destination.droppableId === \"overlayMapLayers\");\r\n } else {\r\n if (toMapLayer) {\r\n if (toIndexInDisplayStyle !== -1)\r\n displayStyle.moveMapLayerToIndex(fromIndexInDisplayStyle, toIndexInDisplayStyle, toMapLayer.isOverlay);\r\n }\r\n }\r\n }\r\n\r\n // apply display style change to view\r\n activeViewport.invalidateRenderPlan();\r\n\r\n // force UI to update\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }, [loadMapLayerSettingsFromViewport, activeViewport, overlayMapLayers, backgroundMapLayers]);\r\n\r\n const handleRefreshFromStyle = React.useCallback(() => {\r\n if (activeViewport)\r\n loadMapLayerSettingsFromViewport(activeViewport);\r\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\r\n\r\n const [baseMapPanelLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Basemap.BaseMapPanelTitle\"));\r\n\r\n return (\r\n <SourceMapContext.Provider value={{\r\n activeViewport,\r\n loadingSources,\r\n sources: mapSources ? mapSources : [],\r\n bases: baseSources ? baseSources : [],\r\n refreshFromStyle: handleRefreshFromStyle,\r\n backgroundLayers: backgroundMapLayers,\r\n overlayLayers: overlayMapLayers,\r\n mapTypesOptions: mapLayerOptions?.mapTypeOptions,\r\n }}>\r\n <div className=\"map-manager-top-header\">\r\n <span className=\"map-manager-header-label\">{baseMapPanelLabel}</span>\r\n <div className=\"map-manager-header-buttons-group\">\r\n <ToggleSwitch className=\"map-manager-toggle\" checked={backgroundMapVisible} onChange={handleMapLayersToggle} />\r\n <MapLayerSettingsPopupButton />\r\n </div>\r\n </div>\r\n\r\n <div className=\"map-manager-container\">\r\n\r\n <div className=\"map-manager-basemap\">\r\n <BasemapPanel />\r\n </div>\r\n {!hideExternalMapLayersSection &&\r\n <DragDropContext onDragEnd={handleOnMapLayerDragEnd}>\r\n <div className=\"map-manager-layer-wrapper\">\r\n <div className=\"map-manager-underlays\" >\r\n <span className=\"map-manager-underlays-label\">{underlaysLabel}</span><AttachLayerPopupButton isOverlay={false} />\r\n </div>\r\n <MapLayerDroppable\r\n isOverlay={false}\r\n layersList={backgroundMapLayers}\r\n mapTypesOptions={props.mapLayerOptions?.mapTypeOptions}\r\n getContainerForClone={props.getContainerForClone as any}\r\n activeViewport={props.activeViewport}\r\n onMenuItemSelected={handleOnMenuItemSelection}\r\n onItemVisibilityToggleClicked={handleLayerVisibilityChange}\r\n onItemEdited={handleRefreshFromStyle} />\r\n </div>\r\n\r\n <div className=\"map-manager-layer-wrapper\">\r\n <div className=\"map-manager-overlays\" >\r\n <span className=\"map-manager-overlays-label\">{overlaysLabel}</span><AttachLayerPopupButton isOverlay={true} />\r\n </div>\r\n <MapLayerDroppable\r\n isOverlay={true}\r\n layersList={overlayMapLayers}\r\n mapTypesOptions={props.mapLayerOptions?.mapTypeOptions}\r\n getContainerForClone={props.getContainerForClone as any}\r\n activeViewport={props.activeViewport}\r\n onMenuItemSelected={handleOnMenuItemSelection}\r\n onItemVisibilityToggleClicked={handleLayerVisibilityChange}\r\n onItemEdited={handleRefreshFromStyle} />\r\n </div>\r\n </DragDropContext>\r\n }\r\n </div >\r\n </SourceMapContext.Provider >\r\n );\r\n}\r\n\r\n"]}
@@ -196,13 +196,6 @@ button.map-manager-item-visibility {
196
196
  margin-left: 4px;
197
197
  }
198
198
 
199
- .map-manager-select {
200
- height: 2em;
201
- flex: auto;
202
- width: 100%;
203
- min-width: 100px;
204
- }
205
-
206
199
  .map-manager-add {
207
200
  height: 2em;
208
201
  flex: initial;
@@ -1 +1 @@
1
- {"version":3,"file":"MapManagerSettings.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapManagerSettings.tsx"],"names":[],"mappings":";AAWA,OAAO,2BAA2B,CAAC;AAsCnC,wBAAgB,kBAAkB,gBA4KjC"}
1
+ {"version":3,"file":"MapManagerSettings.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapManagerSettings.tsx"],"names":[],"mappings":";AAWA,OAAO,2BAA2B,CAAC;AAuCnC,wBAAgB,kBAAkB,gBAiNjC"}