airdcpp-webui 2.13.1-beta.8 → 2.13.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 (68) hide show
  1. package/dist/index.html +1 -1
  2. package/dist/js/{223.6dbbf66031781a4daa16.chunk.js → 223.3c648d224ecdf7df15cb.chunk.js} +2 -2
  3. package/dist/js/223.3c648d224ecdf7df15cb.chunk.js.gz +0 -0
  4. package/dist/js/223.3c648d224ecdf7df15cb.chunk.js.map +1 -0
  5. package/dist/js/{544.6fcb6173c1ecdce59463.chunk.js → 544.b7ce1b6435a30e618cb3.chunk.js} +2 -2
  6. package/dist/js/544.b7ce1b6435a30e618cb3.chunk.js.gz +0 -0
  7. package/dist/js/{544.6fcb6173c1ecdce59463.chunk.js.map → 544.b7ce1b6435a30e618cb3.chunk.js.map} +1 -1
  8. package/dist/js/{616.56d33a82efa78946c57a.chunk.js → 616.6b0a3d6d2a908a41169a.chunk.js} +2 -2
  9. package/dist/js/616.6b0a3d6d2a908a41169a.chunk.js.gz +0 -0
  10. package/dist/js/{616.56d33a82efa78946c57a.chunk.js.map → 616.6b0a3d6d2a908a41169a.chunk.js.map} +1 -1
  11. package/dist/js/{794.76369cca0052b9816dce.chunk.js → 794.290592904e2672ba2992.chunk.js} +2 -2
  12. package/dist/js/{794.76369cca0052b9816dce.chunk.js.gz → 794.290592904e2672ba2992.chunk.js.gz} +0 -0
  13. package/dist/js/{794.76369cca0052b9816dce.chunk.js.map → 794.290592904e2672ba2992.chunk.js.map} +1 -1
  14. package/dist/js/{865.c7542b0bcc37a6936a89.chunk.js → 865.054628990bc0885af414.chunk.js} +1 -1
  15. package/dist/js/865.054628990bc0885af414.chunk.js.gz +0 -0
  16. package/dist/js/{865.c7542b0bcc37a6936a89.chunk.js.map → 865.054628990bc0885af414.chunk.js.map} +1 -1
  17. package/dist/js/{favorite-hubs.6425452a7f964dff8ff7.chunk.js → favorite-hubs.d0c1452419e4f6e34765.chunk.js} +2 -2
  18. package/dist/js/favorite-hubs.d0c1452419e4f6e34765.chunk.js.gz +0 -0
  19. package/dist/js/{favorite-hubs.6425452a7f964dff8ff7.chunk.js.map → favorite-hubs.d0c1452419e4f6e34765.chunk.js.map} +1 -1
  20. package/dist/js/{filelists.2c58467089eca7c30a41.chunk.js → filelists.005c956eabdbb3869c6f.chunk.js} +2 -2
  21. package/dist/js/filelists.005c956eabdbb3869c6f.chunk.js.gz +0 -0
  22. package/dist/js/filelists.005c956eabdbb3869c6f.chunk.js.map +1 -0
  23. package/dist/js/{files.550bfdf4f123930edd9f.chunk.js → files.d39359992a53f54ac313.chunk.js} +2 -2
  24. package/dist/js/files.d39359992a53f54ac313.chunk.js.gz +0 -0
  25. package/dist/js/{files.550bfdf4f123930edd9f.chunk.js.map → files.d39359992a53f54ac313.chunk.js.map} +1 -1
  26. package/dist/js/{home.cb32552573c36d11c060.chunk.js → home.18b2d4cefea087208045.chunk.js} +3 -3
  27. package/dist/js/home.18b2d4cefea087208045.chunk.js.gz +0 -0
  28. package/dist/js/{home.cb32552573c36d11c060.chunk.js.map → home.18b2d4cefea087208045.chunk.js.map} +1 -1
  29. package/dist/js/hubs.29f2e7fde513aa2aa81a.chunk.js +2 -0
  30. package/dist/js/hubs.29f2e7fde513aa2aa81a.chunk.js.gz +0 -0
  31. package/dist/js/hubs.29f2e7fde513aa2aa81a.chunk.js.map +1 -0
  32. package/dist/js/{main.3b934baf70d337403d14.entry.js → main.e2f715744e80ce3a09aa.entry.js} +3 -3
  33. package/dist/js/main.e2f715744e80ce3a09aa.entry.js.gz +0 -0
  34. package/dist/js/{main.3b934baf70d337403d14.entry.js.map → main.e2f715744e80ce3a09aa.entry.js.map} +1 -1
  35. package/dist/js/{queue.4095b1ea967e164737e6.chunk.js → queue.493c6d72a2e6d66362a3.chunk.js} +2 -2
  36. package/dist/js/queue.493c6d72a2e6d66362a3.chunk.js.gz +0 -0
  37. package/dist/js/queue.493c6d72a2e6d66362a3.chunk.js.map +1 -0
  38. package/dist/js/{search.09603a9268a2e311c83a.chunk.js → search.0eeea3bce388b8c304fb.chunk.js} +2 -2
  39. package/dist/js/search.0eeea3bce388b8c304fb.chunk.js.gz +0 -0
  40. package/dist/js/{search.09603a9268a2e311c83a.chunk.js.map → search.0eeea3bce388b8c304fb.chunk.js.map} +1 -1
  41. package/dist/js/settings.ae1be9e0a1c99eed7597.chunk.js +2 -0
  42. package/dist/js/settings.ae1be9e0a1c99eed7597.chunk.js.gz +0 -0
  43. package/dist/js/settings.ae1be9e0a1c99eed7597.chunk.js.map +1 -0
  44. package/dist/sw.js +1 -1
  45. package/dist/sw.js.gz +0 -0
  46. package/package.json +2 -2
  47. package/dist/js/223.6dbbf66031781a4daa16.chunk.js.gz +0 -0
  48. package/dist/js/223.6dbbf66031781a4daa16.chunk.js.map +0 -1
  49. package/dist/js/544.6fcb6173c1ecdce59463.chunk.js.gz +0 -0
  50. package/dist/js/616.56d33a82efa78946c57a.chunk.js.gz +0 -0
  51. package/dist/js/865.c7542b0bcc37a6936a89.chunk.js.gz +0 -0
  52. package/dist/js/favorite-hubs.6425452a7f964dff8ff7.chunk.js.gz +0 -0
  53. package/dist/js/filelists.2c58467089eca7c30a41.chunk.js.gz +0 -0
  54. package/dist/js/filelists.2c58467089eca7c30a41.chunk.js.map +0 -1
  55. package/dist/js/files.550bfdf4f123930edd9f.chunk.js.gz +0 -0
  56. package/dist/js/home.cb32552573c36d11c060.chunk.js.gz +0 -0
  57. package/dist/js/hubs.b3c262deaeaad16141dc.chunk.js +0 -2
  58. package/dist/js/hubs.b3c262deaeaad16141dc.chunk.js.gz +0 -0
  59. package/dist/js/hubs.b3c262deaeaad16141dc.chunk.js.map +0 -1
  60. package/dist/js/main.3b934baf70d337403d14.entry.js.gz +0 -0
  61. package/dist/js/queue.4095b1ea967e164737e6.chunk.js.gz +0 -0
  62. package/dist/js/queue.4095b1ea967e164737e6.chunk.js.map +0 -1
  63. package/dist/js/search.09603a9268a2e311c83a.chunk.js.gz +0 -0
  64. package/dist/js/settings.c1841f5755803ffad470.chunk.js +0 -2
  65. package/dist/js/settings.c1841f5755803ffad470.chunk.js.gz +0 -0
  66. package/dist/js/settings.c1841f5755803ffad470.chunk.js.map +0 -1
  67. /package/dist/js/{home.cb32552573c36d11c060.chunk.js.LICENSE.txt → home.18b2d4cefea087208045.chunk.js.LICENSE.txt} +0 -0
  68. /package/dist/js/{main.3b934baf70d337403d14.entry.js.LICENSE.txt → main.e2f715744e80ce3a09aa.entry.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"js/search.09603a9268a2e311c83a.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/actions/ui/search/SearchTypeActions.ts","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/services/api/SearchApi.ts","webpack://airdcpp-webui/./src/routes/Search/components/result-dialog/UserResultTable.tsx","webpack://airdcpp-webui/./src/routes/Search/components/result-dialog/ResultDialog.tsx","webpack://airdcpp-webui/./src/stores/views/SearchViewStore.js","webpack://airdcpp-webui/./src/actions/ui/search/SearchActions.ts","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/style.css?d43b","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, `.fileitem.info.segment .dupe-paths .path {\n overflow-x: hidden;\n}\n\n.fileitem.info.segment .download.ui.dropdown {\n max-width: 150px;\n margin-top: 10px;\n}\n\n.fileitem.info.segment .title.column {\n margin-top: auto;\n margin-bottom: auto;\n}\n\n.fileitem.info.segment .value.column {\n word-break: break-all;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/file-item-info/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB\",\"sourcesContent\":[\".fileitem.info.segment .dupe-paths .path {\\n overflow-x: hidden;\\n}\\n\\n.fileitem.info.segment .download.ui.dropdown {\\n max-width: 150px;\\n margin-top: 10px;\\n}\\n\\n.fileitem.info.segment .title.column {\\n margin-top: auto;\\n margin-bottom: auto;\\n}\\n\\n.fileitem.info.segment .value.column {\\n word-break: break-all;\\n}\\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 {\n width: 100%;\n height: 50px;\n}\n\n#mobile-layout .search-container {\n margin-top: 10px;\n}\n\n.search-container .search-area {\n width: 90%;\n max-width: 600px;\n margin-left: auto;\n margin-right: auto;\n display: flex;\n}\n\n.search-container .search-area .options.trigger {\n margin-left: 5px;\n}\n\n.search-container .search-area .options.trigger .button {\n padding-left: 15px;\n padding-right: 5px;\n height: 100%;\n}\n\n.search-container .search-area .ui.input.action {\n flex: 1;\n}\n\n.search-area,\n.search-area .react-autosuggest__container,\n.search-container .search-area .ui.input.action {\n flex: 1;\n}\n\n.search-area,\n.search-area input {\n width: 100%;\n}\n\n.search-area button {\n display: inline-block !important;\n}\n\n.search-layout {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.search-layout .virtual-table {\n height: calc(100% - 50px);\n}\n\n@media only screen and (min-width: 767px) {\n .result.modal td {\n max-width: 250px;\n }\n}\n\n.search-options {\n min-width: 300px;\n}\n\n.search-options .field-hub_urls {\n max-height: 180px;\n overflow-y: auto;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Search/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,WAAW;EACX,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;;EAEE,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 {\\n width: 100%;\\n height: 50px;\\n}\\n\\n#mobile-layout .search-container {\\n margin-top: 10px;\\n}\\n\\n.search-container .search-area {\\n width: 90%;\\n max-width: 600px;\\n margin-left: auto;\\n margin-right: auto;\\n display: flex;\\n}\\n\\n.search-container .search-area .options.trigger {\\n margin-left: 5px;\\n}\\n\\n.search-container .search-area .options.trigger .button {\\n padding-left: 15px;\\n padding-right: 5px;\\n height: 100%;\\n}\\n\\n.search-container .search-area .ui.input.action {\\n flex: 1;\\n}\\n\\n.search-area,\\n.search-area .react-autosuggest__container,\\n.search-container .search-area .ui.input.action {\\n flex: 1;\\n}\\n\\n.search-area,\\n.search-area input {\\n width: 100%;\\n}\\n\\n.search-area button {\\n display: inline-block !important;\\n}\\n\\n.search-layout {\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n}\\n\\n.search-layout .virtual-table {\\n height: calc(100% - 50px);\\n}\\n\\n@media only screen and (min-width: 767px) {\\n .result.modal td {\\n max-width: 250px;\\n }\\n}\\n\\n.search-options {\\n min-width: 300px;\\n}\\n\\n.search-options .field-hub_urls {\\n max-height: 180px;\\n overflow-y: auto;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\ntype Filter = UI.ActionFilter<API.SearchType>;\r\nconst notDefaultType: Filter = ({ itemData: type }) => !type.default_type;\r\n\r\nconst handleCreate: UI.ActionHandler<API.SearchType> = ({ navigate }) => {\r\n navigate(`types`);\r\n};\r\n\r\nconst handleEdit: UI.ActionHandler<API.SearchType> = ({ itemData: type, navigate }) => {\r\n navigate(`types/${type.id}`);\r\n};\r\n\r\nconst handleRemove: UI.ActionHandler<API.SearchType> = ({ itemData: type, socket }) => {\r\n return socket.delete(`${SearchConstants.SEARCH_TYPES_URL}/${type.id}`);\r\n};\r\n\r\nexport const SearchTypeCreateAction = {\r\n id: 'create',\r\n displayName: 'Add type',\r\n icon: IconConstants.CREATE,\r\n handler: handleCreate,\r\n};\r\n\r\nexport const SearchTypeEditAction = {\r\n id: 'edit',\r\n displayName: 'Edit type',\r\n icon: IconConstants.EDIT,\r\n handler: handleEdit,\r\n};\r\n\r\nexport const SearchTypeRemoveAction = {\r\n id: 'remove',\r\n displayName: 'Remove type',\r\n icon: IconConstants.REMOVE,\r\n confirmation: {\r\n content: 'Are you sure that you want to remove the search type {{item.name}}?',\r\n approveCaption: 'Remove type',\r\n rejectCaption: `Don't remove`,\r\n },\r\n filter: notDefaultType,\r\n handler: handleRemove,\r\n};\r\n\r\nconst SearchTypeEditActions: UI.ActionListType<API.SearchType> = {\r\n edit: SearchTypeEditAction,\r\n remove: SearchTypeRemoveAction,\r\n};\r\n\r\nexport const SearchTypeActionModule = {\r\n moduleId: UI.Modules.SETTINGS,\r\n};\r\n\r\nexport const SearchTypeEditActionMenu = {\r\n moduleData: SearchTypeActionModule,\r\n actions: SearchTypeEditActions,\r\n};\r\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\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';\n\nimport { useFormatter } from 'context/FormatterContext';\n\nimport { DownloadMenu } from 'components/action-menu';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { useTranslation } from 'react-i18next';\nimport { translate } from 'utils/TranslationUtils';\n\nimport './style.css';\nimport { Row, Grid } from 'components/semantic/Grid';\n\nconst DupeStrings = {\n //[API.DupeEnum.NONE]: 'None',\n [API.DupeEnum.SHARE_PARTIAL]: 'Share (partial)',\n [API.DupeEnum.SHARE_FULL]: 'Share (full)',\n [API.DupeEnum.QUEUE_PARTIAL]: 'Queue (partial)',\n [API.DupeEnum.QUEUE_FULL]: 'Queue (full)',\n [API.DupeEnum.FINISHED_PARTIAL]: 'Finished (partial)',\n [API.DupeEnum.FINISHED_FULL]: 'Finished (full)',\n [API.DupeEnum.SHARE_QUEUE]: 'Share and queue',\n [API.DupeEnum.SHARE_FINISHED]: 'Share and finished',\n [API.DupeEnum.QUEUE_FINISHED]: 'Queue and finished',\n [API.DupeEnum.SHARE_QUEUE_FINISHED]: 'Share, queue and finished',\n};\n\nconst DupePaths: React.FC<{ paths: string[] }> = ({ paths }) => (\n <div className=\"dupe-paths\">\n {paths.map((path) => (\n <div key={path} className=\"path\">\n {path}\n </div>\n ))}\n </div>\n);\n\ninterface FileItemInfoGridProps {\n fileItem: UI.DownloadableItemInfo;\n user: API.HintedUser;\n downloadHandler: UI.DownloadHandler<UI.DownloadableItemInfo>;\n showPath?: boolean;\n session: UI.SessionItemBase;\n}\n\nconst FileItemInfoGrid: React.FC<FileItemInfoGridProps> = ({\n session,\n fileItem,\n user,\n downloadHandler,\n showPath = true,\n}) => {\n const { t } = useTranslation();\n const gridT = (text: string) => {\n return translate(text, t, UI.Modules.COMMON);\n };\n\n const { formatSize, formatRelativeTime } = useFormatter();\n return (\n <div className=\"ui fileitem info segment\">\n <Grid columns=\"two\" stackable={true}>\n <Row title={gridT('Name')} text={fileItem.name} />\n <Row title={gridT('Type/content')} text={fileItem.type.str} />\n <Row title={gridT('Size')} text={formatSize(fileItem.size, 2, true)} />\n <Row\n title={gridT('Last modified')}\n text={formatRelativeTime(fileItem.time || 0)}\n />\n {fileItem.type.id === 'file' && <Row title={gridT('TTH')} text={fileItem.tth} />}\n {!!fileItem.dupe && (\n <Row title={gridT('Dupe type')} text={gridT(DupeStrings[fileItem.dupe.id])} />\n )}\n {!!fileItem.dupe && (\n <Row\n title={gridT('Dupe paths')}\n text={<DupePaths paths={fileItem.dupe.paths} />}\n />\n )}\n {showPath && <Row title={gridT('Path')} text={fileItem.path} />}\n </Grid>\n\n <DownloadMenu\n caption={gridT('Actions...')}\n button={true}\n user={user}\n itemInfoGetter={() => fileItem}\n downloadHandler={downloadHandler}\n contextElement=\".ui.modal > .content\"\n entity={session}\n />\n </div>\n );\n};\n\nexport { FileItemInfoGrid };\n","import * as React from 'react';\n\nimport Icon, { IconProps } from 'components/semantic/Icon';\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\n\nimport * as API from 'types/api';\n\ninterface HubIconProps extends IconProps {\n hub: API.Hub;\n}\n\nconst HubIcon: React.FC<HubIconProps> = ({ hub, ...other }) => (\n <Icon {...other} icon={hubOnlineStatusToColor(hub.connect_state.id) + ' sitemap'} />\n);\n\nexport default HubIcon;\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\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 = (instance: API.SearchInstance, data: SearchData) => {\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 * as React from 'react';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\nimport FormattedIp from 'components/format/FormattedIp';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport { UserMenu } from 'components/action-menu';\r\nimport { UserFileActions } from 'actions/ui/user/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 MenuConstants from 'constants/MenuConstants';\r\nimport { useFormatter } from 'context/FormatterContext';\r\n\r\ninterface UserResultProps {\r\n result: API.ChildSearchResult;\r\n}\r\n\r\nconst UserResult: React.FC<UserResultProps> = ({ result }) => {\r\n const { formatConnection } = useFormatter();\r\n return (\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\">{result.user.hub_names}</td>\r\n <td className=\"connection\">{formatConnection(result.connection)}</td>\r\n <td className=\"slots\">{result.slots.str}</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\n\r\nconst resultSort = (a: API.ChildSearchResult, b: API.ChildSearchResult) =>\r\n 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' }}>\r\n {translate('Connection', t, UI.Modules.SEARCH)}\r\n </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\r\n .slice()\r\n .sort(resultSort)\r\n .map((result) => (\r\n <UserResult key={result.user.cid} result={result} />\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DataProviderDecorator<UserResultTableProps, UserResultTableDataProps>(\r\n UserResultTable,\r\n {\r\n urls: {\r\n results: ({ parentResult, instanceId }, socket) =>\r\n socket.get(\r\n `${SearchConstants.INSTANCES_URL}/${instanceId}/results/${parentResult.id}/children`,\r\n ),\r\n },\r\n },\r\n);\r\n","import { Component } from 'react';\r\nimport RouteModal from 'components/semantic/RouteModal';\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, {\r\n ModalRouteDecoratorChildProps,\r\n} from 'decorators/ModalRouteDecorator';\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} 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\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\ntype Props = ResultDialogProps & ModalRouteDecoratorChildProps;\r\n\r\nclass ResultDialog extends Component<Props & DataProps> {\r\n static readonly displayName = 'ResultDialog';\r\n\r\n itemDataGetter: UI.DownloadItemDataGetter<API.GroupedSearchResult> = (\r\n itemId,\r\n socket,\r\n ) => {\r\n const { instance } = this.props;\r\n return socket.get(\r\n `${SearchConstants.INSTANCES_URL}/${instance.id}/results/${itemId}`,\r\n );\r\n };\r\n\r\n render() {\r\n const { parentResult, instance } = this.props;\r\n return (\r\n <RouteModal\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 >\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 parentResult={parentResult} instanceId={instance.id} />\r\n </RouteModal>\r\n );\r\n }\r\n}\r\n\r\nconst Decorated = ModalRouteDecorator<ResultDialogProps>(\r\n DataProviderDecorator<Props, DataProps>(ResultDialog, {\r\n urls: {\r\n parentResult: ({ params, instance }, socket) =>\r\n socket.get(\r\n `${SearchConstants.INSTANCES_URL}/${instance.id}/results/${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';\n\nimport SearchConstants from 'constants/SearchConstants';\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\n\nexport default Reflux.createStore({\n _viewName: 'search_view',\n _apiUrl: SearchConstants.INSTANCES_URL,\n mixins: [ViewStoreMixin('relevance', false)],\n});\n","import IconConstants from 'constants/IconConstants';\r\n\r\nimport FilelistSessionActions from 'actions/reflux/FilelistSessionActions';\r\nimport FilelistSessionStore from 'stores/reflux/FilelistSessionStore';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\ntype Handler = UI.ActionHandler<API.GroupedSearchResult>;\r\nconst handleBrowseContent: Handler = ({\r\n itemData: groupedResult,\r\n location,\r\n navigate,\r\n}) => {\r\n const createData = {\r\n user: groupedResult.users.user,\r\n path: groupedResult.path,\r\n };\r\n\r\n return FilelistSessionActions.createSession(createData, {\r\n location,\r\n sessionStore: FilelistSessionStore,\r\n navigate,\r\n });\r\n};\r\n\r\nconst handleResult: Handler = ({ itemData: groupedResult, navigate }) => {\r\n navigate(`result/${groupedResult.id}`);\r\n};\r\n\r\nexport const SearchResultDetailsAction = {\r\n id: 'result',\r\n displayName: 'Result details',\r\n icon: IconConstants.DETAILS,\r\n handler: handleResult,\r\n};\r\n\r\nexport const SearchBrowseContentAction = {\r\n id: 'browseContent',\r\n displayName: 'Browse content',\r\n icon: IconConstants.FILELIST,\r\n handler: handleBrowseContent,\r\n};\r\n\r\nconst GroupedSearchResultActions: UI.ActionListType<API.GroupedSearchResult> = {\r\n result: SearchResultDetailsAction,\r\n browseContent: SearchBrowseContentAction,\r\n};\r\n\r\nexport const SearchActionModule = {\r\n moduleId: UI.Modules.SEARCH,\r\n};\r\n\r\nexport const GroupedSearchResultActionMenu = {\r\n moduleData: SearchActionModule,\r\n actions: GroupedSearchResultActions,\r\n};\r\n\r\nconst SearchActions: UI.ActionListType<API.SearchInstance> = {};\r\n\r\nexport const SearchActionMenu = {\r\n moduleData: SearchActionModule,\r\n actions: SearchActions,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { ResultDialog } from './result-dialog';\r\n\r\nimport SearchViewStore from 'stores/views/SearchViewStore';\r\n\r\nimport { Column } from 'fixed-data-table-2';\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport {\r\n SizeCell,\r\n DurationCell,\r\n ConnectionCell,\r\n FileDownloadCell,\r\n DecimalCell,\r\n} from 'components/table/Cell';\r\nimport { ActionMenu, TableActionMenu, TableUserMenu } from 'components/action-menu';\r\n\r\nimport { dupeToStringType } from 'utils/TypeConvert';\r\nimport { UserFileActions } from 'actions/ui/user/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 { 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\nimport { GroupedSearchResultActionMenu, SearchActionMenu } from 'actions/ui/search';\r\n\r\nconst getUserCaption = ({ count, user }: API.SearchResultUserInfo, t: UI.TranslateF) => {\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<\r\n RowWrapperCellChildProps<API.SearchResultUserInfo, API.GroupedSearchResult>\r\n> = ({ cellData, rowDataGetter, t }) => (\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={GroupedSearchResultActionMenu}\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?.users) {\r\n return rowData?.users?.user;\r\n }\r\n\r\n return rowData.users.user;\r\n};\r\n\r\ninterface NameCellProps\r\n extends RowWrapperCellChildProps<string, API.GroupedSearchResult> {\r\n instance: API.SearchInstance;\r\n}\r\n\r\nconst NameCell: React.FC<NameCellProps> = ({ rowDataGetter, instance, ...props }) => (\r\n <FileDownloadCell\r\n userGetter={resultUserGetter}\r\n rowDataGetter={rowDataGetter}\r\n downloadHandler={searchDownloadHandler}\r\n entity={instance}\r\n {...props}\r\n >\r\n <TableActionMenu\r\n actions={SearchActionMenu}\r\n itemData={rowDataGetter}\r\n remoteMenuId={MenuConstants.GROUPED_SEARCH_RESULT}\r\n entity={instance}\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 readonly 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 (\r\n isDemoInstance() && (\r\n <Message\r\n title=\"Demo content available\"\r\n icon={IconConstants.TIP}\r\n description={\r\n 'Use the search string \"demo\" to receive results from the demo share'\r\n }\r\n />\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\">\r\n You are searching too frequently (hubs often have a minimum search\r\n interval)\r\n </div>\r\n <div className=\"item\">\r\n If you never receive results for common search terms, make sure that your\r\n 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> = (\r\n itemId,\r\n socket,\r\n ) => {\r\n const { instance } = this.props;\r\n return socket.get(\r\n `${SearchConstants.INSTANCES_URL}/${instance.id}/results/${itemId}`,\r\n );\r\n };\r\n\r\n render() {\r\n const { searchT, instance } = this.props;\r\n const { translate } = searchT;\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={UI.Modules.SEARCH}\r\n footerData={\r\n <ActionMenu\r\n className=\"top left pointing\"\r\n caption={translate('Actions...')}\r\n actions={SearchActionMenu}\r\n header={translate('Search actions')}\r\n triggerIcon=\"chevron up\"\r\n button={true}\r\n itemData={instance}\r\n remoteMenuId=\"search_instance\"\r\n />\r\n }\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 name=\"Type\" width={80} columnKey=\"type\" flexGrow={1} hideWidth={600} />\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 searchT={searchT} instance={instance} />\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default ResultTable;\r\n","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} 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\nimport { useSocket } from 'context/SocketContext';\r\n\r\nexport interface HistoryInputProps\r\n 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\nconst HistoryInput: React.FC<HistoryInputProps & HistoryInputDataProps> = ({\r\n submitHandler,\r\n historyId,\r\n history,\r\n refetchData,\r\n ...other\r\n}) => {\r\n const socket = useSocket();\r\n const { t } = useTranslation();\r\n const handleSubmit = async (value: string) => {\r\n const text = value.trim();\r\n await runBackgroundSocketAction(() => addHistory(socket, historyId, text), t);\r\n\r\n refetchData();\r\n submitHandler(text);\r\n };\r\n\r\n return <LocalSuggestField {...other} data={history} submitHandler={handleSubmit} />;\r\n};\r\n\r\nexport default DataProviderDecorator<HistoryInputProps, HistoryInputDataProps>(\r\n HistoryInput,\r\n {\r\n urls: {\r\n history: ({ historyId }, socket) =>\r\n socket.get(HistoryConstants.STRINGS_URL + '/' + historyId),\r\n },\r\n loaderText: null,\r\n },\r\n);\r\n","import * as React from 'react';\n\nimport * as UI from 'types/ui';\n\nimport Accordion, {\n AccordionContent,\n AccordionTitle,\n} from 'components/semantic/Accordion';\nimport IconConstants from 'constants/IconConstants';\nimport Icon from 'components/semantic/Icon';\nimport { isValueSet } from 'utils/FormUtils';\n\ntype FormAccordionProps = React.PropsWithChildren<{\n locals: UI.FormLocals;\n}>;\n\nexport const FormAccordion: React.FC<FormAccordionProps> = ({ locals, children }) => {\n const { label } = locals;\n const active = isValueSet(locals.value);\n return (\n <Accordion className=\"field\" defaultActiveIndexes={active ? [0] : undefined}>\n <AccordionTitle>\n <Icon icon={IconConstants.DROPDOWN} />\n <span style={active ? { fontWeight: 'bold' } : undefined}>{label}</span>\n </AccordionTitle>\n <AccordionContent>{children}</AccordionContent>\n </Accordion>\n );\n};\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\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\ntype Props = HubSelectFieldProps & DataProps;\r\n\r\nconst HubSelectField: React.FC<Props> = ({ hubs, value, onChange }) => {\r\n const onlineHubs = hubs.filter(\r\n (hub) => hub.connect_state.id === API.HubConnectStateEnum.CONNECTED,\r\n );\r\n const selectedUrls =\r\n !!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 void 0;\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 id={`hub-${hub.id}-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.includes(hub.hub_url)}\r\n onChange={(checked) => {\r\n const newValue = updateMultiselectValues(\r\n selectedUrls,\r\n hub.hub_url,\r\n checked,\r\n );\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\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';\nimport * as React from 'react';\nimport t from 'utils/tcomb-form';\n\nimport * as UI from 'types/ui';\nimport { parseUnit } from 'utils/Formatter';\nimport { ByteUnits } from 'utils/ValueFormat';\nimport { useFormatter } from 'context/FormatterContext';\nimport Input from 'components/semantic/Input';\n\ninterface SizeFieldProps {\n moduleT: UI.ModuleTranslator;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n onChange: (size: number | null) => void;\n value: number;\n}\n\ntype Props = SizeFieldProps;\n\nconst DEFAULT_UNIT_INDEX = 2;\n\nconst toFieldValues = (initialValue: number) => {\n const { value, unitIndex } = parseUnit(initialValue, ByteUnits, 1024);\n return {\n value,\n unitIndex: !!initialValue ? unitIndex : DEFAULT_UNIT_INDEX,\n };\n};\n\nconst SizeField: React.FC<Props> = ({ inputProps, moduleT, onChange, value }) => {\n const { formatUnit } = useFormatter();\n const initialData = toFieldValues(value);\n const [displayValue, setDisplayValue] = useState<number | undefined>(initialData.value);\n const [unitIndex, setUnitIndex] = useState<number>(initialData.unitIndex);\n\n const valueToBytes = () => {\n let ret = displayValue ?? 0;\n if (!!unitIndex) {\n for (let i = 1; i <= unitIndex; i++) {\n ret *= 1024;\n }\n }\n\n return ret;\n };\n\n // Fire internal changes\n useEffect(() => {\n const newValue = valueToBytes();\n if (newValue !== value) {\n onChange(newValue);\n }\n }, [unitIndex, displayValue]);\n\n // Update fields on external changes\n useEffect(() => {\n const curBytes = valueToBytes();\n if (value !== curBytes) {\n const newData = toFieldValues(value);\n setDisplayValue(newData.value);\n setUnitIndex(newData.unitIndex);\n }\n }, [value]);\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = (evt) => {\n const newValue = !!evt.target.value ? parseInt(evt.target.value) : null;\n if (!!newValue) {\n setDisplayValue(newValue);\n } else {\n setDisplayValue(undefined);\n }\n };\n\n return (\n <div style={{ display: 'flex' }}>\n <Input\n type=\"number\"\n {...inputProps}\n min={0}\n value={displayValue ?? ''}\n onChange={onInputChange}\n />\n <select\n className=\"ui select\"\n style={{ maxWidth: '100px' }}\n value={ByteUnits[unitIndex]}\n onChange={(evt) => {\n setUnitIndex(evt.target.selectedIndex);\n }}\n >\n {ByteUnits.map((unit, index) => (\n <option key={unit} value={unit}>\n {formatUnit(unit)}\n </option>\n ))}\n </select>\n </div>\n );\n};\n\ntype TCombTemplate = {\n renderInput: (locals: UI.FormLocals<any, number>) => React.ReactNode;\n};\n\nconst FileTypeField: TCombTemplate = {\n renderInput(locals) {\n return (\n <SizeField\n onChange={locals.onChange}\n value={!!locals.value ? parseInt(locals.value as any) : 0}\n moduleT={locals.context.formT}\n />\n );\n },\n};\n\nexport default t.form.Form.templates.textbox.clone(FileTypeField);\n","import * as React from 'react';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport FileIcon from 'components/icon/FileIcon';\nimport Icon from 'components/semantic/Icon';\nimport IconConstants from 'constants/IconConstants';\n\nconst searchTypeToFileItem = (searchType: UI.SearchTypeItem): API.FileItemType => {\n if (searchType.id === 'directory') {\n return {\n id: 'directory',\n str: '',\n files: 0,\n directories: 0,\n };\n }\n\n return {\n id: 'file',\n str: '',\n content_type: searchType.id as API.FileContentType,\n };\n};\n\ninterface SearchTypeIconProps {\n type: UI.SearchTypeItem;\n size?: string;\n}\n\nexport const SearchTypeIcon: React.FC<SearchTypeIconProps> = ({\n type,\n size = 'large',\n}) => {\n if (!type.id) {\n return <Icon icon={IconConstants.ANY} size={size} />;\n }\n\n return <FileIcon typeInfo={searchTypeToFileItem(type)} size={size} />;\n};\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, {\r\n DataProviderDecoratorChildProps,\r\n} 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\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 {\r\n id: 'directory',\r\n str: moduleT.translate('Directory'),\r\n },\r\n {\r\n id: 'file',\r\n str: moduleT.translate('File'),\r\n },\r\n];\r\n\r\nconst typeToMenuItem = (\r\n type: UI.SearchTypeItem,\r\n onChange: OnChangeHandler,\r\n selectedItem: UI.SearchTypeItem,\r\n) => (\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> = ({\r\n searchTypes,\r\n value,\r\n onChange,\r\n moduleT,\r\n}) => {\r\n const commonItems = getCommonItems(moduleT);\r\n const selectedItem =\r\n searchTypes.find((i) => value === i.id) ||\r\n commonItems.find((i) => value === i.id) ||\r\n 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<\r\n SearchTypeDropdownProps,\r\n DataProps\r\n>(SearchTypeDropdown, {\r\n urls: {\r\n searchTypes: SearchConstants.SEARCH_TYPES_URL,\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';\nimport t from 'utils/tcomb-form';\n\nimport * as UI from 'types/ui';\n\nimport { FormAccordion } from './AccordionField';\n\ntype TCombTemplate = {\n renderFieldset: (children: React.ReactNode, locals: UI.FormLocals) => React.ReactNode;\n renderLabel: (locals: UI.FormLocals) => React.ReactNode;\n};\n\nconst AccordionStruct: TCombTemplate = {\n renderFieldset(children, locals) {\n const { label, ...childLocals } = locals;\n return (\n <FormAccordion locals={locals}>\n {(t.form.Form.templates.struct as any).renderFieldset(children, childLocals)}\n </FormAccordion>\n );\n },\n renderLabel(locals) {\n return null;\n },\n};\n\nexport default t.form.Form.templates.struct.clone(AccordionStruct);\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, {\r\n FormFieldChangeHandler,\r\n FormSaveHandler,\r\n FormFieldSettingHandler,\r\n} from 'components/form/Form';\r\nimport { isValueSet, translateForm } from 'utils/FormUtils';\r\nimport Button from 'components/semantic/Button';\r\nimport AccordionStructField from './AccordionStructField';\r\n\r\ninterface Entry extends Pick<API.SearchQuery, 'file_type'>, UI.FormValueMap {\r\n hub_urls: string[] | null;\r\n size_limits: null | {\r\n min_size: number | null;\r\n max_size: number | null;\r\n };\r\n}\r\n\r\nexport interface SearchOptionsFormProps extends Pick<UI.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\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 {\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 {\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 {\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];\r\n\r\nconst removeEmptyProperties = (formValue: Entry) => {\r\n const ret = Object.keys(formValue).reduce((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 }, {} as Entry);\r\n\r\n return ret;\r\n};\r\n\r\nclass SearchOptionsForm extends PureComponent<SearchOptionsFormProps> {\r\n static readonly 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 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, moduleT } = this.props;\r\n return (\r\n <div>\r\n <Form<Entry>\r\n ref={(c) => {\r\n this.form = c!;\r\n }}\r\n onFieldChanged={this.onFieldChanged}\r\n onFieldSetting={this.onFieldSetting}\r\n onSave={this.onSave}\r\n fieldDefinitions={this.definitions}\r\n sourceValue={value} // This gets updated on every change at the moment...\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 {\r\n SearchOptionsForm,\r\n SearchOptionsFormProps,\r\n SearchOptions,\r\n} from './SearchOptionsForm';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Icon from 'components/semantic/Icon';\r\nimport HubConstants from 'constants/HubConstants';\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\nimport { isValueSet } from 'utils/FormUtils';\r\nimport { useLocation } from 'react-router';\r\n\r\ninterface SearchOptionsButtonProps\r\n extends Pick<SearchOptionsFormProps, 'onChange' | 'value'> {\r\n moduleT: UI.ModuleTranslator;\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\nconst removeEmptyProperties = (value: SearchOptions) => {\r\n const ret = Object.keys(value).reduce((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 }, {} as SearchOptions);\r\n\r\n return ret;\r\n};\r\n\r\nconst SearchOptionsButton: React.FC<Props> = ({ moduleT, onChange, value, hubs }) => {\r\n const location = useLocation();\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 // 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) =>\r\n hubs.find((hub) => hub.hub_url === url),\r\n );\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 }, [hubs]);\r\n\r\n const filterCount = !value\r\n ? null\r\n : Object.keys(value).filter((key) => {\r\n const curValue = value[key];\r\n return isValueSet(curValue);\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 onChange={onValueChanged}\r\n value={value}\r\n hubs={hubs}\r\n location={location}\r\n />\r\n )}\r\n </Popup>\r\n );\r\n};\r\n\r\nconst SearchOptionsButtonDecorated = DataProviderDecorator<\r\n SearchOptionsButtonProps,\r\n DataProps\r\n>(SearchOptionsButton, {\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, () =>\r\n refetchData(),\r\n );\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, () =>\r\n refetchData(),\r\n );\r\n },\r\n dataConverters: {\r\n hubs: (hubs: API.Hub[]) =>\r\n hubs.filter((hub) => hub.connect_state.id === API.HubConnectStateEnum.CONNECTED),\r\n },\r\n});\r\n\r\nexport { SearchOptionsButtonDecorated as SearchOptionsButton };\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 { usingMobileLayout } from 'utils/BrowserUtils';\r\nimport { SearchOptionsButton, SearchOptions } from './options-panel';\r\n\r\ninterface SearchInputProps {\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,\r\n defaultValue,\r\n running,\r\n handleSubmit,\r\n defaultOptions,\r\n}) => {\r\n const [options, setOptions] = useState<SearchOptions | null>(defaultOptions);\r\n\r\n const mobile = usingMobileLayout();\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 <SearchOptionsButton moduleT={moduleT} onChange={setOptions} value={options} />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport { SearchInput };\r\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\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 { useEffect, useState } from 'react';\r\nimport { WithTranslation } from 'react-i18next';\r\nimport { useLocation, useNavigate } from 'react-router';\r\n\r\nimport NotificationActions from 'actions/NotificationActions';\r\nimport SearchConstants from 'constants/SearchConstants';\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\nimport OfflineHubMessageDecorator from 'decorators/OfflineHubMessageDecorator';\r\nimport LoginStore from 'stores/reflux/LoginStore';\r\nimport { search as doSearch } from 'services/api/SearchApi';\r\nimport { getModuleT } from 'utils/TranslationUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport ResultTable from 'routes/Search/components/ResultTable';\r\n\r\nimport { SearchInput } from './SearchInput';\r\nimport { SearchOptions } from './options-panel';\r\nimport {\r\n loadSessionProperty,\r\n removeSessionProperty,\r\n saveSessionProperty,\r\n} from 'utils/BrowserUtils';\r\n\r\nimport '../style.css';\r\n\r\nconst RESULT_WAIT_PERIOD = 4000;\r\n\r\ninterface SearchProps {}\r\n\r\ninterface SearchDataProps extends DataProviderDecoratorChildProps, WithTranslation {\r\n instance: API.SearchInstance;\r\n}\r\n\r\nconst SEARCH_HUBS_KEY = 'search_hubs';\r\n\r\nconst loadHubOptions = () => {\r\n const options = loadSessionProperty<string[] | null>(SEARCH_HUBS_KEY, null);\r\n return options;\r\n};\r\n\r\nconst saveHubOptions = (hubs: string[] | null) => {\r\n if (!hubs?.length) {\r\n removeSessionProperty(SEARCH_HUBS_KEY);\r\n } else {\r\n saveSessionProperty(SEARCH_HUBS_KEY, hubs);\r\n }\r\n};\r\n\r\nconst Search: React.FC<SearchDataProps> = ({ instance, t }) => {\r\n const location = useLocation();\r\n const navigate = useNavigate();\r\n const [searchString, setSearchString] = useState('');\r\n const [running, setRunning] = useState<API.SearchResponse | null>(null);\r\n\r\n const parseOptions = (): SearchOptions | null => {\r\n const { query } = 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:\r\n query.file_type === SearchConstants.DEFAULT_SEARCH_TYPE ||\r\n query.file_type === 'tth'\r\n ? null\r\n : query.file_type,\r\n hub_urls: loadHubOptions(),\r\n };\r\n };\r\n\r\n const search = async (pattern: string, options?: SearchOptions) => {\r\n console.log('Searching');\r\n saveHubOptions(options?.hub_urls || null);\r\n\r\n const { hub_urls, size_limits, ...queryOptions } = options || {};\r\n try {\r\n const res = await doSearch(instance, {\r\n query: {\r\n pattern,\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 setSearchString(pattern);\r\n setRunning(res);\r\n } catch (error) {\r\n NotificationActions.apiError('Search failed', error);\r\n }\r\n };\r\n\r\n const checkLocationState = () => {\r\n const { state } = location;\r\n if (state?.searchString /* && state.searchString !== searchString*/) {\r\n search(state.searchString);\r\n\r\n // Avoid searching for it again\r\n navigate(location.pathname, { replace: true });\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n checkLocationState();\r\n\r\n const { query } = instance;\r\n if (!!query) {\r\n setSearchString(query.pattern);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n checkLocationState();\r\n }, [location.state?.searchString]);\r\n\r\n useEffect(() => {\r\n if (!running) {\r\n return;\r\n }\r\n\r\n const searchTimeout = window.setTimeout(() => {\r\n setRunning(null);\r\n }, running.queue_time + RESULT_WAIT_PERIOD);\r\n\r\n return () => {\r\n clearTimeout(searchTimeout);\r\n };\r\n }, [running]);\r\n\r\n const searchT = getModuleT(t, UI.Modules.SEARCH);\r\n return (\r\n <OfflineHubMessageDecorator\r\n offlineMessage={searchT.t(\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={searchT}\r\n running={!!running}\r\n defaultValue={searchString}\r\n handleSubmit={search}\r\n defaultOptions={parseOptions()}\r\n />\r\n <ResultTable\r\n searchString={searchString}\r\n running={!!running}\r\n searchT={searchT}\r\n instance={instance}\r\n />\r\n </div>\r\n </OfflineHubMessageDecorator>\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[]>(\r\n `${SearchConstants.INSTANCES_URL}`,\r\n );\r\n\r\n const instance = instances.find(\r\n (i) => i.owner === `session:${LoginStore.sessionId}:${OWNER_ID_SUFFIX}`,\r\n );\r\n if (!!instance) {\r\n return instance;\r\n }\r\n\r\n // Create new instance\r\n const instanceId = (\r\n await socket.post<{ id: number }>(SearchConstants.INSTANCES_URL, {\r\n owner_suffix: OWNER_ID_SUFFIX,\r\n expiration: 0,\r\n })\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","SearchTypeCreateAction","displayName","icon","CREATE","handler","navigate","SearchTypeEditActions","edit","EDIT","itemData","type","remove","REMOVE","confirmation","content","approveCaption","rejectCaption","filter","default_type","socket","delete","SEARCH_TYPES_URL","SearchTypeActionModule","moduleId","SETTINGS","SearchTypeEditActionMenu","moduleData","actions","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","DupeStrings","SHARE_PARTIAL","SHARE_FULL","QUEUE_PARTIAL","QUEUE_FULL","FINISHED_PARTIAL","FINISHED_FULL","SHARE_QUEUE","SHARE_FINISHED","QUEUE_FINISHED","SHARE_QUEUE_FINISHED","DupePaths","paths","className","map","path","FileItemInfoGrid","session","fileItem","user","downloadHandler","showPath","t","gridT","text","COMMON","formatSize","formatRelativeTime","Grid","columns","stackable","title","name","str","size","time","tth","dupe","caption","button","itemInfoGetter","contextElement","entity","hub","other","connect_state","searchDownloadHandler","itemInfo","downloadData","instance","SocketService","post","SearchConstants","MODULE_URL","UserResult","result","formatConnection","userIcon","directory","ids","remoteMenuId","MenuConstants","HINTED_USER","hub_names","connection","slots","FormattedIp","item","ip","resultSort","a","b","nicks","localeCompare","DataProviderDecorator","results","SEARCH","defaultValue","defaultValue_plural","count","length","style","width","slice","sort","cid","urls","parentResult","instanceId","get","INSTANCES_URL","ResultDialog","Component","itemDataGetter","itemId","this","props","render","RouteModal","closable","FileIcon","typeInfo","fullHeight","DownloadDialog","users","Decorated","ModalRouteDecorator","params","resultId","_viewName","_apiUrl","mixins","ViewStoreMixin","GroupedSearchResultActions","IconConstants","DETAILS","groupedResult","browseContent","FILELIST","location","createData","FilelistSessionActions","createSession","sessionStore","FilelistSessionStore","SearchActionModule","GroupedSearchResultActionMenu","SearchActionMenu","getUserCaption","replace","UserCell","cellData","rowDataGetter","resultUserGetter","rowData","NameCell","userGetter","GROUPED_SEARCH_RESULT","ResultTable","rowClassNameGetter","emptyRowsNodeGetter","running","searchString","searchT","Message","description","i18nKey","toI18nKey","isDemoInstance","TIP","translate","VirtualTable","store","SearchViewStore","textFilterProps","autoFocus","entityId","footerData","header","triggerIcon","columnKey","flexGrow","cell","hideWidth","submitHandler","historyId","history","refetchData","LocalSuggestField","data","value","trim","HistoryConstants","STRINGS_URL","loaderText","FormAccordion","children","label","active","Accordion","defaultActiveIndexes","undefined","Icon","DROPDOWN","fontWeight","HubSelectField","hubs","onChange","onlineHubs","CONNECTED","selectedUrls","hub_url","beforeUnchecked","Checkbox","HubIcon","identity","checked","includes","newValue","maxWidth","HubsSelectField","renderSelect","renderLabel","form","Form","templates","select","clone","toFieldValues","initialValue","unitIndex","SizeField","inputProps","moduleT","formatUnit","initialData","displayValue","setDisplayValue","useState","setUnitIndex","valueToBytes","ret","i","useEffect","curBytes","newData","display","Input","min","evt","target","parseInt","selectedIndex","unit","index","FileTypeField","renderInput","context","formT","textbox","SearchTypeIcon","searchType","files","directories","content_type","ANY","typeToMenuItem","selectedItem","MenuItemLink","onClick","DEFAULT_SEARCH_TYPE","SearchTypeDropdownDecorated","searchTypes","commonItems","getCommonItems","find","Dropdown","selection","AccordionStruct","renderFieldset","childLocals","struct","Fields","key","STRING","optional","LIST","item_type","STRUCT","definitions","NUMBER","SearchOptionsForm","PureComponent","constructor","super","onFieldChanged","hasChanges","formValue","Object","keys","reduce","reduced","save","onSave","changedFields","Promise","resolve","onFieldSetting","fieldOptions","assign","factory","Select","template","disableOrder","AccordionStructField","ref","c","fieldDefinitions","sourceValue","optionTitleFormatter","def","Button","disabled","marginTop","SearchOptionsButtonDecorated","onValueChanged","Array","isArray","hub_urls","selectedUrlsNew","url","filterCount","curValue","Popup","triggerClassName","trigger","OPTIONS","marginRight","color","EXPAND","contentUpdateTrigger","hide","HubConstants","SESSIONS_URL","onSocketConnected","addSocketListener","SESSION_CREATED","SESSION_UPDATED","SESSION_REMOVED","dataConverters","SearchInput","handleSubmit","defaultOptions","setOptions","mobile","placeholder","loading","SEARCH_HUBS_KEY","OWNER_ID_SUFFIX","setSearchString","setRunning","search","pattern","console","log","size_limits","queryOptions","res","query","priority","HIGH","error","NotificationActions","apiError","checkLocationState","state","pathname","searchTimeout","window","setTimeout","queue_time","clearTimeout","OfflineHubMessageDecorator","offlineMessage","excluded","min_size","max_size","file_type","parseOptions","owner","LoginStore","sessionId","owner_suffix","expiration"],"sourceRoot":""}
1
+ {"version":3,"file":"js/search.0eeea3bce388b8c304fb.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/actions/ui/search/SearchTypeActions.ts","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/services/api/SearchApi.ts","webpack://airdcpp-webui/./src/routes/Search/components/result-dialog/UserResultTable.tsx","webpack://airdcpp-webui/./src/routes/Search/components/result-dialog/ResultDialog.tsx","webpack://airdcpp-webui/./src/stores/views/SearchViewStore.js","webpack://airdcpp-webui/./src/actions/ui/search/SearchActions.ts","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/style.css?d43b","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, `.fileitem.info.segment .dupe-paths .path {\n overflow-x: hidden;\n}\n\n.fileitem.info.segment .download.ui.dropdown {\n max-width: 150px;\n margin-top: 10px;\n}\n\n.fileitem.info.segment .title.column {\n margin-top: auto;\n margin-bottom: auto;\n}\n\n.fileitem.info.segment .value.column {\n word-break: break-all;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/file-item-info/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB\",\"sourcesContent\":[\".fileitem.info.segment .dupe-paths .path {\\n overflow-x: hidden;\\n}\\n\\n.fileitem.info.segment .download.ui.dropdown {\\n max-width: 150px;\\n margin-top: 10px;\\n}\\n\\n.fileitem.info.segment .title.column {\\n margin-top: auto;\\n margin-bottom: auto;\\n}\\n\\n.fileitem.info.segment .value.column {\\n word-break: break-all;\\n}\\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 {\n width: 100%;\n height: 50px;\n}\n\n#mobile-layout .search-container {\n margin-top: 10px;\n}\n\n.search-container .search-area {\n width: 90%;\n max-width: 600px;\n margin-left: auto;\n margin-right: auto;\n display: flex;\n}\n\n.search-container .search-area .options.trigger {\n margin-left: 5px;\n}\n\n.search-container .search-area .options.trigger .button {\n padding-left: 15px;\n padding-right: 5px;\n height: 100%;\n}\n\n.search-container .search-area .ui.input.action {\n flex: 1;\n}\n\n.search-area,\n.search-area .react-autosuggest__container,\n.search-container .search-area .ui.input.action {\n flex: 1;\n}\n\n.search-area,\n.search-area input {\n width: 100%;\n}\n\n.search-area button {\n display: inline-block !important;\n}\n\n.search-layout {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.search-layout .virtual-table {\n height: calc(100% - 50px);\n}\n\n@media only screen and (min-width: 767px) {\n .result.modal td {\n max-width: 250px;\n }\n}\n\n.search-options {\n min-width: 300px;\n}\n\n.search-options .field-hub_urls {\n max-height: 180px;\n overflow-y: auto;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Search/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,WAAW;EACX,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;;EAEE,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 {\\n width: 100%;\\n height: 50px;\\n}\\n\\n#mobile-layout .search-container {\\n margin-top: 10px;\\n}\\n\\n.search-container .search-area {\\n width: 90%;\\n max-width: 600px;\\n margin-left: auto;\\n margin-right: auto;\\n display: flex;\\n}\\n\\n.search-container .search-area .options.trigger {\\n margin-left: 5px;\\n}\\n\\n.search-container .search-area .options.trigger .button {\\n padding-left: 15px;\\n padding-right: 5px;\\n height: 100%;\\n}\\n\\n.search-container .search-area .ui.input.action {\\n flex: 1;\\n}\\n\\n.search-area,\\n.search-area .react-autosuggest__container,\\n.search-container .search-area .ui.input.action {\\n flex: 1;\\n}\\n\\n.search-area,\\n.search-area input {\\n width: 100%;\\n}\\n\\n.search-area button {\\n display: inline-block !important;\\n}\\n\\n.search-layout {\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n}\\n\\n.search-layout .virtual-table {\\n height: calc(100% - 50px);\\n}\\n\\n@media only screen and (min-width: 767px) {\\n .result.modal td {\\n max-width: 250px;\\n }\\n}\\n\\n.search-options {\\n min-width: 300px;\\n}\\n\\n.search-options .field-hub_urls {\\n max-height: 180px;\\n overflow-y: auto;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\ntype Filter = UI.ActionFilter<API.SearchType>;\r\nconst notDefaultType: Filter = ({ itemData: type }) => !type.default_type;\r\n\r\nconst handleCreate: UI.ActionHandler<API.SearchType> = ({ navigate }) => {\r\n navigate(`types`);\r\n};\r\n\r\nconst handleEdit: UI.ActionHandler<API.SearchType> = ({ itemData: type, navigate }) => {\r\n navigate(`types/${type.id}`);\r\n};\r\n\r\nconst handleRemove: UI.ActionHandler<API.SearchType> = ({ itemData: type, socket }) => {\r\n return socket.delete(`${SearchConstants.SEARCH_TYPES_URL}/${type.id}`);\r\n};\r\n\r\nexport const SearchTypeCreateAction = {\r\n id: 'create',\r\n displayName: 'Add type',\r\n icon: IconConstants.CREATE,\r\n handler: handleCreate,\r\n};\r\n\r\nexport const SearchTypeEditAction = {\r\n id: 'edit',\r\n displayName: 'Edit type',\r\n icon: IconConstants.EDIT,\r\n handler: handleEdit,\r\n};\r\n\r\nexport const SearchTypeRemoveAction = {\r\n id: 'remove',\r\n displayName: 'Remove type',\r\n icon: IconConstants.REMOVE,\r\n confirmation: {\r\n content: 'Are you sure that you want to remove the search type {{item.name}}?',\r\n approveCaption: 'Remove type',\r\n rejectCaption: `Don't remove`,\r\n },\r\n filter: notDefaultType,\r\n handler: handleRemove,\r\n};\r\n\r\nconst SearchTypeEditActions: UI.ActionListType<API.SearchType> = {\r\n edit: SearchTypeEditAction,\r\n remove: SearchTypeRemoveAction,\r\n};\r\n\r\nexport const SearchTypeActionModule = {\r\n moduleId: UI.Modules.SETTINGS,\r\n};\r\n\r\nexport const SearchTypeEditActionMenu = {\r\n moduleData: SearchTypeActionModule,\r\n actions: SearchTypeEditActions,\r\n};\r\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\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';\n\nimport { useFormatter } from 'context/FormatterContext';\n\nimport { DownloadMenu } from 'components/action-menu';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { useTranslation } from 'react-i18next';\nimport { translate } from 'utils/TranslationUtils';\n\nimport './style.css';\nimport { Row, Grid } from 'components/semantic/Grid';\n\nconst DupeStrings = {\n //[API.DupeEnum.NONE]: 'None',\n [API.DupeEnum.SHARE_PARTIAL]: 'Share (partial)',\n [API.DupeEnum.SHARE_FULL]: 'Share (full)',\n [API.DupeEnum.QUEUE_PARTIAL]: 'Queue (partial)',\n [API.DupeEnum.QUEUE_FULL]: 'Queue (full)',\n [API.DupeEnum.FINISHED_PARTIAL]: 'Finished (partial)',\n [API.DupeEnum.FINISHED_FULL]: 'Finished (full)',\n [API.DupeEnum.SHARE_QUEUE]: 'Share and queue',\n [API.DupeEnum.SHARE_FINISHED]: 'Share and finished',\n [API.DupeEnum.QUEUE_FINISHED]: 'Queue and finished',\n [API.DupeEnum.SHARE_QUEUE_FINISHED]: 'Share, queue and finished',\n};\n\nconst DupePaths: React.FC<{ paths: string[] }> = ({ paths }) => (\n <div className=\"dupe-paths\">\n {paths.map((path) => (\n <div key={path} className=\"path\">\n {path}\n </div>\n ))}\n </div>\n);\n\ninterface FileItemInfoGridProps {\n fileItem: UI.DownloadableItemInfo;\n user: API.HintedUser;\n downloadHandler: UI.DownloadHandler<UI.DownloadableItemInfo>;\n showPath?: boolean;\n session: UI.SessionItemBase;\n}\n\nconst FileItemInfoGrid: React.FC<FileItemInfoGridProps> = ({\n session,\n fileItem,\n user,\n downloadHandler,\n showPath = true,\n}) => {\n const { t } = useTranslation();\n const gridT = (text: string) => {\n return translate(text, t, UI.Modules.COMMON);\n };\n\n const { formatSize, formatRelativeTime } = useFormatter();\n return (\n <div className=\"ui fileitem info segment\">\n <Grid columns=\"two\" stackable={true}>\n <Row title={gridT('Name')} text={fileItem.name} />\n <Row title={gridT('Type/content')} text={fileItem.type.str} />\n <Row title={gridT('Size')} text={formatSize(fileItem.size, 2, true)} />\n <Row\n title={gridT('Last modified')}\n text={formatRelativeTime(fileItem.time || 0)}\n />\n {fileItem.type.id === 'file' && <Row title={gridT('TTH')} text={fileItem.tth} />}\n {!!fileItem.dupe && (\n <Row title={gridT('Dupe type')} text={gridT(DupeStrings[fileItem.dupe.id])} />\n )}\n {!!fileItem.dupe && (\n <Row\n title={gridT('Dupe paths')}\n text={<DupePaths paths={fileItem.dupe.paths} />}\n />\n )}\n {showPath && <Row title={gridT('Path')} text={fileItem.path} />}\n </Grid>\n\n <DownloadMenu\n caption={gridT('Actions...')}\n button={true}\n user={user}\n itemInfoGetter={() => fileItem}\n downloadHandler={downloadHandler}\n contextElement=\".ui.modal > .content\"\n entity={session}\n />\n </div>\n );\n};\n\nexport { FileItemInfoGrid };\n","import * as React from 'react';\n\nimport Icon, { IconProps } from 'components/semantic/Icon';\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\n\nimport * as API from 'types/api';\n\ninterface HubIconProps extends IconProps {\n hub: API.Hub;\n}\n\nconst HubIcon: React.FC<HubIconProps> = ({ hub, ...other }) => (\n <Icon {...other} icon={hubOnlineStatusToColor(hub.connect_state.id) + ' sitemap'} />\n);\n\nexport default HubIcon;\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\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 = (instance: API.SearchInstance, data: SearchData) => {\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 * as React from 'react';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\nimport FormattedIp from 'components/format/FormattedIp';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport { UserMenu } from 'components/action-menu';\r\nimport { UserFileActions } from 'actions/ui/user/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 MenuConstants from 'constants/MenuConstants';\r\nimport { useFormatter } from 'context/FormatterContext';\r\n\r\ninterface UserResultProps {\r\n result: API.ChildSearchResult;\r\n}\r\n\r\nconst UserResult: React.FC<UserResultProps> = ({ result }) => {\r\n const { formatConnection } = useFormatter();\r\n return (\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\">{result.user.hub_names}</td>\r\n <td className=\"connection\">{formatConnection(result.connection)}</td>\r\n <td className=\"slots\">{result.slots.str}</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\n\r\nconst resultSort = (a: API.ChildSearchResult, b: API.ChildSearchResult) =>\r\n 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' }}>\r\n {translate('Connection', t, UI.Modules.SEARCH)}\r\n </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\r\n .slice()\r\n .sort(resultSort)\r\n .map((result) => (\r\n <UserResult key={result.user.cid} result={result} />\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DataProviderDecorator<UserResultTableProps, UserResultTableDataProps>(\r\n UserResultTable,\r\n {\r\n urls: {\r\n results: ({ parentResult, instanceId }, socket) =>\r\n socket.get(\r\n `${SearchConstants.INSTANCES_URL}/${instanceId}/results/${parentResult.id}/children`,\r\n ),\r\n },\r\n },\r\n);\r\n","import { Component } from 'react';\r\nimport RouteModal from 'components/semantic/RouteModal';\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, {\r\n ModalRouteDecoratorChildProps,\r\n} from 'decorators/ModalRouteDecorator';\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} 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\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\ntype Props = ResultDialogProps & ModalRouteDecoratorChildProps;\r\n\r\nclass ResultDialog extends Component<Props & DataProps> {\r\n static readonly displayName = 'ResultDialog';\r\n\r\n itemDataGetter: UI.DownloadItemDataGetter<API.GroupedSearchResult> = (\r\n itemId,\r\n socket,\r\n ) => {\r\n const { instance } = this.props;\r\n return socket.get(\r\n `${SearchConstants.INSTANCES_URL}/${instance.id}/results/${itemId}`,\r\n );\r\n };\r\n\r\n render() {\r\n const { parentResult, instance } = this.props;\r\n return (\r\n <RouteModal\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 >\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 parentResult={parentResult} instanceId={instance.id} />\r\n </RouteModal>\r\n );\r\n }\r\n}\r\n\r\nconst Decorated = ModalRouteDecorator<ResultDialogProps>(\r\n DataProviderDecorator<Props, DataProps>(ResultDialog, {\r\n urls: {\r\n parentResult: ({ params, instance }, socket) =>\r\n socket.get(\r\n `${SearchConstants.INSTANCES_URL}/${instance.id}/results/${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';\n\nimport SearchConstants from 'constants/SearchConstants';\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\n\nexport default Reflux.createStore({\n _viewName: 'search_view',\n _apiUrl: SearchConstants.INSTANCES_URL,\n mixins: [ViewStoreMixin('relevance', false)],\n});\n","import IconConstants from 'constants/IconConstants';\r\n\r\nimport FilelistSessionActions from 'actions/reflux/FilelistSessionActions';\r\nimport FilelistSessionStore from 'stores/reflux/FilelistSessionStore';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\ntype Handler = UI.ActionHandler<API.GroupedSearchResult>;\r\nconst handleBrowseContent: Handler = ({\r\n itemData: groupedResult,\r\n location,\r\n navigate,\r\n}) => {\r\n const createData = {\r\n user: groupedResult.users.user,\r\n path: groupedResult.path,\r\n };\r\n\r\n return FilelistSessionActions.createSession(createData, {\r\n location,\r\n sessionStore: FilelistSessionStore,\r\n navigate,\r\n });\r\n};\r\n\r\nconst handleResult: Handler = ({ itemData: groupedResult, navigate }) => {\r\n navigate(`result/${groupedResult.id}`);\r\n};\r\n\r\nexport const SearchResultDetailsAction = {\r\n id: 'result',\r\n displayName: 'Result details',\r\n icon: IconConstants.DETAILS,\r\n handler: handleResult,\r\n};\r\n\r\nexport const SearchBrowseContentAction = {\r\n id: 'browseContent',\r\n displayName: 'Browse content',\r\n icon: IconConstants.FILELIST,\r\n handler: handleBrowseContent,\r\n};\r\n\r\nconst GroupedSearchResultActions: UI.ActionListType<API.GroupedSearchResult> = {\r\n result: SearchResultDetailsAction,\r\n browseContent: SearchBrowseContentAction,\r\n};\r\n\r\nexport const SearchActionModule = {\r\n moduleId: UI.Modules.SEARCH,\r\n};\r\n\r\nexport const GroupedSearchResultActionMenu = {\r\n moduleData: SearchActionModule,\r\n actions: GroupedSearchResultActions,\r\n};\r\n\r\nconst SearchActions: UI.ActionListType<API.SearchInstance> = {};\r\n\r\nexport const SearchActionMenu = {\r\n moduleData: SearchActionModule,\r\n actions: SearchActions,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { ResultDialog } from './result-dialog';\r\n\r\nimport SearchViewStore from 'stores/views/SearchViewStore';\r\n\r\nimport { Column } from 'fixed-data-table-2';\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport {\r\n SizeCell,\r\n DurationCell,\r\n ConnectionCell,\r\n FileDownloadCell,\r\n DecimalCell,\r\n} from 'components/table/Cell';\r\nimport { ActionMenu, TableActionMenu, TableUserMenu } from 'components/action-menu';\r\n\r\nimport { dupeToStringType } from 'utils/TypeConvert';\r\nimport { UserFileActions } from 'actions/ui/user/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 { 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\nimport { GroupedSearchResultActionMenu, SearchActionMenu } from 'actions/ui/search';\r\n\r\nconst getUserCaption = ({ count, user }: API.SearchResultUserInfo, t: UI.TranslateF) => {\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<\r\n RowWrapperCellChildProps<API.SearchResultUserInfo, API.GroupedSearchResult>\r\n> = ({ cellData, rowDataGetter, t }) => (\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={GroupedSearchResultActionMenu}\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?.users) {\r\n return rowData?.users?.user;\r\n }\r\n\r\n return rowData.users.user;\r\n};\r\n\r\ninterface NameCellProps\r\n extends RowWrapperCellChildProps<string, API.GroupedSearchResult> {\r\n instance: API.SearchInstance;\r\n}\r\n\r\nconst NameCell: React.FC<NameCellProps> = ({ rowDataGetter, instance, ...props }) => (\r\n <FileDownloadCell\r\n userGetter={resultUserGetter}\r\n rowDataGetter={rowDataGetter}\r\n downloadHandler={searchDownloadHandler}\r\n entity={instance}\r\n {...props}\r\n >\r\n <TableActionMenu\r\n actions={SearchActionMenu}\r\n itemData={rowDataGetter}\r\n remoteMenuId={MenuConstants.GROUPED_SEARCH_RESULT}\r\n entity={instance}\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 readonly 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 (\r\n isDemoInstance() && (\r\n <Message\r\n title=\"Demo content available\"\r\n icon={IconConstants.TIP}\r\n description={\r\n 'Use the search string \"demo\" to receive results from the demo share'\r\n }\r\n />\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\">\r\n You are searching too frequently (hubs often have a minimum search\r\n interval)\r\n </div>\r\n <div className=\"item\">\r\n If you never receive results for common search terms, make sure that your\r\n 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> = (\r\n itemId,\r\n socket,\r\n ) => {\r\n const { instance } = this.props;\r\n return socket.get(\r\n `${SearchConstants.INSTANCES_URL}/${instance.id}/results/${itemId}`,\r\n );\r\n };\r\n\r\n render() {\r\n const { searchT, instance } = this.props;\r\n const { translate } = searchT;\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={UI.Modules.SEARCH}\r\n footerData={\r\n <ActionMenu\r\n className=\"top left pointing\"\r\n caption={translate('Actions...')}\r\n actions={SearchActionMenu}\r\n header={translate('Search actions')}\r\n triggerIcon=\"chevron up\"\r\n button={true}\r\n itemData={instance}\r\n remoteMenuId=\"search_instance\"\r\n />\r\n }\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 name=\"Type\" width={80} columnKey=\"type\" flexGrow={1} hideWidth={600} />\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 searchT={searchT} instance={instance} />\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default ResultTable;\r\n","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} 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\nimport { useSocket } from 'context/SocketContext';\r\n\r\nexport interface HistoryInputProps\r\n 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\nconst HistoryInput: React.FC<HistoryInputProps & HistoryInputDataProps> = ({\r\n submitHandler,\r\n historyId,\r\n history,\r\n refetchData,\r\n ...other\r\n}) => {\r\n const socket = useSocket();\r\n const { t } = useTranslation();\r\n const handleSubmit = async (value: string) => {\r\n const text = value.trim();\r\n await runBackgroundSocketAction(() => addHistory(socket, historyId, text), t);\r\n\r\n refetchData();\r\n submitHandler(text);\r\n };\r\n\r\n return <LocalSuggestField {...other} data={history} submitHandler={handleSubmit} />;\r\n};\r\n\r\nexport default DataProviderDecorator<HistoryInputProps, HistoryInputDataProps>(\r\n HistoryInput,\r\n {\r\n urls: {\r\n history: ({ historyId }, socket) =>\r\n socket.get(HistoryConstants.STRINGS_URL + '/' + historyId),\r\n },\r\n loaderText: null,\r\n },\r\n);\r\n","import * as React from 'react';\n\nimport * as UI from 'types/ui';\n\nimport Accordion, {\n AccordionContent,\n AccordionTitle,\n} from 'components/semantic/Accordion';\nimport IconConstants from 'constants/IconConstants';\nimport Icon from 'components/semantic/Icon';\nimport { isValueSet } from 'utils/FormUtils';\n\ntype FormAccordionProps = React.PropsWithChildren<{\n locals: UI.FormLocals;\n}>;\n\nexport const FormAccordion: React.FC<FormAccordionProps> = ({ locals, children }) => {\n const { label } = locals;\n const active = isValueSet(locals.value);\n return (\n <Accordion className=\"field\" defaultActiveIndexes={active ? [0] : undefined}>\n <AccordionTitle>\n <Icon icon={IconConstants.DROPDOWN} />\n <span style={active ? { fontWeight: 'bold' } : undefined}>{label}</span>\n </AccordionTitle>\n <AccordionContent>{children}</AccordionContent>\n </Accordion>\n );\n};\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\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\ntype Props = HubSelectFieldProps & DataProps;\r\n\r\nconst HubSelectField: React.FC<Props> = ({ hubs, value, onChange }) => {\r\n const onlineHubs = hubs.filter(\r\n (hub) => hub.connect_state.id === API.HubConnectStateEnum.CONNECTED,\r\n );\r\n const selectedUrls =\r\n !!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 void 0;\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 id={`hub-${hub.id}-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.includes(hub.hub_url)}\r\n onChange={(checked) => {\r\n const newValue = updateMultiselectValues(\r\n selectedUrls,\r\n hub.hub_url,\r\n checked,\r\n );\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\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';\nimport * as React from 'react';\nimport t from 'utils/tcomb-form';\n\nimport * as UI from 'types/ui';\nimport { parseUnit } from 'utils/Formatter';\nimport { ByteUnits } from 'utils/ValueFormat';\nimport { useFormatter } from 'context/FormatterContext';\nimport Input from 'components/semantic/Input';\n\ninterface SizeFieldProps {\n moduleT: UI.ModuleTranslator;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n onChange: (size: number | null) => void;\n value: number;\n}\n\ntype Props = SizeFieldProps;\n\nconst DEFAULT_UNIT_INDEX = 2;\n\nconst toFieldValues = (initialValue: number) => {\n const { value, unitIndex } = parseUnit(initialValue, ByteUnits, 1024);\n return {\n value,\n unitIndex: !!initialValue ? unitIndex : DEFAULT_UNIT_INDEX,\n };\n};\n\nconst SizeField: React.FC<Props> = ({ inputProps, moduleT, onChange, value }) => {\n const { formatUnit } = useFormatter();\n const initialData = toFieldValues(value);\n const [displayValue, setDisplayValue] = useState<number | undefined>(initialData.value);\n const [unitIndex, setUnitIndex] = useState<number>(initialData.unitIndex);\n\n const valueToBytes = () => {\n let ret = displayValue ?? 0;\n if (!!unitIndex) {\n for (let i = 1; i <= unitIndex; i++) {\n ret *= 1024;\n }\n }\n\n return ret;\n };\n\n // Fire internal changes\n useEffect(() => {\n const newValue = valueToBytes();\n if (newValue !== value) {\n onChange(newValue);\n }\n }, [unitIndex, displayValue]);\n\n // Update fields on external changes\n useEffect(() => {\n const curBytes = valueToBytes();\n if (value !== curBytes) {\n const newData = toFieldValues(value);\n setDisplayValue(newData.value);\n setUnitIndex(newData.unitIndex);\n }\n }, [value]);\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = (evt) => {\n const newValue = !!evt.target.value ? parseInt(evt.target.value) : null;\n if (!!newValue) {\n setDisplayValue(newValue);\n } else {\n setDisplayValue(undefined);\n }\n };\n\n return (\n <div style={{ display: 'flex' }}>\n <Input\n type=\"number\"\n {...inputProps}\n min={0}\n value={displayValue ?? ''}\n onChange={onInputChange}\n />\n <select\n className=\"ui select\"\n style={{ maxWidth: '100px' }}\n value={ByteUnits[unitIndex]}\n onChange={(evt) => {\n setUnitIndex(evt.target.selectedIndex);\n }}\n >\n {ByteUnits.map((unit, index) => (\n <option key={unit} value={unit}>\n {formatUnit(unit)}\n </option>\n ))}\n </select>\n </div>\n );\n};\n\ntype TCombTemplate = {\n renderInput: (locals: UI.FormLocals<any, number>) => React.ReactNode;\n};\n\nconst FileTypeField: TCombTemplate = {\n renderInput(locals) {\n return (\n <SizeField\n onChange={locals.onChange}\n value={!!locals.value ? parseInt(locals.value as any) : 0}\n moduleT={locals.context.formT}\n />\n );\n },\n};\n\nexport default t.form.Form.templates.textbox.clone(FileTypeField);\n","import * as React from 'react';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport FileIcon from 'components/icon/FileIcon';\nimport Icon from 'components/semantic/Icon';\nimport IconConstants from 'constants/IconConstants';\n\nconst searchTypeToFileItem = (searchType: UI.SearchTypeItem): API.FileItemType => {\n if (searchType.id === 'directory') {\n return {\n id: 'directory',\n str: '',\n files: 0,\n directories: 0,\n };\n }\n\n return {\n id: 'file',\n str: '',\n content_type: searchType.id as API.FileContentType,\n };\n};\n\ninterface SearchTypeIconProps {\n type: UI.SearchTypeItem;\n size?: string;\n}\n\nexport const SearchTypeIcon: React.FC<SearchTypeIconProps> = ({\n type,\n size = 'large',\n}) => {\n if (!type.id) {\n return <Icon icon={IconConstants.ANY} size={size} />;\n }\n\n return <FileIcon typeInfo={searchTypeToFileItem(type)} size={size} />;\n};\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, {\r\n DataProviderDecoratorChildProps,\r\n} 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\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 {\r\n id: 'directory',\r\n str: moduleT.translate('Directory'),\r\n },\r\n {\r\n id: 'file',\r\n str: moduleT.translate('File'),\r\n },\r\n];\r\n\r\nconst typeToMenuItem = (\r\n type: UI.SearchTypeItem,\r\n onChange: OnChangeHandler,\r\n selectedItem: UI.SearchTypeItem,\r\n) => (\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> = ({\r\n searchTypes,\r\n value,\r\n onChange,\r\n moduleT,\r\n}) => {\r\n const commonItems = getCommonItems(moduleT);\r\n const selectedItem =\r\n searchTypes.find((i) => value === i.id) ||\r\n commonItems.find((i) => value === i.id) ||\r\n 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<\r\n SearchTypeDropdownProps,\r\n DataProps\r\n>(SearchTypeDropdown, {\r\n urls: {\r\n searchTypes: SearchConstants.SEARCH_TYPES_URL,\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';\nimport t from 'utils/tcomb-form';\n\nimport * as UI from 'types/ui';\n\nimport { FormAccordion } from './AccordionField';\n\ntype TCombTemplate = {\n renderFieldset: (children: React.ReactNode, locals: UI.FormLocals) => React.ReactNode;\n renderLabel: (locals: UI.FormLocals) => React.ReactNode;\n};\n\nconst AccordionStruct: TCombTemplate = {\n renderFieldset(children, locals) {\n const { label, ...childLocals } = locals;\n return (\n <FormAccordion locals={locals}>\n {(t.form.Form.templates.struct as any).renderFieldset(children, childLocals)}\n </FormAccordion>\n );\n },\n renderLabel(locals) {\n return null;\n },\n};\n\nexport default t.form.Form.templates.struct.clone(AccordionStruct);\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, {\r\n FormFieldChangeHandler,\r\n FormSaveHandler,\r\n FormFieldSettingHandler,\r\n} from 'components/form/Form';\r\nimport { isValueSet, translateForm } from 'utils/FormUtils';\r\nimport Button from 'components/semantic/Button';\r\nimport AccordionStructField from './AccordionStructField';\r\n\r\ninterface Entry extends Pick<API.SearchQuery, 'file_type'>, UI.FormValueMap {\r\n hub_urls: string[] | null;\r\n size_limits: null | {\r\n min_size: number | null;\r\n max_size: number | null;\r\n };\r\n}\r\n\r\nexport interface SearchOptionsFormProps extends Pick<UI.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\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 {\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 {\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 {\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];\r\n\r\nconst removeEmptyProperties = (formValue: Entry) => {\r\n const ret = Object.keys(formValue).reduce((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 }, {} as Entry);\r\n\r\n return ret;\r\n};\r\n\r\nclass SearchOptionsForm extends PureComponent<SearchOptionsFormProps> {\r\n static readonly 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 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, moduleT } = this.props;\r\n return (\r\n <div>\r\n <Form<Entry>\r\n ref={(c) => {\r\n this.form = c!;\r\n }}\r\n onFieldChanged={this.onFieldChanged}\r\n onFieldSetting={this.onFieldSetting}\r\n onSave={this.onSave}\r\n fieldDefinitions={this.definitions}\r\n sourceValue={value} // This gets updated on every change at the moment...\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 {\r\n SearchOptionsForm,\r\n SearchOptionsFormProps,\r\n SearchOptions,\r\n} from './SearchOptionsForm';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Icon from 'components/semantic/Icon';\r\nimport HubConstants from 'constants/HubConstants';\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\nimport { isValueSet } from 'utils/FormUtils';\r\nimport { useLocation } from 'react-router';\r\n\r\ninterface SearchOptionsButtonProps\r\n extends Pick<SearchOptionsFormProps, 'onChange' | 'value'> {\r\n moduleT: UI.ModuleTranslator;\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\nconst removeEmptyProperties = (value: SearchOptions) => {\r\n const ret = Object.keys(value).reduce((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 }, {} as SearchOptions);\r\n\r\n return ret;\r\n};\r\n\r\nconst SearchOptionsButton: React.FC<Props> = ({ moduleT, onChange, value, hubs }) => {\r\n const location = useLocation();\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 // 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) =>\r\n hubs.find((hub) => hub.hub_url === url),\r\n );\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 }, [hubs]);\r\n\r\n const filterCount = !value\r\n ? null\r\n : Object.keys(value).filter((key) => {\r\n const curValue = value[key];\r\n return isValueSet(curValue);\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 onChange={onValueChanged}\r\n value={value}\r\n hubs={hubs}\r\n location={location}\r\n />\r\n )}\r\n </Popup>\r\n );\r\n};\r\n\r\nconst SearchOptionsButtonDecorated = DataProviderDecorator<\r\n SearchOptionsButtonProps,\r\n DataProps\r\n>(SearchOptionsButton, {\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, () =>\r\n refetchData(),\r\n );\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, () =>\r\n refetchData(),\r\n );\r\n },\r\n dataConverters: {\r\n hubs: (hubs: API.Hub[]) =>\r\n hubs.filter((hub) => hub.connect_state.id === API.HubConnectStateEnum.CONNECTED),\r\n },\r\n});\r\n\r\nexport { SearchOptionsButtonDecorated as SearchOptionsButton };\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 { usingMobileLayout } from 'utils/BrowserUtils';\r\nimport { SearchOptionsButton, SearchOptions } from './options-panel';\r\n\r\ninterface SearchInputProps {\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,\r\n defaultValue,\r\n running,\r\n handleSubmit,\r\n defaultOptions,\r\n}) => {\r\n const [options, setOptions] = useState<SearchOptions | null>(defaultOptions);\r\n\r\n const mobile = usingMobileLayout();\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 <SearchOptionsButton moduleT={moduleT} onChange={setOptions} value={options} />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport { SearchInput };\r\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\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 { useEffect, useState } from 'react';\r\nimport { WithTranslation } from 'react-i18next';\r\nimport { useLocation, useNavigate } from 'react-router';\r\n\r\nimport NotificationActions from 'actions/NotificationActions';\r\nimport SearchConstants from 'constants/SearchConstants';\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\nimport OfflineHubMessageDecorator from 'decorators/OfflineHubMessageDecorator';\r\nimport LoginStore from 'stores/reflux/LoginStore';\r\nimport { search as doSearch } from 'services/api/SearchApi';\r\nimport { getModuleT } from 'utils/TranslationUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport ResultTable from 'routes/Search/components/ResultTable';\r\n\r\nimport { SearchInput } from './SearchInput';\r\nimport { SearchOptions } from './options-panel';\r\nimport {\r\n loadSessionProperty,\r\n removeSessionProperty,\r\n saveSessionProperty,\r\n} from 'utils/BrowserUtils';\r\n\r\nimport '../style.css';\r\n\r\nconst RESULT_WAIT_PERIOD = 4000;\r\n\r\ninterface SearchProps {}\r\n\r\ninterface SearchDataProps extends DataProviderDecoratorChildProps, WithTranslation {\r\n instance: API.SearchInstance;\r\n}\r\n\r\nconst SEARCH_HUBS_KEY = 'search_hubs';\r\n\r\nconst loadHubOptions = () => {\r\n const options = loadSessionProperty<string[] | null>(SEARCH_HUBS_KEY, null);\r\n return options;\r\n};\r\n\r\nconst saveHubOptions = (hubs: string[] | null) => {\r\n if (!hubs?.length) {\r\n removeSessionProperty(SEARCH_HUBS_KEY);\r\n } else {\r\n saveSessionProperty(SEARCH_HUBS_KEY, hubs);\r\n }\r\n};\r\n\r\nconst Search: React.FC<SearchDataProps> = ({ instance, t }) => {\r\n const location = useLocation();\r\n const navigate = useNavigate();\r\n const [searchString, setSearchString] = useState('');\r\n const [running, setRunning] = useState<API.SearchResponse | null>(null);\r\n\r\n const parseOptions = (): SearchOptions | null => {\r\n const { query } = 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:\r\n query.file_type === SearchConstants.DEFAULT_SEARCH_TYPE ||\r\n query.file_type === 'tth'\r\n ? null\r\n : query.file_type,\r\n hub_urls: loadHubOptions(),\r\n };\r\n };\r\n\r\n const search = async (pattern: string, options?: SearchOptions) => {\r\n console.log('Searching');\r\n saveHubOptions(options?.hub_urls || null);\r\n\r\n const { hub_urls, size_limits, ...queryOptions } = options || {};\r\n try {\r\n const res = await doSearch(instance, {\r\n query: {\r\n pattern,\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 setSearchString(pattern);\r\n setRunning(res);\r\n } catch (error) {\r\n NotificationActions.apiError('Search failed', error);\r\n }\r\n };\r\n\r\n const checkLocationState = () => {\r\n const { state } = location;\r\n if (state?.searchString /* && state.searchString !== searchString*/) {\r\n search(state.searchString);\r\n\r\n // Avoid searching for it again\r\n navigate(location.pathname, { replace: true });\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n checkLocationState();\r\n\r\n const { query } = instance;\r\n if (!!query) {\r\n setSearchString(query.pattern);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n checkLocationState();\r\n }, [location.state?.searchString]);\r\n\r\n useEffect(() => {\r\n if (!running) {\r\n return;\r\n }\r\n\r\n const searchTimeout = window.setTimeout(() => {\r\n setRunning(null);\r\n }, running.queue_time + RESULT_WAIT_PERIOD);\r\n\r\n return () => {\r\n clearTimeout(searchTimeout);\r\n };\r\n }, [running]);\r\n\r\n const searchT = getModuleT(t, UI.Modules.SEARCH);\r\n return (\r\n <OfflineHubMessageDecorator\r\n offlineMessage={searchT.t(\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={searchT}\r\n running={!!running}\r\n defaultValue={searchString}\r\n handleSubmit={search}\r\n defaultOptions={parseOptions()}\r\n />\r\n <ResultTable\r\n searchString={searchString}\r\n running={!!running}\r\n searchT={searchT}\r\n instance={instance}\r\n />\r\n </div>\r\n </OfflineHubMessageDecorator>\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[]>(\r\n `${SearchConstants.INSTANCES_URL}`,\r\n );\r\n\r\n const instance = instances.find(\r\n (i) => i.owner === `session:${LoginStore.sessionId}:${OWNER_ID_SUFFIX}`,\r\n );\r\n if (!!instance) {\r\n return instance;\r\n }\r\n\r\n // Create new instance\r\n const instanceId = (\r\n await socket.post<{ id: number }>(SearchConstants.INSTANCES_URL, {\r\n owner_suffix: OWNER_ID_SUFFIX,\r\n expiration: 0,\r\n })\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","SearchTypeCreateAction","displayName","icon","CREATE","handler","navigate","SearchTypeEditActions","edit","EDIT","itemData","type","remove","REMOVE","confirmation","content","approveCaption","rejectCaption","filter","default_type","socket","delete","SEARCH_TYPES_URL","SearchTypeActionModule","moduleId","SETTINGS","SearchTypeEditActionMenu","moduleData","actions","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","DupeStrings","SHARE_PARTIAL","SHARE_FULL","QUEUE_PARTIAL","QUEUE_FULL","FINISHED_PARTIAL","FINISHED_FULL","SHARE_QUEUE","SHARE_FINISHED","QUEUE_FINISHED","SHARE_QUEUE_FINISHED","DupePaths","paths","className","map","path","FileItemInfoGrid","session","fileItem","user","downloadHandler","showPath","t","gridT","text","COMMON","formatSize","formatRelativeTime","Grid","columns","stackable","title","name","str","size","time","tth","dupe","caption","button","itemInfoGetter","contextElement","entity","hub","other","connect_state","searchDownloadHandler","itemInfo","downloadData","instance","SocketService","post","SearchConstants","MODULE_URL","UserResult","result","formatConnection","userIcon","directory","ids","remoteMenuId","MenuConstants","HINTED_USER","hub_names","connection","slots","FormattedIp","item","ip","resultSort","a","b","nicks","localeCompare","DataProviderDecorator","results","SEARCH","defaultValue","defaultValue_plural","count","length","style","width","slice","sort","cid","urls","parentResult","instanceId","get","INSTANCES_URL","ResultDialog","Component","itemDataGetter","itemId","this","props","render","RouteModal","closable","FileIcon","typeInfo","fullHeight","DownloadDialog","users","Decorated","ModalRouteDecorator","params","resultId","_viewName","_apiUrl","mixins","ViewStoreMixin","GroupedSearchResultActions","IconConstants","DETAILS","groupedResult","browseContent","FILELIST","location","createData","FilelistSessionActions","createSession","sessionStore","FilelistSessionStore","SearchActionModule","GroupedSearchResultActionMenu","SearchActionMenu","getUserCaption","replace","UserCell","cellData","rowDataGetter","resultUserGetter","rowData","NameCell","userGetter","GROUPED_SEARCH_RESULT","ResultTable","rowClassNameGetter","emptyRowsNodeGetter","running","searchString","searchT","Message","description","i18nKey","toI18nKey","isDemoInstance","TIP","translate","VirtualTable","store","SearchViewStore","textFilterProps","autoFocus","entityId","footerData","header","triggerIcon","columnKey","flexGrow","cell","hideWidth","submitHandler","historyId","history","refetchData","LocalSuggestField","data","value","trim","HistoryConstants","STRINGS_URL","loaderText","FormAccordion","children","label","active","Accordion","defaultActiveIndexes","undefined","Icon","DROPDOWN","fontWeight","HubSelectField","hubs","onChange","onlineHubs","CONNECTED","selectedUrls","hub_url","beforeUnchecked","Checkbox","HubIcon","identity","checked","includes","newValue","maxWidth","HubsSelectField","renderSelect","renderLabel","form","Form","templates","select","clone","toFieldValues","initialValue","unitIndex","SizeField","inputProps","moduleT","formatUnit","initialData","displayValue","setDisplayValue","useState","setUnitIndex","valueToBytes","ret","i","useEffect","curBytes","newData","display","Input","min","evt","target","parseInt","selectedIndex","unit","index","FileTypeField","renderInput","context","formT","textbox","SearchTypeIcon","searchType","files","directories","content_type","ANY","typeToMenuItem","selectedItem","MenuItemLink","onClick","DEFAULT_SEARCH_TYPE","SearchTypeDropdownDecorated","searchTypes","commonItems","getCommonItems","find","Dropdown","selection","AccordionStruct","renderFieldset","childLocals","struct","Fields","key","STRING","optional","LIST","item_type","STRUCT","definitions","NUMBER","SearchOptionsForm","PureComponent","constructor","super","onFieldChanged","hasChanges","formValue","Object","keys","reduce","reduced","save","onSave","changedFields","Promise","resolve","onFieldSetting","fieldOptions","assign","factory","Select","template","disableOrder","AccordionStructField","ref","c","fieldDefinitions","sourceValue","optionTitleFormatter","def","Button","disabled","marginTop","SearchOptionsButtonDecorated","onValueChanged","Array","isArray","hub_urls","selectedUrlsNew","url","filterCount","curValue","Popup","triggerClassName","trigger","OPTIONS","marginRight","color","EXPAND","contentUpdateTrigger","hide","HubConstants","SESSIONS_URL","onSocketConnected","addSocketListener","SESSION_CREATED","SESSION_UPDATED","SESSION_REMOVED","dataConverters","SearchInput","handleSubmit","defaultOptions","setOptions","mobile","placeholder","loading","SEARCH_HUBS_KEY","OWNER_ID_SUFFIX","setSearchString","setRunning","search","pattern","console","log","size_limits","queryOptions","res","query","priority","HIGH","error","NotificationActions","apiError","checkLocationState","state","pathname","searchTimeout","window","setTimeout","queue_time","clearTimeout","OfflineHubMessageDecorator","offlineMessage","excluded","min_size","max_size","file_type","parseOptions","owner","LoginStore","sessionId","owner_suffix","expiration"],"sourceRoot":""}