airdcpp-webui 2.11.2 → 2.11.3-beta.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 (145) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.html +2 -2
  3. package/dist/js/{285.902dc3166e82226541a5.chunk.js → 285.c10a92f5e683562b290c.chunk.js} +2 -2
  4. package/dist/js/285.c10a92f5e683562b290c.chunk.js.gz +0 -0
  5. package/dist/js/{285.902dc3166e82226541a5.chunk.js.map → 285.c10a92f5e683562b290c.chunk.js.map} +1 -1
  6. package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js +2 -0
  7. package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js.gz +0 -0
  8. package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js.map +1 -0
  9. package/dist/js/{424.b407aaf3218fa480b144.chunk.js → 424.2b137728423ffe5720b9.chunk.js} +1 -1
  10. package/dist/js/424.2b137728423ffe5720b9.chunk.js.gz +0 -0
  11. package/dist/js/{424.b407aaf3218fa480b144.chunk.js.map → 424.2b137728423ffe5720b9.chunk.js.map} +1 -1
  12. package/dist/js/{668.d0b45ae92f54a69beee3.chunk.js → 668.d8fc363a0da7c52c6cf3.chunk.js} +1 -1
  13. package/dist/js/668.d8fc363a0da7c52c6cf3.chunk.js.gz +0 -0
  14. package/dist/js/{668.d0b45ae92f54a69beee3.chunk.js.map → 668.d8fc363a0da7c52c6cf3.chunk.js.map} +1 -1
  15. package/dist/js/{69.8ca10b3d679cc4c52a20.chunk.js → 69.90201ebd79a3d236605f.chunk.js} +2 -2
  16. package/dist/js/69.90201ebd79a3d236605f.chunk.js.gz +0 -0
  17. package/dist/js/69.90201ebd79a3d236605f.chunk.js.map +1 -0
  18. package/dist/js/{702.99e6ce480dc579b6e542.chunk.js → 702.d36d38b2be52ab51c0a9.chunk.js} +1 -1
  19. package/dist/js/702.d36d38b2be52ab51c0a9.chunk.js.gz +0 -0
  20. package/dist/js/{702.99e6ce480dc579b6e542.chunk.js.map → 702.d36d38b2be52ab51c0a9.chunk.js.map} +1 -1
  21. package/dist/js/760.28a29fef05eb0889fc25.chunk.js +3 -0
  22. package/dist/js/{760.75d229a05d7b9bdf414b.chunk.js.LICENSE.txt → 760.28a29fef05eb0889fc25.chunk.js.LICENSE.txt} +0 -0
  23. package/dist/js/760.28a29fef05eb0889fc25.chunk.js.gz +0 -0
  24. package/dist/js/760.28a29fef05eb0889fc25.chunk.js.map +1 -0
  25. package/dist/js/{favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js → favorite-hubs.d78427e6a9006438d07b.chunk.js} +1 -1
  26. package/dist/js/favorite-hubs.d78427e6a9006438d07b.chunk.js.gz +0 -0
  27. package/dist/js/{favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js.map → favorite-hubs.d78427e6a9006438d07b.chunk.js.map} +1 -1
  28. package/dist/js/{filelists.a1ecb558a5c0c376191d.chunk.js → filelists.726450e0ff6e77eaa054.chunk.js} +1 -1
  29. package/dist/js/filelists.726450e0ff6e77eaa054.chunk.js.gz +0 -0
  30. package/dist/js/{filelists.a1ecb558a5c0c376191d.chunk.js.map → filelists.726450e0ff6e77eaa054.chunk.js.map} +1 -1
  31. package/dist/js/{files.9b2b25680e1e04de1931.chunk.js → files.50c047ffc599c58eb13a.chunk.js} +2 -2
  32. package/dist/js/files.50c047ffc599c58eb13a.chunk.js.gz +0 -0
  33. package/dist/js/{files.9b2b25680e1e04de1931.chunk.js.map → files.50c047ffc599c58eb13a.chunk.js.map} +1 -1
  34. package/dist/js/home.ed1091a84aa53f290563.chunk.js +3 -0
  35. package/dist/js/{home.21a1fe21d45ac82fafe5.chunk.js.LICENSE.txt → home.ed1091a84aa53f290563.chunk.js.LICENSE.txt} +0 -0
  36. package/dist/js/home.ed1091a84aa53f290563.chunk.js.gz +0 -0
  37. package/dist/js/home.ed1091a84aa53f290563.chunk.js.map +1 -0
  38. package/dist/js/{hubs.f336a1aeaac00fab20ce.chunk.js → hubs.eed2f41d894688465906.chunk.js} +2 -2
  39. package/dist/js/hubs.eed2f41d894688465906.chunk.js.gz +0 -0
  40. package/dist/js/{hubs.f336a1aeaac00fab20ce.chunk.js.map → hubs.eed2f41d894688465906.chunk.js.map} +1 -1
  41. package/dist/js/locales/{ca.7409d603c21de58635a6.chunk.js → ca.ed09d3a3d4bcca929ba1.chunk.js} +0 -0
  42. package/dist/js/locales/{ca.7409d603c21de58635a6.chunk.js.gz → ca.ed09d3a3d4bcca929ba1.chunk.js.gz} +0 -0
  43. package/dist/js/locales/{da.bd0c6f71e355d0794e71.chunk.js → da.6f60a77e9ef082dd3bf4.chunk.js} +0 -0
  44. package/dist/js/locales/{da.bd0c6f71e355d0794e71.chunk.js.gz → da.6f60a77e9ef082dd3bf4.chunk.js.gz} +0 -0
  45. package/dist/js/locales/{de.5adea2a7ce417c784479.chunk.js → de.3b7d3665460384259e82.chunk.js} +0 -0
  46. package/dist/js/locales/{de.5adea2a7ce417c784479.chunk.js.gz → de.3b7d3665460384259e82.chunk.js.gz} +0 -0
  47. package/dist/js/locales/{el.648369d465eb99118703.chunk.js → el.598573d2a5ed18804fe0.chunk.js} +0 -0
  48. package/dist/js/locales/{el.648369d465eb99118703.chunk.js.gz → el.598573d2a5ed18804fe0.chunk.js.gz} +0 -0
  49. package/dist/js/locales/{en.c66f69f706afd2da9eb5.chunk.js → en.f0fe75dca201449e5e47.chunk.js} +0 -0
  50. package/dist/js/locales/{en.c66f69f706afd2da9eb5.chunk.js.gz → en.f0fe75dca201449e5e47.chunk.js.gz} +0 -0
  51. package/dist/js/locales/{es.793f17d88083bf7f0738.chunk.js → es.cbe6378a22cf5ee485cd.chunk.js} +0 -0
  52. package/dist/js/locales/{es.793f17d88083bf7f0738.chunk.js.gz → es.cbe6378a22cf5ee485cd.chunk.js.gz} +0 -0
  53. package/dist/js/locales/{eu.010416cbe0a067839d4a.chunk.js → eu.7734fc077f26418d6b32.chunk.js} +0 -0
  54. package/dist/js/locales/{eu.010416cbe0a067839d4a.chunk.js.gz → eu.7734fc077f26418d6b32.chunk.js.gz} +0 -0
  55. package/dist/js/locales/{fi.7ecbf3197777fb8fd70f.chunk.js → fi.d1f8a5f4048236243b0f.chunk.js} +0 -0
  56. package/dist/js/locales/{fi.7ecbf3197777fb8fd70f.chunk.js.gz → fi.d1f8a5f4048236243b0f.chunk.js.gz} +0 -0
  57. package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js +1 -0
  58. package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js.gz +0 -0
  59. package/dist/js/locales/{hu.37c8f09717da5f1bc37c.chunk.js → hu.d0d2c38a03a3b38c2bc5.chunk.js} +0 -0
  60. package/dist/js/locales/{hu.37c8f09717da5f1bc37c.chunk.js.gz → hu.d0d2c38a03a3b38c2bc5.chunk.js.gz} +0 -0
  61. package/dist/js/locales/{it.9842f3b2b5bb3b7420c5.chunk.js → it.0c911d75c50ea83190ad.chunk.js} +0 -0
  62. package/dist/js/locales/{it.9842f3b2b5bb3b7420c5.chunk.js.gz → it.0c911d75c50ea83190ad.chunk.js.gz} +0 -0
  63. package/dist/js/locales/{nl.88085590f152551ec225.chunk.js → nl.36d288d75b3d3cbabf11.chunk.js} +0 -0
  64. package/dist/js/locales/{nl.88085590f152551ec225.chunk.js.gz → nl.36d288d75b3d3cbabf11.chunk.js.gz} +0 -0
  65. package/dist/js/locales/{no.cfa0a90ce428e087e846.chunk.js → no.8f2f465d5f785650175d.chunk.js} +0 -0
  66. package/dist/js/locales/{no.cfa0a90ce428e087e846.chunk.js.gz → no.8f2f465d5f785650175d.chunk.js.gz} +0 -0
  67. package/dist/js/locales/{pl.89540648cb16acad8d27.chunk.js → pl.06e51d7d7b09ba14714d.chunk.js} +0 -0
  68. package/dist/js/locales/{pl.89540648cb16acad8d27.chunk.js.gz → pl.06e51d7d7b09ba14714d.chunk.js.gz} +0 -0
  69. package/dist/js/locales/{pt-br.a537d1e531731dbec9dd.chunk.js → pt-br.9d19d92899e8c0917c66.chunk.js} +0 -0
  70. package/dist/js/locales/{pt-br.a537d1e531731dbec9dd.chunk.js.gz → pt-br.9d19d92899e8c0917c66.chunk.js.gz} +0 -0
  71. package/dist/js/locales/{pt.08213e494539393b14d1.chunk.js → pt.4390db3955db29b0e7dd.chunk.js} +0 -0
  72. package/dist/js/locales/{pt.08213e494539393b14d1.chunk.js.gz → pt.4390db3955db29b0e7dd.chunk.js.gz} +0 -0
  73. package/dist/js/locales/{ro.23f02315e6d9ab090aac.chunk.js → ro.705fcd327263fcf419bf.chunk.js} +0 -0
  74. package/dist/js/locales/{ro.23f02315e6d9ab090aac.chunk.js.gz → ro.705fcd327263fcf419bf.chunk.js.gz} +0 -0
  75. package/dist/js/locales/{ru.c775ae5709b4e2affc37.chunk.js → ru.8ab7e1c0d9eee7aa7afb.chunk.js} +0 -0
  76. package/dist/js/locales/{ru.c775ae5709b4e2affc37.chunk.js.gz → ru.8ab7e1c0d9eee7aa7afb.chunk.js.gz} +0 -0
  77. package/dist/js/locales/{sv.60ec4539680a48384a56.chunk.js → sv.be546e605910932db11f.chunk.js} +0 -0
  78. package/dist/js/locales/{sv.60ec4539680a48384a56.chunk.js.gz → sv.be546e605910932db11f.chunk.js.gz} +0 -0
  79. package/dist/js/locales/{tr.c19f95d7bf191aad9a74.chunk.js → tr.25a0d0f19e007e2febc9.chunk.js} +0 -0
  80. package/dist/js/locales/{tr.c19f95d7bf191aad9a74.chunk.js.gz → tr.25a0d0f19e007e2febc9.chunk.js.gz} +0 -0
  81. package/dist/js/locales/uk_UA.64a1a537c623ae0259dd.chunk.js +1 -0
  82. package/dist/js/locales/uk_UA.64a1a537c623ae0259dd.chunk.js.gz +0 -0
  83. package/dist/js/locales/{zh_CN.d27ea53dd79304789681.chunk.js → zh_CN.4b75674e4815a965ccea.chunk.js} +0 -0
  84. package/dist/js/locales/{zh_CN.d27ea53dd79304789681.chunk.js.gz → zh_CN.4b75674e4815a965ccea.chunk.js.gz} +0 -0
  85. package/dist/js/{main.d64158ea2453985dde98.entry.js → main.ad3d59f07b32feb5be60.entry.js} +3 -3
  86. package/dist/js/{main.d64158ea2453985dde98.entry.js.LICENSE.txt → main.ad3d59f07b32feb5be60.entry.js.LICENSE.txt} +0 -0
  87. package/dist/js/main.ad3d59f07b32feb5be60.entry.js.gz +0 -0
  88. package/dist/js/main.ad3d59f07b32feb5be60.entry.js.map +1 -0
  89. package/dist/js/{messages.e4523315258f6dab0f37.chunk.js → messages.d213dd0ac314a64b5a6c.chunk.js} +1 -1
  90. package/dist/js/messages.d213dd0ac314a64b5a6c.chunk.js.gz +0 -0
  91. package/dist/js/{messages.e4523315258f6dab0f37.chunk.js.map → messages.d213dd0ac314a64b5a6c.chunk.js.map} +1 -1
  92. package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js → queue.2fcf7a1381f1fb4af03f.chunk.js} +1 -1
  93. package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js.gz → queue.2fcf7a1381f1fb4af03f.chunk.js.gz} +0 -0
  94. package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js.map → queue.2fcf7a1381f1fb4af03f.chunk.js.map} +1 -1
  95. package/dist/js/{search.321f771dd92b51431378.chunk.js → search.24ec8c5fe5f45b1180a9.chunk.js} +2 -2
  96. package/dist/js/search.24ec8c5fe5f45b1180a9.chunk.js.gz +0 -0
  97. package/dist/js/{search.321f771dd92b51431378.chunk.js.map → search.24ec8c5fe5f45b1180a9.chunk.js.map} +1 -1
  98. package/dist/js/settings.83541ccd8eafaab78d16.chunk.js +2 -0
  99. package/dist/js/settings.83541ccd8eafaab78d16.chunk.js.gz +0 -0
  100. package/dist/js/settings.83541ccd8eafaab78d16.chunk.js.map +1 -0
  101. package/dist/js/{share.ecb413c8d6a1cc8a6154.chunk.js → share.d94de2f3077842a88c25.chunk.js} +2 -2
  102. package/dist/js/share.d94de2f3077842a88c25.chunk.js.gz +0 -0
  103. package/dist/js/{share.ecb413c8d6a1cc8a6154.chunk.js.map → share.d94de2f3077842a88c25.chunk.js.map} +1 -1
  104. package/dist/js/{system-log.7aa8ba9d8b4a5711c4fc.chunk.js → system-log.b3fc65678cc7480e44e0.chunk.js} +1 -1
  105. package/dist/js/system-log.b3fc65678cc7480e44e0.chunk.js.gz +0 -0
  106. package/dist/js/{system-log.7aa8ba9d8b4a5711c4fc.chunk.js.map → system-log.b3fc65678cc7480e44e0.chunk.js.map} +1 -1
  107. package/dist/js/{transfers.5a7661c5701a462d4c53.chunk.js → transfers.5ec21f789068ff2e228f.chunk.js} +2 -2
  108. package/dist/js/transfers.5ec21f789068ff2e228f.chunk.js.gz +0 -0
  109. package/dist/js/{transfers.5a7661c5701a462d4c53.chunk.js.map → transfers.5ec21f789068ff2e228f.chunk.js.map} +1 -1
  110. package/dist/sw.js +1 -1
  111. package/dist/sw.js.gz +0 -0
  112. package/package.json +53 -51
  113. package/dist/js/285.902dc3166e82226541a5.chunk.js.gz +0 -0
  114. package/dist/js/334.f72694a737e72404ed6e.chunk.js +0 -2
  115. package/dist/js/334.f72694a737e72404ed6e.chunk.js.gz +0 -0
  116. package/dist/js/334.f72694a737e72404ed6e.chunk.js.map +0 -1
  117. package/dist/js/424.b407aaf3218fa480b144.chunk.js.gz +0 -0
  118. package/dist/js/668.d0b45ae92f54a69beee3.chunk.js.gz +0 -0
  119. package/dist/js/69.8ca10b3d679cc4c52a20.chunk.js.gz +0 -0
  120. package/dist/js/69.8ca10b3d679cc4c52a20.chunk.js.map +0 -1
  121. package/dist/js/702.99e6ce480dc579b6e542.chunk.js.gz +0 -0
  122. package/dist/js/760.75d229a05d7b9bdf414b.chunk.js +0 -3
  123. package/dist/js/760.75d229a05d7b9bdf414b.chunk.js.gz +0 -0
  124. package/dist/js/760.75d229a05d7b9bdf414b.chunk.js.map +0 -1
  125. package/dist/js/favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js.gz +0 -0
  126. package/dist/js/filelists.a1ecb558a5c0c376191d.chunk.js.gz +0 -0
  127. package/dist/js/files.9b2b25680e1e04de1931.chunk.js.gz +0 -0
  128. package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js +0 -3
  129. package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js.gz +0 -0
  130. package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js.map +0 -1
  131. package/dist/js/hubs.f336a1aeaac00fab20ce.chunk.js.gz +0 -0
  132. package/dist/js/locales/fr.cf760489c7a0a9a02e31.chunk.js +0 -1
  133. package/dist/js/locales/fr.cf760489c7a0a9a02e31.chunk.js.gz +0 -0
  134. package/dist/js/locales/uk_UA.0678837b62a41e004e9c.chunk.js +0 -1
  135. package/dist/js/locales/uk_UA.0678837b62a41e004e9c.chunk.js.gz +0 -0
  136. package/dist/js/main.d64158ea2453985dde98.entry.js.gz +0 -0
  137. package/dist/js/main.d64158ea2453985dde98.entry.js.map +0 -1
  138. package/dist/js/messages.e4523315258f6dab0f37.chunk.js.gz +0 -0
  139. package/dist/js/search.321f771dd92b51431378.chunk.js.gz +0 -0
  140. package/dist/js/settings.3c031a77619c7df3a86e.chunk.js +0 -2
  141. package/dist/js/settings.3c031a77619c7df3a86e.chunk.js.gz +0 -0
  142. package/dist/js/settings.3c031a77619c7df3a86e.chunk.js.map +0 -1
  143. package/dist/js/share.ecb413c8d6a1cc8a6154.chunk.js.gz +0 -0
  144. package/dist/js/system-log.7aa8ba9d8b4a5711c4fc.chunk.js.gz +0 -0
  145. package/dist/js/transfers.5a7661c5701a462d4c53.chunk.js.gz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"js/668.d0b45ae92f54a69beee3.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/sessions.css","webpack://airdcpp-webui/./src/actions/ui/decorators/SessionActionDecorator.ts","webpack://airdcpp-webui/./src/decorators/ActiveSessionDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionFooter.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/TopMenuLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SideMenuLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/sessions.css?90b7","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionNewButton.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionMenuItem.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/SessionProviderDecorator.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".session-container.horizontal.ui.grid {\\r\\n margin: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .item.new {\\r\\n padding: .78571429em 1.1em !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .ui.vertical.menu .item>i.icon {\\r\\n margin: 0 .35714286em 0 0 !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-layout > .ui.divider {\\r\\n margin: 5px 0px 0px 0px;\\r\\n}\\r\\n\\r\\n.session-container.vertical {\\r\\n padding: 15px;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.session-layout {\\r\\n flex: 100 100 auto;\\r\\n display: flex;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-layout {\\r\\n flex-direction: column;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar {\\r\\n justify-content: space-between;\\r\\n margin: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .close-button.item:before {\\r\\n background: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .close-button.item {\\r\\n box-shadow: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\\r\\n max-height: calc(100vh - 140px);\\r\\n overflow-y: auto;\\r\\n overflow-x: hidden;\\r\\n max-width: calc(100vw - 30px);\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-item .count.label {\\r\\n margin-left: 1em !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > div {\\r\\n max-width: 90%; /* Hack, auto width won't work without \\\"overflow: hidden\\\", but that would prevent viewing the menu items */\\r\\n padding: .82857143em 0.4285714em;\\r\\n line-height: 1.2;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > div:before {\\r\\n background: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > i {\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header .ui.dropdown > i {\\r\\n margin: 0px 5px;\\r\\n}\\r\\n\\r\\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\\r\\n.session-container.horizontal .session-header .header > i,\\r\\n.session-container.vertical .session-header > i {\\r\\n width: inherit !important;\\r\\n font-size: 1.5em;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-header .ui.header {\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar {\\r\\n border-radius: 0px !important;\\r\\n padding-bottom: 0px;\\r\\n}\\r\\n\\r\\n.session-container, \\r\\n.session-layout, \\r\\n.session-container.horizontal .column {\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .column > div {\\r\\n max-height: 100%;\\r\\n}\\r\\n\\r\\n.session-container .session-item {\\r\\n overflow: hidden;\\r\\n display: flex !important;\\r\\n align-items: center;\\r\\n padding: .68571429em .92857143em !important;\\r\\n height: 35px;\\r\\n}\\r\\n\\r\\n.session-container .session-item .session-status {\\r\\n float: none !important;\\r\\n margin: 0 .5em 0 0 !important;\\r\\n}\\r\\n\\r\\n.session-container .session-item .session-name {\\r\\n overflow: hidden;\\r\\n flex: 1 1 100%;\\r\\n line-height: 1.2;\\r\\n}\\r\\n\\r\\n.session-container .session-status {\\r\\n margin-right: 5px;\\r\\n margin-top: 3px;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column {\\r\\n display: flex !important;\\r\\n flex-direction: column;\\r\\n padding-right: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .menu {\\r\\n width: initial !important;\\r\\n overflow-y: auto;\\r\\n padding-top: 10px;\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .session-item span.session-name,\\r\\n.session-container .session-header .ui.dropdown .caption {\\r\\n overflow: hidden;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.session-container .session-header .title .ui.dropdown {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.session-layout .sub.header {\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.session-layout .sub.header img {\\r\\n vertical-align: text-top;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid {\\r\\n margin-top: 7px !important;\\r\\n font-size: small;\\r\\n color: grey;\\r\\n display: flex;\\r\\n flex: 1;\\r\\n align-items: flex-end;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div:last-child > div {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div:only-child > div {\\r\\n float: inherit;\\r\\n}\\r\\n\\r\\n.session-footer .ui.checkbox {\\r\\n min-height: inherit !important;\\r\\n}\\r\\n\\r\\n.session-footer .divider {\\r\\n margin-top: 8px;\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\\r\\n/* New session layout */\\r\\n.session.new {\\r\\n flex: 100 100 0%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n overflow-y: hidden;\\r\\n margin-top: 20px;\\r\\n padding: 1px;\\r\\n}\\r\\n\\r\\n.session.new .recents {\\r\\n flex: 100 100 0%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n margin-top: 20px;\\r\\n overflow-y: hidden;\\r\\n}\\r\\n\\r\\n.session.new .recents .list {\\r\\n padding: 3px 5px;\\r\\n flex: 100 100 0%;\\r\\n overflow-y: auto;\\r\\n overflow-x: hidden;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/sessions.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,sBAAsB;AACxB;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,oCAAoC;AACtC;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,aAAa;EACb,sBAAsB;EACtB,uBAAuB;AACzB;;AAEA;EACE,kBAAkB;EAClB,aAAa;EACb,gBAAgB;AAClB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,8BAA8B;EAC9B,sBAAsB;AACxB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,+BAA+B;EAC/B,gBAAgB;EAChB,kBAAkB;EAClB,6BAA6B;AAC/B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,YAAY;AACd;;AAEA;EACE,cAAc,EAAE,2GAA2G;EAC3H,gCAAgC;EAChC,gBAAgB;AAClB;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,eAAe;AACjB;;AAEA,oEAAoE;AACpE;;EAEE,yBAAyB;EACzB,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,wBAAwB;EACxB,mBAAmB;EACnB,2CAA2C;EAC3C,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,6BAA6B;AAC/B;;AAEA;EACE,gBAAgB;EAChB,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,eAAe;AACjB;;AAEA;EACE,wBAAwB;EACxB,sBAAsB;EACtB,6BAA6B;AAC/B;;AAEA;EACE,yBAAyB;EACzB,gBAAgB;EAChB,iBAAiB;EACjB,OAAO;AACT;;AAEA;;EAEE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,0BAA0B;EAC1B,gBAAgB;EAChB,WAAW;EACX,aAAa;EACb,OAAO;EACP,qBAAqB;AACvB;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,8BAA8B;AAChC;;AAEA;EACE,eAAe;EACf,kBAAkB;AACpB;;AAEA,uBAAuB;AACvB;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,kBAAkB;EAClB,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;AACpB\",\"sourcesContent\":[\".session-container.horizontal.ui.grid {\\r\\n margin: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .item.new {\\r\\n padding: .78571429em 1.1em !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .ui.vertical.menu .item>i.icon {\\r\\n margin: 0 .35714286em 0 0 !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-layout > .ui.divider {\\r\\n margin: 5px 0px 0px 0px;\\r\\n}\\r\\n\\r\\n.session-container.vertical {\\r\\n padding: 15px;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.session-layout {\\r\\n flex: 100 100 auto;\\r\\n display: flex;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-layout {\\r\\n flex-direction: column;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar {\\r\\n justify-content: space-between;\\r\\n margin: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .close-button.item:before {\\r\\n background: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .close-button.item {\\r\\n box-shadow: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\\r\\n max-height: calc(100vh - 140px);\\r\\n overflow-y: auto;\\r\\n overflow-x: hidden;\\r\\n max-width: calc(100vw - 30px);\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-item .count.label {\\r\\n margin-left: 1em !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > div {\\r\\n max-width: 90%; /* Hack, auto width won't work without \\\"overflow: hidden\\\", but that would prevent viewing the menu items */\\r\\n padding: .82857143em 0.4285714em;\\r\\n line-height: 1.2;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > div:before {\\r\\n background: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > i {\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header .ui.dropdown > i {\\r\\n margin: 0px 5px;\\r\\n}\\r\\n\\r\\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\\r\\n.session-container.horizontal .session-header .header > i,\\r\\n.session-container.vertical .session-header > i {\\r\\n width: inherit !important;\\r\\n font-size: 1.5em;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-header .ui.header {\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar {\\r\\n border-radius: 0px !important;\\r\\n padding-bottom: 0px;\\r\\n}\\r\\n\\r\\n.session-container, \\r\\n.session-layout, \\r\\n.session-container.horizontal .column {\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .column > div {\\r\\n max-height: 100%;\\r\\n}\\r\\n\\r\\n.session-container .session-item {\\r\\n overflow: hidden;\\r\\n display: flex !important;\\r\\n align-items: center;\\r\\n padding: .68571429em .92857143em !important;\\r\\n height: 35px;\\r\\n}\\r\\n\\r\\n.session-container .session-item .session-status {\\r\\n float: none !important;\\r\\n margin: 0 .5em 0 0 !important;\\r\\n}\\r\\n\\r\\n.session-container .session-item .session-name {\\r\\n overflow: hidden;\\r\\n flex: 1 1 100%;\\r\\n line-height: 1.2;\\r\\n}\\r\\n\\r\\n.session-container .session-status {\\r\\n margin-right: 5px;\\r\\n margin-top: 3px;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column {\\r\\n display: flex !important;\\r\\n flex-direction: column;\\r\\n padding-right: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .menu {\\r\\n width: initial !important;\\r\\n overflow-y: auto;\\r\\n padding-top: 10px;\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .session-item span.session-name,\\r\\n.session-container .session-header .ui.dropdown .caption {\\r\\n overflow: hidden;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.session-container .session-header .title .ui.dropdown {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.session-layout .sub.header {\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.session-layout .sub.header img {\\r\\n vertical-align: text-top;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid {\\r\\n margin-top: 7px !important;\\r\\n font-size: small;\\r\\n color: grey;\\r\\n display: flex;\\r\\n flex: 1;\\r\\n align-items: flex-end;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div:last-child > div {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div:only-child > div {\\r\\n float: inherit;\\r\\n}\\r\\n\\r\\n.session-footer .ui.checkbox {\\r\\n min-height: inherit !important;\\r\\n}\\r\\n\\r\\n.session-footer .divider {\\r\\n margin-top: 8px;\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\\r\\n/* New session layout */\\r\\n.session.new {\\r\\n flex: 100 100 0%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n overflow-y: hidden;\\r\\n margin-top: 20px;\\r\\n padding: 1px;\\r\\n}\\r\\n\\r\\n.session.new .recents {\\r\\n flex: 100 100 0%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n margin-top: 20px;\\r\\n overflow-y: hidden;\\r\\n}\\r\\n\\r\\n.session.new .recents .list {\\r\\n padding: 3px 5px;\\r\\n flex: 100 100 0%;\\r\\n overflow-y: auto;\\r\\n overflow-x: hidden;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import SocketService from 'services/SocketService';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ntype SessionType = UI.SessionItemBase;\r\n\r\nexport default function (\r\n actions: UI.ActionListType<SessionType>, \r\n sessionsUrl: string, \r\n editAccess: API.AccessEnum\r\n) {\r\n const handleRemoveSession: UI.ActionHandler<SessionType> = (\r\n { data: session }\r\n ) => {\r\n return SocketService.delete(`${sessionsUrl}/${session.id}`);\r\n };\r\n \r\n const SessionActions: UI.ActionListType<SessionType> = {\r\n divider: null,\r\n removeSession: { \r\n displayName: 'Close',\r\n access: editAccess,\r\n icon: IconConstants.REMOVE,\r\n handler: handleRemoveSession,\r\n }\r\n };\r\n\r\n return Object.assign(actions, SessionActions);\r\n}","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport LocalSettingStore from 'stores/LocalSettingStore';\r\nimport { LocalSettings } from 'constants/SettingConstants';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/SessionLayout';\r\n\r\n\r\ntype SessionType = UI.SessionItemBase;\r\n\r\ninterface ActiveSessionDecoratorProps<SessionT extends SessionType, ActionT extends object> \r\n extends Pick<SessionChildProps<SessionT, ActionT>, 'session'> {\r\n\r\n sessionApi: UI.SessionActions<SessionT> & ActionT;\r\n //uiActions: \r\n //session: SessionT;\r\n}\r\n\r\n// This decorator will fire updates for currently active session\r\n// and set them as read\r\nexport default function <PropsT, SessionT extends SessionType, ActionT extends object = {}>(\r\n Component: React.ComponentType<PropsT>, \r\n useReadDelay: boolean = false\r\n) {\r\n class ActiveSessionDecorator extends React.Component<PropsT & ActiveSessionDecoratorProps<SessionT, ActionT>> {\r\n /*static propTypes = {\r\n session: PropTypes.any, // Required (cloned)\r\n actions: PropTypes.object, // Required (cloned)\r\n };*/\r\n\r\n readTimeout: number | undefined;\r\n\r\n setRead = (session: SessionT) => {\r\n this.props.sessionApi.setRead(session);\r\n this.readTimeout = undefined;\r\n }\r\n\r\n setSession = (session: SessionT | null) => {\r\n if (this.readTimeout) {\r\n // Set the previously active session as read\r\n clearTimeout(this.readTimeout);\r\n this.setRead(this.props.session);\r\n }\r\n\r\n this.props.sessionApi.sessionChanged(session);\r\n if (!session) {\r\n return;\r\n }\r\n\r\n const timeout = !useReadDelay ? 0 : LocalSettingStore.getValue<number>(LocalSettings.UNREAD_LABEL_DELAY) * 1000;\r\n this.readTimeout = window.setTimeout(() => this.setRead(session), timeout);\r\n }\r\n\r\n componentDidMount() {\r\n this.setSession(this.props.session);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.setSession(null);\r\n }\r\n\r\n componentDidUpdate(prevProps: ActiveSessionDecoratorProps<SessionT, ActionT>) {\r\n if (this.props.session.id !== prevProps.session.id) {\r\n this.setSession(this.props.session);\r\n }\r\n }\r\n\r\n render() {\r\n return <Component { ...this.props }/>;\r\n }\r\n }\r\n\r\n return ActiveSessionDecorator;\r\n}\r\n","import * as React from 'react';\r\n\r\n\r\ninterface FooterItemProps {\r\n label?: string;\r\n text: string | React.ReactElement<any>;\r\n}\r\n\r\nexport const FooterItem: React.FC<FooterItemProps> = ({ label, text }) => (\r\n <div className=\"grid-item\">\r\n <div className=\"item-inner\">\r\n { !!label && typeof text === 'string' ? `${label}: ${text}` : text }\r\n </div>\r\n </div>\r\n);\r\n\r\nexport const SessionFooter: React.FC = ({ children }) => (\r\n <div className=\"session-footer\">\r\n <div className=\"ui footer divider\"/>\r\n <div className=\"info-grid ui\">\r\n { children }\r\n </div>\r\n </div>\r\n);","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport ActionButton from 'components/ActionButton';\r\nimport SectionedDropdown from 'components/semantic/SectionedDropdown';\r\nimport MenuSection from 'components/semantic/MenuSection';\r\nimport { MenuIcon } from 'components/menu/MenuIcon';\r\nimport { SessionMainLayoutProps } from './SessionLayout';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\n\r\ntype SessionDropdownProps<SessionT extends UI.SessionItemBase> = \r\n Pick<\r\n SessionMainLayoutProps<SessionT>, \r\n 'sessionMenuItems' | 'newButton' | 'unreadInfoStore' | 'listActionMenuGetter' | 't'\r\n >;\r\n\r\nconst SessionDropdown = <SessionT extends UI.SessionItemBase>({ \r\n sessionMenuItems, newButton, unreadInfoStore, listActionMenuGetter, t\r\n}: SessionDropdownProps<SessionT>) => (\r\n <SectionedDropdown \r\n triggerIcon={ <MenuIcon urgencies={ unreadInfoStore ? unreadInfoStore.getTotalUrgencies() : null } />}\r\n >\r\n <MenuSection caption={ translate('New', t, UI.Modules.COMMON) }>\r\n { newButton }\r\n </MenuSection>\r\n <MenuSection caption={ translate('Current sessions', t, UI.Modules.COMMON) }>\r\n { sessionMenuItems }\r\n </MenuSection>\r\n <MenuSection>\r\n { listActionMenuGetter() }\r\n </MenuSection>\r\n </SectionedDropdown>\r\n);\r\n\r\n\r\ntype CloseButtonProps<SessionT extends UI.SessionItemBase> = \r\n Pick<SessionMainLayoutProps<SessionT>, 'actions' | 'activeItem'>;\r\n\r\nconst CloseButton = <SessionT extends UI.SessionItemBase>(\r\n { actions, activeItem }: CloseButtonProps<SessionT>\r\n) => {\r\n if (!activeItem || useMobileLayout()) {\r\n return null;\r\n }\r\n\r\n return (\r\n <ActionButton \r\n className=\"basic small item close-button\"\r\n actions={ actions } \r\n actionId=\"removeSession\"\r\n itemData={ activeItem }\r\n icon={ IconConstants.CLOSE }\r\n //moduleId={ moduleId }\r\n />\r\n );\r\n};\r\n\r\ntype SessionItemHeaderProps = Pick<SessionMainLayoutProps<any>, 'itemHeaderIcon' | 'itemHeaderTitle'>;\r\n\r\nconst SessionItemHeader: React.FC<SessionItemHeaderProps> = ({ itemHeaderIcon, itemHeaderTitle }) => (\r\n <div className=\"session-header\">\r\n { itemHeaderIcon }\r\n { itemHeaderTitle }\r\n </div>\r\n);\r\n\r\nconst TopMenuLayout = <SessionT extends UI.SessionItemBase>(\r\n { children, onKeyDown, ...props }: SessionMainLayoutProps<SessionT>\r\n) => (\r\n <div \r\n className=\"session-container vertical\" \r\n onKeyDown={ onKeyDown } \r\n tabIndex={ 0 }\r\n >\r\n <div className=\"ui main menu menu-bar\">\r\n <div className=\"content-left\">\r\n <SessionDropdown { ...props }/>\r\n <SessionItemHeader { ...props }/>\r\n </div>\r\n <CloseButton { ...props }/>\r\n </div>\r\n\r\n <div className=\"session-layout\">\r\n { children }\r\n </div>\r\n </div>\r\n);\r\n\r\n/*TopMenuLayout.propTypes = {\r\n itemHeaderTitle: PropTypes.node.isRequired,\r\n itemHeaderIcon: PropTypes.node.isRequired,\r\n activeItem: PropTypes.object,\r\n newButton: PropTypes.node,\r\n sessionMenuItems: PropTypes.array.isRequired,\r\n closeAction: PropTypes.func.isRequired,\r\n listActionMenuGetter: PropTypes.func.isRequired,\r\n};*/\r\n\r\nexport default TopMenuLayout;\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport LayoutHeader from 'components/semantic/LayoutHeader';\r\nimport { SessionMainLayoutProps } from './SessionLayout';\r\nimport { Grid } from 'components/semantic/Grid';\r\n\r\n\r\nconst SideMenuLayout: React.FC<SessionMainLayoutProps<any /*SessionT*/>> = ({ \r\n sessionMenuItems, newButton,\r\n itemHeaderIcon, itemHeaderTitle, children,\r\n itemHeaderDescription, onKeyDown,\r\n}) => {\r\n\r\n if (newButton) {\r\n newButton = React.cloneElement(newButton, { \r\n className: newButton.props.className + ' ui fluid button' \r\n });\r\n }\r\n\r\n return (\r\n <Grid \r\n className=\"session-container horizontal\" \r\n onKeyDown={ onKeyDown }\r\n tabIndex={ 0 }\r\n >\r\n <div className=\"four wide column menu-column\">\r\n { newButton }\r\n { !!sessionMenuItems.length && (\r\n <div className=\"ui vertical secondary menu\">\r\n { sessionMenuItems}\r\n </div>\r\n )\r\n }\r\n </div>\r\n <div className=\"twelve wide stretched column content-column session\">\r\n <div className=\"ui segment session-layout\">\r\n <LayoutHeader\r\n className=\"session-header\"\r\n icon={ itemHeaderIcon }\r\n title={ <div className=\"title\">{ itemHeaderTitle }</div> }\r\n subHeader={ itemHeaderDescription }\r\n />\r\n <div className=\"ui divider\" style={{ margin: '5px 0px 0px 0px' }}/>\r\n { children }\r\n </div>\r\n </div>\r\n </Grid>\r\n );\r\n};\r\n\r\n/*SideMenuLayout.propTypes = {\r\n newButton: PropTypes.node,\r\n sessionMenuItems: PropTypes.array.isRequired,\r\n\r\n itemHeaderTitle: PropTypes.node,\r\n itemHeaderIcon: PropTypes.node,\r\n itemHeaderDescription: PropTypes.node.isRequired,\r\n};*/\r\n\r\nexport default SideMenuLayout;\r\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./sessions.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./sessions.css\";\n export default content && content.locals ? content.locals : undefined;\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport RouterMenuItemLink from 'components/semantic/RouterMenuItemLink';\r\n\r\n\r\ntype PushHandler = () => void;\r\n\r\nconst onClick = (evt: React.SyntheticEvent, pushNew: PushHandler) => {\r\n evt.preventDefault();\r\n\r\n pushNew();\r\n};\r\n\r\n\r\ninterface SessionNewButtonProps {\r\n url: string;\r\n title: React.ReactNode;\r\n className?: string;\r\n pushNew: PushHandler;\r\n}\r\n\r\nconst SessionNewButton: React.FC<SessionNewButtonProps> = ({ url, title, pushNew, className }) => (\r\n <RouterMenuItemLink \r\n key=\"button-new\" \r\n className={ classNames('new', className) }\r\n icon={ IconConstants.CREATE }\r\n url={ url } \r\n onClick={ (evt: React.SyntheticEvent) => onClick(evt, pushNew) }\r\n >\r\n { title }\r\n </RouterMenuItemLink>\r\n);\r\n\r\n/*SessionNewButton.propTypes = {\r\n // Base URL of the section\r\n url: PropTypes.string.isRequired,\r\n\r\n // Title of the button\r\n title: PropTypes.node.isRequired,\r\n\r\n pushNew: PropTypes.func.isRequired,\r\n\r\n className: PropTypes.string,\r\n};*/\r\n\r\nexport default SessionNewButton;","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport RouterMenuItemLink from 'components/semantic/RouterMenuItemLink';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ntype PushSessionHandler = (id: API.IdType) => void;\r\n\r\nconst onClickItem = (\r\n evt: React.SyntheticEvent, \r\n sessionItem: UI.SessionItemBase, \r\n pushSession: PushSessionHandler\r\n) => {\r\n evt.preventDefault();\r\n\r\n pushSession(sessionItem.id);\r\n};\r\n\r\ninterface SessionMenuItemProps {\r\n url: string;\r\n name: React.ReactNode;\r\n unreadInfoStore: any;\r\n status: React.ReactElement<any>;\r\n sessionItem: UI.SessionItemBase;\r\n\r\n pushSession: PushSessionHandler;\r\n}\r\n\r\nconst SessionMenuItem: React.FC<SessionMenuItemProps> = (\r\n { sessionItem, status, name, unreadInfoStore, url, pushSession }\r\n) => (\r\n <RouterMenuItemLink \r\n url={ url } \r\n className=\"session-item\" \r\n onClick={ (evt: React.SyntheticEvent) => onClickItem(evt, sessionItem, pushSession) }\r\n icon={ status }\r\n session={ sessionItem }\r\n unreadInfoStore={ unreadInfoStore }\r\n >\r\n <span className=\"session-name\">\r\n { name }\r\n </span>\r\n </RouterMenuItemLink>\r\n);\r\n\r\n/*SessionMenuItem.propTypes = {\r\n // Item URL\r\n url: PropTypes.string.isRequired,\r\n\r\n name: PropTypes.node.isRequired,\r\n\r\n unreadInfoStore: PropTypes.object.isRequired,\r\n\r\n status: PropTypes.node.isRequired,\r\n\r\n sessionItem: PropTypes.object.isRequired,\r\n\r\n pushSession: PropTypes.func.isRequired,\r\n};*/\r\n\r\nexport default SessionMenuItem;","import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\nimport { Route, RouteComponentProps } from 'react-router-dom';\r\nimport invariant from 'invariant';\r\n\r\nimport History from 'utils/History';\r\nimport Loader from 'components/semantic/Loader';\r\n\r\nimport TopMenuLayout from './TopMenuLayout';\r\nimport SideMenuLayout from './SideMenuLayout';\r\n\r\nimport '../sessions.css';\r\n\r\nimport { ActionMenu } from 'components/menu';\r\nimport SessionNewButton from './SessionNewButton';\r\nimport SessionMenuItem from './SessionMenuItem';\r\n\r\nimport Icon, { IconType } from 'components/semantic/Icon';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\nimport { loadLocalProperty, saveLocalProperty, useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { getModuleT, translate, toI18nKey } from 'utils/TranslationUtils';\r\nimport { TFunction } from 'i18next';\r\nimport { LayoutWidthContext, LayoutWidthContextType } from 'context/LayoutWidthContext';\r\n\r\n\r\n\r\nexport type SessionBaseType = UI.SessionItemBase;\r\n\r\nconst findItem = <SessionT extends SessionBaseType>(items: SessionT[], id: API.IdType | null): SessionT | undefined => {\r\n return items.find(item => item.id === id);\r\n};\r\n\r\nexport interface SessionLayoutProps<\r\n SessionT extends SessionBaseType = SessionBaseType,\r\n SessionApiT extends object = {},\r\n UIActionT extends UI.ActionListType<UI.SessionItemBase> = {}\r\n> extends UI.SessionInfoGetter<SessionT>, Omit<RouteComponentProps, 'match'> {\r\n // Unique ID of the section (used for storing and loading the previously open tab)\r\n baseUrl: string;\r\n\r\n // Array of the items to list\r\n items: SessionT[];\r\n\r\n // Session actions (should contain 'removeSession')\r\n /*actions: UI.ModuleActions<SessionT> & {\r\n actions: UI.SessionUIActions<SessionT, ActionT>;\r\n };*/\r\n\r\n uiActions: UI.ModuleActions<SessionT, UIActionT>;\r\n sessionApi: UI.SessionActions<SessionT> & SessionApiT;\r\n\r\n // Session actions to show in the action menu\r\n actionIds?: string[];\r\n\r\n // Item ID that is currently active (if any)\r\n activeId: API.IdType | null;\r\n\r\n // Label for button that opens a new session\r\n newCaption?: React.ReactNode;\r\n\r\n // Label for button that opens a new session\r\n newDescription?: React.ReactNode;\r\n\r\n // Label for button that opens a new session\r\n newIcon?: IconType;\r\n\r\n // Set to false if the side menu should never be shown (the session will use all width that is available)\r\n disableSideMenu?: boolean;\r\n\r\n // AccessConstant defining whether the user has edit permission \r\n editAccess: API.AccessEnum;\r\n\r\n sessionItemLayout: React.ComponentType<SessionChildProps<SessionT>>;\r\n\r\n newLayout?: React.ComponentType<NewSessionLayoutProps>;\r\n\r\n unreadInfoStore: any;\r\n \r\n t: TFunction;\r\n}\r\n\r\nexport interface SessionLocationState {\r\n pending?: boolean;\r\n}\r\n\r\nexport interface SessionMainLayoutProps<SessionT extends SessionBaseType, ActionT extends object = {}> extends \r\n Pick<SessionLayoutProps<SessionT>, 'unreadInfoStore'> {\r\n\r\n newButton: React.ReactElement<any> | null;\r\n listActionMenuGetter: () => React.ReactNode;\r\n sessionMenuItems: React.ReactNode[];\r\n //closeAction: UI.SessionActions<SessionT, ActionT>['removeSession'];\r\n activeItem: SessionT | null;\r\n\r\n itemHeaderTitle: React.ReactNode;\r\n itemHeaderDescription: React.ReactNode;\r\n itemHeaderIcon: IconType;\r\n onKeyDown: (event: React.KeyboardEvent) => void;\r\n children: React.ReactNode;\r\n\r\n //moduleId: string;\r\n actions: SessionLayoutProps<SessionT>['uiActions'];\r\n t: TFunction;\r\n}\r\n\r\ninterface State<SessionT extends SessionBaseType> {\r\n activeItem: SessionT | null;\r\n}\r\n\r\nexport type SessionChildProps<\r\n SessionT extends SessionBaseType, \r\n SessionApiT extends object = {}, \r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase> = {}\r\n> = Pick<SessionLayoutProps<SessionT, SessionApiT, UIActionsT>, 'location' | 'sessionApi' | 'uiActions'> & \r\n { \r\n session: SessionT;\r\n sessionT: UI.ModuleTranslator;\r\n };\r\n\r\nexport interface NewSessionLayoutProps extends RouteComponentProps {\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass SessionLayout<SessionT extends SessionBaseType, ActionT extends object> \r\n extends React.Component<SessionLayoutProps<SessionT, ActionT>, State<SessionT>> {\r\n\r\n static displayName = 'SessionLayout';\r\n\r\n static propTypes = {\r\n // Unique ID of the section (used for storing and loading the previously open tab)\r\n baseUrl: PropTypes.string.isRequired,\r\n\r\n // Location object\r\n location: PropTypes.object.isRequired,\r\n\r\n // Array of the items to list\r\n items: PropTypes.array.isRequired,\r\n\r\n // If no function is supplied, the item name will be used\r\n itemHeaderTitleGetter: PropTypes.func,\r\n\r\n // Function receiving an item object that returns the description (subheader) of the item\r\n itemHeaderDescriptionGetter: PropTypes.func.isRequired,\r\n\r\n // Function receiving an item object that returns icon for a item\r\n itemHeaderIconGetter: PropTypes.func.isRequired,\r\n\r\n // Store containing information about unread items\r\n unreadInfoStore: PropTypes.object,\r\n\r\n // Function receiving an item object that returns the display name\r\n itemNameGetter: PropTypes.func.isRequired,\r\n\r\n // Function receiving the circular color label in front of the item\r\n itemStatusGetter: PropTypes.func,\r\n\r\n // Session actions (should contain 'removeSession')\r\n uiActions: PropTypes.object.isRequired,\r\n\r\n // Session actions to show in the action menu\r\n actionIds: PropTypes.array,\r\n\r\n // Item ID that is currently active (if any)\r\n activeId: PropTypes.any,\r\n\r\n // Label for button that opens a new session\r\n newCaption: PropTypes.any,\r\n\r\n // Label for button that opens a new session\r\n newDescription: PropTypes.any,\r\n\r\n // Label for button that opens a new session\r\n newIcon: PropTypes.any,\r\n\r\n // Set to false if the side menu should never be shown (the session will use all width that is available)\r\n disableSideMenu: PropTypes.bool,\r\n\r\n // AccessConstant defining whether the user has edit permission \r\n editAccess: PropTypes.string.isRequired,\r\n\r\n sessionItemLayout: PropTypes.any.isRequired,\r\n\r\n newLayout: PropTypes.func,\r\n };\r\n\r\n state: State<SessionT> = {\r\n activeItem: null\r\n };\r\n\r\n static contextType = LayoutWidthContext;\r\n context: LayoutWidthContextType;\r\n\r\n // HELPERS\r\n getSessionUrl = (id: API.IdType) => {\r\n invariant(!!id, 'Trying to get session URL without a session');\r\n return `/${this.props.baseUrl}/session/${id}`;\r\n }\r\n\r\n getNewUrl = () => {\r\n return `/${this.props.baseUrl}/new`;\r\n }\r\n\r\n getStorageKey = (props: SessionLayoutProps<SessionT>) => {\r\n return `${props.baseUrl}_last_active`;\r\n }\r\n\r\n pushSession = (id: API.IdType) => {\r\n History.push(this.getSessionUrl(id));\r\n }\r\n\r\n replaceSession = (id: API.IdType) => {\r\n History.replace(this.getSessionUrl(id));\r\n }\r\n\r\n pushNew = () => {\r\n History.push(this.getNewUrl());\r\n }\r\n\r\n hasEditAccess = () => {\r\n return LoginStore.hasAccess(this.props.editAccess);\r\n }\r\n\r\n // LIFECYCLE/REACT\r\n UNSAFE_componentWillReceiveProps(nextProps: SessionLayoutProps<SessionT>) {\r\n if (nextProps.location.pathname === this.getNewUrl()) {\r\n // Don't redirect to it if the \"new session\" layout is open\r\n if (this.state.activeItem) {\r\n this.setState({ activeItem: null });\r\n }\r\n return;\r\n }\r\n\r\n if (this.checkActiveItem(nextProps)) {\r\n // We got an item\r\n return;\r\n }\r\n\r\n // The old tab was closed or we didn't have any session before\r\n\r\n\r\n let newItemPos = 0;\r\n const oldItem = findItem(this.props.items, this.props.activeId);\r\n if (oldItem) {\r\n // Find the old position and use the item in that position (if possible)\r\n newItemPos = this.props.items.indexOf(oldItem);\r\n if (newItemPos === this.props.items.length - 1) {\r\n // The last item was removed\r\n newItemPos = newItemPos - 1;\r\n }\r\n }\r\n\r\n this.replaceSession(nextProps.items[newItemPos].id);\r\n }\r\n\r\n // Common logic for selecting the item to display (after mounting or session updates)\r\n // Returns true active item selection was handled\r\n // Returns false if the active item couldn't be selected but there are valid items to choose from by the caller\r\n checkActiveItem = (props: SessionLayoutProps<SessionT>) => {\r\n // Did we just create this session?\r\n const routerLocation = props.location;\r\n const pending = routerLocation.state && (routerLocation.state as SessionLocationState).pending;\r\n\r\n // Update the active item\r\n const activeItem = findItem(props.items, props.activeId);\r\n if (activeItem) {\r\n if (pending) {\r\n // Disable pending state\r\n History.replace({\r\n //path: routerLocation.pathname,\r\n state: {\r\n pending: false,\r\n }\r\n });\r\n\r\n return true;\r\n }\r\n\r\n this.setState({ activeItem: activeItem });\r\n saveLocalProperty(this.getStorageKey(props), props.activeId);\r\n return true;\r\n } else if (pending) {\r\n // We'll just display a loading indicator in 'render', no item needed\r\n return true;\r\n } else if (/*routerLocation.action === 'POP' ||*/ props.items.length === 0) {\r\n // Browsing from history and item removed (or all items removed)... go to \"new session\" page\r\n History.replace(this.getNewUrl());\r\n this.setState({ activeItem: null });\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n onKeyDown = (event: React.KeyboardEvent) => {\r\n const { key, altKey } = event;\r\n\r\n if (altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\r\n // Arrow up/down\r\n event.preventDefault();\r\n\r\n const { items, activeId } = this.props;\r\n const item = findItem(items, activeId);\r\n if (!item) {\r\n return;\r\n }\r\n\r\n const currentIndex = items.indexOf(item);\r\n if (currentIndex === -1) {\r\n return;\r\n }\r\n\r\n const newSession = items[key === 'ArrowUp' ? currentIndex - 1 : currentIndex + 1];\r\n if (newSession) {\r\n this.pushSession(newSession.id);\r\n }\r\n } else if (altKey && key === 'Insert') {\r\n // Insert\r\n event.preventDefault();\r\n\r\n History.replace(this.getNewUrl());\r\n } else if (altKey && key === 'Delete') {\r\n // Delete\r\n event.preventDefault();\r\n\r\n const { items, activeId, sessionApi } = this.props;\r\n const item = findItem(items, activeId);\r\n if (!!item) {\r\n sessionApi.removeSession(item);\r\n }\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n // Opening an item directly? Or no items?\r\n if (this.checkActiveItem(this.props)) {\r\n return;\r\n }\r\n\r\n // See if we have something stored\r\n let lastId = loadLocalProperty<API.IdType>(this.getStorageKey(this.props));\r\n if (lastId && findItem(this.props.items, lastId)) {\r\n // Previous session exists\r\n this.replaceSession(lastId);\r\n } else if (this.props.items.length > 0) {\r\n // Load the first session\r\n this.replaceSession(this.props.items[0].id);\r\n }\r\n }\r\n\r\n // COMPONENT GETTERS\r\n getItemStatus = (sessionItem: SessionT) => {\r\n const { itemStatusGetter, itemHeaderIconGetter } = this.props;\r\n if (itemStatusGetter) {\r\n return <div className={ 'ui session-status empty circular left mini label ' + itemStatusGetter(sessionItem) }/>;\r\n }\r\n\r\n return <Icon icon={ itemHeaderIconGetter(sessionItem) }/>;\r\n }\r\n\r\n getSessionMenuItem = (sessionItem: SessionT) => {\r\n return (\r\n <SessionMenuItem \r\n key={ sessionItem.id } \r\n url={ this.getSessionUrl(sessionItem.id) }\r\n name={ this.props.itemNameGetter(sessionItem) }\r\n unreadInfoStore={ this.props.unreadInfoStore }\r\n status={ this.getItemStatus(sessionItem) }\r\n sessionItem={ sessionItem }\r\n pushSession={ this.pushSession }\r\n />\r\n );\r\n }\r\n\r\n getItemHeaderTitle = () => {\r\n const { uiActions, actionIds, itemNameGetter, itemHeaderTitleGetter } = this.props;\r\n\r\n const { activeItem } = this.state;\r\n if (!activeItem) {\r\n return <div>{ this.props.newCaption }</div>;\r\n }\r\n\r\n let ids;\r\n if (actionIds) {\r\n ids = [ ...actionIds, 'divider', 'removeSession' ];\r\n }\r\n\r\n const actionMenu = (\r\n <ActionMenu \r\n caption={ itemNameGetter(activeItem) }\r\n actions={ uiActions }\r\n itemData={ activeItem }\r\n ids={ ids }\r\n />\r\n );\r\n\r\n // Use the header getter only if there is a getter that returns a valid value\r\n if (itemHeaderTitleGetter) {\r\n const header = itemHeaderTitleGetter(activeItem, this.props.location, actionMenu);\r\n if (header) {\r\n return header;\r\n }\r\n }\r\n\r\n return actionMenu;\r\n }\r\n\r\n getItemHeaderDescription = () => {\r\n const { activeItem } = this.state;\r\n const { itemHeaderDescriptionGetter, newDescription } = this.props;\r\n if (!activeItem) {\r\n return newDescription;\r\n }\r\n\r\n return itemHeaderDescriptionGetter(activeItem);\r\n }\r\n\r\n getItemHeaderIcon = () => {\r\n const { activeItem } = this.state;\r\n const { itemHeaderIconGetter, newIcon } = this.props;\r\n return <Icon icon={ activeItem ? itemHeaderIconGetter(activeItem) : newIcon }/>;\r\n }\r\n\r\n getNewButton = () => {\r\n if (!this.hasEditAccess() || !this.props.newCaption) {\r\n return null;\r\n }\r\n\r\n return (\r\n <SessionNewButton \r\n key=\"new-button\" \r\n title={ this.props.newCaption } \r\n url={ this.getNewUrl() } \r\n pushNew={ this.pushNew }\r\n />\r\n );\r\n }\r\n\r\n handleCloseAll = () => {\r\n const { sessionApi, items } = this.props;\r\n items.forEach(session => sessionApi.removeSession(session));\r\n }\r\n\r\n getListActionMenu = () => {\r\n const { items, t } = this.props;\r\n if (!this.hasEditAccess() || items.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <MenuItemLink \r\n key=\"close\"\r\n onClick={ this.handleCloseAll }\r\n icon={ IconConstants.REMOVE }\r\n >\r\n { translate('Close all', t, UI.Modules.COMMON) }\r\n </MenuItemLink>\r\n );\r\n }\r\n\r\n sessionT = getModuleT(this.props.t, this.props.uiActions.moduleId);\r\n render() {\r\n const { \r\n disableSideMenu, /*width,*/ items, unreadInfoStore, location, t, sessionApi,\r\n uiActions, newLayout: NewLayout, sessionItemLayout: SessionItemLayout, activeId \r\n } = this.props;\r\n \r\n if (!this.hasEditAccess() && items.length === 0) {\r\n // Nothing to show\r\n return (\r\n <Message \r\n title={ translate('No items to show', t, UI.Modules.COMMON) } \r\n description={ t<string>(\r\n toI18nKey('noSessionEditAccess', UI.Modules.COMMON), \r\n `You aren't allowed to open new sessions`\r\n ) }\r\n />\r\n );\r\n }\r\n\r\n const { activeItem } = this.state;\r\n const useTopMenu = disableSideMenu || useMobileLayout(this.context);\r\n\r\n const Component = useTopMenu ? TopMenuLayout : SideMenuLayout;\r\n return (\r\n <Component \r\n itemHeaderTitle={ this.getItemHeaderTitle() }\r\n itemHeaderDescription={ this.getItemHeaderDescription() }\r\n itemHeaderIcon={ this.getItemHeaderIcon() }\r\n\r\n activeItem={ activeItem }\r\n unreadInfoStore={ unreadInfoStore }\r\n //closeAction={ actions.actions.removeSession }\r\n newButton={ this.getNewButton() }\r\n sessionMenuItems={ items.map(this.getSessionMenuItem) }\r\n listActionMenuGetter={ this.getListActionMenu }\r\n onKeyDown={ this.onKeyDown }\r\n //moduleId={ actions.moduleId }\r\n actions={ uiActions }\r\n t={ t }\r\n >\r\n <Route\r\n path={ this.getSessionUrl(':id') }\r\n render={ props => {\r\n if (!activeItem) {\r\n const { state } = this.props.location;\r\n if (!!state && (state as SessionLocationState).pending) {\r\n // The session was just created\r\n return <Loader text={ translate('Waiting for server response', t, UI.Modules.COMMON) }/>;\r\n } else if (activeId || items.length !== 0) {\r\n // Redirecting to a new page\r\n return <Loader text={ translate('Loading session', t, UI.Modules.COMMON) }/>;\r\n }\r\n\r\n console.error('SessionLayout route: active session missing');\r\n return;\r\n }\r\n\r\n // We have a session\r\n return (\r\n <SessionItemLayout\r\n session={ activeItem }\r\n sessionApi={ sessionApi }\r\n uiActions={ uiActions }\r\n location={ location }\r\n sessionT={ this.sessionT }\r\n />\r\n );\r\n } }\r\n />\r\n { !!NewLayout && (\r\n <Route\r\n path={ this.getNewUrl() }\r\n render={ props => (\r\n <NewLayout\r\n { ...props }\r\n sessionT={ this.sessionT }\r\n />\r\n ) }\r\n /> \r\n ) }\r\n </Component>\r\n );\r\n }\r\n}\r\n\r\nexport default SessionLayout;\r\n","import * as React from 'react';\r\n\r\nimport Loader from 'components/semantic/Loader';\r\nimport { useStore } from 'effects/StoreListenerEffect';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { TFunction } from 'i18next';\r\n\r\n\r\nexport type SessionProviderDecoratorProps = UI.SessionRouteProps;\r\n\r\nexport interface SessionProviderDecoratorChildProps<SessionT extends object> extends UI.SessionRouteProps {\r\n items: SessionT[];\r\n t: TFunction;\r\n}\r\n\r\nconst SessionProviderDecorator = <SessionT extends object, PropsT extends object>(\r\n Component: React.ComponentType<PropsT & SessionProviderDecoratorChildProps<SessionT>>,\r\n store: any\r\n) => {\r\n const Decorator = (props: SessionProviderDecoratorProps & PropsT) => {\r\n const { t } = useTranslation();\r\n const sessions = useStore<SessionT[]>(store);\r\n if (!store.isInitialized()) {\r\n return <Loader text={ translate('Loading sessions', t, UI.Modules.COMMON) }/>;\r\n }\r\n\r\n return (\r\n <Component \r\n items={ sessions }\r\n t={ t }\r\n { ...props }\r\n />\r\n );\r\n };\r\n\r\n return Decorator;\r\n};\r\n\r\nexport { SessionProviderDecorator };\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","actions","sessionsUrl","editAccess","SessionActions","divider","removeSession","displayName","access","icon","handler","data","session","Object","assign","Component","useReadDelay","ActiveSessionDecorator","setRead","this","props","sessionApi","readTimeout","undefined","setSession","clearTimeout","sessionChanged","timeout","window","setTimeout","componentDidMount","componentWillUnmount","componentDidUpdate","prevProps","render","FooterItem","label","text","className","SessionFooter","children","SessionDropdown","sessionMenuItems","newButton","unreadInfoStore","listActionMenuGetter","t","SectionedDropdown","triggerIcon","MenuIcon","urgencies","getTotalUrgencies","MenuSection","caption","CloseButton","activeItem","ActionButton","actionId","itemData","IconConstants","SessionItemHeader","itemHeaderIcon","itemHeaderTitle","onKeyDown","tabIndex","itemHeaderDescription","Grid","length","LayoutHeader","title","subHeader","style","margin","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","url","pushNew","RouterMenuItemLink","onClick","evt","preventDefault","sessionItem","status","name","pushSession","onClickItem","findItem","items","find","item","SessionLayout","state","getSessionUrl","baseUrl","getNewUrl","getStorageKey","History","replaceSession","hasEditAccess","LoginStore","checkActiveItem","routerLocation","location","pending","activeId","setState","event","key","altKey","currentIndex","indexOf","newSession","getItemStatus","itemStatusGetter","itemHeaderIconGetter","Icon","getSessionMenuItem","itemNameGetter","getItemHeaderTitle","uiActions","actionIds","itemHeaderTitleGetter","newCaption","ids","actionMenu","header","getItemHeaderDescription","itemHeaderDescriptionGetter","newDescription","getItemHeaderIcon","newIcon","getNewButton","handleCloseAll","forEach","getListActionMenu","MenuItemLink","sessionT","moduleId","UNSAFE_componentWillReceiveProps","nextProps","pathname","newItemPos","oldItem","lastId","disableSideMenu","newLayout","NewLayout","sessionItemLayout","SessionItemLayout","Message","description","context","map","path","Loader","console","error","propTypes","contextType","LayoutWidthContext","SessionProviderDecorator","store","sessions","isInitialized"],"sourceRoot":""}
1
+ {"version":3,"file":"js/668.d8fc363a0da7c52c6cf3.chunk.js","mappings":"kKAGIA,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACC,EAAOC,GAAI,snKAAunK,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,+CAA+C,MAAQ,GAAG,SAAW,+kDAA+kD,eAAiB,CAAC,unKAAunK,WAAa,MAEr+X,W,yDCGe,SAAS,EACtBC,EACAC,EACAC,GAEA,MAMMC,EAAiD,CACrDC,QAAS,KACTC,cAAe,CACbC,YAAa,QACbC,OAAQL,EACRM,KAAM,WACNC,QAZuD,EACvDC,KAAMC,KAED,WAAqB,GAAGV,KAAeU,EAAQZ,QAaxD,OAAOa,OAAOC,OAAOb,EAASG,K,gFCTjB,SAAS,EACtBW,EACAC,GAAwB,GAExB,MAAMC,UAA+B,YAArC,c,oBAQE,KAAAC,QAAWN,IACTO,KAAKC,MAAMC,WAAWH,QAAQN,GAC9BO,KAAKG,iBAAcC,GAGrB,KAAAC,WAAcZ,IAQZ,GAPIO,KAAKG,cAEPG,aAAaN,KAAKG,aAClBH,KAAKD,QAAQC,KAAKC,MAAMR,UAG1BO,KAAKC,MAAMC,WAAWK,eAAed,IAChCA,EACH,OAGF,MAAMe,EAAWX,EAA0F,IAAvE,aAAmC,yBAAvC,EAChCG,KAAKG,YAAcM,OAAOC,YAAW,IAAMV,KAAKD,QAAQN,IAAUe,IAGpEG,oBACEX,KAAKK,WAAWL,KAAKC,MAAMR,SAG7BmB,uBACEZ,KAAKK,WAAW,MAGlBQ,mBAAmBC,GACbd,KAAKC,MAAMR,QAAQZ,KAAOiC,EAAUrB,QAAQZ,IAC9CmB,KAAKK,WAAWL,KAAKC,MAAMR,SAI/BsB,SACE,OAAO,SAACnB,EAAS,iBAAMI,KAAKC,YAAK,IAIrC,OAAOH,I,iEClEF,MAAMkB,EAAwC,EAAGC,MAAAA,EAAOC,KAAAA,MAC7D,8BAAKC,UAAU,aAAW,WACxB,8BAAKA,UAAU,cAAY,UACrBF,GAAyB,iBAATC,EAAoB,GAAGD,MAAUC,IAASA,SAAI,UAC9D,GAIGE,EAA0B,EAAGC,SAAAA,MACxC,+BAAKF,UAAU,kBAAgB,YAC7B,gBAAKA,UAAU,0BAAmB,IAClC,8BAAKA,UAAU,gBAAc,UACzBE,SAAQ,WACN,I,0NCAV,MAAMC,EAAkB,EACtBC,iBAAAA,EAAkBC,UAAAA,EAAWC,gBAAAA,EAAiBC,qBAAAA,EAAsBC,MAEpE,UAACC,EAAA,EAAiB,eAChBC,aAAc,SAACC,EAAA,EAAQ,CAACC,UAAYN,EAAkBA,EAAgBO,oBAAsB,WAAI,IAAK,YAErG,SAACC,EAAA,EAAW,eAACC,SAAU,QAAU,MAAOP,EAAG,cAAkB,UACzDH,SAAS,IAEb,SAACS,EAAA,EAAW,eAACC,SAAU,QAAU,mBAAoBP,EAAG,cAAkB,UACtEJ,SAAgB,IAEpB,SAACU,EAAA,EAAW,UACRP,UAAsB,WACZ,GAQZS,EAAc,EAChBrD,QAAAA,EAASsD,WAAAA,MAENA,IAAc,UACV,MAIP,SAACC,EAAA,EAAY,CACXlB,UAAU,gCACVrC,QAAUA,EACVwD,SAAS,gBACTC,SAAWH,EACX9C,KAAOkD,EAAA,cAAmB,GAQ1BC,EAAsD,EAAGC,eAAAA,EAAgBC,gBAAAA,MAC7E,+BAAKxB,UAAU,kBAAgB,WAC3BuB,EACAC,UAAe,GAoCrB,EA/BE,I,IAAA,SAAEtB,EAAQ,UAAEuB,GAAS,EAAK3C,E,yUAAK,GAA/B,0BACG,OACH,+BACEkB,UAAU,6BACVyB,UAAYA,EACZC,SAAW,GAAC,YAEZ,+BAAK1B,UAAU,yBAAuB,YACpC,+BAAKA,UAAU,gBAAc,YAC3B,SAACG,EAAe,iBAAMrB,QAAK,IAC3B,SAACwC,EAAiB,iBAAMxC,QAAK,WAAI,IAEnC,SAACkC,EAAW,iBAAMlC,QAAK,WAAI,IAG7B,8BAAKkB,UAAU,kBAAgB,UAC3BE,SAAQ,WACN,I,0BCjFV,MAoDA,EApD2E,EACzEE,iBAAAA,EAAkBC,UAAAA,EAClBkB,eAAAA,EAAgBC,gBAAAA,EAAiBtB,SAAAA,EACjCyB,sBAAAA,EAAuBF,UAAAA,MAGnBpB,IACFA,EAAY,eAAmBA,EAAW,CACxCL,UAAWK,EAAUvB,MAAMkB,UAAY,uBAKzC,UAAC4B,EAAA,GAAI,eACH5B,UAAU,+BACVyB,UAAYA,EACZC,SAAW,GAAC,YAEZ,+BAAK1B,UAAU,gCAA8B,WACzCK,IACED,EAAiByB,SACnB,8BAAK7B,UAAU,8BAA4B,UACvCI,SAAgB,WAErB,IAGH,8BAAKJ,UAAU,uDAAqD,WAClE,+BAAKA,UAAU,6BAA2B,YACxC,SAAC8B,EAAA,EAAY,CACX9B,UAAU,iBACV7B,KAAOoD,EACPQ,OAAQ,8BAAK/B,UAAU,SAAO,UAAGwB,SAAe,GAChDQ,UAAYL,QAAqB,IAEnC,gBAAK3B,UAAU,aAAaiC,MAAO,CAAEC,OAAQ,yBAAmB,GAC9DhC,UAAQ,UACN,WACF,I,qICnCRiC,EAAU,GAEdA,EAAQC,kBAAoB,IAC5BD,EAAQE,cAAgB,IAElBF,EAAQG,OAAS,SAAc,KAAM,QAE3CH,EAAQI,OAAS,IACjBJ,EAAQK,mBAAqB,IAEhB,IAAI,IAASL,GAKJ,KAAW,YAAiB,W,6CChBlD,MAsCA,EAxB0D,EAAGM,IAAAA,EAAKV,MAAAA,EAAOW,QAAAA,EAAS1C,UAAAA,MAChF,SAAC2C,EAAA,EAAkB,eAEjB3C,UAAY,IAAW,MAAOA,GAC9B7B,KAAOkD,EAAA,SACPoB,IAAMA,EACNG,QAAWC,GApBC,EAACA,EAA2BH,KAC1CG,EAAIC,iBAEJJ,KAiB2CE,CAAQC,EAAKH,IAAQ,UAE5DX,IANE,cCqCR,EAhCwD,EACpDgB,YAAAA,EAAaC,OAAAA,EAAQC,KAAAA,EAAM3C,gBAAAA,EAAiBmC,IAAAA,EAAKS,YAAAA,MAEnD,SAACP,EAAA,EAAkB,eACjBF,IAAMA,EACNzC,UAAU,eACV4C,QAAWC,GA1BK,EAClBA,EACAE,EACAG,KAEAL,EAAIC,iBAEJI,EAAYH,EAAYrF,KAmBmByF,CAAYN,EAAKE,EAAaG,GACvE/E,KAAO6E,EACP1E,QAAUyE,EACVzC,gBAAkBA,GAAe,WAEjC,+BAAMN,UAAU,gBAAc,UAC1BiD,SAAI,UACD,G,2DCRX,MAAMG,EAAW,CAAmCC,EAAmB3F,IAC9D2F,EAAMC,MAAKC,GAAQA,EAAK7F,KAAOA,IA8FxC,MAAM8F,UACI,YADV,c,oBA8DE,KAAAC,MAAyB,CACvBxC,WAAY,MAOd,KAAAyC,cAAiBhG,IACf,MAAYA,EAAI,+CACT,IAAImB,KAAKC,MAAM6E,mBAAmBjG,KAG3C,KAAAkG,UAAY,IACH,IAAI/E,KAAKC,MAAM6E,cAGxB,KAAAE,cAAiB/E,GACR,GAAGA,EAAM6E,sBAGlB,KAAAT,YAAexF,IACboG,EAAA,OAAajF,KAAK6E,cAAchG,KAGlC,KAAAqG,eAAkBrG,IAChBoG,EAAA,UAAgBjF,KAAK6E,cAAchG,KAGrC,KAAAgF,QAAU,KACRoB,EAAA,OAAajF,KAAK+E,cAGpB,KAAAI,cAAgB,IACPC,EAAA,YAAqBpF,KAAKC,MAAMjB,YAsCzC,KAAAqG,gBAAmBpF,IAEjB,MAAMqF,EAAiBrF,EAAMsF,SACvBC,EAAUF,EAAeV,OAAUU,EAAeV,MAA+BY,QAGjFpD,EAAamC,EAAStE,EAAMuE,MAAOvE,EAAMwF,UAC/C,OAAIrD,EACEoD,GAEFP,EAAA,UAAgB,CAEdL,MAAO,CACLY,SAAS,MAIN,IAGTxF,KAAK0F,SAAS,CAAEtD,WAAYA,KAC5B,QAAkBpC,KAAKgF,cAAc/E,GAAQA,EAAMwF,WAC5C,KACED,GAG8D,IAAvBvF,EAAMuE,MAAMxB,SAE5DiC,EAAA,UAAgBjF,KAAK+E,aACrB/E,KAAK0F,SAAS,CAAEtD,WAAY,QACrB,IAMX,KAAAQ,UAAa+C,IACX,MAAM,IAAEC,EAAG,OAAEC,GAAWF,EAExB,IAAIE,GAAmB,YAARD,GAA6B,cAARA,GAmB7B,GAAIC,GAAkB,WAARD,EAEnBD,EAAM1B,iBAENgB,EAAA,UAAgBjF,KAAK+E,kBAChB,GAAIc,GAAkB,WAARD,EAAkB,CAErCD,EAAM1B,iBAEN,MAAM,MAAEO,EAAK,SAAEiB,EAAQ,WAAEvF,GAAeF,KAAKC,MACvCyE,EAAOH,EAASC,EAAOiB,GACvBf,GACJxE,EAAWf,cAAcuF,QA/B6B,CAExDiB,EAAM1B,iBAEN,MAAM,MAAEO,EAAK,SAAEiB,GAAazF,KAAKC,MAC3ByE,EAAOH,EAASC,EAAOiB,GAC7B,IAAKf,EACH,OAGF,MAAMoB,EAAetB,EAAMuB,QAAQrB,GACnC,IAAsB,IAAlBoB,EACF,OAGF,MAAME,EAAaxB,EAAc,YAARoB,EAAoBE,EAAe,EAAIA,EAAe,GAC3EE,GACFhG,KAAKqE,YAAY2B,EAAWnH,MAqClC,KAAAoH,cAAiB/B,IACf,MAAM,iBAAEgC,EAAgB,qBAAEC,GAAyBnG,KAAKC,MACxD,OAAIiG,GACK,gBAAK/E,UAAY,oDAAsD+E,EAAiBhC,SAAY,IAGtG,SAACkC,EAAA,EAAI,CAAC9G,KAAO6G,EAAqBjC,SAAY,IAGvD,KAAAmC,mBAAsBnC,IAElB,SAAC,EAAe,CAEdN,IAAM5D,KAAK6E,cAAcX,EAAYrF,IACrCuF,KAAOpE,KAAKC,MAAMqG,eAAepC,GACjCzC,gBAAkBzB,KAAKC,MAAMwB,gBAC7B0C,OAASnE,KAAKiG,cAAc/B,GAC5BA,YAAcA,EACdG,YAAcrE,KAAKqE,aANbH,EAAYrF,IAWxB,KAAA0H,mBAAqB,KACnB,MAAM,UAAEC,EAAS,UAAEC,EAAS,eAAEH,EAAc,sBAAEI,GAA0B1G,KAAKC,OAEvE,WAAEmC,GAAepC,KAAK4E,MAC5B,IAAKxC,EACH,OAAO,yBAAOpC,KAAKC,MAAM0G,iBAAU,GAGrC,IAAIC,EACAH,IACFG,EAAM,IAAKH,EAAW,UAAW,kBAGnC,MAAMI,GACJ,SAAC,KAAU,CACT3E,QAAUoE,EAAelE,GACzBtD,QAAU0H,EACVjE,SAAWH,EACXwE,IAAMA,QAAG,GAKb,GAAIF,EAAuB,CACzB,MAAMI,EAASJ,EAAsBtE,EAAYpC,KAAKC,MAAMsF,SAAUsB,GACtE,GAAIC,EACF,OAAOA,EAIX,OAAOD,GAGT,KAAAE,yBAA2B,KACzB,MAAM,WAAE3E,GAAepC,KAAK4E,OACtB,4BAAEoC,EAA2B,eAAEC,GAAmBjH,KAAKC,MAC7D,OAAKmC,EAIE4E,EAA4B5E,GAH1B6E,GAMX,KAAAC,kBAAoB,KAClB,MAAM,WAAE9E,GAAepC,KAAK4E,OACtB,qBAAEuB,EAAoB,QAAEgB,GAAYnH,KAAKC,MAC/C,OAAO,SAACmG,EAAA,EAAI,CAAC9G,KAAO8C,EAAa+D,EAAqB/D,GAAc+E,QAAO,IAG7E,KAAAC,aAAe,IACRpH,KAAKmF,iBAAoBnF,KAAKC,MAAM0G,YAKvC,SAAC,EAAgB,CAEfzD,MAAQlD,KAAKC,MAAM0G,WACnB/C,IAAM5D,KAAK+E,YACXlB,QAAU7D,KAAK6D,SAHX,cALC,KAaX,KAAAwD,eAAiB,KACf,MAAM,WAAEnH,EAAU,MAAEsE,GAAUxE,KAAKC,MACnCuE,EAAM8C,SAAQ7H,GAAWS,EAAWf,cAAcM,MAGpD,KAAA8H,kBAAoB,KAClB,MAAM,MAAE/C,EAAK,EAAE7C,GAAM3B,KAAKC,MAC1B,OAAKD,KAAKmF,iBAAoC,IAAjBX,EAAMxB,QAKjC,SAACwE,EAAA,EAAY,eAEXzD,QAAU/D,KAAKqH,eACf/H,KAAOkD,EAAA,UAAoB,WAEzB,QAAU,YAAab,EAAG,eAJxB,SALC,MAcX,KAAA8F,UAAW,QAAWzH,KAAKC,MAAM0B,EAAG3B,KAAKC,MAAMuG,UAAUkB,UA5OzDC,iCAAiCC,GAC/B,GAAIA,EAAUrC,SAASsC,WAAa7H,KAAK+E,YAKvC,YAHI/E,KAAK4E,MAAMxC,YACbpC,KAAK0F,SAAS,CAAEtD,WAAY,QAKhC,GAAIpC,KAAKqF,gBAAgBuC,GAEvB,OAMF,IAAIE,EAAa,EACjB,MAAMC,EAAUxD,EAASvE,KAAKC,MAAMuE,MAAOxE,KAAKC,MAAMwF,UAClDsC,IAEFD,EAAa9H,KAAKC,MAAMuE,MAAMuB,QAAQgC,GAClCD,IAAe9H,KAAKC,MAAMuE,MAAMxB,OAAS,IAE3C8E,GAA0B,IAI9B9H,KAAKkF,eAAe0C,EAAUpD,MAAMsD,GAAYjJ,IAiFlD8B,oBAEE,GAAIX,KAAKqF,gBAAgBrF,KAAKC,OAC5B,OAIF,IAAI+H,GAAS,OAA8BhI,KAAKgF,cAAchF,KAAKC,QAC/D+H,GAAUzD,EAASvE,KAAKC,MAAMuE,MAAOwD,GAEvChI,KAAKkF,eAAe8C,GACXhI,KAAKC,MAAMuE,MAAMxB,OAAS,GAEnChD,KAAKkF,eAAelF,KAAKC,MAAMuE,MAAM,GAAG3F,IAmH5CkC,SACE,MAAM,gBACJkH,EAAe,MAAazD,EAAK,gBAAE/C,EAAe,SAAE8D,EAAQ,EAAG,WAAErF,EAAU,UAC3EsG,EAAW0B,UAAWC,EAAWC,kBAAmBC,EAAiB,SAAE5C,GACrEzF,KAAKC,MAET,IAAKD,KAAKmF,iBAAoC,IAAjBX,EAAMxB,OAEjC,OACE,SAACsF,EAAA,EAAO,CACNpF,OAAQ,QAAU,mBAAoBvB,EAAG,aACzC4G,YAAc5G,GACZ,QAAU,sBAAuB,aACjC,iDACD,GAKP,MAAM,WAAES,GAAepC,KAAK4E,MAGtBhF,EAFaqI,IAAmB,QAAgBjI,KAAKwI,SAE5B,EAAgB,EAC/C,OACE,UAAC5I,EAAS,eACR+C,gBAAkB3C,KAAKuG,qBACvBzD,sBAAwB9C,KAAK+G,2BAC7BrE,eAAiB1C,KAAKkH,oBAEtB9E,WAAaA,EACbX,gBAAkBA,EAElBD,UAAYxB,KAAKoH,eACjB7F,iBAAmBiD,EAAMiE,IAAIzI,KAAKqG,oBAClC3E,qBAAuB1B,KAAKuH,kBAC5B3E,UAAY5C,KAAK4C,UAEjB9D,QAAU0H,EACV7E,GAAK,YAEL,SAAC,KAAK,CACJ+G,KAAO1I,KAAK6E,cAAc,OAC1B9D,OAASd,IACP,IAAKmC,EAAY,CACf,MAAM,MAAEwC,GAAU5E,KAAKC,MAAMsF,SAC7B,OAAMX,GAAUA,EAA+BY,SAEtC,SAACmD,EAAA,EAAM,CAACzH,MAAO,QAAU,8BAA+BS,EAAG,mBAAkB,GAC3E8D,GAA6B,IAAjBjB,EAAMxB,QAEpB,SAAC2F,EAAA,EAAM,CAACzH,MAAO,QAAU,kBAAmBS,EAAG,mBAAkB,QAG1EiH,QAAQC,MAAM,+CAKhB,OACE,SAACR,EAAiB,CAChB5I,QAAU2C,EACVlC,WAAaA,EACbsG,UAAYA,EACZjB,SAAWA,EACXkC,SAAWzH,KAAKyH,eAAQ,UAG7B,KAECU,IACF,SAAC,KAAK,CACJO,KAAO1I,KAAK+E,YACZhE,OAASd,IACP,SAACkI,EAAS,iBACHlI,EAAK,CACVwH,SAAWzH,KAAKyH,gBAAQ,SAE3B,WAEJ,IA7ZA,EAAArI,YAAc,gBAEd,EAAA0J,UAAY,CAEjBhE,QAAS,sBAGTS,SAAU,sBAGVf,MAAO,qBAGPkC,sBAAuB,SAGvBM,4BAA6B,oBAG7Bb,qBAAsB,oBAGtB1E,gBAAiB,WAGjB6E,eAAgB,oBAGhBJ,iBAAkB,SAGlBM,UAAW,sBAGXC,UAAW,UAGXhB,SAAU,QAGVkB,WAAY,QAGZM,eAAgB,QAGhBE,QAAS,QAGTc,gBAAiB,SAGjBjJ,WAAY,sBAEZoJ,kBAAmB,mBAEnBF,UAAW,UAON,EAAAa,YAAcC,EAAA,EAoWvB,Y,iHCthBA,MAAMC,EAA2B,CAC/BrJ,EACAsJ,IAEmBjJ,IACjB,MAAM,EAAE0B,IAAM,SACRwH,GAAW,OAAqBD,GACtC,OAAKA,EAAME,iBAKT,SAACxJ,EAAS,eACR4E,MAAQ2E,EACRxH,EAAIA,GACC1B,QAAK,IAPL,SAAC,IAAM,CAACiB,MAAO,QAAU,mBAAoBS,EAAG,mBAAkB","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/sessions.css","webpack://airdcpp-webui/./src/actions/ui/decorators/SessionActionDecorator.ts","webpack://airdcpp-webui/./src/decorators/ActiveSessionDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionFooter.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/TopMenuLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SideMenuLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/sessions.css?90b7","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionNewButton.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionMenuItem.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/SessionProviderDecorator.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".session-container.horizontal.ui.grid {\\r\\n margin: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .item.new {\\r\\n padding: .78571429em 1.1em !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .ui.vertical.menu .item>i.icon {\\r\\n margin: 0 .35714286em 0 0 !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-layout > .ui.divider {\\r\\n margin: 5px 0px 0px 0px;\\r\\n}\\r\\n\\r\\n.session-container.vertical {\\r\\n padding: 15px;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.session-layout {\\r\\n flex: 100 100 auto;\\r\\n display: flex;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-layout {\\r\\n flex-direction: column;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar {\\r\\n justify-content: space-between;\\r\\n margin: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .close-button.item:before {\\r\\n background: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .close-button.item {\\r\\n box-shadow: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\\r\\n max-height: calc(100vh - 140px);\\r\\n overflow-y: auto;\\r\\n overflow-x: hidden;\\r\\n max-width: calc(100vw - 30px);\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-item .count.label {\\r\\n margin-left: 1em !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > div {\\r\\n max-width: 90%; /* Hack, auto width won't work without \\\"overflow: hidden\\\", but that would prevent viewing the menu items */\\r\\n padding: .82857143em 0.4285714em;\\r\\n line-height: 1.2;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > div:before {\\r\\n background: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > i {\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header .ui.dropdown > i {\\r\\n margin: 0px 5px;\\r\\n}\\r\\n\\r\\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\\r\\n.session-container.horizontal .session-header .header > i,\\r\\n.session-container.vertical .session-header > i {\\r\\n width: inherit !important;\\r\\n font-size: 1.5em;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-header .ui.header {\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar {\\r\\n border-radius: 0px !important;\\r\\n padding-bottom: 0px;\\r\\n}\\r\\n\\r\\n.session-container, \\r\\n.session-layout, \\r\\n.session-container.horizontal .column {\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .column > div {\\r\\n max-height: 100%;\\r\\n}\\r\\n\\r\\n.session-container .session-item {\\r\\n overflow: hidden;\\r\\n display: flex !important;\\r\\n align-items: center;\\r\\n padding: .68571429em .92857143em !important;\\r\\n height: 35px;\\r\\n}\\r\\n\\r\\n.session-container .session-item .session-status {\\r\\n float: none !important;\\r\\n margin: 0 .5em 0 0 !important;\\r\\n}\\r\\n\\r\\n.session-container .session-item .session-name {\\r\\n overflow: hidden;\\r\\n flex: 1 1 100%;\\r\\n line-height: 1.2;\\r\\n}\\r\\n\\r\\n.session-container .session-status {\\r\\n margin-right: 5px;\\r\\n margin-top: 3px;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column {\\r\\n display: flex !important;\\r\\n flex-direction: column;\\r\\n padding-right: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .menu {\\r\\n width: initial !important;\\r\\n overflow-y: auto;\\r\\n padding-top: 10px;\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .session-item span.session-name,\\r\\n.session-container .session-header .ui.dropdown .caption {\\r\\n overflow: hidden;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.session-container .session-header .title .ui.dropdown {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.session-layout .sub.header {\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.session-layout .sub.header img {\\r\\n vertical-align: text-top;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid {\\r\\n margin-top: 7px !important;\\r\\n font-size: small;\\r\\n color: grey;\\r\\n display: flex;\\r\\n flex: 1;\\r\\n align-items: flex-end;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div:last-child > div {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div:only-child > div {\\r\\n float: inherit;\\r\\n}\\r\\n\\r\\n.session-footer .ui.checkbox {\\r\\n min-height: inherit !important;\\r\\n}\\r\\n\\r\\n.session-footer .divider {\\r\\n margin-top: 8px;\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\\r\\n/* New session layout */\\r\\n.session.new {\\r\\n flex: 100 100 0%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n overflow-y: hidden;\\r\\n margin-top: 20px;\\r\\n padding: 1px;\\r\\n}\\r\\n\\r\\n.session.new .recents {\\r\\n flex: 100 100 0%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n margin-top: 20px;\\r\\n overflow-y: hidden;\\r\\n}\\r\\n\\r\\n.session.new .recents .list {\\r\\n padding: 3px 5px;\\r\\n flex: 100 100 0%;\\r\\n overflow-y: auto;\\r\\n overflow-x: hidden;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/sessions.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,sBAAsB;AACxB;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,oCAAoC;AACtC;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,aAAa;EACb,sBAAsB;EACtB,uBAAuB;AACzB;;AAEA;EACE,kBAAkB;EAClB,aAAa;EACb,gBAAgB;AAClB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,8BAA8B;EAC9B,sBAAsB;AACxB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,+BAA+B;EAC/B,gBAAgB;EAChB,kBAAkB;EAClB,6BAA6B;AAC/B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,YAAY;AACd;;AAEA;EACE,cAAc,EAAE,2GAA2G;EAC3H,gCAAgC;EAChC,gBAAgB;AAClB;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,eAAe;AACjB;;AAEA,oEAAoE;AACpE;;EAEE,yBAAyB;EACzB,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,wBAAwB;EACxB,mBAAmB;EACnB,2CAA2C;EAC3C,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,6BAA6B;AAC/B;;AAEA;EACE,gBAAgB;EAChB,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,eAAe;AACjB;;AAEA;EACE,wBAAwB;EACxB,sBAAsB;EACtB,6BAA6B;AAC/B;;AAEA;EACE,yBAAyB;EACzB,gBAAgB;EAChB,iBAAiB;EACjB,OAAO;AACT;;AAEA;;EAEE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,0BAA0B;EAC1B,gBAAgB;EAChB,WAAW;EACX,aAAa;EACb,OAAO;EACP,qBAAqB;AACvB;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,8BAA8B;AAChC;;AAEA;EACE,eAAe;EACf,kBAAkB;AACpB;;AAEA,uBAAuB;AACvB;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,kBAAkB;EAClB,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;AACpB\",\"sourcesContent\":[\".session-container.horizontal.ui.grid {\\r\\n margin: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .item.new {\\r\\n padding: .78571429em 1.1em !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .ui.vertical.menu .item>i.icon {\\r\\n margin: 0 .35714286em 0 0 !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-layout > .ui.divider {\\r\\n margin: 5px 0px 0px 0px;\\r\\n}\\r\\n\\r\\n.session-container.vertical {\\r\\n padding: 15px;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.session-layout {\\r\\n flex: 100 100 auto;\\r\\n display: flex;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-layout {\\r\\n flex-direction: column;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar {\\r\\n justify-content: space-between;\\r\\n margin: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .close-button.item:before {\\r\\n background: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .close-button.item {\\r\\n box-shadow: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\\r\\n max-height: calc(100vh - 140px);\\r\\n overflow-y: auto;\\r\\n overflow-x: hidden;\\r\\n max-width: calc(100vw - 30px);\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-item .count.label {\\r\\n margin-left: 1em !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > div {\\r\\n max-width: 90%; /* Hack, auto width won't work without \\\"overflow: hidden\\\", but that would prevent viewing the menu items */\\r\\n padding: .82857143em 0.4285714em;\\r\\n line-height: 1.2;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > div:before {\\r\\n background: none !important;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header > i {\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.session-container.vertical .session-header .ui.dropdown > i {\\r\\n margin: 0px 5px;\\r\\n}\\r\\n\\r\\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\\r\\n.session-container.horizontal .session-header .header > i,\\r\\n.session-container.vertical .session-header > i {\\r\\n width: inherit !important;\\r\\n font-size: 1.5em;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .session-header .ui.header {\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.session-container.vertical .menu-bar {\\r\\n border-radius: 0px !important;\\r\\n padding-bottom: 0px;\\r\\n}\\r\\n\\r\\n.session-container, \\r\\n.session-layout, \\r\\n.session-container.horizontal .column {\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .column > div {\\r\\n max-height: 100%;\\r\\n}\\r\\n\\r\\n.session-container .session-item {\\r\\n overflow: hidden;\\r\\n display: flex !important;\\r\\n align-items: center;\\r\\n padding: .68571429em .92857143em !important;\\r\\n height: 35px;\\r\\n}\\r\\n\\r\\n.session-container .session-item .session-status {\\r\\n float: none !important;\\r\\n margin: 0 .5em 0 0 !important;\\r\\n}\\r\\n\\r\\n.session-container .session-item .session-name {\\r\\n overflow: hidden;\\r\\n flex: 1 1 100%;\\r\\n line-height: 1.2;\\r\\n}\\r\\n\\r\\n.session-container .session-status {\\r\\n margin-right: 5px;\\r\\n margin-top: 3px;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column {\\r\\n display: flex !important;\\r\\n flex-direction: column;\\r\\n padding-right: 0px !important;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .menu {\\r\\n width: initial !important;\\r\\n overflow-y: auto;\\r\\n padding-top: 10px;\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.session-container.horizontal .menu-column .session-item span.session-name,\\r\\n.session-container .session-header .ui.dropdown .caption {\\r\\n overflow: hidden;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.session-container .session-header .title .ui.dropdown {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.session-layout .sub.header {\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.session-layout .sub.header img {\\r\\n vertical-align: text-top;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid {\\r\\n margin-top: 7px !important;\\r\\n font-size: small;\\r\\n color: grey;\\r\\n display: flex;\\r\\n flex: 1;\\r\\n align-items: flex-end;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div:last-child > div {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.session-footer .info-grid > div:only-child > div {\\r\\n float: inherit;\\r\\n}\\r\\n\\r\\n.session-footer .ui.checkbox {\\r\\n min-height: inherit !important;\\r\\n}\\r\\n\\r\\n.session-footer .divider {\\r\\n margin-top: 8px;\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\\r\\n/* New session layout */\\r\\n.session.new {\\r\\n flex: 100 100 0%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n overflow-y: hidden;\\r\\n margin-top: 20px;\\r\\n padding: 1px;\\r\\n}\\r\\n\\r\\n.session.new .recents {\\r\\n flex: 100 100 0%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n margin-top: 20px;\\r\\n overflow-y: hidden;\\r\\n}\\r\\n\\r\\n.session.new .recents .list {\\r\\n padding: 3px 5px;\\r\\n flex: 100 100 0%;\\r\\n overflow-y: auto;\\r\\n overflow-x: hidden;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import SocketService from 'services/SocketService';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ntype SessionType = UI.SessionItemBase;\r\n\r\nexport default function (\r\n actions: UI.ActionListType<SessionType>, \r\n sessionsUrl: string, \r\n editAccess: API.AccessEnum\r\n) {\r\n const handleRemoveSession: UI.ActionHandler<SessionType> = (\r\n { data: session }\r\n ) => {\r\n return SocketService.delete(`${sessionsUrl}/${session.id}`);\r\n };\r\n \r\n const SessionActions: UI.ActionListType<SessionType> = {\r\n divider: null,\r\n removeSession: { \r\n displayName: 'Close',\r\n access: editAccess,\r\n icon: IconConstants.REMOVE,\r\n handler: handleRemoveSession,\r\n }\r\n };\r\n\r\n return Object.assign(actions, SessionActions);\r\n}","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport LocalSettingStore from 'stores/LocalSettingStore';\r\nimport { LocalSettings } from 'constants/SettingConstants';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/SessionLayout';\r\n\r\n\r\ntype SessionType = UI.SessionItemBase;\r\n\r\ninterface ActiveSessionDecoratorProps<SessionT extends SessionType, ActionT extends object> \r\n extends Pick<SessionChildProps<SessionT, ActionT>, 'session'> {\r\n\r\n sessionApi: UI.SessionActions<SessionT> & ActionT;\r\n //uiActions: \r\n //session: SessionT;\r\n}\r\n\r\n// This decorator will fire updates for currently active session\r\n// and set them as read\r\nexport default function <PropsT, SessionT extends SessionType, ActionT extends object = {}>(\r\n Component: React.ComponentType<PropsT>, \r\n useReadDelay: boolean = false\r\n) {\r\n class ActiveSessionDecorator extends React.Component<PropsT & ActiveSessionDecoratorProps<SessionT, ActionT>> {\r\n /*static propTypes = {\r\n session: PropTypes.any, // Required (cloned)\r\n actions: PropTypes.object, // Required (cloned)\r\n };*/\r\n\r\n readTimeout: number | undefined;\r\n\r\n setRead = (session: SessionT) => {\r\n this.props.sessionApi.setRead(session);\r\n this.readTimeout = undefined;\r\n }\r\n\r\n setSession = (session: SessionT | null) => {\r\n if (this.readTimeout) {\r\n // Set the previously active session as read\r\n clearTimeout(this.readTimeout);\r\n this.setRead(this.props.session);\r\n }\r\n\r\n this.props.sessionApi.sessionChanged(session);\r\n if (!session) {\r\n return;\r\n }\r\n\r\n const timeout = !useReadDelay ? 0 : LocalSettingStore.getValue<number>(LocalSettings.UNREAD_LABEL_DELAY) * 1000;\r\n this.readTimeout = window.setTimeout(() => this.setRead(session), timeout);\r\n }\r\n\r\n componentDidMount() {\r\n this.setSession(this.props.session);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.setSession(null);\r\n }\r\n\r\n componentDidUpdate(prevProps: ActiveSessionDecoratorProps<SessionT, ActionT>) {\r\n if (this.props.session.id !== prevProps.session.id) {\r\n this.setSession(this.props.session);\r\n }\r\n }\r\n\r\n render() {\r\n return <Component { ...this.props }/>;\r\n }\r\n }\r\n\r\n return ActiveSessionDecorator;\r\n}\r\n","import * as React from 'react';\r\n\r\n\r\ninterface FooterItemProps {\r\n label?: string;\r\n text: string | React.ReactElement<any>;\r\n}\r\n\r\nexport const FooterItem: React.FC<FooterItemProps> = ({ label, text }) => (\r\n <div className=\"grid-item\">\r\n <div className=\"item-inner\">\r\n { !!label && typeof text === 'string' ? `${label}: ${text}` : text }\r\n </div>\r\n </div>\r\n);\r\n\r\nexport const SessionFooter: React.FC = ({ children }) => (\r\n <div className=\"session-footer\">\r\n <div className=\"ui footer divider\"/>\r\n <div className=\"info-grid ui\">\r\n { children }\r\n </div>\r\n </div>\r\n);","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport ActionButton from 'components/ActionButton';\r\nimport SectionedDropdown from 'components/semantic/SectionedDropdown';\r\nimport MenuSection from 'components/semantic/MenuSection';\r\nimport { MenuIcon } from 'components/menu/MenuIcon';\r\nimport { SessionMainLayoutProps } from './SessionLayout';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\n\r\ntype SessionDropdownProps<SessionT extends UI.SessionItemBase> = \r\n Pick<\r\n SessionMainLayoutProps<SessionT>, \r\n 'sessionMenuItems' | 'newButton' | 'unreadInfoStore' | 'listActionMenuGetter' | 't'\r\n >;\r\n\r\nconst SessionDropdown = <SessionT extends UI.SessionItemBase>({ \r\n sessionMenuItems, newButton, unreadInfoStore, listActionMenuGetter, t\r\n}: SessionDropdownProps<SessionT>) => (\r\n <SectionedDropdown \r\n triggerIcon={ <MenuIcon urgencies={ unreadInfoStore ? unreadInfoStore.getTotalUrgencies() : null } />}\r\n >\r\n <MenuSection caption={ translate('New', t, UI.Modules.COMMON) }>\r\n { newButton }\r\n </MenuSection>\r\n <MenuSection caption={ translate('Current sessions', t, UI.Modules.COMMON) }>\r\n { sessionMenuItems }\r\n </MenuSection>\r\n <MenuSection>\r\n { listActionMenuGetter() }\r\n </MenuSection>\r\n </SectionedDropdown>\r\n);\r\n\r\n\r\ntype CloseButtonProps<SessionT extends UI.SessionItemBase> = \r\n Pick<SessionMainLayoutProps<SessionT>, 'actions' | 'activeItem'>;\r\n\r\nconst CloseButton = <SessionT extends UI.SessionItemBase>(\r\n { actions, activeItem }: CloseButtonProps<SessionT>\r\n) => {\r\n if (!activeItem || useMobileLayout()) {\r\n return null;\r\n }\r\n\r\n return (\r\n <ActionButton \r\n className=\"basic small item close-button\"\r\n actions={ actions } \r\n actionId=\"removeSession\"\r\n itemData={ activeItem }\r\n icon={ IconConstants.CLOSE }\r\n //moduleId={ moduleId }\r\n />\r\n );\r\n};\r\n\r\ntype SessionItemHeaderProps = Pick<SessionMainLayoutProps<any>, 'itemHeaderIcon' | 'itemHeaderTitle'>;\r\n\r\nconst SessionItemHeader: React.FC<SessionItemHeaderProps> = ({ itemHeaderIcon, itemHeaderTitle }) => (\r\n <div className=\"session-header\">\r\n { itemHeaderIcon }\r\n { itemHeaderTitle }\r\n </div>\r\n);\r\n\r\nconst TopMenuLayout = <SessionT extends UI.SessionItemBase>(\r\n { children, onKeyDown, ...props }: SessionMainLayoutProps<SessionT>\r\n) => (\r\n <div \r\n className=\"session-container vertical\" \r\n onKeyDown={ onKeyDown } \r\n tabIndex={ 0 }\r\n >\r\n <div className=\"ui main menu menu-bar\">\r\n <div className=\"content-left\">\r\n <SessionDropdown { ...props }/>\r\n <SessionItemHeader { ...props }/>\r\n </div>\r\n <CloseButton { ...props }/>\r\n </div>\r\n\r\n <div className=\"session-layout\">\r\n { children }\r\n </div>\r\n </div>\r\n);\r\n\r\n/*TopMenuLayout.propTypes = {\r\n itemHeaderTitle: PropTypes.node.isRequired,\r\n itemHeaderIcon: PropTypes.node.isRequired,\r\n activeItem: PropTypes.object,\r\n newButton: PropTypes.node,\r\n sessionMenuItems: PropTypes.array.isRequired,\r\n closeAction: PropTypes.func.isRequired,\r\n listActionMenuGetter: PropTypes.func.isRequired,\r\n};*/\r\n\r\nexport default TopMenuLayout;\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport LayoutHeader from 'components/semantic/LayoutHeader';\r\nimport { SessionMainLayoutProps } from './SessionLayout';\r\nimport { Grid } from 'components/semantic/Grid';\r\n\r\n\r\nconst SideMenuLayout: React.FC<SessionMainLayoutProps<any /*SessionT*/>> = ({ \r\n sessionMenuItems, newButton,\r\n itemHeaderIcon, itemHeaderTitle, children,\r\n itemHeaderDescription, onKeyDown,\r\n}) => {\r\n\r\n if (newButton) {\r\n newButton = React.cloneElement(newButton, { \r\n className: newButton.props.className + ' ui fluid button' \r\n });\r\n }\r\n\r\n return (\r\n <Grid \r\n className=\"session-container horizontal\" \r\n onKeyDown={ onKeyDown }\r\n tabIndex={ 0 }\r\n >\r\n <div className=\"four wide column menu-column\">\r\n { newButton }\r\n { !!sessionMenuItems.length && (\r\n <div className=\"ui vertical secondary menu\">\r\n { sessionMenuItems}\r\n </div>\r\n )\r\n }\r\n </div>\r\n <div className=\"twelve wide stretched column content-column session\">\r\n <div className=\"ui segment session-layout\">\r\n <LayoutHeader\r\n className=\"session-header\"\r\n icon={ itemHeaderIcon }\r\n title={ <div className=\"title\">{ itemHeaderTitle }</div> }\r\n subHeader={ itemHeaderDescription }\r\n />\r\n <div className=\"ui divider\" style={{ margin: '5px 0px 0px 0px' }}/>\r\n { children }\r\n </div>\r\n </div>\r\n </Grid>\r\n );\r\n};\r\n\r\n/*SideMenuLayout.propTypes = {\r\n newButton: PropTypes.node,\r\n sessionMenuItems: PropTypes.array.isRequired,\r\n\r\n itemHeaderTitle: PropTypes.node,\r\n itemHeaderIcon: PropTypes.node,\r\n itemHeaderDescription: PropTypes.node.isRequired,\r\n};*/\r\n\r\nexport default SideMenuLayout;\r\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./sessions.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./sessions.css\";\n export default content && content.locals ? content.locals : undefined;\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport RouterMenuItemLink from 'components/semantic/RouterMenuItemLink';\r\n\r\n\r\ntype PushHandler = () => void;\r\n\r\nconst onClick = (evt: React.SyntheticEvent, pushNew: PushHandler) => {\r\n evt.preventDefault();\r\n\r\n pushNew();\r\n};\r\n\r\n\r\ninterface SessionNewButtonProps {\r\n url: string;\r\n title: React.ReactNode;\r\n className?: string;\r\n pushNew: PushHandler;\r\n}\r\n\r\nconst SessionNewButton: React.FC<SessionNewButtonProps> = ({ url, title, pushNew, className }) => (\r\n <RouterMenuItemLink \r\n key=\"button-new\" \r\n className={ classNames('new', className) }\r\n icon={ IconConstants.CREATE }\r\n url={ url } \r\n onClick={ (evt: React.SyntheticEvent) => onClick(evt, pushNew) }\r\n >\r\n { title }\r\n </RouterMenuItemLink>\r\n);\r\n\r\n/*SessionNewButton.propTypes = {\r\n // Base URL of the section\r\n url: PropTypes.string.isRequired,\r\n\r\n // Title of the button\r\n title: PropTypes.node.isRequired,\r\n\r\n pushNew: PropTypes.func.isRequired,\r\n\r\n className: PropTypes.string,\r\n};*/\r\n\r\nexport default SessionNewButton;","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport RouterMenuItemLink from 'components/semantic/RouterMenuItemLink';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ntype PushSessionHandler = (id: API.IdType) => void;\r\n\r\nconst onClickItem = (\r\n evt: React.SyntheticEvent, \r\n sessionItem: UI.SessionItemBase, \r\n pushSession: PushSessionHandler\r\n) => {\r\n evt.preventDefault();\r\n\r\n pushSession(sessionItem.id);\r\n};\r\n\r\ninterface SessionMenuItemProps {\r\n url: string;\r\n name: React.ReactNode;\r\n unreadInfoStore: any;\r\n status: React.ReactElement<any>;\r\n sessionItem: UI.SessionItemBase;\r\n\r\n pushSession: PushSessionHandler;\r\n}\r\n\r\nconst SessionMenuItem: React.FC<SessionMenuItemProps> = (\r\n { sessionItem, status, name, unreadInfoStore, url, pushSession }\r\n) => (\r\n <RouterMenuItemLink \r\n url={ url } \r\n className=\"session-item\" \r\n onClick={ (evt: React.SyntheticEvent) => onClickItem(evt, sessionItem, pushSession) }\r\n icon={ status }\r\n session={ sessionItem }\r\n unreadInfoStore={ unreadInfoStore }\r\n >\r\n <span className=\"session-name\">\r\n { name }\r\n </span>\r\n </RouterMenuItemLink>\r\n);\r\n\r\n/*SessionMenuItem.propTypes = {\r\n // Item URL\r\n url: PropTypes.string.isRequired,\r\n\r\n name: PropTypes.node.isRequired,\r\n\r\n unreadInfoStore: PropTypes.object.isRequired,\r\n\r\n status: PropTypes.node.isRequired,\r\n\r\n sessionItem: PropTypes.object.isRequired,\r\n\r\n pushSession: PropTypes.func.isRequired,\r\n};*/\r\n\r\nexport default SessionMenuItem;","import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\nimport { Route, RouteComponentProps } from 'react-router-dom';\r\nimport invariant from 'invariant';\r\n\r\nimport History from 'utils/History';\r\nimport Loader from 'components/semantic/Loader';\r\n\r\nimport TopMenuLayout from './TopMenuLayout';\r\nimport SideMenuLayout from './SideMenuLayout';\r\n\r\nimport '../sessions.css';\r\n\r\nimport { ActionMenu } from 'components/menu';\r\nimport SessionNewButton from './SessionNewButton';\r\nimport SessionMenuItem from './SessionMenuItem';\r\n\r\nimport Icon, { IconType } from 'components/semantic/Icon';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\nimport { loadLocalProperty, saveLocalProperty, useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { getModuleT, translate, toI18nKey } from 'utils/TranslationUtils';\r\nimport { TFunction } from 'i18next';\r\nimport { LayoutWidthContext, LayoutWidthContextType } from 'context/LayoutWidthContext';\r\n\r\n\r\n\r\nexport type SessionBaseType = UI.SessionItemBase;\r\n\r\nconst findItem = <SessionT extends SessionBaseType>(items: SessionT[], id: API.IdType | null): SessionT | undefined => {\r\n return items.find(item => item.id === id);\r\n};\r\n\r\nexport interface SessionLayoutProps<\r\n SessionT extends SessionBaseType = SessionBaseType,\r\n SessionApiT extends object = {},\r\n UIActionT extends UI.ActionListType<UI.SessionItemBase> = {}\r\n> extends UI.SessionInfoGetter<SessionT>, Omit<RouteComponentProps, 'match'> {\r\n // Unique ID of the section (used for storing and loading the previously open tab)\r\n baseUrl: string;\r\n\r\n // Array of the items to list\r\n items: SessionT[];\r\n\r\n // Session actions (should contain 'removeSession')\r\n /*actions: UI.ModuleActions<SessionT> & {\r\n actions: UI.SessionUIActions<SessionT, ActionT>;\r\n };*/\r\n\r\n uiActions: UI.ModuleActions<SessionT, UIActionT>;\r\n sessionApi: UI.SessionActions<SessionT> & SessionApiT;\r\n\r\n // Session actions to show in the action menu\r\n actionIds?: string[];\r\n\r\n // Item ID that is currently active (if any)\r\n activeId: API.IdType | null;\r\n\r\n // Label for button that opens a new session\r\n newCaption?: React.ReactNode;\r\n\r\n // Label for button that opens a new session\r\n newDescription?: React.ReactNode;\r\n\r\n // Label for button that opens a new session\r\n newIcon?: IconType;\r\n\r\n // Set to false if the side menu should never be shown (the session will use all width that is available)\r\n disableSideMenu?: boolean;\r\n\r\n // AccessConstant defining whether the user has edit permission \r\n editAccess: API.AccessEnum;\r\n\r\n sessionItemLayout: React.ComponentType<SessionChildProps<SessionT>>;\r\n\r\n newLayout?: React.ComponentType<NewSessionLayoutProps>;\r\n\r\n unreadInfoStore: any;\r\n \r\n t: TFunction;\r\n}\r\n\r\nexport interface SessionLocationState {\r\n pending?: boolean;\r\n}\r\n\r\nexport interface SessionMainLayoutProps<SessionT extends SessionBaseType, ActionT extends object = {}> extends \r\n Pick<SessionLayoutProps<SessionT>, 'unreadInfoStore'> {\r\n\r\n newButton: React.ReactElement<any> | null;\r\n listActionMenuGetter: () => React.ReactNode;\r\n sessionMenuItems: React.ReactNode[];\r\n //closeAction: UI.SessionActions<SessionT, ActionT>['removeSession'];\r\n activeItem: SessionT | null;\r\n\r\n itemHeaderTitle: React.ReactNode;\r\n itemHeaderDescription: React.ReactNode;\r\n itemHeaderIcon: IconType;\r\n onKeyDown: (event: React.KeyboardEvent) => void;\r\n children: React.ReactNode;\r\n\r\n //moduleId: string;\r\n actions: SessionLayoutProps<SessionT>['uiActions'];\r\n t: TFunction;\r\n}\r\n\r\ninterface State<SessionT extends SessionBaseType> {\r\n activeItem: SessionT | null;\r\n}\r\n\r\nexport type SessionChildProps<\r\n SessionT extends SessionBaseType, \r\n SessionApiT extends object = {}, \r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase> = {}\r\n> = Pick<SessionLayoutProps<SessionT, SessionApiT, UIActionsT>, 'location' | 'sessionApi' | 'uiActions'> & \r\n { \r\n session: SessionT;\r\n sessionT: UI.ModuleTranslator;\r\n };\r\n\r\nexport interface NewSessionLayoutProps extends RouteComponentProps {\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass SessionLayout<SessionT extends SessionBaseType, ActionT extends object> \r\n extends React.Component<SessionLayoutProps<SessionT, ActionT>, State<SessionT>> {\r\n\r\n static displayName = 'SessionLayout';\r\n\r\n static propTypes = {\r\n // Unique ID of the section (used for storing and loading the previously open tab)\r\n baseUrl: PropTypes.string.isRequired,\r\n\r\n // Location object\r\n location: PropTypes.object.isRequired,\r\n\r\n // Array of the items to list\r\n items: PropTypes.array.isRequired,\r\n\r\n // If no function is supplied, the item name will be used\r\n itemHeaderTitleGetter: PropTypes.func,\r\n\r\n // Function receiving an item object that returns the description (subheader) of the item\r\n itemHeaderDescriptionGetter: PropTypes.func.isRequired,\r\n\r\n // Function receiving an item object that returns icon for a item\r\n itemHeaderIconGetter: PropTypes.func.isRequired,\r\n\r\n // Store containing information about unread items\r\n unreadInfoStore: PropTypes.object,\r\n\r\n // Function receiving an item object that returns the display name\r\n itemNameGetter: PropTypes.func.isRequired,\r\n\r\n // Function receiving the circular color label in front of the item\r\n itemStatusGetter: PropTypes.func,\r\n\r\n // Session actions (should contain 'removeSession')\r\n uiActions: PropTypes.object.isRequired,\r\n\r\n // Session actions to show in the action menu\r\n actionIds: PropTypes.array,\r\n\r\n // Item ID that is currently active (if any)\r\n activeId: PropTypes.any,\r\n\r\n // Label for button that opens a new session\r\n newCaption: PropTypes.any,\r\n\r\n // Label for button that opens a new session\r\n newDescription: PropTypes.any,\r\n\r\n // Label for button that opens a new session\r\n newIcon: PropTypes.any,\r\n\r\n // Set to false if the side menu should never be shown (the session will use all width that is available)\r\n disableSideMenu: PropTypes.bool,\r\n\r\n // AccessConstant defining whether the user has edit permission \r\n editAccess: PropTypes.string.isRequired,\r\n\r\n sessionItemLayout: PropTypes.any.isRequired,\r\n\r\n newLayout: PropTypes.func,\r\n };\r\n\r\n state: State<SessionT> = {\r\n activeItem: null\r\n };\r\n\r\n static contextType = LayoutWidthContext;\r\n context: LayoutWidthContextType;\r\n\r\n // HELPERS\r\n getSessionUrl = (id: API.IdType) => {\r\n invariant(!!id, 'Trying to get session URL without a session');\r\n return `/${this.props.baseUrl}/session/${id}`;\r\n }\r\n\r\n getNewUrl = () => {\r\n return `/${this.props.baseUrl}/new`;\r\n }\r\n\r\n getStorageKey = (props: SessionLayoutProps<SessionT>) => {\r\n return `${props.baseUrl}_last_active`;\r\n }\r\n\r\n pushSession = (id: API.IdType) => {\r\n History.push(this.getSessionUrl(id));\r\n }\r\n\r\n replaceSession = (id: API.IdType) => {\r\n History.replace(this.getSessionUrl(id));\r\n }\r\n\r\n pushNew = () => {\r\n History.push(this.getNewUrl());\r\n }\r\n\r\n hasEditAccess = () => {\r\n return LoginStore.hasAccess(this.props.editAccess);\r\n }\r\n\r\n // LIFECYCLE/REACT\r\n UNSAFE_componentWillReceiveProps(nextProps: SessionLayoutProps<SessionT>) {\r\n if (nextProps.location.pathname === this.getNewUrl()) {\r\n // Don't redirect to it if the \"new session\" layout is open\r\n if (this.state.activeItem) {\r\n this.setState({ activeItem: null });\r\n }\r\n return;\r\n }\r\n\r\n if (this.checkActiveItem(nextProps)) {\r\n // We got an item\r\n return;\r\n }\r\n\r\n // The old tab was closed or we didn't have any session before\r\n\r\n\r\n let newItemPos = 0;\r\n const oldItem = findItem(this.props.items, this.props.activeId);\r\n if (oldItem) {\r\n // Find the old position and use the item in that position (if possible)\r\n newItemPos = this.props.items.indexOf(oldItem);\r\n if (newItemPos === this.props.items.length - 1) {\r\n // The last item was removed\r\n newItemPos = newItemPos - 1;\r\n }\r\n }\r\n\r\n this.replaceSession(nextProps.items[newItemPos].id);\r\n }\r\n\r\n // Common logic for selecting the item to display (after mounting or session updates)\r\n // Returns true active item selection was handled\r\n // Returns false if the active item couldn't be selected but there are valid items to choose from by the caller\r\n checkActiveItem = (props: SessionLayoutProps<SessionT>) => {\r\n // Did we just create this session?\r\n const routerLocation = props.location;\r\n const pending = routerLocation.state && (routerLocation.state as SessionLocationState).pending;\r\n\r\n // Update the active item\r\n const activeItem = findItem(props.items, props.activeId);\r\n if (activeItem) {\r\n if (pending) {\r\n // Disable pending state\r\n History.replace({\r\n //path: routerLocation.pathname,\r\n state: {\r\n pending: false,\r\n }\r\n });\r\n\r\n return true;\r\n }\r\n\r\n this.setState({ activeItem: activeItem });\r\n saveLocalProperty(this.getStorageKey(props), props.activeId);\r\n return true;\r\n } else if (pending) {\r\n // We'll just display a loading indicator in 'render', no item needed\r\n return true;\r\n } else if (/*routerLocation.action === 'POP' ||*/ props.items.length === 0) {\r\n // Browsing from history and item removed (or all items removed)... go to \"new session\" page\r\n History.replace(this.getNewUrl());\r\n this.setState({ activeItem: null });\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n onKeyDown = (event: React.KeyboardEvent) => {\r\n const { key, altKey } = event;\r\n\r\n if (altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\r\n // Arrow up/down\r\n event.preventDefault();\r\n\r\n const { items, activeId } = this.props;\r\n const item = findItem(items, activeId);\r\n if (!item) {\r\n return;\r\n }\r\n\r\n const currentIndex = items.indexOf(item);\r\n if (currentIndex === -1) {\r\n return;\r\n }\r\n\r\n const newSession = items[key === 'ArrowUp' ? currentIndex - 1 : currentIndex + 1];\r\n if (newSession) {\r\n this.pushSession(newSession.id);\r\n }\r\n } else if (altKey && key === 'Insert') {\r\n // Insert\r\n event.preventDefault();\r\n\r\n History.replace(this.getNewUrl());\r\n } else if (altKey && key === 'Delete') {\r\n // Delete\r\n event.preventDefault();\r\n\r\n const { items, activeId, sessionApi } = this.props;\r\n const item = findItem(items, activeId);\r\n if (!!item) {\r\n sessionApi.removeSession(item);\r\n }\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n // Opening an item directly? Or no items?\r\n if (this.checkActiveItem(this.props)) {\r\n return;\r\n }\r\n\r\n // See if we have something stored\r\n let lastId = loadLocalProperty<API.IdType>(this.getStorageKey(this.props));\r\n if (lastId && findItem(this.props.items, lastId)) {\r\n // Previous session exists\r\n this.replaceSession(lastId);\r\n } else if (this.props.items.length > 0) {\r\n // Load the first session\r\n this.replaceSession(this.props.items[0].id);\r\n }\r\n }\r\n\r\n // COMPONENT GETTERS\r\n getItemStatus = (sessionItem: SessionT) => {\r\n const { itemStatusGetter, itemHeaderIconGetter } = this.props;\r\n if (itemStatusGetter) {\r\n return <div className={ 'ui session-status empty circular left mini label ' + itemStatusGetter(sessionItem) }/>;\r\n }\r\n\r\n return <Icon icon={ itemHeaderIconGetter(sessionItem) }/>;\r\n }\r\n\r\n getSessionMenuItem = (sessionItem: SessionT) => {\r\n return (\r\n <SessionMenuItem \r\n key={ sessionItem.id } \r\n url={ this.getSessionUrl(sessionItem.id) }\r\n name={ this.props.itemNameGetter(sessionItem) }\r\n unreadInfoStore={ this.props.unreadInfoStore }\r\n status={ this.getItemStatus(sessionItem) }\r\n sessionItem={ sessionItem }\r\n pushSession={ this.pushSession }\r\n />\r\n );\r\n }\r\n\r\n getItemHeaderTitle = () => {\r\n const { uiActions, actionIds, itemNameGetter, itemHeaderTitleGetter } = this.props;\r\n\r\n const { activeItem } = this.state;\r\n if (!activeItem) {\r\n return <div>{ this.props.newCaption }</div>;\r\n }\r\n\r\n let ids;\r\n if (actionIds) {\r\n ids = [ ...actionIds, 'divider', 'removeSession' ];\r\n }\r\n\r\n const actionMenu = (\r\n <ActionMenu \r\n caption={ itemNameGetter(activeItem) }\r\n actions={ uiActions }\r\n itemData={ activeItem }\r\n ids={ ids }\r\n />\r\n );\r\n\r\n // Use the header getter only if there is a getter that returns a valid value\r\n if (itemHeaderTitleGetter) {\r\n const header = itemHeaderTitleGetter(activeItem, this.props.location, actionMenu);\r\n if (header) {\r\n return header;\r\n }\r\n }\r\n\r\n return actionMenu;\r\n }\r\n\r\n getItemHeaderDescription = () => {\r\n const { activeItem } = this.state;\r\n const { itemHeaderDescriptionGetter, newDescription } = this.props;\r\n if (!activeItem) {\r\n return newDescription;\r\n }\r\n\r\n return itemHeaderDescriptionGetter(activeItem);\r\n }\r\n\r\n getItemHeaderIcon = () => {\r\n const { activeItem } = this.state;\r\n const { itemHeaderIconGetter, newIcon } = this.props;\r\n return <Icon icon={ activeItem ? itemHeaderIconGetter(activeItem) : newIcon }/>;\r\n }\r\n\r\n getNewButton = () => {\r\n if (!this.hasEditAccess() || !this.props.newCaption) {\r\n return null;\r\n }\r\n\r\n return (\r\n <SessionNewButton \r\n key=\"new-button\" \r\n title={ this.props.newCaption } \r\n url={ this.getNewUrl() } \r\n pushNew={ this.pushNew }\r\n />\r\n );\r\n }\r\n\r\n handleCloseAll = () => {\r\n const { sessionApi, items } = this.props;\r\n items.forEach(session => sessionApi.removeSession(session));\r\n }\r\n\r\n getListActionMenu = () => {\r\n const { items, t } = this.props;\r\n if (!this.hasEditAccess() || items.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <MenuItemLink \r\n key=\"close\"\r\n onClick={ this.handleCloseAll }\r\n icon={ IconConstants.REMOVE }\r\n >\r\n { translate('Close all', t, UI.Modules.COMMON) }\r\n </MenuItemLink>\r\n );\r\n }\r\n\r\n sessionT = getModuleT(this.props.t, this.props.uiActions.moduleId);\r\n render() {\r\n const { \r\n disableSideMenu, /*width,*/ items, unreadInfoStore, location, t, sessionApi,\r\n uiActions, newLayout: NewLayout, sessionItemLayout: SessionItemLayout, activeId \r\n } = this.props;\r\n \r\n if (!this.hasEditAccess() && items.length === 0) {\r\n // Nothing to show\r\n return (\r\n <Message \r\n title={ translate('No items to show', t, UI.Modules.COMMON) } \r\n description={ t<string>(\r\n toI18nKey('noSessionEditAccess', UI.Modules.COMMON), \r\n `You aren't allowed to open new sessions`\r\n ) }\r\n />\r\n );\r\n }\r\n\r\n const { activeItem } = this.state;\r\n const useTopMenu = disableSideMenu || useMobileLayout(this.context);\r\n\r\n const Component = useTopMenu ? TopMenuLayout : SideMenuLayout;\r\n return (\r\n <Component \r\n itemHeaderTitle={ this.getItemHeaderTitle() }\r\n itemHeaderDescription={ this.getItemHeaderDescription() }\r\n itemHeaderIcon={ this.getItemHeaderIcon() }\r\n\r\n activeItem={ activeItem }\r\n unreadInfoStore={ unreadInfoStore }\r\n //closeAction={ actions.actions.removeSession }\r\n newButton={ this.getNewButton() }\r\n sessionMenuItems={ items.map(this.getSessionMenuItem) }\r\n listActionMenuGetter={ this.getListActionMenu }\r\n onKeyDown={ this.onKeyDown }\r\n //moduleId={ actions.moduleId }\r\n actions={ uiActions }\r\n t={ t }\r\n >\r\n <Route\r\n path={ this.getSessionUrl(':id') }\r\n render={ props => {\r\n if (!activeItem) {\r\n const { state } = this.props.location;\r\n if (!!state && (state as SessionLocationState).pending) {\r\n // The session was just created\r\n return <Loader text={ translate('Waiting for server response', t, UI.Modules.COMMON) }/>;\r\n } else if (activeId || items.length !== 0) {\r\n // Redirecting to a new page\r\n return <Loader text={ translate('Loading session', t, UI.Modules.COMMON) }/>;\r\n }\r\n\r\n console.error('SessionLayout route: active session missing');\r\n return;\r\n }\r\n\r\n // We have a session\r\n return (\r\n <SessionItemLayout\r\n session={ activeItem }\r\n sessionApi={ sessionApi }\r\n uiActions={ uiActions }\r\n location={ location }\r\n sessionT={ this.sessionT }\r\n />\r\n );\r\n } }\r\n />\r\n { !!NewLayout && (\r\n <Route\r\n path={ this.getNewUrl() }\r\n render={ props => (\r\n <NewLayout\r\n { ...props }\r\n sessionT={ this.sessionT }\r\n />\r\n ) }\r\n /> \r\n ) }\r\n </Component>\r\n );\r\n }\r\n}\r\n\r\nexport default SessionLayout;\r\n","import * as React from 'react';\r\n\r\nimport Loader from 'components/semantic/Loader';\r\nimport { useStore } from 'effects/StoreListenerEffect';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { TFunction } from 'i18next';\r\n\r\n\r\nexport type SessionProviderDecoratorProps = UI.SessionRouteProps;\r\n\r\nexport interface SessionProviderDecoratorChildProps<SessionT extends object> extends UI.SessionRouteProps {\r\n items: SessionT[];\r\n t: TFunction;\r\n}\r\n\r\nconst SessionProviderDecorator = <SessionT extends object, PropsT extends object>(\r\n Component: React.ComponentType<PropsT & SessionProviderDecoratorChildProps<SessionT>>,\r\n store: any\r\n) => {\r\n const Decorator = (props: SessionProviderDecoratorProps & PropsT) => {\r\n const { t } = useTranslation();\r\n const sessions = useStore<SessionT[]>(store);\r\n if (!store.isInitialized()) {\r\n return <Loader text={ translate('Loading sessions', t, UI.Modules.COMMON) }/>;\r\n }\r\n\r\n return (\r\n <Component \r\n items={ sessions }\r\n t={ t }\r\n { ...props }\r\n />\r\n );\r\n };\r\n\r\n return Decorator;\r\n};\r\n\r\nexport { SessionProviderDecorator };\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","actions","sessionsUrl","editAccess","SessionActions","divider","removeSession","displayName","access","icon","handler","data","session","Object","assign","Component","useReadDelay","ActiveSessionDecorator","setRead","this","props","sessionApi","readTimeout","undefined","setSession","clearTimeout","sessionChanged","timeout","window","setTimeout","componentDidMount","componentWillUnmount","componentDidUpdate","prevProps","render","FooterItem","label","text","className","SessionFooter","children","SessionDropdown","sessionMenuItems","newButton","unreadInfoStore","listActionMenuGetter","t","SectionedDropdown","triggerIcon","MenuIcon","urgencies","getTotalUrgencies","MenuSection","caption","CloseButton","activeItem","ActionButton","actionId","itemData","IconConstants","SessionItemHeader","itemHeaderIcon","itemHeaderTitle","onKeyDown","tabIndex","itemHeaderDescription","Grid","length","LayoutHeader","title","subHeader","style","margin","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","url","pushNew","RouterMenuItemLink","onClick","evt","preventDefault","sessionItem","status","name","pushSession","onClickItem","findItem","items","find","item","SessionLayout","state","getSessionUrl","baseUrl","getNewUrl","getStorageKey","History","replaceSession","hasEditAccess","LoginStore","checkActiveItem","routerLocation","location","pending","activeId","setState","event","key","altKey","currentIndex","indexOf","newSession","getItemStatus","itemStatusGetter","itemHeaderIconGetter","Icon","getSessionMenuItem","itemNameGetter","getItemHeaderTitle","uiActions","actionIds","itemHeaderTitleGetter","newCaption","ids","actionMenu","header","getItemHeaderDescription","itemHeaderDescriptionGetter","newDescription","getItemHeaderIcon","newIcon","getNewButton","handleCloseAll","forEach","getListActionMenu","MenuItemLink","sessionT","moduleId","UNSAFE_componentWillReceiveProps","nextProps","pathname","newItemPos","oldItem","lastId","disableSideMenu","newLayout","NewLayout","sessionItemLayout","SessionItemLayout","Message","description","context","map","path","Loader","console","error","propTypes","contextType","LayoutWidthContext","SessionProviderDecorator","store","sessions","isInitialized"],"sourceRoot":""}