airdcpp-webui 2.12.0-beta.3 → 2.12.0

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 (173) hide show
  1. package/.eslintrc.js +61 -61
  2. package/dist/index.html +1 -1
  3. package/dist/js/285.f568d215104be4fb06eb.chunk.js +2 -0
  4. package/dist/js/285.f568d215104be4fb06eb.chunk.js.gz +0 -0
  5. package/dist/js/285.f568d215104be4fb06eb.chunk.js.map +1 -0
  6. package/dist/js/317.54d6dded7430f84fd4a7.chunk.js +2 -0
  7. package/dist/js/317.54d6dded7430f84fd4a7.chunk.js.gz +0 -0
  8. package/dist/js/317.54d6dded7430f84fd4a7.chunk.js.map +1 -0
  9. package/dist/js/424.b9b775d50fbed2ec85ca.chunk.js +2 -0
  10. package/dist/js/424.b9b775d50fbed2ec85ca.chunk.js.gz +0 -0
  11. package/dist/js/424.b9b775d50fbed2ec85ca.chunk.js.map +1 -0
  12. package/dist/js/668.0d2ed46d1147385f6482.chunk.js +2 -0
  13. package/dist/js/668.0d2ed46d1147385f6482.chunk.js.gz +0 -0
  14. package/dist/js/668.0d2ed46d1147385f6482.chunk.js.map +1 -0
  15. package/dist/js/69.00e5adf1f76437e343f2.chunk.js +2 -0
  16. package/dist/js/69.00e5adf1f76437e343f2.chunk.js.gz +0 -0
  17. package/dist/js/69.00e5adf1f76437e343f2.chunk.js.map +1 -0
  18. package/dist/js/{702.2a6693aead40337b625c.chunk.js → 702.87b71d34ebd167d76c3b.chunk.js} +1 -1
  19. package/dist/js/702.87b71d34ebd167d76c3b.chunk.js.gz +0 -0
  20. package/dist/js/{702.2a6693aead40337b625c.chunk.js.map → 702.87b71d34ebd167d76c3b.chunk.js.map} +1 -1
  21. package/dist/js/{760.774900fa62b9e66b5ff7.chunk.js → 760.1679cba4f653d07819f3.chunk.js} +3 -3
  22. package/dist/js/760.1679cba4f653d07819f3.chunk.js.gz +0 -0
  23. package/dist/js/760.1679cba4f653d07819f3.chunk.js.map +1 -0
  24. package/dist/js/favorite-hubs.9c69b40155edc72e69bb.chunk.js +2 -0
  25. package/dist/js/favorite-hubs.9c69b40155edc72e69bb.chunk.js.gz +0 -0
  26. package/dist/js/favorite-hubs.9c69b40155edc72e69bb.chunk.js.map +1 -0
  27. package/dist/js/filelists.799bae07549950c8bdce.chunk.js +2 -0
  28. package/dist/js/filelists.799bae07549950c8bdce.chunk.js.gz +0 -0
  29. package/dist/js/filelists.799bae07549950c8bdce.chunk.js.map +1 -0
  30. package/dist/js/files.c723dabab26e48d06683.chunk.js +2 -0
  31. package/dist/js/files.c723dabab26e48d06683.chunk.js.gz +0 -0
  32. package/dist/js/files.c723dabab26e48d06683.chunk.js.map +1 -0
  33. package/dist/js/home.1bfba76cdbb2fc7194dc.chunk.js +3 -0
  34. package/dist/js/home.1bfba76cdbb2fc7194dc.chunk.js.gz +0 -0
  35. package/dist/js/{home.7b6595492d6f4a0507e5.chunk.js.map → home.1bfba76cdbb2fc7194dc.chunk.js.map} +1 -1
  36. package/dist/js/hubs.99a089268648607f734d.chunk.js +2 -0
  37. package/dist/js/hubs.99a089268648607f734d.chunk.js.gz +0 -0
  38. package/dist/js/hubs.99a089268648607f734d.chunk.js.map +1 -0
  39. package/dist/js/main.560335911ba879ef8877.entry.js +3 -0
  40. package/dist/js/{main.01d94b76f3ff04c0ccd0.entry.js.LICENSE.txt → main.560335911ba879ef8877.entry.js.LICENSE.txt} +2 -16
  41. package/dist/js/main.560335911ba879ef8877.entry.js.gz +0 -0
  42. package/dist/js/main.560335911ba879ef8877.entry.js.map +1 -0
  43. package/dist/js/messages.1fff9c30585362386309.chunk.js +2 -0
  44. package/dist/js/messages.1fff9c30585362386309.chunk.js.gz +0 -0
  45. package/dist/js/messages.1fff9c30585362386309.chunk.js.map +1 -0
  46. package/dist/js/queue.822b774c6541212741c2.chunk.js +2 -0
  47. package/dist/js/queue.822b774c6541212741c2.chunk.js.gz +0 -0
  48. package/dist/js/queue.822b774c6541212741c2.chunk.js.map +1 -0
  49. package/dist/js/search.6a9813389fd4fec46997.chunk.js +2 -0
  50. package/dist/js/search.6a9813389fd4fec46997.chunk.js.gz +0 -0
  51. package/dist/js/search.6a9813389fd4fec46997.chunk.js.map +1 -0
  52. package/dist/js/settings.809f0f5d0b8ca408ae54.chunk.js +2 -0
  53. package/dist/js/settings.809f0f5d0b8ca408ae54.chunk.js.gz +0 -0
  54. package/dist/js/settings.809f0f5d0b8ca408ae54.chunk.js.map +1 -0
  55. package/dist/js/share.d66035dc828b2f3c8bb0.chunk.js +2 -0
  56. package/dist/js/share.d66035dc828b2f3c8bb0.chunk.js.gz +0 -0
  57. package/dist/js/share.d66035dc828b2f3c8bb0.chunk.js.map +1 -0
  58. package/dist/js/system-log.b6bc274d7fb71714ca24.chunk.js +2 -0
  59. package/dist/js/system-log.b6bc274d7fb71714ca24.chunk.js.gz +0 -0
  60. package/dist/js/system-log.b6bc274d7fb71714ca24.chunk.js.map +1 -0
  61. package/dist/js/transfers.8d1840e604ad0e4c0c15.chunk.js +2 -0
  62. package/dist/js/transfers.8d1840e604ad0e4c0c15.chunk.js.gz +0 -0
  63. package/dist/js/transfers.8d1840e604ad0e4c0c15.chunk.js.map +1 -0
  64. package/dist/sw.js +1 -1
  65. package/dist/sw.js.gz +0 -0
  66. package/dist/sw.js.map +1 -1
  67. package/jest.config.js +18 -18
  68. package/package.json +1 -1
  69. package/dist/js/285.4cfd5122e0b82af77eb1.chunk.js +0 -2
  70. package/dist/js/285.4cfd5122e0b82af77eb1.chunk.js.gz +0 -0
  71. package/dist/js/285.4cfd5122e0b82af77eb1.chunk.js.map +0 -1
  72. package/dist/js/317.97fabbc4a91be88219d3.chunk.js +0 -2
  73. package/dist/js/317.97fabbc4a91be88219d3.chunk.js.gz +0 -0
  74. package/dist/js/317.97fabbc4a91be88219d3.chunk.js.map +0 -1
  75. package/dist/js/424.5cc8383701bc3226c5ff.chunk.js +0 -2
  76. package/dist/js/424.5cc8383701bc3226c5ff.chunk.js.gz +0 -0
  77. package/dist/js/424.5cc8383701bc3226c5ff.chunk.js.map +0 -1
  78. package/dist/js/668.294ae7e2a9db78b421b0.chunk.js +0 -2
  79. package/dist/js/668.294ae7e2a9db78b421b0.chunk.js.gz +0 -0
  80. package/dist/js/668.294ae7e2a9db78b421b0.chunk.js.map +0 -1
  81. package/dist/js/69.3e693915ecfb45fce6ea.chunk.js +0 -2
  82. package/dist/js/69.3e693915ecfb45fce6ea.chunk.js.gz +0 -0
  83. package/dist/js/69.3e693915ecfb45fce6ea.chunk.js.map +0 -1
  84. package/dist/js/702.2a6693aead40337b625c.chunk.js.gz +0 -0
  85. package/dist/js/760.774900fa62b9e66b5ff7.chunk.js.gz +0 -0
  86. package/dist/js/760.774900fa62b9e66b5ff7.chunk.js.map +0 -1
  87. package/dist/js/favorite-hubs.ddb9d9755d235cae74ad.chunk.js +0 -2
  88. package/dist/js/favorite-hubs.ddb9d9755d235cae74ad.chunk.js.gz +0 -0
  89. package/dist/js/favorite-hubs.ddb9d9755d235cae74ad.chunk.js.map +0 -1
  90. package/dist/js/filelists.938ca2c1834d7e4b5f31.chunk.js +0 -2
  91. package/dist/js/filelists.938ca2c1834d7e4b5f31.chunk.js.gz +0 -0
  92. package/dist/js/filelists.938ca2c1834d7e4b5f31.chunk.js.map +0 -1
  93. package/dist/js/files.c17b77223a4f8de80f1b.chunk.js +0 -2
  94. package/dist/js/files.c17b77223a4f8de80f1b.chunk.js.gz +0 -0
  95. package/dist/js/files.c17b77223a4f8de80f1b.chunk.js.map +0 -1
  96. package/dist/js/home.7b6595492d6f4a0507e5.chunk.js +0 -3
  97. package/dist/js/home.7b6595492d6f4a0507e5.chunk.js.gz +0 -0
  98. package/dist/js/hubs.2dbce9b35aa07bab9189.chunk.js +0 -2
  99. package/dist/js/hubs.2dbce9b35aa07bab9189.chunk.js.gz +0 -0
  100. package/dist/js/hubs.2dbce9b35aa07bab9189.chunk.js.map +0 -1
  101. package/dist/js/locales/en-webui-main-missing-json.0a7b6ea1f0a5eeaa5735.chunk.js +0 -1
  102. package/dist/js/locales/en-webui-main-missing-json.0a7b6ea1f0a5eeaa5735.chunk.js.gz +0 -0
  103. package/dist/js/main.01d94b76f3ff04c0ccd0.entry.js +0 -3
  104. package/dist/js/main.01d94b76f3ff04c0ccd0.entry.js.gz +0 -0
  105. package/dist/js/main.01d94b76f3ff04c0ccd0.entry.js.map +0 -1
  106. package/dist/js/messages.a761c7b81ebb0be1c6b9.chunk.js +0 -2
  107. package/dist/js/messages.a761c7b81ebb0be1c6b9.chunk.js.gz +0 -0
  108. package/dist/js/messages.a761c7b81ebb0be1c6b9.chunk.js.map +0 -1
  109. package/dist/js/queue.20fe8967cbdac914688a.chunk.js +0 -2
  110. package/dist/js/queue.20fe8967cbdac914688a.chunk.js.gz +0 -0
  111. package/dist/js/queue.20fe8967cbdac914688a.chunk.js.map +0 -1
  112. package/dist/js/search.62d97eef6ffbc4438ca7.chunk.js +0 -2
  113. package/dist/js/search.62d97eef6ffbc4438ca7.chunk.js.gz +0 -0
  114. package/dist/js/search.62d97eef6ffbc4438ca7.chunk.js.map +0 -1
  115. package/dist/js/settings.b9a77fec5bd9bf0f744c.chunk.js +0 -2
  116. package/dist/js/settings.b9a77fec5bd9bf0f744c.chunk.js.gz +0 -0
  117. package/dist/js/settings.b9a77fec5bd9bf0f744c.chunk.js.map +0 -1
  118. package/dist/js/share.3f04c8697ad367c0ecf6.chunk.js +0 -2
  119. package/dist/js/share.3f04c8697ad367c0ecf6.chunk.js.gz +0 -0
  120. package/dist/js/share.3f04c8697ad367c0ecf6.chunk.js.map +0 -1
  121. package/dist/js/system-log.9ccbd9a5982afcb71dfa.chunk.js +0 -2
  122. package/dist/js/system-log.9ccbd9a5982afcb71dfa.chunk.js.gz +0 -0
  123. package/dist/js/system-log.9ccbd9a5982afcb71dfa.chunk.js.map +0 -1
  124. package/dist/js/transfers.5fbe0929649dc0893737.chunk.js +0 -2
  125. package/dist/js/transfers.5fbe0929649dc0893737.chunk.js.gz +0 -0
  126. package/dist/js/transfers.5fbe0929649dc0893737.chunk.js.map +0 -1
  127. package/package - Copy.json +0 -156
  128. /package/dist/js/{760.774900fa62b9e66b5ff7.chunk.js.LICENSE.txt → 760.1679cba4f653d07819f3.chunk.js.LICENSE.txt} +0 -0
  129. /package/dist/js/{home.7b6595492d6f4a0507e5.chunk.js.LICENSE.txt → home.1bfba76cdbb2fc7194dc.chunk.js.LICENSE.txt} +0 -0
  130. /package/dist/js/locales/{ca-webui-main-json.6c149a10d6e263315d7f.chunk.js → ca-webui-main-json.e4a9ae36d6beb98c0057.chunk.js} +0 -0
  131. /package/dist/js/locales/{ca-webui-main-json.6c149a10d6e263315d7f.chunk.js.gz → ca-webui-main-json.e4a9ae36d6beb98c0057.chunk.js.gz} +0 -0
  132. /package/dist/js/locales/{da-webui-main-json.0ceb448ebe8d59d24573.chunk.js → da-webui-main-json.a08bb8db90fc33844135.chunk.js} +0 -0
  133. /package/dist/js/locales/{da-webui-main-json.0ceb448ebe8d59d24573.chunk.js.gz → da-webui-main-json.a08bb8db90fc33844135.chunk.js.gz} +0 -0
  134. /package/dist/js/locales/{de-webui-main-json.5f98884f26442cd6079a.chunk.js → de-webui-main-json.6763aab78d26033bc160.chunk.js} +0 -0
  135. /package/dist/js/locales/{de-webui-main-json.5f98884f26442cd6079a.chunk.js.gz → de-webui-main-json.6763aab78d26033bc160.chunk.js.gz} +0 -0
  136. /package/dist/js/locales/{el-webui-main-json.9b9f976001b216a51d60.chunk.js → el-webui-main-json.33c629aa295c990b6816.chunk.js} +0 -0
  137. /package/dist/js/locales/{el-webui-main-json.9b9f976001b216a51d60.chunk.js.gz → el-webui-main-json.33c629aa295c990b6816.chunk.js.gz} +0 -0
  138. /package/dist/js/locales/{en-webui-main-json.d1845c8535d9a1be9ef6.chunk.js → en-webui-main-json.ae2216f8443c16155761.chunk.js} +0 -0
  139. /package/dist/js/locales/{en-webui-main-json.d1845c8535d9a1be9ef6.chunk.js.gz → en-webui-main-json.ae2216f8443c16155761.chunk.js.gz} +0 -0
  140. /package/dist/js/locales/{es-webui-main-json.c0a7f4edfd71f660b005.chunk.js → es-webui-main-json.cef003aeaf6a8669aa55.chunk.js} +0 -0
  141. /package/dist/js/locales/{es-webui-main-json.c0a7f4edfd71f660b005.chunk.js.gz → es-webui-main-json.cef003aeaf6a8669aa55.chunk.js.gz} +0 -0
  142. /package/dist/js/locales/{eu-webui-main-json.eb0383952c8ab4fb9f36.chunk.js → eu-webui-main-json.f390f35c92cc5e80723e.chunk.js} +0 -0
  143. /package/dist/js/locales/{eu-webui-main-json.eb0383952c8ab4fb9f36.chunk.js.gz → eu-webui-main-json.f390f35c92cc5e80723e.chunk.js.gz} +0 -0
  144. /package/dist/js/locales/{fi-webui-main-json.f9ff02a0b28a5fd85a5d.chunk.js → fi-webui-main-json.2c0e54d1e586d6d4cdf4.chunk.js} +0 -0
  145. /package/dist/js/locales/{fi-webui-main-json.f9ff02a0b28a5fd85a5d.chunk.js.gz → fi-webui-main-json.2c0e54d1e586d6d4cdf4.chunk.js.gz} +0 -0
  146. /package/dist/js/locales/{fr-webui-main-json.53bc9323af23410d639f.chunk.js → fr-webui-main-json.eb58b9782b184c5bd0e7.chunk.js} +0 -0
  147. /package/dist/js/locales/{fr-webui-main-json.53bc9323af23410d639f.chunk.js.gz → fr-webui-main-json.eb58b9782b184c5bd0e7.chunk.js.gz} +0 -0
  148. /package/dist/js/locales/{hu-webui-main-json.c63e9fcc09558b4fe41e.chunk.js → hu-webui-main-json.6a8b4be95cd392319f00.chunk.js} +0 -0
  149. /package/dist/js/locales/{hu-webui-main-json.c63e9fcc09558b4fe41e.chunk.js.gz → hu-webui-main-json.6a8b4be95cd392319f00.chunk.js.gz} +0 -0
  150. /package/dist/js/locales/{it-webui-main-json.59aad6c34cdff2085157.chunk.js → it-webui-main-json.ace514cb8dbf846f7bb2.chunk.js} +0 -0
  151. /package/dist/js/locales/{it-webui-main-json.59aad6c34cdff2085157.chunk.js.gz → it-webui-main-json.ace514cb8dbf846f7bb2.chunk.js.gz} +0 -0
  152. /package/dist/js/locales/{nl-webui-main-json.f4e1772f9d507c339583.chunk.js → nl-webui-main-json.99f14f67e7f7f523f435.chunk.js} +0 -0
  153. /package/dist/js/locales/{nl-webui-main-json.f4e1772f9d507c339583.chunk.js.gz → nl-webui-main-json.99f14f67e7f7f523f435.chunk.js.gz} +0 -0
  154. /package/dist/js/locales/{no-webui-main-json.7637dd19134c84061d14.chunk.js → no-webui-main-json.14d6b98f5aeac4ae328e.chunk.js} +0 -0
  155. /package/dist/js/locales/{no-webui-main-json.7637dd19134c84061d14.chunk.js.gz → no-webui-main-json.14d6b98f5aeac4ae328e.chunk.js.gz} +0 -0
  156. /package/dist/js/locales/{pl-webui-main-json.10a0a30720b516cefda5.chunk.js → pl-webui-main-json.df98b2ed00d38e386747.chunk.js} +0 -0
  157. /package/dist/js/locales/{pl-webui-main-json.10a0a30720b516cefda5.chunk.js.gz → pl-webui-main-json.df98b2ed00d38e386747.chunk.js.gz} +0 -0
  158. /package/dist/js/locales/{pt-br-webui-main-json.cc946648a521c27b5a79.chunk.js → pt-br-webui-main-json.b06c253e99d8eb8a971d.chunk.js} +0 -0
  159. /package/dist/js/locales/{pt-br-webui-main-json.cc946648a521c27b5a79.chunk.js.gz → pt-br-webui-main-json.b06c253e99d8eb8a971d.chunk.js.gz} +0 -0
  160. /package/dist/js/locales/{pt-webui-main-json.5bed5158082678ceb16b.chunk.js → pt-webui-main-json.5278c6a5afa09777b453.chunk.js} +0 -0
  161. /package/dist/js/locales/{pt-webui-main-json.5bed5158082678ceb16b.chunk.js.gz → pt-webui-main-json.5278c6a5afa09777b453.chunk.js.gz} +0 -0
  162. /package/dist/js/locales/{ro-webui-main-json.d68cbb01175c7f6e2b53.chunk.js → ro-webui-main-json.24ab9a55725a9fc18299.chunk.js} +0 -0
  163. /package/dist/js/locales/{ro-webui-main-json.d68cbb01175c7f6e2b53.chunk.js.gz → ro-webui-main-json.24ab9a55725a9fc18299.chunk.js.gz} +0 -0
  164. /package/dist/js/locales/{ru-webui-main-json.c399c20411213c872e7b.chunk.js → ru-webui-main-json.e9ab289b5a1b70abdccf.chunk.js} +0 -0
  165. /package/dist/js/locales/{ru-webui-main-json.c399c20411213c872e7b.chunk.js.gz → ru-webui-main-json.e9ab289b5a1b70abdccf.chunk.js.gz} +0 -0
  166. /package/dist/js/locales/{sv-webui-main-json.bc915cd441a54413b67c.chunk.js → sv-webui-main-json.9ad571819cde0158829a.chunk.js} +0 -0
  167. /package/dist/js/locales/{sv-webui-main-json.bc915cd441a54413b67c.chunk.js.gz → sv-webui-main-json.9ad571819cde0158829a.chunk.js.gz} +0 -0
  168. /package/dist/js/locales/{tr-webui-main-json.a8c83f88e88d42ffca40.chunk.js → tr-webui-main-json.68bb926adc13e8952b47.chunk.js} +0 -0
  169. /package/dist/js/locales/{tr-webui-main-json.a8c83f88e88d42ffca40.chunk.js.gz → tr-webui-main-json.68bb926adc13e8952b47.chunk.js.gz} +0 -0
  170. /package/dist/js/locales/{uk_UA-webui-main-json.cbc43c57307c9f8134a6.chunk.js → uk_UA-webui-main-json.f4098f3ea96407bf804e.chunk.js} +0 -0
  171. /package/dist/js/locales/{uk_UA-webui-main-json.cbc43c57307c9f8134a6.chunk.js.gz → uk_UA-webui-main-json.f4098f3ea96407bf804e.chunk.js.gz} +0 -0
  172. /package/dist/js/locales/{zh_CN-webui-main-json.b963220181e25b6e6fcd.chunk.js → zh_CN-webui-main-json.6250a926eeea9fda0697.chunk.js} +0 -0
  173. /package/dist/js/locales/{zh_CN-webui-main-json.b963220181e25b6e6fcd.chunk.js.gz → zh_CN-webui-main-json.6250a926eeea9fda0697.chunk.js.gz} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"js/317.97fabbc4a91be88219d3.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/messages/messages.css","webpack://airdcpp-webui/./node_modules/react-intersection-observer/react-intersection-observer.modern.mjs","webpack://airdcpp-webui/./src/components/messages/message/Timestamp.tsx","webpack://airdcpp-webui/./src/components/messages/message/MessageText.tsx","webpack://airdcpp-webui/./src/components/messages/message/ChatMessage.tsx","webpack://airdcpp-webui/./src/components/messages/message/StatusMessage.tsx","webpack://airdcpp-webui/./src/components/messages/list/MessageListItem.tsx","webpack://airdcpp-webui/./src/components/messages/list/MessageListDateDivider.tsx","webpack://airdcpp-webui/./src/components/messages/effects/MessageNodeManager.tsx","webpack://airdcpp-webui/./src/components/messages/messages.css?1e0d","webpack://airdcpp-webui/./src/components/messages/MessageView.tsx","webpack://airdcpp-webui/./src/effects/ItemDownloadManager.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, \".message-section {\\n flex: 1;\\n overflow-y: auto;\\n}\\n\\n.message-list .date.divider i {\\n margin-right: 5px;\\n}\\n\\n.message-list .item .text .highlight.link {\\n color: #4183c4;\\n}\\n\\n.message-list .item .text .highlight.bold {\\n font-weight: bold;\\n}\\n\\n.message-list .item .text .table.dropdown,\\n.message-list .item .text .table.dropdown .popup.trigger {\\n max-width: 100%;\\n}\\n\\n.message-list .item .text .table.dropdown .caption {\\n overflow: hidden;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/messages/messages.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,OAAO;EACP,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,gBAAgB;AAClB\",\"sourcesContent\":[\".message-section {\\n flex: 1;\\n overflow-y: auto;\\n}\\n\\n.message-list .date.divider i {\\n margin-right: 5px;\\n}\\n\\n.message-list .item .text .highlight.link {\\n color: #4183c4;\\n}\\n\\n.message-list .item .text .highlight.bold {\\n font-weight: bold;\\n}\\n\\n.message-list .item .text .table.dropdown,\\n.message-list .item .text .table.dropdown .popup.trigger {\\n max-width: 100%;\\n}\\n\\n.message-list .item .text .table.dropdown .caption {\\n overflow: hidden;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import * as React from 'react';\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nconst observerMap = new Map();\nconst RootIds = new WeakMap();\nlet rootId = 0;\nlet unsupportedValue = undefined;\n/**\r\n * What should be the default behavior if the IntersectionObserver is unsupported?\r\n * Ideally the polyfill has been loaded, you can have the following happen:\r\n * - `undefined`: Throw an error\r\n * - `true` or `false`: Set the `inView` value to this regardless of intersection state\r\n * **/\n\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\n/**\r\n * Generate a unique ID for the root element\r\n * @param root\r\n */\n\nfunction getRootId(root) {\n if (!root) return '0';\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\n/**\r\n * Convert the options to a string Id, based on the values.\r\n * Ensures we can reuse the same observer when observing elements with the same options.\r\n * @param options\r\n */\n\n\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(key => options[key] !== undefined).map(key => {\n return `${key}_${key === 'root' ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\n\nfunction createObserver(options) {\n // Create a unique ID for this observer instance, based on the root, root margin and threshold.\n let id = optionsToId(options);\n let instance = observerMap.get(id);\n\n if (!instance) {\n // Create a map of elements this observer is going to observe. Each element has a list of callbacks that should be triggered, once it comes into view.\n const elements = new Map();\n let thresholds;\n const observer = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n var _elements$get;\n\n // While it would be nice if you could just look at isIntersecting to determine if the component is inside the viewport, browsers can't agree on how to use it.\n // -Firefox ignores `threshold` when considering `isIntersecting`, so it will never be false again if `threshold` is > 0\n const inView = entry.isIntersecting && thresholds.some(threshold => entry.intersectionRatio >= threshold); // @ts-ignore support IntersectionObserver v2\n\n if (options.trackVisibility && typeof entry.isVisible === 'undefined') {\n // The browser doesn't support Intersection Observer v2, falling back to v1 behavior.\n // @ts-ignore\n entry.isVisible = inView;\n }\n\n (_elements$get = elements.get(entry.target)) == null ? void 0 : _elements$get.forEach(callback => {\n callback(inView, entry);\n });\n });\n }, options); // Ensure we have a valid thresholds array. If not, use the threshold from the options\n\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n\n return instance;\n}\n/**\r\n * @param element - DOM Element to observe\r\n * @param callback - Callback function to trigger when intersection status changes\r\n * @param options - Intersection Observer options\r\n * @param fallbackInView - Fallback inView value.\r\n * @return Function - Cleanup function that should be triggered to unregister the observer\r\n */\n\n\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === 'undefined' && fallbackInView !== undefined) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === 'number' ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {// Nothing to cleanup\n };\n } // An observer with the same options can be reused, so lets use this fact\n\n\n const {\n id,\n observer,\n elements\n } = createObserver(options); // Register the callback listener for this element\n\n let callbacks = elements.get(element) || [];\n\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n // Remove the callback from the callback list\n callbacks.splice(callbacks.indexOf(callback), 1);\n\n if (callbacks.length === 0) {\n // No more callback exists for element, so destroy it\n elements.delete(element);\n observer.unobserve(element);\n }\n\n if (elements.size === 0) {\n // No more elements are being observer by this instance, so destroy it\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\nconst _excluded = [\"children\", \"as\", \"triggerOnce\", \"threshold\", \"root\", \"rootMargin\", \"onChange\", \"skip\", \"trackVisibility\", \"delay\", \"initialInView\", \"fallbackInView\"];\n\nfunction isPlainChildren(props) {\n return typeof props.children !== 'function';\n}\n/**\r\n ## Render props\r\n\n To use the `<InView>` component, you pass it a function. It will be called\r\n whenever the state changes, with the new value of `inView`. In addition to the\r\n `inView` prop, children also receive a `ref` that should be set on the\r\n containing DOM element. This is the element that the IntersectionObserver will\r\n monitor.\r\n\n If you need it, you can also access the\r\n [`IntersectionObserverEntry`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry)\r\n on `entry`, giving you access to all the details about the current intersection\r\n state.\r\n\n ```jsx\r\n import { InView } from 'react-intersection-observer';\r\n\n const Component = () => (\r\n <InView>\r\n {({ inView, ref, entry }) => (\r\n <div ref={ref}>\r\n <h2>{`Header inside viewport ${inView}.`}</h2>\r\n </div>\r\n )}\r\n </InView>\r\n );\r\n\n export default Component;\r\n ```\r\n\n ## Plain children\r\n\n You can pass any element to the `<InView />`, and it will handle creating the\r\n wrapping DOM element. Add a handler to the `onChange` method, and control the\r\n state in your own component. Any extra props you add to `<InView>` will be\r\n passed to the HTML element, allowing you set the `className`, `style`, etc.\r\n\n ```jsx\r\n import { InView } from 'react-intersection-observer';\r\n\n const Component = () => (\r\n <InView as=\"div\" onChange={(inView, entry) => console.log('Inview:', inView)}>\r\n <h2>Plain children are always rendered. Use onChange to monitor state.</h2>\r\n </InView>\r\n );\r\n\n export default Component;\r\n ```\r\n */\n\n\nclass InView extends React.Component {\n constructor(props) {\n super(props);\n this.node = null;\n this._unobserveCb = null;\n\n this.handleNode = node => {\n if (this.node) {\n // Clear the old observer, before we start observing a new element\n this.unobserve();\n\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n // Reset the state if we get a new node, and we aren't ignoring updates\n this.setState({\n inView: !!this.props.initialInView,\n entry: undefined\n });\n }\n }\n\n this.node = node ? node : null;\n this.observeNode();\n };\n\n this.handleChange = (inView, entry) => {\n if (inView && this.props.triggerOnce) {\n // If `triggerOnce` is true, we should stop observing the element.\n this.unobserve();\n }\n\n if (!isPlainChildren(this.props)) {\n // Store the current State, so we can pass it to the children in the next render update\n // There's no reason to update the state for plain children, since it's not used in the rendering.\n this.setState({\n inView,\n entry\n });\n }\n\n if (this.props.onChange) {\n // If the user is actively listening for onChange, always trigger it\n this.props.onChange(inView, entry);\n }\n };\n\n this.state = {\n inView: !!props.initialInView,\n entry: undefined\n };\n }\n\n componentDidUpdate(prevProps) {\n // If a IntersectionObserver option changed, reinit the observer\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n\n componentWillUnmount() {\n this.unobserve();\n this.node = null;\n }\n\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n this._unobserveCb = observe(this.node, this.handleChange, {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n }, fallbackInView);\n }\n\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n\n this._unobserveCb = null;\n }\n }\n\n render() {\n if (!isPlainChildren(this.props)) {\n const {\n inView,\n entry\n } = this.state;\n return this.props.children({\n inView,\n entry,\n ref: this.handleNode\n });\n }\n\n const _this$props = this.props,\n {\n children,\n as\n } = _this$props,\n props = _objectWithoutPropertiesLoose(_this$props, _excluded);\n\n return React.createElement(as || 'div', _extends({\n ref: this.handleNode\n }, props), children);\n }\n\n}\n\n/**\r\n * React Hooks make it easy to monitor the `inView` state of your components. Call\r\n * the `useInView` hook with the (optional) [options](#options) you need. It will\r\n * return an array containing a `ref`, the `inView` status and the current\r\n * [`entry`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry).\r\n * Assign the `ref` to the DOM element you want to monitor, and the hook will\r\n * report the status.\r\n *\r\n * @example\r\n * ```jsx\r\n * import React from 'react';\r\n * import { useInView } from 'react-intersection-observer';\r\n *\r\n * const Component = () => {\r\n * const { ref, inView, entry } = useInView({\r\n * threshold: 0,\r\n * });\r\n *\r\n * return (\r\n * <div ref={ref}>\r\n * <h2>{`Header inside viewport ${inView}.`}</h2>\r\n * </div>\r\n * );\r\n * };\r\n * ```\r\n */\n\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _state$entry;\n\n const [ref, setRef] = React.useState(null);\n const callback = React.useRef();\n const [state, setState] = React.useState({\n inView: !!initialInView,\n entry: undefined\n }); // Store the onChange callback in a `ref`, so we can access the latest instance\n // inside the `useEffect`, but without triggering a rerender.\n\n callback.current = onChange;\n React.useEffect(() => {\n // Ensure we have node ref, and that we shouldn't skip observing\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(ref, (inView, entry) => {\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n\n if (entry.isIntersecting && triggerOnce && unobserve) {\n // If it should only trigger once, unobserve the element after it's inView\n unobserve();\n unobserve = undefined;\n }\n }, {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n }, fallbackInView);\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n }, // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [// If the threshold is an array, convert it to a string, so it won't change between renders.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n Array.isArray(threshold) ? threshold.toString() : threshold, ref, root, rootMargin, triggerOnce, skip, trackVisibility, fallbackInView, delay]);\n const entryTarget = (_state$entry = state.entry) == null ? void 0 : _state$entry.target;\n const previousEntryTarget = React.useRef();\n\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n // If we don't have a node ref, then reset the state (unless the hook is set to only `triggerOnce` or `skip`)\n // This ensures we correctly reflect the current state - If you aren't observing anything, then nothing is inView\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: undefined\n });\n }\n\n const result = [setRef, state.inView, state.entry]; // Support object destructuring, by adding the specific values.\n\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\n\nexport { InView, defaultFallbackInView, observe, useInView };\n//# sourceMappingURL=react-intersection-observer.modern.mjs.map\n","import * as React from 'react';\n\nimport { formatTimestamp } from 'utils/ValueFormat';\n\ninterface TimeStampProps {\n time: number;\n}\n\nexport const TimeStamp: React.FC<TimeStampProps> = ({ time }) => (\n <div className=\"time\">{formatTimestamp(time)}</div>\n);\n","import * as React from 'react';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { HighlightedText } from '../../text/HighlightedText';\n\ninterface MessageTextProps {\n message: API.Message;\n emojify: boolean;\n user?: API.HubUser;\n label?: string;\n highlightMenuProps: UI.MessageActionMenuData;\n}\n\nexport const MessageText: React.FC<MessageTextProps> = ({\n emojify,\n message,\n user,\n label,\n highlightMenuProps,\n ...other\n}) => (\n <div className=\"text\">\n {!!label && <span className=\"label\">{`${label}: `}</span>}\n <HighlightedText\n emojify={emojify}\n text={message.text}\n highlights={message.highlights}\n user={user}\n menuProps={highlightMenuProps}\n {...other}\n />\n </div>\n);\n","import PropTypes from 'prop-types';\nimport * as React from 'react';\nimport { InView } from 'react-intersection-observer';\n\nimport { UserMenu } from 'components/action-menu';\n\nimport * as API from 'types/api';\n\nimport MenuConstants from 'constants/MenuConstants';\nimport { CommonMessageProps } from '../types';\nimport { TimeStamp } from './Timestamp';\nimport { MessageText } from './MessageText';\nimport classNames from 'classnames';\n\ninterface AuthorProps {\n message: API.ChatMessage;\n dropdownContext: string;\n}\n\n// Message sections\nconst Author: React.FC<AuthorProps> = ({ message, dropdownContext }) => (\n <div className=\"header author\">\n {message.third_person && <span>*</span>}\n <UserMenu\n contextElement={dropdownContext}\n triggerIcon={null}\n user={message.from}\n remoteMenuId={MenuConstants.HUB_USER}\n entityId={message.from.hub_session_id}\n />\n </div>\n);\n\n/*Author.propTypes = {\n message: PropTypes.object.isRequired,\n dropdownContext: PropTypes.string.isRequired,\n};*/\n\ninterface ChatMessageProps extends CommonMessageProps {\n message: API.ChatMessage;\n dropdownContext: string;\n}\n\n// Main message types\nclass ChatMessage extends React.Component<ChatMessageProps> {\n static propTypes = {\n message: PropTypes.object.isRequired,\n dropdownContext: PropTypes.string.isRequired,\n };\n\n shouldComponentUpdate() {\n return false;\n }\n\n render() {\n const { message, dropdownContext, highlightMenuProps, ...other } = this.props;\n\n return (\n <InView\n className={classNames('ui item chat', message.from.flags.join(' '))}\n {...other}\n >\n <TimeStamp time={message.time} />\n <div\n className={classNames('left', message.third_person ? 'third-person' : 'normal')}\n >\n <Author message={message} dropdownContext={dropdownContext} />\n <MessageText\n message={message}\n emojify={true}\n user={message.from}\n highlightMenuProps={highlightMenuProps}\n />\n </div>\n </InView>\n );\n }\n}\n\nexport { ChatMessage };\n","import PropTypes from 'prop-types';\n\nimport classNames from 'classnames';\nimport { Component } from 'react';\nimport { InView } from 'react-intersection-observer';\n\nimport Icon from 'components/semantic/Icon';\nimport IconConstants from 'constants/IconConstants';\n\nimport * as API from 'types/api';\n\nimport { CommonMessageProps } from '../types';\nimport { MessageText } from './MessageText';\nimport { TimeStamp } from './Timestamp';\n\nconst getSeverityIcon = (severity: API.SeverityEnum) => {\n switch (severity) {\n case API.SeverityEnum.VERBOSE:\n return IconConstants.VERBOSE;\n case API.SeverityEnum.INFO:\n return IconConstants.INFO + ' circle';\n case API.SeverityEnum.WARNING:\n return IconConstants.WARNING;\n case API.SeverityEnum.ERROR:\n return IconConstants.ERROR;\n default:\n return '';\n }\n};\n\ninterface StatusMessageProps extends CommonMessageProps {\n message: API.StatusMessage;\n}\n\nclass StatusMessage extends Component<StatusMessageProps> {\n static propTypes = {\n message: PropTypes.object.isRequired,\n };\n\n shouldComponentUpdate() {\n return false;\n }\n\n render() {\n const { message, highlightMenuProps, ...other } = this.props;\n return (\n <InView\n className={classNames('ui item status', message.severity, message.type)}\n {...other}\n >\n <Icon icon={getSeverityIcon(message.severity)} />\n {message.time > 0 && <TimeStamp time={message.time} />}\n <MessageText\n label={message.label}\n message={message}\n emojify={false}\n highlightMenuProps={highlightMenuProps}\n />\n </InView>\n );\n }\n}\n\nexport { StatusMessage };\n","import * as React from 'react';\n\nimport { ChatMessage, StatusMessage } from '../message';\n\nimport * as UI from 'types/ui';\nimport { CommonMessageProps } from '../types';\n\ninterface MessageListItemProps extends CommonMessageProps {\n id: string;\n message: UI.MessageListItem;\n}\n\nexport const MessageListItem: React.FC<MessageListItemProps> = ({\n message,\n ...other\n}) => {\n if (message.chat_message) {\n return (\n <ChatMessage\n message={message.chat_message}\n dropdownContext={other.highlightMenuProps.boundary}\n {...other}\n />\n );\n } else if (message.log_message) {\n return <StatusMessage message={message.log_message} {...other} />;\n }\n\n return null;\n};\n","//import PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport { formatCalendarTime } from 'utils/ValueFormat';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport Icon from 'components/semantic/Icon';\nimport IconConstants from 'constants/IconConstants';\nimport { useTranslation } from 'react-i18next';\n\nconst getMessageDay = (listItem: UI.MessageListItem) => {\n const message = !!listItem.chat_message ? listItem.chat_message : listItem.log_message;\n return message && new Date(message.time * 1000).getDate();\n};\n\nconst isToday = (message: UI.MessageListItem) => {\n return getMessageDay(message) === new Date().getDate();\n};\n\nconst isHistoryItem = (listItem: UI.MessageListItem) => {\n if (listItem.log_message) {\n return listItem.log_message.type === API.StatusMessageTypeEnum.HISTORY;\n }\n\n return false;\n};\n\nexport const showDateDivider = (index: number, messageList: UI.MessageListItem[]) => {\n const currentMessage = messageList[index];\n\n // First message? History log won't count\n if (index === 0 || (index === 1 && isHistoryItem(messageList[index - 1]))) {\n // Don't show for message that were received today\n if (!isToday(currentMessage) && !isHistoryItem(currentMessage)) {\n return true;\n }\n\n return false;\n }\n\n return getMessageDay(messageList[index - 1]) !== getMessageDay(currentMessage);\n};\n\ninterface MessageListDateDividerProps {\n time: number;\n}\n\nexport const MessageListDateDivider: React.FC<MessageListDateDividerProps> = ({\n time,\n}) => {\n const { t } = useTranslation();\n return (\n <div key={`divider${time}`} className=\"ui horizontal date divider\">\n <Icon icon={IconConstants.DATE} />\n {formatCalendarTime(time, t)}\n </div>\n );\n};\n","import { useMemo } from 'react';\nimport * as React from 'react';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { getListMessageId, getListMessageIdString } from 'utils/MessageUtils';\n\nimport { MessageListItem } from '../list/MessageListItem';\nimport { MessageListDateDivider, showDateDivider } from '../list/MessageListDateDivider';\n\nimport { ItemDownloadManager } from '../../../effects/ItemDownloadManager';\n\ninterface MessageItemData {\n entityId: API.IdType | undefined;\n onMessageVisibilityChanged: (id: number, inView: boolean) => void;\n addDownload: UI.AddItemDownload;\n highlightRemoteMenuId: string | undefined;\n}\n\nconst reduceMessageListItem = (\n {\n entityId,\n onMessageVisibilityChanged,\n addDownload,\n highlightRemoteMenuId,\n }: MessageItemData,\n reduced: React.ReactNode[],\n message: UI.MessageListItem,\n index: number,\n messageList: UI.MessageListItem[]\n) => {\n // Push a divider when the date was changed\n if (showDateDivider(index, messageList)) {\n const messageObj = !!message.chat_message\n ? message.chat_message\n : message.log_message;\n if (!!messageObj) {\n reduced.push(\n <MessageListDateDivider key={`divider${messageObj.id}`} time={messageObj.time} />\n );\n }\n }\n\n // Push message\n const id = getListMessageId(message)!;\n reduced.push(\n <MessageListItem\n key={id}\n id={getListMessageIdString(id)}\n onChange={(inView) => {\n onMessageVisibilityChanged(id, inView);\n }}\n threshold={0.4}\n message={message}\n // Highlight menus must use table action menu because the text element has overflow: hidden\n // to allow long words to be cut (author action menu can still use the regular dropdown)\n highlightMenuProps={{\n addDownload,\n entityId,\n remoteMenuId: highlightRemoteMenuId,\n boundary: '.message-section',\n // Determining the position is somewhat complex since the number of remote menu items isn't known at this point\n // Only use the boundary for now, could be improved later...\n // position: index < 4 ? 'bottom left' : 'top left',\n }}\n />\n );\n\n return reduced;\n};\n\ninterface Props {\n messages: UI.MessageListItem[] | null;\n session?: UI.SessionItemBase;\n highlightRemoteMenuId?: string;\n}\n\nexport const useMessagesNode = (\n { highlightRemoteMenuId, messages, session }: Props,\n downloadManager: ItemDownloadManager<UI.DownloadableItemInfo, Props>\n) => {\n const visibleItems = useMemo(() => new Set<number>(), [session]);\n\n const onMessageVisibilityChanged = (id: number, inView: boolean) => {\n if (!inView) {\n // console.log(`Remove view item ${id}`);\n visibleItems.delete(id);\n } else {\n // console.log(`Add view item ${id}`);\n visibleItems.add(id);\n }\n\n // console.log(`Visible items ${Array.from(visibleItems)}`);\n };\n\n const messageNodes = useMemo(() => {\n if (!messages) {\n return null;\n }\n\n return messages.reduce(\n reduceMessageListItem.bind(null, {\n highlightRemoteMenuId,\n entityId: session ? session.id : undefined,\n onMessageVisibilityChanged,\n addDownload: downloadManager.addDownloadItem,\n }),\n []\n );\n }, [messages]);\n\n return {\n messageNodes,\n visibleItems,\n };\n};\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!./messages.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!./messages.css\";\n export default content && content.locals ? content.locals : undefined;\n","//import PropTypes from 'prop-types';\nimport * as React from 'react';\nimport classNames from 'classnames';\n\nimport Loader from 'components/semantic/Loader';\n\nimport { useMessageViewScrollEffect } from 'effects';\nimport { useMessagesNode } from './effects/MessageNodeManager';\nimport { useItemDownloadManager } from '../../effects/ItemDownloadManager';\nimport { translate } from 'utils/TranslationUtils';\n\nimport DownloadDialog from 'components/download/DownloadDialog';\n\nimport * as UI from 'types/ui';\n\nimport './messages.css';\n\ninterface MessageViewProps {\n messages: UI.MessageListItem[] | null;\n session?: UI.SessionItemBase;\n className?: string;\n scrollPositionHandler: UI.ScrollPositionHandler;\n highlightRemoteMenuId?: string;\n t: UI.TranslateF;\n}\n\nconst MessageView: React.FC<MessageViewProps> = React.memo(\n function MessageView({ className, t, ...other }) {\n const downloadManager = useItemDownloadManager(other.session);\n const { messageNodes, visibleItems } = useMessagesNode(other, downloadManager);\n\n const scrollableRef = useMessageViewScrollEffect(other, visibleItems);\n\n return (\n <div ref={scrollableRef} className={classNames('message-section', className)}>\n {!!messageNodes ? (\n <>\n <div className=\"ui list message-list\">{messageNodes}</div>\n <DownloadDialog {...downloadManager.downloadDialogProps} />\n </>\n ) : (\n <Loader text={translate('Loading messages', t, UI.Modules.COMMON)} />\n )}\n </div>\n );\n },\n (prevProps, nextProps) => {\n return prevProps.messages === nextProps.messages;\n }\n);\n\nexport default MessageView;\n","import { useMemo } from 'react';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nexport interface ItemDownloadManager<\n ItemT extends UI.DownloadableItemInfo,\n PropsT extends object\n> {\n addDownloadItem: UI.AddItemDownload<ItemT, PropsT>;\n downloadDialogProps: UI.ItemDownloadHandler<ItemT, PropsT>;\n}\n\nexport const useItemDownloadManager = <\n ItemT extends UI.DownloadableItemInfo,\n PropsT extends object\n>(\n session: UI.SessionItemBase | undefined\n) => {\n const downloadManager = useMemo<ItemDownloadManager<ItemT, PropsT>>(() => {\n const downloads: { [key in string]: UI.ItemDownloadHandler<ItemT, PropsT> } = {};\n\n const getDownloadItem = (itemId: API.IdType) => {\n const item = downloads[itemId];\n if (!item) {\n throw new Error('Download was not found');\n }\n\n return item;\n };\n\n const ret: ItemDownloadManager<ItemT, PropsT> = {\n downloadDialogProps: {\n downloadHandler: (itemInfo, user, downloadData, downloadSession) => {\n return getDownloadItem(itemInfo.id).downloadHandler(\n itemInfo,\n user,\n downloadData,\n downloadSession\n );\n },\n userGetter: (itemId, props) => {\n const userGetter = getDownloadItem(itemId).userGetter;\n return !!userGetter ? userGetter(itemId, props) : undefined;\n },\n itemDataGetter: (itemId, socket) => {\n return getDownloadItem(itemId).itemDataGetter(itemId, socket);\n },\n session,\n },\n addDownloadItem: (itemId, itemDownloadHandler) => {\n downloads[itemId] = itemDownloadHandler;\n },\n };\n\n return ret;\n }, []);\n\n return downloadManager;\n};\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","observerMap","Map","RootIds","WeakMap","rootId","observe","element","callback","options","fallbackInView","unsupportedValue","window","IntersectionObserver","undefined","bounds","getBoundingClientRect","isIntersecting","intersectionRatio","threshold","time","boundingClientRect","intersectionRect","rootBounds","observer","elements","keys","sort","filter","map","root","has","set","toString","get","optionsToId","instance","thresholds","entries","forEach","entry","_elements$get","inView","some","trackVisibility","isVisible","Array","isArray","createObserver","callbacks","splice","indexOf","delete","unobserve","size","disconnect","_excluded","isPlainChildren","props","children","InView","constructor","super","node","_unobserveCb","handleNode","triggerOnce","skip","setState","initialInView","observeNode","handleChange","onChange","state","componentDidUpdate","prevProps","rootMargin","delay","componentWillUnmount","render","ref","_this$props","as","excluded","sourceKeys","_objectWithoutPropertiesLoose","TimeStamp","className","MessageText","emojify","message","user","label","highlightMenuProps","other","HighlightedText","text","highlights","menuProps","Author","dropdownContext","third_person","contextElement","triggerIcon","from","remoteMenuId","MenuConstants","entityId","hub_session_id","ChatMessage","shouldComponentUpdate","flags","join","propTypes","getSeverityIcon","severity","IconConstants","StatusMessage","Component","type","Icon","icon","MessageListItem","chat_message","boundary","log_message","getMessageDay","listItem","Date","getDate","isHistoryItem","MessageListDateDivider","t","reduceMessageListItem","onMessageVisibilityChanged","addDownload","highlightRemoteMenuId","reduced","index","messageList","currentMessage","showDateDivider","messageObj","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","downloadManager","session","useMemo","downloads","getDownloadItem","itemId","item","Error","downloadDialogProps","downloadHandler","itemInfo","downloadData","downloadSession","userGetter","itemDataGetter","socket","addDownloadItem","itemDownloadHandler","messageNodes","visibleItems","messages","Set","add","reduce","bind","useMessagesNode","scrollableRef","DownloadDialog","Loader","nextProps"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[424],{1624:(e,t,n)=>{n.d(t,{Z:()=>s});var i=n(87537),r=n.n(i),o=n(23645),a=n.n(o)()(r());a.push([e.id,"/* Generic table styles */\n.virtual-table {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.virtual-table .table-container-wrapper {\n width: 100%;\n flex: 1 1 auto;\n\n /* The table won't shrink properly without this */\n height: calc(100% - 50px);\n}\n\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\n cursor: pointer;\n}\n\n.virtual-table .fixedDataTableLayout_main {\n background-color: rgba(250, 250, 250, 0.8);\n}\n\n.virtual-table .fixedDataTableLayout_main:focus {\n outline: inherit;\n}\n\n.virtual-table .public_fixedDataTable_header a,\n.public_fixedDataTableCell_main a {\n color: black;\n}\n\n/* Common cell content styles */\n\n.virtual-table .cell-wrapper {\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n max-height: 50px;\n padding: 5px;\n}\n\n.virtual-table .cell-wrapper .plain.cell,\n.virtual-table .cell-wrapper .empty.dropdown {\n margin: 0px 3px;\n}\n\n.virtual-table .cell-wrapper .ui.progress .bar {\n height: 5px;\n}\n\n/* Footer */\n\n.table-footer {\n width: 100%;\n padding: 5px;\n background-color: #f6f7f8;\n background-image: -webkit-linear-gradient(#fff, #efefef);\n background-image: linear-gradient(#fff, #efefef);\n display: flex;\n align-items: center;\n}\n\n.table-footer > .filter {\n margin-left: auto;\n display: flex;\n}\n\n.table-footer > .filter > .count-info {\n margin-right: 0px;\n color: grey;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.table-footer > .filter > div:last-child {\n margin-left: 10px;\n}\n\n.table-footer > .filter .filter-method.dropdown.button {\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.table-footer > .filter .dropdown .trigger.icon {\n margin-right: 0px;\n}\n\n.table-footer > .filter input {\n width: 90%;\n}\n\n/* Table dropdowns */\n.table-container-wrapper .dropdown > .popup.trigger {\n max-width: 100%;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption {\n max-width: calc(100% - 20px);\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption > * {\n overflow: hidden;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger {\n line-height: 21px;\n display: flex;\n align-items: flex-start;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover,\n.public_fixedDataTableCell_main a:hover {\n cursor: pointer;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover span,\n.public_fixedDataTableCell_main a:hover {\n text-decoration: underline;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger i.angle.icon {\n margin: 0px;\n}\n\n.table-container-wrapper .dropdown .icon-caption .icon {\n width: inherit !important;\n}\n\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\n padding-left: 22px;\n}\n\n.table-container-wrapper .dropdown .trigger i {\n flex-shrink: 0;\n}\n\n/* Table dropdown popup content */\n.popup.dropdown-content {\n padding: 5px 15px;\n overflow: hidden;\n}\n\n.popup.dropdown-content .ui.dropdown.item {\n margin: 0px 0px;\n}\n","",{version:3,sources:["webpack://./src/components/table/style.css"],names:[],mappings:"AAAA,yBAAyB;AACzB;EACE,YAAY;EACZ,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,cAAc;;EAEd,iDAAiD;EACjD,yBAAyB;AAC3B;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,0CAA0C;AAC5C;;AAEA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,YAAY;AACd;;AAEA,+BAA+B;;AAE/B;EACE,kBAAkB;EAClB,QAAQ;EACR,2BAA2B;EAC3B,gBAAgB;EAChB,YAAY;AACd;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,WAAW;AACb;;AAEA,WAAW;;AAEX;EACE,WAAW;EACX,YAAY;EACZ,yBAAyB;EACzB,wDAAwD;EACxD,gDAAgD;EAChD,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;EACjB,aAAa;AACf;;AAEA;EACE,iBAAiB;EACjB,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,4BAA4B;EAC5B,6BAA6B;AAC/B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,UAAU;AACZ;;AAEA,oBAAoB;AACpB;EACE,eAAe;AACjB;;AAEA;EACE,4BAA4B;AAC9B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,aAAa;EACb,uBAAuB;AACzB;;AAEA;;EAEE,eAAe;AACjB;;AAEA;;EAEE,0BAA0B;AAC5B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,cAAc;AAChB;;AAEA,iCAAiC;AACjC;EACE,iBAAiB;EACjB,gBAAgB;AAClB;;AAEA;EACE,eAAe;AACjB",sourcesContent:["/* Generic table styles */\n.virtual-table {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.virtual-table .table-container-wrapper {\n width: 100%;\n flex: 1 1 auto;\n\n /* The table won't shrink properly without this */\n height: calc(100% - 50px);\n}\n\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\n cursor: pointer;\n}\n\n.virtual-table .fixedDataTableLayout_main {\n background-color: rgba(250, 250, 250, 0.8);\n}\n\n.virtual-table .fixedDataTableLayout_main:focus {\n outline: inherit;\n}\n\n.virtual-table .public_fixedDataTable_header a,\n.public_fixedDataTableCell_main a {\n color: black;\n}\n\n/* Common cell content styles */\n\n.virtual-table .cell-wrapper {\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n max-height: 50px;\n padding: 5px;\n}\n\n.virtual-table .cell-wrapper .plain.cell,\n.virtual-table .cell-wrapper .empty.dropdown {\n margin: 0px 3px;\n}\n\n.virtual-table .cell-wrapper .ui.progress .bar {\n height: 5px;\n}\n\n/* Footer */\n\n.table-footer {\n width: 100%;\n padding: 5px;\n background-color: #f6f7f8;\n background-image: -webkit-linear-gradient(#fff, #efefef);\n background-image: linear-gradient(#fff, #efefef);\n display: flex;\n align-items: center;\n}\n\n.table-footer > .filter {\n margin-left: auto;\n display: flex;\n}\n\n.table-footer > .filter > .count-info {\n margin-right: 0px;\n color: grey;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.table-footer > .filter > div:last-child {\n margin-left: 10px;\n}\n\n.table-footer > .filter .filter-method.dropdown.button {\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.table-footer > .filter .dropdown .trigger.icon {\n margin-right: 0px;\n}\n\n.table-footer > .filter input {\n width: 90%;\n}\n\n/* Table dropdowns */\n.table-container-wrapper .dropdown > .popup.trigger {\n max-width: 100%;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption {\n max-width: calc(100% - 20px);\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption > * {\n overflow: hidden;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger {\n line-height: 21px;\n display: flex;\n align-items: flex-start;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover,\n.public_fixedDataTableCell_main a:hover {\n cursor: pointer;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover span,\n.public_fixedDataTableCell_main a:hover {\n text-decoration: underline;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger i.angle.icon {\n margin: 0px;\n}\n\n.table-container-wrapper .dropdown .icon-caption .icon {\n width: inherit !important;\n}\n\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\n padding-left: 22px;\n}\n\n.table-container-wrapper .dropdown .trigger i {\n flex-shrink: 0;\n}\n\n/* Table dropdown popup content */\n.popup.dropdown-content {\n padding: 5px 15px;\n overflow: hidden;\n}\n\n.popup.dropdown-content .ui.dropdown.item {\n margin: 0px 0px;\n}\n"],sourceRoot:""}]);const s=a},11508:(e,t,n)=>{n.d(t,{Z:()=>c});var i=n(10293),r=n.n(i),o=n(518),a=n(66883);const s=r().createActions([{setRange:{asyncResult:!0}},{setSort:{asyncResult:!0}},{close:{asyncResult:!0}},{pause:{asyncResult:!0}},{init:{asyncResult:!0}},"clear"]),l=(e,t,n)=>o.Z.post(t+"/settings",e).then((e=>n.completed(t,e))).catch((e=>n.failed(t,e)));s.close.listen((function(e,t){if(t&&a.Z.socketAuthenticated){const t=this;return o.Z.delete(e).then((n=>t.completed(e,n))).catch((t=>this.failed(e,t)))}return Promise.resolve()})),s.setSort.listen((function(e,t,n){l({sort_property:t,sort_ascending:n},e,this)})),s.setRange.listen((function(e,t,n){console.assert(n>0,"Invalid max rows"),l({range_start:t,max_count:n},e,this)})),s.pause.listen((function(e,t){l({paused:t},e,this)})),s.init.listen((function(e,t,n){n&&l({source_filter:n},e,this)}));const c=s},91780:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(85893),r=(n(67294),n(10696),n(94184)),o=n.n(r);const a=({item:e})=>(0,i.jsxs)("div",Object.assign({className:"ip flag"},{children:[(0,i.jsx)("i",{className:o()("ui flag",e.country.toLowerCase())}),e.str]}))},68126:(e,t,n)=>{n.d(t,{$A:()=>y,CW:()=>m,DS:()=>b,Eh:()=>f,Ks:()=>C,LV:()=>v,M4:()=>A,Nq:()=>w,VL:()=>x,fI:()=>E,iK:()=>D,qN:()=>g,uL:()=>j,wn:()=>B});var i=n(85893),r=(n(67294),n(84613)),o=n(2445),a=n(99015),s=n(91780),l=n(70516),c=n(89519),d=n(35108),p=n(28553),h=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(e);r<i.length;r++)t.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(e,i[r])&&(n[i[r]]=e[i[r]])}return n};const u=e=>"object"==typeof e?Array.isArray(e)?e.length:e.str:0===e?null:e,A=({cellData:e})=>(0,i.jsx)("span",Object.assign({className:"plain text cell"},{children:u(e)})),g=e=>{var{onClick:t,label:n,columnKey:r}=e,o=h(e,["onClick","label","columnKey"]);return(0,i.jsx)(d.Cell,Object.assign({},o,{children:(0,i.jsx)("a",Object.assign({onClick:t},{children:n}))}))},w=e=>{var{cellData:t,rowDataGetter:n,children:o}=e,s=h(e,["cellData","rowDataGetter","children"]);return(0,i.jsx)(r.B2,Object.assign({caption:(0,i.jsx)(a.Z,{typeInfo:n().type,caption:t,className:"icon-caption"}),itemData:n},s))},m=e=>{var{cellData:t,rowDataGetter:n}=e,o=h(e,["cellData","rowDataGetter"]);return(0,i.jsx)(r.B2,Object.assign({caption:t,itemData:n},o))},b=e=>{var{cellData:t,rowDataGetter:n,actions:r,actionId:o}=e,a=h(e,["cellData","rowDataGetter","actions","actionId"]);const s=r.actions[o];return(0,c.OE)(s,n())?(0,i.jsx)(p.h,{children:({onClickAction:e})=>(0,i.jsx)("a",Object.assign({className:"plain link cell",onClick:()=>e({actionId:o,action:s,moduleId:r.moduleId,itemData:n()})},{children:u(t)}))}):(0,i.jsx)(A,Object.assign({cellData:t},a))},f=({cellData:e,t})=>(0,i.jsx)("span",Object.assign({className:"plain size cell"},{children:(0,o.BU)(e,t)})),v=({cellData:e,t})=>(0,i.jsx)("span",Object.assign({className:"plain speed cell"},{children:(0,o.CY)(e,t)})),C=({cellData:e})=>(0,i.jsx)("span",Object.assign({className:"plain duration cell"},{children:(0,o.SY)(e)})),x=({cellData:e})=>(0,i.jsx)("span",Object.assign({className:"plain abbr-duration cell"},{children:(0,o.LO)(e)})),E=({cellData:e})=>(0,i.jsx)(s.Z,{item:e}),y=({cellData:e,t})=>(0,i.jsx)("span",Object.assign({className:"plain connection cell"},{children:(0,o.Nh)(e,t)})),j=({cellData:e})=>(0,i.jsx)("span",Object.assign({className:"plain decimal cell"},{children:(0,o.VG)(e)})),D=e=>{var{cellData:t,rowDataGetter:n,clickHandlerGetter:o,userGetter:s,downloadHandler:l}=e,c=h(e,["cellData","rowDataGetter","clickHandlerGetter","userGetter","downloadHandler"]);return(0,i.jsx)(r.As,Object.assign({caption:(0,i.jsx)(a.Z,{typeInfo:n().type,onClick:o?o(t,n):null,caption:t,className:"icon-caption"}),user:s(n()),linkCaption:!o,itemInfoGetter:n,downloadHandler:l},c))},B=e=>{var{cellData:t,rowDataGetter:n,onChange:r}=e,o=h(e,["cellData","rowDataGetter","onChange"]);return(0,i.jsx)(l.Z,Object.assign({checked:t,onChange:e=>r(e,n())},o))}},78230:(e,t,n)=>{n.d(t,{Z:()=>J});var i=n(85893),r=n(45697),o=n.n(r),a=n(67294),s=n(11508),l=n(1059),c=n(99005),d=n(98374),p=n(16630),h=n(76249),u=n(10606),A=n(8717),g=n(91072);const w=(e,t)=>{const n=(e=>{switch(e){case h.V3.REGEX:return"Regex";case h.V3.WILDCARD:return"Wildcard";case h.V3.EXACT:return"Exact";default:return"Partial"}})(e);return(0,A.Iu)(n,t,"table.filter")},m=(e,t)=>{let n=t("table.filter.filter","Filter");return e!==h.V3.PARTIAL&&(n+=` (${w(e,t).toLowerCase()})`),n+"..."};class b extends a.PureComponent{constructor(){super(...arguments),this.state={value:"",method:h.V3.PARTIAL},this.onFilterUpdated=()=>{const{value:e,method:t}=this.state;this.props.onFilterUpdated(e,t)},this.onTextChanged=e=>{this.setState({value:e.target.value}),clearTimeout(this.timer),this.timer=window.setTimeout((()=>{this.onFilterUpdated()}),200)},this.onMethodChanged=e=>{this.setState({method:e}),setTimeout((()=>this.onFilterUpdated())),this.input.focus()},this.getFilterMethod=(e,t)=>{const n=e===this.state.method;return(0,i.jsx)(d.Z,Object.assign({onClick:()=>this.onMethodChanged(e),active:n},{children:w(e,t)}),e)}}componentWillUnmount(){clearTimeout(this.timer)}render(){const{value:e,method:t}=this.state,{autoFocus:n}=this.props;return(0,i.jsx)(g.Wb,{children:r=>(0,i.jsx)("div",Object.assign({className:"text-filter"},{children:(0,i.jsxs)("div",Object.assign({className:"ui action input"},{children:[(0,i.jsx)("input",{ref:e=>this.input=e,placeholder:m(t,r),onChange:this.onTextChanged,value:e,type:"text",autoFocus:!(0,u.wd)()&&n}),(0,i.jsx)(l.Z,Object.assign({className:"filter-method right top pointing",button:!0,direction:"upward"},{children:(0,i.jsx)(c.Z,Object.assign({caption:(0,A.Iu)("Match type",r,"table.filter")},{children:Object.keys(h.V3).filter((e=>isNaN(Number(e)))).map((e=>this.getFilterMethod(h.V3[e],r)))}))}))]}))}))})}}b.defaultProps={autoFocus:!0};const f=(0,p.Z)(b);var v=n(35936),C=n(48117);const x=({store:e})=>{if(e.totalCount<0)return null;let t=e.totalCount;return e.totalCount!==e.rowCount&&(t=e.rowCount+"/"+e.totalCount),(0,i.jsxs)("div",Object.assign({className:"count-info"},{children:[(0,i.jsx)(v.Z,{icon:C.Z.FILTER}),t]}))},E=({store:e,customFilter:t,footerData:n,textFilterProps:r})=>(0,i.jsxs)("div",Object.assign({className:"table-footer"},{children:[n,(0,i.jsxs)("div",Object.assign({className:"filter item"},{children:[t?(0,i.jsx)(t,{store:e}):null,(0,i.jsx)(f,Object.assign({store:e},r)),(0,i.jsx)(x,{store:e})]}))]}));var y=n(35108),j=n(88699);class D extends a.Component{constructor(){super(...arguments),this.state={rowData:null},this.loadData=e=>this.props.dataLoader.updateRowData(e,this.onDataLoaded),this.rowDataGetter=()=>this.state.rowData,this.onDataLoaded=e=>{this.setState({rowData:e})}}componentDidMount(){this.loadData(this.props.rowIndex)}UNSAFE_componentWillReceiveProps(e){e.rowIndex!==this.props.rowIndex&&this.props.dataLoader.removePendingRequests(this.props.rowIndex,this.onDataLoaded),this.loadData(e.rowIndex)||this.setState({rowData:null})}componentWillUnmount(){this.props.dataLoader.removePendingRequests(this.props.rowIndex,this.onDataLoaded)}shouldComponentUpdate(e,t){return t.rowData!==this.state.rowData||e.width!==this.props.width}render(){const e=this.props,{columnKey:t,children:n,renderCondition:r,rowClassNameGetter:o}=e,s=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(e);r<i.length;r++)t.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(e,i[r])&&(n[i[r]]=e[i[r]])}return n}(e,["columnKey","children","renderCondition","rowClassNameGetter"]),{rowData:l}=this.state;if(!l)return null;if(r&&!r(l[t],l))return null;let c=t;return o&&(c+=" "+o(l)),(0,i.jsx)("div",Object.assign({className:"cell-wrapper "+c},{children:a.cloneElement(n,Object.assign({cellData:l[t],rowDataGetter:this.rowDataGetter},s))}))}}D.propTypes={rowIndex:o().number,dataLoader:o().object.isRequired,width:o().number};const B=D;var _=n(68126),R=n(32347);const O=(e,t,n,i)=>{const{name:r,columnKey:o}=e.props;let a=i((0,A.GF)(o,[...(0,A.qo)(n),R.W9.TABLE]),r);{const e=t.sortAscending?" ↑":" ↓";a+=t.sortProperty===o?e:""}return a};class I extends a.Component{constructor(){super(...arguments),this.state={width:0,height:0,columnWidths:{},isColumnResizing:void 0},this.getInitialProps=()=>({rowClassNameGetter:null,entityId:null}),this.scrollPosition=0,this.setInitialScrollRow=!0,this.updateRowRange=()=>{const{store:e}=this.props,{height:t}=this.state,n=(i=this.scrollPosition,Math.max(Math.floor(i/50),0));var i;const r=function(e){return Math.ceil(e/50)}(t);e.DEBUG&&console.log(`Settings changed, start: ${n}, end: ${r}, height: ${t}`,e.viewName),console.assert(e.active,"Posting data for an inactive view"),s.Z.setRange(e.viewUrl,n,r)},this.onScrollStart=(e,t)=>{const{store:n}=this.props;n.DEBUG&&console.log(`Scrolling started: ${t}`,n.viewUrl),console.assert(n.active,"Sending pause for an inactive view"),s.Z.pause(n.viewUrl,!0)},this.onScrollEnd=(e,t)=>{const{store:n,viewId:i}=this.props;this.scrollPosition=t,console.assert(n.active,"Sending pause for an inactive view"),s.Z.pause(n.viewUrl,!1),clearTimeout(this.scrollTimer),this.scrollTimer=window.setTimeout(this.updateRowRange,500),this.setInitialScrollRow&&(this.setInitialScrollRow=!1,n.DEBUG&&console.log(`Disabling initial scroll (view ${i})`)),n.setScrollData(t,i),n.DEBUG&&console.log(`Scrolling ended: ${t}`,n.viewUrl)},this.onColumnClicked=e=>{const{store:t}=this.props;let n=!0;e===t.sortProperty&&t.sortAscending&&(n=!1),s.Z.setSort(this.props.store.viewUrl,e,n)},this.onColumnResizeEndCallback=(e,t)=>{this.setState((({columnWidths:n})=>({columnWidths:Object.assign(Object.assign({},n),{[t]:e}),isColumnResizing:!1})),(()=>{this.setState({isColumnResizing:void 0})}))},this.childToColumn=e=>{if(e.props.hideWidth&&e.props.hideWidth>this.state.width)return null;let{flexGrow:t,width:n}=e.props;const{cell:r,columnKey:o,renderCondition:s}=e.props,{store:l,rowClassNameGetter:c,moduleId:d,t:p}=this.props,h=(0,u.wd)();return h||o&&this.state.columnWidths[o]&&(n=this.state.columnWidths[o],t=void 0),a.cloneElement(e,{header:(0,i.jsx)(_.qN,{onClick:this.onColumnClicked.bind(null,o),label:O(e,l,d,p)}),flexGrow:t,width:n,isResizable:!h,allowCellsRecycling:!0,cell:(0,i.jsx)(B,Object.assign({dataLoader:this.props.dataLoader,renderCondition:s,rowClassNameGetter:c,t:p},{children:r||(0,i.jsx)(_.M4,{})}))})},this.onResizeView=e=>{if(!e.bounds)return;const{width:t,height:n}=e.entry?e.entry:e.bounds;this.setState({width:t,height:n})}}componentDidUpdate(e,t){t.height!==this.state.height?this.updateRowRange():e.entityId===this.props.entityId&&e.viewId===this.props.viewId||(this.props.store.DEBUG&&console.log(`Enabling initial scroll, entity/viewId changed (view ${this.props.viewId})`),this.setInitialScrollRow=!0,this.updateRowRange())}componentWillUnmount(){clearTimeout(this.scrollTimer)}render(){const e=a.Children.map(this.props.children,this.childToColumn),{width:t,height:n,isColumnResizing:r}=this.state,{store:o,viewId:s}=this.props;return(0,i.jsx)(j.Z,Object.assign({bounds:!0,onResize:this.onResizeView},{children:({measureRef:a})=>(0,i.jsx)("div",Object.assign({ref:a,className:"table-container-wrapper"},{children:(0,i.jsx)(y.Table,Object.assign({width:t,height:n,rowHeight:50,rowsCount:o.rowCount,headerHeight:50,isColumnResizing:r,onColumnResizeEndCallback:this.onColumnResizeEndCallback,touchScrollEnabled:!0,onScrollStart:this.onScrollStart,onScrollEnd:this.onScrollEnd,scrollTop:this.setInitialScrollRow?o.getScrollData(s):void 0},{children:e}))}))}))}}I.propTypes={store:o().object.isRequired,rowClassNameGetter:o().func,entityId:o().any,dataLoader:o().any.isRequired};const S=I;var U=n(518),T=n(7145),k=n.n(T),N=n(18446),G=n.n(N);var Z=n(93379),L=n.n(Z),P=n(7795),F=n.n(P),W=n(90569),q=n.n(W),$=n(3565),M=n.n($),z=n(19216),V=n.n(z),Y=n(44589),K=n.n(Y),H=n(1624),X={};X.styleTagTransform=K(),X.setAttributes=M(),X.insert=q().bind(null,"head"),X.domAPI=F(),X.insertStyleElement=V(),L()(H.Z,X),H.Z&&H.Z.locals&&H.Z.locals,n(60854);class Q extends a.PureComponent{constructor(){super(...arguments),this.dataLoader=new class{constructor(e,t){this._onDataLoad=t,this._store=e,this._data=[],this._pendingRequest={},this._initialDataReceived=!1}clear(){this._pendingRequest={},this._data=[]}updateItem(e,t,n){let i=this._data[n];return i===t||G()(this._data[n],t)?e:(this._data[n]=i?k()(i,{$merge:t}):k()(i,{$set:t}),e+1)}onItemsUpdated(e,t=0,n){let i=n<this._data.length;if(e&&0!==e.length){this._initialDataReceived=!0;for(let t=0;t<this._data.length;t++)e[t]||delete this._data[t];(e.reduce(this.updateItem.bind(this),0)>0||0!==t)&&(i=!0)}else this.clear(),i=!0,this._initialDataReceived=!1;i&&this._onDataLoad()}get rangeOffset(){const e=this._rangeOffset;return this._rangeOffset=0,e}getRowData(e){return this._data[e]}updateRowData(e,t){const n=this._data[e];return n?(t(n),!0):(this._initialDataReceived&&this._queueRequestFor(e,t),!1)}removePendingRequests(e){delete this._pendingRequest[e]}_queueRequestFor(e,t){const n=e-e%10,i=this._pendingRequest[e];if(i)return void i.push(t);if(this._pendingRequest[e]=[t],e!==n){if(this._pendingRequest[n])return;this._pendingRequest[n]=[]}const r=Math.min(n+10,this._store.rowCount);U.Z.get(this._store.viewUrl+"/items/"+n+"/"+r).then(this.onRowsReceived.bind(this,n)).catch((e=>{console.error("Failed to load data",e);for(let e=n;e<r;e++)this._pendingRequest[e]&&delete this._pendingRequest[e]}))}onRowsReceived(e,t){if(this._pendingRequest[e])for(let n=0;n<t.length;n++){const i=e+n;G()(this._data[i],t[n])||(this._data[i]=t[n],this._pendingRequest[i]&&this._pendingRequest[i].forEach((e=>e(t[n])))),delete this._pendingRequest[i]}}}(this.props.store,(()=>this.forceUpdate())),this.unsubscribe=this.props.store.listen(this.dataLoader.onItemsUpdated.bind(this.dataLoader)),this.moduleExists=e=>!e||!this.props.sessionStore||this.props.sessionStore.getSession(e),this.start=e=>{const{store:t,sourceFilter:n}=this.props;s.Z.init(t.viewUrl,e,n),s.Z.setSort(t.viewUrl,t.sortProperty,t.sortAscending)},this.close=e=>{s.Z.close(this.props.store.viewUrl,this.moduleExists(e))}}componentDidMount(){this.start(this.props.entityId)}componentWillUnmount(){this.close(this.props.entityId),this.unsubscribe()}componentDidUpdate(e){if(e.entityId!==this.props.entityId&&(this.close(e.entityId),this.start(this.props.entityId)),e.viewId!==this.props.viewId){const{store:e}=this.props;e.paused&&s.Z.pause(e.viewUrl,!1),s.Z.clear(e.viewUrl)}}render(){const e=this.props,{store:t,footerData:n,emptyRowsNodeGetter:r,customFilter:o,textFilterProps:a}=e,s=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(e);r<i.length;r++)t.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(e,i[r])&&(n[i[r]]=e[i[r]])}return n}(e,["store","footerData","emptyRowsNodeGetter","customFilter","textFilterProps"]);return r&&-1===t.totalCount?(0,i.jsx)("div",{className:"virtual-table"}):r&&0===t.totalCount?r():(0,i.jsx)("div",Object.assign({className:"virtual-table"},{children:(0,i.jsx)(g.Wb,{children:e=>(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(S,Object.assign({},s,{dataLoader:this.dataLoader,store:t,t:e})),(0,i.jsx)(E,{store:t,customFilter:o,footerData:n,textFilterProps:a})]})})}))}}Q.propTypes={footerData:o().node,emptyRowsNodeGetter:o().func,viewId:o().any,sessionStore:o().object,customFilter:o().elementType,sourceFilter:o().object};const J=Q},16630:(e,t,n)=>{n.d(t,{Z:()=>l});var i=n(85893),r=n(67294),o=n(42090),a=n(518),s=n(76249);function l(e,t="any"){return(0,o.Z)((n=>(r.useLayoutEffect((()=>()=>{const{store:e,filter:t}=n;e.active&&a.Z.delete(`${e.viewUrl}/filter/${t.id}`).catch((e=>console.error("Failed to delete table filter",e)))}),[]),(0,i.jsx)(e,Object.assign({},n,{onFilterUpdated:(e,i=s.V3.PARTIAL)=>{const r={pattern:e,method:i,property:t},{store:o,filter:l}=n;a.Z.put(`${o.viewUrl}/filter/${l.id}`,r).catch((e=>console.error("Failed to add table filter",e)))}})))),{urls:{filter:({store:e},t)=>t.post(`${e.viewUrl}/filter`)},loaderText:null})}},93836:(e,t,n)=>{n.d(t,{Z:()=>s});var i=n(518),r=n(11508),o=n(41143),a=n.n(o);const s=(e,t=!0)=>{let n=!1,o=-1,s=0,l=0,c=[],d=null,p=!1,h=0,u=e,A=t;const g=()=>{c=[],l=0,s=0,o=-1};return{listenables:r.Z,onClose(e){e===this.viewUrl&&(this.DEBUG&&console.log(`Closing view ${this.viewUrl}`),this._removeMessageListener(),g(),n=!1,this.trigger())},onClear(e){e===this.viewUrl&&(g(),this.trigger())},onPause(e,t){e===this.viewUrl&&(p=t)},onInit(e,t){e===this.viewUrl&&(a()(!n,"Trying start an active table view"),d=t,this.addMessageListener(),this.DEBUG&&console.log(`Starting view ${this.viewUrl}`),n=!0)},onSetSort(e,t,n){e===this.viewUrl&&(u=t,A=n)},addMessageListener(){this._removeMessageListener=i.Z.addViewUpdateListener(this._viewName,this._handleUpdate,d)},get items(){return c},get viewUrl(){let e=this._apiUrl+"/";return d&&(e+=d+"/"),e+=this._viewName,e},get viewName(){return this._viewName},get rowCount(){return s},get totalCount(){return o},get active(){return n},get sortProperty(){return u},get sortAscending(){return A},get paused(){return p},setScrollData(e,t){this._sessionStore?this._sessionStore.scroll.setScrollData(e,d,t):(this.DEBUG&&console.log(`Setting scroll position ${e} for view ${this.viewUrl} (view ID ${t})`),h=e)},getScrollData(e){return this._sessionStore?this._sessionStore.scroll.getScrollData(d,e):(this.DEBUG&&console.log(`Getting scroll position ${h} for view ${this.viewUrl} (view ID ${e})`),h)},_handleUpdate(e){(e=>{var t;null!=e.range_start&&(l=e.range_start),null!=e.total_items&&(o=e.total_items),null!=e.matching_items&&(s=e.matching_items),null!=e.items&&(t=e.items,c=t.reduce(((e,t,n)=>{let i=(r=t.id,c.find((e=>!!e&&e.id===r))||{id:t.id});var r;return t.properties?i=Object.assign({},i,t.properties):1===Object.keys(i).length&&console.error("No properties were sent for a new view item",i.id),e[l+n]=i,e}),[]))})(e),this.trigger(c,e.range_offset,s)}}}}}]);
2
- //# sourceMappingURL=424.5cc8383701bc3226c5ff.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"js/424.5cc8383701bc3226c5ff.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/table/style.css","webpack://airdcpp-webui/./src/actions/TableActions.js","webpack://airdcpp-webui/./src/components/format/FormattedIp.tsx","webpack://airdcpp-webui/./src/components/table/Cell.tsx","webpack://airdcpp-webui/./src/components/table/TextFilter.tsx","webpack://airdcpp-webui/./src/components/table/TableFooter.tsx","webpack://airdcpp-webui/./src/components/table/RowWrapperCell.tsx","webpack://airdcpp-webui/./src/components/table/TableContainer.tsx","webpack://airdcpp-webui/./src/components/table/style.css?53ed","webpack://airdcpp-webui/./src/components/table/VirtualTable.tsx","webpack://airdcpp-webui/./src/components/table/RowDataLoader.js","webpack://airdcpp-webui/./src/decorators/TableFilterDecorator.tsx","webpack://airdcpp-webui/./src/mixins/ViewStoreMixin.js"],"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, \"/* Generic table styles */\\n.virtual-table {\\n height: 100%;\\n width: 100%;\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n}\\n\\n.virtual-table .table-container-wrapper {\\n width: 100%;\\n flex: 1 1 auto;\\n\\n /* The table won't shrink properly without this */\\n height: calc(100% - 50px);\\n}\\n\\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\\n cursor: pointer;\\n}\\n\\n.virtual-table .fixedDataTableLayout_main {\\n background-color: rgba(250, 250, 250, 0.8);\\n}\\n\\n.virtual-table .fixedDataTableLayout_main:focus {\\n outline: inherit;\\n}\\n\\n.virtual-table .public_fixedDataTable_header a,\\n.public_fixedDataTableCell_main a {\\n color: black;\\n}\\n\\n/* Common cell content styles */\\n\\n.virtual-table .cell-wrapper {\\n position: relative;\\n top: 50%;\\n transform: translateY(-50%);\\n max-height: 50px;\\n padding: 5px;\\n}\\n\\n.virtual-table .cell-wrapper .plain.cell,\\n.virtual-table .cell-wrapper .empty.dropdown {\\n margin: 0px 3px;\\n}\\n\\n.virtual-table .cell-wrapper .ui.progress .bar {\\n height: 5px;\\n}\\n\\n/* Footer */\\n\\n.table-footer {\\n width: 100%;\\n padding: 5px;\\n background-color: #f6f7f8;\\n background-image: -webkit-linear-gradient(#fff, #efefef);\\n background-image: linear-gradient(#fff, #efefef);\\n display: flex;\\n align-items: center;\\n}\\n\\n.table-footer > .filter {\\n margin-left: auto;\\n display: flex;\\n}\\n\\n.table-footer > .filter > .count-info {\\n margin-right: 0px;\\n color: grey;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n}\\n\\n.table-footer > .filter > div:last-child {\\n margin-left: 10px;\\n}\\n\\n.table-footer > .filter .filter-method.dropdown.button {\\n padding-left: 0px !important;\\n padding-right: 0px !important;\\n}\\n\\n.table-footer > .filter .dropdown .trigger.icon {\\n margin-right: 0px;\\n}\\n\\n.table-footer > .filter input {\\n width: 90%;\\n}\\n\\n/* Table dropdowns */\\n.table-container-wrapper .dropdown > .popup.trigger {\\n max-width: 100%;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger .caption {\\n max-width: calc(100% - 20px);\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger .caption > * {\\n overflow: hidden;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger {\\n line-height: 21px;\\n display: flex;\\n align-items: flex-start;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger:hover,\\n.public_fixedDataTableCell_main a:hover {\\n cursor: pointer;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger:hover span,\\n.public_fixedDataTableCell_main a:hover {\\n text-decoration: underline;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger i.angle.icon {\\n margin: 0px;\\n}\\n\\n.table-container-wrapper .dropdown .icon-caption .icon {\\n width: inherit !important;\\n}\\n\\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\\n padding-left: 22px;\\n}\\n\\n.table-container-wrapper .dropdown .trigger i {\\n flex-shrink: 0;\\n}\\n\\n/* Table dropdown popup content */\\n.popup.dropdown-content {\\n padding: 5px 15px;\\n overflow: hidden;\\n}\\n\\n.popup.dropdown-content .ui.dropdown.item {\\n margin: 0px 0px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/table/style.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;AACzB;EACE,YAAY;EACZ,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,cAAc;;EAEd,iDAAiD;EACjD,yBAAyB;AAC3B;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,0CAA0C;AAC5C;;AAEA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,YAAY;AACd;;AAEA,+BAA+B;;AAE/B;EACE,kBAAkB;EAClB,QAAQ;EACR,2BAA2B;EAC3B,gBAAgB;EAChB,YAAY;AACd;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,WAAW;AACb;;AAEA,WAAW;;AAEX;EACE,WAAW;EACX,YAAY;EACZ,yBAAyB;EACzB,wDAAwD;EACxD,gDAAgD;EAChD,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;EACjB,aAAa;AACf;;AAEA;EACE,iBAAiB;EACjB,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,4BAA4B;EAC5B,6BAA6B;AAC/B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,UAAU;AACZ;;AAEA,oBAAoB;AACpB;EACE,eAAe;AACjB;;AAEA;EACE,4BAA4B;AAC9B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,aAAa;EACb,uBAAuB;AACzB;;AAEA;;EAEE,eAAe;AACjB;;AAEA;;EAEE,0BAA0B;AAC5B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,cAAc;AAChB;;AAEA,iCAAiC;AACjC;EACE,iBAAiB;EACjB,gBAAgB;AAClB;;AAEA;EACE,eAAe;AACjB\",\"sourcesContent\":[\"/* Generic table styles */\\n.virtual-table {\\n height: 100%;\\n width: 100%;\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n}\\n\\n.virtual-table .table-container-wrapper {\\n width: 100%;\\n flex: 1 1 auto;\\n\\n /* The table won't shrink properly without this */\\n height: calc(100% - 50px);\\n}\\n\\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\\n cursor: pointer;\\n}\\n\\n.virtual-table .fixedDataTableLayout_main {\\n background-color: rgba(250, 250, 250, 0.8);\\n}\\n\\n.virtual-table .fixedDataTableLayout_main:focus {\\n outline: inherit;\\n}\\n\\n.virtual-table .public_fixedDataTable_header a,\\n.public_fixedDataTableCell_main a {\\n color: black;\\n}\\n\\n/* Common cell content styles */\\n\\n.virtual-table .cell-wrapper {\\n position: relative;\\n top: 50%;\\n transform: translateY(-50%);\\n max-height: 50px;\\n padding: 5px;\\n}\\n\\n.virtual-table .cell-wrapper .plain.cell,\\n.virtual-table .cell-wrapper .empty.dropdown {\\n margin: 0px 3px;\\n}\\n\\n.virtual-table .cell-wrapper .ui.progress .bar {\\n height: 5px;\\n}\\n\\n/* Footer */\\n\\n.table-footer {\\n width: 100%;\\n padding: 5px;\\n background-color: #f6f7f8;\\n background-image: -webkit-linear-gradient(#fff, #efefef);\\n background-image: linear-gradient(#fff, #efefef);\\n display: flex;\\n align-items: center;\\n}\\n\\n.table-footer > .filter {\\n margin-left: auto;\\n display: flex;\\n}\\n\\n.table-footer > .filter > .count-info {\\n margin-right: 0px;\\n color: grey;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n}\\n\\n.table-footer > .filter > div:last-child {\\n margin-left: 10px;\\n}\\n\\n.table-footer > .filter .filter-method.dropdown.button {\\n padding-left: 0px !important;\\n padding-right: 0px !important;\\n}\\n\\n.table-footer > .filter .dropdown .trigger.icon {\\n margin-right: 0px;\\n}\\n\\n.table-footer > .filter input {\\n width: 90%;\\n}\\n\\n/* Table dropdowns */\\n.table-container-wrapper .dropdown > .popup.trigger {\\n max-width: 100%;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger .caption {\\n max-width: calc(100% - 20px);\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger .caption > * {\\n overflow: hidden;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger {\\n line-height: 21px;\\n display: flex;\\n align-items: flex-start;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger:hover,\\n.public_fixedDataTableCell_main a:hover {\\n cursor: pointer;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger:hover span,\\n.public_fixedDataTableCell_main a:hover {\\n text-decoration: underline;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger i.angle.icon {\\n margin: 0px;\\n}\\n\\n.table-container-wrapper .dropdown .icon-caption .icon {\\n width: inherit !important;\\n}\\n\\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\\n padding-left: 22px;\\n}\\n\\n.table-container-wrapper .dropdown .trigger i {\\n flex-shrink: 0;\\n}\\n\\n/* Table dropdown popup content */\\n.popup.dropdown-content {\\n padding: 5px 15px;\\n overflow: hidden;\\n}\\n\\n.popup.dropdown-content .ui.dropdown.item {\\n margin: 0px 0px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import Reflux from 'reflux';\n\nimport SocketService from 'services/SocketService';\n\nimport LoginStore from 'stores/LoginStore';\n\nconst TableActions = Reflux.createActions([\n { setRange: { asyncResult: true } },\n { setSort: { asyncResult: true } },\n { close: { asyncResult: true } },\n { pause: { asyncResult: true } },\n { init: { asyncResult: true } },\n 'clear',\n]);\n\nconst postSettings = (settings, viewUrl, action) => {\n return SocketService.post(viewUrl + '/settings', settings)\n .then((data) => action.completed(viewUrl, data))\n .catch((error) => action.failed(viewUrl, error));\n};\n\nTableActions.close.listen(function (viewUrl, sessionExists) {\n if (sessionExists && LoginStore.socketAuthenticated) {\n const that = this;\n return SocketService.delete(viewUrl)\n .then((data) => that.completed(viewUrl, data))\n .catch((error) => this.failed(viewUrl, error));\n }\n\n return Promise.resolve();\n});\n\nTableActions.setSort.listen(function (viewUrl, sortProperty, sortAscending) {\n postSettings(\n {\n sort_property: sortProperty,\n sort_ascending: sortAscending,\n },\n viewUrl,\n this\n );\n});\n\nTableActions.setRange.listen(function (viewUrl, rangeStart, maxRows) {\n console.assert(maxRows > 0, 'Invalid max rows');\n postSettings(\n {\n range_start: rangeStart,\n max_count: maxRows,\n },\n viewUrl,\n this\n );\n});\n\nTableActions.pause.listen(function (viewUrl, pause) {\n postSettings(\n {\n paused: pause,\n },\n viewUrl,\n this\n );\n});\n\nTableActions.init.listen(function (viewUrl, entityId, filterData) {\n if (filterData) {\n postSettings(\n {\n source_filter: filterData,\n },\n viewUrl,\n this\n );\n }\n});\n\nexport default TableActions;\n","//import PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport 'fomantic-ui-css/components/flag.min.css';\n\nimport * as API from 'types/api';\nimport classNames from 'classnames';\n\nexport interface FormattedIpProps {\n item: API.IP;\n}\n\nconst FormattedIp: React.FC<FormattedIpProps> = ({ item }) => (\n <div className=\"ip flag\">\n <i className={classNames('ui flag', item.country.toLowerCase())} />\n {item.str}\n </div>\n);\n\n/*FormattedIp.propTypes = {\n item: PropTypes.object.isRequired,\n};*/\n\nexport default FormattedIp;\n","import * as React from 'react';\n\nimport {\n TableActionMenu,\n TableDownloadMenu,\n TableActionMenuProps,\n TableDownloadMenuProps,\n} from 'components/action-menu';\nimport {\n formatDecimal,\n formatAbbreviatedDuration,\n formatConnection,\n formatDateTime,\n formatShortDate,\n formatSize,\n formatSpeed,\n formatRelativeTime,\n} from 'utils/ValueFormat';\n\nimport FormattedFile from 'components/format/FormattedFile';\nimport FormattedIp from 'components/format/FormattedIp';\n\nimport Checkbox, { CheckboxProps } from 'components/semantic/Checkbox';\nimport { showAction } from 'utils/ActionUtils';\nimport { Cell, CellProps } from 'fixed-data-table-2';\n//import { withRouter, RouteComponentProps } from 'react-router-dom';\n//import { DownloadHandlerType } from 'decorators/menu/DownloadMenuDecorator';\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\n\nimport * as UI from 'types/ui';\nimport * as API from 'types/api';\n//import { ActionHandlerDecorator, ActionHandlerDecoratorChildProps } from 'decorators/ActionHandlerDecorator';\n//import ActionButton, { ActionButtonProps } from 'components/ActionButton';\nimport { ActionHandlerDecorator } from 'decorators/ActionHandlerDecorator';\n\nconst getCellContent = (cellData: any) => {\n if (typeof cellData === 'object') {\n return Array.isArray(cellData) ? cellData.length : cellData.str;\n }\n\n //if (typeof cellData === 'boolean') {\n // return cellData ? 'Yes' : 'No';\n //}\n\n if (cellData === 0) {\n return null;\n }\n\n return cellData;\n};\n\n// Default cell\nexport const TextCell = ({ cellData }: { cellData?: any }) => (\n <span className=\"plain text cell\">{getCellContent(cellData)}</span>\n);\n\n// Column header\ninterface HeaderCellProps extends CellProps {\n onClick: () => void;\n label: React.ReactNode;\n columnKey?: string; // REQUIRED, CLONED\n}\n\nexport const HeaderCell = ({ onClick, label, columnKey, ...props }: HeaderCellProps) => (\n <Cell {...props}>\n <a onClick={onClick}>{label}</a>\n </Cell>\n);\n\nexport interface ActionCellProps<\n CellDataT,\n ItemDataT extends UI.ActionMenuItemDataValueType\n> extends Omit<RowWrapperCellChildProps<CellDataT, ItemDataT>, 't' | 'children'>,\n Omit<TableActionMenuProps<ItemDataT>, 'caption' | 'itemData'> {}\n\ninterface FileItemBase {\n type: API.FileItemType;\n}\n\nexport const FileActionCell = <\n CellDataT extends React.ReactNode,\n ItemDataT extends UI.ActionMenuItemDataValueType & FileItemBase\n>({\n cellData,\n rowDataGetter,\n children,\n ...props\n}: ActionCellProps<CellDataT, ItemDataT>) => (\n <TableActionMenu\n caption={\n <FormattedFile\n typeInfo={rowDataGetter!().type}\n caption={cellData}\n className=\"icon-caption\"\n />\n }\n itemData={rowDataGetter!}\n {...props}\n />\n);\n\nexport const ActionMenuCell = <\n CellDataT extends React.ReactNode,\n ItemDataT extends UI.ActionMenuItemDataValueType\n>({\n cellData,\n rowDataGetter,\n ...props\n}: ActionCellProps<CellDataT, ItemDataT>) => (\n <TableActionMenu caption={cellData} itemData={rowDataGetter!} {...props} />\n);\n\nexport interface ActionLinkCellProps<\n CellDataT,\n ItemDataT extends UI.ActionMenuItemDataValueType\n> extends RowWrapperCellChildProps<CellDataT, ItemDataT> {\n /*Pick<ActionButtonProps<ItemDataT>, 'actions' | 'actionId'>*/\n\n //action: (itemData: any, location: Location) => void;\n //action: UI.ActionType<ItemDataT>;\n actions: UI.ModuleActions<ItemDataT>;\n actionId: string;\n}\n\nexport const ActionLinkCell = <\n CellDataT,\n ItemDataT extends UI.ActionMenuItemDataValueType\n>(\n {\n cellData,\n rowDataGetter,\n //location,\n //onClickAction, action,\n actions,\n actionId,\n ...props\n }: ActionLinkCellProps<CellDataT, ItemDataT> /*& ActionHandlerDecoratorChildProps*/\n) => {\n const action = actions.actions[actionId]!;\n if (!showAction(action, rowDataGetter!())) {\n return <TextCell cellData={cellData} {...props} />;\n }\n\n return (\n <ActionHandlerDecorator<ItemDataT>>\n {({ onClickAction }) => (\n <a\n className=\"plain link cell\"\n onClick={() =>\n onClickAction({\n actionId,\n action,\n moduleId: actions.moduleId,\n itemData: rowDataGetter!(),\n })\n }\n >\n {getCellContent(cellData)}\n </a>\n )}\n </ActionHandlerDecorator>\n );\n\n /*return (\n <ActionButton\n actions={ actions }\n actionId={ actionId }\n tag=\"a\"\n semanticClassName=\"plain link cell\"\n icon={ null }\n caption={ getCellContent(cellData) }\n />\n );*/\n};\n\n//export const ActionLinkCell = ActionHandlerDecorator(ActionLinkCellPlain);\n\nexport interface NumberCellProps extends RowWrapperCellChildProps<number, any> {\n cellData?: number;\n}\n\nexport const SizeCell: React.FC<NumberCellProps> = ({ cellData, t }) => (\n <span className=\"plain size cell\">{formatSize(cellData!, t!)}</span>\n);\n\nexport const SpeedCell: React.FC<NumberCellProps> = ({ cellData, t }) => (\n <span className=\"plain speed cell\">{formatSpeed(cellData!, t!)}</span>\n);\n\nexport const DateCell: React.FC<NumberCellProps> = ({ cellData, width }) => (\n <span className=\"plain date cell\">\n {!!width && width > 150 ? formatDateTime(cellData!) : formatShortDate(cellData!)}\n </span>\n);\n\nexport const DurationCell: React.FC<NumberCellProps> = ({ cellData }) => (\n <span className=\"plain duration cell\">{formatRelativeTime(cellData!)}</span>\n);\n\nexport const AbbreviatedDurationCell: React.FC<NumberCellProps> = ({ cellData }) => (\n <span className=\"plain abbr-duration cell\">{formatAbbreviatedDuration(cellData!)}</span>\n);\n\nexport interface IpCellProps {\n cellData?: API.IP;\n}\n\nexport const IpCell: React.FC<IpCellProps> = ({ cellData }) => (\n <FormattedIp item={cellData!} />\n);\n\nexport const ConnectionCell: React.FC<NumberCellProps> = ({ cellData, t }) => (\n <span className=\"plain connection cell\">{formatConnection(cellData!, t!)}</span>\n);\n\nexport const DecimalCell: React.FC<NumberCellProps> = ({ cellData }) => (\n <span className=\"plain decimal cell\">{formatDecimal(cellData!)}</span>\n);\n\nexport type FileDownloadCellClickHandler = (\n cellData: any,\n rowDataGetter: () => any\n) => (() => void) | undefined;\n\nexport interface FileDownloadCellProps<\n CellDataT,\n ItemDataT extends UI.DownloadableItemInfo\n> extends Omit<RowWrapperCellChildProps<CellDataT, ItemDataT>, 'children'>,\n Omit<TableDownloadMenuProps<ItemDataT>, 'user' | 'itemInfoGetter' | 'caption'> {\n userGetter: (rowData: ItemDataT) => UI.DownloadSource;\n clickHandlerGetter?: FileDownloadCellClickHandler;\n}\n\nexport const FileDownloadCell = <\n CellDataT extends React.ReactNode,\n ItemDataT extends UI.DownloadableItemInfo & FileItemBase\n>({\n cellData,\n rowDataGetter,\n clickHandlerGetter,\n userGetter,\n downloadHandler,\n ...props\n}: FileDownloadCellProps<CellDataT, ItemDataT>) => (\n <TableDownloadMenu\n caption={\n <FormattedFile\n typeInfo={rowDataGetter!().type}\n onClick={clickHandlerGetter ? clickHandlerGetter(cellData, rowDataGetter!) : null}\n caption={cellData}\n className=\"icon-caption\"\n />\n }\n user={userGetter(rowDataGetter!())}\n linkCaption={!!clickHandlerGetter ? false : true}\n itemInfoGetter={rowDataGetter!}\n downloadHandler={downloadHandler}\n {...props}\n />\n);\n\n/*FileDownloadCell.propTypes = {\n rowDataGetter: PropTypes.func, // REQUIRED\n cellData: PropTypes.any, // REQUIRED\n userGetter: PropTypes.func.isRequired,\n clickHandlerGetter: PropTypes.func,\n downloadHandler: PropTypes.func.isRequired,\n};*/\n\n// eslint-disable-next-line max-len\nexport interface CheckboxCellProps\n extends Omit<RowWrapperCellChildProps<boolean, any>, 'onChange'>,\n Omit<CheckboxProps, 'onChange' | 'checked'> {\n onChange: (checked: boolean, rowData: any) => void;\n}\n\nexport const CheckboxCell: React.FC<CheckboxCellProps> = ({\n cellData,\n rowDataGetter,\n onChange,\n ...props\n}) => (\n <Checkbox\n checked={cellData!}\n onChange={(checked) => onChange(checked, rowDataGetter!())}\n {...props}\n />\n);\n\n/*CheckboxCell.propTypes = {\n rowDataGetter: PropTypes.func, // REQUIRED\n cellData: PropTypes.bool, // REQUIRED\n onChange: PropTypes.func.isRequired,\n};*/\n","import * as React from 'react';\n\nimport SectionedDropdown from 'components/semantic/SectionedDropdown';\nimport MenuSection from 'components/semantic/MenuSection';\nimport MenuItemLink from 'components/semantic/MenuItemLink';\n\nimport TableFilterDecorator, {\n TableFilterDecoratorChildProps,\n} from 'decorators/TableFilterDecorator';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { useMobileLayout } from 'utils/BrowserUtils';\nimport { translate } from 'utils/TranslationUtils';\nimport { Translation } from 'react-i18next';\n\nconst getFilterMethodCaption = (method: API.FilterMethod) => {\n switch (method) {\n case API.FilterMethod.REGEX:\n return 'Regex';\n case API.FilterMethod.WILDCARD:\n return 'Wildcard';\n case API.FilterMethod.EXACT:\n return 'Exact';\n default:\n return 'Partial';\n }\n};\n\nconst filterMethodToString = (method: API.FilterMethod, t: UI.TranslateF) => {\n const methodTitle = getFilterMethodCaption(method);\n return translate(methodTitle, t, 'table.filter');\n};\n\nconst getPlaceholder = (method: API.FilterMethod, t: UI.TranslateF) => {\n let ret = t('table.filter.filter', 'Filter');\n if (method !== API.FilterMethod.PARTIAL) {\n ret += ` (${filterMethodToString(method, t).toLowerCase()})`;\n }\n\n return ret + '...';\n};\n\nexport interface TextFilterProps {\n autoFocus?: boolean;\n}\n\nclass TextFilter extends React.PureComponent<\n TextFilterProps & TableFilterDecoratorChildProps\n> {\n state = {\n value: '',\n method: API.FilterMethod.PARTIAL,\n };\n\n timer: number | undefined;\n input: HTMLInputElement;\n\n static defaultProps: Pick<TextFilterProps, 'autoFocus'> = {\n autoFocus: true,\n };\n\n componentWillUnmount() {\n clearTimeout(this.timer);\n }\n\n onFilterUpdated = () => {\n const { value, method } = this.state;\n this.props.onFilterUpdated(value, method);\n };\n\n onTextChanged = (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n value: event.target.value,\n });\n\n clearTimeout(this.timer);\n\n this.timer = window.setTimeout(() => {\n this.onFilterUpdated();\n }, 200);\n };\n\n onMethodChanged = (method: API.FilterMethod) => {\n this.setState({\n method,\n });\n\n setTimeout(() => this.onFilterUpdated());\n this.input.focus();\n };\n\n getFilterMethod = (method: API.FilterMethod, t: UI.TranslateF) => {\n const isCurrent = method === this.state.method;\n return (\n <MenuItemLink\n key={method}\n onClick={() => this.onMethodChanged(method)}\n active={isCurrent}\n >\n {filterMethodToString(method, t)}\n </MenuItemLink>\n );\n };\n\n render() {\n const { value, method } = this.state;\n const { autoFocus } = this.props;\n return (\n <Translation>\n {(t) => (\n <div className=\"text-filter\">\n <div className=\"ui action input\">\n <input\n ref={(c: any) => (this.input = c)}\n placeholder={getPlaceholder(method, t)}\n onChange={this.onTextChanged}\n value={value}\n type=\"text\"\n autoFocus={!useMobileLayout() && autoFocus}\n />\n <SectionedDropdown\n className=\"filter-method right top pointing\"\n button={true}\n direction=\"upward\"\n >\n <MenuSection caption={translate('Match type', t, 'table.filter')}>\n {Object.keys(API.FilterMethod)\n .filter((key) => isNaN(Number(key)))\n .map((key) =>\n this.getFilterMethod(\n API.FilterMethod[key as keyof typeof API.FilterMethod],\n t\n )\n )}\n </MenuSection>\n </SectionedDropdown>\n </div>\n </div>\n )}\n </Translation>\n );\n }\n}\n\nexport default TableFilterDecorator<TextFilterProps>(TextFilter);\n","import * as React from 'react';\n\nimport TextFilter, { TextFilterProps } from './TextFilter';\nimport Icon from 'components/semantic/Icon';\nimport IconConstants from 'constants/IconConstants';\nimport { TableFilterDecoratorProps } from 'decorators/TableFilterDecorator';\n\nconst CountInfo: React.FC<{ store: any }> = ({ store }) => {\n if (store.totalCount < 0) {\n // Not initialized yet\n return null;\n }\n\n let ret = store.totalCount;\n if (store.totalCount !== store.rowCount) {\n ret = store.rowCount + '/' + store.totalCount;\n }\n\n return (\n <div className=\"count-info\">\n <Icon icon={IconConstants.FILTER} />\n {ret}\n </div>\n );\n};\n\nexport type CustomTableFilter = React.ComponentType<TableFilterDecoratorProps>;\n\nexport interface TableFooterProps {\n footerData?: React.ReactNode;\n customFilter?: CustomTableFilter;\n store: any;\n textFilterProps?: TextFilterProps;\n}\n\nconst TableFooter: React.FC<TableFooterProps> = ({\n store,\n customFilter: CustomFilter,\n footerData,\n textFilterProps,\n}) => (\n <div className=\"table-footer\">\n {footerData}\n <div className=\"filter item\">\n {!CustomFilter ? null : <CustomFilter store={store} />}\n <TextFilter store={store} {...textFilterProps} />\n <CountInfo store={store} />\n </div>\n </div>\n);\n\nexport default TableFooter;\n","import * as React from 'react';\nimport PropTypes from 'prop-types';\nimport { CellProps } from 'fixed-data-table-2';\n\nimport * as UI from 'types/ui';\n\nexport interface RowWrapperCellChildProps<\n CellDataT,\n RowDataT extends UI.ActionMenuItemDataValueType\n> extends CellProps {\n cellData?: CellDataT;\n rowDataGetter?: () => RowDataT;\n rowData?: RowDataT;\n t?: UI.TranslateF;\n}\n\nexport interface RowWrapperCellProps extends CellProps {\n dataLoader: any;\n\n renderCondition?: (columnData: any, rowData: any) => boolean;\n rowClassNameGetter?: (rowData: any) => string;\n columnKey?: string; // REQUIRED, CLONED\n\n children: React.ReactElement<any>;\n t: UI.TranslateF;\n}\n\ninterface State {\n rowData: any;\n}\n\n// Generic wrapper for all cells that will handle data loading\nclass RowWrapperCell extends React.Component<RowWrapperCellProps> {\n static propTypes = {\n rowIndex: PropTypes.number, // required\n dataLoader: PropTypes.object.isRequired,\n width: PropTypes.number, // required\n };\n\n state: State = {\n rowData: null,\n };\n\n componentDidMount() {\n this.loadData(this.props.rowIndex!);\n }\n\n UNSAFE_componentWillReceiveProps(nextProps: RowWrapperCellProps) {\n if (nextProps.rowIndex !== this.props.rowIndex) {\n // Remove pending update callbacks to avoid rendering each of them when the data is received\n // (there can be lots of pending requests when scrolling for long distances)\n this.props.dataLoader.removePendingRequests(this.props.rowIndex, this.onDataLoaded);\n }\n\n // Check if there is new data available (rowIndex may have changed as well)\n if (!this.loadData(nextProps.rowIndex!)) {\n // Avoid displaying old data\n this.setState({ rowData: null });\n }\n }\n\n componentWillUnmount() {\n this.props.dataLoader.removePendingRequests(this.props.rowIndex, this.onDataLoaded);\n }\n\n loadData = (rowIndex: number) => {\n return this.props.dataLoader.updateRowData(rowIndex, this.onDataLoaded);\n };\n\n shouldComponentUpdate(nextProps: RowWrapperCellProps, nextState: State) {\n return (\n nextState.rowData !== this.state.rowData || nextProps.width !== this.props.width\n );\n }\n\n rowDataGetter = () => {\n return this.state.rowData;\n };\n\n onDataLoaded = (data: any) => {\n this.setState({ rowData: data });\n };\n\n render() {\n const { columnKey, children, renderCondition, rowClassNameGetter, ...other } =\n this.props;\n const { rowData } = this.state;\n\n if (!rowData) {\n return null;\n }\n\n if (renderCondition && !renderCondition(rowData[columnKey!], rowData)) {\n return null;\n }\n\n let className = columnKey;\n if (!!rowClassNameGetter) {\n className += ' ' + rowClassNameGetter(rowData);\n }\n\n return (\n <div className={'cell-wrapper ' + className}>\n {React.cloneElement(children, {\n cellData: rowData[columnKey!],\n\n // Don't pass the actual row data to allow cells to skip\n // re-rendering using shallow equality checks when the row data is\n // updated without leaving them with an outdated item data\n rowDataGetter: this.rowDataGetter,\n ...other,\n })}\n </div>\n );\n }\n}\n\nexport default RowWrapperCell;\n","import PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport { Table, ColumnProps } from 'fixed-data-table-2';\n\nimport TableActions from 'actions/TableActions';\nimport { useMobileLayout } from 'utils/BrowserUtils';\n\nimport Measure, { ContentRect } from 'react-measure';\nimport RowWrapperCell from 'components/table/RowWrapperCell';\nimport { TextCell, HeaderCell } from 'components/table/Cell';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\nimport { textToI18nKey, toArray } from 'utils/TranslationUtils';\n\nconst TABLE_ROW_HEIGHT = 50;\n\nfunction convertStartToRows(pixels: number) {\n return Math.max(Math.floor(pixels / TABLE_ROW_HEIGHT), 0);\n}\n\nfunction convertEndToRows(pixels: number) {\n return Math.ceil(pixels / TABLE_ROW_HEIGHT);\n}\n\nexport type TableContainerProps = React.PropsWithChildren<{\n entityId?: API.IdType;\n rowClassNameGetter?: (rowData: any) => string;\n store: any;\n dataLoader: any;\n t: UI.TranslateF;\n moduleId: string | string[];\n viewId?: number | string;\n}>;\n\ninterface State {\n width: number;\n height: number;\n columnWidths: Record<string, number>;\n isColumnResizing: boolean | undefined;\n}\n\nconst formatColumnName = (\n column: React.ReactElement<ColumnProps>,\n store: any,\n moduleId: string | string[],\n t: UI.TranslateF\n) => {\n const { name, columnKey } = column.props;\n let displayName = t(\n textToI18nKey(columnKey as string, [...toArray(moduleId), UI.SubNamespaces.TABLE]),\n name\n );\n\n {\n const sortDirArrow = store.sortAscending ? ' ↑' : ' ↓';\n displayName += store.sortProperty === columnKey ? sortDirArrow : '';\n }\n\n return displayName;\n};\n\nclass TableContainer extends React.Component<TableContainerProps, State> {\n static propTypes = {\n /**\n * Store implementing ViewStoreMixin that contains the items\n */\n store: PropTypes.object.isRequired,\n\n /**\n * Append class names to row (takes row data as param)\n */\n rowClassNameGetter: PropTypes.func,\n\n /**\n * ID of the current entity for non-singleton sources\n */\n entityId: PropTypes.any,\n\n dataLoader: PropTypes.any.isRequired,\n };\n\n state: State = {\n width: 0,\n height: 0,\n columnWidths: {},\n isColumnResizing: undefined,\n };\n\n getInitialProps = () => {\n return {\n rowClassNameGetter: null,\n entityId: null,\n };\n };\n\n scrollTimer: number | undefined;\n scrollPosition = 0;\n setInitialScrollRow = true;\n\n // This will also be used for setting the initial rows\n componentDidUpdate(prevProps: TableContainerProps, prevState: State) {\n if (prevState.height !== this.state.height) {\n this.updateRowRange();\n } else if (\n prevProps.entityId !== this.props.entityId ||\n prevProps.viewId !== this.props.viewId\n ) {\n if (this.props.store.DEBUG) {\n console.log(\n `Enabling initial scroll, entity/viewId changed (view ${this.props.viewId})`\n );\n }\n\n this.setInitialScrollRow = true;\n this.updateRowRange();\n }\n }\n\n componentWillUnmount() {\n clearTimeout(this.scrollTimer);\n }\n\n updateRowRange = () => {\n const { store } = this.props;\n const { height } = this.state;\n\n const startRows = convertStartToRows(this.scrollPosition);\n const maxRows = convertEndToRows(height);\n\n if (store.DEBUG) {\n // eslint-disable-next-line max-len\n console.log(\n `Settings changed, start: ${startRows}, end: ${maxRows}, height: ${height}`,\n store.viewName\n );\n }\n\n console.assert(store.active, 'Posting data for an inactive view');\n TableActions.setRange(store.viewUrl, startRows, maxRows);\n };\n\n onScrollStart = (horizontal: number, vertical: number) => {\n const { store } = this.props;\n\n if (store.DEBUG) {\n console.log(`Scrolling started: ${vertical}`, store.viewUrl);\n }\n\n console.assert(store.active, 'Sending pause for an inactive view');\n TableActions.pause(store.viewUrl, true);\n };\n\n onScrollEnd = (horizontal: number, vertical: number) => {\n const { store, viewId } = this.props;\n\n this.scrollPosition = vertical;\n console.assert(store.active, 'Sending pause for an inactive view');\n TableActions.pause(store.viewUrl, false);\n\n clearTimeout(this.scrollTimer);\n this.scrollTimer = window.setTimeout(this.updateRowRange, 500);\n\n if (this.setInitialScrollRow) {\n this.setInitialScrollRow = false;\n\n if (store.DEBUG) {\n console.log(`Disabling initial scroll (view ${viewId})`);\n }\n }\n\n store.setScrollData(vertical, viewId);\n if (store.DEBUG) {\n console.log(`Scrolling ended: ${vertical}`, store.viewUrl);\n }\n };\n\n onColumnClicked = (sortProperty: string) => {\n const { store } = this.props;\n\n let sortAscending = true;\n if (sortProperty === store.sortProperty && store.sortAscending) {\n sortAscending = false;\n }\n\n TableActions.setSort(this.props.store.viewUrl, sortProperty, sortAscending);\n };\n\n onColumnResizeEndCallback = (newColumnWidth: number, columnKey: string) => {\n this.setState(\n ({ columnWidths }) => ({\n columnWidths: {\n ...columnWidths,\n [columnKey]: newColumnWidth,\n },\n\n // In order to disable the resizing mode, the table needs to be rendered with \"isColumnResizing: false\"\n // Put it right back to undefined after that in order to avoid resizing issues\n // while the table is being re-rendered\n // https://github.com/schrodinger/fixed-data-table-2/issues/268\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/444\n isColumnResizing: false,\n }),\n () => {\n this.setState({\n isColumnResizing: undefined,\n });\n }\n );\n };\n\n childToColumn = (column: React.ReactElement<ColumnProps>) => {\n if (!!column.props.hideWidth && column.props.hideWidth > this.state.width) {\n return null;\n }\n\n let { flexGrow, width } = column.props;\n const { cell, columnKey, renderCondition } = column.props;\n const { store, rowClassNameGetter, moduleId, t } = this.props;\n\n const mobileView = useMobileLayout();\n if (!mobileView) {\n // Get column width\n if (!!columnKey && !!this.state.columnWidths[columnKey]) {\n width = this.state.columnWidths[columnKey];\n flexGrow = undefined;\n }\n }\n\n return React.cloneElement(column, {\n header: (\n <HeaderCell\n onClick={this.onColumnClicked.bind(null, columnKey)}\n label={formatColumnName(column, store, moduleId, t)}\n />\n ),\n flexGrow,\n width,\n isResizable: !mobileView,\n allowCellsRecycling: true,\n cell: (\n <RowWrapperCell\n dataLoader={this.props.dataLoader}\n renderCondition={renderCondition}\n rowClassNameGetter={rowClassNameGetter}\n t={t}\n >\n {cell ? (cell as React.ReactElement<any>) : <TextCell />}\n </RowWrapperCell>\n ),\n });\n };\n\n onResizeView = (contentRect: ContentRect) => {\n if (!contentRect.bounds) {\n return;\n }\n\n // Bounds may contain incorrect (or outdated) dimensions with animations (such as when opening a modal)\n const { width, height } = !!contentRect.entry\n ? contentRect.entry\n : contentRect.bounds;\n this.setState({\n width,\n height,\n });\n };\n\n render() {\n // Update and insert generic columns props\n const children = React.Children.map(this.props.children, this.childToColumn);\n\n const { width, height, isColumnResizing } = this.state;\n const { store, viewId } = this.props;\n return (\n <Measure bounds={true} onResize={this.onResizeView}>\n {({ measureRef }) => (\n <div ref={measureRef} className=\"table-container-wrapper\">\n <Table\n width={width}\n height={height}\n rowHeight={50}\n rowsCount={store.rowCount}\n headerHeight={50}\n isColumnResizing={isColumnResizing}\n onColumnResizeEndCallback={this.onColumnResizeEndCallback}\n touchScrollEnabled={true}\n onScrollStart={this.onScrollStart}\n onScrollEnd={this.onScrollEnd}\n scrollTop={\n this.setInitialScrollRow ? store.getScrollData(viewId) : undefined\n }\n >\n {children}\n </Table>\n </div>\n )}\n </Measure>\n );\n }\n}\n\nexport default TableContainer;\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!./style.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!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport TableActions from 'actions/TableActions';\n\nimport TableFooter, { TableFooterProps } from './TableFooter';\nimport TableContainer, { TableContainerProps } from './TableContainer';\nimport RowDataLoader from './RowDataLoader';\n\nimport './style.css';\nimport 'fixed-data-table-2/dist/fixed-data-table.css';\n\nimport * as API from 'types/api';\nimport { Translation } from 'react-i18next';\n\ndeclare module 'fixed-data-table-2' {\n export interface ColumnProps {\n name: string;\n hideWidth?: number;\n renderCondition?: (cellData: any, rowData: any) => boolean;\n }\n}\n\nexport type VirtualTableProps = Omit<TableFooterProps, 't'> &\n Omit<TableContainerProps, 'store' | 'dataLoader' | 't'> &\n React.PropsWithChildren<{\n store: any;\n sessionStore?: any;\n sourceFilter?: API.TableFilter;\n emptyRowsNodeGetter?: () => React.ReactNode;\n }>;\n\nclass VirtualTable extends React.PureComponent<VirtualTableProps> {\n static propTypes = {\n // Elements to append to the table footer\n footerData: PropTypes.node,\n\n // Returns a node to render if there are no rows to display\n emptyRowsNodeGetter: PropTypes.func,\n\n // Possible ID of the current view (items will be cleared when the ID changes)\n viewId: PropTypes.any,\n\n // Store containing sessions (must be provided together with entityId)\n sessionStore: PropTypes.object,\n\n // Custom filter that will be displayed in addition to regular text filter\n customFilter: PropTypes.elementType,\n\n // Filter that is always applied for source items (those will never be displayed or included in the total count)\n sourceFilter: PropTypes.object,\n };\n\n dataLoader = new RowDataLoader(this.props.store, () => this.forceUpdate());\n unsubscribe = this.props.store.listen(\n this.dataLoader.onItemsUpdated.bind(this.dataLoader)\n );\n\n componentDidMount() {\n //this._dataLoader = new RowDataLoader(this.props.store, () => this.forceUpdate() );\n\n //this.unsubscribe = this.props.store.listen(this._dataLoader.onItemsUpdated.bind(this._dataLoader));\n\n this.start(this.props.entityId);\n }\n\n componentWillUnmount() {\n this.close(this.props.entityId);\n this.unsubscribe();\n }\n\n componentDidUpdate(prevProps: VirtualTableProps) {\n if (prevProps.entityId !== this.props.entityId) {\n this.close(prevProps.entityId);\n this.start(this.props.entityId);\n }\n\n if (prevProps.viewId !== this.props.viewId) {\n const { store } = this.props;\n if (store.paused) {\n // We need to receive the new items\n TableActions.pause(store.viewUrl, false);\n }\n\n TableActions.clear(store.viewUrl);\n }\n }\n\n moduleExists = (entityId: API.IdType | undefined) => {\n if (!entityId || !this.props.sessionStore) {\n return true;\n }\n\n return this.props.sessionStore.getSession(entityId);\n };\n\n start = (entityId: API.IdType | undefined) => {\n const { store, sourceFilter } = this.props;\n\n TableActions.init(store.viewUrl, entityId, sourceFilter);\n TableActions.setSort(store.viewUrl, store.sortProperty, store.sortAscending);\n };\n\n close = (entityId: API.IdType | undefined) => {\n // Don't send the close command if the session was removed\n TableActions.close(this.props.store.viewUrl, this.moduleExists(entityId));\n };\n\n render() {\n const {\n store,\n footerData,\n emptyRowsNodeGetter,\n customFilter,\n textFilterProps,\n ...other\n } = this.props;\n\n if (emptyRowsNodeGetter && store.totalCount === -1) {\n // Row count is unknown, don't flash the table\n return <div className=\"virtual-table\" />;\n }\n\n if (emptyRowsNodeGetter && store.totalCount === 0) {\n return emptyRowsNodeGetter();\n }\n\n //console.log('Render virtual table');\n return (\n <div className=\"virtual-table\">\n <Translation>\n {(t) => (\n <>\n <TableContainer\n {...other}\n dataLoader={this.dataLoader}\n store={store}\n t={t}\n />\n\n <TableFooter\n store={store}\n customFilter={customFilter}\n footerData={footerData}\n textFilterProps={textFilterProps}\n />\n </>\n )}\n </Translation>\n </div>\n );\n }\n}\n\nexport default VirtualTable;\n","import SocketService from 'services/SocketService';\nimport update from 'immutability-helper';\n\nimport isEqual from 'lodash/isEqual';\n\nconst NUMBER_OF_ROWS_PER_REQUEST = 10;\nconst DEBUG = false;\n\n// This will handle fetching only when scrolling. Otherwise the data will be updated through the socket listener.\nclass RowDataLoader {\n constructor(store, onDataLoad) {\n this._onDataLoad = onDataLoad;\n this._store = store;\n this._data = [];\n this._pendingRequest = {};\n this._initialDataReceived = false;\n }\n\n clear() {\n this._pendingRequest = {};\n this._data = [];\n }\n\n // Returns true if the item was updated\n updateItem(updated, item, index) {\n let old = this._data[index];\n\n // Objects equal most of the time\n if (old === item || isEqual(this._data[index], item)) {\n return updated;\n }\n\n if (old) {\n this._data[index] = update(old, { $merge: item });\n } else {\n this._data[index] = update(old, { $set: item });\n }\n\n return updated + 1;\n }\n\n onItemsUpdated(items, rangeOffset = 0, rowCount) {\n // Rows removed?\n let hasChanges = rowCount < this._data.length;\n\n if (!items || items.length === 0) {\n // The view was cleared\n this.clear();\n hasChanges = true;\n\n this._initialDataReceived = false;\n\n if (DEBUG) {\n console.log('onItemsUpdated, cleared');\n }\n } else {\n this._initialDataReceived = true;\n\n // Remove rows outside the range\n // Leave the current range in case all old items can be reused\n // (avoids flickering because there is no need to re-render)\n for (let i = 0; i < this._data.length; i++) {\n if (!items[i]) {\n delete this._data[i];\n }\n }\n\n // Update rows\n const updatedCount = items.reduce(this.updateItem.bind(this), 0);\n if (updatedCount > 0 || rangeOffset !== 0) {\n if (DEBUG) {\n console.log(\n 'onItemsUpdated, changed (updatedCount, rangeOffset)',\n updatedCount,\n rangeOffset\n );\n }\n\n hasChanges = true;\n }\n }\n\n if (hasChanges) {\n this._onDataLoad();\n }\n }\n\n get rangeOffset() {\n const ret = this._rangeOffset;\n this._rangeOffset = 0;\n return ret;\n }\n\n getRowData(rowIndex) {\n return this._data[rowIndex];\n }\n\n // onDataLoaded is called when the data is ready\n updateRowData(rowIndex, onDataLoaded) {\n const rowData = this._data[rowIndex];\n if (!rowData) {\n if (this._initialDataReceived) {\n this._queueRequestFor(rowIndex, onDataLoaded);\n }\n\n return false;\n }\n\n onDataLoaded(rowData);\n return true;\n }\n\n removePendingRequests(rowIndex) {\n delete this._pendingRequest[rowIndex];\n }\n\n _queueRequestFor(rowIndex, onDataLoaded) {\n const rowBase = rowIndex - (rowIndex % NUMBER_OF_ROWS_PER_REQUEST);\n\n const request = this._pendingRequest[rowIndex];\n if (request) {\n request.push(onDataLoaded);\n return;\n }\n\n this._pendingRequest[rowIndex] = [onDataLoaded];\n if (rowIndex !== rowBase) {\n if (this._pendingRequest[rowBase]) {\n return;\n }\n\n this._pendingRequest[rowBase] = [];\n }\n\n const endRow = Math.min(rowBase + NUMBER_OF_ROWS_PER_REQUEST, this._store.rowCount);\n SocketService.get(this._store.viewUrl + '/items/' + rowBase + '/' + endRow)\n .then(this.onRowsReceived.bind(this, rowBase))\n .catch((error) => {\n console.error('Failed to load data', error);\n for (let i = rowBase; i < endRow; i++) {\n if (this._pendingRequest[i]) {\n delete this._pendingRequest[i];\n }\n }\n });\n }\n\n onRowsReceived(start, rows) {\n if (!this._pendingRequest[start]) {\n // View changed\n return;\n }\n\n for (let i = 0; i < rows.length; i++) {\n const rowIndex = start + i;\n if (!isEqual(this._data[rowIndex], rows[i])) {\n this._data[rowIndex] = rows[i];\n\n if (this._pendingRequest[rowIndex]) {\n this._pendingRequest[rowIndex].forEach((f) => f(rows[i]));\n }\n } else if (DEBUG) {\n console.log('onRowsReceived, row data equals', rowIndex);\n }\n\n delete this._pendingRequest[rowIndex];\n }\n }\n}\n\nexport default RowDataLoader;\n","import * as React from 'react';\n\nimport DataProviderDecorator, {\n DataProviderDecoratorChildProps,\n} from 'decorators/DataProviderDecorator';\nimport SocketService from 'services/SocketService';\n\nimport * as API from 'types/api';\nimport { ErrorResponse } from 'airdcpp-apisocket';\n\ninterface FilterType {\n id: number;\n}\n\nexport interface TableFilterDecoratorProps {\n store: any;\n}\n\nexport interface TableFilterDecoratorDataProps {\n filter: FilterType;\n}\n\nexport interface TableFilterDecoratorChildProps {\n onFilterUpdated: (value: string | number, method?: API.FilterMethod) => void;\n}\n\nexport default function <PropsT>(\n Component: React.ComponentType<PropsT & TableFilterDecoratorChildProps>,\n propertyName = 'any'\n) {\n type Props = PropsT &\n TableFilterDecoratorProps &\n DataProviderDecoratorChildProps &\n TableFilterDecoratorDataProps;\n\n const TableFilterDecorator = (props: Props) => {\n const onFilterUpdated = (\n pattern: string,\n method: API.FilterMethod = API.FilterMethod.PARTIAL\n ) => {\n const data = {\n pattern,\n method,\n property: propertyName,\n } as API.TableFilter;\n\n const { store, filter } = props;\n SocketService.put(`${store.viewUrl}/filter/${filter.id}`, data).catch(\n (error: ErrorResponse) => console.error('Failed to add table filter', error)\n );\n };\n\n React.useLayoutEffect(() => {\n return () => {\n const { store, filter } = props;\n if (store.active) {\n SocketService.delete(`${store.viewUrl}/filter/${filter.id}`).catch(\n (error: ErrorResponse) =>\n console.error('Failed to delete table filter', error)\n );\n }\n };\n }, []);\n\n return <Component {...props} onFilterUpdated={onFilterUpdated} />;\n };\n\n return DataProviderDecorator<\n PropsT & TableFilterDecoratorProps,\n TableFilterDecoratorDataProps\n >(TableFilterDecorator, {\n urls: {\n filter: ({ store }, socket) => socket.post(`${store.viewUrl}/filter`),\n },\n loaderText: null,\n });\n}\n","import SocketService from 'services/SocketService';\nimport TableActions from 'actions/TableActions';\n\nimport invariant from 'invariant';\n\n// TODO: this should be handled on component level (instead of using global stores)\nexport default (defaultSortProperty, defaultSortAscending = true) => {\n let active = false;\n let totalCount = -1; // Not zero to avoid using emptyRowsNodeGetter when it's not wanted\n let matchingCount = 0;\n let startPos = 0;\n let items = [];\n let entityId = null;\n let paused = false;\n let scrollPosition = 0;\n // const DEBUG = false;\n\n let sortProperty = defaultSortProperty;\n let sortAscending = defaultSortAscending;\n\n const findItem = (id) => {\n return items.find((item) => (!item ? false : item.id === id));\n };\n\n const clear = () => {\n items = [];\n startPos = 0;\n matchingCount = 0;\n totalCount = -1;\n };\n\n const addItems = (itemsObj) => {\n items = itemsObj.reduce((newViewItems, rawItem, index) => {\n // Either a new item, existing one in a different position or we are updating properties\n let viewItem = findItem(rawItem.id) || { id: rawItem.id };\n\n if (rawItem.properties) {\n viewItem = Object.assign({}, viewItem, rawItem.properties);\n } else if (Object.keys(viewItem).length === 1) {\n console.error('No properties were sent for a new view item', viewItem.id);\n }\n\n newViewItems[startPos + index] = viewItem;\n\n return newViewItems;\n }, []);\n };\n\n const parseDataProperties = (data) => {\n if (data.range_start != undefined) {\n startPos = data.range_start;\n }\n\n if (data.total_items != undefined) {\n totalCount = data.total_items;\n }\n\n if (data.matching_items != undefined) {\n matchingCount = data.matching_items;\n }\n\n if (data.items != undefined) {\n addItems(data.items);\n }\n };\n\n const ViewStoreMixin = {\n listenables: TableActions,\n\n onClose(viewUrl) {\n if (viewUrl !== this.viewUrl) {\n return;\n }\n\n if (this.DEBUG) {\n console.log(`Closing view ${this.viewUrl}`);\n }\n\n this._removeMessageListener();\n clear();\n\n active = false;\n this.trigger();\n },\n\n onClear(viewUrl) {\n if (viewUrl !== this.viewUrl) {\n return;\n }\n\n clear();\n this.trigger();\n },\n\n onPause(viewUrl, enabled) {\n if (viewUrl !== this.viewUrl) {\n return;\n }\n\n paused = enabled;\n },\n\n onInit(viewUrl, entity) {\n if (viewUrl !== this.viewUrl) {\n return;\n }\n\n invariant(!active, 'Trying start an active table view');\n\n entityId = entity;\n\n this.addMessageListener();\n if (this.DEBUG) {\n console.log(`Starting view ${this.viewUrl}`);\n }\n\n active = true;\n },\n\n onSetSort(viewUrl, property, ascending) {\n if (viewUrl !== this.viewUrl) {\n return;\n }\n\n sortProperty = property;\n sortAscending = ascending;\n //this.trigger(items);\n },\n\n addMessageListener() {\n this._removeMessageListener = SocketService.addViewUpdateListener(\n this._viewName,\n this._handleUpdate,\n entityId\n );\n },\n\n get items() {\n return items;\n },\n\n get viewUrl() {\n let viewUrl = this._apiUrl + '/';\n if (entityId) {\n viewUrl += entityId + '/';\n }\n\n viewUrl += this._viewName;\n return viewUrl;\n },\n\n get viewName() {\n return this._viewName;\n },\n\n get rowCount() {\n return matchingCount;\n },\n\n get totalCount() {\n return totalCount;\n },\n\n get active() {\n return active;\n },\n\n get sortProperty() {\n return sortProperty;\n },\n\n get sortAscending() {\n return sortAscending;\n },\n\n get paused() {\n return paused;\n },\n\n setScrollData(data, viewId) {\n if (this._sessionStore) {\n this._sessionStore.scroll.setScrollData(data, entityId, viewId);\n return;\n }\n\n if (this.DEBUG) {\n console.log(\n `Setting scroll position ${data} for view ${this.viewUrl} (view ID ${viewId})`\n );\n }\n\n scrollPosition = data;\n },\n\n getScrollData(viewId) {\n if (this._sessionStore) {\n return this._sessionStore.scroll.getScrollData(entityId, viewId);\n }\n\n if (this.DEBUG) {\n console.log(\n `Getting scroll position ${scrollPosition} for view ${this.viewUrl} (view ID ${viewId})`\n );\n }\n\n return scrollPosition;\n },\n\n _handleUpdate(data) {\n parseDataProperties(data);\n this.trigger(items, data.range_offset, matchingCount);\n },\n };\n\n return ViewStoreMixin;\n};\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","TableActions","setRange","asyncResult","setSort","close","pause","init","postSettings","settings","viewUrl","action","then","data","completed","catch","error","failed","listen","sessionExists","that","this","Promise","resolve","sortProperty","sortAscending","sort_property","sort_ascending","rangeStart","maxRows","console","assert","range_start","max_count","paused","entityId","filterData","source_filter","item","className","country","toLowerCase","str","getCellContent","cellData","Array","isArray","length","TextCell","HeaderCell","onClick","label","columnKey","props","Cell","FileActionCell","rowDataGetter","children","caption","typeInfo","type","itemData","ActionMenuCell","ActionLinkCell","actions","actionId","onClickAction","moduleId","SizeCell","t","SpeedCell","DurationCell","AbbreviatedDurationCell","IpCell","ConnectionCell","DecimalCell","FileDownloadCell","clickHandlerGetter","userGetter","downloadHandler","user","linkCaption","itemInfoGetter","CheckboxCell","onChange","checked","filterMethodToString","method","methodTitle","getFilterMethodCaption","getPlaceholder","ret","TextFilter","state","value","onFilterUpdated","onTextChanged","event","setState","target","clearTimeout","timer","window","setTimeout","onMethodChanged","input","focus","getFilterMethod","isCurrent","MenuItemLink","active","componentWillUnmount","render","autoFocus","ref","c","placeholder","SectionedDropdown","button","direction","MenuSection","Object","keys","filter","key","isNaN","Number","map","defaultProps","TableFilterDecorator","CountInfo","store","totalCount","rowCount","Icon","icon","IconConstants","customFilter","CustomFilter","footerData","textFilterProps","RowWrapperCell","rowData","loadData","rowIndex","dataLoader","updateRowData","onDataLoaded","componentDidMount","UNSAFE_componentWillReceiveProps","nextProps","removePendingRequests","shouldComponentUpdate","nextState","width","renderCondition","rowClassNameGetter","other","propTypes","formatColumnName","column","name","displayName","sortDirArrow","TableContainer","height","columnWidths","isColumnResizing","undefined","getInitialProps","scrollPosition","setInitialScrollRow","updateRowRange","startRows","pixels","Math","max","floor","ceil","convertEndToRows","DEBUG","log","viewName","onScrollStart","horizontal","vertical","onScrollEnd","viewId","scrollTimer","setScrollData","onColumnClicked","onColumnResizeEndCallback","newColumnWidth","childToColumn","hideWidth","flexGrow","cell","mobileView","header","bind","isResizable","allowCellsRecycling","onResizeView","contentRect","bounds","entry","componentDidUpdate","prevProps","prevState","onResize","measureRef","Table","rowHeight","rowsCount","headerHeight","touchScrollEnabled","scrollTop","getScrollData","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","VirtualTable","constructor","onDataLoad","_onDataLoad","_store","_data","_pendingRequest","_initialDataReceived","clear","updateItem","updated","index","old","$merge","$set","onItemsUpdated","items","rangeOffset","hasChanges","i","reduce","_rangeOffset","getRowData","_queueRequestFor","rowBase","request","endRow","min","SocketService","onRowsReceived","start","rows","forEach","f","forceUpdate","unsubscribe","moduleExists","sessionStore","getSession","sourceFilter","emptyRowsNodeGetter","Component","propertyName","pattern","property","urls","socket","post","loaderText","defaultSortProperty","defaultSortAscending","matchingCount","startPos","listenables","onClose","_removeMessageListener","trigger","onClear","onPause","enabled","onInit","entity","addMessageListener","onSetSort","ascending","_viewName","_handleUpdate","_apiUrl","_sessionStore","scroll","itemsObj","total_items","matching_items","newViewItems","rawItem","viewItem","find","properties","assign","parseDataProperties","range_offset"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[668],{90500:(n,e,s)=>{s.d(e,{Z:()=>a});var i=s(87537),t=s.n(i),o=s(23645),r=s.n(o)()(t());r.push([n.id,".session-container.horizontal.ui.grid {\n margin: 0px !important;\n}\n\n.session-container.horizontal .menu-column .item.new {\n padding: 0.78571429em 1.1em !important;\n}\n\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\n margin: 0 0.35714286em 0 0 !important;\n}\n\n.session-container.horizontal .session-layout > .ui.divider {\n margin: 5px 0px 0px 0px;\n}\n\n.session-container.vertical {\n padding: 15px;\n display: flex;\n flex-direction: column;\n background-color: white;\n}\n\n.session-layout {\n flex: 100 100 auto;\n display: flex;\n overflow: hidden;\n}\n\n.session-container.horizontal .session-layout {\n flex-direction: column;\n}\n\n.session-container.vertical .menu-bar {\n justify-content: space-between;\n margin: 0px !important;\n}\n\n.session-container.vertical .menu-bar .content-left {\n width: 100%;\n}\n\n.session-container.vertical .menu-bar .close-button.item:before {\n background: none !important;\n}\n\n.session-container.vertical .menu-bar .close-button.item {\n box-shadow: none !important;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\n float: left;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\n max-height: calc(100vh - 140px);\n overflow-y: auto;\n overflow-x: hidden;\n max-width: calc(100vw - 30px);\n}\n\n.session-container.vertical .session-item .count.label {\n margin-left: 1em !important;\n}\n\n.session-container.vertical .session-header {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.session-container.vertical .session-header > div {\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\n padding: 0.82857143em 0.4285714em;\n line-height: 1.2;\n}\n\n.session-container.vertical .session-header > div:before {\n background: none !important;\n}\n\n.session-container.vertical .session-header > i {\n margin-left: 10px;\n}\n\n.session-container.vertical .session-header .ui.dropdown > i {\n margin: 0px 5px;\n}\n\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\n.session-container.horizontal .session-header .header > i,\n.session-container.vertical .session-header > i {\n width: inherit !important;\n font-size: 1.5em;\n}\n\n.session-container.horizontal .session-header .ui.header {\n align-items: center;\n}\n\n.session-container.vertical .menu-bar {\n border-radius: 0px !important;\n padding-bottom: 0px;\n}\n\n.session-container,\n.session-layout,\n.session-container.horizontal .column {\n height: 100%;\n}\n\n.session-container.horizontal .column > div {\n max-height: 100%;\n}\n\n.session-container .session-item {\n overflow: hidden;\n display: flex !important;\n align-items: center;\n padding: 0.68571429em 0.92857143em !important;\n height: 35px;\n}\n\n.session-container .session-item .session-status {\n float: none !important;\n margin: 0 0.5em 0 0 !important;\n}\n\n.session-container .session-item .session-name {\n overflow: hidden;\n flex: 1 1 100%;\n line-height: 1.2;\n}\n\n.session-container .session-status {\n margin-right: 5px;\n margin-top: 3px;\n}\n\n.session-container.horizontal .menu-column {\n display: flex !important;\n flex-direction: column;\n padding-right: 0px !important;\n}\n\n.session-container.horizontal .menu-column .menu {\n width: initial !important;\n overflow-y: auto;\n padding-top: 10px;\n flex: 1;\n}\n\n.session-container.horizontal .menu-column .session-item span.session-name,\n.session-container .session-header .ui.dropdown .caption {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.session-container .session-header .title .ui.dropdown {\n width: 100%;\n}\n\n.session-layout .sub.header {\n overflow: hidden;\n}\n\n.session-layout .sub.header img {\n vertical-align: text-top;\n}\n\n.session-footer .info-grid {\n margin-top: 7px !important;\n font-size: small;\n color: grey;\n display: flex;\n flex: 1;\n align-items: flex-end;\n}\n\n.session-footer .info-grid > div {\n flex: 1;\n}\n\n.session-footer .info-grid > div:last-child > div {\n float: right;\n}\n\n.session-footer .info-grid > div:only-child > div {\n float: inherit;\n}\n\n.session-footer .ui.checkbox {\n min-height: inherit !important;\n}\n\n.session-footer .divider {\n margin-top: 8px;\n margin-bottom: 0px;\n}\n\n/* New session layout */\n.session.new {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n margin-top: 20px;\n padding: 1px;\n}\n\n.session.new .recents {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n overflow-y: hidden;\n}\n\n.session.new .recents .list {\n padding: 3px 5px;\n flex: 100 100 0%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/sessions.css"],names:[],mappings:"AAAA;EACE,sBAAsB;AACxB;;AAEA;EACE,sCAAsC;AACxC;;AAEA;EACE,qCAAqC;AACvC;;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,iCAAiC;EACjC,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,6CAA6C;EAC7C,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,8BAA8B;AAChC;;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 {\n margin: 0px !important;\n}\n\n.session-container.horizontal .menu-column .item.new {\n padding: 0.78571429em 1.1em !important;\n}\n\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\n margin: 0 0.35714286em 0 0 !important;\n}\n\n.session-container.horizontal .session-layout > .ui.divider {\n margin: 5px 0px 0px 0px;\n}\n\n.session-container.vertical {\n padding: 15px;\n display: flex;\n flex-direction: column;\n background-color: white;\n}\n\n.session-layout {\n flex: 100 100 auto;\n display: flex;\n overflow: hidden;\n}\n\n.session-container.horizontal .session-layout {\n flex-direction: column;\n}\n\n.session-container.vertical .menu-bar {\n justify-content: space-between;\n margin: 0px !important;\n}\n\n.session-container.vertical .menu-bar .content-left {\n width: 100%;\n}\n\n.session-container.vertical .menu-bar .close-button.item:before {\n background: none !important;\n}\n\n.session-container.vertical .menu-bar .close-button.item {\n box-shadow: none !important;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\n float: left;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\n max-height: calc(100vh - 140px);\n overflow-y: auto;\n overflow-x: hidden;\n max-width: calc(100vw - 30px);\n}\n\n.session-container.vertical .session-item .count.label {\n margin-left: 1em !important;\n}\n\n.session-container.vertical .session-header {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.session-container.vertical .session-header > div {\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\n padding: 0.82857143em 0.4285714em;\n line-height: 1.2;\n}\n\n.session-container.vertical .session-header > div:before {\n background: none !important;\n}\n\n.session-container.vertical .session-header > i {\n margin-left: 10px;\n}\n\n.session-container.vertical .session-header .ui.dropdown > i {\n margin: 0px 5px;\n}\n\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\n.session-container.horizontal .session-header .header > i,\n.session-container.vertical .session-header > i {\n width: inherit !important;\n font-size: 1.5em;\n}\n\n.session-container.horizontal .session-header .ui.header {\n align-items: center;\n}\n\n.session-container.vertical .menu-bar {\n border-radius: 0px !important;\n padding-bottom: 0px;\n}\n\n.session-container,\n.session-layout,\n.session-container.horizontal .column {\n height: 100%;\n}\n\n.session-container.horizontal .column > div {\n max-height: 100%;\n}\n\n.session-container .session-item {\n overflow: hidden;\n display: flex !important;\n align-items: center;\n padding: 0.68571429em 0.92857143em !important;\n height: 35px;\n}\n\n.session-container .session-item .session-status {\n float: none !important;\n margin: 0 0.5em 0 0 !important;\n}\n\n.session-container .session-item .session-name {\n overflow: hidden;\n flex: 1 1 100%;\n line-height: 1.2;\n}\n\n.session-container .session-status {\n margin-right: 5px;\n margin-top: 3px;\n}\n\n.session-container.horizontal .menu-column {\n display: flex !important;\n flex-direction: column;\n padding-right: 0px !important;\n}\n\n.session-container.horizontal .menu-column .menu {\n width: initial !important;\n overflow-y: auto;\n padding-top: 10px;\n flex: 1;\n}\n\n.session-container.horizontal .menu-column .session-item span.session-name,\n.session-container .session-header .ui.dropdown .caption {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.session-container .session-header .title .ui.dropdown {\n width: 100%;\n}\n\n.session-layout .sub.header {\n overflow: hidden;\n}\n\n.session-layout .sub.header img {\n vertical-align: text-top;\n}\n\n.session-footer .info-grid {\n margin-top: 7px !important;\n font-size: small;\n color: grey;\n display: flex;\n flex: 1;\n align-items: flex-end;\n}\n\n.session-footer .info-grid > div {\n flex: 1;\n}\n\n.session-footer .info-grid > div:last-child > div {\n float: right;\n}\n\n.session-footer .info-grid > div:only-child > div {\n float: inherit;\n}\n\n.session-footer .ui.checkbox {\n min-height: inherit !important;\n}\n\n.session-footer .divider {\n margin-top: 8px;\n margin-bottom: 0px;\n}\n\n/* New session layout */\n.session.new {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n margin-top: 20px;\n padding: 1px;\n}\n\n.session.new .recents {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n overflow-y: hidden;\n}\n\n.session.new .recents .list {\n padding: 3px 5px;\n flex: 100 100 0%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n"],sourceRoot:""}]);const a=r},38982:(n,e,s)=>{s.d(e,{Z:()=>o});var i=s(518),t=s(48117);function o(n,e,s){const o={divider:null,removeSession:{displayName:"Close",access:s,icon:t.Z.REMOVE,handler:({data:n})=>i.Z.delete(`${e}/${n.id}`)}};return Object.assign(n,o)}},8576:(n,e,s)=>{s.d(e,{Z:()=>a});var i=s(85893),t=s(67294),o=s(96818),r=s(33612);function a(n,e=!1){class s extends t.Component{constructor(){super(...arguments),this.setRead=n=>{this.props.sessionApi.setRead(n),this.readTimeout=void 0},this.setSession=n=>{if(this.readTimeout&&(clearTimeout(this.readTimeout),this.setRead(this.props.session)),this.props.sessionApi.sessionChanged(n),!n)return;const s=e?1e3*o.Z.getValue(r.Qp.UNREAD_LABEL_DELAY):0;this.readTimeout=window.setTimeout((()=>this.setRead(n)),s)}}componentDidMount(){this.setSession(this.props.session)}componentWillUnmount(){this.setSession(null)}componentDidUpdate(n){this.props.session.id!==n.session.id&&this.setSession(this.props.session)}render(){return(0,i.jsx)(n,Object.assign({},this.props))}}return s}},88998:(n,e,s)=>{s.d(e,{C:()=>o,o:()=>t});var i=s(85893);s(67294);const t=({label:n,text:e})=>(0,i.jsx)("div",Object.assign({className:"grid-item"},{children:(0,i.jsx)("div",Object.assign({className:"item-inner"},{children:n&&"string"==typeof e?`${n}: ${e}`:e}))})),o=({children:n})=>(0,i.jsxs)("div",Object.assign({className:"session-footer"},{children:[(0,i.jsx)("div",{className:"ui footer divider"}),(0,i.jsx)("div",Object.assign({className:"info-grid ui"},{children:n}))]}))},10907:(n,e,s)=>{s.d(e,{Z:()=>nn});var i=s(85893),t=s(45697),o=s.n(t),r=s(67294),a=s(16550),A=s(41143),c=s.n(A),l=s(20097),d=s(54883),m=s(10606),h=s(45807),p=s(1059),u=s(99005),g=s(63452),E=s(32347),B=s(8717),x=s(48117);const f=({sessionMenuItems:n,newButton:e,unreadInfoStore:s,listActionMenuGetter:t,t:o})=>(0,i.jsxs)(p.Z,Object.assign({triggerIcon:(0,i.jsx)(g.O,{urgencies:s?s.getTotalUrgencies():null})},{children:[(0,i.jsx)(u.Z,Object.assign({caption:(0,B.Iu)("New",o,E.jv.COMMON)},{children:e})),(0,i.jsx)(u.Z,Object.assign({caption:(0,B.Iu)("Current sessions",o,E.jv.COMMON)},{children:n})),(0,i.jsx)(u.Z,{children:t()})]})),v=({actions:n,activeItem:e})=>!e||(0,m.wd)()?null:(0,i.jsx)(h.Z,{className:"basic small item close-button",actions:n,actionId:"removeSession",itemData:e,icon:x.Z.CLOSE}),C=({itemHeaderIcon:n,itemHeaderTitle:e})=>(0,i.jsxs)("div",Object.assign({className:"session-header"},{children:[n,e]})),w=n=>{var{children:e,onKeyDown:s}=n,t=function(n,e){var s={};for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&e.indexOf(i)<0&&(s[i]=n[i]);if(null!=n&&"function"==typeof Object.getOwnPropertySymbols){var t=0;for(i=Object.getOwnPropertySymbols(n);t<i.length;t++)e.indexOf(i[t])<0&&Object.prototype.propertyIsEnumerable.call(n,i[t])&&(s[i[t]]=n[i[t]])}return s}(n,["children","onKeyDown"]);return(0,i.jsxs)("div",Object.assign({className:"session-container vertical",onKeyDown:s,tabIndex:0},{children:[(0,i.jsxs)("div",Object.assign({className:"ui main menu menu-bar"},{children:[(0,i.jsxs)("div",Object.assign({className:"content-left"},{children:[(0,i.jsx)(f,Object.assign({},t)),(0,i.jsx)(C,Object.assign({},t))]})),(0,i.jsx)(v,Object.assign({},t))]})),(0,i.jsx)("div",Object.assign({className:"session-layout"},{children:e}))]}))};var b=s(91462),j=s(24101);const y=({sessionMenuItems:n,newButton:e,itemHeaderIcon:s,itemHeaderTitle:t,children:o,itemHeaderDescription:a,onKeyDown:A})=>(e&&(e=r.cloneElement(e,{className:e.props.className+" ui fluid button"})),(0,i.jsxs)(j.rj,Object.assign({className:"session-container horizontal",onKeyDown:A,tabIndex:0},{children:[(0,i.jsxs)("div",Object.assign({className:"four wide column menu-column"},{children:[e,!!n.length&&(0,i.jsx)("div",Object.assign({className:"ui vertical secondary menu"},{children:n}))]})),(0,i.jsx)("div",Object.assign({className:"twelve wide stretched column content-column session"},{children:(0,i.jsxs)("div",Object.assign({className:"ui segment session-layout"},{children:[(0,i.jsx)(b.Z,{className:"session-header",icon:s,title:(0,i.jsx)("div",Object.assign({className:"title"},{children:t})),subHeader:a}),(0,i.jsx)("div",{className:"ui divider",style:{margin:"5px 0px 0px 0px"}}),o]}))}))]})));var I=s(93379),O=s.n(I),N=s(7795),S=s.n(N),k=s(90569),Z=s.n(k),z=s(3565),M=s.n(z),D=s(19216),T=s.n(D),H=s(44589),U=s.n(H),R=s(90500),G={};G.styleTagTransform=U(),G.setAttributes=M(),G.insert=Z().bind(null,"head"),G.domAPI=S(),G.insertStyleElement=T(),O()(R.Z,G),R.Z&&R.Z.locals&&R.Z.locals;var L=s(84613),q=s(94184),W=s.n(q),Y=s(6596);const K=({url:n,title:e,pushNew:s,className:t})=>(0,i.jsx)(Y.Z,Object.assign({className:W()("new",t),icon:x.Z.CREATE,url:n,onClick:n=>((n,e)=>{n.preventDefault(),e()})(n,s)},{children:e}),"button-new"),$=({sessionItem:n,status:e,name:s,unreadInfoStore:t,url:o,pushSession:r})=>(0,i.jsx)(Y.Z,Object.assign({url:o,className:"session-item",onClick:e=>((n,e,s)=>{n.preventDefault(),s(e.id)})(e,n,r),icon:e,session:n,unreadInfoStore:t},{children:(0,i.jsx)("span",Object.assign({className:"session-name"},{children:s}))}));var P=s(35936),_=s(27695),F=s(66883),V=s(98374),J=s(54080);const Q=(n,e)=>n.find((n=>n.id===e));class X extends r.Component{constructor(){super(...arguments),this.state={activeItem:null},this.getSessionUrl=n=>(c()(!!n,"Trying to get session URL without a session"),`/${this.props.baseUrl}/session/${n}`),this.getNewUrl=()=>`/${this.props.baseUrl}/new`,this.getStorageKey=n=>`${n.baseUrl}_last_active`,this.pushSession=n=>{l.Z.push(this.getSessionUrl(n))},this.replaceSession=n=>{l.Z.replace(this.getSessionUrl(n))},this.pushNew=()=>{l.Z.push(this.getNewUrl())},this.hasEditAccess=()=>F.Z.hasAccess(this.props.editAccess),this.checkActiveItem=n=>{const e=n.location,s=e.state&&e.state.pending,i=Q(n.items,n.activeId);return i?s?(l.Z.replace({state:{pending:!1}}),!0):(this.setState({activeItem:i}),(0,m.Ay)(this.getStorageKey(n),n.activeId),!0):!!s||0===n.items.length&&(l.Z.replace(this.getNewUrl()),this.setState({activeItem:null}),!0)},this.onKeyDown=n=>{const{key:e,altKey:s}=n;if(!s||"ArrowUp"!==e&&"ArrowDown"!==e){if(s&&"Insert"===e)n.preventDefault(),l.Z.replace(this.getNewUrl());else if(s&&"Delete"===e){n.preventDefault();const{items:e,activeId:s,sessionApi:i}=this.props,t=Q(e,s);t&&i.removeSession(t)}}else{n.preventDefault();const{items:s,activeId:i}=this.props,t=Q(s,i);if(!t)return;const o=s.indexOf(t);if(-1===o)return;const r=s["ArrowUp"===e?o-1:o+1];r&&this.pushSession(r.id)}},this.getItemStatus=n=>{const{itemStatusGetter:e,itemHeaderIconGetter:s}=this.props;return e?(0,i.jsx)("div",{className:"ui session-status empty circular left mini label "+e(n)}):(0,i.jsx)(P.Z,{icon:s(n)})},this.getSessionMenuItem=n=>(0,i.jsx)($,{url:this.getSessionUrl(n.id),name:this.props.itemNameGetter(n),unreadInfoStore:this.props.unreadInfoStore,status:this.getItemStatus(n),sessionItem:n,pushSession:this.pushSession},n.id),this.getItemHeaderTitle=()=>{const{uiActions:n,actionIds:e,itemNameGetter:s,itemHeaderTitleGetter:t}=this.props,{activeItem:o}=this.state;if(!o)return(0,i.jsx)("div",{children:this.props.newCaption});let r;e&&(r=[...e,"divider","removeSession"]);const a=(0,i.jsx)(L.PC,{caption:s(o),actions:n,itemData:o,ids:r});if(t){const n=t(o,this.props.location,a);if(n)return n}return a},this.getItemHeaderDescription=()=>{const{activeItem:n}=this.state,{itemHeaderDescriptionGetter:e,newDescription:s}=this.props;return n?e(n):s},this.getItemHeaderIcon=()=>{const{activeItem:n}=this.state,{itemHeaderIconGetter:e,newIcon:s}=this.props;return(0,i.jsx)(P.Z,{icon:n?e(n):s})},this.getNewButton=()=>this.hasEditAccess()&&this.props.newCaption?(0,i.jsx)(K,{title:this.props.newCaption,url:this.getNewUrl(),pushNew:this.pushNew},"new-button"):null,this.handleCloseAll=()=>{const{sessionApi:n,items:e}=this.props;e.forEach((e=>n.removeSession(e)))},this.getListActionMenu=()=>{const{items:n,t:e}=this.props;return this.hasEditAccess()&&0!==n.length?(0,i.jsx)(V.Z,Object.assign({onClick:this.handleCloseAll,icon:x.Z.REMOVE},{children:(0,B.Iu)("Close all",e,E.jv.COMMON)}),"close"):null},this.sessionT=(0,B.HY)(this.props.t,this.props.uiActions.moduleId)}UNSAFE_componentWillReceiveProps(n){if(n.location.pathname===this.getNewUrl())return void(this.state.activeItem&&this.setState({activeItem:null}));if(this.checkActiveItem(n))return;let e=0;const s=Q(this.props.items,this.props.activeId);s&&(e=this.props.items.indexOf(s),e===this.props.items.length-1&&(e-=1)),this.replaceSession(n.items[e].id)}componentDidMount(){if(this.checkActiveItem(this.props))return;const n=(0,m.C)(this.getStorageKey(this.props));n&&Q(this.props.items,n)?this.replaceSession(n):this.props.items.length>0&&this.replaceSession(this.props.items[0].id)}render(){const{disableSideMenu:n,items:e,unreadInfoStore:s,location:t,t:o,sessionApi:r,uiActions:A,newLayout:c,sessionItemLayout:l,activeId:h}=this.props;if(!this.hasEditAccess()&&0===e.length)return(0,i.jsx)(_.Z,{title:(0,B.Iu)("No items to show",o,E.jv.COMMON),description:o((0,B.zS)("noSessionEditAccess",E.jv.COMMON),"You aren't allowed to open new sessions")});const{activeItem:p}=this.state,u=n||(0,m.wd)(this.context)?w:y;return(0,i.jsxs)(u,Object.assign({itemHeaderTitle:this.getItemHeaderTitle(),itemHeaderDescription:this.getItemHeaderDescription(),itemHeaderIcon:this.getItemHeaderIcon(),activeItem:p,unreadInfoStore:s,newButton:this.getNewButton(),sessionMenuItems:e.map(this.getSessionMenuItem),listActionMenuGetter:this.getListActionMenu,onKeyDown:this.onKeyDown,actions:A,t:o},{children:[(0,i.jsx)(a.AW,{path:this.getSessionUrl(":id"),render:n=>{if(!p){const{state:n}=this.props.location;return n&&n.pending?(0,i.jsx)(d.Z,{text:(0,B.Iu)("Waiting for server response",o,E.jv.COMMON)}):h||0!==e.length?(0,i.jsx)(d.Z,{text:(0,B.Iu)("Loading session",o,E.jv.COMMON)}):void console.error("SessionLayout route: active session missing")}return(0,i.jsx)(l,{session:p,sessionApi:r,uiActions:A,location:t,sessionT:this.sessionT})}}),!!c&&(0,i.jsx)(a.AW,{path:this.getNewUrl(),render:n=>(0,i.jsx)(c,Object.assign({},n,{sessionT:this.sessionT}))})]}))}}X.displayName="SessionLayout",X.propTypes={baseUrl:o().string.isRequired,location:o().object.isRequired,items:o().array.isRequired,itemHeaderTitleGetter:o().func,itemHeaderDescriptionGetter:o().func.isRequired,itemHeaderIconGetter:o().func.isRequired,unreadInfoStore:o().object,itemNameGetter:o().func.isRequired,itemStatusGetter:o().func,uiActions:o().object.isRequired,actionIds:o().array,activeId:o().any,newCaption:o().any,newDescription:o().any,newIcon:o().any,disableSideMenu:o().bool,editAccess:o().string.isRequired,sessionItemLayout:o().any.isRequired,newLayout:o().func},X.contextType=J.c;const nn=X},93101:(n,e,s)=>{s.d(e,{J:()=>c});var i=s(85893),t=(s(67294),s(54883)),o=s(92408),r=s(32347),a=s(91072),A=s(8717);const c=(n,e)=>s=>{const{t:c}=(0,a.$G)(),l=(0,o.o)(e);return e.isInitialized()?(0,i.jsx)(n,Object.assign({items:l,t:c},s)):(0,i.jsx)(t.Z,{text:(0,A.Iu)("Loading sessions",c,r.jv.COMMON)})}}}]);
2
- //# sourceMappingURL=668.294ae7e2a9db78b421b0.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"js/668.294ae7e2a9db78b421b0.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 {\\n margin: 0px !important;\\n}\\n\\n.session-container.horizontal .menu-column .item.new {\\n padding: 0.78571429em 1.1em !important;\\n}\\n\\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\\n margin: 0 0.35714286em 0 0 !important;\\n}\\n\\n.session-container.horizontal .session-layout > .ui.divider {\\n margin: 5px 0px 0px 0px;\\n}\\n\\n.session-container.vertical {\\n padding: 15px;\\n display: flex;\\n flex-direction: column;\\n background-color: white;\\n}\\n\\n.session-layout {\\n flex: 100 100 auto;\\n display: flex;\\n overflow: hidden;\\n}\\n\\n.session-container.horizontal .session-layout {\\n flex-direction: column;\\n}\\n\\n.session-container.vertical .menu-bar {\\n justify-content: space-between;\\n margin: 0px !important;\\n}\\n\\n.session-container.vertical .menu-bar .content-left {\\n width: 100%;\\n}\\n\\n.session-container.vertical .menu-bar .close-button.item:before {\\n background: none !important;\\n}\\n\\n.session-container.vertical .menu-bar .close-button.item {\\n box-shadow: none !important;\\n}\\n\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\\n float: left;\\n}\\n\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\\n max-height: calc(100vh - 140px);\\n overflow-y: auto;\\n overflow-x: hidden;\\n max-width: calc(100vw - 30px);\\n}\\n\\n.session-container.vertical .session-item .count.label {\\n margin-left: 1em !important;\\n}\\n\\n.session-container.vertical .session-header {\\n display: flex;\\n align-items: center;\\n height: 100%;\\n}\\n\\n.session-container.vertical .session-header > div {\\n max-width: 90%; /* Hack, auto width won't work without \\\"overflow: hidden\\\", but that would prevent viewing the menu items */\\n padding: 0.82857143em 0.4285714em;\\n line-height: 1.2;\\n}\\n\\n.session-container.vertical .session-header > div:before {\\n background: none !important;\\n}\\n\\n.session-container.vertical .session-header > i {\\n margin-left: 10px;\\n}\\n\\n.session-container.vertical .session-header .ui.dropdown > i {\\n margin: 0px 5px;\\n}\\n\\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\\n.session-container.horizontal .session-header .header > i,\\n.session-container.vertical .session-header > i {\\n width: inherit !important;\\n font-size: 1.5em;\\n}\\n\\n.session-container.horizontal .session-header .ui.header {\\n align-items: center;\\n}\\n\\n.session-container.vertical .menu-bar {\\n border-radius: 0px !important;\\n padding-bottom: 0px;\\n}\\n\\n.session-container,\\n.session-layout,\\n.session-container.horizontal .column {\\n height: 100%;\\n}\\n\\n.session-container.horizontal .column > div {\\n max-height: 100%;\\n}\\n\\n.session-container .session-item {\\n overflow: hidden;\\n display: flex !important;\\n align-items: center;\\n padding: 0.68571429em 0.92857143em !important;\\n height: 35px;\\n}\\n\\n.session-container .session-item .session-status {\\n float: none !important;\\n margin: 0 0.5em 0 0 !important;\\n}\\n\\n.session-container .session-item .session-name {\\n overflow: hidden;\\n flex: 1 1 100%;\\n line-height: 1.2;\\n}\\n\\n.session-container .session-status {\\n margin-right: 5px;\\n margin-top: 3px;\\n}\\n\\n.session-container.horizontal .menu-column {\\n display: flex !important;\\n flex-direction: column;\\n padding-right: 0px !important;\\n}\\n\\n.session-container.horizontal .menu-column .menu {\\n width: initial !important;\\n overflow-y: auto;\\n padding-top: 10px;\\n flex: 1;\\n}\\n\\n.session-container.horizontal .menu-column .session-item span.session-name,\\n.session-container .session-header .ui.dropdown .caption {\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n\\n.session-container .session-header .title .ui.dropdown {\\n width: 100%;\\n}\\n\\n.session-layout .sub.header {\\n overflow: hidden;\\n}\\n\\n.session-layout .sub.header img {\\n vertical-align: text-top;\\n}\\n\\n.session-footer .info-grid {\\n margin-top: 7px !important;\\n font-size: small;\\n color: grey;\\n display: flex;\\n flex: 1;\\n align-items: flex-end;\\n}\\n\\n.session-footer .info-grid > div {\\n flex: 1;\\n}\\n\\n.session-footer .info-grid > div:last-child > div {\\n float: right;\\n}\\n\\n.session-footer .info-grid > div:only-child > div {\\n float: inherit;\\n}\\n\\n.session-footer .ui.checkbox {\\n min-height: inherit !important;\\n}\\n\\n.session-footer .divider {\\n margin-top: 8px;\\n margin-bottom: 0px;\\n}\\n\\n/* New session layout */\\n.session.new {\\n flex: 100 100 0%;\\n display: flex;\\n flex-direction: column;\\n overflow-y: hidden;\\n margin-top: 20px;\\n padding: 1px;\\n}\\n\\n.session.new .recents {\\n flex: 100 100 0%;\\n display: flex;\\n flex-direction: column;\\n margin-top: 20px;\\n overflow-y: hidden;\\n}\\n\\n.session.new .recents .list {\\n padding: 3px 5px;\\n flex: 100 100 0%;\\n overflow-y: auto;\\n overflow-x: hidden;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/sessions.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,sBAAsB;AACxB;;AAEA;EACE,sCAAsC;AACxC;;AAEA;EACE,qCAAqC;AACvC;;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,iCAAiC;EACjC,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,6CAA6C;EAC7C,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,8BAA8B;AAChC;;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 {\\n margin: 0px !important;\\n}\\n\\n.session-container.horizontal .menu-column .item.new {\\n padding: 0.78571429em 1.1em !important;\\n}\\n\\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\\n margin: 0 0.35714286em 0 0 !important;\\n}\\n\\n.session-container.horizontal .session-layout > .ui.divider {\\n margin: 5px 0px 0px 0px;\\n}\\n\\n.session-container.vertical {\\n padding: 15px;\\n display: flex;\\n flex-direction: column;\\n background-color: white;\\n}\\n\\n.session-layout {\\n flex: 100 100 auto;\\n display: flex;\\n overflow: hidden;\\n}\\n\\n.session-container.horizontal .session-layout {\\n flex-direction: column;\\n}\\n\\n.session-container.vertical .menu-bar {\\n justify-content: space-between;\\n margin: 0px !important;\\n}\\n\\n.session-container.vertical .menu-bar .content-left {\\n width: 100%;\\n}\\n\\n.session-container.vertical .menu-bar .close-button.item:before {\\n background: none !important;\\n}\\n\\n.session-container.vertical .menu-bar .close-button.item {\\n box-shadow: none !important;\\n}\\n\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\\n float: left;\\n}\\n\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\\n max-height: calc(100vh - 140px);\\n overflow-y: auto;\\n overflow-x: hidden;\\n max-width: calc(100vw - 30px);\\n}\\n\\n.session-container.vertical .session-item .count.label {\\n margin-left: 1em !important;\\n}\\n\\n.session-container.vertical .session-header {\\n display: flex;\\n align-items: center;\\n height: 100%;\\n}\\n\\n.session-container.vertical .session-header > div {\\n max-width: 90%; /* Hack, auto width won't work without \\\"overflow: hidden\\\", but that would prevent viewing the menu items */\\n padding: 0.82857143em 0.4285714em;\\n line-height: 1.2;\\n}\\n\\n.session-container.vertical .session-header > div:before {\\n background: none !important;\\n}\\n\\n.session-container.vertical .session-header > i {\\n margin-left: 10px;\\n}\\n\\n.session-container.vertical .session-header .ui.dropdown > i {\\n margin: 0px 5px;\\n}\\n\\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\\n.session-container.horizontal .session-header .header > i,\\n.session-container.vertical .session-header > i {\\n width: inherit !important;\\n font-size: 1.5em;\\n}\\n\\n.session-container.horizontal .session-header .ui.header {\\n align-items: center;\\n}\\n\\n.session-container.vertical .menu-bar {\\n border-radius: 0px !important;\\n padding-bottom: 0px;\\n}\\n\\n.session-container,\\n.session-layout,\\n.session-container.horizontal .column {\\n height: 100%;\\n}\\n\\n.session-container.horizontal .column > div {\\n max-height: 100%;\\n}\\n\\n.session-container .session-item {\\n overflow: hidden;\\n display: flex !important;\\n align-items: center;\\n padding: 0.68571429em 0.92857143em !important;\\n height: 35px;\\n}\\n\\n.session-container .session-item .session-status {\\n float: none !important;\\n margin: 0 0.5em 0 0 !important;\\n}\\n\\n.session-container .session-item .session-name {\\n overflow: hidden;\\n flex: 1 1 100%;\\n line-height: 1.2;\\n}\\n\\n.session-container .session-status {\\n margin-right: 5px;\\n margin-top: 3px;\\n}\\n\\n.session-container.horizontal .menu-column {\\n display: flex !important;\\n flex-direction: column;\\n padding-right: 0px !important;\\n}\\n\\n.session-container.horizontal .menu-column .menu {\\n width: initial !important;\\n overflow-y: auto;\\n padding-top: 10px;\\n flex: 1;\\n}\\n\\n.session-container.horizontal .menu-column .session-item span.session-name,\\n.session-container .session-header .ui.dropdown .caption {\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n\\n.session-container .session-header .title .ui.dropdown {\\n width: 100%;\\n}\\n\\n.session-layout .sub.header {\\n overflow: hidden;\\n}\\n\\n.session-layout .sub.header img {\\n vertical-align: text-top;\\n}\\n\\n.session-footer .info-grid {\\n margin-top: 7px !important;\\n font-size: small;\\n color: grey;\\n display: flex;\\n flex: 1;\\n align-items: flex-end;\\n}\\n\\n.session-footer .info-grid > div {\\n flex: 1;\\n}\\n\\n.session-footer .info-grid > div:last-child > div {\\n float: right;\\n}\\n\\n.session-footer .info-grid > div:only-child > div {\\n float: inherit;\\n}\\n\\n.session-footer .ui.checkbox {\\n min-height: inherit !important;\\n}\\n\\n.session-footer .divider {\\n margin-top: 8px;\\n margin-bottom: 0px;\\n}\\n\\n/* New session layout */\\n.session.new {\\n flex: 100 100 0%;\\n display: flex;\\n flex-direction: column;\\n overflow-y: hidden;\\n margin-top: 20px;\\n padding: 1px;\\n}\\n\\n.session.new .recents {\\n flex: 100 100 0%;\\n display: flex;\\n flex-direction: column;\\n margin-top: 20px;\\n overflow-y: hidden;\\n}\\n\\n.session.new .recents .list {\\n padding: 3px 5px;\\n flex: 100 100 0%;\\n overflow-y: auto;\\n overflow-x: hidden;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import SocketService from 'services/SocketService';\n\nimport IconConstants from 'constants/IconConstants';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\ntype SessionType = UI.SessionItemBase;\n\nexport default function (\n actions: UI.ActionListType<SessionType>,\n sessionsUrl: string,\n editAccess: API.AccessEnum\n) {\n const handleRemoveSession: UI.ActionHandler<SessionType> = ({ data: session }) => {\n return SocketService.delete(`${sessionsUrl}/${session.id}`);\n };\n\n const SessionActions: UI.ActionListType<SessionType> = {\n divider: null,\n removeSession: {\n displayName: 'Close',\n access: editAccess,\n icon: IconConstants.REMOVE,\n handler: handleRemoveSession,\n },\n };\n\n return Object.assign(actions, SessionActions);\n}\n","//import PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport LocalSettingStore from 'stores/LocalSettingStore';\nimport { LocalSettings } from 'constants/SettingConstants';\n\nimport * as UI from 'types/ui';\nimport { SessionChildProps } from 'routes/Sidebar/components/SessionLayout';\n\ntype SessionType = UI.SessionItemBase;\n\ninterface ActiveSessionDecoratorProps<\n SessionT extends SessionType,\n ActionT extends object\n> extends Pick<SessionChildProps<SessionT, ActionT>, 'session'> {\n sessionApi: UI.SessionActions<SessionT> & ActionT;\n //uiActions:\n //session: SessionT;\n}\n\n// This decorator will fire updates for currently active session\n// and set them as read\nexport default function <\n PropsT,\n SessionT extends SessionType,\n ActionT extends object = UI.EmptyObject\n>(Component: React.ComponentType<PropsT>, useReadDelay = false) {\n class ActiveSessionDecorator extends React.Component<\n PropsT & ActiveSessionDecoratorProps<SessionT, ActionT>\n > {\n /*static propTypes = {\n session: PropTypes.any, // Required (cloned)\n actions: PropTypes.object, // Required (cloned)\n };*/\n\n readTimeout: number | undefined;\n\n setRead = (session: SessionT) => {\n this.props.sessionApi.setRead(session);\n this.readTimeout = undefined;\n };\n\n setSession = (session: SessionT | null) => {\n if (this.readTimeout) {\n // Set the previously active session as read\n clearTimeout(this.readTimeout);\n this.setRead(this.props.session);\n }\n\n this.props.sessionApi.sessionChanged(session);\n if (!session) {\n return;\n }\n\n const timeout = !useReadDelay\n ? 0\n : LocalSettingStore.getValue<number>(LocalSettings.UNREAD_LABEL_DELAY) * 1000;\n this.readTimeout = window.setTimeout(() => this.setRead(session), timeout);\n };\n\n componentDidMount() {\n this.setSession(this.props.session);\n }\n\n componentWillUnmount() {\n this.setSession(null);\n }\n\n componentDidUpdate(prevProps: ActiveSessionDecoratorProps<SessionT, ActionT>) {\n if (this.props.session.id !== prevProps.session.id) {\n this.setSession(this.props.session);\n }\n }\n\n render() {\n return <Component {...this.props} />;\n }\n }\n\n return ActiveSessionDecorator;\n}\n","import * as React from 'react';\n\nimport * as UI from 'types/ui';\n\ninterface FooterItemProps {\n label?: string;\n text: string | React.ReactElement<any>;\n}\n\nexport const FooterItem: React.FC<FooterItemProps> = ({ label, text }) => (\n <div className=\"grid-item\">\n <div className=\"item-inner\">\n {!!label && typeof text === 'string' ? `${label}: ${text}` : text}\n </div>\n </div>\n);\n\nexport const SessionFooter: React.FC<UI.PropsWithChildren> = ({ children }) => (\n <div className=\"session-footer\">\n <div className=\"ui footer divider\" />\n <div className=\"info-grid ui\">{children}</div>\n </div>\n);\n","//import PropTypes from 'prop-types';\nimport * as React from 'react';\nimport { useMobileLayout } from 'utils/BrowserUtils';\n\nimport ActionButton from 'components/ActionButton';\nimport SectionedDropdown from 'components/semantic/SectionedDropdown';\nimport MenuSection from 'components/semantic/MenuSection';\nimport { MenuIcon } from 'components/icon/MenuIcon';\nimport { SessionMainLayoutProps } from './SessionLayout';\n\nimport * as UI from 'types/ui';\nimport { translate } from 'utils/TranslationUtils';\nimport IconConstants from 'constants/IconConstants';\n\ntype SessionDropdownProps<SessionT extends UI.SessionItemBase> = Pick<\n SessionMainLayoutProps<SessionT>,\n 'sessionMenuItems' | 'newButton' | 'unreadInfoStore' | 'listActionMenuGetter' | 't'\n>;\n\nconst SessionDropdown = <SessionT extends UI.SessionItemBase>({\n sessionMenuItems,\n newButton,\n unreadInfoStore,\n listActionMenuGetter,\n t,\n}: SessionDropdownProps<SessionT>) => (\n <SectionedDropdown\n triggerIcon={\n <MenuIcon\n urgencies={unreadInfoStore ? unreadInfoStore.getTotalUrgencies() : null}\n />\n }\n >\n <MenuSection caption={translate('New', t, UI.Modules.COMMON)}>\n {newButton}\n </MenuSection>\n <MenuSection caption={translate('Current sessions', t, UI.Modules.COMMON)}>\n {sessionMenuItems}\n </MenuSection>\n <MenuSection>{listActionMenuGetter()}</MenuSection>\n </SectionedDropdown>\n);\n\ntype CloseButtonProps<\n SessionT extends UI.SessionItemBase,\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>\n> = Pick<\n SessionMainLayoutProps<SessionT, UI.EmptyObject, UIActionsT>,\n 'actions' | 'activeItem'\n>;\n\nconst CloseButton = <\n SessionT extends UI.SessionItemBase,\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>\n>({\n actions,\n activeItem,\n}: CloseButtonProps<SessionT, UIActionsT>) => {\n if (!activeItem || useMobileLayout()) {\n return null;\n }\n\n return (\n <ActionButton\n className=\"basic small item close-button\"\n actions={actions}\n actionId=\"removeSession\"\n itemData={activeItem}\n icon={IconConstants.CLOSE}\n />\n );\n};\n\ntype SessionItemHeaderProps = Pick<\n SessionMainLayoutProps<any>,\n 'itemHeaderIcon' | 'itemHeaderTitle'\n>;\n\nconst SessionItemHeader: React.FC<SessionItemHeaderProps> = ({\n itemHeaderIcon,\n itemHeaderTitle,\n}) => (\n <div className=\"session-header\">\n {itemHeaderIcon}\n {itemHeaderTitle}\n </div>\n);\n\nconst TopMenuLayout = <\n SessionT extends UI.SessionItemBase,\n SessionApiT extends object,\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>\n>({\n children,\n onKeyDown,\n ...props\n}: SessionMainLayoutProps<SessionT, SessionApiT, UIActionsT>) => (\n <div className=\"session-container vertical\" onKeyDown={onKeyDown} tabIndex={0}>\n <div className=\"ui main menu menu-bar\">\n <div className=\"content-left\">\n <SessionDropdown {...props} />\n <SessionItemHeader {...props} />\n </div>\n <CloseButton {...props} />\n </div>\n\n <div className=\"session-layout\">{children}</div>\n </div>\n);\n\n/*TopMenuLayout.propTypes = {\n itemHeaderTitle: PropTypes.node.isRequired,\n itemHeaderIcon: PropTypes.node.isRequired,\n activeItem: PropTypes.object,\n newButton: PropTypes.node,\n sessionMenuItems: PropTypes.array.isRequired,\n closeAction: PropTypes.func.isRequired,\n listActionMenuGetter: PropTypes.func.isRequired,\n};*/\n\nexport default TopMenuLayout;\n","//import PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport LayoutHeader from 'components/semantic/LayoutHeader';\nimport { SessionMainLayoutProps } from './SessionLayout';\nimport { Grid } from 'components/semantic/Grid';\n\nimport * as UI from 'types/ui';\n\nconst SideMenuLayout = <\n SessionT extends UI.SessionItemBase,\n SessionApiT extends object,\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>\n>({\n sessionMenuItems,\n newButton,\n itemHeaderIcon,\n itemHeaderTitle,\n children,\n itemHeaderDescription,\n onKeyDown,\n}: SessionMainLayoutProps<SessionT, SessionApiT, UIActionsT>) => {\n if (newButton) {\n newButton = React.cloneElement(newButton, {\n className: newButton.props.className + ' ui fluid button',\n });\n }\n\n return (\n <Grid className=\"session-container horizontal\" onKeyDown={onKeyDown} tabIndex={0}>\n <div className=\"four wide column menu-column\">\n {newButton}\n {!!sessionMenuItems.length && (\n <div className=\"ui vertical secondary menu\">{sessionMenuItems}</div>\n )}\n </div>\n <div className=\"twelve wide stretched column content-column session\">\n <div className=\"ui segment session-layout\">\n <LayoutHeader\n className=\"session-header\"\n icon={itemHeaderIcon}\n title={<div className=\"title\">{itemHeaderTitle}</div>}\n subHeader={itemHeaderDescription}\n />\n <div className=\"ui divider\" style={{ margin: '5px 0px 0px 0px' }} />\n {children}\n </div>\n </div>\n </Grid>\n );\n};\n\n/*SideMenuLayout.propTypes = {\n newButton: PropTypes.node,\n sessionMenuItems: PropTypes.array.isRequired,\n\n itemHeaderTitle: PropTypes.node,\n itemHeaderIcon: PropTypes.node,\n itemHeaderDescription: PropTypes.node.isRequired,\n};*/\n\nexport default SideMenuLayout;\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';\nimport * as React from 'react';\nimport classNames from 'classnames';\n\nimport IconConstants from 'constants/IconConstants';\nimport RouterMenuItemLink from 'components/semantic/RouterMenuItemLink';\n\ntype PushHandler = () => void;\n\nconst onClick = (evt: React.SyntheticEvent, pushNew: PushHandler) => {\n evt.preventDefault();\n\n pushNew();\n};\n\ninterface SessionNewButtonProps {\n url: string;\n title: React.ReactNode;\n className?: string;\n pushNew: PushHandler;\n}\n\nconst SessionNewButton: React.FC<SessionNewButtonProps> = ({\n url,\n title,\n pushNew,\n className,\n}) => (\n <RouterMenuItemLink\n key=\"button-new\"\n className={classNames('new', className)}\n icon={IconConstants.CREATE}\n url={url}\n onClick={(evt: React.SyntheticEvent) => onClick(evt, pushNew)}\n >\n {title}\n </RouterMenuItemLink>\n);\n\n/*SessionNewButton.propTypes = {\n // Base URL of the section\n url: PropTypes.string.isRequired,\n\n // Title of the button\n title: PropTypes.node.isRequired,\n\n pushNew: PropTypes.func.isRequired,\n\n className: PropTypes.string,\n};*/\n\nexport default SessionNewButton;\n","//import PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport RouterMenuItemLink from 'components/semantic/RouterMenuItemLink';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\ntype PushSessionHandler = (id: API.IdType) => void;\n\nconst onClickItem = (\n evt: React.SyntheticEvent,\n sessionItem: UI.SessionItemBase,\n pushSession: PushSessionHandler\n) => {\n evt.preventDefault();\n\n pushSession(sessionItem.id);\n};\n\ninterface SessionMenuItemProps {\n url: string;\n name: React.ReactNode;\n unreadInfoStore: UI.UnreadInfoStore;\n status: React.ReactElement<any>;\n sessionItem: UI.SessionItemBase;\n\n pushSession: PushSessionHandler;\n}\n\nconst SessionMenuItem: React.FC<SessionMenuItemProps> = ({\n sessionItem,\n status,\n name,\n unreadInfoStore,\n url,\n pushSession,\n}) => (\n <RouterMenuItemLink\n url={url}\n className=\"session-item\"\n onClick={(evt: React.SyntheticEvent) => onClickItem(evt, sessionItem, pushSession)}\n icon={status}\n session={sessionItem}\n unreadInfoStore={unreadInfoStore}\n >\n <span className=\"session-name\">{name}</span>\n </RouterMenuItemLink>\n);\n\n/*SessionMenuItem.propTypes = {\n // Item URL\n url: PropTypes.string.isRequired,\n\n name: PropTypes.node.isRequired,\n\n unreadInfoStore: PropTypes.object.isRequired,\n\n status: PropTypes.node.isRequired,\n\n sessionItem: PropTypes.object.isRequired,\n\n pushSession: PropTypes.func.isRequired,\n};*/\n\nexport default SessionMenuItem;\n","import PropTypes from 'prop-types';\nimport * as React from 'react';\nimport { Route, RouteComponentProps } from 'react-router-dom';\nimport invariant from 'invariant';\n\nimport History from 'utils/History';\nimport Loader from 'components/semantic/Loader';\n\nimport TopMenuLayout from './TopMenuLayout';\nimport SideMenuLayout from './SideMenuLayout';\n\nimport '../sessions.css';\n\nimport { ActionMenu } from 'components/action-menu';\nimport SessionNewButton from './SessionNewButton';\nimport SessionMenuItem from './SessionMenuItem';\n\nimport Icon, { IconType } from 'components/semantic/Icon';\nimport Message from 'components/semantic/Message';\n\nimport LoginStore from 'stores/LoginStore';\nimport {\n loadLocalProperty,\n saveLocalProperty,\n useMobileLayout,\n} from 'utils/BrowserUtils';\n\nimport IconConstants from 'constants/IconConstants';\nimport MenuItemLink from 'components/semantic/MenuItemLink';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { getModuleT, translate, toI18nKey } from 'utils/TranslationUtils';\nimport { LayoutWidthContext, LayoutWidthContextType } from 'context/LayoutWidthContext';\n\nexport type SessionBaseType = UI.SessionItemBase;\n\nconst findItem = <SessionT extends SessionBaseType>(\n items: SessionT[],\n id: API.IdType | null\n): SessionT | undefined => {\n return items.find((item) => item.id === id);\n};\n\nexport interface SessionLayoutProps<\n SessionT extends SessionBaseType,\n SessionApiT extends object = UI.EmptyObject,\n UIActionT extends UI.ActionListType<UI.SessionItemBase> = UI.EmptyObject\n> extends UI.SessionInfoGetter<SessionT>,\n Omit<RouteComponentProps, 'match'> {\n // Unique ID of the section (used for storing and loading the previously open tab)\n baseUrl: string;\n\n // Array of the items to list\n items: SessionT[];\n\n // Session actions (should contain 'removeSession')\n /*actions: UI.ModuleActions<SessionT> & {\n actions: UI.SessionUIActions<SessionT, ActionT>;\n };*/\n\n uiActions: UI.ModuleActions<SessionT, UIActionT>;\n sessionApi: UI.SessionActions<SessionT> & SessionApiT;\n\n // Session actions to show in the action menu\n actionIds?: string[];\n\n // Item ID that is currently active (if any)\n activeId: API.IdType | null;\n\n // Label for button that opens a new session\n newCaption?: React.ReactNode;\n\n // Label for button that opens a new session\n newDescription?: React.ReactNode;\n\n // Label for button that opens a new session\n newIcon?: IconType;\n\n // Set to false if the side menu should never be shown (the session will use all width that is available)\n disableSideMenu?: boolean;\n\n // AccessConstant defining whether the user has edit permission\n editAccess: API.AccessEnum;\n\n sessionItemLayout: React.ComponentType<\n SessionChildProps<SessionT, SessionApiT, UIActionT>\n >;\n\n newLayout?: React.ComponentType<NewSessionLayoutProps>;\n\n unreadInfoStore: UI.UnreadInfoStore;\n\n t: UI.TranslateF;\n}\n\nexport interface SessionLocationState {\n pending?: boolean;\n}\n\nexport interface SessionMainLayoutProps<\n SessionT extends SessionBaseType,\n SessionApiT extends object = UI.EmptyObject,\n UIActionsT extends UI.ActionListType<UI.SessionItemBase> = UI.EmptyObject\n> extends Pick<SessionLayoutProps<SessionT, SessionApiT, UIActionsT>, 'unreadInfoStore'> {\n newButton: React.ReactElement<any> | null;\n listActionMenuGetter: () => React.ReactNode;\n sessionMenuItems: React.ReactNode[];\n //closeAction: UI.SessionActions<SessionT, ActionT>['removeSession'];\n activeItem: SessionT | null;\n\n itemHeaderTitle: React.ReactNode;\n itemHeaderDescription: React.ReactNode;\n itemHeaderIcon: IconType;\n onKeyDown: (event: React.KeyboardEvent) => void;\n children: React.ReactNode;\n\n //moduleId: string;\n actions: SessionLayoutProps<SessionT, SessionApiT, UIActionsT>['uiActions'];\n t: UI.TranslateF;\n}\n\ninterface State<SessionT extends SessionBaseType> {\n activeItem: SessionT | null;\n}\n\nexport type SessionChildProps<\n SessionT extends SessionBaseType,\n SessionApiT extends object = UI.EmptyObject,\n UIActionsT extends UI.ActionListType<UI.SessionItemBase> = UI.EmptyObject\n> = Pick<\n SessionLayoutProps<SessionT, SessionApiT, UIActionsT>,\n 'location' | 'sessionApi' | 'uiActions'\n> & {\n session: SessionT;\n sessionT: UI.ModuleTranslator;\n};\n\nexport interface NewSessionLayoutProps extends RouteComponentProps {\n sessionT: UI.ModuleTranslator;\n}\n\nclass SessionLayout<\n SessionT extends SessionBaseType,\n SessionApiT extends object,\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>\n> extends React.Component<\n SessionLayoutProps<SessionT, SessionApiT, UIActionsT>,\n State<SessionT>\n> {\n static displayName = 'SessionLayout';\n\n static propTypes = {\n // Unique ID of the section (used for storing and loading the previously open tab)\n baseUrl: PropTypes.string.isRequired,\n\n // Location object\n location: PropTypes.object.isRequired,\n\n // Array of the items to list\n items: PropTypes.array.isRequired,\n\n // If no function is supplied, the item name will be used\n itemHeaderTitleGetter: PropTypes.func,\n\n // Function receiving an item object that returns the description (subheader) of the item\n itemHeaderDescriptionGetter: PropTypes.func.isRequired,\n\n // Function receiving an item object that returns icon for a item\n itemHeaderIconGetter: PropTypes.func.isRequired,\n\n // Store containing information about unread items\n unreadInfoStore: PropTypes.object,\n\n // Function receiving an item object that returns the display name\n itemNameGetter: PropTypes.func.isRequired,\n\n // Function receiving the circular color label in front of the item\n itemStatusGetter: PropTypes.func,\n\n // Session actions (should contain 'removeSession')\n uiActions: PropTypes.object.isRequired,\n\n // Session actions to show in the action menu\n actionIds: PropTypes.array,\n\n // Item ID that is currently active (if any)\n activeId: PropTypes.any,\n\n // Label for button that opens a new session\n newCaption: PropTypes.any,\n\n // Label for button that opens a new session\n newDescription: PropTypes.any,\n\n // Label for button that opens a new session\n newIcon: PropTypes.any,\n\n // Set to false if the side menu should never be shown (the session will use all width that is available)\n disableSideMenu: PropTypes.bool,\n\n // AccessConstant defining whether the user has edit permission\n editAccess: PropTypes.string.isRequired,\n\n sessionItemLayout: PropTypes.any.isRequired,\n\n newLayout: PropTypes.func,\n };\n\n state: State<SessionT> = {\n activeItem: null,\n };\n\n static contextType = LayoutWidthContext;\n context: LayoutWidthContextType;\n\n // HELPERS\n getSessionUrl = (id: API.IdType) => {\n invariant(!!id, 'Trying to get session URL without a session');\n return `/${this.props.baseUrl}/session/${id}`;\n };\n\n getNewUrl = () => {\n return `/${this.props.baseUrl}/new`;\n };\n\n getStorageKey = (props: SessionLayoutProps<SessionT, SessionApiT, UIActionsT>) => {\n return `${props.baseUrl}_last_active`;\n };\n\n pushSession = (id: API.IdType) => {\n History.push(this.getSessionUrl(id));\n };\n\n replaceSession = (id: API.IdType) => {\n History.replace(this.getSessionUrl(id));\n };\n\n pushNew = () => {\n History.push(this.getNewUrl());\n };\n\n hasEditAccess = () => {\n return LoginStore.hasAccess(this.props.editAccess);\n };\n\n // LIFECYCLE/REACT\n UNSAFE_componentWillReceiveProps(\n nextProps: SessionLayoutProps<SessionT, SessionApiT, UIActionsT>\n ) {\n if (nextProps.location.pathname === this.getNewUrl()) {\n // Don't redirect to it if the \"new session\" layout is open\n if (this.state.activeItem) {\n this.setState({ activeItem: null });\n }\n return;\n }\n\n if (this.checkActiveItem(nextProps)) {\n // We got an item\n return;\n }\n\n // The old tab was closed or we didn't have any session before\n\n let newItemPos = 0;\n const oldItem = findItem(this.props.items, this.props.activeId);\n if (oldItem) {\n // Find the old position and use the item in that position (if possible)\n newItemPos = this.props.items.indexOf(oldItem);\n if (newItemPos === this.props.items.length - 1) {\n // The last item was removed\n newItemPos = newItemPos - 1;\n }\n }\n\n this.replaceSession(nextProps.items[newItemPos].id);\n }\n\n // Common logic for selecting the item to display (after mounting or session updates)\n // Returns true active item selection was handled\n // Returns false if the active item couldn't be selected but there are valid items to choose from by the caller\n checkActiveItem = (props: SessionLayoutProps<SessionT, SessionApiT, UIActionsT>) => {\n // Did we just create this session?\n const routerLocation = props.location;\n const pending =\n routerLocation.state && (routerLocation.state as SessionLocationState).pending;\n\n // Update the active item\n const activeItem = findItem(props.items, props.activeId);\n if (activeItem) {\n if (pending) {\n // Disable pending state\n History.replace({\n //path: routerLocation.pathname,\n state: {\n pending: false,\n },\n });\n\n return true;\n }\n\n this.setState({ activeItem: activeItem });\n saveLocalProperty(this.getStorageKey(props), props.activeId);\n return true;\n } else if (pending) {\n // We'll just display a loading indicator in 'render', no item needed\n return true;\n } else if (/*routerLocation.action === 'POP' ||*/ props.items.length === 0) {\n // Browsing from history and item removed (or all items removed)... go to \"new session\" page\n History.replace(this.getNewUrl());\n this.setState({ activeItem: null });\n return true;\n }\n\n return false;\n };\n\n onKeyDown = (event: React.KeyboardEvent) => {\n const { key, altKey } = event;\n\n if (altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n // Arrow up/down\n event.preventDefault();\n\n const { items, activeId } = this.props;\n const item = findItem(items, activeId);\n if (!item) {\n return;\n }\n\n const currentIndex = items.indexOf(item);\n if (currentIndex === -1) {\n return;\n }\n\n const newSession = items[key === 'ArrowUp' ? currentIndex - 1 : currentIndex + 1];\n if (newSession) {\n this.pushSession(newSession.id);\n }\n } else if (altKey && key === 'Insert') {\n // Insert\n event.preventDefault();\n\n History.replace(this.getNewUrl());\n } else if (altKey && key === 'Delete') {\n // Delete\n event.preventDefault();\n\n const { items, activeId, sessionApi } = this.props;\n const item = findItem(items, activeId);\n if (!!item) {\n sessionApi.removeSession(item);\n }\n }\n };\n\n componentDidMount() {\n // Opening an item directly? Or no items?\n if (this.checkActiveItem(this.props)) {\n return;\n }\n\n // See if we have something stored\n const lastId = loadLocalProperty<API.IdType>(this.getStorageKey(this.props));\n if (lastId && findItem(this.props.items, lastId)) {\n // Previous session exists\n this.replaceSession(lastId);\n } else if (this.props.items.length > 0) {\n // Load the first session\n this.replaceSession(this.props.items[0].id);\n }\n }\n\n // COMPONENT GETTERS\n getItemStatus = (sessionItem: SessionT) => {\n const { itemStatusGetter, itemHeaderIconGetter } = this.props;\n if (itemStatusGetter) {\n return (\n <div\n className={\n 'ui session-status empty circular left mini label ' +\n itemStatusGetter(sessionItem)\n }\n />\n );\n }\n\n return <Icon icon={itemHeaderIconGetter(sessionItem)} />;\n };\n\n getSessionMenuItem = (sessionItem: SessionT) => {\n return (\n <SessionMenuItem\n key={sessionItem.id}\n url={this.getSessionUrl(sessionItem.id)}\n name={this.props.itemNameGetter(sessionItem)}\n unreadInfoStore={this.props.unreadInfoStore}\n status={this.getItemStatus(sessionItem)}\n sessionItem={sessionItem}\n pushSession={this.pushSession}\n />\n );\n };\n\n getItemHeaderTitle = () => {\n const { uiActions, actionIds, itemNameGetter, itemHeaderTitleGetter } = this.props;\n\n const { activeItem } = this.state;\n if (!activeItem) {\n return <div>{this.props.newCaption}</div>;\n }\n\n let ids;\n if (actionIds) {\n ids = [...actionIds, 'divider', 'removeSession'];\n }\n\n const actionMenu = (\n <ActionMenu\n caption={itemNameGetter(activeItem)}\n actions={uiActions}\n itemData={activeItem}\n ids={ids}\n />\n );\n\n // Use the header getter only if there is a getter that returns a valid value\n if (itemHeaderTitleGetter) {\n const header = itemHeaderTitleGetter(activeItem, this.props.location, actionMenu);\n if (header) {\n return header;\n }\n }\n\n return actionMenu;\n };\n\n getItemHeaderDescription = () => {\n const { activeItem } = this.state;\n const { itemHeaderDescriptionGetter, newDescription } = this.props;\n if (!activeItem) {\n return newDescription;\n }\n\n return itemHeaderDescriptionGetter(activeItem);\n };\n\n getItemHeaderIcon = () => {\n const { activeItem } = this.state;\n const { itemHeaderIconGetter, newIcon } = this.props;\n return <Icon icon={activeItem ? itemHeaderIconGetter(activeItem) : newIcon} />;\n };\n\n getNewButton = () => {\n if (!this.hasEditAccess() || !this.props.newCaption) {\n return null;\n }\n\n return (\n <SessionNewButton\n key=\"new-button\"\n title={this.props.newCaption}\n url={this.getNewUrl()}\n pushNew={this.pushNew}\n />\n );\n };\n\n handleCloseAll = () => {\n const { sessionApi, items } = this.props;\n items.forEach((session) => sessionApi.removeSession(session));\n };\n\n getListActionMenu = () => {\n const { items, t } = this.props;\n if (!this.hasEditAccess() || items.length === 0) {\n return null;\n }\n\n return (\n <MenuItemLink key=\"close\" onClick={this.handleCloseAll} icon={IconConstants.REMOVE}>\n {translate('Close all', t, UI.Modules.COMMON)}\n </MenuItemLink>\n );\n };\n\n sessionT = getModuleT(this.props.t, this.props.uiActions.moduleId);\n render() {\n const {\n disableSideMenu,\n /*width,*/ items,\n unreadInfoStore,\n location,\n t,\n sessionApi,\n uiActions,\n newLayout: NewLayout,\n sessionItemLayout: SessionItemLayout,\n activeId,\n } = this.props;\n\n if (!this.hasEditAccess() && items.length === 0) {\n // Nothing to show\n return (\n <Message\n title={translate('No items to show', t, UI.Modules.COMMON)}\n description={t<string>(\n toI18nKey('noSessionEditAccess', UI.Modules.COMMON),\n `You aren't allowed to open new sessions`\n )}\n />\n );\n }\n\n const { activeItem } = this.state;\n const useTopMenu = disableSideMenu || useMobileLayout(this.context);\n\n const Component = useTopMenu ? TopMenuLayout : SideMenuLayout;\n return (\n <Component\n itemHeaderTitle={this.getItemHeaderTitle()}\n itemHeaderDescription={this.getItemHeaderDescription()}\n itemHeaderIcon={this.getItemHeaderIcon()}\n activeItem={activeItem}\n unreadInfoStore={unreadInfoStore}\n //closeAction={ actions.actions.removeSession }\n newButton={this.getNewButton()}\n sessionMenuItems={items.map(this.getSessionMenuItem)}\n listActionMenuGetter={this.getListActionMenu}\n onKeyDown={this.onKeyDown}\n //moduleId={ actions.moduleId }\n actions={uiActions}\n t={t}\n >\n <Route\n path={this.getSessionUrl(':id')}\n render={(props) => {\n if (!activeItem) {\n const { state } = this.props.location;\n if (!!state && (state as SessionLocationState).pending) {\n // The session was just created\n return (\n <Loader\n text={translate('Waiting for server response', t, UI.Modules.COMMON)}\n />\n );\n } else if (activeId || items.length !== 0) {\n // Redirecting to a new page\n return (\n <Loader text={translate('Loading session', t, UI.Modules.COMMON)} />\n );\n }\n\n console.error('SessionLayout route: active session missing');\n return;\n }\n\n // We have a session\n return (\n <SessionItemLayout\n session={activeItem}\n sessionApi={sessionApi}\n uiActions={uiActions}\n location={location}\n sessionT={this.sessionT}\n />\n );\n }}\n />\n {!!NewLayout && (\n <Route\n path={this.getNewUrl()}\n render={(props) => <NewLayout {...props} sessionT={this.sessionT} />}\n />\n )}\n </Component>\n );\n }\n}\n\nexport default SessionLayout;\n","import * as React from 'react';\n\nimport Loader from 'components/semantic/Loader';\nimport { useStore } from 'effects/StoreListenerEffect';\n\nimport * as UI from 'types/ui';\n\nimport { useTranslation } from 'react-i18next';\nimport { translate } from 'utils/TranslationUtils';\n\nexport type SessionProviderDecoratorProps = UI.SessionRouteProps;\n\nexport interface SessionProviderDecoratorChildProps<SessionT extends UI.SessionType>\n extends UI.SessionRouteProps {\n items: SessionT[];\n t: UI.TranslateF;\n}\n\nconst SessionProviderDecorator = <SessionT extends UI.SessionType, PropsT extends object>(\n Component: React.ComponentType<PropsT & SessionProviderDecoratorChildProps<SessionT>>,\n store: UI.SessionStore<SessionT>\n) => {\n const Decorator = (props: SessionProviderDecoratorProps & PropsT) => {\n const { t } = useTranslation();\n const sessions = useStore<SessionT[]>(store);\n if (!store.isInitialized()) {\n return <Loader text={translate('Loading sessions', t, UI.Modules.COMMON)} />;\n }\n\n return <Component items={sessions} t={t} {...props} />;\n };\n\n return Decorator;\n};\n\nexport { SessionProviderDecorator };\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":""}