airdcpp-webui 2.14.0-beta.13 → 2.14.0-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.html +1 -1
- package/dist/js/544.73cf8e69cd2348500250.chunk.js +2 -0
- package/dist/js/544.73cf8e69cd2348500250.chunk.js.gz +0 -0
- package/dist/js/544.73cf8e69cd2348500250.chunk.js.map +1 -0
- package/dist/js/{550.43735d298b0c3e70c6bd.chunk.js → 550.10703917b7e833fa8ae9.chunk.js} +2 -2
- package/dist/js/550.10703917b7e833fa8ae9.chunk.js.gz +0 -0
- package/dist/js/550.10703917b7e833fa8ae9.chunk.js.map +1 -0
- package/dist/js/{807.52502ffbf0c34539314f.chunk.js → 807.ae2142c32d74128cca0c.chunk.js} +2 -2
- package/dist/js/807.ae2142c32d74128cca0c.chunk.js.gz +0 -0
- package/dist/js/{807.52502ffbf0c34539314f.chunk.js.map → 807.ae2142c32d74128cca0c.chunk.js.map} +1 -1
- package/dist/js/{926.c344692db21ff4746b0d.chunk.js → 926.b8efc4bf2e958f4b5cb2.chunk.js} +2 -2
- package/dist/js/926.b8efc4bf2e958f4b5cb2.chunk.js.gz +0 -0
- package/dist/js/926.b8efc4bf2e958f4b5cb2.chunk.js.map +1 -0
- package/dist/js/filelists.ce2bf2a0664eef3a9aec.chunk.js +2 -0
- package/dist/js/filelists.ce2bf2a0664eef3a9aec.chunk.js.gz +0 -0
- package/dist/js/filelists.ce2bf2a0664eef3a9aec.chunk.js.map +1 -0
- package/dist/js/{files.64f72b3869667e0d4c7e.chunk.js → files.2424018fc68f621a73ea.chunk.js} +1 -1
- package/dist/js/files.2424018fc68f621a73ea.chunk.js.gz +0 -0
- package/dist/js/files.2424018fc68f621a73ea.chunk.js.map +1 -0
- package/dist/js/{home.e0421a3f337897e900d5.chunk.js → home.630ba9695cb5314daa39.chunk.js} +3 -3
- package/dist/js/home.630ba9695cb5314daa39.chunk.js.gz +0 -0
- package/dist/js/home.630ba9695cb5314daa39.chunk.js.map +1 -0
- package/dist/js/{hubs.82f0f581d104a03d4461.chunk.js → hubs.5dce2652372b61531a37.chunk.js} +2 -2
- package/dist/js/hubs.5dce2652372b61531a37.chunk.js.gz +0 -0
- package/dist/js/hubs.5dce2652372b61531a37.chunk.js.map +1 -0
- package/dist/js/locales/en-webui-main-missing-json.a4704a173bebeebdc24d.chunk.js +1 -0
- package/dist/js/locales/en-webui-main-missing-json.a4704a173bebeebdc24d.chunk.js.gz +0 -0
- package/dist/js/locales/fr-webui-main-json.a977c3aaad84bfe0f69d.chunk.js +1 -0
- package/dist/js/locales/fr-webui-main-json.a977c3aaad84bfe0f69d.chunk.js.gz +0 -0
- package/dist/js/locales/pt-br-webui-main-json.1e68869ee8f4ff49c12a.chunk.js +1 -0
- package/dist/js/locales/pt-br-webui-main-json.1e68869ee8f4ff49c12a.chunk.js.gz +0 -0
- package/dist/js/locales/zh_CN-GB2312-webui-main-json.c56c6d389b7951c4f74d.chunk.js +1 -0
- package/dist/js/locales/zh_CN-GB2312-webui-main-json.c56c6d389b7951c4f74d.chunk.js.gz +0 -0
- package/dist/js/main.67a9c3fc3a221e13daba.entry.js +3 -0
- package/dist/js/main.67a9c3fc3a221e13daba.entry.js.gz +0 -0
- package/dist/js/{main.eea930701ff0165c262c.entry.js.map → main.67a9c3fc3a221e13daba.entry.js.map} +1 -1
- package/dist/js/messages.3d372056d582e1271e3b.chunk.js +2 -0
- package/dist/js/messages.3d372056d582e1271e3b.chunk.js.gz +0 -0
- package/dist/js/messages.3d372056d582e1271e3b.chunk.js.map +1 -0
- package/dist/js/search.34d3dd17a43e78572dcc.chunk.js +2 -0
- package/dist/js/search.34d3dd17a43e78572dcc.chunk.js.gz +0 -0
- package/dist/js/search.34d3dd17a43e78572dcc.chunk.js.map +1 -0
- package/dist/js/settings.4295b3c85b2d33c23715.chunk.js +2 -0
- package/dist/js/settings.4295b3c85b2d33c23715.chunk.js.gz +0 -0
- package/dist/js/settings.4295b3c85b2d33c23715.chunk.js.map +1 -0
- package/dist/sw.js +1 -1
- package/dist/sw.js.gz +0 -0
- package/dist/sw.js.map +1 -1
- package/package.json +1 -1
- package/vitest.config.browser.ts +9 -1
- package/vitest.config.common.ts +4 -4
- package/vitest.config.node.ts +2 -0
- package/vitest.config.ts +10 -0
- package/dist/js/544.23c1c02472b86725dbe7.chunk.js +0 -2
- package/dist/js/544.23c1c02472b86725dbe7.chunk.js.gz +0 -0
- package/dist/js/544.23c1c02472b86725dbe7.chunk.js.map +0 -1
- package/dist/js/550.43735d298b0c3e70c6bd.chunk.js.gz +0 -0
- package/dist/js/550.43735d298b0c3e70c6bd.chunk.js.map +0 -1
- package/dist/js/807.52502ffbf0c34539314f.chunk.js.gz +0 -0
- package/dist/js/926.c344692db21ff4746b0d.chunk.js.gz +0 -0
- package/dist/js/926.c344692db21ff4746b0d.chunk.js.map +0 -1
- package/dist/js/filelists.f098fc396efc445ef837.chunk.js +0 -2
- package/dist/js/filelists.f098fc396efc445ef837.chunk.js.gz +0 -0
- package/dist/js/filelists.f098fc396efc445ef837.chunk.js.map +0 -1
- package/dist/js/files.64f72b3869667e0d4c7e.chunk.js.gz +0 -0
- package/dist/js/files.64f72b3869667e0d4c7e.chunk.js.map +0 -1
- package/dist/js/home.e0421a3f337897e900d5.chunk.js.gz +0 -0
- package/dist/js/home.e0421a3f337897e900d5.chunk.js.map +0 -1
- package/dist/js/hubs.82f0f581d104a03d4461.chunk.js.gz +0 -0
- package/dist/js/hubs.82f0f581d104a03d4461.chunk.js.map +0 -1
- package/dist/js/locales/en-webui-main-missing-json.2d88b62200bc732efcd6.chunk.js +0 -1
- package/dist/js/locales/en-webui-main-missing-json.2d88b62200bc732efcd6.chunk.js.gz +0 -0
- package/dist/js/locales/fr-webui-main-json.a7018ac9dac9453657bb.chunk.js +0 -1
- package/dist/js/locales/fr-webui-main-json.a7018ac9dac9453657bb.chunk.js.gz +0 -0
- package/dist/js/locales/pt-br-webui-main-json.a78a76f27d38c856a4b9.chunk.js +0 -1
- package/dist/js/locales/pt-br-webui-main-json.a78a76f27d38c856a4b9.chunk.js.gz +0 -0
- package/dist/js/main.eea930701ff0165c262c.entry.js +0 -3
- package/dist/js/main.eea930701ff0165c262c.entry.js.gz +0 -0
- package/dist/js/messages.1a4f756d835c59f6c925.chunk.js +0 -2
- package/dist/js/messages.1a4f756d835c59f6c925.chunk.js.gz +0 -0
- package/dist/js/messages.1a4f756d835c59f6c925.chunk.js.map +0 -1
- package/dist/js/search.52d677e31d86ea727809.chunk.js +0 -2
- package/dist/js/search.52d677e31d86ea727809.chunk.js.gz +0 -0
- package/dist/js/search.52d677e31d86ea727809.chunk.js.map +0 -1
- package/dist/js/settings.064c3f5ee2ec8c698a4c.chunk.js +0 -2
- package/dist/js/settings.064c3f5ee2ec8c698a4c.chunk.js.gz +0 -0
- package/dist/js/settings.064c3f5ee2ec8c698a4c.chunk.js.map +0 -1
- package/vitest.workspace.ts +0 -29
- /package/dist/js/{807.52502ffbf0c34539314f.chunk.js.LICENSE.txt → 807.ae2142c32d74128cca0c.chunk.js.LICENSE.txt} +0 -0
- /package/dist/js/{home.e0421a3f337897e900d5.chunk.js.LICENSE.txt → home.630ba9695cb5314daa39.chunk.js.LICENSE.txt} +0 -0
- /package/dist/js/{main.eea930701ff0165c262c.entry.js.LICENSE.txt → main.67a9c3fc3a221e13daba.entry.js.LICENSE.txt} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[926],{3570:(e,t,n)=>{n.d(t,{A:()=>te});var r=n(74848),a=n(96540),i=n(31104),o=n(19247),l=n(27725),s=n(36995),c=n(86038),d=n(8098),p=n(42695),A=n(32389),u=n(39269);const h=(e,t)=>{const n=(e=>{switch(e){case c.Od.REGEX:return"Regex";case c.Od.WILDCARD:return"Wildcard";case c.Od.EXACT:return"Exact";default:return"Partial"}})(e);return(0,p.Tl)(n,t,"table.filter")},g=(e,t)=>{let n=t("table.filter.filter","Filter");return e!==c.Od.PARTIAL&&(n+=` (${h(e,t).toLowerCase()})`),n+"..."};class f extends a.PureComponent{constructor(){super(...arguments),this.state={value:"",method:c.Od.PARTIAL},this.onFilterUpdated=()=>{const{value:e,method:t}=this.state;this.props.onFilterUpdated(e,t)},this.onTextChanged=e=>{this.setState({value:e.target.value}),clearTimeout(this.timer),this.timer=window.setTimeout(()=>{this.onFilterUpdated()},200)},this.onMethodChanged=e=>{this.setState({method:e}),setTimeout(()=>this.onFilterUpdated()),this.input.focus()},this.getFilterMethod=(e,t)=>{const n=e===this.state.method;return(0,r.jsx)(l.A,{onClick:()=>this.onMethodChanged(e),active:n,children:h(e,t)},e)}}componentWillUnmount(){clearTimeout(this.timer)}render(){const{value:e,method:t}=this.state,{autoFocus:n}=this.props;return(0,r.jsx)(A.wD,{children:a=>(0,r.jsx)("div",{className:"text-filter",children:(0,r.jsx)(u.A,{ref:e=>this.input=e,placeholder:g(t,a),onChange:this.onTextChanged,value:e,type:"text",autoFocus:!(0,d.vU)()&&n,children:(0,r.jsx)(i.A,{className:"filter-method right top pointing",button:!0,direction:"upward",children:(0,r.jsx)(o.A,{caption:(0,p.Tl)("Match type",a,"table.filter"),children:Object.keys(c.Od).filter(e=>isNaN(Number(e))).map(e=>this.getFilterMethod(c.Od[e],a))})})})})})}}const w=(0,s.A)(f);var m=n(83994),b=n(4425);const v=({store:e})=>{if(e.totalCount<0)return null;let t=e.totalCount;return e.totalCount!==e.rowCount&&(t=e.rowCount+"/"+e.totalCount),(0,r.jsxs)("div",{className:"count-info",children:[(0,r.jsx)(m.A,{icon:b.A.FILTER}),t]})},x=({store:e,customFilter:t,footerData:n,textFilterProps:a})=>(0,r.jsxs)("div",{className:"table-footer",children:[n,(0,r.jsxs)("div",{className:"filter item",children:[t?(0,r.jsx)(t,{store:e}):null,(0,r.jsx)(w,Object.assign({store:e},a)),(0,r.jsx)(v,{store:e})]})]});var C=n(68465),E=n(46942),D=n.n(E);class B extends a.Component{constructor(){super(...arguments),this.state={rowData:null},this.loadData=e=>this.props.dataLoader.updateRowData(e,this.onDataLoaded),this.rowDataGetter=()=>this.state.rowData,this.onDataLoaded=e=>{this.setState({rowData:e})}}componentDidMount(){this.loadData(this.props.rowIndex)}UNSAFE_componentWillReceiveProps(e){e.rowIndex!==this.props.rowIndex&&this.props.dataLoader.removePendingRequests(this.props.rowIndex,this.onDataLoaded),this.loadData(e.rowIndex)||this.setState({rowData:null})}componentWillUnmount(){this.props.dataLoader.removePendingRequests(this.props.rowIndex,this.onDataLoaded)}shouldComponentUpdate(e,t){return t.rowData!==this.state.rowData||e.width!==this.props.width}render(){const e=this.props,{columnKey:t,children:n,renderCondition:i,rowClassNameGetter:o}=e,l=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n}(e,["columnKey","children","renderCondition","rowClassNameGetter"]),{rowData:s}=this.state;if(!s)return null;if(i&&!i(s[t],s))return null;const c=D()("cell-wrapper",t,o?o(s):void 0);return(0,r.jsx)("div",{className:c,children:a.cloneElement(n,Object.assign({cellData:s[t],rowDataGetter:this.rowDataGetter},l))})}}const y=B;var _=n(44247),j=n(67749),R=n(15992),k=n(48249),U=n(16653);const S=(e,t,n,r)=>{const{name:a,columnKey:i}=e.props;let o=r((0,p._F)(i,[...(0,p.$r)(n),j.l.TABLE]),a);{const e=t.sortAscending?" ↑":" ↓";o+=t.sortProperty===i?e:""}return o},T=e=>{const t=(({store:e,viewId:t,entityId:n})=>{const r=(0,k.F)(),i=a.useRef(!0),[o,l]=(0,U.A)({debounce:i.current?0:100}),[s,c]=a.useState({}),d=a.useRef(void 0),p=a.useRef(0);a.useEffect(()=>{l.height>0&&A()},[l.height]),a.useEffect(()=>()=>{clearTimeout(d.current)},[]),a.useEffect(()=>{0!==l.height&&(e.DEBUG&&console.log(`Enabling initial scroll, entity/viewId changed (view ${t})`),i.current=!0,A())},[n,t]);const A=()=>{const{height:t}=l,n=(a=p.current,Math.max(Math.floor(a/50),0));var a;const i=function(e){return Math.ceil(e/50)}(t);e.DEBUG&&console.log(`Settings changed, start: ${n}, end: ${i}, height: ${t}`,e.viewName),console.assert(e.active,"Posting data for an inactive view"),R.A.setRange(r,e.viewUrl,n,i)};return{measureRef:o,getScrollTop:()=>i.current?e.getScrollData(t):void 0,columnWidths:s,bounds:l,onColumnClicked:t=>{let n=!0;t===e.sortProperty&&e.sortAscending&&(n=!1),R.A.setSort(r,e.viewUrl,t,n)},onColumnResizeEndCallback:(e,t)=>{c(n=>Object.assign(Object.assign({},n),{[t]:e}))},onScrollStart:(t,n)=>{e.DEBUG&&console.log(`Scrolling started: ${n}`,e.viewUrl),console.assert(e.active,"Sending pause for an inactive view"),R.A.pause(r,e.viewUrl,!0)},onScrollEnd:(n,a)=>{p.current=a,console.assert(e.active,"Sending pause for an inactive view"),R.A.pause(r,e.viewUrl,!1),clearTimeout(d.current),d.current=window.setTimeout(A,500),i.current&&(i.current=!1,e.DEBUG&&console.log(`Disabling initial scroll (view ${t})`)),e.setScrollData(a,t),e.DEBUG&&console.log(`Scrolling ended: ${a}`,e.viewUrl)},updateRowRange:A}})(e),{t:n}=(0,A.Bd)(),i=a.Children.map(e.children,i=>{if(i.props.hideWidth&&t.bounds.width>0&&i.props.hideWidth>t.bounds.width)return null;let{flexGrow:o,width:l}=i.props;const{cell:s,columnKey:c,renderCondition:p}=i.props,{store:A,rowClassNameGetter:u,moduleId:h,dataLoader:g}=e,f=(0,d.vU)();return f||c&&t.columnWidths[c]&&(l=t.columnWidths[c],o=void 0),a.cloneElement(i,{header:(0,r.jsx)(C.ry.ResizeCell,{onColumnResizeEnd:t.onColumnResizeEndCallback,children:(0,r.jsx)(_.A3,{onClick:t.onColumnClicked.bind(null,c),label:S(i,A,h,n)})}),flexGrow:o,width:l,isResizable:!f,allowCellsRecycling:!0,cell:(0,r.jsx)(y,{dataLoader:g,renderCondition:p,rowClassNameGetter:u,t:n,children:s||(0,r.jsx)(_.mz,{})})})}),{width:o,height:l}=t.bounds,{store:s}=e;return(0,r.jsx)("div",{ref:t.measureRef,className:"table-container-wrapper",children:(0,r.jsx)(C.XI,{width:o,height:l,rowHeight:50,rowsCount:s.rowCount,headerHeight:50,touchScrollEnabled:!0,onScrollStart:t.onScrollStart,onScrollEnd:t.onScrollEnd,scrollTop:t.getScrollTop(),children:i})})};var G=n(85072),O=n.n(G),I=n(97825),N=n.n(I),F=n(77659),L=n.n(F),P=n(55056),W=n.n(P),q=n(10540),$=n.n(q),M=n(41113),z=n.n(M),Y=n(56796),K={};K.styleTagTransform=z(),K.setAttributes=W(),K.insert=L().bind(null,"head"),K.domAPI=N(),K.insertStyleElement=$(),O()(Y.A,K),Y.A&&Y.A.locals&&Y.A.locals,n(56141);var X=n(46894),H=n.n(X),J=n(2404),Z=n.n(J);const Q=class{constructor(e,t,n){this._onDataLoad=t,this._store=e,this._data=[],this._pendingRequest={},this._initialDataReceived=!1,this._socket=n,this.DEBUG=e.DEBUG}clear(){this._pendingRequest={},this._data=[]}updateItem(e,t,n){let r=this._data[n];return r===t||Z()(this._data[n],t)?e:(this._data[n]=r?H()(r,{$merge:t}):H()(r,{$set:t}),e+1)}onItemsUpdated(e,t=0,n){let r=n<this._data.length;if(e&&0!==e.length){this._initialDataReceived=!0;for(let t=0;t<this._data.length;t++)e[t]||delete this._data[t];const n=e.reduce(this.updateItem.bind(this),0);(n>0||0!==t)&&(this.DEBUG&&console.log(`onItemsUpdated changed: updated ${n} items, range offset ${t}`),r=!0)}else this.clear(),r=!0,this._initialDataReceived=!1,this.DEBUG&&console.log("onItemsUpdated, cleared");r&&this._onDataLoad()}get rangeOffset(){const e=this._rangeOffset;return this._rangeOffset=0,e}getRowData(e){return this._data[e]}updateRowData(e,t){const n=this._data[e];return n?(t(n),!0):(this._initialDataReceived&&this._queueRequestFor(e,t),!1)}removePendingRequests(e){delete this._pendingRequest[e]}_queueRequestFor(e,t){const n=e-e%10,r=this._pendingRequest[e];if(r)return void r.push(t);if(this._pendingRequest[e]=[t],e!==n){if(this._pendingRequest[n])return;this._pendingRequest[n]=[]}const a=Math.min(n+10,this._store.rowCount);this._socket.get(this._store.viewUrl+"/items/"+n+"/"+a).then(this.onRowsReceived.bind(this,n)).catch(e=>{console.error("Failed to load data",e);for(let e=n;e<a;e++)this._pendingRequest[e]&&delete this._pendingRequest[e]})}onRowsReceived(e,t){if(this._pendingRequest[e])for(let n=0;n<t.length;n++){const r=e+n;Z()(this._data[r],t[n])?this.DEBUG&&console.log("onRowsReceived, row data equals",r):(this._data[r]=t[n],this._pendingRequest[r]&&this._pendingRequest[r].forEach(e=>e(t[n]))),delete this._pendingRequest[r]}}};var V=n(39364);const ee=({store:e,sessionStore:t,entityId:n,sourceFilter:r})=>{const i=(0,k.F)(),[,o]=(0,a.useReducer)(e=>e+1,0),l=(0,V.li)(e=>e.login.socketAuthenticated),s=(0,a.useMemo)(()=>new Q(e,o,i),[e]),c=(0,a.useRef)(()=>{});(0,a.useEffect)(()=>(c.current=e.listen(s.onItemsUpdated.bind(s)),()=>{c.current()}),[s,e]);return(0,a.useEffect)(()=>(R.A.init(i,e.viewUrl,n,r),R.A.setSort(i,e.viewUrl,e.sortProperty,e.sortAscending),()=>{R.A.close(i,e.viewUrl,(e=>!!l&&(!e||!t||t.getSession(e)))(n))}),[n,l]),(0,a.useEffect)(()=>{e.paused&&R.A.pause(i,e.viewUrl,!1,i),R.A.clear(i,e.viewUrl)},[e.viewUrl]),s},te=a.memo(({entityId:e,store:t,emptyRowsNodeGetter:n,customFilter:a,footerData:i,textFilterProps:o,sourceFilter:l,sessionStore:s,moduleId:c,rowClassNameGetter:d,children:p})=>{const A=ee({sessionStore:s,store:t,entityId:e,sourceFilter:l});return n&&-1===t.totalCount?(0,r.jsx)("div",{className:"virtual-table"}):n&&0===t.totalCount?n():(0,r.jsxs)("div",{className:"virtual-table",children:[(0,r.jsx)(T,{rowClassNameGetter:d,dataLoader:A,store:t,moduleId:c,viewId:t.viewId,entityId:e,children:p}),(0,r.jsx)(x,{store:t,customFilter:a,footerData:i,textFilterProps:o})]})})},15992:(e,t,n)=>{n.d(t,{A:()=>o});var r=n(22005);const a=n.n(r)().createActions([{setRange:{asyncResult:!0}},{setSort:{asyncResult:!0}},{close:{asyncResult:!0}},{pause:{asyncResult:!0}},{init:{asyncResult:!0}},"clear"]),i=(e,t,n,r)=>e.post(n+"/settings",t).then(e=>r.completed(n,e)).catch(e=>r.failed(n,e));a.close.listen(function(e,t,n){if(n){const n=this;return e.delete(t).then(e=>n.completed(t,e)).catch(e=>this.failed(t,e))}return Promise.resolve()}),a.setSort.listen(function(e,t,n,r){i(e,{sort_property:n,sort_ascending:r},t,this)}),a.setRange.listen(function(e,t,n,r){console.assert(r>0,"Invalid max rows"),i(e,{range_start:n,max_count:r},t,this)}),a.pause.listen(function(e,t,n){i(e,{paused:n},t,this)}),a.init.listen(function(e,t,n,r){r&&i(e,{source_filter:r},t,this)});const o=a},36995:(e,t,n)=>{n.d(t,{A:()=>l});var r=n(74848),a=n(96540),i=n(56484),o=n(86038);function l(e,t="any"){return(0,i.A)(n=>(a.useLayoutEffect(()=>()=>{const{store:e,filter:t,socket:r}=n;e.active&&r.delete(`${e.viewUrl}/filter/${t.id}`).catch(e=>console.error("Failed to delete table filter",e))},[]),(0,r.jsx)(e,Object.assign({},n,{onFilterUpdated:(e,r=o.Od.PARTIAL)=>{const a={pattern:e,method:r,property:t},{store:i,filter:l,socket:s}=n;s.put(`${i.viewUrl}/filter/${l.id}`,a).catch(e=>console.error("Failed to add table filter",e))}}))),{urls:{filter:({store:e},t)=>t.post(`${e.viewUrl}/filter`)},loaderText:null})}},44247:(e,t,n)=>{n.d(t,{A3:()=>m,AJ:()=>k,BH:()=>R,In:()=>y,Jo:()=>D,Jy:()=>_,K:()=>v,V9:()=>x,WQ:()=>B,kF:()=>E,mz:()=>w,qG:()=>j,tC:()=>b,us:()=>C});var r=n(74848),a=(n(96540),n(71352)),i=n(74416),o=n(39798),l=n(54895),s=n(73616),c=n(36076),d=n(68465),p=n(17911),A=n(39364),u=n(98573),h=n(50489),g=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n};const f=e=>"object"==typeof e?Array.isArray(e)?e.length:e.str:0===e?null:e,w=({cellData:e})=>(0,r.jsx)("span",{className:"plain text cell",children:f(e)}),m=e=>{var{onClick:t,label:n,columnKey:a}=e,i=g(e,["onClick","label","columnKey"]);return(0,r.jsx)(d.fh,Object.assign({},i,{children:(0,r.jsx)(h.A,{onClick:t,caption:n})}))},b=e=>{var{cellData:t,rowDataGetter:n,children:i}=e,l=g(e,["cellData","rowDataGetter","children"]);return(0,r.jsx)(a.yj,Object.assign({caption:(0,r.jsx)(o.A,{typeInfo:n().type,caption:t,className:"icon-caption"}),itemData:n},l))},v=e=>{var{cellData:t,rowDataGetter:n}=e,i=g(e,["cellData","rowDataGetter"]);return(0,r.jsx)(a.yj,Object.assign({caption:t,itemData:n},i))},x=e=>{var{cellData:t,rowDataGetter:n,action:a,moduleData:i,entity:o}=e,l=g(e,["cellData","rowDataGetter","action","moduleData","entity"]);const s=(0,A.wV)();return(0,c.il)(a,n(),s)?(0,r.jsx)(p.M,{children:({onClickAction:e})=>(0,r.jsx)(h.A,{className:"plain link cell",onClick:()=>e({action:a,moduleData:i,itemData:n(),entity:o}),caption:f(t)})}):(0,r.jsx)(w,Object.assign({cellData:t},l))},C=({cellData:e})=>{const{formatSize:t}=(0,i.k)();return(0,r.jsx)("span",{className:"plain size cell",children:t(e)})},E=({cellData:e})=>{const{formatSpeed:t}=(0,i.k)();return(0,r.jsx)("span",{className:"plain speed cell",children:t(e)})},D=({cellData:e})=>{const{formatRelativeTime:t}=(0,i.k)();return(0,r.jsx)("span",{className:"plain duration cell",children:t(e)})},B=({cellData:e})=>{const{formatAbbreviatedDuration:t}=(0,i.k)();return(0,r.jsx)("span",{className:"plain abbr-duration cell",children:t(e)})},y=({cellData:e})=>(0,r.jsx)(l.A,{item:e}),_=({cellData:e})=>{const{formatConnection:t}=(0,i.k)();return(0,r.jsx)("span",{className:"plain connection cell",children:t(e)})},j=({cellData:e})=>(0,r.jsx)("span",{className:"plain decimal cell",children:(0,u.zJ)(e)}),R=e=>{var{cellData:t,rowDataGetter:n,captionGetter:i,userGetter:l,downloadHandler:s}=e,c=g(e,["cellData","rowDataGetter","captionGetter","userGetter","downloadHandler"]);return(0,r.jsx)(a.Gw,Object.assign({caption:(0,r.jsx)(o.A,{typeInfo:n().type,caption:i?i(t,n):t,className:"icon-caption"}),user:l(n()),linkCaption:!i,itemInfoGetter:n,downloadHandler:s},c))},k=e=>{var{cellData:t,rowDataGetter:n,onChange:a}=e,i=g(e,["cellData","rowDataGetter","onChange"]);return(0,r.jsx)(s.A,Object.assign({checked:t,onChange:e=>a(e,n())},i))}},52267:(e,t,n)=>{n.d(t,{A:()=>o});var r=n(15992),a=n(20311),i=n.n(a);const o=(e,t=!0)=>{let n=!1,a=-1,o=0,l=0,s=[],c=null,d=!1,p=0;let A=e,u=t;const h=()=>{s=[],l=0,o=0,a=-1};return{listenables:r.A,DEBUG:!1,onClose(e,t){t===this.viewUrl&&(this._removeMessageListener(),h(),n=!1,this.trigger())},onClear(e,t){t===this.viewUrl&&(h(),this.trigger())},onPause(e,t,n){t===this.viewUrl&&(d=n)},onInit(e,t,r){t===this.viewUrl&&(i()(!n,"Trying start an active table view"),c=r,this.addMessageListener(e),n=!0)},onSetSort(e,t,n,r){t===this.viewUrl&&(A=n,u=r)},addMessageListener(e){this._removeMessageListener=e.addViewUpdateListener(this._viewName,this._handleUpdate,c)},get items(){return s},get viewUrl(){let e=this._apiUrl+"/";return c&&(e+=c+"/"),e+=this._viewName,e},get viewName(){return this._viewName},get rowCount(){return o},get totalCount(){return a},get active(){return n},get sortProperty(){return A},get sortAscending(){return u},get paused(){return d},setScrollData(e,t){this._sessionStore?this._sessionStore.scroll.setScrollData(e,c,t):p=e},getScrollData(e){return this._sessionStore?this._sessionStore.scroll.getScrollData(c,e):p},_handleUpdate(e){(e=>{var t;null!=e.range_start&&(l=e.range_start),null!=e.total_items&&(a=e.total_items),null!=e.matching_items&&(o=e.matching_items),null!=e.items&&(t=e.items,s=t.reduce((e,t,n)=>{let r=(a=t.id,s.find(e=>!!e&&e.id===a)||{id:t.id});var a;return t.properties?r=Object.assign({},r,t.properties):1===Object.keys(r).length&&console.error("No properties were sent for a new view item",r.id),e[l+n]=r,e},[]))})(e),this.trigger(s,e.range_offset,o)}}}},54895:(e,t,n)=>{n.d(t,{A:()=>o});var r=n(74848),a=(n(96540),n(73624),n(46942)),i=n.n(a);const o=({item:e})=>(0,r.jsxs)("div",{className:"ip flag",children:[(0,r.jsx)("i",{className:i()("ui flag",e.country.toLowerCase())}),e.str]})},56796:(e,t,n)=>{n.d(t,{A:()=>l});var r=n(71354),a=n.n(r),i=n(76314),o=n.n(i)()(a());o.push([e.id,"/* Generic table styles */\n.virtual-table {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.virtual-table .table-container-wrapper {\n width: 100%;\n flex: 1 1 auto;\n\n /* The table won't shrink properly without this */\n height: calc(100% - 50px);\n}\n\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\n cursor: pointer;\n}\n\n.virtual-table .fixedDataTableLayout_main {\n background-color: rgba(250, 250, 250, 0.8);\n}\n\n.virtual-table .fixedDataTableLayout_main:focus {\n outline: inherit;\n}\n\n/* Common cell content styles */\n\n.virtual-table .cell-wrapper {\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n max-height: 50px;\n padding: 5px;\n}\n\n.virtual-table .cell-wrapper .plain.cell,\n.virtual-table .cell-wrapper .empty.dropdown {\n margin: 0px 3px;\n}\n\n.virtual-table .cell-wrapper .ui.progress .bar {\n height: 5px;\n}\n\n/* Footer */\n\n.table-footer {\n width: 100%;\n padding: 5px;\n background-color: #f6f7f8;\n background-image: -webkit-linear-gradient(#fff, #efefef);\n background-image: linear-gradient(#fff, #efefef);\n display: flex;\n align-items: center;\n}\n\n.table-footer > .filter {\n margin-left: auto;\n display: flex;\n}\n\n.table-footer > .filter > .count-info {\n margin-right: 0px;\n opacity: 0.6;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.table-footer > .filter > div:last-child {\n margin-left: 10px;\n}\n\n.table-footer > .filter .filter-method.dropdown.button {\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.table-footer > .filter .dropdown .trigger.icon {\n margin-right: 0px;\n}\n\n.table-footer > .filter input {\n width: 90%;\n}\n\n/* Table dropdowns */\n.table-container-wrapper .dropdown > .popup.trigger {\n max-width: 100%;\n\n line-height: 21px;\n display: flex;\n align-items: flex-start;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption {\n max-width: calc(100% - 20px);\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption > * {\n overflow: hidden;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover,\n.public_fixedDataTableCell_main a:hover {\n cursor: pointer;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover span,\n.public_fixedDataTableCell_main a:hover {\n text-decoration: underline;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger i.angle.icon {\n margin: 0px;\n}\n\n.table-container-wrapper .dropdown .icon-caption .icon {\n width: inherit !important;\n}\n\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\n padding-left: 22px;\n}\n\n.table-container-wrapper .dropdown .trigger i {\n flex-shrink: 0;\n}\n\n/* Table dropdown popup content */\n.popup.dropdown-content {\n padding: 5px 15px;\n overflow: hidden;\n}\n\n.popup.dropdown-content .ui.dropdown.item {\n margin: 0px 0px;\n}\n\n.virtual-table .public_fixedDataTable_header .button.link,\n.public_fixedDataTableCell_main .button.link {\n color: black;\n}\n","",{version:3,sources:["webpack://./src/components/table/style.css"],names:[],mappings:"AAAA,yBAAyB;AACzB;EACE,YAAY;EACZ,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,cAAc;;EAEd,iDAAiD;EACjD,yBAAyB;AAC3B;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,0CAA0C;AAC5C;;AAEA;EACE,gBAAgB;AAClB;;AAEA,+BAA+B;;AAE/B;EACE,kBAAkB;EAClB,QAAQ;EACR,2BAA2B;EAC3B,gBAAgB;EAChB,YAAY;AACd;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,WAAW;AACb;;AAEA,WAAW;;AAEX;EACE,WAAW;EACX,YAAY;EACZ,yBAAyB;EACzB,wDAAwD;EACxD,gDAAgD;EAChD,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;EACjB,aAAa;AACf;;AAEA;EACE,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,4BAA4B;EAC5B,6BAA6B;AAC/B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,UAAU;AACZ;;AAEA,oBAAoB;AACpB;EACE,eAAe;;EAEf,iBAAiB;EACjB,aAAa;EACb,uBAAuB;AACzB;;AAEA;EACE,4BAA4B;AAC9B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,eAAe;AACjB;;AAEA;;EAEE,0BAA0B;AAC5B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,cAAc;AAChB;;AAEA,iCAAiC;AACjC;EACE,iBAAiB;EACjB,gBAAgB;AAClB;;AAEA;EACE,eAAe;AACjB;;AAEA;;EAEE,YAAY;AACd",sourcesContent:["/* Generic table styles */\n.virtual-table {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.virtual-table .table-container-wrapper {\n width: 100%;\n flex: 1 1 auto;\n\n /* The table won't shrink properly without this */\n height: calc(100% - 50px);\n}\n\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\n cursor: pointer;\n}\n\n.virtual-table .fixedDataTableLayout_main {\n background-color: rgba(250, 250, 250, 0.8);\n}\n\n.virtual-table .fixedDataTableLayout_main:focus {\n outline: inherit;\n}\n\n/* Common cell content styles */\n\n.virtual-table .cell-wrapper {\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n max-height: 50px;\n padding: 5px;\n}\n\n.virtual-table .cell-wrapper .plain.cell,\n.virtual-table .cell-wrapper .empty.dropdown {\n margin: 0px 3px;\n}\n\n.virtual-table .cell-wrapper .ui.progress .bar {\n height: 5px;\n}\n\n/* Footer */\n\n.table-footer {\n width: 100%;\n padding: 5px;\n background-color: #f6f7f8;\n background-image: -webkit-linear-gradient(#fff, #efefef);\n background-image: linear-gradient(#fff, #efefef);\n display: flex;\n align-items: center;\n}\n\n.table-footer > .filter {\n margin-left: auto;\n display: flex;\n}\n\n.table-footer > .filter > .count-info {\n margin-right: 0px;\n opacity: 0.6;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.table-footer > .filter > div:last-child {\n margin-left: 10px;\n}\n\n.table-footer > .filter .filter-method.dropdown.button {\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.table-footer > .filter .dropdown .trigger.icon {\n margin-right: 0px;\n}\n\n.table-footer > .filter input {\n width: 90%;\n}\n\n/* Table dropdowns */\n.table-container-wrapper .dropdown > .popup.trigger {\n max-width: 100%;\n\n line-height: 21px;\n display: flex;\n align-items: flex-start;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption {\n max-width: calc(100% - 20px);\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption > * {\n overflow: hidden;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover,\n.public_fixedDataTableCell_main a:hover {\n cursor: pointer;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover span,\n.public_fixedDataTableCell_main a:hover {\n text-decoration: underline;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger i.angle.icon {\n margin: 0px;\n}\n\n.table-container-wrapper .dropdown .icon-caption .icon {\n width: inherit !important;\n}\n\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\n padding-left: 22px;\n}\n\n.table-container-wrapper .dropdown .trigger i {\n flex-shrink: 0;\n}\n\n/* Table dropdown popup content */\n.popup.dropdown-content {\n padding: 5px 15px;\n overflow: hidden;\n}\n\n.popup.dropdown-content .ui.dropdown.item {\n margin: 0px 0px;\n}\n\n.virtual-table .public_fixedDataTable_header .button.link,\n.public_fixedDataTableCell_main .button.link {\n color: black;\n}\n"],sourceRoot:""}]);const l=o}}]);
|
|
2
|
-
//# sourceMappingURL=926.
|
|
1
|
+
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[926],{3570:(e,t,n)=>{n.d(t,{A:()=>te});var r=n(74848),a=n(96540),i=n(31104),o=n(19247),l=n(27725),s=n(36995),c=n(86038),d=n(8098),p=n(42695),A=n(32389),u=n(39269);const h=(e,t)=>{const n=(e=>{switch(e){case c.Od.REGEX:return"Regex";case c.Od.WILDCARD:return"Wildcard";case c.Od.EXACT:return"Exact";default:return"Partial"}})(e);return(0,p.Tl)(n,t,"table.filter")},g=(e,t)=>{let n=t("table.filter.filter","Filter");return e!==c.Od.PARTIAL&&(n+=` (${h(e,t).toLowerCase()})`),n+"..."};class f extends a.PureComponent{constructor(){super(...arguments),this.state={value:"",method:c.Od.PARTIAL},this.onFilterUpdated=()=>{const{value:e,method:t}=this.state;this.props.onFilterUpdated(e,t)},this.onTextChanged=e=>{this.setState({value:e.target.value}),clearTimeout(this.timer),this.timer=window.setTimeout(()=>{this.onFilterUpdated()},200)},this.onMethodChanged=e=>{this.setState({method:e}),setTimeout(()=>this.onFilterUpdated()),this.input.focus()},this.getFilterMethod=(e,t)=>{const n=e===this.state.method;return(0,r.jsx)(l.A,{onClick:()=>this.onMethodChanged(e),active:n,children:h(e,t)},e)}}componentWillUnmount(){clearTimeout(this.timer)}render(){const{value:e,method:t}=this.state,{autoFocus:n}=this.props;return(0,r.jsx)(A.wD,{children:a=>(0,r.jsx)("div",{className:"text-filter",children:(0,r.jsx)(u.A,{ref:e=>this.input=e,placeholder:g(t,a),onChange:this.onTextChanged,value:e,type:"text",autoFocus:!(0,d.vU)()&&n,children:(0,r.jsx)(i.A,{className:"filter-method right top pointing",button:!0,direction:"upward",children:(0,r.jsx)(o.A,{caption:(0,p.Tl)("Match type",a,"table.filter"),children:Object.keys(c.Od).filter(e=>isNaN(Number(e))).map(e=>this.getFilterMethod(c.Od[e],a))})})})})})}}const w=(0,s.A)(f);var m=n(83994),b=n(4425);const v=({store:e})=>{if(e.totalCount<0)return null;let t=e.totalCount;return e.totalCount!==e.rowCount&&(t=e.rowCount+"/"+e.totalCount),(0,r.jsxs)("div",{className:"count-info",children:[(0,r.jsx)(m.A,{icon:b.A.FILTER}),t]})},x=({store:e,customFilter:t,footerData:n,textFilterProps:a})=>(0,r.jsxs)("div",{className:"table-footer",children:[n,(0,r.jsxs)("div",{className:"filter item",children:[t?(0,r.jsx)(t,{store:e}):null,(0,r.jsx)(w,Object.assign({store:e},a)),(0,r.jsx)(v,{store:e})]})]});var C=n(68465),E=n(46942),D=n.n(E);class B extends a.Component{constructor(){super(...arguments),this.state={rowData:null},this.loadData=e=>this.props.dataLoader.updateRowData(e,this.onDataLoaded),this.rowDataGetter=()=>this.state.rowData,this.onDataLoaded=e=>{this.setState({rowData:e})}}componentDidMount(){this.loadData(this.props.rowIndex)}UNSAFE_componentWillReceiveProps(e){e.rowIndex!==this.props.rowIndex&&this.props.dataLoader.removePendingRequests(this.props.rowIndex,this.onDataLoaded),this.loadData(e.rowIndex)||this.setState({rowData:null})}componentWillUnmount(){this.props.dataLoader.removePendingRequests(this.props.rowIndex,this.onDataLoaded)}shouldComponentUpdate(e,t){return t.rowData!==this.state.rowData||e.width!==this.props.width}render(){const e=this.props,{columnKey:t,children:n,renderCondition:i,rowClassNameGetter:o}=e,l=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n}(e,["columnKey","children","renderCondition","rowClassNameGetter"]),{rowData:s}=this.state;if(!s)return null;if(i&&!i(s[t],s))return null;const c=D()("cell-wrapper",t,o?o(s):void 0);return(0,r.jsx)("div",{className:c,children:a.cloneElement(n,Object.assign({cellData:s[t],rowDataGetter:this.rowDataGetter},l))})}}const y=B;var _=n(44247),j=n(67749),R=n(15992),k=n(48249),U=n(16653);const S=(e,t,n,r)=>{const{name:a,columnKey:i}=e.props;let o=r((0,p._F)(i,[...(0,p.$r)(n),j.l.TABLE]),a);{const e=t.sortAscending?" ↑":" ↓";o+=t.sortProperty===i?e:""}return o},T=e=>{const t=(({store:e,viewId:t,entityId:n})=>{const r=(0,k.F)(),i=a.useRef(!0),[o,l]=(0,U.A)({debounce:i.current?0:100}),[s,c]=a.useState({}),d=a.useRef(void 0),p=a.useRef(0);a.useEffect(()=>{l.height>0&&A()},[l.height]),a.useEffect(()=>()=>{clearTimeout(d.current)},[]),a.useEffect(()=>{0!==l.height&&(e.DEBUG&&console.log(`Enabling initial scroll, entity/viewId changed (view ${t})`),i.current=!0,A())},[n,t]);const A=()=>{const{height:t}=l,n=(a=p.current,Math.max(Math.floor(a/50),0));var a;const i=function(e){return Math.ceil(e/50)}(t);e.DEBUG&&console.log(`Settings changed, start: ${n}, end: ${i}, height: ${t}`,e.viewName),console.assert(e.active,"Posting data for an inactive view"),R.A.setRange(r,e.viewUrl,n,i)};return{measureRef:o,getScrollTop:()=>i.current?e.getScrollData(t):void 0,columnWidths:s,bounds:l,onColumnClicked:t=>{let n=!0;t===e.sortProperty&&e.sortAscending&&(n=!1),R.A.setSort(r,e.viewUrl,t,n)},onColumnResizeEndCallback:(e,t)=>{c(n=>Object.assign(Object.assign({},n),{[t]:e}))},onScrollStart:(t,n)=>{e.DEBUG&&console.log(`Scrolling started: ${n}`,e.viewUrl),console.assert(e.active,"Sending pause for an inactive view"),R.A.pause(r,e.viewUrl,!0)},onScrollEnd:(n,a)=>{p.current=a,console.assert(e.active,"Sending pause for an inactive view"),R.A.pause(r,e.viewUrl,!1),clearTimeout(d.current),d.current=window.setTimeout(A,500),i.current&&(i.current=!1,e.DEBUG&&console.log(`Disabling initial scroll (view ${t})`)),e.setScrollData(a,t),e.DEBUG&&console.log(`Scrolling ended: ${a}`,e.viewUrl)},updateRowRange:A}})(e),{t:n}=(0,A.Bd)(),i=a.Children.map(e.children,i=>{if(i.props.hideWidth&&t.bounds.width>0&&i.props.hideWidth>t.bounds.width)return null;let{flexGrow:o,width:l}=i.props;const{cell:s,columnKey:c,renderCondition:p}=i.props,{store:A,rowClassNameGetter:u,moduleId:h,dataLoader:g}=e,f=(0,d.vU)();return f||c&&t.columnWidths[c]&&(l=t.columnWidths[c],o=void 0),a.cloneElement(i,{header:(0,r.jsx)(C.ry.ResizeCell,{onColumnResizeEnd:t.onColumnResizeEndCallback,children:(0,r.jsx)(_.A3,{onClick:t.onColumnClicked.bind(null,c),label:S(i,A,h,n)})}),flexGrow:o,width:l,isResizable:!f,allowCellsRecycling:!0,cell:(0,r.jsx)(y,{dataLoader:g,renderCondition:p,rowClassNameGetter:u,t:n,children:s||(0,r.jsx)(_.mz,{})})})}),{width:o,height:l}=t.bounds,{store:s}=e;return(0,r.jsx)("div",{ref:t.measureRef,className:"table-container-wrapper",children:(0,r.jsx)(C.XI,{width:o,height:l,rowHeight:50,rowsCount:s.rowCount,headerHeight:50,touchScrollEnabled:!0,onScrollStart:t.onScrollStart,onScrollEnd:t.onScrollEnd,scrollTop:t.getScrollTop(),children:i})})};var G=n(85072),O=n.n(G),I=n(97825),N=n.n(I),F=n(77659),L=n.n(F),P=n(55056),W=n.n(P),q=n(10540),$=n.n(q),M=n(41113),z=n.n(M),Y=n(56796),K={};K.styleTagTransform=z(),K.setAttributes=W(),K.insert=L().bind(null,"head"),K.domAPI=N(),K.insertStyleElement=$(),O()(Y.A,K),Y.A&&Y.A.locals&&Y.A.locals,n(56141);var X=n(46894),H=n.n(X),J=n(2404),Z=n.n(J);const Q=class{constructor(e,t,n){this._onDataLoad=t,this._store=e,this._data=[],this._pendingRequest={},this._initialDataReceived=!1,this._socket=n,this.DEBUG=e.DEBUG}clear(){this._pendingRequest={},this._data=[]}updateItem(e,t,n){let r=this._data[n];return r===t||Z()(this._data[n],t)?e:(this._data[n]=r?H()(r,{$merge:t}):H()(r,{$set:t}),e+1)}onItemsUpdated(e,t=0,n){let r=n<this._data.length;if(e&&0!==e.length){this._initialDataReceived=!0;for(let t=0;t<this._data.length;t++)e[t]||delete this._data[t];const n=e.reduce(this.updateItem.bind(this),0);(n>0||0!==t)&&(this.DEBUG&&console.log(`onItemsUpdated changed: updated ${n} items, range offset ${t}`),r=!0)}else this.clear(),r=!0,this._initialDataReceived=!1,this.DEBUG&&console.log("onItemsUpdated, cleared");r&&this._onDataLoad()}get rangeOffset(){const e=this._rangeOffset;return this._rangeOffset=0,e}getRowData(e){return this._data[e]}updateRowData(e,t){const n=this._data[e];return n?(t(n),!0):(this._initialDataReceived&&this._queueRequestFor(e,t),!1)}removePendingRequests(e){delete this._pendingRequest[e]}_queueRequestFor(e,t){const n=e-e%10,r=this._pendingRequest[e];if(r)return void r.push(t);if(this._pendingRequest[e]=[t],e!==n){if(this._pendingRequest[n])return;this._pendingRequest[n]=[]}const a=Math.min(n+10,this._store.rowCount);this._socket.get(this._store.viewUrl+"/items/"+n+"/"+a).then(this.onRowsReceived.bind(this,n)).catch(e=>{console.error("Failed to load data",e);for(let e=n;e<a;e++)this._pendingRequest[e]&&delete this._pendingRequest[e]})}onRowsReceived(e,t){if(this._pendingRequest[e])for(let n=0;n<t.length;n++){const r=e+n;Z()(this._data[r],t[n])?this.DEBUG&&console.log("onRowsReceived, row data equals",r):(this._data[r]=t[n],this._pendingRequest[r]&&this._pendingRequest[r].forEach(e=>e(t[n]))),delete this._pendingRequest[r]}}};var V=n(39364);const ee=({store:e,sessionStore:t,entityId:n,sourceFilter:r})=>{const i=(0,k.F)(),[,o]=(0,a.useReducer)(e=>e+1,0),l=(0,V.li)(e=>e.login.socketAuthenticated),s=(0,a.useMemo)(()=>new Q(e,o,i),[e]),c=(0,a.useRef)(()=>{});(0,a.useEffect)(()=>(c.current=e.listen(s.onItemsUpdated.bind(s)),()=>{c.current()}),[s,e]);return(0,a.useEffect)(()=>(R.A.init(i,e.viewUrl,n,r),R.A.setSort(i,e.viewUrl,e.sortProperty,e.sortAscending),()=>{R.A.close(i,e.viewUrl,(e=>!!l&&(!e||!t||t.getSession(e)))(n))}),[n,l]),(0,a.useEffect)(()=>{e.paused&&R.A.pause(i,e.viewUrl,!1,i),R.A.clear(i,e.viewUrl)},[e.viewUrl]),s},te=a.memo(({entityId:e,store:t,emptyRowsNodeGetter:n,customFilter:a,footerData:i,textFilterProps:o,sourceFilter:l,sessionStore:s,moduleId:c,rowClassNameGetter:d,children:p})=>{const A=ee({sessionStore:s,store:t,entityId:e,sourceFilter:l});return n&&-1===t.totalCount?(0,r.jsx)("div",{className:"virtual-table"}):n&&0===t.totalCount?n():(0,r.jsxs)("div",{className:"virtual-table",children:[(0,r.jsx)(T,{rowClassNameGetter:d,dataLoader:A,store:t,moduleId:c,viewId:t.viewId,entityId:e,children:p}),(0,r.jsx)(x,{store:t,customFilter:a,footerData:i,textFilterProps:o})]})})},15992:(e,t,n)=>{n.d(t,{A:()=>o});var r=n(22005);const a=n.n(r)().createActions([{setRange:{asyncResult:!0}},{setSort:{asyncResult:!0}},{close:{asyncResult:!0}},{pause:{asyncResult:!0}},{init:{asyncResult:!0}},"clear"]),i=(e,t,n,r)=>e.post(n+"/settings",t).then(e=>r.completed(n,e)).catch(e=>r.failed(n,e));a.close.listen(function(e,t,n){if(n){const n=this;return e.delete(t).then(e=>n.completed(t,e)).catch(e=>this.failed(t,e))}return Promise.resolve()}),a.setSort.listen(function(e,t,n,r){i(e,{sort_property:n,sort_ascending:r},t,this)}),a.setRange.listen(function(e,t,n,r){console.assert(r>0,"Invalid max rows"),i(e,{range_start:n,max_count:r},t,this)}),a.pause.listen(function(e,t,n){i(e,{paused:n},t,this)}),a.init.listen(function(e,t,n,r){r&&i(e,{source_filter:r},t,this)});const o=a},36995:(e,t,n)=>{n.d(t,{A:()=>l});var r=n(74848),a=n(96540),i=n(56484),o=n(86038);function l(e,t="any"){return(0,i.A)(n=>(a.useLayoutEffect(()=>()=>{const{store:e,filter:t,socket:r}=n;e.active&&r.delete(`${e.viewUrl}/filter/${t.id}`).catch(e=>console.error("Failed to delete table filter",e))},[]),(0,r.jsx)(e,Object.assign({},n,{onFilterUpdated:(e,r=o.Od.PARTIAL)=>{const a={pattern:e,method:r,property:t},{store:i,filter:l,socket:s}=n;s.put(`${i.viewUrl}/filter/${l.id}`,a).catch(e=>console.error("Failed to add table filter",e))}}))),{urls:{filter:({store:e},t)=>t.post(`${e.viewUrl}/filter`)},loaderText:null})}},44247:(e,t,n)=>{n.d(t,{A3:()=>m,AJ:()=>k,BH:()=>R,In:()=>y,Jo:()=>D,Jy:()=>_,K:()=>v,V9:()=>x,WQ:()=>B,kF:()=>E,mz:()=>w,qG:()=>j,tC:()=>b,us:()=>C});var r=n(74848),a=(n(96540),n(71352)),i=n(74416),o=n(39798),l=n(54895),s=n(73616),c=n(36076),d=n(68465),p=n(17911),A=n(39364),u=n(98573),h=n(50489),g=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n};const f=e=>"object"==typeof e?Array.isArray(e)?e.length:e.str:0===e?null:e,w=({cellData:e})=>(0,r.jsx)("span",{className:"plain text cell",children:f(e)}),m=e=>{var{onClick:t,label:n,columnKey:a}=e,i=g(e,["onClick","label","columnKey"]);return(0,r.jsx)(d.fh,Object.assign({},i,{children:(0,r.jsx)(h.A,{onClick:t,children:n})}))},b=e=>{var{cellData:t,rowDataGetter:n,children:i}=e,l=g(e,["cellData","rowDataGetter","children"]);return(0,r.jsx)(a.yj,Object.assign({caption:(0,r.jsx)(o.A,{typeInfo:n().type,caption:t,className:"icon-caption"}),itemData:n},l))},v=e=>{var{cellData:t,rowDataGetter:n}=e,i=g(e,["cellData","rowDataGetter"]);return(0,r.jsx)(a.yj,Object.assign({caption:t,itemData:n},i))},x=e=>{var{cellData:t,rowDataGetter:n,action:a,moduleData:i,entity:o}=e,l=g(e,["cellData","rowDataGetter","action","moduleData","entity"]);const s=(0,A.wV)();return(0,c.il)(a,n(),s)?(0,r.jsx)(p.M,{children:({onClickAction:e})=>(0,r.jsx)(h.A,{className:"plain link cell",onClick:()=>e({action:a,moduleData:i,itemData:n(),entity:o}),children:f(t)})}):(0,r.jsx)(w,Object.assign({cellData:t},l))},C=({cellData:e})=>{const{formatSize:t}=(0,i.k)();return(0,r.jsx)("span",{className:"plain size cell",children:t(e)})},E=({cellData:e})=>{const{formatSpeed:t}=(0,i.k)();return(0,r.jsx)("span",{className:"plain speed cell",children:t(e)})},D=({cellData:e})=>{const{formatRelativeTime:t}=(0,i.k)();return(0,r.jsx)("span",{className:"plain duration cell",children:t(e)})},B=({cellData:e})=>{const{formatAbbreviatedDuration:t}=(0,i.k)();return(0,r.jsx)("span",{className:"plain abbr-duration cell",children:t(e)})},y=({cellData:e})=>(0,r.jsx)(l.A,{item:e}),_=({cellData:e})=>{const{formatConnection:t}=(0,i.k)();return(0,r.jsx)("span",{className:"plain connection cell",children:t(e)})},j=({cellData:e})=>(0,r.jsx)("span",{className:"plain decimal cell",children:(0,u.zJ)(e)}),R=e=>{var{cellData:t,rowDataGetter:n,captionGetter:i,userGetter:l,downloadHandler:s}=e,c=g(e,["cellData","rowDataGetter","captionGetter","userGetter","downloadHandler"]);return(0,r.jsx)(a.Gw,Object.assign({caption:(0,r.jsx)(o.A,{typeInfo:n().type,caption:i?i(t,n):t,className:"icon-caption"}),user:l(n()),linkCaption:!i,itemInfoGetter:n,downloadHandler:s},c))},k=e=>{var{cellData:t,rowDataGetter:n,onChange:a}=e,i=g(e,["cellData","rowDataGetter","onChange"]);return(0,r.jsx)(s.A,Object.assign({checked:t,onChange:e=>a(e,n())},i))}},52267:(e,t,n)=>{n.d(t,{A:()=>o});var r=n(15992),a=n(20311),i=n.n(a);const o=(e,t=!0)=>{let n=!1,a=-1,o=0,l=0,s=[],c=null,d=!1,p=0;let A=e,u=t;const h=()=>{s=[],l=0,o=0,a=-1};return{listenables:r.A,DEBUG:!1,onClose(e,t){t===this.viewUrl&&(this._removeMessageListener(),h(),n=!1,this.trigger())},onClear(e,t){t===this.viewUrl&&(h(),this.trigger())},onPause(e,t,n){t===this.viewUrl&&(d=n)},onInit(e,t,r){t===this.viewUrl&&(i()(!n,"Trying start an active table view"),c=r,this.addMessageListener(e),n=!0)},onSetSort(e,t,n,r){t===this.viewUrl&&(A=n,u=r)},addMessageListener(e){this._removeMessageListener=e.addViewUpdateListener(this._viewName,this._handleUpdate,c)},get items(){return s},get viewUrl(){let e=this._apiUrl+"/";return c&&(e+=c+"/"),e+=this._viewName,e},get viewName(){return this._viewName},get rowCount(){return o},get totalCount(){return a},get active(){return n},get sortProperty(){return A},get sortAscending(){return u},get paused(){return d},setScrollData(e,t){this._sessionStore?this._sessionStore.scroll.setScrollData(e,c,t):p=e},getScrollData(e){return this._sessionStore?this._sessionStore.scroll.getScrollData(c,e):p},_handleUpdate(e){(e=>{var t;null!=e.range_start&&(l=e.range_start),null!=e.total_items&&(a=e.total_items),null!=e.matching_items&&(o=e.matching_items),null!=e.items&&(t=e.items,s=t.reduce((e,t,n)=>{let r=(a=t.id,s.find(e=>!!e&&e.id===a)||{id:t.id});var a;return t.properties?r=Object.assign({},r,t.properties):1===Object.keys(r).length&&console.error("No properties were sent for a new view item",r.id),e[l+n]=r,e},[]))})(e),this.trigger(s,e.range_offset,o)}}}},54895:(e,t,n)=>{n.d(t,{A:()=>o});var r=n(74848),a=(n(96540),n(73624),n(46942)),i=n.n(a);const o=({item:e})=>(0,r.jsxs)("div",{className:"ip flag",children:[(0,r.jsx)("i",{className:i()("ui flag",e.country.toLowerCase())}),e.str]})},56796:(e,t,n)=>{n.d(t,{A:()=>l});var r=n(71354),a=n.n(r),i=n(76314),o=n.n(i)()(a());o.push([e.id,"/* Generic table styles */\n.virtual-table {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.virtual-table .table-container-wrapper {\n width: 100%;\n flex: 1 1 auto;\n\n /* The table won't shrink properly without this */\n height: calc(100% - 50px);\n}\n\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\n cursor: pointer;\n}\n\n.virtual-table .fixedDataTableLayout_main {\n background-color: rgba(250, 250, 250, 0.8);\n}\n\n.virtual-table .fixedDataTableLayout_main:focus {\n outline: inherit;\n}\n\n/* Common cell content styles */\n\n.virtual-table .cell-wrapper {\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n max-height: 50px;\n padding: 5px;\n}\n\n.virtual-table .cell-wrapper .plain.cell,\n.virtual-table .cell-wrapper .empty.dropdown {\n margin: 0px 3px;\n}\n\n.virtual-table .cell-wrapper .ui.progress .bar {\n height: 5px;\n}\n\n/* Footer */\n\n.table-footer {\n width: 100%;\n padding: 5px;\n background-color: #f6f7f8;\n background-image: -webkit-linear-gradient(#fff, #efefef);\n background-image: linear-gradient(#fff, #efefef);\n display: flex;\n align-items: center;\n}\n\n.table-footer > .filter {\n margin-left: auto;\n display: flex;\n}\n\n.table-footer > .filter > .count-info {\n margin-right: 0px;\n opacity: 0.6;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.table-footer > .filter > div:last-child {\n margin-left: 10px;\n}\n\n.table-footer > .filter .filter-method.dropdown.button {\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.table-footer > .filter .dropdown .trigger.icon {\n margin-right: 0px;\n}\n\n.table-footer > .filter input {\n width: 90%;\n}\n\n/* Table dropdowns */\n.table-container-wrapper .dropdown > .popup.trigger {\n max-width: 100%;\n\n line-height: 21px;\n display: flex;\n align-items: flex-start;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption {\n max-width: calc(100% - 20px);\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption > * {\n overflow: hidden;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover,\n.public_fixedDataTableCell_main a:hover {\n cursor: pointer;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover span,\n.public_fixedDataTableCell_main a:hover {\n text-decoration: underline;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger i.angle.icon {\n margin: 0px;\n}\n\n.table-container-wrapper .dropdown .icon-caption .icon {\n width: inherit !important;\n}\n\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\n padding-left: 22px;\n}\n\n.table-container-wrapper .dropdown .trigger i {\n flex-shrink: 0;\n}\n\n/* Table dropdown popup content */\n.popup.dropdown-content {\n padding: 5px 15px;\n overflow: hidden;\n}\n\n.popup.dropdown-content .ui.dropdown.item {\n margin: 0px 0px;\n}\n\n.virtual-table .public_fixedDataTable_header .button.link,\n.public_fixedDataTableCell_main .button.link {\n color: black;\n}\n","",{version:3,sources:["webpack://./src/components/table/style.css"],names:[],mappings:"AAAA,yBAAyB;AACzB;EACE,YAAY;EACZ,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,cAAc;;EAEd,iDAAiD;EACjD,yBAAyB;AAC3B;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,0CAA0C;AAC5C;;AAEA;EACE,gBAAgB;AAClB;;AAEA,+BAA+B;;AAE/B;EACE,kBAAkB;EAClB,QAAQ;EACR,2BAA2B;EAC3B,gBAAgB;EAChB,YAAY;AACd;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,WAAW;AACb;;AAEA,WAAW;;AAEX;EACE,WAAW;EACX,YAAY;EACZ,yBAAyB;EACzB,wDAAwD;EACxD,gDAAgD;EAChD,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;EACjB,aAAa;AACf;;AAEA;EACE,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,4BAA4B;EAC5B,6BAA6B;AAC/B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,UAAU;AACZ;;AAEA,oBAAoB;AACpB;EACE,eAAe;;EAEf,iBAAiB;EACjB,aAAa;EACb,uBAAuB;AACzB;;AAEA;EACE,4BAA4B;AAC9B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,eAAe;AACjB;;AAEA;;EAEE,0BAA0B;AAC5B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,cAAc;AAChB;;AAEA,iCAAiC;AACjC;EACE,iBAAiB;EACjB,gBAAgB;AAClB;;AAEA;EACE,eAAe;AACjB;;AAEA;;EAEE,YAAY;AACd",sourcesContent:["/* Generic table styles */\n.virtual-table {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.virtual-table .table-container-wrapper {\n width: 100%;\n flex: 1 1 auto;\n\n /* The table won't shrink properly without this */\n height: calc(100% - 50px);\n}\n\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\n cursor: pointer;\n}\n\n.virtual-table .fixedDataTableLayout_main {\n background-color: rgba(250, 250, 250, 0.8);\n}\n\n.virtual-table .fixedDataTableLayout_main:focus {\n outline: inherit;\n}\n\n/* Common cell content styles */\n\n.virtual-table .cell-wrapper {\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n max-height: 50px;\n padding: 5px;\n}\n\n.virtual-table .cell-wrapper .plain.cell,\n.virtual-table .cell-wrapper .empty.dropdown {\n margin: 0px 3px;\n}\n\n.virtual-table .cell-wrapper .ui.progress .bar {\n height: 5px;\n}\n\n/* Footer */\n\n.table-footer {\n width: 100%;\n padding: 5px;\n background-color: #f6f7f8;\n background-image: -webkit-linear-gradient(#fff, #efefef);\n background-image: linear-gradient(#fff, #efefef);\n display: flex;\n align-items: center;\n}\n\n.table-footer > .filter {\n margin-left: auto;\n display: flex;\n}\n\n.table-footer > .filter > .count-info {\n margin-right: 0px;\n opacity: 0.6;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.table-footer > .filter > div:last-child {\n margin-left: 10px;\n}\n\n.table-footer > .filter .filter-method.dropdown.button {\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.table-footer > .filter .dropdown .trigger.icon {\n margin-right: 0px;\n}\n\n.table-footer > .filter input {\n width: 90%;\n}\n\n/* Table dropdowns */\n.table-container-wrapper .dropdown > .popup.trigger {\n max-width: 100%;\n\n line-height: 21px;\n display: flex;\n align-items: flex-start;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption {\n max-width: calc(100% - 20px);\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption > * {\n overflow: hidden;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover,\n.public_fixedDataTableCell_main a:hover {\n cursor: pointer;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover span,\n.public_fixedDataTableCell_main a:hover {\n text-decoration: underline;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger i.angle.icon {\n margin: 0px;\n}\n\n.table-container-wrapper .dropdown .icon-caption .icon {\n width: inherit !important;\n}\n\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\n padding-left: 22px;\n}\n\n.table-container-wrapper .dropdown .trigger i {\n flex-shrink: 0;\n}\n\n/* Table dropdown popup content */\n.popup.dropdown-content {\n padding: 5px 15px;\n overflow: hidden;\n}\n\n.popup.dropdown-content .ui.dropdown.item {\n margin: 0px 0px;\n}\n\n.virtual-table .public_fixedDataTable_header .button.link,\n.public_fixedDataTableCell_main .button.link {\n color: black;\n}\n"],sourceRoot:""}]);const l=o}}]);
|
|
2
|
+
//# sourceMappingURL=926.b8efc4bf2e958f4b5cb2.chunk.js.map
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js/926.b8efc4bf2e958f4b5cb2.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/table/TextFilter.tsx","webpack://airdcpp-webui/./src/components/table/TableFooter.tsx","webpack://airdcpp-webui/./src/components/table/RowWrapperCell.tsx","webpack://airdcpp-webui/./src/components/table/effects/useTableViewManager.ts","webpack://airdcpp-webui/./src/components/table/TableContainer.tsx","webpack://airdcpp-webui/./src/components/table/style.css?53ed","webpack://airdcpp-webui/./src/components/table/RowDataLoader.js","webpack://airdcpp-webui/./src/components/table/effects/useTableDataManager.ts","webpack://airdcpp-webui/./src/components/table/VirtualTable.tsx","webpack://airdcpp-webui/./src/actions/TableActions.js","webpack://airdcpp-webui/./src/decorators/TableFilterDecorator.tsx","webpack://airdcpp-webui/./src/components/table/Cell.tsx","webpack://airdcpp-webui/./src/mixins/ViewStoreMixin.js","webpack://airdcpp-webui/./src/components/format/FormattedIp.tsx","webpack://airdcpp-webui/./src/components/table/style.css"],"sourcesContent":["import * as React from 'react';\r\n\r\nimport SectionedDropdown from '@/components/semantic/SectionedDropdown';\r\nimport MenuSection from '@/components/semantic/MenuSection';\r\nimport MenuItemLink from '@/components/semantic/MenuItemLink';\r\n\r\nimport TableFilterDecorator, {\r\n TableFilterDecoratorChildProps,\r\n} from '@/decorators/TableFilterDecorator';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { usingMobileLayout } from '@/utils/BrowserUtils';\r\nimport { translate } from '@/utils/TranslationUtils';\r\nimport { Translation } from 'react-i18next';\r\nimport Input from '@/components/semantic/Input';\r\n\r\nconst getFilterMethodCaption = (method: API.FilterMethod) => {\r\n switch (method) {\r\n case API.FilterMethod.REGEX:\r\n return 'Regex';\r\n case API.FilterMethod.WILDCARD:\r\n return 'Wildcard';\r\n case API.FilterMethod.EXACT:\r\n return 'Exact';\r\n default:\r\n return 'Partial';\r\n }\r\n};\r\n\r\nconst filterMethodToString = (method: API.FilterMethod, t: UI.TranslateF) => {\r\n const methodTitle = getFilterMethodCaption(method);\r\n return translate(methodTitle, t, 'table.filter');\r\n};\r\n\r\nconst getPlaceholder = (method: API.FilterMethod, t: UI.TranslateF) => {\r\n let ret = t('table.filter.filter', 'Filter');\r\n if (method !== API.FilterMethod.PARTIAL) {\r\n ret += ` (${filterMethodToString(method, t).toLowerCase()})`;\r\n }\r\n\r\n return ret + '...';\r\n};\r\n\r\nexport interface TextFilterProps {\r\n autoFocus?: boolean;\r\n}\r\n\r\nclass TextFilter extends React.PureComponent<\r\n TextFilterProps & TableFilterDecoratorChildProps\r\n> {\r\n state = {\r\n value: '',\r\n method: API.FilterMethod.PARTIAL,\r\n };\r\n\r\n timer: number | undefined;\r\n input: HTMLInputElement;\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.timer);\r\n }\r\n\r\n onFilterUpdated = () => {\r\n const { value, method } = this.state;\r\n this.props.onFilterUpdated(value, method);\r\n };\r\n\r\n onTextChanged = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({\r\n value: event.target.value,\r\n });\r\n\r\n clearTimeout(this.timer);\r\n\r\n this.timer = window.setTimeout(() => {\r\n this.onFilterUpdated();\r\n }, 200);\r\n };\r\n\r\n onMethodChanged = (method: API.FilterMethod) => {\r\n this.setState({\r\n method,\r\n });\r\n\r\n setTimeout(() => this.onFilterUpdated());\r\n this.input.focus();\r\n };\r\n\r\n getFilterMethod = (method: API.FilterMethod, t: UI.TranslateF) => {\r\n const isCurrent = method === this.state.method;\r\n return (\r\n <MenuItemLink\r\n key={method}\r\n onClick={() => this.onMethodChanged(method)}\r\n active={isCurrent}\r\n >\r\n {filterMethodToString(method, t)}\r\n </MenuItemLink>\r\n );\r\n };\r\n\r\n render() {\r\n const { value, method } = this.state;\r\n const { autoFocus } = this.props;\r\n return (\r\n <Translation>\r\n {(t) => (\r\n <div className=\"text-filter\">\r\n <Input\r\n ref={(c: any) => (this.input = c)}\r\n placeholder={getPlaceholder(method, t)}\r\n onChange={this.onTextChanged}\r\n value={value}\r\n type=\"text\"\r\n // autoFocus shouldn't be enabled for main layout tables as the table may initially be empty\r\n // and the filter would steal focus when appearing (possibly even when the sidebar is open)\r\n autoFocus={usingMobileLayout() ? false : autoFocus}\r\n >\r\n <SectionedDropdown\r\n className=\"filter-method right top pointing\"\r\n button={true}\r\n direction=\"upward\"\r\n >\r\n <MenuSection caption={translate('Match type', t, 'table.filter')}>\r\n {Object.keys(API.FilterMethod)\r\n .filter((key) => isNaN(Number(key)))\r\n .map((key) =>\r\n this.getFilterMethod(\r\n API.FilterMethod[key as keyof typeof API.FilterMethod],\r\n t,\r\n ),\r\n )}\r\n </MenuSection>\r\n </SectionedDropdown>\r\n </Input>\r\n </div>\r\n )}\r\n </Translation>\r\n );\r\n }\r\n}\r\n\r\nexport default TableFilterDecorator<TextFilterProps>(TextFilter);\r\n","import * as React from 'react';\n\nimport TextFilter, { TextFilterProps } from './TextFilter';\nimport Icon from '@/components/semantic/Icon';\nimport IconConstants from '@/constants/IconConstants';\nimport { TableFilterDecoratorProps } from '@/decorators/TableFilterDecorator';\n\nconst CountInfo: React.FC<{ store: any }> = ({ store }) => {\n if (store.totalCount < 0) {\n // Not initialized yet\n return null;\n }\n\n let ret = store.totalCount;\n if (store.totalCount !== store.rowCount) {\n ret = store.rowCount + '/' + store.totalCount;\n }\n\n return (\n <div className=\"count-info\">\n <Icon icon={IconConstants.FILTER} />\n {ret}\n </div>\n );\n};\n\nexport type CustomTableFilter = React.ComponentType<TableFilterDecoratorProps>;\n\nexport interface TableFooterProps {\n // Elements to append to the table footer\n footerData?: React.ReactNode;\n\n // Custom filter that will be displayed in addition to regular text filter\n customFilter?: CustomTableFilter;\n\n store: any;\n textFilterProps?: TextFilterProps;\n}\n\nconst TableFooter: React.FC<TableFooterProps> = ({\n store,\n customFilter: CustomFilter,\n footerData,\n textFilterProps,\n}) => (\n <div className=\"table-footer\">\n {footerData}\n <div className=\"filter item\">\n {!CustomFilter ? null : <CustomFilter store={store} />}\n <TextFilter store={store} {...textFilterProps} />\n <CountInfo store={store} />\n </div>\n </div>\n);\n\nexport default TableFooter;\n","import * as React from 'react';\r\nimport { CellProps } from 'fixed-data-table-2';\r\n\r\nimport * as UI from '@/types/ui';\r\nimport classNames from 'classnames';\r\n\r\nexport interface RowWrapperCellChildProps<\r\n CellDataT,\r\n RowDataT extends UI.ActionMenuItemDataValueType,\r\n> extends CellProps {\r\n cellData?: CellDataT;\r\n rowDataGetter?: () => RowDataT;\r\n rowData?: RowDataT;\r\n t?: UI.TranslateF;\r\n}\r\n\r\nexport interface RowWrapperCellProps extends CellProps {\r\n dataLoader: any;\r\n\r\n renderCondition?: (columnData: any, rowData: any) => boolean;\r\n rowClassNameGetter?: (rowData: any) => string;\r\n columnKey?: string; // REQUIRED, CLONED\r\n\r\n children: React.ReactElement<any>;\r\n t: UI.TranslateF;\r\n}\r\n\r\ninterface State {\r\n rowData: any;\r\n}\r\n\r\n// Generic wrapper for all cells that will handle data loading\r\nclass RowWrapperCell extends React.Component<RowWrapperCellProps> {\r\n state: State = {\r\n rowData: null,\r\n };\r\n\r\n componentDidMount() {\r\n this.loadData(this.props.rowIndex!);\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: RowWrapperCellProps) {\r\n if (nextProps.rowIndex !== this.props.rowIndex) {\r\n // Remove pending update callbacks to avoid rendering each of them when the data is received\r\n // (there can be lots of pending requests when scrolling for long distances)\r\n this.props.dataLoader.removePendingRequests(this.props.rowIndex, this.onDataLoaded);\r\n }\r\n\r\n // Check if there is new data available (rowIndex may have changed as well)\r\n if (!this.loadData(nextProps.rowIndex!)) {\r\n // Avoid displaying old data\r\n this.setState({ rowData: null });\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.dataLoader.removePendingRequests(this.props.rowIndex, this.onDataLoaded);\r\n }\r\n\r\n loadData = (rowIndex: number) => {\r\n return this.props.dataLoader.updateRowData(rowIndex, this.onDataLoaded);\r\n };\r\n\r\n shouldComponentUpdate(nextProps: RowWrapperCellProps, nextState: State) {\r\n return (\r\n nextState.rowData !== this.state.rowData || nextProps.width !== this.props.width\r\n );\r\n }\r\n\r\n rowDataGetter = () => {\r\n return this.state.rowData;\r\n };\r\n\r\n onDataLoaded = (data: any) => {\r\n this.setState({ rowData: data });\r\n };\r\n\r\n render() {\r\n const { columnKey, children, renderCondition, rowClassNameGetter, ...other } =\r\n this.props;\r\n const { rowData } = this.state;\r\n\r\n if (!rowData) {\r\n return null;\r\n }\r\n\r\n if (renderCondition && !renderCondition(rowData[columnKey!], rowData)) {\r\n return null;\r\n }\r\n\r\n const className = classNames(\r\n 'cell-wrapper',\r\n columnKey,\r\n rowClassNameGetter ? rowClassNameGetter(rowData) : undefined,\r\n );\r\n\r\n return (\r\n <div className={className}>\r\n {React.cloneElement(children, {\r\n cellData: rowData[columnKey!],\r\n\r\n // Don't pass the actual row data to allow cells to skip\r\n // re-rendering using shallow equality checks when the row data is\r\n // updated without leaving them with an outdated item data\r\n rowDataGetter: this.rowDataGetter,\r\n ...other,\r\n })}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default RowWrapperCell;\r\n","import * as React from 'react';\r\n\r\nimport TableActions from '@/actions/TableActions';\r\n\r\nimport * as API from '@/types/api';\r\n\r\nimport { useSocket } from '@/context/SocketContext';\r\nimport useMeasure from 'react-use-measure';\r\n\r\nconst TABLE_ROW_HEIGHT = 50;\r\n\r\nfunction convertStartToRows(pixels: number) {\r\n return Math.max(Math.floor(pixels / TABLE_ROW_HEIGHT), 0);\r\n}\r\n\r\nfunction convertEndToRows(pixels: number) {\r\n return Math.ceil(pixels / TABLE_ROW_HEIGHT);\r\n}\r\n\r\nexport type TableViewManagerProps = {\r\n // ID of the current entity for non-singleton sources\r\n entityId?: API.IdType;\r\n\r\n // Store implementing ViewStoreMixin that contains the items\r\n store: any;\r\n\r\n // Possible ID of the current view (items will be cleared when the ID changes)\r\n viewId?: number | string;\r\n};\r\n\r\ntype ColumnWidths = Record<string, number>;\r\n\r\nexport const useTableViewManager = ({\r\n store,\r\n viewId,\r\n entityId,\r\n}: TableViewManagerProps) => {\r\n const socket = useSocket();\r\n\r\n const setInitialScrollRow = React.useRef(true);\r\n const [measureRef, bounds] = useMeasure({\r\n debounce: setInitialScrollRow.current ? 0 : 100,\r\n });\r\n\r\n const [columnWidths, setColumnWidths] = React.useState<ColumnWidths>({});\r\n\r\n const scrollTimer = React.useRef<number | undefined>(undefined);\r\n const scrollPosition = React.useRef(0);\r\n\r\n React.useEffect(() => {\r\n if (bounds.height > 0) {\r\n updateRowRange();\r\n }\r\n }, [bounds.height]);\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n clearTimeout(scrollTimer.current);\r\n };\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n if (bounds.height === 0) {\r\n return;\r\n }\r\n\r\n if (store.DEBUG) {\r\n console.log(`Enabling initial scroll, entity/viewId changed (view ${viewId})`);\r\n }\r\n\r\n setInitialScrollRow.current = true;\r\n updateRowRange();\r\n }, [entityId, viewId]);\r\n\r\n const updateRowRange = () => {\r\n const { height } = bounds;\r\n\r\n const startRows = convertStartToRows(scrollPosition.current);\r\n const maxRows = convertEndToRows(height);\r\n\r\n if (store.DEBUG) {\r\n console.log(\r\n `Settings changed, start: ${startRows}, end: ${maxRows}, height: ${height}`,\r\n store.viewName,\r\n );\r\n }\r\n\r\n console.assert(store.active, 'Posting data for an inactive view');\r\n TableActions.setRange(socket, store.viewUrl, startRows, maxRows);\r\n };\r\n\r\n const onScrollStart = (horizontal: number, vertical: number) => {\r\n if (store.DEBUG) {\r\n console.log(`Scrolling started: ${vertical}`, store.viewUrl);\r\n }\r\n\r\n console.assert(store.active, 'Sending pause for an inactive view');\r\n TableActions.pause(socket, store.viewUrl, true);\r\n };\r\n\r\n const onScrollEnd = (horizontal: number, vertical: number) => {\r\n scrollPosition.current = vertical;\r\n console.assert(store.active, 'Sending pause for an inactive view');\r\n TableActions.pause(socket, store.viewUrl, false);\r\n\r\n clearTimeout(scrollTimer.current);\r\n scrollTimer.current = window.setTimeout(updateRowRange, 500);\r\n\r\n if (setInitialScrollRow.current) {\r\n setInitialScrollRow.current = false;\r\n\r\n if (store.DEBUG) {\r\n console.log(`Disabling initial scroll (view ${viewId})`);\r\n }\r\n }\r\n\r\n store.setScrollData(vertical, viewId);\r\n if (store.DEBUG) {\r\n console.log(`Scrolling ended: ${vertical}`, store.viewUrl);\r\n }\r\n };\r\n\r\n const onColumnClicked = (sortProperty: string) => {\r\n let sortAscending = true;\r\n if (sortProperty === store.sortProperty && store.sortAscending) {\r\n sortAscending = false;\r\n }\r\n\r\n TableActions.setSort(socket, store.viewUrl, sortProperty, sortAscending);\r\n };\r\n\r\n const onColumnResizeEndCallback = (newColumnWidth: number, columnKey: string) => {\r\n setColumnWidths((prevWidths) => ({\r\n ...prevWidths,\r\n [columnKey]: newColumnWidth,\r\n }));\r\n };\r\n\r\n const getScrollTop = () => {\r\n return setInitialScrollRow.current ? store.getScrollData(viewId) : undefined;\r\n };\r\n\r\n return {\r\n measureRef,\r\n getScrollTop,\r\n\r\n columnWidths,\r\n bounds,\r\n\r\n onColumnClicked,\r\n onColumnResizeEndCallback,\r\n\r\n onScrollStart,\r\n onScrollEnd,\r\n\r\n updateRowRange,\r\n };\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { Table, ColumnProps, Plugins } from 'fixed-data-table-2';\r\n\r\nimport { usingMobileLayout } from '@/utils/BrowserUtils';\r\n\r\nimport RowWrapperCell from '@/components/table/RowWrapperCell';\r\nimport { TextCell, HeaderCell } from '@/components/table/Cell';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\nimport { textToI18nKey, toArray } from '@/utils/TranslationUtils';\r\nimport { useTableViewManager } from './effects/useTableViewManager';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport type RowClassNameGetter = (rowData: any) => string;\r\n\r\nexport interface TableContainerProps {\r\n // ID of the current entity for non-singleton sources\r\n entityId: API.IdType | undefined;\r\n\r\n // Append class names to row (takes row data as param)\r\n rowClassNameGetter: RowClassNameGetter | undefined;\r\n\r\n // Store implementing ViewStoreMixin that contains the items\r\n store: any;\r\n\r\n dataLoader: any;\r\n\r\n moduleId: string | string[];\r\n\r\n // Possible ID of the current view (items will be cleared when the ID changes)\r\n viewId: number | string | undefined;\r\n\r\n children: React.ReactNode;\r\n}\r\n\r\nconst formatColumnName = (\r\n column: React.ReactElement<ColumnProps>,\r\n store: any,\r\n moduleId: string | string[],\r\n t: UI.TranslateF,\r\n) => {\r\n const { name, columnKey } = column.props;\r\n let displayName = t(\r\n textToI18nKey(columnKey as string, [...toArray(moduleId), UI.SubNamespaces.TABLE]),\r\n name,\r\n );\r\n\r\n {\r\n const sortDirArrow = store.sortAscending ? ' ↑' : ' ↓';\r\n displayName += store.sortProperty === columnKey ? sortDirArrow : '';\r\n }\r\n\r\n return displayName;\r\n};\r\n\r\nconst TableContainer: React.FC<TableContainerProps> = (props) => {\r\n const viewManager = useTableViewManager(props);\r\n const { t } = useTranslation();\r\n\r\n const childToColumn = (column: React.ReactElement<ColumnProps>) => {\r\n if (\r\n !!column.props.hideWidth &&\r\n viewManager.bounds.width > 0 &&\r\n column.props.hideWidth > viewManager.bounds.width\r\n ) {\r\n return null;\r\n }\r\n\r\n let { flexGrow, width } = column.props;\r\n const { cell, columnKey, renderCondition } = column.props;\r\n const { store, rowClassNameGetter, moduleId, dataLoader } = props;\r\n\r\n const mobileView = usingMobileLayout();\r\n if (!mobileView) {\r\n // Get column width\r\n if (!!columnKey && !!viewManager.columnWidths[columnKey]) {\r\n width = viewManager.columnWidths[columnKey];\r\n flexGrow = undefined;\r\n }\r\n }\r\n\r\n return React.cloneElement(column, {\r\n header: (\r\n <Plugins.ResizeCell onColumnResizeEnd={viewManager.onColumnResizeEndCallback}>\r\n <HeaderCell\r\n onClick={viewManager.onColumnClicked.bind(null, columnKey)}\r\n label={formatColumnName(column, store, moduleId, t)}\r\n />\r\n </Plugins.ResizeCell>\r\n ),\r\n flexGrow,\r\n width,\r\n isResizable: !mobileView,\r\n allowCellsRecycling: true,\r\n cell: (\r\n <RowWrapperCell\r\n dataLoader={dataLoader}\r\n renderCondition={renderCondition}\r\n rowClassNameGetter={rowClassNameGetter}\r\n t={t}\r\n >\r\n {cell ? (cell as React.ReactElement<any>) : <TextCell />}\r\n </RowWrapperCell>\r\n ),\r\n });\r\n };\r\n\r\n // Update and insert generic columns props\r\n const children = React.Children.map(props.children, childToColumn);\r\n\r\n const { width, height } = viewManager.bounds;\r\n const { store } = props;\r\n return (\r\n <div ref={viewManager.measureRef} className=\"table-container-wrapper\">\r\n <Table\r\n width={width}\r\n height={height}\r\n rowHeight={50}\r\n rowsCount={store.rowCount}\r\n headerHeight={50}\r\n touchScrollEnabled={true}\r\n onScrollStart={viewManager.onScrollStart}\r\n onScrollEnd={viewManager.onScrollEnd}\r\n scrollTop={viewManager.getScrollTop()}\r\n >\r\n {children}\r\n </Table>\r\n </div>\r\n );\r\n};\r\n\r\nexport default TableContainer;\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 update from 'immutability-helper';\r\n\r\nimport isEqual from 'lodash/isEqual';\r\n\r\nconst NUMBER_OF_ROWS_PER_REQUEST = 10;\r\n\r\n// This will handle fetching only when scrolling. Otherwise the data will be updated through the socket listener.\r\nclass RowDataLoader {\r\n constructor(store, onDataLoad, socket) {\r\n this._onDataLoad = onDataLoad;\r\n this._store = store;\r\n this._data = [];\r\n this._pendingRequest = {};\r\n this._initialDataReceived = false;\r\n this._socket = socket;\r\n this.DEBUG = store.DEBUG;\r\n }\r\n\r\n clear() {\r\n this._pendingRequest = {};\r\n this._data = [];\r\n }\r\n\r\n // Returns true if the item was updated\r\n updateItem(updated, item, index) {\r\n let old = this._data[index];\r\n\r\n // Objects equal most of the time\r\n if (old === item || isEqual(this._data[index], item)) {\r\n return updated;\r\n }\r\n\r\n // console.log(`Updating row data at index ${index}`, item);\r\n if (old) {\r\n this._data[index] = update(old, { $merge: item });\r\n } else {\r\n this._data[index] = update(old, { $set: item });\r\n }\r\n\r\n return updated + 1;\r\n }\r\n\r\n onItemsUpdated(items, rangeOffset = 0, rowCount) {\r\n // Rows removed?\r\n let hasChanges = rowCount < this._data.length;\r\n\r\n if (!items || items.length === 0) {\r\n // The view was cleared\r\n this.clear();\r\n hasChanges = true;\r\n\r\n this._initialDataReceived = false;\r\n\r\n if (this.DEBUG) {\r\n console.log('onItemsUpdated, cleared');\r\n }\r\n } else {\r\n this._initialDataReceived = true;\r\n\r\n // Remove rows outside the range\r\n // Leave the current range in case all old items can be reused\r\n // (avoids flickering because there is no need to re-render)\r\n for (let i = 0; i < this._data.length; i++) {\r\n if (!items[i]) {\r\n delete this._data[i];\r\n }\r\n }\r\n\r\n // Update rows\r\n const updatedCount = items.reduce(this.updateItem.bind(this), 0);\r\n if (updatedCount > 0 || rangeOffset !== 0) {\r\n if (this.DEBUG) {\r\n console.log(\r\n `onItemsUpdated changed: updated ${updatedCount} items, range offset ${rangeOffset}`,\r\n );\r\n }\r\n\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n if (hasChanges) {\r\n this._onDataLoad();\r\n }\r\n }\r\n\r\n get rangeOffset() {\r\n const ret = this._rangeOffset;\r\n this._rangeOffset = 0;\r\n return ret;\r\n }\r\n\r\n getRowData(rowIndex) {\r\n return this._data[rowIndex];\r\n }\r\n\r\n // onDataLoaded is called when the data is ready\r\n updateRowData(rowIndex, onDataLoaded) {\r\n const rowData = this._data[rowIndex];\r\n if (!rowData) {\r\n if (this._initialDataReceived) {\r\n this._queueRequestFor(rowIndex, onDataLoaded);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n onDataLoaded(rowData);\r\n return true;\r\n }\r\n\r\n removePendingRequests(rowIndex) {\r\n delete this._pendingRequest[rowIndex];\r\n }\r\n\r\n _queueRequestFor(rowIndex, onDataLoaded) {\r\n const rowBase = rowIndex - (rowIndex % NUMBER_OF_ROWS_PER_REQUEST);\r\n\r\n const request = this._pendingRequest[rowIndex];\r\n if (request) {\r\n request.push(onDataLoaded);\r\n return;\r\n }\r\n\r\n this._pendingRequest[rowIndex] = [onDataLoaded];\r\n if (rowIndex !== rowBase) {\r\n if (this._pendingRequest[rowBase]) {\r\n return;\r\n }\r\n\r\n this._pendingRequest[rowBase] = [];\r\n }\r\n\r\n const endRow = Math.min(rowBase + NUMBER_OF_ROWS_PER_REQUEST, this._store.rowCount);\r\n this._socket\r\n .get(this._store.viewUrl + '/items/' + rowBase + '/' + endRow)\r\n .then(this.onRowsReceived.bind(this, rowBase))\r\n .catch((error) => {\r\n console.error('Failed to load data', error);\r\n for (let i = rowBase; i < endRow; i++) {\r\n if (this._pendingRequest[i]) {\r\n delete this._pendingRequest[i];\r\n }\r\n }\r\n });\r\n }\r\n\r\n onRowsReceived(start, rows) {\r\n if (!this._pendingRequest[start]) {\r\n // View changed\r\n return;\r\n }\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n const rowIndex = start + i;\r\n if (!isEqual(this._data[rowIndex], rows[i])) {\r\n this._data[rowIndex] = rows[i];\r\n\r\n if (this._pendingRequest[rowIndex]) {\r\n this._pendingRequest[rowIndex].forEach((f) => f(rows[i]));\r\n }\r\n } else if (this.DEBUG) {\r\n console.log('onRowsReceived, row data equals', rowIndex);\r\n }\r\n\r\n delete this._pendingRequest[rowIndex];\r\n }\r\n }\r\n}\r\n\r\nexport default RowDataLoader;\r\n","import { useEffect, useMemo, useReducer, useRef } from 'react';\r\n\r\nimport TableActions from '@/actions/TableActions';\r\n\r\nimport RowDataLoader from '../RowDataLoader';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { useSocket } from '@/context/SocketContext';\r\nimport { useAppStoreProperty } from '@/context/AppStoreContext';\r\n\r\nexport interface TableManagerProps {\r\n store: any;\r\n\r\n // Store containing sessions (must be provided together with entityId)\r\n sessionStore?: UI.SessionSlice<UI.SessionItem>;\r\n\r\n entityId?: API.IdType | undefined;\r\n\r\n // Filter that is always applied for source items (those will never be displayed or included in the total count)\r\n sourceFilter?: API.TableFilter;\r\n}\r\n\r\nexport const useTableDataManager = ({\r\n store,\r\n sessionStore,\r\n entityId,\r\n sourceFilter,\r\n}: TableManagerProps) => {\r\n const socket = useSocket();\r\n const [, forceUpdate] = useReducer((x) => x + 1, 0);\r\n const socketAuthenticated = useAppStoreProperty(\r\n (store) => store.login.socketAuthenticated,\r\n );\r\n const dataLoader = useMemo(\r\n () => new RowDataLoader(store, forceUpdate, socket),\r\n [store],\r\n );\r\n\r\n const unsubscribe = useRef<() => void>(() => {});\r\n\r\n useEffect(() => {\r\n unsubscribe.current = store.listen(dataLoader.onItemsUpdated.bind(dataLoader));\r\n return () => {\r\n unsubscribe.current();\r\n };\r\n }, [dataLoader, store]);\r\n\r\n const moduleExists = (entityId: API.IdType | undefined) => {\r\n if (!socketAuthenticated) {\r\n return false;\r\n }\r\n\r\n if (!entityId || !sessionStore) {\r\n return true;\r\n }\r\n\r\n return sessionStore.getSession(entityId);\r\n };\r\n\r\n const start = (/*entityId: API.IdType | undefined*/) => {\r\n TableActions.init(socket, store.viewUrl, entityId, sourceFilter);\r\n TableActions.setSort(socket, store.viewUrl, store.sortProperty, store.sortAscending);\r\n };\r\n\r\n const close = () => {\r\n // Don't send the close command if the session was removed\r\n TableActions.close(socket, store.viewUrl, moduleExists(entityId));\r\n };\r\n\r\n useEffect(() => {\r\n start();\r\n return () => {\r\n close();\r\n };\r\n }, [entityId, socketAuthenticated]);\r\n\r\n useEffect(() => {\r\n if (store.paused) {\r\n // We need to receive the new items\r\n TableActions.pause(socket, store.viewUrl, false, socket);\r\n }\r\n\r\n TableActions.clear(socket, store.viewUrl);\r\n }, [store.viewUrl]);\r\n\r\n return dataLoader;\r\n};\r\n","import * as React from 'react';\r\n\r\nimport TableFooter, { TableFooterProps } from './TableFooter';\r\nimport TableContainer, {\r\n RowClassNameGetter,\r\n TableContainerProps,\r\n} from './TableContainer';\r\n\r\nimport './style.css';\r\nimport 'fixed-data-table-2/dist/fixed-data-table.css';\r\n\r\nimport * as API from '@/types/api';\r\n\r\nimport { TableManagerProps, useTableDataManager } from './effects/useTableDataManager';\r\n\r\ndeclare module 'fixed-data-table-2' {\r\n export interface ColumnProps {\r\n name: string;\r\n hideWidth?: number;\r\n renderCondition?: (cellData: any, rowData: any) => boolean;\r\n }\r\n}\r\n\r\ntype EmptyRowsNodeGetter = () => React.ReactNode;\r\n\r\nexport type VirtualTableProps = Omit<TableFooterProps, 't'> &\r\n Pick<TableContainerProps, 'moduleId'> &\r\n TableManagerProps &\r\n React.PropsWithChildren<{\r\n // Returns a node to render if there are no rows to display\r\n emptyRowsNodeGetter?: EmptyRowsNodeGetter;\r\n\r\n entityId?: API.IdType;\r\n\r\n viewId?: number | string;\r\n\r\n rowClassNameGetter?: RowClassNameGetter;\r\n }>;\r\n\r\nconst VirtualTable = React.memo<VirtualTableProps>(\r\n ({\r\n entityId,\r\n store,\r\n emptyRowsNodeGetter,\r\n customFilter,\r\n footerData,\r\n textFilterProps,\r\n sourceFilter,\r\n sessionStore,\r\n moduleId,\r\n rowClassNameGetter,\r\n children,\r\n }) => {\r\n const dataLoader = useTableDataManager({\r\n sessionStore,\r\n store,\r\n entityId,\r\n sourceFilter,\r\n });\r\n\r\n if (emptyRowsNodeGetter && store.totalCount === -1) {\r\n // Row count is unknown, don't flash the table\r\n return <div className=\"virtual-table\" />;\r\n }\r\n\r\n if (emptyRowsNodeGetter && store.totalCount === 0) {\r\n return emptyRowsNodeGetter();\r\n }\r\n\r\n return (\r\n <div className=\"virtual-table\">\r\n <TableContainer\r\n rowClassNameGetter={rowClassNameGetter}\r\n dataLoader={dataLoader}\r\n store={store}\r\n moduleId={moduleId}\r\n viewId={store.viewId}\r\n entityId={entityId}\r\n >\r\n {children}\r\n </TableContainer>\r\n\r\n <TableFooter\r\n store={store}\r\n customFilter={customFilter}\r\n footerData={footerData}\r\n textFilterProps={textFilterProps}\r\n />\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nexport default VirtualTable;\r\n","import Reflux from 'reflux';\r\n\r\nconst TableActions = Reflux.createActions([\r\n { setRange: { asyncResult: true } },\r\n { setSort: { asyncResult: true } },\r\n { close: { asyncResult: true } },\r\n { pause: { asyncResult: true } },\r\n { init: { asyncResult: true } },\r\n 'clear',\r\n]);\r\n\r\nconst postSettings = (socket, settings, viewUrl, action) => {\r\n return socket\r\n .post(viewUrl + '/settings', settings)\r\n .then((data) => action.completed(viewUrl, data))\r\n .catch((error) => action.failed(viewUrl, error));\r\n};\r\n\r\nTableActions.close.listen(function (socket, viewUrl, sessionExists) {\r\n if (sessionExists) {\r\n const that = this;\r\n return socket\r\n .delete(viewUrl)\r\n .then((data) => that.completed(viewUrl, data))\r\n .catch((error) => this.failed(viewUrl, error));\r\n }\r\n\r\n return Promise.resolve();\r\n});\r\n\r\nTableActions.setSort.listen(function (socket, viewUrl, sortProperty, sortAscending) {\r\n postSettings(\r\n socket,\r\n {\r\n sort_property: sortProperty,\r\n sort_ascending: sortAscending,\r\n },\r\n viewUrl,\r\n this,\r\n );\r\n});\r\n\r\nTableActions.setRange.listen(function (socket, viewUrl, rangeStart, maxRows) {\r\n console.assert(maxRows > 0, 'Invalid max rows');\r\n postSettings(\r\n socket,\r\n {\r\n range_start: rangeStart,\r\n max_count: maxRows,\r\n },\r\n viewUrl,\r\n this,\r\n );\r\n});\r\n\r\nTableActions.pause.listen(function (socket, viewUrl, pause) {\r\n postSettings(\r\n socket,\r\n {\r\n paused: pause,\r\n },\r\n viewUrl,\r\n this,\r\n );\r\n});\r\n\r\nTableActions.init.listen(function (socket, viewUrl, entityId, filterData) {\r\n if (filterData) {\r\n postSettings(\r\n socket,\r\n {\r\n source_filter: filterData,\r\n },\r\n viewUrl,\r\n this,\r\n );\r\n }\r\n});\r\n\r\nexport default TableActions;\r\n","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from '@/decorators/DataProviderDecorator';\r\n\r\nimport * as API from '@/types/api';\r\nimport { ErrorResponse } from 'airdcpp-apisocket';\r\n\r\ninterface FilterType {\r\n id: number;\r\n}\r\n\r\nexport interface TableFilterDecoratorProps {\r\n store: any;\r\n}\r\n\r\nexport interface TableFilterDecoratorDataProps {\r\n filter: FilterType;\r\n}\r\n\r\nexport interface TableFilterDecoratorChildProps {\r\n onFilterUpdated: (value: string | number | null, method?: API.FilterMethod) => void;\r\n}\r\n\r\nexport default function <PropsT>(\r\n Component: React.ComponentType<PropsT & TableFilterDecoratorChildProps>,\r\n propertyName = 'any',\r\n) {\r\n type Props = PropsT &\r\n TableFilterDecoratorProps &\r\n DataProviderDecoratorChildProps &\r\n TableFilterDecoratorDataProps;\r\n\r\n const TableFilterDecorator = (props: Props) => {\r\n const onFilterUpdated = (\r\n pattern: string,\r\n method: API.FilterMethod = API.FilterMethod.PARTIAL,\r\n ) => {\r\n const data = {\r\n pattern,\r\n method,\r\n property: propertyName,\r\n } as API.TableFilter;\r\n\r\n const { store, filter, socket } = props;\r\n socket\r\n .put(`${store.viewUrl}/filter/${filter.id}`, data)\r\n .catch((error: ErrorResponse) =>\r\n console.error('Failed to add table filter', error),\r\n );\r\n };\r\n\r\n React.useLayoutEffect(() => {\r\n return () => {\r\n const { store, filter, socket } = props;\r\n if (!store.active) {\r\n return;\r\n }\r\n\r\n socket\r\n .delete(`${store.viewUrl}/filter/${filter.id}`)\r\n .catch((error: ErrorResponse) =>\r\n console.error('Failed to delete table filter', error),\r\n );\r\n };\r\n }, []);\r\n\r\n return <Component {...props} onFilterUpdated={onFilterUpdated} />;\r\n };\r\n\r\n return DataProviderDecorator<\r\n PropsT & TableFilterDecoratorProps,\r\n TableFilterDecoratorDataProps\r\n >(TableFilterDecorator, {\r\n urls: {\r\n filter: ({ store }, socket) => socket.post(`${store.viewUrl}/filter`),\r\n },\r\n loaderText: null,\r\n });\r\n}\r\n","import * as React from 'react';\r\n\r\nimport {\r\n TableActionMenu,\r\n TableDownloadMenu,\r\n TableActionMenuProps,\r\n TableDownloadMenuProps,\r\n} from '@/components/action-menu';\r\nimport { useFormatter } from '@/context/FormatterContext';\r\n\r\nimport FormattedFile from '@/components/format/FormattedFile';\r\nimport FormattedIp from '@/components/format/FormattedIp';\r\n\r\nimport Checkbox, { CheckboxProps } from '@/components/semantic/Checkbox';\r\nimport { showAction } from '@/utils/ActionUtils';\r\nimport { Cell, CellProps } from 'fixed-data-table-2';\r\nimport { RowWrapperCellChildProps } from '@/components/table/RowWrapperCell';\r\n\r\nimport * as UI from '@/types/ui';\r\nimport * as API from '@/types/api';\r\nimport { ActionHandlerDecorator } from '@/decorators/ActionHandlerDecorator';\r\nimport { useSession } from '@/context/AppStoreContext';\r\nimport { formatDecimal } from '@/utils/ValueFormat';\r\nimport LinkButton from '@/components/semantic/LinkButton';\r\n\r\nconst getCellContent = (cellData: any) => {\r\n if (typeof cellData === 'object') {\r\n return Array.isArray(cellData) ? cellData.length : cellData.str;\r\n }\r\n\r\n if (cellData === 0) {\r\n return null;\r\n }\r\n\r\n return cellData;\r\n};\r\n\r\n// Default cell\r\nexport const TextCell = ({ cellData }: { cellData?: any }) => (\r\n <span className=\"plain text cell\">{getCellContent(cellData)}</span>\r\n);\r\n\r\n// Column header\r\ninterface HeaderCellProps extends CellProps {\r\n onClick: () => void;\r\n label: React.ReactNode;\r\n columnKey?: string; // REQUIRED, CLONED\r\n}\r\n\r\nexport const HeaderCell = ({ onClick, label, columnKey, ...props }: HeaderCellProps) => (\r\n <Cell {...props}>\r\n <LinkButton onClick={onClick}>{label}</LinkButton>\r\n </Cell>\r\n);\r\n\r\nexport interface ActionCellProps<\r\n CellDataT,\r\n ItemDataT extends UI.ActionMenuItemDataValueType,\r\n EntityT extends UI.ActionMenuItemEntityValueType,\r\n> extends Omit<RowWrapperCellChildProps<CellDataT, ItemDataT>, 't' | 'children'>,\r\n Omit<TableActionMenuProps<ItemDataT, EntityT>, 'caption' | 'itemData'> {}\r\n\r\ninterface FileItemBase {\r\n type: API.FileItemType;\r\n}\r\n\r\nexport const FileActionCell = <\r\n CellDataT extends React.ReactNode,\r\n ItemDataT extends UI.ActionMenuItemDataValueType & FileItemBase,\r\n EntityT extends UI.ActionMenuItemEntityValueType,\r\n>({\r\n cellData,\r\n rowDataGetter,\r\n children,\r\n ...props\r\n}: ActionCellProps<CellDataT, ItemDataT, EntityT>) => (\r\n <TableActionMenu\r\n caption={\r\n <FormattedFile\r\n typeInfo={rowDataGetter!().type}\r\n caption={cellData}\r\n className=\"icon-caption\"\r\n />\r\n }\r\n itemData={rowDataGetter!}\r\n {...props}\r\n />\r\n);\r\n\r\nexport const ActionMenuCell = <\r\n CellDataT extends React.ReactNode,\r\n ItemDataT extends UI.ActionMenuItemDataValueType,\r\n EntityT extends UI.ActionMenuItemEntityValueType,\r\n>({\r\n cellData,\r\n rowDataGetter,\r\n ...props\r\n}: ActionCellProps<CellDataT, ItemDataT, EntityT>) => (\r\n <TableActionMenu caption={cellData} itemData={rowDataGetter!} {...props} />\r\n);\r\n\r\nexport interface ActionLinkCellProps<\r\n CellDataT,\r\n ItemDataT extends UI.ActionMenuItemDataValueType,\r\n EntityT extends UI.ActionMenuItemEntityValueType,\r\n> extends RowWrapperCellChildProps<CellDataT, ItemDataT> {\r\n /*Pick<ActionButtonProps<ItemDataT>, 'actions' | 'actionId'>*/\r\n\r\n //action: (itemData: any, location: Location) => void;\r\n //action: UI.ActionType<ItemDataT>;\r\n action: UI.ActionDefinition<ItemDataT, EntityT>;\r\n moduleData: UI.ActionModuleData;\r\n entity?: EntityT;\r\n // actionId: string;\r\n}\r\n\r\nexport const ActionLinkCell = <\r\n CellDataT,\r\n ItemDataT extends UI.ActionMenuItemDataValueType,\r\n EntityT extends UI.ActionMenuItemEntityValueType,\r\n>(\r\n {\r\n cellData,\r\n rowDataGetter,\r\n //location,\r\n //onClickAction, action,\r\n action,\r\n moduleData,\r\n entity,\r\n ...props\r\n }: ActionLinkCellProps<\r\n CellDataT,\r\n ItemDataT,\r\n EntityT\r\n > /*& ActionHandlerDecoratorChildProps*/,\r\n) => {\r\n const login = useSession();\r\n if (!showAction(action, rowDataGetter!(), login)) {\r\n return <TextCell cellData={cellData} {...props} />;\r\n }\r\n\r\n return (\r\n <ActionHandlerDecorator<ItemDataT, EntityT>>\r\n {({ onClickAction }) => (\r\n <LinkButton\r\n className=\"plain link cell\"\r\n onClick={() =>\r\n onClickAction({\r\n action,\r\n moduleData,\r\n itemData: rowDataGetter!(),\r\n entity: entity as EntityT,\r\n })\r\n }\r\n >\r\n {getCellContent(cellData)}\r\n </LinkButton>\r\n )}\r\n </ActionHandlerDecorator>\r\n );\r\n};\r\n\r\nexport interface NumberCellProps extends RowWrapperCellChildProps<number, any> {\r\n cellData?: number;\r\n}\r\n\r\nexport const SizeCell: React.FC<NumberCellProps> = ({ cellData }) => {\r\n const { formatSize } = useFormatter();\r\n return <span className=\"plain size cell\">{formatSize(cellData!)}</span>;\r\n};\r\n\r\nexport const SpeedCell: React.FC<NumberCellProps> = ({ cellData }) => {\r\n const { formatSpeed } = useFormatter();\r\n return <span className=\"plain speed cell\">{formatSpeed(cellData!)}</span>;\r\n};\r\n\r\nexport const DateCell: React.FC<NumberCellProps> = ({ cellData, width }) => {\r\n const { formatShortDate, formatDateTime } = useFormatter();\r\n return (\r\n <span className=\"plain date cell\">\r\n {!!width && width > 150 ? formatDateTime(cellData!) : formatShortDate(cellData!)}\r\n </span>\r\n );\r\n};\r\n\r\nexport const DurationCell: React.FC<NumberCellProps> = ({ cellData }) => {\r\n const { formatRelativeTime } = useFormatter();\r\n return <span className=\"plain duration cell\">{formatRelativeTime(cellData!)}</span>;\r\n};\r\n\r\nexport const AbbreviatedDurationCell: React.FC<NumberCellProps> = ({ cellData }) => {\r\n const { formatAbbreviatedDuration } = useFormatter();\r\n return (\r\n <span className=\"plain abbr-duration cell\">\r\n {formatAbbreviatedDuration(cellData!)}\r\n </span>\r\n );\r\n};\r\n\r\nexport interface IpCellProps {\r\n cellData?: API.IP;\r\n}\r\n\r\nexport const IpCell: React.FC<IpCellProps> = ({ cellData }) => (\r\n <FormattedIp item={cellData!} />\r\n);\r\n\r\nexport const ConnectionCell: React.FC<NumberCellProps> = ({ cellData }) => {\r\n const { formatConnection } = useFormatter();\r\n return <span className=\"plain connection cell\">{formatConnection(cellData!)}</span>;\r\n};\r\n\r\nexport const DecimalCell: React.FC<NumberCellProps> = ({ cellData }) => (\r\n <span className=\"plain decimal cell\">{formatDecimal(cellData!)}</span>\r\n);\r\n\r\nexport type FileDownloadCellCaptionGetter = (\r\n cellData: any,\r\n rowDataGetter: () => any,\r\n) => React.ReactNode;\r\n\r\nexport interface FileDownloadCellProps<\r\n CellDataT,\r\n ItemDataT extends UI.DownloadableItemInfo,\r\n EntityT extends UI.SessionItemBase,\r\n> extends Omit<RowWrapperCellChildProps<CellDataT, ItemDataT>, 'children'>,\r\n Omit<\r\n TableDownloadMenuProps<ItemDataT, EntityT>,\r\n 'user' | 'itemInfoGetter' | 'caption'\r\n > {\r\n userGetter: (rowData: ItemDataT) => UI.DownloadSource;\r\n captionGetter?: FileDownloadCellCaptionGetter;\r\n}\r\n\r\nexport const FileDownloadCell = <\r\n CellDataT extends React.ReactNode,\r\n ItemDataT extends UI.DownloadableItemInfo & FileItemBase,\r\n EntityT extends UI.SessionItemBase,\r\n>({\r\n cellData,\r\n rowDataGetter,\r\n captionGetter,\r\n userGetter,\r\n downloadHandler,\r\n ...props\r\n}: FileDownloadCellProps<CellDataT, ItemDataT, EntityT>) => (\r\n <TableDownloadMenu\r\n caption={\r\n <FormattedFile\r\n typeInfo={rowDataGetter!().type}\r\n caption={captionGetter ? captionGetter(cellData, rowDataGetter!) : cellData}\r\n className=\"icon-caption\"\r\n />\r\n }\r\n user={userGetter(rowDataGetter!())}\r\n linkCaption={!captionGetter}\r\n itemInfoGetter={rowDataGetter!}\r\n downloadHandler={downloadHandler}\r\n {...props}\r\n />\r\n);\r\n\r\nexport interface CheckboxCellProps\r\n extends Omit<RowWrapperCellChildProps<boolean, any>, 'onChange' | 'id'>,\r\n Omit<CheckboxProps, 'onChange' | 'checked' | 'id'> {\r\n onChange: (checked: boolean, rowData: any) => void;\r\n}\r\n\r\nexport const CheckboxCell: React.FC<CheckboxCellProps> = ({\r\n cellData,\r\n rowDataGetter,\r\n onChange,\r\n ...props\r\n}) => (\r\n <Checkbox\r\n checked={cellData!}\r\n onChange={(checked) => onChange(checked, rowDataGetter!())}\r\n {...props}\r\n />\r\n);\r\n","import TableActions from '@/actions/TableActions';\r\n\r\nimport invariant from 'invariant';\r\n\r\n// TODO: this should be handled on component level (instead of using global stores)\r\nexport default (defaultSortProperty, defaultSortAscending = true) => {\r\n let active = false;\r\n let totalCount = -1; // Not zero to avoid using emptyRowsNodeGetter when it's not wanted\r\n let matchingCount = 0;\r\n let startPos = 0;\r\n let items = [];\r\n let entityId = null;\r\n let paused = false;\r\n let scrollPosition = 0;\r\n // let socket = null;\r\n\r\n const DEBUG = false;\r\n\r\n let sortProperty = defaultSortProperty;\r\n let sortAscending = defaultSortAscending;\r\n\r\n const findItem = (id) => {\r\n return items.find((item) => (!item ? false : item.id === id));\r\n };\r\n\r\n const clear = () => {\r\n items = [];\r\n startPos = 0;\r\n matchingCount = 0;\r\n totalCount = -1;\r\n };\r\n\r\n const addItems = (itemsObj) => {\r\n items = itemsObj.reduce((newViewItems, rawItem, index) => {\r\n // Either a new item, existing one in a different position or we are updating properties\r\n let viewItem = findItem(rawItem.id) || { id: rawItem.id };\r\n\r\n if (rawItem.properties) {\r\n viewItem = Object.assign({}, viewItem, rawItem.properties);\r\n } else if (Object.keys(viewItem).length === 1) {\r\n console.error('No properties were sent for a new view item', viewItem.id);\r\n }\r\n\r\n newViewItems[startPos + index] = viewItem;\r\n\r\n return newViewItems;\r\n }, []);\r\n };\r\n\r\n const parseDataProperties = (data) => {\r\n if (data.range_start != undefined) {\r\n startPos = data.range_start;\r\n }\r\n\r\n if (data.total_items != undefined) {\r\n totalCount = data.total_items;\r\n }\r\n\r\n if (data.matching_items != undefined) {\r\n matchingCount = data.matching_items;\r\n }\r\n\r\n if (data.items != undefined) {\r\n addItems(data.items);\r\n }\r\n };\r\n\r\n const ViewStoreMixin = {\r\n listenables: TableActions,\r\n DEBUG,\r\n\r\n onClose(socket, viewUrl) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n if (DEBUG) {\r\n console.log(`Closing view ${this.viewUrl}`);\r\n }\r\n\r\n this._removeMessageListener();\r\n clear();\r\n\r\n active = false;\r\n this.trigger();\r\n },\r\n\r\n onClear(socket, viewUrl) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n clear();\r\n this.trigger();\r\n },\r\n\r\n onPause(socket, viewUrl, enabled) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n paused = enabled;\r\n },\r\n\r\n onInit(socket, viewUrl, _entityId) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n invariant(!active, 'Trying start an active table view');\r\n\r\n entityId = _entityId;\r\n // socket = _socket;\r\n\r\n this.addMessageListener(socket);\r\n if (DEBUG) {\r\n console.log(`Starting view ${this.viewUrl}`);\r\n }\r\n\r\n active = true;\r\n },\r\n\r\n onSetSort(socket, viewUrl, property, ascending) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n sortProperty = property;\r\n sortAscending = ascending;\r\n //this.trigger(items);\r\n },\r\n\r\n addMessageListener(socket) {\r\n this._removeMessageListener = socket.addViewUpdateListener(\r\n this._viewName,\r\n this._handleUpdate,\r\n entityId,\r\n );\r\n },\r\n\r\n get items() {\r\n return items;\r\n },\r\n\r\n get viewUrl() {\r\n let viewUrl = this._apiUrl + '/';\r\n if (entityId) {\r\n viewUrl += entityId + '/';\r\n }\r\n\r\n viewUrl += this._viewName;\r\n return viewUrl;\r\n },\r\n\r\n get viewName() {\r\n return this._viewName;\r\n },\r\n\r\n get rowCount() {\r\n return matchingCount;\r\n },\r\n\r\n get totalCount() {\r\n return totalCount;\r\n },\r\n\r\n get active() {\r\n return active;\r\n },\r\n\r\n get sortProperty() {\r\n return sortProperty;\r\n },\r\n\r\n get sortAscending() {\r\n return sortAscending;\r\n },\r\n\r\n get paused() {\r\n return paused;\r\n },\r\n\r\n setScrollData(data, viewId) {\r\n if (this._sessionStore) {\r\n this._sessionStore.scroll.setScrollData(data, entityId, viewId);\r\n return;\r\n }\r\n\r\n if (DEBUG) {\r\n console.log(\r\n `Setting scroll position ${data} for view ${this.viewUrl} (view ID ${viewId})`,\r\n );\r\n }\r\n\r\n scrollPosition = data;\r\n },\r\n\r\n getScrollData(viewId) {\r\n if (this._sessionStore) {\r\n return this._sessionStore.scroll.getScrollData(entityId, viewId);\r\n }\r\n\r\n if (DEBUG) {\r\n console.log(\r\n `Getting scroll position ${scrollPosition} for view ${this.viewUrl} (view ID ${viewId})`,\r\n );\r\n }\r\n\r\n return scrollPosition;\r\n },\r\n\r\n _handleUpdate(data) {\r\n parseDataProperties(data);\r\n this.trigger(items, data.range_offset, matchingCount);\r\n },\r\n };\r\n\r\n return ViewStoreMixin;\r\n};\r\n","import * as React from 'react';\n\nimport 'fomantic-ui-css/components/flag.min.css';\n\nimport * as API from '@/types/api';\nimport classNames from 'classnames';\n\nexport interface FormattedIpProps {\n item: API.IP;\n}\n\nconst FormattedIp: React.FC<FormattedIpProps> = ({ item }) => (\n <div className=\"ip flag\">\n <i className={classNames('ui flag', item.country.toLowerCase())} />\n {item.str}\n </div>\n);\n\nexport default FormattedIp;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Generic table styles */\n.virtual-table {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.virtual-table .table-container-wrapper {\n width: 100%;\n flex: 1 1 auto;\n\n /* The table won't shrink properly without this */\n height: calc(100% - 50px);\n}\n\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\n cursor: pointer;\n}\n\n.virtual-table .fixedDataTableLayout_main {\n background-color: rgba(250, 250, 250, 0.8);\n}\n\n.virtual-table .fixedDataTableLayout_main:focus {\n outline: inherit;\n}\n\n/* Common cell content styles */\n\n.virtual-table .cell-wrapper {\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n max-height: 50px;\n padding: 5px;\n}\n\n.virtual-table .cell-wrapper .plain.cell,\n.virtual-table .cell-wrapper .empty.dropdown {\n margin: 0px 3px;\n}\n\n.virtual-table .cell-wrapper .ui.progress .bar {\n height: 5px;\n}\n\n/* Footer */\n\n.table-footer {\n width: 100%;\n padding: 5px;\n background-color: #f6f7f8;\n background-image: -webkit-linear-gradient(#fff, #efefef);\n background-image: linear-gradient(#fff, #efefef);\n display: flex;\n align-items: center;\n}\n\n.table-footer > .filter {\n margin-left: auto;\n display: flex;\n}\n\n.table-footer > .filter > .count-info {\n margin-right: 0px;\n opacity: 0.6;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.table-footer > .filter > div:last-child {\n margin-left: 10px;\n}\n\n.table-footer > .filter .filter-method.dropdown.button {\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.table-footer > .filter .dropdown .trigger.icon {\n margin-right: 0px;\n}\n\n.table-footer > .filter input {\n width: 90%;\n}\n\n/* Table dropdowns */\n.table-container-wrapper .dropdown > .popup.trigger {\n max-width: 100%;\n\n line-height: 21px;\n display: flex;\n align-items: flex-start;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption {\n max-width: calc(100% - 20px);\n}\n\n.table-container-wrapper .dropdown > .popup.trigger .caption > * {\n overflow: hidden;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover,\n.public_fixedDataTableCell_main a:hover {\n cursor: pointer;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger:hover span,\n.public_fixedDataTableCell_main a:hover {\n text-decoration: underline;\n}\n\n.table-container-wrapper .dropdown > .popup.trigger i.angle.icon {\n margin: 0px;\n}\n\n.table-container-wrapper .dropdown .icon-caption .icon {\n width: inherit !important;\n}\n\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\n padding-left: 22px;\n}\n\n.table-container-wrapper .dropdown .trigger i {\n flex-shrink: 0;\n}\n\n/* Table dropdown popup content */\n.popup.dropdown-content {\n padding: 5px 15px;\n overflow: hidden;\n}\n\n.popup.dropdown-content .ui.dropdown.item {\n margin: 0px 0px;\n}\n\n.virtual-table .public_fixedDataTable_header .button.link,\n.public_fixedDataTableCell_main .button.link {\n color: black;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/table/style.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;AACzB;EACE,YAAY;EACZ,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,cAAc;;EAEd,iDAAiD;EACjD,yBAAyB;AAC3B;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,0CAA0C;AAC5C;;AAEA;EACE,gBAAgB;AAClB;;AAEA,+BAA+B;;AAE/B;EACE,kBAAkB;EAClB,QAAQ;EACR,2BAA2B;EAC3B,gBAAgB;EAChB,YAAY;AACd;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,WAAW;AACb;;AAEA,WAAW;;AAEX;EACE,WAAW;EACX,YAAY;EACZ,yBAAyB;EACzB,wDAAwD;EACxD,gDAAgD;EAChD,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;EACjB,aAAa;AACf;;AAEA;EACE,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,4BAA4B;EAC5B,6BAA6B;AAC/B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,UAAU;AACZ;;AAEA,oBAAoB;AACpB;EACE,eAAe;;EAEf,iBAAiB;EACjB,aAAa;EACb,uBAAuB;AACzB;;AAEA;EACE,4BAA4B;AAC9B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,eAAe;AACjB;;AAEA;;EAEE,0BAA0B;AAC5B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,cAAc;AAChB;;AAEA,iCAAiC;AACjC;EACE,iBAAiB;EACjB,gBAAgB;AAClB;;AAEA;EACE,eAAe;AACjB;;AAEA;;EAEE,YAAY;AACd\",\"sourcesContent\":[\"/* Generic table styles */\\n.virtual-table {\\n height: 100%;\\n width: 100%;\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n}\\n\\n.virtual-table .table-container-wrapper {\\n width: 100%;\\n flex: 1 1 auto;\\n\\n /* The table won't shrink properly without this */\\n height: calc(100% - 50px);\\n}\\n\\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\\n cursor: pointer;\\n}\\n\\n.virtual-table .fixedDataTableLayout_main {\\n background-color: rgba(250, 250, 250, 0.8);\\n}\\n\\n.virtual-table .fixedDataTableLayout_main:focus {\\n outline: inherit;\\n}\\n\\n/* Common cell content styles */\\n\\n.virtual-table .cell-wrapper {\\n position: relative;\\n top: 50%;\\n transform: translateY(-50%);\\n max-height: 50px;\\n padding: 5px;\\n}\\n\\n.virtual-table .cell-wrapper .plain.cell,\\n.virtual-table .cell-wrapper .empty.dropdown {\\n margin: 0px 3px;\\n}\\n\\n.virtual-table .cell-wrapper .ui.progress .bar {\\n height: 5px;\\n}\\n\\n/* Footer */\\n\\n.table-footer {\\n width: 100%;\\n padding: 5px;\\n background-color: #f6f7f8;\\n background-image: -webkit-linear-gradient(#fff, #efefef);\\n background-image: linear-gradient(#fff, #efefef);\\n display: flex;\\n align-items: center;\\n}\\n\\n.table-footer > .filter {\\n margin-left: auto;\\n display: flex;\\n}\\n\\n.table-footer > .filter > .count-info {\\n margin-right: 0px;\\n opacity: 0.6;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n}\\n\\n.table-footer > .filter > div:last-child {\\n margin-left: 10px;\\n}\\n\\n.table-footer > .filter .filter-method.dropdown.button {\\n padding-left: 0px !important;\\n padding-right: 0px !important;\\n}\\n\\n.table-footer > .filter .dropdown .trigger.icon {\\n margin-right: 0px;\\n}\\n\\n.table-footer > .filter input {\\n width: 90%;\\n}\\n\\n/* Table dropdowns */\\n.table-container-wrapper .dropdown > .popup.trigger {\\n max-width: 100%;\\n\\n line-height: 21px;\\n display: flex;\\n align-items: flex-start;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger .caption {\\n max-width: calc(100% - 20px);\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger .caption > * {\\n overflow: hidden;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger:hover,\\n.public_fixedDataTableCell_main a:hover {\\n cursor: pointer;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger:hover span,\\n.public_fixedDataTableCell_main a:hover {\\n text-decoration: underline;\\n}\\n\\n.table-container-wrapper .dropdown > .popup.trigger i.angle.icon {\\n margin: 0px;\\n}\\n\\n.table-container-wrapper .dropdown .icon-caption .icon {\\n width: inherit !important;\\n}\\n\\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\\n padding-left: 22px;\\n}\\n\\n.table-container-wrapper .dropdown .trigger i {\\n flex-shrink: 0;\\n}\\n\\n/* Table dropdown popup content */\\n.popup.dropdown-content {\\n padding: 5px 15px;\\n overflow: hidden;\\n}\\n\\n.popup.dropdown-content .ui.dropdown.item {\\n margin: 0px 0px;\\n}\\n\\n.virtual-table .public_fixedDataTable_header .button.link,\\n.public_fixedDataTableCell_main .button.link {\\n color: black;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n"],"names":["filterMethodToString","method","t","methodTitle","REGEX","WILDCARD","EXACT","getFilterMethodCaption","getPlaceholder","ret","PARTIAL","toLowerCase","TextFilter","state","value","onFilterUpdated","this","props","onTextChanged","event","setState","target","clearTimeout","timer","window","setTimeout","onMethodChanged","input","focus","getFilterMethod","isCurrent","MenuItemLink","onClick","active","componentWillUnmount","render","autoFocus","className","Input","ref","c","placeholder","onChange","type","SectionedDropdown","button","direction","MenuSection","caption","Object","keys","filter","key","isNaN","Number","map","TableFilterDecorator","CountInfo","store","totalCount","rowCount","Icon","icon","IconConstants","FILTER","customFilter","CustomFilter","footerData","textFilterProps","RowWrapperCell","rowData","loadData","rowIndex","dataLoader","updateRowData","onDataLoaded","rowDataGetter","data","componentDidMount","UNSAFE_componentWillReceiveProps","nextProps","removePendingRequests","shouldComponentUpdate","nextState","width","columnKey","children","renderCondition","rowClassNameGetter","other","undefined","cellData","formatColumnName","column","moduleId","name","displayName","TABLE","sortDirArrow","sortAscending","sortProperty","viewManager","viewId","entityId","socket","setInitialScrollRow","measureRef","bounds","debounce","current","columnWidths","setColumnWidths","scrollTimer","scrollPosition","height","updateRowRange","DEBUG","console","log","startRows","pixels","Math","max","floor","maxRows","ceil","convertEndToRows","viewName","assert","TableActions","setRange","viewUrl","getScrollTop","getScrollData","onColumnClicked","setSort","onColumnResizeEndCallback","newColumnWidth","prevWidths","onScrollStart","horizontal","vertical","pause","onScrollEnd","setScrollData","useTableViewManager","hideWidth","flexGrow","cell","mobileView","header","ResizeCell","onColumnResizeEnd","bind","label","isResizable","allowCellsRecycling","rowHeight","rowsCount","headerHeight","touchScrollEnabled","scrollTop","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","constructor","onDataLoad","_onDataLoad","_store","_data","_pendingRequest","_initialDataReceived","_socket","clear","updateItem","updated","item","index","old","$merge","$set","onItemsUpdated","items","rangeOffset","hasChanges","length","i","updatedCount","reduce","_rangeOffset","getRowData","_queueRequestFor","rowBase","request","push","endRow","min","get","then","onRowsReceived","catch","error","start","rows","forEach","f","useTableDataManager","sessionStore","sourceFilter","forceUpdate","useReducer","x","socketAuthenticated","login","useMemo","unsubscribe","useRef","useEffect","listen","init","close","getSession","moduleExists","paused","emptyRowsNodeGetter","asyncResult","postSettings","settings","action","post","completed","failed","sessionExists","that","delete","Promise","resolve","sort_property","sort_ascending","rangeStart","range_start","max_count","filterData","source_filter","Component","propertyName","id","pattern","property","put","urls","loaderText","getCellContent","Array","isArray","str","TextCell","HeaderCell","FileActionCell","typeInfo","itemData","ActionMenuCell","ActionLinkCell","moduleData","entity","onClickAction","SizeCell","formatSize","SpeedCell","formatSpeed","DurationCell","formatRelativeTime","AbbreviatedDurationCell","formatAbbreviatedDuration","IpCell","ConnectionCell","formatConnection","DecimalCell","FileDownloadCell","captionGetter","userGetter","downloadHandler","user","linkCaption","itemInfoGetter","CheckboxCell","checked","defaultSortProperty","defaultSortAscending","matchingCount","startPos","listenables","onClose","_removeMessageListener","trigger","onClear","onPause","enabled","onInit","_entityId","addMessageListener","onSetSort","ascending","addViewUpdateListener","_viewName","_handleUpdate","_apiUrl","_sessionStore","scroll","itemsObj","total_items","matching_items","newViewItems","rawItem","viewItem","find","properties","assign","parseDataProperties","range_offset","country","___CSS_LOADER_EXPORT___","module"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[760],{19430:(e,t,n)=>{n.d(t,{T:()=>o,v:()=>s});var i=n(86818);const s=(e,{formatSize:t})=>{let n=e.str;return e.id!==i.A.HIDDEN_PROFILE_ID&&(n+=` (${t(e.size)})`),n},o=(e,t)=>({id:e.id,name:s(e,t)})},22187:(e,t,n)=>{n.d(t,{A:()=>l});var i=n(74848),s=n(77856),o=n(71352),r=n(93866),a=n(39115);function l(e){return{itemNameGetter:e=>e.user.nicks,itemStatusGetter(e){const{flags:t}=e.user;return(0,s.Z)(t)},itemHeaderDescriptionGetter:e=>e.user.hub_names,itemHeaderIconGetter:e=>(0,i.jsx)(r.A,{flags:e.user.flags}),itemHeaderTitleGetter(t,n,s){const{user:r}=t;return(0,i.jsx)(o.Bg,{user:r,ids:e,remoteMenuId:a.Ay.HINTED_USER,children:s})}}}},38686:(e,t,n)=>{n.r(t),n.d(t,{default:()=>Ce});var i=n(74848),s=n(96540),o=n(91950),r=n(22187),a=n(62705),l=n(90425),c=n(27725),d=n(71299),A=n(19430),u=n(74416);const f=(0,d.A)(({sessionT:e,profiles:t,onProfileChanged:n})=>{const s=(0,u.k)();return(0,i.jsx)(l.A,{className:"profile top right pointing",caption:e.translate("Browse own share..."),triggerIcon:"",children:t.map(e=>(0,i.jsx)(c.A,{onClick:()=>n(e.id),children:(0,A.v)(e,s)},e.id))})},!1);var m=n(93226),p=n(4425),h=n(16674),E=n(50489),x=n(94310),I=n(97145),y=n(48249),g=n(39364);const S=({navigate:e,sessionT:t})=>{const n=(0,I.Be)(),s=(0,y.F)(),o=(0,g.wV)(),r={sessionStore:n,socket:s,navigate:e,t:t.plainT},l=e=>{x.u.createRemoteSession({user:e},r)};return(0,i.jsxs)("div",{className:"filelist session new",children:[(0,i.jsx)(h.M,{onChange:l,offlineMessage:t.t("offlineMessage","You must to be connected to at least one hub in order to download filelists from other users"),isClearable:!1,autoFocus:!0}),(0,i.jsx)(f,{onProfileChanged:e=>{x.u.initCreateLocalSession(o)({shareProfileId:e},r)},sessionT:t}),(0,i.jsx)(a.A,{entryType:m.iM.FILELIST,hasSession:e=>!!n.filelists.getSession(e.user.cid),entryTitleRenderer:e=>{const t=e.user.nicks+(e.description?` (${e.description})`:"");return(0,i.jsx)(E.A,{onClick:t=>l(e.user),children:t})},entryIcon:p.A.FILELISTS_PLAIN})]})};var w=n(38453),v=n(8098);const b=({filelist:e,sessionT:t})=>{const{formatSize:n}=(0,u.k)();if((0,v.vU)())return null;let s=e.location.type.str;return s.length>0&&(s=`${n(e.location.size)} (${s})`),(0,i.jsxs)(w.q,{children:[(0,i.jsx)(w.J,{label:t.translate("Directory size"),text:s}),(0,i.jsx)(w.J,{label:t.translate("Total list size"),text:n(e.total_size)})]})};var L=n(99347),j=n(32728),_=n(46942),D=n.n(_),T=n(85035),C=n(71352),R=n(88544),B=n(99671),O=n(5945),F=n(65385),U=n(56484),P=n(90264),N=n(34792),H=n(50915);const G=e=>(t,n)=>n.get(`${N.A.MODULE_URL}/${e.id}/items/${t}`);class k extends s.Component{render(){const{fileItem:e,filelist:t}=this.props;return(0,i.jsxs)(B.A,Object.assign({className:"filelist-item",title:e.name,closable:!0,icon:(0,i.jsx)(O.A,{typeInfo:e.type}),fullHeight:!0},this.props,{children:[(0,i.jsx)(R.A,{downloadHandler:H.jJ,itemDataGetter:G(t),userGetter:()=>t.user,sessionItem:t}),(0,i.jsx)(P.G,{fileItem:e,downloadHandler:H.jJ,user:t.user,sessionItem:t})]}))}}k.displayName="FilelistItemInfoDialog";const M=(0,F.A)((0,U.A)(k,{urls:{fileItem:({params:e,filelist:t},n)=>G(t)(e.itemId,n)}}),"item/:itemId");var $=n(77856),V=n(52267),z=n(22005);const Y=n.n(z)().createStore({_viewName:`${N.A.VIEW_ID}_view`,_apiUrl:N.A.SESSIONS_URL,mixins:[(0,V.A)("name")]});var K=n(3570),J=n(44247),Q=n(68465),q=n(67749),W=n(39115),X=n(86038),Z=n(59548);const ee={reloadDirectory:{id:"reloadDirectory",displayName:"Reload",access:X.US.FILELISTS_VIEW,icon:p.A.RELOAD,filter:e=>(({entity:e})=>e.partial_list)(e)&&(({itemData:e})=>"directory"===e.type.id)(e),handler:({itemData:e,entity:t,socket:n})=>n.post(`${N.A.SESSIONS_URL}/${t.id}/directory`,{list_path:e.path,reload:!0})},refreshShare:{id:"refreshShare",displayName:"Refresh in share",access:X.US.SETTINGS_EDIT,icon:p.A.REFRESH_COLORED,filter:({entity:e})=>e.user.flags.includes("self"),handler:({itemData:e,socket:t})=>(0,Z.t7)(e.path,t)},details:{id:"details",displayName:"Details",icon:p.A.DETAILS,handler:({itemData:e,navigate:t})=>{t(`item/${e.id}`)},filter:e=>!(({itemData:e})=>"/"===e.path)(e)}},te={moduleData:{moduleId:q.KV.FILELISTS,subId:"item"},actions:ee},ne={remove:(0,n(4112).R)(N.A.SESSIONS_URL,X.US.FILELISTS_EDIT)},ie={moduleData:{moduleId:q.KV.FILELISTS},actions:ne};var se=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(i=Object.getOwnPropertySymbols(e);s<i.length;s++)t.indexOf(i[s])<0&&Object.prototype.propertyIsEnumerable.call(e,i[s])&&(n[i[s]]=e[i[s]])}return n};const oe=e=>{var{rowDataGetter:t,captionGetter:n,filelist:s,cellData:o}=e,r=se(e,["rowDataGetter","captionGetter","filelist","cellData"]);return(0,i.jsx)(J.BH,Object.assign({userGetter:()=>s.user,downloadHandler:H.jJ,rowDataGetter:t,entity:s,remoteMenuId:W.Ay.FILELIST_ITEM,captionGetter:n,triggerProps:{"aria-label":`${o} actions`},cellData:o},r,{children:(0,i.jsx)(C.yj,{actions:te,itemData:t,ids:["refreshShare","details"],entity:s})}))},re=e=>{var{filelist:t,sessionT:n,onClickDirectory:s}=e;se(e,["filelist","sessionT","onClickDirectory"]);const o=(0,I.Be)();return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(K.A,{emptyRowsNodeGetter:()=>{const{location:e,state:s}=t,{translate:o}=n;if("download_failed"===s.id)return(0,i.jsx)(j.A,{icon:p.A.ERROR,title:o("Download failed"),description:s.str});const{files:r,directories:a}=e.type;return 0!==r||0!==a?(0,i.jsx)(L.A,{text:o("Updating view")}):e.complete?(0,i.jsx)(j.A,{title:o("No content to display"),description:o("The directory is empty")}):(0,i.jsx)(L.A,{text:o("Preparing download")})},rowClassNameGetter:e=>t.user.flags.includes("self")?"":(0,$.L5)(e.dupe),store:Y,entityId:t.id,viewId:t.location.path,sessionStore:o.filelists,moduleId:q.KV.FILELISTS,textFilterProps:{autoFocus:!0},children:[(0,i.jsx)(Q.VP,{name:"Name",width:200,columnKey:"name",cell:(0,i.jsx)(oe,{captionGetter:(e,n)=>{if("directory"===n().type.id){const n=()=>s(t.location.path+e+"/");return(0,i.jsx)(E.A,{onClick:n,children:e})}return e},filelist:t}),flexGrow:8}),(0,i.jsx)(Q.VP,{name:"Size",width:60,columnKey:"size",cell:(0,i.jsx)(J.us,{}),flexGrow:1}),(0,i.jsx)(Q.VP,{name:"Type",width:70,columnKey:"type",flexGrow:1,hideWidth:500}),(0,i.jsx)(Q.VP,{name:"Last modified",width:80,columnKey:"time",cell:(0,i.jsx)(J.Jo,{}),flexGrow:1})]}),(0,i.jsx)(M,{filelist:t})]})};var ae=n(13017),le=n(36076);var ce=n(88939);const de=e=>{const{sessionT:t,filelist:n}=e,[o,r]=s.useState(!1),a=(({filelist:e,location:t,sessionT:n})=>{var i,o;const r=(0,ae.Zp)(),a=(0,y.F)(),l=(e,n)=>{const i=t.state;if(e===(null==i?void 0:i.directory))return;const s={directory:e};r(t.pathname,{state:s,replace:n})};return s.useEffect(()=>{const n=t.state;n?n.directory!==e.location.path&&l(e.location.path,!0):l(e.location.path,!0)},[null===(i=e.location)||void 0===i?void 0:i.path]),s.useEffect(()=>{const i=t.state;if(!i)return;const s=i.directory;s!==e.location.path&&s&&(t=>{(0,le.bd)(()=>(0,H.Qs)(e,t,a),n.plainT)})(s)},[null===(o=t.state)||void 0===o?void 0:o.directory]),l})(e),l=e=>{o||r(!0),a(e,!1)};(0,ae.KP)(({currentLocation:e,nextLocation:n,historyAction:i})=>!("POP"!==i||!o||n.pathname===e.pathname||(r(!1),ce.A.info({title:t.t("confirmLeave","Confirm action"),message:t.t("confirmLeaveDesc","Click the back button again to leave this filelist")}),0)));const c=()=>n.location,d=G(n);return(0,i.jsxs)("div",{className:"browser",children:[(0,i.jsx)(T.A,{path:n.location.path,separator:"/",rootPath:"/",rootName:t.translate("Root"),itemClickHandler:l,selectedNameFormatter:e=>(0,i.jsx)(C.gU,{caption:e,user:n.user,itemInfoGetter:c,downloadHandler:H.jJ,contextElement:".session-container",entity:n,remoteMenuId:W.Ay.FILELIST_ITEM,children:(0,i.jsx)(C.Wy,{itemData:n.location,actions:te,entity:n})}),entityId:n.id}),(0,i.jsx)(re,{filelist:n,sessionT:t,onClickDirectory:l}),(0,i.jsx)(R.A,{downloadHandler:H.jJ,itemDataGetter:d,userGetter:()=>n.user,sessionItem:n})]})};var Ae=n(80783),ue=n(83783);const fe=({sessionItem:e,sessionT:t,location:n})=>{(0,Ae.q)(e,x.u,ue.fD);const{user:s,location:o,state:r}=e,a=s.flags.includes("self"),l=D()("filelist session",{self:a});return s.flags.includes("offline")&&!a?(0,i.jsx)("div",{className:l,children:(0,i.jsx)(j.A,{title:t.t("userOffline","User offline"),description:t.t("userOfflineDesc","You will be able to continue browsing when the user comes back online")})}):"loaded"!==r.id&&"download_failed"!==r.id||!o?(0,i.jsx)("div",{className:l,children:(0,i.jsx)(L.A,{text:r.str})}):(0,i.jsxs)("div",{className:l,children:[(0,i.jsx)(de,{location:n,filelist:e,sessionT:t}),(0,i.jsx)(b,{filelist:e,sessionT:t})]})};var me=n(85072),pe=n.n(me),he=n(97825),Ee=n.n(he),xe=n(77659),Ie=n.n(xe),ye=n(55056),ge=n.n(ye),Se=n(10540),we=n.n(Se),ve=n(41113),be=n.n(ve),Le=n(98737),je={};je.styleTagTransform=be(),je.setAttributes=ge(),je.insert=Ie().bind(null,"head"),je.domAPI=Ee(),je.insertStyleElement=we(),pe()(Le.A,je),Le.A&&Le.A.locals&&Le.A.locals;var _e=n(78046);const De=(0,r.A)(["message"]),Te={itemLabelGetter:()=>null,itemNameGetter:e=>e.share_profile?e.share_profile.str:De.itemNameGetter(e),itemStatusGetter:e=>e.share_profile?"blue":De.itemStatusGetter(e),itemHeaderTitleGetter:(e,t,n)=>e.share_profile?n:De.itemHeaderTitleGetter(e,t,n),itemHeaderDescriptionGetter:e=>e.share_profile?null:De.itemHeaderDescriptionGetter(e),itemHeaderIconGetter:e=>e.share_profile?"green server":De.itemHeaderIconGetter(e)},Ce=(0,_e.Z)(e=>{const{params:t,sessionT:n}=e,s=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(i=Object.getOwnPropertySymbols(e);s<i.length;s++)t.indexOf(i[s])<0&&Object.prototype.propertyIsEnumerable.call(e,i[s])&&(n[i[s]]=e[i[s]])}return n}(e,["params","sessionT"]);return(0,i.jsx)(o.A,Object.assign({activeId:t.id,baseUrl:"filelists",newCaption:n.t("new","Open filelist"),newDescription:n.t("newDesc","Start browsing a new filelist"),newIcon:p.A.FILELISTS_PLAIN,disableSideMenu:!0,editAccess:X.US.FILELISTS_EDIT,uiActions:ie,sessionApi:x.u,sessionStoreSelector:ue.fD,sessionItemLayout:fe,newLayout:S,sessionT:n,remoteMenuId:W.Ay.FILELIST},Te,s))},ue.fD,q.KV.FILELISTS)},52237:(e,t,n)=>{n.d(t,{A:()=>a});var i=n(71354),s=n.n(i),o=n(76314),r=n.n(o)()(s());r.push([e.id,".fileitem.info.segment .dupe-paths .path {\n overflow-x: hidden;\n}\n\n.fileitem.info.segment .download.ui.dropdown {\n max-width: 150px;\n margin-top: 10px;\n}\n\n.fileitem.info.segment .title.column {\n margin-top: auto;\n margin-bottom: auto;\n}\n\n.fileitem.info.segment .value.column {\n word-break: break-all;\n}\n","",{version:3,sources:["webpack://./src/components/file-item-info/style.css"],names:[],mappings:"AAAA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB",sourcesContent:[".fileitem.info.segment .dupe-paths .path {\n overflow-x: hidden;\n}\n\n.fileitem.info.segment .download.ui.dropdown {\n max-width: 150px;\n margin-top: 10px;\n}\n\n.fileitem.info.segment .title.column {\n margin-top: auto;\n margin-bottom: auto;\n}\n\n.fileitem.info.segment .value.column {\n word-break: break-all;\n}\n"],sourceRoot:""}]);const a=r},59548:(e,t,n)=>{n.d(t,{Lt:()=>c,eo:()=>r,sf:()=>a,t7:()=>l});var i=n(42191),s=n(88569),o=n(86038);const r=(e,t,n)=>{return o=void 0,r=[e,t,n],l=function*({file:e,hubUrl:t,cid:n},{auth_token:o},r){try{const a=yield(0,s.U)(e,o);return yield r.post(i.A.TEMP_SHARES_URL,{name:e.name,file_id:a,hub_url:t,cid:n})}catch(e){throw e}},new((a=void 0)||(a=Promise))(function(e,t){function n(e){try{s(l.next(e))}catch(e){t(e)}}function i(e){try{s(l.throw(e))}catch(e){t(e)}}function s(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a(function(e){e(s)})).then(n,i)}s((l=l.apply(o,r||[])).next())});var o,r,a,l},a=(e,t)=>t.post(i.A.REFRESH_PATHS_URL,{paths:e,priority:o.DH.MANUAL}),l=(e,t)=>t.post(i.A.REFRESH_VIRTUAL_URL,{path:e}),c=(e,t)=>t.delete(`${i.A.REFRESH_TASKS_URL}/${e}`)},62705:(e,t,n)=>{n.d(t,{A:()=>u});var i=n(74848),s=(n(96540),n(56484)),o=n(74416),r=n(31224),a=n(2253),l=n(93226),c=n(67749),d=n(42695),A=n(32389);const u=(0,s.A)(({entries:e,entryTitleRenderer:t,hasSession:n,entryIcon:s})=>{const{formatRelativeTime:l}=(0,o.k)(),{t:u}=(0,A.Bd)();return 0===e.length?null:(0,i.jsxs)("div",{className:"recents",children:[(0,i.jsx)(r.A,{title:(0,d.Tl)("Recent sessions",u,c.KV.COMMON),size:""}),(0,i.jsx)("div",{className:"ui relaxed divided list",children:e.map((e,o)=>(0,i.jsx)(a.c,{header:t(e),description:!!e.last_opened&&u((0,d.j2)("openedAgo",c.KV.COMMON),{defaultValue:"Opened {{timeAgo}}",replace:{timeAgo:l(e.last_opened)}}),icon:(n(e)?"green ":"")+s},o))})]})},{urls:{entries:({entryType:e},t)=>t.get((e=>`${l.Ay.SESSIONS_URL}/${e}/0`)(e))}})},71299:(e,t,n)=>{n.d(t,{A:()=>r});var i=n(2543),s=n(86818),o=n(56484);const r=function(e,t,n){return(0,o.A)(e,(0,i.merge)(n,{urls:{profiles:s.A.PROFILES_URL},dataConverters:{profiles:(e,{t:n})=>e.filter(e=>t||e.id!==s.A.HIDDEN_PROFILE_ID)},onSocketConnected:(e,{refetchData:t})=>{e(s.A.MODULE_URL,s.A.PROFILE_ADDED,()=>t()),e(s.A.MODULE_URL,s.A.PROFILE_UPDATED,()=>t()),e(s.A.MODULE_URL,s.A.PROFILE_REMOVED,()=>t())}}))}},86818:(e,t,n)=>{n.d(t,{A:()=>s});const i="share_profiles",s={MODULE_URL:i,PROFILES_URL:i,PROFILE_ADDED:"share_profile_added",PROFILE_UPDATED:"share_profile_updated",PROFILE_REMOVED:"share_profile_removed",HIDDEN_PROFILE_ID:1}},88569:(e,t,n)=>{n.d(t,{H:()=>r,U:()=>o});var i=n(41110),s=function(e,t,n,i){return new(n||(n=Promise))(function(s,o){function r(e){try{l(i.next(e))}catch(e){o(e)}}function a(e){try{l(i.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(r,a)}l((i=i.apply(e,t||[])).next())})};const o=(e,t)=>s(void 0,void 0,void 0,function*(){try{return(yield(0,i.F)(`${getBasePath()}temp`,{method:"POST",headers:{"X-Authorization":t,Authorization:t},body:e})).headers.get("Location")}catch(e){throw e}}),r=(e,t,...n)=>s(void 0,[e,t,...n],void 0,function*(e,t,n={isJSON:!0}){try{const s=yield(0,i.F)((e=>`${window.location.origin}${getBasePath()}proxy?url=${encodeURIComponent(e)}`)(e),Object.assign({headers:{"X-Authorization":t.auth_token,"Cache-Control":"no-store, must-revalidate, max-age=0"}},n));return(yield n.isJSON)?s.json():s.text()}catch(t){throw console.error(`CORS HTTP request failed (${e})`,t),t}})},90264:(e,t,n)=>{n.d(t,{G:()=>j});var i=n(74848),s=(n(96540),n(74416)),o=n(71352),r=n(86038),a=n(67749),l=n(32389),c=n(42695),d=n(85072),A=n.n(d),u=n(97825),f=n.n(u),m=n(77659),p=n.n(m),h=n(55056),E=n.n(h),x=n(10540),I=n.n(x),y=n(41113),g=n.n(y),S=n(52237),w={};w.styleTagTransform=g(),w.setAttributes=E(),w.insert=p().bind(null,"head"),w.domAPI=f(),w.insertStyleElement=I(),A()(S.A,w),S.A&&S.A.locals&&S.A.locals;var v=n(73070);const b={[r.YF.SHARE_PARTIAL]:"Share (partial)",[r.YF.SHARE_FULL]:"Share (full)",[r.YF.QUEUE_PARTIAL]:"Queue (partial)",[r.YF.QUEUE_FULL]:"Queue (full)",[r.YF.FINISHED_PARTIAL]:"Finished (partial)",[r.YF.FINISHED_FULL]:"Finished (full)",[r.YF.SHARE_QUEUE]:"Share and queue",[r.YF.SHARE_FINISHED]:"Share and finished",[r.YF.QUEUE_FINISHED]:"Queue and finished",[r.YF.SHARE_QUEUE_FINISHED]:"Share, queue and finished"},L=({paths:e})=>(0,i.jsx)("div",{className:"dupe-paths",children:e.map(e=>(0,i.jsx)("div",{className:"path",children:e},e))}),j=({sessionItem:e,fileItem:t,user:n,downloadHandler:r,showPath:d=!0})=>{const{t:A}=(0,l.Bd)(),u=e=>(0,c.Tl)(e,A,a.KV.COMMON),{formatSize:f,formatRelativeTime:m}=(0,s.k)();return(0,i.jsxs)("div",{className:"ui fileitem info segment",children:[(0,i.jsxs)(v.xA,{columns:"two",stackable:!0,children:[(0,i.jsx)(v.fI,{title:u("Name"),text:t.name}),(0,i.jsx)(v.fI,{title:u("Type/content"),text:t.type.str}),(0,i.jsx)(v.fI,{title:u("Size"),text:f(t.size,2,!0)}),(0,i.jsx)(v.fI,{title:u("Last modified"),text:m(t.time||0)}),"file"===t.type.id&&(0,i.jsx)(v.fI,{title:u("TTH"),text:t.tth}),!!t.dupe&&(0,i.jsx)(v.fI,{title:u("Dupe type"),text:u(b[t.dupe.id])}),!!t.dupe&&(0,i.jsx)(v.fI,{title:u("Dupe paths"),text:(0,i.jsx)(L,{paths:t.dupe.paths})}),d&&(0,i.jsx)(v.fI,{title:u("Path"),text:t.path})]}),(0,i.jsx)(o.gU,{caption:u("Actions..."),button:!0,user:n,itemInfoGetter:()=>t,downloadHandler:r,contextElement:".ui.modal > .content",entity:e})]})}},98737:(e,t,n)=>{n.d(t,{A:()=>a});var i=n(71354),s=n.n(i),o=n(76314),r=n.n(o)()(s());r.push([e.id,"#sidebar .virtual-table {\n flex: 1 100 100%;\n}\n\n.filelist.session .browser,\n.filelist.session .browser .virtual-table {\n height: calc(100% - 35px);\n}\n\n#mobile-layout .filelist.session .browser {\n height: 100%;\n}\n\n#mobile-layout .filelist.session .browser {\n height: calc(100% - 10px);\n}\n\n@media screen and (min-color-index: 0) and(-webkit-min-device-pixel-ratio:0) {\n /* Safari specific CSS */\n .filelist.session .browser {\n height: calc(100% - 95px);\n }\n\n #mobile-layout .filelist.session .browser {\n height: calc(100% - 60px);\n }\n}\n\n.filelist.session .browser .ui.segment {\n margin-bottom: 10px;\n}\n\n.filelist.session {\n max-height: 100%;\n overflow: hidden;\n margin-top: 10px;\n flex: 1 1 100%;\n}\n\n.session.new .profile.ui.dropdown {\n margin-top: 10px;\n color: gray;\n align-self: flex-end;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Filelists/style.css"],names:[],mappings:"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,yBAAyB;AAC3B;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,wBAAwB;EACxB;IACE,yBAAyB;EAC3B;;EAEA;IACE,yBAAyB;EAC3B;AACF;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,gBAAgB;EAChB,WAAW;EACX,oBAAoB;AACtB",sourcesContent:["#sidebar .virtual-table {\n flex: 1 100 100%;\n}\n\n.filelist.session .browser,\n.filelist.session .browser .virtual-table {\n height: calc(100% - 35px);\n}\n\n#mobile-layout .filelist.session .browser {\n height: 100%;\n}\n\n#mobile-layout .filelist.session .browser {\n height: calc(100% - 10px);\n}\n\n@media screen and (min-color-index: 0) and(-webkit-min-device-pixel-ratio:0) {\n /* Safari specific CSS */\n .filelist.session .browser {\n height: calc(100% - 95px);\n }\n\n #mobile-layout .filelist.session .browser {\n height: calc(100% - 60px);\n }\n}\n\n.filelist.session .browser .ui.segment {\n margin-bottom: 10px;\n}\n\n.filelist.session {\n max-height: 100%;\n overflow: hidden;\n margin-top: 10px;\n flex: 1 1 100%;\n}\n\n.session.new .profile.ui.dropdown {\n margin-top: 10px;\n color: gray;\n align-self: flex-end;\n}\n"],sourceRoot:""}]);const a=r}}]);
|
|
2
|
+
//# sourceMappingURL=filelists.ce2bf2a0664eef3a9aec.chunk.js.map
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js/filelists.ce2bf2a0664eef3a9aec.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/utils/ShareProfileUtils.ts","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/UserItemHandlerDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/ShareProfileSelector.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistNew.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistFooter.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/item-info-dialog/FilelistItemInfoDialog.tsx","webpack://airdcpp-webui/./src/stores/views/FilelistViewStore.js","webpack://airdcpp-webui/./src/actions/ui/filelist/FilelistItemActions.ts","webpack://airdcpp-webui/./src/actions/ui/filelist/FilelistSessionActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistItemTable.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/ListBrowser.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/effects/useSyncFilelistLocation.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistSession.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/style.css?8d81","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/Filelists.tsx","webpack://airdcpp-webui/./src/components/file-item-info/style.css","webpack://airdcpp-webui/./src/services/api/ShareApi.ts","webpack://airdcpp-webui/./src/routes/Sidebar/components/RecentLayout.tsx","webpack://airdcpp-webui/./src/decorators/ShareProfileDecorator.tsx","webpack://airdcpp-webui/./src/constants/ShareProfileConstants.ts","webpack://airdcpp-webui/./src/services/HttpService.ts","webpack://airdcpp-webui/./src/components/file-item-info/style.css?a322","webpack://airdcpp-webui/./src/components/file-item-info/FileItemInfoGrid.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/style.css"],"sourcesContent":["import ShareProfileConstants from '@/constants/ShareProfileConstants';\r\n\r\nimport { Formatter } from '@/context/FormatterContext';\r\n\r\nimport * as API from '@/types/api';\r\n\r\nexport const formatProfileNameWithSize = (\r\n profile: API.ShareProfile,\r\n { formatSize }: Formatter,\r\n) => {\r\n let str = profile.str;\r\n if (profile.id !== ShareProfileConstants.HIDDEN_PROFILE_ID) {\r\n str += ` (${formatSize(profile.size)})`;\r\n }\r\n\r\n return str;\r\n};\r\n\r\nexport const profileToEnumValue = (profile: API.ShareProfile, formatter: Formatter) => {\r\n return {\r\n id: profile.id,\r\n name: formatProfileNameWithSize(profile, formatter),\r\n };\r\n};\r\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 Dropdown from '@/components/semantic/Dropdown';\nimport MenuItemLink from '@/components/semantic/MenuItemLink';\n\nimport ShareProfileDecorator, {\n ShareProfileDecoratorChildProps,\n} from '@/decorators/ShareProfileDecorator';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\n\nimport { formatProfileNameWithSize } from '@/utils/ShareProfileUtils';\nimport { useFormatter } from '@/context/FormatterContext';\n\ninterface ShareProfileSelectorProps {\n // Callback after selecting a profile\n onProfileChanged: (profileId: number) => void;\n\n sessionT: UI.ModuleTranslator;\n}\n\nconst ShareProfileSelector: React.FC<\n ShareProfileSelectorProps & ShareProfileDecoratorChildProps\n> = ({ sessionT, profiles, onProfileChanged }) => {\n const formatter = useFormatter();\n\n const getDropdownItem = (profile: API.ShareProfile) => {\n return (\n <MenuItemLink key={profile.id} onClick={() => onProfileChanged(profile.id)}>\n {formatProfileNameWithSize(profile, formatter)}\n </MenuItemLink>\n );\n };\n\n return (\n <Dropdown\n className=\"profile top right pointing\"\n caption={sessionT.translate('Browse own share...')}\n triggerIcon=\"\"\n >\n {profiles.map(getDropdownItem)}\n </Dropdown>\n );\n};\n\nexport default ShareProfileDecorator(ShareProfileSelector, false);\n","import RecentLayout from '@/routes/Sidebar/components/RecentLayout';\r\n\r\nimport ShareProfileSelector from '@/routes/Sidebar/routes/Filelists/components/ShareProfileSelector';\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\nimport LinkButton from '@/components/semantic/LinkButton';\r\nimport { FilelistAPIActions } from '@/actions/store/FilelistActions';\r\nimport { useSessionStore } from '@/context/SessionStoreContext';\r\nimport { useSocket } from '@/context/SocketContext';\r\nimport { useSession } from '@/context/AppStoreContext';\r\n\r\nconst FilelistNew: React.FC<NewSessionLayoutProps> = ({ navigate, sessionT }) => {\r\n const sessionStore = useSessionStore();\r\n const socket = useSocket();\r\n const session = useSession();\r\n\r\n const createSessionProps = {\r\n sessionStore,\r\n socket,\r\n navigate,\r\n t: sessionT.plainT,\r\n };\r\n\r\n const handleSubmit = (user: API.HintedUser) => {\r\n FilelistAPIActions.createRemoteSession({ user }, createSessionProps);\r\n };\r\n\r\n const onProfileChanged = (shareProfileId: number) => {\r\n FilelistAPIActions.initCreateLocalSession(session)(\r\n { shareProfileId },\r\n createSessionProps,\r\n );\r\n };\r\n\r\n const recentUserRender = (entry: API.HistoryItem) => {\r\n const caption =\r\n entry.user!.nicks + (entry.description ? ` (${entry.description})` : '');\r\n return <LinkButton onClick={(_) => handleSubmit(entry.user!)}>{caption}</LinkButton>;\r\n };\r\n\r\n const hasSession = (entry: API.HistoryItem) => {\r\n return !!sessionStore.filelists.getSession(entry.user!.cid);\r\n };\r\n\r\n return (\r\n <div className=\"filelist session new\">\r\n <UserSelectField\r\n onChange={handleSubmit}\r\n offlineMessage={sessionT.t(\r\n 'offlineMessage',\r\n 'You must to be connected to at least one hub in order to download filelists from other users',\r\n )}\r\n isClearable={false}\r\n autoFocus={true}\r\n />\r\n <ShareProfileSelector onProfileChanged={onProfileChanged} sessionT={sessionT} />\r\n <RecentLayout\r\n entryType={HistoryEntryEnum.FILELIST}\r\n hasSession={hasSession}\r\n entryTitleRenderer={recentUserRender}\r\n entryIcon={IconConstants.FILELISTS_PLAIN}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default FilelistNew;\r\n","import * as React from 'react';\r\n\r\nimport { useFormatter } from '@/context/FormatterContext';\r\nimport { FooterItem, SessionFooter } from '@/routes/Sidebar/components/SessionFooter';\r\nimport { usingMobileLayout } from '@/utils/BrowserUtils';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\ninterface FilelistFooterProps {\r\n filelist: API.FilelistSession;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst FilelistFooter: React.FC<FilelistFooterProps> = ({ filelist, sessionT }) => {\r\n const { formatSize } = useFormatter();\r\n if (usingMobileLayout()) {\r\n return null;\r\n }\r\n\r\n let locationText = filelist.location!.type.str;\r\n if (locationText.length > 0) {\r\n locationText = `${formatSize(filelist.location!.size)} (${locationText})`;\r\n }\r\n\r\n return (\r\n <SessionFooter>\r\n <FooterItem label={sessionT.translate('Directory size')} text={locationText} />\r\n <FooterItem\r\n label={sessionT.translate('Total list size')}\r\n text={formatSize(filelist.total_size)}\r\n />\r\n </SessionFooter>\r\n );\r\n};\r\n\r\nexport default FilelistFooter;\r\n","import { Component } from 'react';\r\nimport RouteModal from '@/components/semantic/RouteModal';\r\n\r\nimport FileIcon from '@/components/icon/FileIcon';\r\n\r\nimport DownloadDialog from '@/components/download/DownloadDialog';\r\n\r\nimport ModalRouteDecorator, {\r\n ModalRouteDecoratorChildProps,\r\n} from '@/decorators/ModalRouteDecorator';\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from '@/decorators/DataProviderDecorator';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { FileItemInfoGrid } from '@/components/file-item-info';\r\nimport FilelistConstants from '@/constants/FilelistConstants';\r\nimport { filelistDownloadHandler } from '@/services/api/FilelistApi';\r\n\r\ninterface FilelistItemInfoDialogProps {\r\n filelist: API.FilelistSession;\r\n}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n fileItem: API.FilelistItem;\r\n}\r\n\r\ntype Props = FilelistItemInfoDialogProps & ModalRouteDecoratorChildProps;\r\n\r\nexport const FilelistItemGetter = (filelist: API.FilelistSession) => {\r\n const ret: UI.DownloadItemDataGetter<API.FilelistItem> = (itemId, socket) => {\r\n return socket.get(`${FilelistConstants.MODULE_URL}/${filelist.id}/items/${itemId}`);\r\n };\r\n\r\n return ret;\r\n};\r\n\r\nclass FilelistItemInfoDialog extends Component<Props & DataProps> {\r\n static readonly displayName = 'FilelistItemInfoDialog';\r\n\r\n render() {\r\n const { fileItem, filelist } = this.props;\r\n return (\r\n <RouteModal\r\n className=\"filelist-item\"\r\n title={fileItem.name}\r\n closable={true}\r\n icon={<FileIcon typeInfo={fileItem.type} />}\r\n fullHeight={true}\r\n {...this.props}\r\n >\r\n <DownloadDialog\r\n downloadHandler={filelistDownloadHandler}\r\n itemDataGetter={FilelistItemGetter(filelist)}\r\n userGetter={() => filelist.user}\r\n sessionItem={filelist}\r\n />\r\n <FileItemInfoGrid\r\n fileItem={fileItem}\r\n downloadHandler={filelistDownloadHandler}\r\n user={filelist.user}\r\n sessionItem={filelist}\r\n />\r\n </RouteModal>\r\n );\r\n }\r\n}\r\n\r\nconst Decorated = ModalRouteDecorator<FilelistItemInfoDialogProps>(\r\n DataProviderDecorator<Props, DataProps>(FilelistItemInfoDialog, {\r\n urls: {\r\n fileItem: ({ params, filelist }, socket) =>\r\n FilelistItemGetter(filelist)(params.itemId!, socket),\r\n },\r\n }),\r\n 'item/:itemId',\r\n);\r\n\r\nexport { Decorated as FilelistItemInfoDialog };\r\n","import ViewStoreMixin from '@/mixins/ViewStoreMixin';\nimport Reflux from 'reflux';\nimport FilelistConstants from '@/constants/FilelistConstants';\n// import FilelistSessionStore from '../reflux/FilelistSessionStore.ts.tmp';\n\nexport default Reflux.createStore({\n _viewName: `${FilelistConstants.VIEW_ID}_view`,\n _apiUrl: FilelistConstants.SESSIONS_URL,\n // _sessionStore: FilelistSessionStore,\n mixins: [ViewStoreMixin('name')],\n});\n","import FilelistConstants from '@/constants/FilelistConstants';\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 { refreshVirtual } from '@/services/api/ShareApi';\r\n\r\ntype Filter = UI.ActionFilter<API.FilelistItem, API.FilelistSession>;\r\n\r\n// Filters\r\nconst isMe: Filter = ({ entity }) => entity.user.flags.includes('self');\r\nconst isRoot: Filter = ({ itemData }) => itemData.path === '/';\r\nconst isPartialList: Filter = ({ entity }) => entity.partial_list;\r\nconst isDirectory: Filter = ({ itemData }) => itemData.type.id === 'directory';\r\n\r\nconst filterReload: Filter = (data) => isPartialList(data) && isDirectory(data);\r\nconst filterDetails: Filter = (data) => !isRoot(data);\r\n\r\n// Handlers\r\ntype Handler = UI.ActionHandler<API.FilelistItem, API.FilelistSession>;\r\n\r\nconst handleReloadDirectory: Handler = ({ itemData: item, entity: session, socket }) => {\r\n return socket.post(`${FilelistConstants.SESSIONS_URL}/${session.id}/directory`, {\r\n list_path: item.path,\r\n reload: true,\r\n });\r\n};\r\n\r\nconst handleRefreshShare: Handler = ({ itemData, socket }) => {\r\n return refreshVirtual(itemData.path, socket);\r\n};\r\n\r\nconst handleItemDetails: Handler = ({ itemData, navigate }) => {\r\n navigate(`item/${itemData.id}`);\r\n};\r\n\r\n// Actions\r\nexport const FilelistItemReloadDirectoryAction = {\r\n id: 'reloadDirectory',\r\n displayName: 'Reload',\r\n access: API.AccessEnum.FILELISTS_VIEW,\r\n icon: IconConstants.RELOAD,\r\n filter: filterReload,\r\n handler: handleReloadDirectory,\r\n};\r\n\r\nexport const FilelistItemRefreshShareAction = {\r\n id: 'refreshShare',\r\n displayName: 'Refresh in share',\r\n access: API.AccessEnum.SETTINGS_EDIT,\r\n icon: IconConstants.REFRESH_COLORED,\r\n filter: isMe,\r\n handler: handleRefreshShare,\r\n};\r\n\r\nexport const FilelistItemDetailsAction = {\r\n id: 'details',\r\n displayName: 'Details',\r\n icon: IconConstants.DETAILS,\r\n handler: handleItemDetails,\r\n filter: filterDetails,\r\n};\r\n\r\nconst FilelistItemActions: UI.ActionListType<API.FilelistItem, API.FilelistSession> = {\r\n reloadDirectory: FilelistItemReloadDirectoryAction,\r\n refreshShare: FilelistItemRefreshShareAction,\r\n details: FilelistItemDetailsAction,\r\n};\r\n\r\nexport const FilelistItemActionModule = {\r\n moduleId: UI.Modules.FILELISTS,\r\n subId: 'item',\r\n};\r\n\r\nexport const FilelistItemActionMenu = {\r\n moduleData: FilelistItemActionModule,\r\n actions: FilelistItemActions,\r\n};\r\n","import FilelistConstants from '@/constants/FilelistConstants';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\nimport { BuildRemoveSessionAction } from '../decorators/SessionActionDecorator';\r\n\r\nconst FilelistRemoveAction = BuildRemoveSessionAction(\r\n FilelistConstants.SESSIONS_URL,\r\n API.AccessEnum.FILELISTS_EDIT,\r\n);\r\n\r\nconst FilelistSessionActions: UI.ActionListType<API.FilelistSession> = {\r\n remove: FilelistRemoveAction,\r\n};\r\n\r\nexport const FilelistSessionActionModule = {\r\n moduleId: UI.Modules.FILELISTS,\r\n};\r\n\r\nexport const FilelistSessionActionMenu = {\r\n moduleData: FilelistSessionActionModule,\r\n actions: FilelistSessionActions,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { dupeToStringType } from '@/utils/TypeConvert';\r\nimport { TableActionMenu } from '@/components/action-menu';\r\n\r\nimport FilelistViewStore from '@/stores/views/FilelistViewStore';\r\n\r\nimport VirtualTable from '@/components/table/VirtualTable';\r\nimport {\r\n SizeCell,\r\n DurationCell,\r\n FileDownloadCell,\r\n FileDownloadCellCaptionGetter,\r\n} from '@/components/table/Cell';\r\nimport { Column } from 'fixed-data-table-2';\r\n\r\nimport IconConstants from '@/constants/IconConstants';\r\nimport Loader from '@/components/semantic/Loader';\r\nimport Message from '@/components/semantic/Message';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { FilelistItemInfoDialog } from './item-info-dialog';\r\nimport { RowWrapperCellChildProps } from '@/components/table/RowWrapperCell';\r\nimport { filelistDownloadHandler } from '@/services/api/FilelistApi';\r\nimport MenuConstants from '@/constants/MenuConstants';\r\nimport { FilelistItemActionMenu } from '@/actions/ui/filelist';\r\nimport { useSessionStore } from '@/context/SessionStoreContext';\r\nimport LinkButton from '@/components/semantic/LinkButton';\r\n\r\ninterface NameCellProps extends RowWrapperCellChildProps<string, API.FilelistItem> {\r\n filelist: API.FilelistSession;\r\n captionGetter: FileDownloadCellCaptionGetter;\r\n}\r\n\r\nconst NameCell: React.FC<NameCellProps> = ({\r\n rowDataGetter,\r\n captionGetter,\r\n filelist,\r\n cellData,\r\n ...other\r\n}) => {\r\n return (\r\n <FileDownloadCell\r\n userGetter={() => filelist.user}\r\n downloadHandler={filelistDownloadHandler}\r\n rowDataGetter={rowDataGetter}\r\n entity={filelist}\r\n remoteMenuId={MenuConstants.FILELIST_ITEM}\r\n captionGetter={captionGetter}\r\n triggerProps={{\r\n 'aria-label': `${cellData} actions`,\r\n }}\r\n cellData={cellData}\r\n {...other}\r\n >\r\n <TableActionMenu\r\n actions={FilelistItemActionMenu}\r\n itemData={rowDataGetter}\r\n ids={['refreshShare', 'details']}\r\n entity={filelist}\r\n />\r\n </FileDownloadCell>\r\n );\r\n};\r\n\r\ninterface ListBrowserProps {\r\n filelist: API.FilelistSession;\r\n onClickDirectory: (path: string) => void;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst FilelistItemTable: React.FC<ListBrowserProps> = ({\r\n filelist,\r\n sessionT,\r\n onClickDirectory,\r\n ...other\r\n}) => {\r\n const rowClassNameGetter = (rowData: API.FilelistItem) => {\r\n // Don't highlight dupes in own filelist...\r\n const isOwnList = filelist.user.flags.includes('self');\r\n return isOwnList ? '' : dupeToStringType(rowData.dupe);\r\n };\r\n\r\n const emptyRowsNodeGetter = () => {\r\n const { location, state } = filelist;\r\n const { translate } = sessionT;\r\n\r\n if (state.id === 'download_failed') {\r\n return (\r\n <Message\r\n icon={IconConstants.ERROR}\r\n title={translate('Download failed')}\r\n description={state.str}\r\n />\r\n );\r\n }\r\n\r\n // The list finished downloading but the view hasn't updated yet\r\n const { files, directories } = location!.type as API.DirectoryType;\r\n if (files !== 0 || directories !== 0) {\r\n return <Loader text={translate('Updating view')} />;\r\n }\r\n\r\n // The directory was changed but the download state hasn't changed yet\r\n if (!location!.complete) {\r\n return <Loader text={translate('Preparing download')} />;\r\n }\r\n\r\n return (\r\n <Message\r\n title={translate('No content to display')}\r\n description={translate('The directory is empty')}\r\n />\r\n );\r\n };\r\n\r\n const getNameCellCaption: FileDownloadCellCaptionGetter = (cellData, rowDataGetter) => {\r\n if (rowDataGetter().type.id === 'directory') {\r\n const onClick = () => onClickDirectory(filelist.location!.path + cellData + '/');\r\n return <LinkButton onClick={onClick}>{cellData}</LinkButton>;\r\n }\r\n\r\n return cellData;\r\n };\r\n\r\n // const { session } = this.props;\r\n const sessionStore = useSessionStore();\r\n return (\r\n <>\r\n <VirtualTable\r\n emptyRowsNodeGetter={emptyRowsNodeGetter}\r\n rowClassNameGetter={rowClassNameGetter}\r\n store={FilelistViewStore}\r\n entityId={filelist.id}\r\n viewId={filelist.location!.path}\r\n sessionStore={sessionStore.filelists}\r\n moduleId={UI.Modules.FILELISTS}\r\n textFilterProps={{\r\n autoFocus: true,\r\n }}\r\n >\r\n <Column\r\n name=\"Name\"\r\n width={200}\r\n columnKey=\"name\"\r\n cell={<NameCell captionGetter={getNameCellCaption} filelist={filelist} />}\r\n flexGrow={8}\r\n />\r\n <Column\r\n name=\"Size\"\r\n width={60}\r\n columnKey=\"size\"\r\n cell={<SizeCell />}\r\n flexGrow={1}\r\n />\r\n <Column name=\"Type\" width={70} columnKey=\"type\" flexGrow={1} hideWidth={500} />\r\n <Column\r\n name=\"Last modified\"\r\n width={80}\r\n columnKey=\"time\"\r\n cell={<DurationCell />}\r\n flexGrow={1}\r\n />\r\n </VirtualTable>\r\n <FilelistItemInfoDialog filelist={filelist} />\r\n </>\r\n );\r\n};\r\n\r\nexport default FilelistItemTable;\r\n","import * as React from 'react';\r\n\r\nimport BrowserBar from '@/components/browserbar/BrowserBar';\r\nimport { ActionMenu, DownloadMenu } from '@/components/action-menu';\r\n\r\nimport DownloadDialog from '@/components/download/DownloadDialog';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { FilelistItemGetter } from './item-info-dialog';\r\nimport FilelistItemTable from './FilelistItemTable';\r\nimport { filelistDownloadHandler } from '@/services/api/FilelistApi';\r\nimport MenuConstants from '@/constants/MenuConstants';\r\nimport { Location, useBlocker } from 'react-router';\r\nimport { useSyncFilelistLocation } from '../effects/useSyncFilelistLocation';\r\nimport NotificationActions from '@/actions/NotificationActions';\r\nimport { FilelistItemActionMenu } from '@/actions/ui/filelist';\r\n\r\ninterface ListBrowserProps {\r\n filelist: API.FilelistSession;\r\n location: Location;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst ListBrowser: React.FC<ListBrowserProps> = (props) => {\r\n const { sessionT, filelist } = props;\r\n const [hasClickedDirectory, setHasClickedDirectory] = React.useState(false);\r\n\r\n const updateLocationState = useSyncFilelistLocation(props);\r\n\r\n const handleClickDirectory = (path: string) => {\r\n if (!hasClickedDirectory) {\r\n setHasClickedDirectory(true);\r\n }\r\n\r\n updateLocationState(path, false);\r\n };\r\n\r\n useBlocker(({ currentLocation, nextLocation, historyAction }) => {\r\n if (\r\n historyAction === 'POP' &&\r\n hasClickedDirectory &&\r\n nextLocation.pathname !== currentLocation.pathname\r\n ) {\r\n setHasClickedDirectory(false);\r\n NotificationActions.info({\r\n title: sessionT.t('confirmLeave', 'Confirm action'),\r\n message: sessionT.t(\r\n 'confirmLeaveDesc',\r\n 'Click the back button again to leave this filelist',\r\n ),\r\n });\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n const getCurrentDirectory = () => {\r\n return filelist.location;\r\n };\r\n\r\n const selectedNameFormatter = (caption: React.ReactNode) => {\r\n return (\r\n <DownloadMenu\r\n caption={caption}\r\n user={filelist.user}\r\n itemInfoGetter={getCurrentDirectory}\r\n downloadHandler={filelistDownloadHandler}\r\n contextElement=\".session-container\"\r\n entity={filelist}\r\n remoteMenuId={MenuConstants.FILELIST_ITEM}\r\n >\r\n <ActionMenu\r\n itemData={filelist.location}\r\n actions={FilelistItemActionMenu}\r\n entity={filelist}\r\n />\r\n </DownloadMenu>\r\n );\r\n };\r\n\r\n const userGetter = () => {\r\n return filelist.user;\r\n };\r\n\r\n const filelistItemFetcher = FilelistItemGetter(filelist);\r\n\r\n return (\r\n <div className=\"browser\">\r\n <BrowserBar\r\n path={filelist.location!.path}\r\n separator=\"/\"\r\n rootPath=\"/\"\r\n rootName={sessionT.translate('Root')}\r\n itemClickHandler={handleClickDirectory}\r\n selectedNameFormatter={selectedNameFormatter}\r\n // Just to make sure that the bar gets re-rendered when the switching to a different session (due to dropdown)\r\n entityId={filelist.id}\r\n />\r\n <FilelistItemTable\r\n filelist={filelist}\r\n sessionT={sessionT}\r\n onClickDirectory={handleClickDirectory}\r\n />\r\n <DownloadDialog\r\n downloadHandler={filelistDownloadHandler}\r\n itemDataGetter={filelistItemFetcher}\r\n userGetter={userGetter}\r\n sessionItem={filelist}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default ListBrowser;\r\n","import * as React from 'react';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { changeFilelistDirectory } from '@/services/api/FilelistApi';\r\nimport { runBackgroundSocketAction } from '@/utils/ActionUtils';\r\nimport { Location, useNavigate } from 'react-router';\r\nimport { useSocket } from '@/context/SocketContext';\r\n\r\nexport type FilelistLocationState = { directory: string } | undefined;\r\n\r\ninterface ListBrowserProps {\r\n filelist: API.FilelistSession;\r\n location: Location;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\n// Keeps the current location in sync with the backend\r\nexport const useSyncFilelistLocation = ({\r\n filelist,\r\n location,\r\n sessionT,\r\n}: ListBrowserProps) => {\r\n const navigate = useNavigate();\r\n const socket = useSocket();\r\n\r\n const apiSendChangeDirectory = (directory: string) => {\r\n runBackgroundSocketAction(\r\n () => changeFilelistDirectory(filelist, directory, socket),\r\n sessionT.plainT,\r\n );\r\n };\r\n\r\n const updateLocationState = (directory: string, replace: boolean) => {\r\n const locationState = location.state as FilelistLocationState;\r\n if (directory === locationState?.directory) {\r\n return;\r\n }\r\n\r\n // Handle it through location state data\r\n // as we also handle history navigation changes\r\n const newState: FilelistLocationState = {\r\n directory,\r\n };\r\n\r\n navigate(location.pathname, {\r\n state: newState,\r\n replace,\r\n });\r\n };\r\n\r\n // Handler for directory changes received from the API\r\n React.useEffect(() => {\r\n const locationState = location.state as FilelistLocationState;\r\n\r\n if (!locationState) {\r\n // Initial mount\r\n updateLocationState(filelist.location!.path, true);\r\n return;\r\n }\r\n\r\n // Nothing has changed?\r\n if (locationState.directory === filelist.location!.path) {\r\n return;\r\n }\r\n\r\n // Change initiated by another session/GUI, update our location\r\n updateLocationState(filelist.location!.path, true);\r\n }, [filelist.location?.path]);\r\n\r\n // Handler for own changes\r\n React.useEffect(() => {\r\n const locationState = location.state as FilelistLocationState;\r\n if (!locationState) {\r\n // Initial mount, handled by the previous useEffect\r\n return;\r\n }\r\n\r\n const directory = locationState.directory;\r\n if (directory === filelist.location!.path) {\r\n return;\r\n }\r\n\r\n // It's our change\r\n if (directory) {\r\n apiSendChangeDirectory(directory);\r\n }\r\n }, [(location.state as FilelistLocationState)?.directory]);\r\n\r\n return updateLocationState;\r\n};\r\n","import FilelistFooter from '@/routes/Sidebar/routes/Filelists/components/FilelistFooter';\r\n\r\nimport Loader from '@/components/semantic/Loader';\r\nimport Message from '@/components/semantic/Message';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport classNames from 'classnames';\r\nimport ListBrowser from './ListBrowser';\r\nimport { SessionChildProps } from '@/routes/Sidebar/components/types';\r\nimport { useActiveSession } from '@/effects/ActiveSessionEffect';\r\nimport { FilelistAPIActions } from '@/actions/store/FilelistActions';\r\nimport { FilelistStoreSelector } from '@/stores/session/filelistSlice';\r\n\r\ntype FilelistSessionProps = SessionChildProps<\r\n API.FilelistSession,\r\n UI.EmptyObject,\r\n UI.EmptyObject\r\n>;\r\n\r\nconst FilelistSession: React.FC<FilelistSessionProps> = ({\r\n sessionItem,\r\n sessionT,\r\n location: routerLocation,\r\n}) => {\r\n useActiveSession(sessionItem, FilelistAPIActions, FilelistStoreSelector);\r\n\r\n const { user, location: listLocation, state } = sessionItem;\r\n\r\n const isOwnList = user.flags.includes('self');\r\n const className = classNames('filelist session', { self: isOwnList });\r\n if (user.flags.includes('offline') && !isOwnList) {\r\n return (\r\n <div className={className}>\r\n <Message\r\n title={sessionT.t('userOffline', 'User offline')}\r\n description={sessionT.t(\r\n 'userOfflineDesc',\r\n 'You will be able to continue browsing when the user comes back online',\r\n )}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n if ((state.id !== 'loaded' && state.id !== 'download_failed') || !listLocation) {\r\n return (\r\n <div className={className}>\r\n <Loader text={state.str} />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={className}>\r\n <ListBrowser location={routerLocation} filelist={sessionItem} sessionT={sessionT} />\r\n\r\n <FilelistFooter filelist={sessionItem} sessionT={sessionT} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default FilelistSession;\r\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\r\n\r\nimport SessionLayout from '@/routes/Sidebar/components/SessionLayout';\r\nimport UserItemHandlerDecorator from '@/routes/Sidebar/decorators/UserItemHandlerDecorator';\r\n\r\nimport FilelistNew from '@/routes/Sidebar/routes/Filelists/components/FilelistNew';\r\nimport FilelistSession from '@/routes/Sidebar/routes/Filelists/components/FilelistSession';\r\n\r\nimport '../style.css';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\nimport {\r\n SessionProviderDecorator,\r\n SessionProviderDecoratorChildProps,\r\n} from '@/routes/Sidebar/decorators/SessionProviderDecorator';\r\nimport IconConstants from '@/constants/IconConstants';\r\nimport { FilelistSessionActionMenu } from '@/actions/ui/filelist';\r\nimport { FilelistAPIActions } from '@/actions/store/FilelistActions';\r\nimport { FilelistStoreSelector } from '@/stores/session/filelistSlice';\r\nimport MenuConstants from '@/constants/MenuConstants';\r\n\r\nconst UserItemHandler = UserItemHandlerDecorator(['message']);\r\nconst ItemHandler: UI.SessionInfoGetter<API.FilelistSession> = {\r\n itemLabelGetter() {\r\n return null;\r\n },\r\n\r\n itemNameGetter(session) {\r\n return session.share_profile\r\n ? session.share_profile.str\r\n : UserItemHandler.itemNameGetter(session);\r\n },\r\n\r\n itemStatusGetter(session) {\r\n return session.share_profile ? 'blue' : UserItemHandler.itemStatusGetter!(session);\r\n },\r\n\r\n itemHeaderTitleGetter(session, location, actionMenu) {\r\n return session.share_profile\r\n ? actionMenu\r\n : UserItemHandler.itemHeaderTitleGetter!(session, location, actionMenu);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return session.share_profile\r\n ? null\r\n : UserItemHandler.itemHeaderDescriptionGetter(session);\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return session.share_profile\r\n ? 'green server'\r\n : UserItemHandler.itemHeaderIconGetter(session);\r\n },\r\n};\r\n\r\nconst Filelists: React.FC<SessionProviderDecoratorChildProps<API.FilelistSession>> = (\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=\"filelists\"\r\n newCaption={sessionT.t('new', 'Open filelist')}\r\n newDescription={sessionT.t('newDesc', 'Start browsing a new filelist')}\r\n newIcon={IconConstants.FILELISTS_PLAIN}\r\n disableSideMenu={true}\r\n editAccess={API.AccessEnum.FILELISTS_EDIT}\r\n uiActions={FilelistSessionActionMenu}\r\n sessionApi={FilelistAPIActions}\r\n sessionStoreSelector={FilelistStoreSelector}\r\n sessionItemLayout={FilelistSession}\r\n newLayout={FilelistNew}\r\n sessionT={sessionT}\r\n remoteMenuId={MenuConstants.FILELIST}\r\n {...ItemHandler}\r\n {...other}\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(\r\n Filelists,\r\n FilelistStoreSelector,\r\n UI.Modules.FILELISTS,\r\n);\r\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.fileitem.info.segment .dupe-paths .path {\n overflow-x: hidden;\n}\n\n.fileitem.info.segment .download.ui.dropdown {\n max-width: 150px;\n margin-top: 10px;\n}\n\n.fileitem.info.segment .title.column {\n margin-top: auto;\n margin-bottom: auto;\n}\n\n.fileitem.info.segment .value.column {\n word-break: break-all;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/file-item-info/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB\",\"sourcesContent\":[\".fileitem.info.segment .dupe-paths .path {\\n overflow-x: hidden;\\n}\\n\\n.fileitem.info.segment .download.ui.dropdown {\\n max-width: 150px;\\n margin-top: 10px;\\n}\\n\\n.fileitem.info.segment .title.column {\\n margin-top: auto;\\n margin-bottom: auto;\\n}\\n\\n.fileitem.info.segment .value.column {\\n word-break: break-all;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import ShareConstants from '@/constants/ShareConstants';\r\nimport { APISocket } from '@/services/SocketService';\r\n\r\nimport { uploadTempFile } from '../HttpService';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nexport interface AddTempShareResponse {\r\n magnet: string;\r\n}\r\n\r\ninterface TempFileData {\r\n file: File;\r\n hubUrl: string;\r\n cid?: string;\r\n}\r\n\r\nexport const shareTempFile = async (\r\n { file, hubUrl, cid }: TempFileData,\r\n { auth_token: authToken }: UI.AuthenticatedSession,\r\n socket: APISocket,\r\n): Promise<AddTempShareResponse> => {\r\n // eslint-disable-next-line no-useless-catch\r\n try {\r\n const fileId = await uploadTempFile(file, authToken);\r\n const res = await socket.post<AddTempShareResponse>(ShareConstants.TEMP_SHARES_URL, {\r\n name: file.name,\r\n file_id: fileId,\r\n hub_url: hubUrl,\r\n cid,\r\n });\r\n\r\n return res;\r\n } catch (e) {\r\n throw e;\r\n }\r\n};\r\n\r\nexport const refresh = (incoming: boolean, socket: APISocket) => {\r\n return socket.post(ShareConstants.REFRESH_URL, {\r\n incoming,\r\n priority: API.RefreshPriorityTypeEnum.MANUAL,\r\n });\r\n};\r\n\r\nexport const refreshPaths = (paths: string[], socket: APISocket) => {\r\n return socket.post(ShareConstants.REFRESH_PATHS_URL, {\r\n paths,\r\n priority: API.RefreshPriorityTypeEnum.MANUAL,\r\n });\r\n};\r\n\r\nexport const refreshVirtual = (path: string, socket: APISocket) => {\r\n return socket.post(ShareConstants.REFRESH_VIRTUAL_URL, {\r\n path,\r\n });\r\n};\r\n\r\nexport const abortRefreshTask = (id: number, socket: APISocket) => {\r\n return socket.delete(`${ShareConstants.REFRESH_TASKS_URL}/${id}`);\r\n};\r\n","import * as React from 'react';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from '@/decorators/DataProviderDecorator';\r\nimport { useFormatter } from '@/context/FormatterContext';\r\n\r\nimport LayoutHeader from '@/components/semantic/LayoutHeader';\r\nimport { ListItem } from '@/components/semantic/List';\r\n\r\nimport HistoryConstants, { HistoryEntryEnum } from '@/constants/HistoryConstants';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\nimport { translate, toI18nKey } from '@/utils/TranslationUtils';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\ninterface RecentLayoutProps {\r\n // Title of the button\r\n entryIcon: string;\r\n\r\n // URL for fetching the recent entries\r\n entryType: HistoryEntryEnum;\r\n\r\n // Renders the recent entry title\r\n entryTitleRenderer: (entry: API.HistoryItem) => React.ReactNode;\r\n\r\n // Returns whether the recent entry is currently active\r\n hasSession: (entry: API.HistoryItem) => boolean;\r\n}\r\n\r\ninterface DataProps {\r\n entries: API.HistoryItem[];\r\n}\r\n\r\ntype Props = RecentLayoutProps & DataProps & DataProviderDecoratorChildProps;\r\n\r\nconst RecentLayout: React.FC<Props> = ({\r\n entries,\r\n entryTitleRenderer,\r\n hasSession,\r\n entryIcon,\r\n}) => {\r\n const { formatRelativeTime } = useFormatter();\r\n const { t } = useTranslation();\r\n if (entries.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"recents\">\r\n <LayoutHeader title={translate('Recent sessions', t, UI.Modules.COMMON)} size=\"\" />\r\n <div className=\"ui relaxed divided list\">\r\n {entries.map((entry, index) => (\r\n <ListItem\r\n key={index}\r\n header={entryTitleRenderer(entry)}\r\n description={\r\n !!entry.last_opened &&\r\n t(toI18nKey('openedAgo', UI.Modules.COMMON), {\r\n defaultValue: 'Opened {{timeAgo}}',\r\n replace: {\r\n timeAgo: formatRelativeTime(entry.last_opened),\r\n },\r\n })\r\n }\r\n icon={(hasSession(entry) ? 'green ' : '') + entryIcon}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const getHistoryUrl = (entryType: HistoryEntryEnum) => {\r\n return `${HistoryConstants.SESSIONS_URL}/${entryType}/0`;\r\n};\r\n\r\nexport default DataProviderDecorator<RecentLayoutProps, DataProps>(\r\n //RedrawDecorator<Props>(RecentLayout),\r\n RecentLayout,\r\n {\r\n urls: {\r\n entries: ({ entryType }, socket) => socket.get(getHistoryUrl(entryType)),\r\n },\r\n },\r\n);\r\n","import * as React from 'react';\r\nimport { merge } from 'lodash';\r\n\r\nimport ShareProfileConstants from '@/constants/ShareProfileConstants';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n DataProviderDecoratorSettings,\r\n DataConverter,\r\n} from '@/decorators/DataProviderDecorator';\r\n\r\nimport * as API from '@/types/api';\r\n\r\ninterface ShareProfileDecoratorDataProps {\r\n profiles: API.ShareProfile[];\r\n}\r\n\r\nexport type ShareProfileDecoratorChildProps = DataProviderDecoratorChildProps &\r\n ShareProfileDecoratorDataProps;\r\n\r\nconst ShareProfileDecorator = function <PropsT extends object>(\r\n Component: React.ComponentType<PropsT & ShareProfileDecoratorChildProps>,\r\n listHidden: boolean,\r\n dataProviderDecoratorSettings?: DataProviderDecoratorSettings<\r\n PropsT,\r\n ShareProfileDecoratorDataProps\r\n >,\r\n) {\r\n const convertProfiles: DataConverter<PropsT> = (data: API.ShareProfile[], { t }) => {\r\n const profiles = data.filter(\r\n (p) => listHidden || p.id !== ShareProfileConstants.HIDDEN_PROFILE_ID,\r\n );\r\n\r\n return profiles;\r\n };\r\n\r\n return DataProviderDecorator<PropsT, ShareProfileDecoratorDataProps>(\r\n Component,\r\n merge(dataProviderDecoratorSettings, {\r\n urls: {\r\n profiles: ShareProfileConstants.PROFILES_URL,\r\n },\r\n dataConverters: {\r\n profiles: convertProfiles,\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData }) => {\r\n addSocketListener(\r\n ShareProfileConstants.MODULE_URL,\r\n ShareProfileConstants.PROFILE_ADDED,\r\n () => refetchData(),\r\n );\r\n addSocketListener(\r\n ShareProfileConstants.MODULE_URL,\r\n ShareProfileConstants.PROFILE_UPDATED,\r\n () => refetchData(),\r\n );\r\n addSocketListener(\r\n ShareProfileConstants.MODULE_URL,\r\n ShareProfileConstants.PROFILE_REMOVED,\r\n () => refetchData(),\r\n );\r\n },\r\n } as DataProviderDecoratorSettings<PropsT, ShareProfileDecoratorDataProps>),\r\n );\r\n};\r\n\r\nexport default ShareProfileDecorator;\r\n","const MODULE_URL = 'share_profiles';\nexport default {\n MODULE_URL: MODULE_URL,\n PROFILES_URL: MODULE_URL,\n\n PROFILE_ADDED: 'share_profile_added',\n PROFILE_UPDATED: 'share_profile_updated',\n PROFILE_REMOVED: 'share_profile_removed',\n\n HIDDEN_PROFILE_ID: 1,\n};\n","import { fetchData } from '@/utils/HttpUtils';\r\n\r\nimport * as UI from '@/types/ui';\r\n\r\nexport const uploadTempFile = async (file: File, authToken: string): Promise<string> => {\r\n // eslint-disable-next-line no-useless-catch\r\n try {\r\n const res = await fetchData(`${getBasePath()}temp`, {\r\n method: 'POST',\r\n headers: {\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/330\r\n 'X-Authorization': authToken,\r\n\r\n Authorization: authToken,\r\n },\r\n body: file,\r\n });\r\n\r\n return res.headers.get('Location')!;\r\n } catch (e) {\r\n throw e;\r\n }\r\n};\r\n\r\nconst toCorsSafeUrl = (url: string) => {\r\n const proxyUrl = `${\r\n window.location.origin\r\n }${getBasePath()}proxy?url=${encodeURIComponent(url)}`;\r\n return proxyUrl;\r\n};\r\n\r\ninterface FetchDataOptions extends RequestInit {\r\n isJSON?: boolean;\r\n}\r\n\r\nexport const fetchCorsSafeData = async (\r\n url: string,\r\n session: UI.AuthenticatedSession,\r\n options: FetchDataOptions = { isJSON: true },\r\n) => {\r\n try {\r\n //console.log(`CORS HTTP request started (${url})`);\r\n\r\n const res = await fetchData(toCorsSafeUrl(url), {\r\n headers: {\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/330\r\n 'X-Authorization': session.auth_token,\r\n\r\n // Temp workaround for people upgrading from versions < 2.7.0\r\n // If the new UI was loaded before restarting the app, a cache expiration time of\r\n // one year would have been set for \"Not found\" errors...\r\n 'Cache-Control': 'no-store, must-revalidate, max-age=0',\r\n },\r\n ...options,\r\n });\r\n\r\n const data = (await options.isJSON) ? res.json() : res.text();\r\n return data;\r\n } catch (e) {\r\n console.error(`CORS HTTP request failed (${url})`, e);\r\n throw e;\r\n }\r\n};\r\n","\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';\r\n\r\nimport { useFormatter } from '@/context/FormatterContext';\r\n\r\nimport { DownloadMenu } from '@/components/action-menu';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate } from '@/utils/TranslationUtils';\r\n\r\nimport './style.css';\r\nimport { Row, Grid } from '@/components/semantic/Grid';\r\n\r\nconst DupeStrings = {\r\n //[API.DupeEnum.NONE]: 'None',\r\n [API.DupeEnum.SHARE_PARTIAL]: 'Share (partial)',\r\n [API.DupeEnum.SHARE_FULL]: 'Share (full)',\r\n [API.DupeEnum.QUEUE_PARTIAL]: 'Queue (partial)',\r\n [API.DupeEnum.QUEUE_FULL]: 'Queue (full)',\r\n [API.DupeEnum.FINISHED_PARTIAL]: 'Finished (partial)',\r\n [API.DupeEnum.FINISHED_FULL]: 'Finished (full)',\r\n [API.DupeEnum.SHARE_QUEUE]: 'Share and queue',\r\n [API.DupeEnum.SHARE_FINISHED]: 'Share and finished',\r\n [API.DupeEnum.QUEUE_FINISHED]: 'Queue and finished',\r\n [API.DupeEnum.SHARE_QUEUE_FINISHED]: 'Share, queue and finished',\r\n};\r\n\r\nconst DupePaths: React.FC<{ paths: string[] }> = ({ paths }) => (\r\n <div className=\"dupe-paths\">\r\n {paths.map((path) => (\r\n <div key={path} className=\"path\">\r\n {path}\r\n </div>\r\n ))}\r\n </div>\r\n);\r\n\r\ninterface FileItemInfoGridProps {\r\n fileItem: UI.DownloadableItemInfo;\r\n user: API.HintedUser;\r\n downloadHandler: UI.DownloadHandler<UI.DownloadableItemInfo>;\r\n showPath?: boolean;\r\n sessionItem: UI.SessionItemBase;\r\n}\r\n\r\nconst FileItemInfoGrid: React.FC<FileItemInfoGridProps> = ({\r\n sessionItem,\r\n fileItem,\r\n user,\r\n downloadHandler,\r\n showPath = true,\r\n}) => {\r\n const { t } = useTranslation();\r\n const gridT = (text: string) => {\r\n return translate(text, t, UI.Modules.COMMON);\r\n };\r\n\r\n const { formatSize, formatRelativeTime } = useFormatter();\r\n return (\r\n <div className=\"ui fileitem info segment\">\r\n <Grid columns=\"two\" stackable={true}>\r\n <Row title={gridT('Name')} text={fileItem.name} />\r\n <Row title={gridT('Type/content')} text={fileItem.type.str} />\r\n <Row title={gridT('Size')} text={formatSize(fileItem.size, 2, true)} />\r\n <Row\r\n title={gridT('Last modified')}\r\n text={formatRelativeTime(fileItem.time || 0)}\r\n />\r\n {fileItem.type.id === 'file' && <Row title={gridT('TTH')} text={fileItem.tth} />}\r\n {!!fileItem.dupe && (\r\n <Row title={gridT('Dupe type')} text={gridT(DupeStrings[fileItem.dupe.id])} />\r\n )}\r\n {!!fileItem.dupe && (\r\n <Row\r\n title={gridT('Dupe paths')}\r\n text={<DupePaths paths={fileItem.dupe.paths} />}\r\n />\r\n )}\r\n {showPath && <Row title={gridT('Path')} text={fileItem.path} />}\r\n </Grid>\r\n\r\n <DownloadMenu\r\n caption={gridT('Actions...')}\r\n button={true}\r\n user={user}\r\n itemInfoGetter={() => fileItem}\r\n downloadHandler={downloadHandler}\r\n contextElement=\".ui.modal > .content\"\r\n entity={sessionItem}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport { FileItemInfoGrid };\r\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#sidebar .virtual-table {\n flex: 1 100 100%;\n}\n\n.filelist.session .browser,\n.filelist.session .browser .virtual-table {\n height: calc(100% - 35px);\n}\n\n#mobile-layout .filelist.session .browser {\n height: 100%;\n}\n\n#mobile-layout .filelist.session .browser {\n height: calc(100% - 10px);\n}\n\n@media screen and (min-color-index: 0) and(-webkit-min-device-pixel-ratio:0) {\n /* Safari specific CSS */\n .filelist.session .browser {\n height: calc(100% - 95px);\n }\n\n #mobile-layout .filelist.session .browser {\n height: calc(100% - 60px);\n }\n}\n\n.filelist.session .browser .ui.segment {\n margin-bottom: 10px;\n}\n\n.filelist.session {\n max-height: 100%;\n overflow: hidden;\n margin-top: 10px;\n flex: 1 1 100%;\n}\n\n.session.new .profile.ui.dropdown {\n margin-top: 10px;\n color: gray;\n align-self: flex-end;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Filelists/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,yBAAyB;AAC3B;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,wBAAwB;EACxB;IACE,yBAAyB;EAC3B;;EAEA;IACE,yBAAyB;EAC3B;AACF;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,gBAAgB;EAChB,WAAW;EACX,oBAAoB;AACtB\",\"sourcesContent\":[\"#sidebar .virtual-table {\\n flex: 1 100 100%;\\n}\\n\\n.filelist.session .browser,\\n.filelist.session .browser .virtual-table {\\n height: calc(100% - 35px);\\n}\\n\\n#mobile-layout .filelist.session .browser {\\n height: 100%;\\n}\\n\\n#mobile-layout .filelist.session .browser {\\n height: calc(100% - 10px);\\n}\\n\\n@media screen and (min-color-index: 0) and(-webkit-min-device-pixel-ratio:0) {\\n /* Safari specific CSS */\\n .filelist.session .browser {\\n height: calc(100% - 95px);\\n }\\n\\n #mobile-layout .filelist.session .browser {\\n height: calc(100% - 60px);\\n }\\n}\\n\\n.filelist.session .browser .ui.segment {\\n margin-bottom: 10px;\\n}\\n\\n.filelist.session {\\n max-height: 100%;\\n overflow: hidden;\\n margin-top: 10px;\\n flex: 1 1 100%;\\n}\\n\\n.session.new .profile.ui.dropdown {\\n margin-top: 10px;\\n color: gray;\\n align-self: flex-end;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n"],"names":["formatProfileNameWithSize","profile","formatSize","str","id","HIDDEN_PROFILE_ID","size","profileToEnumValue","formatter","name","itemMenuIds","itemNameGetter","session","user","nicks","itemStatusGetter","flags","itemHeaderDescriptionGetter","hub_names","itemHeaderIconGetter","itemHeaderTitleGetter","location","actionMenu","ids","remoteMenuId","HINTED_USER","ShareProfileDecorator","sessionT","profiles","onProfileChanged","Dropdown","className","caption","translate","triggerIcon","map","MenuItemLink","onClick","navigate","sessionStore","socket","createSessionProps","t","plainT","handleSubmit","createRemoteSession","onChange","offlineMessage","isClearable","autoFocus","shareProfileId","initCreateLocalSession","RecentLayout","entryType","FILELIST","hasSession","entry","filelists","getSession","cid","entryTitleRenderer","description","LinkButton","_","entryIcon","IconConstants","FILELISTS_PLAIN","filelist","locationText","type","length","SessionFooter","label","text","total_size","FilelistItemGetter","itemId","get","FilelistConstants","MODULE_URL","FilelistItemInfoDialog","Component","render","fileItem","this","props","RouteModal","title","closable","icon","FileIcon","typeInfo","fullHeight","DownloadDialog","downloadHandler","itemDataGetter","userGetter","sessionItem","displayName","Decorated","ModalRouteDecorator","DataProviderDecorator","urls","params","_viewName","VIEW_ID","_apiUrl","SESSIONS_URL","mixins","ViewStoreMixin","FilelistItemActions","reloadDirectory","access","FILELISTS_VIEW","RELOAD","filter","data","entity","partial_list","isPartialList","itemData","isDirectory","handler","item","post","list_path","path","reload","refreshShare","SETTINGS_EDIT","REFRESH_COLORED","includes","details","DETAILS","isRoot","FilelistItemActionMenu","moduleData","moduleId","FILELISTS","subId","actions","FilelistSessionActions","remove","FILELISTS_EDIT","FilelistSessionActionMenu","NameCell","rowDataGetter","captionGetter","cellData","other","MenuConstants","FILELIST_ITEM","triggerProps","onClickDirectory","VirtualTable","emptyRowsNodeGetter","state","Message","ERROR","files","directories","Loader","complete","rowClassNameGetter","rowData","dupe","store","FilelistViewStore","entityId","viewId","textFilterProps","width","columnKey","cell","flexGrow","hideWidth","hasClickedDirectory","setHasClickedDirectory","updateLocationState","directory","replace","locationState","newState","pathname","apiSendChangeDirectory","useSyncFilelistLocation","handleClickDirectory","currentLocation","nextLocation","historyAction","NotificationActions","info","message","getCurrentDirectory","filelistItemFetcher","BrowserBar","separator","rootPath","rootName","itemClickHandler","selectedNameFormatter","itemInfoGetter","contextElement","routerLocation","listLocation","isOwnList","self","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","UserItemHandler","UserItemHandlerDecorator","ItemHandler","itemLabelGetter","share_profile","SessionProviderDecorator","SessionLayout","activeId","baseUrl","newCaption","newDescription","newIcon","disableSideMenu","editAccess","uiActions","sessionApi","sessionStoreSelector","sessionItemLayout","newLayout","___CSS_LOADER_EXPORT___","push","module","shareTempFile","file","hubUrl","auth_token","authToken","fileId","TEMP_SHARES_URL","file_id","hub_url","e","refreshPaths","paths","REFRESH_PATHS_URL","priority","MANUAL","refreshVirtual","REFRESH_VIRTUAL_URL","abortRefreshTask","delete","REFRESH_TASKS_URL","entries","formatRelativeTime","COMMON","index","header","last_opened","defaultValue","timeAgo","getHistoryUrl","listHidden","dataProviderDecoratorSettings","merge","PROFILES_URL","dataConverters","p","onSocketConnected","addSocketListener","refetchData","PROFILE_ADDED","PROFILE_UPDATED","PROFILE_REMOVED","uploadTempFile","getBasePath","method","headers","Authorization","body","fetchCorsSafeData","url","isJSON","res","window","origin","encodeURIComponent","toCorsSafeUrl","json","console","error","DupeStrings","SHARE_PARTIAL","SHARE_FULL","QUEUE_PARTIAL","QUEUE_FULL","FINISHED_PARTIAL","FINISHED_FULL","SHARE_QUEUE","SHARE_FINISHED","QUEUE_FINISHED","SHARE_QUEUE_FINISHED","DupePaths","FileItemInfoGrid","showPath","gridT","Grid","columns","stackable","time","tth","button"],"sourceRoot":""}
|