airdcpp-webui 2.11.2-beta.2 → 2.11.3-beta.2
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.
- package/LICENSE +21 -0
- package/dist/index.html +2 -2
- package/dist/js/285.14157e0f1f25fb9aaecd.chunk.js +2 -0
- package/dist/js/285.14157e0f1f25fb9aaecd.chunk.js.gz +0 -0
- package/dist/js/285.14157e0f1f25fb9aaecd.chunk.js.map +1 -0
- package/dist/js/334.dba054251a3e485f3ea9.chunk.js +2 -0
- package/dist/js/334.dba054251a3e485f3ea9.chunk.js.gz +0 -0
- package/dist/js/334.dba054251a3e485f3ea9.chunk.js.map +1 -0
- package/dist/js/424.44413ba27808d4072f7f.chunk.js +2 -0
- package/dist/js/424.44413ba27808d4072f7f.chunk.js.gz +0 -0
- package/dist/js/424.44413ba27808d4072f7f.chunk.js.map +1 -0
- package/dist/js/{668.ca79db34c1e147bd25d0.chunk.js → 668.2579506f7fa8bed8a452.chunk.js} +2 -2
- package/dist/js/668.2579506f7fa8bed8a452.chunk.js.gz +0 -0
- package/dist/js/668.2579506f7fa8bed8a452.chunk.js.map +1 -0
- package/dist/js/69.7b5fa94bd7c4e6f23ed6.chunk.js +2 -0
- package/dist/js/69.7b5fa94bd7c4e6f23ed6.chunk.js.gz +0 -0
- package/dist/js/69.7b5fa94bd7c4e6f23ed6.chunk.js.map +1 -0
- package/dist/js/{702.dd4be667774bce5de14f.chunk.js → 702.d36d38b2be52ab51c0a9.chunk.js} +1 -1
- package/dist/js/702.d36d38b2be52ab51c0a9.chunk.js.gz +0 -0
- package/dist/js/{702.dd4be667774bce5de14f.chunk.js.map → 702.d36d38b2be52ab51c0a9.chunk.js.map} +1 -1
- package/dist/js/760.83634ca054e04ff6c7e2.chunk.js +3 -0
- package/dist/js/{760.5448a03d335f92bedb53.chunk.js.LICENSE.txt → 760.83634ca054e04ff6c7e2.chunk.js.LICENSE.txt} +0 -0
- package/dist/js/760.83634ca054e04ff6c7e2.chunk.js.gz +0 -0
- package/dist/js/760.83634ca054e04ff6c7e2.chunk.js.map +1 -0
- package/dist/js/favorite-hubs.f8dc4d8768878d9cab6a.chunk.js +2 -0
- package/dist/js/favorite-hubs.f8dc4d8768878d9cab6a.chunk.js.gz +0 -0
- package/dist/js/favorite-hubs.f8dc4d8768878d9cab6a.chunk.js.map +1 -0
- package/dist/js/filelists.c550cdaa211edb6f733f.chunk.js +2 -0
- package/dist/js/filelists.c550cdaa211edb6f733f.chunk.js.gz +0 -0
- package/dist/js/filelists.c550cdaa211edb6f733f.chunk.js.map +1 -0
- package/dist/js/files.51c49d6a2825cbc64879.chunk.js +2 -0
- package/dist/js/files.51c49d6a2825cbc64879.chunk.js.gz +0 -0
- package/dist/js/files.51c49d6a2825cbc64879.chunk.js.map +1 -0
- package/dist/js/home.895154334c98dbe0f183.chunk.js +3 -0
- package/dist/js/{home.727a64f6586ed95a66bb.chunk.js.LICENSE.txt → home.895154334c98dbe0f183.chunk.js.LICENSE.txt} +0 -0
- package/dist/js/home.895154334c98dbe0f183.chunk.js.gz +0 -0
- package/dist/js/home.895154334c98dbe0f183.chunk.js.map +1 -0
- package/dist/js/hubs.42526e43270139eb1849.chunk.js +2 -0
- package/dist/js/hubs.42526e43270139eb1849.chunk.js.gz +0 -0
- package/dist/js/hubs.42526e43270139eb1849.chunk.js.map +1 -0
- package/dist/js/locales/{ca.78b3bea781886ff158b4.chunk.js → ca.ed09d3a3d4bcca929ba1.chunk.js} +0 -0
- package/dist/js/locales/{ca.78b3bea781886ff158b4.chunk.js.gz → ca.ed09d3a3d4bcca929ba1.chunk.js.gz} +0 -0
- package/dist/js/locales/{da.6f097ed425797ab32cb3.chunk.js → da.6f60a77e9ef082dd3bf4.chunk.js} +0 -0
- package/dist/js/locales/{da.6f097ed425797ab32cb3.chunk.js.gz → da.6f60a77e9ef082dd3bf4.chunk.js.gz} +0 -0
- package/dist/js/locales/{de.fce9df327aeebd67e9a1.chunk.js → de.3b7d3665460384259e82.chunk.js} +0 -0
- package/dist/js/locales/{de.fce9df327aeebd67e9a1.chunk.js.gz → de.3b7d3665460384259e82.chunk.js.gz} +0 -0
- package/dist/js/locales/{el.c325cc8141993f493ad0.chunk.js → el.598573d2a5ed18804fe0.chunk.js} +0 -0
- package/dist/js/locales/{el.c325cc8141993f493ad0.chunk.js.gz → el.598573d2a5ed18804fe0.chunk.js.gz} +0 -0
- package/dist/js/locales/{en.ebb20d0566fd8e7cb3b8.chunk.js → en.f0fe75dca201449e5e47.chunk.js} +0 -0
- package/dist/js/locales/{en.ebb20d0566fd8e7cb3b8.chunk.js.gz → en.f0fe75dca201449e5e47.chunk.js.gz} +0 -0
- package/dist/js/locales/es.645f0fc5dd1cb8c8c5e6.chunk.js +1 -0
- package/dist/js/locales/es.645f0fc5dd1cb8c8c5e6.chunk.js.gz +0 -0
- package/dist/js/locales/{eu.13252b0f7f7534b39e34.chunk.js → eu.7734fc077f26418d6b32.chunk.js} +0 -0
- package/dist/js/locales/{eu.13252b0f7f7534b39e34.chunk.js.gz → eu.7734fc077f26418d6b32.chunk.js.gz} +0 -0
- package/dist/js/locales/{fi.1641c49d1e7154261df8.chunk.js → fi.d1f8a5f4048236243b0f.chunk.js} +0 -0
- package/dist/js/locales/{fi.1641c49d1e7154261df8.chunk.js.gz → fi.d1f8a5f4048236243b0f.chunk.js.gz} +0 -0
- package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js +1 -0
- package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js.gz +0 -0
- package/dist/js/locales/{hu.5aa0843ba5ebefad56b2.chunk.js → hu.d0d2c38a03a3b38c2bc5.chunk.js} +0 -0
- package/dist/js/locales/{hu.5aa0843ba5ebefad56b2.chunk.js.gz → hu.d0d2c38a03a3b38c2bc5.chunk.js.gz} +0 -0
- package/dist/js/locales/{it.63acad3d71352720e323.chunk.js → it.0c911d75c50ea83190ad.chunk.js} +0 -0
- package/dist/js/locales/{it.63acad3d71352720e323.chunk.js.gz → it.0c911d75c50ea83190ad.chunk.js.gz} +0 -0
- package/dist/js/locales/{nl.a23ef3d4aff66ca3b215.chunk.js → nl.36d288d75b3d3cbabf11.chunk.js} +0 -0
- package/dist/js/locales/{nl.a23ef3d4aff66ca3b215.chunk.js.gz → nl.36d288d75b3d3cbabf11.chunk.js.gz} +0 -0
- package/dist/js/locales/{no.da135b9c1614a4616b47.chunk.js → no.8f2f465d5f785650175d.chunk.js} +0 -0
- package/dist/js/locales/{no.da135b9c1614a4616b47.chunk.js.gz → no.8f2f465d5f785650175d.chunk.js.gz} +0 -0
- package/dist/js/locales/{pl.36e1b3baf978ef6c184a.chunk.js → pl.06e51d7d7b09ba14714d.chunk.js} +0 -0
- package/dist/js/locales/{pl.36e1b3baf978ef6c184a.chunk.js.gz → pl.06e51d7d7b09ba14714d.chunk.js.gz} +0 -0
- package/dist/js/locales/{pt-br.57dff49b32efd65d6825.chunk.js → pt-br.9d19d92899e8c0917c66.chunk.js} +0 -0
- package/dist/js/locales/{pt-br.57dff49b32efd65d6825.chunk.js.gz → pt-br.9d19d92899e8c0917c66.chunk.js.gz} +0 -0
- package/dist/js/locales/{pt.ab93507031a40179f7c7.chunk.js → pt.4390db3955db29b0e7dd.chunk.js} +0 -0
- package/dist/js/locales/{pt.ab93507031a40179f7c7.chunk.js.gz → pt.4390db3955db29b0e7dd.chunk.js.gz} +0 -0
- package/dist/js/locales/{ro.551cd0a17581b2159112.chunk.js → ro.705fcd327263fcf419bf.chunk.js} +0 -0
- package/dist/js/locales/{ro.551cd0a17581b2159112.chunk.js.gz → ro.705fcd327263fcf419bf.chunk.js.gz} +0 -0
- package/dist/js/locales/{ru.cbf29ad6736a21d83bcb.chunk.js → ru.8ab7e1c0d9eee7aa7afb.chunk.js} +0 -0
- package/dist/js/locales/{ru.cbf29ad6736a21d83bcb.chunk.js.gz → ru.8ab7e1c0d9eee7aa7afb.chunk.js.gz} +0 -0
- package/dist/js/locales/{sv.d33f4b4be982814b6343.chunk.js → sv.be546e605910932db11f.chunk.js} +0 -0
- package/dist/js/locales/{sv.d33f4b4be982814b6343.chunk.js.gz → sv.be546e605910932db11f.chunk.js.gz} +0 -0
- package/dist/js/locales/{tr.88e97bf59131df380c5a.chunk.js → tr.25a0d0f19e007e2febc9.chunk.js} +0 -0
- package/dist/js/locales/{tr.88e97bf59131df380c5a.chunk.js.gz → tr.25a0d0f19e007e2febc9.chunk.js.gz} +0 -0
- package/dist/js/locales/uk_UA.61073eae675491639925.chunk.js +1 -0
- package/dist/js/locales/uk_UA.61073eae675491639925.chunk.js.gz +0 -0
- package/dist/js/locales/{zh_CN.a9edec208d0cfe49d94b.chunk.js → zh_CN.4b75674e4815a965ccea.chunk.js} +0 -0
- package/dist/js/locales/{zh_CN.a9edec208d0cfe49d94b.chunk.js.gz → zh_CN.4b75674e4815a965ccea.chunk.js.gz} +0 -0
- package/dist/js/main.51b1144fdbc0a681eb6c.entry.js +3 -0
- package/dist/js/{main.c01c26460331633a96e2.entry.js.LICENSE.txt → main.51b1144fdbc0a681eb6c.entry.js.LICENSE.txt} +0 -0
- package/dist/js/main.51b1144fdbc0a681eb6c.entry.js.gz +0 -0
- package/dist/js/main.51b1144fdbc0a681eb6c.entry.js.map +1 -0
- package/dist/js/messages.6f74e67a600c48f367ad.chunk.js +2 -0
- package/dist/js/messages.6f74e67a600c48f367ad.chunk.js.gz +0 -0
- package/dist/js/messages.6f74e67a600c48f367ad.chunk.js.map +1 -0
- package/dist/js/queue.82a405ba14b60974cb0f.chunk.js +2 -0
- package/dist/js/queue.82a405ba14b60974cb0f.chunk.js.gz +0 -0
- package/dist/js/queue.82a405ba14b60974cb0f.chunk.js.map +1 -0
- package/dist/js/search.af59b1b20b4d7194457b.chunk.js +2 -0
- package/dist/js/search.af59b1b20b4d7194457b.chunk.js.gz +0 -0
- package/dist/js/search.af59b1b20b4d7194457b.chunk.js.map +1 -0
- package/dist/js/settings.b543eade40a723e95c77.chunk.js +2 -0
- package/dist/js/settings.b543eade40a723e95c77.chunk.js.gz +0 -0
- package/dist/js/settings.b543eade40a723e95c77.chunk.js.map +1 -0
- package/dist/js/share.f06abf75f7f2a6afc1b3.chunk.js +2 -0
- package/dist/js/share.f06abf75f7f2a6afc1b3.chunk.js.gz +0 -0
- package/dist/js/share.f06abf75f7f2a6afc1b3.chunk.js.map +1 -0
- package/dist/js/{system-log.45dba574bcb91efd176c.chunk.js → system-log.b9763d1c0f5cf5966f21.chunk.js} +2 -2
- package/dist/js/system-log.b9763d1c0f5cf5966f21.chunk.js.gz +0 -0
- package/dist/js/system-log.b9763d1c0f5cf5966f21.chunk.js.map +1 -0
- package/dist/js/transfers.22e0a37c676d2a0996a8.chunk.js +2 -0
- package/dist/js/transfers.22e0a37c676d2a0996a8.chunk.js.gz +0 -0
- package/dist/js/transfers.22e0a37c676d2a0996a8.chunk.js.map +1 -0
- package/dist/sw.js +1 -1
- package/dist/sw.js.gz +0 -0
- package/package.json +65 -64
- package/dist/js/285.744e520b1611ce9c52a5.chunk.js +0 -2
- package/dist/js/285.744e520b1611ce9c52a5.chunk.js.gz +0 -0
- package/dist/js/285.744e520b1611ce9c52a5.chunk.js.map +0 -1
- package/dist/js/334.27c2467ccb3a5cb23acf.chunk.js +0 -2
- package/dist/js/334.27c2467ccb3a5cb23acf.chunk.js.gz +0 -0
- package/dist/js/334.27c2467ccb3a5cb23acf.chunk.js.map +0 -1
- package/dist/js/424.83f0cedf9d07b9d54fcb.chunk.js +0 -2
- package/dist/js/424.83f0cedf9d07b9d54fcb.chunk.js.gz +0 -0
- package/dist/js/424.83f0cedf9d07b9d54fcb.chunk.js.map +0 -1
- package/dist/js/668.ca79db34c1e147bd25d0.chunk.js.gz +0 -0
- package/dist/js/668.ca79db34c1e147bd25d0.chunk.js.map +0 -1
- package/dist/js/69.779bd39a66fa5ea5248b.chunk.js +0 -2
- package/dist/js/69.779bd39a66fa5ea5248b.chunk.js.gz +0 -0
- package/dist/js/69.779bd39a66fa5ea5248b.chunk.js.map +0 -1
- package/dist/js/702.dd4be667774bce5de14f.chunk.js.gz +0 -0
- package/dist/js/760.5448a03d335f92bedb53.chunk.js +0 -3
- package/dist/js/760.5448a03d335f92bedb53.chunk.js.gz +0 -0
- package/dist/js/760.5448a03d335f92bedb53.chunk.js.map +0 -1
- package/dist/js/favorite-hubs.82de31826d6a7541ec24.chunk.js +0 -2
- package/dist/js/favorite-hubs.82de31826d6a7541ec24.chunk.js.gz +0 -0
- package/dist/js/favorite-hubs.82de31826d6a7541ec24.chunk.js.map +0 -1
- package/dist/js/filelists.7a9e00969dcca088a27c.chunk.js +0 -2
- package/dist/js/filelists.7a9e00969dcca088a27c.chunk.js.gz +0 -0
- package/dist/js/filelists.7a9e00969dcca088a27c.chunk.js.map +0 -1
- package/dist/js/files.bb297a4f890216386a57.chunk.js +0 -2
- package/dist/js/files.bb297a4f890216386a57.chunk.js.gz +0 -0
- package/dist/js/files.bb297a4f890216386a57.chunk.js.map +0 -1
- package/dist/js/home.727a64f6586ed95a66bb.chunk.js +0 -3
- package/dist/js/home.727a64f6586ed95a66bb.chunk.js.gz +0 -0
- package/dist/js/home.727a64f6586ed95a66bb.chunk.js.map +0 -1
- package/dist/js/hubs.8b51f0869cdfed35644e.chunk.js +0 -2
- package/dist/js/hubs.8b51f0869cdfed35644e.chunk.js.gz +0 -0
- package/dist/js/hubs.8b51f0869cdfed35644e.chunk.js.map +0 -1
- package/dist/js/locales/es.784f05fd27d172e4ff10.chunk.js +0 -1
- package/dist/js/locales/es.784f05fd27d172e4ff10.chunk.js.gz +0 -0
- package/dist/js/locales/fr.ede93bff1e1571d56404.chunk.js +0 -1
- package/dist/js/locales/fr.ede93bff1e1571d56404.chunk.js.gz +0 -0
- package/dist/js/locales/uk_UA.2b396266bb670b4b7a59.chunk.js +0 -1
- package/dist/js/locales/uk_UA.2b396266bb670b4b7a59.chunk.js.gz +0 -0
- package/dist/js/main.c01c26460331633a96e2.entry.js +0 -3
- package/dist/js/main.c01c26460331633a96e2.entry.js.gz +0 -0
- package/dist/js/main.c01c26460331633a96e2.entry.js.map +0 -1
- package/dist/js/messages.cfb23ba34e3a288ca289.chunk.js +0 -2
- package/dist/js/messages.cfb23ba34e3a288ca289.chunk.js.gz +0 -0
- package/dist/js/messages.cfb23ba34e3a288ca289.chunk.js.map +0 -1
- package/dist/js/queue.0e532f2a56e464d1626b.chunk.js +0 -2
- package/dist/js/queue.0e532f2a56e464d1626b.chunk.js.gz +0 -0
- package/dist/js/queue.0e532f2a56e464d1626b.chunk.js.map +0 -1
- package/dist/js/search.ef2d64870dc65f549d8c.chunk.js +0 -2
- package/dist/js/search.ef2d64870dc65f549d8c.chunk.js.gz +0 -0
- package/dist/js/search.ef2d64870dc65f549d8c.chunk.js.map +0 -1
- package/dist/js/settings.b3fd7918efe3c8bfae88.chunk.js +0 -2
- package/dist/js/settings.b3fd7918efe3c8bfae88.chunk.js.gz +0 -0
- package/dist/js/settings.b3fd7918efe3c8bfae88.chunk.js.map +0 -1
- package/dist/js/share.c0cdc71a867839f5c8b3.chunk.js +0 -2
- package/dist/js/share.c0cdc71a867839f5c8b3.chunk.js.gz +0 -0
- package/dist/js/share.c0cdc71a867839f5c8b3.chunk.js.map +0 -1
- package/dist/js/system-log.45dba574bcb91efd176c.chunk.js.gz +0 -0
- package/dist/js/system-log.45dba574bcb91efd176c.chunk.js.map +0 -1
- package/dist/js/transfers.4ed15c9e5e62fe968fbc.chunk.js +0 -2
- package/dist/js/transfers.4ed15c9e5e62fe968fbc.chunk.js.gz +0 -0
- package/dist/js/transfers.4ed15c9e5e62fe968fbc.chunk.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[158],{60725:(e,s,n)=>{n.d(s,{Z:()=>a});var t=n(94015),i=n.n(t),o=n(23645),r=n.n(o)()(i());r.push([e.id,".ccpm-state {\r\n display: flex;\r\n}\r\n\r\n.ccpm-state > i {\r\n align-self: center;\r\n}","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Messages/style.css"],names:[],mappings:"AAAA;EACE,aAAa;AACf;;AAEA;EACE,kBAAkB;AACpB",sourcesContent:[".ccpm-state {\r\n display: flex;\r\n}\r\n\r\n.ccpm-state > i {\r\n align-self: center;\r\n}"],sourceRoot:""}]);const a=r},203:(e,s,n)=>{n.d(s,{Z:()=>c});var t=n(85893),i=n(55019),o=n(47021),r=n(54578),a=n(4333);function c(e){return{itemNameGetter:e=>e.user.nicks,itemStatusGetter(e){const{flags:s}=e.user;return(0,i.zg)(s)},itemHeaderDescriptionGetter:e=>e.user.hub_names,itemHeaderIconGetter:e=>(0,t.jsx)(r.Z,{flags:e.user.flags},void 0),itemHeaderTitleGetter(s,n,i){const{user:r}=s;return(0,t.jsx)(o.Ie,Object.assign({user:r,ids:e,remoteMenuId:a.Z.HINTED_USER},{children:i}),void 0)}}}},30916:(e,s,n)=>{n.r(s),n.d(s,{default:()=>ce});var t=n(85893),i=n(67294),o=n(10907),r=n(203),a=n(40279),c=n(14695),d=n(518),l=n(48117),u=n(50566),p=n(38982),S=n(76249),h=n(32347);const E={connectCCPM:{displayName:"Connect",access:S.PS.PRIVATE_CHAT_EDIT,icon:l.Z.PLAY,handler:({data:e})=>d.Z.post(`${c.Z.SESSIONS_URL}/${e.id}/ccpm`),filter:e=>e.ccpm_state.id===S.ZY.DISCONNECTED},disconnectCCPM:{access:S.PS.PRIVATE_CHAT_EDIT,displayName:"Disconnect",icon:l.Z.REMOVE,handler:({data:e})=>d.Z.delete(`${c.Z.SESSIONS_URL}/${e.id}/ccpm`),filter:e=>e.ccpm_state.id===S.ZY.CONNECTED}},A=(0,p.Z)((0,u.Z)(E,c.Z.SESSIONS_URL,S.PS.PRIVATE_CHAT_EDIT),c.Z.SESSIONS_URL,S.PS.PRIVATE_CHAT_EDIT),m={moduleId:h.jv.MESSAGES,actions:A};var C=n(6654),Z=n(3267),v=n(15479),I=n(78522);const T=e=>a.Z.getSession(e.user.cid);class _ extends i.Component{constructor(){super(...arguments),this.handleSubmit=e=>{C.Z.createSession(this.props.location,e,a.Z)},this.recentUserRender=e=>(0,t.jsx)("a",Object.assign({onClick:s=>this.handleSubmit(e.user)},{children:e.user.nicks}),void 0)}render(){const{sessionT:e}=this.props;return(0,t.jsxs)("div",Object.assign({className:"private chat session new"},{children:[(0,t.jsx)(I.v,{onChange:this.handleSubmit,offlineMessage:e.t("offlineMessage","You must to be connected to at least one hub in order to send private messages"),isClearable:!1,autoFocus:!0},void 0),(0,t.jsx)(Z.Z,{entryType:v.WJ.PRIVATE_CHAT,hasSession:T,entryTitleRenderer:this.recentUserRender,entryIcon:l.Z.MESSAGES_PLAIN},void 0)]}),void 0)}}const f=_;var g=n(40479),b=n(88998),O=n(54883),N=n(47021),P=n(68325);const x=(e,s)=>{const{translate:n}=s;switch(e){case S.ZY.CONNECTED:return n("Direct encrypted channel established");case S.ZY.CONNECTING:return(0,t.jsx)(O.Z,{size:"mini",inline:!0,text:n("Establishing connection...")},void 0);case S.ZY.DISCONNECTED:return n("Direct encrypted channel available");default:return null}},y=({session:e,sessionT:s})=>{const{flags:n}=e.user;if(-1===n.indexOf("ccpm"))return null;const i=e.ccpm_state.id;return i===S.ZY.DISCONNECTED&&-1!==n.indexOf("offline")?null:(0,t.jsx)(b.C,{children:(0,t.jsxs)("div",Object.assign({className:"ccpm-state"},{children:[(0,t.jsx)(P.Z,{encryption:e.ccpm_state.encryption,alwaysVisible:!0,boundary:".session-container"},void 0),(0,t.jsx)(N.PC,{caption:x(i,s),actions:m,ids:["disconnectCCPM","connectCCPM"],itemData:e},void 0)]}),void 0)},void 0)};var j=n(10293),D=n.n(j),R=n(41143),M=n.n(R),w=n(14936),H=n(94897),U=n(46614);const G=D().createStore({scroll:(0,U.$)(),onSocketConnected(e){M()(!this.hasMessages(),"No existing private messages should exist on socket connect"),M()(!this.hasInitializedSessions(),"No initialized private message sessions should exist on socket connect");const s=c.Z.MODULE_URL;e(s,c.Z.MESSAGE,this._onChatMessage),e(s,c.Z.STATUS,this._onStatusMessage),e(s,c.Z.SESSION_REMOVED,this._onSessionRemoved),e(s,c.Z.SESSION_UPDATED,this._onSessionUpdated)}}),k=(0,w.Z)(G,C.Z,H.Z.PRIVATE_CHAT_VIEW);var V=n(74225),L=n(4333);class Y extends i.Component{constructor(){super(...arguments),this.handleFileUpload=e=>{const{cid:s,hub_url:n,flags:t}=this.props.session.user,i=-1===t.indexOf("nmdc")&&-1===t.indexOf("bot");return(0,V.Pd)(e,n,i?s:void 0)}}render(){const{session:e,sessionApi:s,sessionT:n,uiActions:i}=this.props;return(0,t.jsxs)("div",Object.assign({className:"private chat session"},{children:[(0,t.jsx)(g.Z,{chatAccess:S.PS.PRIVATE_CHAT_SEND,chatActions:i,chatApi:C.Z,sessionApi:s,messageStore:k,session:e,handleFileUpload:this.handleFileUpload,highlightRemoteMenuId:L.Z.PRIVATE_CHAT_MESSAGE_HIGHLIGHT},void 0),(0,t.jsx)(y,{session:e,sessionT:n},void 0)]}),void 0)}}Y.displayName="PrivateChatSession";const z=Y;var $=n(93379),F=n.n($),B=n(7795),J=n.n(B),W=n(90569),q=n.n(W),K=n(3565),Q=n.n(K),X=n(19216),ee=n.n(X),se=n(44589),ne=n.n(se),te=n(60725),ie={};ie.styleTagTransform=ne(),ie.setAttributes=Q(),ie.insert=q().bind(null,"head"),ie.domAPI=J(),ie.insertStyleElement=ee(),F()(te.Z,ie),te.Z&&te.Z.locals&&te.Z.locals;var oe=n(93101),re=n(8717);const ae=["clear"],ce=(0,oe.J)((e=>{const{match:s,t:n}=e,i=function(e,s){var n={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&s.indexOf(t)<0&&(n[t]=e[t]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(t=Object.getOwnPropertySymbols(e);i<t.length;i++)s.indexOf(t[i])<0&&Object.prototype.propertyIsEnumerable.call(e,t[i])&&(n[t[i]]=e[t[i]])}return n}(e,["match","t"]);return(0,t.jsx)(o.Z,Object.assign({activeId:s.params.id,baseUrl:"messages",newCaption:n((0,re.zS)("new",h.jv.MESSAGES),"New session"),newDescription:n((0,re.zS)("newDesc",h.jv.MESSAGES),"Open a new private chat session"),newIcon:l.Z.MESSAGES_PLAIN,unreadInfoStore:a.Z,editAccess:S.PS.PRIVATE_CHAT_EDIT,uiActions:m,sessionApi:C.Z,actionIds:ae,sessionItemLayout:z,newLayout:f,t:n},(0,r.Z)(["browse","ignore","unignore"]),i),void 0)}),a.Z)}}]);
|
|
2
|
-
//# sourceMappingURL=messages.cfb23ba34e3a288ca289.chunk.js.map
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"js/messages.cfb23ba34e3a288ca289.chunk.js","mappings":"kKAGIA,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACC,EAAOC,GAAI,gGAAiG,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,4DAA4D,MAAQ,GAAG,SAAW,8CAA8C,eAAiB,CAAC,iGAAiG,WAAa,MAEra,W,yFCMe,SAAS,EAAwDC,GAiC9E,MAhCiE,CAC/DC,eAAeC,GACNA,EAAQC,KAAKC,MAGtBC,iBAAiBH,GACf,MAAM,MAAEI,GAAUJ,EAAQC,KAC1B,OAAO,QAAwBG,IAGjCC,4BAA4BL,GACnBA,EAAQC,KAAKK,UAGtBC,qBAAqBP,IACZ,SAAC,IAAQ,CAACI,MAAQJ,EAAQC,KAAKG,YAAK,GAG7CI,sBAAsBR,EAASS,EAAUC,GACvC,MAAM,KAAET,GAASD,EACjB,OACE,SAAC,KAAQ,eACPC,KAAOA,EACPU,IAAMb,EACNc,aAAe,iBAAyB,UAEtCF,SAAU,O,mLC5BtB,MAWMG,EAAyD,CAC7DC,YAAa,CACXC,YAAa,UACbC,OAAQ,uBACRC,KAAMC,EAAA,OACNC,QAhByD,EAAGC,KAAMpB,KAC7DqB,EAAA,OAAmB,GAAGC,EAAA,kBAAqCtB,EAAQH,WAgBxE0B,OARsBH,GAA0BA,EAAKI,WAAW3B,KAAO,mBAUzE4B,eAAgB,CACdT,OAAQ,uBACRD,YAAa,aACbE,KAAMC,EAAA,SACNC,QAnB4D,EAAGC,KAAMpB,KAChEqB,EAAA,SAAqB,GAAGC,EAAA,kBAAqCtB,EAAQH,WAmB1E0B,OAhBmBH,GAA0BA,EAAKI,WAAW3B,KAAO,iBAqBlE6B,GAA8B,EAAAC,EAAA,IAClC,EAAAC,EAAA,GACEf,EACAS,EAAA,eACA,wBAEFA,EAAA,eACA,wBAIF,GACEO,SAAU,cACVC,QAASJ,G,8CCtCX,MAAMK,EAAcC,GACXC,EAAA,aAAmCD,EAAM/B,KAAMiC,KAGxD,MAAMC,UAAmB,EAAAC,UAAzB,c,oBACE,KAAAC,aAAgBpC,IACd,kBAAiCqC,KAAKC,MAAM9B,SAAUR,EAAMgC,EAAA,IAG9D,KAAAO,iBAAoBR,IAEhB,4BAAGS,QAAUC,GAAKJ,KAAKD,aAAaL,EAAM/B,OAAM,UAC5C+B,EAAM/B,KAAMC,aAAK,GAKzByC,SACE,MAAM,SAAEC,GAAaN,KAAKC,MAC1B,OACE,+BAAKM,UAAU,4BAA0B,YACvC,SAAC,IAAe,CACdC,SAAWR,KAAKD,aAChBU,eAAiBH,EAASI,EACxB,iBACA,kFAEFC,aAAc,EACdC,WAAY,QAAI,IAElB,SAACC,EAAA,EAAY,CACXC,UAAY,kBACZrB,WAAaA,EACbsB,mBAAqBf,KAAKE,iBAC1Bc,UAAYpC,EAAA,uBAA4B,WACxC,IAMV,U,2DC5CA,MAAMqC,EAAa,CAACC,EAA0BZ,KAC5C,MAAM,UAAEa,GAAcb,EACtB,OAAQY,GACR,KAAK,eAA6B,OAAOC,EAAU,wCACnD,KAAK,gBAA8B,OACjC,SAACC,EAAA,EAAM,CACLC,KAAK,OACLC,QAAS,EACTC,KAAOJ,EAAU,oCAA6B,GAGlD,KAAK,kBAAgC,OAAOA,EAAU,sCACtD,QAAS,OAAO,OAwClB,EA9B4C,EAAGzD,QAAAA,EAAS4C,SAAAA,MACtD,MAAM,MAAExC,GAAUJ,EAAQC,KAC1B,IAA+B,IAA3BG,EAAM0D,QAAQ,QAChB,OAAO,KAGT,MAAMN,EAAQxD,EAAQwB,WAAW3B,GACjC,OAAI2D,IAAU,oBAAgE,IAA9BpD,EAAM0D,QAAQ,WACrD,MAIP,SAACC,EAAA,EAAa,WACZ,+BAAKlB,UAAU,cAAY,YACzB,SAACmB,EAAA,EAAe,CACdC,WAAajE,EAAQwB,WAAWyC,WAChCC,eAAgB,EAChBC,SAAS,2BAAoB,IAE/B,SAAC,KAAU,CACTC,QAAUb,EAAWC,EAAOZ,GAC5Bd,QAAU,EACVnB,IAAK,CAAE,iBAAkB,eACzB0D,SAAWrE,QAAO,WAClB,SACE,I,6EC9CZ,MAAMsE,EAA0B,gBAAmB,CACjDC,QAAQ,EAAAC,EAAA,KAERC,kBAAkBC,GAChB,KAAWpC,KAAKqC,cAAe,+DAC/B,KAAWrC,KAAKsC,yBAA0B,0EAE1C,MAAMC,EAAMvD,EAAA,aACZoD,EAAkBG,EAAKvD,EAAA,UAA8BgB,KAAKwC,gBAC1DJ,EAAkBG,EAAKvD,EAAA,SAA6BgB,KAAKyC,kBAEzDL,EAAkBG,EAAKvD,EAAA,kBAAsCgB,KAAK0C,mBAClEN,EAAkBG,EAAKvD,EAAA,kBAAsCgB,KAAK2C,sBAItE,GAAe,EAAAC,EAAA,GAAsBZ,EAAyB,IAAoBa,EAAA,qB,yBCVlF,MAAMC,UAA2B,EAAAhD,UAAjC,c,oBAGE,KAAAiD,iBAAoBC,IAClB,MAAM,IAAEpD,EAAG,QAAEqD,EAAO,MAAEnF,GAAUkC,KAAKC,MAAMvC,QAAQC,KAE7CuF,GAAuC,IAA3BpF,EAAM0D,QAAQ,UAA4C,IAA1B1D,EAAM0D,QAAQ,OAChE,OAAO,QAAcwB,EAAMC,EAASC,EAAYtD,OAAMuD,IAGxD9C,SACE,MAAM,QAAE3C,EAAO,WAAE0F,EAAU,SAAE9C,EAAQ,UAAE+C,GAAcrD,KAAKC,MAC1D,OACE,+BAAKM,UAAU,wBAAsB,YACnC,SAAC+C,EAAA,EAAU,CACTC,WAAa,uBACbC,YAAcH,EACdI,QAAU,IACVL,WAAaA,EACbM,aAAe,EACfhG,QAAUA,EACVqF,iBAAmB/C,KAAK+C,iBACxBY,sBAAwBC,EAAA,uCAA4C,IAGtE,SAACC,EAAa,CACZnG,QAAUA,EACV4C,SAAWA,QAAQ,WACnB,IA3BD,EAAA7B,YAAc,qBAiCvB,U,0IC3CIqF,GAAU,GAEdA,GAAQC,kBAAoB,KAC5BD,GAAQE,cAAgB,IAElBF,GAAQG,OAAS,SAAc,KAAM,QAE3CH,GAAQI,OAAS,IACjBJ,GAAQK,mBAAqB,KAEhB,IAAI,KAASL,IAKJ,MAAW,aAAiB,Y,2BCHlD,MAAMM,GAAiB,CAAE,SAyBzB,IAAe,EAAAC,GAAA,IAvBiEpE,IAC9E,MAAM,MAAEqE,EAAK,EAAE5D,GAAgBT,EAAVsE,E,yUAAK,CAAKtE,EAAzB,eACN,OACE,SAACuE,EAAA,EAAa,eACZC,SAAWH,EAAMI,OAAOnH,GACxBoH,QAAQ,WACRC,WAAalE,GAAE,SAAU,MAAO,eAAsB,eACtDmE,eAAiBnE,GAAE,SAAU,UAAW,eAAsB,mCAC9DoE,QAAUlG,EAAA,iBACVmG,gBAAkBpF,EAAA,EAClBqF,WAAa,uBACb3B,UAAY,EACZD,WAAa,IACb6B,UAAYb,GACZc,kBAAoB,EACpBC,UAAY,EACZzE,EAAIA,IACC,EAAA0E,EAAA,GAAyB,CAAE,SAAU,SAAU,aAC/Cb,QAAK,KAKkC5E,EAAA","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/routes/Messages/style.css","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/UserItemHandlerDecorator.tsx","webpack://airdcpp-webui/./src/actions/ui/PrivateChatActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Messages/components/MessageNew.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Messages/components/MessageFooter.tsx","webpack://airdcpp-webui/./src/stores/PrivateChatMessageStore.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Messages/components/PrivateChatSession.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Messages/style.css?55a2","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Messages/components/Messages.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.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, \".ccpm-state {\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.ccpm-state > i {\\r\\n align-self: center;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Messages/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,aAAa;AACf;;AAEA;EACE,kBAAkB;AACpB\",\"sourcesContent\":[\".ccpm-state {\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.ccpm-state > i {\\r\\n align-self: center;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { userOnlineStatusToColor } from 'utils/TypeConvert';\r\nimport { UserMenu } from 'components/menu';\r\nimport UserIcon from 'components/icon/UserIcon';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface UserSessionBase {\r\n user: API.HintedUser;\r\n}\r\n\r\nexport default function <SessionT extends UI.SessionItemBase & UserSessionBase>(itemMenuIds: string[]) {\r\n const UserItemHandlerDecorator: UI.SessionInfoGetter<SessionT> = {\r\n itemNameGetter(session) {\r\n return session.user.nicks;\r\n },\r\n\r\n itemStatusGetter(session) {\r\n const { flags } = session.user;\r\n return userOnlineStatusToColor(flags);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return session.user.hub_names;\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return <UserIcon flags={ session.user.flags } />;\r\n },\r\n\r\n itemHeaderTitleGetter(session, location, actionMenu) {\r\n const { user } = session;\r\n return (\r\n <UserMenu \r\n user={ user } \r\n ids={ itemMenuIds }\r\n remoteMenuId={ MenuConstants.HINTED_USER }\r\n >\r\n { actionMenu }\r\n </UserMenu>\r\n );\r\n },\r\n };\r\n\r\n return UserItemHandlerDecorator;\r\n}\r\n","import PrivateChatConstants from 'constants/PrivateChatConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport ChatActionDecorator from './decorators/ChatActionDecorator';\r\nimport SessionActionDecorator from './decorators/SessionActionDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst handleConnectCCPM: UI.ActionHandler<API.PrivateChat> = ({ data: session }) => {\r\n return SocketService.post(`${PrivateChatConstants.SESSIONS_URL}/${session.id}/ccpm`);\r\n};\r\n\r\nconst handleDisconnectCCPM: UI.ActionHandler<API.PrivateChat> = ({ data: session }) => {\r\n return SocketService.delete(`${PrivateChatConstants.SESSIONS_URL}/${session.id}/ccpm`);\r\n};\r\n\r\nconst ccpmConnected = (data: API.PrivateChat) => data.ccpm_state.id === API.CCPMStateEnum.CONNECTED;\r\nconst ccpmDisconnected = (data: API.PrivateChat) => data.ccpm_state.id === API.CCPMStateEnum.DISCONNECTED;\r\n\r\nconst PrivateChatActions: UI.ActionListType<API.PrivateChat> = {\r\n connectCCPM: {\r\n displayName: 'Connect',\r\n access: API.AccessEnum.PRIVATE_CHAT_EDIT, \r\n icon: IconConstants.PLAY,\r\n handler: handleConnectCCPM,\r\n filter: ccpmDisconnected,\r\n },\r\n disconnectCCPM: {\r\n access: API.AccessEnum.PRIVATE_CHAT_EDIT, \r\n displayName: 'Disconnect', \r\n icon: IconConstants.REMOVE,\r\n handler: handleDisconnectCCPM,\r\n filter: ccpmConnected,\r\n },\r\n};\r\n\r\n\r\nconst PrivateChatActionsDecorated = SessionActionDecorator(\r\n ChatActionDecorator(\r\n PrivateChatActions, \r\n PrivateChatConstants.SESSIONS_URL, \r\n API.AccessEnum.PRIVATE_CHAT_EDIT\r\n ), \r\n PrivateChatConstants.SESSIONS_URL, \r\n API.AccessEnum.PRIVATE_CHAT_EDIT\r\n);\r\n\r\n\r\nexport default {\r\n moduleId: UI.Modules.MESSAGES,\r\n actions: PrivateChatActionsDecorated,\r\n};\r\n","import { Component } from 'react';\r\n\r\nimport RecentLayout from 'routes/Sidebar/components/RecentLayout';\r\n\r\nimport PrivateChatActions from 'actions/reflux/PrivateChatActions';\r\nimport PrivateChatSessionStore from 'stores/PrivateChatSessionStore';\r\n\r\nimport { HistoryEntryEnum } from 'constants/HistoryConstants';\r\n\r\nimport * as API from 'types/api';\r\n\r\nimport { NewSessionLayoutProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { UserSelectField } from 'components/select';\r\n\r\n\r\nconst hasSession = (entry: API.HistoryItem) => {\r\n return PrivateChatSessionStore.getSession(entry.user!.cid);\r\n};\r\n\r\nclass MessageNew extends Component<NewSessionLayoutProps> {\r\n handleSubmit = (user: API.HintedUser) => {\r\n PrivateChatActions.createSession(this.props.location, user, PrivateChatSessionStore);\r\n }\r\n\r\n recentUserRender = (entry: API.HistoryItem) => {\r\n return (\r\n <a onClick={ _ => this.handleSubmit(entry.user!) }>\r\n { entry.user!.nicks }\r\n </a> \r\n );\r\n }\r\n\r\n render() {\r\n const { sessionT } = this.props;\r\n return (\r\n <div className=\"private chat session new\"> \r\n <UserSelectField \r\n onChange={ this.handleSubmit } \r\n offlineMessage={ sessionT.t<string>(\r\n 'offlineMessage',\r\n 'You must to be connected to at least one hub in order to send private messages'\r\n ) }\r\n isClearable={ false }\r\n autoFocus={ true }\r\n />\r\n <RecentLayout\r\n entryType={ HistoryEntryEnum.PRIVATE_CHAT }\r\n hasSession={ hasSession }\r\n entryTitleRenderer={ this.recentUserRender }\r\n entryIcon={ IconConstants.MESSAGES_PLAIN }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default MessageNew;\r\n","import * as React from 'react';\r\n\r\nimport PrivateChatActions from 'actions/ui/PrivateChatActions';\r\n\r\nimport { SessionFooter } from 'routes/Sidebar/components/SessionFooter';\r\nimport Loader from 'components/semantic/Loader';\r\nimport { ActionMenu } from 'components/menu';\r\nimport EncryptionState from 'components/EncryptionState';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst getCaption = (state: API.CCPMStateEnum, sessionT: UI.ModuleTranslator) => {\r\n const { translate } = sessionT;\r\n switch (state) {\r\n case API.CCPMStateEnum.CONNECTED: return translate('Direct encrypted channel established');\r\n case API.CCPMStateEnum.CONNECTING: return (\r\n <Loader \r\n size=\"mini\" \r\n inline={ true } \r\n text={ translate('Establishing connection...') }\r\n />\r\n );\r\n case API.CCPMStateEnum.DISCONNECTED: return translate('Direct encrypted channel available');\r\n default: return null;\r\n }\r\n};\r\n\r\n\r\ninterface CCPMStateProps {\r\n session: API.PrivateChat;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst CCPMState: React.FC<CCPMStateProps> = ({ session, sessionT }) => {\r\n const { flags } = session.user;\r\n if (flags.indexOf('ccpm') === -1) {\r\n return null;\r\n }\r\n\r\n const state = session.ccpm_state.id;\r\n if (state === API.CCPMStateEnum.DISCONNECTED && flags.indexOf('offline') !== -1) {\r\n return null;\r\n }\r\n\r\n return (\r\n <SessionFooter>\r\n <div className=\"ccpm-state\">\r\n <EncryptionState \r\n encryption={ session.ccpm_state.encryption } \r\n alwaysVisible={ true }\r\n boundary=\".session-container\"\r\n />\r\n <ActionMenu\r\n caption={ getCaption(state, sessionT) }\r\n actions={ PrivateChatActions }\r\n ids={[ 'disconnectCCPM', 'connectCCPM' ]}\r\n itemData={ session }\r\n />\r\n </div>\r\n </SessionFooter>\r\n );\r\n};\r\n\r\nexport default CCPMState;","//@ts-ignore\r\nimport Reflux from 'reflux';\r\nimport invariant from 'invariant';\r\n\r\nimport PrivateChatConstants from 'constants/PrivateChatConstants';\r\nimport PrivateChatActions from 'actions/reflux/PrivateChatActions';\r\n\r\nimport MessageStoreDecorator from './decorators/MessageStoreDecorator';\r\n\r\nimport AccessConstants from 'constants/AccessConstants';\r\nimport { AddSocketListener } from 'decorators/SocketSubscriptionDecorator';\r\nimport { SessionScrollPositionKeeper } from './helpers/SessionScrollPositionKeeper';\r\n\r\n\r\nconst PrivateChatMessageStore = Reflux.createStore({\r\n scroll: SessionScrollPositionKeeper(),\r\n\r\n onSocketConnected(addSocketListener: AddSocketListener) {\r\n invariant(!this.hasMessages(), 'No existing private messages should exist on socket connect');\r\n invariant(!this.hasInitializedSessions(), 'No initialized private message sessions should exist on socket connect');\r\n\r\n const url = PrivateChatConstants.MODULE_URL;\r\n addSocketListener(url, PrivateChatConstants.MESSAGE, this._onChatMessage);\r\n addSocketListener(url, PrivateChatConstants.STATUS, this._onStatusMessage);\r\n\r\n addSocketListener(url, PrivateChatConstants.SESSION_REMOVED, this._onSessionRemoved);\r\n addSocketListener(url, PrivateChatConstants.SESSION_UPDATED, this._onSessionUpdated);\r\n },\r\n});\r\n\r\nexport default MessageStoreDecorator(PrivateChatMessageStore, PrivateChatActions, AccessConstants.PRIVATE_CHAT_VIEW)\r\n;\r\n","import { Component } from 'react';\r\n\r\nimport ChatLayout, { ChatAPI, ChatActionList } from 'routes/Sidebar/components/chat/ChatLayout';\r\nimport MessageFooter from 'routes/Sidebar/routes/Messages/components/MessageFooter';\r\n\r\nimport PrivateChatMessageStore from 'stores/PrivateChatMessageStore';\r\n\r\nimport * as API from 'types/api';\r\n//import * as UI from 'types/ui';\r\n\r\nimport { SessionChildProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport { shareTempFile } from 'services/api/ShareApi';\r\nimport PrivateChatActions from 'actions/reflux/PrivateChatActions';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface PrivateChatSessionProps extends SessionChildProps<API.PrivateChat, {}, ChatActionList> {\r\n\r\n}\r\n\r\nclass PrivateChatSession extends Component<PrivateChatSessionProps> {\r\n static displayName = 'PrivateChatSession';\r\n\r\n handleFileUpload = (file: File) => {\r\n const { cid, hub_url, flags } = this.props.session.user;\r\n\r\n const isPrivate = flags.indexOf('nmdc') === -1 && flags.indexOf('bot') === -1;\r\n return shareTempFile(file, hub_url, isPrivate ? cid : undefined);\r\n }\r\n\r\n render() {\r\n const { session, sessionApi, sessionT, uiActions } = this.props;\r\n return (\r\n <div className=\"private chat session\">\r\n <ChatLayout\r\n chatAccess={ API.AccessEnum.PRIVATE_CHAT_SEND }\r\n chatActions={ uiActions }\r\n chatApi={ PrivateChatActions as ChatAPI }\r\n sessionApi={ sessionApi }\r\n messageStore={ PrivateChatMessageStore }\r\n session={ session }\r\n handleFileUpload={ this.handleFileUpload }\r\n highlightRemoteMenuId={ MenuConstants.PRIVATE_CHAT_MESSAGE_HIGHLIGHT }\r\n />\r\n\r\n <MessageFooter\r\n session={ session }\r\n sessionT={ sessionT }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default PrivateChatSession;\r\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\r\n\r\nimport SessionLayout from 'routes/Sidebar/components/SessionLayout';\r\nimport UserItemHandlerDecorator from 'routes/Sidebar/decorators/UserItemHandlerDecorator';\r\n\r\nimport PrivateChatSessionStore from 'stores/PrivateChatSessionStore';\r\nimport PrivateChatUIActions from 'actions/ui/PrivateChatActions';\r\nimport PrivateChatAPIActions from 'actions/reflux/PrivateChatActions';\r\n\r\nimport MessageNew from 'routes/Sidebar/routes/Messages/components/MessageNew';\r\nimport PrivateChatSession from 'routes/Sidebar/routes/Messages/components/PrivateChatSession';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport '../style.css';\r\nimport { \r\n SessionProviderDecoratorChildProps, SessionProviderDecorator\r\n} from 'routes/Sidebar/decorators/SessionProviderDecorator';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\n\r\nconst sessionActions = [ 'clear' ];\r\n\r\nconst Messages: React.FC<SessionProviderDecoratorChildProps<API.PrivateChat>> = props => {\r\n const { match, t, ...other } = props;\r\n return (\r\n <SessionLayout \r\n activeId={ match.params.id }\r\n baseUrl=\"messages\"\r\n newCaption={ t(toI18nKey('new', UI.Modules.MESSAGES), 'New session') }\r\n newDescription={ t(toI18nKey('newDesc', UI.Modules.MESSAGES), 'Open a new private chat session') } \r\n newIcon={ IconConstants.MESSAGES_PLAIN }\r\n unreadInfoStore={ PrivateChatSessionStore }\r\n editAccess={ API.AccessEnum.PRIVATE_CHAT_EDIT }\r\n uiActions={ PrivateChatUIActions }\r\n sessionApi={ PrivateChatAPIActions as UI.SessionActions<API.PrivateChat> }\r\n actionIds={ sessionActions }\r\n sessionItemLayout={ PrivateChatSession }\r\n newLayout={ MessageNew }\r\n t={ t }\r\n { ...UserItemHandlerDecorator([ 'browse', 'ignore', 'unignore' ]) }\r\n { ...other }\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(Messages, PrivateChatSessionStore);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","itemMenuIds","itemNameGetter","session","user","nicks","itemStatusGetter","flags","itemHeaderDescriptionGetter","hub_names","itemHeaderIconGetter","itemHeaderTitleGetter","location","actionMenu","ids","remoteMenuId","PrivateChatActions","connectCCPM","displayName","access","icon","IconConstants","handler","data","SocketService","PrivateChatConstants","filter","ccpm_state","disconnectCCPM","PrivateChatActionsDecorated","SessionActionDecorator","ChatActionDecorator","moduleId","actions","hasSession","entry","PrivateChatSessionStore","cid","MessageNew","Component","handleSubmit","this","props","recentUserRender","onClick","_","render","sessionT","className","onChange","offlineMessage","t","isClearable","autoFocus","RecentLayout","entryType","entryTitleRenderer","entryIcon","getCaption","state","translate","Loader","size","inline","text","indexOf","SessionFooter","EncryptionState","encryption","alwaysVisible","boundary","caption","itemData","PrivateChatMessageStore","scroll","SessionScrollPositionKeeper","onSocketConnected","addSocketListener","hasMessages","hasInitializedSessions","url","_onChatMessage","_onStatusMessage","_onSessionRemoved","_onSessionUpdated","MessageStoreDecorator","AccessConstants","PrivateChatSession","handleFileUpload","file","hub_url","isPrivate","undefined","sessionApi","uiActions","ChatLayout","chatAccess","chatActions","chatApi","messageStore","highlightRemoteMenuId","MenuConstants","MessageFooter","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","sessionActions","SessionProviderDecorator","match","other","SessionLayout","activeId","params","baseUrl","newCaption","newDescription","newIcon","unreadInfoStore","editAccess","actionIds","sessionItemLayout","newLayout","UserItemHandlerDecorator"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[618],{24751:(e,s,i)=>{i.d(s,{Z:()=>d});var t=i(94015),o=i.n(t),n=i(23645),r=i.n(n)()(o());r.push([e.id,".status .error {\r\n color: red;\r\n}\r\n\r\n@media only screen and (min-width: 767px) {\r\n .source.modal td {\r\n max-width: 250px;\r\n }\r\n\r\n /* Can't be applied to dropdown cells */\r\n .source.modal td:not(.user) {\r\n overflow-x: hidden;\r\n }\r\n}\r\n","",{version:3,sources:["webpack://./src/routes/Queue/style.css"],names:[],mappings:"AAAA;EACE,UAAU;AACZ;;AAEA;EACE;IACE,gBAAgB;EAClB;;EAEA,uCAAuC;EACvC;IACE,kBAAkB;EACpB;AACF",sourcesContent:[".status .error {\r\n color: red;\r\n}\r\n\r\n@media only screen and (min-width: 767px) {\r\n .source.modal td {\r\n max-width: 250px;\r\n }\r\n\r\n /* Can't be applied to dropdown cells */\r\n .source.modal td:not(.user) {\r\n overflow-x: hidden;\r\n }\r\n}\r\n"],sourceRoot:""}]);const d=r},80218:(e,s,i)=>{i.d(s,{Z:()=>l});var t=i(1087),o=i(518),n=i(48117),r=i(76249),d=i(32347);const a=e=>o.Z.post(t.Z.BUNDLES_URL+"/priority",{priority:e}),c={removeCompleted:{access:r.PS.QUEUE_EDIT,displayName:"Remove completed bundles",icon:n.Z.REMOVE,handler:()=>o.Z.post(t.Z.BUNDLES_URL+"/remove_completed"),notifications:{onSuccess:"{{result.count}} completed bundles were removed"}},divider:null,pause:{displayName:"Pause all bundles",access:r.PS.QUEUE_EDIT,icon:n.Z.PAUSE,handler:()=>a(r.gg.PAUSED_FORCED)},resume:{displayName:"Resume all bundles",access:r.PS.QUEUE_EDIT,icon:n.Z.PLAY,handler:()=>a(r.gg.DEFAULT)}},l={moduleId:d.jv.QUEUE,actions:c}},49133:(e,s,i)=>{i.d(s,{Z:()=>l});var t=i(1087),o=i(518),n=i(48117),r=i(76249),d=i(32347),a=i(60160);const c={search:{access:r.PS.SEARCH,displayName:"Search (foreground)",icon:n.Z.SEARCH,handler:({data:e,location:s})=>a.Z.search(e,s)},searchFileAlternates:{access:r.PS.QUEUE_EDIT,displayName:"Search for alternates",icon:n.Z.SEARCH_ALTERNATES,filter:e=>0===e.time_finished,handler:({data:e})=>o.Z.post(`${t.Z.FILES_URL}/${e.id}/search`),notifications:{onSuccess:"File {{item.name}} was searched for alternates"}},removeFile:{displayName:"Remove",access:r.PS.QUEUE_EDIT,icon:n.Z.REMOVE,confirmation:{content:"Are you sure that you want to remove the file {{item.name}}?",approveCaption:"Remove file",rejectCaption:"Don't remove",checkboxCaption:"Remove on disk"},handler:({data:e},s)=>o.Z.post(`${t.Z.FILES_URL}/${e.id}/remove`,{remove_finished:s}),notifications:{onSuccess:"File {{item.name}} was removed from queue"}}},l={moduleId:d.jv.QUEUE,actions:c}},43231:(e,s,i)=>{i.d(s,{Z:()=>c});var t=i(85893),o=i(45697),n=i.n(o),r=(i(67294),i(94184)),d=i.n(r);const a=({className:e,percent:s,caption:i})=>(0,t.jsxs)("div",Object.assign({className:d()("ui progress",e,{indeterminate:void 0===s}),"data-percent":s},{children:[(0,t.jsx)("div",Object.assign({className:"bar",style:{transitionDuration:"300ms",width:void 0===s?void 0:s+"%",minWidth:"0px"}},{children:(0,t.jsx)("div",{className:"progress"},void 0)}),void 0),!!i&&(0,t.jsx)("div",Object.assign({className:"label"},{children:i}),void 0)]}),void 0);a.propTypes={percent:n().number.isRequired,caption:n().node.isRequired,className:n().string};const c=a},81821:(e,s,i)=>{i.r(s),i.d(s,{default:()=>_e});var t=i(85893),o=i(67294),n=i(35108),r=i(80218),d=i(1087),a=i(518),c=i(20097),l=i(48117),u=i(76249),m=i(32347),h=i(60160);const p=e=>e.status.id===d.s.COMPLETION_VALIDATION_ERROR,v=e=>0===e.time_finished,E=(e,s)=>a.Z.post(`${d.Z.BUNDLES_URL}/${e.id}/share`,{skip_validation:s}),j={sources:{displayName:"Manage sources...",icon:l.Z.USER,filter:e=>e.sources.total>0&&v(e),handler:({data:e,location:s})=>{c.Z.push(`${s.pathname}/sources/${e.id}`)}},content:{displayName:"Manage files...",icon:l.Z.FILE,filter:e=>"directory"===e.type.id,handler:({data:e,location:s})=>{c.Z.push(`${s.pathname}/content/${e.id}`)}},divider:null,search:{access:u.PS.SEARCH,displayName:"Search (foreground)",icon:l.Z.SEARCH,handler:({data:e,location:s})=>h.Z.search(e,s)},searchBundleAlternates:{access:u.PS.QUEUE_EDIT,displayName:"Search for alternates",icon:l.Z.SEARCH_ALTERNATES,filter:v,handler:({data:e})=>a.Z.post(`${d.Z.BUNDLES_URL}/${e.id}/search`),notifications:{onSuccess:"The bundle {{item.name}} was searched for alternates"}},divider2:null,removeBundle:{displayName:"Remove",access:u.PS.QUEUE_EDIT,icon:l.Z.REMOVE,confirmation:{content:"Are you sure that you want to remove the bundle {{item.name}}?",approveCaption:"Remove bundle",rejectCaption:"Don't remove",checkboxCaption:"Remove finished files"},handler:({data:e},s)=>a.Z.post(`${d.Z.BUNDLES_URL}/${e.id}/remove`,{remove_finished:s})},divider3:null,rescan:{displayName:"Rescan for errors",access:u.PS.QUEUE_EDIT,icon:l.Z.REFRESH_COLORED,filter:p,handler:({data:e})=>E(e,!1)},forceShare:{displayName:"Force in share",access:u.PS.QUEUE_EDIT,icon:l.Z.ERROR,filter:p,handler:({data:e})=>E(e,!0)}},x={moduleId:m.jv.QUEUE,actions:j};var U=i(78230),y=i(45697),b=i.n(y),g=i(18446),Z=i.n(g);const C={[u.gg.PAUSED_FORCED]:{str:"Paused (forced)",id:0},[u.gg.PAUSED]:{str:"Paused",id:1},[u.gg.LOWEST]:{str:"Lowest",id:2},[u.gg.LOW]:{str:"Low",id:3},[u.gg.NORMAL]:{str:"Normal",id:4},[u.gg.HIGH]:{str:"High",id:5},[u.gg.HIGHEST]:{str:"Highest",id:6}};var f=i(9453),S=i(98374),A=i(94184),w=i.n(A),N=i(49694);const R=({caption:e,className:s})=>{const i=w()("ui empty dropdown",s);return(0,t.jsx)("div",Object.assign({className:i},{children:(0,t.jsx)(N.Z,{children:e},void 0)}),void 0)};var _=i(66883),D=i(8717),L=i(89519);class I extends o.Component{constructor(){super(...arguments),this.setPriority=e=>{const{item:s,prioAction:i,t}=this.props;return(0,L.h9)((()=>i(s,e)),t)},this.setAutoPriority=()=>{this.setPriority(u.gg.DEFAULT)},this.getPriorityListItem=(e,s,i)=>{const o=this.props.item.priority.id;return(0,t.jsx)(S.Z,Object.assign({active:o===e.id,onClick:()=>{this.setPriority(e.id),i()}},{children:(0,D.Iu)(e.str,s,m.jv.QUEUE)}),e.id)},this.getChildren=e=>{const{t:s}=this.props;let i=Object.keys(C).map((i=>this.getPriorityListItem(C[i],s,e)));return i.push((0,t.jsx)("div",{className:"ui divider"},"divider")),i.push((0,t.jsx)(S.Z,Object.assign({active:this.props.itemPrio.auto,onClick:()=>{this.setPriority(u.gg.DEFAULT),e()}},{children:(0,D.Iu)("Auto",s,m.jv.QUEUE)}),"auto")),i}}shouldComponentUpdate(e){return!Z()(e.item.priority,this.props.item.priority)}render(){const{itemPrio:e,t:s}=this.props;let i=(0,D.Iu)(C[e.id].str,s,m.jv.QUEUE);return e.auto&&(i+=` (${(0,D.Iu)("Auto",s,m.jv.QUEUE).toLocaleLowerCase()})`),_.Z.hasAccess(u.PS.QUEUE_EDIT)?(0,t.jsx)(f.Z,Object.assign({caption:i,className:"priority-menu"},{children:this.getChildren}),void 0):(0,t.jsx)(R,{caption:i},void 0)}}I.propTypes={itemPrio:b().object.isRequired,item:b().object.isRequired,prioAction:b().func.isRequired};const O=I;var P=i(43231);const T=(e,s)=>{if(e.completed)return"success";const i=e.id;return w()({grey:(!i||i===u.gT.QUEUED)&&0===s.speed},{blue:(!i||i===u.gT.QUEUED)&&s.speed>0})},Q=({cellData:e,rowDataGetter:s})=>{if(e.failed)return(0,t.jsx)("span",Object.assign({className:"error"},{children:e.str}),void 0);const i=s();return(0,t.jsx)(P.Z,{className:T(e,i),caption:e.str,percent:100*i.downloaded_bytes/i.size},void 0)};var B=i(10293),$=i.n(B),q=i(93836);const F=$().createStore({_viewName:"queue_bundle_view",_apiUrl:d.Z.MODULE_URL,mixins:[(0,q.Z)("name")]});var H=i(28427),K=i(92245),k=i(20368),G=i(49133);const M=$().createStore({_viewName:"queue_file_view",_apiUrl:d.Z.MODULE_URL,mixins:[(0,q.Z)("name")]});var V=i(68126),z=i(93379),W=i.n(z),Y=i(7795),X=i.n(Y),J=i(90569),ee=i.n(J),se=i(3565),ie=i.n(se),te=i(19216),oe=i.n(te),ne=i(44589),re=i.n(ne),de=i(24751),ae={};ae.styleTagTransform=re(),ae.setAttributes=ie(),ae.insert=ee().bind(null,"head"),ae.domAPI=X(),ae.insertStyleElement=oe(),W()(de.Z,ae),de.Z&&de.Z.locals&&de.Z.locals;var ce=i(19072),le=i(4333);const ue=({cellData:e,rowDataGetter:s,t:i})=>(0,t.jsx)(O,{itemPrio:e,item:s(),prioAction:ce.YU,t:i},void 0);class me extends o.Component{constructor(){super(...arguments),this.isActive=(e,s)=>!s.status.downloaded,this.isRunning=(e,s)=>s.speed>0}render(){return(0,t.jsxs)(U.Z,Object.assign({store:M,sourceFilter:{pattern:this.props.bundle.id,method:u.V3.EXACT,property:"bundle"},moduleId:G.Z.moduleId},{children:[(0,t.jsx)(n.Column,{name:"Name",width:200,flexGrow:20,columnKey:"name",cell:(0,t.jsx)(V.Nq,{actions:G.Z,remoteMenuId:le.Z.QUEUE_FILE},void 0)},void 0),(0,t.jsx)(n.Column,{name:"Size",width:70,columnKey:"size",cell:(0,t.jsx)(V.Eh,{},void 0),flexGrow:1},void 0),(0,t.jsx)(n.Column,{name:"Status",width:120,columnKey:"status",cell:(0,t.jsx)(Q,{},void 0)},void 0),(0,t.jsx)(n.Column,{name:"Sources",width:65,columnKey:"sources",renderCondition:this.isActive},void 0),(0,t.jsx)(n.Column,{name:"Time left",width:50,columnKey:"seconds_left",renderCondition:this.isRunning,cell:(0,t.jsx)(V.VL,{},void 0)},void 0),(0,t.jsx)(n.Column,{name:"Speed",width:55,columnKey:"speed",cell:(0,t.jsx)(V.LV,{},void 0),renderCondition:this.isRunning},void 0),(0,t.jsx)(n.Column,{name:"Priority",width:80,columnKey:"priority",renderCondition:this.isActive,cell:(0,t.jsx)(ue,{},void 0),flexGrow:1},void 0)]}),void 0)}}const he=me;var pe=i(42090);class ve extends o.Component{render(){const e=this.props,{bundle:s}=e,i=function(e,s){var i={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&s.indexOf(t)<0&&(i[t]=e[t]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(t=Object.getOwnPropertySymbols(e);o<t.length;o++)s.indexOf(t[o])<0&&Object.prototype.propertyIsEnumerable.call(e,t[o])&&(i[t[o]]=e[t[o]])}return i}(e,["bundle"]);return(0,t.jsx)(H.Z,Object.assign({className:"source",title:s.name,subHeader:s.target,closable:!0,icon:(0,t.jsx)(k.Z,{typeInfo:s.type},void 0),fullHeight:!0},i,{children:(0,t.jsx)(he,{bundle:s},void 0)}),void 0)}}ve.displayName="BundleFileDialog";const Ee=(0,K.ZP)((0,pe.Z)(ve,{urls:{bundle:({match:e},s)=>s.get(`${d.Z.BUNDLES_URL}/${e.params.bundleId}`)}}),"content/:bundleId"),je={removeBundleSource:{access:u.PS.QUEUE_EDIT,displayName:"Remove source",icon:l.Z.REMOVE,handler:({data:e})=>{const{source:s,bundle:i}=e;return a.Z.delete(`${d.Z.BUNDLES_URL}/${i.id}/sources/${s.user.cid}`)}}},xe={moduleId:m.jv.QUEUE,subId:"bundleSource",actions:je};var Ue=i(2445),ye=i(47021),be=i(90195);const ge=({source:e,bundle:s,t:i})=>(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",Object.assign({className:"user dropdown"},{children:(0,t.jsx)(ye.Ie,Object.assign({userIcon:!0,user:e.user,ids:be.D,contextElement:".source.modal",remoteMenuId:le.Z.HINTED_USER},{children:(0,t.jsx)(ye.PC,{actions:xe,itemData:{source:e,bundle:s}},void 0)}),void 0)}),void 0),(0,t.jsx)("td",Object.assign({className:"hubs"},{children:e.user.hub_names}),void 0),(0,t.jsx)("td",Object.assign({className:"speed"},{children:e.last_speed>0&&(0,Ue.CY)(e.last_speed,i)}),void 0),(0,t.jsx)("td",Object.assign({className:"files"},{children:e.files}),void 0),(0,t.jsx)("td",Object.assign({className:"size"},{children:(0,Ue.BU)(e.size,i)}),void 0)]},void 0),Ze=(e,s)=>e.user.nicks.localeCompare(s.user.nicks),Ce=(0,pe.Z)((({sources:e,bundle:s,queueT:i})=>{const{translate:o}=i;return(0,t.jsxs)("div",Object.assign({className:"sources"},{children:[(0,t.jsx)("h2",{children:o("Sources")},void 0),(0,t.jsxs)("table",Object.assign({className:"ui striped table"},{children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{children:o("User")},void 0),(0,t.jsx)("th",{children:o("Hubs")},void 0),(0,t.jsx)("th",{children:o("Last known speed")},void 0),(0,t.jsx)("th",{children:o("Files")},void 0),(0,t.jsx)("th",{children:o("Size")},void 0)]},void 0)},void 0),(0,t.jsx)("tbody",{children:e.sort(Ze).map((e=>(0,t.jsx)(ge,{source:e,bundle:s,t:i.plainT},e.user.cid)))},void 0)]}),void 0)]}),void 0)}),{urls:{sources:({bundle:e},s)=>s.get(`${d.Z.BUNDLES_URL}/${e.id}/sources`)},onSocketConnected:(e,{refetchData:s,props:i})=>{e(d.Z.MODULE_URL,d.Z.BUNDLE_SOURCES,(e=>{e.id===i.bundle.id&&s()}))}});class fe extends o.Component{render(){const{bundle:e,queueT:s}=this.props;return(0,t.jsx)(H.Z,Object.assign({className:"source",title:e.name,subHeader:e.target,closable:!0,icon:(0,t.jsx)(k.Z,{typeInfo:e.type},void 0),fullHeight:!0},this.props,{children:(0,t.jsx)(Ce,{bundle:e,queueT:s},void 0)}),void 0)}}fe.displayName="SourceDialog";const Se=(0,K.ZP)((0,pe.Z)(fe,{urls:{bundle:({match:e},s)=>s.get(`${d.Z.BUNDLES_URL}/${e.params.bundleId}`)}}),"sources/:bundleId");var Ae=i(27695),we=i(91768);const Ne=({cellData:e,rowDataGetter:s,t:i})=>(0,t.jsx)(O,{itemPrio:e,item:s(),prioAction:ce.aR,t:i},void 0);class Re extends o.Component{constructor(){super(...arguments),this.isActive=(e,s)=>!s.status.downloaded,this.isDownloaded=(e,s)=>s.status.downloaded,this.isRunning=(e,s)=>s.speed>0,this.emptyRowsNodeGetter=()=>{const{t:e}=this.queueT;return(0,t.jsx)(Ae.Z,{title:e("queueEmpty","The queue is empty"),icon:l.Z.FILE,description:e("queueEmptyDesc","New items can be queued from search or filelists")},void 0)},this.queueT=(0,D.HY)(this.props.t,m.jv.QUEUE)}render(){const{translate:e}=this.queueT;return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(U.Z,Object.assign({emptyRowsNodeGetter:this.emptyRowsNodeGetter,store:F,footerData:(0,t.jsx)(ye.PC,{className:"top left pointing",caption:e("Actions..."),actions:r.Z,header:e("Queue actions"),triggerIcon:"chevron up",button:!0},void 0),moduleId:r.Z.moduleId},{children:[(0,t.jsx)(n.Column,{name:"Name",width:200,flexGrow:4,columnKey:"name",cell:(0,t.jsx)(V.Nq,{actions:x,remoteMenuId:le.Z.QUEUE_BUNDLE,ids:["content","sources","divider","search","searchBundleAlternates","divider","removeBundle","divider","rescan","forceShare"]},void 0)},void 0),(0,t.jsx)(n.Column,{name:"Size",width:60,columnKey:"size",cell:(0,t.jsx)(V.Eh,{},void 0),flexGrow:1},void 0),(0,t.jsx)(n.Column,{name:"Type/content",width:150,columnKey:"type",hideWidth:1e3,cell:(0,t.jsx)(V.DS,{actions:x,actionId:"content"},void 0)},void 0),(0,t.jsx)(n.Column,{name:"Status",width:120,flexGrow:3,columnKey:"status",cell:(0,t.jsx)(Q,{},void 0)},void 0),(0,t.jsx)(n.Column,{name:"Sources",width:60,columnKey:"sources",renderCondition:this.isActive,flexGrow:1,cell:(0,t.jsx)(V.DS,{actions:x,actionId:"sources"},void 0)},void 0),(0,t.jsx)(n.Column,{name:"Time left",width:50,columnKey:"seconds_left",renderCondition:this.isRunning,cell:(0,t.jsx)(V.VL,{},void 0)},void 0),(0,t.jsx)(n.Column,{name:"Speed",width:50,columnKey:"speed",cell:(0,t.jsx)(V.LV,{},void 0),renderCondition:this.isRunning,flexGrow:1},void 0),(0,t.jsx)(n.Column,{name:"Priority",width:80,columnKey:"priority",renderCondition:this.isActive,cell:(0,t.jsx)(Ne,{},void 0),flexGrow:1},void 0),(0,t.jsx)(n.Column,{name:"Added",width:100,columnKey:"time_added",cell:(0,t.jsx)(V.Ks,{},void 0),hideWidth:1400},void 0),(0,t.jsx)(n.Column,{name:"Finished",width:100,columnKey:"time_finished",cell:(0,t.jsx)(V.Ks,{},void 0),renderCondition:this.isDownloaded,hideWidth:1200},void 0)]}),void 0),(0,t.jsx)(Se,{queueT:this.queueT},void 0),(0,t.jsx)(Ee,{},void 0)]},void 0)}}Re.displayName="Queue";const _e=(0,we.Z)()(Re)}}]);
|
|
2
|
-
//# sourceMappingURL=queue.0e532f2a56e464d1626b.chunk.js.map
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"js/queue.0e532f2a56e464d1626b.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Queue/style.css","webpack://airdcpp-webui/./src/actions/ui/QueueActions.ts","webpack://airdcpp-webui/./src/actions/ui/QueueFileActions.ts","webpack://airdcpp-webui/./src/components/semantic/Progress.tsx","webpack://airdcpp-webui/./src/actions/ui/QueueBundleActions.ts","webpack://airdcpp-webui/./src/constants/PriorityConstants.ts","webpack://airdcpp-webui/./src/components/semantic/EmptyDropdown.tsx","webpack://airdcpp-webui/./src/routes/Queue/components/PriorityMenu.tsx","webpack://airdcpp-webui/./src/routes/Queue/components/StatusCell.tsx","webpack://airdcpp-webui/./src/stores/QueueBundleViewStore.js","webpack://airdcpp-webui/./src/stores/QueueFileViewStore.js","webpack://airdcpp-webui/./src/routes/Queue/style.css?62bc","webpack://airdcpp-webui/./src/routes/Queue/components/BundleFileTable.tsx","webpack://airdcpp-webui/./src/routes/Queue/components/BundleFileDialog.tsx","webpack://airdcpp-webui/./src/actions/ui/QueueBundleSourceActions.ts","webpack://airdcpp-webui/./src/routes/Queue/components/BundleSourceTable.tsx","webpack://airdcpp-webui/./src/routes/Queue/components/BundleSourceDialog.tsx","webpack://airdcpp-webui/./src/routes/Queue/components/Queue.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".status .error {\\r\\n color: red;\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 767px) {\\r\\n .source.modal td {\\r\\n max-width: 250px;\\r\\n }\\r\\n\\r\\n /* Can't be applied to dropdown cells */\\r\\n .source.modal td:not(.user) {\\r\\n overflow-x: hidden;\\r\\n }\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Queue/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,UAAU;AACZ;;AAEA;EACE;IACE,gBAAgB;EAClB;;EAEA,uCAAuC;EACvC;IACE,kBAAkB;EACpB;AACF\",\"sourcesContent\":[\".status .error {\\r\\n color: red;\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 767px) {\\r\\n .source.modal td {\\r\\n max-width: 250px;\\r\\n }\\r\\n\\r\\n /* Can't be applied to dropdown cells */\\r\\n .source.modal td:not(.user) {\\r\\n overflow-x: hidden;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import QueueConstants from 'constants/QueueConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst setBundlePriorities = (prio: API.QueuePriorityEnum) => {\r\n return SocketService.post(QueueConstants.BUNDLES_URL + '/priority', { \r\n priority: prio \r\n });\r\n};\r\n\r\nconst handlePause = () => {\r\n return setBundlePriorities(API.QueuePriorityEnum.PAUSED_FORCED);\r\n};\r\n\r\nconst handleResume = () => {\r\n return setBundlePriorities(API.QueuePriorityEnum.DEFAULT);\r\n};\r\n\r\nconst handleRemoveCompleted = () => {\r\n return SocketService.post(QueueConstants.BUNDLES_URL + '/remove_completed');\r\n};\r\n\r\n\r\nconst QueueActions: UI.ActionListType<null> = {\r\n removeCompleted: {\r\n access: API.AccessEnum.QUEUE_EDIT, \r\n displayName: 'Remove completed bundles', \r\n icon: IconConstants.REMOVE,\r\n handler: handleRemoveCompleted,\r\n notifications: {\r\n onSuccess: '{{result.count}} completed bundles were removed'\r\n }\r\n },\r\n divider: null,\r\n pause: {\r\n displayName: 'Pause all bundles',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.PAUSE,\r\n handler: handlePause,\r\n },\r\n resume: { \r\n displayName: 'Resume all bundles',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.PLAY,\r\n handler: handleResume,\r\n }\r\n};\r\n\r\nexport default {\r\n moduleId: UI.Modules.QUEUE,\r\n actions: QueueActions,\r\n};\r\n\r\n","import QueueConstants from 'constants/QueueConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport SearchActions from 'actions/reflux/SearchActions';\r\n\r\n\r\nconst itemNotFinished = (item: API.QueueFile) => item.time_finished === 0;\r\n\r\n\r\nconst handleSearch: UI.ActionHandler<API.QueueFile> = ({ data: itemInfo, location }) => {\r\n return SearchActions.search(itemInfo, location);\r\n};\r\n\r\nconst handleRemoveFile: UI.ActionHandler<API.QueueFile> = (\r\n { data: file },\r\n removeFinished: boolean\r\n) => {\r\n return SocketService.post(`${QueueConstants.FILES_URL}/${file.id}/remove`, {\r\n remove_finished: removeFinished,\r\n });\r\n};\r\n\r\nconst handleSearchFileAlternates: UI.ActionHandler<API.QueueFile> = ({ data: file }) => {\r\n return SocketService.post(`${QueueConstants.FILES_URL}/${file.id}/search`);\r\n};\r\n\r\n\r\n\r\nconst QueueFileActions: UI.ActionListType<API.QueueFile> = {\r\n search: {\r\n access: API.AccessEnum.SEARCH, \r\n displayName: 'Search (foreground)', \r\n icon: IconConstants.SEARCH,\r\n handler: handleSearch,\r\n },\r\n searchFileAlternates: {\r\n access: API.AccessEnum.QUEUE_EDIT, \r\n displayName: 'Search for alternates', \r\n icon: IconConstants.SEARCH_ALTERNATES,\r\n filter: itemNotFinished,\r\n handler: handleSearchFileAlternates,\r\n notifications: {\r\n onSuccess: 'File {{item.name}} was searched for alternates',\r\n }\r\n },\r\n removeFile: { \r\n displayName: 'Remove',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REMOVE,\r\n confirmation: {\r\n content: 'Are you sure that you want to remove the file {{item.name}}?',\r\n approveCaption: 'Remove file',\r\n rejectCaption: `Don't remove`,\r\n checkboxCaption: 'Remove on disk',\r\n },\r\n handler: handleRemoveFile,\r\n notifications: {\r\n onSuccess: 'File {{item.name}} was removed from queue',\r\n }\r\n },\r\n};\r\n\r\n\r\nexport default {\r\n moduleId: UI.Modules.QUEUE,\r\n //subId: 'file',\r\n actions: QueueFileActions,\r\n} as UI.ModuleActions<API.QueueFile>;\r\n","import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\n\r\nexport interface ProgressProps {\r\n caption?: React.ReactNode;\r\n className?: string | null;\r\n percent?: number;\r\n}\r\n\r\nconst Progress: React.FC<ProgressProps> = ({ className, percent, caption }) => (\r\n <div \r\n className={ classNames(\r\n 'ui progress', \r\n className, \r\n { 'indeterminate': percent === undefined },\r\n ) } \r\n data-percent={ percent }\r\n >\r\n <div \r\n className=\"bar\" \r\n style={{ \r\n transitionDuration: 300 + 'ms',\r\n width: percent === undefined ? undefined : percent + '%',\r\n minWidth: '0px'\r\n }}\r\n >\r\n <div className=\"progress\"/>\r\n </div>\r\n { !!caption && (\r\n <div className=\"label\">\r\n { caption }\r\n </div>\r\n )}\r\n </div>\r\n);\r\n\r\nProgress.propTypes = {\r\n percent: PropTypes.number.isRequired,\r\n caption: PropTypes.node.isRequired,\r\n className: PropTypes.string,\r\n};\r\n\r\nexport default Progress;","import { default as QueueConstants, StatusEnum } from 'constants/QueueConstants';\r\nimport SocketService from 'services/SocketService';\r\nimport History from 'utils/History';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport SearchActions from 'actions/reflux/SearchActions';\r\n\r\n\r\nconst bundleValidationFailed = (bundle: API.QueueBundle) => bundle.status.id === StatusEnum.COMPLETION_VALIDATION_ERROR;\r\nconst itemNotFinished = (bundle: API.QueueBundle) => bundle.time_finished === 0;\r\nconst isDirectoryBundle = (bundle: API.QueueBundle) => bundle.type.id === 'directory';\r\nconst hasSources = (bundle: API.QueueBundle) => bundle.sources.total > 0 && itemNotFinished(bundle);\r\n\r\n\r\nconst shareBundle = (\r\n bundle: API.QueueBundle, \r\n skipValidation: boolean\r\n) => {\r\n return SocketService.post(`${QueueConstants.BUNDLES_URL}/${bundle.id}/share`, { \r\n skip_validation: skipValidation, \r\n });\r\n};\r\n\r\nconst handleRescan: UI.ActionHandler<API.QueueBundle> = ({ data: bundle }) => {\r\n return shareBundle(bundle, false);\r\n};\r\n\r\nconst handleForceShare: UI.ActionHandler<API.QueueBundle> = ({ data: bundle }) => {\r\n return shareBundle(bundle, true);\r\n};\r\n\r\nconst handleRemoveBundle: UI.ActionHandler<API.QueueBundle> = (\r\n { data: bundle },\r\n removeFinished\r\n) => {\r\n return SocketService.post(`${QueueConstants.BUNDLES_URL}/${bundle.id}/remove`, { \r\n remove_finished: removeFinished,\r\n });\r\n};\r\n\r\nconst handleSearch: UI.ActionHandler<API.QueueBundle> = ({ data: itemInfo, location }) => {\r\n return SearchActions.search(itemInfo, location);\r\n};\r\n\r\nconst handleSearchBundleAlternates: UI.ActionHandler<API.QueueBundle> = (\r\n { data: bundle }\r\n) => {\r\n return SocketService.post(`${QueueConstants.BUNDLES_URL}/${bundle.id}/search`);\r\n};\r\n\r\nconst handleSources: UI.ActionHandler<API.QueueBundle> = ({ data, location }) => {\r\n History.push(`${location.pathname}/sources/${data.id}`);\r\n};\r\n\r\nconst handleContent: UI.ActionHandler<API.QueueBundle> = ({ data, location }) => {\r\n History.push(`${location.pathname}/content/${data.id}`);\r\n};\r\n\r\n\r\n\r\nconst QueueBundleActions: UI.ActionListType<API.QueueBundle> = {\r\n sources: { \r\n displayName: 'Manage sources...', \r\n icon: IconConstants.USER,\r\n filter: hasSources,\r\n handler: handleSources,\r\n },\r\n content: { \r\n displayName: 'Manage files...', \r\n icon: IconConstants.FILE,\r\n filter: isDirectoryBundle,\r\n handler: handleContent,\r\n },\r\n divider: null,\r\n search: { \r\n access: API.AccessEnum.SEARCH, \r\n displayName: 'Search (foreground)', \r\n icon: IconConstants.SEARCH,\r\n handler: handleSearch,\r\n },\r\n searchBundleAlternates: { \r\n access: API.AccessEnum.QUEUE_EDIT, \r\n displayName: 'Search for alternates', \r\n icon: IconConstants.SEARCH_ALTERNATES,\r\n filter: itemNotFinished,\r\n handler: handleSearchBundleAlternates,\r\n notifications: {\r\n onSuccess: 'The bundle {{item.name}} was searched for alternates'\r\n }\r\n },\r\n divider2: null,\r\n removeBundle: {\r\n displayName: 'Remove',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REMOVE,\r\n confirmation: {\r\n content: 'Are you sure that you want to remove the bundle {{item.name}}?',\r\n approveCaption: 'Remove bundle',\r\n rejectCaption: `Don't remove`,\r\n checkboxCaption: 'Remove finished files',\r\n },\r\n handler: handleRemoveBundle,\r\n },\r\n divider3: null,\r\n rescan: {\r\n displayName: 'Rescan for errors',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REFRESH_COLORED,\r\n filter: bundleValidationFailed,\r\n handler: handleRescan,\r\n },\r\n forceShare: { \r\n displayName: 'Force in share',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.ERROR,\r\n filter: bundleValidationFailed,\r\n handler: handleForceShare,\r\n }\r\n};\r\n\r\n\r\nexport default {\r\n moduleId: UI.Modules.QUEUE,\r\n //subId: 'bundle',\r\n actions: QueueBundleActions,\r\n} as UI.ModuleActions<API.QueueBundle>;\r\n","import { QueuePriorityEnum } from 'types/api';\r\n\r\nexport const PriorityEnum = {\r\n [QueuePriorityEnum.PAUSED_FORCED]: { str: 'Paused (forced)', id: 0 },\r\n [QueuePriorityEnum.PAUSED]: { str: 'Paused', id: 1 },\r\n [QueuePriorityEnum.LOWEST]: { str: 'Lowest', id: 2 },\r\n [QueuePriorityEnum.LOW]: { str: 'Low', id: 3 },\r\n [QueuePriorityEnum.NORMAL]: { str: 'Normal', id: 4 },\r\n [QueuePriorityEnum.HIGH]: { str: 'High', id: 5 },\r\n [QueuePriorityEnum.HIGHEST]: { str: 'Highest', id: 6 },\r\n};","import * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport DropdownCaption from './DropdownCaption';\r\n\r\n\r\ninterface EmptyDropdownProps {\r\n caption: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\n// A component used to emulate a dropdown when there are no items to display\r\nconst EmptyDropdown: React.FC<EmptyDropdownProps> = ({ caption, className }) => {\r\n const titleClassName = classNames(\r\n //'caption',\r\n 'ui empty dropdown',\r\n className,\r\n );\r\n\r\n return (\r\n <div className={ titleClassName }>\r\n <DropdownCaption>\r\n { caption }\r\n </DropdownCaption>\r\n </div>\r\n );\r\n};\r\n\r\nexport default EmptyDropdown\r\n;","import PropTypes from 'prop-types';\r\nimport { Component } from 'react';\r\nimport isEqual from 'lodash/isEqual';\r\n\r\nimport { PriorityEnum } from 'constants/PriorityConstants';\r\n\r\nimport TableDropdown, { DropdownCloseHandler } from 'components/semantic/TableDropdown';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\nimport EmptyDropdown from 'components/semantic/EmptyDropdown';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { TFunction } from 'i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\n\r\n\r\ninterface PriorityMenuProps {\r\n itemPrio: API.QueuePriority;\r\n item: API.QueueItemBase;\r\n prioAction: (item: API.QueueItemBase, priority: API.QueuePriorityEnum) => Promise<any>;\r\n t: TFunction;\r\n}\r\n\r\nclass PriorityMenu extends Component<PriorityMenuProps> {\r\n static propTypes = {\r\n /**\r\n * Priority object\r\n */\r\n itemPrio: PropTypes.object.isRequired,\r\n\r\n /**\r\n * Item with priority properties\r\n */\r\n item: PropTypes.object.isRequired,\r\n\r\n prioAction: PropTypes.func.isRequired,\r\n };\r\n\r\n setPriority = (priorityId: API.QueuePriorityEnum) => {\r\n const { item, prioAction, t } = this.props;\r\n return runBackgroundSocketAction(\r\n () => prioAction(item, priorityId),\r\n t\r\n );\r\n }\r\n\r\n setAutoPriority = () => {\r\n this.setPriority(API.QueuePriorityEnum.DEFAULT);\r\n }\r\n\r\n shouldComponentUpdate(nextProps: PriorityMenuProps) {\r\n return !isEqual(nextProps.item.priority, this.props.item.priority);\r\n }\r\n\r\n getPriorityListItem = (priority: API.QueuePriority, t: TFunction, onClose: DropdownCloseHandler) => {\r\n const currentPrio = this.props.item.priority.id;\r\n return (\r\n <MenuItemLink \r\n key={ priority.id }\r\n active={ currentPrio === priority.id } \r\n onClick={ () => {\r\n this.setPriority(priority.id);\r\n onClose();\r\n }}\r\n >\r\n { translate(priority.str, t, UI.Modules.QUEUE) }\r\n </MenuItemLink>\r\n );\r\n }\r\n\r\n getChildren = (onClose: DropdownCloseHandler) => {\r\n const { t } = this.props;\r\n\r\n let children = Object.keys(PriorityEnum)\r\n .map(prioKey => this.getPriorityListItem(PriorityEnum[prioKey], t, onClose));\r\n\r\n children.push(<div key=\"divider\" className=\"ui divider\"/>);\r\n children.push(\r\n <MenuItemLink \r\n key=\"auto\"\r\n active={ this.props.itemPrio.auto } \r\n onClick={ () => {\r\n this.setPriority(API.QueuePriorityEnum.DEFAULT);\r\n onClose();\r\n } }\r\n >\r\n { translate('Auto', t, UI.Modules.QUEUE) }\r\n </MenuItemLink>\r\n );\r\n\r\n return children;\r\n }\r\n\r\n render() {\r\n const { itemPrio, t } = this.props;\r\n let caption = translate(PriorityEnum[itemPrio.id].str, t, UI.Modules.QUEUE);\r\n if (itemPrio.auto) {\r\n caption += ` (${translate('Auto', t, UI.Modules.QUEUE).toLocaleLowerCase()})`;\r\n }\r\n\r\n if (!LoginStore.hasAccess(API.AccessEnum.QUEUE_EDIT)) {\r\n return (\r\n <EmptyDropdown\r\n caption={ caption }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <TableDropdown \r\n caption={ caption } \r\n className=\"priority-menu\"\r\n >\r\n { this.getChildren }\r\n </TableDropdown>\r\n );\r\n }\r\n}\r\n\r\nexport default PriorityMenu;","import * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport Progress from 'components/semantic/Progress';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\nconst getStatusClass = (cellData: API.QueueBundleStatus, rowData: API.QueueBundle) => {\r\n if (cellData.completed) {\r\n return 'success';\r\n }\r\n\r\n const statusId = cellData.id;\r\n return classNames(\r\n { 'grey': (!statusId || statusId === API.QueueBundleStatusEnum.QUEUED) && rowData.speed === 0 },\r\n { 'blue': (!statusId || statusId === API.QueueBundleStatusEnum.QUEUED) && rowData.speed > 0 },\r\n );\r\n};\r\n\r\nconst StatusCell: React.FC<RowWrapperCellChildProps<API.QueueBundleStatus, API.QueueBundle>> = (\r\n { cellData, rowDataGetter }\r\n) => {\r\n if (cellData!.failed) {\r\n // There isn't much space for other information\r\n return (\r\n <span className=\"error\">\r\n { cellData!.str }\r\n </span>\r\n );\r\n }\r\n\r\n const rowData = rowDataGetter!();\r\n return (\r\n <Progress \r\n className={ getStatusClass(cellData!, rowData) }\r\n caption={ cellData!.str }\r\n percent={ (rowData.downloaded_bytes * 100) / rowData.size }\r\n />\r\n );\r\n};\r\n\r\nexport default StatusCell;","import Reflux from 'reflux';\r\n\r\nimport QueueConstants from 'constants/QueueConstants';\r\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\r\n\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'queue_bundle_view',\r\n _apiUrl: QueueConstants.MODULE_URL,\r\n mixins: [ ViewStoreMixin('name') ],\r\n});\r\n","import Reflux from 'reflux';\r\n\r\nimport QueueConstants from 'constants/QueueConstants';\r\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\r\n\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'queue_file_view',\r\n _apiUrl: QueueConstants.MODULE_URL,\r\n mixins: [ ViewStoreMixin('name') ],\r\n});\r\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\r\nimport { Column } from 'fixed-data-table-2';\r\n\r\nimport QueueFileUIActions from 'actions/ui/QueueFileActions';\r\n\r\nimport VirtualTable from 'components/table/VirtualTable';\r\n\r\nimport PriorityMenu from 'routes/Queue/components/PriorityMenu';\r\nimport StatusCell from 'routes/Queue/components/StatusCell';\r\n\r\nimport QueueFileViewStore from 'stores/QueueFileViewStore';\r\n\r\nimport { FileActionCell, SizeCell, SpeedCell, AbbreviatedDurationCell } from 'components/table/Cell';\r\n\r\nimport '../style.css';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\nimport { setFilePriority } from 'services/api/QueueApi';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\nconst PriorityCell: React.FC<RowWrapperCellChildProps<API.QueuePriority, API.QueueBundle>> = (\r\n { cellData, rowDataGetter, t }\r\n) => (\r\n <PriorityMenu \r\n itemPrio={ cellData! } \r\n item={ rowDataGetter!() }\r\n prioAction={ setFilePriority }\r\n t={ t! }\r\n />\r\n);\r\n\r\ninterface BundleFileTableProps {\r\n bundle: API.QueueBundle;\r\n}\r\n\r\nclass BundleFileTable extends React.Component<BundleFileTableProps> {\r\n isActive = (cellData: any, rowData: API.QueueFile) => {\r\n return !rowData.status.downloaded;\r\n }\r\n\r\n isRunning = (cellData: any, rowData: API.QueueFile) => {\r\n return rowData.speed > 0;\r\n }\r\n\r\n render() {\r\n return (\r\n <VirtualTable\r\n store={ QueueFileViewStore }\r\n sourceFilter={ {\r\n pattern: this.props.bundle.id,\r\n method: API.FilterMethod.EXACT,\r\n property: 'bundle',\r\n } }\r\n moduleId={ QueueFileUIActions.moduleId }\r\n >\r\n <Column\r\n name=\"Name\"\r\n width={200}\r\n flexGrow={20}\r\n columnKey=\"name\"\r\n cell={ \r\n <FileActionCell \r\n actions={ QueueFileUIActions }\r\n remoteMenuId={ MenuConstants.QUEUE_FILE }\r\n /> \r\n }\r\n />\r\n <Column\r\n name=\"Size\"\r\n width={70}\r\n columnKey=\"size\"\r\n cell={ <SizeCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Status\"\r\n width={120}\r\n columnKey=\"status\"\r\n cell={ <StatusCell/> }\r\n />\r\n <Column\r\n name=\"Sources\"\r\n width={65}\r\n columnKey=\"sources\"\r\n renderCondition={ this.isActive }\r\n />\r\n <Column\r\n name=\"Time left\"\r\n width={50}\r\n columnKey=\"seconds_left\"\r\n renderCondition={ this.isRunning }\r\n cell={ <AbbreviatedDurationCell/> }\r\n />\r\n <Column\r\n name=\"Speed\"\r\n width={55}\r\n columnKey=\"speed\"\r\n cell={ <SpeedCell/> }\r\n renderCondition={ this.isRunning }\r\n />\r\n <Column\r\n name=\"Priority\"\r\n width={80}\r\n columnKey=\"priority\"\r\n renderCondition={ this.isActive }\r\n cell={ <PriorityCell/> }\r\n flexGrow={1}\r\n />\r\n </VirtualTable>\r\n );\r\n }\r\n}\r\n\r\nexport default BundleFileTable;","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport ModalRouteDecorator, { ModalRouteDecoratorChildProps } from 'decorators/ModalRouteDecorator';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\nimport BundleFileTable from 'routes/Queue/components/BundleFileTable';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport QueueConstants from 'constants/QueueConstants';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\ninterface BundleFileDialogProps {\r\n\r\n}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n bundle: API.QueueBundle;\r\n}\r\n\r\ninterface RouteProps {\r\n bundleId: string;\r\n}\r\n\r\ntype Props = BundleFileDialogProps & DataProps & ModalRouteDecoratorChildProps<RouteProps>;\r\n\r\nclass BundleFileDialog extends Component<Props> {\r\n static displayName = 'BundleFileDialog';\r\n\r\n render() {\r\n const { bundle, ...other } = this.props;\r\n return (\r\n <Modal \r\n className=\"source\" \r\n title={ bundle.name }\r\n subHeader={ bundle.target }\r\n closable={ true } \r\n icon={ <FileIcon typeInfo={ bundle.type }/> } \r\n fullHeight={ true }\r\n { ...other }\r\n >\r\n <BundleFileTable \r\n bundle={ bundle }\r\n />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nexport default ModalRouteDecorator<BundleFileDialogProps, RouteProps>(\r\n DataProviderDecorator<Omit<Props, keyof DataProps>, DataProps>(\r\n BundleFileDialog, {\r\n urls: {\r\n bundle: ({ match }, socket) => socket.get(`${QueueConstants.BUNDLES_URL}/${match.params.bundleId}`),\r\n }\r\n }\r\n ), \r\n 'content/:bundleId'\r\n);","import { default as QueueConstants } from 'constants/QueueConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\n\r\ninterface ActionBundleSourceData {\r\n source: API.QueueBundleSource;\r\n bundle: API.QueueBundle;\r\n}\r\n\r\nconst handleRemoveBundleSource: UI.ActionHandler<ActionBundleSourceData> = ({ data }) => {\r\n const { source, bundle } = data;\r\n return SocketService.delete(`${QueueConstants.BUNDLES_URL}/${bundle.id}/sources/${source.user.cid}`);\r\n};\r\n\r\nconst BundleSourceActions: UI.ActionListType<ActionBundleSourceData> = {\r\n removeBundleSource: {\r\n access: API.AccessEnum.QUEUE_EDIT, \r\n displayName: 'Remove source', \r\n icon: IconConstants.REMOVE,\r\n handler: handleRemoveBundleSource,\r\n },\r\n};\r\n\r\n\r\nexport default {\r\n moduleId: UI.Modules.QUEUE,\r\n subId: 'bundleSource',\r\n actions: BundleSourceActions,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\n\r\nimport QueueBundleSourceActions from 'actions/ui/QueueBundleSourceActions';\r\nimport QueueConstants from 'constants/QueueConstants';\r\n\r\nimport { formatSize, formatSpeed } from 'utils/ValueFormat';\r\n\r\nimport { ActionMenu, UserMenu } from 'components/menu';\r\nimport { UserFileActions } from 'actions/ui/UserActions';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { TFunction } from 'i18next';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface SourceProps {\r\n bundle: API.QueueBundle;\r\n source: API.QueueBundleSource;\r\n t: TFunction;\r\n}\r\n\r\nconst Source: React.FC<SourceProps> = ({ source, bundle, t }) => (\r\n <tr>\r\n <td className=\"user dropdown\">\r\n <UserMenu \r\n userIcon={ true }\r\n user={ source.user }\r\n ids={ UserFileActions }\r\n contextElement=\".source.modal\"\r\n remoteMenuId={ MenuConstants.HINTED_USER }\r\n >\r\n <ActionMenu \r\n actions={ QueueBundleSourceActions } \r\n //ids={ [ 'removeBundleSource' ]} \r\n itemData={ {\r\n source,\r\n bundle,\r\n } }\r\n />\r\n </UserMenu>\r\n </td>\r\n <td className=\"hubs\">\r\n { source.user.hub_names }\r\n </td>\r\n <td className=\"speed\">\r\n { source.last_speed > 0 && formatSpeed(source.last_speed, t) }\r\n </td>\r\n <td className=\"files\">\r\n { source.files }\r\n </td>\r\n <td className=\"size\">\r\n { formatSize(source.size, t) }\r\n </td>\r\n </tr>\r\n);\r\n\r\nconst userSort = (a: API.QueueBundleSource, b: API.QueueBundleSource) => a.user.nicks.localeCompare(b.user.nicks);\r\n\r\n\r\ninterface BundleSourceTableProps {\r\n bundle: API.QueueBundle;\r\n queueT: UI.ModuleTranslator;\r\n}\r\n\r\ninterface BundleSourceTableDataProps extends DataProviderDecoratorChildProps {\r\n sources: API.QueueBundleSource[];\r\n}\r\n\r\nconst BundleSourceTable: React.FC<BundleSourceTableProps & BundleSourceTableDataProps> = (\r\n { sources, bundle, queueT }\r\n) => {\r\n const { translate } = queueT;\r\n\r\n return (\r\n <div className=\"sources\">\r\n <h2>{ translate('Sources') }</h2>\r\n <table className=\"ui striped table\">\r\n <thead>\r\n <tr>\r\n <th>{ translate('User') }</th>\r\n <th>{ translate('Hubs') }</th>\r\n <th>{ translate('Last known speed') }</th>\r\n <th>{ translate('Files') }</th>\r\n <th>{ translate('Size') }</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n { sources.sort(userSort).map(source => (\r\n <Source \r\n key={ source.user.cid }\r\n source={ source }\r\n bundle={ bundle! }\r\n t={ queueT.plainT }\r\n />\r\n )) }\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DataProviderDecorator<BundleSourceTableProps, BundleSourceTableDataProps>(BundleSourceTable, {\r\n urls: {\r\n sources: ({ bundle }, socket) => socket.get(`${QueueConstants.BUNDLES_URL}/${bundle!.id}/sources`),\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData, props }) => {\r\n addSocketListener<API.QueueBundle>(QueueConstants.MODULE_URL, QueueConstants.BUNDLE_SOURCES, data => {\r\n // Avoid flickering when there are many bundles running\r\n if (data.id === props.bundle!.id) {\r\n refetchData();\r\n }\r\n });\r\n }\r\n});","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport ModalRouteDecorator, { ModalRouteDecoratorChildProps } from 'decorators/ModalRouteDecorator';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\n\r\nimport SourceTable from 'routes/Queue/components/BundleSourceTable';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport QueueConstants from 'constants/QueueConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ninterface BundleSourceDialogProps {\r\n queueT: UI.ModuleTranslator;\r\n}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n bundle: API.QueueBundle;\r\n}\r\n\r\ninterface RouteProps { \r\n bundleId: string; \r\n}\r\n\r\ntype Props = BundleSourceDialogProps & ModalRouteDecoratorChildProps<RouteProps>;\r\n\r\nclass SourceDialog extends Component<Props & DataProps> {\r\n static displayName = 'SourceDialog';\r\n\r\n render() {\r\n const { bundle, queueT } = this.props;\r\n return (\r\n <Modal \r\n className=\"source\" \r\n title={ bundle.name }\r\n subHeader={ bundle.target }\r\n closable={ true } \r\n icon={ <FileIcon typeInfo={ bundle.type }/> } \r\n fullHeight={ true }\r\n { ...this.props }\r\n >\r\n <SourceTable \r\n bundle={ bundle }\r\n queueT={ queueT }\r\n />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nexport default ModalRouteDecorator<BundleSourceDialogProps, RouteProps>(\r\n DataProviderDecorator<Props, DataProps>(\r\n SourceDialog, {\r\n urls: {\r\n bundle: ({ match }, socket) => socket.get(`${QueueConstants.BUNDLES_URL}/${match.params.bundleId}`),\r\n }\r\n }\r\n ), \r\n 'sources/:bundleId'\r\n);","import * as React from 'react';\r\nimport { Column } from 'fixed-data-table-2';\r\n\r\nimport QueueActions from 'actions/ui/QueueActions';\r\nimport QueueBundleActions from 'actions/ui/QueueBundleActions';\r\nimport VirtualTable from 'components/table/VirtualTable';\r\n\r\nimport PriorityMenu from 'routes/Queue/components/PriorityMenu';\r\nimport StatusCell from 'routes/Queue/components/StatusCell';\r\nimport QueueBundleViewStore from 'stores/QueueBundleViewStore';\r\n\r\nimport BundleFileDialog from 'routes/Queue/components/BundleFileDialog';\r\nimport SourceDialog from 'routes/Queue/components/BundleSourceDialog';\r\n\r\nimport { ActionMenu } from 'components/menu';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport { \r\n ActionLinkCell, FileActionCell, SizeCell, \r\n SpeedCell, AbbreviatedDurationCell, DurationCell \r\n} from 'components/table/Cell';\r\n\r\nimport '../style.css';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { withTranslation, WithTranslation } from 'react-i18next';\r\nimport { getModuleT } from 'utils/TranslationUtils';\r\nimport { setBundlePriority } from 'services/api/QueueApi';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\nconst PriorityCell: React.FC<RowWrapperCellChildProps<API.QueuePriority, API.QueueBundle>> = (\r\n { cellData, rowDataGetter, t }\r\n) => (\r\n <PriorityMenu \r\n itemPrio={ cellData! } \r\n item={ rowDataGetter!() }\r\n prioAction={ setBundlePriority }\r\n t={ t! }\r\n />\r\n);\r\n\r\nclass Queue extends React.Component<WithTranslation> {\r\n static displayName = 'Queue';\r\n\r\n isActive = (cellData: any, rowData: API.QueueBundle) => {\r\n return !rowData.status.downloaded;\r\n }\r\n\r\n isDownloaded = (cellData: any, rowData: API.QueueBundle) => {\r\n return rowData.status.downloaded;\r\n }\r\n\r\n isRunning = (cellData: any, rowData: API.QueueBundle) => {\r\n return rowData.speed > 0;\r\n }\r\n\r\n emptyRowsNodeGetter = () => {\r\n const { t } = this.queueT;\r\n return (\r\n <Message \r\n title={ t('queueEmpty', 'The queue is empty') }\r\n icon={ IconConstants.FILE }\r\n description={ t<string>(\r\n 'queueEmptyDesc', \r\n 'New items can be queued from search or filelists'\r\n ) }\r\n />\r\n );\r\n }\r\n\r\n queueT = getModuleT(this.props.t, UI.Modules.QUEUE);\r\n render() {\r\n const { translate } = this.queueT;\r\n return (\r\n <>\r\n <VirtualTable\r\n emptyRowsNodeGetter={ this.emptyRowsNodeGetter }\r\n store={ QueueBundleViewStore }\r\n footerData={ \r\n <ActionMenu \r\n className=\"top left pointing\"\r\n caption={ translate('Actions...') } \r\n actions={ QueueActions }\r\n header={ translate('Queue actions') } \r\n triggerIcon=\"chevron up\"\r\n button={ true }\r\n />\r\n }\r\n moduleId={ QueueActions.moduleId }\r\n >\r\n <Column\r\n name=\"Name\"\r\n width={200}\r\n flexGrow={4}\r\n columnKey=\"name\"\r\n cell={ \r\n <FileActionCell \r\n actions={ QueueBundleActions }\r\n remoteMenuId={ MenuConstants.QUEUE_BUNDLE }\r\n ids={[ \r\n 'content', 'sources', \r\n 'divider', \r\n 'search', 'searchBundleAlternates',\r\n 'divider', \r\n 'removeBundle', \r\n 'divider', \r\n 'rescan', 'forceShare' \r\n ]}\r\n /> \r\n }\r\n />\r\n <Column\r\n name=\"Size\"\r\n width={60}\r\n columnKey=\"size\"\r\n cell={ <SizeCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Type/content\"\r\n width={150}\r\n columnKey=\"type\"\r\n hideWidth={1000}\r\n cell={ \r\n <ActionLinkCell \r\n actions={ QueueBundleActions }\r\n actionId=\"content\"\r\n /> \r\n }\r\n />\r\n <Column\r\n name=\"Status\"\r\n width={120}\r\n flexGrow={3}\r\n columnKey=\"status\"\r\n cell={ <StatusCell/> }\r\n />\r\n <Column\r\n name=\"Sources\"\r\n width={60}\r\n columnKey=\"sources\"\r\n renderCondition={ this.isActive }\r\n flexGrow={1}\r\n cell={ \r\n <ActionLinkCell \r\n actions={ QueueBundleActions }\r\n actionId=\"sources\"\r\n /> \r\n }\r\n />\r\n <Column\r\n name=\"Time left\"\r\n width={50}\r\n columnKey=\"seconds_left\"\r\n renderCondition={ this.isRunning }\r\n cell={ <AbbreviatedDurationCell/> }\r\n />\r\n <Column\r\n name=\"Speed\"\r\n width={50}\r\n columnKey=\"speed\"\r\n cell={ <SpeedCell/> }\r\n renderCondition={ this.isRunning }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Priority\"\r\n width={80}\r\n columnKey=\"priority\"\r\n renderCondition={ this.isActive }\r\n cell={ <PriorityCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Added\"\r\n width={100}\r\n columnKey=\"time_added\"\r\n cell={ <DurationCell/> }\r\n hideWidth={1400}\r\n />\r\n <Column\r\n name=\"Finished\"\r\n width={100}\r\n columnKey=\"time_finished\"\r\n cell={ <DurationCell/> }\r\n renderCondition={ this.isDownloaded }\r\n hideWidth={1200}\r\n />\r\n </VirtualTable>\r\n <SourceDialog queueT={ this.queueT }/>\r\n <BundleFileDialog/>\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default withTranslation()(Queue);"],"names":["___CSS_LOADER_EXPORT___","push","module","id","setBundlePriorities","prio","priority","QueueActions","removeCompleted","access","displayName","icon","handler","notifications","onSuccess","divider","pause","resume","moduleId","actions","QueueFileActions","search","data","itemInfo","location","searchFileAlternates","filter","item","time_finished","file","removeFile","confirmation","content","approveCaption","rejectCaption","checkboxCaption","removeFinished","remove_finished","Progress","className","percent","caption","undefined","style","transitionDuration","width","minWidth","propTypes","bundleValidationFailed","bundle","status","itemNotFinished","shareBundle","skipValidation","SocketService","QueueConstants","skip_validation","QueueBundleActions","sources","IconConstants","total","History","pathname","type","SearchActions","searchBundleAlternates","divider2","removeBundle","divider3","rescan","forceShare","PriorityEnum","str","titleClassName","DropdownCaption","PriorityMenu","Component","setPriority","priorityId","prioAction","this","props","t","setAutoPriority","getPriorityListItem","onClose","currentPrio","MenuItemLink","active","onClick","getChildren","children","Object","keys","map","prioKey","itemPrio","auto","shouldComponentUpdate","nextProps","render","toLocaleLowerCase","LoginStore","TableDropdown","getStatusClass","cellData","rowData","completed","statusId","speed","rowDataGetter","failed","downloaded_bytes","size","_viewName","_apiUrl","mixins","ViewStoreMixin","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","PriorityCell","BundleFileTable","isActive","downloaded","isRunning","VirtualTable","store","QueueFileViewStore","sourceFilter","pattern","method","property","Column","name","flexGrow","columnKey","cell","remoteMenuId","MenuConstants","renderCondition","BundleFileDialog","other","Modal","title","subHeader","target","closable","FileIcon","typeInfo","fullHeight","ModalRouteDecorator","DataProviderDecorator","urls","match","socket","get","params","bundleId","BundleSourceActions","removeBundleSource","source","user","cid","subId","Source","userIcon","ids","contextElement","QueueBundleSourceActions","itemData","hub_names","last_speed","files","userSort","a","b","nicks","localeCompare","queueT","translate","sort","plainT","onSocketConnected","addSocketListener","refetchData","SourceDialog","Queue","isDownloaded","emptyRowsNodeGetter","Message","description","QueueBundleViewStore","footerData","header","triggerIcon","button","hideWidth","actionId","withTranslation"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[464],{48366:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(94015),r=n.n(s),i=n(23645),a=n.n(i)()(r());a.push([e.id,"\r\n.fileitem.info.segment .dupe-paths .path {\r\n overflow-x: hidden;\r\n}\r\n\r\n.fileitem.info.segment .download.ui.dropdown {\r\n max-width: 150px;\r\n margin-top: 10px;\r\n}\r\n\r\n.fileitem.info.segment .title.column {\r\n margin-top: auto;\r\n margin-bottom: auto;\r\n}\r\n\r\n.fileitem.info.segment .value.column {\r\n word-break: break-all;\r\n}\r\n","",{version:3,sources:["webpack://./src/components/file-item-info/style.css"],names:[],mappings:";AACA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB",sourcesContent:["\r\n.fileitem.info.segment .dupe-paths .path {\r\n overflow-x: hidden;\r\n}\r\n\r\n.fileitem.info.segment .download.ui.dropdown {\r\n max-width: 150px;\r\n margin-top: 10px;\r\n}\r\n\r\n.fileitem.info.segment .title.column {\r\n margin-top: auto;\r\n margin-bottom: auto;\r\n}\r\n\r\n.fileitem.info.segment .value.column {\r\n word-break: break-all;\r\n}\r\n"],sourceRoot:""}]);const o=a},48931:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(94015),r=n.n(s),i=n(23645),a=n.n(i)()(r());a.push([e.id,".search-container {\r\n width:100%;\r\n height: 50px;\r\n}\r\n\r\n#mobile-layout .search-container {\r\n margin-top: 10px;\r\n}\r\n\r\n.search-container .search-area {\r\n width: 90%;\r\n max-width: 600px;\r\n margin-left: auto;\r\n margin-right: auto;\r\n display: flex;\r\n}\r\n\r\n.search-container .search-area .options.trigger {\r\n margin-left: 5px;\r\n}\r\n\r\n.search-container .search-area .options.trigger .button {\r\n padding-left: 15px;\r\n padding-right: 5px;\r\n height: 100%;\r\n}\r\n\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, \r\n.search-area .react-autosuggest__container,\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, .search-area input {\r\n width: 100%;\r\n}\r\n\r\n.search-area button {\r\n display: inline-block !important;\r\n}\r\n\r\n.search-layout {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n}\r\n\r\n.search-layout .virtual-table {\r\n height: calc(100% - 50px);\r\n}\r\n\r\n@media only screen and (min-width: 767px) {\r\n .result.modal td {\r\n max-width: 250px;\r\n }\r\n}\r\n\r\n.search-options {\r\n min-width: 300px;\r\n}\r\n\r\n.search-options .field-hub_urls {\r\n max-height: 180px;\r\n overflow-y: auto;\r\n}\r\n","",{version:3,sources:["webpack://./src/routes/Search/style.css"],names:[],mappings:"AAAA;EACE,UAAU;EACV,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,UAAU;EACV,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;EAClB,aAAa;AACf;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,OAAO;AACT;;AAEA;;;EAGE,OAAO;AACT;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE;IACE,gBAAgB;EAClB;AACF;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,gBAAgB;AAClB",sourcesContent:[".search-container {\r\n width:100%;\r\n height: 50px;\r\n}\r\n\r\n#mobile-layout .search-container {\r\n margin-top: 10px;\r\n}\r\n\r\n.search-container .search-area {\r\n width: 90%;\r\n max-width: 600px;\r\n margin-left: auto;\r\n margin-right: auto;\r\n display: flex;\r\n}\r\n\r\n.search-container .search-area .options.trigger {\r\n margin-left: 5px;\r\n}\r\n\r\n.search-container .search-area .options.trigger .button {\r\n padding-left: 15px;\r\n padding-right: 5px;\r\n height: 100%;\r\n}\r\n\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, \r\n.search-area .react-autosuggest__container,\r\n.search-container .search-area .ui.input.action {\r\n flex: 1;\r\n}\r\n\r\n.search-area, .search-area input {\r\n width: 100%;\r\n}\r\n\r\n.search-area button {\r\n display: inline-block !important;\r\n}\r\n\r\n.search-layout {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n}\r\n\r\n.search-layout .virtual-table {\r\n height: calc(100% - 50px);\r\n}\r\n\r\n@media only screen and (min-width: 767px) {\r\n .result.modal td {\r\n max-width: 250px;\r\n }\r\n}\r\n\r\n.search-options {\r\n min-width: 300px;\r\n}\r\n\r\n.search-options .field-hub_urls {\r\n max-height: 180px;\r\n overflow-y: auto;\r\n}\r\n"],sourceRoot:""}]);const o=a},28252:(e,t,n)=>{n.d(t,{Y:()=>w});var s=n(85893),r=(n(67294),n(2445)),i=n(47021),a=n(76249),o=n(32347),l=n(26793),c=n(8717),d=n(93379),u=n.n(d),h=n(7795),p=n.n(h),m=n(90569),v=n.n(m),g=n(3565),A=n.n(g),x=n(19216),f=n.n(x),j=n(44589),b=n.n(j),y=n(48366),E={};E.styleTagTransform=b(),E.setAttributes=A(),E.insert=v().bind(null,"head"),E.domAPI=p(),E.insertStyleElement=f(),u()(y.Z,E),y.Z&&y.Z.locals&&y.Z.locals;var C=n(24101);const O={[a.V9.SHARE_PARTIAL]:"Share (partial)",[a.V9.SHARE_FULL]:"Share (full)",[a.V9.QUEUE_PARTIAL]:"Queue (partial)",[a.V9.QUEUE_FULL]:"Queue (full)",[a.V9.FINISHED_PARTIAL]:"Finished (partial)",[a.V9.FINISHED_FULL]:"Finished (full)",[a.V9.SHARE_QUEUE]:"Share and queue"},S=({paths:e})=>(0,s.jsx)("div",Object.assign({className:"dupe-paths"},{children:e.map((e=>(0,s.jsx)("div",Object.assign({className:"path"},{children:e}),e)))}),void 0),w=({session:e,fileItem:t,user:n,downloadHandler:a,showPath:d=!0})=>{const{t:u}=(0,l.$)(),h=e=>(0,c.Iu)(e,u,o.jv.COMMON);return(0,s.jsxs)("div",Object.assign({className:"ui fileitem info segment"},{children:[(0,s.jsxs)(C.rj,Object.assign({columns:"two",stackable:!0},{children:[(0,s.jsx)(C.X2,{title:h("Name"),text:t.name},void 0),(0,s.jsx)(C.X2,{title:h("Type/content"),text:t.type.str},void 0),(0,s.jsx)(C.X2,{title:h("Size"),text:(0,r.BU)(t.size,u,!0)},void 0),(0,s.jsx)(C.X2,{title:h("Last modified"),text:(0,r.SY)(t.time||0)},void 0),"file"===t.type.id&&(0,s.jsx)(C.X2,{title:h("TTH"),text:t.tth},void 0),!!t.dupe&&(0,s.jsx)(C.X2,{title:h("Dupe type"),text:h(O[t.dupe.id])},void 0),!!t.dupe&&(0,s.jsx)(C.X2,{title:h("Dupe paths"),text:(0,s.jsx)(S,{paths:t.dupe.paths},void 0)},void 0),d&&(0,s.jsx)(C.X2,{title:h("Path"),text:t.path},void 0)]}),void 0),(0,s.jsx)(i.Yk,{caption:h("Actions..."),button:!0,user:n,itemInfoGetter:()=>t,downloadHandler:a,contextElement:".ui.modal > .content",session:e},void 0)]}),void 0)}},48005:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(85893),r=(n(67294),n(35936)),i=n(55019);const a=e=>{var{hub:t}=e,n=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["hub"]);return(0,s.jsx)(r.Z,Object.assign({},n,{icon:(0,i.iU)(t.connect_state.id)+" sitemap"}),void 0)}},14954:(e,t,n)=>{n.r(t),n.d(t,{default:()=>qe});var s=n(85893),r=n(67294),i=n(38423),a=n(20097),o=n(69767),l=n(93379),c=n.n(l),d=n(7795),u=n.n(d),h=n(90569),p=n.n(h),m=n(3565),v=n.n(m),g=n(19216),A=n.n(g),x=n(44589),f=n.n(x),j=n(48931),b={};b.styleTagTransform=f(),b.setAttributes=v(),b.insert=p().bind(null,"head"),b.domAPI=u(),b.insertStyleElement=A(),c()(j.Z,b),j.Z&&j.Z.locals&&j.Z.locals;var y=n(48117),E=n(45241),C=n(77744),O=n(76249),S=n(32347);const w={result:{displayName:"Result details",icon:y.Z.OPEN,handler:({data:e,location:t})=>{a.Z.push(`${t.pathname}/result/${e.id}`)}},browseContent:{displayName:"Browse content",access:O.PS.FILELISTS_EDIT,icon:y.Z.FILELIST,handler:({data:e,location:t})=>E.Z.createSession(t,e.users.user,C.Z,e.path)}},_={moduleId:S.jv.SEARCH,actions:w};var Z=n(28427),N=n(20368),I=n(62285),T=n(42090),R=n(91780),B=n(2445),U=n(47021),P=n(90195),k=n(26793),D=n(8717),L=n(4333);const H=({result:e,t})=>(0,s.jsxs)("tr",{children:[(0,s.jsx)("td",Object.assign({className:"user dropdown"},{children:(0,s.jsx)(U.Ie,{userIcon:!0,user:e.user,directory:e.path,ids:P.D,contextElement:".ui.modal > .content",remoteMenuId:L.Z.HINTED_USER},void 0)}),void 0),(0,s.jsx)("td",Object.assign({className:"hubs"},{children:e.user.hub_names}),void 0),(0,s.jsx)("td",Object.assign({className:"connection"},{children:(0,B.Nh)(e.connection,t)}),void 0),(0,s.jsx)("td",Object.assign({className:"slots"},{children:e.slots.str}),void 0),(0,s.jsx)("td",Object.assign({className:"ip"},{children:(0,s.jsx)(R.Z,{item:e.ip},void 0)}),void 0),(0,s.jsx)("td",Object.assign({className:"path",title:e.path},{children:e.path}),void 0)]},void 0),F=(e,t)=>e.user.nicks.localeCompare(t.user.nicks),G=(0,T.Z)((({results:e})=>{const{t}=(0,k.$)();return(0,s.jsxs)("div",Object.assign({className:"users"},{children:[(0,s.jsx)("h2",{children:t((0,D.zS)("usersCount",S.jv.SEARCH),{defaultValue:"User ({{count}})",defaultValue_plural:"Users ({{count}})",count:e.length})},void 0),(0,s.jsxs)("table",Object.assign({className:"ui striped table"},{children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{children:(0,D.Iu)("User",t,S.jv.SEARCH)},void 0),(0,s.jsx)("th",{children:(0,D.Iu)("Hubs",t,S.jv.SEARCH)},void 0),(0,s.jsx)("th",Object.assign({style:{width:"70px"}},{children:(0,D.Iu)("Connection",t,S.jv.SEARCH)}),void 0),(0,s.jsx)("th",Object.assign({style:{width:"50px"}},{children:(0,D.Iu)("Slots",t,S.jv.SEARCH)}),void 0),(0,s.jsx)("th",{children:(0,D.Iu)("IP",t,S.jv.SEARCH)},void 0),(0,s.jsx)("th",{children:(0,D.Iu)("Path",t,S.jv.SEARCH)},void 0)]},void 0)},void 0),(0,s.jsx)("tbody",{children:e.sort(F).map((e=>(0,s.jsx)(H,{result:e,t},e.user.cid)))},void 0)]}),void 0)]}),void 0)}),{urls:{results:({parentResult:e,instanceId:t},n)=>n.get(`${i.Z.INSTANCES_URL}/${t}/results/${e.id}/children`)}});var $=n(92245),z=n(28252),Y=n(518);const V=(e,t,n,s)=>Y.Z.post(`${i.Z.MODULE_URL}/${s.id}/results/${e.id}/download`,n);class M extends r.Component{constructor(){super(...arguments),this.itemDataGetter=(e,t)=>{const{instance:n}=this.props;return t.get(`${i.Z.INSTANCES_URL}/${n.id}/results/${e}`)}}render(){const{parentResult:e,instance:t}=this.props;return(0,s.jsxs)(Z.Z,Object.assign({className:"result",title:e.name,closable:!0,icon:(0,s.jsx)(N.Z,{typeInfo:e.type},void 0),fullHeight:!0},this.props,{children:[(0,s.jsx)(I.Z,{downloadHandler:V,itemDataGetter:this.itemDataGetter,session:t},void 0),(0,s.jsx)(z.Y,{fileItem:e,downloadHandler:V,user:e.users.user,showPath:!1,session:t},void 0),(0,s.jsx)(G,{parentResult:e,instanceId:t.id},void 0)]}),void 0)}}M.displayName="ResultDialog";const K=(0,$.ZP)((0,T.Z)(M,{urls:{parentResult:({match:e,instance:t},n)=>n.get(`${i.Z.INSTANCES_URL}/${t.id}/results/${e.params.resultId}`)}}),"result/:resultId");var W=n(10293),X=n.n(W),q=n(93836);const Q=X().createStore({_viewName:"search_view",_apiUrl:i.Z.INSTANCES_URL,mixins:[(0,q.Z)("relevance",!1)]});var J=n(35108),ee=n(78230),te=n(68126),ne=n(55019),se=n(27695),re=n(89116);const ie=({count:e,user:t},n)=>e>1?n((0,D.zS)("xUsersNicks",S.jv.SEARCH),{defaultValue:"{{count}} user ({{user.nicks}})",defaultValue_plural:"{{count}} users ({{user.nicks}})",count:e,replace:{count:e,user:t}}):t.nicks,ae=({cellData:e,rowDataGetter:t,t:n})=>(0,s.jsx)(U.cG,Object.assign({text:ie(e,n),user:e.user,directory:t().path,userIcon:"simple",ids:P.D,remoteMenuId:L.Z.HINTED_USER},{children:(0,s.jsx)(U.B2,{actions:_,itemData:t,ids:["result"]},void 0)}),void 0),oe=e=>(e&&e.users,e.users.user),le=e=>{var{rowDataGetter:t,instance:n}=e,r=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["rowDataGetter","instance"]);return(0,s.jsx)(te.iK,Object.assign({userGetter:oe,rowDataGetter:t,downloadHandler:V,session:n},r,{children:(0,s.jsx)(U.B2,{actions:_,itemData:t,remoteMenuId:L.Z.GROUPED_SEARCH_RESULT,entityId:n.id},void 0)}),void 0)};class ce extends r.Component{constructor(){super(...arguments),this.rowClassNameGetter=e=>(0,ne.r)(e.dupe),this.emptyRowsNodeGetter=()=>{const{running:e,searchString:t,searchT:n}=this.props;return e?null:!!t&&(0,s.jsx)(se.Z,{title:n.t("noResults",{defaultValue:'No results found for "{{searchString}}"',replace:{searchString:t}}),description:(0,s.jsx)(re.c,Object.assign({i18nKey:n.toI18nKey("noResultsHint")},{children:(0,s.jsxs)("div",Object.assign({className:"ui bulleted list"},{children:[(0,s.jsx)("div",Object.assign({className:"item"},{children:"Ensure that you spelled the words correctly"}),void 0),(0,s.jsx)("div",Object.assign({className:"item"},{children:"Use different keywords"}),void 0),(0,s.jsx)("div",Object.assign({className:"item"},{children:"You are searching too frequently (hubs often have a minimum search interval)"}),void 0),(0,s.jsx)("div",Object.assign({className:"item"},{children:"If you never receive results for common search terms, make sure that your connectivity settings are configured properly"}),void 0)]}),void 0)}),void 0)},void 0)},this.itemDataGetter=(e,t)=>{const{instance:n}=this.props;return t.get(`${i.Z.INSTANCES_URL}/${n.id}/results/${e}`)}}render(){const{searchT:e,instance:t}=this.props;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(ee.Z,Object.assign({emptyRowsNodeGetter:this.emptyRowsNodeGetter,rowClassNameGetter:this.rowClassNameGetter,store:Q,textFilterProps:{autoFocus:!1},entityId:t.id,moduleId:_.moduleId},{children:[(0,s.jsx)(J.Column,{name:"Name",width:200,columnKey:"name",flexGrow:8,cell:(0,s.jsx)(le,{instance:t},void 0)},void 0),(0,s.jsx)(J.Column,{name:"Size",width:60,columnKey:"size",cell:(0,s.jsx)(te.Eh,{},void 0),flexGrow:1},void 0),(0,s.jsx)(J.Column,{name:"Type",width:80,columnKey:"type",flexGrow:1,hideWidth:600},void 0),(0,s.jsx)(J.Column,{name:"Relevance",width:60,columnKey:"relevance",cell:(0,s.jsx)(te.uL,{},void 0),flexGrow:1},void 0),(0,s.jsx)(J.Column,{name:"Connection",width:60,columnKey:"connection",cell:(0,s.jsx)(te.$A,{},void 0),flexGrow:2,hideWidth:600},void 0),(0,s.jsx)(J.Column,{name:"Users",width:120,columnKey:"users",flexGrow:3,cell:(0,s.jsx)(ae,{},void 0),hideWidth:600},void 0),(0,s.jsx)(J.Column,{name:"Last modified",width:80,columnKey:"time",cell:(0,s.jsx)(te.Ks,{},void 0),flexGrow:1,hideWidth:800},void 0),(0,s.jsx)(J.Column,{name:"Slots",width:60,columnKey:"slots",flexGrow:1,hideWidth:800},void 0)]}),void 0),(0,s.jsx)(I.Z,{downloadHandler:V,itemDataGetter:this.itemDataGetter,session:t},void 0),(0,s.jsx)(K,{searchT:e,instance:t},void 0)]},void 0)}}ce.displayName="ResultTable";const de=ce;var ue=n(15479),he=n(26435),pe=n(3629),me=n(89519);const ve=(0,T.Z)((e=>{var{submitHandler:t,historyId:n,history:r,refetchData:i}=e,a=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["submitHandler","historyId","history","refetchData"]);const{t:o}=(0,k.$)();return(0,s.jsx)(he.Z,Object.assign({},a,{data:r,submitHandler:e=>{return s=void 0,r=void 0,l=function*(){const s=e.trim();yield(0,me.h9)((()=>(0,pe.V)(n,s)),o),i(),t(s)},new((a=void 0)||(a=Promise))((function(e,t){function n(e){try{o(l.next(e))}catch(e){t(e)}}function i(e){try{o(l.throw(e))}catch(e){t(e)}}function o(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(n,i)}o((l=l.apply(s,r||[])).next())}));var s,r,a,l}}),void 0)}),{urls:{history:({historyId:e},t)=>t.get(ue.ZP.STRINGS_URL+"/"+e)},loaderText:null});var ge=n(84807),Ae=n(10606),xe=n(95887),fe=n(70516),je=n(18603),be=n(48005),ye=n(35451),Ee=n(35936);const Ce=({locals:e,children:t})=>{const{label:n}=e,r=(0,je.T7)(e.value);return(0,s.jsxs)(ye.ZP,Object.assign({className:"field",defaultActiveIndexes:r?[0]:void 0},{children:[(0,s.jsxs)(ye.il,{children:[(0,s.jsx)(Ee.Z,{icon:y.Z.DROPDOWN},void 0),(0,s.jsx)("span",Object.assign({style:r?{fontWeight:"bold"}:void 0},{children:n}),void 0)]},void 0),(0,s.jsx)(ye.vF,{children:t},void 0)]}),void 0)},Oe=({hubs:e,value:t,onChange:n})=>{const r=e.filter((e=>e.connect_state.id===O.XF.CONNECTED)),i=t&&t.length?t:r.map((e=>e.hub_url)),a=()=>{if(1===i.length)return!1};return(0,s.jsx)(s.Fragment,{children:r.map((e=>(0,s.jsx)("div",Object.assign({className:"field"},{children:(0,s.jsx)(fe.Z,{caption:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(be.Z,{hub:e},void 0),e.identity.name]},void 0),beforeUnchecked:a,checked:-1!==i.indexOf(e.hub_url),onChange:t=>{const s=(0,je.Nl)(i,e.hub_url,t);n(s.length===r.length?null:s)},style:{maxWidth:"300px"}},void 0)}),e.id)))},void 0)},Se={renderSelect:e=>(0,s.jsx)(Ce,Object.assign({locals:e},{children:(0,s.jsx)(Oe,{onChange:e.onChange,value:e.value,hubs:e.options},void 0)}),void 0),renderLabel:e=>null},we=xe.ZP.form.Form.templates.select.clone(Se),_e=({inputProps:e,moduleT:t,onChange:n,value:i})=>{const[a,o]=(0,r.useState)(void 0),[l,c]=(0,r.useState)(2),d=()=>{let e=a||0;if(l)for(let t=1;t<=l;t++)e*=1024;return e};return(0,r.useEffect)((()=>{const e=d();e!==i&&n(e)}),[l,a]),(0,r.useEffect)((()=>{const e=d();if(i!==e){const{value:e,unitIndex:t}=(0,B.n2)(i,B.U5,1024);o(e),c(i?t:2)}}),[i]),(0,s.jsxs)("div",Object.assign({style:{display:"flex"}},{children:[(0,s.jsx)("input",Object.assign({className:"ui input",type:"number"},e,{min:0,value:a||"",onChange:e=>{let t=e.target.value?parseInt(e.target.value):null;o(t||void 0)}}),void 0),(0,s.jsx)("select",Object.assign({className:"ui select",style:{maxWidth:"100px"},value:B.U5[l],onChange:e=>{c(e.target.selectedIndex)}},{children:B.U5.map(((e,n)=>(0,s.jsx)("option",Object.assign({value:e},{children:(0,B.Ac)(e,t.plainT)}),e)))}),void 0)]}),void 0)},Ze={renderInput:e=>(0,s.jsx)(_e,{onChange:e.onChange,value:e.value?parseInt(e.value):0,moduleT:e.context.formT},void 0)},Ne=xe.ZP.form.Form.templates.textbox.clone(Ze);var Ie=n(68662),Te=n(98374);const Re=({type:e,size:t="large"})=>{return e.id?(0,s.jsx)(N.Z,{typeInfo:(n=e,"directory"===n.id?{id:"directory",str:"",files:0,directories:0}:{id:"file",str:"",content_type:n.id}),size:t},void 0):(0,s.jsx)(Ee.Z,{icon:y.Z.ANY,size:t},void 0);var n},Be=(e,t,n)=>(0,s.jsx)(Te.Z,Object.assign({onClick:()=>t(e.id),icon:(0,s.jsx)(Re,{type:e},void 0),active:n.id===e.id},{children:e.str}),e.id||i.Z.DEFAULT_SEARCH_TYPE),Ue=(0,T.Z)((({searchTypes:e,value:t,onChange:n,moduleT:r})=>{const i=(e=>[{id:null,str:e.translate("Any")},{id:"directory",str:e.translate("Directory")},{id:"file",str:e.translate("File")}])(r),a=e.find((e=>t===e.id))||i.find((e=>t===e.id))||i[0];return(0,s.jsxs)(Ie.Z,Object.assign({selection:!0,caption:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(Re,{type:a,size:""},void 0),a.str]},void 0)},{children:[i.map((e=>Be(e,n,a))),(0,s.jsx)("div",{className:"ui divider"},"divider"),e.map((e=>Be(e,n,a)))]}),void 0)}),{urls:{searchTypes:i.Z.SEARCH_TYPES_URL}}),Pe={renderSelect:e=>(0,s.jsx)(Ue,{onChange:e.onChange,value:e.value||null,moduleT:e.context.formT},void 0)},ke=xe.ZP.form.Form.templates.select.clone(Pe);var De=n(43496);const Le={renderFieldset(e,t){const{label:n}=t,r=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(t,["label"]);return(0,s.jsx)(Ce,Object.assign({locals:t},{children:xe.ZP.form.Form.templates.struct.renderFieldset(e,r)}),void 0)},renderLabel:e=>null},He=xe.ZP.form.Form.templates.struct.clone(Le),Fe=[{key:"file_type",title:"File type",type:O.Y2.STRING,optional:!0},{key:"hub_urls",title:"Hubs",type:O.Y2.LIST,item_type:O.Y2.STRING},{key:"size_limits",title:"Size limits",type:O.Y2.STRUCT,optional:!0,definitions:[{key:"min_size",title:"Minimum size",type:O.Y2.NUMBER,optional:!0},{key:"max_size",title:"Maximum size",type:O.Y2.NUMBER,optional:!0}]}];class Ge extends r.PureComponent{constructor(e){super(e),this.onFieldChanged=(e,t,n)=>{const s=(r=t,Object.keys(r).reduce(((e,t)=>{const n=r[t];return(0,je.T7)(n)&&(e[t]=n),e}),{}));var r;return this.props.onChange(Object.keys(s).length?s:null),null},this.save=()=>this.form.save(),this.onSave=e=>Promise.resolve(),this.onFieldSetting=(e,t,n)=>{"hub_urls"===e?Object.assign(t,{factory:xe.ZP.form.Select,template:we,options:this.props.hubs}):"min_size"===e||"max_size"===e?Object.assign(t,{template:Ne}):"excluded"===e?Object.assign(t,{disableOrder:!0}):"file_type"===e?Object.assign(t,{template:ke}):"size_limits"===e&&Object.assign(t,{template:He})},this.definitions=(0,je.rv)(Fe,e.moduleT)}render(){const{value:e,onChange:t,location:n,moduleT:r}=this.props;return(0,s.jsxs)("div",{children:[(0,s.jsx)(De.Z,{ref:e=>this.form=e,onFieldChanged:this.onFieldChanged,onFieldSetting:this.onFieldSetting,onSave:this.onSave,fieldDefinitions:this.definitions,value:e,location:n,optionTitleFormatter:e=>e.title,className:"search-options"},void 0),(0,s.jsx)(ge.Z,{caption:r.translate("Reset all"),onClick:()=>t(null),disabled:!e,style:{marginTop:"10px"}},void 0)]},void 0)}}Ge.displayName="SearchOptionForm";var $e=n(27835),ze=n(21222);const Ye=(0,T.Z)((({moduleT:e,location:t,onChange:n,value:i,hubs:a})=>{const o=e=>{if(e){const t=(e=>Object.keys(e).reduce(((t,n)=>((Array.isArray(e[n])?e[n].length:e[n])&&(t[n]=e[n]),t)),{}))(e);n(Object.keys(t).length?t:null)}else n(null)};(0,r.useEffect)((()=>{if(i&&i.hub_urls&&i.hub_urls.length){const e=i.hub_urls,t=e.filter((e=>a.find((t=>t.hub_url===e))));t.length!==e.length&&o(Object.assign(Object.assign({},i),{hub_urls:t.length?t:null}))}}),[a]);const l=i?Object.keys(i).filter((e=>{const t=i[e];return(0,je.T7)(t)})).length:null;return(0,s.jsx)($e.Z,Object.assign({triggerClassName:"options",className:"options",trigger:(0,s.jsx)(ge.Z,{caption:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(Ee.Z,{icon:y.Z.OPTIONS},void 0),!!l&&(0,s.jsx)("span",Object.assign({style:{fontWeight:"bold",marginRight:"3px",color:"black"}},{children:`(${l})`}),void 0),(0,s.jsx)(Ee.Z,{icon:y.Z.EXPAND},void 0)]},void 0)},void 0),contentUpdateTrigger:i},{children:n=>(0,s.jsx)(Ge,{moduleT:e,location:t,onChange:o,value:i,hubs:a},void 0)}),void 0)}),{urls:{hubs:ze.Z.SESSIONS_URL},onSocketConnected:(e,{refetchData:t})=>{e(ze.Z.MODULE_URL,ze.Z.SESSION_CREATED,(()=>t())),e(ze.Z.MODULE_URL,ze.Z.SESSION_UPDATED,(e=>{e.connect_state&&t()})),e(ze.Z.MODULE_URL,ze.Z.SESSION_REMOVED,(()=>t()))},dataConverters:{hubs:e=>e.filter((e=>e.connect_state.id===O.XF.CONNECTED))}}),Ve=({moduleT:e,defaultValue:t,running:n,handleSubmit:i,location:a,defaultOptions:o})=>{const[l,c]=(0,r.useState)(o),d=(0,Ae.wd)();return(0,s.jsx)("div",Object.assign({className:"search-container"},{children:(0,s.jsxs)("div",Object.assign({className:"search-area"},{children:[(0,s.jsx)(ve,{historyId:ue.n0.SEARCH,submitHandler:e=>i(e,l||void 0),disabled:n,defaultValue:t,placeholder:e.translate("Enter search string..."),button:(0,s.jsx)(ge.Z,{className:"blue",icon:y.Z.SEARCH,caption:d?void 0:e.translate("Search"),loading:n},void 0)},void 0),(0,s.jsx)(Ye,{moduleT:e,location:a,onChange:c,value:l},void 0)]}),void 0)}),void 0)};var Me=n(57136),Ke=n(66883),We=function(e,t,n,s){return new(n||(n=Promise))((function(r,i){function a(e){try{l(s.next(e))}catch(e){i(e)}}function o(e){try{l(s.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,o)}l((s=s.apply(e,t||[])).next())}))};class Xe extends r.Component{constructor(){super(...arguments),this.state={searchString:"",running:!1},this.checkLocationState=e=>{const{state:t}=e.location;t&&t.searchString&&t.searchString!==this.state.searchString&&(this.search(t.searchString),a.Z.replace({pathname:e.location.pathname}))},this.search=(e,t)=>We(this,void 0,void 0,(function*(){console.log("Searching"),clearTimeout(this.searchTimeout);const n=t||{},{hub_urls:s,size_limits:r}=n,a=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(n,["hub_urls","size_limits"]);try{const t=yield(o=this.props.instance,l={query:Object.assign(Object.assign({pattern:e},r),a),priority:O.Gu.HIGH,hub_urls:s},Y.Z.post(`${i.Z.INSTANCES_URL}/${o.id}/hub_search`,l));this.onSearchPosted(t),this.setState({searchString:e,running:!0})}catch(e){Me.Z.apiError("Search failed",e)}var o,l})),this.onSearchPosted=e=>{this.searchTimeout=window.setTimeout((()=>{this.setState({running:!1})}),e.queue_time+4e3)},this.parseOptions=()=>{const{query:e}=this.props.instance;return e?{excluded:e.excluded,size_limits:{min_size:e.min_size,max_size:e.max_size},file_type:e.file_type===i.Z.DEFAULT_SEARCH_TYPE||"tth"===e.file_type?null:e.file_type,hub_urls:[]}:null},this.searchT=(0,D.HY)(this.props.t,S.jv.SEARCH)}componentDidMount(){this.checkLocationState(this.props);const{query:e}=this.props.instance;e&&this.setState({searchString:e.pattern})}componentDidUpdate(e){this.checkLocationState(this.props)}render(){const{instance:e,location:t}=this.props,{searchString:n,running:r}=this.state,{t:i}=this.searchT;return(0,s.jsx)(o.Z,Object.assign({offlineMessage:i("searchOffline","You must to be connected to at least one hub in order to perform searches")},{children:(0,s.jsxs)("div",Object.assign({className:"search-layout"},{children:[(0,s.jsx)(Ve,{moduleT:this.searchT,running:r,defaultValue:n,handleSubmit:this.search,location:t,defaultOptions:this.parseOptions()},void 0),(0,s.jsx)(de,{searchString:n,running:r,searchT:this.searchT,instance:e},void 0)]}),void 0)}),void 0)}}const qe=(0,T.Z)(Xe,{urls:{instance:(e,t)=>We(void 0,void 0,void 0,(function*(){const e=(yield t.get(`${i.Z.INSTANCES_URL}`)).find((e=>e.owner===`session:${Ke.Z.sessionId}:webui`));if(e)return e;const n=(yield t.post(i.Z.INSTANCES_URL,{owner_suffix:"webui",expiration:0})).id;return t.get(`${i.Z.INSTANCES_URL}/${n}`)}))}})}}]);
|
|
2
|
-
//# sourceMappingURL=search.ef2d64870dc65f549d8c.chunk.js.map
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"js/search.ef2d64870dc65f549d8c.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/file-item-info/style.css","webpack://airdcpp-webui/./src/routes/Search/style.css","webpack://airdcpp-webui/./src/components/file-item-info/style.css?a322","webpack://airdcpp-webui/./src/components/file-item-info/FileItemInfoGrid.tsx","webpack://airdcpp-webui/./src/components/icon/HubIcon.tsx","webpack://airdcpp-webui/./src/routes/Search/style.css?d43b","webpack://airdcpp-webui/./src/actions/ui/SearchActions.ts","webpack://airdcpp-webui/./src/routes/Search/components/result-dialog/UserResultTable.tsx","webpack://airdcpp-webui/./src/services/api/SearchApi.ts","webpack://airdcpp-webui/./src/routes/Search/components/result-dialog/ResultDialog.tsx","webpack://airdcpp-webui/./src/stores/SearchViewStore.js","webpack://airdcpp-webui/./src/routes/Search/components/ResultTable.tsx","webpack://airdcpp-webui/./src/components/autosuggest/HistoryInput.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/AccordionField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/HubSelectField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/SizeField.tsx","webpack://airdcpp-webui/./src/components/icon/SearchTypeIcon.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/FileTypeField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/AccordionStructField.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/SearchOptionsForm.tsx","webpack://airdcpp-webui/./src/routes/Search/components/options-panel/SearchOptionsButton.tsx","webpack://airdcpp-webui/./src/routes/Search/components/SearchInput.tsx","webpack://airdcpp-webui/./src/routes/Search/components/Search.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\r\\n.fileitem.info.segment .dupe-paths .path {\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .download.ui.dropdown {\\r\\n max-width: 150px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .title.column {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .value.column {\\r\\n word-break: break-all;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/file-item-info/style.css\"],\"names\":[],\"mappings\":\";AACA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB\",\"sourcesContent\":[\"\\r\\n.fileitem.info.segment .dupe-paths .path {\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .download.ui.dropdown {\\r\\n max-width: 150px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .title.column {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .value.column {\\r\\n word-break: break-all;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".search-container {\\r\\n width:100%;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n#mobile-layout .search-container {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.search-container .search-area {\\r\\n width: 90%;\\r\\n max-width: 600px;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger {\\r\\n margin-left: 5px;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger .button {\\r\\n padding-left: 15px;\\r\\n padding-right: 5px;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, \\r\\n.search-area .react-autosuggest__container,\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, .search-area input {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.search-area button {\\r\\n display: inline-block !important;\\r\\n}\\r\\n\\r\\n.search-layout {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-layout .virtual-table {\\r\\n height: calc(100% - 50px);\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 767px) {\\r\\n .result.modal td {\\r\\n max-width: 250px;\\r\\n }\\r\\n}\\r\\n\\r\\n.search-options {\\r\\n min-width: 300px;\\r\\n}\\r\\n\\r\\n.search-options .field-hub_urls {\\r\\n max-height: 180px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Search/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,UAAU;EACV,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,UAAU;EACV,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;EAClB,aAAa;AACf;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,OAAO;AACT;;AAEA;;;EAGE,OAAO;AACT;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE;IACE,gBAAgB;EAClB;AACF;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,gBAAgB;AAClB\",\"sourcesContent\":[\".search-container {\\r\\n width:100%;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n#mobile-layout .search-container {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.search-container .search-area {\\r\\n width: 90%;\\r\\n max-width: 600px;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger {\\r\\n margin-left: 5px;\\r\\n}\\r\\n\\r\\n.search-container .search-area .options.trigger .button {\\r\\n padding-left: 15px;\\r\\n padding-right: 5px;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, \\r\\n.search-area .react-autosuggest__container,\\r\\n.search-container .search-area .ui.input.action {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.search-area, .search-area input {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.search-area button {\\r\\n display: inline-block !important;\\r\\n}\\r\\n\\r\\n.search-layout {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.search-layout .virtual-table {\\r\\n height: calc(100% - 50px);\\r\\n}\\r\\n\\r\\n@media only screen and (min-width: 767px) {\\r\\n .result.modal td {\\r\\n max-width: 250px;\\r\\n }\\r\\n}\\r\\n\\r\\n.search-options {\\r\\n min-width: 300px;\\r\\n}\\r\\n\\r\\n.search-options .field-hub_urls {\\r\\n max-height: 180px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\r\n\r\nimport { formatRelativeTime, formatSize } from 'utils/ValueFormat';\r\n\r\nimport { DownloadMenu } from 'components/menu';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\n\r\nimport './style.css';\r\nimport { Row, Grid } from 'components/semantic/Grid';\r\n\r\n\r\nconst DupeStrings = {\r\n //[API.DupeEnum.NONE]: 'None',\r\n [API.DupeEnum.SHARE_PARTIAL]: 'Share (partial)',\r\n [API.DupeEnum.SHARE_FULL]: 'Share (full)',\r\n [API.DupeEnum.QUEUE_PARTIAL]: 'Queue (partial)',\r\n [API.DupeEnum.QUEUE_FULL]: 'Queue (full)',\r\n [API.DupeEnum.FINISHED_PARTIAL]: 'Finished (partial)',\r\n [API.DupeEnum.FINISHED_FULL]: 'Finished (full)',\r\n [API.DupeEnum.SHARE_QUEUE]: 'Share and queue',\r\n};\r\n\r\nconst DupePaths: React.FC<{ paths: string[] }> = ({ paths }) => (\r\n <div className=\"dupe-paths\">\r\n { paths.map(path => (\r\n <div key={ path } className=\"path\">\r\n { path }\r\n </div>\r\n )) }\r\n </div>\r\n);\r\n\r\ninterface FileItemInfoGridProps {\r\n fileItem: UI.DownloadableItemInfo;\r\n user: API.HintedUser;\r\n downloadHandler: UI.DownloadHandler<UI.DownloadableItemInfo>;\r\n showPath?: boolean;\r\n session: UI.SessionItemBase;\r\n}\r\n\r\nconst FileItemInfoGrid: React.FC<FileItemInfoGridProps> = ({ \r\n session, fileItem, user, downloadHandler, showPath = true \r\n}) => {\r\n const { t } = useTranslation();\r\n const gridT = (text: string) => {\r\n return translate(text, t, UI.Modules.COMMON);\r\n };\r\n\r\n return (\r\n <div className=\"ui fileitem info segment\">\r\n <Grid \r\n columns=\"two\"\r\n stackable={ true }\r\n >\r\n <Row \r\n title={ gridT('Name') }\r\n text={ fileItem.name }\r\n />\r\n <Row \r\n title={ gridT('Type/content') } \r\n text={ fileItem.type.str }\r\n />\r\n <Row \r\n title={ gridT('Size') } \r\n text={ formatSize(fileItem.size, t, true) }\r\n />\r\n <Row \r\n title={ gridT('Last modified') }\r\n text={ formatRelativeTime(fileItem.time || 0) }\r\n />\r\n { fileItem.type.id === 'file' && (\r\n <Row \r\n title={ gridT('TTH') } \r\n text={ fileItem.tth }\r\n /> \r\n )}\r\n { !!fileItem.dupe && (\r\n <Row \r\n title={ gridT('Dupe type') }\r\n text={ gridT(DupeStrings[fileItem.dupe.id]) }\r\n /> \r\n )}\r\n { !!fileItem.dupe && (\r\n <Row \r\n title={ gridT('Dupe paths') }\r\n text={ <DupePaths paths={ fileItem.dupe.paths }/> }\r\n /> \r\n )}\r\n { showPath && (\r\n <Row \r\n title={ gridT('Path') }\r\n text={ fileItem.path }\r\n /> \r\n )}\r\n </Grid>\r\n\r\n <DownloadMenu \r\n caption={ gridT('Actions...') }\r\n button={ true }\r\n user={ user }\r\n itemInfoGetter={ () => fileItem }\r\n downloadHandler={ downloadHandler }\r\n contextElement=\".ui.modal > .content\"\r\n session={ session }\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport { FileItemInfoGrid };","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport Icon, { IconProps } from 'components/semantic/Icon';\r\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\ninterface HubIconProps extends IconProps {\r\n hub: API.Hub;\r\n}\r\n\r\nconst HubIcon: React.FC<HubIconProps> = ({ hub, ...other }) => (\r\n <Icon\r\n { ...other }\r\n icon={ hubOnlineStatusToColor(hub.connect_state.id) + ' sitemap' }\r\n />\r\n);\r\n\r\n/*HubIcon.propTypes = {\r\n // Hub object\r\n hub: PropTypes.object.isRequired,\r\n};*/\r\n\r\nexport default HubIcon;","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import History from 'utils/History';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport FilelistSessionActions from 'actions/reflux/FilelistSessionActions';\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst handleBrowseContent: UI.ActionHandler<API.GroupedSearchResult> = ({ data, location }) => {\r\n return FilelistSessionActions.createSession(location, data.users.user, FilelistSessionStore, data.path);\r\n};\r\n\r\nconst handleResult: UI.ActionHandler<API.GroupedSearchResult> = ({ data, location }) => {\r\n History.push(`${location.pathname}/result/${data.id}`);\r\n};\r\n\r\n\r\nconst SearchActions: UI.ActionListType<API.GroupedSearchResult> = {\r\n result: { \r\n displayName: 'Result details',\r\n icon: IconConstants.OPEN,\r\n handler: handleResult,\r\n },\r\n browseContent: { \r\n displayName: 'Browse content', \r\n access: API.AccessEnum.FILELISTS_EDIT,\r\n icon: IconConstants.FILELIST,\r\n handler: handleBrowseContent,\r\n },\r\n};\r\n\r\n\r\nexport default {\r\n moduleId: UI.Modules.SEARCH,\r\n actions: SearchActions,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport FormattedIp from 'components/format/FormattedIp';\r\nimport { formatConnection } from 'utils/ValueFormat';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport { UserMenu } from 'components/menu';\r\nimport { UserFileActions } from 'actions/ui/UserActions';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate, toI18nKey } from 'utils/TranslationUtils';\r\nimport { TFunction } from 'i18next';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface UserResultProps {\r\n result: API.ChildSearchResult;\r\n t: TFunction;\r\n}\r\n\r\nconst UserResult: React.FC<UserResultProps> = ({ result, t }) => (\r\n <tr>\r\n <td className=\"user dropdown\">\r\n <UserMenu \r\n userIcon={ true }\r\n user={ result.user }\r\n directory={ result.path }\r\n ids={ UserFileActions }\r\n contextElement=\".ui.modal > .content\"\r\n remoteMenuId={ MenuConstants.HINTED_USER }\r\n />\r\n </td>\r\n <td className=\"hubs\">\r\n { result.user.hub_names }\r\n </td>\r\n <td className=\"connection\">\r\n { formatConnection(result.connection, t) }\r\n </td>\r\n <td className=\"slots\">\r\n { result.slots.str }\r\n </td>\r\n <td className=\"ip\">\r\n <FormattedIp item={ result.ip }/>\r\n </td>\r\n <td className=\"path\" title={ result.path }>\r\n { result.path }\r\n </td>\r\n </tr>\r\n);\r\n\r\nconst resultSort = (a: API.ChildSearchResult, b: API.ChildSearchResult) => a.user.nicks.localeCompare(b.user.nicks);\r\n\r\ninterface UserResultTableProps {\r\n parentResult: API.GroupedSearchResult;\r\n instanceId: number;\r\n}\r\n\r\ninterface UserResultTableDataProps extends DataProviderDecoratorChildProps {\r\n results: API.ChildSearchResult[];\r\n}\r\n\r\nconst UserResultTable: React.FC<UserResultTableProps & UserResultTableDataProps> = (\r\n { results }\r\n) => {\r\n const { t } = useTranslation();\r\n return (\r\n <div className=\"users\">\r\n <h2>\r\n { t(toI18nKey('usersCount', UI.Modules.SEARCH), { \r\n defaultValue: 'User ({{count}})',\r\n defaultValue_plural: 'Users ({{count}})',\r\n count: results.length\r\n }) }\r\n </h2>\r\n <table className=\"ui striped table\">\r\n <thead>\r\n <tr>\r\n <th>{ translate('User', t, UI.Modules.SEARCH) }</th>\r\n <th>{ translate('Hubs', t, UI.Modules.SEARCH) }</th>\r\n <th style={{ width: '70px' }}>{ translate('Connection', t, UI.Modules.SEARCH) }</th>\r\n <th style={{ width: '50px' }}>{ translate('Slots', t, UI.Modules.SEARCH) }</th>\r\n <th>{ translate('IP', t, UI.Modules.SEARCH) }</th>\r\n <th>{ translate('Path', t, UI.Modules.SEARCH) }</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n { results.sort(resultSort).map(result => (\r\n <UserResult \r\n key={ result.user.cid }\r\n result={ result }\r\n t={ t }\r\n />\r\n )) }\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DataProviderDecorator<UserResultTableProps, UserResultTableDataProps>(UserResultTable, {\r\n urls: {\r\n results: ({ parentResult, instanceId }, socket) => socket.get(`${SearchConstants.INSTANCES_URL}/${instanceId}/results/${parentResult.id}/children`),\r\n }\r\n});","import SearchConstants from 'constants/SearchConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nexport const searchDownloadHandler: UI.DownloadHandler<API.GroupedSearchResult> = (\r\n itemInfo, \r\n user, \r\n downloadData,\r\n instance\r\n) => {\r\n return SocketService.post(\r\n `${SearchConstants.MODULE_URL}/${instance!.id}/results/${itemInfo.id}/download`, \r\n downloadData\r\n );\r\n};\r\n\r\ninterface SearchData {\r\n query: Pick<API.SearchQuery, 'pattern'> & Partial<Omit<API.SearchQuery, 'pattern'>>;\r\n hub_urls: string[] | undefined | null;\r\n priority: API.PriorityEnum;\r\n}\r\n\r\nexport const search = (\r\n instance: API.SearchInstance, \r\n data: SearchData\r\n) => {\r\n return SocketService.post<API.SearchResponse>(\r\n `${SearchConstants.INSTANCES_URL}/${instance.id}/hub_search`, \r\n data\r\n );\r\n};\r\n","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\r\n\r\nimport UserResultTable from './UserResultTable';\r\n\r\nimport ModalRouteDecorator, { ModalRouteDecoratorChildProps } from 'decorators/ModalRouteDecorator';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { FileItemInfoGrid } from 'components/file-item-info';\r\nimport { searchDownloadHandler } from 'services/api/SearchApi';\r\n\r\n\r\ninterface ResultDialogProps {\r\n searchT: UI.ModuleTranslator;\r\n instance: API.SearchInstance;\r\n}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n parentResult: API.GroupedSearchResult;\r\n}\r\n\r\ninterface RouteProps {\r\n resultId: string;\r\n}\r\n\r\ntype Props = ResultDialogProps & ModalRouteDecoratorChildProps<RouteProps>;\r\n\r\n\r\nclass ResultDialog extends Component<Props & DataProps> {\r\n static displayName = 'ResultDialog';\r\n\r\n itemDataGetter: UI.DownloadItemDataGetter<API.GroupedSearchResult> = (itemId, socket) => {\r\n const { instance } = this.props;\r\n return socket.get(`${SearchConstants.INSTANCES_URL}/${instance.id}/results/${itemId}`);\r\n }\r\n\r\n render() {\r\n const { parentResult, instance } = this.props;\r\n return (\r\n <Modal \r\n className=\"result\" \r\n title={ parentResult.name }\r\n closable={ true } \r\n icon={ <FileIcon typeInfo={ parentResult.type }/> } \r\n fullHeight={ true }\r\n { ...this.props }\r\n >\r\n <DownloadDialog \r\n downloadHandler={ searchDownloadHandler }\r\n itemDataGetter={ this.itemDataGetter }\r\n session={ instance }\r\n />\r\n <FileItemInfoGrid \r\n fileItem={ parentResult }\r\n downloadHandler={ searchDownloadHandler }\r\n user={ parentResult.users.user }\r\n showPath={ false }\r\n session={ instance }\r\n />\r\n <UserResultTable \r\n parentResult={ parentResult }\r\n instanceId={ instance.id }\r\n />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nconst Decorated = ModalRouteDecorator<ResultDialogProps, RouteProps>(\r\n DataProviderDecorator<Props, DataProps>(\r\n ResultDialog, {\r\n urls: {\r\n parentResult: ({ match, instance }, socket) => socket.get(`${SearchConstants.INSTANCES_URL}/${instance.id}/results/${match.params.resultId}`),\r\n }\r\n }\r\n ), \r\n 'result/:resultId'\r\n);\r\n\r\nexport { Decorated as ResultDialog };\r\n","import Reflux from 'reflux';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\r\n\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'search_view',\r\n _apiUrl: SearchConstants.INSTANCES_URL,\r\n mixins: [ ViewStoreMixin('relevance', false) ],\r\n});\r\n","import * as React from 'react';\r\n\r\nimport SearchActions from 'actions/ui/SearchActions';\r\n\r\nimport { ResultDialog } from './result-dialog';\r\n\r\nimport SearchViewStore from 'stores/SearchViewStore';\r\n\r\nimport { Column } from 'fixed-data-table-2';\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport { SizeCell, DurationCell, ConnectionCell, FileDownloadCell, DecimalCell } from 'components/table/Cell';\r\nimport { TableActionMenu } from 'components/menu';\r\n\r\nimport { dupeToStringType } from 'utils/TypeConvert';\r\nimport { TableUserMenu } from 'components/menu';\r\nimport { UserFileActions } from 'actions/ui/UserActions';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { TFunction } from 'i18next';\r\nimport { Trans } from 'react-i18next';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\nimport { searchDownloadHandler } from 'services/api/SearchApi';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuConstants from 'constants/MenuConstants';\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\n\r\nconst getUserCaption = ({ count, user }: API.SearchResultUserInfo, t: TFunction) => {\r\n if (count > 1) {\r\n return t(toI18nKey('xUsersNicks', UI.Modules.SEARCH), {\r\n defaultValue: `{{count}} user ({{user.nicks}})`,\r\n defaultValue_plural: `{{count}} users ({{user.nicks}})`,\r\n count,\r\n replace: {\r\n count,\r\n user\r\n }\r\n });\r\n }\r\n\r\n return user.nicks;\r\n};\r\n\r\nconst UserCell: React.FC<RowWrapperCellChildProps<API.SearchResultUserInfo, API.GroupedSearchResult>> = (\r\n { cellData, rowDataGetter, t }\r\n) => (\r\n <TableUserMenu \r\n text={ getUserCaption(cellData!, t!) } \r\n user={ cellData!.user }\r\n directory={ rowDataGetter!().path }\r\n userIcon=\"simple\"\r\n ids={ UserFileActions }\r\n remoteMenuId={ MenuConstants.HINTED_USER }\r\n >\r\n <TableActionMenu \r\n actions={ SearchActions }\r\n itemData={ rowDataGetter }\r\n ids={ [ 'result' ] }\r\n />\r\n </TableUserMenu>\r\n);\r\n\r\nconst resultUserGetter = (rowData: API.GroupedSearchResult) => {\r\n if (!rowData || !rowData.users) {\r\n return rowData.users.user;\r\n }\r\n\r\n return rowData.users.user;\r\n};\r\n\r\ninterface NameCellProps extends RowWrapperCellChildProps<string, API.GroupedSearchResult> {\r\n instance: API.SearchInstance;\r\n}\r\n\r\nconst NameCell: React.FC<NameCellProps> = (\r\n { rowDataGetter, instance, ...props }\r\n) => (\r\n <FileDownloadCell \r\n userGetter={ resultUserGetter }\r\n rowDataGetter={ rowDataGetter }\r\n downloadHandler={ searchDownloadHandler }\r\n session={ instance }\r\n { ...props }\r\n >\r\n <TableActionMenu \r\n actions={ SearchActions }\r\n itemData={ rowDataGetter }\r\n remoteMenuId={ MenuConstants.GROUPED_SEARCH_RESULT }\r\n entityId={ instance.id }\r\n />\r\n </FileDownloadCell>\r\n);\r\n\r\nexport interface ResultTableProps {\r\n running: boolean;\r\n searchString: string;\r\n searchT: UI.ModuleTranslator;\r\n instance: API.SearchInstance;\r\n}\r\n\r\nclass ResultTable extends React.Component<ResultTableProps> {\r\n static displayName = 'ResultTable';\r\n\r\n rowClassNameGetter = (rowData: API.GroupedSearchResult) => {\r\n return dupeToStringType(rowData.dupe);\r\n }\r\n\r\n emptyRowsNodeGetter = () => {\r\n const { running, searchString, searchT } = this.props;\r\n if (running) {\r\n return null;\r\n }\r\n\r\n if (!searchString) {\r\n return process.env.DEMO_MODE === '1' && (\r\n <Message \r\n title=\"Demo content available\"\r\n icon={ IconConstants.TIP }\r\n description={ 'Use the search string \"demo\" to receive results from the demo share' }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <Message \r\n title={ searchT.t('noResults', {\r\n defaultValue: `No results found for \"{{searchString}}\"`,\r\n replace: {\r\n searchString\r\n }\r\n }) }\r\n description={ (\r\n <Trans i18nKey={ searchT.toI18nKey('noResultsHint') }>\r\n <div className=\"ui bulleted list\">\r\n <div className=\"item\">Ensure that you spelled the words correctly</div>\r\n <div className=\"item\">Use different keywords</div>\r\n <div className=\"item\">You are searching too frequently (hubs often have a minimum search interval)</div>\r\n <div className=\"item\">\r\n If you never receive results for common search terms, \r\n make sure that your connectivity settings are configured properly\r\n </div>\r\n </div>\r\n </Trans>\r\n ) }\r\n />\r\n );\r\n }\r\n \r\n itemDataGetter: UI.DownloadItemDataGetter<API.GroupedSearchResult> = (itemId, socket) => {\r\n const { instance } = this.props;\r\n return socket.get(`${SearchConstants.INSTANCES_URL}/${instance.id}/results/${itemId}`);\r\n }\r\n\r\n render() {\r\n const { searchT, instance } = this.props;\r\n return (\r\n <>\r\n <VirtualTable\r\n emptyRowsNodeGetter={ this.emptyRowsNodeGetter }\r\n rowClassNameGetter={ this.rowClassNameGetter }\r\n store={ SearchViewStore }\r\n textFilterProps={{\r\n autoFocus: false,\r\n }}\r\n entityId={ instance.id }\r\n moduleId={ SearchActions.moduleId }\r\n >\r\n <Column\r\n name=\"Name\"\r\n width={200}\r\n columnKey=\"name\"\r\n flexGrow={8}\r\n cell={ <NameCell instance={ instance }/> }\r\n />\r\n <Column\r\n name=\"Size\"\r\n width={60}\r\n columnKey=\"size\"\r\n cell={ <SizeCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Type\"\r\n width={80}\r\n columnKey=\"type\"\r\n flexGrow={1}\r\n hideWidth={600}\r\n />\r\n <Column\r\n name=\"Relevance\"\r\n width={60}\r\n columnKey=\"relevance\"\r\n cell={ <DecimalCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Connection\"\r\n width={60}\r\n columnKey=\"connection\"\r\n cell={ <ConnectionCell/> }\r\n flexGrow={2}\r\n hideWidth={600}\r\n />\r\n <Column\r\n name=\"Users\"\r\n width={120}\r\n columnKey=\"users\"\r\n flexGrow={3}\r\n cell={ <UserCell/> }\r\n hideWidth={600}\r\n />\r\n <Column\r\n name=\"Last modified\"\r\n width={80}\r\n columnKey=\"time\"\r\n cell={ <DurationCell/> }\r\n flexGrow={1}\r\n hideWidth={800}\r\n />\r\n <Column\r\n name=\"Slots\"\r\n width={60}\r\n columnKey=\"slots\"\r\n flexGrow={1}\r\n hideWidth={800}\r\n />\r\n </VirtualTable>\r\n <DownloadDialog \r\n downloadHandler={ searchDownloadHandler }\r\n itemDataGetter={ this.itemDataGetter }\r\n session={ instance }\r\n />\r\n <ResultDialog \r\n searchT={ searchT }\r\n instance={ instance }\r\n />\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default ResultTable;","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\n\r\nimport HistoryConstants from 'constants/HistoryConstants';\r\n\r\nimport LocalSuggestField, { LocalSuggestFieldProps } from './LocalSuggestField';\r\nimport { addHistory } from 'services/api/HistoryApi';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n\r\nexport interface HistoryInputProps extends Omit<LocalSuggestFieldProps, 'data' | 'submitHandler'> {\r\n historyId: string;\r\n submitHandler: (text: string) => void;\r\n}\r\n\r\ninterface HistoryInputDataProps extends DataProviderDecoratorChildProps {\r\n history: string[];\r\n}\r\n\r\n\r\nconst HistoryInput: React.FC<HistoryInputProps & HistoryInputDataProps> = (\r\n { submitHandler, historyId, history, refetchData, ...other }\r\n) => {\r\n const { t } = useTranslation();\r\n const handleSubmit = async (value: string) => {\r\n const text = value.trim();\r\n await runBackgroundSocketAction(\r\n () => addHistory(historyId, text),\r\n t\r\n );\r\n\r\n refetchData();\r\n submitHandler(text);\r\n };\r\n\r\n return (\r\n <LocalSuggestField \r\n { ...other }\r\n data={ history }\r\n submitHandler={ handleSubmit }\r\n />\r\n );\r\n};\r\n\r\nexport default DataProviderDecorator<HistoryInputProps, HistoryInputDataProps>(HistoryInput, {\r\n urls: {\r\n history: ({ historyId }, socket) => socket.get(HistoryConstants.STRINGS_URL + '/' + historyId),\r\n },\r\n loaderText: null,\r\n});\r\n","import * as React from 'react';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport Accordion, { AccordionContent, AccordionTitle } from 'components/semantic/Accordion';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Icon from 'components/semantic/Icon';\r\nimport { isValueSet } from 'utils/FormUtils';\r\n\r\n\r\ninterface FormAccordionProps {\r\n locals: UI.FormLocals;\r\n}\r\n\r\nexport const FormAccordion: React.FC<FormAccordionProps> = ({ locals, children }) => {\r\n const { label } = locals;\r\n const active = isValueSet(locals.value);\r\n return (\r\n <Accordion \r\n className=\"field\" \r\n defaultActiveIndexes={ active ? [ 0 ] : undefined }\r\n >\r\n <AccordionTitle>\r\n <Icon icon={ IconConstants.DROPDOWN }/>\r\n <span style={ active ? { fontWeight: 'bold' } : undefined }>\r\n { label }\r\n </span>\r\n </AccordionTitle>\r\n <AccordionContent>\r\n { children }\r\n </AccordionContent>\r\n </Accordion>\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport Checkbox from 'components/semantic/Checkbox';\r\nimport { updateMultiselectValues } from 'utils/FormUtils';\r\nimport HubIcon from 'components/icon/HubIcon';\r\nimport { FormAccordion } from './AccordionField';\r\n\r\n\r\ninterface HubSelectFieldProps {\r\n value: string[] | null;\r\n onChange: (hubUrls: string[] | null) => void; \r\n}\r\n\r\ninterface DataProps {\r\n hubs: API.Hub[];\r\n}\r\n\r\n\r\ntype Props = HubSelectFieldProps & DataProps;\r\n\r\nconst HubSelectField: React.FC<Props> = ({ hubs, value, onChange }) => {\r\n const onlineHubs = hubs.filter(hub => hub.connect_state.id === API.HubConnectStateEnum.CONNECTED);\r\n const selectedUrls = !!value && !!value.length ? value : onlineHubs.map(hub => hub.hub_url);\r\n\r\n const beforeUnchecked = () => {\r\n if (selectedUrls.length === 1) {\r\n return false;\r\n }\r\n\r\n return;\r\n };\r\n\r\n return (\r\n <>\r\n { onlineHubs.map(hub => (\r\n <div key={ hub.id } className=\"field\">\r\n <Checkbox\r\n caption={ (\r\n <>\r\n <HubIcon hub={ hub }/>\r\n { hub.identity.name }\r\n </>\r\n ) }\r\n beforeUnchecked={ beforeUnchecked }\r\n checked={ selectedUrls.indexOf(hub.hub_url) !== -1 }\r\n onChange={ checked => {\r\n const newValue = updateMultiselectValues(selectedUrls, hub.hub_url, checked);\r\n onChange(newValue.length === onlineHubs.length ? null : newValue);\r\n } }\r\n style={{\r\n maxWidth: '300px',\r\n }}\r\n />\r\n </div>\r\n )) }\r\n </>\r\n );\r\n};\r\n\r\n\r\ntype TCombTemplate = { \r\n renderSelect: (locals: UI.FormLocals<API.Hub, string[]>) => React.ReactNode; \r\n renderLabel: (locals: UI.FormLocals<API.Hub, string[]>) => React.ReactNode;\r\n};\r\n\r\nconst HubsSelectField: TCombTemplate = {\r\n renderSelect(locals) {\r\n return (\r\n <FormAccordion locals={ locals }>\r\n <HubSelectField \r\n onChange={ locals.onChange }\r\n value={ locals.value }\r\n hubs={ locals.options }\r\n />\r\n </FormAccordion>\r\n );\r\n },\r\n renderLabel(locals) {\r\n return null;\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.select.clone(HubsSelectField);\r\n","import { useState, useEffect } from 'react';\r\nimport * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { ByteUnits, formatUnit, parseUnit } from 'utils/ValueFormat';\r\n\r\n\r\ninterface SizeFieldProps {\r\n moduleT: UI.ModuleTranslator;\r\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\r\n onChange: (size: number | null) => void;\r\n value: number;\r\n}\r\n\r\ntype Props = SizeFieldProps;\r\n\r\n\r\nconst DEFAULT_UNIT_INDEX = 2;\r\n\r\nconst SizeField: React.FC<Props> = ({ inputProps, moduleT, onChange, value }) => {\r\n const [ displayValue, setDisplayValue ] = useState<number | undefined>(undefined);\r\n const [ unitIndex, setUnitIndex ] = useState<number>(DEFAULT_UNIT_INDEX);\r\n\r\n const valueToBytes = () => {\r\n let ret = displayValue || 0;\r\n if (!!unitIndex) {\r\n for (let i = 1; i <= unitIndex; i++) {\r\n ret *= 1024;\r\n }\r\n }\r\n \r\n return ret;\r\n };\r\n\r\n useEffect(\r\n () => {\r\n const newValue = valueToBytes();\r\n if (newValue !== value) {\r\n onChange(newValue);\r\n }\r\n },\r\n [ unitIndex, displayValue ]\r\n );\r\n\r\n useEffect(\r\n () => {\r\n const curBytes = valueToBytes();\r\n if (value !== curBytes) {\r\n const { value: parsedValue, unitIndex: parsedUnitIndex } = parseUnit(value, ByteUnits, 1024);\r\n setDisplayValue(parsedValue);\r\n setUnitIndex(!!value ? parsedUnitIndex : DEFAULT_UNIT_INDEX);\r\n }\r\n },\r\n [ value ]\r\n );\r\n \r\n return (\r\n <div style={{ display: 'flex' }}>\r\n <input\r\n className=\"ui input\"\r\n type=\"number\"\r\n { ...inputProps }\r\n min={ 0 }\r\n value={ displayValue || '' }\r\n onChange={ evt => {\r\n let newValue = !!evt.target.value ? parseInt(evt.target.value) : null;\r\n if (!!newValue) {\r\n setDisplayValue(newValue);\r\n } else {\r\n setDisplayValue(undefined);\r\n }\r\n } }\r\n />\r\n <select \r\n className=\"ui select\" \r\n style={{ maxWidth: '100px' }}\r\n value={ ByteUnits[unitIndex] }\r\n onChange={ evt => {\r\n setUnitIndex(evt.target.selectedIndex);\r\n } }\r\n >\r\n { ByteUnits.map((unit, index) => (\r\n <option \r\n key={ unit }\r\n value={ unit }\r\n >\r\n { formatUnit(unit, moduleT.plainT) }\r\n </option>\r\n )) }\r\n </select>\r\n </div>\r\n );\r\n};\r\n\r\n\r\ntype TCombTemplate = { \r\n renderInput: (locals: UI.FormLocals<any, number>) => React.ReactNode; \r\n};\r\n\r\nconst FileTypeField: TCombTemplate = {\r\n renderInput(locals) {\r\n return (\r\n <SizeField \r\n onChange={ locals.onChange }\r\n value={ !!locals.value ? parseInt(locals.value as any) : 0 }\r\n moduleT={ locals.context.formT }\r\n />\r\n );\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.textbox.clone(FileTypeField);\r\n\r\n// export { SizeField };\r\n","import * as React from 'react';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\nimport Icon from 'components/semantic/Icon';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\n\r\nconst searchTypeToFileItem = (searchType: UI.SearchTypeItem): API.FileItemType => {\r\n if (searchType.id === 'directory') {\r\n return {\r\n id: 'directory',\r\n str: '',\r\n files: 0,\r\n directories: 0,\r\n };\r\n }\r\n\r\n return {\r\n id: 'file',\r\n str: '',\r\n content_type: searchType.id as API.FileContentType,\r\n };\r\n};\r\n\r\n\r\ninterface SearchTypeIconProps {\r\n type: UI.SearchTypeItem;\r\n size?: string;\r\n}\r\n\r\nexport const SearchTypeIcon: React.FC<SearchTypeIconProps> = ({ type, size = 'large' }) => {\r\n if (!type.id) {\r\n return (\r\n <Icon \r\n icon={ IconConstants.ANY } \r\n size={ size }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <FileIcon \r\n typeInfo={ searchTypeToFileItem(type) } \r\n size={ size }\r\n />\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport SearchConstants from 'constants/SearchConstants';\r\nimport Dropdown from 'components/semantic/Dropdown';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\nimport { SearchTypeIcon } from 'components/icon/SearchTypeIcon';\r\n\r\n\r\ntype OnChangeHandler = (value: string | null) => void;\r\n\r\ninterface SearchTypeDropdownProps {\r\n onChange: OnChangeHandler;\r\n value: string | null;\r\n moduleT: UI.ModuleTranslator;\r\n}\r\n\r\ninterface DataProps {\r\n searchTypes: API.SearchType[];\r\n}\r\n\r\nconst getCommonItems = (moduleT: UI.ModuleTranslator): UI.SearchTypeItem[] => ([\r\n {\r\n id: null,\r\n str: moduleT.translate('Any'),\r\n }, {\r\n id: 'directory',\r\n str: moduleT.translate('Directory'),\r\n }, {\r\n id: 'file',\r\n str: moduleT.translate('File'),\r\n }\r\n]);\r\n\r\nconst typeToMenuItem = (type: UI.SearchTypeItem, onChange: OnChangeHandler, selectedItem: UI.SearchTypeItem) => (\r\n <MenuItemLink \r\n key={ type.id || SearchConstants.DEFAULT_SEARCH_TYPE }\r\n onClick={ () => onChange(type.id) }\r\n icon={ <SearchTypeIcon type={ type }/> }\r\n active={ selectedItem.id === type.id }\r\n >\r\n { type.str }\r\n </MenuItemLink>\r\n);\r\n\r\ntype Props = SearchTypeDropdownProps & DataProviderDecoratorChildProps & DataProps;\r\n\r\nconst SearchTypeDropdown: React.FC<Props> = ({ searchTypes, value, onChange, moduleT }) => {\r\n const commonItems = getCommonItems(moduleT);\r\n const selectedItem = searchTypes.find(i => value === i.id) || commonItems.find(i => value === i.id) || commonItems[0];\r\n return (\r\n <Dropdown\r\n selection={ true }\r\n caption={ (\r\n <>\r\n <SearchTypeIcon type={ selectedItem } size=\"\"/>\r\n { selectedItem.str }\r\n </>\r\n ) }\r\n >\r\n { commonItems.map(type => typeToMenuItem(type, onChange, selectedItem)) }\r\n <div key=\"divider\" className=\"ui divider\"/>\r\n { searchTypes.map(type => typeToMenuItem(type, onChange, selectedItem)) }\r\n </Dropdown>\r\n );\r\n};\r\n\r\nconst SearchTypeDropdownDecorated = DataProviderDecorator<SearchTypeDropdownProps, DataProps>(\r\n SearchTypeDropdown,\r\n {\r\n urls: {\r\n searchTypes: SearchConstants.SEARCH_TYPES_URL\r\n }\r\n }\r\n);\r\n\r\n\r\ntype TCombTemplate = { \r\n renderSelect: (locals: UI.FormLocals<any, string>) => React.ReactNode; \r\n};\r\n\r\nconst FileTypeField: TCombTemplate = {\r\n renderSelect(locals) {\r\n return (\r\n <SearchTypeDropdownDecorated \r\n onChange={ locals.onChange }\r\n value={ locals.value || null }\r\n moduleT={ locals.context.formT }\r\n />\r\n );\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.select.clone(FileTypeField);\r\n","import * as React from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FormAccordion } from './AccordionField';\r\n\r\n\r\ntype TCombTemplate = { \r\n renderFieldset: (children: React.ReactNode, locals: UI.FormLocals) => React.ReactNode; \r\n renderLabel: (locals: UI.FormLocals) => React.ReactNode;\r\n};\r\n\r\nconst AccordionStruct: TCombTemplate = {\r\n renderFieldset(children, locals) {\r\n const { label, ...childLocals } = locals;\r\n return (\r\n <FormAccordion locals={ locals }>\r\n { t.form.Form.templates.struct.renderFieldset(children, childLocals) }\r\n </FormAccordion>\r\n );\r\n },\r\n renderLabel(locals) {\r\n return null;\r\n }\r\n};\r\n\r\nexport default t.form.Form.templates.struct.clone(AccordionStruct);\r\n","import { PureComponent } from 'react';\r\nimport t from 'utils/tcomb-form';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport HubSelectField from './HubSelectField';\r\nimport SizeField from './SizeField';\r\nimport FileTypeField from './FileTypeField';\r\n\r\nimport Form, { FormFieldChangeHandler, FormSaveHandler, FormFieldSettingHandler } from 'components/form/Form';\r\nimport { isValueSet, translateForm } from 'utils/FormUtils';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport Button from 'components/semantic/Button';\r\nimport AccordionStructField from './AccordionStructField';\r\n\r\n\r\n\r\n\r\ninterface Entry extends Pick<API.SearchQuery, 'file_type'>, UI.FormValueMap {\r\n hub_urls: string[] | null;\r\n // file_type: string | null;\r\n size_limits: null | {\r\n min_size: number | null;\r\n max_size: number | null;\r\n };\r\n // min_size: number | null;\r\n // max_size: number | null;\r\n // excluded: string[] | null;\r\n}\r\n\r\nexport interface SearchOptionsFormProps extends Pick<RouteComponentProps, 'location'> {\r\n moduleT: UI.ModuleTranslator;\r\n onChange: (value: Entry | null) => void;\r\n value: Entry | null;\r\n hubs: API.Hub[];\r\n}\r\n\r\n\r\nconst Fields: UI.FormFieldDefinition[] = [\r\n {\r\n key: 'file_type',\r\n title: 'File type',\r\n type: API.SettingTypeEnum.STRING,\r\n optional: true,\r\n }, {\r\n key: 'hub_urls',\r\n title: 'Hubs',\r\n type: API.SettingTypeEnum.LIST,\r\n item_type: API.SettingTypeEnum.STRING,\r\n }, {\r\n key: 'size_limits',\r\n title: 'Size limits',\r\n type: API.SettingTypeEnum.STRUCT,\r\n optional: true,\r\n definitions: [\r\n {\r\n key: 'min_size',\r\n title: 'Minimum size',\r\n type: API.SettingTypeEnum.NUMBER,\r\n optional: true,\r\n }, {\r\n key: 'max_size',\r\n title: 'Maximum size',\r\n type: API.SettingTypeEnum.NUMBER,\r\n optional: true,\r\n }\r\n ]\r\n }, /*, {\r\n key: 'excluded',\r\n title: 'Excluded words',\r\n type: API.SettingTypeEnum.LIST,\r\n item_type: API.SettingTypeEnum.STRING,\r\n optional: true,\r\n }*/\r\n];\r\n\r\nconst removeEmptyProperties = (formValue: Entry) => {\r\n const ret = Object\r\n .keys(formValue)\r\n .reduce(\r\n (reduced, key) => {\r\n const value = formValue[key];\r\n if (isValueSet(value)) {\r\n reduced[key] = value;\r\n }\r\n\r\n return reduced;\r\n },\r\n {} as Entry\r\n );\r\n\r\n return ret;\r\n};\r\n\r\nclass SearchOptionsForm extends PureComponent<SearchOptionsFormProps> {\r\n static displayName = 'SearchOptionForm';\r\n\r\n constructor(props: SearchOptionsFormProps) {\r\n super(props);\r\n\r\n this.definitions = translateForm(Fields, props.moduleT);\r\n }\r\n\r\n definitions: UI.FormFieldDefinition[];\r\n form: Form<Entry>;\r\n\r\n onFieldChanged: FormFieldChangeHandler<Entry> = (id, value, hasChanges) => {\r\n const ret = removeEmptyProperties(value as Entry);\r\n this.props.onChange(!!Object.keys(ret).length ? ret : null);\r\n return null;\r\n }\r\n\r\n save = () => {\r\n return this.form.save();\r\n }\r\n\r\n onSave: FormSaveHandler<Entry> = (changedFields) => {\r\n return Promise.resolve();\r\n }\r\n\r\n onFieldSetting: FormFieldSettingHandler<Entry> = (id, fieldOptions, formValue) => {\r\n if (id === 'hub_urls') {\r\n Object.assign(fieldOptions, {\r\n factory: t.form.Select,\r\n template: HubSelectField,\r\n options: this.props.hubs,\r\n });\r\n } else if (id === 'min_size' || id === 'max_size') {\r\n Object.assign(fieldOptions, {\r\n // factory: t.form.List,\r\n template: SizeField,\r\n });\r\n } else if (id === 'excluded') {\r\n Object.assign(fieldOptions, {\r\n disableOrder: true,\r\n });\r\n } else if (id === 'file_type') {\r\n Object.assign(fieldOptions, {\r\n template: FileTypeField,\r\n });\r\n } else if (id === 'size_limits') {\r\n Object.assign(fieldOptions, {\r\n template: AccordionStructField,\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const { value, onChange, location, moduleT } = this.props;\r\n return (\r\n <div>\r\n <Form<Entry>\r\n ref={ c => this.form = c! }\r\n onFieldChanged={ this.onFieldChanged }\r\n onFieldSetting={ this.onFieldSetting }\r\n onSave={ this.onSave }\r\n fieldDefinitions={ this.definitions }\r\n value={ value }\r\n location={ location }\r\n optionTitleFormatter={ def => def.title }\r\n className=\"search-options\"\r\n />\r\n <Button\r\n caption={ moduleT.translate('Reset all') }\r\n onClick={ () => onChange(null) }\r\n disabled={ !value }\r\n style={{\r\n marginTop: '10px'\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport { SearchOptionsForm, Entry as SearchOptions };\r\n","import { useEffect } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport Button from 'components/semantic/Button';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport Popup from 'components/semantic/Popup';\r\nimport { SearchOptionsForm, SearchOptionsFormProps, SearchOptions } from './SearchOptionsForm';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Icon from 'components/semantic/Icon';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport HubConstants from 'constants/HubConstants';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport { isValueSet } from 'utils/FormUtils';\r\n\r\n\r\ninterface SearchOptionsButtonProps extends \r\n Pick<RouteComponentProps, 'location'>, \r\n Pick<SearchOptionsFormProps, 'onChange' | 'value'> {\r\n\r\n moduleT: UI.ModuleTranslator;\r\n}\r\n\r\n\r\ninterface DataProps {\r\n hubs: API.Hub[];\r\n}\r\n\r\ntype Props = SearchOptionsButtonProps & DataProviderDecoratorChildProps & DataProps;\r\n\r\n\r\nconst removeEmptyProperties = (value: SearchOptions) => {\r\n const ret = Object\r\n .keys(value)\r\n .reduce(\r\n (reduced, key) => {\r\n if (Array.isArray(value[key]) ? !!(value[key] as Array<any>).length : !!value[key]) {\r\n reduced[key] = value[key] as any;\r\n }\r\n\r\n return reduced;\r\n },\r\n {} as SearchOptions\r\n );\r\n\r\n return ret;\r\n};\r\n\r\n\r\nconst SearchOptionsButton: React.FC<Props> = ({ \r\n moduleT, location, onChange, value, hubs\r\n}) => {\r\n const onValueChanged = (newValue: SearchOptions | null) => {\r\n if (newValue) {\r\n const ret = removeEmptyProperties(newValue);\r\n onChange(!!Object.keys(ret).length ? ret : null);\r\n } else {\r\n onChange(null);\r\n }\r\n };\r\n\r\n useEffect(\r\n () => {\r\n // Remove obsolete hubs from the options\r\n if (!!value && !!value.hub_urls && !!value.hub_urls.length) {\r\n const selectedUrls = value.hub_urls;\r\n const selectedUrlsNew = selectedUrls.filter(url => hubs.find(hub => hub.hub_url === url));\r\n if (selectedUrlsNew.length !== selectedUrls.length) {\r\n onValueChanged({\r\n ...value,\r\n hub_urls: !!selectedUrlsNew.length ? selectedUrlsNew : null\r\n });\r\n }\r\n }\r\n },\r\n [ hubs ]\r\n );\r\n\r\n const filterCount = !value ? null : Object.keys(value)\r\n .filter(key => {\r\n const curValue = value[key];\r\n return isValueSet(curValue);\r\n })\r\n .length;\r\n\r\n return (\r\n <Popup\r\n triggerClassName=\"options\" \r\n className=\"options\" \r\n trigger={(\r\n <Button \r\n caption={ (\r\n <>\r\n <Icon icon={ IconConstants.OPTIONS }/>\r\n { !!filterCount && (\r\n <span \r\n style={{ \r\n fontWeight: 'bold',\r\n marginRight: '3px',\r\n color: 'black'\r\n }}\r\n >\r\n { `(${filterCount})` }\r\n </span>\r\n ) }\r\n <Icon icon={ IconConstants.EXPAND }/>\r\n </>\r\n ) }\r\n /> \r\n )}\r\n contentUpdateTrigger={ value }\r\n >\r\n { hide => (\r\n <SearchOptionsForm\r\n moduleT={ moduleT }\r\n location={ location }\r\n onChange={ onValueChanged }\r\n value={ value }\r\n hubs={ hubs }\r\n />\r\n ) }\r\n </Popup>\r\n );\r\n};\r\n\r\n\r\nconst SearchOptionButtonDecorated = DataProviderDecorator<SearchOptionsButtonProps, DataProps>(\r\n SearchOptionsButton,\r\n {\r\n urls: {\r\n hubs: HubConstants.SESSIONS_URL\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData }) => {\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.SESSION_CREATED, () => refetchData());\r\n addSocketListener<Partial<API.Hub>>(\r\n HubConstants.MODULE_URL, \r\n HubConstants.SESSION_UPDATED, \r\n hub => {\r\n if (!!hub.connect_state) { \r\n refetchData();\r\n }\r\n }\r\n );\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.SESSION_REMOVED, () => refetchData());\r\n },\r\n dataConverters: {\r\n hubs: (hubs: API.Hub[]) => hubs.filter(hub => hub.connect_state.id === API.HubConnectStateEnum.CONNECTED)\r\n }\r\n }\r\n);\r\n\r\nexport { SearchOptionButtonDecorated as SearchOptionButton };\r\n","import { useState } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport HistoryInput from 'components/autosuggest/HistoryInput';\r\nimport { HistoryStringEnum } from 'constants/HistoryConstants';\r\nimport Button from 'components/semantic/Button';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\nimport { SearchOptionButton, SearchOptions } from './options-panel';\r\n\r\n\r\ninterface SearchInputProps extends Pick<RouteComponentProps, 'location'> {\r\n running: boolean;\r\n moduleT: UI.ModuleTranslator;\r\n defaultValue?: string;\r\n handleSubmit: (text: string, options?: SearchOptions) => void;\r\n defaultOptions: SearchOptions | null;\r\n}\r\n\r\nconst SearchInput: React.FC<SearchInputProps> = ({ \r\n moduleT, defaultValue, running, handleSubmit, location, defaultOptions \r\n}) => {\r\n const [ options, setOptions ] = useState<SearchOptions | null>(defaultOptions);\r\n\r\n const mobile = useMobileLayout();\r\n return (\r\n <div className=\"search-container\">\r\n <div className=\"search-area\">\r\n <HistoryInput \r\n historyId={ HistoryStringEnum.SEARCH } \r\n submitHandler={ value => handleSubmit(value, options || undefined) } \r\n disabled={ running }\r\n defaultValue={ defaultValue }\r\n placeholder={ moduleT.translate('Enter search string...') }\r\n button={ \r\n <Button\r\n className=\"blue\"\r\n icon={ IconConstants.SEARCH }\r\n caption={ !mobile ? moduleT.translate('Search') : undefined }\r\n loading={ running }\r\n />\r\n }\r\n />\r\n <SearchOptionButton\r\n moduleT={ moduleT }\r\n location={ location }\r\n onChange={ setOptions }\r\n value={ options }\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport { SearchInput };\r\n","import { Component } from 'react';\r\n\r\nimport SearchConstants from 'constants/SearchConstants';\r\n\r\nimport History from 'utils/History';\r\n\r\nimport OfflineHubMessageDecorator from 'decorators/OfflineHubMessageDecorator';\r\n\r\nimport '../style.css';\r\nimport ResultTable from 'routes/Search/components/ResultTable';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { WithTranslation } from 'react-i18next';\r\nimport { getModuleT } from 'utils/TranslationUtils';\r\nimport { SearchInput } from './SearchInput';\r\nimport { SearchOptions } from './options-panel';\r\nimport NotificationActions from 'actions/NotificationActions';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport LoginStore from 'stores/LoginStore';\r\nimport { search } from 'services/api/SearchApi';\r\n\r\n\r\nconst RESULT_WAIT_PERIOD = 4000;\r\n\r\ninterface SearchLocationState {\r\n searchString?: string;\r\n}\r\n\r\ninterface SearchProps extends RouteComponentProps<{}, any, SearchLocationState> {\r\n\r\n}\r\n\r\ninterface SearchDataProps extends DataProviderDecoratorChildProps, WithTranslation {\r\n instance: API.SearchInstance;\r\n}\r\n\r\nclass Search extends Component<SearchProps & SearchDataProps> {\r\n state = {\r\n searchString: '',\r\n running: false\r\n };\r\n\r\n searchTimeout: number | undefined;\r\n\r\n componentDidMount() {\r\n this.checkLocationState(this.props);\r\n\r\n const { query } = this.props.instance;\r\n if (!!query) {\r\n this.setState({\r\n searchString: query.pattern\r\n });\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: SearchProps) {\r\n this.checkLocationState(this.props);\r\n }\r\n\r\n checkLocationState = (props: SearchProps) => {\r\n const { state } = props.location;\r\n if (state && state.searchString && state.searchString !== this.state.searchString) {\r\n this.search(state.searchString);\r\n\r\n // Avoid searching for it again\r\n History.replace({\r\n pathname: props.location.pathname,\r\n });\r\n }\r\n }\r\n\r\n search = async (searchString: string, options?: SearchOptions) => {\r\n console.log('Searching');\r\n\r\n clearTimeout(this.searchTimeout);\r\n\r\n const { hub_urls, size_limits, ...queryOptions } = options || {};\r\n try {\r\n const res = await search(\r\n this.props.instance,\r\n {\r\n query: {\r\n pattern: searchString,\r\n ...size_limits,\r\n ...queryOptions,\r\n },\r\n priority: API.PriorityEnum.HIGH,\r\n hub_urls\r\n }\r\n );\r\n\r\n this.onSearchPosted(res);\r\n this.setState({\r\n searchString,\r\n running: true \r\n });\r\n } catch (error) {\r\n NotificationActions.apiError('Search failed', error);\r\n }\r\n }\r\n\r\n onSearchPosted = (data: API.SearchResponse) => {\r\n this.searchTimeout = window.setTimeout(\r\n () => {\r\n this.setState({ \r\n running: false,\r\n });\r\n }, \r\n data.queue_time + RESULT_WAIT_PERIOD\r\n );\r\n }\r\n\r\n parseOptions = (): SearchOptions | null => {\r\n const { query } = this.props.instance;\r\n if (!query) {\r\n return null;\r\n }\r\n\r\n return {\r\n excluded: query.excluded,\r\n size_limits: {\r\n min_size: query.min_size,\r\n max_size: query.max_size,\r\n },\r\n file_type: query.file_type === SearchConstants.DEFAULT_SEARCH_TYPE || query.file_type === 'tth' ? \r\n null : query.file_type,\r\n hub_urls: []\r\n };\r\n }\r\n\r\n searchT = getModuleT(this.props.t, UI.Modules.SEARCH);\r\n render() {\r\n const { instance, location } = this.props;\r\n const { searchString, running } = this.state;\r\n const { t } = this.searchT;\r\n return (\r\n <OfflineHubMessageDecorator \r\n offlineMessage={ t<string>(\r\n 'searchOffline', \r\n 'You must to be connected to at least one hub in order to perform searches'\r\n ) }\r\n >\r\n <div className=\"search-layout\">\r\n <SearchInput\r\n moduleT={ this.searchT }\r\n running={ running }\r\n defaultValue={ searchString }\r\n handleSubmit={ this.search }\r\n location={ location }\r\n defaultOptions={ this.parseOptions() }\r\n />\r\n <ResultTable \r\n searchString={ searchString } \r\n running={ running }\r\n searchT={ this.searchT }\r\n instance={ instance }\r\n />\r\n </div>\r\n </OfflineHubMessageDecorator>\r\n );\r\n }\r\n}\r\n\r\nconst OWNER_ID_SUFFIX = 'webui';\r\n\r\nexport default DataProviderDecorator<SearchProps, SearchDataProps>(Search, {\r\n urls: {\r\n instance: async (props, socket) => {\r\n // Try to use a previously created instance for this session\r\n const instances = await socket.get<API.SearchInstance[]>(`${SearchConstants.INSTANCES_URL}`);\r\n\r\n const instance = instances.find(i => i.owner === `session:${LoginStore.sessionId}:${OWNER_ID_SUFFIX}`);\r\n if (!!instance) {\r\n return instance;\r\n }\r\n\r\n // Create new instance\r\n const instanceId = (await socket.post<{ id: number; }>(SearchConstants.INSTANCES_URL, {\r\n owner_suffix: OWNER_ID_SUFFIX,\r\n expiration: 0\r\n })).id;\r\n\r\n return socket.get(`${SearchConstants.INSTANCES_URL}/${instanceId}`);\r\n }\r\n }\r\n});\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","DupeStrings","DupePaths","paths","className","map","path","FileItemInfoGrid","session","fileItem","user","downloadHandler","showPath","t","useTranslation","gridT","text","Grid","columns","stackable","title","name","type","str","size","time","tth","dupe","caption","button","itemInfoGetter","contextElement","hub","other","icon","connect_state","SearchActions","result","displayName","IconConstants","handler","data","location","History","pathname","browseContent","access","FilelistSessionActions","users","FilelistSessionStore","moduleId","actions","UserResult","userIcon","directory","ids","remoteMenuId","MenuConstants","hub_names","connection","slots","FormattedIp","item","ip","resultSort","a","b","nicks","localeCompare","DataProviderDecorator","results","defaultValue","defaultValue_plural","count","length","style","width","sort","cid","urls","parentResult","instanceId","socket","get","SearchConstants","searchDownloadHandler","itemInfo","downloadData","instance","SocketService","ResultDialog","Component","itemDataGetter","itemId","this","props","render","Modal","closable","FileIcon","typeInfo","fullHeight","DownloadDialog","Decorated","ModalRouteDecorator","match","params","resultId","_viewName","_apiUrl","mixins","ViewStoreMixin","getUserCaption","replace","UserCell","cellData","rowDataGetter","itemData","resultUserGetter","rowData","NameCell","userGetter","entityId","ResultTable","rowClassNameGetter","emptyRowsNodeGetter","running","searchString","searchT","Message","description","Trans","i18nKey","toI18nKey","VirtualTable","store","SearchViewStore","textFilterProps","autoFocus","Column","columnKey","flexGrow","cell","hideWidth","submitHandler","historyId","history","refetchData","LocalSuggestField","value","trim","HistoryConstants","loaderText","FormAccordion","locals","children","label","active","Accordion","defaultActiveIndexes","undefined","Icon","fontWeight","HubSelectField","hubs","onChange","onlineHubs","filter","selectedUrls","hub_url","beforeUnchecked","Checkbox","HubIcon","identity","checked","indexOf","newValue","maxWidth","HubsSelectField","renderSelect","renderLabel","SizeField","inputProps","moduleT","displayValue","setDisplayValue","useState","unitIndex","setUnitIndex","valueToBytes","ret","i","useEffect","curBytes","parsedValue","parsedUnitIndex","display","min","evt","target","parseInt","selectedIndex","unit","index","plainT","FileTypeField","renderInput","context","formT","SearchTypeIcon","searchType","files","directories","content_type","typeToMenuItem","selectedItem","MenuItemLink","onClick","SearchTypeDropdownDecorated","searchTypes","commonItems","translate","getCommonItems","find","Dropdown","selection","AccordionStruct","renderFieldset","childLocals","Fields","key","optional","item_type","definitions","SearchOptionsForm","PureComponent","constructor","super","onFieldChanged","hasChanges","formValue","Object","keys","reduce","reduced","save","form","onSave","changedFields","Promise","resolve","onFieldSetting","fieldOptions","assign","factory","template","disableOrder","AccordionStructField","Form","ref","c","fieldDefinitions","optionTitleFormatter","def","Button","disabled","marginTop","SearchOptionButtonDecorated","onValueChanged","Array","isArray","hub_urls","selectedUrlsNew","url","filterCount","curValue","Popup","triggerClassName","trigger","marginRight","color","contentUpdateTrigger","hide","HubConstants","onSocketConnected","addSocketListener","dataConverters","SearchInput","handleSubmit","defaultOptions","setOptions","mobile","placeholder","loading","Search","state","checkLocationState","search","console","log","clearTimeout","searchTimeout","size_limits","queryOptions","res","query","pattern","priority","onSearchPosted","setState","error","NotificationActions","window","setTimeout","queue_time","parseOptions","excluded","min_size","max_size","file_type","componentDidMount","componentDidUpdate","prevProps","OfflineHubMessageDecorator","offlineMessage","owner","LoginStore","post","owner_suffix","expiration"],"sourceRoot":""}
|