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
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[557],{75696:(e,t,r)=>{r.d(t,{Z:()=>a});var i=r(87537),o=r.n(i),n=r(23645),s=r.n(n)()(o());s.push([e.id,".share-directory .Select {\r\n margin-bottom: 0px;\r\n}\r\n","",{version:3,sources:["webpack://./src/routes/Share/style.css"],names:[],mappings:"AAAA;EACE,kBAAkB;AACpB",sourcesContent:[".share-directory .Select {\r\n margin-bottom: 0px;\r\n}\r\n"],sourceRoot:""}]);const a=s},29416:(e,t,r)=>{r.d(t,{Z:()=>l});var i=r(518),o=r(4047),n=r(48117),s=r(76249),a=r(32347);const c={refresh:{displayName:"Refresh all",access:s.PS.SETTINGS_EDIT,icon:n.Z.REFRESH_COLORED,handler:()=>i.Z.post(o.Z.REFRESH_URL)}},l={moduleId:a.jv.SHARE,actions:c}},82633:(e,t,r)=>{r.d(t,{Z:()=>o});const i="share_profiles",o={MODULE_URL:i,PROFILES_URL:i,PROFILE_ADDED:"share_profile_added",PROFILE_UPDATED:"share_profile_updated",PROFILE_REMOVED:"share_profile_removed",HIDDEN_PROFILE_ID:1}},37354:(e,t,r)=>{r.d(t,{Z:()=>n});var i=r(85893),o=r(67294);function n(e,t=60){class r extends o.Component{constructor(){super(...arguments),this.scheduleComponentRefresh=()=>{this.redrawTimeout=window.setTimeout((()=>{this.forceUpdate(),this.scheduleComponentRefresh()}),1e3*t)}}componentDidMount(){this.scheduleComponentRefresh()}componentWillUnmount(){clearTimeout(this.redrawTimeout)}render(){return(0,i.jsx)(e,Object.assign({},this.props))}}return r}},75426:(e,t,r)=>{r.d(t,{D:()=>a,Z:()=>c});var i=r(96486),o=r(82633),n=r(42090),s=r(2445);const a=e=>({id:e.id,name:e.str}),c=function(e,t,r,a=!0){return(0,n.Z)(e,(0,i.merge)(r,{urls:{profiles:o.Z.PROFILES_URL},dataConverters:{profiles:(e,{t:r})=>{const i=e.filter((e=>t||e.id!==o.Z.HIDDEN_PROFILE_ID)).map((e=>((e,t)=>{let r=e.str;return a&&e.id!==o.Z.HIDDEN_PROFILE_ID&&(r+=` (${(0,s.BU)(e.size,t)})`),Object.assign(Object.assign({},e),{str:r})})(e,r)));return i}},onSocketConnected:(e,{refetchData:t})=>{e(o.Z.MODULE_URL,o.Z.PROFILE_ADDED,(()=>t())),e(o.Z.MODULE_URL,o.Z.PROFILE_UPDATED,(()=>t())),e(o.Z.MODULE_URL,o.Z.PROFILE_REMOVED,(()=>t()))}}))}},24646:(e,t,r)=>{r.r(t),r.d(t,{default:()=>ye});var i=r(85893),o=r(67294),n=r(29416),s=r(518),a=r(20097);const c="share_roots",l=c,d=c;var h=r(48117),p=r(76249),u=r(32347);const m={create:{displayName:"Add directory",access:p.PS.SETTINGS_EDIT,icon:h.Z.CREATE,handler:({location:e})=>{a.Z.push(`${e.pathname}/directories`)}}},f={edit:{displayName:"Edit directory",access:p.PS.SETTINGS_EDIT,icon:h.Z.EDIT,handler:({data:e,location:t})=>{a.Z.push(`${t.pathname}/directories/${e.id}`)}},remove:{displayName:"Remove directory",access:p.PS.SETTINGS_EDIT,icon:h.Z.REMOVE,confirmation:{content:"Are you sure that you want to remove the directory {{item.virtual_name}} from share? It will be removed from all share profiles.",approveCaption:"Remove directory",rejectCaption:"Don't remove"},handler:({data:e})=>s.Z.delete(d+"/"+e.id)}},E={create:{moduleId:u.jv.SHARE,subId:"root",actions:m},edit:{moduleId:u.jv.SHARE,subId:"root",actions:f}};var y=r(10293),v=r.n(y),Z=r(93836);const _=v().createStore({_viewName:"share_root_view",_apiUrl:l,mixins:[(0,Z.Z)("path")]});var R=r(78230),O=r(68126),S=r(35108),g=r(28427),I=r(4047),D=r(92245),j=r(75426),x=r(27695),T=r(18758),w=r(9781),b=r(43496),A=r(91894),L=r(61692),C=r(93379),P=r.n(C),N=r(7795),F=r.n(N),U=r(90569),H=r.n(U),k=r(3565),$=r.n(k),G=r(19216),M=r.n(G),K=r(44589),z=r.n(K),B=r(75696),V={};V.styleTagTransform=z(),V.setAttributes=$(),V.insert=H().bind(null,"head"),V.domAPI=F(),V.insertStyleElement=M(),P()(B.Z,V),B.Z&&B.Z.locals&&B.Z.locals;var Y=r(18603),W=r(91072);const q=[{key:"path",title:"Path",type:p.Y2.DIRECTORY_PATH},{key:"virtual_name",title:"Virtual name",type:p.Y2.STRING,help:"Directories with identical virtual names will be merged in filelist"},{key:"profiles",type:p.Y2.LIST,item_type:p.Y2.NUMBER,title:"Share profiles",help:"New share profiles can be created from application settings"},{key:"incoming",title:"Incoming",type:p.Y2.BOOLEAN}];class X extends o.Component{constructor(e){super(e),this.isNew=()=>!this.props.rootEntry,this.onFieldChanged=(e,t,r)=>{if(e.includes("path")){const e={virtual_name:t.path?(0,w.HD)(t.path):void 0};return Promise.resolve(e)}return null},this.save=()=>this.form.save(),this.onSave=e=>this.isNew()?s.Z.post(d,e):s.Z.patch(`${d}/${this.props.rootEntry.id}`,e),this.onFieldSetting=(e,t,r)=>{"path"===e?(t.disabled=!this.isNew(),t.config=Object.assign({}||t.config,{historyId:A.Z.LOCATION_DOWNLOAD})):"virtual_name"===e&&(t.factory=T.ZP.form.Textbox,t.template=L.Lt,t.config={suggestionGetter:()=>this.props.virtualNames})},this.fieldDefinitions=(0,Y.rv)(q,e.shareT);const t=this.fieldDefinitions.find((e=>"profiles"===e.key));Object.assign(t,{options:e.profiles.map(j.D),default_value:[e.profiles.find((e=>e.default)).id]})}render(){const e=this.props,{rootEntry:t,shareT:r}=e,o=function(e,t){var r={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(r[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(i=Object.getOwnPropertySymbols(e);o<i.length;o++)t.indexOf(i[o])<0&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(r[i[o]]=e[i[o]])}return r}(e,["rootEntry","shareT"]),n=r.translate(this.isNew()?"Add share directory":"Edit share directory");return(0,i.jsxs)(g.Z,Object.assign({className:"share-directory",title:n,onApprove:this.save,closable:!1,icon:h.Z.FOLDER},o,{children:[(0,i.jsx)(x.Z,{title:r.translate("Hashing information"),icon:h.Z.INFO,description:(0,i.jsx)(W.cC,Object.assign({i18nKey:r.toI18nKey("hashingInformationDesc")},{children:(0,i.jsx)("p",{children:"New files will appear in share only after they have finished hashing (the client has calculated checksums for them). Information about hashing progress will be posted to the event log."})}))}),(0,i.jsx)(b.Z,{ref:e=>this.form=e,fieldDefinitions:this.fieldDefinitions,onFieldChanged:this.onFieldChanged,onFieldSetting:this.onFieldSetting,onSave:this.onSave,sourceValue:t,location:this.props.location})]}))}}X.displayName="ShareDirectoryDialog";const J=(0,D.ZP)((0,j.Z)(X,!1,{urls:{virtualNames:I.Z.GROUPED_ROOTS_GET_URL,rootEntry:({match:e},t)=>e.params.directoryId?t.get(`${d}/${e.params.directoryId}`):Promise.resolve(void 0)},dataConverters:{virtualNames:e=>e.map((e=>e.name),[])}}),"directories/:directoryId([0-9A-Z]{39})?");var Q=r(1059),ee=r(99005),te=r(98374),re=r(16630),ie=r(8717);const oe=(0,o.memo)((function(e){const{t}=(0,W.$G)(),r={str:(0,ie.Iu)("All profiles",t,"table.filter"),id:null},[n,s]=(0,o.useState)(r),a=t=>{e.onFilterUpdated(t.id),s(t)};return(0,i.jsx)(Q.Z,Object.assign({className:"top right pointing",caption:n.str,triggerIcon:"filter",button:!0},{children:(0,i.jsx)(ee.Z,Object.assign({caption:(0,ie.Iu)("Filter by profile",t,"table.filter"),icon:h.Z.FILTER},{children:[r,...e.profiles].map((e=>((e,t,r)=>(0,i.jsx)(te.Z,Object.assign({active:r.id===e.id,onClick:()=>t(e)},{children:e.str}),e.id))(e,a,n)))}))}))})),ne=(0,j.Z)((0,re.Z)(oe,"profiles"),!1);var se=r(84613),ae=r(37354),ce=r(2445),le=r(54883),de=r(74225),he=r(89519),pe=r(35936);const ue=(0,ae.Z)((({rowDataGetter:e,cellData:t,t:r})=>{const o=e().status;return o.id!==p.MH.NORMAL?(0,i.jsxs)("div",Object.assign({style:{display:"flex"}},{children:[(0,i.jsx)(pe.Z,{icon:h.Z.CANCEL,color:"red",size:"large",onClick:()=>{const t=e().status.refresh_task_id;t&&(0,he.h9)((()=>(0,de.Ki)(t)),r)}}),(0,i.jsx)(le.Z,{size:"small",inline:!0,text:o.str})]})):(0,i.jsxs)("div",{children:[(0,i.jsx)(pe.Z,{icon:h.Z.REFRESH_COLORED,size:"large",onClick:()=>(0,he.h9)((()=>(0,de._L)([e().path])),r)}),0===t?(0,ie.Iu)("Unknown",r,u.jv.SHARE):(0,ce.SY)(t)]})}));var me=r(66883),fe=r(4333);class Ee extends o.Component{constructor(){super(...arguments),this.shareT=(0,ie.HY)(this.props.t,u.jv.SHARE)}render(){const{translate:e}=this.shareT,t=me.Z.hasAccess(p.PS.SETTINGS_EDIT);return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(R.Z,Object.assign({store:_,customFilter:ne,footerData:(0,i.jsx)(se.PC,Object.assign({className:"top left pointing",caption:e("Actions..."),actions:E.create,header:e("Share actions"),triggerIcon:"chevron up",ids:["create"],button:!0},{children:(0,i.jsx)(se.PC,{actions:n.Z,ids:["refresh"]})})),moduleId:n.Z.moduleId},{children:[(0,i.jsx)(S.Column,{name:"Path",width:200,columnKey:"path",cell:(0,i.jsx)(O.Nq,{actions:E.edit,remoteMenuId:fe.Z.SHARE_ROOT}),flexGrow:10}),(0,i.jsx)(S.Column,{name:"Size",width:60,columnKey:"size",cell:(0,i.jsx)(O.Eh,{}),flexGrow:2}),(0,i.jsx)(S.Column,{name:"Content",width:150,columnKey:"type",hideWidth:1e3}),(0,i.jsx)(S.Column,{name:"Virtual name",width:120,columnKey:"virtual_name",flexGrow:5}),(0,i.jsx)(S.Column,{name:"Profiles",width:65,columnKey:"profiles"}),(0,i.jsx)(S.Column,{name:"Last refreshed",width:80,flexGrow:3,columnKey:"last_refresh_time",cell:t?(0,i.jsx)(ue,{}):(0,i.jsx)(O.Ks,{})})]})),(0,i.jsx)(J,{shareT:this.shareT})]})}}Ee.displayName="Share";const ye=(0,W.Zh)()(Ee)},34698:(e,t,r)=>{r.d(t,{S:()=>s,b:()=>a});var i=r(66883),o=r(37576),n=function(e,t,r,i){return new(r||(r=Promise))((function(o,n){function s(e){try{c(i.next(e))}catch(e){n(e)}}function a(e){try{c(i.throw(e))}catch(e){n(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,a)}c((i=i.apply(e,t||[])).next())}))};const s=e=>n(void 0,void 0,void 0,(function*(){try{return(yield(0,o.r)(`${getBasePath()}temp`,{method:"POST",headers:{"X-Authorization":i.Z.authToken,Authorization:i.Z.authToken},body:e})).headers.get("Location")}catch(e){throw e}})),a=(e,t,r)=>n(void 0,void 0,void 0,(function*(){try{const n=yield(0,o.r)((e=>`${window.location.origin}${getBasePath()}proxy?url=${encodeURIComponent(e)}`)(e),Object.assign({headers:{"X-Authorization":i.Z.authToken,"Cache-Control":"no-store, must-revalidate, max-age=0"}},r));return(yield t)?n.json():n.text()}catch(t){throw console.error(`CORS HTTP request failed (${e})`,t),t}}))},74225:(e,t,r)=>{r.d(t,{Ki:()=>d,Pd:()=>a,_L:()=>c,u4:()=>l});var i=r(4047),o=r(518),n=r(34698),s=r(76249);const a=(e,t,r)=>{return s=void 0,a=void 0,l=function*(){try{const s=yield(0,n.S)(e);return yield o.Z.post(i.Z.TEMP_SHARES_URL,{name:e.name,file_id:s,hub_url:t,cid:r})}catch(e){throw e}},new((c=void 0)||(c=Promise))((function(e,t){function r(e){try{o(l.next(e))}catch(e){t(e)}}function i(e){try{o(l.throw(e))}catch(e){t(e)}}function o(t){var o;t.done?e(t.value):(o=t.value,o instanceof c?o:new c((function(e){e(o)}))).then(r,i)}o((l=l.apply(s,a||[])).next())}));var s,a,c,l},c=e=>o.Z.post(i.Z.REFRESH_PATHS_URL,{paths:e,priority:s.VL.MANUAL}),l=e=>o.Z.post(i.Z.REFRESH_VIRTUAL_URL,{path:e}),d=e=>o.Z.delete(`${i.Z.REFRESH_TASKS_URL}/${e}`)}}]);
2
+ //# sourceMappingURL=share.d66035dc828b2f3c8bb0.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/share.d66035dc828b2f3c8bb0.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Share/style.css","webpack://airdcpp-webui/./src/actions/ui/ShareActions.ts","webpack://airdcpp-webui/./src/constants/ShareProfileConstants.ts","webpack://airdcpp-webui/./src/decorators/RedrawDecorator.tsx","webpack://airdcpp-webui/./src/decorators/ShareProfileDecorator.tsx","webpack://airdcpp-webui/./src/constants/ShareRootConstants.ts","webpack://airdcpp-webui/./src/actions/ui/ShareRootActions.ts","webpack://airdcpp-webui/./src/stores/ShareRootStore.js","webpack://airdcpp-webui/./src/routes/Share/style.css?7048","webpack://airdcpp-webui/./src/routes/Share/components/ShareDirectoryDialog.tsx","webpack://airdcpp-webui/./src/components/table/ShareProfileFilter.tsx","webpack://airdcpp-webui/./src/routes/Share/components/RefreshCell.tsx","webpack://airdcpp-webui/./src/routes/Share/components/Share.tsx","webpack://airdcpp-webui/./src/services/HttpService.ts","webpack://airdcpp-webui/./src/services/api/ShareApi.ts"],"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, \".share-directory .Select {\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Share/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;AACpB\",\"sourcesContent\":[\".share-directory .Select {\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import SocketService from 'services/SocketService';\r\n\r\nimport ShareConstants from 'constants/ShareConstants';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nconst handleRefresh = () => {\r\n return SocketService.post(ShareConstants.REFRESH_URL);\r\n};\r\n\r\nconst ShareActions: UI.ActionListType<undefined> = {\r\n refresh: {\r\n displayName: 'Refresh all',\r\n access: API.AccessEnum.SETTINGS_EDIT,\r\n icon: IconConstants.REFRESH_COLORED,\r\n handler: handleRefresh,\r\n },\r\n};\r\n\r\nexport default {\r\n moduleId: UI.Modules.SHARE,\r\n actions: ShareActions,\r\n};\r\n","const MODULE_URL = 'share_profiles';\r\nexport default {\r\n MODULE_URL: MODULE_URL,\r\n PROFILES_URL: MODULE_URL,\r\n\r\n PROFILE_ADDED: 'share_profile_added',\r\n PROFILE_UPDATED: 'share_profile_updated',\r\n PROFILE_REMOVED: 'share_profile_removed',\r\n\r\n HIDDEN_PROFILE_ID: 1,\r\n};\r\n","import * as React from 'react';\r\n\r\nexport default function <PropsT>(\r\n Component: React.ComponentType<PropsT>,\r\n redrawIntervalSeconds = 60\r\n) {\r\n class RedrawDecorator extends React.Component<PropsT> {\r\n redrawTimeout: number | undefined;\r\n\r\n componentDidMount() {\r\n this.scheduleComponentRefresh();\r\n }\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.redrawTimeout);\r\n }\r\n\r\n scheduleComponentRefresh = () => {\r\n this.redrawTimeout = window.setTimeout(() => {\r\n this.forceUpdate();\r\n this.scheduleComponentRefresh();\r\n }, redrawIntervalSeconds * 1000);\r\n };\r\n\r\n render() {\r\n return <Component {...this.props} />;\r\n }\r\n }\r\n\r\n return RedrawDecorator;\r\n}\r\n","import * as React from 'react';\r\nimport { merge } from 'lodash';\r\n\r\nimport ShareProfileConstants from 'constants/ShareProfileConstants';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n DataProviderDecoratorSettings,\r\n DataConverter,\r\n} from 'decorators/DataProviderDecorator';\r\n\r\nimport { formatSize } from 'utils/ValueFormat';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\ninterface ShareProfileDecoratorDataProps {\r\n profiles: API.ShareProfile[];\r\n}\r\n\r\nexport const profileToEnumValue = (profile: API.ShareProfile) => {\r\n return {\r\n id: profile.id,\r\n name: profile.str,\r\n };\r\n};\r\n\r\nexport type ShareProfileDecoratorChildProps = DataProviderDecoratorChildProps &\r\n ShareProfileDecoratorDataProps;\r\n\r\nconst ShareProfileDecorator = function <PropsT extends object>(\r\n Component: React.ComponentType<PropsT & ShareProfileDecoratorChildProps>,\r\n listHidden: boolean,\r\n dataProviderDecoratorSettings?: DataProviderDecoratorSettings<\r\n PropsT,\r\n ShareProfileDecoratorDataProps\r\n >,\r\n addSize = true\r\n) {\r\n const convertProfile = (\r\n profile: API.ShareProfile,\r\n t: UI.TranslateF\r\n ): API.ShareProfile => {\r\n let str = profile.str;\r\n if (addSize && profile.id !== ShareProfileConstants.HIDDEN_PROFILE_ID) {\r\n str += ` (${formatSize(profile.size, t)})`;\r\n }\r\n\r\n return {\r\n ...profile,\r\n str,\r\n };\r\n };\r\n\r\n const convertProfiles: DataConverter<PropsT> = (data: API.ShareProfile[], { t }) => {\r\n const profiles = data\r\n .filter((p) => listHidden || p.id !== ShareProfileConstants.HIDDEN_PROFILE_ID)\r\n .map((p) => convertProfile(p, t));\r\n\r\n return profiles;\r\n };\r\n\r\n return DataProviderDecorator<PropsT, ShareProfileDecoratorDataProps>(\r\n Component,\r\n merge(dataProviderDecoratorSettings, {\r\n urls: {\r\n profiles: ShareProfileConstants.PROFILES_URL,\r\n },\r\n dataConverters: {\r\n profiles: convertProfiles,\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData }) => {\r\n addSocketListener(\r\n ShareProfileConstants.MODULE_URL,\r\n ShareProfileConstants.PROFILE_ADDED,\r\n () => refetchData()\r\n );\r\n addSocketListener(\r\n ShareProfileConstants.MODULE_URL,\r\n ShareProfileConstants.PROFILE_UPDATED,\r\n () => refetchData()\r\n );\r\n addSocketListener(\r\n ShareProfileConstants.MODULE_URL,\r\n ShareProfileConstants.PROFILE_REMOVED,\r\n () => refetchData()\r\n );\r\n },\r\n } as DataProviderDecoratorSettings<PropsT, ShareProfileDecoratorDataProps>)\r\n );\r\n};\r\n\r\nexport default ShareProfileDecorator;\r\n","const MODULE_URL = 'share_roots';\r\n\r\nexport default {\r\n MODULE_URL: MODULE_URL,\r\n ROOTS_URL: MODULE_URL,\r\n\r\n CREATED: 'share_root_created',\r\n UPDATED: 'share_root_updated',\r\n REMOVED: 'share_root_removed',\r\n};\r\n","import SocketService from 'services/SocketService';\r\nimport History from 'utils/History';\r\n\r\nimport ShareRootConstants from 'constants/ShareRootConstants';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nconst handleCreate: UI.ActionHandler<void> = ({ location }) => {\r\n History.push(`${location.pathname}/directories`);\r\n};\r\n\r\nconst handleEdit: UI.ActionHandler<API.ShareRootEntry> = ({ data: root, location }) => {\r\n History.push(`${location.pathname}/directories/${root.id}`);\r\n};\r\n\r\nconst handleRemove: UI.ActionHandler<API.ShareRootEntry> = ({ data: root }) => {\r\n return SocketService.delete(ShareRootConstants.ROOTS_URL + '/' + root.id);\r\n};\r\n\r\nconst ShareRootCreateActions: UI.ActionListType<undefined> = {\r\n create: {\r\n displayName: 'Add directory',\r\n access: API.AccessEnum.SETTINGS_EDIT,\r\n icon: IconConstants.CREATE,\r\n handler: handleCreate,\r\n },\r\n};\r\n\r\nconst ShareRootEditActions: UI.ActionListType<API.ShareRootEntry> = {\r\n edit: {\r\n displayName: 'Edit directory',\r\n access: API.AccessEnum.SETTINGS_EDIT,\r\n icon: IconConstants.EDIT,\r\n handler: handleEdit,\r\n },\r\n remove: {\r\n displayName: 'Remove directory',\r\n access: API.AccessEnum.SETTINGS_EDIT,\r\n icon: IconConstants.REMOVE,\r\n confirmation: {\r\n content:\r\n // eslint-disable-next-line max-len\r\n 'Are you sure that you want to remove the directory {{item.virtual_name}} from share? It will be removed from all share profiles.',\r\n approveCaption: 'Remove directory',\r\n rejectCaption: `Don't remove`,\r\n },\r\n handler: handleRemove,\r\n },\r\n};\r\n\r\nexport default {\r\n create: {\r\n moduleId: UI.Modules.SHARE,\r\n subId: 'root',\r\n actions: ShareRootCreateActions,\r\n },\r\n edit: {\r\n moduleId: UI.Modules.SHARE,\r\n subId: 'root',\r\n actions: ShareRootEditActions,\r\n },\r\n};\r\n","import Reflux from 'reflux';\r\n\r\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\r\nimport ShareRootConstants from 'constants/ShareRootConstants';\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'share_root_view',\r\n _apiUrl: ShareRootConstants.MODULE_URL,\r\n mixins: [ViewStoreMixin('path')],\r\n});\r\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./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 { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport ShareConstants from 'constants/ShareConstants';\r\nimport ShareRootConstants from 'constants/ShareRootConstants';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport ModalRouteDecorator, {\r\n ModalRouteDecoratorChildProps,\r\n} from 'decorators/ModalRouteDecorator';\r\n\r\nimport ShareProfileDecorator, {\r\n profileToEnumValue,\r\n ShareProfileDecoratorChildProps,\r\n} from 'decorators/ShareProfileDecorator';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport { getLastDirectory } from 'utils/FileUtils';\r\n\r\nimport Form, {\r\n FormSaveHandler,\r\n FormFieldSettingHandler,\r\n FormFieldChangeHandler,\r\n} from 'components/form/Form';\r\nimport FilesystemConstants from 'constants/FilesystemConstants';\r\nimport { AutoSuggestField } from 'components/form/fields';\r\n\r\nimport '../style.css';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { ShareRootEntryBase } from 'types/api';\r\nimport { translateForm } from 'utils/FormUtils';\r\nimport { Trans } from 'react-i18next';\r\n\r\nconst Fields: UI.FormFieldDefinition[] = [\r\n {\r\n key: 'path',\r\n title: 'Path',\r\n type: API.SettingTypeEnum.DIRECTORY_PATH,\r\n },\r\n {\r\n key: 'virtual_name',\r\n title: 'Virtual name',\r\n type: API.SettingTypeEnum.STRING,\r\n help: 'Directories with identical virtual names will be merged in filelist',\r\n },\r\n {\r\n key: 'profiles',\r\n type: API.SettingTypeEnum.LIST,\r\n item_type: API.SettingTypeEnum.NUMBER,\r\n title: 'Share profiles',\r\n help: 'New share profiles can be created from application settings',\r\n },\r\n {\r\n key: 'incoming',\r\n title: 'Incoming',\r\n type: API.SettingTypeEnum.BOOLEAN,\r\n },\r\n];\r\n\r\nexport interface ShareDirectoryDialogProps {\r\n shareT: UI.ModuleTranslator;\r\n}\r\n\r\nexport interface DataProps extends ShareProfileDecoratorChildProps {\r\n virtualNames: string[];\r\n rootEntry?: API.ShareRootEntryBase;\r\n}\r\n\r\ninterface Entry extends ShareRootEntryBase, UI.FormValueMap {}\r\n\r\ninterface RouteProps {\r\n directoryId: string;\r\n}\r\n\r\ntype Props = ShareDirectoryDialogProps &\r\n DataProps &\r\n ModalRouteDecoratorChildProps<RouteProps>;\r\n\r\nclass ShareDirectoryDialog extends Component<Props> {\r\n static displayName = 'ShareDirectoryDialog';\r\n\r\n fieldDefinitions: UI.FormFieldDefinition[];\r\n form: Form<Entry>;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n\r\n this.fieldDefinitions = translateForm(Fields, props.shareT);\r\n\r\n // Share profiles shouldn't be translated...\r\n const shareProfileDefinitions = this.fieldDefinitions.find(\r\n (def) => def.key === 'profiles'\r\n )!;\r\n Object.assign(shareProfileDefinitions, {\r\n options: props.profiles.map(profileToEnumValue),\r\n default_value: [props.profiles.find((profile) => profile.default)!.id],\r\n });\r\n }\r\n\r\n isNew = () => {\r\n return !this.props.rootEntry;\r\n };\r\n\r\n onFieldChanged: FormFieldChangeHandler<Entry> = (id, value, hasChanges) => {\r\n if (id.includes('path')) {\r\n const mergeFields = {\r\n virtual_name: !!value.path ? getLastDirectory(value.path) : undefined,\r\n };\r\n\r\n return Promise.resolve(mergeFields);\r\n }\r\n\r\n return null;\r\n };\r\n\r\n save = () => {\r\n return this.form.save();\r\n };\r\n\r\n onSave: FormSaveHandler<Entry> = (changedFields) => {\r\n if (this.isNew()) {\r\n return SocketService.post(ShareRootConstants.ROOTS_URL, changedFields);\r\n }\r\n\r\n return SocketService.patch(\r\n `${ShareRootConstants.ROOTS_URL}/${this.props.rootEntry!.id}`,\r\n changedFields\r\n );\r\n };\r\n\r\n onFieldSetting: FormFieldSettingHandler<Entry> = (id, fieldOptions, formValue) => {\r\n if (id === 'path') {\r\n fieldOptions.disabled = !this.isNew();\r\n fieldOptions.config = Object.assign({} || fieldOptions.config, {\r\n historyId: FilesystemConstants.LOCATION_DOWNLOAD,\r\n });\r\n } else if (id === 'virtual_name') {\r\n fieldOptions.factory = t.form.Textbox;\r\n fieldOptions.template = AutoSuggestField;\r\n fieldOptions.config = {\r\n suggestionGetter: () => this.props.virtualNames,\r\n };\r\n }\r\n };\r\n\r\n render() {\r\n const { rootEntry, shareT, ...other } = this.props;\r\n const title = shareT.translate(\r\n this.isNew() ? 'Add share directory' : 'Edit share directory'\r\n );\r\n return (\r\n <Modal\r\n className=\"share-directory\"\r\n title={title}\r\n onApprove={this.save}\r\n closable={false}\r\n icon={IconConstants.FOLDER}\r\n {...other}\r\n >\r\n <Message\r\n title={shareT.translate('Hashing information')}\r\n icon={IconConstants.INFO}\r\n description={\r\n <Trans i18nKey={shareT.toI18nKey('hashingInformationDesc')}>\r\n <p>\r\n New files will appear in share only after they have finished hashing (the\r\n client has calculated checksums for them). Information about hashing\r\n progress will be posted to the event log.\r\n </p>\r\n </Trans>\r\n }\r\n />\r\n <Form<Entry>\r\n ref={(c) => (this.form = c!)}\r\n fieldDefinitions={this.fieldDefinitions}\r\n onFieldChanged={this.onFieldChanged}\r\n onFieldSetting={this.onFieldSetting}\r\n onSave={this.onSave}\r\n sourceValue={rootEntry as Entry}\r\n location={this.props.location}\r\n />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nexport default ModalRouteDecorator<ShareDirectoryDialogProps, RouteProps>(\r\n ShareProfileDecorator<Omit<Props, keyof DataProps>>(ShareDirectoryDialog, false, {\r\n urls: {\r\n virtualNames: ShareConstants.GROUPED_ROOTS_GET_URL,\r\n rootEntry: ({ match }, socket) => {\r\n if (!match.params.directoryId) {\r\n return Promise.resolve(undefined);\r\n }\r\n\r\n return socket.get(`${ShareRootConstants.ROOTS_URL}/${match.params.directoryId}`);\r\n },\r\n },\r\n dataConverters: {\r\n virtualNames: (data: API.GroupedPath[]) => data.map((item) => item.name, []),\r\n },\r\n }),\r\n 'directories/:directoryId([0-9A-Z]{39})?'\r\n);\r\n","//import PropTypes from 'prop-types';\r\nimport { memo, useState } from 'react';\r\n\r\nimport SectionedDropdown from 'components/semantic/SectionedDropdown';\r\nimport MenuSection from 'components/semantic/MenuSection';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport ShareProfileDecorator, {\r\n ShareProfileDecoratorChildProps,\r\n} from 'decorators/ShareProfileDecorator';\r\nimport TableFilterDecorator, {\r\n TableFilterDecoratorChildProps,\r\n TableFilterDecoratorProps,\r\n} from 'decorators/TableFilterDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { useTranslation } from 'react-i18next';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\ninterface ShareProfileItem {\r\n id: null | number;\r\n str: string;\r\n}\r\n\r\nexport interface ShareProfileFilterProps {}\r\n\r\ntype Props = ShareProfileFilterProps &\r\n TableFilterDecoratorChildProps &\r\n ShareProfileDecoratorChildProps;\r\n\r\nconst getDropdownItem = (\r\n profile: ShareProfileItem,\r\n onClick: (p: ShareProfileItem) => void,\r\n selectedProfile: ShareProfileItem\r\n) => {\r\n return (\r\n <MenuItemLink\r\n key={profile.id as number}\r\n active={selectedProfile.id === profile.id}\r\n onClick={() => onClick(profile)}\r\n >\r\n {profile.str}\r\n </MenuItemLink>\r\n );\r\n};\r\n\r\nconst ShareProfileFilter = memo<Props>(function ShareProfileFilter(props) {\r\n const { t } = useTranslation();\r\n\r\n const defaultItem: ShareProfileItem = {\r\n str: translate('All profiles', t, 'table.filter'),\r\n id: null,\r\n };\r\n\r\n const [selectedProfile, setSelectedProfile] = useState<ShareProfileItem>(defaultItem);\r\n\r\n const onClick = (profile: API.ShareProfile) => {\r\n props.onFilterUpdated(profile.id);\r\n setSelectedProfile(profile);\r\n };\r\n\r\n return (\r\n <SectionedDropdown\r\n className=\"top right pointing\"\r\n caption={selectedProfile.str}\r\n triggerIcon=\"filter\"\r\n button={true}\r\n >\r\n <MenuSection\r\n caption={translate('Filter by profile', t, 'table.filter')}\r\n icon={IconConstants.FILTER}\r\n >\r\n {[defaultItem, ...props.profiles].map((p) =>\r\n getDropdownItem(p, onClick, selectedProfile)\r\n )}\r\n </MenuSection>\r\n </SectionedDropdown>\r\n );\r\n});\r\n\r\nexport default ShareProfileDecorator<ShareProfileFilterProps & TableFilterDecoratorProps>(\r\n TableFilterDecorator<ShareProfileFilterProps & ShareProfileDecoratorChildProps>(\r\n ShareProfileFilter,\r\n 'profiles'\r\n ),\r\n false\r\n);\r\n","import * as React from 'react';\r\n\r\nimport RedrawDecorator from 'decorators/RedrawDecorator';\r\nimport { formatRelativeTime } from 'utils/ValueFormat';\r\nimport Loader from 'components/semantic/Loader';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { abortRefreshTask, refreshPaths } from 'services/api/ShareApi';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport Icon from 'components/semantic/Icon';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\ninterface RefreshCellProps extends RowWrapperCellChildProps<number, API.ShareRootEntry> {}\r\n\r\nconst RefreshCell: React.FC<RefreshCellProps> = ({ rowDataGetter, cellData, t }) => {\r\n const state = rowDataGetter!().status;\r\n if (state.id !== API.ShareRootStatusEnum.NORMAL) {\r\n return (\r\n <div style={{ display: 'flex' }}>\r\n <Icon\r\n icon={IconConstants.CANCEL}\r\n color=\"red\"\r\n size=\"large\"\r\n onClick={() => {\r\n const refreshTaskId = rowDataGetter!().status.refresh_task_id;\r\n if (!!refreshTaskId) {\r\n runBackgroundSocketAction(() => abortRefreshTask(refreshTaskId), t!);\r\n }\r\n }}\r\n />\r\n <Loader size=\"small\" inline={true} text={state.str} />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div>\r\n <Icon\r\n icon={IconConstants.REFRESH_COLORED}\r\n size=\"large\"\r\n onClick={() =>\r\n runBackgroundSocketAction(() => refreshPaths([rowDataGetter!().path]), t!)\r\n }\r\n />\r\n {cellData === 0\r\n ? translate('Unknown', t!, UI.Modules.SHARE)\r\n : formatRelativeTime(cellData!)}\r\n </div>\r\n );\r\n};\r\n\r\nexport default RedrawDecorator(RefreshCell);\r\n","import { Component } from 'react';\r\n\r\nimport ShareActions from 'actions/ui/ShareActions';\r\nimport ShareRootActions from 'actions/ui/ShareRootActions';\r\nimport ShareRootStore from 'stores/ShareRootStore';\r\n\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport { SizeCell, DurationCell, FileActionCell } from 'components/table/Cell';\r\nimport { Column } from 'fixed-data-table-2';\r\n\r\nimport ShareDirectoryDialog from 'routes/Share/components/ShareDirectoryDialog';\r\nimport ShareProfileFilter from 'components/table/ShareProfileFilter';\r\n\r\nimport { ActionMenu } from 'components/action-menu';\r\nimport RefreshCell from 'routes/Share/components/RefreshCell';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { withTranslation, WithTranslation } from 'react-i18next';\r\nimport { getModuleT } from 'utils/TranslationUtils';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\nclass Share extends Component<WithTranslation> {\r\n static displayName = 'Share';\r\n\r\n shareT = getModuleT(this.props.t, UI.Modules.SHARE);\r\n render() {\r\n const { translate } = this.shareT;\r\n const editAccess = LoginStore.hasAccess(API.AccessEnum.SETTINGS_EDIT);\r\n return (\r\n <>\r\n <VirtualTable\r\n store={ShareRootStore}\r\n customFilter={ShareProfileFilter}\r\n footerData={\r\n <ActionMenu\r\n className=\"top left pointing\"\r\n caption={translate('Actions...')}\r\n actions={ShareRootActions.create}\r\n header={translate('Share actions')}\r\n triggerIcon=\"chevron up\"\r\n ids={['create']}\r\n button={true}\r\n >\r\n <ActionMenu actions={ShareActions} ids={['refresh']} />\r\n </ActionMenu>\r\n }\r\n moduleId={ShareActions.moduleId}\r\n >\r\n <Column\r\n name=\"Path\"\r\n width={200}\r\n columnKey=\"path\"\r\n cell={\r\n <FileActionCell\r\n actions={ShareRootActions.edit}\r\n remoteMenuId={MenuConstants.SHARE_ROOT}\r\n />\r\n }\r\n flexGrow={10}\r\n />\r\n <Column\r\n name=\"Size\"\r\n width={60}\r\n columnKey=\"size\"\r\n cell={<SizeCell />}\r\n flexGrow={2}\r\n />\r\n <Column name=\"Content\" width={150} columnKey=\"type\" hideWidth={1000} />\r\n <Column\r\n name=\"Virtual name\"\r\n width={120}\r\n columnKey=\"virtual_name\"\r\n flexGrow={5}\r\n //hideWidth={600}\r\n />\r\n <Column name=\"Profiles\" width={65} columnKey=\"profiles\" />\r\n <Column\r\n name=\"Last refreshed\"\r\n width={80}\r\n flexGrow={3}\r\n columnKey=\"last_refresh_time\"\r\n cell={editAccess ? <RefreshCell /> : <DurationCell />}\r\n />\r\n </VirtualTable>\r\n <ShareDirectoryDialog shareT={this.shareT} />\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default withTranslation()(Share);\r\n","import LoginStore from 'stores/LoginStore';\r\nimport { fetchData } from 'utils/HttpUtils';\r\n\r\nexport const uploadTempFile = async (file: File): Promise<string> => {\r\n // eslint-disable-next-line no-useless-catch\r\n try {\r\n const res = await fetchData(`${getBasePath()}temp`, {\r\n method: 'POST',\r\n headers: {\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/330\r\n 'X-Authorization': LoginStore.authToken,\r\n\r\n Authorization: LoginStore.authToken,\r\n },\r\n body: file,\r\n });\r\n\r\n return res.headers.get('Location')!;\r\n } catch (e) {\r\n throw e;\r\n }\r\n};\r\n\r\nconst toCorsSafeUrl = (url: string) => {\r\n const proxyUrl = `${\r\n window.location.origin\r\n }${getBasePath()}proxy?url=${encodeURIComponent(url)}`;\r\n return proxyUrl;\r\n};\r\n\r\nexport const fetchCorsSafeData = async (\r\n url: string,\r\n isJSON: boolean,\r\n options?: RequestInit\r\n) => {\r\n try {\r\n //console.log(`CORS HTTP request started (${url})`);\r\n\r\n const res = await fetchData(toCorsSafeUrl(url), {\r\n headers: {\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/330\r\n 'X-Authorization': LoginStore.authToken,\r\n\r\n // Temp workaround for people upgrading from versions < 2.7.0\r\n // If the new UI was loaded before restarting the app, a cache expiration time of\r\n // one year would have been set for \"Not found\" errors...\r\n 'Cache-Control': 'no-store, must-revalidate, max-age=0',\r\n },\r\n ...options,\r\n });\r\n\r\n const data = (await isJSON) ? res.json() : res.text();\r\n return data;\r\n } catch (e) {\r\n console.error(`CORS HTTP request failed (${url})`, e);\r\n throw e;\r\n }\r\n};\r\n","import ShareConstants from 'constants/ShareConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport { uploadTempFile } from '../HttpService';\r\n\r\nimport * as API from 'types/api';\r\n\r\nexport interface AddTempShareResponse {\r\n magnet: string;\r\n}\r\n\r\nexport const shareTempFile = async (\r\n file: File,\r\n hubUrl: string,\r\n cid: string | undefined\r\n): Promise<AddTempShareResponse> => {\r\n // eslint-disable-next-line no-useless-catch\r\n try {\r\n const fileId = await uploadTempFile(file);\r\n const res = await SocketService.post<AddTempShareResponse>(\r\n ShareConstants.TEMP_SHARES_URL,\r\n {\r\n name: file.name,\r\n file_id: fileId,\r\n hub_url: hubUrl,\r\n cid,\r\n }\r\n );\r\n\r\n return res;\r\n } catch (e) {\r\n throw e;\r\n }\r\n};\r\n\r\nexport const refresh = (incoming: boolean) => {\r\n return SocketService.post(ShareConstants.REFRESH_URL, {\r\n incoming,\r\n priority: API.RefreshPriorityTypeEnum.MANUAL,\r\n });\r\n};\r\n\r\nexport const refreshPaths = (paths: string[]) => {\r\n return SocketService.post(ShareConstants.REFRESH_PATHS_URL, {\r\n paths,\r\n priority: API.RefreshPriorityTypeEnum.MANUAL,\r\n });\r\n};\r\n\r\nexport const refreshVirtual = (path: string) => {\r\n return SocketService.post(ShareConstants.REFRESH_VIRTUAL_URL, {\r\n path,\r\n });\r\n};\r\n\r\nexport const abortRefreshTask = (id: number) => {\r\n return SocketService.delete(`${ShareConstants.REFRESH_TASKS_URL}/${id}`);\r\n};\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","ShareActions","refresh","displayName","access","icon","handler","moduleId","actions","MODULE_URL","PROFILES_URL","PROFILE_ADDED","PROFILE_UPDATED","PROFILE_REMOVED","HIDDEN_PROFILE_ID","Component","redrawIntervalSeconds","RedrawDecorator","scheduleComponentRefresh","this","redrawTimeout","window","setTimeout","forceUpdate","componentDidMount","componentWillUnmount","clearTimeout","render","props","profileToEnumValue","profile","name","str","listHidden","dataProviderDecoratorSettings","addSize","merge","urls","profiles","dataConverters","data","t","filter","p","map","size","convertProfile","onSocketConnected","addSocketListener","refetchData","ShareRootCreateActions","create","IconConstants","location","History","pathname","ShareRootEditActions","edit","root","remove","confirmation","content","approveCaption","rejectCaption","SocketService","ShareRootConstants","subId","_viewName","_apiUrl","mixins","ViewStoreMixin","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","Fields","key","title","type","help","item_type","ShareDirectoryDialog","constructor","super","isNew","rootEntry","onFieldChanged","value","hasChanges","includes","mergeFields","virtual_name","path","undefined","Promise","resolve","save","form","onSave","changedFields","onFieldSetting","fieldOptions","formValue","disabled","config","Object","assign","historyId","FilesystemConstants","factory","template","suggestionGetter","virtualNames","fieldDefinitions","shareT","shareProfileDefinitions","find","def","default_value","default","other","translate","Modal","className","onApprove","closable","Message","description","i18nKey","toI18nKey","Form","ref","c","sourceValue","ModalRouteDecorator","ShareProfileDecorator","ShareConstants","match","socket","params","directoryId","get","item","ShareProfileFilter","memo","defaultItem","selectedProfile","setSelectedProfile","useState","onClick","onFilterUpdated","SectionedDropdown","caption","triggerIcon","button","MenuSection","MenuItemLink","active","getDropdownItem","TableFilterDecorator","rowDataGetter","cellData","state","status","style","display","Icon","color","refreshTaskId","refresh_task_id","Loader","inline","text","Share","editAccess","LoginStore","VirtualTable","store","ShareRootStore","customFilter","footerData","ShareRootActions","header","ids","Column","width","columnKey","cell","remoteMenuId","MenuConstants","flexGrow","hideWidth","uploadTempFile","file","getBasePath","method","headers","Authorization","body","e","fetchCorsSafeData","url","isJSON","res","origin","encodeURIComponent","toCorsSafeUrl","json","console","error","shareTempFile","hubUrl","cid","fileId","file_id","hub_url","refreshPaths","paths","priority","refreshVirtual","abortRefreshTask"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[255],{4665:(n,r,t)=>{t.d(r,{Z:()=>a});var e=t(87537),s=t.n(e),i=t(23645),A=t.n(i)()(s());A.push([n.id,".simple-layout {\r\n height: 100%;\r\n padding: 20px;\r\n margin-left: auto;\r\n margin-right: auto;\r\n background-color: white;\r\n}\r\n\r\n.simple-layout > div {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n}\r\n\r\n.simple-layout .layout-content {\r\n display: flex;\r\n flex-direction: column;\r\n overflow-y: auto;\r\n flex: 1 1 100%;\r\n}\r\n\r\n.simple-layout .layout-content > div {\r\n width: 100%;\r\n}\r\n\r\n.simple-layout .divider.top {\r\n margin-bottom: 0px;\r\n}\r\n\r\n/* Message layout */\r\n.system-log .message-list {\r\n width: 100%;\r\n margin: 10px 0px !important;\r\n}\r\n\r\n.system-log .status.item i {\r\n float: left;\r\n}\r\n\r\n.system-log .status.item .text {\r\n margin-top: 5px;\r\n margin-bottom: 10px;\r\n overflow: hidden;\r\n}\r\n\r\n.system-log .status.item .time {\r\n color: gray;\r\n}\r\n\r\n.system-log .status.item .label {\r\n color: gray;\r\n margin-right: 3px;\r\n}\r\n","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Events/style.css"],names:[],mappings:"AAAA;EACE,YAAY;EACZ,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;AACd;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,kBAAkB;AACpB;;AAEA,mBAAmB;AACnB;EACE,WAAW;EACX,2BAA2B;AAC7B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,eAAe;EACf,mBAAmB;EACnB,gBAAgB;AAClB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,WAAW;EACX,iBAAiB;AACnB",sourcesContent:[".simple-layout {\r\n height: 100%;\r\n padding: 20px;\r\n margin-left: auto;\r\n margin-right: auto;\r\n background-color: white;\r\n}\r\n\r\n.simple-layout > div {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n}\r\n\r\n.simple-layout .layout-content {\r\n display: flex;\r\n flex-direction: column;\r\n overflow-y: auto;\r\n flex: 1 1 100%;\r\n}\r\n\r\n.simple-layout .layout-content > div {\r\n width: 100%;\r\n}\r\n\r\n.simple-layout .divider.top {\r\n margin-bottom: 0px;\r\n}\r\n\r\n/* Message layout */\r\n.system-log .message-list {\r\n width: 100%;\r\n margin: 10px 0px !important;\r\n}\r\n\r\n.system-log .status.item i {\r\n float: left;\r\n}\r\n\r\n.system-log .status.item .text {\r\n margin-top: 5px;\r\n margin-bottom: 10px;\r\n overflow: hidden;\r\n}\r\n\r\n.system-log .status.item .time {\r\n color: gray;\r\n}\r\n\r\n.system-log .status.item .label {\r\n color: gray;\r\n margin-right: 3px;\r\n}\r\n"],sourceRoot:""}]);const a=A},36290:(n,r,t)=>{t.r(r),t.d(r,{default:()=>_});var e=t(85893),s=t(67294),i=t(70923),A=t(61593),a=t(518),o=t(94897),l=t(32347),m=t(48117);const c={clear:{displayName:"Clear",access:o.Z.EVENTS_EDIT,icon:m.Z.CLEAR,handler:()=>a.Z.delete(A.Z.MESSAGES_URL)}},u={moduleId:l.jv.EVENTS,actions:c};var g=t(72582),E=t(91462),d=t(45807),p=t(93379),y=t.n(p),C=t(7795),x=t.n(C),B=t(90569),h=t.n(B),v=t(3565),f=t.n(v),b=t(19216),Z=t.n(b),j=t(44589),w=t.n(j),N=t(4665),k={};k.styleTagTransform=w(),k.setAttributes=f(),k.insert=h().bind(null,"head"),k.domAPI=x(),k.insertStyleElement=Z(),y()(N.Z,k),N.Z&&N.Z.locals&&N.Z.locals;var S=t(54883),W=t(27695),T=t(58317),I=t(8717);const V=({messages:n,t:r})=>n?0===n.length?(0,e.jsx)(W.Z,{description:(0,I.Iu)("No messages to show",r,l.jv.EVENTS)}):(0,e.jsx)(T.Z,{className:"events",messages:n,scrollPositionHandler:g.Z,t:r}):(0,e.jsx)(S.Z,{text:(0,I.Iu)("Loading messages",r,l.jv.EVENTS)});var O=t(92408),R=t(91072);const _=(0,s.memo)((function(){(0,s.useEffect)((()=>(i.Z.setActive(!0),i.Z.setRead(),g.Z.isInitialized()||i.Z.fetchMessages(),()=>i.Z.setActive(!1))),[]);const{t:n}=(0,R.$G)(),r=(0,O.o)(g.Z);return(0,e.jsx)("div",Object.assign({className:"simple-layout"},{children:(0,e.jsxs)("div",Object.assign({className:"wrapper"},{children:[(0,e.jsx)(E.Z,{icon:m.Z.EVENTS_COLORED,title:(0,I.Iu)("Events",n,l.jv.EVENTS),rightComponent:(0,e.jsx)(d.Z,{actions:u,actionId:"clear",icon:null})}),(0,e.jsx)("div",{className:"ui divider top"}),(0,e.jsx)("div",Object.assign({className:"layout-content system-log"},{children:(0,e.jsx)(V,{messages:r,t:n})}))]}))}))}),(()=>!0))}}]);
2
+ //# sourceMappingURL=system-log.b6bc274d7fb71714ca24.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/system-log.b6bc274d7fb71714ca24.chunk.js","mappings":"iKAGIA,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACC,EAAOC,GAAI,q8BAAs8B,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,0DAA0D,MAAQ,GAAG,SAAW,oYAAoY,eAAiB,CAAC,s8BAAs8B,WAAa,MAEn8E,S,0ICAO,MAAM,EAA6C,CACxDC,MAAO,CACLC,YAAa,QACbC,OAAQC,EAAA,cACRC,KAAMC,EAAA,QACNC,QAAS,IACAC,EAAA,SAAqBC,EAAA,kBAKlC,GACEC,SAAU,YACVC,QAAS,G,qKCTPC,EAAU,CAAC,EAEfA,EAAQC,kBAAoB,IAC5BD,EAAQE,cAAgB,IAElBF,EAAQG,OAAS,SAAc,KAAM,QAE3CH,EAAQI,OAAS,IACjBJ,EAAQK,mBAAqB,IAEhB,IAAI,IAASL,GAKJ,KAAW,YAAiB,W,+CCRlD,MAqBA,EArBuD,EAAGM,WAAUC,OAC7DD,EAImB,IAApBA,EAASE,QAET,SAACC,EAAA,EAAO,CAACC,aAAa,QAAU,sBAAuBH,EAAG,gBAK5D,SAACI,EAAA,EAAW,CACVC,UAAU,SACVN,SAAUA,EACVO,sBAAuBC,EAAA,EACvBP,EAAGA,KAdE,SAACQ,EAAA,EAAM,CAACC,MAAM,QAAU,mBAAoBT,EAAG,e,0BCC1D,MAoCA,GApC4B,IAAAU,OAC1B,YACE,IAAAC,YAAU,KACR,eAA0B,GAC1B,cAEKJ,EAAA,mBACH,oBAGK,IAAM,eAA0B,KACtC,IAEH,MAAM,EAAEP,IAAM,UACRD,GAAW,OAA+BQ,EAAA,GAChD,OACE,8BAAKF,UAAU,iBAAe,WAC5B,+BAAKA,UAAU,WAAS,YACtB,SAACO,EAAA,EAAY,CACX1B,KAAMC,EAAA,iBACN0B,OAAO,QAAU,SAAUb,EAAG,aAC9Bc,gBACE,SAACC,EAAA,EAAY,CAACvB,QAAS,EAAgBwB,SAAS,QAAQ9B,KAAM,UAGlE,gBAAKmB,UAAU,oBACf,8BAAKA,UAAU,6BAA2B,WACxC,SAAC,EAAgB,CAACN,SAAUA,EAAUC,EAAGA,aAKnD,IACA,KAAM,G","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/routes/Events/style.css","webpack://airdcpp-webui/./src/actions/ui/EventActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Events/style.css?eea1","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Events/components/EventMessageView.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Events/components/EventsLayout.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, \".simple-layout {\\r\\n height: 100%;\\r\\n padding: 20px;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.simple-layout > div {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.simple-layout .layout-content {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n overflow-y: auto;\\r\\n flex: 1 1 100%;\\r\\n}\\r\\n\\r\\n.simple-layout .layout-content > div {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.simple-layout .divider.top {\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\\r\\n/* Message layout */\\r\\n.system-log .message-list {\\r\\n width: 100%;\\r\\n margin: 10px 0px !important;\\r\\n}\\r\\n\\r\\n.system-log .status.item i {\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.system-log .status.item .text {\\r\\n margin-top: 5px;\\r\\n margin-bottom: 10px;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.system-log .status.item .time {\\r\\n color: gray;\\r\\n}\\r\\n\\r\\n.system-log .status.item .label {\\r\\n color: gray;\\r\\n margin-right: 3px;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Events/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,YAAY;EACZ,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;AACd;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,kBAAkB;AACpB;;AAEA,mBAAmB;AACnB;EACE,WAAW;EACX,2BAA2B;AAC7B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,eAAe;EACf,mBAAmB;EACnB,gBAAgB;AAClB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,WAAW;EACX,iBAAiB;AACnB\",\"sourcesContent\":[\".simple-layout {\\r\\n height: 100%;\\r\\n padding: 20px;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.simple-layout > div {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.simple-layout .layout-content {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n overflow-y: auto;\\r\\n flex: 1 1 100%;\\r\\n}\\r\\n\\r\\n.simple-layout .layout-content > div {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.simple-layout .divider.top {\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\\r\\n/* Message layout */\\r\\n.system-log .message-list {\\r\\n width: 100%;\\r\\n margin: 10px 0px !important;\\r\\n}\\r\\n\\r\\n.system-log .status.item i {\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.system-log .status.item .text {\\r\\n margin-top: 5px;\\r\\n margin-bottom: 10px;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.system-log .status.item .time {\\r\\n color: gray;\\r\\n}\\r\\n\\r\\n.system-log .status.item .label {\\r\\n color: gray;\\r\\n margin-right: 3px;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import EventConstants from 'constants/EventConstants';\r\nimport SocketService from 'services/SocketService';\r\nimport AccessConstants from 'constants/AccessConstants';\r\n\r\nimport * as UI from 'types/ui';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nexport const EventActions: UI.ActionListType<undefined> = {\r\n clear: {\r\n displayName: 'Clear',\r\n access: AccessConstants.EVENTS_EDIT,\r\n icon: IconConstants.CLEAR,\r\n handler: () => {\r\n return SocketService.delete(EventConstants.MESSAGES_URL);\r\n },\r\n },\r\n};\r\n\r\nexport default {\r\n moduleId: UI.Modules.EVENTS,\r\n actions: EventActions,\r\n};\r\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./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 * as React from 'react';\r\n\r\nimport Loader from 'components/semantic/Loader';\r\n\r\nimport Message from 'components/semantic/Message';\r\nimport MessageView from 'components/messages/MessageView';\r\n\r\nimport '../style.css';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport EventStore from 'stores/EventStore';\r\n\r\ninterface EventMessagesProps {\r\n messages: UI.MessageListItem[];\r\n t: UI.TranslateF;\r\n}\r\n\r\nconst EventMessageView: React.FC<EventMessagesProps> = ({ messages, t }) => {\r\n if (!messages) {\r\n return <Loader text={translate('Loading messages', t, UI.Modules.EVENTS)} />;\r\n }\r\n\r\n if (messages.length === 0) {\r\n return (\r\n <Message description={translate('No messages to show', t, UI.Modules.EVENTS)} />\r\n );\r\n }\r\n\r\n return (\r\n <MessageView\r\n className=\"events\"\r\n messages={messages}\r\n scrollPositionHandler={EventStore}\r\n t={t}\r\n />\r\n );\r\n};\r\n\r\nexport default EventMessageView;\r\n","import { useEffect, memo } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport EventAPIActions from 'actions/reflux/EventActions';\r\nimport EventUIActions from 'actions/ui/EventActions';\r\n\r\nimport EventStore from 'stores/EventStore';\r\n\r\nimport LayoutHeader from 'components/semantic/LayoutHeader';\r\nimport ActionButton from 'components/ActionButton';\r\n\r\nimport '../style.css';\r\nimport EventMessageView from 'routes/Sidebar/routes/Events/components/EventMessageView';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useStore } from 'effects/StoreListenerEffect';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nconst SystemLog: React.FC = memo(\r\n function SystemLog() {\r\n useEffect(() => {\r\n EventAPIActions.setActive(true);\r\n EventAPIActions.setRead();\r\n\r\n if (!EventStore.isInitialized()) {\r\n EventAPIActions.fetchMessages();\r\n }\r\n\r\n return () => EventAPIActions.setActive(false);\r\n }, []);\r\n\r\n const { t } = useTranslation();\r\n const messages = useStore<UI.MessageListItem[]>(EventStore);\r\n return (\r\n <div className=\"simple-layout\">\r\n <div className=\"wrapper\">\r\n <LayoutHeader\r\n icon={IconConstants.EVENTS_COLORED}\r\n title={translate('Events', t, UI.Modules.EVENTS)}\r\n rightComponent={\r\n <ActionButton actions={EventUIActions} actionId=\"clear\" icon={null} />\r\n }\r\n />\r\n <div className=\"ui divider top\" />\r\n <div className=\"layout-content system-log\">\r\n <EventMessageView messages={messages} t={t} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n },\r\n () => true\r\n);\r\n\r\nexport default SystemLog;\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","clear","displayName","access","AccessConstants","icon","IconConstants","handler","SocketService","EventConstants","moduleId","actions","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","messages","t","length","Message","description","MessageView","className","scrollPositionHandler","EventStore","Loader","text","memo","useEffect","LayoutHeader","title","rightComponent","ActionButton","actionId"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[182],{62824:(e,s,n)=>{n.d(s,{Z:()=>i});var t=n(87537),r=n.n(t),a=n(23645),o=n.n(a)()(r());o.push([e.id,".status .error {\r\n color: red;\r\n}\r\n\r\n.transfer.status .target {\r\n word-break: break-all;\r\n}\r\n","",{version:3,sources:["webpack://./src/routes/Transfers/style.css"],names:[],mappings:"AAAA;EACE,UAAU;AACZ;;AAEA;EACE,qBAAqB;AACvB",sourcesContent:[".status .error {\r\n color: red;\r\n}\r\n\r\n.transfer.status .target {\r\n word-break: break-all;\r\n}\r\n"],sourceRoot:""}]);const i=o},49133:(e,s,n)=>{n.d(s,{Z:()=>d});var t=n(1087),r=n(518),a=n(48117),o=n(76249),i=n(32347),c=n(60160);const l={search:{access:o.PS.SEARCH,displayName:"Search (foreground)",icon:a.Z.SEARCH,handler:({data:e,location:s})=>c.Z.search(e,s)},searchFileAlternates:{access:o.PS.QUEUE_EDIT,displayName:"Search for alternates",icon:a.Z.SEARCH_ALTERNATES,filter:e=>0===e.time_finished,handler:({data:e})=>r.Z.post(`${t.Z.FILES_URL}/${e.id}/search`),notifications:{onSuccess:"File {{item.name}} was searched for alternates"}},removeFile:{displayName:"Remove",access:o.PS.QUEUE_EDIT,icon:a.Z.REMOVE,confirmation:{content:"Are you sure that you want to remove the file {{item.name}}?",approveCaption:"Remove file",rejectCaption:"Don't remove",checkboxCaption:"Remove on disk"},handler:({data:e},s)=>r.Z.post(`${t.Z.FILES_URL}/${e.id}/remove`,{remove_finished:s}),notifications:{onSuccess:"File {{item.name}} was removed from queue"}}},d={moduleId:i.jv.QUEUE,actions:l}},68325:(e,s,n)=>{n.d(s,{Z:()=>g});var t=n(85893),r=n(45697),a=n.n(r),o=n(67294),i=n(27835),c=n(32347),l=n(91072),d=n(8717),u=n(35936),m=n(48117);const p=e=>{const s=e.str.match(/TLSv([\d.]+)/);return s&&2===s.length&&parseFloat(s[1])<1.2?{iconColor:"orange",messageColor:"red",message:"Outdated cryptographic protocol with known security vulnerabilities",cornerIcon:"orange warning",translationKey:"tlsOutdatedWarning"}:e.trusted?{iconColor:"green",messageColor:"green",message:"Authenticity of the certificate is validated",cornerIcon:"",translationKey:"tlsOk"}:{iconColor:"yellow",messageColor:"orange",message:"Authenticity of the certificate could not be validated",cornerIcon:"blue help",translationKey:"tlsAuthenticityWarning"}},h=({info:e,encryption:s})=>(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{children:s.str}),(0,t.jsx)("p",Object.assign({style:{color:e.messageColor}},{children:(0,t.jsx)(l.cC,Object.assign({i18nKey:(0,d.zS)(e.translationKey,c.jv.COMMON)},{children:e.message}))}))]});class f extends o.PureComponent{constructor(){super(...arguments),this.getChildren=()=>{const{encryption:e}=this.props,s=p(e);return(0,t.jsx)(h,{info:s,encryption:e})}}render(){const{encryption:e,alwaysVisible:s,boundary:n}=this.props;if(!e)return!!s&&(0,t.jsx)(u.Z,{color:"grey",icon:m.Z.LOCK});const r=p(e);return(0,t.jsx)(i.Z,Object.assign({triggerClassName:"encryption",className:"basic encryption content",trigger:(0,t.jsx)(u.Z,{color:r.iconColor,icon:m.Z.LOCK,cornerIcon:r.cornerIcon}),settings:{boundary:n}},{children:this.getChildren}))}}f.propTypes={encryption:a().object,boundary:a().string,alwaysVisible:a().bool};const g=f},43231:(e,s,n)=>{n.d(s,{Z:()=>l});var t=n(85893),r=n(45697),a=n.n(r),o=(n(67294),n(94184)),i=n.n(o);const c=({className:e,percent:s,caption:n})=>(0,t.jsxs)("div",Object.assign({className:i()("ui progress",e,{indeterminate:void 0===s}),"data-percent":s},{children:[(0,t.jsx)("div",Object.assign({className:"bar",style:{transitionDuration:"300ms",width:void 0===s?void 0:s+"%",minWidth:"0px"}},{children:(0,t.jsx)("div",{className:"progress"})})),!!n&&(0,t.jsx)("div",Object.assign({className:"label"},{children:n}))]}));c.propTypes={percent:a().number.isRequired,caption:a().node.isRequired,className:a().string};const l=c},57745:(e,s,n)=>{n.r(s),n.d(s,{default:()=>le});var t=n(85893),r=n(67294),a=n(10293),o=n.n(a),i=n(23406),c=n(93836);const l=o().createStore({_viewName:"transfer_view",_apiUrl:i.Z.MODULE_URL,mixins:[(0,c.Z)("user")]});var d=n(27695),u=n(99015),m=n(27835);const p=({cellData:e,rowData:s})=>(0,t.jsx)(m.Z,Object.assign({triggerClassName:"name",className:"basic target",trigger:e},{children:(0,t.jsx)("div",{children:s.target})}));class h extends r.Component{shouldComponentUpdate(e){return e.cellData!==this.props.cellData}render(){const{cellData:e,rowDataGetter:s}=this.props;if(!e)return null;const n=s();return n.type?(0,t.jsx)(u.Z,{typeInfo:n.type,caption:(0,t.jsx)(p,{cellData:e,rowData:n})}):null}}const f=h;var g=n(94184),j=n.n(g),y=n(43231),v=n(68325),E=n(54883),x=n(76249);const N=(e,s)=>{const n=e.id;return j()({grey:n===x.lK.WAITING},{blue:n===x.lK.RUNNING&&s.download},{red:n===x.lK.RUNNING&&!s.download},{green:n===x.lK.FINISHED&&s.download},{brown:n===x.lK.FINISHED&&!s.download},{red:n===x.lK.FAILED})},S=({cellData:e,rowDataGetter:s})=>{if(e.id===x.lK.WAITING)return(0,t.jsx)(E.Z,{size:"small",inline:!0,text:e.str});if(e.id===x.lK.FAILED)return(0,t.jsx)("span",Object.assign({className:"error"},{children:e.str}));const n=s();let r=e.str;return n.encryption&&(r=(0,t.jsxs)("span",Object.assign({className:"transfer status encryption"},{children:[(0,t.jsx)(v.Z,{encryption:n.encryption}),r]}))),(0,t.jsx)(y.Z,{className:N(e,n),caption:r,percent:100*n.bytes_transferred/n.size})};var w=n(518),b=n(1087),R=n(48117),C=n(32347);const Z={removeSource:{displayName:"Remove user from queue",access:x.PS.QUEUE_EDIT,icon:R.Z.REMOVE,handler:({data:e})=>w.Z.delete(`${b.Z.SOURCES_URL}/${e.cid}`),notifications:{onSuccess:"The user {{user.nicks}} was removed from {{result.count}} files"}}},A=(C.jv.QUEUE,Z);var O=n(49133),D=function(e,s){var n={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&s.indexOf(t)<0&&(n[t]=e[t]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(t=Object.getOwnPropertySymbols(e);r<t.length;r++)s.indexOf(t[r])<0&&Object.prototype.propertyIsEnumerable.call(e,t[r])&&(n[t[r]]=e[t[r]])}return n};const I=e=>e.download,U=e=>e.status.id===i.s.FINISHED,T={force:{displayName:"Force connect",access:x.PS.TRANSFERS,icon:R.Z.REFRESH_COLORED,filter:I,handler:({data:e})=>w.Z.post(`${i.Z.TRANSFERS_URL}/${e.id}/force`)},disconnect:{displayName:"Disconnect",access:x.PS.TRANSFERS,icon:R.Z.DISCONNECT,handler:({data:e})=>w.Z.post(`${i.Z.TRANSFERS_URL}/${e.id}/disconnect`)},divider:null,removeFile:{displayName:"Remove file from queue",access:x.PS.QUEUE_EDIT,icon:R.Z.REMOVE,filter:e=>I(e)&&(e=>!!e.type&&"filelist"===e.type.content_type)(e)&&!U(e),handler:e=>{var{data:s}=e,n=D(e,["data"]);return O.Z.actions.removeFile.handler(Object.assign({data:{id:s.queue_file_id,target:s.target,name:s.name}},n))},notifications:{onSuccess:"File {{item.name}} was removed from queue"}},removeSource:{displayName:"Remove user from queue",access:x.PS.QUEUE_EDIT,icon:R.Z.REMOVE,filter:e=>I(e)&&!U(e),handler:e=>{var{data:s}=e,n=D(e,["data"]);return A.removeSource.handler(Object.assign({data:Object.assign(Object.assign({},s.user),{id:s.user.cid,hub_urls:[s.user.hub_url],flags:s.user.flags})},n))},notifications:{onSuccess:"The user {{item.user.nicks}} was removed from {{result.count}} files"}}},_={moduleId:C.jv.TRANSFERS,actions:T};var F=n(90195),K=n(84613),L=n(4333);const G=({cellData:e,rowData:s})=>(0,t.jsxs)("div",Object.assign({className:"transfer-user icon-caption"},{children:[(0,t.jsx)("i",{className:j()(s.download?R.Z.DOWNLOAD:R.Z.UPLOAD,"large icon")}),e.nicks]}));class P extends r.Component{shouldComponentUpdate(e){return e.cellData!==this.props.cellData}render(){const{cellData:e,rowDataGetter:s}=this.props;return(0,t.jsx)(K.cG,Object.assign({user:e,userIcon:null,ids:F.D,text:(0,t.jsx)(G,{rowData:s(),cellData:e}),remoteMenuId:L.Z.HINTED_USER},{children:(0,t.jsx)(K.B2,{itemData:s,actions:_,remoteMenuId:L.Z.TRANSFER})}))}}const k=P;var q=n(35108),$=n(78230),M=n(68126),H=n(93379),V=n.n(H),W=n(7795),Q=n.n(W),z=n(90569),B=n.n(z),J=n(3565),X=n.n(J),Y=n(19216),ee=n.n(Y),se=n(44589),ne=n.n(se),te=n(62824),re={};re.styleTagTransform=ne(),re.setAttributes=X(),re.insert=B().bind(null,"head"),re.domAPI=Q(),re.insertStyleElement=ee(),V()(te.Z,re),te.Z&&te.Z.locals&&te.Z.locals;var ae=n(91072),oe=n(8717);const ie=({cellData:e})=>(0,t.jsx)("span",Object.assign({className:"plain flags cell"},{children:e.join("")}));class ce extends r.Component{constructor(){super(...arguments),this.isPositive=e=>e>0,this.isRunning=(e,s)=>s.speed>0,this.emptyRowsNodeGetter=()=>{const{t:e}=this.props;return(0,t.jsx)(d.Z,{title:(0,oe.Iu)("No active transfers",e,C.jv.TRANSFERS),icon:R.Z.TRANSFERS_PLAIN})}}render(){return(0,t.jsxs)($.Z,Object.assign({emptyRowsNodeGetter:this.emptyRowsNodeGetter,store:l,moduleId:C.jv.TRANSFERS},{children:[(0,t.jsx)(q.Column,{name:"User",width:150,flexGrow:4,columnKey:"user",cell:(0,t.jsx)(k,{})}),(0,t.jsx)(q.Column,{name:"Name",width:150,flexGrow:4,columnKey:"name",cell:(0,t.jsx)(f,{})}),(0,t.jsx)(q.Column,{name:"Segment",width:65,columnKey:"size",cell:(0,t.jsx)(M.Eh,{}),renderCondition:this.isPositive,flexGrow:1}),(0,t.jsx)(q.Column,{name:"Status",width:140,flexGrow:4,columnKey:"status",cell:(0,t.jsx)(S,{})}),(0,t.jsx)(q.Column,{name:"Time left",width:50,columnKey:"seconds_left",renderCondition:this.isRunning,cell:(0,t.jsx)(M.VL,{})}),(0,t.jsx)(q.Column,{name:"Speed",width:50,columnKey:"speed",cell:(0,t.jsx)(M.LV,{}),renderCondition:this.isRunning,flexGrow:1}),(0,t.jsx)(q.Column,{name:"Flags",width:50,columnKey:"flags",cell:(0,t.jsx)(ie,{}),renderCondition:this.isRunning,flexGrow:1,hideWidth:800}),(0,t.jsx)(q.Column,{name:"IP",width:120,columnKey:"ip",flexGrow:1,cell:(0,t.jsx)(M.fI,{}),hideWidth:1e3})]}))}}ce.displayName="Transfers";const le=(0,ae.Zh)()(ce)}}]);
2
+ //# sourceMappingURL=transfers.8d1840e604ad0e4c0c15.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/transfers.8d1840e604ad0e4c0c15.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Transfers/style.css","webpack://airdcpp-webui/./src/actions/ui/QueueFileActions.ts","webpack://airdcpp-webui/./src/components/EncryptionState.tsx","webpack://airdcpp-webui/./src/components/semantic/Progress.tsx","webpack://airdcpp-webui/./src/stores/TransferStore.js","webpack://airdcpp-webui/./src/routes/Transfers/components/NameCell.tsx","webpack://airdcpp-webui/./src/routes/Transfers/components/StatusCell.tsx","webpack://airdcpp-webui/./src/actions/ui/QueueSourceActions.ts","webpack://airdcpp-webui/./src/actions/ui/TransferActions.ts","webpack://airdcpp-webui/./src/routes/Transfers/components/UserCell.tsx","webpack://airdcpp-webui/./src/routes/Transfers/style.css?f802","webpack://airdcpp-webui/./src/routes/Transfers/components/Transfers.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, \".status .error {\\r\\n color: red;\\r\\n}\\r\\n\\r\\n.transfer.status .target {\\r\\n word-break: break-all;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Transfers/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,UAAU;AACZ;;AAEA;EACE,qBAAqB;AACvB\",\"sourcesContent\":[\".status .error {\\r\\n color: red;\\r\\n}\\r\\n\\r\\n.transfer.status .target {\\r\\n word-break: break-all;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import QueueConstants from 'constants/QueueConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport SearchActions from 'actions/reflux/SearchActions';\r\n\r\nconst itemNotFinished = (item: API.QueueFile) => item.time_finished === 0;\r\n\r\nconst handleSearch: UI.ActionHandler<API.QueueFile> = ({ data: itemInfo, location }) => {\r\n return SearchActions.search(itemInfo, location);\r\n};\r\n\r\nconst handleRemoveFile: UI.ActionHandler<API.QueueFile> = (\r\n { data: file },\r\n removeFinished: boolean\r\n) => {\r\n return SocketService.post(`${QueueConstants.FILES_URL}/${file.id}/remove`, {\r\n remove_finished: removeFinished,\r\n });\r\n};\r\n\r\nconst handleSearchFileAlternates: UI.ActionHandler<API.QueueFile> = ({ data: file }) => {\r\n return SocketService.post(`${QueueConstants.FILES_URL}/${file.id}/search`);\r\n};\r\n\r\nconst QueueFileActions: UI.ActionListType<API.QueueFile> = {\r\n search: {\r\n access: API.AccessEnum.SEARCH,\r\n displayName: 'Search (foreground)',\r\n icon: IconConstants.SEARCH,\r\n handler: handleSearch,\r\n },\r\n searchFileAlternates: {\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n displayName: 'Search for alternates',\r\n icon: IconConstants.SEARCH_ALTERNATES,\r\n filter: itemNotFinished,\r\n handler: handleSearchFileAlternates,\r\n notifications: {\r\n onSuccess: 'File {{item.name}} was searched for alternates',\r\n },\r\n },\r\n removeFile: {\r\n displayName: 'Remove',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REMOVE,\r\n confirmation: {\r\n content: 'Are you sure that you want to remove the file {{item.name}}?',\r\n approveCaption: 'Remove file',\r\n rejectCaption: `Don't remove`,\r\n checkboxCaption: 'Remove on disk',\r\n },\r\n handler: handleRemoveFile,\r\n notifications: {\r\n onSuccess: 'File {{item.name}} was removed from queue',\r\n },\r\n },\r\n};\r\n\r\nexport default {\r\n moduleId: UI.Modules.QUEUE,\r\n //subId: 'file',\r\n actions: QueueFileActions,\r\n} as UI.ModuleActions<API.QueueFile>;\r\n","import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport Popup from 'components/semantic/Popup';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { Trans } from 'react-i18next';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\nimport Icon from './semantic/Icon';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\ninterface Info {\r\n iconColor: string;\r\n messageColor: string;\r\n message: string;\r\n cornerIcon: string;\r\n translationKey: string;\r\n}\r\n\r\nconst encryptionToInfo = (encryption: API.EncryptionInfo): Info => {\r\n const tlsVersion = encryption.str.match(/TLSv([\\d.]+)/);\r\n if (tlsVersion && tlsVersion.length === 2 && parseFloat(tlsVersion[1]) < 1.2) {\r\n return {\r\n iconColor: 'orange',\r\n messageColor: 'red',\r\n message: 'Outdated cryptographic protocol with known security vulnerabilities',\r\n cornerIcon: 'orange warning',\r\n translationKey: 'tlsOutdatedWarning',\r\n };\r\n }\r\n\r\n if (!encryption.trusted) {\r\n return {\r\n iconColor: 'yellow',\r\n messageColor: 'orange',\r\n message: 'Authenticity of the certificate could not be validated',\r\n cornerIcon: 'blue help',\r\n translationKey: 'tlsAuthenticityWarning',\r\n };\r\n }\r\n\r\n return {\r\n iconColor: 'green',\r\n messageColor: 'green',\r\n message: 'Authenticity of the certificate is validated',\r\n cornerIcon: '',\r\n translationKey: 'tlsOk',\r\n };\r\n};\r\n\r\ninterface InfoMessageProps {\r\n info: Info;\r\n encryption: API.EncryptionInfo;\r\n}\r\n\r\nconst InfoMessage: React.FC<InfoMessageProps> = ({ info, encryption }) => (\r\n <div>\r\n <p>{encryption.str}</p>\r\n <p style={{ color: info.messageColor }}>\r\n <Trans i18nKey={toI18nKey(info.translationKey, UI.Modules.COMMON)}>\r\n {info.message}\r\n </Trans>\r\n </p>\r\n </div>\r\n);\r\n\r\ninterface EncryptionStateProps\r\n extends Partial<Pick<SemanticUI.PopupSettings, 'boundary'>> {\r\n encryption?: API.EncryptionInfo;\r\n alwaysVisible?: boolean;\r\n}\r\n\r\nclass EncryptionState extends React.PureComponent<EncryptionStateProps> {\r\n static propTypes = {\r\n encryption: PropTypes.object,\r\n boundary: PropTypes.string,\r\n\r\n // Show the lock icon even when there is no encryption\r\n alwaysVisible: PropTypes.bool,\r\n };\r\n\r\n getChildren = () => {\r\n const { encryption } = this.props;\r\n\r\n const info = encryptionToInfo(encryption!);\r\n return <InfoMessage info={info} encryption={encryption!} />;\r\n };\r\n\r\n render() {\r\n const { encryption, alwaysVisible, boundary } = this.props;\r\n if (!encryption) {\r\n return !!alwaysVisible && <Icon color=\"grey\" icon={IconConstants.LOCK} />;\r\n }\r\n\r\n const info = encryptionToInfo(encryption);\r\n return (\r\n <Popup\r\n triggerClassName=\"encryption\"\r\n className=\"basic encryption content\"\r\n trigger={\r\n <Icon\r\n color={info.iconColor}\r\n icon={IconConstants.LOCK}\r\n cornerIcon={info.cornerIcon}\r\n />\r\n }\r\n settings={\r\n {\r\n boundary,\r\n } as SemanticUI.PopupSettings\r\n }\r\n >\r\n {this.getChildren}\r\n </Popup>\r\n );\r\n }\r\n}\r\n\r\nexport default EncryptionState;\r\n","import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nexport interface ProgressProps {\r\n caption?: React.ReactNode;\r\n className?: string | null;\r\n percent?: number;\r\n}\r\n\r\nconst Progress: React.FC<ProgressProps> = ({ className, percent, caption }) => (\r\n <div\r\n className={classNames('ui progress', className, {\r\n indeterminate: percent === undefined,\r\n })}\r\n data-percent={percent}\r\n >\r\n <div\r\n className=\"bar\"\r\n style={{\r\n transitionDuration: 300 + 'ms',\r\n width: percent === undefined ? undefined : percent + '%',\r\n minWidth: '0px',\r\n }}\r\n >\r\n <div className=\"progress\" />\r\n </div>\r\n {!!caption && <div className=\"label\">{caption}</div>}\r\n </div>\r\n);\r\n\r\nProgress.propTypes = {\r\n percent: PropTypes.number.isRequired,\r\n caption: PropTypes.node.isRequired,\r\n className: PropTypes.string,\r\n};\r\n\r\nexport default Progress;\r\n","import Reflux from 'reflux';\r\n\r\nimport TransferConstants from 'constants/TransferConstants';\r\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'transfer_view',\r\n _apiUrl: TransferConstants.MODULE_URL,\r\n mixins: [ViewStoreMixin('user')],\r\n});\r\n","import * as React from 'react';\r\n\r\nimport FormattedFile from 'components/format/FormattedFile';\r\nimport Popup from 'components/semantic/Popup';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\n\r\nconst NameCaption: React.FC<RowWrapperCellChildProps<string, API.Transfer>> = ({\r\n cellData,\r\n rowData,\r\n}) => (\r\n <Popup triggerClassName=\"name\" className=\"basic target\" trigger={cellData}>\r\n <div>{rowData!.target}</div>\r\n </Popup>\r\n);\r\n\r\ninterface NameCellProps extends RowWrapperCellChildProps<string, API.Transfer> {}\r\n\r\nclass NameCell extends React.Component<NameCellProps> {\r\n shouldComponentUpdate(nextProps: NameCellProps) {\r\n return nextProps.cellData !== this.props.cellData;\r\n }\r\n\r\n render() {\r\n const { cellData, rowDataGetter } = this.props;\r\n if (!cellData) {\r\n return null;\r\n }\r\n\r\n const rowData = rowDataGetter!();\r\n if (!rowData.type) {\r\n return null;\r\n }\r\n\r\n return (\r\n <FormattedFile\r\n typeInfo={rowData.type}\r\n caption={<NameCaption cellData={cellData} rowData={rowData} />}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default NameCell;\r\n","import * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport Progress from 'components/semantic/Progress';\r\n\r\nimport EncryptionState from 'components/EncryptionState';\r\nimport Loader from 'components/semantic/Loader';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\n\r\nconst getStatusClass = (cellData: API.TransferStatus, rowData: API.Transfer) => {\r\n const statusId = cellData.id;\r\n return classNames(\r\n { grey: statusId === API.TransferStatusEnum.WAITING },\r\n { blue: statusId === API.TransferStatusEnum.RUNNING && rowData.download },\r\n { red: statusId === API.TransferStatusEnum.RUNNING && !rowData.download },\r\n { green: statusId === API.TransferStatusEnum.FINISHED && rowData.download },\r\n { brown: statusId === API.TransferStatusEnum.FINISHED && !rowData.download },\r\n { red: statusId === API.TransferStatusEnum.FAILED }\r\n );\r\n};\r\n\r\ninterface StatusCellProps\r\n extends RowWrapperCellChildProps<API.TransferStatus, API.Transfer> {}\r\n\r\nconst StatusCell: React.FC<StatusCellProps> = ({ cellData, rowDataGetter }) => {\r\n if (cellData!.id === API.TransferStatusEnum.WAITING) {\r\n return <Loader size=\"small\" inline={true} text={cellData!.str} />;\r\n }\r\n\r\n if (cellData!.id === API.TransferStatusEnum.FAILED) {\r\n return <span className=\"error\">{cellData!.str}</span>;\r\n }\r\n\r\n const rowData = rowDataGetter!();\r\n let caption: React.ReactNode = cellData!.str;\r\n if (rowData.encryption) {\r\n caption = (\r\n <span className=\"transfer status encryption\">\r\n <EncryptionState encryption={rowData.encryption} />\r\n {caption}\r\n </span>\r\n );\r\n }\r\n\r\n return (\r\n <Progress\r\n className={getStatusClass(cellData!, rowData)}\r\n caption={caption}\r\n percent={(rowData.bytes_transferred * 100) / rowData.size}\r\n />\r\n );\r\n};\r\n\r\nexport default StatusCell;\r\n","import QueueConstants from 'constants/QueueConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nconst handleRemoveSource: UI.ActionHandler<API.User> = ({ data: user }) => {\r\n return SocketService.delete(`${QueueConstants.SOURCES_URL}/${user.cid}`);\r\n};\r\n\r\nconst QueueSourceActions: UI.ActionListType<API.User> = {\r\n removeSource: {\r\n displayName: 'Remove user from queue',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REMOVE,\r\n //filter: removeSource,\r\n handler: handleRemoveSource,\r\n notifications: {\r\n onSuccess: 'The user {{user.nicks}} was removed from {{result.count}} files',\r\n },\r\n },\r\n};\r\n\r\nexport default {\r\n moduleId: UI.Modules.QUEUE,\r\n actions: QueueSourceActions,\r\n};\r\n","import SocketService from 'services/SocketService';\r\n\r\nimport QueueSourceActions from 'actions/ui/QueueSourceActions';\r\n\r\nimport QueueFileActions from 'actions/ui/QueueFileActions';\r\n\r\nimport { default as TransferConstants, StatusEnum } from 'constants/TransferConstants';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nconst isFilelist = (transfer: API.Transfer) =>\r\n !!transfer.type && (transfer.type as API.FileType).content_type === 'filelist';\r\nconst isDownload = (transfer: API.Transfer) => transfer.download;\r\nconst isFinished = (transfer: API.Transfer) => transfer.status.id === StatusEnum.FINISHED;\r\nconst removeFile = (transfer: API.Transfer) =>\r\n isDownload(transfer) && isFilelist(transfer) && !isFinished(transfer);\r\nconst removeSource = (transfer: API.Transfer) =>\r\n isDownload(transfer) && !isFinished(transfer);\r\n\r\nconst handleForce: UI.ActionHandler<API.Transfer> = ({ data: transfer }) => {\r\n return SocketService.post(`${TransferConstants.TRANSFERS_URL}/${transfer.id}/force`);\r\n};\r\n\r\nconst handleDisconnect: UI.ActionHandler<API.Transfer> = ({ data: transfer }) => {\r\n return SocketService.post(\r\n `${TransferConstants.TRANSFERS_URL}/${transfer.id}/disconnect`\r\n );\r\n};\r\n\r\nconst handleRemoveFile: UI.ActionHandler<API.Transfer> = ({\r\n data: transfer,\r\n ...other\r\n}) => {\r\n return QueueFileActions.actions.removeFile!.handler({\r\n data: {\r\n id: transfer.queue_file_id,\r\n target: transfer.target,\r\n name: transfer.name,\r\n } as API.QueueFile,\r\n ...other,\r\n });\r\n};\r\n\r\nconst handleRemoveSource: UI.ActionHandler<API.Transfer> = ({\r\n data: transfer,\r\n ...other\r\n}) => {\r\n return QueueSourceActions.actions.removeSource!.handler({\r\n data: {\r\n ...transfer.user,\r\n id: transfer.user.cid,\r\n hub_urls: [transfer.user.hub_url],\r\n flags: transfer.user.flags as API.UserFlag[],\r\n },\r\n ...other,\r\n });\r\n};\r\n\r\nconst TransferActions: UI.ActionListType<API.Transfer> = {\r\n force: {\r\n displayName: 'Force connect',\r\n access: API.AccessEnum.TRANSFERS,\r\n icon: IconConstants.REFRESH_COLORED,\r\n filter: isDownload,\r\n handler: handleForce,\r\n },\r\n disconnect: {\r\n displayName: 'Disconnect',\r\n access: API.AccessEnum.TRANSFERS,\r\n icon: IconConstants.DISCONNECT,\r\n handler: handleDisconnect,\r\n },\r\n divider: null,\r\n removeFile: {\r\n displayName: 'Remove file from queue',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REMOVE,\r\n filter: removeFile,\r\n handler: handleRemoveFile,\r\n notifications: {\r\n onSuccess: 'File {{item.name}} was removed from queue',\r\n },\r\n },\r\n removeSource: {\r\n displayName: 'Remove user from queue',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REMOVE,\r\n filter: removeSource,\r\n handler: handleRemoveSource,\r\n notifications: {\r\n onSuccess: 'The user {{item.user.nicks}} was removed from {{result.count}} files',\r\n },\r\n },\r\n};\r\n\r\nexport default {\r\n moduleId: UI.Modules.TRANSFERS,\r\n actions: TransferActions,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport TransferActions from 'actions/ui/TransferActions';\r\nimport { UserFileActions } from 'actions/ui/UserActions';\r\n\r\nimport { TableActionMenu, TableUserMenu } from 'components/action-menu';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\nimport MenuConstants from 'constants/MenuConstants';\r\nimport classNames from 'classnames';\r\n\r\nconst UserCaption: React.FC<RowWrapperCellChildProps<API.HintedUser, API.Transfer>> = ({\r\n cellData,\r\n rowData,\r\n}) => (\r\n <div className=\"transfer-user icon-caption\">\r\n <i\r\n className={classNames(\r\n rowData!.download ? IconConstants.DOWNLOAD : IconConstants.UPLOAD,\r\n 'large icon'\r\n )}\r\n />\r\n {cellData!.nicks}\r\n </div>\r\n);\r\n\r\ninterface UserCellProps extends RowWrapperCellChildProps<API.HintedUser, API.Transfer> {}\r\n\r\nclass UserCell extends React.Component<UserCellProps> {\r\n shouldComponentUpdate(nextProps: UserCellProps) {\r\n return nextProps.cellData !== this.props.cellData;\r\n }\r\n\r\n render() {\r\n const { cellData, rowDataGetter } = this.props;\r\n return (\r\n <TableUserMenu\r\n user={cellData!}\r\n userIcon={null}\r\n ids={UserFileActions}\r\n text={<UserCaption rowData={rowDataGetter!()} cellData={cellData} />}\r\n remoteMenuId={MenuConstants.HINTED_USER}\r\n >\r\n <TableActionMenu\r\n itemData={rowDataGetter}\r\n actions={TransferActions}\r\n remoteMenuId={MenuConstants.TRANSFER}\r\n />\r\n </TableUserMenu>\r\n );\r\n }\r\n}\r\n\r\nexport default UserCell;\r\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./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 * as React from 'react';\r\n\r\nimport TransferStore from 'stores/TransferStore';\r\n\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport NameCell from 'routes/Transfers/components/NameCell';\r\nimport StatusCell from 'routes/Transfers/components/StatusCell';\r\nimport UserCell from 'routes/Transfers/components/UserCell';\r\n\r\nimport { Column } from 'fixed-data-table-2';\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport {\r\n SizeCell,\r\n SpeedCell,\r\n AbbreviatedDurationCell,\r\n IpCell,\r\n} from 'components/table/Cell';\r\n\r\nimport '../style.css';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { withTranslation, WithTranslation } from 'react-i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nconst FlagsCell: React.FC<RowWrapperCellChildProps<string[], API.Transfer>> = ({\r\n cellData,\r\n}) => <span className=\"plain flags cell\">{cellData!.join('')}</span>;\r\n\r\ninterface TransfersProps extends WithTranslation {}\r\n\r\nclass Transfers extends React.Component<TransfersProps> {\r\n static displayName = 'Transfers';\r\n\r\n isPositive = (cellData: number) => {\r\n return cellData > 0;\r\n };\r\n\r\n isRunning = (cellData: any, rowData: API.Transfer) => {\r\n return rowData.speed > 0;\r\n };\r\n\r\n emptyRowsNodeGetter = () => {\r\n const { t } = this.props;\r\n return (\r\n <Message\r\n title={translate('No active transfers', t, UI.Modules.TRANSFERS)}\r\n icon={IconConstants.TRANSFERS_PLAIN}\r\n />\r\n );\r\n };\r\n\r\n render() {\r\n return (\r\n <VirtualTable\r\n emptyRowsNodeGetter={this.emptyRowsNodeGetter}\r\n store={TransferStore}\r\n moduleId={UI.Modules.TRANSFERS}\r\n >\r\n <Column\r\n name=\"User\"\r\n width={150}\r\n flexGrow={4}\r\n columnKey=\"user\"\r\n cell={<UserCell />}\r\n />\r\n <Column\r\n name=\"Name\"\r\n width={150}\r\n flexGrow={4}\r\n columnKey=\"name\"\r\n cell={<NameCell />}\r\n />\r\n <Column\r\n name=\"Segment\"\r\n width={65}\r\n columnKey=\"size\"\r\n cell={<SizeCell />}\r\n renderCondition={this.isPositive}\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Status\"\r\n width={140}\r\n flexGrow={4}\r\n columnKey=\"status\"\r\n cell={<StatusCell />}\r\n />\r\n <Column\r\n name=\"Time left\"\r\n width={50}\r\n columnKey=\"seconds_left\"\r\n renderCondition={this.isRunning}\r\n cell={<AbbreviatedDurationCell />}\r\n />\r\n <Column\r\n name=\"Speed\"\r\n width={50}\r\n columnKey=\"speed\"\r\n cell={<SpeedCell />}\r\n renderCondition={this.isRunning}\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Flags\"\r\n width={50}\r\n columnKey=\"flags\"\r\n cell={<FlagsCell />}\r\n renderCondition={this.isRunning}\r\n flexGrow={1}\r\n hideWidth={800}\r\n />\r\n <Column\r\n name=\"IP\"\r\n width={120}\r\n columnKey=\"ip\"\r\n flexGrow={1}\r\n cell={<IpCell />}\r\n hideWidth={1000}\r\n />\r\n </VirtualTable>\r\n );\r\n }\r\n}\r\n\r\nexport default withTranslation()(Transfers);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","QueueFileActions","search","access","displayName","icon","handler","data","itemInfo","location","searchFileAlternates","filter","item","time_finished","file","notifications","onSuccess","removeFile","confirmation","content","approveCaption","rejectCaption","checkboxCaption","removeFinished","remove_finished","moduleId","actions","encryptionToInfo","encryption","tlsVersion","str","match","length","parseFloat","iconColor","messageColor","message","cornerIcon","translationKey","trusted","InfoMessage","info","style","color","i18nKey","EncryptionState","getChildren","this","props","render","alwaysVisible","boundary","triggerClassName","className","trigger","settings","propTypes","Progress","percent","caption","indeterminate","undefined","transitionDuration","width","minWidth","_viewName","_apiUrl","TransferConstants","mixins","ViewStoreMixin","NameCaption","cellData","rowData","Popup","target","NameCell","shouldComponentUpdate","nextProps","rowDataGetter","type","FormattedFile","typeInfo","getStatusClass","statusId","grey","blue","download","red","green","brown","Loader","size","inline","text","bytes_transferred","QueueSourceActions","removeSource","IconConstants","user","SocketService","QueueConstants","cid","isDownload","transfer","isFinished","status","TransferActions","force","disconnect","divider","content_type","isFilelist","other","queue_file_id","name","hub_urls","hub_url","flags","UserCaption","nicks","UserCell","userIcon","ids","remoteMenuId","MenuConstants","itemData","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","FlagsCell","join","Transfers","isPositive","isRunning","speed","emptyRowsNodeGetter","t","Message","title","VirtualTable","store","TransferStore","Column","flexGrow","columnKey","cell","renderCondition","hideWidth"],"sourceRoot":""}
package/dist/sw.js CHANGED
@@ -1,2 +1,2 @@
1
- (()=>{const e=self.location.origin+self.location.pathname.replace("sw.js",""),t=[{'revision':'691f7d2188f3aa7cf719fff32c02ac05','url':'index.html'},{'revision':null,'url':'js//locales/ca-webui-main-json.6c149a10d6e263315d7f.chunk.js'},{'revision':null,'url':'js//locales/da-webui-main-json.0ceb448ebe8d59d24573.chunk.js'},{'revision':null,'url':'js//locales/de-webui-main-json.5f98884f26442cd6079a.chunk.js'},{'revision':null,'url':'js//locales/el-webui-main-json.9b9f976001b216a51d60.chunk.js'},{'revision':null,'url':'js//locales/en-webui-main-json.d1845c8535d9a1be9ef6.chunk.js'},{'revision':null,'url':'js//locales/en-webui-main-missing-json.0a7b6ea1f0a5eeaa5735.chunk.js'},{'revision':null,'url':'js//locales/es-webui-main-json.c0a7f4edfd71f660b005.chunk.js'},{'revision':null,'url':'js//locales/eu-webui-main-json.eb0383952c8ab4fb9f36.chunk.js'},{'revision':null,'url':'js//locales/fi-webui-main-json.f9ff02a0b28a5fd85a5d.chunk.js'},{'revision':null,'url':'js//locales/fr-webui-main-json.53bc9323af23410d639f.chunk.js'},{'revision':null,'url':'js//locales/hu-webui-main-json.c63e9fcc09558b4fe41e.chunk.js'},{'revision':null,'url':'js//locales/it-webui-main-json.59aad6c34cdff2085157.chunk.js'},{'revision':null,'url':'js//locales/nl-webui-main-json.f4e1772f9d507c339583.chunk.js'},{'revision':null,'url':'js//locales/no-webui-main-json.7637dd19134c84061d14.chunk.js'},{'revision':null,'url':'js//locales/pl-webui-main-json.10a0a30720b516cefda5.chunk.js'},{'revision':null,'url':'js//locales/pt-br-webui-main-json.cc946648a521c27b5a79.chunk.js'},{'revision':null,'url':'js//locales/pt-webui-main-json.5bed5158082678ceb16b.chunk.js'},{'revision':null,'url':'js//locales/ro-webui-main-json.d68cbb01175c7f6e2b53.chunk.js'},{'revision':null,'url':'js//locales/ru-webui-main-json.c399c20411213c872e7b.chunk.js'},{'revision':null,'url':'js//locales/sv-webui-main-json.bc915cd441a54413b67c.chunk.js'},{'revision':null,'url':'js//locales/tr-webui-main-json.a8c83f88e88d42ffca40.chunk.js'},{'revision':null,'url':'js//locales/uk_UA-webui-main-json.cbc43c57307c9f8134a6.chunk.js'},{'revision':null,'url':'js//locales/zh_CN-webui-main-json.b963220181e25b6e6fcd.chunk.js'},{'revision':null,'url':'js/285.4cfd5122e0b82af77eb1.chunk.js'},{'revision':null,'url':'js/317.97fabbc4a91be88219d3.chunk.js'},{'revision':null,'url':'js/424.5cc8383701bc3226c5ff.chunk.js'},{'revision':null,'url':'js/668.294ae7e2a9db78b421b0.chunk.js'},{'revision':null,'url':'js/69.3e693915ecfb45fce6ea.chunk.js'},{'revision':null,'url':'js/702.2a6693aead40337b625c.chunk.js'},{'revision':null,'url':'js/760.774900fa62b9e66b5ff7.chunk.js'},{'revision':null,'url':'js/favorite-hubs.ddb9d9755d235cae74ad.chunk.js'},{'revision':null,'url':'js/filelists.938ca2c1834d7e4b5f31.chunk.js'},{'revision':null,'url':'js/files.c17b77223a4f8de80f1b.chunk.js'},{'revision':null,'url':'js/home.7b6595492d6f4a0507e5.chunk.js'},{'revision':null,'url':'js/hubs.2dbce9b35aa07bab9189.chunk.js'},{'revision':null,'url':'js/main.01d94b76f3ff04c0ccd0.entry.js'},{'revision':null,'url':'js/messages.a761c7b81ebb0be1c6b9.chunk.js'},{'revision':null,'url':'js/queue.20fe8967cbdac914688a.chunk.js'},{'revision':null,'url':'js/search.62d97eef6ffbc4438ca7.chunk.js'},{'revision':null,'url':'js/settings.b9a77fec5bd9bf0f744c.chunk.js'},{'revision':null,'url':'js/share.3f04c8697ad367c0ecf6.chunk.js'},{'revision':null,'url':'js/system-log.9ccbd9a5982afcb71dfa.chunk.js'},{'revision':null,'url':'js/transfers.5fbe0929649dc0893737.chunk.js'}].map((function(t){return e+t.url})),n="resource-store";function l(e,t){return caches.match(new URL(t)).then((function(t){return t?(console.log("[SW] Return cached",e.request.url),t):(console.log("[SW] Fetch",e.request.url),fetch(e.request))}))}self.addEventListener("install",(e=>{console.log("[SW] Worker installed"),e.waitUntil(caches.open(n).then((e=>e.addAll([...t]))).then((()=>{console.log("[SW] Assets: ",t)})).catch((e=>{throw console.error(e),e})))})),self.addEventListener("activate",(e=>{console.log("[SW] Activate event"),e.waitUntil(caches.keys().then((e=>Promise.all(e.map((e=>caches.open(e).then((e=>(e=>e.keys().then((n=>Promise.all(n.map((n=>t.includes(n.url)?(console.log(`[SW] Cached asset ${n.url} still exists, skip delete`),null):e.delete(n).then((e=>{console.log(`[SW] Cached asset ${n.url} deleted`,e)}))))))))(e)))))))))})),self.addEventListener("fetch",(t=>{if("GET"===t.request.method){if("navigate"===t.request.mode||t.request.url.startsWith(e)&&-1===t.request.url.indexOf(".",e.length)&&!t.request.url.replace(e,"").match(/^(view)\//)){console.log("[SW] Navigate action, fetch index",t.request.url);const s=e+"index.html";return t.respondWith(new Promise((e=>{fetch(s).then((l=>{caches.open(n).then((n=>{n.put(new Request(s),l.clone()).then((()=>{console.log("[SW] Index file cached",t.request.url),e(l)}))}))})).catch((n=>{console.log("[SW] Navigate action, failed to fetch index",t.request.url,n),e(l(t,s))}))})))}return t.respondWith(l(t,t.request.url))}}))})();
1
+ (()=>{const e=self.location.origin+self.location.pathname.replace("sw.js",""),t=[{'revision':'d2f78a3ee9de82c2596e32b65cca4fbd','url':'index.html'},{'revision':null,'url':'js//locales/ca-webui-main-json.e4a9ae36d6beb98c0057.chunk.js'},{'revision':null,'url':'js//locales/da-webui-main-json.a08bb8db90fc33844135.chunk.js'},{'revision':null,'url':'js//locales/de-webui-main-json.6763aab78d26033bc160.chunk.js'},{'revision':null,'url':'js//locales/el-webui-main-json.33c629aa295c990b6816.chunk.js'},{'revision':null,'url':'js//locales/en-webui-main-json.ae2216f8443c16155761.chunk.js'},{'revision':null,'url':'js//locales/es-webui-main-json.cef003aeaf6a8669aa55.chunk.js'},{'revision':null,'url':'js//locales/eu-webui-main-json.f390f35c92cc5e80723e.chunk.js'},{'revision':null,'url':'js//locales/fi-webui-main-json.2c0e54d1e586d6d4cdf4.chunk.js'},{'revision':null,'url':'js//locales/fr-webui-main-json.eb58b9782b184c5bd0e7.chunk.js'},{'revision':null,'url':'js//locales/hu-webui-main-json.6a8b4be95cd392319f00.chunk.js'},{'revision':null,'url':'js//locales/it-webui-main-json.ace514cb8dbf846f7bb2.chunk.js'},{'revision':null,'url':'js//locales/nl-webui-main-json.99f14f67e7f7f523f435.chunk.js'},{'revision':null,'url':'js//locales/no-webui-main-json.14d6b98f5aeac4ae328e.chunk.js'},{'revision':null,'url':'js//locales/pl-webui-main-json.df98b2ed00d38e386747.chunk.js'},{'revision':null,'url':'js//locales/pt-br-webui-main-json.b06c253e99d8eb8a971d.chunk.js'},{'revision':null,'url':'js//locales/pt-webui-main-json.5278c6a5afa09777b453.chunk.js'},{'revision':null,'url':'js//locales/ro-webui-main-json.24ab9a55725a9fc18299.chunk.js'},{'revision':null,'url':'js//locales/ru-webui-main-json.e9ab289b5a1b70abdccf.chunk.js'},{'revision':null,'url':'js//locales/sv-webui-main-json.9ad571819cde0158829a.chunk.js'},{'revision':null,'url':'js//locales/tr-webui-main-json.68bb926adc13e8952b47.chunk.js'},{'revision':null,'url':'js//locales/uk_UA-webui-main-json.f4098f3ea96407bf804e.chunk.js'},{'revision':null,'url':'js//locales/zh_CN-webui-main-json.6250a926eeea9fda0697.chunk.js'},{'revision':null,'url':'js/285.f568d215104be4fb06eb.chunk.js'},{'revision':null,'url':'js/317.54d6dded7430f84fd4a7.chunk.js'},{'revision':null,'url':'js/424.b9b775d50fbed2ec85ca.chunk.js'},{'revision':null,'url':'js/668.0d2ed46d1147385f6482.chunk.js'},{'revision':null,'url':'js/69.00e5adf1f76437e343f2.chunk.js'},{'revision':null,'url':'js/702.87b71d34ebd167d76c3b.chunk.js'},{'revision':null,'url':'js/760.1679cba4f653d07819f3.chunk.js'},{'revision':null,'url':'js/favorite-hubs.9c69b40155edc72e69bb.chunk.js'},{'revision':null,'url':'js/filelists.799bae07549950c8bdce.chunk.js'},{'revision':null,'url':'js/files.c723dabab26e48d06683.chunk.js'},{'revision':null,'url':'js/home.1bfba76cdbb2fc7194dc.chunk.js'},{'revision':null,'url':'js/hubs.99a089268648607f734d.chunk.js'},{'revision':null,'url':'js/main.560335911ba879ef8877.entry.js'},{'revision':null,'url':'js/messages.1fff9c30585362386309.chunk.js'},{'revision':null,'url':'js/queue.822b774c6541212741c2.chunk.js'},{'revision':null,'url':'js/search.6a9813389fd4fec46997.chunk.js'},{'revision':null,'url':'js/settings.809f0f5d0b8ca408ae54.chunk.js'},{'revision':null,'url':'js/share.d66035dc828b2f3c8bb0.chunk.js'},{'revision':null,'url':'js/system-log.b6bc274d7fb71714ca24.chunk.js'},{'revision':null,'url':'js/transfers.8d1840e604ad0e4c0c15.chunk.js'}].map((function(t){return e+t.url})),n="resource-store";function l(e,t){return caches.match(new URL(t)).then((function(t){return t?(console.log("[SW] Return cached",e.request.url),t):(console.log("[SW] Fetch",e.request.url),fetch(e.request))}))}self.addEventListener("install",(e=>{console.log("[SW] Worker installed"),e.waitUntil(caches.open(n).then((e=>e.addAll([...t]))).then((()=>{console.log("[SW] Assets: ",t)})).catch((e=>{throw console.error(e),e})))})),self.addEventListener("activate",(e=>{console.log("[SW] Activate event"),e.waitUntil(caches.keys().then((e=>Promise.all(e.map((e=>caches.open(e).then((e=>(e=>e.keys().then((n=>Promise.all(n.map((n=>t.includes(n.url)?(console.log(`[SW] Cached asset ${n.url} still exists, skip delete`),null):e.delete(n).then((e=>{console.log(`[SW] Cached asset ${n.url} deleted`,e)}))))))))(e)))))))))})),self.addEventListener("fetch",(t=>{if("GET"===t.request.method){if("navigate"===t.request.mode||t.request.url.startsWith(e)&&-1===t.request.url.indexOf(".",e.length)&&!t.request.url.replace(e,"").match(/^(view)\//)){console.log("[SW] Navigate action, fetch index",t.request.url);const s=e+"index.html";return t.respondWith(new Promise((e=>{fetch(s).then((l=>{caches.open(n).then((n=>{n.put(new Request(s),l.clone()).then((()=>{console.log("[SW] Index file cached",t.request.url),e(l)}))}))})).catch((n=>{console.log("[SW] Navigate action, failed to fetch index",t.request.url,n),e(l(t,s))}))})))}return t.respondWith(l(t,t.request.url))}}))})();
2
2
  //# sourceMappingURL=sw.js.map
package/dist/sw.js.gz CHANGED
Binary file
package/dist/sw.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://airdcpp-webui/./src/sw.js"],"names":["basePath","self","location","origin","pathname","replace","assets","__WB_MANIFEST","map","asset","url","CACHE_NAME","respondCache","e","cacheUrl","caches","match","URL","then","response","console","log","request","fetch","addEventListener","waitUntil","open","cache","addAll","catch","error","event","keys","cacheNames","Promise","all","cacheName","includes","delete","deleted","deleteUnusedAssets","method","mode","startsWith","indexOf","length","respondWith","resolve","res","put","Request","clone","err"],"mappings":"MAAA,MAAM,EACJ,KAAK,SAAS,OAAS,KAAK,SAAS,SAAS,QAAQ,QAA2B,IAW7E,EAAS,uzGAAK,cAAc,KATlC,SAAkB,GAChB,OAAO,EAAW,EAAM,GAC1B,IAUM,EAAa,iBA0DnB,SAAS,EAAa,EAAG,GACvB,OAAO,OAAO,MAAM,IAAI,IAAI,IAAW,MAAK,SAAU,GACpD,OAAI,GAEA,QAAQ,IAAI,qBAAsB,EAAE,QAAQ,KAGvC,IAIP,QAAQ,IAAI,aAAc,EAAE,QAAQ,KAG/B,MAAM,EAAE,SACjB,GACF,CAxEA,KAAK,iBAAiB,WAAY,IAChC,QAAQ,IAAI,yBAEZ,EAAE,UACA,OACG,KAAK,GACL,MAAM,GAAU,EAAM,OAAO,IAAI,MACjC,MAAK,KAEF,QAAQ,IAAI,gBAAiB,MAGhC,OAAO,IAEN,MADA,QAAQ,MAAM,GACR,CAAK,IAEhB,IAuBH,KAAK,iBAAiB,YAAa,IAE/B,QAAQ,IAAI,uBAId,EAAM,UACJ,OAAO,OAAO,MAAM,GACX,QAAQ,IACb,EAAW,KAAK,GACP,OAAO,KAAK,GAAW,MAAM,GA9BnB,CAAC,GACnB,EAAM,OAAO,MAAM,GACjB,QAAQ,IACb,EAAK,KAAK,GACJ,EAAO,SAAS,EAAQ,MAExB,QAAQ,IAAI,qBAAqB,EAAQ,iCAGpC,MAGF,EAAM,OAAO,GAAS,MAAM,IACjC,QAAQ,IAAI,qBAAqB,EAAQ,cAAe,EAAQ,SAiBlB,CAAmB,UAIxE,IAqBH,KAAK,iBAAiB,SAAU,IAC9B,GAAyB,QAArB,EAAE,QAAQ,OAAd,CAEA,GACqB,aAAnB,EAAE,QAAQ,MACT,EAAE,QAAQ,IAAI,WAAW,KACyB,IAAjD,EAAE,QAAQ,IAAI,QAAQ,IAAK,EAAS,UACnC,EAAE,QAAQ,IAAI,QAAQ,EAAU,IAAI,MAAM,aAC7C,CACA,QAAQ,IAAI,oCAAqC,EAAE,QAAQ,KAC3D,MAAM,EAAW,EAAW,aAG5B,OAAO,EAAE,YACP,IAAI,SAAS,IACX,MAAM,GACH,MAAM,IACL,OAAO,KAAK,GAAY,MAAM,IAC5B,EAAM,IAAI,IAAI,QAAQ,GAAW,EAAI,SAAS,MAAK,KACjD,QAAQ,IAAI,yBAA0B,EAAE,QAAQ,KAChD,EAAQ,EAAI,GACZ,GACF,IAEH,OAAO,IACN,QAAQ,IACN,8CACA,EAAE,QAAQ,IACV,GAEF,EAAQ,EAAa,EAAG,GAAU,GAClC,KAKV,OAAO,EAAE,YAAY,EAAa,EAAG,EAAE,QAAQ,KAnCT,CAmCc","file":"sw.js","sourceRoot":"","sourcesContent":["const basePath =\n self.location.origin + self.location.pathname.replace(process.env.SERVICEWORKER, '');\n\nfunction mapAsset(asset) {\n return basePath + asset.url;\n}\n\n// Asset format:\n// {\n// \"revision\": null,\n// \"url\": \"js/1532.7fc8e4ac5701a8feac67.chunk.js\"\n// }\nconst assets = self.__WB_MANIFEST.map(mapAsset);\n\nconst DEBUG = true;\nconst CACHE_NAME = 'resource-store';\n\nself.addEventListener('install', (e) => {\n console.log('[SW] Worker installed');\n\n e.waitUntil(\n caches\n .open(CACHE_NAME)\n .then((cache) => cache.addAll([...assets]))\n .then(() => {\n if (DEBUG) {\n console.log('[SW] Assets: ', assets);\n }\n })\n .catch((error) => {\n console.error(error);\n throw error;\n })\n );\n});\n\nconst deleteUnusedAssets = (cache) => {\n return cache.keys().then((keys) => {\n return Promise.all(\n keys.map((request) => {\n if (assets.includes(request.url)) {\n if (DEBUG) {\n console.log(`[SW] Cached asset ${request.url} still exists, skip delete`);\n }\n\n return null;\n }\n\n return cache.delete(request).then((deleted) => {\n console.log(`[SW] Cached asset ${request.url} deleted`, deleted);\n });\n })\n );\n });\n};\n\nself.addEventListener('activate', (event) => {\n if (DEBUG) {\n console.log('[SW] Activate event');\n }\n\n // Clean the caches\n event.waitUntil(\n caches.keys().then((cacheNames) => {\n return Promise.all(\n cacheNames.map((cacheName) => {\n return caches.open(cacheName).then((cache) => deleteUnusedAssets(cache));\n })\n );\n })\n );\n});\n\nfunction respondCache(e, cacheUrl) {\n return caches.match(new URL(cacheUrl)).then(function (response) {\n if (response) {\n if (DEBUG) {\n console.log('[SW] Return cached', e.request.url);\n }\n\n return response;\n }\n\n if (DEBUG) {\n console.log('[SW] Fetch', e.request.url);\n }\n\n return fetch(e.request);\n });\n}\n\nself.addEventListener('fetch', (e) => {\n if (e.request.method !== 'GET') return;\n\n if (\n e.request.mode === 'navigate' ||\n (e.request.url.startsWith(basePath) &&\n e.request.url.indexOf('.', basePath.length) === -1 && // no file extension?\n !e.request.url.replace(basePath, '').match(/^(view)\\//))\n ) {\n console.log('[SW] Navigate action, fetch index', e.request.url);\n const cacheUrl = basePath + 'index.html';\n\n // Try to fetch index from the server, fall back to using a cached version if it fails\n return e.respondWith(\n new Promise((resolve) => {\n fetch(cacheUrl)\n .then((res) => {\n caches.open(CACHE_NAME).then((cache) => {\n cache.put(new Request(cacheUrl), res.clone()).then(() => {\n console.log('[SW] Index file cached', e.request.url);\n resolve(res);\n });\n });\n })\n .catch((err) => {\n console.log(\n '[SW] Navigate action, failed to fetch index',\n e.request.url,\n err\n );\n resolve(respondCache(e, cacheUrl));\n });\n })\n );\n }\n\n return e.respondWith(respondCache(e, e.request.url));\n});\n"]}
1
+ {"version":3,"sources":["webpack://airdcpp-webui/./src/sw.js"],"names":["basePath","self","location","origin","pathname","replace","assets","__WB_MANIFEST","map","asset","url","CACHE_NAME","respondCache","e","cacheUrl","caches","match","URL","then","response","console","log","request","fetch","addEventListener","waitUntil","open","cache","addAll","catch","error","event","keys","cacheNames","Promise","all","cacheName","includes","delete","deleted","deleteUnusedAssets","method","mode","startsWith","indexOf","length","respondWith","resolve","res","put","Request","clone","err"],"mappings":"MAAA,MAAM,EACJ,KAAK,SAAS,OAAS,KAAK,SAAS,SAAS,QAAQ,QAA2B,IAW7E,EAAS,wtGAAK,cAAc,KATlC,SAAkB,GAChB,OAAO,EAAW,EAAM,GAC1B,IAUM,EAAa,iBA0DnB,SAAS,EAAa,EAAG,GACvB,OAAO,OAAO,MAAM,IAAI,IAAI,IAAW,MAAK,SAAU,GACpD,OAAI,GAEA,QAAQ,IAAI,qBAAsB,EAAE,QAAQ,KAGvC,IAIP,QAAQ,IAAI,aAAc,EAAE,QAAQ,KAG/B,MAAM,EAAE,SACjB,GACF,CAxEA,KAAK,iBAAiB,WAAY,IAChC,QAAQ,IAAI,yBAEZ,EAAE,UACA,OACG,KAAK,GACL,MAAM,GAAU,EAAM,OAAO,IAAI,MACjC,MAAK,KAEF,QAAQ,IAAI,gBAAiB,MAGhC,OAAO,IAEN,MADA,QAAQ,MAAM,GACR,CAAK,IAEhB,IAuBH,KAAK,iBAAiB,YAAa,IAE/B,QAAQ,IAAI,uBAId,EAAM,UACJ,OAAO,OAAO,MAAM,GACX,QAAQ,IACb,EAAW,KAAK,GACP,OAAO,KAAK,GAAW,MAAM,GA9BnB,CAAC,GACnB,EAAM,OAAO,MAAM,GACjB,QAAQ,IACb,EAAK,KAAK,GACJ,EAAO,SAAS,EAAQ,MAExB,QAAQ,IAAI,qBAAqB,EAAQ,iCAGpC,MAGF,EAAM,OAAO,GAAS,MAAM,IACjC,QAAQ,IAAI,qBAAqB,EAAQ,cAAe,EAAQ,SAiBlB,CAAmB,UAIxE,IAqBH,KAAK,iBAAiB,SAAU,IAC9B,GAAyB,QAArB,EAAE,QAAQ,OAAd,CAEA,GACqB,aAAnB,EAAE,QAAQ,MACT,EAAE,QAAQ,IAAI,WAAW,KACyB,IAAjD,EAAE,QAAQ,IAAI,QAAQ,IAAK,EAAS,UACnC,EAAE,QAAQ,IAAI,QAAQ,EAAU,IAAI,MAAM,aAC7C,CACA,QAAQ,IAAI,oCAAqC,EAAE,QAAQ,KAC3D,MAAM,EAAW,EAAW,aAG5B,OAAO,EAAE,YACP,IAAI,SAAS,IACX,MAAM,GACH,MAAM,IACL,OAAO,KAAK,GAAY,MAAM,IAC5B,EAAM,IAAI,IAAI,QAAQ,GAAW,EAAI,SAAS,MAAK,KACjD,QAAQ,IAAI,yBAA0B,EAAE,QAAQ,KAChD,EAAQ,EAAI,GACZ,GACF,IAEH,OAAO,IACN,QAAQ,IACN,8CACA,EAAE,QAAQ,IACV,GAEF,EAAQ,EAAa,EAAG,GAAU,GAClC,KAKV,OAAO,EAAE,YAAY,EAAa,EAAG,EAAE,QAAQ,KAnCT,CAmCc","file":"sw.js","sourceRoot":"","sourcesContent":["const basePath =\r\n self.location.origin + self.location.pathname.replace(process.env.SERVICEWORKER, '');\r\n\r\nfunction mapAsset(asset) {\r\n return basePath + asset.url;\r\n}\r\n\r\n// Asset format:\r\n// {\r\n// \"revision\": null,\r\n// \"url\": \"js/1532.7fc8e4ac5701a8feac67.chunk.js\"\r\n// }\r\nconst assets = self.__WB_MANIFEST.map(mapAsset);\r\n\r\nconst DEBUG = true;\r\nconst CACHE_NAME = 'resource-store';\r\n\r\nself.addEventListener('install', (e) => {\r\n console.log('[SW] Worker installed');\r\n\r\n e.waitUntil(\r\n caches\r\n .open(CACHE_NAME)\r\n .then((cache) => cache.addAll([...assets]))\r\n .then(() => {\r\n if (DEBUG) {\r\n console.log('[SW] Assets: ', assets);\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n throw error;\r\n })\r\n );\r\n});\r\n\r\nconst deleteUnusedAssets = (cache) => {\r\n return cache.keys().then((keys) => {\r\n return Promise.all(\r\n keys.map((request) => {\r\n if (assets.includes(request.url)) {\r\n if (DEBUG) {\r\n console.log(`[SW] Cached asset ${request.url} still exists, skip delete`);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n return cache.delete(request).then((deleted) => {\r\n console.log(`[SW] Cached asset ${request.url} deleted`, deleted);\r\n });\r\n })\r\n );\r\n });\r\n};\r\n\r\nself.addEventListener('activate', (event) => {\r\n if (DEBUG) {\r\n console.log('[SW] Activate event');\r\n }\r\n\r\n // Clean the caches\r\n event.waitUntil(\r\n caches.keys().then((cacheNames) => {\r\n return Promise.all(\r\n cacheNames.map((cacheName) => {\r\n return caches.open(cacheName).then((cache) => deleteUnusedAssets(cache));\r\n })\r\n );\r\n })\r\n );\r\n});\r\n\r\nfunction respondCache(e, cacheUrl) {\r\n return caches.match(new URL(cacheUrl)).then(function (response) {\r\n if (response) {\r\n if (DEBUG) {\r\n console.log('[SW] Return cached', e.request.url);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n if (DEBUG) {\r\n console.log('[SW] Fetch', e.request.url);\r\n }\r\n\r\n return fetch(e.request);\r\n });\r\n}\r\n\r\nself.addEventListener('fetch', (e) => {\r\n if (e.request.method !== 'GET') return;\r\n\r\n if (\r\n e.request.mode === 'navigate' ||\r\n (e.request.url.startsWith(basePath) &&\r\n e.request.url.indexOf('.', basePath.length) === -1 && // no file extension?\r\n !e.request.url.replace(basePath, '').match(/^(view)\\//))\r\n ) {\r\n console.log('[SW] Navigate action, fetch index', e.request.url);\r\n const cacheUrl = basePath + 'index.html';\r\n\r\n // Try to fetch index from the server, fall back to using a cached version if it fails\r\n return e.respondWith(\r\n new Promise((resolve) => {\r\n fetch(cacheUrl)\r\n .then((res) => {\r\n caches.open(CACHE_NAME).then((cache) => {\r\n cache.put(new Request(cacheUrl), res.clone()).then(() => {\r\n console.log('[SW] Index file cached', e.request.url);\r\n resolve(res);\r\n });\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(\r\n '[SW] Navigate action, failed to fetch index',\r\n e.request.url,\r\n err\r\n );\r\n resolve(respondCache(e, cacheUrl));\r\n });\r\n })\r\n );\r\n }\r\n\r\n return e.respondWith(respondCache(e, e.request.url));\r\n});\r\n"]}
package/jest.config.js CHANGED
@@ -1,18 +1,18 @@
1
- module.exports = {
2
- preset: 'ts-jest',
3
- moduleDirectories: ['src', 'node_modules'],
4
- transform: {
5
- '^.+\\.jsx?$': 'babel-jest',
6
- '^.+\\.tsx?$': 'ts-jest',
7
- },
8
- moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx'],
9
- moduleNameMapper: {
10
- '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
11
- '<rootDir>/jest/stubs/FileStub.js',
12
- '\\.(css|less)$': '<rootDir>/jest/stubs/CSSStub.js',
13
- },
14
- setupFiles: ['./jest/setup.js'],
15
- cacheDirectory: './jest/cache/',
16
- testEnvironment: 'jsdom',
17
- transformIgnorePatterns: ['node_modules/(?!escape-string-regexp).+\\.(js|jsx)$'],
18
- };
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ moduleDirectories: ['src', 'node_modules'],
4
+ transform: {
5
+ '^.+\\.jsx?$': 'babel-jest',
6
+ '^.+\\.tsx?$': 'ts-jest',
7
+ },
8
+ moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx'],
9
+ moduleNameMapper: {
10
+ '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
11
+ '<rootDir>/jest/stubs/FileStub.js',
12
+ '\\.(css|less)$': '<rootDir>/jest/stubs/CSSStub.js',
13
+ },
14
+ setupFiles: ['./jest/setup.js'],
15
+ cacheDirectory: './jest/cache/',
16
+ testEnvironment: 'jsdom',
17
+ transformIgnorePatterns: ['node_modules/(?!escape-string-regexp).+\\.(js|jsx)$'],
18
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "airdcpp-webui",
3
- "version": "2.12.0-beta.3",
3
+ "version": "2.12.0",
4
4
  "description": "AirDC++ Web UI",
5
5
  "license": "MIT",
6
6
  "authors": [
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[285],{48878:(e,n,a)=>{a.d(n,{Z:()=>l});var t=a(87537),s=a.n(t),o=a(23645),i=a.n(o)()(s());i.push([e.id,".download-dialog .accordion.download-targets {\n overflow-y: auto;\n}\n\n.download-dialog .main-content,\n.download-dialog .mobile.layout {\n display: flex;\n flex-direction: column;\n}\n\n.download-dialog .main-content .list {\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.download-dialog .content > div,\n.download-dialog .ui.grid .column,\n.download-dialog .main-content {\n height: 100%;\n}\n\n.download-dialog .download-handler {\n display: flex;\n align-items: baseline;\n}\n\n.download-dialog .disk-info {\n color: black;\n font-size: 90%;\n font-style: italic;\n}\n\n.download-dialog .normal.layout .four.wide.column {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n","",{version:3,sources:["webpack://./src/components/download/style.css"],names:[],mappings:"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,aAAa;EACb,qBAAqB;AACvB;;AAEA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AAChC",sourcesContent:[".download-dialog .accordion.download-targets {\n overflow-y: auto;\n}\n\n.download-dialog .main-content,\n.download-dialog .mobile.layout {\n display: flex;\n flex-direction: column;\n}\n\n.download-dialog .main-content .list {\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.download-dialog .content > div,\n.download-dialog .ui.grid .column,\n.download-dialog .main-content {\n height: 100%;\n}\n\n.download-dialog .download-handler {\n display: flex;\n align-items: baseline;\n}\n\n.download-dialog .disk-info {\n color: black;\n font-size: 90%;\n font-style: italic;\n}\n\n.download-dialog .normal.layout .four.wide.column {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n"],sourceRoot:""}]);const l=i},62285:(e,n,a)=>{a.d(n,{Z:()=>oe});var t=a(85893),s=a(67294),o=a(16550),i=a(91072),l=a(4047),d=a(15479),r=a(1251),c=a(91894),h=a(48117),u=a(57136),m=a(66883),p=a(42090),j=a(92245),g=a(28427),O=a(72181),w=a(89519),f=a(8717),A=a(3629),v=a(9781),y=a(10606),b=a(98374),x=a(32347),E=a(27695),N=a(35936),P=a(2445);const C=(e,n)=>e.free_space<=0?e.path:` (${n((0,f.zS)("spaceFree",x.jv.COMMON),{defaultValue:"{{freeSpace}} free",replace:{freeSpace:(0,P.BU)(e.free_space,n)}})})`,I=({pathInfo:e,downloadHandler:n,t:a})=>(0,t.jsxs)("div",Object.assign({className:"item"},{children:[(0,t.jsx)(N.Z,{icon:h.Z.FOLDER}),(0,t.jsx)("div",Object.assign({className:"content"},{children:(0,t.jsxs)("a",Object.assign({onClick:()=>n(e.path)},{children:[e.path,(0,t.jsx)("span",Object.assign({className:"disk-info"},{children:C(e,a)}))]}))}))]})),Z=(0,p.Z)((function({downloadHandler:e,pathInfos:n,t:a}){return(0,t.jsx)("div",Object.assign({className:"ui relaxed list"},{children:n.map((n=>(0,t.jsx)(I,{pathInfo:n,downloadHandler:e,t:a},n.path)))}))}),{urls:{pathInfos:({paths:e},n)=>n.post(c.Z.DISK_INFO_URL,{paths:e})}}),R=e=>0===e.paths.length?(0,t.jsx)(E.Z,{title:(0,f.Iu)("No paths to display",e.t,x.jv.COMMON)}):(0,t.jsx)(Z,Object.assign({},e));var B=a(45697),k=a.n(B),D=a(35451);class S extends s.Component{constructor(){super(...arguments),this.formatParent=e=>{const{downloadHandler:n,t:a}=this.props;return(0,t.jsxs)(s.Fragment,{children:[(0,t.jsxs)("div",Object.assign({className:"title"},{children:[(0,t.jsx)(N.Z,{icon:h.Z.DROPDOWN}),e.name]})),(0,t.jsx)("div",Object.assign({className:"content"},{children:(0,t.jsx)(R,{paths:e.paths,downloadHandler:n,t:a})}))]},e.name)}}render(){const{groupedPaths:e,t:n}=this.props;return 0===e.length?(0,t.jsx)(E.Z,{title:(0,f.Iu)("No paths to display",n,x.jv.COMMON)}):(0,t.jsx)(D.ZP,Object.assign({className:"styled download-targets"},{children:e.map(this.formatParent)}))}}S.propTypes={downloadHandler:k().func.isRequired,groupedPaths:k().array.isRequired};const _=S;var M=a(68662);const H=(e,n,a)=>n?[...e,(0,t.jsxs)(b.Z,Object.assign({onClick:n},{children:[(0,f.Iu)("Browse",a,x.jv.COMMON),(0,t.jsx)(N.Z,{icon:h.Z.BROWSE})]}),"browse")]:e,T=({menuItems:e,title:n,handleBrowse:a,t:s,children:o})=>(0,t.jsxs)("div",Object.assign({className:"mobile layout"},{children:[(0,t.jsx)(M.Z,Object.assign({selection:!0,caption:n},{children:H(e,a,s)})),(0,t.jsx)("div",Object.assign({className:"ui segment main-content"},{children:o}))]}));var L=a(84807),U=a(24101);const G=({menuItems:e,title:n,handleBrowse:a,t:s,children:o})=>(0,t.jsxs)(U.rj,Object.assign({className:"normal layout"},{children:[(0,t.jsxs)("div",Object.assign({className:"four wide column"},{children:[(0,t.jsx)("div",Object.assign({className:"ui vertical fluid tabular menu"},{children:e})),!!a&&(0,t.jsx)(L.Z,{className:"fluid basic",caption:(0,f.Iu)("Browse",s,x.jv.COMMON),onClick:a,icon:h.Z.BROWSE})]})),(0,t.jsx)("div",Object.assign({className:"twelve wide stretched column"},{children:(0,t.jsx)("div",Object.assign({className:"ui segment main-content"},{children:o}))}))]})),F=e=>{const{t:n}=(0,i.$G)(),[a,o]=(0,s.useState)("history"),l=s.useMemo((()=>{const{historyPaths:n,sharePaths:a,favoritePaths:s,itemInfo:o}=e;return(e=>{const{sharePaths:n,favoritePaths:a,historyPaths:s,dupePaths:o}=e;return[{name:"Previous",key:"history",list:s,component:({downloadHandler:e,t:n})=>(0,t.jsx)(R,{paths:s,downloadHandler:e,t:n})},{name:"Shared",key:"shared",list:n,component:({downloadHandler:e,t:a})=>(0,t.jsx)(_,{groupedPaths:n,downloadHandler:e,t:a})},{name:"Favorites",key:"favorites",list:a,component:({downloadHandler:e,t:n})=>(0,t.jsx)(_,{groupedPaths:a,downloadHandler:e,t:n})},{name:"Dupes",key:"dupes",list:o,component:({downloadHandler:e,t:n})=>(0,t.jsx)(R,{paths:o,downloadHandler:e,t:n})}]})({historyPaths:n,sharePaths:a,favoritePaths:s,dupePaths:o.dupe?o.dupe.paths.map((e=>(0,v.Il)(e))):[]})}),[]),d=l.find((e=>e.key===a));if(!d)return null;const r=l.map((e=>((e,n,a,s)=>(0,t.jsx)(b.Z,Object.assign({onClick:()=>a(e.key),active:n===e.key},{children:(0,t.jsxs)(t.Fragment,{children:[s((0,f.zS)(e.key,x.jv.COMMON),e.name),!!e.list&&(0,t.jsx)("div",Object.assign({className:"ui small right label"},{children:e.list.length}))]})}),e.key))(e,a,o,n))),c=(0,y.wd)()?T:G;return(0,t.jsx)(c,Object.assign({menuItems:r,title:d.name,handleBrowse:e.handleBrowse,t:n},{children:(0,t.jsx)(d.component,{t:n,downloadHandler:e.downloadHandler})}),d.key)};var W=a(76249),$=a(93379),q=a.n($),z=a(7795),Y=a.n(z),V=a(90569),K=a.n(V),X=a(3565),J=a.n(X),Q=a(19216),ee=a.n(Q),ne=a(44589),ae=a.n(ne),te=a(48878),se={};se.styleTagTransform=ae(),se.setAttributes=J(),se.insert=K().bind(null,"head"),se.domAPI=Y(),se.insertStyleElement=ee(),q()(te.Z,se),te.Z&&te.Z.locals&&te.Z.locals;const oe=(0,j.ZP)((0,p.Z)((e=>{const{t:n}=(0,i.$G)(),a=(0,s.useRef)(null),{downloadHandler:l,itemInfo:r,userGetter:p,match:j,session:v,historyPaths:y,favoritePaths:b,sharePaths:E}=e,N=function(e,n){var a={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&n.indexOf(t)<0&&(a[t]=e[t]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(t=Object.getOwnPropertySymbols(e);s<t.length;s++)n.indexOf(t[s])<0&&Object.prototype.propertyIsEnumerable.call(e,t[s])&&(a[t[s]]=e[t[s]])}return a}(e,["downloadHandler","itemInfo","userGetter","match","session","historyPaths","favoritePaths","sharePaths"]),P=(t,s)=>{return o=void 0,i=void 0,h=function*(){try{yield l(r,p?p(j.params.downloadItemId,e):void 0,{target_name:s||r.name,target_directory:t,priority:W.gg.DEFAULT},v)}catch(e){u.Z.error({title:n((0,f.zS)("queueingFailed",x.jv.COMMON),{defaultValue:"Failed to queue the item {{item.name}}",replace:{item:r}}),message:e.message})}(0,w.h9)((()=>(0,A.V)(d.n0.DOWNLOAD_DIR,t)),n),a.current&&a.current.hide()},new((c=void 0)||(c=Promise))((function(e,n){function a(e){try{s(h.next(e))}catch(e){n(e)}}function t(e){try{s(h.throw(e))}catch(e){n(e)}}function s(n){var s;n.done?e(n.value):(s=n.value,s instanceof c?s:new c((function(e){e(s)}))).then(a,t)}s((h=h.apply(o,i||[])).next())}));var o,i,c,h},C={subHeader:r.name,title:(0,f.Iu)("Download",n,x.jv.COMMON),icon:h.Z.DOWNLOAD,closable:!1,returnTo:e.returnTo},I=m.Z.hasAccess(W.PS.FILESYSTEM_VIEW);return(0,t.jsxs)(o.rs,{children:[(0,t.jsx)(o.AW,Object.assign({path:`${j.path}/browse`},{children:(0,t.jsx)(O.P,Object.assign({onConfirm:(e,n,a)=>P(n,a),initialPath:(()=>{const e=y.length>0?y[y.length-1]:"";return"directory"===r.type.id?e:e+r.name})(),selectMode:"directory"===r.type.id?x.pC.DIRECTORY:x.pC.FILE,historyId:c.Z.LOCATION_DOWNLOAD,approveCaption:(0,f.Iu)("Download",n,x.jv.COMMON)},C))})),(0,t.jsx)(o.AW,Object.assign({path:j.path,exact:!0},{children:(0,t.jsx)(g.Z,Object.assign({ref:a,className:"download-dialog",fullHeight:!0},C,N,{children:(0,t.jsx)(F,{downloadHandler:P,handleBrowse:I?()=>{const{history:n}=e;n.replace(`${j.url}/browse`)}:void 0,historyPaths:y,favoritePaths:b,sharePaths:E,itemInfo:r})}))}))]})}),{urls:{sharePaths:l.Z.GROUPED_ROOTS_GET_URL,favoritePaths:r.Z.GROUPED_DIRECTORIES_URL,historyPaths:d.ZP.STRINGS_URL+"/"+d.n0.DOWNLOAD_DIR,itemInfo:({match:e,itemDataGetter:n},a)=>n(e.params.downloadItemId,a)}}),"download/:downloadItemId")},24101:(e,n,a)=>{a.d(n,{X2:()=>c,h4:()=>h,rj:()=>u});var t=a(85893),s=(a(67294),a(94184)),o=a.n(s),i=a(91072),l=a(8717),d=a(32347);const r=e=>e||(0,t.jsx)(i.cC,Object.assign({i18nKey:(0,l.zS)("na",d.jv.COMMON)},{children:"N/A"})),c=({title:e,text:n,className:a,titleWidth:s="four",noText:i})=>(0,t.jsxs)("div",Object.assign({className:o()("ui row",a)},{children:[(0,t.jsx)("div",Object.assign({className:o()(i?"sixteen":s,"wide column title")},{children:(0,t.jsx)("div",Object.assign({className:"ui tiny header",style:{overflow:"hidden"}},{children:e}))})),!i&&(0,t.jsx)("div",Object.assign({className:"column value"},{children:r(n)}))]})),h=({title:e})=>(0,t.jsx)("div",Object.assign({className:"ui row"},{children:(0,t.jsx)("div",Object.assign({className:"sixteen wide column"},{children:(0,t.jsx)("div",Object.assign({className:"ui blue section header"},{children:e}))}))})),u=e=>{var{className:n,children:a,columns:s,stackable:i}=e,l=function(e,n){var a={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&n.indexOf(t)<0&&(a[t]=e[t]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(t=Object.getOwnPropertySymbols(e);s<t.length;s++)n.indexOf(t[s])<0&&Object.prototype.propertyIsEnumerable.call(e,t[s])&&(a[t[s]]=e[t[s]])}return a}(e,["className","children","columns","stackable"]);return(0,t.jsx)("div",Object.assign({className:o()("ui grid",{[`${s} column`]:!!s},{stackable:i},n)},l,{children:a}))}},1251:(e,n,a)=>{a.d(n,{Z:()=>s});const t="favorite_directories",s={MODULE_URL:t,GROUPED_DIRECTORIES_URL:t+"/grouped_paths",DIRECTORIES_URL:t,DIRECTORIES_UPDATED:"favorite_directories_updated"}},3629:(e,n,a)=>{a.d(n,{V:()=>o});var t=a(518),s=a(15479);const o=(e,n)=>t.Z.post(`${s.ZP.STRINGS_URL}/${e}`,{string:n})}}]);
2
- //# sourceMappingURL=285.4cfd5122e0b82af77eb1.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"js/285.4cfd5122e0b82af77eb1.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/download/style.css","webpack://airdcpp-webui/./src/components/download/layout/sections/PathListItem.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/PathList.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/AccordionTargets.tsx","webpack://airdcpp-webui/./src/components/download/layout/MobileDownloadLayout.tsx","webpack://airdcpp-webui/./src/components/download/layout/NormalDownloadLayout.tsx","webpack://airdcpp-webui/./src/components/download/layout/DownloadLayout.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/sections.tsx","webpack://airdcpp-webui/./src/components/download/style.css?6643","webpack://airdcpp-webui/./src/components/download/DownloadDialog.tsx","webpack://airdcpp-webui/./src/components/semantic/Grid.tsx","webpack://airdcpp-webui/./src/constants/FavoriteDirectoryConstants.ts","webpack://airdcpp-webui/./src/services/api/HistoryApi.ts"],"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, \".download-dialog .accordion.download-targets {\\n overflow-y: auto;\\n}\\n\\n.download-dialog .main-content,\\n.download-dialog .mobile.layout {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.download-dialog .main-content .list {\\n overflow-y: auto;\\n overflow-x: hidden;\\n}\\n\\n.download-dialog .content > div,\\n.download-dialog .ui.grid .column,\\n.download-dialog .main-content {\\n height: 100%;\\n}\\n\\n.download-dialog .download-handler {\\n display: flex;\\n align-items: baseline;\\n}\\n\\n.download-dialog .disk-info {\\n color: black;\\n font-size: 90%;\\n font-style: italic;\\n}\\n\\n.download-dialog .normal.layout .four.wide.column {\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/download/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,aAAa;EACb,qBAAqB;AACvB;;AAEA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AAChC\",\"sourcesContent\":[\".download-dialog .accordion.download-targets {\\n overflow-y: auto;\\n}\\n\\n.download-dialog .main-content,\\n.download-dialog .mobile.layout {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.download-dialog .main-content .list {\\n overflow-y: auto;\\n overflow-x: hidden;\\n}\\n\\n.download-dialog .content > div,\\n.download-dialog .ui.grid .column,\\n.download-dialog .main-content {\\n height: 100%;\\n}\\n\\n.download-dialog .download-handler {\\n display: flex;\\n align-items: baseline;\\n}\\n\\n.download-dialog .disk-info {\\n color: black;\\n font-size: 90%;\\n font-style: italic;\\n}\\n\\n.download-dialog .normal.layout .four.wide.column {\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","//import PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport IconConstants from 'constants/IconConstants';\n\nimport Icon from 'components/semantic/Icon';\n\nimport { toI18nKey } from 'utils/TranslationUtils';\nimport { formatSize } from 'utils/ValueFormat';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\nimport { PathDownloadHandler } from '../../types';\n\ninterface PathItemProps {\n pathInfo: API.DiskSpaceInfo;\n downloadHandler: PathDownloadHandler;\n t: UI.TranslateF;\n}\n\nconst formatFreeSpace = (pathInfo: API.DiskSpaceInfo, t: UI.TranslateF) => {\n if (pathInfo.free_space <= 0) {\n return pathInfo.path;\n }\n\n return ` (${t(toI18nKey('spaceFree', UI.Modules.COMMON), {\n defaultValue: '{{freeSpace}} free',\n replace: {\n freeSpace: formatSize(pathInfo.free_space, t),\n },\n })})`;\n};\n\nexport const PathListItem: React.FC<PathItemProps> = ({\n pathInfo,\n downloadHandler,\n t,\n}) => (\n <div className=\"item\">\n <Icon icon={IconConstants.FOLDER} />\n <div className=\"content\">\n <a onClick={() => downloadHandler(pathInfo.path)}>\n {pathInfo.path}\n <span className=\"disk-info\">{formatFreeSpace(pathInfo, t)}</span>\n </a>\n </div>\n </div>\n);\n","//import PropTypes from 'prop-types';\n\nimport FilesystemConstants from 'constants/FilesystemConstants';\n\nimport DataProviderDecorator from 'decorators/DataProviderDecorator';\n\nimport Message from 'components/semantic/Message';\n\nimport { translate } from 'utils/TranslationUtils';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { PathDownloadHandler } from '../../types';\nimport { PathListItem } from './PathListItem';\n\ninterface PathListProps {\n downloadHandler: PathDownloadHandler;\n paths: string[];\n t: UI.TranslateF;\n}\n\ninterface PathListDataProps {\n pathInfos: API.DiskSpaceInfo[];\n}\n\nconst PathListWithData = DataProviderDecorator<PathListProps, PathListDataProps>(\n function PathList({ downloadHandler, pathInfos, t }) {\n return (\n <div className=\"ui relaxed list\">\n {pathInfos.map((pathInfo) => (\n <PathListItem\n key={pathInfo.path}\n pathInfo={pathInfo}\n downloadHandler={downloadHandler}\n t={t}\n />\n ))}\n </div>\n );\n },\n {\n urls: {\n pathInfos: ({ paths }, socket) =>\n socket.post(FilesystemConstants.DISK_INFO_URL, { paths }),\n },\n }\n);\n\n//PathList.PropTypes = {\n// Function handling the path selection. Receives the selected path as argument.\n//downloadHandler: PropTypes.func.isRequired,\n\n// Array of paths to list\n//paths: PropTypes.array.isRequired,\n//};\n\nconst PathList: React.FC<PathListProps> = (props) => {\n if (props.paths.length === 0) {\n return (\n <Message title={translate('No paths to display', props.t, UI.Modules.COMMON)} />\n );\n }\n\n return <PathListWithData {...props} />;\n};\n\nexport default PathList;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\n\nimport IconConstants from 'constants/IconConstants';\n\nimport Accordion from 'components/semantic/Accordion';\nimport Icon from 'components/semantic/Icon';\nimport Message from 'components/semantic/Message';\n\nimport { translate } from 'utils/TranslationUtils';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\nimport { PathDownloadHandler } from '../../types';\n\nimport PathList from './PathList';\n\ninterface AccordionTargetsProps {\n groupedPaths: API.GroupedPath[];\n downloadHandler: PathDownloadHandler;\n t: UI.TranslateF;\n}\n\nclass AccordionTargets extends Component<AccordionTargetsProps> {\n static propTypes = {\n // Function handling the path selection. Receives the selected path as argument.\n downloadHandler: PropTypes.func.isRequired,\n\n // Grouped paths to list\n groupedPaths: PropTypes.array.isRequired,\n };\n\n formatParent = (parent: API.GroupedPath) => {\n const { downloadHandler, t } = this.props;\n return (\n <React.Fragment key={parent.name}>\n <div className=\"title\">\n <Icon icon={IconConstants.DROPDOWN} />\n {parent.name}\n </div>\n\n <div className=\"content\">\n <PathList paths={parent.paths} downloadHandler={downloadHandler} t={t} />\n </div>\n </React.Fragment>\n );\n };\n\n render() {\n const { groupedPaths, t } = this.props;\n if (groupedPaths.length === 0) {\n return <Message title={translate('No paths to display', t, UI.Modules.COMMON)} />;\n }\n\n return (\n <Accordion className=\"styled download-targets\">\n {groupedPaths.map(this.formatParent)}\n </Accordion>\n );\n }\n}\n\nexport default AccordionTargets;\n","import * as React from 'react';\n\nimport { translate } from 'utils/TranslationUtils';\n\nimport Dropdown from 'components/semantic/Dropdown';\nimport MenuItemLink from 'components/semantic/MenuItemLink';\n\nimport * as UI from 'types/ui';\n\nimport Icon from 'components/semantic/Icon';\nimport { BrowseHandler, LayoutProps } from '../types';\nimport IconConstants from 'constants/IconConstants';\n\nconst appendBrowseItem = (\n menuItems: React.ReactNode[],\n handleBrowse: BrowseHandler,\n t: UI.TranslateF\n) => {\n if (!handleBrowse) {\n return menuItems;\n }\n\n return [\n ...menuItems,\n <MenuItemLink key=\"browse\" onClick={handleBrowse}>\n {translate('Browse', t, UI.Modules.COMMON)}\n <Icon icon={IconConstants.BROWSE} />\n </MenuItemLink>,\n ];\n};\n\nexport const MobileDownloadLayout: React.FC<LayoutProps> = ({\n menuItems,\n title,\n handleBrowse,\n t,\n children,\n}) => (\n <div className=\"mobile layout\">\n <Dropdown selection={true} caption={title}>\n {appendBrowseItem(menuItems, handleBrowse, t)}\n </Dropdown>\n <div className=\"ui segment main-content\">{children}</div>\n </div>\n);\n","import * as React from 'react';\n\nimport IconConstants from 'constants/IconConstants';\n\nimport { translate } from 'utils/TranslationUtils';\n\nimport Button from 'components/semantic/Button';\nimport { Grid } from 'components/semantic/Grid';\n\nimport * as UI from 'types/ui';\nimport { LayoutProps } from '../types';\n\nexport const NormalDownloadLayout: React.FC<LayoutProps> = ({\n menuItems,\n title,\n handleBrowse,\n t,\n children,\n}) => (\n <Grid className=\"normal layout\">\n <div className=\"four wide column\">\n <div className=\"ui vertical fluid tabular menu\">{menuItems}</div>\n {!!handleBrowse && (\n <Button\n className=\"fluid basic\"\n caption={translate('Browse', t, UI.Modules.COMMON)}\n onClick={handleBrowse}\n icon={IconConstants.BROWSE}\n />\n )}\n </div>\n <div className=\"twelve wide stretched column\">\n <div className=\"ui segment main-content\">{children}</div>\n </div>\n </Grid>\n);\n","import { useState } from 'react';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { getParentPath } from 'utils/FileUtils';\nimport { useMobileLayout } from 'utils/BrowserUtils';\nimport { toI18nKey } from 'utils/TranslationUtils';\n\nimport MenuItemLink from 'components/semantic/MenuItemLink';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { getDownloadSections, DownloadSection } from './sections';\nimport { BrowseHandler, PathDownloadHandler } from '../types';\n\nimport { MobileDownloadLayout } from './MobileDownloadLayout';\nimport { NormalDownloadLayout } from './NormalDownloadLayout';\n\nexport interface DownloadDataProps<\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo\n> {\n sharePaths: API.GroupedPath[];\n favoritePaths: API.GroupedPath[];\n historyPaths: string[];\n itemInfo: ItemT;\n}\n\nexport interface DownloadLayoutProps<\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo\n> extends DownloadDataProps<ItemT> {\n downloadHandler: PathDownloadHandler;\n handleBrowse: BrowseHandler;\n}\n\nconst getMenuItem = (\n section: DownloadSection,\n activeSection: string,\n onClick: (key: string) => void,\n t: UI.TranslateF\n) => (\n <MenuItemLink\n key={section.key}\n onClick={() => onClick(section.key)}\n active={activeSection === section.key}\n >\n <>\n {t(toI18nKey(section.key, UI.Modules.COMMON), section.name)}\n {!!section.list && (\n <div className=\"ui small right label\">{section.list.length}</div>\n )}\n </>\n </MenuItemLink>\n);\n\nexport const DownloadLayout: React.FC<DownloadLayoutProps> = (props) => {\n const { t } = useTranslation();\n const [activeSectionKey, setActiveSectionKey] = useState('history');\n\n const sections = React.useMemo(() => {\n const { historyPaths, sharePaths, favoritePaths, itemInfo } = props;\n const dupePaths = itemInfo.dupe\n ? itemInfo.dupe.paths.map((path) => getParentPath(path))\n : [];\n\n return getDownloadSections({\n historyPaths,\n sharePaths,\n favoritePaths,\n dupePaths,\n });\n }, []);\n\n const activeSection = sections.find((s) => s.key === activeSectionKey);\n if (!activeSection) {\n return null;\n }\n\n const menuItems = sections.map((s) =>\n getMenuItem(s, activeSectionKey, setActiveSectionKey, t)\n );\n\n const Component = useMobileLayout() ? MobileDownloadLayout : NormalDownloadLayout;\n return (\n <Component\n key={activeSection.key} // Ensure that section-specific data is refetched\n menuItems={menuItems}\n title={activeSection.name}\n handleBrowse={props.handleBrowse}\n t={t}\n >\n <activeSection.component t={t} downloadHandler={props.downloadHandler} />\n </Component>\n );\n};\n","import * as React from 'react';\n\nimport PathList from './PathList';\nimport AccordionTargets from './AccordionTargets';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { PathDownloadHandler } from '../../types';\n\nexport interface DownloadSectionChildProps {\n t: UI.TranslateF;\n downloadHandler: PathDownloadHandler;\n}\n\nexport interface DownloadSection {\n name: string;\n key: string;\n list?: string[] | API.GroupedPath[];\n component: React.ComponentType<DownloadSectionChildProps>;\n}\n\ninterface PathInfo {\n sharePaths: API.GroupedPath[];\n favoritePaths: API.GroupedPath[];\n historyPaths: string[];\n dupePaths: string[];\n}\n\nexport const getDownloadSections = (pathInfo: PathInfo) => {\n const { sharePaths, favoritePaths, historyPaths, dupePaths } = pathInfo;\n\n const sections: DownloadSection[] = [\n {\n name: 'Previous',\n key: 'history',\n list: historyPaths,\n component: ({ downloadHandler, t }) => (\n <PathList paths={historyPaths} downloadHandler={downloadHandler} t={t} />\n ),\n },\n {\n name: 'Shared',\n key: 'shared',\n list: sharePaths,\n component: ({ downloadHandler, t }) => (\n <AccordionTargets\n groupedPaths={sharePaths}\n downloadHandler={downloadHandler}\n t={t}\n />\n ),\n },\n {\n name: 'Favorites',\n key: 'favorites',\n list: favoritePaths,\n component: ({ downloadHandler, t }) => (\n <AccordionTargets\n groupedPaths={favoritePaths}\n downloadHandler={downloadHandler}\n t={t}\n />\n ),\n },\n {\n name: 'Dupes',\n key: 'dupes',\n list: dupePaths,\n component: ({ downloadHandler, t }) => (\n <PathList paths={dupePaths} downloadHandler={downloadHandler} t={t} />\n ),\n },\n ];\n\n return sections;\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!./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 { useRef } from 'react';\n\nimport * as React from 'react';\nimport { Route, Switch } from 'react-router';\nimport { useTranslation } from 'react-i18next';\n\nimport ShareConstants from 'constants/ShareConstants';\nimport {\n default as HistoryConstants,\n HistoryStringEnum,\n} from 'constants/HistoryConstants';\nimport FavoriteDirectoryConstants from 'constants/FavoriteDirectoryConstants';\nimport FilesystemConstants from 'constants/FilesystemConstants';\nimport IconConstants from 'constants/IconConstants';\n\nimport NotificationActions from 'actions/NotificationActions';\nimport LoginStore from 'stores/LoginStore';\n\nimport DataProviderDecorator, {\n DataProviderDecoratorChildProps,\n} from 'decorators/DataProviderDecorator';\nimport ModalRouteDecorator, {\n ModalRouteDecoratorChildProps,\n} from 'decorators/ModalRouteDecorator';\n\nimport Modal, { ModalProps } from 'components/semantic/Modal';\nimport { FileBrowserDialog } from 'components/filebrowser';\n\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\nimport { toI18nKey, translate } from 'utils/TranslationUtils';\nimport { addHistory } from 'services/api/HistoryApi';\n\nimport { DownloadLayout, DownloadDataProps } from './layout';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\nimport { PathDownloadHandler } from './types';\n\nimport './style.css';\n\ntype DownloadItemIdType = string;\n\nexport type DownloadDialogProps<\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo\n> = UI.ItemDownloadHandler<ItemT, Props<ItemT>>;\n\ninterface RouteProps {\n downloadItemId: DownloadItemIdType;\n}\n\ntype DownloadDialogRouteProps = ModalRouteDecoratorChildProps<RouteProps>;\n\ninterface DownloadDialogDataProps<\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo\n> extends DataProviderDecoratorChildProps,\n DownloadDataProps<ItemT> {}\n\ntype Props<ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo> =\n DownloadDialogProps<ItemT> & DownloadDialogDataProps<ItemT> & DownloadDialogRouteProps;\n\nconst DownloadDialog: React.FC<Props> = (props) => {\n const { t } = useTranslation();\n const modalRef = useRef<Modal>(null);\n\n const {\n downloadHandler,\n itemInfo,\n userGetter,\n match,\n session,\n historyPaths,\n favoritePaths,\n sharePaths,\n ...other\n } = props;\n\n const handleDownload: PathDownloadHandler = async (targetPath, targetFilename) => {\n try {\n await downloadHandler(\n itemInfo,\n !!userGetter ? userGetter(match.params.downloadItemId, props) : undefined,\n {\n target_name: !!targetFilename ? targetFilename : itemInfo.name,\n target_directory: targetPath,\n priority: API.QueuePriorityEnum.DEFAULT,\n },\n session\n );\n } catch (e) {\n NotificationActions.error({\n title: t(toI18nKey('queueingFailed', UI.Modules.COMMON), {\n defaultValue: 'Failed to queue the item {{item.name}}',\n replace: {\n item: itemInfo,\n },\n }),\n message: e.message,\n });\n }\n\n runBackgroundSocketAction(\n () => addHistory(HistoryStringEnum.DOWNLOAD_DIR, targetPath),\n t\n );\n\n if (!!modalRef.current) {\n modalRef.current.hide();\n }\n };\n\n const getInitialBrowsePath = () => {\n const path = historyPaths.length > 0 ? historyPaths[historyPaths.length - 1] : '';\n return itemInfo.type.id === 'directory' ? path : path + itemInfo.name;\n };\n\n const handleBrowse = () => {\n const { history } = props;\n history.replace(`${match.url}/browse`);\n };\n\n const commonDialogProps: ModalProps = {\n subHeader: itemInfo.name,\n title: translate('Download', t, UI.Modules.COMMON),\n icon: IconConstants.DOWNLOAD,\n closable: false,\n returnTo: props.returnTo,\n };\n\n const hasFileBrowserAccess = LoginStore.hasAccess(API.AccessEnum.FILESYSTEM_VIEW);\n return (\n <Switch>\n <Route path={`${match.path}/browse`}>\n <FileBrowserDialog\n onConfirm={(path, directoryPath, fileName) =>\n handleDownload(directoryPath, fileName)\n }\n initialPath={getInitialBrowsePath()}\n selectMode={\n itemInfo.type.id === 'directory'\n ? UI.FileSelectModeEnum.DIRECTORY\n : UI.FileSelectModeEnum.FILE\n }\n historyId={FilesystemConstants.LOCATION_DOWNLOAD}\n approveCaption={translate('Download', t, UI.Modules.COMMON)}\n {...commonDialogProps}\n />\n </Route>\n <Route path={match.path} exact>\n <Modal\n ref={modalRef}\n className=\"download-dialog\"\n fullHeight={true}\n {...commonDialogProps}\n {...other}\n >\n <DownloadLayout\n downloadHandler={handleDownload}\n handleBrowse={hasFileBrowserAccess ? handleBrowse : undefined}\n historyPaths={historyPaths}\n favoritePaths={favoritePaths}\n sharePaths={sharePaths}\n itemInfo={itemInfo}\n />\n </Modal>\n </Route>\n </Switch>\n );\n};\n\nexport default ModalRouteDecorator<DownloadDialogProps, RouteProps>(\n DataProviderDecorator<\n DownloadDialogProps & DownloadDialogRouteProps,\n DownloadDialogDataProps\n >(DownloadDialog, {\n urls: {\n sharePaths: ShareConstants.GROUPED_ROOTS_GET_URL,\n favoritePaths: FavoriteDirectoryConstants.GROUPED_DIRECTORIES_URL,\n historyPaths: HistoryConstants.STRINGS_URL + '/' + HistoryStringEnum.DOWNLOAD_DIR,\n itemInfo: ({ match, itemDataGetter }, socket) => {\n return itemDataGetter(match.params.downloadItemId, socket);\n },\n },\n }),\n 'download/:downloadItemId'\n);\n","import * as React from 'react';\nimport classNames from 'classnames';\n\nimport { Trans } from 'react-i18next';\nimport { toI18nKey } from 'utils/TranslationUtils';\n\nimport * as UI from 'types/ui';\n\nexport interface RowProps {\n title: React.ReactNode;\n text?: React.ReactNode;\n titleWidth?: string;\n className?: string;\n noText?: boolean;\n}\n\nconst formatText = (text: React.ReactNode) => {\n if (!!text) {\n return text;\n }\n\n return <Trans i18nKey={toI18nKey('na', UI.Modules.COMMON)}>N/A</Trans>;\n};\n\nexport const Row: React.FC<RowProps> = ({\n title,\n text,\n className,\n titleWidth = 'four',\n noText,\n}) => (\n <div className={classNames('ui row', className)}>\n <div className={classNames(noText ? 'sixteen' : titleWidth, 'wide column title')}>\n <div className=\"ui tiny header\" style={{ overflow: 'hidden' }}>\n {title}\n </div>\n </div>\n {!noText && <div className=\"column value\">{formatText(text)}</div>}\n </div>\n);\n\nexport interface HeaderProps {\n title: React.ReactNode;\n}\n\nexport const Header: React.FC<HeaderProps> = ({ title }) => (\n <div className=\"ui row\">\n <div className=\"sixteen wide column\">\n <div className=\"ui blue section header\">{title}</div>\n </div>\n </div>\n);\n\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\n columns?: string;\n stackable?: boolean;\n}\n\nexport const Grid: React.FC<GridProps> = ({\n className,\n children,\n columns,\n stackable,\n ...other\n}) => (\n <div\n className={classNames(\n 'ui grid',\n //`${columns} column`,\n { [`${columns} column`]: !!columns },\n { stackable: stackable },\n className\n )}\n {...other}\n >\n {children}\n </div>\n);\n","const MODULE_URL = 'favorite_directories';\nexport default {\n MODULE_URL: MODULE_URL,\n\n GROUPED_DIRECTORIES_URL: MODULE_URL + '/grouped_paths',\n DIRECTORIES_URL: MODULE_URL,\n\n DIRECTORIES_UPDATED: 'favorite_directories_updated',\n};\n","import SocketService from 'services/SocketService';\nimport HistoryConstants from 'constants/HistoryConstants';\n\nexport const addHistory = (historyId: string, text: string) => {\n return SocketService.post(`${HistoryConstants.STRINGS_URL}/${historyId}`, {\n string: text,\n });\n};\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","formatFreeSpace","pathInfo","t","free_space","path","defaultValue","replace","freeSpace","PathListItem","downloadHandler","className","Icon","icon","IconConstants","onClick","PathListWithData","DataProviderDecorator","pathInfos","map","urls","paths","socket","post","FilesystemConstants","props","length","Message","title","AccordionTargets","Component","formatParent","parent","this","name","render","groupedPaths","Accordion","propTypes","appendBrowseItem","menuItems","handleBrowse","MenuItemLink","MobileDownloadLayout","children","Dropdown","selection","caption","NormalDownloadLayout","Grid","Button","DownloadLayout","activeSectionKey","setActiveSectionKey","useState","sections","historyPaths","sharePaths","favoritePaths","itemInfo","dupePaths","key","list","component","getDownloadSections","dupe","activeSection","find","s","section","active","getMenuItem","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","ModalRouteDecorator","modalRef","useRef","userGetter","match","session","other","handleDownload","targetPath","targetFilename","params","downloadItemId","undefined","target_name","target_directory","priority","e","NotificationActions","item","message","current","hide","commonDialogProps","subHeader","closable","returnTo","hasFileBrowserAccess","LoginStore","onConfirm","directoryPath","fileName","initialPath","type","getInitialBrowsePath","selectMode","historyId","approveCaption","exact","Modal","ref","fullHeight","history","url","ShareConstants","FavoriteDirectoryConstants","HistoryConstants","itemDataGetter","formatText","text","i18nKey","Row","titleWidth","noText","style","overflow","Header","columns","stackable","MODULE_URL","GROUPED_DIRECTORIES_URL","DIRECTORIES_URL","DIRECTORIES_UPDATED","addHistory","string"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[317],{34378:(e,t,s)=>{s.d(t,{Z:()=>a});var n=s(87537),i=s.n(n),r=s(23645),o=s.n(r)()(i());o.push([e.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:""}]);const a=o},58317:(e,t,s)=>{s.d(t,{Z:()=>se});var n=s(85893),i=s(67294),r=s(94184),o=s.n(r),a=s(54883),l=s(99311),d=s(20867),h=s(45697),c=s.n(h);function g(){return g=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n])}return e},g.apply(this,arguments)}const p=new Map,m=new WeakMap;let u=0;function b(e,t,s={},n=undefined){if(void 0===window.IntersectionObserver&&void 0!==n){const i=e.getBoundingClientRect();return t(n,{isIntersecting:n,target:e,intersectionRatio:"number"==typeof s.threshold?s.threshold:0,time:0,boundingClientRect:i,intersectionRect:i,rootBounds:i}),()=>{}}const{id:i,observer:r,elements:o}=function(e){let t=function(e){return Object.keys(e).sort().filter((t=>void 0!==e[t])).map((t=>{return`${t}_${"root"===t?(s=e.root,s?(m.has(s)||(u+=1,m.set(s,u.toString())),m.get(s)):"0"):e[t]}`;var s})).toString()}(e),s=p.get(t);if(!s){const n=new Map;let i;const r=new IntersectionObserver((t=>{t.forEach((t=>{var s;const r=t.isIntersecting&&i.some((e=>t.intersectionRatio>=e));e.trackVisibility&&void 0===t.isVisible&&(t.isVisible=r),null==(s=n.get(t.target))||s.forEach((e=>{e(r,t)}))}))}),e);i=r.thresholds||(Array.isArray(e.threshold)?e.threshold:[e.threshold||0]),s={id:t,observer:r,elements:n},p.set(t,s)}return s}(s);let a=o.get(e)||[];return o.has(e)||o.set(e,a),a.push(t),r.observe(e),function(){a.splice(a.indexOf(t),1),0===a.length&&(o.delete(e),r.unobserve(e)),0===o.size&&(r.disconnect(),p.delete(i))}}const f=["children","as","triggerOnce","threshold","root","rootMargin","onChange","skip","trackVisibility","delay","initialInView","fallbackInView"];function y(e){return"function"!=typeof e.children}class v extends i.Component{constructor(e){super(e),this.node=null,this._unobserveCb=null,this.handleNode=e=>{this.node&&(this.unobserve(),e||this.props.triggerOnce||this.props.skip||this.setState({inView:!!this.props.initialInView,entry:void 0})),this.node=e||null,this.observeNode()},this.handleChange=(e,t)=>{e&&this.props.triggerOnce&&this.unobserve(),y(this.props)||this.setState({inView:e,entry:t}),this.props.onChange&&this.props.onChange(e,t)},this.state={inView:!!e.initialInView,entry:void 0}}componentDidUpdate(e){e.rootMargin===this.props.rootMargin&&e.root===this.props.root&&e.threshold===this.props.threshold&&e.skip===this.props.skip&&e.trackVisibility===this.props.trackVisibility&&e.delay===this.props.delay||(this.unobserve(),this.observeNode())}componentWillUnmount(){this.unobserve(),this.node=null}observeNode(){if(!this.node||this.props.skip)return;const{threshold:e,root:t,rootMargin:s,trackVisibility:n,delay:i,fallbackInView:r}=this.props;this._unobserveCb=b(this.node,this.handleChange,{threshold:e,root:t,rootMargin:s,trackVisibility:n,delay:i},r)}unobserve(){this._unobserveCb&&(this._unobserveCb(),this._unobserveCb=null)}render(){if(!y(this.props)){const{inView:e,entry:t}=this.state;return this.props.children({inView:e,entry:t,ref:this.handleNode})}const e=this.props,{children:t,as:s}=e,n=function(e,t){if(null==e)return{};var s,n,i={},r=Object.keys(e);for(n=0;n<r.length;n++)s=r[n],t.indexOf(s)>=0||(i[s]=e[s]);return i}(e,f);return i.createElement(s||"div",g({ref:this.handleNode},n),t)}}var O=s(84613),j=s(4333),w=s(2445);const x=({time:e})=>(0,n.jsx)("div",Object.assign({className:"time"},{children:(0,w.i$)(e)}));var A=s(94656);const C=e=>{var{emojify:t,message:s,user:i,label:r,highlightMenuProps:o}=e,a=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(s[n[i]]=e[n[i]])}return s}(e,["emojify","message","user","label","highlightMenuProps"]);return(0,n.jsxs)("div",Object.assign({className:"text"},{children:[!!r&&(0,n.jsx)("span",Object.assign({className:"label"},{children:`${r}: `})),(0,n.jsx)(A.h,Object.assign({emojify:t,text:s.text,highlights:s.highlights,user:i,menuProps:o},a))]}))};const E=({message:e,dropdownContext:t})=>(0,n.jsxs)("div",Object.assign({className:"header author"},{children:[e.third_person&&(0,n.jsx)("span",{children:"*"}),(0,n.jsx)(O.Ie,{contextElement:t,triggerIcon:null,user:e.from,remoteMenuId:j.Z.HUB_USER,entityId:e.from.hub_session_id})]}));class I extends i.Component{shouldComponentUpdate(){return!1}render(){const e=this.props,{message:t,dropdownContext:s,highlightMenuProps:i}=e,r=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(s[n[i]]=e[n[i]])}return s}(e,["message","dropdownContext","highlightMenuProps"]);return(0,n.jsxs)(v,Object.assign({className:o()("ui item chat",t.from.flags.join(" "))},r,{children:[(0,n.jsx)(x,{time:t.time}),(0,n.jsxs)("div",Object.assign({className:o()("left",t.third_person?"third-person":"normal")},{children:[(0,n.jsx)(E,{message:t,dropdownContext:s}),(0,n.jsx)(C,{message:t,emojify:!0,user:t.from,highlightMenuProps:i})]}))]}))}}I.propTypes={message:c().object.isRequired,dropdownContext:c().string.isRequired};var P=s(35936),M=s(48117),N=s(76249);const _=e=>{switch(e){case N.m4.VERBOSE:return M.Z.VERBOSE;case N.m4.INFO:return M.Z.INFO+" circle";case N.m4.WARNING:return M.Z.WARNING;case N.m4.ERROR:return M.Z.ERROR;default:return""}};class R extends i.Component{shouldComponentUpdate(){return!1}render(){const e=this.props,{message:t,highlightMenuProps:s}=e,i=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(s[n[i]]=e[n[i]])}return s}(e,["message","highlightMenuProps"]);return(0,n.jsxs)(v,Object.assign({className:o()("ui item status",t.severity,t.type)},i,{children:[(0,n.jsx)(P.Z,{icon:_(t.severity)}),t.time>0&&(0,n.jsx)(x,{time:t.time}),(0,n.jsx)(C,{label:t.label,message:t,emojify:!1,highlightMenuProps:s})]}))}}R.propTypes={message:c().object.isRequired};const k=e=>{var{message:t}=e,s=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(s[n[i]]=e[n[i]])}return s}(e,["message"]);return t.chat_message?(0,n.jsx)(I,Object.assign({message:t.chat_message,dropdownContext:s.highlightMenuProps.boundary},s)):t.log_message?(0,n.jsx)(R,Object.assign({message:t.log_message},s)):null};var V=s(91072);const S=e=>{const t=e.chat_message?e.chat_message:e.log_message;return t&&new Date(1e3*t.time).getDate()},B=e=>!!e.log_message&&e.log_message.type===N._Z.HISTORY,Z=({time:e})=>{const{t}=(0,V.$G)();return(0,n.jsxs)("div",Object.assign({className:"ui horizontal date divider"},{children:[(0,n.jsx)(P.Z,{icon:M.Z.DATE}),(0,w._s)(e,t)]}),`divider${e}`)},D=({entityId:e,onMessageVisibilityChanged:t,addDownload:s,highlightRemoteMenuId:i},r,o,a,l)=>{if(((e,t)=>{const s=t[e];return 0===e||1===e&&B(t[e-1])?S(s)!==(new Date).getDate()&&!B(s):S(t[e-1])!==S(s)})(a,l)){const e=o.chat_message?o.chat_message:o.log_message;e&&r.push((0,n.jsx)(Z,{time:e.time},`divider${e.id}`))}const h=(0,d.oi)(o);return r.push((0,n.jsx)(k,{id:(0,d.or)(h),onChange:e=>{t(h,e)},threshold:.4,message:o,highlightMenuProps:{addDownload:s,entityId:e,remoteMenuId:i,boundary:".message-section"}},h)),r};var G=s(8717),$=s(62285),T=s(32347),U=s(93379),H=s.n(U),W=s(7795),q=s.n(W),F=s(90569),z=s.n(F),L=s(3565),Y=s.n(L),J=s(19216),K=s.n(J),Q=s(44589),X=s.n(Q),ee=s(34378),te={};te.styleTagTransform=X(),te.setAttributes=Y(),te.insert=z().bind(null,"head"),te.domAPI=q(),te.insertStyleElement=K(),H()(ee.Z,te),ee.Z&&ee.Z.locals&&ee.Z.locals;const se=i.memo((function(e){var{className:t,t:s}=e,r=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(s[n[i]]=e[n[i]])}return s}(e,["className","t"]);const d=(h=r.session,(0,i.useMemo)((()=>{const e={},t=t=>{const s=e[t];if(!s)throw new Error("Download was not found");return s};return{downloadDialogProps:{downloadHandler:(e,s,n,i)=>t(e.id).downloadHandler(e,s,n,i),userGetter:(e,s)=>{const n=t(e).userGetter;return n?n(e,s):void 0},itemDataGetter:(e,s)=>t(e).itemDataGetter(e,s),session:h},addDownloadItem:(t,s)=>{e[t]=s}}}),[]));var h;const{messageNodes:c,visibleItems:g}=(({highlightRemoteMenuId:e,messages:t,session:s},n)=>{const r=(0,i.useMemo)((()=>new Set),[s]),o=(e,t)=>{t?r.add(e):r.delete(e)};return{messageNodes:(0,i.useMemo)((()=>t?t.reduce(D.bind(null,{highlightRemoteMenuId:e,entityId:s?s.id:void 0,onMessageVisibilityChanged:o,addDownload:n.addDownloadItem}),[]):null),[t]),visibleItems:r}})(r,d),p=(0,l.Hc)(r,g);return(0,n.jsx)("div",Object.assign({ref:p,className:o()("message-section",t)},{children:c?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",Object.assign({className:"ui list message-list"},{children:c})),(0,n.jsx)($.Z,Object.assign({},d.downloadDialogProps))]}):(0,n.jsx)(a.Z,{text:(0,G.Iu)("Loading messages",s,T.jv.COMMON)})}))}),((e,t)=>e.messages===t.messages))}}]);
2
- //# sourceMappingURL=317.97fabbc4a91be88219d3.chunk.js.map