airdcpp-webui 2.13.1-beta.4 → 2.13.1-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/.github/workflows/node.js.yml +7 -4
  2. package/dist/index.html +1 -1
  3. package/dist/js/223.4d5951376f9fbb57d571.chunk.js +2 -0
  4. package/dist/js/223.4d5951376f9fbb57d571.chunk.js.gz +0 -0
  5. package/dist/js/223.4d5951376f9fbb57d571.chunk.js.map +1 -0
  6. package/dist/js/544.ea8aa126d1973f0321b3.chunk.js +2 -0
  7. package/dist/js/544.ea8aa126d1973f0321b3.chunk.js.gz +0 -0
  8. package/dist/js/544.ea8aa126d1973f0321b3.chunk.js.map +1 -0
  9. package/dist/js/{616.3ba43917e8ecdd62f252.chunk.js → 616.301b522f13e0a9a48037.chunk.js} +2 -2
  10. package/dist/js/616.301b522f13e0a9a48037.chunk.js.gz +0 -0
  11. package/dist/js/616.301b522f13e0a9a48037.chunk.js.map +1 -0
  12. package/dist/js/794.e2e3f2a228e84dc95e45.chunk.js +2 -0
  13. package/dist/js/794.e2e3f2a228e84dc95e45.chunk.js.gz +0 -0
  14. package/dist/js/794.e2e3f2a228e84dc95e45.chunk.js.map +1 -0
  15. package/dist/js/favorite-hubs.340162ac9aa31d114262.chunk.js +2 -0
  16. package/dist/js/favorite-hubs.340162ac9aa31d114262.chunk.js.gz +0 -0
  17. package/dist/js/favorite-hubs.340162ac9aa31d114262.chunk.js.map +1 -0
  18. package/dist/js/filelists.ca8a874f99d5af1e8e5e.chunk.js +2 -0
  19. package/dist/js/filelists.ca8a874f99d5af1e8e5e.chunk.js.gz +0 -0
  20. package/dist/js/filelists.ca8a874f99d5af1e8e5e.chunk.js.map +1 -0
  21. package/dist/js/files.fc5fcb31af09988a3988.chunk.js +2 -0
  22. package/dist/js/files.fc5fcb31af09988a3988.chunk.js.gz +0 -0
  23. package/dist/js/files.fc5fcb31af09988a3988.chunk.js.map +1 -0
  24. package/dist/js/{home.d83d942ffd78d0982f16.chunk.js → home.9420c168453374746e95.chunk.js} +3 -3
  25. package/dist/js/home.9420c168453374746e95.chunk.js.gz +0 -0
  26. package/dist/js/{home.d83d942ffd78d0982f16.chunk.js.map → home.9420c168453374746e95.chunk.js.map} +1 -1
  27. package/dist/js/{hubs.b9b02df61439251d0c40.chunk.js → hubs.5a2d6ac73076650d42b7.chunk.js} +2 -2
  28. package/dist/js/hubs.5a2d6ac73076650d42b7.chunk.js.gz +0 -0
  29. package/dist/js/hubs.5a2d6ac73076650d42b7.chunk.js.map +1 -0
  30. package/dist/js/locales/en-webui-main-missing-json.7d0f44c960669521ff92.chunk.js +1 -0
  31. package/dist/js/locales/en-webui-main-missing-json.7d0f44c960669521ff92.chunk.js.gz +0 -0
  32. package/dist/js/{main.f8ff760378e20172a640.entry.js → main.f73ffe66c640349513f6.entry.js} +3 -3
  33. package/dist/js/main.f73ffe66c640349513f6.entry.js.gz +0 -0
  34. package/dist/js/{main.f8ff760378e20172a640.entry.js.map → main.f73ffe66c640349513f6.entry.js.map} +1 -1
  35. package/dist/js/messages.3d5eec186a808be5d46f.chunk.js +2 -0
  36. package/dist/js/messages.3d5eec186a808be5d46f.chunk.js.gz +0 -0
  37. package/dist/js/messages.3d5eec186a808be5d46f.chunk.js.map +1 -0
  38. package/dist/js/queue.4095b1ea967e164737e6.chunk.js +2 -0
  39. package/dist/js/queue.4095b1ea967e164737e6.chunk.js.gz +0 -0
  40. package/dist/js/queue.4095b1ea967e164737e6.chunk.js.map +1 -0
  41. package/dist/js/search.5d782cc30dc9a3562cad.chunk.js +2 -0
  42. package/dist/js/search.5d782cc30dc9a3562cad.chunk.js.gz +0 -0
  43. package/dist/js/search.5d782cc30dc9a3562cad.chunk.js.map +1 -0
  44. package/dist/js/settings.0755889dcd16156cf5d4.chunk.js +2 -0
  45. package/dist/js/settings.0755889dcd16156cf5d4.chunk.js.gz +0 -0
  46. package/dist/js/settings.0755889dcd16156cf5d4.chunk.js.map +1 -0
  47. package/dist/js/{share.dcb389031519ffd50916.chunk.js → share.39a2160ef9edbf4f07a0.chunk.js} +2 -2
  48. package/dist/js/share.39a2160ef9edbf4f07a0.chunk.js.gz +0 -0
  49. package/dist/js/share.39a2160ef9edbf4f07a0.chunk.js.map +1 -0
  50. package/dist/js/{system-log.b45e1d0c3a185000d965.chunk.js → system-log.fe0f9ced7ad49ada92a9.chunk.js} +2 -2
  51. package/dist/js/system-log.fe0f9ced7ad49ada92a9.chunk.js.gz +0 -0
  52. package/dist/js/{system-log.b45e1d0c3a185000d965.chunk.js.map → system-log.fe0f9ced7ad49ada92a9.chunk.js.map} +1 -1
  53. package/dist/js/transfers.46fda5234f3b66478aeb.chunk.js +2 -0
  54. package/dist/js/transfers.46fda5234f3b66478aeb.chunk.js.gz +0 -0
  55. package/dist/js/transfers.46fda5234f3b66478aeb.chunk.js.map +1 -0
  56. package/dist/sw.js +1 -1
  57. package/dist/sw.js.gz +0 -0
  58. package/jest.config.js +1 -0
  59. package/package.json +20 -5
  60. package/tsconfig.json +2 -1
  61. package/dist/js/223.cc8dd844a8f692d9ace9.chunk.js +0 -2
  62. package/dist/js/223.cc8dd844a8f692d9ace9.chunk.js.gz +0 -0
  63. package/dist/js/223.cc8dd844a8f692d9ace9.chunk.js.map +0 -1
  64. package/dist/js/544.2eac7425f15c54b31055.chunk.js +0 -2
  65. package/dist/js/544.2eac7425f15c54b31055.chunk.js.gz +0 -0
  66. package/dist/js/544.2eac7425f15c54b31055.chunk.js.map +0 -1
  67. package/dist/js/616.3ba43917e8ecdd62f252.chunk.js.gz +0 -0
  68. package/dist/js/616.3ba43917e8ecdd62f252.chunk.js.map +0 -1
  69. package/dist/js/794.94cca1eb5a09f5ebeb41.chunk.js +0 -2
  70. package/dist/js/794.94cca1eb5a09f5ebeb41.chunk.js.gz +0 -0
  71. package/dist/js/794.94cca1eb5a09f5ebeb41.chunk.js.map +0 -1
  72. package/dist/js/favorite-hubs.65f1fdabf722a842486f.chunk.js +0 -2
  73. package/dist/js/favorite-hubs.65f1fdabf722a842486f.chunk.js.gz +0 -0
  74. package/dist/js/favorite-hubs.65f1fdabf722a842486f.chunk.js.map +0 -1
  75. package/dist/js/filelists.46791daa5e98c31608e3.chunk.js +0 -2
  76. package/dist/js/filelists.46791daa5e98c31608e3.chunk.js.gz +0 -0
  77. package/dist/js/filelists.46791daa5e98c31608e3.chunk.js.map +0 -1
  78. package/dist/js/files.cab86cf38f3276e0ac26.chunk.js +0 -2
  79. package/dist/js/files.cab86cf38f3276e0ac26.chunk.js.gz +0 -0
  80. package/dist/js/files.cab86cf38f3276e0ac26.chunk.js.map +0 -1
  81. package/dist/js/home.d83d942ffd78d0982f16.chunk.js.gz +0 -0
  82. package/dist/js/hubs.b9b02df61439251d0c40.chunk.js.gz +0 -0
  83. package/dist/js/hubs.b9b02df61439251d0c40.chunk.js.map +0 -1
  84. package/dist/js/locales/en-webui-main-missing-json.2eb155e5cac85f4334fc.chunk.js +0 -1
  85. package/dist/js/locales/en-webui-main-missing-json.2eb155e5cac85f4334fc.chunk.js.gz +0 -0
  86. package/dist/js/main.f8ff760378e20172a640.entry.js.gz +0 -0
  87. package/dist/js/messages.d7c09b74d3c31059c877.chunk.js +0 -2
  88. package/dist/js/messages.d7c09b74d3c31059c877.chunk.js.gz +0 -0
  89. package/dist/js/messages.d7c09b74d3c31059c877.chunk.js.map +0 -1
  90. package/dist/js/queue.caf1be365462f32fcf3f.chunk.js +0 -2
  91. package/dist/js/queue.caf1be365462f32fcf3f.chunk.js.gz +0 -0
  92. package/dist/js/queue.caf1be365462f32fcf3f.chunk.js.map +0 -1
  93. package/dist/js/search.37c197d2505f51c82512.chunk.js +0 -2
  94. package/dist/js/search.37c197d2505f51c82512.chunk.js.gz +0 -0
  95. package/dist/js/search.37c197d2505f51c82512.chunk.js.map +0 -1
  96. package/dist/js/settings.4c7cab0b98642f125f1d.chunk.js +0 -2
  97. package/dist/js/settings.4c7cab0b98642f125f1d.chunk.js.gz +0 -0
  98. package/dist/js/settings.4c7cab0b98642f125f1d.chunk.js.map +0 -1
  99. package/dist/js/share.dcb389031519ffd50916.chunk.js.gz +0 -0
  100. package/dist/js/share.dcb389031519ffd50916.chunk.js.map +0 -1
  101. package/dist/js/system-log.b45e1d0c3a185000d965.chunk.js.gz +0 -0
  102. package/dist/js/transfers.c092bfdcc3a7f01ccf91.chunk.js +0 -2
  103. package/dist/js/transfers.c092bfdcc3a7f01ccf91.chunk.js.gz +0 -0
  104. package/dist/js/transfers.c092bfdcc3a7f01ccf91.chunk.js.map +0 -1
  105. package/webpack/bundle-loader.js +0 -83
  106. /package/dist/js/{home.d83d942ffd78d0982f16.chunk.js.LICENSE.txt → home.9420c168453374746e95.chunk.js.LICENSE.txt} +0 -0
  107. /package/dist/js/{main.f8ff760378e20172a640.entry.js.LICENSE.txt → main.f73ffe66c640349513f6.entry.js.LICENSE.txt} +0 -0
@@ -25,8 +25,11 @@ jobs:
25
25
  with:
26
26
  node-version: ${{ matrix.node-version }}
27
27
  cache: 'npm'
28
- - run: npm ci --legacy-peer-deps
28
+ - run: npm ci
29
29
  - run: npm run build --if-present
30
- - run: npm test
31
- - name: Upload coverage reports to Codecov with GitHub Action
32
- uses: codecov/codecov-action@v3
30
+ - run: npx jest --coverage
31
+ - name: Upload coverage reports to Codecov
32
+ uses: codecov/codecov-action@v5
33
+ with:
34
+ token: ${{ secrets.CODECOV_TOKEN }}
35
+ slug: airdcpp-web/airdcpp-webui
package/dist/index.html CHANGED
@@ -16,7 +16,7 @@
16
16
  {
17
17
  // We must inject the main chunk dynamically as well because the final path is not known on compile time
18
18
  var script = document.createElement('script');
19
- script.src = getBasePath() + "js/main.f8ff760378e20172a640.entry.js";
19
+ script.src = getBasePath() + "js/main.f73ffe66c640349513f6.entry.js";
20
20
  document.body.appendChild(script);
21
21
  }
22
22
 
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[223],{56796:(t,e,n)=>{n.d(e,{A:()=>s});var i=n(71354),r=n.n(i),o=n(76314),a=n.n(o)()(r());a.push([t.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 s=a},15992:(t,e,n)=>{n.d(e,{A:()=>c});var i=n(22005),r=n.n(i),o=n(32811),a=n(50753);const s=r().createActions([{setRange:{asyncResult:!0}},{setSort:{asyncResult:!0}},{close:{asyncResult:!0}},{pause:{asyncResult:!0}},{init:{asyncResult:!0}},"clear"]),l=(t,e,n)=>o.A.post(e+"/settings",t).then((t=>n.completed(e,t))).catch((t=>n.failed(e,t)));s.close.listen((function(t,e){if(e&&a.A.socketAuthenticated){const e=this;return o.A.delete(t).then((n=>e.completed(t,n))).catch((e=>this.failed(t,e)))}return Promise.resolve()})),s.setSort.listen((function(t,e,n){l({sort_property:e,sort_ascending:n},t,this)})),s.setRange.listen((function(t,e,n){console.assert(n>0,"Invalid max rows"),l({range_start:e,max_count:n},t,this)})),s.pause.listen((function(t,e){l({paused:e},t,this)})),s.init.listen((function(t,e,n){n&&l({source_filter:n},t,this)}));const c=s},54895:(t,e,n)=>{n.d(e,{A:()=>a});var i=n(74848),r=(n(96540),n(73624),n(46942)),o=n.n(r);const a=({item:t})=>(0,i.jsxs)("div",{className:"ip flag",children:[(0,i.jsx)("i",{className:o()("ui flag",t.country.toLowerCase())}),t.str]})},44247:(t,e,n)=>{n.d(e,{A3:()=>f,AJ:()=>U,BH:()=>R,In:()=>B,Jo:()=>y,Jy:()=>_,K:()=>v,V9:()=>C,WQ:()=>D,kF:()=>E,mz:()=>m,qG:()=>j,tC:()=>b,us:()=>x});var i=n(74848),r=(n(96540),n(71352)),o=n(74416),a=n(39798),s=n(54895),l=n(73616),c=n(36076),d=n(68465),p=n(17911),h=n(28286),A=n(98573),u=n(50489),g=function(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(t);r<i.length;r++)e.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(t,i[r])&&(n[i[r]]=t[i[r]])}return n};const w=t=>"object"==typeof t?Array.isArray(t)?t.length:t.str:0===t?null:t,m=({cellData:t})=>(0,i.jsx)("span",{className:"plain text cell",children:w(t)}),f=t=>{var{onClick:e,label:n,columnKey:r}=t,o=g(t,["onClick","label","columnKey"]);return(0,i.jsx)(d.fh,Object.assign({},o,{children:(0,i.jsx)(u.A,{onClick:e,caption:n})}))},b=t=>{var{cellData:e,rowDataGetter:n,children:o}=t,s=g(t,["cellData","rowDataGetter","children"]);return(0,i.jsx)(r.yj,Object.assign({caption:(0,i.jsx)(a.A,{typeInfo:n().type,caption:e,className:"icon-caption"}),itemData:n},s))},v=t=>{var{cellData:e,rowDataGetter:n}=t,o=g(t,["cellData","rowDataGetter"]);return(0,i.jsx)(r.yj,Object.assign({caption:e,itemData:n},o))},C=t=>{var{cellData:e,rowDataGetter:n,action:r,moduleData:o,entity:a}=t,s=g(t,["cellData","rowDataGetter","action","moduleData","entity"]);const l=(0,h.w)();return(0,c.il)(r,n(),l)?(0,i.jsx)(p.M,{children:({onClickAction:t})=>(0,i.jsx)(u.A,{className:"plain link cell",onClick:()=>t({action:r,moduleData:o,itemData:n(),entity:a}),caption:w(e)})}):(0,i.jsx)(m,Object.assign({cellData:e},s))},x=({cellData:t})=>{const{formatSize:e}=(0,o.k)();return(0,i.jsx)("span",{className:"plain size cell",children:e(t)})},E=({cellData:t})=>{const{formatSpeed:e}=(0,o.k)();return(0,i.jsx)("span",{className:"plain speed cell",children:e(t)})},y=({cellData:t})=>{const{formatRelativeTime:e}=(0,o.k)();return(0,i.jsx)("span",{className:"plain duration cell",children:e(t)})},D=({cellData:t})=>{const{formatAbbreviatedDuration:e}=(0,o.k)();return(0,i.jsx)("span",{className:"plain abbr-duration cell",children:e(t)})},B=({cellData:t})=>(0,i.jsx)(s.A,{item:t}),_=({cellData:t})=>{const{formatConnection:e}=(0,o.k)();return(0,i.jsx)("span",{className:"plain connection cell",children:e(t)})},j=({cellData:t})=>(0,i.jsx)("span",{className:"plain decimal cell",children:(0,A.zJ)(t)}),R=t=>{var{cellData:e,rowDataGetter:n,clickHandlerGetter:o,userGetter:s,downloadHandler:l}=t,c=g(t,["cellData","rowDataGetter","clickHandlerGetter","userGetter","downloadHandler"]);return(0,i.jsx)(r.Gw,Object.assign({caption:(0,i.jsx)(a.A,{typeInfo:n().type,onClick:o?o(e,n):null,caption:e,className:"icon-caption"}),user:s(n()),linkCaption:!o,itemInfoGetter:n,downloadHandler:l},c))},U=t=>{var{cellData:e,rowDataGetter:n,onChange:r}=t,o=g(t,["cellData","rowDataGetter","onChange"]);return(0,i.jsx)(l.A,Object.assign({checked:e,onChange:t=>r(t,n())},o))}},22373:(t,e,n)=>{n.d(e,{A:()=>et});var i=n(74848),r=n(96540),o=n(15992),a=n(31104),s=n(19247),l=n(27725),c=n(36995),d=n(86038),p=n(8098),h=n(42695),A=n(32389),u=n(39269);const g=(t,e)=>{const n=(t=>{switch(t){case d.Od.REGEX:return"Regex";case d.Od.WILDCARD:return"Wildcard";case d.Od.EXACT:return"Exact";default:return"Partial"}})(t);return(0,h.Tl)(n,e,"table.filter")},w=(t,e)=>{let n=e("table.filter.filter","Filter");return t!==d.Od.PARTIAL&&(n+=` (${g(t,e).toLowerCase()})`),n+"..."};class m extends r.PureComponent{constructor(){super(...arguments),this.state={value:"",method:d.Od.PARTIAL},this.onFilterUpdated=()=>{const{value:t,method:e}=this.state;this.props.onFilterUpdated(t,e)},this.onTextChanged=t=>{this.setState({value:t.target.value}),clearTimeout(this.timer),this.timer=window.setTimeout((()=>{this.onFilterUpdated()}),200)},this.onMethodChanged=t=>{this.setState({method:t}),setTimeout((()=>this.onFilterUpdated())),this.input.focus()},this.getFilterMethod=(t,e)=>{const n=t===this.state.method;return(0,i.jsx)(l.A,{onClick:()=>this.onMethodChanged(t),active:n,children:g(t,e)},t)}}componentWillUnmount(){clearTimeout(this.timer)}render(){const{value:t,method:e}=this.state,{autoFocus:n}=this.props;return(0,i.jsx)(A.wD,{children:r=>(0,i.jsx)("div",{className:"text-filter",children:(0,i.jsx)(u.A,{ref:t=>this.input=t,placeholder:w(e,r),onChange:this.onTextChanged,value:t,type:"text",autoFocus:!(0,p.vU)()&&n,children:(0,i.jsx)(a.A,{className:"filter-method right top pointing",button:!0,direction:"upward",children:(0,i.jsx)(s.A,{caption:(0,h.Tl)("Match type",r,"table.filter"),children:Object.keys(d.Od).filter((t=>isNaN(Number(t)))).map((t=>this.getFilterMethod(d.Od[t],r)))})})})})})}}m.defaultProps={autoFocus:!0};const f=(0,c.A)(m);var b=n(83994),v=n(4425);const C=({store:t})=>{if(t.totalCount<0)return null;let e=t.totalCount;return t.totalCount!==t.rowCount&&(e=t.rowCount+"/"+t.totalCount),(0,i.jsxs)("div",{className:"count-info",children:[(0,i.jsx)(b.A,{icon:v.A.FILTER}),e]})},x=({store:t,customFilter:e,footerData:n,textFilterProps:r})=>(0,i.jsxs)("div",{className:"table-footer",children:[n,(0,i.jsxs)("div",{className:"filter item",children:[e?(0,i.jsx)(e,{store:t}):null,(0,i.jsx)(f,Object.assign({store:t},r)),(0,i.jsx)(C,{store:t})]})]});var E=n(68465),y=n(76779),D=n(46942),B=n.n(D);class _ extends r.Component{constructor(){super(...arguments),this.state={rowData:null},this.loadData=t=>this.props.dataLoader.updateRowData(t,this.onDataLoaded),this.rowDataGetter=()=>this.state.rowData,this.onDataLoaded=t=>{this.setState({rowData:t})}}componentDidMount(){this.loadData(this.props.rowIndex)}UNSAFE_componentWillReceiveProps(t){t.rowIndex!==this.props.rowIndex&&this.props.dataLoader.removePendingRequests(this.props.rowIndex,this.onDataLoaded),this.loadData(t.rowIndex)||this.setState({rowData:null})}componentWillUnmount(){this.props.dataLoader.removePendingRequests(this.props.rowIndex,this.onDataLoaded)}shouldComponentUpdate(t,e){return e.rowData!==this.state.rowData||t.width!==this.props.width}render(){const t=this.props,{columnKey:e,children:n,renderCondition:o,rowClassNameGetter:a}=t,s=function(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(t);r<i.length;r++)e.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(t,i[r])&&(n[i[r]]=t[i[r]])}return n}(t,["columnKey","children","renderCondition","rowClassNameGetter"]),{rowData:l}=this.state;if(!l)return null;if(o&&!o(l[e],l))return null;const c=B()("cell-wrapper",e,a?a(l):void 0);return(0,i.jsx)("div",{className:c,children:r.cloneElement(n,Object.assign({cellData:l[e],rowDataGetter:this.rowDataGetter},s))})}}const j=_;var R=n(44247),U=n(67749);const k=(t,e,n,i)=>{const{name:r,columnKey:o}=t.props;let a=i((0,h._F)(o,[...(0,h.$r)(n),U.l.TABLE]),r);{const t=e.sortAscending?" ↑":" ↓";a+=e.sortProperty===o?t:""}return a};class S extends r.Component{constructor(){super(...arguments),this.state={width:0,height:0,columnWidths:{},isColumnResizing:void 0},this.getInitialProps=()=>({rowClassNameGetter:null,entityId:null}),this.scrollPosition=0,this.setInitialScrollRow=!0,this.updateRowRange=()=>{const{store:t}=this.props,{height:e}=this.state,n=(i=this.scrollPosition,Math.max(Math.floor(i/50),0));var i;const r=function(t){return Math.ceil(t/50)}(e);t.DEBUG&&console.log(`Settings changed, start: ${n}, end: ${r}, height: ${e}`,t.viewName),console.assert(t.active,"Posting data for an inactive view"),o.A.setRange(t.viewUrl,n,r)},this.onScrollStart=(t,e)=>{const{store:n}=this.props;n.DEBUG&&console.log(`Scrolling started: ${e}`,n.viewUrl),console.assert(n.active,"Sending pause for an inactive view"),o.A.pause(n.viewUrl,!0)},this.onScrollEnd=(t,e)=>{const{store:n,viewId:i}=this.props;this.scrollPosition=e,console.assert(n.active,"Sending pause for an inactive view"),o.A.pause(n.viewUrl,!1),clearTimeout(this.scrollTimer),this.scrollTimer=window.setTimeout(this.updateRowRange,500),this.setInitialScrollRow&&(this.setInitialScrollRow=!1,n.DEBUG&&console.log(`Disabling initial scroll (view ${i})`)),n.setScrollData(e,i),n.DEBUG&&console.log(`Scrolling ended: ${e}`,n.viewUrl)},this.onColumnClicked=t=>{const{store:e}=this.props;let n=!0;t===e.sortProperty&&e.sortAscending&&(n=!1),o.A.setSort(this.props.store.viewUrl,t,n)},this.onColumnResizeEndCallback=(t,e)=>{this.setState((({columnWidths:n})=>({columnWidths:Object.assign(Object.assign({},n),{[e]:t}),isColumnResizing:!1})),(()=>{this.setState({isColumnResizing:void 0})}))},this.childToColumn=t=>{if(t.props.hideWidth&&t.props.hideWidth>this.state.width)return null;let{flexGrow:e,width:n}=t.props;const{cell:o,columnKey:a,renderCondition:s}=t.props,{store:l,rowClassNameGetter:c,moduleId:d,t:h}=this.props,A=(0,p.vU)();return A||a&&this.state.columnWidths[a]&&(n=this.state.columnWidths[a],e=void 0),r.cloneElement(t,{header:(0,i.jsx)(R.A3,{onClick:this.onColumnClicked.bind(null,a),label:k(t,l,d,h)}),flexGrow:e,width:n,isResizable:!A,allowCellsRecycling:!0,cell:(0,i.jsx)(j,{dataLoader:this.props.dataLoader,renderCondition:s,rowClassNameGetter:c,t:h,children:o||(0,i.jsx)(R.mz,{})})})},this.onResizeView=t=>{if(!t.bounds)return;const{width:e,height:n}=t.entry?t.entry:t.bounds;this.setState({width:e,height:n})}}componentDidUpdate(t,e){e.height!==this.state.height?this.updateRowRange():t.entityId===this.props.entityId&&t.viewId===this.props.viewId||(this.props.store.DEBUG&&console.log(`Enabling initial scroll, entity/viewId changed (view ${this.props.viewId})`),this.setInitialScrollRow=!0,this.updateRowRange())}componentWillUnmount(){clearTimeout(this.scrollTimer)}render(){const t=r.Children.map(this.props.children,this.childToColumn),{width:e,height:n,isColumnResizing:o}=this.state,{store:a,viewId:s}=this.props;return(0,i.jsx)(y.A,{bounds:!0,onResize:this.onResizeView,children:({measureRef:r})=>(0,i.jsx)("div",{ref:r,className:"table-container-wrapper",children:(0,i.jsx)(E.XI,{width:e,height:n,rowHeight:50,rowsCount:a.rowCount,headerHeight:50,isColumnResizing:o,onColumnResizeEndCallback:this.onColumnResizeEndCallback,touchScrollEnabled:!0,onScrollStart:this.onScrollStart,onScrollEnd:this.onScrollEnd,scrollTop:this.setInitialScrollRow?a.getScrollData(s):void 0,children:t})})})}}const I=S;var O=n(32811),T=n(46894),G=n.n(T),N=n(2404),P=n.n(N);const L=class{constructor(t,e){this._onDataLoad=e,this._store=t,this._data=[],this._pendingRequest={},this._initialDataReceived=!1,this.DEBUG=t.DEBUG}clear(){this._pendingRequest={},this._data=[]}updateItem(t,e,n){let i=this._data[n];return i===e||P()(this._data[n],e)?t:(this._data[n]=i?G()(i,{$merge:e}):G()(i,{$set:e}),t+1)}onItemsUpdated(t,e=0,n){let i=n<this._data.length;if(t&&0!==t.length){this._initialDataReceived=!0;for(let e=0;e<this._data.length;e++)t[e]||delete this._data[e];const n=t.reduce(this.updateItem.bind(this),0);(n>0||0!==e)&&(this.DEBUG&&console.log("onItemsUpdated, changed (updatedCount, rangeOffset)",n,e),i=!0)}else this.clear(),i=!0,this._initialDataReceived=!1,this.DEBUG&&console.log("onItemsUpdated, cleared");i&&this._onDataLoad()}get rangeOffset(){const t=this._rangeOffset;return this._rangeOffset=0,t}getRowData(t){return this._data[t]}updateRowData(t,e){const n=this._data[t];return n?(e(n),!0):(this._initialDataReceived&&this._queueRequestFor(t,e),!1)}removePendingRequests(t){delete this._pendingRequest[t]}_queueRequestFor(t,e){const n=t-t%10,i=this._pendingRequest[t];if(i)return void i.push(e);if(this._pendingRequest[t]=[e],t!==n){if(this._pendingRequest[n])return;this._pendingRequest[n]=[]}const r=Math.min(n+10,this._store.rowCount);O.A.get(this._store.viewUrl+"/items/"+n+"/"+r).then(this.onRowsReceived.bind(this,n)).catch((t=>{console.error("Failed to load data",t);for(let t=n;t<r;t++)this._pendingRequest[t]&&delete this._pendingRequest[t]}))}onRowsReceived(t,e){if(this._pendingRequest[t])for(let n=0;n<e.length;n++){const i=t+n;P()(this._data[i],e[n])?this.DEBUG&&console.log("onRowsReceived, row data equals",i):(this._data[i]=e[n],this._pendingRequest[i]&&this._pendingRequest[i].forEach((t=>t(e[n])))),delete this._pendingRequest[i]}}};var F=n(85072),W=n.n(F),$=n(97825),q=n.n($),z=n(77659),M=n.n(z),Y=n(55056),H=n.n(Y),K=n(10540),X=n.n(K),J=n(41113),V=n.n(J),Z=n(56796),Q={};Q.styleTagTransform=V(),Q.setAttributes=H(),Q.insert=M().bind(null,"head"),Q.domAPI=q(),Q.insertStyleElement=X(),W()(Z.A,Q),Z.A&&Z.A.locals&&Z.A.locals,n(56141);class tt extends r.PureComponent{constructor(){super(...arguments),this.dataLoader=new L(this.props.store,(()=>this.forceUpdate())),this.unsubscribe=this.props.store.listen(this.dataLoader.onItemsUpdated.bind(this.dataLoader)),this.moduleExists=t=>!t||!this.props.sessionStore||this.props.sessionStore.getSession(t),this.start=t=>{const{store:e,sourceFilter:n}=this.props;o.A.init(e.viewUrl,t,n),o.A.setSort(e.viewUrl,e.sortProperty,e.sortAscending)},this.close=t=>{o.A.close(this.props.store.viewUrl,this.moduleExists(t))}}componentDidMount(){this.start(this.props.entityId)}componentWillUnmount(){this.close(this.props.entityId),this.unsubscribe()}componentDidUpdate(t){if(t.entityId!==this.props.entityId&&(this.close(t.entityId),this.start(this.props.entityId)),t.viewId!==this.props.viewId){const{store:t}=this.props;t.paused&&o.A.pause(t.viewUrl,!1),o.A.clear(t.viewUrl)}}render(){const t=this.props,{store:e,footerData:n,emptyRowsNodeGetter:r,customFilter:o,textFilterProps:a}=t,s=function(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(t);r<i.length;r++)e.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(t,i[r])&&(n[i[r]]=t[i[r]])}return n}(t,["store","footerData","emptyRowsNodeGetter","customFilter","textFilterProps"]);return r&&-1===e.totalCount?(0,i.jsx)("div",{className:"virtual-table"}):r&&0===e.totalCount?r():(0,i.jsx)("div",{className:"virtual-table",children:(0,i.jsx)(A.wD,{children:t=>(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(I,Object.assign({},s,{dataLoader:this.dataLoader,store:e,t})),(0,i.jsx)(x,{store:e,customFilter:o,footerData:n,textFilterProps:a})]})})})}}const et=tt},36995:(t,e,n)=>{n.d(e,{A:()=>s});var i=n(74848),r=n(96540),o=n(56484),a=n(86038);function s(t,e="any"){return(0,o.A)((n=>(r.useLayoutEffect((()=>()=>{const{store:t,filter:e,socket:i}=n;t.active&&i.delete(`${t.viewUrl}/filter/${e.id}`).catch((t=>console.error("Failed to delete table filter",t)))}),[]),(0,i.jsx)(t,Object.assign({},n,{onFilterUpdated:(t,i=a.Od.PARTIAL)=>{const r={pattern:t,method:i,property:e},{store:o,filter:s,socket:l}=n;l.put(`${o.viewUrl}/filter/${s.id}`,r).catch((t=>console.error("Failed to add table filter",t)))}})))),{urls:{filter:({store:t},e)=>e.post(`${t.viewUrl}/filter`)},loaderText:null})}},52267:(t,e,n)=>{n.d(e,{A:()=>s});var i=n(32811),r=n(15992),o=n(20311),a=n.n(o);const s=(t,e=!0)=>{let n=!1,o=-1,s=0,l=0,c=[],d=null,p=!1,h=0;let A=t,u=e;const g=()=>{c=[],l=0,s=0,o=-1};return{listenables:r.A,DEBUG:!0,onClose(t){t===this.viewUrl&&(console.log(`Closing view ${this.viewUrl}`),this._removeMessageListener(),g(),n=!1,this.trigger())},onClear(t){t===this.viewUrl&&(g(),this.trigger())},onPause(t,e){t===this.viewUrl&&(p=e)},onInit(t,e){t===this.viewUrl&&(a()(!n,"Trying start an active table view"),d=e,this.addMessageListener(),console.log(`Starting view ${this.viewUrl}`),n=!0)},onSetSort(t,e,n){t===this.viewUrl&&(A=e,u=n)},addMessageListener(){this._removeMessageListener=i.A.addViewUpdateListener(this._viewName,this._handleUpdate,d)},get items(){return c},get viewUrl(){let t=this._apiUrl+"/";return d&&(t+=d+"/"),t+=this._viewName,t},get viewName(){return this._viewName},get rowCount(){return s},get totalCount(){return o},get active(){return n},get sortProperty(){return A},get sortAscending(){return u},get paused(){return p},setScrollData(t,e){this._sessionStore?this._sessionStore.scroll.setScrollData(t,d,e):(console.log(`Setting scroll position ${t} for view ${this.viewUrl} (view ID ${e})`),h=t)},getScrollData(t){return this._sessionStore?this._sessionStore.scroll.getScrollData(d,t):(console.log(`Getting scroll position ${h} for view ${this.viewUrl} (view ID ${t})`),h)},_handleUpdate(t){(t=>{var e;null!=t.range_start&&(l=t.range_start),null!=t.total_items&&(o=t.total_items),null!=t.matching_items&&(s=t.matching_items),null!=t.items&&(e=t.items,c=e.reduce(((t,e,n)=>{let i=(r=e.id,c.find((t=>!!t&&t.id===r))||{id:e.id});var r;return e.properties?i=Object.assign({},i,e.properties):1===Object.keys(i).length&&console.error("No properties were sent for a new view item",i.id),t[l+n]=i,t}),[]))})(t),this.trigger(c,t.range_offset,s)}}}}}]);
2
+ //# sourceMappingURL=223.4d5951376f9fbb57d571.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/223.4d5951376f9fbb57d571.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/table/style.css","webpack://airdcpp-webui/./src/actions/TableActions.js","webpack://airdcpp-webui/./src/components/format/FormattedIp.tsx","webpack://airdcpp-webui/./src/components/table/Cell.tsx","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/TableContainer.tsx","webpack://airdcpp-webui/./src/components/table/RowDataLoader.js","webpack://airdcpp-webui/./src/components/table/style.css?53ed","webpack://airdcpp-webui/./src/components/table/VirtualTable.tsx","webpack://airdcpp-webui/./src/decorators/TableFilterDecorator.tsx","webpack://airdcpp-webui/./src/mixins/ViewStoreMixin.js"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* 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","import Reflux from 'reflux';\r\n\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport LoginStore from 'stores/reflux/LoginStore';\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 = (settings, viewUrl, action) => {\r\n return SocketService.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 (viewUrl, sessionExists) {\r\n if (sessionExists && LoginStore.socketAuthenticated) {\r\n const that = this;\r\n return SocketService.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 (viewUrl, sortProperty, sortAscending) {\r\n postSettings(\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 (viewUrl, rangeStart, maxRows) {\r\n console.assert(maxRows > 0, 'Invalid max rows');\r\n postSettings(\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 (viewUrl, pause) {\r\n postSettings(\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 (viewUrl, entityId, filterData) {\r\n if (filterData) {\r\n postSettings(\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';\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","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/SessionContext';\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} caption={label} />\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 caption={getCellContent(cellData)}\r\n />\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 FileDownloadCellClickHandler = (\r\n cellData: any,\r\n rowDataGetter: () => any,\r\n) => (() => void) | undefined;\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 clickHandlerGetter?: FileDownloadCellClickHandler;\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 clickHandlerGetter,\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 onClick={clickHandlerGetter ? clickHandlerGetter(cellData, rowDataGetter!) : null}\r\n caption={cellData}\r\n className=\"icon-caption\"\r\n />\r\n }\r\n user={userGetter(rowDataGetter!())}\r\n linkCaption={!clickHandlerGetter}\r\n itemInfoGetter={rowDataGetter!}\r\n downloadHandler={downloadHandler}\r\n {...props}\r\n />\r\n);\r\n\r\n// eslint-disable-next-line max-len\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 * 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 static readonly defaultProps: Pick<TextFilterProps, 'autoFocus'> = {\r\n autoFocus: true,\r\n };\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={!usingMobileLayout() && autoFocus}\r\n // className=\"action\"\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 { Table, ColumnProps } from 'fixed-data-table-2';\r\n\r\nimport TableActions from 'actions/TableActions';\r\nimport { usingMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport Measure, { ContentRect } from 'react-measure';\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\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 TableContainerProps = React.PropsWithChildren<{\r\n // ID of the current entity for non-singleton sources\r\n entityId?: API.IdType;\r\n\r\n // Append class names to row (takes row data as param)\r\n rowClassNameGetter?: (rowData: any) => string;\r\n\r\n // Store implementing ViewStoreMixin that contains the items\r\n store: any;\r\n\r\n dataLoader: any;\r\n t: UI.TranslateF;\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;\r\n}>;\r\n\r\ninterface State {\r\n width: number;\r\n height: number;\r\n columnWidths: Record<string, number>;\r\n isColumnResizing: boolean | undefined;\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\nclass TableContainer extends React.Component<TableContainerProps, State> {\r\n state: State = {\r\n width: 0,\r\n height: 0,\r\n columnWidths: {},\r\n isColumnResizing: undefined,\r\n };\r\n\r\n getInitialProps = () => {\r\n return {\r\n rowClassNameGetter: null,\r\n entityId: null,\r\n };\r\n };\r\n\r\n scrollTimer: number | undefined;\r\n scrollPosition = 0;\r\n setInitialScrollRow = true;\r\n\r\n // This will also be used for setting the initial rows\r\n componentDidUpdate(prevProps: TableContainerProps, prevState: State) {\r\n if (prevState.height !== this.state.height) {\r\n this.updateRowRange();\r\n } else if (\r\n prevProps.entityId !== this.props.entityId ||\r\n prevProps.viewId !== this.props.viewId\r\n ) {\r\n if (this.props.store.DEBUG) {\r\n console.log(\r\n `Enabling initial scroll, entity/viewId changed (view ${this.props.viewId})`,\r\n );\r\n }\r\n\r\n this.setInitialScrollRow = true;\r\n this.updateRowRange();\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.scrollTimer);\r\n }\r\n\r\n updateRowRange = () => {\r\n const { store } = this.props;\r\n const { height } = this.state;\r\n\r\n const startRows = convertStartToRows(this.scrollPosition);\r\n const maxRows = convertEndToRows(height);\r\n\r\n if (store.DEBUG) {\r\n // eslint-disable-next-line max-len\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(store.viewUrl, startRows, maxRows);\r\n };\r\n\r\n onScrollStart = (horizontal: number, vertical: number) => {\r\n const { store } = this.props;\r\n\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(store.viewUrl, true);\r\n };\r\n\r\n onScrollEnd = (horizontal: number, vertical: number) => {\r\n const { store, viewId } = this.props;\r\n\r\n this.scrollPosition = vertical;\r\n console.assert(store.active, 'Sending pause for an inactive view');\r\n TableActions.pause(store.viewUrl, false);\r\n\r\n clearTimeout(this.scrollTimer);\r\n this.scrollTimer = window.setTimeout(this.updateRowRange, 500);\r\n\r\n if (this.setInitialScrollRow) {\r\n this.setInitialScrollRow = 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 onColumnClicked = (sortProperty: string) => {\r\n const { store } = this.props;\r\n\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(this.props.store.viewUrl, sortProperty, sortAscending);\r\n };\r\n\r\n onColumnResizeEndCallback = (newColumnWidth: number, columnKey: string) => {\r\n this.setState(\r\n ({ columnWidths }) => ({\r\n columnWidths: {\r\n ...columnWidths,\r\n [columnKey]: newColumnWidth,\r\n },\r\n\r\n // In order to disable the resizing mode, the table needs to be rendered with \"isColumnResizing: false\"\r\n // Put it right back to undefined after that in order to avoid resizing issues\r\n // while the table is being re-rendered\r\n // https://github.com/schrodinger/fixed-data-table-2/issues/268\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/444\r\n isColumnResizing: false,\r\n }),\r\n () => {\r\n this.setState({\r\n isColumnResizing: undefined,\r\n });\r\n },\r\n );\r\n };\r\n\r\n childToColumn = (column: React.ReactElement<ColumnProps>) => {\r\n if (!!column.props.hideWidth && column.props.hideWidth > this.state.width) {\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, t } = this.props;\r\n\r\n const mobileView = usingMobileLayout();\r\n if (!mobileView) {\r\n // Get column width\r\n if (!!columnKey && !!this.state.columnWidths[columnKey]) {\r\n width = this.state.columnWidths[columnKey];\r\n flexGrow = undefined;\r\n }\r\n }\r\n\r\n return React.cloneElement(column, {\r\n header: (\r\n <HeaderCell\r\n onClick={this.onColumnClicked.bind(null, columnKey)}\r\n label={formatColumnName(column, store, moduleId, t)}\r\n />\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={this.props.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 onResizeView = (contentRect: ContentRect) => {\r\n if (!contentRect.bounds) {\r\n return;\r\n }\r\n\r\n // Bounds may contain incorrect (or outdated) dimensions with animations (such as when opening a modal)\r\n const { width, height } = !!contentRect.entry\r\n ? contentRect.entry\r\n : contentRect.bounds;\r\n this.setState({\r\n width,\r\n height,\r\n });\r\n };\r\n\r\n render() {\r\n // Update and insert generic columns props\r\n const children = React.Children.map(this.props.children, this.childToColumn);\r\n\r\n const { width, height, isColumnResizing } = this.state;\r\n const { store, viewId } = this.props;\r\n return (\r\n <Measure bounds={true} onResize={this.onResizeView}>\r\n {({ measureRef }) => (\r\n <div ref={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 isColumnResizing={isColumnResizing}\r\n onColumnResizeEndCallback={this.onColumnResizeEndCallback}\r\n touchScrollEnabled={true}\r\n onScrollStart={this.onScrollStart}\r\n onScrollEnd={this.onScrollEnd}\r\n scrollTop={\r\n this.setInitialScrollRow ? store.getScrollData(viewId) : undefined\r\n }\r\n >\r\n {children}\r\n </Table>\r\n </div>\r\n )}\r\n </Measure>\r\n );\r\n }\r\n}\r\n\r\nexport default TableContainer;\r\n","import SocketService from 'services/SocketService';\r\nimport 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) {\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.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 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 (updatedCount, rangeOffset)',\r\n updatedCount,\r\n 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 SocketService.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","\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 TableActions from 'actions/TableActions';\r\n\r\nimport TableFooter, { TableFooterProps } from './TableFooter';\r\nimport TableContainer, { TableContainerProps } from './TableContainer';\r\nimport RowDataLoader from './RowDataLoader';\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\nimport { Translation } from 'react-i18next';\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\nexport type VirtualTableProps = Omit<TableFooterProps, 't'> &\r\n Omit<TableContainerProps, 'store' | 'dataLoader' | 't'> &\r\n React.PropsWithChildren<{\r\n store: any;\r\n\r\n // Store containing sessions (must be provided together with entityId)\r\n sessionStore?: any;\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 // Returns a node to render if there are no rows to display\r\n emptyRowsNodeGetter?: () => React.ReactNode;\r\n }>;\r\n\r\nclass VirtualTable extends React.PureComponent<VirtualTableProps> {\r\n dataLoader = new RowDataLoader(this.props.store, () => this.forceUpdate());\r\n unsubscribe = this.props.store.listen(\r\n this.dataLoader.onItemsUpdated.bind(this.dataLoader),\r\n );\r\n\r\n componentDidMount() {\r\n this.start(this.props.entityId);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.close(this.props.entityId);\r\n this.unsubscribe();\r\n }\r\n\r\n componentDidUpdate(prevProps: VirtualTableProps) {\r\n if (prevProps.entityId !== this.props.entityId) {\r\n this.close(prevProps.entityId);\r\n this.start(this.props.entityId);\r\n }\r\n\r\n if (prevProps.viewId !== this.props.viewId) {\r\n const { store } = this.props;\r\n if (store.paused) {\r\n // We need to receive the new items\r\n TableActions.pause(store.viewUrl, false);\r\n }\r\n\r\n TableActions.clear(store.viewUrl);\r\n }\r\n }\r\n\r\n moduleExists = (entityId: API.IdType | undefined) => {\r\n if (!entityId || !this.props.sessionStore) {\r\n return true;\r\n }\r\n\r\n return this.props.sessionStore.getSession(entityId);\r\n };\r\n\r\n start = (entityId: API.IdType | undefined) => {\r\n const { store, sourceFilter } = this.props;\r\n\r\n TableActions.init(store.viewUrl, entityId, sourceFilter);\r\n TableActions.setSort(store.viewUrl, store.sortProperty, store.sortAscending);\r\n };\r\n\r\n close = (entityId: API.IdType | undefined) => {\r\n // Don't send the close command if the session was removed\r\n TableActions.close(this.props.store.viewUrl, this.moduleExists(entityId));\r\n };\r\n\r\n render() {\r\n const {\r\n store,\r\n footerData,\r\n emptyRowsNodeGetter,\r\n customFilter,\r\n textFilterProps,\r\n ...other\r\n } = this.props;\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 //console.log('Render virtual table');\r\n return (\r\n <div className=\"virtual-table\">\r\n <Translation>\r\n {(t) => (\r\n <>\r\n <TableContainer\r\n {...other}\r\n dataLoader={this.dataLoader}\r\n store={store}\r\n t={t}\r\n />\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 </>\r\n )}\r\n </Translation>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default VirtualTable;\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 SocketService from 'services/SocketService';\r\nimport 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\r\n const DEBUG = true;\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(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(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(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(viewUrl, entity) {\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 = entity;\r\n\r\n this.addMessageListener();\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(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() {\r\n this._removeMessageListener = SocketService.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"],"names":["___CSS_LOADER_EXPORT___","push","module","id","TableActions","setRange","asyncResult","setSort","close","pause","init","postSettings","settings","viewUrl","action","post","then","data","completed","catch","error","failed","listen","sessionExists","socketAuthenticated","that","this","delete","Promise","resolve","sortProperty","sortAscending","sort_property","sort_ascending","rangeStart","maxRows","console","assert","range_start","max_count","paused","entityId","filterData","source_filter","item","className","country","toLowerCase","str","getCellContent","cellData","Array","isArray","length","TextCell","HeaderCell","onClick","label","columnKey","props","caption","FileActionCell","rowDataGetter","children","typeInfo","type","itemData","ActionMenuCell","ActionLinkCell","moduleData","entity","login","onClickAction","SizeCell","formatSize","SpeedCell","formatSpeed","DurationCell","formatRelativeTime","AbbreviatedDurationCell","formatAbbreviatedDuration","IpCell","ConnectionCell","formatConnection","DecimalCell","FileDownloadCell","clickHandlerGetter","userGetter","downloadHandler","user","linkCaption","itemInfoGetter","CheckboxCell","onChange","checked","filterMethodToString","method","t","methodTitle","REGEX","WILDCARD","EXACT","getFilterMethodCaption","getPlaceholder","ret","PARTIAL","TextFilter","state","value","onFilterUpdated","onTextChanged","event","setState","target","clearTimeout","timer","window","setTimeout","onMethodChanged","input","focus","getFilterMethod","isCurrent","MenuItemLink","active","componentWillUnmount","render","autoFocus","Input","ref","c","placeholder","SectionedDropdown","button","direction","MenuSection","Object","keys","filter","key","isNaN","Number","map","defaultProps","TableFilterDecorator","CountInfo","store","totalCount","rowCount","Icon","icon","IconConstants","FILTER","customFilter","CustomFilter","footerData","textFilterProps","RowWrapperCell","rowData","loadData","rowIndex","dataLoader","updateRowData","onDataLoaded","componentDidMount","UNSAFE_componentWillReceiveProps","nextProps","removePendingRequests","shouldComponentUpdate","nextState","width","renderCondition","rowClassNameGetter","other","undefined","formatColumnName","column","moduleId","name","displayName","TABLE","sortDirArrow","TableContainer","height","columnWidths","isColumnResizing","getInitialProps","scrollPosition","setInitialScrollRow","updateRowRange","startRows","pixels","Math","max","floor","ceil","convertEndToRows","DEBUG","log","viewName","onScrollStart","horizontal","vertical","onScrollEnd","viewId","scrollTimer","setScrollData","onColumnClicked","onColumnResizeEndCallback","newColumnWidth","childToColumn","hideWidth","flexGrow","cell","mobileView","header","bind","isResizable","allowCellsRecycling","onResizeView","contentRect","bounds","entry","componentDidUpdate","prevProps","prevState","onResize","measureRef","rowHeight","rowsCount","headerHeight","touchScrollEnabled","scrollTop","getScrollData","constructor","onDataLoad","_onDataLoad","_store","_data","_pendingRequest","_initialDataReceived","clear","updateItem","updated","index","old","$merge","$set","onItemsUpdated","items","rangeOffset","hasChanges","i","updatedCount","reduce","_rangeOffset","getRowData","_queueRequestFor","rowBase","request","endRow","min","SocketService","get","onRowsReceived","start","rows","forEach","f","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","VirtualTable","forceUpdate","unsubscribe","moduleExists","sessionStore","getSession","sourceFilter","emptyRowsNodeGetter","Component","propertyName","socket","pattern","property","put","urls","loaderText","defaultSortProperty","defaultSortAscending","matchingCount","startPos","listenables","onClose","_removeMessageListener","trigger","onClear","onPause","enabled","onInit","addMessageListener","onSetSort","ascending","addViewUpdateListener","_viewName","_handleUpdate","_apiUrl","_sessionStore","scroll","itemsObj","total_items","matching_items","newViewItems","rawItem","viewItem","find","properties","assign","parseDataProperties","range_offset"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[544],{20082:(e,n,o)=>{o.d(n,{A:()=>d});var t=o(71354),a=o.n(t),s=o(76314),l=o.n(s)()(a());l.push([e.id,".download-dialog .accordion.download-targets {\n overflow-y: auto;\n}\n\n.download-dialog .main-content,\n.download-dialog .mobile.layout {\n display: flex;\n flex-direction: column;\n}\n\n.download-dialog .main-content .list {\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.download-dialog .content > div,\n.download-dialog .ui.grid .column,\n.download-dialog .main-content {\n height: 100%;\n}\n\n.download-dialog .download-handler {\n display: flex;\n align-items: baseline;\n}\n\n.download-dialog .disk-info {\n color: black;\n font-size: 90%;\n font-style: italic;\n}\n\n.download-dialog .normal.layout .four.wide.column {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n","",{version:3,sources:["webpack://./src/components/download/style.css"],names:[],mappings:"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,aAAa;EACb,qBAAqB;AACvB;;AAEA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AAChC",sourcesContent:[".download-dialog .accordion.download-targets {\n overflow-y: auto;\n}\n\n.download-dialog .main-content,\n.download-dialog .mobile.layout {\n display: flex;\n flex-direction: column;\n}\n\n.download-dialog .main-content .list {\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.download-dialog .content > div,\n.download-dialog .ui.grid .column,\n.download-dialog .main-content {\n height: 100%;\n}\n\n.download-dialog .download-handler {\n display: flex;\n align-items: baseline;\n}\n\n.download-dialog .disk-info {\n color: black;\n font-size: 90%;\n font-style: italic;\n}\n\n.download-dialog .normal.layout .four.wide.column {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n"],sourceRoot:""}]);const d=l},88544:(e,n,o)=>{o.d(n,{A:()=>le});var t=o(74848),a=o(96540),s=o(6527),l=o(32389),d=o(93226),i=o(59315),r=o(4425),c=o(88939),h=o(56484),m=o(65385),u=o(99671),A=o(47603),p=o(36076),w=o(42695),f=o(53213),y=o(33968),x=o(8098),v=o(42191),j=o(79179),O=o(27725),g=o(67749),E=o(32728),b=o(83994),N=o(74416),C=o(50489);const I=(e,n,{formatSize:o})=>e.free_space<=0?e.path:` (${n((0,w.j2)("spaceFree",g.KV.COMMON),{defaultValue:"{{freeSpace}} free",replace:{freeSpace:o(e.free_space)}})})`,P=({pathInfo:e,downloadHandler:n,t:o})=>{const a=(0,N.k)();return(0,t.jsxs)("div",{className:"item",children:[(0,t.jsx)(b.A,{icon:r.A.FOLDER}),(0,t.jsx)("div",{className:"content",children:(0,t.jsx)(C.A,{onClick:()=>n(e.path),caption:(0,t.jsxs)(t.Fragment,{children:[e.path,(0,t.jsx)("span",{className:"disk-info",children:I(e,o,a)})]})})})]})},B=(0,h.A)((function({downloadHandler:e,pathInfos:n,t:o}){return(0,t.jsx)("div",{className:"ui relaxed list",children:n.map((n=>(0,t.jsx)(P,{pathInfo:n,downloadHandler:e,t:o},n.path)))})}),{urls:{pathInfos:({paths:e},n)=>n.post(i.A.DISK_INFO_URL,{paths:e})}}),k=e=>0===e.paths.length?(0,t.jsx)(E.A,{title:(0,w.Tl)("No paths to display",e.t,g.KV.COMMON)}):(0,t.jsx)(B,Object.assign({},e));var R=o(78340);class D extends a.Component{constructor(){super(...arguments),this.formatParent=e=>{const{downloadHandler:n,t:o}=this.props;return(0,t.jsxs)(a.Fragment,{children:[(0,t.jsxs)("div",{className:"title",children:[(0,t.jsx)(b.A,{icon:r.A.DROPDOWN}),e.name]}),(0,t.jsx)("div",{className:"content",children:(0,t.jsx)(k,{paths:e.paths,downloadHandler:n,t:o})})]},e.name)}}render(){const{groupedPaths:e,t:n}=this.props;return 0===e.length?(0,t.jsx)(E.A,{title:(0,w.Tl)("No paths to display",n,g.KV.COMMON)}):(0,t.jsx)(R.Ay,{className:"styled download-targets",children:e.map(this.formatParent)})}}const _=D;var S=o(90425);const M=(e,n,o)=>n?[...e,(0,t.jsxs)(O.A,{onClick:n,children:[(0,w.Tl)("Browse",o,g.KV.COMMON),(0,t.jsx)(b.A,{icon:r.A.BROWSE})]},"browse")]:e,T=({menuItems:e,title:n,handleBrowse:o,t:a,children:s})=>(0,t.jsxs)("div",{className:"mobile layout",children:[(0,t.jsx)(S.A,{selection:!0,caption:n,children:M(e,o,a)}),(0,t.jsx)("div",{className:"ui segment main-content",children:s})]});var H=o(96529),L=o(73070);const U=({menuItems:e,title:n,handleBrowse:o,t:a,children:s})=>(0,t.jsxs)(L.xA,{className:"normal layout",children:[(0,t.jsxs)("div",{className:"four wide column",children:[(0,t.jsx)("div",{className:"ui vertical fluid tabular menu",children:e}),!!o&&(0,t.jsx)(H.A,{className:"fluid basic",caption:(0,w.Tl)("Browse",a,g.KV.COMMON),onClick:o,icon:r.A.BROWSE})]}),(0,t.jsx)("div",{className:"twelve wide stretched column",children:(0,t.jsx)("div",{className:"ui segment main-content",children:s})})]}),V=(0,h.A)((e=>{const{t:n}=(0,l.Bd)(),[o,s]=(0,a.useState)("history"),d=a.useMemo((()=>{const{historyPaths:n,sharePaths:o,favoritePaths:a,itemInfo:s}=e;return(e=>{const{sharePaths:n,favoritePaths:o,historyPaths:a,dupePaths:s}=e;return[{name:"Previous",key:"history",list:a,component:({downloadHandler:e,t:n})=>(0,t.jsx)(k,{paths:a,downloadHandler:e,t:n})},{name:"Shared",key:"shared",list:n,component:({downloadHandler:e,t:o})=>(0,t.jsx)(_,{groupedPaths:n,downloadHandler:e,t:o})},{name:"Favorites",key:"favorites",list:o,component:({downloadHandler:e,t:n})=>(0,t.jsx)(_,{groupedPaths:o,downloadHandler:e,t:n})},{name:"Dupes",key:"dupes",list:s,component:({downloadHandler:e,t:n})=>(0,t.jsx)(k,{paths:s,downloadHandler:e,t:n})}]})({historyPaths:n,sharePaths:o,favoritePaths:a,dupePaths:s.dupe?s.dupe.paths.map((e=>(0,y._6)(e))):[]})}),[]),i=d.find((e=>e.key===o));if(!i)return null;const r=d.map((e=>((e,n,o,a)=>(0,t.jsx)(O.A,{onClick:()=>o(e.key),active:n===e.key,children:(0,t.jsxs)(t.Fragment,{children:[a((0,w.j2)(e.key,g.KV.COMMON),e.name),!!e.list&&(0,t.jsx)("div",{className:"ui small label",children:e.list.length})]})},e.key))(e,o,s,n))),c=(0,x.vU)()?T:U;return(0,t.jsx)(c,{menuItems:r,title:i.name,handleBrowse:e.handleBrowse,t:n,children:(0,t.jsx)(i.component,{t:n,downloadHandler:e.downloadHandler})},i.key)}),{urls:{sharePaths:v.A.GROUPED_ROOTS_GET_URL,favoritePaths:j.A.GROUPED_DIRECTORIES_URL}});var F=o(86038),K=o(85072),G=o.n(K),W=o(97825),Y=o.n(W),q=o(77659),$=o.n(q),z=o(55056),Z=o.n(z),J=o(10540),Q=o.n(J),X=o(41113),ee=o.n(X),ne=o(20082),oe={};oe.styleTagTransform=ee(),oe.setAttributes=Z(),oe.insert=$().bind(null,"head"),oe.domAPI=Y(),oe.insertStyleElement=Q(),G()(ne.A,oe),ne.A&&ne.A.locals&&ne.A.locals;var te=o(28286),ae=o(48249),se=function(e,n,o,t){return new(o||(o=Promise))((function(a,s){function l(e){try{i(t.next(e))}catch(e){s(e)}}function d(e){try{i(t.throw(e))}catch(e){s(e)}}function i(e){var n;e.done?a(e.value):(n=e.value,n instanceof o?n:new o((function(e){e(n)}))).then(l,d)}i((t=t.apply(e,n||[])).next())}))};const le=(0,m.A)((0,h.A)((e=>{const{t:n}=(0,l.Bd)(),o=(0,s.Zp)(),{hasAccess:a}=(0,te.w)(),h=(0,ae.F)(),{downloadHandler:m,itemInfo:x,userGetter:v,params:j,session:O,historyPaths:E,handleClose:b}=e,N=function(e,n){var o={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&n.indexOf(t)<0&&(o[t]=e[t]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(t=Object.getOwnPropertySymbols(e);a<t.length;a++)n.indexOf(t[a])<0&&Object.prototype.propertyIsEnumerable.call(e,t[a])&&(o[t[a]]=e[t[a]])}return o}(e,["downloadHandler","itemInfo","userGetter","params","session","historyPaths","handleClose"]),C=(o,t)=>se(void 0,void 0,void 0,(function*(){try{yield m(x,v?v(j.downloadItemId,e):void 0,{target_name:t||x.name,target_directory:o,priority:F.Fm.DEFAULT},O)}catch(e){c.A.error({title:n((0,w.j2)("queueingFailed",g.KV.COMMON),{defaultValue:"Failed to queue the item {{item.name}}",replace:{item:x}}),message:e.message})}(0,p.bd)((()=>(0,f.G)(h,d.n2.DOWNLOAD_DIR,o)),n)})),I={subHeader:x.name,title:(0,w.Tl)("Download",n,g.KV.COMMON),icon:r.A.DOWNLOAD,closable:!1},P=a(F.US.FILESYSTEM_VIEW);return(0,t.jsxs)(s.BV,{children:[(0,t.jsx)(s.qh,{path:"browse/*",element:(0,t.jsx)(A.d,Object.assign({onConfirm:e=>se(void 0,void 0,void 0,(function*(){yield C((0,y.oK)(e),(0,y.WP)(e))})),initialPath:(()=>{const e=E.length>0?E[E.length-1]:"";return"directory"===x.type.id?e:e+x.name})(),selectMode:"directory"===x.type.id?g.bV.DIRECTORY:g.bV.FILE,historyId:i.A.LOCATION_DOWNLOAD,approveCaption:(0,w.Tl)("Download",n,g.KV.COMMON),modalComponent:u.A},I))}),(0,t.jsx)(s.qh,{index:!0,element:(0,t.jsx)(u.A,Object.assign({className:"download-dialog",fullHeight:!0},I,N,{children:(0,t.jsx)(V,{downloadHandler:(e,n)=>se(void 0,void 0,void 0,(function*(){yield C(e,n),yield b()})),handleBrowse:P?()=>{o("browse")}:void 0,historyPaths:E,itemInfo:x})}))})]})}),{urls:{historyPaths:`${d.Ay.STRINGS_URL}/${d.n2.DOWNLOAD_DIR}`,itemInfo:({params:e,itemDataGetter:n},o)=>n(e.downloadItemId,o)}}),"/download/:downloadItemId")},73070:(e,n,o)=>{o.d(n,{Y9:()=>h,fI:()=>c,xA:()=>m});var t=o(74848),a=(o(96540),o(46942)),s=o.n(a),l=o(32389),d=o(42695),i=o(67749);const r=e=>e||(0,t.jsx)(l.x6,{i18nKey:(0,d.j2)("na",i.KV.COMMON),children:"N/A"}),c=({title:e,text:n,className:o,titleWidth:a="four",noText:l})=>(0,t.jsxs)("div",{className:s()("ui row",o),children:[(0,t.jsx)("div",{className:s()(l?"sixteen":a,"wide column title"),children:(0,t.jsx)("div",{className:"ui tiny header",style:{overflow:"hidden"},children:e})}),!l&&(0,t.jsx)("div",{className:"column value",children:r(n)})]}),h=({title:e})=>(0,t.jsx)("div",{className:"ui row",children:(0,t.jsx)("div",{className:"sixteen wide column",children:(0,t.jsx)("div",{className:"ui blue section header",children:e})})}),m=e=>{var{className:n,children:o,columns:a,stackable:l}=e,d=function(e,n){var o={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&n.indexOf(t)<0&&(o[t]=e[t]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(t=Object.getOwnPropertySymbols(e);a<t.length;a++)n.indexOf(t[a])<0&&Object.prototype.propertyIsEnumerable.call(e,t[a])&&(o[t[a]]=e[t[a]])}return o}(e,["className","children","columns","stackable"]);return(0,t.jsx)("div",Object.assign({className:s()("ui grid",{[`${a} column`]:!!a},{stackable:l},n)},d,{children:o}))}},79179:(e,n,o)=>{o.d(n,{A:()=>a});const t="favorite_directories",a={MODULE_URL:t,GROUPED_DIRECTORIES_URL:t+"/grouped_paths",DIRECTORIES_URL:t,DIRECTORIES_UPDATED:"favorite_directories_updated"}},53213:(e,n,o)=>{o.d(n,{G:()=>a});var t=o(93226);const a=(e,n,o)=>e.post(`${t.Ay.STRINGS_URL}/${n}`,{string:o})}}]);
2
+ //# sourceMappingURL=544.ea8aa126d1973f0321b3.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/544.ea8aa126d1973f0321b3.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/download/style.css","webpack://airdcpp-webui/./src/components/download/layout/sections/PathListItem.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/PathList.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/AccordionTargets.tsx","webpack://airdcpp-webui/./src/components/download/layout/MobileDownloadLayout.tsx","webpack://airdcpp-webui/./src/components/download/layout/NormalDownloadLayout.tsx","webpack://airdcpp-webui/./src/components/download/layout/DownloadView.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/sections.tsx","webpack://airdcpp-webui/./src/components/download/style.css?6643","webpack://airdcpp-webui/./src/components/download/DownloadDialog.tsx","webpack://airdcpp-webui/./src/components/semantic/Grid.tsx","webpack://airdcpp-webui/./src/constants/FavoriteDirectoryConstants.ts","webpack://airdcpp-webui/./src/services/api/HistoryApi.ts"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.download-dialog .accordion.download-targets {\n overflow-y: auto;\n}\n\n.download-dialog .main-content,\n.download-dialog .mobile.layout {\n display: flex;\n flex-direction: column;\n}\n\n.download-dialog .main-content .list {\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.download-dialog .content > div,\n.download-dialog .ui.grid .column,\n.download-dialog .main-content {\n height: 100%;\n}\n\n.download-dialog .download-handler {\n display: flex;\n align-items: baseline;\n}\n\n.download-dialog .disk-info {\n color: black;\n font-size: 90%;\n font-style: italic;\n}\n\n.download-dialog .normal.layout .four.wide.column {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/download/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,aAAa;EACb,qBAAqB;AACvB;;AAEA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AAChC\",\"sourcesContent\":[\".download-dialog .accordion.download-targets {\\n overflow-y: auto;\\n}\\n\\n.download-dialog .main-content,\\n.download-dialog .mobile.layout {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.download-dialog .main-content .list {\\n overflow-y: auto;\\n overflow-x: hidden;\\n}\\n\\n.download-dialog .content > div,\\n.download-dialog .ui.grid .column,\\n.download-dialog .main-content {\\n height: 100%;\\n}\\n\\n.download-dialog .download-handler {\\n display: flex;\\n align-items: baseline;\\n}\\n\\n.download-dialog .disk-info {\\n color: black;\\n font-size: 90%;\\n font-style: italic;\\n}\\n\\n.download-dialog .normal.layout .four.wide.column {\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import * as React from 'react';\n\nimport IconConstants from 'constants/IconConstants';\n\nimport Icon from 'components/semantic/Icon';\n\nimport { toI18nKey } from 'utils/TranslationUtils';\nimport { Formatter, useFormatter } from 'context/FormatterContext';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\nimport { PathDownloadHandler } from '../../types';\nimport LinkButton from 'components/semantic/LinkButton';\n\ninterface PathItemProps {\n pathInfo: API.DiskSpaceInfo;\n downloadHandler: PathDownloadHandler;\n t: UI.TranslateF;\n}\n\nconst formatFreeSpace = (\n pathInfo: API.DiskSpaceInfo,\n t: UI.TranslateF,\n { formatSize }: Formatter,\n) => {\n if (pathInfo.free_space <= 0) {\n return pathInfo.path;\n }\n\n return ` (${t(toI18nKey('spaceFree', UI.Modules.COMMON), {\n defaultValue: '{{freeSpace}} free',\n replace: {\n freeSpace: formatSize(pathInfo.free_space),\n },\n })})`;\n};\n\nexport const PathListItem: React.FC<PathItemProps> = ({\n pathInfo,\n downloadHandler,\n t,\n}) => {\n const formatter = useFormatter();\n return (\n <div className=\"item\">\n <Icon icon={IconConstants.FOLDER} />\n <div className=\"content\">\n <LinkButton\n onClick={() => downloadHandler(pathInfo.path)}\n caption={\n <>\n {pathInfo.path}\n <span className=\"disk-info\">{formatFreeSpace(pathInfo, t, formatter)}</span>\n </>\n }\n />\n </div>\n </div>\n );\n};\n","import FilesystemConstants from 'constants/FilesystemConstants';\r\n\r\nimport DataProviderDecorator from 'decorators/DataProviderDecorator';\r\n\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport { translate } from 'utils/TranslationUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { PathDownloadHandler } from '../../types';\r\nimport { PathListItem } from './PathListItem';\r\n\r\ninterface PathListProps {\r\n // Function handling the path selection\r\n downloadHandler: PathDownloadHandler;\r\n\r\n // Array of paths to list\r\n paths: string[];\r\n t: UI.TranslateF;\r\n}\r\n\r\ninterface PathListDataProps {\r\n pathInfos: API.DiskSpaceInfo[];\r\n}\r\n\r\nconst PathListWithData = DataProviderDecorator<PathListProps, PathListDataProps>(\r\n function PathList({ downloadHandler, pathInfos, t }) {\r\n return (\r\n <div className=\"ui relaxed list\">\r\n {pathInfos.map((pathInfo) => (\r\n <PathListItem\r\n key={pathInfo.path}\r\n pathInfo={pathInfo}\r\n downloadHandler={downloadHandler}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n );\r\n },\r\n {\r\n urls: {\r\n pathInfos: ({ paths }, socket) =>\r\n socket.post(FilesystemConstants.DISK_INFO_URL, { paths }),\r\n },\r\n },\r\n);\r\n\r\nconst PathList: React.FC<PathListProps> = (props) => {\r\n if (props.paths.length === 0) {\r\n return (\r\n <Message title={translate('No paths to display', props.t, UI.Modules.COMMON)} />\r\n );\r\n }\r\n\r\n return <PathListWithData {...props} />;\r\n};\r\n\r\nexport default PathList;\r\n","import React, { Component } from 'react';\n\nimport IconConstants from 'constants/IconConstants';\n\nimport Accordion from 'components/semantic/Accordion';\nimport Icon from 'components/semantic/Icon';\nimport Message from 'components/semantic/Message';\n\nimport { translate } from 'utils/TranslationUtils';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\nimport { PathDownloadHandler } from '../../types';\n\nimport PathList from './PathList';\n\ninterface AccordionTargetsProps {\n // Grouped paths to list\n groupedPaths: API.GroupedPath[];\n\n // Function handling the path selection. Receives the selected path as argument.\n downloadHandler: PathDownloadHandler;\n\n t: UI.TranslateF;\n}\n\nclass AccordionTargets extends Component<AccordionTargetsProps> {\n formatParent = (parent: API.GroupedPath) => {\n const { downloadHandler, t } = this.props;\n return (\n <React.Fragment key={parent.name}>\n <div className=\"title\">\n <Icon icon={IconConstants.DROPDOWN} />\n {parent.name}\n </div>\n\n <div className=\"content\">\n <PathList paths={parent.paths} downloadHandler={downloadHandler} t={t} />\n </div>\n </React.Fragment>\n );\n };\n\n render() {\n const { groupedPaths, t } = this.props;\n if (groupedPaths.length === 0) {\n return <Message title={translate('No paths to display', t, UI.Modules.COMMON)} />;\n }\n\n return (\n <Accordion className=\"styled download-targets\">\n {groupedPaths.map(this.formatParent)}\n </Accordion>\n );\n }\n}\n\nexport default AccordionTargets;\n","import * as React from 'react';\r\n\r\nimport { translate } from 'utils/TranslationUtils';\r\n\r\nimport Dropdown from 'components/semantic/Dropdown';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport Icon from 'components/semantic/Icon';\r\nimport { BrowseHandler, DownloadLayoutProps } from '../types';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nconst appendBrowseItem = (\r\n menuItems: React.ReactNode[],\r\n handleBrowse: BrowseHandler,\r\n t: UI.TranslateF,\r\n) => {\r\n if (!handleBrowse) {\r\n return menuItems;\r\n }\r\n\r\n return [\r\n ...menuItems,\r\n <MenuItemLink key=\"browse\" onClick={handleBrowse}>\r\n {translate('Browse', t, UI.Modules.COMMON)}\r\n <Icon icon={IconConstants.BROWSE} />\r\n </MenuItemLink>,\r\n ];\r\n};\r\n\r\nexport const MobileDownloadLayout: React.FC<DownloadLayoutProps> = ({\r\n menuItems,\r\n title,\r\n handleBrowse,\r\n t,\r\n children,\r\n}) => (\r\n <div className=\"mobile layout\">\r\n <Dropdown selection={true} caption={title}>\r\n {appendBrowseItem(menuItems, handleBrowse, t)}\r\n </Dropdown>\r\n <div className=\"ui segment main-content\">{children}</div>\r\n </div>\r\n);\r\n","import * as React from 'react';\n\nimport IconConstants from 'constants/IconConstants';\n\nimport { translate } from 'utils/TranslationUtils';\n\nimport Button from 'components/semantic/Button';\nimport { Grid } from 'components/semantic/Grid';\n\nimport * as UI from 'types/ui';\nimport { DownloadLayoutProps } from '../types';\n\nexport const NormalDownloadLayout: React.FC<DownloadLayoutProps> = ({\n menuItems,\n title,\n handleBrowse,\n t,\n children,\n}) => (\n <Grid className=\"normal layout\">\n <div className=\"four wide column\">\n <div className=\"ui vertical fluid tabular menu\">{menuItems}</div>\n {!!handleBrowse && (\n <Button\n className=\"fluid basic\"\n caption={translate('Browse', t, UI.Modules.COMMON)}\n onClick={handleBrowse}\n icon={IconConstants.BROWSE}\n />\n )}\n </div>\n <div className=\"twelve wide stretched column\">\n <div className=\"ui segment main-content\">{children}</div>\n </div>\n </Grid>\n);\n","import { useState } from 'react';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { getParentPath } from 'utils/FileUtils';\r\nimport { usingMobileLayout } from 'utils/BrowserUtils';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\n\r\nimport ShareConstants from 'constants/ShareConstants';\r\nimport FavoriteDirectoryConstants from 'constants/FavoriteDirectoryConstants';\r\n\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { getDownloadSections, DownloadSection } from './sections';\r\nimport { BrowseHandler, PathDownloadHandler } from '../types';\r\n\r\nimport { MobileDownloadLayout } from './MobileDownloadLayout';\r\nimport { NormalDownloadLayout } from './NormalDownloadLayout';\r\nimport DataProviderDecorator from 'decorators/DataProviderDecorator';\r\n\r\nexport interface DownloadLayoutDataProps<\r\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo,\r\n> {\r\n sharePaths: API.GroupedPath[];\r\n favoritePaths: API.GroupedPath[];\r\n}\r\n\r\nexport interface DownloadLayoutProps<\r\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo,\r\n> {\r\n downloadHandler: PathDownloadHandler;\r\n handleBrowse: BrowseHandler;\r\n\r\n historyPaths: string[];\r\n itemInfo: ItemT;\r\n}\r\n\r\nconst getMenuItem = (\r\n section: DownloadSection,\r\n activeSection: string,\r\n onClick: (key: string) => void,\r\n t: UI.TranslateF,\r\n) => (\r\n <MenuItemLink\r\n key={section.key}\r\n onClick={() => onClick(section.key)}\r\n active={activeSection === section.key}\r\n >\r\n <>\r\n {t(toI18nKey(section.key, UI.Modules.COMMON), section.name)}\r\n {!!section.list && <div className=\"ui small label\">{section.list.length}</div>}\r\n </>\r\n </MenuItemLink>\r\n);\r\n\r\ntype Props<ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo> =\r\n DownloadLayoutProps<ItemT> & DownloadLayoutDataProps<ItemT>;\r\n\r\nconst DownloadLayout: React.FC<Props> = (props) => {\r\n const { t } = useTranslation();\r\n const [activeSectionKey, setActiveSectionKey] = useState('history');\r\n\r\n const sections = React.useMemo(() => {\r\n const { historyPaths, sharePaths, favoritePaths, itemInfo } = props;\r\n const dupePaths = itemInfo.dupe\r\n ? itemInfo.dupe.paths.map((path) => getParentPath(path))\r\n : [];\r\n\r\n return getDownloadSections({\r\n historyPaths,\r\n sharePaths,\r\n favoritePaths,\r\n dupePaths,\r\n });\r\n }, []);\r\n\r\n const activeSection = sections.find((s) => s.key === activeSectionKey);\r\n if (!activeSection) {\r\n return null;\r\n }\r\n\r\n const menuItems = sections.map((s) =>\r\n getMenuItem(s, activeSectionKey, setActiveSectionKey, t),\r\n );\r\n\r\n const Component = usingMobileLayout() ? MobileDownloadLayout : NormalDownloadLayout;\r\n return (\r\n <Component\r\n key={activeSection.key} // Ensure that section-specific data is refetched\r\n menuItems={menuItems}\r\n title={activeSection.name}\r\n handleBrowse={props.handleBrowse}\r\n t={t}\r\n >\r\n <activeSection.component t={t} downloadHandler={props.downloadHandler} />\r\n </Component>\r\n );\r\n};\r\n\r\nconst DownloadLayoutDecorated = DataProviderDecorator<\r\n DownloadLayoutProps,\r\n DownloadLayoutDataProps\r\n>(DownloadLayout, {\r\n urls: {\r\n sharePaths: ShareConstants.GROUPED_ROOTS_GET_URL,\r\n favoritePaths: FavoriteDirectoryConstants.GROUPED_DIRECTORIES_URL,\r\n },\r\n});\r\n\r\nexport { DownloadLayoutDecorated as DownloadLayout };\r\n","import * as React from 'react';\n\nimport PathList from './PathList';\nimport AccordionTargets from './AccordionTargets';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { PathDownloadHandler } from '../../types';\n\nexport interface DownloadSectionChildProps {\n t: UI.TranslateF;\n downloadHandler: PathDownloadHandler;\n}\n\nexport interface DownloadSection {\n name: string;\n key: string;\n list?: string[] | API.GroupedPath[];\n component: React.ComponentType<DownloadSectionChildProps>;\n}\n\ninterface PathInfo {\n sharePaths: API.GroupedPath[];\n favoritePaths: API.GroupedPath[];\n historyPaths: string[];\n dupePaths: string[];\n}\n\nexport const getDownloadSections = (pathInfo: PathInfo) => {\n const { sharePaths, favoritePaths, historyPaths, dupePaths } = pathInfo;\n\n const sections: DownloadSection[] = [\n {\n name: 'Previous',\n key: 'history',\n list: historyPaths,\n component: ({ downloadHandler, t }) => (\n <PathList paths={historyPaths} downloadHandler={downloadHandler} t={t} />\n ),\n },\n {\n name: 'Shared',\n key: 'shared',\n list: sharePaths,\n component: ({ downloadHandler, t }) => (\n <AccordionTargets\n groupedPaths={sharePaths}\n downloadHandler={downloadHandler}\n t={t}\n />\n ),\n },\n {\n name: 'Favorites',\n key: 'favorites',\n list: favoritePaths,\n component: ({ downloadHandler, t }) => (\n <AccordionTargets\n groupedPaths={favoritePaths}\n downloadHandler={downloadHandler}\n t={t}\n />\n ),\n },\n {\n name: 'Dupes',\n key: 'dupes',\n list: dupePaths,\n component: ({ downloadHandler, t }) => (\n <PathList paths={dupePaths} downloadHandler={downloadHandler} t={t} />\n ),\n },\n ];\n\n return sections;\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\r\nimport { Route, Routes, useNavigate } from 'react-router';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport {\r\n default as HistoryConstants,\r\n HistoryStringEnum,\r\n} from 'constants/HistoryConstants';\r\nimport FilesystemConstants from 'constants/FilesystemConstants';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport NotificationActions from 'actions/NotificationActions';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\nimport ModalRouteDecorator, {\r\n ModalRouteDecoratorChildProps,\r\n} from 'decorators/ModalRouteDecorator';\r\n\r\nimport RouteModal, { RouteModalProps } from 'components/semantic/RouteModal';\r\nimport { FileBrowserDialog } from 'components/filebrowser';\r\n\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport { toI18nKey, translate } from 'utils/TranslationUtils';\r\nimport { addHistory } from 'services/api/HistoryApi';\r\n\r\nimport { DownloadLayout } from './layout';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { PathDownloadHandler } from './types';\r\n\r\nimport './style.css';\r\nimport { useSession } from 'context/SessionContext';\r\nimport { useSocket } from 'context/SocketContext';\r\nimport { getFileName, getFilePath } from 'utils/FileUtils';\r\n\r\nexport type DownloadDialogProps<\r\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo,\r\n> = UI.ItemDownloadHandler<ItemT, Props<ItemT>>;\r\n\r\ntype DownloadDialogRouteProps = ModalRouteDecoratorChildProps;\r\n\r\ninterface DownloadDialogDataProps<\r\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo,\r\n> extends DataProviderDecoratorChildProps {\r\n historyPaths: string[];\r\n itemInfo: ItemT;\r\n}\r\n\r\ntype Props<ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo> =\r\n DownloadDialogProps<ItemT> & DownloadDialogDataProps<ItemT> & DownloadDialogRouteProps;\r\n\r\nconst DownloadDialog: React.FC<Props> = (props) => {\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n const { hasAccess } = useSession();\r\n const socket = useSocket();\r\n\r\n const {\r\n downloadHandler,\r\n itemInfo,\r\n userGetter,\r\n params,\r\n session,\r\n historyPaths,\r\n handleClose,\r\n ...other\r\n } = props;\r\n\r\n const handleDownload: PathDownloadHandler = async (targetPath, targetFilename) => {\r\n try {\r\n await downloadHandler(\r\n itemInfo,\r\n !!userGetter ? userGetter(params.downloadItemId!, props) : undefined,\r\n {\r\n target_name: !!targetFilename ? targetFilename : itemInfo.name,\r\n target_directory: targetPath,\r\n priority: API.QueuePriorityEnum.DEFAULT,\r\n },\r\n session,\r\n );\r\n } catch (e) {\r\n NotificationActions.error({\r\n title: t(toI18nKey('queueingFailed', UI.Modules.COMMON), {\r\n defaultValue: 'Failed to queue the item {{item.name}}',\r\n replace: {\r\n item: itemInfo,\r\n },\r\n }),\r\n message: e.message,\r\n });\r\n }\r\n\r\n runBackgroundSocketAction(\r\n () => addHistory(socket, HistoryStringEnum.DOWNLOAD_DIR, targetPath),\r\n t,\r\n );\r\n };\r\n\r\n const getInitialBrowsePath = () => {\r\n const path = historyPaths.length > 0 ? historyPaths[historyPaths.length - 1] : '';\r\n return itemInfo.type.id === 'directory' ? path : path + itemInfo.name;\r\n };\r\n\r\n const handleBrowse = () => {\r\n navigate(`browse`);\r\n };\r\n\r\n const commonDialogProps: RouteModalProps = {\r\n subHeader: itemInfo.name,\r\n title: translate('Download', t, UI.Modules.COMMON),\r\n icon: IconConstants.DOWNLOAD,\r\n closable: false,\r\n };\r\n\r\n const hasFileBrowserAccess = hasAccess(API.AccessEnum.FILESYSTEM_VIEW);\r\n return (\r\n <Routes>\r\n <Route\r\n path=\"browse/*\"\r\n element={\r\n <FileBrowserDialog\r\n onConfirm={async (path) => {\r\n await handleDownload(getFilePath(path), getFileName(path));\r\n }}\r\n initialPath={getInitialBrowsePath()}\r\n selectMode={\r\n itemInfo.type.id === 'directory'\r\n ? UI.FileSelectModeEnum.DIRECTORY\r\n : UI.FileSelectModeEnum.FILE\r\n }\r\n historyId={FilesystemConstants.LOCATION_DOWNLOAD}\r\n approveCaption={translate('Download', t, UI.Modules.COMMON)}\r\n modalComponent={RouteModal}\r\n {...commonDialogProps}\r\n />\r\n }\r\n />\r\n <Route\r\n index\r\n element={\r\n <RouteModal\r\n className=\"download-dialog\"\r\n fullHeight={true}\r\n {...commonDialogProps}\r\n {...other}\r\n >\r\n <DownloadLayout\r\n downloadHandler={async (targetPath, targetFilename) => {\r\n await handleDownload(targetPath, targetFilename);\r\n await handleClose();\r\n }}\r\n handleBrowse={hasFileBrowserAccess ? handleBrowse : undefined}\r\n historyPaths={historyPaths}\r\n itemInfo={itemInfo}\r\n />\r\n </RouteModal>\r\n }\r\n />\r\n </Routes>\r\n );\r\n};\r\n\r\nexport default ModalRouteDecorator<DownloadDialogProps>(\r\n DataProviderDecorator<\r\n DownloadDialogProps & DownloadDialogRouteProps,\r\n DownloadDialogDataProps\r\n >(DownloadDialog, {\r\n urls: {\r\n historyPaths: `${HistoryConstants.STRINGS_URL}/${HistoryStringEnum.DOWNLOAD_DIR}`,\r\n itemInfo: ({ params, itemDataGetter }, socket) => {\r\n return itemDataGetter(params.downloadItemId!, socket);\r\n },\r\n },\r\n }),\r\n '/download/:downloadItemId',\r\n);\r\n","import * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport { Trans } from 'react-i18next';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nexport interface RowProps {\r\n title: React.ReactNode;\r\n text?: React.ReactNode;\r\n titleWidth?: string;\r\n className?: string;\r\n noText?: boolean;\r\n}\r\n\r\nconst formatText = (text: React.ReactNode) => {\r\n if (!!text) {\r\n return text;\r\n }\r\n\r\n return <Trans i18nKey={toI18nKey('na', UI.Modules.COMMON)}>N/A</Trans>;\r\n};\r\n\r\nexport const Row: React.FC<RowProps> = ({\r\n title,\r\n text,\r\n className,\r\n titleWidth = 'four',\r\n noText,\r\n}) => (\r\n <div className={classNames('ui row', className)}>\r\n <div className={classNames(noText ? 'sixteen' : titleWidth, 'wide column title')}>\r\n <div className=\"ui tiny header\" style={{ overflow: 'hidden' }}>\r\n {title}\r\n </div>\r\n </div>\r\n {!noText && <div className=\"column value\">{formatText(text)}</div>}\r\n </div>\r\n);\r\n\r\nexport interface HeaderProps {\r\n title: React.ReactNode;\r\n}\r\n\r\nexport const Header: React.FC<HeaderProps> = ({ title }) => (\r\n <div className=\"ui row\">\r\n <div className=\"sixteen wide column\">\r\n <div className=\"ui blue section header\">{title}</div>\r\n </div>\r\n </div>\r\n);\r\n\r\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\r\n columns?: string;\r\n stackable?: boolean;\r\n}\r\n\r\nexport const Grid: React.FC<GridProps> = ({\r\n className,\r\n children,\r\n columns,\r\n stackable,\r\n ...other\r\n}) => (\r\n <div\r\n className={classNames(\r\n 'ui grid',\r\n //`${columns} column`,\r\n { [`${columns} column`]: !!columns },\r\n { stackable: stackable },\r\n className,\r\n )}\r\n {...other}\r\n >\r\n {children}\r\n </div>\r\n);\r\n","const MODULE_URL = 'favorite_directories';\nexport default {\n MODULE_URL: MODULE_URL,\n\n GROUPED_DIRECTORIES_URL: MODULE_URL + '/grouped_paths',\n DIRECTORIES_URL: MODULE_URL,\n\n DIRECTORIES_UPDATED: 'favorite_directories_updated',\n};\n","import { APISocket } from 'services/SocketService';\nimport HistoryConstants from 'constants/HistoryConstants';\n\nexport const addHistory = (socket: APISocket, historyId: string, text: string) => {\n return socket.post(`${HistoryConstants.STRINGS_URL}/${historyId}`, {\n string: text,\n });\n};\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","formatFreeSpace","pathInfo","t","formatSize","free_space","path","COMMON","defaultValue","replace","freeSpace","PathListItem","downloadHandler","formatter","className","Icon","icon","IconConstants","FOLDER","LinkButton","onClick","caption","PathListWithData","DataProviderDecorator","pathInfos","map","urls","paths","socket","post","FilesystemConstants","DISK_INFO_URL","props","length","Message","title","AccordionTargets","Component","formatParent","parent","this","DROPDOWN","name","render","groupedPaths","Accordion","appendBrowseItem","menuItems","handleBrowse","MenuItemLink","BROWSE","MobileDownloadLayout","children","Dropdown","selection","NormalDownloadLayout","Grid","Button","DownloadLayoutDecorated","activeSectionKey","setActiveSectionKey","useState","sections","historyPaths","sharePaths","favoritePaths","itemInfo","dupePaths","key","list","component","getDownloadSections","dupe","activeSection","find","s","section","active","getMenuItem","ShareConstants","GROUPED_ROOTS_GET_URL","FavoriteDirectoryConstants","GROUPED_DIRECTORIES_URL","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","ModalRouteDecorator","navigate","hasAccess","userGetter","params","session","handleClose","other","handleDownload","targetPath","targetFilename","downloadItemId","undefined","target_name","target_directory","priority","DEFAULT","e","NotificationActions","error","item","message","DOWNLOAD_DIR","commonDialogProps","subHeader","DOWNLOAD","closable","hasFileBrowserAccess","FILESYSTEM_VIEW","element","onConfirm","initialPath","type","getInitialBrowsePath","selectMode","DIRECTORY","FILE","historyId","LOCATION_DOWNLOAD","approveCaption","modalComponent","RouteModal","index","fullHeight","HistoryConstants","STRINGS_URL","itemDataGetter","formatText","text","i18nKey","Row","titleWidth","noText","style","overflow","Header","columns","stackable","MODULE_URL","DIRECTORIES_URL","DIRECTORIES_UPDATED","addHistory","string"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[616],{46510:(n,e,s)=>{s.d(e,{A:()=>r});var i=s(71354),t=s.n(i),o=s(76314),a=s.n(o)()(t());a.push([n.id,".session-container {\n background-color: white;\n}\n\n.session-container.horizontal.ui.grid {\n margin: 0px !important;\n}\n\n.session-container.horizontal .menu-column .item.new {\n padding: 0.78571429em 1.1em !important;\n}\n\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\n margin: 0 0.35714286em 0 0 !important;\n}\n\n.session-container.horizontal .session-layout > .ui.divider {\n margin: 5px 0px 0px 0px;\n}\n\n.session-container.vertical {\n padding: 15px;\n display: flex;\n flex-direction: column;\n}\n.session-layout {\n flex: 100 100 auto;\n display: flex;\n overflow: hidden;\n}\n\n.session-container.horizontal .session-layout {\n flex-direction: column;\n}\n\n.session-container.vertical .menu-bar {\n justify-content: space-between;\n margin: 0px !important;\n}\n\n.session-container.vertical .menu-bar .content-left {\n width: 100%;\n}\n\n.session-container.vertical .menu-bar .close-button.item:before {\n background: none !important;\n}\n\n.session-container.vertical .menu-bar .close-button.item {\n box-shadow: none !important;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\n float: left;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\n max-height: calc(100dvh - 140px);\n overflow-y: auto;\n overflow-x: hidden;\n max-width: calc(100vw - 30px);\n}\n\n.session-container.vertical .session-item .count.label {\n margin-left: 1em !important;\n}\n\n.session-container.vertical .session-header {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.session-container.vertical .session-header > div {\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\n padding: 0.82857143em 0.4285714em;\n line-height: 1.2;\n}\n\n.session-container.vertical .session-header > div:before {\n background: none !important;\n}\n\n.session-container.vertical .session-header > i {\n margin-left: 10px;\n}\n\n.session-container.vertical .session-header .ui.dropdown > i {\n margin: 0px 5px;\n}\n\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\n.session-container.horizontal .session-header .header > i,\n.session-container.vertical .session-header > i {\n width: inherit !important;\n font-size: 1.5em;\n}\n\n.session-container.horizontal .session-header .ui.header {\n align-items: center;\n}\n\n.session-container.vertical .menu-bar {\n border-radius: 0px !important;\n padding-bottom: 0px;\n}\n\n.session-container,\n.session-layout,\n.session-container.horizontal .column {\n height: 100%;\n}\n\n.session-container.horizontal .column > div {\n max-height: 100%;\n}\n\n.session-container .session-item {\n overflow: hidden;\n display: flex !important;\n align-items: center;\n padding: 0.68571429em 0.92857143em !important;\n height: 35px;\n}\n\n.session-container .session-item .session-status {\n float: none !important;\n margin: 0 0.5em 0 0 !important;\n}\n\n.session-container .session-item .session-name {\n overflow: hidden;\n flex: 1 1 100%;\n line-height: 1.2;\n}\n\n.session-container .session-status {\n margin-right: 5px;\n margin-top: 3px;\n}\n\n.session-container.horizontal .menu-column {\n display: flex !important;\n flex-direction: column;\n padding-right: 0px !important;\n}\n\n.session-container.horizontal .menu-column .menu {\n width: initial !important;\n overflow-y: auto;\n padding-top: 10px;\n flex: 1;\n}\n\n.session-container.horizontal .menu-column .session-item span.session-name,\n.session-container .session-header .ui.dropdown .caption {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.session-container .session-header .title .ui.dropdown {\n width: 100%;\n}\n\n.session-layout .sub.header {\n overflow: hidden;\n}\n\n.session-layout .sub.header img {\n vertical-align: text-top;\n}\n\n.session-footer .info-grid {\n margin-top: 7px !important;\n font-size: small;\n color: grey;\n display: flex;\n flex: 1;\n align-items: flex-end;\n}\n\n.session-footer .info-grid > div {\n flex: 1;\n}\n\n.session-footer .info-grid > div:last-child > div {\n float: right;\n}\n\n.session-footer .info-grid > div:only-child > div {\n float: inherit;\n}\n\n.session-footer .ui.checkbox {\n min-height: inherit !important;\n}\n\n.session-footer .divider {\n margin-top: 8px;\n margin-bottom: 0px;\n}\n\n/* New session layout */\n.session.new {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n margin-top: 20px;\n padding: 1px;\n}\n\n.session.new .recents {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n overflow-y: hidden;\n}\n\n.session.new .recents .list {\n padding: 3px 5px;\n flex: 100 100 0%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/sessions.css"],names:[],mappings:"AAAA;EACE,uBAAuB;AACzB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,sCAAsC;AACxC;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,aAAa;EACb,sBAAsB;AACxB;AACA;EACE,kBAAkB;EAClB,aAAa;EACb,gBAAgB;AAClB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,8BAA8B;EAC9B,sBAAsB;AACxB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gCAAgC;EAChC,gBAAgB;EAChB,kBAAkB;EAClB,6BAA6B;AAC/B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,YAAY;AACd;;AAEA;EACE,cAAc,EAAE,2GAA2G;EAC3H,iCAAiC;EACjC,gBAAgB;AAClB;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,eAAe;AACjB;;AAEA,oEAAoE;AACpE;;EAEE,yBAAyB;EACzB,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,wBAAwB;EACxB,mBAAmB;EACnB,6CAA6C;EAC7C,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,8BAA8B;AAChC;;AAEA;EACE,gBAAgB;EAChB,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,eAAe;AACjB;;AAEA;EACE,wBAAwB;EACxB,sBAAsB;EACtB,6BAA6B;AAC/B;;AAEA;EACE,yBAAyB;EACzB,gBAAgB;EAChB,iBAAiB;EACjB,OAAO;AACT;;AAEA;;EAEE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,0BAA0B;EAC1B,gBAAgB;EAChB,WAAW;EACX,aAAa;EACb,OAAO;EACP,qBAAqB;AACvB;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,8BAA8B;AAChC;;AAEA;EACE,eAAe;EACf,kBAAkB;AACpB;;AAEA,uBAAuB;AACvB;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,kBAAkB;EAClB,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;AACpB",sourcesContent:[".session-container {\n background-color: white;\n}\n\n.session-container.horizontal.ui.grid {\n margin: 0px !important;\n}\n\n.session-container.horizontal .menu-column .item.new {\n padding: 0.78571429em 1.1em !important;\n}\n\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\n margin: 0 0.35714286em 0 0 !important;\n}\n\n.session-container.horizontal .session-layout > .ui.divider {\n margin: 5px 0px 0px 0px;\n}\n\n.session-container.vertical {\n padding: 15px;\n display: flex;\n flex-direction: column;\n}\n.session-layout {\n flex: 100 100 auto;\n display: flex;\n overflow: hidden;\n}\n\n.session-container.horizontal .session-layout {\n flex-direction: column;\n}\n\n.session-container.vertical .menu-bar {\n justify-content: space-between;\n margin: 0px !important;\n}\n\n.session-container.vertical .menu-bar .content-left {\n width: 100%;\n}\n\n.session-container.vertical .menu-bar .close-button.item:before {\n background: none !important;\n}\n\n.session-container.vertical .menu-bar .close-button.item {\n box-shadow: none !important;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\n float: left;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\n max-height: calc(100dvh - 140px);\n overflow-y: auto;\n overflow-x: hidden;\n max-width: calc(100vw - 30px);\n}\n\n.session-container.vertical .session-item .count.label {\n margin-left: 1em !important;\n}\n\n.session-container.vertical .session-header {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.session-container.vertical .session-header > div {\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\n padding: 0.82857143em 0.4285714em;\n line-height: 1.2;\n}\n\n.session-container.vertical .session-header > div:before {\n background: none !important;\n}\n\n.session-container.vertical .session-header > i {\n margin-left: 10px;\n}\n\n.session-container.vertical .session-header .ui.dropdown > i {\n margin: 0px 5px;\n}\n\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\n.session-container.horizontal .session-header .header > i,\n.session-container.vertical .session-header > i {\n width: inherit !important;\n font-size: 1.5em;\n}\n\n.session-container.horizontal .session-header .ui.header {\n align-items: center;\n}\n\n.session-container.vertical .menu-bar {\n border-radius: 0px !important;\n padding-bottom: 0px;\n}\n\n.session-container,\n.session-layout,\n.session-container.horizontal .column {\n height: 100%;\n}\n\n.session-container.horizontal .column > div {\n max-height: 100%;\n}\n\n.session-container .session-item {\n overflow: hidden;\n display: flex !important;\n align-items: center;\n padding: 0.68571429em 0.92857143em !important;\n height: 35px;\n}\n\n.session-container .session-item .session-status {\n float: none !important;\n margin: 0 0.5em 0 0 !important;\n}\n\n.session-container .session-item .session-name {\n overflow: hidden;\n flex: 1 1 100%;\n line-height: 1.2;\n}\n\n.session-container .session-status {\n margin-right: 5px;\n margin-top: 3px;\n}\n\n.session-container.horizontal .menu-column {\n display: flex !important;\n flex-direction: column;\n padding-right: 0px !important;\n}\n\n.session-container.horizontal .menu-column .menu {\n width: initial !important;\n overflow-y: auto;\n padding-top: 10px;\n flex: 1;\n}\n\n.session-container.horizontal .menu-column .session-item span.session-name,\n.session-container .session-header .ui.dropdown .caption {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.session-container .session-header .title .ui.dropdown {\n width: 100%;\n}\n\n.session-layout .sub.header {\n overflow: hidden;\n}\n\n.session-layout .sub.header img {\n vertical-align: text-top;\n}\n\n.session-footer .info-grid {\n margin-top: 7px !important;\n font-size: small;\n color: grey;\n display: flex;\n flex: 1;\n align-items: flex-end;\n}\n\n.session-footer .info-grid > div {\n flex: 1;\n}\n\n.session-footer .info-grid > div:last-child > div {\n float: right;\n}\n\n.session-footer .info-grid > div:only-child > div {\n float: inherit;\n}\n\n.session-footer .ui.checkbox {\n min-height: inherit !important;\n}\n\n.session-footer .divider {\n margin-top: 8px;\n margin-bottom: 0px;\n}\n\n/* New session layout */\n.session.new {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n margin-top: 20px;\n padding: 1px;\n}\n\n.session.new .recents {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n overflow-y: hidden;\n}\n\n.session.new .recents .list {\n padding: 3px 5px;\n flex: 100 100 0%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n"],sourceRoot:""}]);const r=a},4112:(n,e,s)=>{s.d(e,{R:()=>t});var i=s(4425);const t=(n,e)=>({id:"remove",displayName:"Close",access:e,icon:i.A.REMOVE,handler:({itemData:e,socket:s})=>s.delete(`${n}/${e.id}`)})},79531:(n,e,s)=>{s.d(e,{A:()=>r});var i=s(74848),t=s(96540),o=s(1530),a=s(19718);function r(n,e=!1){class s extends t.Component{constructor(){super(...arguments),this.setRead=n=>{this.props.sessionApi.setRead(n),this.readTimeout=void 0},this.setSession=n=>{if(this.readTimeout&&(clearTimeout(this.readTimeout),this.setRead(this.props.session)),this.props.sessionApi.sessionChanged(n),!n)return;const s=e?1e3*o.A.getValue(a.xC.UNREAD_LABEL_DELAY):0;this.readTimeout=window.setTimeout((()=>this.setRead(n)),s)}}componentDidMount(){this.setSession(this.props.session)}componentWillUnmount(){this.setSession(null)}componentDidUpdate(n){this.props.session.id!==n.session.id&&this.setSession(this.props.session)}render(){return(0,i.jsx)(n,Object.assign({},this.props))}}return s}},38453:(n,e,s)=>{s.d(e,{J:()=>t,q:()=>o});var i=s(74848);s(96540);const t=({label:n,text:e})=>(0,i.jsx)("div",{className:"grid-item",children:(0,i.jsx)("div",{className:"item-inner",children:n&&"string"==typeof e?`${n}: ${e}`:e})}),o=({children:n})=>(0,i.jsxs)("div",{className:"session-footer",children:[(0,i.jsx)("div",{className:"ui footer divider"}),(0,i.jsx)("div",{className:"info-grid ui",children:n})]})},91950:(n,e,s)=>{s.d(e,{A:()=>X});var i=s(74848),t=s(96540),o=s(99347),a=s(8098),r=s(68514),A=s(31104),l=s(19247),c=s(25906),d=s(67749),m=s(42695),u=s(4425),p=s(32389);const h=({sessionMenuItems:n,newButton:e,unreadInfoStore:s,listActionMenuGetter:t})=>{const{t:o}=(0,p.Bd)();return(0,i.jsxs)(A.A,{triggerIcon:(0,i.jsx)(c.Z,{urgencies:s?s.getTotalUrgencies():null}),children:[(0,i.jsx)(l.A,{caption:(0,m.Tl)("New",o,d.KV.COMMON),children:e}),(0,i.jsx)(l.A,{caption:(0,m.Tl)("Current sessions",o,d.KV.COMMON),children:n}),(0,i.jsx)(l.A,{children:t()})]})},E=({actions:n,activeItem:e})=>{if(!e||(0,a.mY)())return null;const s=Object.values(n.actions)[Object.values(n.actions).length-1];return(0,i.jsx)(r.A,{className:"basic small item close-button",action:s,moduleData:n.moduleData,itemData:e,icon:u.A.CLOSE})},g=({itemHeaderIcon:n,itemHeaderTitle:e})=>(0,i.jsxs)("div",{className:"session-header",children:[n,e]}),B=n=>{var{children:e,onKeyDown:s}=n,t=function(n,e){var s={};for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&e.indexOf(i)<0&&(s[i]=n[i]);if(null!=n&&"function"==typeof Object.getOwnPropertySymbols){var t=0;for(i=Object.getOwnPropertySymbols(n);t<i.length;t++)e.indexOf(i[t])<0&&Object.prototype.propertyIsEnumerable.call(n,i[t])&&(s[i[t]]=n[i[t]])}return s}(n,["children","onKeyDown"]);return(0,i.jsxs)("div",{className:"session-container vertical",onKeyDown:s,tabIndex:0,children:[(0,i.jsxs)("div",{className:"ui main menu menu-bar",children:[(0,i.jsxs)("div",{className:"content-left",children:[(0,i.jsx)(h,Object.assign({},t)),(0,i.jsx)(g,Object.assign({},t))]}),(0,i.jsx)(E,Object.assign({},t))]}),(0,i.jsx)("div",{className:"session-layout",children:e})]})};var x=s(31224),f=s(73070);const C=({sessionMenuItems:n,newButton:e,itemHeaderIcon:s,itemHeaderTitle:o,children:a,itemHeaderDescription:r,onKeyDown:A})=>(e&&(e=t.cloneElement(e,{className:e.props.className+" ui fluid button"})),(0,i.jsxs)(f.xA,{className:"session-container horizontal",onKeyDown:A,tabIndex:0,children:[(0,i.jsxs)("div",{className:"four wide column menu-column",children:[e,!!n.length&&(0,i.jsx)("div",{className:"ui vertical secondary menu",children:n})]}),(0,i.jsx)("div",{className:"twelve wide stretched column content-column session",children:(0,i.jsxs)("div",{className:"ui segment session-layout",children:[(0,i.jsx)(x.A,{className:"session-header",icon:s,title:(0,i.jsx)("div",{className:"title",children:o}),subHeader:r}),(0,i.jsx)("div",{className:"ui divider",style:{margin:"5px 0px 0px 0px"}}),a]})})]}));var v=s(32728),w=s(18220),b=s(6527),y=s(20311),j=s.n(y);const I=({baseUrl:n})=>{const e=(0,b.Zp)(),s=e=>(j()(!!e,"Trying to get session URL without a session"),`/${n}/session/${e}`),i=`/${n}/new`;return{newUrl:`/${n}/new`,replaceNew:()=>{e(i,{replace:!0})},getSessionUrl:s,pushSession:n=>{e(s(n))},replaceSession:(n,i)=>{e(s(n),{replace:!0,state:i})}}},N=(n,e)=>n.find((n=>n.id===e));var O=s(85072),z=s.n(O),T=s(97825),S=s.n(T),k=s(77659),M=s.n(k),D=s(55056),H=s.n(D),U=s(10540),K=s.n(U),L=s(41113),Y=s.n(L),G=s(46510),W={};W.styleTagTransform=Y(),W.setAttributes=H(),W.insert=M().bind(null,"head"),W.domAPI=S(),W.insertStyleElement=K(),z()(G.A,W),G.A&&G.A.locals&&G.A.locals;var R=s(71352),V=s(46942),$=s.n(V),P=s(45325);const _=({url:n,title:e,className:s})=>(0,i.jsx)(P.A,{className:$()("new",s),icon:u.A.CREATE,url:n,children:e},"button-new"),q=({sessionItem:n,status:e,name:s,unreadInfoStore:t,url:o})=>(0,i.jsx)(P.A,{url:o,className:"session-item",icon:e,session:n,unreadInfoStore:t,children:(0,i.jsx)("span",{className:"session-name",children:s})});var Z=s(83994),F=s(27725),J=s(28286);const X=n=>{const{hasAccess:e}=(0,J.w)(),s=(0,w.y)(),r=(0,b.Zp)(),A=(0,b.zy)(),{activeItem:l,onKeyDown:c}=(n=>{const[e,s]=t.useState(null),i=(0,b.zy)(),{pushSession:o,replaceSession:r,newUrl:A,replaceNew:l}=I({baseUrl:n.baseUrl}),c=()=>`${n.baseUrl}_last_active`;return t.useLayoutEffect((()=>{if(i.pathname===A)return void(e&&s(null));if((()=>{const e=i,t=e.state&&e.state.pending,o=N(n.items,n.activeId);return o?t?(r(o.id,{pending:!1}),!0):(s(o),(0,a.MS)(c(),n.activeId),!0):!!t||0===n.items.length&&(l(),s(null),!0)})())return;if(!e){const e=(0,a.H5)(c());if(e&&N(n.items,e))return void r(e)}const{items:t,activeId:o}=n;let d=0;const m=N(t,o);m&&(d=t.indexOf(m),d===t.length-1&&(d-=1)),r(t[d].id)}),[i,n.items]),{onKeyDown:e=>{const{key:s,altKey:i}=e;if(!i||"ArrowUp"!==s&&"ArrowDown"!==s){if(i&&"Insert"===s)e.preventDefault(),l();else if(i&&"Delete"===s){e.preventDefault();const{items:s,activeId:i,sessionApi:t}=n,o=N(s,i);o&&t.removeSession(o)}}else{e.preventDefault();const{items:i,activeId:t}=n,a=N(i,t);if(!a)return;const r=i.indexOf(a);if(-1===r)return;const A=i["ArrowUp"===s?r-1:r+1];A&&o(A.id)}},activeItem:e}})(n),h=e(n.editAccess),E=!!n.newLayout&&A.pathname.endsWith("/new"),{disableSideMenu:g,items:x,unreadInfoStore:f,sessionT:y,uiActions:j}=n;if(!h&&0===x.length)return(0,i.jsx)(v.A,{title:(0,m.Tl)("No items to show",y.plainT,d.KV.COMMON),description:y.plainT((0,m.j2)("noSessionEditAccess",d.KV.COMMON),"You aren't allowed to open new sessions")});const O=g||(0,a.mY)(s)?B:C,{getItemHeaderTitle:z,getItemHeaderDescription:T,getItemHeaderIcon:S,getNewButton:k,getSessionMenuItems:M,getSessionActionMenuItems:D}=(n=>{const e=(0,b.zy)(),{t:s}=(0,p.Bd)(),{newUrl:t,getSessionUrl:o}=I({baseUrl:n.baseUrl}),a=e=>{const{itemStatusGetter:s,itemHeaderIconGetter:t}=n;return s?(0,i.jsx)("div",{className:"ui session-status empty circular left mini label "+s(e)}):(0,i.jsx)(Z.A,{icon:t(e)})};return{getItemHeaderDescription:()=>{const{itemHeaderDescriptionGetter:e,newDescription:s,activeItem:i,isNewLayout:t}=n;return t?s:i?e(i):null},getItemHeaderIcon:()=>{const{itemHeaderIconGetter:e,newIcon:s,activeItem:t,isNewLayout:o}=n;return o?(0,i.jsx)(Z.A,{icon:s}):t?(0,i.jsx)(Z.A,{icon:e(t)}):null},getItemHeaderTitle:()=>{const{activeItem:s,newCaption:t,remoteMenuId:o,isNewLayout:a}=n;if(a)return(0,i.jsx)("div",{children:t});if(!s)return null;const{uiActions:r,actionIds:A,itemNameGetter:l,itemHeaderTitleGetter:c}=n,d=A?[...A,"divider","remove"]:void 0,m=(0,i.jsx)(R.Wy,{caption:l(s),actions:r,itemData:s,ids:d,remoteMenuId:o});if(c){const n=c(s,e,m);if(n)return n}return m},getSessionActionMenuItems:()=>{const{items:e,hasEditAccess:t}=n;return t&&0!==e.length?(0,i.jsx)(F.A,{onClick:()=>{const{sessionApi:e,items:s}=n;s.forEach((n=>e.removeSession(n)))},icon:u.A.REMOVE,children:(0,m.Tl)("Close all",s,d.KV.COMMON)},"close"):null},getNewButton:()=>{const{newCaption:e,hasEditAccess:s}=n;return s&&e?(0,i.jsx)(_,{title:e,url:t},"new-button"):null},getSessionMenuItems:()=>n.items.map((e=>{const{itemNameGetter:s,unreadInfoStore:t}=n;return(0,i.jsx)(q,{url:o(e.id),name:s(e),unreadInfoStore:t,status:a(e),sessionItem:e},e.id)}))}})(Object.assign(Object.assign({},n),{activeItem:l,hasEditAccess:h,isNewLayout:E}));return(0,i.jsx)(O,{itemHeaderTitle:z(),itemHeaderDescription:T(),itemHeaderIcon:S(),newButton:k(),sessionMenuItems:M(),listActionMenuGetter:D,activeItem:l,unreadInfoStore:f,onKeyDown:c,actions:j,children:(()=>{const{newLayout:e,sessionT:s}=n;return E&&e?(0,i.jsx)(e,{navigate:r,location:A,sessionT:s}):(()=>{const{activeId:e,items:s,sessionItemLayout:t,sessionApi:a,uiActions:c,sessionT:u}=n;if(!l){const{state:n}=A;return n&&n.pending?(0,i.jsx)(o.A,{text:(0,m.Tl)("Waiting for server response",u.plainT,d.KV.COMMON)}):e||0!==s.length?(0,i.jsx)(o.A,{text:(0,m.Tl)("Loading session",u.plainT,d.KV.COMMON)}):void console.error("SessionLayout route: active session missing")}return(0,i.jsx)(t,{session:l,sessionApi:a,uiActions:c,location:A,navigate:r,sessionT:u})})()})()})}},78046:(n,e,s)=>{s.d(e,{Z:()=>c});var i=s(74848),t=(s(96540),s(99347)),o=s(69640),a=s(67749),r=s(32389),A=s(42695),l=s(6527);const c=(n,e,s)=>c=>{const{t:d}=(0,r.Bd)(),m=(0,A.lw)(d,s),u=(0,l.g)(),p=(0,o.P)(e);return e.isInitialized()?(0,i.jsx)(n,{items:p,params:u,sessionT:m}):(0,i.jsx)(t.A,{text:(0,A.Tl)("Loading sessions",d,a.KV.COMMON)})}}}]);
2
- //# sourceMappingURL=616.3ba43917e8ecdd62f252.chunk.js.map
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[616],{46510:(n,e,s)=>{s.d(e,{A:()=>r});var i=s(71354),t=s.n(i),o=s(76314),a=s.n(o)()(t());a.push([n.id,".session-container {\n background-color: white;\n}\n\n.session-container.horizontal.ui.grid {\n margin: 0px !important;\n}\n\n.session-container.horizontal .menu-column .item.new {\n padding: 0.78571429em 1.1em !important;\n}\n\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\n margin: 0 0.35714286em 0 0 !important;\n}\n\n.session-container.horizontal .session-layout > .ui.divider {\n margin: 5px 0px 0px 0px;\n}\n\n.session-container.vertical {\n padding: 15px;\n display: flex;\n flex-direction: column;\n}\n.session-layout {\n flex: 100 100 auto;\n display: flex;\n overflow: hidden;\n}\n\n.session-container.horizontal .session-layout {\n flex-direction: column;\n}\n\n.session-container.vertical .menu-bar {\n justify-content: space-between;\n margin: 0px !important;\n}\n\n.session-container.vertical .menu-bar .content-left {\n width: 100%;\n}\n\n.session-container.vertical .menu-bar .close-button.item:before {\n background: none !important;\n}\n\n.session-container.vertical .menu-bar .close-button.item {\n box-shadow: none !important;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\n float: left;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\n max-height: calc(100dvh - 140px);\n overflow-y: auto;\n overflow-x: hidden;\n max-width: calc(100vw - 30px);\n}\n\n.session-container.vertical .session-item .count.label {\n margin-left: 1em !important;\n}\n\n.session-container.vertical .session-header {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.session-container.vertical .session-header > div {\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\n padding: 0.82857143em 0.4285714em;\n line-height: 1.2;\n}\n\n.session-container.vertical .session-header > div:before {\n background: none !important;\n}\n\n.session-container.vertical .session-header > i {\n margin-left: 10px;\n}\n\n.session-container.vertical .session-header .ui.dropdown > i {\n margin: 0px 5px;\n}\n\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\n.session-container.horizontal .session-header .header > i,\n.session-container.vertical .session-header > i {\n width: inherit !important;\n font-size: 1.5em;\n}\n\n.session-container.horizontal .session-header .ui.header {\n align-items: center;\n}\n\n.session-container.vertical .menu-bar {\n border-radius: 0px !important;\n padding-bottom: 0px;\n}\n\n.session-container,\n.session-layout,\n.session-container.horizontal .column {\n height: 100%;\n}\n\n.session-container.horizontal .column > div {\n max-height: 100%;\n}\n\n.session-container .session-item {\n overflow: hidden;\n display: flex !important;\n align-items: center;\n padding: 0.68571429em 0.92857143em !important;\n height: 35px;\n}\n\n.session-container .session-item .session-status {\n float: none !important;\n margin: 0 0.5em 0 0 !important;\n}\n\n.session-container .session-item .session-name {\n overflow: hidden;\n flex: 1 1 100%;\n line-height: 1.2;\n}\n\n.session-container .session-status {\n margin-right: 5px;\n margin-top: 3px;\n}\n\n.session-container.horizontal .menu-column {\n display: flex !important;\n flex-direction: column;\n padding-right: 0px !important;\n}\n\n.session-container.horizontal .menu-column .menu {\n width: initial !important;\n overflow-y: auto;\n padding-top: 10px;\n flex: 1;\n}\n\n.session-container.horizontal .menu-column .session-item span.session-name,\n.session-container .session-header .ui.dropdown .caption {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.session-container .session-header .title .ui.dropdown {\n width: 100%;\n}\n\n.session-layout .sub.header {\n overflow: hidden;\n}\n\n.session-layout .sub.header img {\n vertical-align: text-top;\n}\n\n.session-footer .info-grid {\n margin-top: 7px !important;\n font-size: small;\n color: grey;\n display: flex;\n flex: 1;\n align-items: flex-end;\n}\n\n.session-footer .info-grid > div {\n flex: 1;\n}\n\n.session-footer .info-grid > div:last-child > div {\n float: right;\n}\n\n.session-footer .info-grid > div:only-child > div {\n float: inherit;\n}\n\n.session-footer .ui.checkbox {\n min-height: inherit !important;\n}\n\n.session-footer .divider {\n margin-top: 8px;\n margin-bottom: 0px;\n}\n\n/* New session layout */\n.session.new {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n margin-top: 20px;\n padding: 1px;\n}\n\n.session.new .recents {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n overflow-y: hidden;\n}\n\n.session.new .recents .list {\n padding: 3px 5px;\n flex: 100 100 0%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/sessions.css"],names:[],mappings:"AAAA;EACE,uBAAuB;AACzB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,sCAAsC;AACxC;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,aAAa;EACb,sBAAsB;AACxB;AACA;EACE,kBAAkB;EAClB,aAAa;EACb,gBAAgB;AAClB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,8BAA8B;EAC9B,sBAAsB;AACxB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gCAAgC;EAChC,gBAAgB;EAChB,kBAAkB;EAClB,6BAA6B;AAC/B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,YAAY;AACd;;AAEA;EACE,cAAc,EAAE,2GAA2G;EAC3H,iCAAiC;EACjC,gBAAgB;AAClB;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,eAAe;AACjB;;AAEA,oEAAoE;AACpE;;EAEE,yBAAyB;EACzB,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,wBAAwB;EACxB,mBAAmB;EACnB,6CAA6C;EAC7C,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,8BAA8B;AAChC;;AAEA;EACE,gBAAgB;EAChB,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,eAAe;AACjB;;AAEA;EACE,wBAAwB;EACxB,sBAAsB;EACtB,6BAA6B;AAC/B;;AAEA;EACE,yBAAyB;EACzB,gBAAgB;EAChB,iBAAiB;EACjB,OAAO;AACT;;AAEA;;EAEE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,0BAA0B;EAC1B,gBAAgB;EAChB,WAAW;EACX,aAAa;EACb,OAAO;EACP,qBAAqB;AACvB;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,8BAA8B;AAChC;;AAEA;EACE,eAAe;EACf,kBAAkB;AACpB;;AAEA,uBAAuB;AACvB;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,kBAAkB;EAClB,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;AACpB",sourcesContent:[".session-container {\n background-color: white;\n}\n\n.session-container.horizontal.ui.grid {\n margin: 0px !important;\n}\n\n.session-container.horizontal .menu-column .item.new {\n padding: 0.78571429em 1.1em !important;\n}\n\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\n margin: 0 0.35714286em 0 0 !important;\n}\n\n.session-container.horizontal .session-layout > .ui.divider {\n margin: 5px 0px 0px 0px;\n}\n\n.session-container.vertical {\n padding: 15px;\n display: flex;\n flex-direction: column;\n}\n.session-layout {\n flex: 100 100 auto;\n display: flex;\n overflow: hidden;\n}\n\n.session-container.horizontal .session-layout {\n flex-direction: column;\n}\n\n.session-container.vertical .menu-bar {\n justify-content: space-between;\n margin: 0px !important;\n}\n\n.session-container.vertical .menu-bar .content-left {\n width: 100%;\n}\n\n.session-container.vertical .menu-bar .close-button.item:before {\n background: none !important;\n}\n\n.session-container.vertical .menu-bar .close-button.item {\n box-shadow: none !important;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\n float: left;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\n max-height: calc(100dvh - 140px);\n overflow-y: auto;\n overflow-x: hidden;\n max-width: calc(100vw - 30px);\n}\n\n.session-container.vertical .session-item .count.label {\n margin-left: 1em !important;\n}\n\n.session-container.vertical .session-header {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.session-container.vertical .session-header > div {\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\n padding: 0.82857143em 0.4285714em;\n line-height: 1.2;\n}\n\n.session-container.vertical .session-header > div:before {\n background: none !important;\n}\n\n.session-container.vertical .session-header > i {\n margin-left: 10px;\n}\n\n.session-container.vertical .session-header .ui.dropdown > i {\n margin: 0px 5px;\n}\n\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\n.session-container.horizontal .session-header .header > i,\n.session-container.vertical .session-header > i {\n width: inherit !important;\n font-size: 1.5em;\n}\n\n.session-container.horizontal .session-header .ui.header {\n align-items: center;\n}\n\n.session-container.vertical .menu-bar {\n border-radius: 0px !important;\n padding-bottom: 0px;\n}\n\n.session-container,\n.session-layout,\n.session-container.horizontal .column {\n height: 100%;\n}\n\n.session-container.horizontal .column > div {\n max-height: 100%;\n}\n\n.session-container .session-item {\n overflow: hidden;\n display: flex !important;\n align-items: center;\n padding: 0.68571429em 0.92857143em !important;\n height: 35px;\n}\n\n.session-container .session-item .session-status {\n float: none !important;\n margin: 0 0.5em 0 0 !important;\n}\n\n.session-container .session-item .session-name {\n overflow: hidden;\n flex: 1 1 100%;\n line-height: 1.2;\n}\n\n.session-container .session-status {\n margin-right: 5px;\n margin-top: 3px;\n}\n\n.session-container.horizontal .menu-column {\n display: flex !important;\n flex-direction: column;\n padding-right: 0px !important;\n}\n\n.session-container.horizontal .menu-column .menu {\n width: initial !important;\n overflow-y: auto;\n padding-top: 10px;\n flex: 1;\n}\n\n.session-container.horizontal .menu-column .session-item span.session-name,\n.session-container .session-header .ui.dropdown .caption {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.session-container .session-header .title .ui.dropdown {\n width: 100%;\n}\n\n.session-layout .sub.header {\n overflow: hidden;\n}\n\n.session-layout .sub.header img {\n vertical-align: text-top;\n}\n\n.session-footer .info-grid {\n margin-top: 7px !important;\n font-size: small;\n color: grey;\n display: flex;\n flex: 1;\n align-items: flex-end;\n}\n\n.session-footer .info-grid > div {\n flex: 1;\n}\n\n.session-footer .info-grid > div:last-child > div {\n float: right;\n}\n\n.session-footer .info-grid > div:only-child > div {\n float: inherit;\n}\n\n.session-footer .ui.checkbox {\n min-height: inherit !important;\n}\n\n.session-footer .divider {\n margin-top: 8px;\n margin-bottom: 0px;\n}\n\n/* New session layout */\n.session.new {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n margin-top: 20px;\n padding: 1px;\n}\n\n.session.new .recents {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n overflow-y: hidden;\n}\n\n.session.new .recents .list {\n padding: 3px 5px;\n flex: 100 100 0%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n"],sourceRoot:""}]);const r=a},4112:(n,e,s)=>{s.d(e,{R:()=>t});var i=s(4425);const t=(n,e)=>({id:"remove",displayName:"Close",access:e,icon:i.A.REMOVE,handler:({itemData:e,socket:s})=>s.delete(`${n}/${e.id}`)})},79531:(n,e,s)=>{s.d(e,{A:()=>r});var i=s(74848),t=s(96540),o=s(95689),a=s(19718);function r(n,e=!1){class s extends t.Component{constructor(){super(...arguments),this.setRead=n=>{this.props.sessionApi.setRead(n),this.readTimeout=void 0},this.setSession=n=>{if(this.readTimeout&&(clearTimeout(this.readTimeout),this.setRead(this.props.session)),this.props.sessionApi.sessionChanged(n),!n)return;const s=e?1e3*o.A.getValue(a.xC.UNREAD_LABEL_DELAY):0;this.readTimeout=window.setTimeout((()=>this.setRead(n)),s)}}componentDidMount(){this.setSession(this.props.session)}componentWillUnmount(){this.setSession(null)}componentDidUpdate(n){this.props.session.id!==n.session.id&&this.setSession(this.props.session)}render(){return(0,i.jsx)(n,Object.assign({},this.props))}}return s}},38453:(n,e,s)=>{s.d(e,{J:()=>t,q:()=>o});var i=s(74848);s(96540);const t=({label:n,text:e})=>(0,i.jsx)("div",{className:"grid-item",children:(0,i.jsx)("div",{className:"item-inner",children:n&&"string"==typeof e?`${n}: ${e}`:e})}),o=({children:n})=>(0,i.jsxs)("div",{className:"session-footer",children:[(0,i.jsx)("div",{className:"ui footer divider"}),(0,i.jsx)("div",{className:"info-grid ui",children:n})]})},91950:(n,e,s)=>{s.d(e,{A:()=>X});var i=s(74848),t=s(96540),o=s(99347),a=s(8098),r=s(68514),A=s(31104),l=s(19247),c=s(25906),d=s(67749),m=s(42695),u=s(4425),p=s(32389);const h=({sessionMenuItems:n,newButton:e,unreadInfoStore:s,listActionMenuGetter:t})=>{const{t:o}=(0,p.Bd)();return(0,i.jsxs)(A.A,{triggerIcon:(0,i.jsx)(c.Z,{urgencies:s?s.getTotalUrgencies():null}),children:[(0,i.jsx)(l.A,{caption:(0,m.Tl)("New",o,d.KV.COMMON),children:e}),(0,i.jsx)(l.A,{caption:(0,m.Tl)("Current sessions",o,d.KV.COMMON),children:n}),(0,i.jsx)(l.A,{children:t()})]})},E=({actions:n,activeItem:e})=>{if(!e||(0,a.vU)())return null;const s=Object.values(n.actions)[Object.values(n.actions).length-1];return(0,i.jsx)(r.A,{className:"basic small item close-button",action:s,moduleData:n.moduleData,itemData:e,icon:u.A.CLOSE})},g=({itemHeaderIcon:n,itemHeaderTitle:e})=>(0,i.jsxs)("div",{className:"session-header",children:[n,e]}),B=n=>{var{children:e,onKeyDown:s}=n,t=function(n,e){var s={};for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&e.indexOf(i)<0&&(s[i]=n[i]);if(null!=n&&"function"==typeof Object.getOwnPropertySymbols){var t=0;for(i=Object.getOwnPropertySymbols(n);t<i.length;t++)e.indexOf(i[t])<0&&Object.prototype.propertyIsEnumerable.call(n,i[t])&&(s[i[t]]=n[i[t]])}return s}(n,["children","onKeyDown"]);return(0,i.jsxs)("div",{className:"session-container vertical",onKeyDown:s,tabIndex:0,children:[(0,i.jsxs)("div",{className:"ui main menu menu-bar",children:[(0,i.jsxs)("div",{className:"content-left",children:[(0,i.jsx)(h,Object.assign({},t)),(0,i.jsx)(g,Object.assign({},t))]}),(0,i.jsx)(E,Object.assign({},t))]}),(0,i.jsx)("div",{className:"session-layout",children:e})]})};var x=s(31224),f=s(73070);const C=({sessionMenuItems:n,newButton:e,itemHeaderIcon:s,itemHeaderTitle:o,children:a,itemHeaderDescription:r,onKeyDown:A})=>(e&&(e=t.cloneElement(e,{className:e.props.className+" ui fluid button"})),(0,i.jsxs)(f.xA,{className:"session-container horizontal",onKeyDown:A,tabIndex:0,children:[(0,i.jsxs)("div",{className:"four wide column menu-column",children:[e,!!n.length&&(0,i.jsx)("div",{className:"ui vertical secondary menu",children:n})]}),(0,i.jsx)("div",{className:"twelve wide stretched column content-column session",children:(0,i.jsxs)("div",{className:"ui segment session-layout",children:[(0,i.jsx)(x.A,{className:"session-header",icon:s,title:(0,i.jsx)("div",{className:"title",children:o}),subHeader:r}),(0,i.jsx)("div",{className:"ui divider",style:{margin:"5px 0px 0px 0px"}}),a]})})]}));var v=s(32728),w=s(18220),b=s(6527),y=s(20311),j=s.n(y);const I=({baseUrl:n})=>{const e=(0,b.Zp)(),s=e=>(j()(!!e,"Trying to get session URL without a session"),`/${n}/session/${e}`),i=`/${n}/new`;return{newUrl:`/${n}/new`,replaceNew:()=>{e(i,{replace:!0})},getSessionUrl:s,pushSession:n=>{e(s(n))},replaceSession:(n,i)=>{e(s(n),{replace:!0,state:i})}}},N=(n,e)=>n.find((n=>n.id===e));var O=s(85072),z=s.n(O),T=s(97825),S=s.n(T),k=s(77659),M=s.n(k),D=s(55056),H=s.n(D),U=s(10540),K=s.n(U),L=s(41113),G=s.n(L),W=s(46510),Y={};Y.styleTagTransform=G(),Y.setAttributes=H(),Y.insert=M().bind(null,"head"),Y.domAPI=S(),Y.insertStyleElement=K(),z()(W.A,Y),W.A&&W.A.locals&&W.A.locals;var R=s(71352),V=s(46942),$=s.n(V),P=s(45325);const _=({url:n,title:e,className:s})=>(0,i.jsx)(P.A,{className:$()("new",s),icon:u.A.CREATE,url:n,children:e},"button-new"),q=({sessionItem:n,status:e,name:s,unreadInfoStore:t,url:o})=>(0,i.jsx)(P.A,{url:o,className:"session-item",icon:e,session:n,unreadInfoStore:t,children:(0,i.jsx)("span",{className:"session-name",children:s})});var Z=s(83994),F=s(27725),J=s(28286);const X=n=>{const{hasAccess:e}=(0,J.w)(),s=(0,w.y)(),r=(0,b.Zp)(),A=(0,b.zy)(),{activeItem:l,onKeyDown:c}=(n=>{const[e,s]=t.useState(null),i=(0,b.zy)(),{pushSession:o,replaceSession:r,newUrl:A,replaceNew:l}=I({baseUrl:n.baseUrl}),c=()=>`${n.baseUrl}_last_active`;return t.useLayoutEffect((()=>{if(i.pathname===A)return void(e&&s(null));if((()=>{const e=i,t=e.state&&e.state.pending,o=N(n.items,n.activeId);return o?t?(r(o.id,{pending:!1}),!0):(s(o),(0,a.MS)(c(),n.activeId),!0):!!t||0===n.items.length&&(l(),s(null),!0)})())return;if(!e){const e=(0,a.H5)(c());if(e&&N(n.items,e))return void r(e)}const{items:t,activeId:o}=n;let d=0;const m=N(t,o);m&&(d=t.indexOf(m),d===t.length-1&&(d-=1)),r(t[d].id)}),[i,n.items]),{onKeyDown:e=>{const{key:s,altKey:i}=e;if(!i||"ArrowUp"!==s&&"ArrowDown"!==s){if(i&&"Insert"===s)e.preventDefault(),l();else if(i&&"Delete"===s){e.preventDefault();const{items:s,activeId:i,sessionApi:t}=n,o=N(s,i);o&&t.removeSession(o)}}else{e.preventDefault();const{items:i,activeId:t}=n,a=N(i,t);if(!a)return;const r=i.indexOf(a);if(-1===r)return;const A=i["ArrowUp"===s?r-1:r+1];A&&o(A.id)}},activeItem:e}})(n),h=e(n.editAccess),E=!!n.newLayout&&A.pathname.endsWith("/new"),{disableSideMenu:g,items:x,unreadInfoStore:f,sessionT:y,uiActions:j}=n,O=g||(0,a.vU)(s),{getItemHeaderTitle:z,getItemHeaderDescription:T,getItemHeaderIcon:S,getNewButton:k,getSessionMenuItems:M,getSessionActionMenuItems:D}=(n=>{const e=(0,b.zy)(),{t:s}=(0,p.Bd)(),{newUrl:t,getSessionUrl:o}=I({baseUrl:n.baseUrl}),a=e=>{const{itemStatusGetter:s,itemHeaderIconGetter:t}=n;return s?(0,i.jsx)("div",{className:"ui session-status empty circular left mini label "+s(e)}):(0,i.jsx)(Z.A,{icon:t(e)})};return{getItemHeaderDescription:()=>{const{itemHeaderDescriptionGetter:e,newDescription:s,activeItem:i,isNewLayout:t}=n;return t?s:i?e(i):null},getItemHeaderIcon:()=>{const{itemHeaderIconGetter:e,newIcon:s,activeItem:t,isNewLayout:o}=n;return o?(0,i.jsx)(Z.A,{icon:s}):t?(0,i.jsx)(Z.A,{icon:e(t)}):null},getItemHeaderTitle:()=>{const{activeItem:s,newCaption:t,remoteMenuId:o,isNewLayout:a}=n;if(a)return(0,i.jsx)("div",{children:t});if(!s)return null;const{uiActions:r,actionIds:A,itemNameGetter:l,itemHeaderTitleGetter:c}=n,d=A?[...A,"divider","remove"]:void 0,m=(0,i.jsx)(R.Wy,{caption:l(s),actions:r,itemData:s,ids:d,remoteMenuId:o});if(c){const n=c(s,e,m);if(n)return n}return m},getSessionActionMenuItems:()=>{const{items:e,hasEditAccess:t}=n;return t&&0!==e.length?(0,i.jsx)(F.A,{onClick:()=>{const{sessionApi:e,items:s}=n;s.forEach((n=>e.removeSession(n)))},icon:u.A.REMOVE,children:(0,m.Tl)("Close all",s,d.KV.COMMON)},"close"):null},getNewButton:()=>{const{newCaption:e,hasEditAccess:s}=n;return s&&e?(0,i.jsx)(_,{title:e,url:t},"new-button"):null},getSessionMenuItems:()=>n.items.map((e=>{const{itemNameGetter:s,unreadInfoStore:t}=n;return(0,i.jsx)(q,{url:o(e.id),name:s(e),unreadInfoStore:t,status:a(e),sessionItem:e},e.id)}))}})(Object.assign(Object.assign({},n),{activeItem:l,hasEditAccess:h,isNewLayout:E}));if(!h&&0===x.length)return(0,i.jsx)(v.A,{title:(0,m.Tl)("No items to show",y.plainT,d.KV.COMMON),description:y.plainT((0,m.j2)("noSessionEditAccess",d.KV.COMMON),"You aren't allowed to open new sessions")});const H=O?B:C;return(0,i.jsx)(H,{itemHeaderTitle:z(),itemHeaderDescription:T(),itemHeaderIcon:S(),newButton:k(),sessionMenuItems:M(),listActionMenuGetter:D,activeItem:l,unreadInfoStore:f,onKeyDown:c,actions:j,children:(()=>{const{newLayout:e,sessionT:s}=n;return E&&e?(0,i.jsx)(e,{navigate:r,location:A,sessionT:s}):(()=>{const{activeId:e,items:s,sessionItemLayout:t,sessionApi:a,uiActions:c,sessionT:u}=n;if(!l){const{state:n}=A;return n&&n.pending?(0,i.jsx)(o.A,{text:(0,m.Tl)("Waiting for server response",u.plainT,d.KV.COMMON)}):e||0!==s.length?(0,i.jsx)(o.A,{text:(0,m.Tl)("Loading session",u.plainT,d.KV.COMMON)}):void console.error("SessionLayout route: active session missing")}return(0,i.jsx)(t,{session:l,sessionApi:a,uiActions:c,location:A,navigate:r,sessionT:u})})()})()})}},78046:(n,e,s)=>{s.d(e,{Z:()=>c});var i=s(74848),t=(s(96540),s(99347)),o=s(69640),a=s(67749),r=s(32389),A=s(42695),l=s(6527);const c=(n,e,s)=>c=>{const{t:d}=(0,r.Bd)(),m=(0,A.lw)(d,s),u=(0,l.g)(),p=(0,o.P)(e);return e.isInitialized()?(0,i.jsx)(n,{items:p,params:u,sessionT:m}):(0,i.jsx)(t.A,{text:(0,A.Tl)("Loading sessions",d,a.KV.COMMON)})}}}]);
2
+ //# sourceMappingURL=616.301b522f13e0a9a48037.chunk.js.map