airdcpp-webui 2.11.2 → 2.11.3-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.html +2 -2
  3. package/dist/js/{285.902dc3166e82226541a5.chunk.js → 285.c10a92f5e683562b290c.chunk.js} +2 -2
  4. package/dist/js/285.c10a92f5e683562b290c.chunk.js.gz +0 -0
  5. package/dist/js/{285.902dc3166e82226541a5.chunk.js.map → 285.c10a92f5e683562b290c.chunk.js.map} +1 -1
  6. package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js +2 -0
  7. package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js.gz +0 -0
  8. package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js.map +1 -0
  9. package/dist/js/{424.b407aaf3218fa480b144.chunk.js → 424.2b137728423ffe5720b9.chunk.js} +1 -1
  10. package/dist/js/424.2b137728423ffe5720b9.chunk.js.gz +0 -0
  11. package/dist/js/{424.b407aaf3218fa480b144.chunk.js.map → 424.2b137728423ffe5720b9.chunk.js.map} +1 -1
  12. package/dist/js/{668.d0b45ae92f54a69beee3.chunk.js → 668.d8fc363a0da7c52c6cf3.chunk.js} +1 -1
  13. package/dist/js/668.d8fc363a0da7c52c6cf3.chunk.js.gz +0 -0
  14. package/dist/js/{668.d0b45ae92f54a69beee3.chunk.js.map → 668.d8fc363a0da7c52c6cf3.chunk.js.map} +1 -1
  15. package/dist/js/{69.8ca10b3d679cc4c52a20.chunk.js → 69.90201ebd79a3d236605f.chunk.js} +2 -2
  16. package/dist/js/69.90201ebd79a3d236605f.chunk.js.gz +0 -0
  17. package/dist/js/69.90201ebd79a3d236605f.chunk.js.map +1 -0
  18. package/dist/js/{702.99e6ce480dc579b6e542.chunk.js → 702.d36d38b2be52ab51c0a9.chunk.js} +1 -1
  19. package/dist/js/702.d36d38b2be52ab51c0a9.chunk.js.gz +0 -0
  20. package/dist/js/{702.99e6ce480dc579b6e542.chunk.js.map → 702.d36d38b2be52ab51c0a9.chunk.js.map} +1 -1
  21. package/dist/js/760.28a29fef05eb0889fc25.chunk.js +3 -0
  22. package/dist/js/{760.75d229a05d7b9bdf414b.chunk.js.LICENSE.txt → 760.28a29fef05eb0889fc25.chunk.js.LICENSE.txt} +0 -0
  23. package/dist/js/760.28a29fef05eb0889fc25.chunk.js.gz +0 -0
  24. package/dist/js/760.28a29fef05eb0889fc25.chunk.js.map +1 -0
  25. package/dist/js/{favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js → favorite-hubs.d78427e6a9006438d07b.chunk.js} +1 -1
  26. package/dist/js/favorite-hubs.d78427e6a9006438d07b.chunk.js.gz +0 -0
  27. package/dist/js/{favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js.map → favorite-hubs.d78427e6a9006438d07b.chunk.js.map} +1 -1
  28. package/dist/js/{filelists.a1ecb558a5c0c376191d.chunk.js → filelists.726450e0ff6e77eaa054.chunk.js} +1 -1
  29. package/dist/js/filelists.726450e0ff6e77eaa054.chunk.js.gz +0 -0
  30. package/dist/js/{filelists.a1ecb558a5c0c376191d.chunk.js.map → filelists.726450e0ff6e77eaa054.chunk.js.map} +1 -1
  31. package/dist/js/{files.9b2b25680e1e04de1931.chunk.js → files.50c047ffc599c58eb13a.chunk.js} +2 -2
  32. package/dist/js/files.50c047ffc599c58eb13a.chunk.js.gz +0 -0
  33. package/dist/js/{files.9b2b25680e1e04de1931.chunk.js.map → files.50c047ffc599c58eb13a.chunk.js.map} +1 -1
  34. package/dist/js/home.ed1091a84aa53f290563.chunk.js +3 -0
  35. package/dist/js/{home.21a1fe21d45ac82fafe5.chunk.js.LICENSE.txt → home.ed1091a84aa53f290563.chunk.js.LICENSE.txt} +0 -0
  36. package/dist/js/home.ed1091a84aa53f290563.chunk.js.gz +0 -0
  37. package/dist/js/home.ed1091a84aa53f290563.chunk.js.map +1 -0
  38. package/dist/js/{hubs.f336a1aeaac00fab20ce.chunk.js → hubs.eed2f41d894688465906.chunk.js} +2 -2
  39. package/dist/js/hubs.eed2f41d894688465906.chunk.js.gz +0 -0
  40. package/dist/js/{hubs.f336a1aeaac00fab20ce.chunk.js.map → hubs.eed2f41d894688465906.chunk.js.map} +1 -1
  41. package/dist/js/locales/{ca.7409d603c21de58635a6.chunk.js → ca.ed09d3a3d4bcca929ba1.chunk.js} +0 -0
  42. package/dist/js/locales/{ca.7409d603c21de58635a6.chunk.js.gz → ca.ed09d3a3d4bcca929ba1.chunk.js.gz} +0 -0
  43. package/dist/js/locales/{da.bd0c6f71e355d0794e71.chunk.js → da.6f60a77e9ef082dd3bf4.chunk.js} +0 -0
  44. package/dist/js/locales/{da.bd0c6f71e355d0794e71.chunk.js.gz → da.6f60a77e9ef082dd3bf4.chunk.js.gz} +0 -0
  45. package/dist/js/locales/{de.5adea2a7ce417c784479.chunk.js → de.3b7d3665460384259e82.chunk.js} +0 -0
  46. package/dist/js/locales/{de.5adea2a7ce417c784479.chunk.js.gz → de.3b7d3665460384259e82.chunk.js.gz} +0 -0
  47. package/dist/js/locales/{el.648369d465eb99118703.chunk.js → el.598573d2a5ed18804fe0.chunk.js} +0 -0
  48. package/dist/js/locales/{el.648369d465eb99118703.chunk.js.gz → el.598573d2a5ed18804fe0.chunk.js.gz} +0 -0
  49. package/dist/js/locales/{en.c66f69f706afd2da9eb5.chunk.js → en.f0fe75dca201449e5e47.chunk.js} +0 -0
  50. package/dist/js/locales/{en.c66f69f706afd2da9eb5.chunk.js.gz → en.f0fe75dca201449e5e47.chunk.js.gz} +0 -0
  51. package/dist/js/locales/{es.793f17d88083bf7f0738.chunk.js → es.cbe6378a22cf5ee485cd.chunk.js} +0 -0
  52. package/dist/js/locales/{es.793f17d88083bf7f0738.chunk.js.gz → es.cbe6378a22cf5ee485cd.chunk.js.gz} +0 -0
  53. package/dist/js/locales/{eu.010416cbe0a067839d4a.chunk.js → eu.7734fc077f26418d6b32.chunk.js} +0 -0
  54. package/dist/js/locales/{eu.010416cbe0a067839d4a.chunk.js.gz → eu.7734fc077f26418d6b32.chunk.js.gz} +0 -0
  55. package/dist/js/locales/{fi.7ecbf3197777fb8fd70f.chunk.js → fi.d1f8a5f4048236243b0f.chunk.js} +0 -0
  56. package/dist/js/locales/{fi.7ecbf3197777fb8fd70f.chunk.js.gz → fi.d1f8a5f4048236243b0f.chunk.js.gz} +0 -0
  57. package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js +1 -0
  58. package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js.gz +0 -0
  59. package/dist/js/locales/{hu.37c8f09717da5f1bc37c.chunk.js → hu.d0d2c38a03a3b38c2bc5.chunk.js} +0 -0
  60. package/dist/js/locales/{hu.37c8f09717da5f1bc37c.chunk.js.gz → hu.d0d2c38a03a3b38c2bc5.chunk.js.gz} +0 -0
  61. package/dist/js/locales/{it.9842f3b2b5bb3b7420c5.chunk.js → it.0c911d75c50ea83190ad.chunk.js} +0 -0
  62. package/dist/js/locales/{it.9842f3b2b5bb3b7420c5.chunk.js.gz → it.0c911d75c50ea83190ad.chunk.js.gz} +0 -0
  63. package/dist/js/locales/{nl.88085590f152551ec225.chunk.js → nl.36d288d75b3d3cbabf11.chunk.js} +0 -0
  64. package/dist/js/locales/{nl.88085590f152551ec225.chunk.js.gz → nl.36d288d75b3d3cbabf11.chunk.js.gz} +0 -0
  65. package/dist/js/locales/{no.cfa0a90ce428e087e846.chunk.js → no.8f2f465d5f785650175d.chunk.js} +0 -0
  66. package/dist/js/locales/{no.cfa0a90ce428e087e846.chunk.js.gz → no.8f2f465d5f785650175d.chunk.js.gz} +0 -0
  67. package/dist/js/locales/{pl.89540648cb16acad8d27.chunk.js → pl.06e51d7d7b09ba14714d.chunk.js} +0 -0
  68. package/dist/js/locales/{pl.89540648cb16acad8d27.chunk.js.gz → pl.06e51d7d7b09ba14714d.chunk.js.gz} +0 -0
  69. package/dist/js/locales/{pt-br.a537d1e531731dbec9dd.chunk.js → pt-br.9d19d92899e8c0917c66.chunk.js} +0 -0
  70. package/dist/js/locales/{pt-br.a537d1e531731dbec9dd.chunk.js.gz → pt-br.9d19d92899e8c0917c66.chunk.js.gz} +0 -0
  71. package/dist/js/locales/{pt.08213e494539393b14d1.chunk.js → pt.4390db3955db29b0e7dd.chunk.js} +0 -0
  72. package/dist/js/locales/{pt.08213e494539393b14d1.chunk.js.gz → pt.4390db3955db29b0e7dd.chunk.js.gz} +0 -0
  73. package/dist/js/locales/{ro.23f02315e6d9ab090aac.chunk.js → ro.705fcd327263fcf419bf.chunk.js} +0 -0
  74. package/dist/js/locales/{ro.23f02315e6d9ab090aac.chunk.js.gz → ro.705fcd327263fcf419bf.chunk.js.gz} +0 -0
  75. package/dist/js/locales/{ru.c775ae5709b4e2affc37.chunk.js → ru.8ab7e1c0d9eee7aa7afb.chunk.js} +0 -0
  76. package/dist/js/locales/{ru.c775ae5709b4e2affc37.chunk.js.gz → ru.8ab7e1c0d9eee7aa7afb.chunk.js.gz} +0 -0
  77. package/dist/js/locales/{sv.60ec4539680a48384a56.chunk.js → sv.be546e605910932db11f.chunk.js} +0 -0
  78. package/dist/js/locales/{sv.60ec4539680a48384a56.chunk.js.gz → sv.be546e605910932db11f.chunk.js.gz} +0 -0
  79. package/dist/js/locales/{tr.c19f95d7bf191aad9a74.chunk.js → tr.25a0d0f19e007e2febc9.chunk.js} +0 -0
  80. package/dist/js/locales/{tr.c19f95d7bf191aad9a74.chunk.js.gz → tr.25a0d0f19e007e2febc9.chunk.js.gz} +0 -0
  81. package/dist/js/locales/uk_UA.64a1a537c623ae0259dd.chunk.js +1 -0
  82. package/dist/js/locales/uk_UA.64a1a537c623ae0259dd.chunk.js.gz +0 -0
  83. package/dist/js/locales/{zh_CN.d27ea53dd79304789681.chunk.js → zh_CN.4b75674e4815a965ccea.chunk.js} +0 -0
  84. package/dist/js/locales/{zh_CN.d27ea53dd79304789681.chunk.js.gz → zh_CN.4b75674e4815a965ccea.chunk.js.gz} +0 -0
  85. package/dist/js/{main.d64158ea2453985dde98.entry.js → main.ad3d59f07b32feb5be60.entry.js} +3 -3
  86. package/dist/js/{main.d64158ea2453985dde98.entry.js.LICENSE.txt → main.ad3d59f07b32feb5be60.entry.js.LICENSE.txt} +0 -0
  87. package/dist/js/main.ad3d59f07b32feb5be60.entry.js.gz +0 -0
  88. package/dist/js/main.ad3d59f07b32feb5be60.entry.js.map +1 -0
  89. package/dist/js/{messages.e4523315258f6dab0f37.chunk.js → messages.d213dd0ac314a64b5a6c.chunk.js} +1 -1
  90. package/dist/js/messages.d213dd0ac314a64b5a6c.chunk.js.gz +0 -0
  91. package/dist/js/{messages.e4523315258f6dab0f37.chunk.js.map → messages.d213dd0ac314a64b5a6c.chunk.js.map} +1 -1
  92. package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js → queue.2fcf7a1381f1fb4af03f.chunk.js} +1 -1
  93. package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js.gz → queue.2fcf7a1381f1fb4af03f.chunk.js.gz} +0 -0
  94. package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js.map → queue.2fcf7a1381f1fb4af03f.chunk.js.map} +1 -1
  95. package/dist/js/{search.321f771dd92b51431378.chunk.js → search.24ec8c5fe5f45b1180a9.chunk.js} +2 -2
  96. package/dist/js/search.24ec8c5fe5f45b1180a9.chunk.js.gz +0 -0
  97. package/dist/js/{search.321f771dd92b51431378.chunk.js.map → search.24ec8c5fe5f45b1180a9.chunk.js.map} +1 -1
  98. package/dist/js/settings.83541ccd8eafaab78d16.chunk.js +2 -0
  99. package/dist/js/settings.83541ccd8eafaab78d16.chunk.js.gz +0 -0
  100. package/dist/js/settings.83541ccd8eafaab78d16.chunk.js.map +1 -0
  101. package/dist/js/{share.ecb413c8d6a1cc8a6154.chunk.js → share.d94de2f3077842a88c25.chunk.js} +2 -2
  102. package/dist/js/share.d94de2f3077842a88c25.chunk.js.gz +0 -0
  103. package/dist/js/{share.ecb413c8d6a1cc8a6154.chunk.js.map → share.d94de2f3077842a88c25.chunk.js.map} +1 -1
  104. package/dist/js/{system-log.7aa8ba9d8b4a5711c4fc.chunk.js → system-log.b3fc65678cc7480e44e0.chunk.js} +1 -1
  105. package/dist/js/system-log.b3fc65678cc7480e44e0.chunk.js.gz +0 -0
  106. package/dist/js/{system-log.7aa8ba9d8b4a5711c4fc.chunk.js.map → system-log.b3fc65678cc7480e44e0.chunk.js.map} +1 -1
  107. package/dist/js/{transfers.5a7661c5701a462d4c53.chunk.js → transfers.5ec21f789068ff2e228f.chunk.js} +2 -2
  108. package/dist/js/transfers.5ec21f789068ff2e228f.chunk.js.gz +0 -0
  109. package/dist/js/{transfers.5a7661c5701a462d4c53.chunk.js.map → transfers.5ec21f789068ff2e228f.chunk.js.map} +1 -1
  110. package/dist/sw.js +1 -1
  111. package/dist/sw.js.gz +0 -0
  112. package/package.json +53 -51
  113. package/dist/js/285.902dc3166e82226541a5.chunk.js.gz +0 -0
  114. package/dist/js/334.f72694a737e72404ed6e.chunk.js +0 -2
  115. package/dist/js/334.f72694a737e72404ed6e.chunk.js.gz +0 -0
  116. package/dist/js/334.f72694a737e72404ed6e.chunk.js.map +0 -1
  117. package/dist/js/424.b407aaf3218fa480b144.chunk.js.gz +0 -0
  118. package/dist/js/668.d0b45ae92f54a69beee3.chunk.js.gz +0 -0
  119. package/dist/js/69.8ca10b3d679cc4c52a20.chunk.js.gz +0 -0
  120. package/dist/js/69.8ca10b3d679cc4c52a20.chunk.js.map +0 -1
  121. package/dist/js/702.99e6ce480dc579b6e542.chunk.js.gz +0 -0
  122. package/dist/js/760.75d229a05d7b9bdf414b.chunk.js +0 -3
  123. package/dist/js/760.75d229a05d7b9bdf414b.chunk.js.gz +0 -0
  124. package/dist/js/760.75d229a05d7b9bdf414b.chunk.js.map +0 -1
  125. package/dist/js/favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js.gz +0 -0
  126. package/dist/js/filelists.a1ecb558a5c0c376191d.chunk.js.gz +0 -0
  127. package/dist/js/files.9b2b25680e1e04de1931.chunk.js.gz +0 -0
  128. package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js +0 -3
  129. package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js.gz +0 -0
  130. package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js.map +0 -1
  131. package/dist/js/hubs.f336a1aeaac00fab20ce.chunk.js.gz +0 -0
  132. package/dist/js/locales/fr.cf760489c7a0a9a02e31.chunk.js +0 -1
  133. package/dist/js/locales/fr.cf760489c7a0a9a02e31.chunk.js.gz +0 -0
  134. package/dist/js/locales/uk_UA.0678837b62a41e004e9c.chunk.js +0 -1
  135. package/dist/js/locales/uk_UA.0678837b62a41e004e9c.chunk.js.gz +0 -0
  136. package/dist/js/main.d64158ea2453985dde98.entry.js.gz +0 -0
  137. package/dist/js/main.d64158ea2453985dde98.entry.js.map +0 -1
  138. package/dist/js/messages.e4523315258f6dab0f37.chunk.js.gz +0 -0
  139. package/dist/js/search.321f771dd92b51431378.chunk.js.gz +0 -0
  140. package/dist/js/settings.3c031a77619c7df3a86e.chunk.js +0 -2
  141. package/dist/js/settings.3c031a77619c7df3a86e.chunk.js.gz +0 -0
  142. package/dist/js/settings.3c031a77619c7df3a86e.chunk.js.map +0 -1
  143. package/dist/js/share.ecb413c8d6a1cc8a6154.chunk.js.gz +0 -0
  144. package/dist/js/system-log.7aa8ba9d8b4a5711c4fc.chunk.js.gz +0 -0
  145. package/dist/js/transfers.5a7661c5701a462d4c53.chunk.js.gz +0 -0
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[464],{48366:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(87537),r=n.n(s),i=n(23645),a=n.n(i)()(r());a.push([e.id,"\r\n.fileitem.info.segment .dupe-paths .path {\r\n overflow-x: hidden;\r\n}\r\n\r\n.fileitem.info.segment .download.ui.dropdown {\r\n max-width: 150px;\r\n margin-top: 10px;\r\n}\r\n\r\n.fileitem.info.segment .title.column {\r\n margin-top: auto;\r\n margin-bottom: auto;\r\n}\r\n\r\n.fileitem.info.segment .value.column {\r\n word-break: break-all;\r\n}\r\n","",{version:3,sources:["webpack://./src/components/file-item-info/style.css"],names:[],mappings:";AACA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB",sourcesContent:["\r\n.fileitem.info.segment .dupe-paths .path {\r\n overflow-x: hidden;\r\n}\r\n\r\n.fileitem.info.segment .download.ui.dropdown {\r\n max-width: 150px;\r\n margin-top: 10px;\r\n}\r\n\r\n.fileitem.info.segment .title.column {\r\n margin-top: auto;\r\n margin-bottom: auto;\r\n}\r\n\r\n.fileitem.info.segment .value.column {\r\n word-break: break-all;\r\n}\r\n"],sourceRoot:""}]);const o=a},48931:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(87537),r=n.n(s),i=n(23645),a=n.n(i)()(r());a.push([e.id,".search-container {\r\n width:100%;\r\n height: 50px;\r\n}\r\n\r\n#mobile-layout .search-container {\r\n margin-top: 10px;\r\n}\r\n\r\n.search-container .search-area {\r\n width: 90%;\r\n max-width: 600px;\r\n margin-left: auto;\r\n margin-right: auto;\r\n display: flex;\r\n}\r\n\r\n.search-container .search-area .options.trigger {\r\n margin-left: 5px;\r\n}\r\n\r\n.search-container .search-area .options.trigger .button {\r\n padding-left: 15px;\r\n padding-right: 5px;\r\n height: 100%;\r\n}\r\n\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, \r\n.search-area .react-autosuggest__container,\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, .search-area input {\r\n width: 100%;\r\n}\r\n\r\n.search-area button {\r\n display: inline-block !important;\r\n}\r\n\r\n.search-layout {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n}\r\n\r\n.search-layout .virtual-table {\r\n height: calc(100% - 50px);\r\n}\r\n\r\n@media only screen and (min-width: 767px) {\r\n .result.modal td {\r\n max-width: 250px;\r\n }\r\n}\r\n\r\n.search-options {\r\n min-width: 300px;\r\n}\r\n\r\n.search-options .field-hub_urls {\r\n max-height: 180px;\r\n overflow-y: auto;\r\n}\r\n","",{version:3,sources:["webpack://./src/routes/Search/style.css"],names:[],mappings:"AAAA;EACE,UAAU;EACV,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,UAAU;EACV,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;EAClB,aAAa;AACf;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,OAAO;AACT;;AAEA;;;EAGE,OAAO;AACT;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE;IACE,gBAAgB;EAClB;AACF;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,gBAAgB;AAClB",sourcesContent:[".search-container {\r\n width:100%;\r\n height: 50px;\r\n}\r\n\r\n#mobile-layout .search-container {\r\n margin-top: 10px;\r\n}\r\n\r\n.search-container .search-area {\r\n width: 90%;\r\n max-width: 600px;\r\n margin-left: auto;\r\n margin-right: auto;\r\n display: flex;\r\n}\r\n\r\n.search-container .search-area .options.trigger {\r\n margin-left: 5px;\r\n}\r\n\r\n.search-container .search-area .options.trigger .button {\r\n padding-left: 15px;\r\n padding-right: 5px;\r\n height: 100%;\r\n}\r\n\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, \r\n.search-area .react-autosuggest__container,\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, .search-area input {\r\n width: 100%;\r\n}\r\n\r\n.search-area button {\r\n display: inline-block !important;\r\n}\r\n\r\n.search-layout {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n}\r\n\r\n.search-layout .virtual-table {\r\n height: calc(100% - 50px);\r\n}\r\n\r\n@media only screen and (min-width: 767px) {\r\n .result.modal td {\r\n max-width: 250px;\r\n }\r\n}\r\n\r\n.search-options {\r\n min-width: 300px;\r\n}\r\n\r\n.search-options .field-hub_urls {\r\n max-height: 180px;\r\n overflow-y: auto;\r\n}\r\n"],sourceRoot:""}]);const o=a},28252:(e,t,n)=>{n.d(t,{Y:()=>w});var s=n(85893),r=(n(67294),n(2445)),i=n(47021),a=n(76249),o=n(32347),l=n(26793),c=n(8717),d=n(93379),u=n.n(d),h=n(7795),p=n.n(h),m=n(90569),v=n.n(m),g=n(3565),A=n.n(g),x=n(19216),f=n.n(x),j=n(44589),b=n.n(j),y=n(48366),E={};E.styleTagTransform=b(),E.setAttributes=A(),E.insert=v().bind(null,"head"),E.domAPI=p(),E.insertStyleElement=f(),u()(y.Z,E),y.Z&&y.Z.locals&&y.Z.locals;var C=n(24101);const O={[a.V9.SHARE_PARTIAL]:"Share (partial)",[a.V9.SHARE_FULL]:"Share (full)",[a.V9.QUEUE_PARTIAL]:"Queue (partial)",[a.V9.QUEUE_FULL]:"Queue (full)",[a.V9.FINISHED_PARTIAL]:"Finished (partial)",[a.V9.FINISHED_FULL]:"Finished (full)",[a.V9.SHARE_QUEUE]:"Share and queue"},S=({paths:e})=>(0,s.jsx)("div",Object.assign({className:"dupe-paths"},{children:e.map((e=>(0,s.jsx)("div",Object.assign({className:"path"},{children:e}),e)))}),void 0),w=({session:e,fileItem:t,user:n,downloadHandler:a,showPath:d=!0})=>{const{t:u}=(0,l.$)(),h=e=>(0,c.Iu)(e,u,o.jv.COMMON);return(0,s.jsxs)("div",Object.assign({className:"ui fileitem info segment"},{children:[(0,s.jsxs)(C.rj,Object.assign({columns:"two",stackable:!0},{children:[(0,s.jsx)(C.X2,{title:h("Name"),text:t.name},void 0),(0,s.jsx)(C.X2,{title:h("Type/content"),text:t.type.str},void 0),(0,s.jsx)(C.X2,{title:h("Size"),text:(0,r.BU)(t.size,u,!0)},void 0),(0,s.jsx)(C.X2,{title:h("Last modified"),text:(0,r.SY)(t.time||0)},void 0),"file"===t.type.id&&(0,s.jsx)(C.X2,{title:h("TTH"),text:t.tth},void 0),!!t.dupe&&(0,s.jsx)(C.X2,{title:h("Dupe type"),text:h(O[t.dupe.id])},void 0),!!t.dupe&&(0,s.jsx)(C.X2,{title:h("Dupe paths"),text:(0,s.jsx)(S,{paths:t.dupe.paths},void 0)},void 0),d&&(0,s.jsx)(C.X2,{title:h("Path"),text:t.path},void 0)]}),void 0),(0,s.jsx)(i.Yk,{caption:h("Actions..."),button:!0,user:n,itemInfoGetter:()=>t,downloadHandler:a,contextElement:".ui.modal > .content",session:e},void 0)]}),void 0)}},48005:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(85893),r=(n(67294),n(35936)),i=n(55019);const a=e=>{var{hub:t}=e,n=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["hub"]);return(0,s.jsx)(r.Z,Object.assign({},n,{icon:(0,i.iU)(t.connect_state.id)+" sitemap"}),void 0)}},14954:(e,t,n)=>{n.r(t),n.d(t,{default:()=>qe});var s=n(85893),r=n(67294),i=n(38423),a=n(20097),o=n(69767),l=n(93379),c=n.n(l),d=n(7795),u=n.n(d),h=n(90569),p=n.n(h),m=n(3565),v=n.n(m),g=n(19216),A=n.n(g),x=n(44589),f=n.n(x),j=n(48931),b={};b.styleTagTransform=f(),b.setAttributes=v(),b.insert=p().bind(null,"head"),b.domAPI=u(),b.insertStyleElement=A(),c()(j.Z,b),j.Z&&j.Z.locals&&j.Z.locals;var y=n(48117),E=n(45241),C=n(77744),O=n(76249),S=n(32347);const w={result:{displayName:"Result details",icon:y.Z.OPEN,handler:({data:e,location:t})=>{a.Z.push(`${t.pathname}/result/${e.id}`)}},browseContent:{displayName:"Browse content",access:O.PS.FILELISTS_EDIT,icon:y.Z.FILELIST,handler:({data:e,location:t})=>E.Z.createSession(t,e.users.user,C.Z,e.path)}},_={moduleId:S.jv.SEARCH,actions:w};var Z=n(28427),N=n(20368),I=n(62285),T=n(42090),R=n(91780),B=n(2445),U=n(47021),P=n(90195),k=n(26793),D=n(8717),L=n(4333);const H=({result:e,t})=>(0,s.jsxs)("tr",{children:[(0,s.jsx)("td",Object.assign({className:"user dropdown"},{children:(0,s.jsx)(U.Ie,{userIcon:!0,user:e.user,directory:e.path,ids:P.D,contextElement:".ui.modal > .content",remoteMenuId:L.Z.HINTED_USER},void 0)}),void 0),(0,s.jsx)("td",Object.assign({className:"hubs"},{children:e.user.hub_names}),void 0),(0,s.jsx)("td",Object.assign({className:"connection"},{children:(0,B.Nh)(e.connection,t)}),void 0),(0,s.jsx)("td",Object.assign({className:"slots"},{children:e.slots.str}),void 0),(0,s.jsx)("td",Object.assign({className:"ip"},{children:(0,s.jsx)(R.Z,{item:e.ip},void 0)}),void 0),(0,s.jsx)("td",Object.assign({className:"path",title:e.path},{children:e.path}),void 0)]},void 0),F=(e,t)=>e.user.nicks.localeCompare(t.user.nicks),G=(0,T.Z)((({results:e})=>{const{t}=(0,k.$)();return(0,s.jsxs)("div",Object.assign({className:"users"},{children:[(0,s.jsx)("h2",{children:t((0,D.zS)("usersCount",S.jv.SEARCH),{defaultValue:"User ({{count}})",defaultValue_plural:"Users ({{count}})",count:e.length})},void 0),(0,s.jsxs)("table",Object.assign({className:"ui striped table"},{children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{children:(0,D.Iu)("User",t,S.jv.SEARCH)},void 0),(0,s.jsx)("th",{children:(0,D.Iu)("Hubs",t,S.jv.SEARCH)},void 0),(0,s.jsx)("th",Object.assign({style:{width:"70px"}},{children:(0,D.Iu)("Connection",t,S.jv.SEARCH)}),void 0),(0,s.jsx)("th",Object.assign({style:{width:"50px"}},{children:(0,D.Iu)("Slots",t,S.jv.SEARCH)}),void 0),(0,s.jsx)("th",{children:(0,D.Iu)("IP",t,S.jv.SEARCH)},void 0),(0,s.jsx)("th",{children:(0,D.Iu)("Path",t,S.jv.SEARCH)},void 0)]},void 0)},void 0),(0,s.jsx)("tbody",{children:e.sort(F).map((e=>(0,s.jsx)(H,{result:e,t},e.user.cid)))},void 0)]}),void 0)]}),void 0)}),{urls:{results:({parentResult:e,instanceId:t},n)=>n.get(`${i.Z.INSTANCES_URL}/${t}/results/${e.id}/children`)}});var $=n(92245),z=n(28252),Y=n(518);const V=(e,t,n,s)=>Y.Z.post(`${i.Z.MODULE_URL}/${s.id}/results/${e.id}/download`,n);class M extends r.Component{constructor(){super(...arguments),this.itemDataGetter=(e,t)=>{const{instance:n}=this.props;return t.get(`${i.Z.INSTANCES_URL}/${n.id}/results/${e}`)}}render(){const{parentResult:e,instance:t}=this.props;return(0,s.jsxs)(Z.Z,Object.assign({className:"result",title:e.name,closable:!0,icon:(0,s.jsx)(N.Z,{typeInfo:e.type},void 0),fullHeight:!0},this.props,{children:[(0,s.jsx)(I.Z,{downloadHandler:V,itemDataGetter:this.itemDataGetter,session:t},void 0),(0,s.jsx)(z.Y,{fileItem:e,downloadHandler:V,user:e.users.user,showPath:!1,session:t},void 0),(0,s.jsx)(G,{parentResult:e,instanceId:t.id},void 0)]}),void 0)}}M.displayName="ResultDialog";const K=(0,$.ZP)((0,T.Z)(M,{urls:{parentResult:({match:e,instance:t},n)=>n.get(`${i.Z.INSTANCES_URL}/${t.id}/results/${e.params.resultId}`)}}),"result/:resultId");var W=n(10293),X=n.n(W),q=n(93836);const Q=X().createStore({_viewName:"search_view",_apiUrl:i.Z.INSTANCES_URL,mixins:[(0,q.Z)("relevance",!1)]});var J=n(35108),ee=n(78230),te=n(68126),ne=n(55019),se=n(27695),re=n(89116);const ie=({count:e,user:t},n)=>e>1?n((0,D.zS)("xUsersNicks",S.jv.SEARCH),{defaultValue:"{{count}} user ({{user.nicks}})",defaultValue_plural:"{{count}} users ({{user.nicks}})",count:e,replace:{count:e,user:t}}):t.nicks,ae=({cellData:e,rowDataGetter:t,t:n})=>(0,s.jsx)(U.cG,Object.assign({text:ie(e,n),user:e.user,directory:t().path,userIcon:"simple",ids:P.D,remoteMenuId:L.Z.HINTED_USER},{children:(0,s.jsx)(U.B2,{actions:_,itemData:t,ids:["result"]},void 0)}),void 0),oe=e=>(e&&e.users,e.users.user),le=e=>{var{rowDataGetter:t,instance:n}=e,r=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["rowDataGetter","instance"]);return(0,s.jsx)(te.iK,Object.assign({userGetter:oe,rowDataGetter:t,downloadHandler:V,session:n},r,{children:(0,s.jsx)(U.B2,{actions:_,itemData:t,remoteMenuId:L.Z.GROUPED_SEARCH_RESULT,entityId:n.id},void 0)}),void 0)};class ce extends r.Component{constructor(){super(...arguments),this.rowClassNameGetter=e=>(0,ne.r)(e.dupe),this.emptyRowsNodeGetter=()=>{const{running:e,searchString:t,searchT:n}=this.props;return e?null:!!t&&(0,s.jsx)(se.Z,{title:n.t("noResults",{defaultValue:'No results found for "{{searchString}}"',replace:{searchString:t}}),description:(0,s.jsx)(re.c,Object.assign({i18nKey:n.toI18nKey("noResultsHint")},{children:(0,s.jsxs)("div",Object.assign({className:"ui bulleted list"},{children:[(0,s.jsx)("div",Object.assign({className:"item"},{children:"Ensure that you spelled the words correctly"}),void 0),(0,s.jsx)("div",Object.assign({className:"item"},{children:"Use different keywords"}),void 0),(0,s.jsx)("div",Object.assign({className:"item"},{children:"You are searching too frequently (hubs often have a minimum search interval)"}),void 0),(0,s.jsx)("div",Object.assign({className:"item"},{children:"If you never receive results for common search terms, make sure that your connectivity settings are configured properly"}),void 0)]}),void 0)}),void 0)},void 0)},this.itemDataGetter=(e,t)=>{const{instance:n}=this.props;return t.get(`${i.Z.INSTANCES_URL}/${n.id}/results/${e}`)}}render(){const{searchT:e,instance:t}=this.props;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(ee.Z,Object.assign({emptyRowsNodeGetter:this.emptyRowsNodeGetter,rowClassNameGetter:this.rowClassNameGetter,store:Q,textFilterProps:{autoFocus:!1},entityId:t.id,moduleId:_.moduleId},{children:[(0,s.jsx)(J.Column,{name:"Name",width:200,columnKey:"name",flexGrow:8,cell:(0,s.jsx)(le,{instance:t},void 0)},void 0),(0,s.jsx)(J.Column,{name:"Size",width:60,columnKey:"size",cell:(0,s.jsx)(te.Eh,{},void 0),flexGrow:1},void 0),(0,s.jsx)(J.Column,{name:"Type",width:80,columnKey:"type",flexGrow:1,hideWidth:600},void 0),(0,s.jsx)(J.Column,{name:"Relevance",width:60,columnKey:"relevance",cell:(0,s.jsx)(te.uL,{},void 0),flexGrow:1},void 0),(0,s.jsx)(J.Column,{name:"Connection",width:60,columnKey:"connection",cell:(0,s.jsx)(te.$A,{},void 0),flexGrow:2,hideWidth:600},void 0),(0,s.jsx)(J.Column,{name:"Users",width:120,columnKey:"users",flexGrow:3,cell:(0,s.jsx)(ae,{},void 0),hideWidth:600},void 0),(0,s.jsx)(J.Column,{name:"Last modified",width:80,columnKey:"time",cell:(0,s.jsx)(te.Ks,{},void 0),flexGrow:1,hideWidth:800},void 0),(0,s.jsx)(J.Column,{name:"Slots",width:60,columnKey:"slots",flexGrow:1,hideWidth:800},void 0)]}),void 0),(0,s.jsx)(I.Z,{downloadHandler:V,itemDataGetter:this.itemDataGetter,session:t},void 0),(0,s.jsx)(K,{searchT:e,instance:t},void 0)]},void 0)}}ce.displayName="ResultTable";const de=ce;var ue=n(15479),he=n(26435),pe=n(3629),me=n(89519);const ve=(0,T.Z)((e=>{var{submitHandler:t,historyId:n,history:r,refetchData:i}=e,a=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["submitHandler","historyId","history","refetchData"]);const{t:o}=(0,k.$)();return(0,s.jsx)(he.Z,Object.assign({},a,{data:r,submitHandler:e=>{return s=void 0,r=void 0,l=function*(){const s=e.trim();yield(0,me.h9)((()=>(0,pe.V)(n,s)),o),i(),t(s)},new((a=void 0)||(a=Promise))((function(e,t){function n(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 s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(n,i)}o((l=l.apply(s,r||[])).next())}));var s,r,a,l}}),void 0)}),{urls:{history:({historyId:e},t)=>t.get(ue.ZP.STRINGS_URL+"/"+e)},loaderText:null});var ge=n(84807),Ae=n(10606),xe=n(95887),fe=n(70516),je=n(18603),be=n(48005),ye=n(35451),Ee=n(35936);const Ce=({locals:e,children:t})=>{const{label:n}=e,r=(0,je.T7)(e.value);return(0,s.jsxs)(ye.ZP,Object.assign({className:"field",defaultActiveIndexes:r?[0]:void 0},{children:[(0,s.jsxs)(ye.il,{children:[(0,s.jsx)(Ee.Z,{icon:y.Z.DROPDOWN},void 0),(0,s.jsx)("span",Object.assign({style:r?{fontWeight:"bold"}:void 0},{children:n}),void 0)]},void 0),(0,s.jsx)(ye.vF,{children:t},void 0)]}),void 0)},Oe=({hubs:e,value:t,onChange:n})=>{const r=e.filter((e=>e.connect_state.id===O.XF.CONNECTED)),i=t&&t.length?t:r.map((e=>e.hub_url)),a=()=>{if(1===i.length)return!1};return(0,s.jsx)(s.Fragment,{children:r.map((e=>(0,s.jsx)("div",Object.assign({className:"field"},{children:(0,s.jsx)(fe.Z,{caption:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(be.Z,{hub:e},void 0),e.identity.name]},void 0),beforeUnchecked:a,checked:-1!==i.indexOf(e.hub_url),onChange:t=>{const s=(0,je.Nl)(i,e.hub_url,t);n(s.length===r.length?null:s)},style:{maxWidth:"300px"}},void 0)}),e.id)))},void 0)},Se={renderSelect:e=>(0,s.jsx)(Ce,Object.assign({locals:e},{children:(0,s.jsx)(Oe,{onChange:e.onChange,value:e.value,hubs:e.options},void 0)}),void 0),renderLabel:e=>null},we=xe.ZP.form.Form.templates.select.clone(Se),_e=({inputProps:e,moduleT:t,onChange:n,value:i})=>{const[a,o]=(0,r.useState)(void 0),[l,c]=(0,r.useState)(2),d=()=>{let e=a||0;if(l)for(let t=1;t<=l;t++)e*=1024;return e};return(0,r.useEffect)((()=>{const e=d();e!==i&&n(e)}),[l,a]),(0,r.useEffect)((()=>{const e=d();if(i!==e){const{value:e,unitIndex:t}=(0,B.n2)(i,B.U5,1024);o(e),c(i?t:2)}}),[i]),(0,s.jsxs)("div",Object.assign({style:{display:"flex"}},{children:[(0,s.jsx)("input",Object.assign({className:"ui input",type:"number"},e,{min:0,value:a||"",onChange:e=>{let t=e.target.value?parseInt(e.target.value):null;o(t||void 0)}}),void 0),(0,s.jsx)("select",Object.assign({className:"ui select",style:{maxWidth:"100px"},value:B.U5[l],onChange:e=>{c(e.target.selectedIndex)}},{children:B.U5.map(((e,n)=>(0,s.jsx)("option",Object.assign({value:e},{children:(0,B.Ac)(e,t.plainT)}),e)))}),void 0)]}),void 0)},Ze={renderInput:e=>(0,s.jsx)(_e,{onChange:e.onChange,value:e.value?parseInt(e.value):0,moduleT:e.context.formT},void 0)},Ne=xe.ZP.form.Form.templates.textbox.clone(Ze);var Ie=n(68662),Te=n(98374);const Re=({type:e,size:t="large"})=>{return e.id?(0,s.jsx)(N.Z,{typeInfo:(n=e,"directory"===n.id?{id:"directory",str:"",files:0,directories:0}:{id:"file",str:"",content_type:n.id}),size:t},void 0):(0,s.jsx)(Ee.Z,{icon:y.Z.ANY,size:t},void 0);var n},Be=(e,t,n)=>(0,s.jsx)(Te.Z,Object.assign({onClick:()=>t(e.id),icon:(0,s.jsx)(Re,{type:e},void 0),active:n.id===e.id},{children:e.str}),e.id||i.Z.DEFAULT_SEARCH_TYPE),Ue=(0,T.Z)((({searchTypes:e,value:t,onChange:n,moduleT:r})=>{const i=(e=>[{id:null,str:e.translate("Any")},{id:"directory",str:e.translate("Directory")},{id:"file",str:e.translate("File")}])(r),a=e.find((e=>t===e.id))||i.find((e=>t===e.id))||i[0];return(0,s.jsxs)(Ie.Z,Object.assign({selection:!0,caption:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(Re,{type:a,size:""},void 0),a.str]},void 0)},{children:[i.map((e=>Be(e,n,a))),(0,s.jsx)("div",{className:"ui divider"},"divider"),e.map((e=>Be(e,n,a)))]}),void 0)}),{urls:{searchTypes:i.Z.SEARCH_TYPES_URL}}),Pe={renderSelect:e=>(0,s.jsx)(Ue,{onChange:e.onChange,value:e.value||null,moduleT:e.context.formT},void 0)},ke=xe.ZP.form.Form.templates.select.clone(Pe);var De=n(43496);const Le={renderFieldset(e,t){const{label:n}=t,r=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(t,["label"]);return(0,s.jsx)(Ce,Object.assign({locals:t},{children:xe.ZP.form.Form.templates.struct.renderFieldset(e,r)}),void 0)},renderLabel:e=>null},He=xe.ZP.form.Form.templates.struct.clone(Le),Fe=[{key:"file_type",title:"File type",type:O.Y2.STRING,optional:!0},{key:"hub_urls",title:"Hubs",type:O.Y2.LIST,item_type:O.Y2.STRING},{key:"size_limits",title:"Size limits",type:O.Y2.STRUCT,optional:!0,definitions:[{key:"min_size",title:"Minimum size",type:O.Y2.NUMBER,optional:!0},{key:"max_size",title:"Maximum size",type:O.Y2.NUMBER,optional:!0}]}];class Ge extends r.PureComponent{constructor(e){super(e),this.onFieldChanged=(e,t,n)=>{const s=(r=t,Object.keys(r).reduce(((e,t)=>{const n=r[t];return(0,je.T7)(n)&&(e[t]=n),e}),{}));var r;return this.props.onChange(Object.keys(s).length?s:null),null},this.save=()=>this.form.save(),this.onSave=e=>Promise.resolve(),this.onFieldSetting=(e,t,n)=>{"hub_urls"===e?Object.assign(t,{factory:xe.ZP.form.Select,template:we,options:this.props.hubs}):"min_size"===e||"max_size"===e?Object.assign(t,{template:Ne}):"excluded"===e?Object.assign(t,{disableOrder:!0}):"file_type"===e?Object.assign(t,{template:ke}):"size_limits"===e&&Object.assign(t,{template:He})},this.definitions=(0,je.rv)(Fe,e.moduleT)}render(){const{value:e,onChange:t,location:n,moduleT:r}=this.props;return(0,s.jsxs)("div",{children:[(0,s.jsx)(De.Z,{ref:e=>this.form=e,onFieldChanged:this.onFieldChanged,onFieldSetting:this.onFieldSetting,onSave:this.onSave,fieldDefinitions:this.definitions,value:e,location:n,optionTitleFormatter:e=>e.title,className:"search-options"},void 0),(0,s.jsx)(ge.Z,{caption:r.translate("Reset all"),onClick:()=>t(null),disabled:!e,style:{marginTop:"10px"}},void 0)]},void 0)}}Ge.displayName="SearchOptionForm";var $e=n(27835),ze=n(21222);const Ye=(0,T.Z)((({moduleT:e,location:t,onChange:n,value:i,hubs:a})=>{const o=e=>{if(e){const t=(e=>Object.keys(e).reduce(((t,n)=>((Array.isArray(e[n])?e[n].length:e[n])&&(t[n]=e[n]),t)),{}))(e);n(Object.keys(t).length?t:null)}else n(null)};(0,r.useEffect)((()=>{if(i&&i.hub_urls&&i.hub_urls.length){const e=i.hub_urls,t=e.filter((e=>a.find((t=>t.hub_url===e))));t.length!==e.length&&o(Object.assign(Object.assign({},i),{hub_urls:t.length?t:null}))}}),[a]);const l=i?Object.keys(i).filter((e=>{const t=i[e];return(0,je.T7)(t)})).length:null;return(0,s.jsx)($e.Z,Object.assign({triggerClassName:"options",className:"options",trigger:(0,s.jsx)(ge.Z,{caption:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(Ee.Z,{icon:y.Z.OPTIONS},void 0),!!l&&(0,s.jsx)("span",Object.assign({style:{fontWeight:"bold",marginRight:"3px",color:"black"}},{children:`(${l})`}),void 0),(0,s.jsx)(Ee.Z,{icon:y.Z.EXPAND},void 0)]},void 0)},void 0),contentUpdateTrigger:i},{children:n=>(0,s.jsx)(Ge,{moduleT:e,location:t,onChange:o,value:i,hubs:a},void 0)}),void 0)}),{urls:{hubs:ze.Z.SESSIONS_URL},onSocketConnected:(e,{refetchData:t})=>{e(ze.Z.MODULE_URL,ze.Z.SESSION_CREATED,(()=>t())),e(ze.Z.MODULE_URL,ze.Z.SESSION_UPDATED,(e=>{e.connect_state&&t()})),e(ze.Z.MODULE_URL,ze.Z.SESSION_REMOVED,(()=>t()))},dataConverters:{hubs:e=>e.filter((e=>e.connect_state.id===O.XF.CONNECTED))}}),Ve=({moduleT:e,defaultValue:t,running:n,handleSubmit:i,location:a,defaultOptions:o})=>{const[l,c]=(0,r.useState)(o),d=(0,Ae.wd)();return(0,s.jsx)("div",Object.assign({className:"search-container"},{children:(0,s.jsxs)("div",Object.assign({className:"search-area"},{children:[(0,s.jsx)(ve,{historyId:ue.n0.SEARCH,submitHandler:e=>i(e,l||void 0),disabled:n,defaultValue:t,placeholder:e.translate("Enter search string..."),button:(0,s.jsx)(ge.Z,{className:"blue",icon:y.Z.SEARCH,caption:d?void 0:e.translate("Search"),loading:n},void 0)},void 0),(0,s.jsx)(Ye,{moduleT:e,location:a,onChange:c,value:l},void 0)]}),void 0)}),void 0)};var Me=n(57136),Ke=n(66883),We=function(e,t,n,s){return new(n||(n=Promise))((function(r,i){function a(e){try{l(s.next(e))}catch(e){i(e)}}function o(e){try{l(s.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,o)}l((s=s.apply(e,t||[])).next())}))};class Xe extends r.Component{constructor(){super(...arguments),this.state={searchString:"",running:!1},this.checkLocationState=e=>{const{state:t}=e.location;t&&t.searchString&&t.searchString!==this.state.searchString&&(this.search(t.searchString),a.Z.replace({pathname:e.location.pathname}))},this.search=(e,t)=>We(this,void 0,void 0,(function*(){console.log("Searching"),clearTimeout(this.searchTimeout);const n=t||{},{hub_urls:s,size_limits:r}=n,a=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(n,["hub_urls","size_limits"]);try{const t=yield(o=this.props.instance,l={query:Object.assign(Object.assign({pattern:e},r),a),priority:O.Gu.HIGH,hub_urls:s},Y.Z.post(`${i.Z.INSTANCES_URL}/${o.id}/hub_search`,l));this.onSearchPosted(t),this.setState({searchString:e,running:!0})}catch(e){Me.Z.apiError("Search failed",e)}var o,l})),this.onSearchPosted=e=>{this.searchTimeout=window.setTimeout((()=>{this.setState({running:!1})}),e.queue_time+4e3)},this.parseOptions=()=>{const{query:e}=this.props.instance;return e?{excluded:e.excluded,size_limits:{min_size:e.min_size,max_size:e.max_size},file_type:e.file_type===i.Z.DEFAULT_SEARCH_TYPE||"tth"===e.file_type?null:e.file_type,hub_urls:[]}:null},this.searchT=(0,D.HY)(this.props.t,S.jv.SEARCH)}componentDidMount(){this.checkLocationState(this.props);const{query:e}=this.props.instance;e&&this.setState({searchString:e.pattern})}componentDidUpdate(e){this.checkLocationState(this.props)}render(){const{instance:e,location:t}=this.props,{searchString:n,running:r}=this.state,{t:i}=this.searchT;return(0,s.jsx)(o.Z,Object.assign({offlineMessage:i("searchOffline","You must to be connected to at least one hub in order to perform searches")},{children:(0,s.jsxs)("div",Object.assign({className:"search-layout"},{children:[(0,s.jsx)(Ve,{moduleT:this.searchT,running:r,defaultValue:n,handleSubmit:this.search,location:t,defaultOptions:this.parseOptions()},void 0),(0,s.jsx)(de,{searchString:n,running:r,searchT:this.searchT,instance:e},void 0)]}),void 0)}),void 0)}}const qe=(0,T.Z)(Xe,{urls:{instance:(e,t)=>We(void 0,void 0,void 0,(function*(){const e=(yield t.get(`${i.Z.INSTANCES_URL}`)).find((e=>e.owner===`session:${Ke.Z.sessionId}:webui`));if(e)return e;const n=(yield t.post(i.Z.INSTANCES_URL,{owner_suffix:"webui",expiration:0})).id;return t.get(`${i.Z.INSTANCES_URL}/${n}`)}))}})}}]);
2
- //# sourceMappingURL=search.321f771dd92b51431378.chunk.js.map
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[464],{48366:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(87537),r=n.n(s),i=n(23645),a=n.n(i)()(r());a.push([e.id,"\r\n.fileitem.info.segment .dupe-paths .path {\r\n overflow-x: hidden;\r\n}\r\n\r\n.fileitem.info.segment .download.ui.dropdown {\r\n max-width: 150px;\r\n margin-top: 10px;\r\n}\r\n\r\n.fileitem.info.segment .title.column {\r\n margin-top: auto;\r\n margin-bottom: auto;\r\n}\r\n\r\n.fileitem.info.segment .value.column {\r\n word-break: break-all;\r\n}\r\n","",{version:3,sources:["webpack://./src/components/file-item-info/style.css"],names:[],mappings:";AACA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB",sourcesContent:["\r\n.fileitem.info.segment .dupe-paths .path {\r\n overflow-x: hidden;\r\n}\r\n\r\n.fileitem.info.segment .download.ui.dropdown {\r\n max-width: 150px;\r\n margin-top: 10px;\r\n}\r\n\r\n.fileitem.info.segment .title.column {\r\n margin-top: auto;\r\n margin-bottom: auto;\r\n}\r\n\r\n.fileitem.info.segment .value.column {\r\n word-break: break-all;\r\n}\r\n"],sourceRoot:""}]);const o=a},48931:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(87537),r=n.n(s),i=n(23645),a=n.n(i)()(r());a.push([e.id,".search-container {\r\n width:100%;\r\n height: 50px;\r\n}\r\n\r\n#mobile-layout .search-container {\r\n margin-top: 10px;\r\n}\r\n\r\n.search-container .search-area {\r\n width: 90%;\r\n max-width: 600px;\r\n margin-left: auto;\r\n margin-right: auto;\r\n display: flex;\r\n}\r\n\r\n.search-container .search-area .options.trigger {\r\n margin-left: 5px;\r\n}\r\n\r\n.search-container .search-area .options.trigger .button {\r\n padding-left: 15px;\r\n padding-right: 5px;\r\n height: 100%;\r\n}\r\n\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, \r\n.search-area .react-autosuggest__container,\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, .search-area input {\r\n width: 100%;\r\n}\r\n\r\n.search-area button {\r\n display: inline-block !important;\r\n}\r\n\r\n.search-layout {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n}\r\n\r\n.search-layout .virtual-table {\r\n height: calc(100% - 50px);\r\n}\r\n\r\n@media only screen and (min-width: 767px) {\r\n .result.modal td {\r\n max-width: 250px;\r\n }\r\n}\r\n\r\n.search-options {\r\n min-width: 300px;\r\n}\r\n\r\n.search-options .field-hub_urls {\r\n max-height: 180px;\r\n overflow-y: auto;\r\n}\r\n","",{version:3,sources:["webpack://./src/routes/Search/style.css"],names:[],mappings:"AAAA;EACE,UAAU;EACV,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,UAAU;EACV,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;EAClB,aAAa;AACf;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,OAAO;AACT;;AAEA;;;EAGE,OAAO;AACT;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE;IACE,gBAAgB;EAClB;AACF;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,gBAAgB;AAClB",sourcesContent:[".search-container {\r\n width:100%;\r\n height: 50px;\r\n}\r\n\r\n#mobile-layout .search-container {\r\n margin-top: 10px;\r\n}\r\n\r\n.search-container .search-area {\r\n width: 90%;\r\n max-width: 600px;\r\n margin-left: auto;\r\n margin-right: auto;\r\n display: flex;\r\n}\r\n\r\n.search-container .search-area .options.trigger {\r\n margin-left: 5px;\r\n}\r\n\r\n.search-container .search-area .options.trigger .button {\r\n padding-left: 15px;\r\n padding-right: 5px;\r\n height: 100%;\r\n}\r\n\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, \r\n.search-area .react-autosuggest__container,\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, .search-area input {\r\n width: 100%;\r\n}\r\n\r\n.search-area button {\r\n display: inline-block !important;\r\n}\r\n\r\n.search-layout {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n}\r\n\r\n.search-layout .virtual-table {\r\n height: calc(100% - 50px);\r\n}\r\n\r\n@media only screen and (min-width: 767px) {\r\n .result.modal td {\r\n max-width: 250px;\r\n }\r\n}\r\n\r\n.search-options {\r\n min-width: 300px;\r\n}\r\n\r\n.search-options .field-hub_urls {\r\n max-height: 180px;\r\n overflow-y: auto;\r\n}\r\n"],sourceRoot:""}]);const o=a},28252:(e,t,n)=>{n.d(t,{Y:()=>w});var s=n(85893),r=(n(67294),n(2445)),i=n(47021),a=n(76249),o=n(32347),l=n(26793),c=n(8717),d=n(93379),u=n.n(d),h=n(7795),p=n.n(h),m=n(90569),v=n.n(m),g=n(3565),A=n.n(g),x=n(19216),f=n.n(x),j=n(44589),b=n.n(j),y=n(48366),E={};E.styleTagTransform=b(),E.setAttributes=A(),E.insert=v().bind(null,"head"),E.domAPI=p(),E.insertStyleElement=f(),u()(y.Z,E),y.Z&&y.Z.locals&&y.Z.locals;var C=n(24101);const O={[a.V9.SHARE_PARTIAL]:"Share (partial)",[a.V9.SHARE_FULL]:"Share (full)",[a.V9.QUEUE_PARTIAL]:"Queue (partial)",[a.V9.QUEUE_FULL]:"Queue (full)",[a.V9.FINISHED_PARTIAL]:"Finished (partial)",[a.V9.FINISHED_FULL]:"Finished (full)",[a.V9.SHARE_QUEUE]:"Share and queue"},S=({paths:e})=>(0,s.jsx)("div",Object.assign({className:"dupe-paths"},{children:e.map((e=>(0,s.jsx)("div",Object.assign({className:"path"},{children:e}),e)))}),void 0),w=({session:e,fileItem:t,user:n,downloadHandler:a,showPath:d=!0})=>{const{t:u}=(0,l.$)(),h=e=>(0,c.Iu)(e,u,o.jv.COMMON);return(0,s.jsxs)("div",Object.assign({className:"ui fileitem info segment"},{children:[(0,s.jsxs)(C.rj,Object.assign({columns:"two",stackable:!0},{children:[(0,s.jsx)(C.X2,{title:h("Name"),text:t.name},void 0),(0,s.jsx)(C.X2,{title:h("Type/content"),text:t.type.str},void 0),(0,s.jsx)(C.X2,{title:h("Size"),text:(0,r.BU)(t.size,u,!0)},void 0),(0,s.jsx)(C.X2,{title:h("Last modified"),text:(0,r.SY)(t.time||0)},void 0),"file"===t.type.id&&(0,s.jsx)(C.X2,{title:h("TTH"),text:t.tth},void 0),!!t.dupe&&(0,s.jsx)(C.X2,{title:h("Dupe type"),text:h(O[t.dupe.id])},void 0),!!t.dupe&&(0,s.jsx)(C.X2,{title:h("Dupe paths"),text:(0,s.jsx)(S,{paths:t.dupe.paths},void 0)},void 0),d&&(0,s.jsx)(C.X2,{title:h("Path"),text:t.path},void 0)]}),void 0),(0,s.jsx)(i.Yk,{caption:h("Actions..."),button:!0,user:n,itemInfoGetter:()=>t,downloadHandler:a,contextElement:".ui.modal > .content",session:e},void 0)]}),void 0)}},48005:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(85893),r=(n(67294),n(35936)),i=n(55019);const a=e=>{var{hub:t}=e,n=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["hub"]);return(0,s.jsx)(r.Z,Object.assign({},n,{icon:(0,i.iU)(t.connect_state.id)+" sitemap"}),void 0)}},14954:(e,t,n)=>{n.r(t),n.d(t,{default:()=>qe});var s=n(85893),r=n(67294),i=n(38423),a=n(20097),o=n(69767),l=n(93379),c=n.n(l),d=n(7795),u=n.n(d),h=n(90569),p=n.n(h),m=n(3565),v=n.n(m),g=n(19216),A=n.n(g),x=n(44589),f=n.n(x),j=n(48931),b={};b.styleTagTransform=f(),b.setAttributes=v(),b.insert=p().bind(null,"head"),b.domAPI=u(),b.insertStyleElement=A(),c()(j.Z,b),j.Z&&j.Z.locals&&j.Z.locals;var y=n(48117),E=n(45241),C=n(77744),O=n(76249),S=n(32347);const w={result:{displayName:"Result details",icon:y.Z.OPEN,handler:({data:e,location:t})=>{a.Z.push(`${t.pathname}/result/${e.id}`)}},browseContent:{displayName:"Browse content",access:O.PS.FILELISTS_EDIT,icon:y.Z.FILELIST,handler:({data:e,location:t})=>E.Z.createSession(t,e.users.user,C.Z,e.path)}},_={moduleId:S.jv.SEARCH,actions:w};var Z=n(28427),N=n(20368),I=n(62285),T=n(42090),R=n(91780),B=n(2445),U=n(47021),P=n(90195),k=n(26793),D=n(8717),L=n(4333);const H=({result:e,t})=>(0,s.jsxs)("tr",{children:[(0,s.jsx)("td",Object.assign({className:"user dropdown"},{children:(0,s.jsx)(U.Ie,{userIcon:!0,user:e.user,directory:e.path,ids:P.D,contextElement:".ui.modal > .content",remoteMenuId:L.Z.HINTED_USER},void 0)}),void 0),(0,s.jsx)("td",Object.assign({className:"hubs"},{children:e.user.hub_names}),void 0),(0,s.jsx)("td",Object.assign({className:"connection"},{children:(0,B.Nh)(e.connection,t)}),void 0),(0,s.jsx)("td",Object.assign({className:"slots"},{children:e.slots.str}),void 0),(0,s.jsx)("td",Object.assign({className:"ip"},{children:(0,s.jsx)(R.Z,{item:e.ip},void 0)}),void 0),(0,s.jsx)("td",Object.assign({className:"path",title:e.path},{children:e.path}),void 0)]},void 0),F=(e,t)=>e.user.nicks.localeCompare(t.user.nicks),G=(0,T.Z)((({results:e})=>{const{t}=(0,k.$)();return(0,s.jsxs)("div",Object.assign({className:"users"},{children:[(0,s.jsx)("h2",{children:t((0,D.zS)("usersCount",S.jv.SEARCH),{defaultValue:"User ({{count}})",defaultValue_plural:"Users ({{count}})",count:e.length})},void 0),(0,s.jsxs)("table",Object.assign({className:"ui striped table"},{children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{children:(0,D.Iu)("User",t,S.jv.SEARCH)},void 0),(0,s.jsx)("th",{children:(0,D.Iu)("Hubs",t,S.jv.SEARCH)},void 0),(0,s.jsx)("th",Object.assign({style:{width:"70px"}},{children:(0,D.Iu)("Connection",t,S.jv.SEARCH)}),void 0),(0,s.jsx)("th",Object.assign({style:{width:"50px"}},{children:(0,D.Iu)("Slots",t,S.jv.SEARCH)}),void 0),(0,s.jsx)("th",{children:(0,D.Iu)("IP",t,S.jv.SEARCH)},void 0),(0,s.jsx)("th",{children:(0,D.Iu)("Path",t,S.jv.SEARCH)},void 0)]},void 0)},void 0),(0,s.jsx)("tbody",{children:e.sort(F).map((e=>(0,s.jsx)(H,{result:e,t},e.user.cid)))},void 0)]}),void 0)]}),void 0)}),{urls:{results:({parentResult:e,instanceId:t},n)=>n.get(`${i.Z.INSTANCES_URL}/${t}/results/${e.id}/children`)}});var $=n(92245),z=n(28252),Y=n(518);const V=(e,t,n,s)=>Y.Z.post(`${i.Z.MODULE_URL}/${s.id}/results/${e.id}/download`,n);class M extends r.Component{constructor(){super(...arguments),this.itemDataGetter=(e,t)=>{const{instance:n}=this.props;return t.get(`${i.Z.INSTANCES_URL}/${n.id}/results/${e}`)}}render(){const{parentResult:e,instance:t}=this.props;return(0,s.jsxs)(Z.Z,Object.assign({className:"result",title:e.name,closable:!0,icon:(0,s.jsx)(N.Z,{typeInfo:e.type},void 0),fullHeight:!0},this.props,{children:[(0,s.jsx)(I.Z,{downloadHandler:V,itemDataGetter:this.itemDataGetter,session:t},void 0),(0,s.jsx)(z.Y,{fileItem:e,downloadHandler:V,user:e.users.user,showPath:!1,session:t},void 0),(0,s.jsx)(G,{parentResult:e,instanceId:t.id},void 0)]}),void 0)}}M.displayName="ResultDialog";const K=(0,$.ZP)((0,T.Z)(M,{urls:{parentResult:({match:e,instance:t},n)=>n.get(`${i.Z.INSTANCES_URL}/${t.id}/results/${e.params.resultId}`)}}),"result/:resultId");var W=n(10293),X=n.n(W),q=n(93836);const Q=X().createStore({_viewName:"search_view",_apiUrl:i.Z.INSTANCES_URL,mixins:[(0,q.Z)("relevance",!1)]});var J=n(35108),ee=n(78230),te=n(68126),ne=n(55019),se=n(27695),re=n(85444);const ie=({count:e,user:t},n)=>e>1?n((0,D.zS)("xUsersNicks",S.jv.SEARCH),{defaultValue:"{{count}} user ({{user.nicks}})",defaultValue_plural:"{{count}} users ({{user.nicks}})",count:e,replace:{count:e,user:t}}):t.nicks,ae=({cellData:e,rowDataGetter:t,t:n})=>(0,s.jsx)(U.cG,Object.assign({text:ie(e,n),user:e.user,directory:t().path,userIcon:"simple",ids:P.D,remoteMenuId:L.Z.HINTED_USER},{children:(0,s.jsx)(U.B2,{actions:_,itemData:t,ids:["result"]},void 0)}),void 0),oe=e=>(e&&e.users,e.users.user),le=e=>{var{rowDataGetter:t,instance:n}=e,r=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["rowDataGetter","instance"]);return(0,s.jsx)(te.iK,Object.assign({userGetter:oe,rowDataGetter:t,downloadHandler:V,session:n},r,{children:(0,s.jsx)(U.B2,{actions:_,itemData:t,remoteMenuId:L.Z.GROUPED_SEARCH_RESULT,entityId:n.id},void 0)}),void 0)};class ce extends r.Component{constructor(){super(...arguments),this.rowClassNameGetter=e=>(0,ne.r)(e.dupe),this.emptyRowsNodeGetter=()=>{const{running:e,searchString:t,searchT:n}=this.props;return e?null:!!t&&(0,s.jsx)(se.Z,{title:n.t("noResults",{defaultValue:'No results found for "{{searchString}}"',replace:{searchString:t}}),description:(0,s.jsx)(re.c,Object.assign({i18nKey:n.toI18nKey("noResultsHint")},{children:(0,s.jsxs)("div",Object.assign({className:"ui bulleted list"},{children:[(0,s.jsx)("div",Object.assign({className:"item"},{children:"Ensure that you spelled the words correctly"}),void 0),(0,s.jsx)("div",Object.assign({className:"item"},{children:"Use different keywords"}),void 0),(0,s.jsx)("div",Object.assign({className:"item"},{children:"You are searching too frequently (hubs often have a minimum search interval)"}),void 0),(0,s.jsx)("div",Object.assign({className:"item"},{children:"If you never receive results for common search terms, make sure that your connectivity settings are configured properly"}),void 0)]}),void 0)}),void 0)},void 0)},this.itemDataGetter=(e,t)=>{const{instance:n}=this.props;return t.get(`${i.Z.INSTANCES_URL}/${n.id}/results/${e}`)}}render(){const{searchT:e,instance:t}=this.props;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(ee.Z,Object.assign({emptyRowsNodeGetter:this.emptyRowsNodeGetter,rowClassNameGetter:this.rowClassNameGetter,store:Q,textFilterProps:{autoFocus:!1},entityId:t.id,moduleId:_.moduleId},{children:[(0,s.jsx)(J.Column,{name:"Name",width:200,columnKey:"name",flexGrow:8,cell:(0,s.jsx)(le,{instance:t},void 0)},void 0),(0,s.jsx)(J.Column,{name:"Size",width:60,columnKey:"size",cell:(0,s.jsx)(te.Eh,{},void 0),flexGrow:1},void 0),(0,s.jsx)(J.Column,{name:"Type",width:80,columnKey:"type",flexGrow:1,hideWidth:600},void 0),(0,s.jsx)(J.Column,{name:"Relevance",width:60,columnKey:"relevance",cell:(0,s.jsx)(te.uL,{},void 0),flexGrow:1},void 0),(0,s.jsx)(J.Column,{name:"Connection",width:60,columnKey:"connection",cell:(0,s.jsx)(te.$A,{},void 0),flexGrow:2,hideWidth:600},void 0),(0,s.jsx)(J.Column,{name:"Users",width:120,columnKey:"users",flexGrow:3,cell:(0,s.jsx)(ae,{},void 0),hideWidth:600},void 0),(0,s.jsx)(J.Column,{name:"Last modified",width:80,columnKey:"time",cell:(0,s.jsx)(te.Ks,{},void 0),flexGrow:1,hideWidth:800},void 0),(0,s.jsx)(J.Column,{name:"Slots",width:60,columnKey:"slots",flexGrow:1,hideWidth:800},void 0)]}),void 0),(0,s.jsx)(I.Z,{downloadHandler:V,itemDataGetter:this.itemDataGetter,session:t},void 0),(0,s.jsx)(K,{searchT:e,instance:t},void 0)]},void 0)}}ce.displayName="ResultTable";const de=ce;var ue=n(15479),he=n(26435),pe=n(3629),me=n(89519);const ve=(0,T.Z)((e=>{var{submitHandler:t,historyId:n,history:r,refetchData:i}=e,a=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["submitHandler","historyId","history","refetchData"]);const{t:o}=(0,k.$)();return(0,s.jsx)(he.Z,Object.assign({},a,{data:r,submitHandler:e=>{return s=void 0,r=void 0,l=function*(){const s=e.trim();yield(0,me.h9)((()=>(0,pe.V)(n,s)),o),i(),t(s)},new((a=void 0)||(a=Promise))((function(e,t){function n(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 s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(n,i)}o((l=l.apply(s,r||[])).next())}));var s,r,a,l}}),void 0)}),{urls:{history:({historyId:e},t)=>t.get(ue.ZP.STRINGS_URL+"/"+e)},loaderText:null});var ge=n(84807),Ae=n(10606),xe=n(95887),fe=n(70516),je=n(18603),be=n(48005),ye=n(35451),Ee=n(35936);const Ce=({locals:e,children:t})=>{const{label:n}=e,r=(0,je.T7)(e.value);return(0,s.jsxs)(ye.ZP,Object.assign({className:"field",defaultActiveIndexes:r?[0]:void 0},{children:[(0,s.jsxs)(ye.il,{children:[(0,s.jsx)(Ee.Z,{icon:y.Z.DROPDOWN},void 0),(0,s.jsx)("span",Object.assign({style:r?{fontWeight:"bold"}:void 0},{children:n}),void 0)]},void 0),(0,s.jsx)(ye.vF,{children:t},void 0)]}),void 0)},Oe=({hubs:e,value:t,onChange:n})=>{const r=e.filter((e=>e.connect_state.id===O.XF.CONNECTED)),i=t&&t.length?t:r.map((e=>e.hub_url)),a=()=>{if(1===i.length)return!1};return(0,s.jsx)(s.Fragment,{children:r.map((e=>(0,s.jsx)("div",Object.assign({className:"field"},{children:(0,s.jsx)(fe.Z,{caption:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(be.Z,{hub:e},void 0),e.identity.name]},void 0),beforeUnchecked:a,checked:-1!==i.indexOf(e.hub_url),onChange:t=>{const s=(0,je.Nl)(i,e.hub_url,t);n(s.length===r.length?null:s)},style:{maxWidth:"300px"}},void 0)}),e.id)))},void 0)},Se={renderSelect:e=>(0,s.jsx)(Ce,Object.assign({locals:e},{children:(0,s.jsx)(Oe,{onChange:e.onChange,value:e.value,hubs:e.options},void 0)}),void 0),renderLabel:e=>null},we=xe.ZP.form.Form.templates.select.clone(Se),_e=({inputProps:e,moduleT:t,onChange:n,value:i})=>{const[a,o]=(0,r.useState)(void 0),[l,c]=(0,r.useState)(2),d=()=>{let e=a||0;if(l)for(let t=1;t<=l;t++)e*=1024;return e};return(0,r.useEffect)((()=>{const e=d();e!==i&&n(e)}),[l,a]),(0,r.useEffect)((()=>{const e=d();if(i!==e){const{value:e,unitIndex:t}=(0,B.n2)(i,B.U5,1024);o(e),c(i?t:2)}}),[i]),(0,s.jsxs)("div",Object.assign({style:{display:"flex"}},{children:[(0,s.jsx)("input",Object.assign({className:"ui input",type:"number"},e,{min:0,value:a||"",onChange:e=>{let t=e.target.value?parseInt(e.target.value):null;o(t||void 0)}}),void 0),(0,s.jsx)("select",Object.assign({className:"ui select",style:{maxWidth:"100px"},value:B.U5[l],onChange:e=>{c(e.target.selectedIndex)}},{children:B.U5.map(((e,n)=>(0,s.jsx)("option",Object.assign({value:e},{children:(0,B.Ac)(e,t.plainT)}),e)))}),void 0)]}),void 0)},Ze={renderInput:e=>(0,s.jsx)(_e,{onChange:e.onChange,value:e.value?parseInt(e.value):0,moduleT:e.context.formT},void 0)},Ne=xe.ZP.form.Form.templates.textbox.clone(Ze);var Ie=n(68662),Te=n(98374);const Re=({type:e,size:t="large"})=>{return e.id?(0,s.jsx)(N.Z,{typeInfo:(n=e,"directory"===n.id?{id:"directory",str:"",files:0,directories:0}:{id:"file",str:"",content_type:n.id}),size:t},void 0):(0,s.jsx)(Ee.Z,{icon:y.Z.ANY,size:t},void 0);var n},Be=(e,t,n)=>(0,s.jsx)(Te.Z,Object.assign({onClick:()=>t(e.id),icon:(0,s.jsx)(Re,{type:e},void 0),active:n.id===e.id},{children:e.str}),e.id||i.Z.DEFAULT_SEARCH_TYPE),Ue=(0,T.Z)((({searchTypes:e,value:t,onChange:n,moduleT:r})=>{const i=(e=>[{id:null,str:e.translate("Any")},{id:"directory",str:e.translate("Directory")},{id:"file",str:e.translate("File")}])(r),a=e.find((e=>t===e.id))||i.find((e=>t===e.id))||i[0];return(0,s.jsxs)(Ie.Z,Object.assign({selection:!0,caption:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(Re,{type:a,size:""},void 0),a.str]},void 0)},{children:[i.map((e=>Be(e,n,a))),(0,s.jsx)("div",{className:"ui divider"},"divider"),e.map((e=>Be(e,n,a)))]}),void 0)}),{urls:{searchTypes:i.Z.SEARCH_TYPES_URL}}),Pe={renderSelect:e=>(0,s.jsx)(Ue,{onChange:e.onChange,value:e.value||null,moduleT:e.context.formT},void 0)},ke=xe.ZP.form.Form.templates.select.clone(Pe);var De=n(43496);const Le={renderFieldset(e,t){const{label:n}=t,r=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(t,["label"]);return(0,s.jsx)(Ce,Object.assign({locals:t},{children:xe.ZP.form.Form.templates.struct.renderFieldset(e,r)}),void 0)},renderLabel:e=>null},He=xe.ZP.form.Form.templates.struct.clone(Le),Fe=[{key:"file_type",title:"File type",type:O.Y2.STRING,optional:!0},{key:"hub_urls",title:"Hubs",type:O.Y2.LIST,item_type:O.Y2.STRING},{key:"size_limits",title:"Size limits",type:O.Y2.STRUCT,optional:!0,definitions:[{key:"min_size",title:"Minimum size",type:O.Y2.NUMBER,optional:!0},{key:"max_size",title:"Maximum size",type:O.Y2.NUMBER,optional:!0}]}];class Ge extends r.PureComponent{constructor(e){super(e),this.onFieldChanged=(e,t,n)=>{const s=(r=t,Object.keys(r).reduce(((e,t)=>{const n=r[t];return(0,je.T7)(n)&&(e[t]=n),e}),{}));var r;return this.props.onChange(Object.keys(s).length?s:null),null},this.save=()=>this.form.save(),this.onSave=e=>Promise.resolve(),this.onFieldSetting=(e,t,n)=>{"hub_urls"===e?Object.assign(t,{factory:xe.ZP.form.Select,template:we,options:this.props.hubs}):"min_size"===e||"max_size"===e?Object.assign(t,{template:Ne}):"excluded"===e?Object.assign(t,{disableOrder:!0}):"file_type"===e?Object.assign(t,{template:ke}):"size_limits"===e&&Object.assign(t,{template:He})},this.definitions=(0,je.rv)(Fe,e.moduleT)}render(){const{value:e,onChange:t,location:n,moduleT:r}=this.props;return(0,s.jsxs)("div",{children:[(0,s.jsx)(De.Z,{ref:e=>this.form=e,onFieldChanged:this.onFieldChanged,onFieldSetting:this.onFieldSetting,onSave:this.onSave,fieldDefinitions:this.definitions,value:e,location:n,optionTitleFormatter:e=>e.title,className:"search-options"},void 0),(0,s.jsx)(ge.Z,{caption:r.translate("Reset all"),onClick:()=>t(null),disabled:!e,style:{marginTop:"10px"}},void 0)]},void 0)}}Ge.displayName="SearchOptionForm";var $e=n(27835),ze=n(21222);const Ye=(0,T.Z)((({moduleT:e,location:t,onChange:n,value:i,hubs:a})=>{const o=e=>{if(e){const t=(e=>Object.keys(e).reduce(((t,n)=>((Array.isArray(e[n])?e[n].length:e[n])&&(t[n]=e[n]),t)),{}))(e);n(Object.keys(t).length?t:null)}else n(null)};(0,r.useEffect)((()=>{if(i&&i.hub_urls&&i.hub_urls.length){const e=i.hub_urls,t=e.filter((e=>a.find((t=>t.hub_url===e))));t.length!==e.length&&o(Object.assign(Object.assign({},i),{hub_urls:t.length?t:null}))}}),[a]);const l=i?Object.keys(i).filter((e=>{const t=i[e];return(0,je.T7)(t)})).length:null;return(0,s.jsx)($e.Z,Object.assign({triggerClassName:"options",className:"options",trigger:(0,s.jsx)(ge.Z,{caption:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(Ee.Z,{icon:y.Z.OPTIONS},void 0),!!l&&(0,s.jsx)("span",Object.assign({style:{fontWeight:"bold",marginRight:"3px",color:"black"}},{children:`(${l})`}),void 0),(0,s.jsx)(Ee.Z,{icon:y.Z.EXPAND},void 0)]},void 0)},void 0),contentUpdateTrigger:i},{children:n=>(0,s.jsx)(Ge,{moduleT:e,location:t,onChange:o,value:i,hubs:a},void 0)}),void 0)}),{urls:{hubs:ze.Z.SESSIONS_URL},onSocketConnected:(e,{refetchData:t})=>{e(ze.Z.MODULE_URL,ze.Z.SESSION_CREATED,(()=>t())),e(ze.Z.MODULE_URL,ze.Z.SESSION_UPDATED,(e=>{e.connect_state&&t()})),e(ze.Z.MODULE_URL,ze.Z.SESSION_REMOVED,(()=>t()))},dataConverters:{hubs:e=>e.filter((e=>e.connect_state.id===O.XF.CONNECTED))}}),Ve=({moduleT:e,defaultValue:t,running:n,handleSubmit:i,location:a,defaultOptions:o})=>{const[l,c]=(0,r.useState)(o),d=(0,Ae.wd)();return(0,s.jsx)("div",Object.assign({className:"search-container"},{children:(0,s.jsxs)("div",Object.assign({className:"search-area"},{children:[(0,s.jsx)(ve,{historyId:ue.n0.SEARCH,submitHandler:e=>i(e,l||void 0),disabled:n,defaultValue:t,placeholder:e.translate("Enter search string..."),button:(0,s.jsx)(ge.Z,{className:"blue",icon:y.Z.SEARCH,caption:d?void 0:e.translate("Search"),loading:n},void 0)},void 0),(0,s.jsx)(Ye,{moduleT:e,location:a,onChange:c,value:l},void 0)]}),void 0)}),void 0)};var Me=n(57136),Ke=n(66883),We=function(e,t,n,s){return new(n||(n=Promise))((function(r,i){function a(e){try{l(s.next(e))}catch(e){i(e)}}function o(e){try{l(s.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,o)}l((s=s.apply(e,t||[])).next())}))};class Xe extends r.Component{constructor(){super(...arguments),this.state={searchString:"",running:!1},this.checkLocationState=e=>{const{state:t}=e.location;t&&t.searchString&&t.searchString!==this.state.searchString&&(this.search(t.searchString),a.Z.replace({pathname:e.location.pathname}))},this.search=(e,t)=>We(this,void 0,void 0,(function*(){console.log("Searching"),clearTimeout(this.searchTimeout);const n=t||{},{hub_urls:s,size_limits:r}=n,a=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(n,["hub_urls","size_limits"]);try{const t=yield(o=this.props.instance,l={query:Object.assign(Object.assign({pattern:e},r),a),priority:O.Gu.HIGH,hub_urls:s},Y.Z.post(`${i.Z.INSTANCES_URL}/${o.id}/hub_search`,l));this.onSearchPosted(t),this.setState({searchString:e,running:!0})}catch(e){Me.Z.apiError("Search failed",e)}var o,l})),this.onSearchPosted=e=>{this.searchTimeout=window.setTimeout((()=>{this.setState({running:!1})}),e.queue_time+4e3)},this.parseOptions=()=>{const{query:e}=this.props.instance;return e?{excluded:e.excluded,size_limits:{min_size:e.min_size,max_size:e.max_size},file_type:e.file_type===i.Z.DEFAULT_SEARCH_TYPE||"tth"===e.file_type?null:e.file_type,hub_urls:[]}:null},this.searchT=(0,D.HY)(this.props.t,S.jv.SEARCH)}componentDidMount(){this.checkLocationState(this.props);const{query:e}=this.props.instance;e&&this.setState({searchString:e.pattern})}componentDidUpdate(e){this.checkLocationState(this.props)}render(){const{instance:e,location:t}=this.props,{searchString:n,running:r}=this.state,{t:i}=this.searchT;return(0,s.jsx)(o.Z,Object.assign({offlineMessage:i("searchOffline","You must to be connected to at least one hub in order to perform searches")},{children:(0,s.jsxs)("div",Object.assign({className:"search-layout"},{children:[(0,s.jsx)(Ve,{moduleT:this.searchT,running:r,defaultValue:n,handleSubmit:this.search,location:t,defaultOptions:this.parseOptions()},void 0),(0,s.jsx)(de,{searchString:n,running:r,searchT:this.searchT,instance:e},void 0)]}),void 0)}),void 0)}}const qe=(0,T.Z)(Xe,{urls:{instance:(e,t)=>We(void 0,void 0,void 0,(function*(){const e=(yield t.get(`${i.Z.INSTANCES_URL}`)).find((e=>e.owner===`session:${Ke.Z.sessionId}:webui`));if(e)return e;const n=(yield t.post(i.Z.INSTANCES_URL,{owner_suffix:"webui",expiration:0})).id;return t.get(`${i.Z.INSTANCES_URL}/${n}`)}))}})}}]);
2
+ //# sourceMappingURL=search.24ec8c5fe5f45b1180a9.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"js/search.321f771dd92b51431378.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/file-item-info/style.css","webpack://airdcpp-webui/./src/routes/Search/style.css","webpack://airdcpp-webui/./src/components/file-item-info/style.css?a322","webpack://airdcpp-webui/./src/components/file-item-info/FileItemInfoGrid.tsx","webpack://airdcpp-webui/./src/components/icon/HubIcon.tsx","webpack://airdcpp-webui/./src/routes/Search/style.css?d43b","webpack://airdcpp-webui/./src/actions/ui/SearchActions.ts","webpack://airdcpp-webui/./src/routes/Search/components/result-dialog/UserResultTable.tsx","webpack://airdcpp-webui/./src/services/api/SearchApi.ts","webpack://airdcpp-webui/./src/routes/Search/components/result-dialog/ResultDialog.tsx","webpack://airdcpp-webui/./src/stores/SearchViewStore.js","webpack://airdcpp-webui/./src/routes/Search/components/ResultTable.tsx","webpack://airdcpp-webui/./src/components/autosuggest/HistoryInput.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/AccordionField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/HubSelectField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/SizeField.tsx","webpack://airdcpp-webui/./src/components/icon/SearchTypeIcon.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/FileTypeField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/AccordionStructField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/SearchOptionsForm.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/SearchOptionsButton.tsx","webpack://airdcpp-webui/./src/routes/Search/components/SearchInput.tsx","webpack://airdcpp-webui/./src/routes/Search/components/Search.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, \"\\r\\n.fileitem.info.segment .dupe-paths .path {\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .download.ui.dropdown {\\r\\n max-width: 150px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .title.column {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .value.column {\\r\\n word-break: break-all;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/file-item-info/style.css\"],\"names\":[],\"mappings\":\";AACA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB\",\"sourcesContent\":[\"\\r\\n.fileitem.info.segment .dupe-paths .path {\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .download.ui.dropdown {\\r\\n max-width: 150px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .title.column {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .value.column {\\r\\n word-break: break-all;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// 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, \".search-container {\\r\\n width:100%;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n#mobile-layout .search-container {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.search-container .search-area {\\r\\n width: 90%;\\r\\n max-width: 600px;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger {\\r\\n margin-left: 5px;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger .button {\\r\\n padding-left: 15px;\\r\\n padding-right: 5px;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, \\r\\n.search-area .react-autosuggest__container,\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, .search-area input {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.search-area button {\\r\\n display: inline-block !important;\\r\\n}\\r\\n\\r\\n.search-layout {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-layout .virtual-table {\\r\\n height: calc(100% - 50px);\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 767px) {\\r\\n .result.modal td {\\r\\n max-width: 250px;\\r\\n }\\r\\n}\\r\\n\\r\\n.search-options {\\r\\n min-width: 300px;\\r\\n}\\r\\n\\r\\n.search-options .field-hub_urls {\\r\\n max-height: 180px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Search/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,UAAU;EACV,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,UAAU;EACV,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;EAClB,aAAa;AACf;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,OAAO;AACT;;AAEA;;;EAGE,OAAO;AACT;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE;IACE,gBAAgB;EAClB;AACF;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,gBAAgB;AAClB\",\"sourcesContent\":[\".search-container {\\r\\n width:100%;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n#mobile-layout .search-container {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.search-container .search-area {\\r\\n width: 90%;\\r\\n max-width: 600px;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger {\\r\\n margin-left: 5px;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger .button {\\r\\n padding-left: 15px;\\r\\n padding-right: 5px;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, \\r\\n.search-area .react-autosuggest__container,\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, .search-area input {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.search-area button {\\r\\n display: inline-block !important;\\r\\n}\\r\\n\\r\\n.search-layout {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-layout .virtual-table {\\r\\n height: calc(100% - 50px);\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 767px) {\\r\\n .result.modal td {\\r\\n max-width: 250px;\\r\\n }\\r\\n}\\r\\n\\r\\n.search-options {\\r\\n min-width: 300px;\\r\\n}\\r\\n\\r\\n.search-options .field-hub_urls {\\r\\n max-height: 180px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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 { formatRelativeTime, formatSize } from 'utils/ValueFormat';\r\n\r\nimport { DownloadMenu } from 'components/menu';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\n\r\nimport './style.css';\r\nimport { Row, Grid } from 'components/semantic/Grid';\r\n\r\n\r\nconst DupeStrings = {\r\n //[API.DupeEnum.NONE]: 'None',\r\n [API.DupeEnum.SHARE_PARTIAL]: 'Share (partial)',\r\n [API.DupeEnum.SHARE_FULL]: 'Share (full)',\r\n [API.DupeEnum.QUEUE_PARTIAL]: 'Queue (partial)',\r\n [API.DupeEnum.QUEUE_FULL]: 'Queue (full)',\r\n [API.DupeEnum.FINISHED_PARTIAL]: 'Finished (partial)',\r\n [API.DupeEnum.FINISHED_FULL]: 'Finished (full)',\r\n [API.DupeEnum.SHARE_QUEUE]: 'Share and queue',\r\n};\r\n\r\nconst DupePaths: React.FC<{ paths: string[] }> = ({ paths }) => (\r\n <div className=\"dupe-paths\">\r\n { paths.map(path => (\r\n <div key={ path } className=\"path\">\r\n { path }\r\n </div>\r\n )) }\r\n </div>\r\n);\r\n\r\ninterface FileItemInfoGridProps {\r\n fileItem: UI.DownloadableItemInfo;\r\n user: API.HintedUser;\r\n downloadHandler: UI.DownloadHandler<UI.DownloadableItemInfo>;\r\n showPath?: boolean;\r\n session: UI.SessionItemBase;\r\n}\r\n\r\nconst FileItemInfoGrid: React.FC<FileItemInfoGridProps> = ({ \r\n session, fileItem, user, downloadHandler, showPath = true \r\n}) => {\r\n const { t } = useTranslation();\r\n const gridT = (text: string) => {\r\n return translate(text, t, UI.Modules.COMMON);\r\n };\r\n\r\n return (\r\n <div className=\"ui fileitem info segment\">\r\n <Grid \r\n columns=\"two\"\r\n stackable={ true }\r\n >\r\n <Row \r\n title={ gridT('Name') }\r\n text={ fileItem.name }\r\n />\r\n <Row \r\n title={ gridT('Type/content') } \r\n text={ fileItem.type.str }\r\n />\r\n <Row \r\n title={ gridT('Size') } \r\n text={ formatSize(fileItem.size, t, true) }\r\n />\r\n <Row \r\n title={ gridT('Last modified') }\r\n text={ formatRelativeTime(fileItem.time || 0) }\r\n />\r\n { fileItem.type.id === 'file' && (\r\n <Row \r\n title={ gridT('TTH') } \r\n text={ fileItem.tth }\r\n /> \r\n )}\r\n { !!fileItem.dupe && (\r\n <Row \r\n title={ gridT('Dupe type') }\r\n text={ gridT(DupeStrings[fileItem.dupe.id]) }\r\n /> \r\n )}\r\n { !!fileItem.dupe && (\r\n <Row \r\n title={ gridT('Dupe paths') }\r\n text={ <DupePaths paths={ fileItem.dupe.paths }/> }\r\n /> \r\n )}\r\n { showPath && (\r\n <Row \r\n title={ gridT('Path') }\r\n text={ fileItem.path }\r\n /> \r\n )}\r\n </Grid>\r\n\r\n <DownloadMenu \r\n caption={ gridT('Actions...') }\r\n button={ true }\r\n user={ user }\r\n itemInfoGetter={ () => fileItem }\r\n downloadHandler={ downloadHandler }\r\n contextElement=\".ui.modal > .content\"\r\n session={ session }\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport { FileItemInfoGrid };","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport Icon, { IconProps } from 'components/semantic/Icon';\r\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\ninterface HubIconProps extends IconProps {\r\n hub: API.Hub;\r\n}\r\n\r\nconst HubIcon: React.FC<HubIconProps> = ({ hub, ...other }) => (\r\n <Icon\r\n { ...other }\r\n icon={ hubOnlineStatusToColor(hub.connect_state.id) + ' sitemap' }\r\n />\r\n);\r\n\r\n/*HubIcon.propTypes = {\r\n // Hub object\r\n hub: PropTypes.object.isRequired,\r\n};*/\r\n\r\nexport default HubIcon;","\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 History from 'utils/History';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport FilelistSessionActions from 'actions/reflux/FilelistSessionActions';\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst handleBrowseContent: UI.ActionHandler<API.GroupedSearchResult> = ({ data, location }) => {\r\n return FilelistSessionActions.createSession(location, data.users.user, FilelistSessionStore, data.path);\r\n};\r\n\r\nconst handleResult: UI.ActionHandler<API.GroupedSearchResult> = ({ data, location }) => {\r\n History.push(`${location.pathname}/result/${data.id}`);\r\n};\r\n\r\n\r\nconst SearchActions: UI.ActionListType<API.GroupedSearchResult> = {\r\n result: { \r\n displayName: 'Result details',\r\n icon: IconConstants.OPEN,\r\n handler: handleResult,\r\n },\r\n browseContent: { \r\n displayName: 'Browse content', \r\n access: API.AccessEnum.FILELISTS_EDIT,\r\n icon: IconConstants.FILELIST,\r\n handler: handleBrowseContent,\r\n },\r\n};\r\n\r\n\r\nexport default {\r\n moduleId: UI.Modules.SEARCH,\r\n actions: SearchActions,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport FormattedIp from 'components/format/FormattedIp';\r\nimport { formatConnection } from 'utils/ValueFormat';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport { UserMenu } from 'components/menu';\r\nimport { UserFileActions } from 'actions/ui/UserActions';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate, toI18nKey } from 'utils/TranslationUtils';\r\nimport { TFunction } from 'i18next';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface UserResultProps {\r\n result: API.ChildSearchResult;\r\n t: TFunction;\r\n}\r\n\r\nconst UserResult: React.FC<UserResultProps> = ({ result, t }) => (\r\n <tr>\r\n <td className=\"user dropdown\">\r\n <UserMenu \r\n userIcon={ true }\r\n user={ result.user }\r\n directory={ result.path }\r\n ids={ UserFileActions }\r\n contextElement=\".ui.modal > .content\"\r\n remoteMenuId={ MenuConstants.HINTED_USER }\r\n />\r\n </td>\r\n <td className=\"hubs\">\r\n { result.user.hub_names }\r\n </td>\r\n <td className=\"connection\">\r\n { formatConnection(result.connection, t) }\r\n </td>\r\n <td className=\"slots\">\r\n { result.slots.str }\r\n </td>\r\n <td className=\"ip\">\r\n <FormattedIp item={ result.ip }/>\r\n </td>\r\n <td className=\"path\" title={ result.path }>\r\n { result.path }\r\n </td>\r\n </tr>\r\n);\r\n\r\nconst resultSort = (a: API.ChildSearchResult, b: API.ChildSearchResult) => a.user.nicks.localeCompare(b.user.nicks);\r\n\r\ninterface UserResultTableProps {\r\n parentResult: API.GroupedSearchResult;\r\n instanceId: number;\r\n}\r\n\r\ninterface UserResultTableDataProps extends DataProviderDecoratorChildProps {\r\n results: API.ChildSearchResult[];\r\n}\r\n\r\nconst UserResultTable: React.FC<UserResultTableProps & UserResultTableDataProps> = (\r\n { results }\r\n) => {\r\n const { t } = useTranslation();\r\n return (\r\n <div className=\"users\">\r\n <h2>\r\n { t(toI18nKey('usersCount', UI.Modules.SEARCH), { \r\n defaultValue: 'User ({{count}})',\r\n defaultValue_plural: 'Users ({{count}})',\r\n count: results.length\r\n }) }\r\n </h2>\r\n <table className=\"ui striped table\">\r\n <thead>\r\n <tr>\r\n <th>{ translate('User', t, UI.Modules.SEARCH) }</th>\r\n <th>{ translate('Hubs', t, UI.Modules.SEARCH) }</th>\r\n <th style={{ width: '70px' }}>{ translate('Connection', t, UI.Modules.SEARCH) }</th>\r\n <th style={{ width: '50px' }}>{ translate('Slots', t, UI.Modules.SEARCH) }</th>\r\n <th>{ translate('IP', t, UI.Modules.SEARCH) }</th>\r\n <th>{ translate('Path', t, UI.Modules.SEARCH) }</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n { results.sort(resultSort).map(result => (\r\n <UserResult \r\n key={ result.user.cid }\r\n result={ result }\r\n t={ t }\r\n />\r\n )) }\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DataProviderDecorator<UserResultTableProps, UserResultTableDataProps>(UserResultTable, {\r\n urls: {\r\n results: ({ parentResult, instanceId }, socket) => socket.get(`${SearchConstants.INSTANCES_URL}/${instanceId}/results/${parentResult.id}/children`),\r\n }\r\n});","import SearchConstants from 'constants/SearchConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nexport const searchDownloadHandler: UI.DownloadHandler<API.GroupedSearchResult> = (\r\n itemInfo, \r\n user, \r\n downloadData,\r\n instance\r\n) => {\r\n return SocketService.post(\r\n `${SearchConstants.MODULE_URL}/${instance!.id}/results/${itemInfo.id}/download`, \r\n downloadData\r\n );\r\n};\r\n\r\ninterface SearchData {\r\n query: Pick<API.SearchQuery, 'pattern'> & Partial<Omit<API.SearchQuery, 'pattern'>>;\r\n hub_urls: string[] | undefined | null;\r\n priority: API.PriorityEnum;\r\n}\r\n\r\nexport const search = (\r\n instance: API.SearchInstance, \r\n data: SearchData\r\n) => {\r\n return SocketService.post<API.SearchResponse>(\r\n `${SearchConstants.INSTANCES_URL}/${instance.id}/hub_search`, \r\n data\r\n );\r\n};\r\n","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\r\n\r\nimport UserResultTable from './UserResultTable';\r\n\r\nimport ModalRouteDecorator, { ModalRouteDecoratorChildProps } from 'decorators/ModalRouteDecorator';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { FileItemInfoGrid } from 'components/file-item-info';\r\nimport { searchDownloadHandler } from 'services/api/SearchApi';\r\n\r\n\r\ninterface ResultDialogProps {\r\n searchT: UI.ModuleTranslator;\r\n instance: API.SearchInstance;\r\n}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n parentResult: API.GroupedSearchResult;\r\n}\r\n\r\ninterface RouteProps {\r\n resultId: string;\r\n}\r\n\r\ntype Props = ResultDialogProps & ModalRouteDecoratorChildProps<RouteProps>;\r\n\r\n\r\nclass ResultDialog extends Component<Props & DataProps> {\r\n static displayName = 'ResultDialog';\r\n\r\n itemDataGetter: UI.DownloadItemDataGetter<API.GroupedSearchResult> = (itemId, socket) => {\r\n const { instance } = this.props;\r\n return socket.get(`${SearchConstants.INSTANCES_URL}/${instance.id}/results/${itemId}`);\r\n }\r\n\r\n render() {\r\n const { parentResult, instance } = this.props;\r\n return (\r\n <Modal \r\n className=\"result\" \r\n title={ parentResult.name }\r\n closable={ true } \r\n icon={ <FileIcon typeInfo={ parentResult.type }/> } \r\n fullHeight={ true }\r\n { ...this.props }\r\n >\r\n <DownloadDialog \r\n downloadHandler={ searchDownloadHandler }\r\n itemDataGetter={ this.itemDataGetter }\r\n session={ instance }\r\n />\r\n <FileItemInfoGrid \r\n fileItem={ parentResult }\r\n downloadHandler={ searchDownloadHandler }\r\n user={ parentResult.users.user }\r\n showPath={ false }\r\n session={ instance }\r\n />\r\n <UserResultTable \r\n parentResult={ parentResult }\r\n instanceId={ instance.id }\r\n />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nconst Decorated = ModalRouteDecorator<ResultDialogProps, RouteProps>(\r\n DataProviderDecorator<Props, DataProps>(\r\n ResultDialog, {\r\n urls: {\r\n parentResult: ({ match, instance }, socket) => socket.get(`${SearchConstants.INSTANCES_URL}/${instance.id}/results/${match.params.resultId}`),\r\n }\r\n }\r\n ), \r\n 'result/:resultId'\r\n);\r\n\r\nexport { Decorated as ResultDialog };\r\n","import Reflux from 'reflux';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\r\n\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'search_view',\r\n _apiUrl: SearchConstants.INSTANCES_URL,\r\n mixins: [ ViewStoreMixin('relevance', false) ],\r\n});\r\n","import * as React from 'react';\r\n\r\nimport SearchActions from 'actions/ui/SearchActions';\r\n\r\nimport { ResultDialog } from './result-dialog';\r\n\r\nimport SearchViewStore from 'stores/SearchViewStore';\r\n\r\nimport { Column } from 'fixed-data-table-2';\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport { SizeCell, DurationCell, ConnectionCell, FileDownloadCell, DecimalCell } from 'components/table/Cell';\r\nimport { TableActionMenu } from 'components/menu';\r\n\r\nimport { dupeToStringType } from 'utils/TypeConvert';\r\nimport { TableUserMenu } from 'components/menu';\r\nimport { UserFileActions } from 'actions/ui/UserActions';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\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 { TFunction } from 'i18next';\r\nimport { Trans } from 'react-i18next';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\nimport { searchDownloadHandler } from 'services/api/SearchApi';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuConstants from 'constants/MenuConstants';\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\n\r\nconst getUserCaption = ({ count, user }: API.SearchResultUserInfo, t: TFunction) => {\r\n if (count > 1) {\r\n return t(toI18nKey('xUsersNicks', UI.Modules.SEARCH), {\r\n defaultValue: `{{count}} user ({{user.nicks}})`,\r\n defaultValue_plural: `{{count}} users ({{user.nicks}})`,\r\n count,\r\n replace: {\r\n count,\r\n user\r\n }\r\n });\r\n }\r\n\r\n return user.nicks;\r\n};\r\n\r\nconst UserCell: React.FC<RowWrapperCellChildProps<API.SearchResultUserInfo, API.GroupedSearchResult>> = (\r\n { cellData, rowDataGetter, t }\r\n) => (\r\n <TableUserMenu \r\n text={ getUserCaption(cellData!, t!) } \r\n user={ cellData!.user }\r\n directory={ rowDataGetter!().path }\r\n userIcon=\"simple\"\r\n ids={ UserFileActions }\r\n remoteMenuId={ MenuConstants.HINTED_USER }\r\n >\r\n <TableActionMenu \r\n actions={ SearchActions }\r\n itemData={ rowDataGetter }\r\n ids={ [ 'result' ] }\r\n />\r\n </TableUserMenu>\r\n);\r\n\r\nconst resultUserGetter = (rowData: API.GroupedSearchResult) => {\r\n if (!rowData || !rowData.users) {\r\n return rowData.users.user;\r\n }\r\n\r\n return rowData.users.user;\r\n};\r\n\r\ninterface NameCellProps extends RowWrapperCellChildProps<string, API.GroupedSearchResult> {\r\n instance: API.SearchInstance;\r\n}\r\n\r\nconst NameCell: React.FC<NameCellProps> = (\r\n { rowDataGetter, instance, ...props }\r\n) => (\r\n <FileDownloadCell \r\n userGetter={ resultUserGetter }\r\n rowDataGetter={ rowDataGetter }\r\n downloadHandler={ searchDownloadHandler }\r\n session={ instance }\r\n { ...props }\r\n >\r\n <TableActionMenu \r\n actions={ SearchActions }\r\n itemData={ rowDataGetter }\r\n remoteMenuId={ MenuConstants.GROUPED_SEARCH_RESULT }\r\n entityId={ instance.id }\r\n />\r\n </FileDownloadCell>\r\n);\r\n\r\nexport interface ResultTableProps {\r\n running: boolean;\r\n searchString: string;\r\n searchT: UI.ModuleTranslator;\r\n instance: API.SearchInstance;\r\n}\r\n\r\nclass ResultTable extends React.Component<ResultTableProps> {\r\n static displayName = 'ResultTable';\r\n\r\n rowClassNameGetter = (rowData: API.GroupedSearchResult) => {\r\n return dupeToStringType(rowData.dupe);\r\n }\r\n\r\n emptyRowsNodeGetter = () => {\r\n const { running, searchString, searchT } = this.props;\r\n if (running) {\r\n return null;\r\n }\r\n\r\n if (!searchString) {\r\n return process.env.DEMO_MODE === '1' && (\r\n <Message \r\n title=\"Demo content available\"\r\n icon={ IconConstants.TIP }\r\n description={ 'Use the search string \"demo\" to receive results from the demo share' }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <Message \r\n title={ searchT.t('noResults', {\r\n defaultValue: `No results found for \"{{searchString}}\"`,\r\n replace: {\r\n searchString\r\n }\r\n }) }\r\n description={ (\r\n <Trans i18nKey={ searchT.toI18nKey('noResultsHint') }>\r\n <div className=\"ui bulleted list\">\r\n <div className=\"item\">Ensure that you spelled the words correctly</div>\r\n <div className=\"item\">Use different keywords</div>\r\n <div className=\"item\">You are searching too frequently (hubs often have a minimum search interval)</div>\r\n <div className=\"item\">\r\n If you never receive results for common search terms, \r\n make sure that your connectivity settings are configured properly\r\n </div>\r\n </div>\r\n </Trans>\r\n ) }\r\n />\r\n );\r\n }\r\n \r\n itemDataGetter: UI.DownloadItemDataGetter<API.GroupedSearchResult> = (itemId, socket) => {\r\n const { instance } = this.props;\r\n return socket.get(`${SearchConstants.INSTANCES_URL}/${instance.id}/results/${itemId}`);\r\n }\r\n\r\n render() {\r\n const { searchT, instance } = this.props;\r\n return (\r\n <>\r\n <VirtualTable\r\n emptyRowsNodeGetter={ this.emptyRowsNodeGetter }\r\n rowClassNameGetter={ this.rowClassNameGetter }\r\n store={ SearchViewStore }\r\n textFilterProps={{\r\n autoFocus: false,\r\n }}\r\n entityId={ instance.id }\r\n moduleId={ SearchActions.moduleId }\r\n >\r\n <Column\r\n name=\"Name\"\r\n width={200}\r\n columnKey=\"name\"\r\n flexGrow={8}\r\n cell={ <NameCell instance={ instance }/> }\r\n />\r\n <Column\r\n name=\"Size\"\r\n width={60}\r\n columnKey=\"size\"\r\n cell={ <SizeCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Type\"\r\n width={80}\r\n columnKey=\"type\"\r\n flexGrow={1}\r\n hideWidth={600}\r\n />\r\n <Column\r\n name=\"Relevance\"\r\n width={60}\r\n columnKey=\"relevance\"\r\n cell={ <DecimalCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Connection\"\r\n width={60}\r\n columnKey=\"connection\"\r\n cell={ <ConnectionCell/> }\r\n flexGrow={2}\r\n hideWidth={600}\r\n />\r\n <Column\r\n name=\"Users\"\r\n width={120}\r\n columnKey=\"users\"\r\n flexGrow={3}\r\n cell={ <UserCell/> }\r\n hideWidth={600}\r\n />\r\n <Column\r\n name=\"Last modified\"\r\n width={80}\r\n columnKey=\"time\"\r\n cell={ <DurationCell/> }\r\n flexGrow={1}\r\n hideWidth={800}\r\n />\r\n <Column\r\n name=\"Slots\"\r\n width={60}\r\n columnKey=\"slots\"\r\n flexGrow={1}\r\n hideWidth={800}\r\n />\r\n </VirtualTable>\r\n <DownloadDialog \r\n downloadHandler={ searchDownloadHandler }\r\n itemDataGetter={ this.itemDataGetter }\r\n session={ instance }\r\n />\r\n <ResultDialog \r\n searchT={ searchT }\r\n instance={ instance }\r\n />\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default ResultTable;","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\n\r\nimport HistoryConstants from 'constants/HistoryConstants';\r\n\r\nimport LocalSuggestField, { LocalSuggestFieldProps } from './LocalSuggestField';\r\nimport { addHistory } from 'services/api/HistoryApi';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n\r\nexport interface HistoryInputProps extends Omit<LocalSuggestFieldProps, 'data' | 'submitHandler'> {\r\n historyId: string;\r\n submitHandler: (text: string) => void;\r\n}\r\n\r\ninterface HistoryInputDataProps extends DataProviderDecoratorChildProps {\r\n history: string[];\r\n}\r\n\r\n\r\nconst HistoryInput: React.FC<HistoryInputProps & HistoryInputDataProps> = (\r\n { submitHandler, historyId, history, refetchData, ...other }\r\n) => {\r\n const { t } = useTranslation();\r\n const handleSubmit = async (value: string) => {\r\n const text = value.trim();\r\n await runBackgroundSocketAction(\r\n () => addHistory(historyId, text),\r\n t\r\n );\r\n\r\n refetchData();\r\n submitHandler(text);\r\n };\r\n\r\n return (\r\n <LocalSuggestField \r\n { ...other }\r\n data={ history }\r\n submitHandler={ handleSubmit }\r\n />\r\n );\r\n};\r\n\r\nexport default DataProviderDecorator<HistoryInputProps, HistoryInputDataProps>(HistoryInput, {\r\n urls: {\r\n history: ({ historyId }, socket) => socket.get(HistoryConstants.STRINGS_URL + '/' + historyId),\r\n },\r\n loaderText: null,\r\n});\r\n","import * as React from 'react';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport Accordion, { AccordionContent, AccordionTitle } from 'components/semantic/Accordion';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Icon from 'components/semantic/Icon';\r\nimport { isValueSet } from 'utils/FormUtils';\r\n\r\n\r\ninterface FormAccordionProps {\r\n locals: UI.FormLocals;\r\n}\r\n\r\nexport const FormAccordion: React.FC<FormAccordionProps> = ({ locals, children }) => {\r\n const { label } = locals;\r\n const active = isValueSet(locals.value);\r\n return (\r\n <Accordion \r\n className=\"field\" \r\n defaultActiveIndexes={ active ? [ 0 ] : undefined }\r\n >\r\n <AccordionTitle>\r\n <Icon icon={ IconConstants.DROPDOWN }/>\r\n <span style={ active ? { fontWeight: 'bold' } : undefined }>\r\n { label }\r\n </span>\r\n </AccordionTitle>\r\n <AccordionContent>\r\n { children }\r\n </AccordionContent>\r\n </Accordion>\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport Checkbox from 'components/semantic/Checkbox';\r\nimport { updateMultiselectValues } from 'utils/FormUtils';\r\nimport HubIcon from 'components/icon/HubIcon';\r\nimport { FormAccordion } from './AccordionField';\r\n\r\n\r\ninterface HubSelectFieldProps {\r\n value: string[] | null;\r\n onChange: (hubUrls: string[] | null) => void; \r\n}\r\n\r\ninterface DataProps {\r\n hubs: API.Hub[];\r\n}\r\n\r\n\r\ntype Props = HubSelectFieldProps & DataProps;\r\n\r\nconst HubSelectField: React.FC<Props> = ({ hubs, value, onChange }) => {\r\n const onlineHubs = hubs.filter(hub => hub.connect_state.id === API.HubConnectStateEnum.CONNECTED);\r\n const selectedUrls = !!value && !!value.length ? value : onlineHubs.map(hub => hub.hub_url);\r\n\r\n const beforeUnchecked = () => {\r\n if (selectedUrls.length === 1) {\r\n return false;\r\n }\r\n\r\n return;\r\n };\r\n\r\n return (\r\n <>\r\n { onlineHubs.map(hub => (\r\n <div key={ hub.id } className=\"field\">\r\n <Checkbox\r\n caption={ (\r\n <>\r\n <HubIcon hub={ hub }/>\r\n { hub.identity.name }\r\n </>\r\n ) }\r\n beforeUnchecked={ beforeUnchecked }\r\n checked={ selectedUrls.indexOf(hub.hub_url) !== -1 }\r\n onChange={ checked => {\r\n const newValue = updateMultiselectValues(selectedUrls, hub.hub_url, checked);\r\n onChange(newValue.length === onlineHubs.length ? null : newValue);\r\n } }\r\n style={{\r\n maxWidth: '300px',\r\n }}\r\n />\r\n </div>\r\n )) }\r\n </>\r\n );\r\n};\r\n\r\n\r\ntype TCombTemplate = { \r\n renderSelect: (locals: UI.FormLocals<API.Hub, string[]>) => React.ReactNode; \r\n renderLabel: (locals: UI.FormLocals<API.Hub, string[]>) => React.ReactNode;\r\n};\r\n\r\nconst HubsSelectField: TCombTemplate = {\r\n renderSelect(locals) {\r\n return (\r\n <FormAccordion locals={ locals }>\r\n <HubSelectField \r\n onChange={ locals.onChange }\r\n value={ locals.value }\r\n hubs={ locals.options }\r\n />\r\n </FormAccordion>\r\n );\r\n },\r\n renderLabel(locals) {\r\n return null;\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.select.clone(HubsSelectField);\r\n","import { useState, useEffect } from 'react';\r\nimport * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { ByteUnits, formatUnit, parseUnit } from 'utils/ValueFormat';\r\n\r\n\r\ninterface SizeFieldProps {\r\n moduleT: UI.ModuleTranslator;\r\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\r\n onChange: (size: number | null) => void;\r\n value: number;\r\n}\r\n\r\ntype Props = SizeFieldProps;\r\n\r\n\r\nconst DEFAULT_UNIT_INDEX = 2;\r\n\r\nconst SizeField: React.FC<Props> = ({ inputProps, moduleT, onChange, value }) => {\r\n const [ displayValue, setDisplayValue ] = useState<number | undefined>(undefined);\r\n const [ unitIndex, setUnitIndex ] = useState<number>(DEFAULT_UNIT_INDEX);\r\n\r\n const valueToBytes = () => {\r\n let ret = displayValue || 0;\r\n if (!!unitIndex) {\r\n for (let i = 1; i <= unitIndex; i++) {\r\n ret *= 1024;\r\n }\r\n }\r\n \r\n return ret;\r\n };\r\n\r\n useEffect(\r\n () => {\r\n const newValue = valueToBytes();\r\n if (newValue !== value) {\r\n onChange(newValue);\r\n }\r\n },\r\n [ unitIndex, displayValue ]\r\n );\r\n\r\n useEffect(\r\n () => {\r\n const curBytes = valueToBytes();\r\n if (value !== curBytes) {\r\n const { value: parsedValue, unitIndex: parsedUnitIndex } = parseUnit(value, ByteUnits, 1024);\r\n setDisplayValue(parsedValue);\r\n setUnitIndex(!!value ? parsedUnitIndex : DEFAULT_UNIT_INDEX);\r\n }\r\n },\r\n [ value ]\r\n );\r\n \r\n return (\r\n <div style={{ display: 'flex' }}>\r\n <input\r\n className=\"ui input\"\r\n type=\"number\"\r\n { ...inputProps }\r\n min={ 0 }\r\n value={ displayValue || '' }\r\n onChange={ evt => {\r\n let newValue = !!evt.target.value ? parseInt(evt.target.value) : null;\r\n if (!!newValue) {\r\n setDisplayValue(newValue);\r\n } else {\r\n setDisplayValue(undefined);\r\n }\r\n } }\r\n />\r\n <select \r\n className=\"ui select\" \r\n style={{ maxWidth: '100px' }}\r\n value={ ByteUnits[unitIndex] }\r\n onChange={ evt => {\r\n setUnitIndex(evt.target.selectedIndex);\r\n } }\r\n >\r\n { ByteUnits.map((unit, index) => (\r\n <option \r\n key={ unit }\r\n value={ unit }\r\n >\r\n { formatUnit(unit, moduleT.plainT) }\r\n </option>\r\n )) }\r\n </select>\r\n </div>\r\n );\r\n};\r\n\r\n\r\ntype TCombTemplate = { \r\n renderInput: (locals: UI.FormLocals<any, number>) => React.ReactNode; \r\n};\r\n\r\nconst FileTypeField: TCombTemplate = {\r\n renderInput(locals) {\r\n return (\r\n <SizeField \r\n onChange={ locals.onChange }\r\n value={ !!locals.value ? parseInt(locals.value as any) : 0 }\r\n moduleT={ locals.context.formT }\r\n />\r\n );\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.textbox.clone(FileTypeField);\r\n\r\n// export { SizeField };\r\n","import * as React from 'react';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\nimport Icon from 'components/semantic/Icon';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\n\r\nconst searchTypeToFileItem = (searchType: UI.SearchTypeItem): API.FileItemType => {\r\n if (searchType.id === 'directory') {\r\n return {\r\n id: 'directory',\r\n str: '',\r\n files: 0,\r\n directories: 0,\r\n };\r\n }\r\n\r\n return {\r\n id: 'file',\r\n str: '',\r\n content_type: searchType.id as API.FileContentType,\r\n };\r\n};\r\n\r\n\r\ninterface SearchTypeIconProps {\r\n type: UI.SearchTypeItem;\r\n size?: string;\r\n}\r\n\r\nexport const SearchTypeIcon: React.FC<SearchTypeIconProps> = ({ type, size = 'large' }) => {\r\n if (!type.id) {\r\n return (\r\n <Icon \r\n icon={ IconConstants.ANY } \r\n size={ size }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <FileIcon \r\n typeInfo={ searchTypeToFileItem(type) } \r\n size={ size }\r\n />\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport SearchConstants from 'constants/SearchConstants';\r\nimport Dropdown from 'components/semantic/Dropdown';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\nimport { SearchTypeIcon } from 'components/icon/SearchTypeIcon';\r\n\r\n\r\ntype OnChangeHandler = (value: string | null) => void;\r\n\r\ninterface SearchTypeDropdownProps {\r\n onChange: OnChangeHandler;\r\n value: string | null;\r\n moduleT: UI.ModuleTranslator;\r\n}\r\n\r\ninterface DataProps {\r\n searchTypes: API.SearchType[];\r\n}\r\n\r\nconst getCommonItems = (moduleT: UI.ModuleTranslator): UI.SearchTypeItem[] => ([\r\n {\r\n id: null,\r\n str: moduleT.translate('Any'),\r\n }, {\r\n id: 'directory',\r\n str: moduleT.translate('Directory'),\r\n }, {\r\n id: 'file',\r\n str: moduleT.translate('File'),\r\n }\r\n]);\r\n\r\nconst typeToMenuItem = (type: UI.SearchTypeItem, onChange: OnChangeHandler, selectedItem: UI.SearchTypeItem) => (\r\n <MenuItemLink \r\n key={ type.id || SearchConstants.DEFAULT_SEARCH_TYPE }\r\n onClick={ () => onChange(type.id) }\r\n icon={ <SearchTypeIcon type={ type }/> }\r\n active={ selectedItem.id === type.id }\r\n >\r\n { type.str }\r\n </MenuItemLink>\r\n);\r\n\r\ntype Props = SearchTypeDropdownProps & DataProviderDecoratorChildProps & DataProps;\r\n\r\nconst SearchTypeDropdown: React.FC<Props> = ({ searchTypes, value, onChange, moduleT }) => {\r\n const commonItems = getCommonItems(moduleT);\r\n const selectedItem = searchTypes.find(i => value === i.id) || commonItems.find(i => value === i.id) || commonItems[0];\r\n return (\r\n <Dropdown\r\n selection={ true }\r\n caption={ (\r\n <>\r\n <SearchTypeIcon type={ selectedItem } size=\"\"/>\r\n { selectedItem.str }\r\n </>\r\n ) }\r\n >\r\n { commonItems.map(type => typeToMenuItem(type, onChange, selectedItem)) }\r\n <div key=\"divider\" className=\"ui divider\"/>\r\n { searchTypes.map(type => typeToMenuItem(type, onChange, selectedItem)) }\r\n </Dropdown>\r\n );\r\n};\r\n\r\nconst SearchTypeDropdownDecorated = DataProviderDecorator<SearchTypeDropdownProps, DataProps>(\r\n SearchTypeDropdown,\r\n {\r\n urls: {\r\n searchTypes: SearchConstants.SEARCH_TYPES_URL\r\n }\r\n }\r\n);\r\n\r\n\r\ntype TCombTemplate = { \r\n renderSelect: (locals: UI.FormLocals<any, string>) => React.ReactNode; \r\n};\r\n\r\nconst FileTypeField: TCombTemplate = {\r\n renderSelect(locals) {\r\n return (\r\n <SearchTypeDropdownDecorated \r\n onChange={ locals.onChange }\r\n value={ locals.value || null }\r\n moduleT={ locals.context.formT }\r\n />\r\n );\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.select.clone(FileTypeField);\r\n","import * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FormAccordion } from './AccordionField';\r\n\r\n\r\ntype TCombTemplate = { \r\n renderFieldset: (children: React.ReactNode, locals: UI.FormLocals) => React.ReactNode; \r\n renderLabel: (locals: UI.FormLocals) => React.ReactNode;\r\n};\r\n\r\nconst AccordionStruct: TCombTemplate = {\r\n renderFieldset(children, locals) {\r\n const { label, ...childLocals } = locals;\r\n return (\r\n <FormAccordion locals={ locals }>\r\n { t.form.Form.templates.struct.renderFieldset(children, childLocals) }\r\n </FormAccordion>\r\n );\r\n },\r\n renderLabel(locals) {\r\n return null;\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.struct.clone(AccordionStruct);\r\n","import { PureComponent } from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport HubSelectField from './HubSelectField';\r\nimport SizeField from './SizeField';\r\nimport FileTypeField from './FileTypeField';\r\n\r\nimport Form, { FormFieldChangeHandler, FormSaveHandler, FormFieldSettingHandler } from 'components/form/Form';\r\nimport { isValueSet, translateForm } from 'utils/FormUtils';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport Button from 'components/semantic/Button';\r\nimport AccordionStructField from './AccordionStructField';\r\n\r\n\r\n\r\n\r\ninterface Entry extends Pick<API.SearchQuery, 'file_type'>, UI.FormValueMap {\r\n hub_urls: string[] | null;\r\n // file_type: string | null;\r\n size_limits: null | {\r\n min_size: number | null;\r\n max_size: number | null;\r\n };\r\n // min_size: number | null;\r\n // max_size: number | null;\r\n // excluded: string[] | null;\r\n}\r\n\r\nexport interface SearchOptionsFormProps extends Pick<RouteComponentProps, 'location'> {\r\n moduleT: UI.ModuleTranslator;\r\n onChange: (value: Entry | null) => void;\r\n value: Entry | null;\r\n hubs: API.Hub[];\r\n}\r\n\r\n\r\nconst Fields: UI.FormFieldDefinition[] = [\r\n {\r\n key: 'file_type',\r\n title: 'File type',\r\n type: API.SettingTypeEnum.STRING,\r\n optional: true,\r\n }, {\r\n key: 'hub_urls',\r\n title: 'Hubs',\r\n type: API.SettingTypeEnum.LIST,\r\n item_type: API.SettingTypeEnum.STRING,\r\n }, {\r\n key: 'size_limits',\r\n title: 'Size limits',\r\n type: API.SettingTypeEnum.STRUCT,\r\n optional: true,\r\n definitions: [\r\n {\r\n key: 'min_size',\r\n title: 'Minimum size',\r\n type: API.SettingTypeEnum.NUMBER,\r\n optional: true,\r\n }, {\r\n key: 'max_size',\r\n title: 'Maximum size',\r\n type: API.SettingTypeEnum.NUMBER,\r\n optional: true,\r\n }\r\n ]\r\n }, /*, {\r\n key: 'excluded',\r\n title: 'Excluded words',\r\n type: API.SettingTypeEnum.LIST,\r\n item_type: API.SettingTypeEnum.STRING,\r\n optional: true,\r\n }*/\r\n];\r\n\r\nconst removeEmptyProperties = (formValue: Entry) => {\r\n const ret = Object\r\n .keys(formValue)\r\n .reduce(\r\n (reduced, key) => {\r\n const value = formValue[key];\r\n if (isValueSet(value)) {\r\n reduced[key] = value;\r\n }\r\n\r\n return reduced;\r\n },\r\n {} as Entry\r\n );\r\n\r\n return ret;\r\n};\r\n\r\nclass SearchOptionsForm extends PureComponent<SearchOptionsFormProps> {\r\n static displayName = 'SearchOptionForm';\r\n\r\n constructor(props: SearchOptionsFormProps) {\r\n super(props);\r\n\r\n this.definitions = translateForm(Fields, props.moduleT);\r\n }\r\n\r\n definitions: UI.FormFieldDefinition[];\r\n form: Form<Entry>;\r\n\r\n onFieldChanged: FormFieldChangeHandler<Entry> = (id, value, hasChanges) => {\r\n const ret = removeEmptyProperties(value as Entry);\r\n this.props.onChange(!!Object.keys(ret).length ? ret : null);\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 return Promise.resolve();\r\n }\r\n\r\n onFieldSetting: FormFieldSettingHandler<Entry> = (id, fieldOptions, formValue) => {\r\n if (id === 'hub_urls') {\r\n Object.assign(fieldOptions, {\r\n factory: t.form.Select,\r\n template: HubSelectField,\r\n options: this.props.hubs,\r\n });\r\n } else if (id === 'min_size' || id === 'max_size') {\r\n Object.assign(fieldOptions, {\r\n // factory: t.form.List,\r\n template: SizeField,\r\n });\r\n } else if (id === 'excluded') {\r\n Object.assign(fieldOptions, {\r\n disableOrder: true,\r\n });\r\n } else if (id === 'file_type') {\r\n Object.assign(fieldOptions, {\r\n template: FileTypeField,\r\n });\r\n } else if (id === 'size_limits') {\r\n Object.assign(fieldOptions, {\r\n template: AccordionStructField,\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const { value, onChange, location, moduleT } = this.props;\r\n return (\r\n <div>\r\n <Form<Entry>\r\n ref={ c => this.form = c! }\r\n onFieldChanged={ this.onFieldChanged }\r\n onFieldSetting={ this.onFieldSetting }\r\n onSave={ this.onSave }\r\n fieldDefinitions={ this.definitions }\r\n value={ value }\r\n location={ location }\r\n optionTitleFormatter={ def => def.title }\r\n className=\"search-options\"\r\n />\r\n <Button\r\n caption={ moduleT.translate('Reset all') }\r\n onClick={ () => onChange(null) }\r\n disabled={ !value }\r\n style={{\r\n marginTop: '10px'\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport { SearchOptionsForm, Entry as SearchOptions };\r\n","import { useEffect } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport Button from 'components/semantic/Button';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport Popup from 'components/semantic/Popup';\r\nimport { SearchOptionsForm, SearchOptionsFormProps, SearchOptions } from './SearchOptionsForm';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Icon from 'components/semantic/Icon';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport HubConstants from 'constants/HubConstants';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport { isValueSet } from 'utils/FormUtils';\r\n\r\n\r\ninterface SearchOptionsButtonProps extends \r\n Pick<RouteComponentProps, 'location'>, \r\n Pick<SearchOptionsFormProps, 'onChange' | 'value'> {\r\n\r\n moduleT: UI.ModuleTranslator;\r\n}\r\n\r\n\r\ninterface DataProps {\r\n hubs: API.Hub[];\r\n}\r\n\r\ntype Props = SearchOptionsButtonProps & DataProviderDecoratorChildProps & DataProps;\r\n\r\n\r\nconst removeEmptyProperties = (value: SearchOptions) => {\r\n const ret = Object\r\n .keys(value)\r\n .reduce(\r\n (reduced, key) => {\r\n if (Array.isArray(value[key]) ? !!(value[key] as Array<any>).length : !!value[key]) {\r\n reduced[key] = value[key] as any;\r\n }\r\n\r\n return reduced;\r\n },\r\n {} as SearchOptions\r\n );\r\n\r\n return ret;\r\n};\r\n\r\n\r\nconst SearchOptionsButton: React.FC<Props> = ({ \r\n moduleT, location, onChange, value, hubs\r\n}) => {\r\n const onValueChanged = (newValue: SearchOptions | null) => {\r\n if (newValue) {\r\n const ret = removeEmptyProperties(newValue);\r\n onChange(!!Object.keys(ret).length ? ret : null);\r\n } else {\r\n onChange(null);\r\n }\r\n };\r\n\r\n useEffect(\r\n () => {\r\n // Remove obsolete hubs from the options\r\n if (!!value && !!value.hub_urls && !!value.hub_urls.length) {\r\n const selectedUrls = value.hub_urls;\r\n const selectedUrlsNew = selectedUrls.filter(url => hubs.find(hub => hub.hub_url === url));\r\n if (selectedUrlsNew.length !== selectedUrls.length) {\r\n onValueChanged({\r\n ...value,\r\n hub_urls: !!selectedUrlsNew.length ? selectedUrlsNew : null\r\n });\r\n }\r\n }\r\n },\r\n [ hubs ]\r\n );\r\n\r\n const filterCount = !value ? null : Object.keys(value)\r\n .filter(key => {\r\n const curValue = value[key];\r\n return isValueSet(curValue);\r\n })\r\n .length;\r\n\r\n return (\r\n <Popup\r\n triggerClassName=\"options\" \r\n className=\"options\" \r\n trigger={(\r\n <Button \r\n caption={ (\r\n <>\r\n <Icon icon={ IconConstants.OPTIONS }/>\r\n { !!filterCount && (\r\n <span \r\n style={{ \r\n fontWeight: 'bold',\r\n marginRight: '3px',\r\n color: 'black'\r\n }}\r\n >\r\n { `(${filterCount})` }\r\n </span>\r\n ) }\r\n <Icon icon={ IconConstants.EXPAND }/>\r\n </>\r\n ) }\r\n /> \r\n )}\r\n contentUpdateTrigger={ value }\r\n >\r\n { hide => (\r\n <SearchOptionsForm\r\n moduleT={ moduleT }\r\n location={ location }\r\n onChange={ onValueChanged }\r\n value={ value }\r\n hubs={ hubs }\r\n />\r\n ) }\r\n </Popup>\r\n );\r\n};\r\n\r\n\r\nconst SearchOptionButtonDecorated = DataProviderDecorator<SearchOptionsButtonProps, DataProps>(\r\n SearchOptionsButton,\r\n {\r\n urls: {\r\n hubs: HubConstants.SESSIONS_URL\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData }) => {\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.SESSION_CREATED, () => refetchData());\r\n addSocketListener<Partial<API.Hub>>(\r\n HubConstants.MODULE_URL, \r\n HubConstants.SESSION_UPDATED, \r\n hub => {\r\n if (!!hub.connect_state) { \r\n refetchData();\r\n }\r\n }\r\n );\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.SESSION_REMOVED, () => refetchData());\r\n },\r\n dataConverters: {\r\n hubs: (hubs: API.Hub[]) => hubs.filter(hub => hub.connect_state.id === API.HubConnectStateEnum.CONNECTED)\r\n }\r\n }\r\n);\r\n\r\nexport { SearchOptionButtonDecorated as SearchOptionButton };\r\n","import { useState } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport HistoryInput from 'components/autosuggest/HistoryInput';\r\nimport { HistoryStringEnum } from 'constants/HistoryConstants';\r\nimport Button from 'components/semantic/Button';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\nimport { SearchOptionButton, SearchOptions } from './options-panel';\r\n\r\n\r\ninterface SearchInputProps extends Pick<RouteComponentProps, 'location'> {\r\n running: boolean;\r\n moduleT: UI.ModuleTranslator;\r\n defaultValue?: string;\r\n handleSubmit: (text: string, options?: SearchOptions) => void;\r\n defaultOptions: SearchOptions | null;\r\n}\r\n\r\nconst SearchInput: React.FC<SearchInputProps> = ({ \r\n moduleT, defaultValue, running, handleSubmit, location, defaultOptions \r\n}) => {\r\n const [ options, setOptions ] = useState<SearchOptions | null>(defaultOptions);\r\n\r\n const mobile = useMobileLayout();\r\n return (\r\n <div className=\"search-container\">\r\n <div className=\"search-area\">\r\n <HistoryInput \r\n historyId={ HistoryStringEnum.SEARCH } \r\n submitHandler={ value => handleSubmit(value, options || undefined) } \r\n disabled={ running }\r\n defaultValue={ defaultValue }\r\n placeholder={ moduleT.translate('Enter search string...') }\r\n button={ \r\n <Button\r\n className=\"blue\"\r\n icon={ IconConstants.SEARCH }\r\n caption={ !mobile ? moduleT.translate('Search') : undefined }\r\n loading={ running }\r\n />\r\n }\r\n />\r\n <SearchOptionButton\r\n moduleT={ moduleT }\r\n location={ location }\r\n onChange={ setOptions }\r\n value={ options }\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport { SearchInput };\r\n","import { Component } from 'react';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport History from 'utils/History';\r\n\r\nimport OfflineHubMessageDecorator from 'decorators/OfflineHubMessageDecorator';\r\n\r\nimport '../style.css';\r\nimport ResultTable from 'routes/Search/components/ResultTable';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { WithTranslation } from 'react-i18next';\r\nimport { getModuleT } from 'utils/TranslationUtils';\r\nimport { SearchInput } from './SearchInput';\r\nimport { SearchOptions } from './options-panel';\r\nimport NotificationActions from 'actions/NotificationActions';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport LoginStore from 'stores/LoginStore';\r\nimport { search } from 'services/api/SearchApi';\r\n\r\n\r\nconst RESULT_WAIT_PERIOD = 4000;\r\n\r\ninterface SearchLocationState {\r\n searchString?: string;\r\n}\r\n\r\ninterface SearchProps extends RouteComponentProps<{}, any, SearchLocationState> {\r\n\r\n}\r\n\r\ninterface SearchDataProps extends DataProviderDecoratorChildProps, WithTranslation {\r\n instance: API.SearchInstance;\r\n}\r\n\r\nclass Search extends Component<SearchProps & SearchDataProps> {\r\n state = {\r\n searchString: '',\r\n running: false\r\n };\r\n\r\n searchTimeout: number | undefined;\r\n\r\n componentDidMount() {\r\n this.checkLocationState(this.props);\r\n\r\n const { query } = this.props.instance;\r\n if (!!query) {\r\n this.setState({\r\n searchString: query.pattern\r\n });\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: SearchProps) {\r\n this.checkLocationState(this.props);\r\n }\r\n\r\n checkLocationState = (props: SearchProps) => {\r\n const { state } = props.location;\r\n if (state && state.searchString && state.searchString !== this.state.searchString) {\r\n this.search(state.searchString);\r\n\r\n // Avoid searching for it again\r\n History.replace({\r\n pathname: props.location.pathname,\r\n });\r\n }\r\n }\r\n\r\n search = async (searchString: string, options?: SearchOptions) => {\r\n console.log('Searching');\r\n\r\n clearTimeout(this.searchTimeout);\r\n\r\n const { hub_urls, size_limits, ...queryOptions } = options || {};\r\n try {\r\n const res = await search(\r\n this.props.instance,\r\n {\r\n query: {\r\n pattern: searchString,\r\n ...size_limits,\r\n ...queryOptions,\r\n },\r\n priority: API.PriorityEnum.HIGH,\r\n hub_urls\r\n }\r\n );\r\n\r\n this.onSearchPosted(res);\r\n this.setState({\r\n searchString,\r\n running: true \r\n });\r\n } catch (error) {\r\n NotificationActions.apiError('Search failed', error);\r\n }\r\n }\r\n\r\n onSearchPosted = (data: API.SearchResponse) => {\r\n this.searchTimeout = window.setTimeout(\r\n () => {\r\n this.setState({ \r\n running: false,\r\n });\r\n }, \r\n data.queue_time + RESULT_WAIT_PERIOD\r\n );\r\n }\r\n\r\n parseOptions = (): SearchOptions | null => {\r\n const { query } = this.props.instance;\r\n if (!query) {\r\n return null;\r\n }\r\n\r\n return {\r\n excluded: query.excluded,\r\n size_limits: {\r\n min_size: query.min_size,\r\n max_size: query.max_size,\r\n },\r\n file_type: query.file_type === SearchConstants.DEFAULT_SEARCH_TYPE || query.file_type === 'tth' ? \r\n null : query.file_type,\r\n hub_urls: []\r\n };\r\n }\r\n\r\n searchT = getModuleT(this.props.t, UI.Modules.SEARCH);\r\n render() {\r\n const { instance, location } = this.props;\r\n const { searchString, running } = this.state;\r\n const { t } = this.searchT;\r\n return (\r\n <OfflineHubMessageDecorator \r\n offlineMessage={ t<string>(\r\n 'searchOffline', \r\n 'You must to be connected to at least one hub in order to perform searches'\r\n ) }\r\n >\r\n <div className=\"search-layout\">\r\n <SearchInput\r\n moduleT={ this.searchT }\r\n running={ running }\r\n defaultValue={ searchString }\r\n handleSubmit={ this.search }\r\n location={ location }\r\n defaultOptions={ this.parseOptions() }\r\n />\r\n <ResultTable \r\n searchString={ searchString } \r\n running={ running }\r\n searchT={ this.searchT }\r\n instance={ instance }\r\n />\r\n </div>\r\n </OfflineHubMessageDecorator>\r\n );\r\n }\r\n}\r\n\r\nconst OWNER_ID_SUFFIX = 'webui';\r\n\r\nexport default DataProviderDecorator<SearchProps, SearchDataProps>(Search, {\r\n urls: {\r\n instance: async (props, socket) => {\r\n // Try to use a previously created instance for this session\r\n const instances = await socket.get<API.SearchInstance[]>(`${SearchConstants.INSTANCES_URL}`);\r\n\r\n const instance = instances.find(i => i.owner === `session:${LoginStore.sessionId}:${OWNER_ID_SUFFIX}`);\r\n if (!!instance) {\r\n return instance;\r\n }\r\n\r\n // Create new instance\r\n const instanceId = (await socket.post<{ id: number; }>(SearchConstants.INSTANCES_URL, {\r\n owner_suffix: OWNER_ID_SUFFIX,\r\n expiration: 0\r\n })).id;\r\n\r\n return socket.get(`${SearchConstants.INSTANCES_URL}/${instanceId}`);\r\n }\r\n }\r\n});\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","DupeStrings","DupePaths","paths","className","map","path","FileItemInfoGrid","session","fileItem","user","downloadHandler","showPath","t","useTranslation","gridT","text","Grid","columns","stackable","title","name","type","str","size","time","tth","dupe","caption","button","itemInfoGetter","contextElement","hub","other","icon","connect_state","SearchActions","result","displayName","IconConstants","handler","data","location","History","pathname","browseContent","access","FilelistSessionActions","users","FilelistSessionStore","moduleId","actions","UserResult","userIcon","directory","ids","remoteMenuId","MenuConstants","hub_names","connection","slots","FormattedIp","item","ip","resultSort","a","b","nicks","localeCompare","DataProviderDecorator","results","defaultValue","defaultValue_plural","count","length","style","width","sort","cid","urls","parentResult","instanceId","socket","get","SearchConstants","searchDownloadHandler","itemInfo","downloadData","instance","SocketService","ResultDialog","Component","itemDataGetter","itemId","this","props","render","Modal","closable","FileIcon","typeInfo","fullHeight","DownloadDialog","Decorated","ModalRouteDecorator","match","params","resultId","_viewName","_apiUrl","mixins","ViewStoreMixin","getUserCaption","replace","UserCell","cellData","rowDataGetter","itemData","resultUserGetter","rowData","NameCell","userGetter","entityId","ResultTable","rowClassNameGetter","emptyRowsNodeGetter","running","searchString","searchT","Message","description","Trans","i18nKey","toI18nKey","VirtualTable","store","SearchViewStore","textFilterProps","autoFocus","Column","columnKey","flexGrow","cell","hideWidth","submitHandler","historyId","history","refetchData","LocalSuggestField","value","trim","HistoryConstants","loaderText","FormAccordion","locals","children","label","active","Accordion","defaultActiveIndexes","undefined","Icon","fontWeight","HubSelectField","hubs","onChange","onlineHubs","filter","selectedUrls","hub_url","beforeUnchecked","Checkbox","HubIcon","identity","checked","indexOf","newValue","maxWidth","HubsSelectField","renderSelect","renderLabel","SizeField","inputProps","moduleT","displayValue","setDisplayValue","useState","unitIndex","setUnitIndex","valueToBytes","ret","i","useEffect","curBytes","parsedValue","parsedUnitIndex","display","min","evt","target","parseInt","selectedIndex","unit","index","plainT","FileTypeField","renderInput","context","formT","SearchTypeIcon","searchType","files","directories","content_type","typeToMenuItem","selectedItem","MenuItemLink","onClick","SearchTypeDropdownDecorated","searchTypes","commonItems","translate","getCommonItems","find","Dropdown","selection","AccordionStruct","renderFieldset","childLocals","Fields","key","optional","item_type","definitions","SearchOptionsForm","PureComponent","constructor","super","onFieldChanged","hasChanges","formValue","Object","keys","reduce","reduced","save","form","onSave","changedFields","Promise","resolve","onFieldSetting","fieldOptions","assign","factory","template","disableOrder","AccordionStructField","Form","ref","c","fieldDefinitions","optionTitleFormatter","def","Button","disabled","marginTop","SearchOptionButtonDecorated","onValueChanged","Array","isArray","hub_urls","selectedUrlsNew","url","filterCount","curValue","Popup","triggerClassName","trigger","marginRight","color","contentUpdateTrigger","hide","HubConstants","onSocketConnected","addSocketListener","dataConverters","SearchInput","handleSubmit","defaultOptions","setOptions","mobile","placeholder","loading","Search","state","checkLocationState","search","console","log","clearTimeout","searchTimeout","size_limits","queryOptions","res","query","pattern","priority","onSearchPosted","setState","error","NotificationActions","window","setTimeout","queue_time","parseOptions","excluded","min_size","max_size","file_type","componentDidMount","componentDidUpdate","prevProps","OfflineHubMessageDecorator","offlineMessage","owner","LoginStore","post","owner_suffix","expiration"],"sourceRoot":""}
1
+ {"version":3,"file":"js/search.24ec8c5fe5f45b1180a9.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/file-item-info/style.css","webpack://airdcpp-webui/./src/routes/Search/style.css","webpack://airdcpp-webui/./src/components/file-item-info/style.css?a322","webpack://airdcpp-webui/./src/components/file-item-info/FileItemInfoGrid.tsx","webpack://airdcpp-webui/./src/components/icon/HubIcon.tsx","webpack://airdcpp-webui/./src/routes/Search/style.css?d43b","webpack://airdcpp-webui/./src/actions/ui/SearchActions.ts","webpack://airdcpp-webui/./src/routes/Search/components/result-dialog/UserResultTable.tsx","webpack://airdcpp-webui/./src/services/api/SearchApi.ts","webpack://airdcpp-webui/./src/routes/Search/components/result-dialog/ResultDialog.tsx","webpack://airdcpp-webui/./src/stores/SearchViewStore.js","webpack://airdcpp-webui/./src/routes/Search/components/ResultTable.tsx","webpack://airdcpp-webui/./src/components/autosuggest/HistoryInput.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/AccordionField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/HubSelectField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/SizeField.tsx","webpack://airdcpp-webui/./src/components/icon/SearchTypeIcon.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/FileTypeField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/AccordionStructField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/SearchOptionsForm.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/SearchOptionsButton.tsx","webpack://airdcpp-webui/./src/routes/Search/components/SearchInput.tsx","webpack://airdcpp-webui/./src/routes/Search/components/Search.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, \"\\r\\n.fileitem.info.segment .dupe-paths .path {\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .download.ui.dropdown {\\r\\n max-width: 150px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .title.column {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .value.column {\\r\\n word-break: break-all;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/file-item-info/style.css\"],\"names\":[],\"mappings\":\";AACA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB\",\"sourcesContent\":[\"\\r\\n.fileitem.info.segment .dupe-paths .path {\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .download.ui.dropdown {\\r\\n max-width: 150px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .title.column {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .value.column {\\r\\n word-break: break-all;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// 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, \".search-container {\\r\\n width:100%;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n#mobile-layout .search-container {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.search-container .search-area {\\r\\n width: 90%;\\r\\n max-width: 600px;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger {\\r\\n margin-left: 5px;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger .button {\\r\\n padding-left: 15px;\\r\\n padding-right: 5px;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, \\r\\n.search-area .react-autosuggest__container,\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, .search-area input {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.search-area button {\\r\\n display: inline-block !important;\\r\\n}\\r\\n\\r\\n.search-layout {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-layout .virtual-table {\\r\\n height: calc(100% - 50px);\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 767px) {\\r\\n .result.modal td {\\r\\n max-width: 250px;\\r\\n }\\r\\n}\\r\\n\\r\\n.search-options {\\r\\n min-width: 300px;\\r\\n}\\r\\n\\r\\n.search-options .field-hub_urls {\\r\\n max-height: 180px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Search/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,UAAU;EACV,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,UAAU;EACV,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;EAClB,aAAa;AACf;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,OAAO;AACT;;AAEA;;;EAGE,OAAO;AACT;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE;IACE,gBAAgB;EAClB;AACF;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,gBAAgB;AAClB\",\"sourcesContent\":[\".search-container {\\r\\n width:100%;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n#mobile-layout .search-container {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.search-container .search-area {\\r\\n width: 90%;\\r\\n max-width: 600px;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger {\\r\\n margin-left: 5px;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger .button {\\r\\n padding-left: 15px;\\r\\n padding-right: 5px;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, \\r\\n.search-area .react-autosuggest__container,\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, .search-area input {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.search-area button {\\r\\n display: inline-block !important;\\r\\n}\\r\\n\\r\\n.search-layout {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-layout .virtual-table {\\r\\n height: calc(100% - 50px);\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 767px) {\\r\\n .result.modal td {\\r\\n max-width: 250px;\\r\\n }\\r\\n}\\r\\n\\r\\n.search-options {\\r\\n min-width: 300px;\\r\\n}\\r\\n\\r\\n.search-options .field-hub_urls {\\r\\n max-height: 180px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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 { formatRelativeTime, formatSize } from 'utils/ValueFormat';\r\n\r\nimport { DownloadMenu } from 'components/menu';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\n\r\nimport './style.css';\r\nimport { Row, Grid } from 'components/semantic/Grid';\r\n\r\n\r\nconst DupeStrings = {\r\n //[API.DupeEnum.NONE]: 'None',\r\n [API.DupeEnum.SHARE_PARTIAL]: 'Share (partial)',\r\n [API.DupeEnum.SHARE_FULL]: 'Share (full)',\r\n [API.DupeEnum.QUEUE_PARTIAL]: 'Queue (partial)',\r\n [API.DupeEnum.QUEUE_FULL]: 'Queue (full)',\r\n [API.DupeEnum.FINISHED_PARTIAL]: 'Finished (partial)',\r\n [API.DupeEnum.FINISHED_FULL]: 'Finished (full)',\r\n [API.DupeEnum.SHARE_QUEUE]: 'Share and queue',\r\n};\r\n\r\nconst DupePaths: React.FC<{ paths: string[] }> = ({ paths }) => (\r\n <div className=\"dupe-paths\">\r\n { paths.map(path => (\r\n <div key={ path } className=\"path\">\r\n { path }\r\n </div>\r\n )) }\r\n </div>\r\n);\r\n\r\ninterface FileItemInfoGridProps {\r\n fileItem: UI.DownloadableItemInfo;\r\n user: API.HintedUser;\r\n downloadHandler: UI.DownloadHandler<UI.DownloadableItemInfo>;\r\n showPath?: boolean;\r\n session: UI.SessionItemBase;\r\n}\r\n\r\nconst FileItemInfoGrid: React.FC<FileItemInfoGridProps> = ({ \r\n session, fileItem, user, downloadHandler, showPath = true \r\n}) => {\r\n const { t } = useTranslation();\r\n const gridT = (text: string) => {\r\n return translate(text, t, UI.Modules.COMMON);\r\n };\r\n\r\n return (\r\n <div className=\"ui fileitem info segment\">\r\n <Grid \r\n columns=\"two\"\r\n stackable={ true }\r\n >\r\n <Row \r\n title={ gridT('Name') }\r\n text={ fileItem.name }\r\n />\r\n <Row \r\n title={ gridT('Type/content') } \r\n text={ fileItem.type.str }\r\n />\r\n <Row \r\n title={ gridT('Size') } \r\n text={ formatSize(fileItem.size, t, true) }\r\n />\r\n <Row \r\n title={ gridT('Last modified') }\r\n text={ formatRelativeTime(fileItem.time || 0) }\r\n />\r\n { fileItem.type.id === 'file' && (\r\n <Row \r\n title={ gridT('TTH') } \r\n text={ fileItem.tth }\r\n /> \r\n )}\r\n { !!fileItem.dupe && (\r\n <Row \r\n title={ gridT('Dupe type') }\r\n text={ gridT(DupeStrings[fileItem.dupe.id]) }\r\n /> \r\n )}\r\n { !!fileItem.dupe && (\r\n <Row \r\n title={ gridT('Dupe paths') }\r\n text={ <DupePaths paths={ fileItem.dupe.paths }/> }\r\n /> \r\n )}\r\n { showPath && (\r\n <Row \r\n title={ gridT('Path') }\r\n text={ fileItem.path }\r\n /> \r\n )}\r\n </Grid>\r\n\r\n <DownloadMenu \r\n caption={ gridT('Actions...') }\r\n button={ true }\r\n user={ user }\r\n itemInfoGetter={ () => fileItem }\r\n downloadHandler={ downloadHandler }\r\n contextElement=\".ui.modal > .content\"\r\n session={ session }\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport { FileItemInfoGrid };","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport Icon, { IconProps } from 'components/semantic/Icon';\r\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\ninterface HubIconProps extends IconProps {\r\n hub: API.Hub;\r\n}\r\n\r\nconst HubIcon: React.FC<HubIconProps> = ({ hub, ...other }) => (\r\n <Icon\r\n { ...other }\r\n icon={ hubOnlineStatusToColor(hub.connect_state.id) + ' sitemap' }\r\n />\r\n);\r\n\r\n/*HubIcon.propTypes = {\r\n // Hub object\r\n hub: PropTypes.object.isRequired,\r\n};*/\r\n\r\nexport default HubIcon;","\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 History from 'utils/History';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport FilelistSessionActions from 'actions/reflux/FilelistSessionActions';\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst handleBrowseContent: UI.ActionHandler<API.GroupedSearchResult> = ({ data, location }) => {\r\n return FilelistSessionActions.createSession(location, data.users.user, FilelistSessionStore, data.path);\r\n};\r\n\r\nconst handleResult: UI.ActionHandler<API.GroupedSearchResult> = ({ data, location }) => {\r\n History.push(`${location.pathname}/result/${data.id}`);\r\n};\r\n\r\n\r\nconst SearchActions: UI.ActionListType<API.GroupedSearchResult> = {\r\n result: { \r\n displayName: 'Result details',\r\n icon: IconConstants.OPEN,\r\n handler: handleResult,\r\n },\r\n browseContent: { \r\n displayName: 'Browse content', \r\n access: API.AccessEnum.FILELISTS_EDIT,\r\n icon: IconConstants.FILELIST,\r\n handler: handleBrowseContent,\r\n },\r\n};\r\n\r\n\r\nexport default {\r\n moduleId: UI.Modules.SEARCH,\r\n actions: SearchActions,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport FormattedIp from 'components/format/FormattedIp';\r\nimport { formatConnection } from 'utils/ValueFormat';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport { UserMenu } from 'components/menu';\r\nimport { UserFileActions } from 'actions/ui/UserActions';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate, toI18nKey } from 'utils/TranslationUtils';\r\nimport { TFunction } from 'i18next';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface UserResultProps {\r\n result: API.ChildSearchResult;\r\n t: TFunction;\r\n}\r\n\r\nconst UserResult: React.FC<UserResultProps> = ({ result, t }) => (\r\n <tr>\r\n <td className=\"user dropdown\">\r\n <UserMenu \r\n userIcon={ true }\r\n user={ result.user }\r\n directory={ result.path }\r\n ids={ UserFileActions }\r\n contextElement=\".ui.modal > .content\"\r\n remoteMenuId={ MenuConstants.HINTED_USER }\r\n />\r\n </td>\r\n <td className=\"hubs\">\r\n { result.user.hub_names }\r\n </td>\r\n <td className=\"connection\">\r\n { formatConnection(result.connection, t) }\r\n </td>\r\n <td className=\"slots\">\r\n { result.slots.str }\r\n </td>\r\n <td className=\"ip\">\r\n <FormattedIp item={ result.ip }/>\r\n </td>\r\n <td className=\"path\" title={ result.path }>\r\n { result.path }\r\n </td>\r\n </tr>\r\n);\r\n\r\nconst resultSort = (a: API.ChildSearchResult, b: API.ChildSearchResult) => a.user.nicks.localeCompare(b.user.nicks);\r\n\r\ninterface UserResultTableProps {\r\n parentResult: API.GroupedSearchResult;\r\n instanceId: number;\r\n}\r\n\r\ninterface UserResultTableDataProps extends DataProviderDecoratorChildProps {\r\n results: API.ChildSearchResult[];\r\n}\r\n\r\nconst UserResultTable: React.FC<UserResultTableProps & UserResultTableDataProps> = (\r\n { results }\r\n) => {\r\n const { t } = useTranslation();\r\n return (\r\n <div className=\"users\">\r\n <h2>\r\n { t(toI18nKey('usersCount', UI.Modules.SEARCH), { \r\n defaultValue: 'User ({{count}})',\r\n defaultValue_plural: 'Users ({{count}})',\r\n count: results.length\r\n }) }\r\n </h2>\r\n <table className=\"ui striped table\">\r\n <thead>\r\n <tr>\r\n <th>{ translate('User', t, UI.Modules.SEARCH) }</th>\r\n <th>{ translate('Hubs', t, UI.Modules.SEARCH) }</th>\r\n <th style={{ width: '70px' }}>{ translate('Connection', t, UI.Modules.SEARCH) }</th>\r\n <th style={{ width: '50px' }}>{ translate('Slots', t, UI.Modules.SEARCH) }</th>\r\n <th>{ translate('IP', t, UI.Modules.SEARCH) }</th>\r\n <th>{ translate('Path', t, UI.Modules.SEARCH) }</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n { results.sort(resultSort).map(result => (\r\n <UserResult \r\n key={ result.user.cid }\r\n result={ result }\r\n t={ t }\r\n />\r\n )) }\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DataProviderDecorator<UserResultTableProps, UserResultTableDataProps>(UserResultTable, {\r\n urls: {\r\n results: ({ parentResult, instanceId }, socket) => socket.get(`${SearchConstants.INSTANCES_URL}/${instanceId}/results/${parentResult.id}/children`),\r\n }\r\n});","import SearchConstants from 'constants/SearchConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nexport const searchDownloadHandler: UI.DownloadHandler<API.GroupedSearchResult> = (\r\n itemInfo, \r\n user, \r\n downloadData,\r\n instance\r\n) => {\r\n return SocketService.post(\r\n `${SearchConstants.MODULE_URL}/${instance!.id}/results/${itemInfo.id}/download`, \r\n downloadData\r\n );\r\n};\r\n\r\ninterface SearchData {\r\n query: Pick<API.SearchQuery, 'pattern'> & Partial<Omit<API.SearchQuery, 'pattern'>>;\r\n hub_urls: string[] | undefined | null;\r\n priority: API.PriorityEnum;\r\n}\r\n\r\nexport const search = (\r\n instance: API.SearchInstance, \r\n data: SearchData\r\n) => {\r\n return SocketService.post<API.SearchResponse>(\r\n `${SearchConstants.INSTANCES_URL}/${instance.id}/hub_search`, \r\n data\r\n );\r\n};\r\n","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\r\n\r\nimport UserResultTable from './UserResultTable';\r\n\r\nimport ModalRouteDecorator, { ModalRouteDecoratorChildProps } from 'decorators/ModalRouteDecorator';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { FileItemInfoGrid } from 'components/file-item-info';\r\nimport { searchDownloadHandler } from 'services/api/SearchApi';\r\n\r\n\r\ninterface ResultDialogProps {\r\n searchT: UI.ModuleTranslator;\r\n instance: API.SearchInstance;\r\n}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n parentResult: API.GroupedSearchResult;\r\n}\r\n\r\ninterface RouteProps {\r\n resultId: string;\r\n}\r\n\r\ntype Props = ResultDialogProps & ModalRouteDecoratorChildProps<RouteProps>;\r\n\r\n\r\nclass ResultDialog extends Component<Props & DataProps> {\r\n static displayName = 'ResultDialog';\r\n\r\n itemDataGetter: UI.DownloadItemDataGetter<API.GroupedSearchResult> = (itemId, socket) => {\r\n const { instance } = this.props;\r\n return socket.get(`${SearchConstants.INSTANCES_URL}/${instance.id}/results/${itemId}`);\r\n }\r\n\r\n render() {\r\n const { parentResult, instance } = this.props;\r\n return (\r\n <Modal \r\n className=\"result\" \r\n title={ parentResult.name }\r\n closable={ true } \r\n icon={ <FileIcon typeInfo={ parentResult.type }/> } \r\n fullHeight={ true }\r\n { ...this.props }\r\n >\r\n <DownloadDialog \r\n downloadHandler={ searchDownloadHandler }\r\n itemDataGetter={ this.itemDataGetter }\r\n session={ instance }\r\n />\r\n <FileItemInfoGrid \r\n fileItem={ parentResult }\r\n downloadHandler={ searchDownloadHandler }\r\n user={ parentResult.users.user }\r\n showPath={ false }\r\n session={ instance }\r\n />\r\n <UserResultTable \r\n parentResult={ parentResult }\r\n instanceId={ instance.id }\r\n />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nconst Decorated = ModalRouteDecorator<ResultDialogProps, RouteProps>(\r\n DataProviderDecorator<Props, DataProps>(\r\n ResultDialog, {\r\n urls: {\r\n parentResult: ({ match, instance }, socket) => socket.get(`${SearchConstants.INSTANCES_URL}/${instance.id}/results/${match.params.resultId}`),\r\n }\r\n }\r\n ), \r\n 'result/:resultId'\r\n);\r\n\r\nexport { Decorated as ResultDialog };\r\n","import Reflux from 'reflux';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\r\n\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'search_view',\r\n _apiUrl: SearchConstants.INSTANCES_URL,\r\n mixins: [ ViewStoreMixin('relevance', false) ],\r\n});\r\n","import * as React from 'react';\r\n\r\nimport SearchActions from 'actions/ui/SearchActions';\r\n\r\nimport { ResultDialog } from './result-dialog';\r\n\r\nimport SearchViewStore from 'stores/SearchViewStore';\r\n\r\nimport { Column } from 'fixed-data-table-2';\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport { SizeCell, DurationCell, ConnectionCell, FileDownloadCell, DecimalCell } from 'components/table/Cell';\r\nimport { TableActionMenu } from 'components/menu';\r\n\r\nimport { dupeToStringType } from 'utils/TypeConvert';\r\nimport { TableUserMenu } from 'components/menu';\r\nimport { UserFileActions } from 'actions/ui/UserActions';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\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 { TFunction } from 'i18next';\r\nimport { Trans } from 'react-i18next';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\nimport { searchDownloadHandler } from 'services/api/SearchApi';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuConstants from 'constants/MenuConstants';\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\n\r\nconst getUserCaption = ({ count, user }: API.SearchResultUserInfo, t: TFunction) => {\r\n if (count > 1) {\r\n return t(toI18nKey('xUsersNicks', UI.Modules.SEARCH), {\r\n defaultValue: `{{count}} user ({{user.nicks}})`,\r\n defaultValue_plural: `{{count}} users ({{user.nicks}})`,\r\n count,\r\n replace: {\r\n count,\r\n user\r\n }\r\n });\r\n }\r\n\r\n return user.nicks;\r\n};\r\n\r\nconst UserCell: React.FC<RowWrapperCellChildProps<API.SearchResultUserInfo, API.GroupedSearchResult>> = (\r\n { cellData, rowDataGetter, t }\r\n) => (\r\n <TableUserMenu \r\n text={ getUserCaption(cellData!, t!) } \r\n user={ cellData!.user }\r\n directory={ rowDataGetter!().path }\r\n userIcon=\"simple\"\r\n ids={ UserFileActions }\r\n remoteMenuId={ MenuConstants.HINTED_USER }\r\n >\r\n <TableActionMenu \r\n actions={ SearchActions }\r\n itemData={ rowDataGetter }\r\n ids={ [ 'result' ] }\r\n />\r\n </TableUserMenu>\r\n);\r\n\r\nconst resultUserGetter = (rowData: API.GroupedSearchResult) => {\r\n if (!rowData || !rowData.users) {\r\n return rowData.users.user;\r\n }\r\n\r\n return rowData.users.user;\r\n};\r\n\r\ninterface NameCellProps extends RowWrapperCellChildProps<string, API.GroupedSearchResult> {\r\n instance: API.SearchInstance;\r\n}\r\n\r\nconst NameCell: React.FC<NameCellProps> = (\r\n { rowDataGetter, instance, ...props }\r\n) => (\r\n <FileDownloadCell \r\n userGetter={ resultUserGetter }\r\n rowDataGetter={ rowDataGetter }\r\n downloadHandler={ searchDownloadHandler }\r\n session={ instance }\r\n { ...props }\r\n >\r\n <TableActionMenu \r\n actions={ SearchActions }\r\n itemData={ rowDataGetter }\r\n remoteMenuId={ MenuConstants.GROUPED_SEARCH_RESULT }\r\n entityId={ instance.id }\r\n />\r\n </FileDownloadCell>\r\n);\r\n\r\nexport interface ResultTableProps {\r\n running: boolean;\r\n searchString: string;\r\n searchT: UI.ModuleTranslator;\r\n instance: API.SearchInstance;\r\n}\r\n\r\nclass ResultTable extends React.Component<ResultTableProps> {\r\n static displayName = 'ResultTable';\r\n\r\n rowClassNameGetter = (rowData: API.GroupedSearchResult) => {\r\n return dupeToStringType(rowData.dupe);\r\n }\r\n\r\n emptyRowsNodeGetter = () => {\r\n const { running, searchString, searchT } = this.props;\r\n if (running) {\r\n return null;\r\n }\r\n\r\n if (!searchString) {\r\n return process.env.DEMO_MODE === '1' && (\r\n <Message \r\n title=\"Demo content available\"\r\n icon={ IconConstants.TIP }\r\n description={ 'Use the search string \"demo\" to receive results from the demo share' }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <Message \r\n title={ searchT.t('noResults', {\r\n defaultValue: `No results found for \"{{searchString}}\"`,\r\n replace: {\r\n searchString\r\n }\r\n }) }\r\n description={ (\r\n <Trans i18nKey={ searchT.toI18nKey('noResultsHint') }>\r\n <div className=\"ui bulleted list\">\r\n <div className=\"item\">Ensure that you spelled the words correctly</div>\r\n <div className=\"item\">Use different keywords</div>\r\n <div className=\"item\">You are searching too frequently (hubs often have a minimum search interval)</div>\r\n <div className=\"item\">\r\n If you never receive results for common search terms, \r\n make sure that your connectivity settings are configured properly\r\n </div>\r\n </div>\r\n </Trans>\r\n ) }\r\n />\r\n );\r\n }\r\n \r\n itemDataGetter: UI.DownloadItemDataGetter<API.GroupedSearchResult> = (itemId, socket) => {\r\n const { instance } = this.props;\r\n return socket.get(`${SearchConstants.INSTANCES_URL}/${instance.id}/results/${itemId}`);\r\n }\r\n\r\n render() {\r\n const { searchT, instance } = this.props;\r\n return (\r\n <>\r\n <VirtualTable\r\n emptyRowsNodeGetter={ this.emptyRowsNodeGetter }\r\n rowClassNameGetter={ this.rowClassNameGetter }\r\n store={ SearchViewStore }\r\n textFilterProps={{\r\n autoFocus: false,\r\n }}\r\n entityId={ instance.id }\r\n moduleId={ SearchActions.moduleId }\r\n >\r\n <Column\r\n name=\"Name\"\r\n width={200}\r\n columnKey=\"name\"\r\n flexGrow={8}\r\n cell={ <NameCell instance={ instance }/> }\r\n />\r\n <Column\r\n name=\"Size\"\r\n width={60}\r\n columnKey=\"size\"\r\n cell={ <SizeCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Type\"\r\n width={80}\r\n columnKey=\"type\"\r\n flexGrow={1}\r\n hideWidth={600}\r\n />\r\n <Column\r\n name=\"Relevance\"\r\n width={60}\r\n columnKey=\"relevance\"\r\n cell={ <DecimalCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Connection\"\r\n width={60}\r\n columnKey=\"connection\"\r\n cell={ <ConnectionCell/> }\r\n flexGrow={2}\r\n hideWidth={600}\r\n />\r\n <Column\r\n name=\"Users\"\r\n width={120}\r\n columnKey=\"users\"\r\n flexGrow={3}\r\n cell={ <UserCell/> }\r\n hideWidth={600}\r\n />\r\n <Column\r\n name=\"Last modified\"\r\n width={80}\r\n columnKey=\"time\"\r\n cell={ <DurationCell/> }\r\n flexGrow={1}\r\n hideWidth={800}\r\n />\r\n <Column\r\n name=\"Slots\"\r\n width={60}\r\n columnKey=\"slots\"\r\n flexGrow={1}\r\n hideWidth={800}\r\n />\r\n </VirtualTable>\r\n <DownloadDialog \r\n downloadHandler={ searchDownloadHandler }\r\n itemDataGetter={ this.itemDataGetter }\r\n session={ instance }\r\n />\r\n <ResultDialog \r\n searchT={ searchT }\r\n instance={ instance }\r\n />\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default ResultTable;","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\n\r\nimport HistoryConstants from 'constants/HistoryConstants';\r\n\r\nimport LocalSuggestField, { LocalSuggestFieldProps } from './LocalSuggestField';\r\nimport { addHistory } from 'services/api/HistoryApi';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n\r\nexport interface HistoryInputProps extends Omit<LocalSuggestFieldProps, 'data' | 'submitHandler'> {\r\n historyId: string;\r\n submitHandler: (text: string) => void;\r\n}\r\n\r\ninterface HistoryInputDataProps extends DataProviderDecoratorChildProps {\r\n history: string[];\r\n}\r\n\r\n\r\nconst HistoryInput: React.FC<HistoryInputProps & HistoryInputDataProps> = (\r\n { submitHandler, historyId, history, refetchData, ...other }\r\n) => {\r\n const { t } = useTranslation();\r\n const handleSubmit = async (value: string) => {\r\n const text = value.trim();\r\n await runBackgroundSocketAction(\r\n () => addHistory(historyId, text),\r\n t\r\n );\r\n\r\n refetchData();\r\n submitHandler(text);\r\n };\r\n\r\n return (\r\n <LocalSuggestField \r\n { ...other }\r\n data={ history }\r\n submitHandler={ handleSubmit }\r\n />\r\n );\r\n};\r\n\r\nexport default DataProviderDecorator<HistoryInputProps, HistoryInputDataProps>(HistoryInput, {\r\n urls: {\r\n history: ({ historyId }, socket) => socket.get(HistoryConstants.STRINGS_URL + '/' + historyId),\r\n },\r\n loaderText: null,\r\n});\r\n","import * as React from 'react';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport Accordion, { AccordionContent, AccordionTitle } from 'components/semantic/Accordion';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Icon from 'components/semantic/Icon';\r\nimport { isValueSet } from 'utils/FormUtils';\r\n\r\n\r\ninterface FormAccordionProps {\r\n locals: UI.FormLocals;\r\n}\r\n\r\nexport const FormAccordion: React.FC<FormAccordionProps> = ({ locals, children }) => {\r\n const { label } = locals;\r\n const active = isValueSet(locals.value);\r\n return (\r\n <Accordion \r\n className=\"field\" \r\n defaultActiveIndexes={ active ? [ 0 ] : undefined }\r\n >\r\n <AccordionTitle>\r\n <Icon icon={ IconConstants.DROPDOWN }/>\r\n <span style={ active ? { fontWeight: 'bold' } : undefined }>\r\n { label }\r\n </span>\r\n </AccordionTitle>\r\n <AccordionContent>\r\n { children }\r\n </AccordionContent>\r\n </Accordion>\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport Checkbox from 'components/semantic/Checkbox';\r\nimport { updateMultiselectValues } from 'utils/FormUtils';\r\nimport HubIcon from 'components/icon/HubIcon';\r\nimport { FormAccordion } from './AccordionField';\r\n\r\n\r\ninterface HubSelectFieldProps {\r\n value: string[] | null;\r\n onChange: (hubUrls: string[] | null) => void; \r\n}\r\n\r\ninterface DataProps {\r\n hubs: API.Hub[];\r\n}\r\n\r\n\r\ntype Props = HubSelectFieldProps & DataProps;\r\n\r\nconst HubSelectField: React.FC<Props> = ({ hubs, value, onChange }) => {\r\n const onlineHubs = hubs.filter(hub => hub.connect_state.id === API.HubConnectStateEnum.CONNECTED);\r\n const selectedUrls = !!value && !!value.length ? value : onlineHubs.map(hub => hub.hub_url);\r\n\r\n const beforeUnchecked = () => {\r\n if (selectedUrls.length === 1) {\r\n return false;\r\n }\r\n\r\n return;\r\n };\r\n\r\n return (\r\n <>\r\n { onlineHubs.map(hub => (\r\n <div key={ hub.id } className=\"field\">\r\n <Checkbox\r\n caption={ (\r\n <>\r\n <HubIcon hub={ hub }/>\r\n { hub.identity.name }\r\n </>\r\n ) }\r\n beforeUnchecked={ beforeUnchecked }\r\n checked={ selectedUrls.indexOf(hub.hub_url) !== -1 }\r\n onChange={ checked => {\r\n const newValue = updateMultiselectValues(selectedUrls, hub.hub_url, checked);\r\n onChange(newValue.length === onlineHubs.length ? null : newValue);\r\n } }\r\n style={{\r\n maxWidth: '300px',\r\n }}\r\n />\r\n </div>\r\n )) }\r\n </>\r\n );\r\n};\r\n\r\n\r\ntype TCombTemplate = { \r\n renderSelect: (locals: UI.FormLocals<API.Hub, string[]>) => React.ReactNode; \r\n renderLabel: (locals: UI.FormLocals<API.Hub, string[]>) => React.ReactNode;\r\n};\r\n\r\nconst HubsSelectField: TCombTemplate = {\r\n renderSelect(locals) {\r\n return (\r\n <FormAccordion locals={ locals }>\r\n <HubSelectField \r\n onChange={ locals.onChange }\r\n value={ locals.value }\r\n hubs={ locals.options }\r\n />\r\n </FormAccordion>\r\n );\r\n },\r\n renderLabel(locals) {\r\n return null;\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.select.clone(HubsSelectField);\r\n","import { useState, useEffect } from 'react';\r\nimport * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { ByteUnits, formatUnit, parseUnit } from 'utils/ValueFormat';\r\n\r\n\r\ninterface SizeFieldProps {\r\n moduleT: UI.ModuleTranslator;\r\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\r\n onChange: (size: number | null) => void;\r\n value: number;\r\n}\r\n\r\ntype Props = SizeFieldProps;\r\n\r\n\r\nconst DEFAULT_UNIT_INDEX = 2;\r\n\r\nconst SizeField: React.FC<Props> = ({ inputProps, moduleT, onChange, value }) => {\r\n const [ displayValue, setDisplayValue ] = useState<number | undefined>(undefined);\r\n const [ unitIndex, setUnitIndex ] = useState<number>(DEFAULT_UNIT_INDEX);\r\n\r\n const valueToBytes = () => {\r\n let ret = displayValue || 0;\r\n if (!!unitIndex) {\r\n for (let i = 1; i <= unitIndex; i++) {\r\n ret *= 1024;\r\n }\r\n }\r\n \r\n return ret;\r\n };\r\n\r\n useEffect(\r\n () => {\r\n const newValue = valueToBytes();\r\n if (newValue !== value) {\r\n onChange(newValue);\r\n }\r\n },\r\n [ unitIndex, displayValue ]\r\n );\r\n\r\n useEffect(\r\n () => {\r\n const curBytes = valueToBytes();\r\n if (value !== curBytes) {\r\n const { value: parsedValue, unitIndex: parsedUnitIndex } = parseUnit(value, ByteUnits, 1024);\r\n setDisplayValue(parsedValue);\r\n setUnitIndex(!!value ? parsedUnitIndex : DEFAULT_UNIT_INDEX);\r\n }\r\n },\r\n [ value ]\r\n );\r\n \r\n return (\r\n <div style={{ display: 'flex' }}>\r\n <input\r\n className=\"ui input\"\r\n type=\"number\"\r\n { ...inputProps }\r\n min={ 0 }\r\n value={ displayValue || '' }\r\n onChange={ evt => {\r\n let newValue = !!evt.target.value ? parseInt(evt.target.value) : null;\r\n if (!!newValue) {\r\n setDisplayValue(newValue);\r\n } else {\r\n setDisplayValue(undefined);\r\n }\r\n } }\r\n />\r\n <select \r\n className=\"ui select\" \r\n style={{ maxWidth: '100px' }}\r\n value={ ByteUnits[unitIndex] }\r\n onChange={ evt => {\r\n setUnitIndex(evt.target.selectedIndex);\r\n } }\r\n >\r\n { ByteUnits.map((unit, index) => (\r\n <option \r\n key={ unit }\r\n value={ unit }\r\n >\r\n { formatUnit(unit, moduleT.plainT) }\r\n </option>\r\n )) }\r\n </select>\r\n </div>\r\n );\r\n};\r\n\r\n\r\ntype TCombTemplate = { \r\n renderInput: (locals: UI.FormLocals<any, number>) => React.ReactNode; \r\n};\r\n\r\nconst FileTypeField: TCombTemplate = {\r\n renderInput(locals) {\r\n return (\r\n <SizeField \r\n onChange={ locals.onChange }\r\n value={ !!locals.value ? parseInt(locals.value as any) : 0 }\r\n moduleT={ locals.context.formT }\r\n />\r\n );\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.textbox.clone(FileTypeField);\r\n\r\n// export { SizeField };\r\n","import * as React from 'react';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\nimport Icon from 'components/semantic/Icon';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\n\r\nconst searchTypeToFileItem = (searchType: UI.SearchTypeItem): API.FileItemType => {\r\n if (searchType.id === 'directory') {\r\n return {\r\n id: 'directory',\r\n str: '',\r\n files: 0,\r\n directories: 0,\r\n };\r\n }\r\n\r\n return {\r\n id: 'file',\r\n str: '',\r\n content_type: searchType.id as API.FileContentType,\r\n };\r\n};\r\n\r\n\r\ninterface SearchTypeIconProps {\r\n type: UI.SearchTypeItem;\r\n size?: string;\r\n}\r\n\r\nexport const SearchTypeIcon: React.FC<SearchTypeIconProps> = ({ type, size = 'large' }) => {\r\n if (!type.id) {\r\n return (\r\n <Icon \r\n icon={ IconConstants.ANY } \r\n size={ size }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <FileIcon \r\n typeInfo={ searchTypeToFileItem(type) } \r\n size={ size }\r\n />\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport SearchConstants from 'constants/SearchConstants';\r\nimport Dropdown from 'components/semantic/Dropdown';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\nimport { SearchTypeIcon } from 'components/icon/SearchTypeIcon';\r\n\r\n\r\ntype OnChangeHandler = (value: string | null) => void;\r\n\r\ninterface SearchTypeDropdownProps {\r\n onChange: OnChangeHandler;\r\n value: string | null;\r\n moduleT: UI.ModuleTranslator;\r\n}\r\n\r\ninterface DataProps {\r\n searchTypes: API.SearchType[];\r\n}\r\n\r\nconst getCommonItems = (moduleT: UI.ModuleTranslator): UI.SearchTypeItem[] => ([\r\n {\r\n id: null,\r\n str: moduleT.translate('Any'),\r\n }, {\r\n id: 'directory',\r\n str: moduleT.translate('Directory'),\r\n }, {\r\n id: 'file',\r\n str: moduleT.translate('File'),\r\n }\r\n]);\r\n\r\nconst typeToMenuItem = (type: UI.SearchTypeItem, onChange: OnChangeHandler, selectedItem: UI.SearchTypeItem) => (\r\n <MenuItemLink \r\n key={ type.id || SearchConstants.DEFAULT_SEARCH_TYPE }\r\n onClick={ () => onChange(type.id) }\r\n icon={ <SearchTypeIcon type={ type }/> }\r\n active={ selectedItem.id === type.id }\r\n >\r\n { type.str }\r\n </MenuItemLink>\r\n);\r\n\r\ntype Props = SearchTypeDropdownProps & DataProviderDecoratorChildProps & DataProps;\r\n\r\nconst SearchTypeDropdown: React.FC<Props> = ({ searchTypes, value, onChange, moduleT }) => {\r\n const commonItems = getCommonItems(moduleT);\r\n const selectedItem = searchTypes.find(i => value === i.id) || commonItems.find(i => value === i.id) || commonItems[0];\r\n return (\r\n <Dropdown\r\n selection={ true }\r\n caption={ (\r\n <>\r\n <SearchTypeIcon type={ selectedItem } size=\"\"/>\r\n { selectedItem.str }\r\n </>\r\n ) }\r\n >\r\n { commonItems.map(type => typeToMenuItem(type, onChange, selectedItem)) }\r\n <div key=\"divider\" className=\"ui divider\"/>\r\n { searchTypes.map(type => typeToMenuItem(type, onChange, selectedItem)) }\r\n </Dropdown>\r\n );\r\n};\r\n\r\nconst SearchTypeDropdownDecorated = DataProviderDecorator<SearchTypeDropdownProps, DataProps>(\r\n SearchTypeDropdown,\r\n {\r\n urls: {\r\n searchTypes: SearchConstants.SEARCH_TYPES_URL\r\n }\r\n }\r\n);\r\n\r\n\r\ntype TCombTemplate = { \r\n renderSelect: (locals: UI.FormLocals<any, string>) => React.ReactNode; \r\n};\r\n\r\nconst FileTypeField: TCombTemplate = {\r\n renderSelect(locals) {\r\n return (\r\n <SearchTypeDropdownDecorated \r\n onChange={ locals.onChange }\r\n value={ locals.value || null }\r\n moduleT={ locals.context.formT }\r\n />\r\n );\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.select.clone(FileTypeField);\r\n","import * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FormAccordion } from './AccordionField';\r\n\r\n\r\ntype TCombTemplate = { \r\n renderFieldset: (children: React.ReactNode, locals: UI.FormLocals) => React.ReactNode; \r\n renderLabel: (locals: UI.FormLocals) => React.ReactNode;\r\n};\r\n\r\nconst AccordionStruct: TCombTemplate = {\r\n renderFieldset(children, locals) {\r\n const { label, ...childLocals } = locals;\r\n return (\r\n <FormAccordion locals={ locals }>\r\n { t.form.Form.templates.struct.renderFieldset(children, childLocals) }\r\n </FormAccordion>\r\n );\r\n },\r\n renderLabel(locals) {\r\n return null;\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.struct.clone(AccordionStruct);\r\n","import { PureComponent } from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport HubSelectField from './HubSelectField';\r\nimport SizeField from './SizeField';\r\nimport FileTypeField from './FileTypeField';\r\n\r\nimport Form, { FormFieldChangeHandler, FormSaveHandler, FormFieldSettingHandler } from 'components/form/Form';\r\nimport { isValueSet, translateForm } from 'utils/FormUtils';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport Button from 'components/semantic/Button';\r\nimport AccordionStructField from './AccordionStructField';\r\n\r\n\r\n\r\n\r\ninterface Entry extends Pick<API.SearchQuery, 'file_type'>, UI.FormValueMap {\r\n hub_urls: string[] | null;\r\n // file_type: string | null;\r\n size_limits: null | {\r\n min_size: number | null;\r\n max_size: number | null;\r\n };\r\n // min_size: number | null;\r\n // max_size: number | null;\r\n // excluded: string[] | null;\r\n}\r\n\r\nexport interface SearchOptionsFormProps extends Pick<RouteComponentProps, 'location'> {\r\n moduleT: UI.ModuleTranslator;\r\n onChange: (value: Entry | null) => void;\r\n value: Entry | null;\r\n hubs: API.Hub[];\r\n}\r\n\r\n\r\nconst Fields: UI.FormFieldDefinition[] = [\r\n {\r\n key: 'file_type',\r\n title: 'File type',\r\n type: API.SettingTypeEnum.STRING,\r\n optional: true,\r\n }, {\r\n key: 'hub_urls',\r\n title: 'Hubs',\r\n type: API.SettingTypeEnum.LIST,\r\n item_type: API.SettingTypeEnum.STRING,\r\n }, {\r\n key: 'size_limits',\r\n title: 'Size limits',\r\n type: API.SettingTypeEnum.STRUCT,\r\n optional: true,\r\n definitions: [\r\n {\r\n key: 'min_size',\r\n title: 'Minimum size',\r\n type: API.SettingTypeEnum.NUMBER,\r\n optional: true,\r\n }, {\r\n key: 'max_size',\r\n title: 'Maximum size',\r\n type: API.SettingTypeEnum.NUMBER,\r\n optional: true,\r\n }\r\n ]\r\n }, /*, {\r\n key: 'excluded',\r\n title: 'Excluded words',\r\n type: API.SettingTypeEnum.LIST,\r\n item_type: API.SettingTypeEnum.STRING,\r\n optional: true,\r\n }*/\r\n];\r\n\r\nconst removeEmptyProperties = (formValue: Entry) => {\r\n const ret = Object\r\n .keys(formValue)\r\n .reduce(\r\n (reduced, key) => {\r\n const value = formValue[key];\r\n if (isValueSet(value)) {\r\n reduced[key] = value;\r\n }\r\n\r\n return reduced;\r\n },\r\n {} as Entry\r\n );\r\n\r\n return ret;\r\n};\r\n\r\nclass SearchOptionsForm extends PureComponent<SearchOptionsFormProps> {\r\n static displayName = 'SearchOptionForm';\r\n\r\n constructor(props: SearchOptionsFormProps) {\r\n super(props);\r\n\r\n this.definitions = translateForm(Fields, props.moduleT);\r\n }\r\n\r\n definitions: UI.FormFieldDefinition[];\r\n form: Form<Entry>;\r\n\r\n onFieldChanged: FormFieldChangeHandler<Entry> = (id, value, hasChanges) => {\r\n const ret = removeEmptyProperties(value as Entry);\r\n this.props.onChange(!!Object.keys(ret).length ? ret : null);\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 return Promise.resolve();\r\n }\r\n\r\n onFieldSetting: FormFieldSettingHandler<Entry> = (id, fieldOptions, formValue) => {\r\n if (id === 'hub_urls') {\r\n Object.assign(fieldOptions, {\r\n factory: t.form.Select,\r\n template: HubSelectField,\r\n options: this.props.hubs,\r\n });\r\n } else if (id === 'min_size' || id === 'max_size') {\r\n Object.assign(fieldOptions, {\r\n // factory: t.form.List,\r\n template: SizeField,\r\n });\r\n } else if (id === 'excluded') {\r\n Object.assign(fieldOptions, {\r\n disableOrder: true,\r\n });\r\n } else if (id === 'file_type') {\r\n Object.assign(fieldOptions, {\r\n template: FileTypeField,\r\n });\r\n } else if (id === 'size_limits') {\r\n Object.assign(fieldOptions, {\r\n template: AccordionStructField,\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const { value, onChange, location, moduleT } = this.props;\r\n return (\r\n <div>\r\n <Form<Entry>\r\n ref={ c => this.form = c! }\r\n onFieldChanged={ this.onFieldChanged }\r\n onFieldSetting={ this.onFieldSetting }\r\n onSave={ this.onSave }\r\n fieldDefinitions={ this.definitions }\r\n value={ value }\r\n location={ location }\r\n optionTitleFormatter={ def => def.title }\r\n className=\"search-options\"\r\n />\r\n <Button\r\n caption={ moduleT.translate('Reset all') }\r\n onClick={ () => onChange(null) }\r\n disabled={ !value }\r\n style={{\r\n marginTop: '10px'\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport { SearchOptionsForm, Entry as SearchOptions };\r\n","import { useEffect } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport Button from 'components/semantic/Button';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport Popup from 'components/semantic/Popup';\r\nimport { SearchOptionsForm, SearchOptionsFormProps, SearchOptions } from './SearchOptionsForm';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Icon from 'components/semantic/Icon';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport HubConstants from 'constants/HubConstants';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport { isValueSet } from 'utils/FormUtils';\r\n\r\n\r\ninterface SearchOptionsButtonProps extends \r\n Pick<RouteComponentProps, 'location'>, \r\n Pick<SearchOptionsFormProps, 'onChange' | 'value'> {\r\n\r\n moduleT: UI.ModuleTranslator;\r\n}\r\n\r\n\r\ninterface DataProps {\r\n hubs: API.Hub[];\r\n}\r\n\r\ntype Props = SearchOptionsButtonProps & DataProviderDecoratorChildProps & DataProps;\r\n\r\n\r\nconst removeEmptyProperties = (value: SearchOptions) => {\r\n const ret = Object\r\n .keys(value)\r\n .reduce(\r\n (reduced, key) => {\r\n if (Array.isArray(value[key]) ? !!(value[key] as Array<any>).length : !!value[key]) {\r\n reduced[key] = value[key] as any;\r\n }\r\n\r\n return reduced;\r\n },\r\n {} as SearchOptions\r\n );\r\n\r\n return ret;\r\n};\r\n\r\n\r\nconst SearchOptionsButton: React.FC<Props> = ({ \r\n moduleT, location, onChange, value, hubs\r\n}) => {\r\n const onValueChanged = (newValue: SearchOptions | null) => {\r\n if (newValue) {\r\n const ret = removeEmptyProperties(newValue);\r\n onChange(!!Object.keys(ret).length ? ret : null);\r\n } else {\r\n onChange(null);\r\n }\r\n };\r\n\r\n useEffect(\r\n () => {\r\n // Remove obsolete hubs from the options\r\n if (!!value && !!value.hub_urls && !!value.hub_urls.length) {\r\n const selectedUrls = value.hub_urls;\r\n const selectedUrlsNew = selectedUrls.filter(url => hubs.find(hub => hub.hub_url === url));\r\n if (selectedUrlsNew.length !== selectedUrls.length) {\r\n onValueChanged({\r\n ...value,\r\n hub_urls: !!selectedUrlsNew.length ? selectedUrlsNew : null\r\n });\r\n }\r\n }\r\n },\r\n [ hubs ]\r\n );\r\n\r\n const filterCount = !value ? null : Object.keys(value)\r\n .filter(key => {\r\n const curValue = value[key];\r\n return isValueSet(curValue);\r\n })\r\n .length;\r\n\r\n return (\r\n <Popup\r\n triggerClassName=\"options\" \r\n className=\"options\" \r\n trigger={(\r\n <Button \r\n caption={ (\r\n <>\r\n <Icon icon={ IconConstants.OPTIONS }/>\r\n { !!filterCount && (\r\n <span \r\n style={{ \r\n fontWeight: 'bold',\r\n marginRight: '3px',\r\n color: 'black'\r\n }}\r\n >\r\n { `(${filterCount})` }\r\n </span>\r\n ) }\r\n <Icon icon={ IconConstants.EXPAND }/>\r\n </>\r\n ) }\r\n /> \r\n )}\r\n contentUpdateTrigger={ value }\r\n >\r\n { hide => (\r\n <SearchOptionsForm\r\n moduleT={ moduleT }\r\n location={ location }\r\n onChange={ onValueChanged }\r\n value={ value }\r\n hubs={ hubs }\r\n />\r\n ) }\r\n </Popup>\r\n );\r\n};\r\n\r\n\r\nconst SearchOptionButtonDecorated = DataProviderDecorator<SearchOptionsButtonProps, DataProps>(\r\n SearchOptionsButton,\r\n {\r\n urls: {\r\n hubs: HubConstants.SESSIONS_URL\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData }) => {\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.SESSION_CREATED, () => refetchData());\r\n addSocketListener<Partial<API.Hub>>(\r\n HubConstants.MODULE_URL, \r\n HubConstants.SESSION_UPDATED, \r\n hub => {\r\n if (!!hub.connect_state) { \r\n refetchData();\r\n }\r\n }\r\n );\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.SESSION_REMOVED, () => refetchData());\r\n },\r\n dataConverters: {\r\n hubs: (hubs: API.Hub[]) => hubs.filter(hub => hub.connect_state.id === API.HubConnectStateEnum.CONNECTED)\r\n }\r\n }\r\n);\r\n\r\nexport { SearchOptionButtonDecorated as SearchOptionButton };\r\n","import { useState } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport HistoryInput from 'components/autosuggest/HistoryInput';\r\nimport { HistoryStringEnum } from 'constants/HistoryConstants';\r\nimport Button from 'components/semantic/Button';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\nimport { SearchOptionButton, SearchOptions } from './options-panel';\r\n\r\n\r\ninterface SearchInputProps extends Pick<RouteComponentProps, 'location'> {\r\n running: boolean;\r\n moduleT: UI.ModuleTranslator;\r\n defaultValue?: string;\r\n handleSubmit: (text: string, options?: SearchOptions) => void;\r\n defaultOptions: SearchOptions | null;\r\n}\r\n\r\nconst SearchInput: React.FC<SearchInputProps> = ({ \r\n moduleT, defaultValue, running, handleSubmit, location, defaultOptions \r\n}) => {\r\n const [ options, setOptions ] = useState<SearchOptions | null>(defaultOptions);\r\n\r\n const mobile = useMobileLayout();\r\n return (\r\n <div className=\"search-container\">\r\n <div className=\"search-area\">\r\n <HistoryInput \r\n historyId={ HistoryStringEnum.SEARCH } \r\n submitHandler={ value => handleSubmit(value, options || undefined) } \r\n disabled={ running }\r\n defaultValue={ defaultValue }\r\n placeholder={ moduleT.translate('Enter search string...') }\r\n button={ \r\n <Button\r\n className=\"blue\"\r\n icon={ IconConstants.SEARCH }\r\n caption={ !mobile ? moduleT.translate('Search') : undefined }\r\n loading={ running }\r\n />\r\n }\r\n />\r\n <SearchOptionButton\r\n moduleT={ moduleT }\r\n location={ location }\r\n onChange={ setOptions }\r\n value={ options }\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport { SearchInput };\r\n","import { Component } from 'react';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport History from 'utils/History';\r\n\r\nimport OfflineHubMessageDecorator from 'decorators/OfflineHubMessageDecorator';\r\n\r\nimport '../style.css';\r\nimport ResultTable from 'routes/Search/components/ResultTable';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { WithTranslation } from 'react-i18next';\r\nimport { getModuleT } from 'utils/TranslationUtils';\r\nimport { SearchInput } from './SearchInput';\r\nimport { SearchOptions } from './options-panel';\r\nimport NotificationActions from 'actions/NotificationActions';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport LoginStore from 'stores/LoginStore';\r\nimport { search } from 'services/api/SearchApi';\r\n\r\n\r\nconst RESULT_WAIT_PERIOD = 4000;\r\n\r\ninterface SearchLocationState {\r\n searchString?: string;\r\n}\r\n\r\ninterface SearchProps extends RouteComponentProps<{}, any, SearchLocationState> {\r\n\r\n}\r\n\r\ninterface SearchDataProps extends DataProviderDecoratorChildProps, WithTranslation {\r\n instance: API.SearchInstance;\r\n}\r\n\r\nclass Search extends Component<SearchProps & SearchDataProps> {\r\n state = {\r\n searchString: '',\r\n running: false\r\n };\r\n\r\n searchTimeout: number | undefined;\r\n\r\n componentDidMount() {\r\n this.checkLocationState(this.props);\r\n\r\n const { query } = this.props.instance;\r\n if (!!query) {\r\n this.setState({\r\n searchString: query.pattern\r\n });\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: SearchProps) {\r\n this.checkLocationState(this.props);\r\n }\r\n\r\n checkLocationState = (props: SearchProps) => {\r\n const { state } = props.location;\r\n if (state && state.searchString && state.searchString !== this.state.searchString) {\r\n this.search(state.searchString);\r\n\r\n // Avoid searching for it again\r\n History.replace({\r\n pathname: props.location.pathname,\r\n });\r\n }\r\n }\r\n\r\n search = async (searchString: string, options?: SearchOptions) => {\r\n console.log('Searching');\r\n\r\n clearTimeout(this.searchTimeout);\r\n\r\n const { hub_urls, size_limits, ...queryOptions } = options || {};\r\n try {\r\n const res = await search(\r\n this.props.instance,\r\n {\r\n query: {\r\n pattern: searchString,\r\n ...size_limits,\r\n ...queryOptions,\r\n },\r\n priority: API.PriorityEnum.HIGH,\r\n hub_urls\r\n }\r\n );\r\n\r\n this.onSearchPosted(res);\r\n this.setState({\r\n searchString,\r\n running: true \r\n });\r\n } catch (error) {\r\n NotificationActions.apiError('Search failed', error);\r\n }\r\n }\r\n\r\n onSearchPosted = (data: API.SearchResponse) => {\r\n this.searchTimeout = window.setTimeout(\r\n () => {\r\n this.setState({ \r\n running: false,\r\n });\r\n }, \r\n data.queue_time + RESULT_WAIT_PERIOD\r\n );\r\n }\r\n\r\n parseOptions = (): SearchOptions | null => {\r\n const { query } = this.props.instance;\r\n if (!query) {\r\n return null;\r\n }\r\n\r\n return {\r\n excluded: query.excluded,\r\n size_limits: {\r\n min_size: query.min_size,\r\n max_size: query.max_size,\r\n },\r\n file_type: query.file_type === SearchConstants.DEFAULT_SEARCH_TYPE || query.file_type === 'tth' ? \r\n null : query.file_type,\r\n hub_urls: []\r\n };\r\n }\r\n\r\n searchT = getModuleT(this.props.t, UI.Modules.SEARCH);\r\n render() {\r\n const { instance, location } = this.props;\r\n const { searchString, running } = this.state;\r\n const { t } = this.searchT;\r\n return (\r\n <OfflineHubMessageDecorator \r\n offlineMessage={ t<string>(\r\n 'searchOffline', \r\n 'You must to be connected to at least one hub in order to perform searches'\r\n ) }\r\n >\r\n <div className=\"search-layout\">\r\n <SearchInput\r\n moduleT={ this.searchT }\r\n running={ running }\r\n defaultValue={ searchString }\r\n handleSubmit={ this.search }\r\n location={ location }\r\n defaultOptions={ this.parseOptions() }\r\n />\r\n <ResultTable \r\n searchString={ searchString } \r\n running={ running }\r\n searchT={ this.searchT }\r\n instance={ instance }\r\n />\r\n </div>\r\n </OfflineHubMessageDecorator>\r\n );\r\n }\r\n}\r\n\r\nconst OWNER_ID_SUFFIX = 'webui';\r\n\r\nexport default DataProviderDecorator<SearchProps, SearchDataProps>(Search, {\r\n urls: {\r\n instance: async (props, socket) => {\r\n // Try to use a previously created instance for this session\r\n const instances = await socket.get<API.SearchInstance[]>(`${SearchConstants.INSTANCES_URL}`);\r\n\r\n const instance = instances.find(i => i.owner === `session:${LoginStore.sessionId}:${OWNER_ID_SUFFIX}`);\r\n if (!!instance) {\r\n return instance;\r\n }\r\n\r\n // Create new instance\r\n const instanceId = (await socket.post<{ id: number; }>(SearchConstants.INSTANCES_URL, {\r\n owner_suffix: OWNER_ID_SUFFIX,\r\n expiration: 0\r\n })).id;\r\n\r\n return socket.get(`${SearchConstants.INSTANCES_URL}/${instanceId}`);\r\n }\r\n }\r\n});\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","DupeStrings","DupePaths","paths","className","map","path","FileItemInfoGrid","session","fileItem","user","downloadHandler","showPath","t","useTranslation","gridT","text","Grid","columns","stackable","title","name","type","str","size","time","tth","dupe","caption","button","itemInfoGetter","contextElement","hub","other","icon","connect_state","SearchActions","result","displayName","IconConstants","handler","data","location","History","pathname","browseContent","access","FilelistSessionActions","users","FilelistSessionStore","moduleId","actions","UserResult","userIcon","directory","ids","remoteMenuId","MenuConstants","hub_names","connection","slots","FormattedIp","item","ip","resultSort","a","b","nicks","localeCompare","DataProviderDecorator","results","defaultValue","defaultValue_plural","count","length","style","width","sort","cid","urls","parentResult","instanceId","socket","get","SearchConstants","searchDownloadHandler","itemInfo","downloadData","instance","SocketService","ResultDialog","Component","itemDataGetter","itemId","this","props","render","Modal","closable","FileIcon","typeInfo","fullHeight","DownloadDialog","Decorated","ModalRouteDecorator","match","params","resultId","_viewName","_apiUrl","mixins","ViewStoreMixin","getUserCaption","replace","UserCell","cellData","rowDataGetter","itemData","resultUserGetter","rowData","NameCell","userGetter","entityId","ResultTable","rowClassNameGetter","emptyRowsNodeGetter","running","searchString","searchT","Message","description","Trans","i18nKey","toI18nKey","VirtualTable","store","SearchViewStore","textFilterProps","autoFocus","Column","columnKey","flexGrow","cell","hideWidth","submitHandler","historyId","history","refetchData","LocalSuggestField","value","trim","HistoryConstants","loaderText","FormAccordion","locals","children","label","active","Accordion","defaultActiveIndexes","undefined","Icon","fontWeight","HubSelectField","hubs","onChange","onlineHubs","filter","selectedUrls","hub_url","beforeUnchecked","Checkbox","HubIcon","identity","checked","indexOf","newValue","maxWidth","HubsSelectField","renderSelect","renderLabel","SizeField","inputProps","moduleT","displayValue","setDisplayValue","useState","unitIndex","setUnitIndex","valueToBytes","ret","i","useEffect","curBytes","parsedValue","parsedUnitIndex","display","min","evt","target","parseInt","selectedIndex","unit","index","plainT","FileTypeField","renderInput","context","formT","SearchTypeIcon","searchType","files","directories","content_type","typeToMenuItem","selectedItem","MenuItemLink","onClick","SearchTypeDropdownDecorated","searchTypes","commonItems","translate","getCommonItems","find","Dropdown","selection","AccordionStruct","renderFieldset","childLocals","Fields","key","optional","item_type","definitions","SearchOptionsForm","PureComponent","constructor","super","onFieldChanged","hasChanges","formValue","Object","keys","reduce","reduced","save","form","onSave","changedFields","Promise","resolve","onFieldSetting","fieldOptions","assign","factory","template","disableOrder","AccordionStructField","Form","ref","c","fieldDefinitions","optionTitleFormatter","def","Button","disabled","marginTop","SearchOptionButtonDecorated","onValueChanged","Array","isArray","hub_urls","selectedUrlsNew","url","filterCount","curValue","Popup","triggerClassName","trigger","marginRight","color","contentUpdateTrigger","hide","HubConstants","onSocketConnected","addSocketListener","dataConverters","SearchInput","handleSubmit","defaultOptions","setOptions","mobile","placeholder","loading","Search","state","checkLocationState","search","console","log","clearTimeout","searchTimeout","size_limits","queryOptions","res","query","pattern","priority","onSearchPosted","setState","error","NotificationActions","window","setTimeout","queue_time","parseOptions","excluded","min_size","max_size","file_type","componentDidMount","componentDidUpdate","prevProps","OfflineHubMessageDecorator","offlineMessage","owner","LoginStore","post","owner_suffix","expiration"],"sourceRoot":""}