airdcpp-webui 2.13.1-beta.1 → 2.13.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/babel.config.js +10 -0
- package/devtools/server.js +66 -62
- package/dist/index.html +2 -2
- package/dist/js/223.b5596f6b1b370ae2f5b3.chunk.js +2 -0
- package/dist/js/223.b5596f6b1b370ae2f5b3.chunk.js.gz +0 -0
- package/dist/js/223.b5596f6b1b370ae2f5b3.chunk.js.map +1 -0
- package/dist/js/544.448df22ece8ebbf1e3b8.chunk.js +2 -0
- package/dist/js/544.448df22ece8ebbf1e3b8.chunk.js.gz +0 -0
- package/dist/js/544.448df22ece8ebbf1e3b8.chunk.js.map +1 -0
- package/dist/js/{616.4bd5e5662de9d9b82cf0.chunk.js → 616.2672d1bde46d026c625b.chunk.js} +2 -2
- package/dist/js/616.2672d1bde46d026c625b.chunk.js.gz +0 -0
- package/dist/js/616.2672d1bde46d026c625b.chunk.js.map +1 -0
- package/dist/js/794.d943c42236d12d89cbea.chunk.js +2 -0
- package/dist/js/794.d943c42236d12d89cbea.chunk.js.gz +0 -0
- package/dist/js/794.d943c42236d12d89cbea.chunk.js.map +1 -0
- package/dist/js/865.d4630a5c85d41adb911a.chunk.js +2 -0
- package/dist/js/865.d4630a5c85d41adb911a.chunk.js.gz +0 -0
- package/dist/js/865.d4630a5c85d41adb911a.chunk.js.map +1 -0
- package/dist/js/favorite-hubs.8cf10fd101a7f261bdf6.chunk.js +2 -0
- package/dist/js/favorite-hubs.8cf10fd101a7f261bdf6.chunk.js.gz +0 -0
- package/dist/js/favorite-hubs.8cf10fd101a7f261bdf6.chunk.js.map +1 -0
- package/dist/js/filelists.906aa635117e09a9d922.chunk.js +2 -0
- package/dist/js/filelists.906aa635117e09a9d922.chunk.js.gz +0 -0
- package/dist/js/filelists.906aa635117e09a9d922.chunk.js.map +1 -0
- package/dist/js/{files.7bbb40e2f4460ff26557.chunk.js → files.e0eff9c212893f76f65e.chunk.js} +2 -2
- package/dist/js/files.e0eff9c212893f76f65e.chunk.js.gz +0 -0
- package/dist/js/files.e0eff9c212893f76f65e.chunk.js.map +1 -0
- package/dist/js/{home.b2ed6186babbb6498c36.chunk.js → home.760bbf44c8ebebae9fae.chunk.js} +3 -3
- package/dist/js/home.760bbf44c8ebebae9fae.chunk.js.gz +0 -0
- package/dist/js/home.760bbf44c8ebebae9fae.chunk.js.map +1 -0
- package/dist/js/hubs.d141554ce56f4417bb65.chunk.js +2 -0
- package/dist/js/hubs.d141554ce56f4417bb65.chunk.js.gz +0 -0
- package/dist/js/hubs.d141554ce56f4417bb65.chunk.js.map +1 -0
- package/dist/js/{main.fd47b3be5ae224421db3.entry.js → main.9e7cb0f16735f29940a5.entry.js} +3 -3
- package/dist/js/{main.fd47b3be5ae224421db3.entry.js.LICENSE.txt → main.9e7cb0f16735f29940a5.entry.js.LICENSE.txt} +0 -11
- package/dist/js/main.9e7cb0f16735f29940a5.entry.js.gz +0 -0
- package/dist/js/{main.fd47b3be5ae224421db3.entry.js.map → main.9e7cb0f16735f29940a5.entry.js.map} +1 -1
- package/dist/js/messages.4501461969def0aff1c7.chunk.js +2 -0
- package/dist/js/messages.4501461969def0aff1c7.chunk.js.gz +0 -0
- package/dist/js/messages.4501461969def0aff1c7.chunk.js.map +1 -0
- package/dist/js/queue.0de02ae96e221c6f2259.chunk.js +2 -0
- package/dist/js/queue.0de02ae96e221c6f2259.chunk.js.gz +0 -0
- package/dist/js/queue.0de02ae96e221c6f2259.chunk.js.map +1 -0
- package/dist/js/search.bbc324429532bf9a662a.chunk.js +2 -0
- package/dist/js/search.bbc324429532bf9a662a.chunk.js.gz +0 -0
- package/dist/js/search.bbc324429532bf9a662a.chunk.js.map +1 -0
- package/dist/js/settings.b4687a96928a1765a8ba.chunk.js +2 -0
- package/dist/js/settings.b4687a96928a1765a8ba.chunk.js.gz +0 -0
- package/dist/js/settings.b4687a96928a1765a8ba.chunk.js.map +1 -0
- package/dist/js/share.f40eec6e32b9ae855d15.chunk.js +2 -0
- package/dist/js/share.f40eec6e32b9ae855d15.chunk.js.gz +0 -0
- package/dist/js/share.f40eec6e32b9ae855d15.chunk.js.map +1 -0
- package/dist/js/{system-log.f4601bdebcb5ea09f6d5.chunk.js → system-log.23013a0fdc72af416211.chunk.js} +2 -2
- package/dist/js/system-log.23013a0fdc72af416211.chunk.js.gz +0 -0
- package/dist/js/system-log.23013a0fdc72af416211.chunk.js.map +1 -0
- package/dist/js/transfers.d728823ac24fb319071e.chunk.js +2 -0
- package/dist/js/transfers.d728823ac24fb319071e.chunk.js.gz +0 -0
- package/dist/js/transfers.d728823ac24fb319071e.chunk.js.map +1 -0
- package/dist/sw.js +1 -1
- package/dist/sw.js.gz +0 -0
- package/jest.config.js +1 -0
- package/package.json +7 -3
- package/tsconfig.json +3 -1
- package/webpack.config.js +3 -3
- package/dist/js/223.06647c76119795de1120.chunk.js +0 -2
- package/dist/js/223.06647c76119795de1120.chunk.js.gz +0 -0
- package/dist/js/223.06647c76119795de1120.chunk.js.map +0 -1
- package/dist/js/544.98c6db8edd59772ce882.chunk.js +0 -2
- package/dist/js/544.98c6db8edd59772ce882.chunk.js.gz +0 -0
- package/dist/js/544.98c6db8edd59772ce882.chunk.js.map +0 -1
- package/dist/js/616.4bd5e5662de9d9b82cf0.chunk.js.gz +0 -0
- package/dist/js/616.4bd5e5662de9d9b82cf0.chunk.js.map +0 -1
- package/dist/js/794.6d1cd71b066060392290.chunk.js +0 -2
- package/dist/js/794.6d1cd71b066060392290.chunk.js.gz +0 -0
- package/dist/js/794.6d1cd71b066060392290.chunk.js.map +0 -1
- package/dist/js/865.1e2799c4dfd59dcb2755.chunk.js +0 -2
- package/dist/js/865.1e2799c4dfd59dcb2755.chunk.js.gz +0 -0
- package/dist/js/865.1e2799c4dfd59dcb2755.chunk.js.map +0 -1
- package/dist/js/favorite-hubs.d4702f3be7fdec8bf015.chunk.js +0 -2
- package/dist/js/favorite-hubs.d4702f3be7fdec8bf015.chunk.js.gz +0 -0
- package/dist/js/favorite-hubs.d4702f3be7fdec8bf015.chunk.js.map +0 -1
- package/dist/js/filelists.39ac9c3c7eab7764bc4c.chunk.js +0 -2
- package/dist/js/filelists.39ac9c3c7eab7764bc4c.chunk.js.gz +0 -0
- package/dist/js/filelists.39ac9c3c7eab7764bc4c.chunk.js.map +0 -1
- package/dist/js/files.7bbb40e2f4460ff26557.chunk.js.gz +0 -0
- package/dist/js/files.7bbb40e2f4460ff26557.chunk.js.map +0 -1
- package/dist/js/home.b2ed6186babbb6498c36.chunk.js.gz +0 -0
- package/dist/js/home.b2ed6186babbb6498c36.chunk.js.map +0 -1
- package/dist/js/hubs.c17c540065c951c6c433.chunk.js +0 -2
- package/dist/js/hubs.c17c540065c951c6c433.chunk.js.gz +0 -0
- package/dist/js/hubs.c17c540065c951c6c433.chunk.js.map +0 -1
- package/dist/js/main.fd47b3be5ae224421db3.entry.js.gz +0 -0
- package/dist/js/messages.d4f37acc03f35d693b25.chunk.js +0 -2
- package/dist/js/messages.d4f37acc03f35d693b25.chunk.js.gz +0 -0
- package/dist/js/messages.d4f37acc03f35d693b25.chunk.js.map +0 -1
- package/dist/js/queue.760564a90bab2959347d.chunk.js +0 -2
- package/dist/js/queue.760564a90bab2959347d.chunk.js.gz +0 -0
- package/dist/js/queue.760564a90bab2959347d.chunk.js.map +0 -1
- package/dist/js/search.2bf412c274cc218ecb24.chunk.js +0 -2
- package/dist/js/search.2bf412c274cc218ecb24.chunk.js.gz +0 -0
- package/dist/js/search.2bf412c274cc218ecb24.chunk.js.map +0 -1
- package/dist/js/settings.50e03a62375f3da819cf.chunk.js +0 -2
- package/dist/js/settings.50e03a62375f3da819cf.chunk.js.gz +0 -0
- package/dist/js/settings.50e03a62375f3da819cf.chunk.js.map +0 -1
- package/dist/js/share.ea4cb3d08b83367d00d9.chunk.js +0 -2
- package/dist/js/share.ea4cb3d08b83367d00d9.chunk.js.gz +0 -0
- package/dist/js/share.ea4cb3d08b83367d00d9.chunk.js.map +0 -1
- package/dist/js/system-log.f4601bdebcb5ea09f6d5.chunk.js.gz +0 -0
- package/dist/js/system-log.f4601bdebcb5ea09f6d5.chunk.js.map +0 -1
- package/dist/js/transfers.0ec950401c110f37ae81.chunk.js +0 -2
- package/dist/js/transfers.0ec950401c110f37ae81.chunk.js.gz +0 -0
- package/dist/js/transfers.0ec950401c110f37ae81.chunk.js.map +0 -1
- /package/dist/js/{home.b2ed6186babbb6498c36.chunk.js.LICENSE.txt → home.760bbf44c8ebebae9fae.chunk.js.LICENSE.txt} +0 -0
|
@@ -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:()=>o});var i=s(32811),t=s(4425);const o=(n,e)=>({id:"remove",displayName:"Close",access:e,icon:t.A.REMOVE,handler:({itemData:e})=>i.A.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(41860),b=s(18220),y=s(20181),j=s(20311),I=s.n(j);const N=({baseUrl:n})=>{const e=(0,y.Zp)(),s=e=>(I()(!!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})}}},O=(n,e)=>n.find((n=>n.id===e));var z=s(85072),T=s.n(z),S=s(97825),M=s.n(S),k=s(77659),D=s.n(k),H=s(55056),U=s.n(H),K=s(10540),Y=s.n(K),G=s(41113),L=s.n(G),R=s(46510),V={};V.styleTagTransform=L(),V.setAttributes=U(),V.insert=D().bind(null,"head"),V.domAPI=M(),V.insertStyleElement=Y(),T()(R.A,V),R.A&&R.A.locals&&R.A.locals;var W=s(71352),$=s(46942),P=s.n($),_=s(45325);const q=({url:n,title:e,className:s})=>(0,i.jsx)(_.A,{className:P()("new",s),icon:u.A.CREATE,url:n,children:e},"button-new"),Z=({sessionItem:n,status:e,name:s,unreadInfoStore:t,url:o})=>(0,i.jsx)(_.A,{url:o,className:"session-item",icon:e,session:n,unreadInfoStore:t,children:(0,i.jsx)("span",{className:"session-name",children:s})});var F=s(83994),J=s(27725);const X=n=>{const e=(0,b.y)(),s=(0,y.Zp)(),r=(0,y.zy)(),{activeItem:A,onKeyDown:l}=(n=>{const[e,s]=t.useState(null),i=(0,y.zy)(),{pushSession:o,replaceSession:r,newUrl:A,replaceNew:l}=N({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=O(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&&O(n.items,e))return void r(e)}const{items:t,activeId:o}=n;let d=0;const m=O(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=O(s,i);o&&t.removeSession(o)}}else{e.preventDefault();const{items:i,activeId:t}=n,a=O(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),c=w.A.hasAccess(n.editAccess),{disableSideMenu:h,items:E,unreadInfoStore:g,sessionT:x,uiActions:f}=n;if(!c&&0===E.length)return(0,i.jsx)(v.A,{title:(0,m.Tl)("No items to show",x.plainT,d.KV.COMMON),description:x.plainT((0,m.j2)("noSessionEditAccess",d.KV.COMMON),"You aren't allowed to open new sessions")});const j=h||(0,a.mY)(e)?B:C,{getItemHeaderTitle:I,getItemHeaderDescription:z,getItemHeaderIcon:T,getNewButton:S,getSessionMenuItems:M,getSessionActionMenuItems:k}=(n=>{const e=(0,y.zy)(),{t:s}=(0,p.Bd)(),{newUrl:t,getSessionUrl:o}=N({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)(F.A,{icon:t(e)})};return{getItemHeaderDescription:()=>{const{itemHeaderDescriptionGetter:e,newDescription:s,activeItem:i}=n;return i?e(i):s},getItemHeaderIcon:()=>{const{itemHeaderIconGetter:e,newIcon:s,activeItem:t}=n;return(0,i.jsx)(F.A,{icon:t?e(t):s})},getItemHeaderTitle:()=>{const{activeItem:s,newCaption:t,remoteMenuId:o}=n;if(!s)return(0,i.jsx)("div",{children:t});const{uiActions:a,actionIds:r,itemNameGetter:A,itemHeaderTitleGetter:l}=n,c=r?[...r,"divider","remove"]:void 0,d=(0,i.jsx)(W.Wy,{caption:A(s),actions:a,itemData:s,ids:c,remoteMenuId:o});if(l){const n=l(s,e,d);if(n)return n}return d},getSessionActionMenuItems:()=>{const{items:e,hasEditAccess:t}=n;return t&&0!==e.length?(0,i.jsx)(J.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)(q,{title:e,url:t},"new-button"):null},getSessionMenuItems:()=>n.items.map((e=>{const{itemNameGetter:s,unreadInfoStore:t}=n;return(0,i.jsx)(Z,{url:o(e.id),name:s(e),unreadInfoStore:t,status:a(e),sessionItem:e},e.id)}))}})(Object.assign(Object.assign({},n),{activeItem:A,hasEditAccess:c}));return(0,i.jsx)(j,{itemHeaderTitle:I(),itemHeaderDescription:z(),itemHeaderIcon:T(),newButton:S(),sessionMenuItems:M(),listActionMenuGetter:k,activeItem:A,unreadInfoStore:g,onKeyDown:l,actions:f,children:(()=>{const{newLayout:e,sessionT:t}=n;return!n.activeId&&e?(0,i.jsx)(e,{navigate:s,location:r,sessionT:t}):(()=>{const{activeId:e,items:t,sessionItemLayout:a,sessionApi:l,uiActions:c,sessionT:u}=n;if(!A){const{state:n}=r;return n&&n.pending?(0,i.jsx)(o.A,{text:(0,m.Tl)("Waiting for server response",u.plainT,d.KV.COMMON)}):e||0!==t.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)(a,{session:A,sessionApi:l,uiActions:c,location:r,navigate:s,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(20181);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.
|
|
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(42815),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),Y=s(41113),G=s.n(Y),L=s(46510),R={};R.styleTagTransform=G(),R.setAttributes=H(),R.insert=M().bind(null,"head"),R.domAPI=S(),R.insertStyleElement=K(),z()(L.A,R),L.A&&L.A.locals&&L.A.locals;var V=s(71352),W=s(46942),$=s.n(W),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),{disableSideMenu:E,items:g,unreadInfoStore:x,sessionT:f,uiActions:y}=n;if(!h&&0===g.length)return(0,i.jsx)(v.A,{title:(0,m.Tl)("No items to show",f.plainT,d.KV.COMMON),description:f.plainT((0,m.j2)("noSessionEditAccess",d.KV.COMMON),"You aren't allowed to open new sessions")});const j=E||(0,a.mY)(s)?B:C,{getItemHeaderTitle:O,getItemHeaderDescription:z,getItemHeaderIcon:T,getNewButton:S,getSessionMenuItems:k,getSessionActionMenuItems:M}=(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}=n;return i?e(i):s},getItemHeaderIcon:()=>{const{itemHeaderIconGetter:e,newIcon:s,activeItem:t}=n;return(0,i.jsx)(Z.A,{icon:t?e(t):s})},getItemHeaderTitle:()=>{const{activeItem:s,newCaption:t,remoteMenuId:o}=n;if(!s)return(0,i.jsx)("div",{children:t});const{uiActions:a,actionIds:r,itemNameGetter:A,itemHeaderTitleGetter:l}=n,c=r?[...r,"divider","remove"]:void 0,d=(0,i.jsx)(V.Wy,{caption:A(s),actions:a,itemData:s,ids:c,remoteMenuId:o});if(l){const n=l(s,e,d);if(n)return n}return d},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}));return(0,i.jsx)(j,{itemHeaderTitle:O(),itemHeaderDescription:z(),itemHeaderIcon:T(),newButton:S(),sessionMenuItems:k(),listActionMenuGetter:M,activeItem:l,unreadInfoStore:x,onKeyDown:c,actions:y,children:(()=>{const{newLayout:e,sessionT:s}=n;return!n.activeId&&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(42815);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.2672d1bde46d026c625b.chunk.js.map
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js/616.2672d1bde46d026c625b.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/sessions.css","webpack://airdcpp-webui/./src/actions/ui/decorators/SessionActionDecorator.ts","webpack://airdcpp-webui/./src/decorators/ActiveSessionDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionFooter.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/TopMenuLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SideMenuLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/effects/useSessionHelpers.ts","webpack://airdcpp-webui/./src/routes/Sidebar/components/effects/useSessionManager.ts","webpack://airdcpp-webui/./src/routes/Sidebar/sessions.css?90b7","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionNewButton.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionMenuItem.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionMenuComponents.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/SessionProviderDecorator.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.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\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\ntype SessionType = UI.SessionItemBase;\r\n\r\nexport const BuildRemoveSessionAction = (\r\n sessionsUrl: string,\r\n editAccess: API.AccessEnum,\r\n) => {\r\n const handleRemoveSession: UI.ActionHandler<SessionType> = ({\r\n itemData: session,\r\n socket,\r\n }) => {\r\n return socket.delete(`${sessionsUrl}/${session.id}`);\r\n };\r\n\r\n const SessionRemoveAction = {\r\n id: 'remove',\r\n displayName: 'Close',\r\n access: editAccess,\r\n icon: IconConstants.REMOVE,\r\n handler: handleRemoveSession,\r\n };\r\n\r\n return SessionRemoveAction;\r\n};\r\n","import * as React from 'react';\r\n\r\nimport LocalSettingStore from 'stores/LocalSettingStore';\r\nimport { LocalSettings } from 'constants/SettingConstants';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/types';\r\n\r\ntype SessionType = UI.SessionItemBase;\r\n\r\ninterface ActiveSessionDecoratorProps<\r\n SessionT extends SessionType,\r\n ActionT extends object,\r\n> extends Pick<SessionChildProps<SessionT, ActionT>, 'session'> {\r\n sessionApi: UI.SessionActions<SessionT> & ActionT;\r\n //uiActions:\r\n //session: SessionT;\r\n}\r\n\r\n// This decorator will fire updates for currently active session\r\n// and set them as read\r\nexport default function <\r\n PropsT,\r\n SessionT extends SessionType,\r\n ActionT extends object = UI.EmptyObject,\r\n>(Component: React.ComponentType<PropsT>, useReadDelay = false) {\r\n class ActiveSessionDecorator extends React.Component<\r\n PropsT & ActiveSessionDecoratorProps<SessionT, ActionT>\r\n > {\r\n readTimeout: number | undefined;\r\n\r\n setRead = (session: SessionT) => {\r\n this.props.sessionApi.setRead(session);\r\n this.readTimeout = undefined;\r\n };\r\n\r\n setSession = (session: SessionT | null) => {\r\n if (this.readTimeout) {\r\n // Set the previously active session as read\r\n clearTimeout(this.readTimeout);\r\n this.setRead(this.props.session);\r\n }\r\n\r\n this.props.sessionApi.sessionChanged(session);\r\n if (!session) {\r\n return;\r\n }\r\n\r\n const timeout = !useReadDelay\r\n ? 0\r\n : LocalSettingStore.getValue<number>(LocalSettings.UNREAD_LABEL_DELAY) * 1000;\r\n this.readTimeout = window.setTimeout(() => this.setRead(session), timeout);\r\n };\r\n\r\n componentDidMount() {\r\n this.setSession(this.props.session);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.setSession(null);\r\n }\r\n\r\n componentDidUpdate(prevProps: ActiveSessionDecoratorProps<SessionT, ActionT>) {\r\n if (this.props.session.id !== prevProps.session.id) {\r\n this.setSession(this.props.session);\r\n }\r\n }\r\n\r\n render() {\r\n return <Component {...this.props} />;\r\n }\r\n }\r\n\r\n return ActiveSessionDecorator;\r\n}\r\n","import * as React from 'react';\n\nimport * as UI from 'types/ui';\n\ninterface FooterItemProps {\n label?: string;\n text: string | React.ReactElement<any>;\n}\n\nexport const FooterItem: React.FC<FooterItemProps> = ({ label, text }) => (\n <div className=\"grid-item\">\n <div className=\"item-inner\">\n {!!label && typeof text === 'string' ? `${label}: ${text}` : text}\n </div>\n </div>\n);\n\nexport const SessionFooter: React.FC<UI.PropsWithChildren> = ({ children }) => (\n <div className=\"session-footer\">\n <div className=\"ui footer divider\" />\n <div className=\"info-grid ui\">{children}</div>\n </div>\n);\n","import * as React from 'react';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport ActionButton from 'components/ActionButton';\r\nimport SectionedDropdown from 'components/semantic/SectionedDropdown';\r\nimport MenuSection from 'components/semantic/MenuSection';\r\nimport { MenuIcon } from 'components/icon/MenuIcon';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SessionMainLayoutProps } from './types';\r\n\r\ntype SessionDropdownProps<SessionT extends UI.SessionItemBase> = Pick<\r\n SessionMainLayoutProps<SessionT>,\r\n 'sessionMenuItems' | 'newButton' | 'unreadInfoStore' | 'listActionMenuGetter'\r\n>;\r\n\r\nconst SessionDropdown = <SessionT extends UI.SessionItemBase>({\r\n sessionMenuItems,\r\n newButton,\r\n unreadInfoStore,\r\n listActionMenuGetter,\r\n}: SessionDropdownProps<SessionT>) => {\r\n const { t } = useTranslation();\r\n return (\r\n <SectionedDropdown\r\n triggerIcon={\r\n <MenuIcon\r\n urgencies={unreadInfoStore ? unreadInfoStore.getTotalUrgencies() : null}\r\n />\r\n }\r\n >\r\n <MenuSection caption={translate('New', t, UI.Modules.COMMON)}>\r\n {newButton}\r\n </MenuSection>\r\n <MenuSection caption={translate('Current sessions', t, UI.Modules.COMMON)}>\r\n {sessionMenuItems}\r\n </MenuSection>\r\n <MenuSection>{listActionMenuGetter()}</MenuSection>\r\n </SectionedDropdown>\r\n );\r\n};\r\n\r\ntype CloseButtonProps<\r\n SessionT extends UI.SessionItemBase,\r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>,\r\n> = Pick<\r\n SessionMainLayoutProps<SessionT, UI.EmptyObject, UIActionsT>,\r\n 'actions' | 'activeItem'\r\n>;\r\n\r\nconst CloseButton = <\r\n SessionT extends UI.SessionItemBase,\r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>,\r\n>({\r\n actions,\r\n activeItem,\r\n}: CloseButtonProps<SessionT, UIActionsT>) => {\r\n if (!activeItem || useMobileLayout()) {\r\n return null;\r\n }\r\n\r\n /*const closeAction = Object.values(actions.actions).find(\r\n (action) => !!action && action.id === 'remove',\r\n ) as UI.ActionDefinition<UI.SessionItemBase>;*/\r\n\r\n const closeAction = Object.values(actions.actions)[\r\n Object.values(actions.actions).length - 1\r\n ];\r\n return (\r\n <ActionButton\r\n className=\"basic small item close-button\"\r\n action={closeAction as UI.ActionDefinition<UI.SessionItemBase>}\r\n moduleData={actions.moduleData}\r\n itemData={activeItem}\r\n icon={IconConstants.CLOSE}\r\n />\r\n );\r\n};\r\n\r\ntype SessionItemHeaderProps = Pick<\r\n SessionMainLayoutProps<any>,\r\n 'itemHeaderIcon' | 'itemHeaderTitle'\r\n>;\r\n\r\nconst SessionItemHeader: React.FC<SessionItemHeaderProps> = ({\r\n itemHeaderIcon,\r\n itemHeaderTitle,\r\n}) => (\r\n <div className=\"session-header\">\r\n {itemHeaderIcon}\r\n {itemHeaderTitle}\r\n </div>\r\n);\r\n\r\nconst TopMenuLayout = <\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object,\r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>,\r\n>({\r\n children,\r\n onKeyDown,\r\n ...props\r\n}: SessionMainLayoutProps<SessionT, SessionApiT, UIActionsT>) => (\r\n <div className=\"session-container vertical\" onKeyDown={onKeyDown} tabIndex={0}>\r\n <div className=\"ui main menu menu-bar\">\r\n <div className=\"content-left\">\r\n <SessionDropdown {...props} />\r\n <SessionItemHeader {...props} />\r\n </div>\r\n <CloseButton {...props} />\r\n </div>\r\n\r\n <div className=\"session-layout\">{children}</div>\r\n </div>\r\n);\r\n\r\nexport default TopMenuLayout;\r\n","import * as React from 'react';\r\n\r\nimport LayoutHeader from 'components/semantic/LayoutHeader';\r\nimport { Grid } from 'components/semantic/Grid';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { SessionMainLayoutProps } from './types';\r\n\r\nconst SideMenuLayout = <\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object,\r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>,\r\n>({\r\n sessionMenuItems,\r\n newButton,\r\n itemHeaderIcon,\r\n itemHeaderTitle,\r\n children,\r\n itemHeaderDescription,\r\n onKeyDown,\r\n}: SessionMainLayoutProps<SessionT, SessionApiT, UIActionsT>) => {\r\n if (newButton) {\r\n newButton = React.cloneElement(newButton, {\r\n className: newButton.props.className + ' ui fluid button',\r\n });\r\n }\r\n\r\n return (\r\n <Grid className=\"session-container horizontal\" onKeyDown={onKeyDown} tabIndex={0}>\r\n <div className=\"four wide column menu-column\">\r\n {newButton}\r\n {!!sessionMenuItems.length && (\r\n <div className=\"ui vertical secondary menu\">{sessionMenuItems}</div>\r\n )}\r\n </div>\r\n <div className=\"twelve wide stretched column content-column session\">\r\n <div className=\"ui segment session-layout\">\r\n <LayoutHeader\r\n className=\"session-header\"\r\n icon={itemHeaderIcon}\r\n title={<div className=\"title\">{itemHeaderTitle}</div>}\r\n subHeader={itemHeaderDescription}\r\n />\r\n <div className=\"ui divider\" style={{ margin: '5px 0px 0px 0px' }} />\r\n {children}\r\n </div>\r\n </div>\r\n </Grid>\r\n );\r\n};\r\n\r\nexport default SideMenuLayout;\r\n","import invariant from 'invariant';\r\n\r\nimport * as API from 'types/api';\r\n\r\nimport { useNavigate } from 'react-router';\r\nimport { SessionLocationState } from '../types';\r\n\r\ninterface SessionRouteHelperProps {\r\n baseUrl: string;\r\n}\r\n\r\nexport const useSessionRouteHelpers = ({ baseUrl }: SessionRouteHelperProps) => {\r\n const navigate = useNavigate();\r\n\r\n // HELPERS\r\n const getSessionUrl = (id: API.IdType) => {\r\n invariant(!!id, 'Trying to get session URL without a session');\r\n return `/${baseUrl}/session/${id}`;\r\n };\r\n\r\n const pushSession = (id: API.IdType) => {\r\n navigate(getSessionUrl(id));\r\n };\r\n\r\n const replaceSession = (id: API.IdType, state?: SessionLocationState) => {\r\n navigate(getSessionUrl(id), { replace: true, state });\r\n };\r\n\r\n const newUrl = `/${baseUrl}/new`;\r\n const replaceNew = () => {\r\n // const { navigate } = props;\r\n navigate(newUrl, { replace: true });\r\n };\r\n\r\n return {\r\n newUrl: `/${baseUrl}/new`,\r\n replaceNew,\r\n\r\n getSessionUrl,\r\n pushSession,\r\n replaceSession,\r\n };\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { loadLocalProperty, saveLocalProperty } from 'utils/BrowserUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useLocation } from 'react-router';\r\nimport { useSessionRouteHelpers } from './useSessionHelpers';\r\nimport { SessionLocationState } from '../types';\r\n\r\nconst findItem = <SessionT extends UI.SessionItemBase>(\r\n items: SessionT[],\r\n id: API.IdType | undefined,\r\n): SessionT | undefined => {\r\n return items.find((item) => item.id === id);\r\n};\r\n\r\nexport interface SessionManagerProps<\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object = UI.EmptyObject,\r\n> {\r\n // Item ID that is currently active (if any)\r\n activeId: API.IdType | undefined;\r\n\r\n // Array of the items to list\r\n items: SessionT[];\r\n\r\n baseUrl: string;\r\n\r\n sessionApi: UI.SessionActions<SessionT> & SessionApiT;\r\n}\r\n\r\nexport const useSessionManager = <\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object = UI.EmptyObject,\r\n>(\r\n props: SessionManagerProps<SessionT, SessionApiT>,\r\n) => {\r\n const [activeItem, setActiveItem] = React.useState<SessionT | null>(null);\r\n const location = useLocation();\r\n\r\n const { pushSession, replaceSession, newUrl, replaceNew } = useSessionRouteHelpers({\r\n baseUrl: props.baseUrl,\r\n });\r\n\r\n // HELPERS\r\n const getStorageKey = () => {\r\n return `${props.baseUrl}_last_active`;\r\n };\r\n\r\n // Common logic for selecting the item to display (after mounting or session updates)\r\n // Returns true active item selection was handled\r\n // Returns false if the active item couldn't be selected but there are valid items to choose from by the caller\r\n const checkActiveItem = () => {\r\n // Did we just create this session?\r\n const routerLocation = location;\r\n const pending =\r\n routerLocation.state && (routerLocation.state as SessionLocationState).pending;\r\n\r\n // Update the active item\r\n const activeItemNew = findItem(props.items, props.activeId);\r\n if (activeItemNew) {\r\n if (pending) {\r\n // Disable pending state\r\n replaceSession(activeItemNew.id, {\r\n pending: false,\r\n });\r\n\r\n return true;\r\n }\r\n\r\n setActiveItem(activeItemNew);\r\n saveLocalProperty(getStorageKey(), props.activeId);\r\n return true;\r\n } else if (pending) {\r\n // We'll just display a loading indicator in 'render', no item needed\r\n return true;\r\n } else if (/*routerLocation.action === 'POP' ||*/ props.items.length === 0) {\r\n // Browsing from history and item removed (or all items removed)... go to \"new session\" page\r\n replaceNew();\r\n setActiveItem(null);\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // LIFECYCLE/REACT\r\n // Set the session early so that we wont' flash the \"new session\" layout\r\n React.useLayoutEffect(() => {\r\n if (location.pathname === newUrl) {\r\n // Don't redirect to it if the \"new session\" layout is open\r\n if (activeItem) {\r\n setActiveItem(null);\r\n }\r\n return;\r\n }\r\n\r\n if (checkActiveItem()) {\r\n // We got an item\r\n return;\r\n }\r\n\r\n if (!activeItem) {\r\n const lastId = loadLocalProperty<API.IdType>(getStorageKey());\r\n if (lastId && findItem(props.items, lastId)) {\r\n // Previous session exists\r\n replaceSession(lastId);\r\n return;\r\n }\r\n }\r\n\r\n // The old tab was closed or we didn't have any session before\r\n\r\n const { items, activeId } = props;\r\n let newItemPos = 0;\r\n const oldItem = findItem(items, activeId);\r\n if (oldItem) {\r\n // Find the old position and use the item in that position (if possible)\r\n newItemPos = items.indexOf(oldItem);\r\n if (newItemPos === items.length - 1) {\r\n // The last item was removed\r\n newItemPos = newItemPos - 1;\r\n }\r\n }\r\n\r\n replaceSession(items[newItemPos].id);\r\n }, [location, props.items]);\r\n\r\n const onKeyDown = (event: React.KeyboardEvent) => {\r\n const { key, altKey } = event;\r\n\r\n if (altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\r\n // Arrow up/down\r\n event.preventDefault();\r\n\r\n const { items, activeId } = props;\r\n const item = findItem(items, activeId);\r\n if (!item) {\r\n return;\r\n }\r\n\r\n const currentIndex = items.indexOf(item);\r\n if (currentIndex === -1) {\r\n return;\r\n }\r\n\r\n const newSession = items[key === 'ArrowUp' ? currentIndex - 1 : currentIndex + 1];\r\n if (newSession) {\r\n pushSession(newSession.id);\r\n }\r\n } else if (altKey && key === 'Insert') {\r\n // Insert\r\n event.preventDefault();\r\n\r\n replaceNew();\r\n } else if (altKey && key === 'Delete') {\r\n // Delete\r\n event.preventDefault();\r\n\r\n const { items, activeId, sessionApi } = props;\r\n const item = findItem(items, activeId);\r\n if (!!item) {\r\n sessionApi.removeSession(item);\r\n }\r\n }\r\n };\r\n\r\n return {\r\n onKeyDown,\r\n activeItem,\r\n };\r\n};\r\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./sessions.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!./sessions.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport RouterMenuItemLink from 'components/semantic/RouterMenuItemLink';\r\n\r\ninterface SessionNewButtonProps {\r\n url: string;\r\n title: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst SessionNewButton: React.FC<SessionNewButtonProps> = ({\r\n url,\r\n title,\r\n // pushNew,\r\n className,\r\n}) => (\r\n <RouterMenuItemLink\r\n key=\"button-new\"\r\n className={classNames('new', className)}\r\n icon={IconConstants.CREATE}\r\n url={url}\r\n >\r\n {title}\r\n </RouterMenuItemLink>\r\n);\r\n\r\nexport default SessionNewButton;\r\n","import * as React from 'react';\r\n\r\nimport RouterMenuItemLink from 'components/semantic/RouterMenuItemLink';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\ninterface SessionMenuItemProps {\r\n url: string;\r\n name: React.ReactNode;\r\n unreadInfoStore: UI.UnreadInfoStore;\r\n status: React.ReactElement<any>;\r\n sessionItem: UI.SessionItemBase;\r\n}\r\n\r\nconst SessionMenuItem: React.FC<SessionMenuItemProps> = ({\r\n sessionItem,\r\n status,\r\n name,\r\n unreadInfoStore,\r\n url,\r\n}) => (\r\n <RouterMenuItemLink\r\n url={url}\r\n className=\"session-item\"\r\n icon={status}\r\n session={sessionItem}\r\n unreadInfoStore={unreadInfoStore}\r\n >\r\n <span className=\"session-name\">{name}</span>\r\n </RouterMenuItemLink>\r\n);\r\n\r\nexport default SessionMenuItem;\r\n","import * as React from 'react';\r\n\r\nimport Loader from 'components/semantic/Loader';\r\n\r\nimport TopMenuLayout from './TopMenuLayout';\r\nimport SideMenuLayout from './SideMenuLayout';\r\n\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { translate, toI18nKey } from 'utils/TranslationUtils';\r\nimport { useLayoutWidth } from 'context/LayoutWidthContext';\r\nimport { useSessionManager } from './effects/useSessionManager';\r\nimport { useLocation, useNavigate } from 'react-router';\r\n\r\nimport '../sessions.css';\r\nimport {\r\n NewSessionLayoutProps,\r\n SessionChildProps,\r\n SessionLayoutLabels,\r\n SessionLayoutManageProps,\r\n SessionLocationState,\r\n} from './types';\r\nimport { useComponents } from './SessionMenuComponents';\r\nimport { useSession } from 'context/SessionContext';\r\n\r\nexport interface SessionLayoutProps<\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object = UI.EmptyObject,\r\n UIActionT extends UI.ActionListType<UI.SessionItemBase> = UI.EmptyObject,\r\n> extends UI.SessionInfoGetter<SessionT>,\r\n SessionLayoutLabels,\r\n SessionLayoutManageProps<SessionT, SessionApiT, UIActionT> {\r\n // Item ID that is currently active (if any)\r\n activeId: API.IdType | undefined;\r\n\r\n // Set to false if the side menu should never be shown (the session will use all width that is available)\r\n disableSideMenu?: boolean;\r\n\r\n sessionItemLayout: React.ComponentType<\r\n SessionChildProps<SessionT, SessionApiT, UIActionT>\r\n >;\r\n\r\n newLayout?: React.ComponentType<NewSessionLayoutProps>;\r\n\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst SessionLayout = <\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object,\r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>,\r\n>(\r\n props: SessionLayoutProps<SessionT, SessionApiT, UIActionsT>,\r\n) => {\r\n const { hasAccess } = useSession();\r\n const layoutWidth = useLayoutWidth();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const { activeItem, onKeyDown } = useSessionManager(props);\r\n\r\n const hasEditAccess = hasAccess(props.editAccess);\r\n\r\n const getSessionChildren = () => {\r\n const {\r\n activeId,\r\n items,\r\n sessionItemLayout: SessionItemLayout,\r\n sessionApi,\r\n uiActions,\r\n sessionT,\r\n } = props;\r\n\r\n if (!activeItem) {\r\n const { state } = location;\r\n if (!!state && (state as SessionLocationState).pending) {\r\n // The session was just created\r\n return (\r\n <Loader\r\n text={translate(\r\n 'Waiting for server response',\r\n sessionT.plainT,\r\n UI.Modules.COMMON,\r\n )}\r\n />\r\n );\r\n } else if (activeId || items.length !== 0) {\r\n // Redirecting to a new page\r\n return (\r\n <Loader\r\n text={translate('Loading session', sessionT.plainT, UI.Modules.COMMON)}\r\n />\r\n );\r\n }\r\n\r\n console.error('SessionLayout route: active session missing');\r\n return;\r\n }\r\n\r\n // We have a session\r\n return (\r\n <SessionItemLayout\r\n session={activeItem}\r\n sessionApi={sessionApi}\r\n uiActions={uiActions}\r\n location={location}\r\n navigate={navigate}\r\n sessionT={sessionT}\r\n />\r\n );\r\n };\r\n\r\n const getChildren = () => {\r\n const { newLayout: NewLayout, sessionT } = props;\r\n if (!props.activeId && NewLayout) {\r\n return <NewLayout navigate={navigate} location={location} sessionT={sessionT} />;\r\n }\r\n\r\n return getSessionChildren();\r\n };\r\n\r\n const { disableSideMenu, items, unreadInfoStore, sessionT, uiActions } = props;\r\n\r\n if (!hasEditAccess && items.length === 0) {\r\n // Nothing to show\r\n return (\r\n <Message\r\n title={translate('No items to show', sessionT.plainT, UI.Modules.COMMON)}\r\n description={sessionT.plainT(\r\n toI18nKey('noSessionEditAccess', UI.Modules.COMMON),\r\n `You aren't allowed to open new sessions`,\r\n )}\r\n />\r\n );\r\n }\r\n\r\n const useTopMenu = disableSideMenu || useMobileLayout(layoutWidth);\r\n\r\n const MenuLayout = useTopMenu ? TopMenuLayout : SideMenuLayout;\r\n const {\r\n getItemHeaderTitle,\r\n getItemHeaderDescription,\r\n getItemHeaderIcon,\r\n getNewButton,\r\n getSessionMenuItems,\r\n getSessionActionMenuItems,\r\n } = useComponents({ ...props, activeItem, hasEditAccess });\r\n return (\r\n <MenuLayout\r\n itemHeaderTitle={getItemHeaderTitle()}\r\n itemHeaderDescription={getItemHeaderDescription()}\r\n itemHeaderIcon={getItemHeaderIcon()}\r\n newButton={getNewButton()}\r\n sessionMenuItems={getSessionMenuItems()}\r\n listActionMenuGetter={getSessionActionMenuItems}\r\n activeItem={activeItem}\r\n unreadInfoStore={unreadInfoStore}\r\n onKeyDown={onKeyDown}\r\n actions={uiActions}\r\n >\r\n {getChildren()}\r\n </MenuLayout>\r\n );\r\n};\r\n\r\nexport default SessionLayout;\r\n","import { ActionMenu } from 'components/action-menu';\r\nimport SessionNewButton from './SessionNewButton';\r\nimport SessionMenuItem from './SessionMenuItem';\r\n\r\nimport Icon from 'components/semantic/Icon';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { SessionLayoutLabels, SessionLayoutManageProps } from './types';\r\nimport { useLocation } from 'react-router';\r\nimport { useSessionRouteHelpers } from './effects/useSessionHelpers';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const useComponents = <\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object = UI.EmptyObject,\r\n UIActionT extends UI.ActionListType<UI.SessionItemBase> = UI.EmptyObject,\r\n>(\r\n props: UI.SessionInfoGetter<SessionT> & {\r\n activeItem: SessionT | null;\r\n hasEditAccess: boolean;\r\n } & SessionLayoutLabels &\r\n SessionLayoutManageProps<SessionT, SessionApiT, UIActionT>,\r\n) => {\r\n const location = useLocation();\r\n const { t } = useTranslation();\r\n const { newUrl, getSessionUrl } = useSessionRouteHelpers({\r\n baseUrl: props.baseUrl,\r\n });\r\n\r\n // COMPONENT GETTERS\r\n const getItemStatus = (sessionItem: SessionT) => {\r\n const { itemStatusGetter, itemHeaderIconGetter } = props;\r\n if (itemStatusGetter) {\r\n return (\r\n <div\r\n className={\r\n 'ui session-status empty circular left mini label ' +\r\n itemStatusGetter(sessionItem)\r\n }\r\n />\r\n );\r\n }\r\n\r\n return <Icon icon={itemHeaderIconGetter(sessionItem)} />;\r\n };\r\n\r\n const components = {\r\n getItemHeaderDescription: () => {\r\n const { itemHeaderDescriptionGetter, newDescription, activeItem } = props;\r\n if (!activeItem) {\r\n return newDescription;\r\n }\r\n\r\n return itemHeaderDescriptionGetter(activeItem);\r\n },\r\n getItemHeaderIcon: () => {\r\n const { itemHeaderIconGetter, newIcon, activeItem } = props;\r\n return <Icon icon={activeItem ? itemHeaderIconGetter(activeItem) : newIcon} />;\r\n },\r\n getItemHeaderTitle: () => {\r\n const { activeItem, newCaption, remoteMenuId } = props;\r\n if (!activeItem) {\r\n return <div>{newCaption}</div>;\r\n }\r\n\r\n const { uiActions, actionIds, itemNameGetter, itemHeaderTitleGetter } = props;\r\n\r\n const ids = actionIds ? [...actionIds, 'divider', 'remove'] : undefined;\r\n const actionMenu = (\r\n <ActionMenu\r\n caption={itemNameGetter(activeItem)}\r\n actions={uiActions}\r\n itemData={activeItem}\r\n ids={ids}\r\n remoteMenuId={remoteMenuId}\r\n />\r\n );\r\n\r\n // Use the header getter only if there is a getter that returns a valid value\r\n if (itemHeaderTitleGetter) {\r\n const header = itemHeaderTitleGetter(activeItem, location, actionMenu);\r\n if (header) {\r\n return header;\r\n }\r\n }\r\n\r\n return actionMenu;\r\n },\r\n getSessionActionMenuItems: () => {\r\n const { items, hasEditAccess } = props;\r\n if (!hasEditAccess || items.length === 0) {\r\n return null;\r\n }\r\n\r\n const handleCloseAll = () => {\r\n const { sessionApi, items } = props;\r\n items.forEach((session) => sessionApi.removeSession(session));\r\n };\r\n\r\n return (\r\n <MenuItemLink key=\"close\" onClick={handleCloseAll} icon={IconConstants.REMOVE}>\r\n {translate('Close all', t, UI.Modules.COMMON)}\r\n </MenuItemLink>\r\n );\r\n },\r\n getNewButton: () => {\r\n const { newCaption, hasEditAccess } = props;\r\n if (!hasEditAccess || !newCaption) {\r\n return null;\r\n }\r\n\r\n return <SessionNewButton key=\"new-button\" title={newCaption} url={newUrl} />;\r\n },\r\n getSessionMenuItems: () => {\r\n const getSessionMenuItem = (sessionItem: SessionT) => {\r\n const { itemNameGetter, unreadInfoStore } = props;\r\n return (\r\n <SessionMenuItem\r\n key={sessionItem.id}\r\n url={getSessionUrl(sessionItem.id)}\r\n name={itemNameGetter(sessionItem)}\r\n unreadInfoStore={unreadInfoStore}\r\n status={getItemStatus(sessionItem)}\r\n sessionItem={sessionItem}\r\n />\r\n );\r\n };\r\n\r\n return props.items.map(getSessionMenuItem);\r\n },\r\n };\r\n\r\n return components;\r\n};\r\n","import * as React from 'react';\r\n\r\nimport Loader from 'components/semantic/Loader';\r\nimport { useStore } from 'effects/StoreListenerEffect';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { getModuleT, translate } from 'utils/TranslationUtils';\r\nimport { useParams } from 'react-router';\r\n\r\nexport interface SessionProviderDecoratorProps {}\r\n\r\nexport interface SessionProviderDecoratorChildProps<SessionT extends UI.SessionType> {\r\n items: SessionT[];\r\n sessionT: UI.ModuleTranslator;\r\n params: UI.RouteParams;\r\n}\r\n\r\nconst SessionProviderDecorator = <SessionT extends UI.SessionType>(\r\n Component: React.ComponentType<SessionProviderDecoratorChildProps<SessionT>>,\r\n store: UI.SessionStore<SessionT>,\r\n moduleId: UI.Modules,\r\n) => {\r\n const Decorator = (props: SessionProviderDecoratorProps) => {\r\n const { t } = useTranslation();\r\n const sessionT = getModuleT(t, moduleId);\r\n const params = useParams();\r\n const sessions = useStore<SessionT[]>(store);\r\n if (!store.isInitialized()) {\r\n return <Loader text={translate('Loading sessions', t, UI.Modules.COMMON)} />;\r\n }\r\n\r\n return <Component items={sessions} params={params} sessionT={sessionT} />;\r\n };\r\n\r\n return Decorator;\r\n};\r\n\r\nexport { SessionProviderDecorator };\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","BuildRemoveSessionAction","sessionsUrl","editAccess","displayName","access","icon","REMOVE","handler","itemData","session","socket","delete","Component","useReadDelay","ActiveSessionDecorator","setRead","this","props","sessionApi","readTimeout","undefined","setSession","clearTimeout","sessionChanged","timeout","getValue","UNREAD_LABEL_DELAY","window","setTimeout","componentDidMount","componentWillUnmount","componentDidUpdate","prevProps","render","FooterItem","label","text","className","SessionFooter","children","SessionDropdown","sessionMenuItems","newButton","unreadInfoStore","listActionMenuGetter","t","SectionedDropdown","triggerIcon","MenuIcon","urgencies","getTotalUrgencies","MenuSection","caption","COMMON","CloseButton","actions","activeItem","closeAction","Object","values","length","ActionButton","A","action","moduleData","IconConstants","CLOSE","SessionItemHeader","itemHeaderIcon","itemHeaderTitle","onKeyDown","tabIndex","itemHeaderDescription","Grid","LayoutHeader","title","subHeader","style","margin","useSessionRouteHelpers","baseUrl","navigate","getSessionUrl","newUrl","replaceNew","replace","pushSession","replaceSession","state","findItem","items","find","item","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","url","RouterMenuItemLink","CREATE","sessionItem","status","name","hasAccess","layoutWidth","location","setActiveItem","getStorageKey","pathname","routerLocation","pending","activeItemNew","activeId","checkActiveItem","lastId","newItemPos","oldItem","indexOf","event","key","altKey","preventDefault","removeSession","currentIndex","newSession","useSessionManager","hasEditAccess","disableSideMenu","sessionT","uiActions","Message","plainT","description","MenuLayout","getItemHeaderTitle","getItemHeaderDescription","getItemHeaderIcon","getNewButton","getSessionMenuItems","getSessionActionMenuItems","getItemStatus","itemStatusGetter","itemHeaderIconGetter","Icon","itemHeaderDescriptionGetter","newDescription","newIcon","newCaption","remoteMenuId","actionIds","itemNameGetter","itemHeaderTitleGetter","ids","actionMenu","header","MenuItemLink","onClick","forEach","map","useComponents","newLayout","NewLayout","sessionItemLayout","SessionItemLayout","Loader","console","error","getSessionChildren","getChildren","SessionProviderDecorator","store","moduleId","params","sessions","isInitialized"],"sourceRoot":""}
|