airdcpp-webui 2.12.1-beta.3 → 2.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/index.html +1 -1
  2. package/dist/js/{223.d8381390628f8a92159f.chunk.js → 223.92cf614c9d87cf67385e.chunk.js} +2 -2
  3. package/dist/js/223.92cf614c9d87cf67385e.chunk.js.gz +0 -0
  4. package/dist/js/{223.d8381390628f8a92159f.chunk.js.map → 223.92cf614c9d87cf67385e.chunk.js.map} +1 -1
  5. package/dist/js/{236.a5df8c51dbebe95cc268.chunk.js → 236.6b4fd58c10a23138b7d8.chunk.js} +2 -2
  6. package/dist/js/236.6b4fd58c10a23138b7d8.chunk.js.gz +0 -0
  7. package/dist/js/236.6b4fd58c10a23138b7d8.chunk.js.map +1 -0
  8. package/dist/js/{544.58de40c388788ce8d588.chunk.js → 544.826a806e4535f09cf100.chunk.js} +2 -2
  9. package/dist/js/{544.58de40c388788ce8d588.chunk.js.gz → 544.826a806e4535f09cf100.chunk.js.gz} +0 -0
  10. package/dist/js/{544.58de40c388788ce8d588.chunk.js.map → 544.826a806e4535f09cf100.chunk.js.map} +1 -1
  11. package/dist/js/{616.6af0b2487703c8da4b2c.chunk.js → 616.57a60c241582d79fa280.chunk.js} +2 -2
  12. package/dist/js/616.57a60c241582d79fa280.chunk.js.gz +0 -0
  13. package/dist/js/{616.6af0b2487703c8da4b2c.chunk.js.map → 616.57a60c241582d79fa280.chunk.js.map} +1 -1
  14. package/dist/js/{favorite-hubs.5d14015c002fab9d6e93.chunk.js → favorite-hubs.f1ced66aa7691eeee525.chunk.js} +2 -2
  15. package/dist/js/favorite-hubs.f1ced66aa7691eeee525.chunk.js.gz +0 -0
  16. package/dist/js/{favorite-hubs.5d14015c002fab9d6e93.chunk.js.map → favorite-hubs.f1ced66aa7691eeee525.chunk.js.map} +1 -1
  17. package/dist/js/{filelists.69f099cbc0bb5b67d1b8.chunk.js → filelists.852a6a879bab1f93854e.chunk.js} +2 -2
  18. package/dist/js/filelists.852a6a879bab1f93854e.chunk.js.gz +0 -0
  19. package/dist/js/{filelists.69f099cbc0bb5b67d1b8.chunk.js.map → filelists.852a6a879bab1f93854e.chunk.js.map} +1 -1
  20. package/dist/js/{home.ccd57551ac01ff4fc4ba.chunk.js → home.9a37f3a3c78cb9b3f45c.chunk.js} +3 -3
  21. package/dist/js/home.9a37f3a3c78cb9b3f45c.chunk.js.gz +0 -0
  22. package/dist/js/home.9a37f3a3c78cb9b3f45c.chunk.js.map +1 -0
  23. package/dist/js/{hubs.c2b8880d6d8ccfc9eb3a.chunk.js → hubs.c21b941c411425d4852f.chunk.js} +2 -2
  24. package/dist/js/hubs.c21b941c411425d4852f.chunk.js.gz +0 -0
  25. package/dist/js/hubs.c21b941c411425d4852f.chunk.js.map +1 -0
  26. package/dist/js/main.7a746a54efc4bf96cd20.entry.js +3 -0
  27. package/dist/js/{main.a7216efbb2c5cd34c7e5.entry.js.LICENSE.txt → main.7a746a54efc4bf96cd20.entry.js.LICENSE.txt} +3 -3
  28. package/dist/js/main.7a746a54efc4bf96cd20.entry.js.gz +0 -0
  29. package/dist/js/main.7a746a54efc4bf96cd20.entry.js.map +1 -0
  30. package/dist/js/{messages.980fd246050252a227cd.chunk.js → messages.6ed02d7d7ec7e06a93f2.chunk.js} +2 -2
  31. package/dist/js/messages.6ed02d7d7ec7e06a93f2.chunk.js.gz +0 -0
  32. package/dist/js/{messages.980fd246050252a227cd.chunk.js.map → messages.6ed02d7d7ec7e06a93f2.chunk.js.map} +1 -1
  33. package/dist/js/{queue.31409106566ce8e19fc3.chunk.js → queue.c73112a5c40baeee7c54.chunk.js} +2 -2
  34. package/dist/js/queue.c73112a5c40baeee7c54.chunk.js.gz +0 -0
  35. package/dist/js/{queue.31409106566ce8e19fc3.chunk.js.map → queue.c73112a5c40baeee7c54.chunk.js.map} +1 -1
  36. package/dist/js/{search.d724d4a3b2c8f3fe2768.chunk.js → search.66bbb5aead0f68100e76.chunk.js} +2 -2
  37. package/dist/js/search.66bbb5aead0f68100e76.chunk.js.gz +0 -0
  38. package/dist/js/{search.d724d4a3b2c8f3fe2768.chunk.js.map → search.66bbb5aead0f68100e76.chunk.js.map} +1 -1
  39. package/dist/js/settings.a509b3c48b03452b6783.chunk.js +2 -0
  40. package/dist/js/settings.a509b3c48b03452b6783.chunk.js.gz +0 -0
  41. package/dist/js/settings.a509b3c48b03452b6783.chunk.js.map +1 -0
  42. package/dist/js/{share.a35d32796acde4fc3d59.chunk.js → share.6efce937acbd036d089d.chunk.js} +2 -2
  43. package/dist/js/share.6efce937acbd036d089d.chunk.js.gz +0 -0
  44. package/dist/js/{share.a35d32796acde4fc3d59.chunk.js.map → share.6efce937acbd036d089d.chunk.js.map} +1 -1
  45. package/dist/js/{system-log.2d9af5f3372752909d83.chunk.js → system-log.3efd872fbf4a90cde8d5.chunk.js} +2 -2
  46. package/dist/js/system-log.3efd872fbf4a90cde8d5.chunk.js.gz +0 -0
  47. package/dist/js/{system-log.2d9af5f3372752909d83.chunk.js.map → system-log.3efd872fbf4a90cde8d5.chunk.js.map} +1 -1
  48. package/dist/js/{transfers.22bad3799f0455da946b.chunk.js → transfers.326119d8de6e6f8176b5.chunk.js} +2 -2
  49. package/dist/js/transfers.326119d8de6e6f8176b5.chunk.js.gz +0 -0
  50. package/dist/js/{transfers.22bad3799f0455da946b.chunk.js.map → transfers.326119d8de6e6f8176b5.chunk.js.map} +1 -1
  51. package/dist/sw.js +1 -1
  52. package/dist/sw.js.gz +0 -0
  53. package/jest.config.js +1 -1
  54. package/package.json +2 -2
  55. package/tsconfig.json +1 -1
  56. package/dist/js/223.d8381390628f8a92159f.chunk.js.gz +0 -0
  57. package/dist/js/236.a5df8c51dbebe95cc268.chunk.js.gz +0 -0
  58. package/dist/js/236.a5df8c51dbebe95cc268.chunk.js.map +0 -1
  59. package/dist/js/616.6af0b2487703c8da4b2c.chunk.js.gz +0 -0
  60. package/dist/js/favorite-hubs.5d14015c002fab9d6e93.chunk.js.gz +0 -0
  61. package/dist/js/filelists.69f099cbc0bb5b67d1b8.chunk.js.gz +0 -0
  62. package/dist/js/home.ccd57551ac01ff4fc4ba.chunk.js.gz +0 -0
  63. package/dist/js/home.ccd57551ac01ff4fc4ba.chunk.js.map +0 -1
  64. package/dist/js/hubs.c2b8880d6d8ccfc9eb3a.chunk.js.gz +0 -0
  65. package/dist/js/hubs.c2b8880d6d8ccfc9eb3a.chunk.js.map +0 -1
  66. package/dist/js/main.a7216efbb2c5cd34c7e5.entry.js +0 -3
  67. package/dist/js/main.a7216efbb2c5cd34c7e5.entry.js.gz +0 -0
  68. package/dist/js/main.a7216efbb2c5cd34c7e5.entry.js.map +0 -1
  69. package/dist/js/messages.980fd246050252a227cd.chunk.js.gz +0 -0
  70. package/dist/js/queue.31409106566ce8e19fc3.chunk.js.gz +0 -0
  71. package/dist/js/search.d724d4a3b2c8f3fe2768.chunk.js.gz +0 -0
  72. package/dist/js/settings.4087d834170e87ff1c53.chunk.js +0 -2
  73. package/dist/js/settings.4087d834170e87ff1c53.chunk.js.gz +0 -0
  74. package/dist/js/settings.4087d834170e87ff1c53.chunk.js.map +0 -1
  75. package/dist/js/share.a35d32796acde4fc3d59.chunk.js.gz +0 -0
  76. package/dist/js/system-log.2d9af5f3372752909d83.chunk.js.gz +0 -0
  77. package/dist/js/transfers.22bad3799f0455da946b.chunk.js.gz +0 -0
  78. /package/dist/js/{home.ccd57551ac01ff4fc4ba.chunk.js.LICENSE.txt → home.9a37f3a3c78cb9b3f45c.chunk.js.LICENSE.txt} +0 -0
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[871],{58834:(e,s,n)=>{n.d(s,{A:()=>c});var t=n(71354),i=n.n(t),o=n(76314),a=n.n(o)()(i());a.push([e.id,".ccpm-state {\n display: flex;\n}\n\n.ccpm-state > i {\n align-self: center;\n}\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 {\n display: flex;\n}\n\n.ccpm-state > i {\n align-self: center;\n}\n"],sourceRoot:""}]);const c=a},22187:(e,s,n)=>{n.d(s,{A:()=>r});var t=n(74848),i=n(77856),o=n(71352),a=n(93866),c=n(39115);function r(e){return{itemNameGetter:e=>e.user.nicks,itemStatusGetter(e){const{flags:s}=e.user;return(0,i.Z)(s)},itemHeaderDescriptionGetter:e=>e.user.hub_names,itemHeaderIconGetter:e=>(0,t.jsx)(a.A,{flags:e.user.flags}),itemHeaderTitleGetter(s,n,i){const{user:a}=s;return(0,t.jsx)(o.Bg,{user:a,ids:e,remoteMenuId:c.Ay.HINTED_USER,children:i})}}}},574:(e,s,n)=>{n.r(s),n.d(s,{default:()=>ae});var t=n(74848),i=n(96540),o=n(91950),a=n(22187),c=n(10704),r=n(8220),l=n(62705),A=n(93226),d=n(4425),u=n(84855);const p=e=>c.A.getSession(e.user.cid),S=e=>{const s=s=>{const{location:n,navigate:t}=e;r.A.createSession(s,{sessionStore:c.A,location:n,navigate:t})},{sessionT:n}=e;return(0,t.jsxs)("div",{className:"private chat session new",children:[(0,t.jsx)(u.M,{onChange:s,offlineMessage:n.t("offlineMessage","You must to be connected to at least one hub in order to send private messages"),isClearable:!1,autoFocus:!0}),(0,t.jsx)(l.A,{entryType:A.iM.PRIVATE_CHAT,hasSession:p,entryTitleRenderer:e=>(0,t.jsx)("a",{onClick:n=>s(e.user),children:e.user.nicks}),entryIcon:d.A.MESSAGES_PLAIN})]})};var E=n(99104),m=n(38453),h=n(99347),C=n(71352),T=n(85208),I=n(86038),_=n(25113),b=n(26817),g=n(67749);const f={connectCCPM:{id:"connectCCPM",displayName:"Connect",access:I.US.PRIVATE_CHAT_EDIT,icon:d.A.PLAY,handler:({itemData:e})=>b.A.post(`${_.A.SESSIONS_URL}/${e.id}/ccpm`),filter:({itemData:e})=>e.ccpm_state.id===I.ob.DISCONNECTED},disconnectCCPM:{id:"disconnectCCPM",displayName:"Disconnect",access:I.US.PRIVATE_CHAT_EDIT,icon:d.A.REMOVE,handler:({itemData:e})=>b.A.delete(`${_.A.SESSIONS_URL}/${e.id}/ccpm`),filter:({itemData:e})=>e.ccpm_state.id===I.ob.CONNECTED}},N={moduleData:{moduleId:g.KV.MESSAGES},actions:f},y=(e,s)=>{const{translate:n}=s;switch(e){case I.ob.CONNECTED:return n("Direct encrypted channel established");case I.ob.CONNECTING:return(0,t.jsx)(h.A,{size:"mini",inline:!0,text:n("Establishing connection...")});case I.ob.DISCONNECTED:return n("Direct encrypted channel available");default:return null}},D=({session:e,sessionT:s})=>{const{flags:n}=e.user;if(!n.includes("ccpm"))return null;const i=e.ccpm_state.id;return i===I.ob.DISCONNECTED&&n.includes("offline")?null:(0,t.jsx)(m.q,{children:(0,t.jsxs)("div",{className:"ccpm-state",children:[(0,t.jsx)(T.A,{encryption:e.ccpm_state.encryption,alwaysVisible:!0,boundary:".session-container"}),(0,t.jsx)(C.Wy,{caption:y(i,s),actions:N,itemData:e})]})})};var v=n(22005),O=n.n(v),x=n(20311),M=n.n(x),P=n(14038),R=n(97744),j=n(19618);const w=O().createStore({scroll:(0,j.z)(),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=_.A.MODULE_URL;e(s,_.A.MESSAGE,this._onChatMessage),e(s,_.A.STATUS,this._onStatusMessage),e(s,_.A.SESSION_REMOVED,this._onSessionRemoved),e(s,_.A.SESSION_UPDATED,this._onSessionUpdated)}}),U=(0,P.A)(w,r.A,R.A.PRIVATE_CHAT_VIEW);var G=n(59548),H=n(39115);class V extends i.Component{constructor(){super(...arguments),this.handleFileUpload=e=>{const{cid:s,hub_url:n,flags:t}=this.props.session.user,i=!t.includes("nmdc")&&!t.includes("bot");return(0,G.eo)(e,n,i?s:void 0)}}render(){const{session:e,sessionApi:s,sessionT:n,uiActions:i}=this.props;return(0,t.jsxs)("div",{className:"private chat session",children:[(0,t.jsx)(E.A,{chatAccess:I.US.PRIVATE_CHAT_SEND,chatActions:i,chatApi:r.A,sessionApi:s,messageStore:U,session:e,handleFileUpload:this.handleFileUpload,highlightRemoteMenuId:H.Ay.PRIVATE_CHAT_MESSAGE_HIGHLIGHT}),(0,t.jsx)(D,{session:e,sessionT:n})]})}}V.displayName="PrivateChatSession";const k=V;var L=n(78046),z=n(85072),B=n.n(z),F=n(97825),$=n.n(F),K=n(77659),W=n.n(K),Y=n(55056),Z=n.n(Y),q=n(10540),J=n.n(q),Q=n(41113),X=n.n(Q),ee=n(58834),se={};se.styleTagTransform=X(),se.setAttributes=Z(),se.insert=W().bind(null,"head"),se.domAPI=$(),se.insertStyleElement=J(),B()(ee.A,se),ee.A&&ee.A.locals&&ee.A.locals;var ne=n(4112);const te={clearChat:(0,n(69858).G)(_.A.SESSIONS_URL,I.US.PRIVATE_CHAT_EDIT),remove:(0,ne.R)(_.A.SESSIONS_URL,I.US.PRIVATE_CHAT_EDIT)},ie={moduleData:{moduleId:g.KV.MESSAGES},actions:te};const oe=["clear"],ae=(0,L.Z)((e=>{const{params:s,sessionT: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,["params","sessionT"]);return(0,t.jsx)(o.A,Object.assign({activeId:s.id,baseUrl:"messages",newCaption:n.t("new","New session"),newDescription:n.t("newDesc","Open a new private chat session"),newIcon:d.A.MESSAGES_PLAIN,unreadInfoStore:c.A,editAccess:I.US.PRIVATE_CHAT_EDIT,uiActions:ie,sessionApi:r.A,actionIds:oe,sessionItemLayout:k,newLayout:S,sessionT:n},(0,a.A)(["browse","ignore","unignore"]),i))}),c.A,g.KV.MESSAGES)}}]);
2
- //# sourceMappingURL=messages.980fd246050252a227cd.chunk.js.map
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[871],{58834:(e,s,n)=>{n.d(s,{A:()=>c});var t=n(71354),i=n.n(t),a=n(76314),o=n.n(a)()(i());o.push([e.id,".ccpm-state {\n display: flex;\n}\n\n.ccpm-state > i {\n align-self: center;\n}\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 {\n display: flex;\n}\n\n.ccpm-state > i {\n align-self: center;\n}\n"],sourceRoot:""}]);const c=o},22187:(e,s,n)=>{n.d(s,{A:()=>r});var t=n(74848),i=n(77856),a=n(71352),o=n(93866),c=n(39115);function r(e){return{itemNameGetter:e=>e.user.nicks,itemStatusGetter(e){const{flags:s}=e.user;return(0,i.Z)(s)},itemHeaderDescriptionGetter:e=>e.user.hub_names,itemHeaderIconGetter:e=>(0,t.jsx)(o.A,{flags:e.user.flags}),itemHeaderTitleGetter(s,n,i){const{user:o}=s;return(0,t.jsx)(a.Bg,{user:o,ids:e,remoteMenuId:c.Ay.HINTED_USER,children:i})}}}},574:(e,s,n)=>{n.r(s),n.d(s,{default:()=>oe});var t=n(74848),i=n(96540),a=n(91950),o=n(22187),c=n(10704),r=n(8220),l=n(62705),A=n(93226),d=n(4425),u=n(84855);const p=e=>c.A.getSession(e.user.cid),S=e=>{const s=s=>{const{location:n,navigate:t}=e;r.A.createSession(s,{sessionStore:c.A,location:n,navigate:t})},{sessionT:n}=e;return(0,t.jsxs)("div",{className:"private chat session new",children:[(0,t.jsx)(u.M,{onChange:s,offlineMessage:n.t("offlineMessage","You must to be connected to at least one hub in order to send private messages"),isClearable:!1,autoFocus:!0}),(0,t.jsx)(l.A,{entryType:A.iM.PRIVATE_CHAT,hasSession:p,entryTitleRenderer:e=>(0,t.jsx)("a",{onClick:n=>s(e.user),children:e.user.nicks}),entryIcon:d.A.MESSAGES_PLAIN})]})};var E=n(99104),m=n(38453),h=n(99347),C=n(71352),T=n(85208),I=n(86038),_=n(25113),b=n(32811),g=n(67749);const f={connectCCPM:{id:"connectCCPM",displayName:"Connect",access:I.US.PRIVATE_CHAT_EDIT,icon:d.A.PLAY,handler:({itemData:e})=>b.A.post(`${_.A.SESSIONS_URL}/${e.id}/ccpm`),filter:({itemData:e})=>e.ccpm_state.id===I.ob.DISCONNECTED},disconnectCCPM:{id:"disconnectCCPM",displayName:"Disconnect",access:I.US.PRIVATE_CHAT_EDIT,icon:d.A.REMOVE,handler:({itemData:e})=>b.A.delete(`${_.A.SESSIONS_URL}/${e.id}/ccpm`),filter:({itemData:e})=>e.ccpm_state.id===I.ob.CONNECTED}},N={moduleData:{moduleId:g.KV.MESSAGES},actions:f},y=(e,s)=>{const{translate:n}=s;switch(e){case I.ob.CONNECTED:return n("Direct encrypted channel established");case I.ob.CONNECTING:return(0,t.jsx)(h.A,{size:"mini",inline:!0,text:n("Establishing connection...")});case I.ob.DISCONNECTED:return n("Direct encrypted channel available");default:return null}},D=({session:e,sessionT:s})=>{const{flags:n}=e.user;if(!n.includes("ccpm"))return null;const i=e.ccpm_state.id;return i===I.ob.DISCONNECTED&&n.includes("offline")?null:(0,t.jsx)(m.q,{children:(0,t.jsxs)("div",{className:"ccpm-state",children:[(0,t.jsx)(T.A,{encryption:e.ccpm_state.encryption,alwaysVisible:!0,boundary:".session-container"}),(0,t.jsx)(C.Wy,{caption:y(i,s),actions:N,itemData:e})]})})};var v=n(22005),O=n.n(v),x=n(20311),M=n.n(x),P=n(14038),R=n(97744),j=n(19618);const w=O().createStore({scroll:(0,j.z)(),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=_.A.MODULE_URL;e(s,_.A.MESSAGE,this._onChatMessage),e(s,_.A.STATUS,this._onStatusMessage),e(s,_.A.SESSION_REMOVED,this._onSessionRemoved),e(s,_.A.SESSION_UPDATED,this._onSessionUpdated)}}),U=(0,P.A)(w,r.A,R.A.PRIVATE_CHAT_VIEW);var G=n(59548),H=n(39115);class V extends i.Component{constructor(){super(...arguments),this.handleFileUpload=e=>{const{cid:s,hub_url:n,flags:t}=this.props.session.user,i=!t.includes("nmdc")&&!t.includes("bot");return(0,G.eo)(e,n,i?s:void 0)}}render(){const{session:e,sessionApi:s,sessionT:n,uiActions:i}=this.props;return(0,t.jsxs)("div",{className:"private chat session",children:[(0,t.jsx)(E.A,{chatAccess:I.US.PRIVATE_CHAT_SEND,chatActions:i,chatApi:r.A,sessionApi:s,messageStore:U,session:e,handleFileUpload:this.handleFileUpload,highlightRemoteMenuId:H.Ay.PRIVATE_CHAT_MESSAGE_HIGHLIGHT}),(0,t.jsx)(D,{session:e,sessionT:n})]})}}V.displayName="PrivateChatSession";const k=V;var L=n(78046),z=n(85072),B=n.n(z),F=n(97825),$=n.n(F),K=n(77659),W=n.n(K),Y=n(55056),Z=n.n(Y),q=n(10540),J=n.n(q),Q=n(41113),X=n.n(Q),ee=n(58834),se={};se.styleTagTransform=X(),se.setAttributes=Z(),se.insert=W().bind(null,"head"),se.domAPI=$(),se.insertStyleElement=J(),B()(ee.A,se),ee.A&&ee.A.locals&&ee.A.locals;var ne=n(4112);const te={clearChat:(0,n(69858).G)(_.A.SESSIONS_URL,I.US.PRIVATE_CHAT_EDIT),remove:(0,ne.R)(_.A.SESSIONS_URL,I.US.PRIVATE_CHAT_EDIT)},ie={moduleData:{moduleId:g.KV.MESSAGES},actions:te};const ae=["clearChat"],oe=(0,L.Z)((e=>{const{params:s,sessionT: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,["params","sessionT"]);return(0,t.jsx)(a.A,Object.assign({activeId:s.id,baseUrl:"messages",newCaption:n.t("new","New session"),newDescription:n.t("newDesc","Open a new private chat session"),newIcon:d.A.MESSAGES_PLAIN,unreadInfoStore:c.A,editAccess:I.US.PRIVATE_CHAT_EDIT,uiActions:ie,sessionApi:r.A,actionIds:ae,sessionItemLayout:k,newLayout:S,sessionT:n},(0,o.A)(["browse","ignore","unignore"]),i))}),c.A,g.KV.MESSAGES)}}]);
2
+ //# sourceMappingURL=messages.6ed02d7d7ec7e06a93f2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"js/messages.980fd246050252a227cd.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/routes/Messages/style.css","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/UserItemHandlerDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Messages/components/MessageNew.tsx","webpack://airdcpp-webui/./src/actions/ui/private-chat/PrivateChatCCPMActions.ts","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/actions/ui/private-chat/PrivateChatActions.ts","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/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.ccpm-state {\n display: flex;\n}\n\n.ccpm-state > i {\n align-self: center;\n}\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 {\\n display: flex;\\n}\\n\\n.ccpm-state > i {\\n align-self: center;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { userOnlineStatusToColor } from 'utils/TypeConvert';\r\nimport { UserMenu } from 'components/action-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\ninterface UserSessionBase {\r\n user: API.HintedUser;\r\n}\r\n\r\nexport default function <SessionT extends UI.SessionItemBase & UserSessionBase>(\r\n itemMenuIds: string[],\r\n) {\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 user={user} ids={itemMenuIds} remoteMenuId={MenuConstants.HINTED_USER}>\r\n {actionMenu}\r\n </UserMenu>\r\n );\r\n },\r\n };\r\n\r\n return UserItemHandlerDecorator;\r\n}\r\n","import 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 IconConstants from 'constants/IconConstants';\r\nimport { UserSelectField } from 'components/select';\r\nimport { NewSessionLayoutProps } from 'routes/Sidebar/components/types';\r\n\r\nconst hasSession = (entry: API.HistoryItem) => {\r\n return PrivateChatSessionStore.getSession(entry.user!.cid);\r\n};\r\n\r\nconst MessageNew: React.FC<NewSessionLayoutProps> = (props) => {\r\n const handleSubmit = (user: API.HintedUser) => {\r\n const { location, navigate } = props;\r\n PrivateChatActions.createSession(user, {\r\n sessionStore: PrivateChatSessionStore,\r\n location,\r\n navigate,\r\n });\r\n };\r\n\r\n const recentUserRender = (entry: API.HistoryItem) => {\r\n return <a onClick={(_) => handleSubmit(entry.user!)}>{entry.user!.nicks}</a>;\r\n };\r\n\r\n const { sessionT } = props;\r\n return (\r\n <div className=\"private chat session new\">\r\n <UserSelectField\r\n onChange={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={recentUserRender}\r\n entryIcon={IconConstants.MESSAGES_PLAIN}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default MessageNew;\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 * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\ntype Filter = UI.ActionFilter<API.PrivateChat>;\r\nconst ccpmConnected: Filter = ({ itemData }) =>\r\n itemData.ccpm_state.id === API.CCPMStateEnum.CONNECTED;\r\nconst ccpmDisconnected: Filter = ({ itemData }) =>\r\n itemData.ccpm_state.id === API.CCPMStateEnum.DISCONNECTED;\r\n\r\ntype Handler = UI.ActionHandler<API.PrivateChat>;\r\n\r\nconst handleConnectCCPM: Handler = ({ itemData: session }) => {\r\n return SocketService.post(`${PrivateChatConstants.SESSIONS_URL}/${session.id}/ccpm`);\r\n};\r\n\r\nconst handleDisconnectCCPM: Handler = ({ itemData: session }) => {\r\n return SocketService.delete(`${PrivateChatConstants.SESSIONS_URL}/${session.id}/ccpm`);\r\n};\r\n\r\nexport const PrivateChatConnectCCPMAction = {\r\n id: '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\r\nexport const PrivateChatDisconnectCCPMAction = {\r\n id: 'disconnectCCPM',\r\n displayName: 'Disconnect',\r\n access: API.AccessEnum.PRIVATE_CHAT_EDIT,\r\n icon: IconConstants.REMOVE,\r\n handler: handleDisconnectCCPM,\r\n filter: ccpmConnected,\r\n};\r\n\r\nconst PrivateChatActions: UI.ActionListType<API.PrivateChat> = {\r\n connectCCPM: PrivateChatConnectCCPMAction,\r\n disconnectCCPM: PrivateChatDisconnectCCPMAction,\r\n};\r\n\r\nexport const PrivateChatCCPMActionModule = {\r\n moduleId: UI.Modules.MESSAGES,\r\n};\r\n\r\nexport const PrivateChatCCPMActionMenu = {\r\n moduleData: PrivateChatCCPMActionModule,\r\n actions: PrivateChatActions,\r\n};\r\n","import * as React from 'react';\n\nimport { SessionFooter } from 'routes/Sidebar/components/SessionFooter';\nimport Loader from 'components/semantic/Loader';\nimport { ActionMenu } from 'components/action-menu';\nimport EncryptionState from 'components/EncryptionState';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { PrivateChatCCPMActionMenu } from 'actions/ui/private-chat/PrivateChatCCPMActions';\n\nconst getCaption = (state: API.CCPMStateEnum, sessionT: UI.ModuleTranslator) => {\n const { translate } = sessionT;\n switch (state) {\n case API.CCPMStateEnum.CONNECTED:\n return translate('Direct encrypted channel established');\n case API.CCPMStateEnum.CONNECTING:\n return (\n <Loader\n size=\"mini\"\n inline={true}\n text={translate('Establishing connection...')}\n />\n );\n case API.CCPMStateEnum.DISCONNECTED:\n return translate('Direct encrypted channel available');\n default:\n return null;\n }\n};\n\ninterface CCPMStateProps {\n session: API.PrivateChat;\n sessionT: UI.ModuleTranslator;\n}\n\nconst CCPMState: React.FC<CCPMStateProps> = ({ session, sessionT }) => {\n const { flags } = session.user;\n if (!flags.includes('ccpm')) {\n return null;\n }\n\n const state = session.ccpm_state.id;\n if (state === API.CCPMStateEnum.DISCONNECTED && flags.includes('offline')) {\n return null;\n }\n\n return (\n <SessionFooter>\n <div className=\"ccpm-state\">\n <EncryptionState\n encryption={session.ccpm_state.encryption}\n alwaysVisible={true}\n boundary=\".session-container\"\n />\n <ActionMenu\n caption={getCaption(state, sessionT)}\n actions={PrivateChatCCPMActionMenu}\n itemData={session}\n />\n </div>\n </SessionFooter>\n );\n};\n\nexport default CCPMState;\n","//@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\nconst PrivateChatMessageStore = Reflux.createStore({\r\n scroll: SessionScrollPositionKeeper(),\r\n\r\n onSocketConnected(addSocketListener: AddSocketListener) {\r\n invariant(\r\n !this.hasMessages(),\r\n 'No existing private messages should exist on socket connect',\r\n );\r\n invariant(\r\n !this.hasInitializedSessions(),\r\n 'No initialized private message sessions should exist on socket connect',\r\n );\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(\r\n PrivateChatMessageStore,\r\n PrivateChatActions,\r\n AccessConstants.PRIVATE_CHAT_VIEW,\r\n);\r\n","import { Component } from 'react';\r\n\r\nimport ChatLayout 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\nimport * as UI from 'types/ui';\r\n\r\nimport { shareTempFile } from 'services/api/ShareApi';\r\nimport PrivateChatActions from 'actions/reflux/PrivateChatActions';\r\nimport MenuConstants from 'constants/MenuConstants';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/types';\r\n\r\ntype PrivateChatSessionProps = SessionChildProps<\r\n API.PrivateChat,\r\n UI.EmptyObject,\r\n UI.ChatActionList\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.includes('nmdc') && !flags.includes('bot');\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 UI.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 session={session} sessionT={sessionT} />\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;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import PrivateChatConstants from 'constants/PrivateChatConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { BuildRemoveSessionAction } from '../decorators/SessionActionDecorator';\r\nimport { BuildClearChatAction } from '../decorators/ChatActionDecorator';\r\n\r\nconst PrivateChatClearChatAction = BuildClearChatAction(\r\n PrivateChatConstants.SESSIONS_URL,\r\n API.AccessEnum.PRIVATE_CHAT_EDIT,\r\n);\r\n\r\nconst PrivateChatRemoveAction = BuildRemoveSessionAction(\r\n PrivateChatConstants.SESSIONS_URL,\r\n API.AccessEnum.PRIVATE_CHAT_EDIT,\r\n);\r\n\r\nconst PrivateChatActions: UI.ActionListType<API.PrivateChat> = {\r\n clearChat: PrivateChatClearChatAction,\r\n remove: PrivateChatRemoveAction,\r\n};\r\n\r\nexport const PrivateChatActionModule = {\r\n moduleId: UI.Modules.MESSAGES,\r\n};\r\n\r\nexport const PrivateChatActionMenu = {\r\n moduleData: PrivateChatActionModule,\r\n actions: PrivateChatActions,\r\n};\r\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 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 {\r\n SessionProviderDecoratorChildProps,\r\n SessionProviderDecorator,\r\n} from 'routes/Sidebar/decorators/SessionProviderDecorator';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport '../style.css';\r\nimport { PrivateChatActionMenu } from 'actions/ui/private-chat';\r\n\r\nconst sessionActions = ['clear'];\r\n\r\nconst Messages: React.FC<SessionProviderDecoratorChildProps<API.PrivateChat>> = (\r\n props,\r\n) => {\r\n const { params, sessionT, ...other } = props;\r\n return (\r\n <SessionLayout\r\n activeId={params.id}\r\n baseUrl=\"messages\"\r\n newCaption={sessionT.t('new', 'New session')}\r\n newDescription={sessionT.t('newDesc', '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={PrivateChatActionMenu}\r\n sessionApi={PrivateChatAPIActions as UI.SessionActions<API.PrivateChat>}\r\n actionIds={sessionActions}\r\n sessionItemLayout={PrivateChatSession}\r\n newLayout={MessageNew}\r\n sessionT={sessionT}\r\n {...UserItemHandlerDecorator(['browse', 'ignore', 'unignore'])}\r\n {...other}\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(\r\n Messages,\r\n PrivateChatSessionStore,\r\n UI.Modules.MESSAGES,\r\n);\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","HINTED_USER","hasSession","entry","PrivateChatSessionStore","getSession","cid","props","handleSubmit","navigate","PrivateChatActions","createSession","sessionStore","sessionT","className","onChange","offlineMessage","t","isClearable","autoFocus","RecentLayout","entryType","PRIVATE_CHAT","entryTitleRenderer","onClick","_","entryIcon","IconConstants","MESSAGES_PLAIN","connectCCPM","displayName","access","PRIVATE_CHAT_EDIT","icon","PLAY","handler","itemData","SocketService","post","PrivateChatConstants","SESSIONS_URL","filter","ccpm_state","DISCONNECTED","disconnectCCPM","REMOVE","delete","CONNECTED","PrivateChatCCPMActionMenu","moduleData","moduleId","MESSAGES","actions","getCaption","state","translate","CONNECTING","Loader","size","inline","text","includes","SessionFooter","EncryptionState","encryption","alwaysVisible","boundary","caption","PrivateChatMessageStore","scroll","SessionScrollPositionKeeper","onSocketConnected","addSocketListener","this","hasMessages","hasInitializedSessions","url","MODULE_URL","MESSAGE","_onChatMessage","STATUS","_onStatusMessage","SESSION_REMOVED","_onSessionRemoved","SESSION_UPDATED","_onSessionUpdated","MessageStoreDecorator","AccessConstants","A","PRIVATE_CHAT_VIEW","PrivateChatSession","Component","handleFileUpload","file","hub_url","isPrivate","undefined","render","sessionApi","uiActions","ChatLayout","chatAccess","PRIVATE_CHAT_SEND","chatActions","chatApi","messageStore","highlightRemoteMenuId","MenuConstants","PRIVATE_CHAT_MESSAGE_HIGHLIGHT","MessageFooter","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","clearChat","remove","PrivateChatActionMenu","sessionActions","SessionProviderDecorator","params","other","SessionLayout","activeId","baseUrl","newCaption","newDescription","newIcon","unreadInfoStore","editAccess","actionIds","sessionItemLayout","newLayout","UserItemHandlerDecorator"],"sourceRoot":""}
1
+ {"version":3,"file":"js/messages.6ed02d7d7ec7e06a93f2.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/routes/Messages/style.css","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/UserItemHandlerDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Messages/components/MessageNew.tsx","webpack://airdcpp-webui/./src/actions/ui/private-chat/PrivateChatCCPMActions.ts","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/actions/ui/private-chat/PrivateChatActions.ts","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/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.ccpm-state {\n display: flex;\n}\n\n.ccpm-state > i {\n align-self: center;\n}\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 {\\n display: flex;\\n}\\n\\n.ccpm-state > i {\\n align-self: center;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { userOnlineStatusToColor } from 'utils/TypeConvert';\r\nimport { UserMenu } from 'components/action-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\ninterface UserSessionBase {\r\n user: API.HintedUser;\r\n}\r\n\r\nexport default function <SessionT extends UI.SessionItemBase & UserSessionBase>(\r\n itemMenuIds: string[],\r\n) {\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 user={user} ids={itemMenuIds} remoteMenuId={MenuConstants.HINTED_USER}>\r\n {actionMenu}\r\n </UserMenu>\r\n );\r\n },\r\n };\r\n\r\n return UserItemHandlerDecorator;\r\n}\r\n","import 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 IconConstants from 'constants/IconConstants';\r\nimport { UserSelectField } from 'components/select';\r\nimport { NewSessionLayoutProps } from 'routes/Sidebar/components/types';\r\n\r\nconst hasSession = (entry: API.HistoryItem) => {\r\n return PrivateChatSessionStore.getSession(entry.user!.cid);\r\n};\r\n\r\nconst MessageNew: React.FC<NewSessionLayoutProps> = (props) => {\r\n const handleSubmit = (user: API.HintedUser) => {\r\n const { location, navigate } = props;\r\n PrivateChatActions.createSession(user, {\r\n sessionStore: PrivateChatSessionStore,\r\n location,\r\n navigate,\r\n });\r\n };\r\n\r\n const recentUserRender = (entry: API.HistoryItem) => {\r\n return <a onClick={(_) => handleSubmit(entry.user!)}>{entry.user!.nicks}</a>;\r\n };\r\n\r\n const { sessionT } = props;\r\n return (\r\n <div className=\"private chat session new\">\r\n <UserSelectField\r\n onChange={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={recentUserRender}\r\n entryIcon={IconConstants.MESSAGES_PLAIN}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default MessageNew;\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 * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\ntype Filter = UI.ActionFilter<API.PrivateChat>;\r\nconst ccpmConnected: Filter = ({ itemData }) =>\r\n itemData.ccpm_state.id === API.CCPMStateEnum.CONNECTED;\r\nconst ccpmDisconnected: Filter = ({ itemData }) =>\r\n itemData.ccpm_state.id === API.CCPMStateEnum.DISCONNECTED;\r\n\r\ntype Handler = UI.ActionHandler<API.PrivateChat>;\r\n\r\nconst handleConnectCCPM: Handler = ({ itemData: session }) => {\r\n return SocketService.post(`${PrivateChatConstants.SESSIONS_URL}/${session.id}/ccpm`);\r\n};\r\n\r\nconst handleDisconnectCCPM: Handler = ({ itemData: session }) => {\r\n return SocketService.delete(`${PrivateChatConstants.SESSIONS_URL}/${session.id}/ccpm`);\r\n};\r\n\r\nexport const PrivateChatConnectCCPMAction = {\r\n id: '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\r\nexport const PrivateChatDisconnectCCPMAction = {\r\n id: 'disconnectCCPM',\r\n displayName: 'Disconnect',\r\n access: API.AccessEnum.PRIVATE_CHAT_EDIT,\r\n icon: IconConstants.REMOVE,\r\n handler: handleDisconnectCCPM,\r\n filter: ccpmConnected,\r\n};\r\n\r\nconst PrivateChatActions: UI.ActionListType<API.PrivateChat> = {\r\n connectCCPM: PrivateChatConnectCCPMAction,\r\n disconnectCCPM: PrivateChatDisconnectCCPMAction,\r\n};\r\n\r\nexport const PrivateChatCCPMActionModule = {\r\n moduleId: UI.Modules.MESSAGES,\r\n};\r\n\r\nexport const PrivateChatCCPMActionMenu = {\r\n moduleData: PrivateChatCCPMActionModule,\r\n actions: PrivateChatActions,\r\n};\r\n","import * as React from 'react';\n\nimport { SessionFooter } from 'routes/Sidebar/components/SessionFooter';\nimport Loader from 'components/semantic/Loader';\nimport { ActionMenu } from 'components/action-menu';\nimport EncryptionState from 'components/EncryptionState';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { PrivateChatCCPMActionMenu } from 'actions/ui/private-chat/PrivateChatCCPMActions';\n\nconst getCaption = (state: API.CCPMStateEnum, sessionT: UI.ModuleTranslator) => {\n const { translate } = sessionT;\n switch (state) {\n case API.CCPMStateEnum.CONNECTED:\n return translate('Direct encrypted channel established');\n case API.CCPMStateEnum.CONNECTING:\n return (\n <Loader\n size=\"mini\"\n inline={true}\n text={translate('Establishing connection...')}\n />\n );\n case API.CCPMStateEnum.DISCONNECTED:\n return translate('Direct encrypted channel available');\n default:\n return null;\n }\n};\n\ninterface CCPMStateProps {\n session: API.PrivateChat;\n sessionT: UI.ModuleTranslator;\n}\n\nconst CCPMState: React.FC<CCPMStateProps> = ({ session, sessionT }) => {\n const { flags } = session.user;\n if (!flags.includes('ccpm')) {\n return null;\n }\n\n const state = session.ccpm_state.id;\n if (state === API.CCPMStateEnum.DISCONNECTED && flags.includes('offline')) {\n return null;\n }\n\n return (\n <SessionFooter>\n <div className=\"ccpm-state\">\n <EncryptionState\n encryption={session.ccpm_state.encryption}\n alwaysVisible={true}\n boundary=\".session-container\"\n />\n <ActionMenu\n caption={getCaption(state, sessionT)}\n actions={PrivateChatCCPMActionMenu}\n itemData={session}\n />\n </div>\n </SessionFooter>\n );\n};\n\nexport default CCPMState;\n","//@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\nconst PrivateChatMessageStore = Reflux.createStore({\r\n scroll: SessionScrollPositionKeeper(),\r\n\r\n onSocketConnected(addSocketListener: AddSocketListener) {\r\n invariant(\r\n !this.hasMessages(),\r\n 'No existing private messages should exist on socket connect',\r\n );\r\n invariant(\r\n !this.hasInitializedSessions(),\r\n 'No initialized private message sessions should exist on socket connect',\r\n );\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(\r\n PrivateChatMessageStore,\r\n PrivateChatActions,\r\n AccessConstants.PRIVATE_CHAT_VIEW,\r\n);\r\n","import { Component } from 'react';\r\n\r\nimport ChatLayout 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\nimport * as UI from 'types/ui';\r\n\r\nimport { shareTempFile } from 'services/api/ShareApi';\r\nimport PrivateChatActions from 'actions/reflux/PrivateChatActions';\r\nimport MenuConstants from 'constants/MenuConstants';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/types';\r\n\r\ntype PrivateChatSessionProps = SessionChildProps<\r\n API.PrivateChat,\r\n UI.EmptyObject,\r\n UI.ChatActionList\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.includes('nmdc') && !flags.includes('bot');\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 UI.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 session={session} sessionT={sessionT} />\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;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import PrivateChatConstants from 'constants/PrivateChatConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { BuildRemoveSessionAction } from '../decorators/SessionActionDecorator';\r\nimport { BuildClearChatAction } from '../decorators/ChatActionDecorator';\r\n\r\nconst PrivateChatClearChatAction = BuildClearChatAction(\r\n PrivateChatConstants.SESSIONS_URL,\r\n API.AccessEnum.PRIVATE_CHAT_EDIT,\r\n);\r\n\r\nconst PrivateChatRemoveAction = BuildRemoveSessionAction(\r\n PrivateChatConstants.SESSIONS_URL,\r\n API.AccessEnum.PRIVATE_CHAT_EDIT,\r\n);\r\n\r\nconst PrivateChatActions: UI.ActionListType<API.PrivateChat> = {\r\n clearChat: PrivateChatClearChatAction,\r\n remove: PrivateChatRemoveAction,\r\n};\r\n\r\nexport const PrivateChatActionModule = {\r\n moduleId: UI.Modules.MESSAGES,\r\n};\r\n\r\nexport const PrivateChatActionMenu = {\r\n moduleData: PrivateChatActionModule,\r\n actions: PrivateChatActions,\r\n};\r\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 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 {\r\n SessionProviderDecoratorChildProps,\r\n SessionProviderDecorator,\r\n} from 'routes/Sidebar/decorators/SessionProviderDecorator';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport '../style.css';\r\nimport { PrivateChatActionMenu } from 'actions/ui/private-chat';\r\n\r\nconst sessionActions = ['clearChat'];\r\n\r\nconst Messages: React.FC<SessionProviderDecoratorChildProps<API.PrivateChat>> = (\r\n props,\r\n) => {\r\n const { params, sessionT, ...other } = props;\r\n return (\r\n <SessionLayout\r\n activeId={params.id}\r\n baseUrl=\"messages\"\r\n newCaption={sessionT.t('new', 'New session')}\r\n newDescription={sessionT.t('newDesc', '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={PrivateChatActionMenu}\r\n sessionApi={PrivateChatAPIActions as UI.SessionActions<API.PrivateChat>}\r\n actionIds={sessionActions}\r\n sessionItemLayout={PrivateChatSession}\r\n newLayout={MessageNew}\r\n sessionT={sessionT}\r\n {...UserItemHandlerDecorator(['browse', 'ignore', 'unignore'])}\r\n {...other}\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(\r\n Messages,\r\n PrivateChatSessionStore,\r\n UI.Modules.MESSAGES,\r\n);\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","HINTED_USER","hasSession","entry","PrivateChatSessionStore","getSession","cid","props","handleSubmit","navigate","PrivateChatActions","createSession","sessionStore","sessionT","className","onChange","offlineMessage","t","isClearable","autoFocus","RecentLayout","entryType","PRIVATE_CHAT","entryTitleRenderer","onClick","_","entryIcon","IconConstants","MESSAGES_PLAIN","connectCCPM","displayName","access","PRIVATE_CHAT_EDIT","icon","PLAY","handler","itemData","SocketService","post","PrivateChatConstants","SESSIONS_URL","filter","ccpm_state","DISCONNECTED","disconnectCCPM","REMOVE","delete","CONNECTED","PrivateChatCCPMActionMenu","moduleData","moduleId","MESSAGES","actions","getCaption","state","translate","CONNECTING","Loader","size","inline","text","includes","SessionFooter","EncryptionState","encryption","alwaysVisible","boundary","caption","PrivateChatMessageStore","scroll","SessionScrollPositionKeeper","onSocketConnected","addSocketListener","this","hasMessages","hasInitializedSessions","url","MODULE_URL","MESSAGE","_onChatMessage","STATUS","_onStatusMessage","SESSION_REMOVED","_onSessionRemoved","SESSION_UPDATED","_onSessionUpdated","MessageStoreDecorator","AccessConstants","A","PRIVATE_CHAT_VIEW","PrivateChatSession","Component","handleFileUpload","file","hub_url","isPrivate","undefined","render","sessionApi","uiActions","ChatLayout","chatAccess","PRIVATE_CHAT_SEND","chatActions","chatApi","messageStore","highlightRemoteMenuId","MenuConstants","PRIVATE_CHAT_MESSAGE_HIGHLIGHT","MessageFooter","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","clearChat","remove","PrivateChatActionMenu","sessionActions","SessionProviderDecorator","params","other","SessionLayout","activeId","baseUrl","newCaption","newDescription","newIcon","unreadInfoStore","editAccess","actionIds","sessionItemLayout","newLayout","UserItemHandlerDecorator"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[336],{61987:(e,s,t)=>{t.d(s,{A:()=>a});var i=t(71354),n=t.n(i),r=t(76314),o=t.n(r)()(n());o.push([e.id,".status .error {\n color: red;\n}\n\n@media only screen and (min-width: 767px) {\n .source.modal td {\n max-width: 250px;\n }\n\n /* Can't be applied to dropdown cells */\n .source.modal td:not(.user) {\n overflow-x: hidden;\n }\n}\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 {\n color: red;\n}\n\n@media only screen and (min-width: 767px) {\n .source.modal td {\n max-width: 250px;\n }\n\n /* Can't be applied to dropdown cells */\n .source.modal td:not(.user) {\n overflow-x: hidden;\n }\n}\n"],sourceRoot:""}]);const a=o},32563:(e,s,t)=>{t.d(s,{mM:()=>c});var i=t(58059),n=t(26817),r=t(4425),o=t(86038),a=t(67749);const d={removeBundleSource:{id:"removeBundleSource",displayName:"Remove source",access:o.US.QUEUE_EDIT,icon:r.A.REMOVE,handler:({itemData:e,entity:s})=>n.A.delete(`${i.A.BUNDLES_URL}/${s.id}/sources/${e.user.cid}`)}},c={moduleData:{moduleId:a.KV.QUEUE,subId:"bundleSource"},actions:d}},89478:(e,s,t)=>{t.d(s,{Hi:()=>h,ew:()=>u});var i=t(58059),n=t(26817),r=t(4425),o=t(86038),a=t(67749),d=t(47450);const c={id:"search",displayName:"Search (foreground)",access:o.US.SEARCH,icon:r.A.SEARCH,handler:({itemData:e,location:s,navigate:t})=>d.A.search(e,s,t)},l={id:"searchAlternates",displayName:"Search for alternates",access:o.US.QUEUE_EDIT,icon:r.A.SEARCH_ALTERNATES,filter:({itemData:e})=>0===e.time_finished,handler:({itemData:e})=>n.A.post(`${i.A.FILES_URL}/${e.id}/search`)},u={id:"remove",displayName:"Remove",access:o.US.QUEUE_EDIT,icon:r.A.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:({itemData:e},s)=>n.A.post(`${i.A.FILES_URL}/${e.id}/remove`,{remove_finished:s}),notifications:{onSuccess:"File {{item.name}} was removed from queue"}},m={search:c,searchFileAlternates:l,removeFile:u},h={moduleData:{moduleId:a.KV.QUEUE},actions:m}},34395:(e,s,t)=>{t.d(s,{JN:()=>d});var i=t(58059),n=t(26817),r=t(4425),o=t(86038),a=t(67749);const d={id:"removeSource",displayName:"Remove user from queue",access:o.US.QUEUE_EDIT,icon:r.A.REMOVE,handler:({itemData:e})=>n.A.delete(`${i.A.SOURCES_URL}/${e.cid}`),notifications:{onSuccess:"The user {{user.nicks}} was removed from {{result.count}} files"}};a.KV.QUEUE},27415:(e,s,t)=>{t.d(s,{f$:()=>p,vl:()=>_,qZ:()=>N,_q:()=>y,De:()=>v,Hi:()=>b.Hi});var i=t(58059),n=t(26817),r=t(4425),o=t(86038),a=t(67749),d=t(48844);const c=e=>n.A.post(i.A.BUNDLES_URL+"/priority",{priority:e}),l={id:"removeCompleted",displayName:"Remove completed bundles",access:o.US.QUEUE_EDIT,icon:r.A.REMOVE,handler:()=>n.A.post(i.A.BUNDLES_URL+"/remove_completed"),notifications:{onSuccess:"{{result.count}} completed bundles were removed"}},u={id:"pause",displayName:"Pause all bundles",access:o.US.QUEUE_EDIT,icon:r.A.PAUSE,handler:()=>c(o.Fm.PAUSED_FORCED)},m={id:"resumeAll",displayName:"Resume all bundles",access:o.US.QUEUE_EDIT,icon:r.A.PLAY,handler:()=>c(o.Fm.DEFAULT)},h={removeCompleted:l,divider:d.o,pause:u,resume:m},p={moduleData:{moduleId:a.KV.QUEUE},actions:h};var A=t(47450);const E=({itemData:e})=>e.status.id===i.S.COMPLETION_VALIDATION_ERROR,U=({itemData:e})=>0===e.time_finished,x=(e,s)=>n.A.post(`${i.A.BUNDLES_URL}/${e.id}/share`,{skip_validation:s}),v={id:"sources",displayName:"Manage sources...",icon:r.A.USER,filter:e=>e.itemData.sources.total>0&&U(e),handler:({itemData:e,navigate:s})=>{s(`sources/${e.id}`)}},y={id:"content",displayName:"Manage files...",icon:r.A.FILE,filter:({itemData:e})=>"directory"===e.type.id,handler:({itemData:e,navigate:s})=>{s(`content/${e.id}`)}},j={id:"search",displayName:"Search (foreground)",icon:r.A.SEARCH,handler:({itemData:e,location:s,navigate:t})=>A.A.search(e,s,t)},D={id:"searchBundleAlternates",displayName:"Search for alternates",icon:r.A.SEARCH_ALTERNATES,filter:U,handler:({itemData:e})=>n.A.post(`${i.A.BUNDLES_URL}/${e.id}/search`),notifications:{onSuccess:"The bundle {{item.name}} was searched for alternates"}},S={id:"remove",displayName:"Remove",access:o.US.QUEUE_EDIT,icon:r.A.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:({itemData:e},s)=>n.A.post(`${i.A.BUNDLES_URL}/${e.id}/remove`,{remove_finished:s})},f={id:"rescan",displayName:"Rescan for errors",access:o.US.QUEUE_EDIT,icon:r.A.REFRESH_COLORED,filter:E,handler:({itemData:e})=>x(e,!1)},w={id:"forceShare",displayName:"Force in share",access:o.US.QUEUE_EDIT,icon:r.A.ERROR,filter:E,handler:({itemData:e})=>x(e,!0)},R={sources:v,content:y,divider:null,search:j,searchBundleAlternates:D,divider2:null,removeBundle:S,divider3:null,rescan:f,forceShare:w},N={moduleId:a.KV.QUEUE},_={moduleData:N,actions:R};t(32563);var b=t(89478);t(34395)},25364:(e,s,t)=>{t.d(s,{A:()=>c});var i=t(74848),n=t(5556),r=t.n(n),o=(t(96540),t(46942)),a=t.n(o);const d=({className:e,percent:s,caption:t})=>(0,i.jsxs)("div",{className:a()("ui progress",e,{indeterminate:void 0===s}),"data-percent":s,children:[(0,i.jsx)("div",{className:"bar",style:{transitionDuration:"300ms",width:void 0===s?void 0:s+"%",minWidth:"0px"},children:(0,i.jsx)("div",{className:"progress"})}),!!t&&(0,i.jsx)("div",{className:"label",children:t})]});d.propTypes={percent:r().number.isRequired,caption:r().node.isRequired,className:r().string};const c=d},99832:(e,s,t)=>{t.r(s),t.d(s,{default:()=>ye});var i=t(74848),n=t(96540),r=t(68465),o=t(22373),a=t(5556),d=t.n(a),c=t(2404),l=t.n(c),u=t(86038);const m={[u.Fm.PAUSED_FORCED]:{str:"Paused (forced)",id:0},[u.Fm.PAUSED]:{str:"Paused",id:1},[u.Fm.LOWEST]:{str:"Lowest",id:2},[u.Fm.LOW]:{str:"Low",id:3},[u.Fm.NORMAL]:{str:"Normal",id:4},[u.Fm.HIGH]:{str:"High",id:5},[u.Fm.HIGHEST]:{str:"Highest",id:6}};var h=t(2690),p=t(41860),A=t(67749),E=t(42695),U=t(36076),x=t(43045),v=t(6897);class y extends n.Component{constructor(){super(...arguments),this.setPriority=e=>{const{item:s,prioAction:t,t:i}=this.props;return(0,U.bd)((()=>t(s,e)),i)},this.setAutoPriority=()=>{this.setPriority(u.Fm.DEFAULT)},this.getPriorityListItem=(e,s)=>{const t=this.props.item.priority.id;return{id:e.id.toString(),item:{active:t===e.id,onClick:()=>{this.setPriority(e.id)},children:(0,E.Tl)(e.str,s,A.KV.QUEUE)}}},this.getChildren=e=>{const{t:s}=this.props,t=Object.keys(m).map(Number).map((e=>this.getPriorityListItem(m[e],s)));return t.push({id:"divider"}),t.push({id:"auto",item:{active:this.props.itemPrio.auto,onClick:()=>{this.setPriority(u.Fm.DEFAULT)},children:(0,E.Tl)("Auto",s,A.KV.QUEUE)}}),(0,v.y)(t,e)}}shouldComponentUpdate(e){return!l()(e.item.priority,this.props.item.priority)}render(){const{itemPrio:e,t:s}=this.props;let t=(0,E.Tl)(m[e.id].str,s,A.KV.QUEUE);return e.auto&&(t+=` (${(0,E.Tl)("Auto",s,A.KV.QUEUE).toLocaleLowerCase()})`),p.A.hasAccess(u.US.QUEUE_EDIT)?(0,i.jsx)(h.A,{caption:t,className:"priority-menu",children:this.getChildren}):(0,i.jsx)(x.b,{caption:t})}}y.propTypes={itemPrio:d().object.isRequired,item:d().object.isRequired,prioAction:d().func.isRequired};const j=y;var D=t(46942),S=t.n(D),f=t(25364);const w=(e,s)=>{if(e.completed)return"success";const t=e.id;return S()({grey:(!t||t===u.$E.QUEUED)&&0===s.speed},{blue:(!t||t===u.$E.QUEUED)&&s.speed>0})},R=({cellData:e,rowDataGetter:s})=>{if(e.failed)return(0,i.jsx)("span",{className:"error",children:e.str});const t=s();return(0,i.jsx)(f.A,{className:w(e,t),caption:e.str,percent:100*t.downloaded_bytes/t.size})};var N=t(22005),_=t.n(N),b=t(58059),C=t(52267);const L=_().createStore({_viewName:"queue_bundle_view",_apiUrl:b.A.MODULE_URL,mixins:[(0,C.A)("name")]});var T=t(75662),I=t(65385),g=t(5945);const P=_().createStore({_viewName:"queue_file_view",_apiUrl:b.A.MODULE_URL,mixins:[(0,C.A)("name")]});var V=t(44247),F=t(85072),Q=t.n(F),K=t(97825),$=t.n(K),q=t(77659),B=t.n(q),O=t(55056),H=t.n(O),k=t(10540),G=t.n(k),M=t(41113),W=t.n(M),z=t(61987),Z={};Z.styleTagTransform=W(),Z.setAttributes=H(),Z.insert=B().bind(null,"head"),Z.domAPI=$(),Z.insertStyleElement=G(),Q()(z.A,Z),z.A&&z.A.locals&&z.A.locals;var J=t(56896),X=t(39115),Y=t(27415);const ee=({cellData:e,rowDataGetter:s,t})=>(0,i.jsx)(j,{itemPrio:e,item:s(),prioAction:J.nX,t});class se extends n.Component{constructor(){super(...arguments),this.isActive=(e,s)=>!s.status.downloaded,this.isRunning=(e,s)=>s.speed>0}render(){return(0,i.jsxs)(o.A,{store:P,sourceFilter:{pattern:this.props.bundle.id,method:u.Od.EXACT,property:"bundle"},moduleId:A.KV.QUEUE,children:[(0,i.jsx)(r.VP,{name:"Name",width:200,flexGrow:20,columnKey:"name",cell:(0,i.jsx)(V.tC,{actions:Y.Hi,remoteMenuId:X.Ay.QUEUE_FILE})}),(0,i.jsx)(r.VP,{name:"Size",width:70,columnKey:"size",cell:(0,i.jsx)(V.us,{}),flexGrow:1}),(0,i.jsx)(r.VP,{name:"Status",width:120,columnKey:"status",cell:(0,i.jsx)(R,{})}),(0,i.jsx)(r.VP,{name:"Sources",width:65,columnKey:"sources",renderCondition:this.isActive}),(0,i.jsx)(r.VP,{name:"Time left",width:50,columnKey:"seconds_left",renderCondition:this.isRunning,cell:(0,i.jsx)(V.WQ,{})}),(0,i.jsx)(r.VP,{name:"Speed",width:55,columnKey:"speed",cell:(0,i.jsx)(V.kF,{}),renderCondition:this.isRunning}),(0,i.jsx)(r.VP,{name:"Priority",width:80,columnKey:"priority",renderCondition:this.isActive,cell:(0,i.jsx)(ee,{}),flexGrow:1})]})}}const te=se;var ie=t(13546);class ne extends n.Component{render(){const{bundle:e}=this.props;return(0,i.jsx)(T.A,{className:"source",title:e.name,subHeader:e.target,closable:!0,icon:(0,i.jsx)(g.A,{typeInfo:e.type}),fullHeight:!0,children:(0,i.jsx)(te,{bundle:e})})}}ne.displayName="BundleFileDialog";const re=(0,I.A)((0,ie.A)(ne,{urls:{bundle:({params:e},s)=>s.get(`${b.A.BUNDLES_URL}/${e.bundleId}`)}}),"content/:bundleId");var oe=t(32563),ae=t(98573),de=t(71352),ce=t(86668);const le=({source:e,bundle:s,t})=>(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{className:"user dropdown",children:(0,i.jsx)(de.Bg,{userIcon:!0,user:e.user,ids:ce.F9,contextElement:".source.modal",remoteMenuId:X.Ay.HINTED_USER,children:(0,i.jsx)(de.Wy,{actions:oe.mM,itemData:e,entity:s})})}),(0,i.jsx)("td",{className:"hubs",children:e.user.hub_names}),(0,i.jsx)("td",{className:"speed",children:e.last_speed>0&&(0,ae.DB)(e.last_speed,t)}),(0,i.jsx)("td",{className:"files",children:e.files}),(0,i.jsx)("td",{className:"size",children:(0,ae.Xq)(e.size,t)})]}),ue=(e,s)=>e.user.nicks.localeCompare(s.user.nicks),me=(0,ie.A)((({sources:e,bundle:s,queueT:t})=>{const{translate:n}=t;return(0,i.jsxs)("div",{className:"sources",children:[(0,i.jsx)("h2",{children:n("Sources")}),(0,i.jsxs)("table",{className:"ui striped table",children:[(0,i.jsx)("thead",{children:(0,i.jsxs)("tr",{children:[(0,i.jsx)("th",{children:n("User")}),(0,i.jsx)("th",{children:n("Hubs")}),(0,i.jsx)("th",{children:n("Last known speed")}),(0,i.jsx)("th",{children:n("Files")}),(0,i.jsx)("th",{children:n("Size")})]})}),(0,i.jsx)("tbody",{children:e.sort(ue).map((e=>(0,i.jsx)(le,{source:e,bundle:s,t:t.plainT},e.user.cid)))})]})]})}),{urls:{sources:({bundle:e},s)=>s.get(`${b.A.BUNDLES_URL}/${e.id}/sources`)},onSocketConnected:(e,{refetchData:s,props:t})=>{e(b.A.MODULE_URL,b.A.BUNDLE_SOURCES,(e=>{e.id===t.bundle.id&&s()}))}});class he extends n.Component{render(){const{bundle:e,queueT:s}=this.props;return(0,i.jsx)(T.A,Object.assign({className:"source",title:e.name,subHeader:e.target,closable:!0,icon:(0,i.jsx)(g.A,{typeInfo:e.type}),fullHeight:!0},this.props,{children:(0,i.jsx)(me,{bundle:e,queueT:s})}))}}he.displayName="SourceDialog";const pe=(0,I.A)((0,ie.A)(he,{urls:{bundle:({params:e},s)=>s.get(`${b.A.BUNDLES_URL}/${e.bundleId}`)}}),"sources/:bundleId");var Ae=t(32728),Ee=t(32389),Ue=t(4425);const xe=({cellData:e,rowDataGetter:s,t})=>(0,i.jsx)(j,{itemPrio:e,item:s(),prioAction:J.hh,t});class ve extends n.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,i.jsx)(Ae.A,{title:e("queueEmpty","The queue is empty"),icon:Ue.A.FILE,description:e("queueEmptyDesc","New items can be queued from search or filelists")})},this.queueT=(0,E.lw)(this.props.t,A.KV.QUEUE)}render(){const{translate:e}=this.queueT;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(o.A,{emptyRowsNodeGetter:this.emptyRowsNodeGetter,store:L,footerData:(0,i.jsx)(de.Wy,{className:"top left pointing",caption:e("Actions..."),actions:Y.f$,header:e("Queue actions"),triggerIcon:"chevron up",button:!0}),moduleId:A.KV.QUEUE,children:[(0,i.jsx)(r.VP,{name:"Name",width:200,flexGrow:4,columnKey:"name",cell:(0,i.jsx)(V.tC,{actions:Y.vl,remoteMenuId:X.Ay.QUEUE_BUNDLE,ids:["content","sources","divider","search","searchBundleAlternates","divider","removeBundle","divider","rescan","forceShare"]})}),(0,i.jsx)(r.VP,{name:"Size",width:60,columnKey:"size",cell:(0,i.jsx)(V.us,{}),flexGrow:1}),(0,i.jsx)(r.VP,{name:"Type/content",width:150,columnKey:"type",hideWidth:1e3,cell:(0,i.jsx)(V.V9,{action:Y._q,moduleData:Y.qZ})}),(0,i.jsx)(r.VP,{name:"Status",width:120,flexGrow:3,columnKey:"status",cell:(0,i.jsx)(R,{})}),(0,i.jsx)(r.VP,{name:"Sources",width:60,columnKey:"sources",renderCondition:this.isActive,flexGrow:1,cell:(0,i.jsx)(V.V9,{action:Y.De,moduleData:Y.qZ})}),(0,i.jsx)(r.VP,{name:"Time left",width:50,columnKey:"seconds_left",renderCondition:this.isRunning,cell:(0,i.jsx)(V.WQ,{})}),(0,i.jsx)(r.VP,{name:"Speed",width:50,columnKey:"speed",cell:(0,i.jsx)(V.kF,{}),renderCondition:this.isRunning,flexGrow:1}),(0,i.jsx)(r.VP,{name:"Priority",width:80,columnKey:"priority",renderCondition:this.isActive,cell:(0,i.jsx)(xe,{}),flexGrow:1}),(0,i.jsx)(r.VP,{name:"Added",width:100,columnKey:"time_added",cell:(0,i.jsx)(V.Jo,{}),hideWidth:1400}),(0,i.jsx)(r.VP,{name:"Finished",width:100,columnKey:"time_finished",cell:(0,i.jsx)(V.Jo,{}),renderCondition:this.isDownloaded,hideWidth:1200})]}),(0,i.jsx)(pe,{queueT:this.queueT}),(0,i.jsx)(re,{})]})}}ve.displayName="Queue";const ye=(0,Ee.CI)()(ve)}}]);
2
- //# sourceMappingURL=queue.31409106566ce8e19fc3.chunk.js.map
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[336],{61987:(e,s,t)=>{t.d(s,{A:()=>a});var i=t(71354),n=t.n(i),r=t(76314),o=t.n(r)()(n());o.push([e.id,".status .error {\n color: red;\n}\n\n@media only screen and (min-width: 767px) {\n .source.modal td {\n max-width: 250px;\n }\n\n /* Can't be applied to dropdown cells */\n .source.modal td:not(.user) {\n overflow-x: hidden;\n }\n}\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 {\n color: red;\n}\n\n@media only screen and (min-width: 767px) {\n .source.modal td {\n max-width: 250px;\n }\n\n /* Can't be applied to dropdown cells */\n .source.modal td:not(.user) {\n overflow-x: hidden;\n }\n}\n"],sourceRoot:""}]);const a=o},32563:(e,s,t)=>{t.d(s,{mM:()=>c});var i=t(58059),n=t(32811),r=t(4425),o=t(86038),a=t(67749);const d={removeBundleSource:{id:"removeBundleSource",displayName:"Remove source",access:o.US.QUEUE_EDIT,icon:r.A.REMOVE,handler:({itemData:e,entity:s})=>n.A.delete(`${i.A.BUNDLES_URL}/${s.id}/sources/${e.user.cid}`)}},c={moduleData:{moduleId:a.KV.QUEUE,subId:"bundleSource"},actions:d}},89478:(e,s,t)=>{t.d(s,{Hi:()=>h,ew:()=>u});var i=t(58059),n=t(32811),r=t(4425),o=t(86038),a=t(67749),d=t(47450);const c={id:"search",displayName:"Search (foreground)",access:o.US.SEARCH,icon:r.A.SEARCH,handler:({itemData:e,location:s,navigate:t})=>d.A.search(e,s,t)},l={id:"searchAlternates",displayName:"Search for alternates",access:o.US.QUEUE_EDIT,icon:r.A.SEARCH_ALTERNATES,filter:({itemData:e})=>0===e.time_finished,handler:({itemData:e})=>n.A.post(`${i.A.FILES_URL}/${e.id}/search`)},u={id:"remove",displayName:"Remove",access:o.US.QUEUE_EDIT,icon:r.A.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:({itemData:e},s)=>n.A.post(`${i.A.FILES_URL}/${e.id}/remove`,{remove_finished:s}),notifications:{onSuccess:"File {{item.name}} was removed from queue"}},m={search:c,searchFileAlternates:l,removeFile:u},h={moduleData:{moduleId:a.KV.QUEUE},actions:m}},34395:(e,s,t)=>{t.d(s,{JN:()=>d});var i=t(58059),n=t(32811),r=t(4425),o=t(86038),a=t(67749);const d={id:"removeSource",displayName:"Remove user from queue",access:o.US.QUEUE_EDIT,icon:r.A.REMOVE,handler:({itemData:e})=>n.A.delete(`${i.A.SOURCES_URL}/${e.cid}`),notifications:{onSuccess:"The user {{user.nicks}} was removed from {{result.count}} files"}};a.KV.QUEUE},27415:(e,s,t)=>{t.d(s,{f$:()=>p,vl:()=>_,qZ:()=>N,_q:()=>y,De:()=>v,Hi:()=>b.Hi});var i=t(58059),n=t(32811),r=t(4425),o=t(86038),a=t(67749),d=t(48844);const c=e=>n.A.post(i.A.BUNDLES_URL+"/priority",{priority:e}),l={id:"removeCompleted",displayName:"Remove completed bundles",access:o.US.QUEUE_EDIT,icon:r.A.REMOVE,handler:()=>n.A.post(i.A.BUNDLES_URL+"/remove_completed"),notifications:{onSuccess:"{{result.count}} completed bundles were removed"}},u={id:"pause",displayName:"Pause all bundles",access:o.US.QUEUE_EDIT,icon:r.A.PAUSE,handler:()=>c(o.Fm.PAUSED_FORCED)},m={id:"resumeAll",displayName:"Resume all bundles",access:o.US.QUEUE_EDIT,icon:r.A.PLAY,handler:()=>c(o.Fm.DEFAULT)},h={removeCompleted:l,divider:d.o,pause:u,resume:m},p={moduleData:{moduleId:a.KV.QUEUE},actions:h};var A=t(47450);const E=({itemData:e})=>e.status.id===i.S.COMPLETION_VALIDATION_ERROR,U=({itemData:e})=>0===e.time_finished,x=(e,s)=>n.A.post(`${i.A.BUNDLES_URL}/${e.id}/share`,{skip_validation:s}),v={id:"sources",displayName:"Manage sources...",icon:r.A.USER,filter:e=>e.itemData.sources.total>0&&U(e),handler:({itemData:e,navigate:s})=>{s(`sources/${e.id}`)}},y={id:"content",displayName:"Manage files...",icon:r.A.FILE,filter:({itemData:e})=>"directory"===e.type.id,handler:({itemData:e,navigate:s})=>{s(`content/${e.id}`)}},j={id:"search",displayName:"Search (foreground)",icon:r.A.SEARCH,handler:({itemData:e,location:s,navigate:t})=>A.A.search(e,s,t)},D={id:"searchBundleAlternates",displayName:"Search for alternates",icon:r.A.SEARCH_ALTERNATES,filter:U,handler:({itemData:e})=>n.A.post(`${i.A.BUNDLES_URL}/${e.id}/search`),notifications:{onSuccess:"The bundle {{item.name}} was searched for alternates"}},S={id:"remove",displayName:"Remove",access:o.US.QUEUE_EDIT,icon:r.A.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:({itemData:e},s)=>n.A.post(`${i.A.BUNDLES_URL}/${e.id}/remove`,{remove_finished:s})},f={id:"rescan",displayName:"Rescan for errors",access:o.US.QUEUE_EDIT,icon:r.A.REFRESH_COLORED,filter:E,handler:({itemData:e})=>x(e,!1)},w={id:"forceShare",displayName:"Force in share",access:o.US.QUEUE_EDIT,icon:r.A.ERROR,filter:E,handler:({itemData:e})=>x(e,!0)},R={sources:v,content:y,divider:null,search:j,searchBundleAlternates:D,divider2:null,removeBundle:S,divider3:null,rescan:f,forceShare:w},N={moduleId:a.KV.QUEUE},_={moduleData:N,actions:R};t(32563);var b=t(89478);t(34395)},25364:(e,s,t)=>{t.d(s,{A:()=>c});var i=t(74848),n=t(5556),r=t.n(n),o=(t(96540),t(46942)),a=t.n(o);const d=({className:e,percent:s,caption:t})=>(0,i.jsxs)("div",{className:a()("ui progress",e,{indeterminate:void 0===s}),"data-percent":s,children:[(0,i.jsx)("div",{className:"bar",style:{transitionDuration:"300ms",width:void 0===s?void 0:s+"%",minWidth:"0px"},children:(0,i.jsx)("div",{className:"progress"})}),!!t&&(0,i.jsx)("div",{className:"label",children:t})]});d.propTypes={percent:r().number.isRequired,caption:r().node.isRequired,className:r().string};const c=d},99832:(e,s,t)=>{t.r(s),t.d(s,{default:()=>ye});var i=t(74848),n=t(96540),r=t(68465),o=t(22373),a=t(5556),d=t.n(a),c=t(2404),l=t.n(c),u=t(86038);const m={[u.Fm.PAUSED_FORCED]:{str:"Paused (forced)",id:0},[u.Fm.PAUSED]:{str:"Paused",id:1},[u.Fm.LOWEST]:{str:"Lowest",id:2},[u.Fm.LOW]:{str:"Low",id:3},[u.Fm.NORMAL]:{str:"Normal",id:4},[u.Fm.HIGH]:{str:"High",id:5},[u.Fm.HIGHEST]:{str:"Highest",id:6}};var h=t(2690),p=t(41860),A=t(67749),E=t(42695),U=t(36076),x=t(43045),v=t(6897);class y extends n.Component{constructor(){super(...arguments),this.setPriority=e=>{const{item:s,prioAction:t,t:i}=this.props;return(0,U.bd)((()=>t(s,e)),i)},this.setAutoPriority=()=>{this.setPriority(u.Fm.DEFAULT)},this.getPriorityListItem=(e,s)=>{const t=this.props.item.priority.id;return{id:e.id.toString(),item:{active:t===e.id,onClick:()=>{this.setPriority(e.id)},children:(0,E.Tl)(e.str,s,A.KV.QUEUE)}}},this.getChildren=e=>{const{t:s}=this.props,t=Object.keys(m).map(Number).map((e=>this.getPriorityListItem(m[e],s)));return t.push({id:"divider"}),t.push({id:"auto",item:{active:this.props.itemPrio.auto,onClick:()=>{this.setPriority(u.Fm.DEFAULT)},children:(0,E.Tl)("Auto",s,A.KV.QUEUE)}}),(0,v.y)(t,e)}}shouldComponentUpdate(e){return!l()(e.item.priority,this.props.item.priority)}render(){const{itemPrio:e,t:s}=this.props;let t=(0,E.Tl)(m[e.id].str,s,A.KV.QUEUE);return e.auto&&(t+=` (${(0,E.Tl)("Auto",s,A.KV.QUEUE).toLocaleLowerCase()})`),p.A.hasAccess(u.US.QUEUE_EDIT)?(0,i.jsx)(h.A,{caption:t,className:"priority-menu",children:this.getChildren}):(0,i.jsx)(x.b,{caption:t})}}y.propTypes={itemPrio:d().object.isRequired,item:d().object.isRequired,prioAction:d().func.isRequired};const j=y;var D=t(46942),S=t.n(D),f=t(25364);const w=(e,s)=>{if(e.completed)return"success";const t=e.id;return S()({grey:(!t||t===u.$E.QUEUED)&&0===s.speed},{blue:(!t||t===u.$E.QUEUED)&&s.speed>0})},R=({cellData:e,rowDataGetter:s})=>{if(e.failed)return(0,i.jsx)("span",{className:"error",children:e.str});const t=s();return(0,i.jsx)(f.A,{className:w(e,t),caption:e.str,percent:100*t.downloaded_bytes/t.size})};var N=t(22005),_=t.n(N),b=t(58059),C=t(52267);const L=_().createStore({_viewName:"queue_bundle_view",_apiUrl:b.A.MODULE_URL,mixins:[(0,C.A)("name")]});var T=t(75662),I=t(65385),g=t(5945);const P=_().createStore({_viewName:"queue_file_view",_apiUrl:b.A.MODULE_URL,mixins:[(0,C.A)("name")]});var V=t(44247),F=t(85072),Q=t.n(F),K=t(97825),$=t.n(K),q=t(77659),B=t.n(q),O=t(55056),H=t.n(O),k=t(10540),G=t.n(k),M=t(41113),W=t.n(M),z=t(61987),Z={};Z.styleTagTransform=W(),Z.setAttributes=H(),Z.insert=B().bind(null,"head"),Z.domAPI=$(),Z.insertStyleElement=G(),Q()(z.A,Z),z.A&&z.A.locals&&z.A.locals;var J=t(56896),X=t(39115),Y=t(27415);const ee=({cellData:e,rowDataGetter:s,t})=>(0,i.jsx)(j,{itemPrio:e,item:s(),prioAction:J.nX,t});class se extends n.Component{constructor(){super(...arguments),this.isActive=(e,s)=>!s.status.downloaded,this.isRunning=(e,s)=>s.speed>0}render(){return(0,i.jsxs)(o.A,{store:P,sourceFilter:{pattern:this.props.bundle.id,method:u.Od.EXACT,property:"bundle"},moduleId:A.KV.QUEUE,children:[(0,i.jsx)(r.VP,{name:"Name",width:200,flexGrow:20,columnKey:"name",cell:(0,i.jsx)(V.tC,{actions:Y.Hi,remoteMenuId:X.Ay.QUEUE_FILE})}),(0,i.jsx)(r.VP,{name:"Size",width:70,columnKey:"size",cell:(0,i.jsx)(V.us,{}),flexGrow:1}),(0,i.jsx)(r.VP,{name:"Status",width:120,columnKey:"status",cell:(0,i.jsx)(R,{})}),(0,i.jsx)(r.VP,{name:"Sources",width:65,columnKey:"sources",renderCondition:this.isActive}),(0,i.jsx)(r.VP,{name:"Time left",width:50,columnKey:"seconds_left",renderCondition:this.isRunning,cell:(0,i.jsx)(V.WQ,{})}),(0,i.jsx)(r.VP,{name:"Speed",width:55,columnKey:"speed",cell:(0,i.jsx)(V.kF,{}),renderCondition:this.isRunning}),(0,i.jsx)(r.VP,{name:"Priority",width:80,columnKey:"priority",renderCondition:this.isActive,cell:(0,i.jsx)(ee,{}),flexGrow:1})]})}}const te=se;var ie=t(13546);class ne extends n.Component{render(){const{bundle:e}=this.props;return(0,i.jsx)(T.A,{className:"source",title:e.name,subHeader:e.target,closable:!0,icon:(0,i.jsx)(g.A,{typeInfo:e.type}),fullHeight:!0,children:(0,i.jsx)(te,{bundle:e})})}}ne.displayName="BundleFileDialog";const re=(0,I.A)((0,ie.A)(ne,{urls:{bundle:({params:e},s)=>s.get(`${b.A.BUNDLES_URL}/${e.bundleId}`)}}),"content/:bundleId");var oe=t(32563),ae=t(98573),de=t(71352),ce=t(86668);const le=({source:e,bundle:s,t})=>(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{className:"user dropdown",children:(0,i.jsx)(de.Bg,{userIcon:!0,user:e.user,ids:ce.F9,contextElement:".source.modal",remoteMenuId:X.Ay.HINTED_USER,children:(0,i.jsx)(de.Wy,{actions:oe.mM,itemData:e,entity:s})})}),(0,i.jsx)("td",{className:"hubs",children:e.user.hub_names}),(0,i.jsx)("td",{className:"speed",children:e.last_speed>0&&(0,ae.DB)(e.last_speed,t)}),(0,i.jsx)("td",{className:"files",children:e.files}),(0,i.jsx)("td",{className:"size",children:(0,ae.Xq)(e.size,t)})]}),ue=(e,s)=>e.user.nicks.localeCompare(s.user.nicks),me=(0,ie.A)((({sources:e,bundle:s,queueT:t})=>{const{translate:n}=t;return(0,i.jsxs)("div",{className:"sources",children:[(0,i.jsx)("h2",{children:n("Sources")}),(0,i.jsxs)("table",{className:"ui striped table",children:[(0,i.jsx)("thead",{children:(0,i.jsxs)("tr",{children:[(0,i.jsx)("th",{children:n("User")}),(0,i.jsx)("th",{children:n("Hubs")}),(0,i.jsx)("th",{children:n("Last known speed")}),(0,i.jsx)("th",{children:n("Files")}),(0,i.jsx)("th",{children:n("Size")})]})}),(0,i.jsx)("tbody",{children:e.sort(ue).map((e=>(0,i.jsx)(le,{source:e,bundle:s,t:t.plainT},e.user.cid)))})]})]})}),{urls:{sources:({bundle:e},s)=>s.get(`${b.A.BUNDLES_URL}/${e.id}/sources`)},onSocketConnected:(e,{refetchData:s,props:t})=>{e(b.A.MODULE_URL,b.A.BUNDLE_SOURCES,(e=>{e.id===t.bundle.id&&s()}))}});class he extends n.Component{render(){const{bundle:e,queueT:s}=this.props;return(0,i.jsx)(T.A,Object.assign({className:"source",title:e.name,subHeader:e.target,closable:!0,icon:(0,i.jsx)(g.A,{typeInfo:e.type}),fullHeight:!0},this.props,{children:(0,i.jsx)(me,{bundle:e,queueT:s})}))}}he.displayName="SourceDialog";const pe=(0,I.A)((0,ie.A)(he,{urls:{bundle:({params:e},s)=>s.get(`${b.A.BUNDLES_URL}/${e.bundleId}`)}}),"sources/:bundleId");var Ae=t(32728),Ee=t(32389),Ue=t(4425);const xe=({cellData:e,rowDataGetter:s,t})=>(0,i.jsx)(j,{itemPrio:e,item:s(),prioAction:J.hh,t});class ve extends n.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,i.jsx)(Ae.A,{title:e("queueEmpty","The queue is empty"),icon:Ue.A.FILE,description:e("queueEmptyDesc","New items can be queued from search or filelists")})},this.queueT=(0,E.lw)(this.props.t,A.KV.QUEUE)}render(){const{translate:e}=this.queueT;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(o.A,{emptyRowsNodeGetter:this.emptyRowsNodeGetter,store:L,footerData:(0,i.jsx)(de.Wy,{className:"top left pointing",caption:e("Actions..."),actions:Y.f$,header:e("Queue actions"),triggerIcon:"chevron up",button:!0}),moduleId:A.KV.QUEUE,children:[(0,i.jsx)(r.VP,{name:"Name",width:200,flexGrow:4,columnKey:"name",cell:(0,i.jsx)(V.tC,{actions:Y.vl,remoteMenuId:X.Ay.QUEUE_BUNDLE,ids:["content","sources","divider","search","searchBundleAlternates","divider","removeBundle","divider","rescan","forceShare"]})}),(0,i.jsx)(r.VP,{name:"Size",width:60,columnKey:"size",cell:(0,i.jsx)(V.us,{}),flexGrow:1}),(0,i.jsx)(r.VP,{name:"Type/content",width:150,columnKey:"type",hideWidth:1e3,cell:(0,i.jsx)(V.V9,{action:Y._q,moduleData:Y.qZ})}),(0,i.jsx)(r.VP,{name:"Status",width:120,flexGrow:3,columnKey:"status",cell:(0,i.jsx)(R,{})}),(0,i.jsx)(r.VP,{name:"Sources",width:60,columnKey:"sources",renderCondition:this.isActive,flexGrow:1,cell:(0,i.jsx)(V.V9,{action:Y.De,moduleData:Y.qZ})}),(0,i.jsx)(r.VP,{name:"Time left",width:50,columnKey:"seconds_left",renderCondition:this.isRunning,cell:(0,i.jsx)(V.WQ,{})}),(0,i.jsx)(r.VP,{name:"Speed",width:50,columnKey:"speed",cell:(0,i.jsx)(V.kF,{}),renderCondition:this.isRunning,flexGrow:1}),(0,i.jsx)(r.VP,{name:"Priority",width:80,columnKey:"priority",renderCondition:this.isActive,cell:(0,i.jsx)(xe,{}),flexGrow:1}),(0,i.jsx)(r.VP,{name:"Added",width:100,columnKey:"time_added",cell:(0,i.jsx)(V.Jo,{}),hideWidth:1400}),(0,i.jsx)(r.VP,{name:"Finished",width:100,columnKey:"time_finished",cell:(0,i.jsx)(V.Jo,{}),renderCondition:this.isDownloaded,hideWidth:1200})]}),(0,i.jsx)(pe,{queueT:this.queueT}),(0,i.jsx)(re,{})]})}}ve.displayName="Queue";const ye=(0,Ee.CI)()(ve)}}]);
2
+ //# sourceMappingURL=queue.c73112a5c40baeee7c54.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"js/queue.31409106566ce8e19fc3.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Queue/style.css","webpack://airdcpp-webui/./src/actions/ui/queue/QueueBundleSourceActions.ts","webpack://airdcpp-webui/./src/actions/ui/queue/QueueFileActions.ts","webpack://airdcpp-webui/./src/actions/ui/queue/QueueSourceActions.ts","webpack://airdcpp-webui/./src/actions/ui/queue/QueueActions.ts","webpack://airdcpp-webui/./src/actions/ui/queue/QueueBundleActions.ts","webpack://airdcpp-webui/./src/components/semantic/Progress.tsx","webpack://airdcpp-webui/./src/constants/PriorityConstants.ts","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/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/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.status .error {\n color: red;\n}\n\n@media only screen and (min-width: 767px) {\n .source.modal td {\n max-width: 250px;\n }\n\n /* Can't be applied to dropdown cells */\n .source.modal td:not(.user) {\n overflow-x: hidden;\n }\n}\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 {\\n color: red;\\n}\\n\\n@media only screen and (min-width: 767px) {\\n .source.modal td {\\n max-width: 250px;\\n }\\n\\n /* Can't be applied to dropdown cells */\\n .source.modal td:not(.user) {\\n overflow-x: hidden;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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\ntype ActionHandlerType = UI.ActionHandler<API.QueueBundleSource, API.QueueBundle>;\r\n\r\nconst handleRemoveBundleSource: ActionHandlerType = ({\r\n itemData: source,\r\n entity: bundle,\r\n}) => {\r\n return SocketService.delete(\r\n `${QueueConstants.BUNDLES_URL}/${bundle.id}/sources/${source.user.cid}`,\r\n );\r\n};\r\n\r\nexport const QueueBundleSourceRemoveAction = {\r\n id: 'removeBundleSource',\r\n displayName: 'Remove source',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REMOVE,\r\n handler: handleRemoveBundleSource,\r\n};\r\n\r\nconst BundleSourceActions = {\r\n removeBundleSource: QueueBundleSourceRemoveAction,\r\n};\r\n\r\nexport const QueueBundleSourceActionModule = {\r\n moduleId: UI.Modules.QUEUE,\r\n subId: 'bundleSource',\r\n};\r\n\r\nexport const QueueBundleSourceActionMenu = {\r\n moduleData: QueueBundleSourceActionModule,\r\n actions: BundleSourceActions,\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\ntype Filter = UI.ActionFilter<API.QueueFile>;\r\nconst itemNotFinished: Filter = ({ itemData: file }) => file.time_finished === 0;\r\n\r\ntype Handler = UI.ActionHandler<API.QueueFile>;\r\nconst handleSearch: Handler = ({ itemData: file, location, navigate }) => {\r\n return SearchActions.search(file, location, navigate);\r\n};\r\n\r\nconst handleRemoveFile: Handler = ({ itemData: file }, removeFinished: boolean) => {\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: Handler = ({ itemData: file }) => {\r\n return SocketService.post(`${QueueConstants.FILES_URL}/${file.id}/search`);\r\n};\r\n\r\nexport const QueueFileSearchAction = {\r\n id: 'search',\r\n displayName: 'Search (foreground)',\r\n access: API.AccessEnum.SEARCH,\r\n icon: IconConstants.SEARCH,\r\n handler: handleSearch,\r\n};\r\n\r\nexport const QueueFileSearchAlternatesAction = {\r\n id: 'searchAlternates',\r\n displayName: 'Search for alternates',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.SEARCH_ALTERNATES,\r\n filter: itemNotFinished,\r\n handler: handleSearchFileAlternates,\r\n};\r\n\r\nexport const QueueFileRemoveAction = {\r\n id: 'remove',\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\nconst QueueFileActions: UI.ActionListType<API.QueueFile> = {\r\n search: QueueFileSearchAction,\r\n searchFileAlternates: QueueFileSearchAlternatesAction,\r\n removeFile: QueueFileRemoveAction,\r\n};\r\n\r\nexport const QueueFileActionModule = {\r\n moduleId: UI.Modules.QUEUE,\r\n //subId: 'file',\r\n};\r\n\r\nexport const QueueFileActionMenu = {\r\n moduleData: QueueFileActionModule,\r\n actions: QueueFileActions,\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\n\r\nconst handleRemoveSource: UI.ActionHandler<API.User> = ({ itemData: user }) => {\r\n return SocketService.delete(`${QueueConstants.SOURCES_URL}/${user.cid}`);\r\n};\r\n\r\nexport const QueueSourceRemoveAction = {\r\n id: 'removeSource',\r\n displayName: 'Remove user from queue',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REMOVE,\r\n handler: handleRemoveSource,\r\n notifications: {\r\n onSuccess: 'The user {{user.nicks}} was removed from {{result.count}} files',\r\n },\r\n};\r\n\r\nconst QueueSourceActions: UI.ActionListType<API.User> = {\r\n removeSource: QueueSourceRemoveAction,\r\n};\r\n\r\nexport const QueueSourceActionModule = {\r\n moduleId: UI.Modules.QUEUE,\r\n};\r\n\r\nexport const QueueSourceActionMenu = {\r\n moduleData: QueueSourceActionModule,\r\n actions: QueueSourceActions,\r\n};\r\n","import QueueConstants from 'constants/QueueConstants';\nimport SocketService from 'services/SocketService';\n\nimport IconConstants from 'constants/IconConstants';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\nimport { MENU_DIVIDER } from 'constants/ActionConstants';\n\nconst setBundlePriorities = (prio: API.QueuePriorityEnum) => {\n return SocketService.post(QueueConstants.BUNDLES_URL + '/priority', {\n priority: prio,\n });\n};\n\nconst handlePause = () => {\n return setBundlePriorities(API.QueuePriorityEnum.PAUSED_FORCED);\n};\n\nconst handleResume = () => {\n return setBundlePriorities(API.QueuePriorityEnum.DEFAULT);\n};\n\nconst handleRemoveCompleted = () => {\n return SocketService.post(QueueConstants.BUNDLES_URL + '/remove_completed');\n};\n\nexport const QueueRemoveCompletedAction = {\n id: 'removeCompleted',\n displayName: 'Remove completed bundles',\n access: API.AccessEnum.QUEUE_EDIT,\n icon: IconConstants.REMOVE,\n handler: handleRemoveCompleted,\n notifications: {\n onSuccess: '{{result.count}} completed bundles were removed',\n },\n};\n\nexport const QueuePauseAction = {\n id: 'pause',\n displayName: 'Pause all bundles',\n access: API.AccessEnum.QUEUE_EDIT,\n icon: IconConstants.PAUSE,\n handler: handlePause,\n};\n\nexport const QueueResumeAction = {\n id: 'resumeAll',\n displayName: 'Resume all bundles',\n access: API.AccessEnum.QUEUE_EDIT,\n icon: IconConstants.PLAY,\n handler: handleResume,\n};\n\nconst QueueActions: UI.ActionListType<void> = {\n removeCompleted: QueueRemoveCompletedAction,\n divider: MENU_DIVIDER,\n pause: QueuePauseAction,\n resume: QueueResumeAction,\n};\n\nexport const QueueActionModule = {\n moduleId: UI.Modules.QUEUE,\n};\n\nexport const QueueActionMenu = {\n moduleData: QueueActionModule,\n actions: QueueActions,\n};\n","import { default as QueueConstants, StatusEnum } 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\nimport SearchActions from 'actions/reflux/SearchActions';\r\n\r\ntype Filter = UI.ActionFilter<API.QueueBundle>;\r\nconst bundleValidationFailed: Filter = ({ itemData: bundle }) =>\r\n bundle.status.id === StatusEnum.COMPLETION_VALIDATION_ERROR;\r\nconst itemNotFinished: Filter = ({ itemData: bundle }) => bundle.time_finished === 0;\r\nconst isDirectoryBundle: Filter = ({ itemData: bundle }) =>\r\n bundle.type.id === 'directory';\r\nconst hasSources: Filter = (data) =>\r\n data.itemData.sources.total > 0 && itemNotFinished(data);\r\n\r\nconst shareBundle = (bundle: API.QueueBundle, skipValidation: boolean) => {\r\n return SocketService.post(`${QueueConstants.BUNDLES_URL}/${bundle.id}/share`, {\r\n skip_validation: skipValidation,\r\n });\r\n};\r\n\r\n// Handlers\r\ntype Handler = UI.ActionHandler<API.QueueBundle>;\r\n\r\nconst handleRescan: Handler = ({ itemData: bundle }) => {\r\n return shareBundle(bundle, false);\r\n};\r\n\r\nconst handleForceShare: Handler = ({ itemData: bundle }) => {\r\n return shareBundle(bundle, true);\r\n};\r\n\r\nconst handleRemoveBundle: Handler = ({ itemData: bundle }, removeFinished) => {\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: Handler = ({ itemData: bundle, location, navigate }) => {\r\n return SearchActions.search(bundle, location, navigate);\r\n};\r\n\r\nconst handleSearchBundleAlternates: Handler = ({ itemData: bundle }) => {\r\n return SocketService.post(`${QueueConstants.BUNDLES_URL}/${bundle.id}/search`);\r\n};\r\n\r\nconst handleSources: Handler = ({ itemData, navigate }) => {\r\n navigate(`sources/${itemData.id}`);\r\n};\r\n\r\nconst handleContent: Handler = ({ itemData, navigate }) => {\r\n navigate(`content/${itemData.id}`);\r\n};\r\n\r\nexport const QueueBundleViewSourcesAction = {\r\n id: 'sources',\r\n displayName: 'Manage sources...',\r\n icon: IconConstants.USER,\r\n filter: hasSources,\r\n handler: handleSources,\r\n};\r\n\r\nexport const QueueBundleViewContentAction = {\r\n id: 'content',\r\n displayName: 'Manage files...',\r\n icon: IconConstants.FILE,\r\n filter: isDirectoryBundle,\r\n handler: handleContent,\r\n};\r\n\r\nexport const QueueBundleSearchAction = {\r\n id: 'search',\r\n displayName: 'Search (foreground)',\r\n icon: IconConstants.SEARCH,\r\n handler: handleSearch,\r\n};\r\n\r\nexport const QueueBundleSearchAlternatesAction = {\r\n id: 'searchBundleAlternates',\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\r\nexport const QueueBundleRemoveAction = {\r\n id: 'remove',\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\r\nexport const QueueBundleRescanAction = {\r\n id: '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\r\nexport const QueueBundleForceShareAction = {\r\n id: '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\nconst QueueBundleActions: UI.ActionListType<API.QueueBundle> = {\r\n sources: QueueBundleViewSourcesAction,\r\n content: QueueBundleViewContentAction,\r\n divider: null,\r\n search: QueueBundleSearchAction,\r\n searchBundleAlternates: QueueBundleSearchAlternatesAction,\r\n divider2: null,\r\n removeBundle: QueueBundleRemoveAction,\r\n divider3: null,\r\n rescan: QueueBundleRescanAction,\r\n forceShare: QueueBundleForceShareAction,\r\n};\r\n\r\nexport const QueueBundleActionModule = {\r\n moduleId: UI.Modules.QUEUE,\r\n //subId: 'bundle',\r\n};\r\n\r\nexport const QueueBundleActionMenu = {\r\n moduleData: QueueBundleActionModule,\r\n actions: QueueBundleActions,\r\n} as UI.ModuleActions<API.QueueBundle>;\r\n","import PropTypes from 'prop-types';\nimport * as React from 'react';\nimport classNames from 'classnames';\n\nexport interface ProgressProps {\n caption?: React.ReactNode;\n className?: string | null;\n percent?: number;\n}\n\nconst Progress: React.FC<ProgressProps> = ({ className, percent, caption }) => (\n <div\n className={classNames('ui progress', className, {\n indeterminate: percent === undefined,\n })}\n data-percent={percent}\n >\n <div\n className=\"bar\"\n style={{\n transitionDuration: 300 + 'ms',\n width: percent === undefined ? undefined : percent + '%',\n minWidth: '0px',\n }}\n >\n <div className=\"progress\" />\n </div>\n {!!caption && <div className=\"label\">{caption}</div>}\n </div>\n);\n\nProgress.propTypes = {\n percent: PropTypes.number.isRequired,\n caption: PropTypes.node.isRequired,\n className: PropTypes.string,\n};\n\nexport default Progress;\n","import { QueuePriorityEnum } from 'types/api';\n\nexport const PriorityEnum = {\n [QueuePriorityEnum.PAUSED_FORCED]: { str: 'Paused (forced)', id: 0 },\n [QueuePriorityEnum.PAUSED]: { str: 'Paused', id: 1 },\n [QueuePriorityEnum.LOWEST]: { str: 'Lowest', id: 2 },\n [QueuePriorityEnum.LOW]: { str: 'Low', id: 3 },\n [QueuePriorityEnum.NORMAL]: { str: 'Normal', id: 4 },\n [QueuePriorityEnum.HIGH]: { str: 'High', id: 5 },\n [QueuePriorityEnum.HIGHEST]: { str: 'Highest', id: 6 },\n};\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\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 { translate } from 'utils/TranslationUtils';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport { EmptyDropdownCaption } from 'components/semantic/EmptyDropdown';\r\nimport { buildMenu } from 'components/action-menu/builder/slidingMenuBuilder';\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: UI.TranslateF;\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(() => prioAction(item, priorityId), t);\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 = (\r\n priority: Omit<API.QueuePriority, 'auto'>,\r\n t: UI.TranslateF,\r\n ): UI.ActionMenuItem => {\r\n const currentPrio = this.props.item.priority.id;\r\n return {\r\n id: priority.id.toString(),\r\n item: {\r\n active: currentPrio === priority.id,\r\n onClick: () => {\r\n this.setPriority(priority.id);\r\n },\r\n children: translate(priority.str, t, UI.Modules.QUEUE),\r\n },\r\n };\r\n };\r\n\r\n getChildren = (onClose: DropdownCloseHandler) => {\r\n const { t } = this.props;\r\n\r\n const children = Object.keys(PriorityEnum)\r\n .map(Number)\r\n .map((prioKey) =>\r\n this.getPriorityListItem(PriorityEnum[prioKey as keyof typeof PriorityEnum], t),\r\n );\r\n\r\n children.push({ id: 'divider' });\r\n children.push({\r\n id: 'auto',\r\n item: {\r\n active: this.props.itemPrio.auto,\r\n onClick: () => {\r\n this.setPriority(API.QueuePriorityEnum.DEFAULT);\r\n },\r\n children: translate('Auto', t, UI.Modules.QUEUE),\r\n },\r\n });\r\n\r\n return buildMenu(children, onClose);\r\n };\r\n\r\n render() {\r\n const { itemPrio, t } = this.props;\r\n let caption = translate(\r\n PriorityEnum[itemPrio.id as keyof typeof PriorityEnum].str,\r\n t,\r\n UI.Modules.QUEUE,\r\n );\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 <EmptyDropdownCaption caption={caption} />;\r\n }\r\n\r\n return (\r\n <TableDropdown caption={caption} className=\"priority-menu\">\r\n {this.getChildren}\r\n </TableDropdown>\r\n );\r\n }\r\n}\r\n\r\nexport default PriorityMenu;\r\n","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\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 {\r\n grey:\r\n (!statusId || statusId === API.QueueBundleStatusEnum.QUEUED) &&\r\n rowData.speed === 0,\r\n },\r\n {\r\n blue:\r\n (!statusId || statusId === API.QueueBundleStatusEnum.QUEUED) && rowData.speed > 0,\r\n },\r\n );\r\n};\r\n\r\nconst StatusCell: React.FC<\r\n RowWrapperCellChildProps<API.QueueBundleStatus, API.QueueBundle>\r\n> = ({ cellData, rowDataGetter }) => {\r\n if (cellData!.failed) {\r\n // There isn't much space for other information\r\n return <span className=\"error\">{cellData!.str}</span>;\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;\r\n","import Reflux from 'reflux';\n\nimport QueueConstants from 'constants/QueueConstants';\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\n\nexport default Reflux.createStore({\n _viewName: 'queue_bundle_view',\n _apiUrl: QueueConstants.MODULE_URL,\n mixins: [ViewStoreMixin('name')],\n});\n","import Reflux from 'reflux';\n\nimport QueueConstants from 'constants/QueueConstants';\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\n\nexport default Reflux.createStore({\n _viewName: 'queue_file_view',\n _apiUrl: QueueConstants.MODULE_URL,\n mixins: [ViewStoreMixin('name')],\n});\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\nimport { Column } from 'fixed-data-table-2';\nimport * as UI from 'types/ui';\n\nimport VirtualTable from 'components/table/VirtualTable';\n\nimport PriorityMenu from 'routes/Queue/components/PriorityMenu';\nimport StatusCell from 'routes/Queue/components/StatusCell';\n\nimport QueueFileViewStore from 'stores/QueueFileViewStore';\n\nimport {\n FileActionCell,\n SizeCell,\n SpeedCell,\n AbbreviatedDurationCell,\n} from 'components/table/Cell';\n\nimport '../style.css';\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\n\nimport * as API from 'types/api';\nimport { setFilePriority } from 'services/api/QueueApi';\nimport MenuConstants from 'constants/MenuConstants';\nimport { QueueFileActionMenu } from 'actions/ui/queue';\n\nconst PriorityCell: React.FC<\n RowWrapperCellChildProps<API.QueuePriority, API.QueueBundle>\n> = ({ cellData, rowDataGetter, t }) => (\n <PriorityMenu\n itemPrio={cellData!}\n item={rowDataGetter!()}\n prioAction={setFilePriority}\n t={t!}\n />\n);\n\ninterface BundleFileTableProps {\n bundle: API.QueueBundle;\n}\n\nclass BundleFileTable extends React.Component<BundleFileTableProps> {\n isActive = (cellData: any, rowData: API.QueueFile) => {\n return !rowData.status.downloaded;\n };\n\n isRunning = (cellData: any, rowData: API.QueueFile) => {\n return rowData.speed > 0;\n };\n\n render() {\n return (\n <VirtualTable\n store={QueueFileViewStore}\n sourceFilter={{\n pattern: this.props.bundle.id,\n method: API.FilterMethod.EXACT,\n property: 'bundle',\n }}\n moduleId={UI.Modules.QUEUE}\n >\n <Column\n name=\"Name\"\n width={200}\n flexGrow={20}\n columnKey=\"name\"\n cell={\n <FileActionCell\n actions={QueueFileActionMenu}\n remoteMenuId={MenuConstants.QUEUE_FILE}\n />\n }\n />\n <Column\n name=\"Size\"\n width={70}\n columnKey=\"size\"\n cell={<SizeCell />}\n flexGrow={1}\n />\n <Column name=\"Status\" width={120} columnKey=\"status\" cell={<StatusCell />} />\n <Column\n name=\"Sources\"\n width={65}\n columnKey=\"sources\"\n renderCondition={this.isActive}\n />\n <Column\n name=\"Time left\"\n width={50}\n columnKey=\"seconds_left\"\n renderCondition={this.isRunning}\n cell={<AbbreviatedDurationCell />}\n />\n <Column\n name=\"Speed\"\n width={55}\n columnKey=\"speed\"\n cell={<SpeedCell />}\n renderCondition={this.isRunning}\n />\n <Column\n name=\"Priority\"\n width={80}\n columnKey=\"priority\"\n renderCondition={this.isActive}\n cell={<PriorityCell />}\n flexGrow={1}\n />\n </VirtualTable>\n );\n }\n}\n\nexport default BundleFileTable;\n","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport ModalRouteDecorator, {\r\n ModalRouteDecoratorChildProps,\r\n} from 'decorators/ModalRouteDecorator';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\nimport BundleFileTable from 'routes/Queue/components/BundleFileTable';\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\nimport QueueConstants from 'constants/QueueConstants';\r\n\r\nimport * as API from 'types/api';\r\n\r\ninterface BundleFileDialogProps {}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n bundle: API.QueueBundle;\r\n}\r\n\r\n/*interface RouteProps {\r\n bundleId: string;\r\n}*/\r\n\r\ntype Props = BundleFileDialogProps & DataProps & ModalRouteDecoratorChildProps;\r\n\r\nclass BundleFileDialog extends Component<Props> {\r\n static displayName = 'BundleFileDialog';\r\n\r\n render() {\r\n const { bundle } = 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 >\r\n <BundleFileTable bundle={bundle} />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nexport default ModalRouteDecorator<BundleFileDialogProps>(\r\n DataProviderDecorator<Omit<Props, keyof DataProps>, DataProps>(BundleFileDialog, {\r\n urls: {\r\n bundle: ({ params }, socket) =>\r\n socket.get(`${QueueConstants.BUNDLES_URL}/${params.bundleId}`),\r\n },\r\n }),\r\n 'content/:bundleId',\r\n);\r\n","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\n\r\nimport { QueueBundleSourceActionMenu } from 'actions/ui/queue/QueueBundleSourceActions';\r\nimport QueueConstants from 'constants/QueueConstants';\r\n\r\nimport { formatSize, formatSpeed } from 'utils/ValueFormat';\r\n\r\nimport { ActionMenu, UserMenu } from 'components/action-menu';\r\nimport { UserFileActions } from 'actions/ui/user/UserActions';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\ninterface SourceProps {\r\n bundle: API.QueueBundle;\r\n source: API.QueueBundleSource;\r\n t: UI.TranslateF;\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={QueueBundleSourceActionMenu}\r\n itemData={source}\r\n entity={bundle}\r\n />\r\n </UserMenu>\r\n </td>\r\n <td className=\"hubs\">{source.user.hub_names}</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\">{source.files}</td>\r\n <td className=\"size\">{formatSize(source.size, t)}</td>\r\n </tr>\r\n);\r\n\r\nconst userSort = (a: API.QueueBundleSource, b: API.QueueBundleSource) =>\r\n a.user.nicks.localeCompare(b.user.nicks);\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<\r\n BundleSourceTableProps & BundleSourceTableDataProps\r\n> = ({ sources, bundle, queueT }) => {\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>(\r\n BundleSourceTable,\r\n {\r\n urls: {\r\n sources: ({ bundle }, socket) =>\r\n socket.get(`${QueueConstants.BUNDLES_URL}/${bundle!.id}/sources`),\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData, props }) => {\r\n addSocketListener<API.QueueBundle>(\r\n QueueConstants.MODULE_URL,\r\n QueueConstants.BUNDLE_SOURCES,\r\n (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 },\r\n },\r\n);\r\n","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport ModalRouteDecorator, {\r\n ModalRouteDecoratorChildProps,\r\n} 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, {\r\n DataProviderDecoratorChildProps,\r\n} 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\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\n/*interface RouteProps {\r\n bundleId: string;\r\n}*/\r\n\r\ntype Props = BundleSourceDialogProps & ModalRouteDecoratorChildProps;\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 bundle={bundle} queueT={queueT} />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nexport default ModalRouteDecorator<BundleSourceDialogProps>(\r\n DataProviderDecorator<Props, DataProps>(SourceDialog, {\r\n urls: {\r\n bundle: ({ params }, socket) =>\r\n socket.get(`${QueueConstants.BUNDLES_URL}/${params.bundleId}`),\r\n },\r\n }),\r\n 'sources/:bundleId',\r\n);\r\n","import * as React from 'react';\r\nimport { Column } from 'fixed-data-table-2';\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\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/action-menu';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport {\r\n ActionLinkCell,\r\n FileActionCell,\r\n SizeCell,\r\n SpeedCell,\r\n AbbreviatedDurationCell,\r\n 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\nimport {\r\n QueueActionMenu,\r\n QueueBundleActionMenu,\r\n QueueBundleActionModule,\r\n QueueBundleViewContentAction,\r\n QueueBundleViewSourcesAction,\r\n} from 'actions/ui/queue';\r\n\r\nconst PriorityCell: React.FC<\r\n RowWrapperCellChildProps<API.QueuePriority, API.QueueBundle>\r\n> = ({ cellData, rowDataGetter, t }) => (\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={QueueActionMenu}\r\n header={translate('Queue actions')}\r\n triggerIcon=\"chevron up\"\r\n button={true}\r\n />\r\n }\r\n moduleId={UI.Modules.QUEUE}\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={QueueBundleActionMenu}\r\n remoteMenuId={MenuConstants.QUEUE_BUNDLE}\r\n ids={[\r\n 'content',\r\n 'sources',\r\n 'divider',\r\n 'search',\r\n 'searchBundleAlternates',\r\n 'divider',\r\n 'removeBundle',\r\n 'divider',\r\n 'rescan',\r\n '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 action={QueueBundleViewContentAction}\r\n moduleData={QueueBundleActionModule}\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 action={QueueBundleViewSourcesAction}\r\n moduleData={QueueBundleActionModule}\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);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","BundleSourceActions","removeBundleSource","displayName","access","QUEUE_EDIT","icon","REMOVE","handler","itemData","source","entity","bundle","delete","BUNDLES_URL","user","cid","QueueBundleSourceActionMenu","moduleData","moduleId","QUEUE","subId","actions","QueueFileSearchAction","SEARCH","file","location","navigate","search","QueueFileSearchAlternatesAction","SEARCH_ALTERNATES","filter","time_finished","post","FILES_URL","QueueFileRemoveAction","confirmation","content","approveCaption","rejectCaption","checkboxCaption","removeFinished","remove_finished","notifications","onSuccess","QueueFileActions","searchFileAlternates","removeFile","QueueFileActionMenu","QueueSourceRemoveAction","SOURCES_URL","setBundlePriorities","prio","SocketService","QueueConstants","priority","QueueRemoveCompletedAction","IconConstants","QueuePauseAction","PAUSE","PAUSED_FORCED","QueueResumeAction","PLAY","DEFAULT","QueueActions","removeCompleted","divider","pause","resume","QueueActionMenu","bundleValidationFailed","status","S","COMPLETION_VALIDATION_ERROR","itemNotFinished","shareBundle","skipValidation","skip_validation","QueueBundleViewSourcesAction","USER","data","sources","total","QueueBundleViewContentAction","FILE","type","QueueBundleSearchAction","SearchActions","QueueBundleSearchAlternatesAction","QueueBundleRemoveAction","QueueBundleRescanAction","REFRESH_COLORED","QueueBundleForceShareAction","ERROR","QueueBundleActions","searchBundleAlternates","divider2","removeBundle","divider3","rescan","forceShare","QueueBundleActionModule","QueueBundleActionMenu","Progress","className","percent","caption","indeterminate","undefined","style","transitionDuration","width","minWidth","propTypes","isRequired","PriorityEnum","str","PAUSED","LOWEST","LOW","NORMAL","HIGH","HIGHEST","PriorityMenu","Component","setPriority","priorityId","item","prioAction","t","this","props","setAutoPriority","getPriorityListItem","currentPrio","toString","active","onClick","children","getChildren","onClose","Object","keys","map","Number","prioKey","itemPrio","auto","shouldComponentUpdate","nextProps","render","toLocaleLowerCase","LoginStore","hasAccess","TableDropdown","EmptyDropdown","getStatusClass","cellData","rowData","completed","statusId","grey","QUEUED","speed","blue","rowDataGetter","failed","downloaded_bytes","size","_viewName","_apiUrl","MODULE_URL","mixins","ViewStoreMixin","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","PriorityCell","BundleFileTable","isActive","downloaded","isRunning","VirtualTable","store","QueueFileViewStore","sourceFilter","pattern","method","EXACT","property","name","flexGrow","columnKey","cell","remoteMenuId","MenuConstants","QUEUE_FILE","renderCondition","BundleFileDialog","Modal","title","subHeader","target","closable","FileIcon","typeInfo","fullHeight","ModalRouteDecorator","DataProviderDecorator","urls","params","socket","get","bundleId","Source","userIcon","ids","contextElement","HINTED_USER","hub_names","last_speed","files","userSort","a","b","nicks","localeCompare","queueT","translate","sort","plainT","onSocketConnected","addSocketListener","refetchData","BUNDLE_SOURCES","SourceDialog","Queue","isDownloaded","emptyRowsNodeGetter","Message","description","QueueBundleViewStore","footerData","header","triggerIcon","button","QUEUE_BUNDLE","hideWidth","action"],"sourceRoot":""}
1
+ {"version":3,"file":"js/queue.c73112a5c40baeee7c54.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Queue/style.css","webpack://airdcpp-webui/./src/actions/ui/queue/QueueBundleSourceActions.ts","webpack://airdcpp-webui/./src/actions/ui/queue/QueueFileActions.ts","webpack://airdcpp-webui/./src/actions/ui/queue/QueueSourceActions.ts","webpack://airdcpp-webui/./src/actions/ui/queue/QueueActions.ts","webpack://airdcpp-webui/./src/actions/ui/queue/QueueBundleActions.ts","webpack://airdcpp-webui/./src/components/semantic/Progress.tsx","webpack://airdcpp-webui/./src/constants/PriorityConstants.ts","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/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/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.status .error {\n color: red;\n}\n\n@media only screen and (min-width: 767px) {\n .source.modal td {\n max-width: 250px;\n }\n\n /* Can't be applied to dropdown cells */\n .source.modal td:not(.user) {\n overflow-x: hidden;\n }\n}\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 {\\n color: red;\\n}\\n\\n@media only screen and (min-width: 767px) {\\n .source.modal td {\\n max-width: 250px;\\n }\\n\\n /* Can't be applied to dropdown cells */\\n .source.modal td:not(.user) {\\n overflow-x: hidden;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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\ntype ActionHandlerType = UI.ActionHandler<API.QueueBundleSource, API.QueueBundle>;\r\n\r\nconst handleRemoveBundleSource: ActionHandlerType = ({\r\n itemData: source,\r\n entity: bundle,\r\n}) => {\r\n return SocketService.delete(\r\n `${QueueConstants.BUNDLES_URL}/${bundle.id}/sources/${source.user.cid}`,\r\n );\r\n};\r\n\r\nexport const QueueBundleSourceRemoveAction = {\r\n id: 'removeBundleSource',\r\n displayName: 'Remove source',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REMOVE,\r\n handler: handleRemoveBundleSource,\r\n};\r\n\r\nconst BundleSourceActions = {\r\n removeBundleSource: QueueBundleSourceRemoveAction,\r\n};\r\n\r\nexport const QueueBundleSourceActionModule = {\r\n moduleId: UI.Modules.QUEUE,\r\n subId: 'bundleSource',\r\n};\r\n\r\nexport const QueueBundleSourceActionMenu = {\r\n moduleData: QueueBundleSourceActionModule,\r\n actions: BundleSourceActions,\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\ntype Filter = UI.ActionFilter<API.QueueFile>;\r\nconst itemNotFinished: Filter = ({ itemData: file }) => file.time_finished === 0;\r\n\r\ntype Handler = UI.ActionHandler<API.QueueFile>;\r\nconst handleSearch: Handler = ({ itemData: file, location, navigate }) => {\r\n return SearchActions.search(file, location, navigate);\r\n};\r\n\r\nconst handleRemoveFile: Handler = ({ itemData: file }, removeFinished: boolean) => {\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: Handler = ({ itemData: file }) => {\r\n return SocketService.post(`${QueueConstants.FILES_URL}/${file.id}/search`);\r\n};\r\n\r\nexport const QueueFileSearchAction = {\r\n id: 'search',\r\n displayName: 'Search (foreground)',\r\n access: API.AccessEnum.SEARCH,\r\n icon: IconConstants.SEARCH,\r\n handler: handleSearch,\r\n};\r\n\r\nexport const QueueFileSearchAlternatesAction = {\r\n id: 'searchAlternates',\r\n displayName: 'Search for alternates',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.SEARCH_ALTERNATES,\r\n filter: itemNotFinished,\r\n handler: handleSearchFileAlternates,\r\n};\r\n\r\nexport const QueueFileRemoveAction = {\r\n id: 'remove',\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\nconst QueueFileActions: UI.ActionListType<API.QueueFile> = {\r\n search: QueueFileSearchAction,\r\n searchFileAlternates: QueueFileSearchAlternatesAction,\r\n removeFile: QueueFileRemoveAction,\r\n};\r\n\r\nexport const QueueFileActionModule = {\r\n moduleId: UI.Modules.QUEUE,\r\n //subId: 'file',\r\n};\r\n\r\nexport const QueueFileActionMenu = {\r\n moduleData: QueueFileActionModule,\r\n actions: QueueFileActions,\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\n\r\nconst handleRemoveSource: UI.ActionHandler<API.User> = ({ itemData: user }) => {\r\n return SocketService.delete(`${QueueConstants.SOURCES_URL}/${user.cid}`);\r\n};\r\n\r\nexport const QueueSourceRemoveAction = {\r\n id: 'removeSource',\r\n displayName: 'Remove user from queue',\r\n access: API.AccessEnum.QUEUE_EDIT,\r\n icon: IconConstants.REMOVE,\r\n handler: handleRemoveSource,\r\n notifications: {\r\n onSuccess: 'The user {{user.nicks}} was removed from {{result.count}} files',\r\n },\r\n};\r\n\r\nconst QueueSourceActions: UI.ActionListType<API.User> = {\r\n removeSource: QueueSourceRemoveAction,\r\n};\r\n\r\nexport const QueueSourceActionModule = {\r\n moduleId: UI.Modules.QUEUE,\r\n};\r\n\r\nexport const QueueSourceActionMenu = {\r\n moduleData: QueueSourceActionModule,\r\n actions: QueueSourceActions,\r\n};\r\n","import QueueConstants from 'constants/QueueConstants';\nimport SocketService from 'services/SocketService';\n\nimport IconConstants from 'constants/IconConstants';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\nimport { MENU_DIVIDER } from 'constants/ActionConstants';\n\nconst setBundlePriorities = (prio: API.QueuePriorityEnum) => {\n return SocketService.post(QueueConstants.BUNDLES_URL + '/priority', {\n priority: prio,\n });\n};\n\nconst handlePause = () => {\n return setBundlePriorities(API.QueuePriorityEnum.PAUSED_FORCED);\n};\n\nconst handleResume = () => {\n return setBundlePriorities(API.QueuePriorityEnum.DEFAULT);\n};\n\nconst handleRemoveCompleted = () => {\n return SocketService.post(QueueConstants.BUNDLES_URL + '/remove_completed');\n};\n\nexport const QueueRemoveCompletedAction = {\n id: 'removeCompleted',\n displayName: 'Remove completed bundles',\n access: API.AccessEnum.QUEUE_EDIT,\n icon: IconConstants.REMOVE,\n handler: handleRemoveCompleted,\n notifications: {\n onSuccess: '{{result.count}} completed bundles were removed',\n },\n};\n\nexport const QueuePauseAction = {\n id: 'pause',\n displayName: 'Pause all bundles',\n access: API.AccessEnum.QUEUE_EDIT,\n icon: IconConstants.PAUSE,\n handler: handlePause,\n};\n\nexport const QueueResumeAction = {\n id: 'resumeAll',\n displayName: 'Resume all bundles',\n access: API.AccessEnum.QUEUE_EDIT,\n icon: IconConstants.PLAY,\n handler: handleResume,\n};\n\nconst QueueActions: UI.ActionListType<void> = {\n removeCompleted: QueueRemoveCompletedAction,\n divider: MENU_DIVIDER,\n pause: QueuePauseAction,\n resume: QueueResumeAction,\n};\n\nexport const QueueActionModule = {\n moduleId: UI.Modules.QUEUE,\n};\n\nexport const QueueActionMenu = {\n moduleData: QueueActionModule,\n actions: QueueActions,\n};\n","import { default as QueueConstants, StatusEnum } 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\nimport SearchActions from 'actions/reflux/SearchActions';\r\n\r\ntype Filter = UI.ActionFilter<API.QueueBundle>;\r\nconst bundleValidationFailed: Filter = ({ itemData: bundle }) =>\r\n bundle.status.id === StatusEnum.COMPLETION_VALIDATION_ERROR;\r\nconst itemNotFinished: Filter = ({ itemData: bundle }) => bundle.time_finished === 0;\r\nconst isDirectoryBundle: Filter = ({ itemData: bundle }) =>\r\n bundle.type.id === 'directory';\r\nconst hasSources: Filter = (data) =>\r\n data.itemData.sources.total > 0 && itemNotFinished(data);\r\n\r\nconst shareBundle = (bundle: API.QueueBundle, skipValidation: boolean) => {\r\n return SocketService.post(`${QueueConstants.BUNDLES_URL}/${bundle.id}/share`, {\r\n skip_validation: skipValidation,\r\n });\r\n};\r\n\r\n// Handlers\r\ntype Handler = UI.ActionHandler<API.QueueBundle>;\r\n\r\nconst handleRescan: Handler = ({ itemData: bundle }) => {\r\n return shareBundle(bundle, false);\r\n};\r\n\r\nconst handleForceShare: Handler = ({ itemData: bundle }) => {\r\n return shareBundle(bundle, true);\r\n};\r\n\r\nconst handleRemoveBundle: Handler = ({ itemData: bundle }, removeFinished) => {\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: Handler = ({ itemData: bundle, location, navigate }) => {\r\n return SearchActions.search(bundle, location, navigate);\r\n};\r\n\r\nconst handleSearchBundleAlternates: Handler = ({ itemData: bundle }) => {\r\n return SocketService.post(`${QueueConstants.BUNDLES_URL}/${bundle.id}/search`);\r\n};\r\n\r\nconst handleSources: Handler = ({ itemData, navigate }) => {\r\n navigate(`sources/${itemData.id}`);\r\n};\r\n\r\nconst handleContent: Handler = ({ itemData, navigate }) => {\r\n navigate(`content/${itemData.id}`);\r\n};\r\n\r\nexport const QueueBundleViewSourcesAction = {\r\n id: 'sources',\r\n displayName: 'Manage sources...',\r\n icon: IconConstants.USER,\r\n filter: hasSources,\r\n handler: handleSources,\r\n};\r\n\r\nexport const QueueBundleViewContentAction = {\r\n id: 'content',\r\n displayName: 'Manage files...',\r\n icon: IconConstants.FILE,\r\n filter: isDirectoryBundle,\r\n handler: handleContent,\r\n};\r\n\r\nexport const QueueBundleSearchAction = {\r\n id: 'search',\r\n displayName: 'Search (foreground)',\r\n icon: IconConstants.SEARCH,\r\n handler: handleSearch,\r\n};\r\n\r\nexport const QueueBundleSearchAlternatesAction = {\r\n id: 'searchBundleAlternates',\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\r\nexport const QueueBundleRemoveAction = {\r\n id: 'remove',\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\r\nexport const QueueBundleRescanAction = {\r\n id: '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\r\nexport const QueueBundleForceShareAction = {\r\n id: '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\nconst QueueBundleActions: UI.ActionListType<API.QueueBundle> = {\r\n sources: QueueBundleViewSourcesAction,\r\n content: QueueBundleViewContentAction,\r\n divider: null,\r\n search: QueueBundleSearchAction,\r\n searchBundleAlternates: QueueBundleSearchAlternatesAction,\r\n divider2: null,\r\n removeBundle: QueueBundleRemoveAction,\r\n divider3: null,\r\n rescan: QueueBundleRescanAction,\r\n forceShare: QueueBundleForceShareAction,\r\n};\r\n\r\nexport const QueueBundleActionModule = {\r\n moduleId: UI.Modules.QUEUE,\r\n //subId: 'bundle',\r\n};\r\n\r\nexport const QueueBundleActionMenu = {\r\n moduleData: QueueBundleActionModule,\r\n actions: QueueBundleActions,\r\n} as UI.ModuleActions<API.QueueBundle>;\r\n","import PropTypes from 'prop-types';\nimport * as React from 'react';\nimport classNames from 'classnames';\n\nexport interface ProgressProps {\n caption?: React.ReactNode;\n className?: string | null;\n percent?: number;\n}\n\nconst Progress: React.FC<ProgressProps> = ({ className, percent, caption }) => (\n <div\n className={classNames('ui progress', className, {\n indeterminate: percent === undefined,\n })}\n data-percent={percent}\n >\n <div\n className=\"bar\"\n style={{\n transitionDuration: 300 + 'ms',\n width: percent === undefined ? undefined : percent + '%',\n minWidth: '0px',\n }}\n >\n <div className=\"progress\" />\n </div>\n {!!caption && <div className=\"label\">{caption}</div>}\n </div>\n);\n\nProgress.propTypes = {\n percent: PropTypes.number.isRequired,\n caption: PropTypes.node.isRequired,\n className: PropTypes.string,\n};\n\nexport default Progress;\n","import { QueuePriorityEnum } from 'types/api';\n\nexport const PriorityEnum = {\n [QueuePriorityEnum.PAUSED_FORCED]: { str: 'Paused (forced)', id: 0 },\n [QueuePriorityEnum.PAUSED]: { str: 'Paused', id: 1 },\n [QueuePriorityEnum.LOWEST]: { str: 'Lowest', id: 2 },\n [QueuePriorityEnum.LOW]: { str: 'Low', id: 3 },\n [QueuePriorityEnum.NORMAL]: { str: 'Normal', id: 4 },\n [QueuePriorityEnum.HIGH]: { str: 'High', id: 5 },\n [QueuePriorityEnum.HIGHEST]: { str: 'Highest', id: 6 },\n};\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\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 { translate } from 'utils/TranslationUtils';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport { EmptyDropdownCaption } from 'components/semantic/EmptyDropdown';\r\nimport { buildMenu } from 'components/action-menu/builder/slidingMenuBuilder';\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: UI.TranslateF;\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(() => prioAction(item, priorityId), t);\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 = (\r\n priority: Omit<API.QueuePriority, 'auto'>,\r\n t: UI.TranslateF,\r\n ): UI.ActionMenuItem => {\r\n const currentPrio = this.props.item.priority.id;\r\n return {\r\n id: priority.id.toString(),\r\n item: {\r\n active: currentPrio === priority.id,\r\n onClick: () => {\r\n this.setPriority(priority.id);\r\n },\r\n children: translate(priority.str, t, UI.Modules.QUEUE),\r\n },\r\n };\r\n };\r\n\r\n getChildren = (onClose: DropdownCloseHandler) => {\r\n const { t } = this.props;\r\n\r\n const children = Object.keys(PriorityEnum)\r\n .map(Number)\r\n .map((prioKey) =>\r\n this.getPriorityListItem(PriorityEnum[prioKey as keyof typeof PriorityEnum], t),\r\n );\r\n\r\n children.push({ id: 'divider' });\r\n children.push({\r\n id: 'auto',\r\n item: {\r\n active: this.props.itemPrio.auto,\r\n onClick: () => {\r\n this.setPriority(API.QueuePriorityEnum.DEFAULT);\r\n },\r\n children: translate('Auto', t, UI.Modules.QUEUE),\r\n },\r\n });\r\n\r\n return buildMenu(children, onClose);\r\n };\r\n\r\n render() {\r\n const { itemPrio, t } = this.props;\r\n let caption = translate(\r\n PriorityEnum[itemPrio.id as keyof typeof PriorityEnum].str,\r\n t,\r\n UI.Modules.QUEUE,\r\n );\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 <EmptyDropdownCaption caption={caption} />;\r\n }\r\n\r\n return (\r\n <TableDropdown caption={caption} className=\"priority-menu\">\r\n {this.getChildren}\r\n </TableDropdown>\r\n );\r\n }\r\n}\r\n\r\nexport default PriorityMenu;\r\n","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\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 {\r\n grey:\r\n (!statusId || statusId === API.QueueBundleStatusEnum.QUEUED) &&\r\n rowData.speed === 0,\r\n },\r\n {\r\n blue:\r\n (!statusId || statusId === API.QueueBundleStatusEnum.QUEUED) && rowData.speed > 0,\r\n },\r\n );\r\n};\r\n\r\nconst StatusCell: React.FC<\r\n RowWrapperCellChildProps<API.QueueBundleStatus, API.QueueBundle>\r\n> = ({ cellData, rowDataGetter }) => {\r\n if (cellData!.failed) {\r\n // There isn't much space for other information\r\n return <span className=\"error\">{cellData!.str}</span>;\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;\r\n","import Reflux from 'reflux';\n\nimport QueueConstants from 'constants/QueueConstants';\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\n\nexport default Reflux.createStore({\n _viewName: 'queue_bundle_view',\n _apiUrl: QueueConstants.MODULE_URL,\n mixins: [ViewStoreMixin('name')],\n});\n","import Reflux from 'reflux';\n\nimport QueueConstants from 'constants/QueueConstants';\nimport ViewStoreMixin from 'mixins/ViewStoreMixin';\n\nexport default Reflux.createStore({\n _viewName: 'queue_file_view',\n _apiUrl: QueueConstants.MODULE_URL,\n mixins: [ViewStoreMixin('name')],\n});\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\nimport { Column } from 'fixed-data-table-2';\nimport * as UI from 'types/ui';\n\nimport VirtualTable from 'components/table/VirtualTable';\n\nimport PriorityMenu from 'routes/Queue/components/PriorityMenu';\nimport StatusCell from 'routes/Queue/components/StatusCell';\n\nimport QueueFileViewStore from 'stores/QueueFileViewStore';\n\nimport {\n FileActionCell,\n SizeCell,\n SpeedCell,\n AbbreviatedDurationCell,\n} from 'components/table/Cell';\n\nimport '../style.css';\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\n\nimport * as API from 'types/api';\nimport { setFilePriority } from 'services/api/QueueApi';\nimport MenuConstants from 'constants/MenuConstants';\nimport { QueueFileActionMenu } from 'actions/ui/queue';\n\nconst PriorityCell: React.FC<\n RowWrapperCellChildProps<API.QueuePriority, API.QueueBundle>\n> = ({ cellData, rowDataGetter, t }) => (\n <PriorityMenu\n itemPrio={cellData!}\n item={rowDataGetter!()}\n prioAction={setFilePriority}\n t={t!}\n />\n);\n\ninterface BundleFileTableProps {\n bundle: API.QueueBundle;\n}\n\nclass BundleFileTable extends React.Component<BundleFileTableProps> {\n isActive = (cellData: any, rowData: API.QueueFile) => {\n return !rowData.status.downloaded;\n };\n\n isRunning = (cellData: any, rowData: API.QueueFile) => {\n return rowData.speed > 0;\n };\n\n render() {\n return (\n <VirtualTable\n store={QueueFileViewStore}\n sourceFilter={{\n pattern: this.props.bundle.id,\n method: API.FilterMethod.EXACT,\n property: 'bundle',\n }}\n moduleId={UI.Modules.QUEUE}\n >\n <Column\n name=\"Name\"\n width={200}\n flexGrow={20}\n columnKey=\"name\"\n cell={\n <FileActionCell\n actions={QueueFileActionMenu}\n remoteMenuId={MenuConstants.QUEUE_FILE}\n />\n }\n />\n <Column\n name=\"Size\"\n width={70}\n columnKey=\"size\"\n cell={<SizeCell />}\n flexGrow={1}\n />\n <Column name=\"Status\" width={120} columnKey=\"status\" cell={<StatusCell />} />\n <Column\n name=\"Sources\"\n width={65}\n columnKey=\"sources\"\n renderCondition={this.isActive}\n />\n <Column\n name=\"Time left\"\n width={50}\n columnKey=\"seconds_left\"\n renderCondition={this.isRunning}\n cell={<AbbreviatedDurationCell />}\n />\n <Column\n name=\"Speed\"\n width={55}\n columnKey=\"speed\"\n cell={<SpeedCell />}\n renderCondition={this.isRunning}\n />\n <Column\n name=\"Priority\"\n width={80}\n columnKey=\"priority\"\n renderCondition={this.isActive}\n cell={<PriorityCell />}\n flexGrow={1}\n />\n </VirtualTable>\n );\n }\n}\n\nexport default BundleFileTable;\n","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport ModalRouteDecorator, {\r\n ModalRouteDecoratorChildProps,\r\n} from 'decorators/ModalRouteDecorator';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\nimport BundleFileTable from 'routes/Queue/components/BundleFileTable';\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\nimport QueueConstants from 'constants/QueueConstants';\r\n\r\nimport * as API from 'types/api';\r\n\r\ninterface BundleFileDialogProps {}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n bundle: API.QueueBundle;\r\n}\r\n\r\n/*interface RouteProps {\r\n bundleId: string;\r\n}*/\r\n\r\ntype Props = BundleFileDialogProps & DataProps & ModalRouteDecoratorChildProps;\r\n\r\nclass BundleFileDialog extends Component<Props> {\r\n static displayName = 'BundleFileDialog';\r\n\r\n render() {\r\n const { bundle } = 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 >\r\n <BundleFileTable bundle={bundle} />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nexport default ModalRouteDecorator<BundleFileDialogProps>(\r\n DataProviderDecorator<Omit<Props, keyof DataProps>, DataProps>(BundleFileDialog, {\r\n urls: {\r\n bundle: ({ params }, socket) =>\r\n socket.get(`${QueueConstants.BUNDLES_URL}/${params.bundleId}`),\r\n },\r\n }),\r\n 'content/:bundleId',\r\n);\r\n","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\n\r\nimport { QueueBundleSourceActionMenu } from 'actions/ui/queue/QueueBundleSourceActions';\r\nimport QueueConstants from 'constants/QueueConstants';\r\n\r\nimport { formatSize, formatSpeed } from 'utils/ValueFormat';\r\n\r\nimport { ActionMenu, UserMenu } from 'components/action-menu';\r\nimport { UserFileActions } from 'actions/ui/user/UserActions';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\ninterface SourceProps {\r\n bundle: API.QueueBundle;\r\n source: API.QueueBundleSource;\r\n t: UI.TranslateF;\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={QueueBundleSourceActionMenu}\r\n itemData={source}\r\n entity={bundle}\r\n />\r\n </UserMenu>\r\n </td>\r\n <td className=\"hubs\">{source.user.hub_names}</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\">{source.files}</td>\r\n <td className=\"size\">{formatSize(source.size, t)}</td>\r\n </tr>\r\n);\r\n\r\nconst userSort = (a: API.QueueBundleSource, b: API.QueueBundleSource) =>\r\n a.user.nicks.localeCompare(b.user.nicks);\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<\r\n BundleSourceTableProps & BundleSourceTableDataProps\r\n> = ({ sources, bundle, queueT }) => {\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>(\r\n BundleSourceTable,\r\n {\r\n urls: {\r\n sources: ({ bundle }, socket) =>\r\n socket.get(`${QueueConstants.BUNDLES_URL}/${bundle!.id}/sources`),\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData, props }) => {\r\n addSocketListener<API.QueueBundle>(\r\n QueueConstants.MODULE_URL,\r\n QueueConstants.BUNDLE_SOURCES,\r\n (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 },\r\n },\r\n);\r\n","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport ModalRouteDecorator, {\r\n ModalRouteDecoratorChildProps,\r\n} 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, {\r\n DataProviderDecoratorChildProps,\r\n} 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\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\n/*interface RouteProps {\r\n bundleId: string;\r\n}*/\r\n\r\ntype Props = BundleSourceDialogProps & ModalRouteDecoratorChildProps;\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 bundle={bundle} queueT={queueT} />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nexport default ModalRouteDecorator<BundleSourceDialogProps>(\r\n DataProviderDecorator<Props, DataProps>(SourceDialog, {\r\n urls: {\r\n bundle: ({ params }, socket) =>\r\n socket.get(`${QueueConstants.BUNDLES_URL}/${params.bundleId}`),\r\n },\r\n }),\r\n 'sources/:bundleId',\r\n);\r\n","import * as React from 'react';\r\nimport { Column } from 'fixed-data-table-2';\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\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/action-menu';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport {\r\n ActionLinkCell,\r\n FileActionCell,\r\n SizeCell,\r\n SpeedCell,\r\n AbbreviatedDurationCell,\r\n 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\nimport {\r\n QueueActionMenu,\r\n QueueBundleActionMenu,\r\n QueueBundleActionModule,\r\n QueueBundleViewContentAction,\r\n QueueBundleViewSourcesAction,\r\n} from 'actions/ui/queue';\r\n\r\nconst PriorityCell: React.FC<\r\n RowWrapperCellChildProps<API.QueuePriority, API.QueueBundle>\r\n> = ({ cellData, rowDataGetter, t }) => (\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={QueueActionMenu}\r\n header={translate('Queue actions')}\r\n triggerIcon=\"chevron up\"\r\n button={true}\r\n />\r\n }\r\n moduleId={UI.Modules.QUEUE}\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={QueueBundleActionMenu}\r\n remoteMenuId={MenuConstants.QUEUE_BUNDLE}\r\n ids={[\r\n 'content',\r\n 'sources',\r\n 'divider',\r\n 'search',\r\n 'searchBundleAlternates',\r\n 'divider',\r\n 'removeBundle',\r\n 'divider',\r\n 'rescan',\r\n '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 action={QueueBundleViewContentAction}\r\n moduleData={QueueBundleActionModule}\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 action={QueueBundleViewSourcesAction}\r\n moduleData={QueueBundleActionModule}\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);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","BundleSourceActions","removeBundleSource","displayName","access","QUEUE_EDIT","icon","REMOVE","handler","itemData","source","entity","bundle","delete","BUNDLES_URL","user","cid","QueueBundleSourceActionMenu","moduleData","moduleId","QUEUE","subId","actions","QueueFileSearchAction","SEARCH","file","location","navigate","search","QueueFileSearchAlternatesAction","SEARCH_ALTERNATES","filter","time_finished","post","FILES_URL","QueueFileRemoveAction","confirmation","content","approveCaption","rejectCaption","checkboxCaption","removeFinished","remove_finished","notifications","onSuccess","QueueFileActions","searchFileAlternates","removeFile","QueueFileActionMenu","QueueSourceRemoveAction","SOURCES_URL","setBundlePriorities","prio","SocketService","QueueConstants","priority","QueueRemoveCompletedAction","IconConstants","QueuePauseAction","PAUSE","PAUSED_FORCED","QueueResumeAction","PLAY","DEFAULT","QueueActions","removeCompleted","divider","pause","resume","QueueActionMenu","bundleValidationFailed","status","S","COMPLETION_VALIDATION_ERROR","itemNotFinished","shareBundle","skipValidation","skip_validation","QueueBundleViewSourcesAction","USER","data","sources","total","QueueBundleViewContentAction","FILE","type","QueueBundleSearchAction","SearchActions","QueueBundleSearchAlternatesAction","QueueBundleRemoveAction","QueueBundleRescanAction","REFRESH_COLORED","QueueBundleForceShareAction","ERROR","QueueBundleActions","searchBundleAlternates","divider2","removeBundle","divider3","rescan","forceShare","QueueBundleActionModule","QueueBundleActionMenu","Progress","className","percent","caption","indeterminate","undefined","style","transitionDuration","width","minWidth","propTypes","isRequired","PriorityEnum","str","PAUSED","LOWEST","LOW","NORMAL","HIGH","HIGHEST","PriorityMenu","Component","setPriority","priorityId","item","prioAction","t","this","props","setAutoPriority","getPriorityListItem","currentPrio","toString","active","onClick","children","getChildren","onClose","Object","keys","map","Number","prioKey","itemPrio","auto","shouldComponentUpdate","nextProps","render","toLocaleLowerCase","LoginStore","hasAccess","TableDropdown","EmptyDropdown","getStatusClass","cellData","rowData","completed","statusId","grey","QUEUED","speed","blue","rowDataGetter","failed","downloaded_bytes","size","_viewName","_apiUrl","MODULE_URL","mixins","ViewStoreMixin","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","PriorityCell","BundleFileTable","isActive","downloaded","isRunning","VirtualTable","store","QueueFileViewStore","sourceFilter","pattern","method","EXACT","property","name","flexGrow","columnKey","cell","remoteMenuId","MenuConstants","QUEUE_FILE","renderCondition","BundleFileDialog","Modal","title","subHeader","target","closable","FileIcon","typeInfo","fullHeight","ModalRouteDecorator","DataProviderDecorator","urls","params","socket","get","bundleId","Source","userIcon","ids","contextElement","HINTED_USER","hub_names","last_speed","files","userSort","a","b","nicks","localeCompare","queueT","translate","sort","plainT","onSocketConnected","addSocketListener","refetchData","BUNDLE_SOURCES","SourceDialog","Queue","isDownloaded","emptyRowsNodeGetter","Message","description","QueueBundleViewStore","footerData","header","triggerIcon","button","QUEUE_BUNDLE","hideWidth","action"],"sourceRoot":""}