@memberjunction/ng-dashboard-viewer 6.1.4 → 6.2.0-edge.1

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 (60) hide show
  1. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts +58 -8
  2. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts.map +1 -1
  3. package/dist/lib/config-dialogs/confirm-dialog.component.js +119 -17
  4. package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -1
  5. package/dist/lib/config-panels/artifact-config-panel.component.d.ts +63 -11
  6. package/dist/lib/config-panels/artifact-config-panel.component.d.ts.map +1 -1
  7. package/dist/lib/config-panels/artifact-config-panel.component.js +152 -48
  8. package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
  9. package/dist/lib/config-panels/query-config-panel.component.d.ts +57 -9
  10. package/dist/lib/config-panels/query-config-panel.component.d.ts.map +1 -1
  11. package/dist/lib/config-panels/query-config-panel.component.js +142 -46
  12. package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
  13. package/dist/lib/config-panels/view-config-panel.component.d.ts +69 -11
  14. package/dist/lib/config-panels/view-config-panel.component.d.ts.map +1 -1
  15. package/dist/lib/config-panels/view-config-panel.component.js +165 -49
  16. package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
  17. package/dist/lib/config-panels/weburl-config-panel.component.d.ts +42 -6
  18. package/dist/lib/config-panels/weburl-config-panel.component.d.ts.map +1 -1
  19. package/dist/lib/config-panels/weburl-config-panel.component.js +113 -41
  20. package/dist/lib/config-panels/weburl-config-panel.component.js.map +1 -1
  21. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
  22. package/dist/lib/dashboard-browser/dashboard-browser.component.js +7 -4
  23. package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
  24. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +163 -12
  25. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
  26. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +332 -78
  27. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
  28. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts +63 -9
  29. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts.map +1 -1
  30. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js +172 -66
  31. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
  32. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts +11 -1
  33. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts.map +1 -1
  34. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js +30 -10
  35. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
  36. package/dist/lib/models/dashboard-types.d.ts +8 -0
  37. package/dist/lib/models/dashboard-types.d.ts.map +1 -1
  38. package/dist/lib/models/dashboard-types.js +21 -5
  39. package/dist/lib/models/dashboard-types.js.map +1 -1
  40. package/dist/lib/parts/artifact-part.component.d.ts +63 -7
  41. package/dist/lib/parts/artifact-part.component.d.ts.map +1 -1
  42. package/dist/lib/parts/artifact-part.component.js +98 -22
  43. package/dist/lib/parts/artifact-part.component.js.map +1 -1
  44. package/dist/lib/parts/query-part.component.d.ts +26 -4
  45. package/dist/lib/parts/query-part.component.d.ts.map +1 -1
  46. package/dist/lib/parts/query-part.component.js +62 -18
  47. package/dist/lib/parts/query-part.component.js.map +1 -1
  48. package/dist/lib/parts/view-part.component.d.ts +21 -3
  49. package/dist/lib/parts/view-part.component.d.ts.map +1 -1
  50. package/dist/lib/parts/view-part.component.js +55 -19
  51. package/dist/lib/parts/view-part.component.js.map +1 -1
  52. package/dist/lib/parts/weburl-part.component.d.ts +29 -5
  53. package/dist/lib/parts/weburl-part.component.d.ts.map +1 -1
  54. package/dist/lib/parts/weburl-part.component.js +63 -15
  55. package/dist/lib/parts/weburl-part.component.js.map +1 -1
  56. package/dist/lib/services/golden-layout-wrapper.service.d.ts +65 -5
  57. package/dist/lib/services/golden-layout-wrapper.service.d.ts.map +1 -1
  58. package/dist/lib/services/golden-layout-wrapper.service.js +135 -27
  59. package/dist/lib/services/golden-layout-wrapper.service.js.map +1 -1
  60. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"golden-layout-wrapper.service.js","sourceRoot":"","sources":["../../../src/lib/services/golden-layout-wrapper.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EACH,YAAY,EAKZ,aAAa,EAChB,MAAM,eAAe,CAAC;;AAyCvB;;;;;;GAMG;AAEH,MAAM,OAAO,0BAA0B;IAC3B,YAAY,GAAG,KAAK,CAAC;IACrB,OAAO,GAA2B,IAAI,CAAC;IACvC,iBAAiB,GAAuB,IAAI,CAAC;IAC7C,iBAAiB,GAAiC,IAAI,CAAC;IACvD,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;IACtD,UAAU,GAAG,KAAK,CAAC;IAC3B,oEAAoE;IAC5D,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,gDAAgD;IACzC,eAAe,GAAG,IAAI,OAAO,EAAsB,CAAC;IAE3D,qCAAqC;IAC9B,aAAa,GAAG,IAAI,OAAO,EAAU,CAAC;IAE7C,iDAAiD;IAC1C,gBAAgB,GAAG,IAAI,OAAO,EAA2C,CAAC;IAEjF,oDAAoD;IAC7C,eAAe,GAAG,IAAI,OAAO,EAAU,CAAC;IAE/C,+BAA+B;IACxB,OAAO,GAAG,IAAI,eAAe,CAAW,EAAE,CAAC,CAAC;IAEnD,iEAAiE;IACjE,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED;;;;;;OAMG;IACI,UAAU,CACb,SAAsB,EACtB,WAAwC,EACxC,gBAAuC,EACvC,SAAS,GAAG,KAAK;QAEjB,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,2DAA2D;QAC3D,4FAA4F;QAC5F,6EAA6E;QAC7E,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAC5B,SAAS,EACT,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAA4C,EACrF,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAA8C,CAC9D,CAAC;QAEhC,sDAAsD;QACrD,IAAI,CAAC,OAAoE,CAAC,gCAAgC,GAAG,IAAI,CAAC;QAEnH,sBAAsB;QACtB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACjC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAErD,gCAAgC;QAChC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAElC,uDAAuD;QACvD,MAAM,IAAI,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAE9C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACK,iBAAiB,CAAC,WAAwC;QAC9D,4EAA4E;QAC5E,mFAAmF;QACnF,MAAM,YAAY,GAAiB;YAC/B,QAAQ,EAAE;gBACN,cAAc,EAAE,IAAI,CAAC,UAAU;aAClC;YACD,MAAM,EAAE;gBACJ,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,KAAK;gBACf,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;aACzC;YACD,IAAI,EAAE,SAAS;SAClB,CAAC;QAEF,uEAAuE;QACvE,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,CAAC;gBACD,mDAAmD;gBACnD,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;oBACzC,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;oBACpF,OAAO,YAAY,CAAC;gBACxB,CAAC;gBAED,yEAAyE;gBACzE,MAAM,eAAe,GAAG,YAAY,CAAC,YAAY,CAAC,WAAW,CAAiB,CAAC;gBAE/E,oDAAoD;gBACpD,OAAO;oBACH,GAAG,eAAe;oBAClB,QAAQ,EAAE;wBACN,GAAG,eAAe,CAAC,QAAQ;wBAC3B,GAAG,YAAY,CAAC,QAAQ;qBAC3B;oBACD,MAAM,EAAE;wBACJ,GAAG,eAAe,CAAC,MAAM;wBACzB,GAAG,YAAY,CAAC,MAAM;qBACzB;iBACJ,CAAC;YACN,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,qEAAqE,EAAE,GAAG,CAAC,CAAC;gBAC1F,uCAAuC;YAC3C,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAED;;;OAGG;IACK,mBAAmB,CAAC,MAA4B;QACpD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,8DAA8D;QAC9D,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,IAAa;QACpC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,UAAU,GAAG,IAA+B,CAAC;QAEnD,mBAAmB;QACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,yCAAyC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAA0B,CAAC;QAC/D,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClC,OAAO,KAAK,CAAC;gBACjB,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,UAAU;QACb,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,CAAC;YAC5D,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,0BAA0B,CAC9B,SAA6B,EAC7B,WAAwD;QAExD,uCAAuC;QACvC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAkC,CAAC;QAE3D,iDAAiD;QACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,SAAS,GAAG,yBAAyB,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC;QAEhC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,SAAS,GAAG,qDAAqD,CAAC;QAC9E,CAAC;aAAM,CAAC;YACJ,+BAA+B;YAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAE5C,mDAAmD;YACnD,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAEhC,mDAAmD;YACnD,wDAAwD;YACxD,sFAAsF;YACtF,uFAAuF;YACvF,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,kBAAkB,CAAC;YACnD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAExC,mDAAmD;YACnD,gEAAgE;YAChE,OAAO,CAAC,SAAS,GAAG;;;;;aAKnB,CAAC;YAEF,0BAA0B;YAC1B,SAAS,CAAC,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;gBACxC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACpC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,yDAAyD;YACzD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACtB,6CAA6C;gBAC7C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpC,qCAAqC;oBACrC,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,4BAA4B;oBACpD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACzB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBAC3C,CAAC;oBACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrC,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QAED,wDAAwD;QACxD,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEvC,uCAAuC;QACvC,OAAO;YACH,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,KAAK;SACjB,CAAC;IACN,CAAC;IAED;;OAEG;IACK,4BAA4B,CAAC,UAA8B;QAC/D,4CAA4C;IAChD,CAAC;IAED;;OAEG;IACI,aAAa;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAClC,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,KAAqB,EAAE,SAA0B;QAC7D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO;QACX,CAAC;QAED,2DAA2D;QAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5C,IAAI,aAAa,EAAE,CAAC;YAChB,MAAM,eAAe,GAAwB;gBACzC,IAAI,EAAE,WAAW;gBACjB,aAAa,EAAE,iBAAiB;gBAChC,cAAc,EAAE,KAA6B;gBAC7C,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,UAAU,EAAE,IAAI;aACnB,CAAC;YACF,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACJ,6CAA6C;YAC7C,IAAI,CAAC,OAAO,CAAC,YAAY,CACrB,iBAAiB,EACjB,KAA2C,EAC3C,KAAK,CAAC,KAAK,CACd,CAAC;QACN,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEzD,MAAM,SAAS,GAAG,CAAC,IAAkB,EAAuB,EAAE;YAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;oBAC/B,IAAI,KAAK;wBAAE,OAAO,KAAK,CAAC;gBAC5B,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,OAAe;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,SAAS,EAAE,CAAC;YACZ,SAAS,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;IACL,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,OAAe,EAAE,QAAwB;QAC5D,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,OAAe,EAAE,QAAwB;QAC1D,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,OAAe,EAAE,QAAwB;QACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,OAAe;QAChC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,OAAe;QAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,OAAe;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,SAAS,EAAE,CAAC;YACZ,SAAS,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,eAAe;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE/B,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,OAAe;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,SAAS,EAAE,OAAO,IAAI,IAAI,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,WAAW;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,SAAkB;QACpC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IAEO,gBAAgB;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAEO,iBAAiB,CAAC,UAA4C;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBACtB,MAAM,EAAE,YAAY;gBACpB,UAAU;aACb,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,YAAY,CAAC,SAA6B,EAAE,SAAiB;QACjE,mEAAmE;QACnE,IAAI,mBAAmB,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/E,gFAAgF;YAChF,mBAAmB,GAAG,eAAe,mBAAmB,EAAE,CAAC;QAC/D,CAAC;aAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1F,8EAA8E;YAC9E,sEAAsE;YACtE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,4CAA4C,CAAC,EAAE,CAAC;gBAC1H,mBAAmB,GAAG,YAAY,mBAAmB,EAAE,CAAC;YAC5D,CAAC;QACL,CAAC;QAED,0DAA0D;QAC1D,MAAM,UAAU,GAAG,GAAY,EAAE;YAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;YAC1B,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAC;YAEvB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAsB,CAAC;YAC9C,IAAI,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;YAE9B,6CAA6C;YAC7C,IAAI,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC;gBAAE,OAAO,IAAI,CAAC;YAEzD,gEAAgE;YAChE,wDAAwD;YACxD,iEAAiE;YACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,CAAC,SAAS,GAAG,GAAG,mBAAmB,aAAa,CAAC;YAEvD,4CAA4C;YAC5C,UAAU,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,kBAAkB;QAClB,IAAI,UAAU,EAAE;YAAE,OAAO;QAEzB,uDAAuD;QACvD,UAAU,CAAC,GAAG,EAAE;YACZ,IAAI,UAAU,EAAE;gBAAE,OAAO;YAEzB,wDAAwD;YACxD,UAAU,CAAC,GAAG,EAAE;gBACZ,UAAU,EAAE,CAAC;YACjB,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;IACX,CAAC;oHAjgBQ,0BAA0B;gEAA1B,0BAA0B,WAA1B,0BAA0B;;iFAA1B,0BAA0B;cADtC,UAAU","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport {\n LayoutConfig,\n ResolvedLayoutConfig,\n ComponentContainer,\n JsonValue,\n ComponentItemConfig,\n VirtualLayout\n} from 'golden-layout';\nimport {\n DashboardPanel,\n LayoutChangedEvent\n} from '../models/dashboard-types';\n\n// Golden Layout interfaces for VirtualLayout\ninterface GLVirtualLayout {\n rootItem: GLLayoutItem | null;\n on(event: string, callback: (item?: unknown) => void): void;\n destroy(): void;\n loadLayout(config: LayoutConfig): void;\n saveLayout(): ResolvedLayoutConfig;\n addItemAtLocation(config: ComponentItemConfig, location: Array<{ typeId: number }>): void;\n addComponent(componentType: string, componentState: Record<string, unknown>, title: string): void;\n setSize(width: number, height: number): void;\n}\n\ninterface GLLayoutItem {\n type: string;\n contentItems?: GLLayoutItem[];\n container?: ComponentContainer;\n addItem(config: ComponentItemConfig): void;\n}\n\n/**\n * Location specifier for adding panels\n */\nexport interface LayoutLocation {\n /** Target panel ID (add next to this panel) */\n targetPanelId?: string;\n /** Position relative to target */\n position?: 'left' | 'right' | 'top' | 'bottom' | 'tab';\n}\n\n/**\n * Panel component factory function type.\n * Receives the full DashboardPanel from GL's componentState (single source of truth).\n */\nexport type PanelComponentFactory = (panel: DashboardPanel, container: HTMLElement) => void;\n\n/**\n * Service that wraps Golden Layout for Angular integration.\n * Uses Golden Layout 2.6.0 VirtualLayout API.\n *\n * DESIGN: This service works with GL's native ResolvedLayoutConfig format.\n * Full DashboardPanel objects are stored in componentState - no conversion needed.\n */\n@Injectable()\nexport class GoldenLayoutWrapperService {\n private _initialized = false;\n private _layout: GLVirtualLayout | null = null;\n private _containerElement: HTMLElement | null = null;\n private _componentFactory: PanelComponentFactory | null = null;\n private _containerMap = new Map<string, ComponentContainer>();\n private _isEditing = false;\n /** Tracks which panels have been lazily loaded (content created) */\n private _loadedPanels = new Set<string>();\n\n /** Emitted when layout configuration changes */\n public onLayoutChanged = new Subject<LayoutChangedEvent>();\n\n /** Emitted when a panel is closed */\n public onPanelClosed = new Subject<string>();\n\n /** Emitted when a panel is maximized/restored */\n public onPanelMaximized = new Subject<{ panelId: string; maximized: boolean }>();\n\n /** Emitted when a panel is selected (in a stack) */\n public onPanelSelected = new Subject<string>();\n\n /** Current panels in layout */\n public panels$ = new BehaviorSubject<string[]>([]);\n\n /** Whether layout editing (drag/drop/resize/close) is enabled */\n public get isEditing(): boolean {\n return this._isEditing;\n }\n\n /**\n * Initialize Golden Layout in the specified container.\n * @param container The HTML element to render Golden Layout in\n * @param savedLayout Previously saved layout (from saveLayout()) or null for empty\n * @param componentFactory Factory function to create panel content\n * @param isEditing Whether editing (drag/drop/resize/close) is enabled\n */\n public initialize(\n container: HTMLElement,\n savedLayout: ResolvedLayoutConfig | null,\n componentFactory: PanelComponentFactory,\n isEditing = false\n ): void {\n this._componentFactory = componentFactory;\n this._containerElement = container;\n this._isEditing = isEditing;\n\n // Create VirtualLayout instance with bind/unbind callbacks\n // Cast through unknown: GLVirtualLayout is a subset interface used throughout this service;\n // the structural mismatch with golden-layout's VirtualLayout is intentional.\n this._layout = new VirtualLayout(\n container,\n this.bindComponentEventListener.bind(this) as VirtualLayout.BindComponentEventHandler,\n this.unbindComponentEventListener.bind(this) as VirtualLayout.UnbindComponentEventHandler\n ) as unknown as GLVirtualLayout;\n\n // Enable automatic resize when container size changes\n (this._layout as unknown as { resizeWithContainerAutomatically: boolean }).resizeWithContainerAutomatically = true;\n\n // Subscribe to events\n this._layout.on('stateChanged', () => {\n this.emitLayoutChanged('resize');\n });\n\n // Build the LayoutConfig to load\n const glConfig = this.buildLayoutConfig(savedLayout);\n\n // Load the layout configuration\n this._layout.loadLayout(glConfig);\n\n // Set the size of Golden Layout to match the container\n const rect = container.getBoundingClientRect();\n this._layout.setSize(rect.width, rect.height);\n\n this._initialized = true;\n this.updatePanelsList();\n }\n\n /**\n * Build LayoutConfig from saved ResolvedLayoutConfig.\n * Uses GL's LayoutConfig.fromResolved() for proper conversion,\n * then applies current edit mode settings.\n */\n private buildLayoutConfig(savedLayout: ResolvedLayoutConfig | null): LayoutConfig {\n // Base settings - reorderEnabled is always true so users can click tabs and\n // rearrange in view mode (changes won't be saved). Close button only in edit mode.\n const baseSettings: LayoutConfig = {\n settings: {\n reorderEnabled: this._isEditing\n },\n header: {\n show: 'top',\n popout: false,\n maximise: false,\n close: this._isEditing ? 'tab' : false\n },\n root: undefined\n };\n\n // If we have a saved layout, convert it properly using GL's conversion\n if (savedLayout && savedLayout.root) {\n try {\n // Validate the saved layout has required structure\n if (!this.isValidLayoutConfig(savedLayout)) {\n console.warn('[GoldenLayoutWrapper] Invalid saved layout structure, using default');\n return baseSettings;\n }\n\n // Use GL's built-in conversion from ResolvedLayoutConfig to LayoutConfig\n const convertedConfig = LayoutConfig.fromResolved(savedLayout) as LayoutConfig;\n\n // Merge our base settings with the converted config\n return {\n ...convertedConfig,\n settings: {\n ...convertedConfig.settings,\n ...baseSettings.settings\n },\n header: {\n ...convertedConfig.header,\n ...baseSettings.header\n }\n };\n } catch (err) {\n console.error('[GoldenLayoutWrapper] Error converting saved layout, using default:', err);\n // Fall through to return base settings\n }\n }\n\n return baseSettings;\n }\n\n /**\n * Validate that a saved layout config has the required structure for GL conversion.\n * GL's fromResolved() can crash if certain properties are undefined.\n */\n private isValidLayoutConfig(config: ResolvedLayoutConfig): boolean {\n if (!config || !config.root) {\n return false;\n }\n\n // Check that root has a type\n if (!config.root.type) {\n return false;\n }\n\n // Recursively validate content items have required properties\n return this.validateLayoutItem(config.root);\n }\n\n /**\n * Recursively validate a layout item and its children.\n */\n private validateLayoutItem(item: unknown): boolean {\n if (!item || typeof item !== 'object') {\n return false;\n }\n\n const layoutItem = item as Record<string, unknown>;\n\n // Must have a type\n if (!layoutItem['type']) {\n return false;\n }\n\n // If it has content, validate each child\n const content = layoutItem['content'] as unknown[] | undefined;\n if (content && Array.isArray(content)) {\n for (const child of content) {\n if (!this.validateLayoutItem(child)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Update layout size to match container.\n */\n public updateSize(): void {\n if (this._layout && this._containerElement) {\n const rect = this._containerElement.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n this._layout.setSize(rect.width, rect.height);\n }\n }\n }\n\n /**\n * Bind component event listener (called by Golden Layout VirtualLayout).\n * The componentState contains the full DashboardPanel object.\n */\n private bindComponentEventListener(\n container: ComponentContainer,\n _itemConfig: { componentState: Record<string, unknown> }\n ): { component: HTMLElement; virtual: boolean } {\n // componentState IS the DashboardPanel\n const panel = container.state as unknown as DashboardPanel;\n\n // Create a wrapper element for our panel content\n const wrapper = document.createElement('div');\n wrapper.className = 'dashboard-panel-content';\n wrapper.style.width = '100%';\n wrapper.style.height = '100%';\n wrapper.style.overflow = 'auto';\n\n if (!panel?.id) {\n wrapper.innerHTML = '<div class=\"panel-error\">No panel ID provided</div>';\n } else {\n // Store reference to container\n this._containerMap.set(panel.id, container);\n\n // Set the tab title (plain text - GL escapes HTML)\n container.setTitle(panel.title);\n\n // Add icon to the tab element via DOM manipulation\n // This must happen after GL has created the tab element\n // Always add an icon - use panel's icon or a default fallback (cube = generic widget)\n // IMPORTANT: We append to tabElement, NOT modify .lm_title, to preserve GL's drag/drop\n const iconClass = panel.icon || 'fa-solid fa-cube';\n this.addIconToTab(container, iconClass);\n\n // LAZY LOADING: Show loading placeholder initially\n // Actual content is created when panel is first shown (visible)\n wrapper.innerHTML = `\n <div class=\"panel-loading\" style=\"display: flex; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary);\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"margin-right: 8px;\"></i>\n Loading...\n </div>\n `;\n\n // Listen for close events\n container.on('beforeComponentRelease', () => {\n this._containerMap.delete(panel.id);\n this._loadedPanels.delete(panel.id);\n this.onPanelClosed.next(panel.id);\n this.updatePanelsList();\n });\n\n // Listen for show/focus events - LAZY LOAD on first show\n container.on('show', () => {\n // Check if this is first time panel is shown\n if (!this._loadedPanels.has(panel.id)) {\n // First show - create actual content\n wrapper.innerHTML = ''; // Clear loading placeholder\n if (this._componentFactory) {\n this._componentFactory(panel, wrapper);\n }\n this._loadedPanels.add(panel.id);\n }\n this.onPanelSelected.next(panel.id);\n });\n\n this.updatePanelsList();\n }\n\n // Append the wrapper to container.element (.lm_content)\n container.element.appendChild(wrapper);\n\n // Return the bindable component object\n return {\n component: wrapper,\n virtual: false\n };\n }\n\n /**\n * Unbind component event listener (called by Golden Layout VirtualLayout)\n */\n private unbindComponentEventListener(_container: ComponentContainer): void {\n // Cleanup handled in beforeComponentRelease\n }\n\n /**\n * Check if Golden Layout is initialized\n */\n public isInitialized(): boolean {\n return this._initialized;\n }\n\n /**\n * Destroy Golden Layout and clean up\n */\n public destroy(): void {\n if (this._layout) {\n this._layout.destroy();\n this._layout = null;\n }\n\n this._containerMap.clear();\n this._loadedPanels.clear();\n this._initialized = false;\n this._componentFactory = null;\n this._containerElement = null;\n }\n\n /**\n * Add a panel to the layout.\n * The full DashboardPanel is stored in componentState.\n */\n public addPanel(panel: DashboardPanel, _location?: LayoutLocation): void {\n if (!this._layout) {\n return;\n }\n\n // Try to add to existing stack first, otherwise create new\n const existingStack = this.findFirstStack();\n if (existingStack) {\n const componentConfig: ComponentItemConfig = {\n type: 'component',\n componentType: 'dashboard-panel',\n componentState: panel as unknown as JsonValue,\n title: panel.title,\n isClosable: true\n };\n existingStack.addItem(componentConfig);\n } else {\n // Use addComponent which will create a stack\n this._layout.addComponent(\n 'dashboard-panel',\n panel as unknown as Record<string, unknown>,\n panel.title\n );\n }\n\n this.emitLayoutChanged('resize');\n }\n\n /**\n * Find first stack in layout\n */\n private findFirstStack(): GLLayoutItem | null {\n if (!this._layout || !this._layout.rootItem) return null;\n\n const findStack = (item: GLLayoutItem): GLLayoutItem | null => {\n if (item.type === 'stack') {\n return item;\n }\n if (item.contentItems) {\n for (const child of item.contentItems) {\n const found = findStack(child);\n if (found) return found;\n }\n }\n return null;\n };\n\n return findStack(this._layout.rootItem);\n }\n\n /**\n * Remove a panel from the layout\n */\n public removePanel(panelId: string): void {\n const container = this._containerMap.get(panelId);\n if (container) {\n container.close();\n }\n }\n\n /**\n * Split a panel horizontally (add panel to the right)\n */\n public splitHorizontal(panelId: string, newPanel: DashboardPanel): void {\n this.addPanel(newPanel, { targetPanelId: panelId, position: 'right' });\n }\n\n /**\n * Split a panel vertically (add panel below)\n */\n public splitVertical(panelId: string, newPanel: DashboardPanel): void {\n this.addPanel(newPanel, { targetPanelId: panelId, position: 'bottom' });\n }\n\n /**\n * Add a panel as a tab to an existing stack\n */\n public addToStack(panelId: string, newPanel: DashboardPanel): void {\n this.addPanel(newPanel, { targetPanelId: panelId, position: 'tab' });\n }\n\n /**\n * Maximize a panel\n */\n public maximizePanel(panelId: string): void {\n this.onPanelMaximized.next({ panelId, maximized: true });\n }\n\n /**\n * Restore a maximized panel\n */\n public restorePanel(panelId: string): void {\n this.onPanelMaximized.next({ panelId, maximized: false });\n }\n\n /**\n * Focus a panel by ID\n */\n public focusPanel(panelId: string): void {\n const container = this._containerMap.get(panelId);\n if (container) {\n container.focus();\n }\n }\n\n /**\n * Get the current layout configuration.\n * Returns GL's native ResolvedLayoutConfig - no conversion.\n */\n public getLayoutConfig(): ResolvedLayoutConfig | null {\n if (!this._layout) return null;\n\n try {\n return this._layout.saveLayout();\n } catch (error) {\n console.error('[GLWrapper] Failed to save layout:', error);\n return null;\n }\n }\n\n /**\n * Get the container element for a panel\n */\n public getPanelContainer(panelId: string): HTMLElement | null {\n const container = this._containerMap.get(panelId);\n return container?.element || null;\n }\n\n /**\n * Get all panel IDs in the current layout\n */\n public getPanelIds(): string[] {\n return Array.from(this._containerMap.keys());\n }\n\n /**\n * Set editing mode.\n * Note: Golden Layout 2 doesn't support changing settings after initialization.\n * The layout must be reinitialized to apply new settings.\n */\n public setEditingMode(isEditing: boolean): void {\n this._isEditing = isEditing;\n }\n\n private updatePanelsList(): void {\n this.panels$.next(Array.from(this._containerMap.keys()));\n }\n\n private emitLayoutChanged(changeType: LayoutChangedEvent['changeType']): void {\n const layoutConfig = this.getLayoutConfig();\n if (layoutConfig) {\n this.onLayoutChanged.next({\n layout: layoutConfig,\n changeType\n });\n }\n }\n\n /**\n * Add an icon to a tab element via DOM manipulation.\n * IMPORTANT: We append to tabElement, NOT modify .lm_title, to preserve GL's drag/drop.\n * This follows the same pattern as the shell's GoldenLayoutManager.\n */\n private addIconToTab(container: ComponentContainer, iconClass: string): void {\n // Normalize the icon class - ensure it has the Font Awesome prefix\n let normalizedIconClass = iconClass.trim();\n if (!normalizedIconClass.includes('fa-') && !normalizedIconClass.includes('fa ')) {\n // If no FA prefix, assume it's a Font Awesome icon name and add fa-solid prefix\n normalizedIconClass = `fa-solid fa-${normalizedIconClass}`;\n } else if (!normalizedIconClass.startsWith('fa-') && !normalizedIconClass.startsWith('fa ')) {\n // Has fa- in it but not at the start - likely just the icon name like \"globe\"\n // Check if it's missing the style prefix (fa-solid, fa-regular, etc.)\n if (!normalizedIconClass.match(/^fa[srldb]?\\s/) && !normalizedIconClass.match(/^fa-(solid|regular|light|duotone|brands)\\s/)) {\n normalizedIconClass = `fa-solid ${normalizedIconClass}`;\n }\n }\n\n // Try immediately, then retry with delay if tab not ready\n const tryAddIcon = (): boolean => {\n const tab = container.tab;\n if (!tab) return false;\n\n const tabElement = tab.element as HTMLElement;\n if (!tabElement) return false;\n\n // Check if icon already added to tab element\n if (tabElement.querySelector('.panel-icon')) return true;\n\n // Create icon element and insert at the beginning of tabElement\n // This preserves GL's .lm_title structure for drag/drop\n // Icon is positioned absolutely via CSS in the left padding area\n const iconEl = document.createElement('i');\n iconEl.className = `${normalizedIconClass} panel-icon`;\n\n // Insert icon as first child of tab element\n tabElement.insertBefore(iconEl, tabElement.firstChild);\n return true;\n };\n\n // Try immediately\n if (tryAddIcon()) return;\n\n // Tab may not be created yet - try again after a delay\n setTimeout(() => {\n if (tryAddIcon()) return;\n\n // Still not ready - try one more time with longer delay\n setTimeout(() => {\n tryAddIcon();\n }, 100);\n }, 50);\n }\n}\n"]}
1
+ {"version":3,"file":"golden-layout-wrapper.service.js","sourceRoot":"","sources":["../../../src/lib/services/golden-layout-wrapper.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport {\n LayoutConfig,\n ResolvedLayoutConfig,\n ComponentContainer,\n JsonValue,\n ComponentItemConfig,\n VirtualLayout\n} from 'golden-layout';\nimport {\n DashboardPanel,\n LayoutChangedEvent\n} from '../models/dashboard-types';\n\n// Golden Layout interfaces for VirtualLayout\ninterface GLVirtualLayout {\n rootItem: GLLayoutItem | null;\n on(event: string, callback: (item?: unknown) => void): void;\n destroy(): void;\n loadLayout(config: LayoutConfig): void;\n saveLayout(): ResolvedLayoutConfig;\n addItemAtLocation(config: ComponentItemConfig, location: Array<{ typeId: number }>): void;\n addComponent(componentType: string, componentState: Record<string, unknown>, title: string): void;\n setSize(width: number, height: number): void;\n}\n\ninterface GLLayoutItem {\n type: string;\n contentItems?: GLLayoutItem[];\n container?: ComponentContainer;\n addItem(config: ComponentItemConfig): void;\n}\n\n/**\n * Location specifier for adding panels\n */\nexport interface LayoutLocation {\n /** Target panel ID (add next to this panel) */\n targetPanelId?: string;\n /** Position relative to target */\n position?: 'left' | 'right' | 'top' | 'bottom' | 'tab';\n}\n\n/**\n * Panel component factory function type.\n * Receives the full DashboardPanel from GL's componentState (single source of truth).\n */\nexport type PanelComponentFactory = (panel: DashboardPanel, container: HTMLElement) => void;\n\n/**\n * Service that wraps Golden Layout for Angular integration.\n * Uses Golden Layout 2.6.0 VirtualLayout API.\n *\n * DESIGN: This service works with GL's native ResolvedLayoutConfig format.\n * Full DashboardPanel objects are stored in componentState - no conversion needed.\n */\n@Injectable()\nexport class GoldenLayoutWrapperService {\n private _initialized = false;\n private _layout: GLVirtualLayout | null = null;\n private _containerElement: HTMLElement | null = null;\n private _componentFactory: PanelComponentFactory | null = null;\n private _containerMap = new Map<string, ComponentContainer>();\n private _isEditing = false;\n /** Tracks which panels have been lazily loaded (content created) */\n private _loadedPanels = new Set<string>();\n\n /** Emitted when layout configuration changes */\n public OnLayoutChanged = new Subject<LayoutChangedEvent>();\n\n /** @deprecated Use {@link OnLayoutChanged}. */\n public get onLayoutChanged() {\n return this.OnLayoutChanged;\n }\n /** @deprecated Use {@link OnLayoutChanged}. */\n public set onLayoutChanged(value) {\n this.OnLayoutChanged = value;\n }\n\n /** Emitted when a panel is closed */\n public OnPanelClosed = new Subject<string>();\n\n /** @deprecated Use {@link OnPanelClosed}. */\n public get onPanelClosed() {\n return this.OnPanelClosed;\n }\n /** @deprecated Use {@link OnPanelClosed}. */\n public set onPanelClosed(value) {\n this.OnPanelClosed = value;\n }\n\n /** Emitted when a panel is maximized/restored */\n public OnPanelMaximized = new Subject<{ panelId: string; maximized: boolean }>();\n\n /** @deprecated Use {@link OnPanelMaximized}. */\n public get onPanelMaximized() {\n return this.OnPanelMaximized;\n }\n /** @deprecated Use {@link OnPanelMaximized}. */\n public set onPanelMaximized(value) {\n this.OnPanelMaximized = value;\n }\n\n /** Emitted when a panel is selected (in a stack) */\n public OnPanelSelected = new Subject<string>();\n\n /** @deprecated Use {@link OnPanelSelected}. */\n public get onPanelSelected() {\n return this.OnPanelSelected;\n }\n /** @deprecated Use {@link OnPanelSelected}. */\n public set onPanelSelected(value) {\n this.OnPanelSelected = value;\n }\n\n /** Current panels in layout */\n public Panels$ = new BehaviorSubject<string[]>([]);\n\n /** @deprecated Use {@link Panels$}. */\n public get panels$() {\n return this.Panels$;\n }\n /** @deprecated Use {@link Panels$}. */\n public set panels$(value) {\n this.Panels$ = value;\n }\n\n /** Whether layout editing (drag/drop/resize/close) is enabled */\n public get IsEditing(): boolean {\n return this._isEditing;\n }\n\n /** @deprecated Use {@link IsEditing}. */\n public get isEditing(): boolean {\n return this.IsEditing;\n }\n\n /**\n * Initialize Golden Layout in the specified container.\n * @param container The HTML element to render Golden Layout in\n * @param savedLayout Previously saved layout (from saveLayout()) or null for empty\n * @param componentFactory Factory function to create panel content\n * @param isEditing Whether editing (drag/drop/resize/close) is enabled\n */\n public Initialize(\n container: HTMLElement,\n savedLayout: ResolvedLayoutConfig | null,\n componentFactory: PanelComponentFactory,\n isEditing = false\n ): void {\n this._componentFactory = componentFactory;\n this._containerElement = container;\n this._isEditing = isEditing;\n\n // Create VirtualLayout instance with bind/unbind callbacks\n // Cast through unknown: GLVirtualLayout is a subset interface used throughout this service;\n // the structural mismatch with golden-layout's VirtualLayout is intentional.\n this._layout = new VirtualLayout(\n container,\n this.bindComponentEventListener.bind(this) as VirtualLayout.BindComponentEventHandler,\n this.unbindComponentEventListener.bind(this) as VirtualLayout.UnbindComponentEventHandler\n ) as unknown as GLVirtualLayout;\n\n // Enable automatic resize when container size changes\n (this._layout as unknown as { resizeWithContainerAutomatically: boolean }).resizeWithContainerAutomatically = true;\n\n // Subscribe to events\n this._layout.on('stateChanged', () => {\n this.emitLayoutChanged('resize');\n });\n\n // Build the LayoutConfig to load\n const glConfig = this.buildLayoutConfig(savedLayout);\n\n // Load the layout configuration\n this._layout.loadLayout(glConfig);\n\n // Set the size of Golden Layout to match the container\n const rect = container.getBoundingClientRect();\n this._layout.setSize(rect.width, rect.height);\n\n this._initialized = true;\n this.updatePanelsList();\n }\n\n /** @deprecated Use {@link Initialize}. */\n public initialize(\n container: HTMLElement,\n savedLayout: ResolvedLayoutConfig | null,\n componentFactory: PanelComponentFactory,\n isEditing = false\n ): void {\n return this.Initialize(container, savedLayout, componentFactory, isEditing);\n }\n\n /**\n * Build LayoutConfig from saved ResolvedLayoutConfig.\n * Uses GL's LayoutConfig.fromResolved() for proper conversion,\n * then applies current edit mode settings.\n */\n private buildLayoutConfig(savedLayout: ResolvedLayoutConfig | null): LayoutConfig {\n // Base settings - reorderEnabled is always true so users can click tabs and\n // rearrange in view mode (changes won't be saved). Close button only in edit mode.\n const baseSettings: LayoutConfig = {\n settings: {\n reorderEnabled: this._isEditing\n },\n header: {\n show: 'top',\n popout: false,\n maximise: false,\n close: this._isEditing ? 'tab' : false\n },\n root: undefined\n };\n\n // If we have a saved layout, convert it properly using GL's conversion\n if (savedLayout && savedLayout.root) {\n try {\n // Validate the saved layout has required structure\n if (!this.isValidLayoutConfig(savedLayout)) {\n console.warn('[GoldenLayoutWrapper] Invalid saved layout structure, using default');\n return baseSettings;\n }\n\n // Use GL's built-in conversion from ResolvedLayoutConfig to LayoutConfig\n const convertedConfig = LayoutConfig.fromResolved(savedLayout) as LayoutConfig;\n\n // Merge our base settings with the converted config\n return {\n ...convertedConfig,\n settings: {\n ...convertedConfig.settings,\n ...baseSettings.settings\n },\n header: {\n ...convertedConfig.header,\n ...baseSettings.header\n }\n };\n } catch (err) {\n console.error('[GoldenLayoutWrapper] Error converting saved layout, using default:', err);\n // Fall through to return base settings\n }\n }\n\n return baseSettings;\n }\n\n /**\n * Validate that a saved layout config has the required structure for GL conversion.\n * GL's fromResolved() can crash if certain properties are undefined.\n */\n private isValidLayoutConfig(config: ResolvedLayoutConfig): boolean {\n if (!config || !config.root) {\n return false;\n }\n\n // Check that root has a type\n if (!config.root.type) {\n return false;\n }\n\n // Recursively validate content items have required properties\n return this.validateLayoutItem(config.root);\n }\n\n /**\n * Recursively validate a layout item and its children.\n */\n private validateLayoutItem(item: unknown): boolean {\n if (!item || typeof item !== 'object') {\n return false;\n }\n\n const layoutItem = item as Record<string, unknown>;\n\n // Must have a type\n if (!layoutItem['type']) {\n return false;\n }\n\n // If it has content, validate each child\n const content = layoutItem['content'] as unknown[] | undefined;\n if (content && Array.isArray(content)) {\n for (const child of content) {\n if (!this.validateLayoutItem(child)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Update layout size to match container.\n */\n public UpdateSize(): void {\n if (this._layout && this._containerElement) {\n const rect = this._containerElement.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n this._layout.setSize(rect.width, rect.height);\n }\n }\n }\n\n /** @deprecated Use {@link UpdateSize}. */\n public updateSize(): void {\n return this.UpdateSize();\n }\n\n /**\n * Bind component event listener (called by Golden Layout VirtualLayout).\n * The componentState contains the full DashboardPanel object.\n */\n private bindComponentEventListener(\n container: ComponentContainer,\n _itemConfig: { componentState: Record<string, unknown> }\n ): { component: HTMLElement; virtual: boolean } {\n // componentState IS the DashboardPanel\n const panel = container.state as unknown as DashboardPanel;\n\n // Create a wrapper element for our panel content\n const wrapper = document.createElement('div');\n wrapper.className = 'dashboard-panel-content';\n wrapper.style.width = '100%';\n wrapper.style.height = '100%';\n wrapper.style.overflow = 'auto';\n\n if (!panel?.id) {\n wrapper.innerHTML = '<div class=\"panel-error\">No panel ID provided</div>';\n } else {\n // Store reference to container\n this._containerMap.set(panel.id, container);\n\n // Set the tab title (plain text - GL escapes HTML)\n container.setTitle(panel.title);\n\n // Add icon to the tab element via DOM manipulation\n // This must happen after GL has created the tab element\n // Always add an icon - use panel's icon or a default fallback (cube = generic widget)\n // IMPORTANT: We append to tabElement, NOT modify .lm_title, to preserve GL's drag/drop\n const iconClass = panel.icon || 'fa-solid fa-cube';\n this.addIconToTab(container, iconClass);\n\n // LAZY LOADING: Show loading placeholder initially\n // Actual content is created when panel is first shown (visible)\n wrapper.innerHTML = `\n <div class=\"panel-loading\" style=\"display: flex; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary);\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"margin-right: 8px;\"></i>\n Loading...\n </div>\n `;\n\n // Listen for close events\n container.on('beforeComponentRelease', () => {\n this._containerMap.delete(panel.id);\n this._loadedPanels.delete(panel.id);\n this.OnPanelClosed.next(panel.id);\n this.updatePanelsList();\n });\n\n // Listen for show/focus events - LAZY LOAD on first show\n container.on('show', () => {\n // Check if this is first time panel is shown\n if (!this._loadedPanels.has(panel.id)) {\n // First show - create actual content\n wrapper.innerHTML = ''; // Clear loading placeholder\n if (this._componentFactory) {\n this._componentFactory(panel, wrapper);\n }\n this._loadedPanels.add(panel.id);\n }\n this.OnPanelSelected.next(panel.id);\n });\n\n this.updatePanelsList();\n }\n\n // Append the wrapper to container.element (.lm_content)\n container.element.appendChild(wrapper);\n\n // Return the bindable component object\n return {\n component: wrapper,\n virtual: false\n };\n }\n\n /**\n * Unbind component event listener (called by Golden Layout VirtualLayout)\n */\n private unbindComponentEventListener(_container: ComponentContainer): void {\n // Cleanup handled in beforeComponentRelease\n }\n\n /**\n * Check if Golden Layout is initialized\n */\n public IsInitialized(): boolean {\n return this._initialized;\n }\n\n /** @deprecated Use {@link IsInitialized}. */\n public isInitialized(): boolean {\n return this.IsInitialized();\n }\n\n /**\n * Destroy Golden Layout and clean up\n */\n public Destroy(): void {\n if (this._layout) {\n this._layout.destroy();\n this._layout = null;\n }\n\n this._containerMap.clear();\n this._loadedPanels.clear();\n this._initialized = false;\n this._componentFactory = null;\n this._containerElement = null;\n }\n\n /** @deprecated Use {@link Destroy}. */\n public destroy(): void {\n return this.Destroy();\n }\n\n /**\n * Add a panel to the layout.\n * The full DashboardPanel is stored in componentState.\n */\n public AddPanel(panel: DashboardPanel, _location?: LayoutLocation): void {\n if (!this._layout) {\n return;\n }\n\n // Try to add to existing stack first, otherwise create new\n const existingStack = this.findFirstStack();\n if (existingStack) {\n const componentConfig: ComponentItemConfig = {\n type: 'component',\n componentType: 'dashboard-panel',\n componentState: panel as unknown as JsonValue,\n title: panel.title,\n isClosable: true\n };\n existingStack.addItem(componentConfig);\n } else {\n // Use addComponent which will create a stack\n this._layout.addComponent(\n 'dashboard-panel',\n panel as unknown as Record<string, unknown>,\n panel.title\n );\n }\n\n this.emitLayoutChanged('resize');\n }\n\n /** @deprecated Use {@link AddPanel}. */\n public addPanel(panel: DashboardPanel, _location?: LayoutLocation): void {\n return this.AddPanel(panel, _location);\n }\n\n /**\n * Find first stack in layout\n */\n private findFirstStack(): GLLayoutItem | null {\n if (!this._layout || !this._layout.rootItem) return null;\n\n const findStack = (item: GLLayoutItem): GLLayoutItem | null => {\n if (item.type === 'stack') {\n return item;\n }\n if (item.contentItems) {\n for (const child of item.contentItems) {\n const found = findStack(child);\n if (found) return found;\n }\n }\n return null;\n };\n\n return findStack(this._layout.rootItem);\n }\n\n /**\n * Remove a panel from the layout\n */\n public RemovePanel(panelId: string): void {\n const container = this._containerMap.get(panelId);\n if (container) {\n container.close();\n }\n }\n\n /** @deprecated Use {@link RemovePanel}. */\n public removePanel(panelId: string): void {\n return this.RemovePanel(panelId);\n }\n\n /**\n * Split a panel horizontally (add panel to the right)\n */\n public SplitHorizontal(panelId: string, newPanel: DashboardPanel): void {\n this.AddPanel(newPanel, { targetPanelId: panelId, position: 'right' });\n }\n\n /** @deprecated Use {@link SplitHorizontal}. */\n public splitHorizontal(panelId: string, newPanel: DashboardPanel): void {\n return this.SplitHorizontal(panelId, newPanel);\n }\n\n /**\n * Split a panel vertically (add panel below)\n */\n public SplitVertical(panelId: string, newPanel: DashboardPanel): void {\n this.AddPanel(newPanel, { targetPanelId: panelId, position: 'bottom' });\n }\n\n /** @deprecated Use {@link SplitVertical}. */\n public splitVertical(panelId: string, newPanel: DashboardPanel): void {\n return this.SplitVertical(panelId, newPanel);\n }\n\n /**\n * Add a panel as a tab to an existing stack\n */\n public AddToStack(panelId: string, newPanel: DashboardPanel): void {\n this.AddPanel(newPanel, { targetPanelId: panelId, position: 'tab' });\n }\n\n /** @deprecated Use {@link AddToStack}. */\n public addToStack(panelId: string, newPanel: DashboardPanel): void {\n return this.AddToStack(panelId, newPanel);\n }\n\n /**\n * Maximize a panel\n */\n public MaximizePanel(panelId: string): void {\n this.OnPanelMaximized.next({ panelId, maximized: true });\n }\n\n /** @deprecated Use {@link MaximizePanel}. */\n public maximizePanel(panelId: string): void {\n return this.MaximizePanel(panelId);\n }\n\n /**\n * Restore a maximized panel\n */\n public RestorePanel(panelId: string): void {\n this.OnPanelMaximized.next({ panelId, maximized: false });\n }\n\n /** @deprecated Use {@link RestorePanel}. */\n public restorePanel(panelId: string): void {\n return this.RestorePanel(panelId);\n }\n\n /**\n * Focus a panel by ID\n */\n public FocusPanel(panelId: string): void {\n const container = this._containerMap.get(panelId);\n if (container) {\n container.focus();\n }\n }\n\n /** @deprecated Use {@link FocusPanel}. */\n public focusPanel(panelId: string): void {\n return this.FocusPanel(panelId);\n }\n\n /**\n * Get the current layout configuration.\n * Returns GL's native ResolvedLayoutConfig - no conversion.\n */\n public GetLayoutConfig(): ResolvedLayoutConfig | null {\n if (!this._layout) return null;\n\n try {\n return this._layout.saveLayout();\n } catch (error) {\n console.error('[GLWrapper] Failed to save layout:', error);\n return null;\n }\n }\n\n /** @deprecated Use {@link GetLayoutConfig}. */\n public getLayoutConfig(): ResolvedLayoutConfig | null {\n return this.GetLayoutConfig();\n }\n\n /**\n * Get the container element for a panel\n */\n public GetPanelContainer(panelId: string): HTMLElement | null {\n const container = this._containerMap.get(panelId);\n return container?.element || null;\n }\n\n /** @deprecated Use {@link GetPanelContainer}. */\n public getPanelContainer(panelId: string): HTMLElement | null {\n return this.GetPanelContainer(panelId);\n }\n\n /**\n * Get all panel IDs in the current layout\n */\n public GetPanelIds(): string[] {\n return Array.from(this._containerMap.keys());\n }\n\n /** @deprecated Use {@link GetPanelIds}. */\n public getPanelIds(): string[] {\n return this.GetPanelIds();\n }\n\n /**\n * Set editing mode.\n * Note: Golden Layout 2 doesn't support changing settings after initialization.\n * The layout must be reinitialized to apply new settings.\n */\n public SetEditingMode(isEditing: boolean): void {\n this._isEditing = isEditing;\n }\n\n /** @deprecated Use {@link SetEditingMode}. */\n public setEditingMode(isEditing: boolean): void {\n return this.SetEditingMode(isEditing);\n }\n\n private updatePanelsList(): void {\n this.Panels$.next(Array.from(this._containerMap.keys()));\n }\n\n private emitLayoutChanged(changeType: LayoutChangedEvent['changeType']): void {\n const layoutConfig = this.GetLayoutConfig();\n if (layoutConfig) {\n this.OnLayoutChanged.next({\n layout: layoutConfig,\n changeType\n });\n }\n }\n\n /**\n * Add an icon to a tab element via DOM manipulation.\n * IMPORTANT: We append to tabElement, NOT modify .lm_title, to preserve GL's drag/drop.\n * This follows the same pattern as the shell's GoldenLayoutManager.\n */\n private addIconToTab(container: ComponentContainer, iconClass: string): void {\n // Normalize the icon class - ensure it has the Font Awesome prefix\n let normalizedIconClass = iconClass.trim();\n if (!normalizedIconClass.includes('fa-') && !normalizedIconClass.includes('fa ')) {\n // If no FA prefix, assume it's a Font Awesome icon name and add fa-solid prefix\n normalizedIconClass = `fa-solid fa-${normalizedIconClass}`;\n } else if (!normalizedIconClass.startsWith('fa-') && !normalizedIconClass.startsWith('fa ')) {\n // Has fa- in it but not at the start - likely just the icon name like \"globe\"\n // Check if it's missing the style prefix (fa-solid, fa-regular, etc.)\n if (!normalizedIconClass.match(/^fa[srldb]?\\s/) && !normalizedIconClass.match(/^fa-(solid|regular|light|duotone|brands)\\s/)) {\n normalizedIconClass = `fa-solid ${normalizedIconClass}`;\n }\n }\n\n // Try immediately, then retry with delay if tab not ready\n const tryAddIcon = (): boolean => {\n const tab = container.tab;\n if (!tab) return false;\n\n const tabElement = tab.element as HTMLElement;\n if (!tabElement) return false;\n\n // Check if icon already added to tab element\n if (tabElement.querySelector('.panel-icon')) return true;\n\n // Create icon element and insert at the beginning of tabElement\n // This preserves GL's .lm_title structure for drag/drop\n // Icon is positioned absolutely via CSS in the left padding area\n const iconEl = document.createElement('i');\n iconEl.className = `${normalizedIconClass} panel-icon`;\n\n // Insert icon as first child of tab element\n tabElement.insertBefore(iconEl, tabElement.firstChild);\n return true;\n };\n\n // Try immediately\n if (tryAddIcon()) return;\n\n // Tab may not be created yet - try again after a delay\n setTimeout(() => {\n if (tryAddIcon()) return;\n\n // Still not ready - try one more time with longer delay\n setTimeout(() => {\n tryAddIcon();\n }, 100);\n }, 50);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-dashboard-viewer",
3
- "version": "6.1.4",
3
+ "version": "6.2.0-edge.1",
4
4
  "description": "MemberJunction: Angular components for metadata-driven dashboards with Golden Layout panels, supporting views, queries, artifacts, and custom content",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -21,7 +21,7 @@
21
21
  "devDependencies": {
22
22
  "@angular/compiler": "21.2.22",
23
23
  "@angular/compiler-cli": "21.2.22",
24
- "@memberjunction/ng-test-utils": "6.1.4",
24
+ "@memberjunction/ng-test-utils": "6.2.0-edge.1",
25
25
  "vitest": "^4.0.18"
26
26
  },
27
27
  "peerDependencies": {
@@ -33,17 +33,17 @@
33
33
  "golden-layout": "^2.6.0"
34
34
  },
35
35
  "dependencies": {
36
- "@memberjunction/ng-ui-components": "6.1.4",
37
- "@memberjunction/core": "6.1.4",
38
- "@memberjunction/core-entities": "6.1.4",
39
- "@memberjunction/global": "6.1.4",
40
- "@memberjunction/ng-artifacts": "6.1.4",
41
- "@memberjunction/ng-base-types": "6.1.4",
42
- "@memberjunction/ng-entity-viewer": "6.1.4",
43
- "@memberjunction/ng-map-view": "6.1.4",
44
- "@memberjunction/ng-query-viewer": "6.1.4",
45
- "@memberjunction/ng-shared-generic": "6.1.4",
46
- "@memberjunction/ng-trees": "6.1.4",
36
+ "@memberjunction/ng-ui-components": "6.2.0-edge.1",
37
+ "@memberjunction/core": "6.2.0-edge.1",
38
+ "@memberjunction/core-entities": "6.2.0-edge.1",
39
+ "@memberjunction/global": "6.2.0-edge.1",
40
+ "@memberjunction/ng-artifacts": "6.2.0-edge.1",
41
+ "@memberjunction/ng-base-types": "6.2.0-edge.1",
42
+ "@memberjunction/ng-entity-viewer": "6.2.0-edge.1",
43
+ "@memberjunction/ng-map-view": "6.2.0-edge.1",
44
+ "@memberjunction/ng-query-viewer": "6.2.0-edge.1",
45
+ "@memberjunction/ng-shared-generic": "6.2.0-edge.1",
46
+ "@memberjunction/ng-trees": "6.2.0-edge.1",
47
47
  "rxjs": "^7.8.2",
48
48
  "tslib": "^2.8.1"
49
49
  },