airdcpp-webui 2.14.0-beta.17 → 2.14.0-beta.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.html +1 -1
- package/dist/js/{381.648720e987fa59ec0e87.chunk.js → 381.3451f45ec53347c5970b.chunk.js} +1 -1
- package/dist/js/381.3451f45ec53347c5970b.chunk.js.gz +0 -0
- package/dist/js/{381.648720e987fa59ec0e87.chunk.js.map → 381.3451f45ec53347c5970b.chunk.js.map} +1 -1
- package/dist/js/{544.2cd91849513cb11c9998.chunk.js → 544.e7ebc14895b0324a3c8c.chunk.js} +1 -1
- package/dist/js/{544.2cd91849513cb11c9998.chunk.js.gz → 544.e7ebc14895b0324a3c8c.chunk.js.gz} +0 -0
- package/dist/js/{544.2cd91849513cb11c9998.chunk.js.map → 544.e7ebc14895b0324a3c8c.chunk.js.map} +1 -1
- package/dist/js/{550.95ecb3f482ba18bc53cc.chunk.js → 550.5af63eac940d4bdf4a4b.chunk.js} +1 -1
- package/dist/js/550.5af63eac940d4bdf4a4b.chunk.js.gz +0 -0
- package/dist/js/{550.95ecb3f482ba18bc53cc.chunk.js.map → 550.5af63eac940d4bdf4a4b.chunk.js.map} +1 -1
- package/dist/js/{807.ae2142c32d74128cca0c.chunk.js → 807.388dc595e784df736600.chunk.js} +2 -2
- package/dist/js/807.388dc595e784df736600.chunk.js.gz +0 -0
- package/dist/js/{807.ae2142c32d74128cca0c.chunk.js.map → 807.388dc595e784df736600.chunk.js.map} +1 -1
- package/dist/js/{926.e54dc95c755638da6b67.chunk.js → 926.e388975b4083ba0a91c7.chunk.js} +1 -1
- package/dist/js/926.e388975b4083ba0a91c7.chunk.js.gz +0 -0
- package/dist/js/{926.e54dc95c755638da6b67.chunk.js.map → 926.e388975b4083ba0a91c7.chunk.js.map} +1 -1
- package/dist/js/{944.5908bfaf6f121ca9ad94.chunk.js → 944.c4cb3ddb95e062d0a3f1.chunk.js} +1 -1
- package/dist/js/{944.5908bfaf6f121ca9ad94.chunk.js.gz → 944.c4cb3ddb95e062d0a3f1.chunk.js.gz} +0 -0
- package/dist/js/{944.5908bfaf6f121ca9ad94.chunk.js.map → 944.c4cb3ddb95e062d0a3f1.chunk.js.map} +1 -1
- package/dist/js/{945.3db280a22e0ea1f128fa.chunk.js → 945.f3e72d30c3f9057b0933.chunk.js} +1 -1
- package/dist/js/945.f3e72d30c3f9057b0933.chunk.js.gz +0 -0
- package/dist/js/{945.3db280a22e0ea1f128fa.chunk.js.map → 945.f3e72d30c3f9057b0933.chunk.js.map} +1 -1
- package/dist/js/{favorite-hubs.6ae6552e3baa139a3f98.chunk.js → favorite-hubs.7eb77029c146886b2c00.chunk.js} +1 -1
- package/dist/js/favorite-hubs.7eb77029c146886b2c00.chunk.js.gz +0 -0
- package/dist/js/{favorite-hubs.6ae6552e3baa139a3f98.chunk.js.map → favorite-hubs.7eb77029c146886b2c00.chunk.js.map} +1 -1
- package/dist/js/{filelists.8a5a9abbcc14e01b53eb.chunk.js → filelists.6e0bdd7213769b367fbb.chunk.js} +1 -1
- package/dist/js/filelists.6e0bdd7213769b367fbb.chunk.js.gz +0 -0
- package/dist/js/{filelists.8a5a9abbcc14e01b53eb.chunk.js.map → filelists.6e0bdd7213769b367fbb.chunk.js.map} +1 -1
- package/dist/js/{files.f4eb3179a3eba4326752.chunk.js → files.9b308467378a6cc60aec.chunk.js} +1 -1
- package/dist/js/files.9b308467378a6cc60aec.chunk.js.gz +0 -0
- package/dist/js/{files.f4eb3179a3eba4326752.chunk.js.map → files.9b308467378a6cc60aec.chunk.js.map} +1 -1
- package/dist/js/{home.bc44c1ff808f2b343f9f.chunk.js → home.b6d0755ec820d626573c.chunk.js} +2 -2
- package/dist/js/home.b6d0755ec820d626573c.chunk.js.gz +0 -0
- package/dist/js/{home.bc44c1ff808f2b343f9f.chunk.js.map → home.b6d0755ec820d626573c.chunk.js.map} +1 -1
- package/dist/js/{hubs.e4b0456ce8f30d868c44.chunk.js → hubs.4f7fd8c2895accfd1f3f.chunk.js} +1 -1
- package/dist/js/hubs.4f7fd8c2895accfd1f3f.chunk.js.gz +0 -0
- package/dist/js/{hubs.e4b0456ce8f30d868c44.chunk.js.map → hubs.4f7fd8c2895accfd1f3f.chunk.js.map} +1 -1
- package/dist/js/main.7ba9eae7152468e36ca2.entry.js +3 -0
- package/dist/js/main.7ba9eae7152468e36ca2.entry.js.gz +0 -0
- package/dist/js/{main.3dedbac203202466cf55.entry.js.map → main.7ba9eae7152468e36ca2.entry.js.map} +1 -1
- package/dist/js/{messages.3d372056d582e1271e3b.chunk.js → messages.102990dad3b115934627.chunk.js} +1 -1
- package/dist/js/messages.102990dad3b115934627.chunk.js.gz +0 -0
- package/dist/js/{messages.3d372056d582e1271e3b.chunk.js.map → messages.102990dad3b115934627.chunk.js.map} +1 -1
- package/dist/js/{queue.7390044b40f4d0093fba.chunk.js → queue.af8178685f8fb20b4407.chunk.js} +1 -1
- package/dist/js/queue.af8178685f8fb20b4407.chunk.js.gz +0 -0
- package/dist/js/{queue.7390044b40f4d0093fba.chunk.js.map → queue.af8178685f8fb20b4407.chunk.js.map} +1 -1
- package/dist/js/{search.dbaeaf6c58e5b89dee99.chunk.js → search.241be541237f297c608f.chunk.js} +1 -1
- package/dist/js/search.241be541237f297c608f.chunk.js.gz +0 -0
- package/dist/js/{search.dbaeaf6c58e5b89dee99.chunk.js.map → search.241be541237f297c608f.chunk.js.map} +1 -1
- package/dist/js/{settings.e2de956b1b61fd0085df.chunk.js → settings.e08714a3c281f08d5943.chunk.js} +2 -2
- package/dist/js/settings.e08714a3c281f08d5943.chunk.js.gz +0 -0
- package/dist/js/settings.e08714a3c281f08d5943.chunk.js.map +1 -0
- package/dist/js/{share.3d87d65e17afebd94b44.chunk.js → share.3fab3fdd7079c69d47bb.chunk.js} +1 -1
- package/dist/js/share.3fab3fdd7079c69d47bb.chunk.js.gz +0 -0
- package/dist/js/{share.3d87d65e17afebd94b44.chunk.js.map → share.3fab3fdd7079c69d47bb.chunk.js.map} +1 -1
- package/dist/js/{system-log.0230bce6e359e48be389.chunk.js → system-log.51a77c13ce2e2c4c5a4f.chunk.js} +1 -1
- package/dist/js/system-log.51a77c13ce2e2c4c5a4f.chunk.js.gz +0 -0
- package/dist/js/{system-log.0230bce6e359e48be389.chunk.js.map → system-log.51a77c13ce2e2c4c5a4f.chunk.js.map} +1 -1
- package/dist/js/{transfers.1869852550ef1410991f.chunk.js → transfers.981959f9d556e84f51e8.chunk.js} +1 -1
- package/dist/js/transfers.981959f9d556e84f51e8.chunk.js.gz +0 -0
- package/dist/js/{transfers.1869852550ef1410991f.chunk.js.map → transfers.981959f9d556e84f51e8.chunk.js.map} +1 -1
- package/dist/sw.js +1 -1
- package/dist/sw.js.gz +0 -0
- package/package.json +1 -1
- package/dist/js/381.648720e987fa59ec0e87.chunk.js.gz +0 -0
- package/dist/js/550.95ecb3f482ba18bc53cc.chunk.js.gz +0 -0
- package/dist/js/807.ae2142c32d74128cca0c.chunk.js.gz +0 -0
- package/dist/js/926.e54dc95c755638da6b67.chunk.js.gz +0 -0
- package/dist/js/945.3db280a22e0ea1f128fa.chunk.js.gz +0 -0
- package/dist/js/favorite-hubs.6ae6552e3baa139a3f98.chunk.js.gz +0 -0
- package/dist/js/filelists.8a5a9abbcc14e01b53eb.chunk.js.gz +0 -0
- package/dist/js/files.f4eb3179a3eba4326752.chunk.js.gz +0 -0
- package/dist/js/home.bc44c1ff808f2b343f9f.chunk.js.gz +0 -0
- package/dist/js/hubs.e4b0456ce8f30d868c44.chunk.js.gz +0 -0
- package/dist/js/main.3dedbac203202466cf55.entry.js +0 -3
- package/dist/js/main.3dedbac203202466cf55.entry.js.gz +0 -0
- package/dist/js/messages.3d372056d582e1271e3b.chunk.js.gz +0 -0
- package/dist/js/queue.7390044b40f4d0093fba.chunk.js.gz +0 -0
- package/dist/js/search.dbaeaf6c58e5b89dee99.chunk.js.gz +0 -0
- package/dist/js/settings.e2de956b1b61fd0085df.chunk.js.gz +0 -0
- package/dist/js/settings.e2de956b1b61fd0085df.chunk.js.map +0 -1
- package/dist/js/share.3d87d65e17afebd94b44.chunk.js.gz +0 -0
- package/dist/js/system-log.0230bce6e359e48be389.chunk.js.gz +0 -0
- package/dist/js/transfers.1869852550ef1410991f.chunk.js.gz +0 -0
- /package/dist/js/{807.ae2142c32d74128cca0c.chunk.js.LICENSE.txt → 807.388dc595e784df736600.chunk.js.LICENSE.txt} +0 -0
- /package/dist/js/{home.bc44c1ff808f2b343f9f.chunk.js.LICENSE.txt → home.b6d0755ec820d626573c.chunk.js.LICENSE.txt} +0 -0
- /package/dist/js/locales/{ca-webui-main-json.cead82e99706611f17c0.chunk.js → ca-webui-main-json.6c5ba3d760ecba105e0f.chunk.js} +0 -0
- /package/dist/js/locales/{ca-webui-main-json.cead82e99706611f17c0.chunk.js.gz → ca-webui-main-json.6c5ba3d760ecba105e0f.chunk.js.gz} +0 -0
- /package/dist/js/locales/{da-webui-main-json.5de718926fa5e9b3690a.chunk.js → da-webui-main-json.a446b821af2135f946bc.chunk.js} +0 -0
- /package/dist/js/locales/{da-webui-main-json.5de718926fa5e9b3690a.chunk.js.gz → da-webui-main-json.a446b821af2135f946bc.chunk.js.gz} +0 -0
- /package/dist/js/locales/{de-webui-main-json.f53083fd474718a7e8db.chunk.js → de-webui-main-json.18a1f4fcb940e7269872.chunk.js} +0 -0
- /package/dist/js/locales/{de-webui-main-json.f53083fd474718a7e8db.chunk.js.gz → de-webui-main-json.18a1f4fcb940e7269872.chunk.js.gz} +0 -0
- /package/dist/js/locales/{el-webui-main-json.328389207dfde1559c91.chunk.js → el-webui-main-json.547b32b69559910bcfd9.chunk.js} +0 -0
- /package/dist/js/locales/{el-webui-main-json.328389207dfde1559c91.chunk.js.gz → el-webui-main-json.547b32b69559910bcfd9.chunk.js.gz} +0 -0
- /package/dist/js/locales/{en-webui-main-json.949aba2907ba06169859.chunk.js → en-webui-main-json.4cbd1d2e9ca9043e0e1f.chunk.js} +0 -0
- /package/dist/js/locales/{en-webui-main-json.949aba2907ba06169859.chunk.js.gz → en-webui-main-json.4cbd1d2e9ca9043e0e1f.chunk.js.gz} +0 -0
- /package/dist/js/locales/{en-webui-main-missing-json.a4704a173bebeebdc24d.chunk.js → en-webui-main-missing-json.05fafca49bd7fd3c630f.chunk.js} +0 -0
- /package/dist/js/locales/{en-webui-main-missing-json.a4704a173bebeebdc24d.chunk.js.gz → en-webui-main-missing-json.05fafca49bd7fd3c630f.chunk.js.gz} +0 -0
- /package/dist/js/locales/{es-webui-main-json.366ff02a36a75fdd6050.chunk.js → es-webui-main-json.cb5728712080a8f59cec.chunk.js} +0 -0
- /package/dist/js/locales/{es-webui-main-json.366ff02a36a75fdd6050.chunk.js.gz → es-webui-main-json.cb5728712080a8f59cec.chunk.js.gz} +0 -0
- /package/dist/js/locales/{eu-webui-main-json.6eadbfced95e36be2f65.chunk.js → eu-webui-main-json.d730608e5a3556ecd75e.chunk.js} +0 -0
- /package/dist/js/locales/{eu-webui-main-json.6eadbfced95e36be2f65.chunk.js.gz → eu-webui-main-json.d730608e5a3556ecd75e.chunk.js.gz} +0 -0
- /package/dist/js/locales/{fi-webui-main-json.da3adb476e4c0cd06f05.chunk.js → fi-webui-main-json.54fcf817474277a9c47e.chunk.js} +0 -0
- /package/dist/js/locales/{fi-webui-main-json.da3adb476e4c0cd06f05.chunk.js.gz → fi-webui-main-json.54fcf817474277a9c47e.chunk.js.gz} +0 -0
- /package/dist/js/locales/{fr-webui-main-json.a977c3aaad84bfe0f69d.chunk.js → fr-webui-main-json.5b5223fdcefebc32eb2c.chunk.js} +0 -0
- /package/dist/js/locales/{fr-webui-main-json.a977c3aaad84bfe0f69d.chunk.js.gz → fr-webui-main-json.5b5223fdcefebc32eb2c.chunk.js.gz} +0 -0
- /package/dist/js/locales/{hu-webui-main-json.0a0cd706db14010491a7.chunk.js → hu-webui-main-json.d694ed99623a4d61203b.chunk.js} +0 -0
- /package/dist/js/locales/{hu-webui-main-json.0a0cd706db14010491a7.chunk.js.gz → hu-webui-main-json.d694ed99623a4d61203b.chunk.js.gz} +0 -0
- /package/dist/js/locales/{it-webui-main-json.d46d2fc8e63b0fc46051.chunk.js → it-webui-main-json.1379da83bafdd12e47c0.chunk.js} +0 -0
- /package/dist/js/locales/{it-webui-main-json.d46d2fc8e63b0fc46051.chunk.js.gz → it-webui-main-json.1379da83bafdd12e47c0.chunk.js.gz} +0 -0
- /package/dist/js/locales/{nl-webui-main-json.17d4b0b33b7a9b89d738.chunk.js → nl-webui-main-json.f5c42094ccd4f6c4e9a7.chunk.js} +0 -0
- /package/dist/js/locales/{nl-webui-main-json.17d4b0b33b7a9b89d738.chunk.js.gz → nl-webui-main-json.f5c42094ccd4f6c4e9a7.chunk.js.gz} +0 -0
- /package/dist/js/locales/{no-webui-main-json.b9455a6842e22fefa784.chunk.js → no-webui-main-json.73752382be508549b5bc.chunk.js} +0 -0
- /package/dist/js/locales/{no-webui-main-json.b9455a6842e22fefa784.chunk.js.gz → no-webui-main-json.73752382be508549b5bc.chunk.js.gz} +0 -0
- /package/dist/js/locales/{pl-webui-main-json.f4abe451657bf38503d3.chunk.js → pl-webui-main-json.23a6362d0854cdef6a45.chunk.js} +0 -0
- /package/dist/js/locales/{pl-webui-main-json.f4abe451657bf38503d3.chunk.js.gz → pl-webui-main-json.23a6362d0854cdef6a45.chunk.js.gz} +0 -0
- /package/dist/js/locales/{pt-br-webui-main-json.1e68869ee8f4ff49c12a.chunk.js → pt-br-webui-main-json.44be984d7e968f2b8018.chunk.js} +0 -0
- /package/dist/js/locales/{pt-br-webui-main-json.1e68869ee8f4ff49c12a.chunk.js.gz → pt-br-webui-main-json.44be984d7e968f2b8018.chunk.js.gz} +0 -0
- /package/dist/js/locales/{pt-webui-main-json.c56f03450534448e840c.chunk.js → pt-webui-main-json.eea576710ca75c929da8.chunk.js} +0 -0
- /package/dist/js/locales/{pt-webui-main-json.c56f03450534448e840c.chunk.js.gz → pt-webui-main-json.eea576710ca75c929da8.chunk.js.gz} +0 -0
- /package/dist/js/locales/{ro-webui-main-json.ea0884dd24fbc61ffbf3.chunk.js → ro-webui-main-json.64f0a9e14cc463ded677.chunk.js} +0 -0
- /package/dist/js/locales/{ro-webui-main-json.ea0884dd24fbc61ffbf3.chunk.js.gz → ro-webui-main-json.64f0a9e14cc463ded677.chunk.js.gz} +0 -0
- /package/dist/js/locales/{ru-webui-main-json.f79ac0e957704a584c18.chunk.js → ru-webui-main-json.a6f813fad73558dbc62e.chunk.js} +0 -0
- /package/dist/js/locales/{ru-webui-main-json.f79ac0e957704a584c18.chunk.js.gz → ru-webui-main-json.a6f813fad73558dbc62e.chunk.js.gz} +0 -0
- /package/dist/js/locales/{sv-webui-main-json.73cff8e85537baa1dc1b.chunk.js → sv-webui-main-json.66cdd751b3ce09a67770.chunk.js} +0 -0
- /package/dist/js/locales/{sv-webui-main-json.73cff8e85537baa1dc1b.chunk.js.gz → sv-webui-main-json.66cdd751b3ce09a67770.chunk.js.gz} +0 -0
- /package/dist/js/locales/{tr-webui-main-json.7db8316af675febefd54.chunk.js → tr-webui-main-json.a4023f41a4a1a1472554.chunk.js} +0 -0
- /package/dist/js/locales/{tr-webui-main-json.7db8316af675febefd54.chunk.js.gz → tr-webui-main-json.a4023f41a4a1a1472554.chunk.js.gz} +0 -0
- /package/dist/js/locales/{uk_UA-webui-main-json.708fa7ec93aa96a3532f.chunk.js → uk_UA-webui-main-json.2520781628cb03935715.chunk.js} +0 -0
- /package/dist/js/locales/{uk_UA-webui-main-json.708fa7ec93aa96a3532f.chunk.js.gz → uk_UA-webui-main-json.2520781628cb03935715.chunk.js.gz} +0 -0
- /package/dist/js/locales/{zh_CN-GB2312-webui-main-json.c56c6d389b7951c4f74d.chunk.js → zh_CN-GB2312-webui-main-json.959d30704781dfd5dd4e.chunk.js} +0 -0
- /package/dist/js/locales/{zh_CN-GB2312-webui-main-json.c56c6d389b7951c4f74d.chunk.js.gz → zh_CN-GB2312-webui-main-json.959d30704781dfd5dd4e.chunk.js.gz} +0 -0
- /package/dist/js/locales/{zh_CN-webui-main-json.eddb014a9a1459c34743.chunk.js → zh_CN-webui-main-json.ed92e30ed29b9f9ca92f.chunk.js} +0 -0
- /package/dist/js/locales/{zh_CN-webui-main-json.eddb014a9a1459c34743.chunk.js.gz → zh_CN-webui-main-json.ed92e30ed29b9f9ca92f.chunk.js.gz} +0 -0
- /package/dist/js/{main.3dedbac203202466cf55.entry.js.LICENSE.txt → main.7ba9eae7152468e36ca2.entry.js.LICENSE.txt} +0 -0
package/dist/index.html
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
{
|
|
17
17
|
// We must inject the main chunk dynamically as well because the final path is not known on compile time
|
|
18
18
|
var script = document.createElement('script');
|
|
19
|
-
script.src = getBasePath() + "js/main.
|
|
19
|
+
script.src = getBasePath() + "js/main.7ba9eae7152468e36ca2.entry.js";
|
|
20
20
|
document.body.appendChild(script);
|
|
21
21
|
}
|
|
22
22
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[381],{59089:(e,t,s)=>{s.d(t,{A:()=>a});var n=s(71354),o=s.n(n),i=s(76314),r=s.n(i)()(o());r.push([e.id,".message-section {\n flex: 1;\n overflow-y: auto;\n}\n\n.message-list .date.divider i {\n margin-right: 5px;\n}\n\n.message-list .item .text .highlight.link {\n color: #4183c4;\n}\n\n.message-list .item .text .highlight.bold {\n font-weight: bold;\n}\n\n.message-list .item .text .table.dropdown,\n.message-list .item .text .table.dropdown .popup.trigger {\n max-width: 100%;\n}\n\n.message-list .item .text .table.dropdown .caption {\n overflow: hidden;\n}\n","",{version:3,sources:["webpack://./src/components/messages/messages.css"],names:[],mappings:"AAAA;EACE,OAAO;EACP,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,gBAAgB;AAClB",sourcesContent:[".message-section {\n flex: 1;\n overflow-y: auto;\n}\n\n.message-list .date.divider i {\n margin-right: 5px;\n}\n\n.message-list .item .text .highlight.link {\n color: #4183c4;\n}\n\n.message-list .item .text .highlight.bold {\n font-weight: bold;\n}\n\n.message-list .item .text .table.dropdown,\n.message-list .item .text .table.dropdown .popup.trigger {\n max-width: 100%;\n}\n\n.message-list .item .text .table.dropdown .caption {\n overflow: hidden;\n}\n"],sourceRoot:""}]);const a=r},91381:(e,t,s)=>{s.d(t,{A:()=>ee});var n=s(74848),o=s(96540),i=s(46942),r=s.n(i),a=s(99347),l=s(68443),h=s(71987),d=Object.defineProperty,c=(e,t,s)=>((e,t,s)=>t in e?d(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s)(e,"symbol"!=typeof t?t+"":t,s),g=new Map,m=new WeakMap,p=0;function u(e,t,s={},n=undefined){if(void 0===window.IntersectionObserver&&void 0!==n){const o=e.getBoundingClientRect();return t(n,{isIntersecting:n,target:e,intersectionRatio:"number"==typeof s.threshold?s.threshold:0,time:0,boundingClientRect:o,intersectionRect:o,rootBounds:o}),()=>{}}const{id:o,observer:i,elements:r}=function(e){const t=function(e){return Object.keys(e).sort().filter(t=>void 0!==e[t]).map(t=>{return`${t}_${"root"===t?(s=e.root,s?(m.has(s)||(p+=1,m.set(s,p.toString())),m.get(s)):"0"):e[t]}`;var s}).toString()}(e);let s=g.get(t);if(!s){const n=new Map;let o;const i=new IntersectionObserver(t=>{t.forEach(t=>{var s;const i=t.isIntersecting&&o.some(e=>t.intersectionRatio>=e);e.trackVisibility&&void 0===t.isVisible&&(t.isVisible=i),null==(s=n.get(t.target))||s.forEach(e=>{e(i,t)})})},e);o=i.thresholds||(Array.isArray(e.threshold)?e.threshold:[e.threshold||0]),s={id:t,observer:i,elements:n},g.set(t,s)}return s}(s),a=r.get(e)||[];return r.has(e)||r.set(e,a),a.push(t),i.observe(e),function(){a.splice(a.indexOf(t),1),0===a.length&&(r.delete(e),i.unobserve(e)),0===r.size&&(i.disconnect(),g.delete(o))}}var b=class extends o.Component{constructor(e){super(e),c(this,"node",null),c(this,"_unobserveCb",null),c(this,"handleNode",e=>{this.node&&(this.unobserve(),e||this.props.triggerOnce||this.props.skip||this.setState({inView:!!this.props.initialInView,entry:void 0})),this.node=e||null,this.observeNode()}),c(this,"handleChange",(e,t)=>{e&&this.props.triggerOnce&&this.unobserve(),function(e){return"function"!=typeof e.children}(this.props)||this.setState({inView:e,entry:t}),this.props.onChange&&this.props.onChange(e,t)}),this.state={inView:!!e.initialInView,entry:void 0}}componentDidMount(){this.unobserve(),this.observeNode()}componentDidUpdate(e){e.rootMargin===this.props.rootMargin&&e.root===this.props.root&&e.threshold===this.props.threshold&&e.skip===this.props.skip&&e.trackVisibility===this.props.trackVisibility&&e.delay===this.props.delay||(this.unobserve(),this.observeNode())}componentWillUnmount(){this.unobserve()}observeNode(){if(!this.node||this.props.skip)return;const{threshold:e,root:t,rootMargin:s,trackVisibility:n,delay:o,fallbackInView:i}=this.props;this._unobserveCb=u(this.node,this.handleChange,{threshold:e,root:t,rootMargin:s,trackVisibility:n,delay:o},i)}unobserve(){this._unobserveCb&&(this._unobserveCb(),this._unobserveCb=null)}render(){const{children:e}=this.props;if("function"==typeof e){const{inView:t,entry:s}=this.state;return e({inView:t,entry:s,ref:this.handleNode})}const{as:t,triggerOnce:s,threshold:n,root:i,rootMargin:r,onChange:a,skip:l,trackVisibility:h,delay:d,initialInView:c,fallbackInView:g,...m}=this.props;return o.createElement(t||"div",{ref:this.handleNode,...m},e)}},f=s(71352),y=s(39115),A=s(74416);const v=({time:e})=>{const{formatTimestamp:t}=(0,A.k)();return(0,n.jsx)("div",{className:"time",children:t(e)})};var w=s(28122);const x=e=>{var{emojify:t,message:s,user:o,label:i,highlightMenuProps:r}=e,a=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(s[n[o]]=e[n[o]])}return s}(e,["emojify","message","user","label","highlightMenuProps"]);return(0,n.jsxs)("div",{className:"text",children:[!!i&&(0,n.jsx)("span",{className:"label",children:`${i}: `}),(0,n.jsx)(w.z,Object.assign({emojify:t,text:s.text,highlights:s.highlights,user:o,menuProps:r},a))]})};const O=({message:e,dropdownContext:t})=>(0,n.jsxs)("div",{className:"header author",children:[e.third_person&&(0,n.jsx)("span",{children:"*"}),(0,n.jsx)(f.Bg,{contextElement:t,triggerIcon:null,user:e.from,remoteMenuId:y.Ay.HUB_USER,entity:e.from.hub_session_id})]});class j extends o.Component{shouldComponentUpdate(){return!1}render(){const e=this.props,{message:t,dropdownContext:s,highlightMenuProps:o}=e,i=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(s[n[o]]=e[n[o]])}return s}(e,["message","dropdownContext","highlightMenuProps"]);return(0,n.jsxs)(b,Object.assign({className:r()("ui item chat",t.from.flags.join(" "))},i,{children:[(0,n.jsx)(v,{time:t.time}),(0,n.jsxs)("div",{className:r()("left",t.third_person?"third-person":"normal"),children:[(0,n.jsx)(O,{message:t,dropdownContext:s}),(0,n.jsx)(x,{message:t,emojify:!0,user:t.from,highlightMenuProps:o})]})]}))}}var C=s(83994),E=s(4425),I=s(86038);const M=e=>{switch(e){case I.F$.VERBOSE:return E.A.VERBOSE;case I.F$.INFO:return E.A.INFO+" circle";case I.F$.WARNING:return E.A.WARNING;case I.F$.ERROR:return E.A.ERROR;default:return""}};class P extends o.Component{shouldComponentUpdate(){return!1}render(){const e=this.props,{message:t,highlightMenuProps:s}=e,o=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(s[n[o]]=e[n[o]])}return s}(e,["message","highlightMenuProps"]);return(0,n.jsxs)(b,Object.assign({className:r()("ui item status",t.severity,t.type)},o,{children:[(0,n.jsx)(C.A,{icon:M(t.severity)}),t.time>0&&(0,n.jsx)(v,{time:t.time}),(0,n.jsx)(x,{label:t.label,message:t,emojify:!1,highlightMenuProps:s})]}))}}const N=e=>{var{message:t}=e,s=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(s[n[o]]=e[n[o]])}return s}(e,["message"]);return t.chat_message?(0,n.jsx)(j,Object.assign({message:t.chat_message,dropdownContext:s.highlightMenuProps.boundary},s)):t.log_message?(0,n.jsx)(P,Object.assign({message:t.log_message},s)):null},_=e=>{const t=e.chat_message?e.chat_message:e.log_message;return t&&new Date(1e3*t.time).getDate()},k=e=>!!e.log_message&&e.log_message.type===I.Lu.HISTORY,S=({time:e})=>{const{formatCalendarTime:t}=(0,A.k)();return(0,n.jsxs)("div",{className:"ui horizontal date divider",children:[(0,n.jsx)(C.A,{icon:E.A.DATE}),t(e)]},`divider${e}`)};var R=s(25507);const V=({entity:e,onMessageVisibilityChanged:t,addDownload:s,highlightRemoteMenuId:o,scrollable:i,instanceId:r},a,l,d,c)=>{if(((e,t)=>{const s=t[e];return 0===e||1===e&&k(t[e-1])?_(s)!==(new Date).getDate()&&!k(s):_(t[e-1])!==_(s)})(d,c)){const e=l.chat_message?l.chat_message:l.log_message;e&&a.push((0,n.jsx)(S,{time:e.time},`divider${e.id}`))}const g=(0,h.Lw)(l);return a.push((0,n.jsx)(N,{id:(0,h.AS)(g,r),onChange:e=>{t(g,e)},threshold:.4,root:i,message:l,highlightMenuProps:{addDownload:s,entity:e,remoteMenuId:o,boundary:".message-section"}},g)),a};var B=s(42695),D=s(88544),$=s(67749),F=s(85072),T=s.n(F),G=s(97825),H=s.n(G),U=s(77659),W=s.n(U),z=s(55056),L=s.n(z),K=s(10540),Y=s.n(K),q=s(41113),J=s.n(q),Q=s(59089),X={};X.styleTagTransform=J(),X.setAttributes=L(),X.insert=W().bind(null,"head"),X.domAPI=H(),X.insertStyleElement=Y(),T()(Q.A,X),Q.A&&Q.A.locals&&Q.A.locals;const Z=o.memo(function({className:e,t,messages:s,chatSession:i,highlightRemoteMenuId:h,scrollPositionHandler:d}){const[c,g]=o.useState(null),m=(p=i,(0,o.useMemo)(()=>{const e={},t=t=>{const s=e[t];if(!s)throw new Error("Download was not found");return s};return{downloadDialogProps:{downloadHandler:(e,s,n)=>t(e.itemInfo.id).downloadHandler(e,s,n),userGetter:(e,s)=>{const n=t(e).userGetter;return n?n(e,s):void 0},itemDataGetter:(e,s)=>t(e).itemDataGetter(e,s),sessionItem:p},addDownloadItem:(t,s)=>{e[t]=s}}},[]));var p;const{messageNodes:u,visibleItems:b}=(({highlightRemoteMenuId:e,messages:t,chatSession:s},n,i)=>{const r=(0,R.te)(),a=(0,o.useMemo)(()=>new Set,[s]),l=(e,t)=>{t?a.add(e):a.delete(e)};return{messageNodes:(0,o.useMemo)(()=>t?t.reduce(V.bind(null,{highlightRemoteMenuId:e,entity:s,onMessageVisibilityChanged:l,addDownload:n.addDownloadItem,scrollable:i,instanceId:r}),[]):null,[t]),visibleItems:a}})({highlightRemoteMenuId:h,messages:s,chatSession:i},m,c);return(0,l.sg)({messages:s,scrollPositionHandler:d,chatSession:i},b,c),(0,n.jsx)("div",{ref:g,className:r()("message-section",e),role:"article",children:u?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"ui list message-list",children:u}),(0,n.jsx)(D.A,Object.assign({},m.downloadDialogProps))]}):(0,n.jsx)(a.A,{text:(0,B.Tl)("Loading messages",t,$.KV.COMMON)})})},(e,t)=>e.messages===t.messages),ee=Z}}]);
|
|
2
|
-
//# sourceMappingURL=381.
|
|
2
|
+
//# sourceMappingURL=381.3451f45ec53347c5970b.chunk.js.map
|
|
Binary file
|
package/dist/js/{381.648720e987fa59ec0e87.chunk.js.map → 381.3451f45ec53347c5970b.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js/381.648720e987fa59ec0e87.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/messages/messages.css","webpack://airdcpp-webui/./node_modules/react-intersection-observer/dist/index.mjs","webpack://airdcpp-webui/./src/components/messages/message/Timestamp.tsx","webpack://airdcpp-webui/./src/components/messages/message/MessageText.tsx","webpack://airdcpp-webui/./src/components/messages/message/ChatMessage.tsx","webpack://airdcpp-webui/./src/components/messages/message/StatusMessage.tsx","webpack://airdcpp-webui/./src/components/messages/list/MessageListItem.tsx","webpack://airdcpp-webui/./src/components/messages/list/MessageListDateDivider.tsx","webpack://airdcpp-webui/./src/components/messages/effects/MessageNodeManager.tsx","webpack://airdcpp-webui/./src/components/messages/messages.css?1e0d","webpack://airdcpp-webui/./src/components/messages/MessageView.tsx","webpack://airdcpp-webui/./src/effects/ItemDownloadManager.ts"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.message-section {\n flex: 1;\n overflow-y: auto;\n}\n\n.message-list .date.divider i {\n margin-right: 5px;\n}\n\n.message-list .item .text .highlight.link {\n color: #4183c4;\n}\n\n.message-list .item .text .highlight.bold {\n font-weight: bold;\n}\n\n.message-list .item .text .table.dropdown,\n.message-list .item .text .table.dropdown .popup.trigger {\n max-width: 100%;\n}\n\n.message-list .item .text .table.dropdown .caption {\n overflow: hidden;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/messages/messages.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,OAAO;EACP,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,gBAAgB;AAClB\",\"sourcesContent\":[\".message-section {\\n flex: 1;\\n overflow-y: auto;\\n}\\n\\n.message-list .date.divider i {\\n margin-right: 5px;\\n}\\n\\n.message-list .item .text .highlight.link {\\n color: #4183c4;\\n}\\n\\n.message-list .item .text .highlight.bold {\\n font-weight: bold;\\n}\\n\\n.message-list .item .text .table.dropdown,\\n.message-list .item .text .table.dropdown .popup.trigger {\\n max-width: 100%;\\n}\\n\\n.message-list .item .text .table.dropdown .caption {\\n overflow: hidden;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue = void 0;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root) return \"0\";\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n (_a = elements.get(entry.target)) == null ? void 0 : _a.forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef(onChange);\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a = state.entry) == null ? void 0 : _a.target;\n const previousEntryTarget = React2.useRef(void 0);\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView\n};\n//# sourceMappingURL=index.mjs.map","import * as React from 'react';\n\nimport { useFormatter } from '@/context/FormatterContext';\n\ninterface TimeStampProps {\n time: number;\n}\n\nexport const TimeStamp: React.FC<TimeStampProps> = ({ time }) => {\n const { formatTimestamp } = useFormatter();\n return <div className=\"time\">{formatTimestamp(time)}</div>;\n};\n","import * as React from 'react';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\n\nimport { HighlightedText } from '../../text/HighlightedText';\n\ninterface MessageTextProps {\n message: API.Message;\n emojify: boolean;\n user?: API.HubUser;\n label?: string;\n highlightMenuProps: UI.MessageActionMenuData;\n}\n\nexport const MessageText: React.FC<MessageTextProps> = ({\n emojify,\n message,\n user,\n label,\n highlightMenuProps,\n ...other\n}) => (\n <div className=\"text\">\n {!!label && <span className=\"label\">{`${label}: `}</span>}\n <HighlightedText\n emojify={emojify}\n text={message.text}\n highlights={message.highlights}\n user={user}\n menuProps={highlightMenuProps}\n {...other}\n />\n </div>\n);\n","import * as React from 'react';\nimport { InView } from 'react-intersection-observer';\n\nimport { UserMenu } from '@/components/action-menu';\n\nimport * as API from '@/types/api';\n\nimport MenuConstants from '@/constants/MenuConstants';\nimport { CommonMessageProps } from '../types';\nimport { TimeStamp } from './Timestamp';\nimport { MessageText } from './MessageText';\nimport classNames from 'classnames';\n\ninterface AuthorProps {\n message: API.ChatMessage;\n dropdownContext: string;\n}\n\n// Message sections\nconst Author: React.FC<AuthorProps> = ({ message, dropdownContext }) => (\n <div className=\"header author\">\n {message.third_person && <span>*</span>}\n <UserMenu\n contextElement={dropdownContext}\n triggerIcon={null}\n user={message.from}\n remoteMenuId={MenuConstants.HUB_USER}\n entity={message.from.hub_session_id}\n />\n </div>\n);\n\ninterface ChatMessageProps extends CommonMessageProps {\n message: API.ChatMessage;\n dropdownContext: string;\n}\n\n// Main message types\nclass ChatMessage extends React.Component<ChatMessageProps> {\n shouldComponentUpdate() {\n return false;\n }\n\n render() {\n const { message, dropdownContext, highlightMenuProps, ...other } = this.props;\n\n return (\n <InView\n className={classNames('ui item chat', message.from.flags.join(' '))}\n {...other}\n >\n <TimeStamp time={message.time} />\n <div\n className={classNames('left', message.third_person ? 'third-person' : 'normal')}\n >\n <Author message={message} dropdownContext={dropdownContext} />\n <MessageText\n message={message}\n emojify={true}\n user={message.from}\n highlightMenuProps={highlightMenuProps}\n />\n </div>\n </InView>\n );\n }\n}\n\nexport { ChatMessage };\n","import classNames from 'classnames';\nimport { Component } from 'react';\nimport { InView } from 'react-intersection-observer';\n\nimport Icon from '@/components/semantic/Icon';\nimport IconConstants from '@/constants/IconConstants';\n\nimport * as API from '@/types/api';\n\nimport { CommonMessageProps } from '../types';\nimport { MessageText } from './MessageText';\nimport { TimeStamp } from './Timestamp';\n\nconst getSeverityIcon = (severity: API.SeverityEnum) => {\n switch (severity) {\n case API.SeverityEnum.VERBOSE:\n return IconConstants.VERBOSE;\n case API.SeverityEnum.INFO:\n return IconConstants.INFO + ' circle';\n case API.SeverityEnum.WARNING:\n return IconConstants.WARNING;\n case API.SeverityEnum.ERROR:\n return IconConstants.ERROR;\n default:\n return '';\n }\n};\n\ninterface StatusMessageProps extends CommonMessageProps {\n message: API.StatusMessage;\n}\n\nclass StatusMessage extends Component<StatusMessageProps> {\n shouldComponentUpdate() {\n return false;\n }\n\n render() {\n const { message, highlightMenuProps, ...other } = this.props;\n return (\n <InView\n className={classNames('ui item status', message.severity, message.type)}\n {...other}\n >\n <Icon icon={getSeverityIcon(message.severity)} />\n {message.time > 0 && <TimeStamp time={message.time} />}\n <MessageText\n label={message.label}\n message={message}\n emojify={false}\n highlightMenuProps={highlightMenuProps}\n />\n </InView>\n );\n }\n}\n\nexport { StatusMessage };\n","import * as React from 'react';\n\nimport { ChatMessage, StatusMessage } from '../message';\n\nimport * as UI from '@/types/ui';\nimport { CommonMessageProps } from '../types';\n\ninterface MessageListItemProps extends CommonMessageProps {\n id: string;\n message: UI.MessageListItem;\n}\n\nexport const MessageListItem: React.FC<MessageListItemProps> = ({\n message,\n ...other\n}) => {\n if (message.chat_message) {\n return (\n <ChatMessage\n message={message.chat_message}\n dropdownContext={other.highlightMenuProps.boundary}\n {...other}\n />\n );\n } else if (message.log_message) {\n return <StatusMessage message={message.log_message} {...other} />;\n }\n\n return null;\n};\n","import * as React from 'react';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\n\nimport Icon from '@/components/semantic/Icon';\nimport IconConstants from '@/constants/IconConstants';\nimport { useFormatter } from '@/context/FormatterContext';\n\nconst getMessageDay = (listItem: UI.MessageListItem) => {\n const message = !!listItem.chat_message ? listItem.chat_message : listItem.log_message;\n return message && new Date(message.time * 1000).getDate();\n};\n\nconst isToday = (message: UI.MessageListItem) => {\n return getMessageDay(message) === new Date().getDate();\n};\n\nconst isHistoryItem = (listItem: UI.MessageListItem) => {\n if (listItem.log_message) {\n return listItem.log_message.type === API.StatusMessageTypeEnum.HISTORY;\n }\n\n return false;\n};\n\nexport const showDateDivider = (index: number, messageList: UI.MessageListItem[]) => {\n const currentMessage = messageList[index];\n\n // First message? History log won't count\n if (index === 0 || (index === 1 && isHistoryItem(messageList[index - 1]))) {\n // Don't show for message that were received today\n if (!isToday(currentMessage) && !isHistoryItem(currentMessage)) {\n return true;\n }\n\n return false;\n }\n\n return getMessageDay(messageList[index - 1]) !== getMessageDay(currentMessage);\n};\n\ninterface MessageListDateDividerProps {\n time: number;\n}\n\nexport const MessageListDateDivider: React.FC<MessageListDateDividerProps> = ({\n time,\n}) => {\n const { formatCalendarTime } = useFormatter();\n return (\n <div key={`divider${time}`} className=\"ui horizontal date divider\">\n <Icon icon={IconConstants.DATE} />\n {formatCalendarTime(time)}\n </div>\n );\n};\n","import { useMemo } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { getListMessageId, getListMessageIdString } from '@/utils/MessageUtils';\r\n\r\nimport { MessageListItem } from '../list/MessageListItem';\r\nimport { MessageListDateDivider, showDateDivider } from '../list/MessageListDateDivider';\r\n\r\nimport { ItemDownloadManager } from '../../../effects/ItemDownloadManager';\r\nimport { UIInstanceId, useUIInstance } from '@/context/InstanceContext';\r\n\r\ninterface MessageItemData {\r\n entity: UI.SessionItemBase | undefined;\r\n onMessageVisibilityChanged: (id: number, inView: boolean) => void;\r\n addDownload: UI.AddItemDownload;\r\n highlightRemoteMenuId: string | undefined;\r\n scrollable: HTMLDivElement | null;\r\n instanceId: UIInstanceId;\r\n}\r\n\r\nconst reduceMessageListItem = (\r\n {\r\n entity,\r\n onMessageVisibilityChanged,\r\n addDownload,\r\n highlightRemoteMenuId,\r\n scrollable,\r\n instanceId,\r\n }: MessageItemData,\r\n reduced: React.ReactNode[],\r\n message: UI.MessageListItem,\r\n index: number,\r\n messageList: UI.MessageListItem[],\r\n) => {\r\n // Push a divider when the date was changed\r\n if (showDateDivider(index, messageList)) {\r\n const messageObj = !!message.chat_message\r\n ? message.chat_message\r\n : message.log_message;\r\n if (!!messageObj) {\r\n reduced.push(\r\n <MessageListDateDivider key={`divider${messageObj.id}`} time={messageObj.time} />,\r\n );\r\n }\r\n }\r\n\r\n // Push message\r\n const id = getListMessageId(message)!;\r\n reduced.push(\r\n <MessageListItem\r\n key={id}\r\n id={getListMessageIdString(id, instanceId)}\r\n onChange={(inView) => {\r\n onMessageVisibilityChanged(id, inView);\r\n }}\r\n threshold={0.4}\r\n root={scrollable}\r\n message={message}\r\n // Highlight menus must use table action menu because the text element has overflow: hidden\r\n // to allow long words to be cut (author action menu can still use the regular dropdown)\r\n highlightMenuProps={{\r\n addDownload,\r\n entity,\r\n remoteMenuId: highlightRemoteMenuId,\r\n boundary: '.message-section',\r\n // Determining the position is somewhat complex since the number of remote menu items isn't known at this point\r\n // Only use the boundary for now, could be improved later...\r\n // position: index < 4 ? 'bottom left' : 'top left',\r\n }}\r\n />,\r\n );\r\n\r\n return reduced;\r\n};\r\n\r\ninterface Props {\r\n messages: UI.MessageListItem[] | null;\r\n chatSession: UI.SessionItemBase | undefined;\r\n highlightRemoteMenuId: string | undefined;\r\n}\r\n\r\nexport const useMessagesNode = (\r\n { highlightRemoteMenuId, messages, chatSession }: Props,\r\n downloadManager: ItemDownloadManager<UI.DownloadableItemInfo, Props>,\r\n scrollable: HTMLDivElement | null,\r\n) => {\r\n const instanceId = useUIInstance();\r\n const visibleItems = useMemo(() => new Set<number>(), [chatSession]);\r\n\r\n const onMessageVisibilityChanged = (id: number, inView: boolean) => {\r\n if (!inView) {\r\n // console.log(`Remove view item ${id}`);\r\n visibleItems.delete(id);\r\n } else {\r\n // console.log(`Add view item ${id}`);\r\n visibleItems.add(id);\r\n }\r\n };\r\n\r\n const messageNodes = useMemo(() => {\r\n if (!messages) {\r\n return null;\r\n }\r\n\r\n return messages.reduce(\r\n reduceMessageListItem.bind(null, {\r\n highlightRemoteMenuId,\r\n entity: chatSession,\r\n onMessageVisibilityChanged,\r\n addDownload: downloadManager.addDownloadItem,\r\n scrollable,\r\n instanceId,\r\n }),\r\n [],\r\n );\r\n }, [messages]);\r\n\r\n return {\r\n messageNodes,\r\n visibleItems,\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!./messages.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!./messages.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 Loader from '@/components/semantic/Loader';\r\n\r\nimport { useMessageViewScrollEffect } from '@/effects';\r\nimport { useMessagesNode } from './effects/MessageNodeManager';\r\nimport { useItemDownloadManager } from '../../effects/ItemDownloadManager';\r\nimport { translate } from '@/utils/TranslationUtils';\r\n\r\nimport DownloadDialog from '@/components/download/DownloadDialog';\r\n\r\nimport * as UI from '@/types/ui';\r\n\r\nimport './messages.css';\r\n\r\ninterface MessageViewProps {\r\n messages: UI.MessageListItem[] | null;\r\n chatSession?: UI.SessionItemBase;\r\n className?: string;\r\n scrollPositionHandler: UI.ScrollHandler;\r\n highlightRemoteMenuId?: string;\r\n t: UI.TranslateF;\r\n}\r\n\r\nconst MessageView: React.FC<MessageViewProps> = React.memo(\r\n function MessageView({\r\n className,\r\n t,\r\n messages,\r\n chatSession,\r\n highlightRemoteMenuId,\r\n scrollPositionHandler,\r\n }) {\r\n // Can't use ref because we need to re-run the scroll hooks when the element is available\r\n const [scrollable, setScrollable] = React.useState<HTMLDivElement | null>(null);\r\n const downloadManager = useItemDownloadManager(chatSession);\r\n const { messageNodes, visibleItems } = useMessagesNode(\r\n {\r\n highlightRemoteMenuId,\r\n messages,\r\n chatSession,\r\n },\r\n downloadManager,\r\n scrollable,\r\n );\r\n\r\n useMessageViewScrollEffect(\r\n { messages, scrollPositionHandler, chatSession },\r\n visibleItems,\r\n scrollable,\r\n );\r\n\r\n return (\r\n <div\r\n ref={setScrollable}\r\n className={classNames('message-section', className)}\r\n role=\"article\"\r\n >\r\n {!!messageNodes ? (\r\n <>\r\n <div className=\"ui list message-list\">{messageNodes}</div>\r\n <DownloadDialog {...downloadManager.downloadDialogProps} />\r\n </>\r\n ) : (\r\n <Loader text={translate('Loading messages', t, UI.Modules.COMMON)} />\r\n )}\r\n </div>\r\n );\r\n },\r\n (prevProps, nextProps) => {\r\n return prevProps.messages === nextProps.messages;\r\n },\r\n);\r\n\r\nexport default MessageView;\r\n","import { useMemo } from 'react';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nexport interface ItemDownloadManager<\r\n ItemT extends UI.DownloadableItemInfo,\r\n PropsT extends object,\r\n> {\r\n addDownloadItem: UI.AddItemDownload<ItemT, PropsT>;\r\n downloadDialogProps: UI.ItemDownloadHandler<ItemT, PropsT>;\r\n}\r\n\r\nexport const useItemDownloadManager = <\r\n ItemT extends UI.DownloadableItemInfo,\r\n PropsT extends object,\r\n>(\r\n sessionItem: UI.SessionItemBase | undefined,\r\n) => {\r\n const downloadManager = useMemo<ItemDownloadManager<ItemT, PropsT>>(() => {\r\n const downloads: { [key in string]: UI.ItemDownloadHandler<ItemT, PropsT> } = {};\r\n\r\n const getDownloadItem = (itemId: API.IdType) => {\r\n const item = downloads[itemId];\r\n if (!item) {\r\n throw new Error('Download was not found');\r\n }\r\n\r\n return item;\r\n };\r\n\r\n const ret: ItemDownloadManager<ItemT, PropsT> = {\r\n downloadDialogProps: {\r\n downloadHandler: (itemData, downloadData, socket) => {\r\n return getDownloadItem(itemData.itemInfo.id).downloadHandler(\r\n itemData,\r\n downloadData,\r\n socket,\r\n );\r\n },\r\n userGetter: (itemId, props) => {\r\n const userGetter = getDownloadItem(itemId).userGetter;\r\n return !!userGetter ? userGetter(itemId, props) : undefined;\r\n },\r\n itemDataGetter: (itemId, socket) => {\r\n return getDownloadItem(itemId).itemDataGetter(itemId, socket);\r\n },\r\n sessionItem,\r\n },\r\n addDownloadItem: (itemId, itemDownloadHandler) => {\r\n downloads[itemId] = itemDownloadHandler;\r\n },\r\n };\r\n\r\n return ret;\r\n }, []);\r\n\r\n return downloadManager;\r\n};\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","__defProp","Object","defineProperty","__publicField","obj","key","value","enumerable","configurable","writable","__defNormalProp","observerMap","Map","RootIds","WeakMap","rootId","observe","element","callback","options","fallbackInView","window","IntersectionObserver","bounds","getBoundingClientRect","isIntersecting","target","intersectionRatio","threshold","time","boundingClientRect","intersectionRect","rootBounds","observer","elements","keys","sort","filter","map","root","has","set","toString","get","optionsToId","instance","thresholds","entries","forEach","entry","_a","inView","some","trackVisibility","isVisible","Array","isArray","createObserver","callbacks","splice","indexOf","length","delete","unobserve","size","disconnect","InView","constructor","props","super","this","node","triggerOnce","skip","setState","initialInView","observeNode","children","isPlainChildren","onChange","state","componentDidMount","componentDidUpdate","prevProps","rootMargin","delay","componentWillUnmount","_unobserveCb","handleChange","render","ref","handleNode","as","TimeStamp","formatTimestamp","className","MessageText","emojify","message","user","label","highlightMenuProps","other","HighlightedText","text","highlights","menuProps","Author","dropdownContext","third_person","contextElement","triggerIcon","from","remoteMenuId","MenuConstants","HUB_USER","entity","hub_session_id","ChatMessage","shouldComponentUpdate","flags","join","getSeverityIcon","severity","VERBOSE","IconConstants","INFO","WARNING","ERROR","StatusMessage","Component","type","Icon","icon","MessageListItem","chat_message","boundary","log_message","getMessageDay","listItem","Date","getDate","isHistoryItem","HISTORY","MessageListDateDivider","formatCalendarTime","DATE","reduceMessageListItem","onMessageVisibilityChanged","addDownload","highlightRemoteMenuId","scrollable","instanceId","reduced","index","messageList","currentMessage","showDateDivider","messageObj","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","MessageView","messages","chatSession","scrollPositionHandler","setScrollable","downloadManager","sessionItem","useMemo","downloads","getDownloadItem","itemId","item","Error","downloadDialogProps","downloadHandler","itemData","downloadData","socket","itemInfo","userGetter","undefined","itemDataGetter","addDownloadItem","itemDownloadHandler","messageNodes","visibleItems","Set","add","reduce","bind","useMessagesNode","role","DownloadDialog","Loader","t","COMMON","nextProps"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"js/381.3451f45ec53347c5970b.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/messages/messages.css","webpack://airdcpp-webui/./node_modules/react-intersection-observer/dist/index.mjs","webpack://airdcpp-webui/./src/components/messages/message/Timestamp.tsx","webpack://airdcpp-webui/./src/components/messages/message/MessageText.tsx","webpack://airdcpp-webui/./src/components/messages/message/ChatMessage.tsx","webpack://airdcpp-webui/./src/components/messages/message/StatusMessage.tsx","webpack://airdcpp-webui/./src/components/messages/list/MessageListItem.tsx","webpack://airdcpp-webui/./src/components/messages/list/MessageListDateDivider.tsx","webpack://airdcpp-webui/./src/components/messages/effects/MessageNodeManager.tsx","webpack://airdcpp-webui/./src/components/messages/messages.css?1e0d","webpack://airdcpp-webui/./src/components/messages/MessageView.tsx","webpack://airdcpp-webui/./src/effects/ItemDownloadManager.ts"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.message-section {\n flex: 1;\n overflow-y: auto;\n}\n\n.message-list .date.divider i {\n margin-right: 5px;\n}\n\n.message-list .item .text .highlight.link {\n color: #4183c4;\n}\n\n.message-list .item .text .highlight.bold {\n font-weight: bold;\n}\n\n.message-list .item .text .table.dropdown,\n.message-list .item .text .table.dropdown .popup.trigger {\n max-width: 100%;\n}\n\n.message-list .item .text .table.dropdown .caption {\n overflow: hidden;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/messages/messages.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,OAAO;EACP,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,gBAAgB;AAClB\",\"sourcesContent\":[\".message-section {\\n flex: 1;\\n overflow-y: auto;\\n}\\n\\n.message-list .date.divider i {\\n margin-right: 5px;\\n}\\n\\n.message-list .item .text .highlight.link {\\n color: #4183c4;\\n}\\n\\n.message-list .item .text .highlight.bold {\\n font-weight: bold;\\n}\\n\\n.message-list .item .text .table.dropdown,\\n.message-list .item .text .table.dropdown .popup.trigger {\\n max-width: 100%;\\n}\\n\\n.message-list .item .text .table.dropdown .caption {\\n overflow: hidden;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue = void 0;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root) return \"0\";\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n (_a = elements.get(entry.target)) == null ? void 0 : _a.forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef(onChange);\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a = state.entry) == null ? void 0 : _a.target;\n const previousEntryTarget = React2.useRef(void 0);\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView\n};\n//# sourceMappingURL=index.mjs.map","import * as React from 'react';\n\nimport { useFormatter } from '@/context/FormatterContext';\n\ninterface TimeStampProps {\n time: number;\n}\n\nexport const TimeStamp: React.FC<TimeStampProps> = ({ time }) => {\n const { formatTimestamp } = useFormatter();\n return <div className=\"time\">{formatTimestamp(time)}</div>;\n};\n","import * as React from 'react';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\n\nimport { HighlightedText } from '../../text/HighlightedText';\n\ninterface MessageTextProps {\n message: API.Message;\n emojify: boolean;\n user?: API.HubUser;\n label?: string;\n highlightMenuProps: UI.MessageActionMenuData;\n}\n\nexport const MessageText: React.FC<MessageTextProps> = ({\n emojify,\n message,\n user,\n label,\n highlightMenuProps,\n ...other\n}) => (\n <div className=\"text\">\n {!!label && <span className=\"label\">{`${label}: `}</span>}\n <HighlightedText\n emojify={emojify}\n text={message.text}\n highlights={message.highlights}\n user={user}\n menuProps={highlightMenuProps}\n {...other}\n />\n </div>\n);\n","import * as React from 'react';\nimport { InView } from 'react-intersection-observer';\n\nimport { UserMenu } from '@/components/action-menu';\n\nimport * as API from '@/types/api';\n\nimport MenuConstants from '@/constants/MenuConstants';\nimport { CommonMessageProps } from '../types';\nimport { TimeStamp } from './Timestamp';\nimport { MessageText } from './MessageText';\nimport classNames from 'classnames';\n\ninterface AuthorProps {\n message: API.ChatMessage;\n dropdownContext: string;\n}\n\n// Message sections\nconst Author: React.FC<AuthorProps> = ({ message, dropdownContext }) => (\n <div className=\"header author\">\n {message.third_person && <span>*</span>}\n <UserMenu\n contextElement={dropdownContext}\n triggerIcon={null}\n user={message.from}\n remoteMenuId={MenuConstants.HUB_USER}\n entity={message.from.hub_session_id}\n />\n </div>\n);\n\ninterface ChatMessageProps extends CommonMessageProps {\n message: API.ChatMessage;\n dropdownContext: string;\n}\n\n// Main message types\nclass ChatMessage extends React.Component<ChatMessageProps> {\n shouldComponentUpdate() {\n return false;\n }\n\n render() {\n const { message, dropdownContext, highlightMenuProps, ...other } = this.props;\n\n return (\n <InView\n className={classNames('ui item chat', message.from.flags.join(' '))}\n {...other}\n >\n <TimeStamp time={message.time} />\n <div\n className={classNames('left', message.third_person ? 'third-person' : 'normal')}\n >\n <Author message={message} dropdownContext={dropdownContext} />\n <MessageText\n message={message}\n emojify={true}\n user={message.from}\n highlightMenuProps={highlightMenuProps}\n />\n </div>\n </InView>\n );\n }\n}\n\nexport { ChatMessage };\n","import classNames from 'classnames';\nimport { Component } from 'react';\nimport { InView } from 'react-intersection-observer';\n\nimport Icon from '@/components/semantic/Icon';\nimport IconConstants from '@/constants/IconConstants';\n\nimport * as API from '@/types/api';\n\nimport { CommonMessageProps } from '../types';\nimport { MessageText } from './MessageText';\nimport { TimeStamp } from './Timestamp';\n\nconst getSeverityIcon = (severity: API.SeverityEnum) => {\n switch (severity) {\n case API.SeverityEnum.VERBOSE:\n return IconConstants.VERBOSE;\n case API.SeverityEnum.INFO:\n return IconConstants.INFO + ' circle';\n case API.SeverityEnum.WARNING:\n return IconConstants.WARNING;\n case API.SeverityEnum.ERROR:\n return IconConstants.ERROR;\n default:\n return '';\n }\n};\n\ninterface StatusMessageProps extends CommonMessageProps {\n message: API.StatusMessage;\n}\n\nclass StatusMessage extends Component<StatusMessageProps> {\n shouldComponentUpdate() {\n return false;\n }\n\n render() {\n const { message, highlightMenuProps, ...other } = this.props;\n return (\n <InView\n className={classNames('ui item status', message.severity, message.type)}\n {...other}\n >\n <Icon icon={getSeverityIcon(message.severity)} />\n {message.time > 0 && <TimeStamp time={message.time} />}\n <MessageText\n label={message.label}\n message={message}\n emojify={false}\n highlightMenuProps={highlightMenuProps}\n />\n </InView>\n );\n }\n}\n\nexport { StatusMessage };\n","import * as React from 'react';\n\nimport { ChatMessage, StatusMessage } from '../message';\n\nimport * as UI from '@/types/ui';\nimport { CommonMessageProps } from '../types';\n\ninterface MessageListItemProps extends CommonMessageProps {\n id: string;\n message: UI.MessageListItem;\n}\n\nexport const MessageListItem: React.FC<MessageListItemProps> = ({\n message,\n ...other\n}) => {\n if (message.chat_message) {\n return (\n <ChatMessage\n message={message.chat_message}\n dropdownContext={other.highlightMenuProps.boundary}\n {...other}\n />\n );\n } else if (message.log_message) {\n return <StatusMessage message={message.log_message} {...other} />;\n }\n\n return null;\n};\n","import * as React from 'react';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\n\nimport Icon from '@/components/semantic/Icon';\nimport IconConstants from '@/constants/IconConstants';\nimport { useFormatter } from '@/context/FormatterContext';\n\nconst getMessageDay = (listItem: UI.MessageListItem) => {\n const message = !!listItem.chat_message ? listItem.chat_message : listItem.log_message;\n return message && new Date(message.time * 1000).getDate();\n};\n\nconst isToday = (message: UI.MessageListItem) => {\n return getMessageDay(message) === new Date().getDate();\n};\n\nconst isHistoryItem = (listItem: UI.MessageListItem) => {\n if (listItem.log_message) {\n return listItem.log_message.type === API.StatusMessageTypeEnum.HISTORY;\n }\n\n return false;\n};\n\nexport const showDateDivider = (index: number, messageList: UI.MessageListItem[]) => {\n const currentMessage = messageList[index];\n\n // First message? History log won't count\n if (index === 0 || (index === 1 && isHistoryItem(messageList[index - 1]))) {\n // Don't show for message that were received today\n if (!isToday(currentMessage) && !isHistoryItem(currentMessage)) {\n return true;\n }\n\n return false;\n }\n\n return getMessageDay(messageList[index - 1]) !== getMessageDay(currentMessage);\n};\n\ninterface MessageListDateDividerProps {\n time: number;\n}\n\nexport const MessageListDateDivider: React.FC<MessageListDateDividerProps> = ({\n time,\n}) => {\n const { formatCalendarTime } = useFormatter();\n return (\n <div key={`divider${time}`} className=\"ui horizontal date divider\">\n <Icon icon={IconConstants.DATE} />\n {formatCalendarTime(time)}\n </div>\n );\n};\n","import { useMemo } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { getListMessageId, getListMessageIdString } from '@/utils/MessageUtils';\r\n\r\nimport { MessageListItem } from '../list/MessageListItem';\r\nimport { MessageListDateDivider, showDateDivider } from '../list/MessageListDateDivider';\r\n\r\nimport { ItemDownloadManager } from '../../../effects/ItemDownloadManager';\r\nimport { UIInstanceId, useUIInstance } from '@/context/InstanceContext';\r\n\r\ninterface MessageItemData {\r\n entity: UI.SessionItemBase | undefined;\r\n onMessageVisibilityChanged: (id: number, inView: boolean) => void;\r\n addDownload: UI.AddItemDownload;\r\n highlightRemoteMenuId: string | undefined;\r\n scrollable: HTMLDivElement | null;\r\n instanceId: UIInstanceId;\r\n}\r\n\r\nconst reduceMessageListItem = (\r\n {\r\n entity,\r\n onMessageVisibilityChanged,\r\n addDownload,\r\n highlightRemoteMenuId,\r\n scrollable,\r\n instanceId,\r\n }: MessageItemData,\r\n reduced: React.ReactNode[],\r\n message: UI.MessageListItem,\r\n index: number,\r\n messageList: UI.MessageListItem[],\r\n) => {\r\n // Push a divider when the date was changed\r\n if (showDateDivider(index, messageList)) {\r\n const messageObj = !!message.chat_message\r\n ? message.chat_message\r\n : message.log_message;\r\n if (!!messageObj) {\r\n reduced.push(\r\n <MessageListDateDivider key={`divider${messageObj.id}`} time={messageObj.time} />,\r\n );\r\n }\r\n }\r\n\r\n // Push message\r\n const id = getListMessageId(message)!;\r\n reduced.push(\r\n <MessageListItem\r\n key={id}\r\n id={getListMessageIdString(id, instanceId)}\r\n onChange={(inView) => {\r\n onMessageVisibilityChanged(id, inView);\r\n }}\r\n threshold={0.4}\r\n root={scrollable}\r\n message={message}\r\n // Highlight menus must use table action menu because the text element has overflow: hidden\r\n // to allow long words to be cut (author action menu can still use the regular dropdown)\r\n highlightMenuProps={{\r\n addDownload,\r\n entity,\r\n remoteMenuId: highlightRemoteMenuId,\r\n boundary: '.message-section',\r\n // Determining the position is somewhat complex since the number of remote menu items isn't known at this point\r\n // Only use the boundary for now, could be improved later...\r\n // position: index < 4 ? 'bottom left' : 'top left',\r\n }}\r\n />,\r\n );\r\n\r\n return reduced;\r\n};\r\n\r\ninterface Props {\r\n messages: UI.MessageListItem[] | null;\r\n chatSession: UI.SessionItemBase | undefined;\r\n highlightRemoteMenuId: string | undefined;\r\n}\r\n\r\nexport const useMessagesNode = (\r\n { highlightRemoteMenuId, messages, chatSession }: Props,\r\n downloadManager: ItemDownloadManager<UI.DownloadableItemInfo, Props>,\r\n scrollable: HTMLDivElement | null,\r\n) => {\r\n const instanceId = useUIInstance();\r\n const visibleItems = useMemo(() => new Set<number>(), [chatSession]);\r\n\r\n const onMessageVisibilityChanged = (id: number, inView: boolean) => {\r\n if (!inView) {\r\n // console.log(`Remove view item ${id}`);\r\n visibleItems.delete(id);\r\n } else {\r\n // console.log(`Add view item ${id}`);\r\n visibleItems.add(id);\r\n }\r\n };\r\n\r\n const messageNodes = useMemo(() => {\r\n if (!messages) {\r\n return null;\r\n }\r\n\r\n return messages.reduce(\r\n reduceMessageListItem.bind(null, {\r\n highlightRemoteMenuId,\r\n entity: chatSession,\r\n onMessageVisibilityChanged,\r\n addDownload: downloadManager.addDownloadItem,\r\n scrollable,\r\n instanceId,\r\n }),\r\n [],\r\n );\r\n }, [messages]);\r\n\r\n return {\r\n messageNodes,\r\n visibleItems,\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!./messages.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!./messages.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 Loader from '@/components/semantic/Loader';\r\n\r\nimport { useMessageViewScrollEffect } from '@/effects';\r\nimport { useMessagesNode } from './effects/MessageNodeManager';\r\nimport { useItemDownloadManager } from '../../effects/ItemDownloadManager';\r\nimport { translate } from '@/utils/TranslationUtils';\r\n\r\nimport DownloadDialog from '@/components/download/DownloadDialog';\r\n\r\nimport * as UI from '@/types/ui';\r\n\r\nimport './messages.css';\r\n\r\ninterface MessageViewProps {\r\n messages: UI.MessageListItem[] | null;\r\n chatSession?: UI.SessionItemBase;\r\n className?: string;\r\n scrollPositionHandler: UI.ScrollHandler;\r\n highlightRemoteMenuId?: string;\r\n t: UI.TranslateF;\r\n}\r\n\r\nconst MessageView: React.FC<MessageViewProps> = React.memo(\r\n function MessageView({\r\n className,\r\n t,\r\n messages,\r\n chatSession,\r\n highlightRemoteMenuId,\r\n scrollPositionHandler,\r\n }) {\r\n // Can't use ref because we need to re-run the scroll hooks when the element is available\r\n const [scrollable, setScrollable] = React.useState<HTMLDivElement | null>(null);\r\n const downloadManager = useItemDownloadManager(chatSession);\r\n const { messageNodes, visibleItems } = useMessagesNode(\r\n {\r\n highlightRemoteMenuId,\r\n messages,\r\n chatSession,\r\n },\r\n downloadManager,\r\n scrollable,\r\n );\r\n\r\n useMessageViewScrollEffect(\r\n { messages, scrollPositionHandler, chatSession },\r\n visibleItems,\r\n scrollable,\r\n );\r\n\r\n return (\r\n <div\r\n ref={setScrollable}\r\n className={classNames('message-section', className)}\r\n role=\"article\"\r\n >\r\n {!!messageNodes ? (\r\n <>\r\n <div className=\"ui list message-list\">{messageNodes}</div>\r\n <DownloadDialog {...downloadManager.downloadDialogProps} />\r\n </>\r\n ) : (\r\n <Loader text={translate('Loading messages', t, UI.Modules.COMMON)} />\r\n )}\r\n </div>\r\n );\r\n },\r\n (prevProps, nextProps) => {\r\n return prevProps.messages === nextProps.messages;\r\n },\r\n);\r\n\r\nexport default MessageView;\r\n","import { useMemo } from 'react';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nexport interface ItemDownloadManager<\r\n ItemT extends UI.DownloadableItemInfo,\r\n PropsT extends object,\r\n> {\r\n addDownloadItem: UI.AddItemDownload<ItemT, PropsT>;\r\n downloadDialogProps: UI.ItemDownloadHandler<ItemT, PropsT>;\r\n}\r\n\r\nexport const useItemDownloadManager = <\r\n ItemT extends UI.DownloadableItemInfo,\r\n PropsT extends object,\r\n>(\r\n sessionItem: UI.SessionItemBase | undefined,\r\n) => {\r\n const downloadManager = useMemo<ItemDownloadManager<ItemT, PropsT>>(() => {\r\n const downloads: { [key in string]: UI.ItemDownloadHandler<ItemT, PropsT> } = {};\r\n\r\n const getDownloadItem = (itemId: API.IdType) => {\r\n const item = downloads[itemId];\r\n if (!item) {\r\n throw new Error('Download was not found');\r\n }\r\n\r\n return item;\r\n };\r\n\r\n const ret: ItemDownloadManager<ItemT, PropsT> = {\r\n downloadDialogProps: {\r\n downloadHandler: (itemData, downloadData, socket) => {\r\n return getDownloadItem(itemData.itemInfo.id).downloadHandler(\r\n itemData,\r\n downloadData,\r\n socket,\r\n );\r\n },\r\n userGetter: (itemId, props) => {\r\n const userGetter = getDownloadItem(itemId).userGetter;\r\n return !!userGetter ? userGetter(itemId, props) : undefined;\r\n },\r\n itemDataGetter: (itemId, socket) => {\r\n return getDownloadItem(itemId).itemDataGetter(itemId, socket);\r\n },\r\n sessionItem,\r\n },\r\n addDownloadItem: (itemId, itemDownloadHandler) => {\r\n downloads[itemId] = itemDownloadHandler;\r\n },\r\n };\r\n\r\n return ret;\r\n }, []);\r\n\r\n return downloadManager;\r\n};\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","__defProp","Object","defineProperty","__publicField","obj","key","value","enumerable","configurable","writable","__defNormalProp","observerMap","Map","RootIds","WeakMap","rootId","observe","element","callback","options","fallbackInView","window","IntersectionObserver","bounds","getBoundingClientRect","isIntersecting","target","intersectionRatio","threshold","time","boundingClientRect","intersectionRect","rootBounds","observer","elements","keys","sort","filter","map","root","has","set","toString","get","optionsToId","instance","thresholds","entries","forEach","entry","_a","inView","some","trackVisibility","isVisible","Array","isArray","createObserver","callbacks","splice","indexOf","length","delete","unobserve","size","disconnect","InView","constructor","props","super","this","node","triggerOnce","skip","setState","initialInView","observeNode","children","isPlainChildren","onChange","state","componentDidMount","componentDidUpdate","prevProps","rootMargin","delay","componentWillUnmount","_unobserveCb","handleChange","render","ref","handleNode","as","TimeStamp","formatTimestamp","className","MessageText","emojify","message","user","label","highlightMenuProps","other","HighlightedText","text","highlights","menuProps","Author","dropdownContext","third_person","contextElement","triggerIcon","from","remoteMenuId","MenuConstants","HUB_USER","entity","hub_session_id","ChatMessage","shouldComponentUpdate","flags","join","getSeverityIcon","severity","VERBOSE","IconConstants","INFO","WARNING","ERROR","StatusMessage","Component","type","Icon","icon","MessageListItem","chat_message","boundary","log_message","getMessageDay","listItem","Date","getDate","isHistoryItem","HISTORY","MessageListDateDivider","formatCalendarTime","DATE","reduceMessageListItem","onMessageVisibilityChanged","addDownload","highlightRemoteMenuId","scrollable","instanceId","reduced","index","messageList","currentMessage","showDateDivider","messageObj","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","MessageView","messages","chatSession","scrollPositionHandler","setScrollable","downloadManager","sessionItem","useMemo","downloads","getDownloadItem","itemId","item","Error","downloadDialogProps","downloadHandler","itemData","downloadData","socket","itemInfo","userGetter","undefined","itemDataGetter","addDownloadItem","itemDownloadHandler","messageNodes","visibleItems","Set","add","reduce","bind","useMessagesNode","role","DownloadDialog","Loader","t","COMMON","nextProps"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[544],{20082:(e,n,o)=>{o.d(n,{A:()=>d});var a=o(71354),t=o.n(a),l=o(76314),s=o.n(l)()(t());s.push([e.id,".download-dialog .accordion.download-targets {\n overflow-y: auto;\n}\n\n.download-dialog .main-content,\n.download-dialog .mobile.layout {\n display: flex;\n flex-direction: column;\n}\n\n.download-dialog .main-content .list {\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.download-dialog .content > div,\n.download-dialog .ui.grid .column,\n.download-dialog .main-content {\n height: 100%;\n}\n\n.download-dialog .download-handler {\n display: flex;\n align-items: baseline;\n}\n\n.download-dialog .disk-info {\n color: black;\n font-size: 90%;\n font-style: italic;\n}\n\n.download-dialog .normal.layout .four.wide.column {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n","",{version:3,sources:["webpack://./src/components/download/style.css"],names:[],mappings:"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,aAAa;EACb,qBAAqB;AACvB;;AAEA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AAChC",sourcesContent:[".download-dialog .accordion.download-targets {\n overflow-y: auto;\n}\n\n.download-dialog .main-content,\n.download-dialog .mobile.layout {\n display: flex;\n flex-direction: column;\n}\n\n.download-dialog .main-content .list {\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.download-dialog .content > div,\n.download-dialog .ui.grid .column,\n.download-dialog .main-content {\n height: 100%;\n}\n\n.download-dialog .download-handler {\n display: flex;\n align-items: baseline;\n}\n\n.download-dialog .disk-info {\n color: black;\n font-size: 90%;\n font-style: italic;\n}\n\n.download-dialog .normal.layout .four.wide.column {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n"],sourceRoot:""}]);const d=s},53213:(e,n,o)=>{o.d(n,{G:()=>t});var a=o(93226);const t=(e,n,o)=>e.post(`${a.Ay.STRINGS_URL}/${n}`,{string:o})},73070:(e,n,o)=>{o.d(n,{Y9:()=>h,fI:()=>c,xA:()=>m});var a=o(74848),t=(o(96540),o(46942)),l=o.n(t),s=o(32389),d=o(42695),i=o(67749);const r=e=>e||(0,a.jsx)(s.x6,{i18nKey:(0,d.j2)("na",i.KV.COMMON),children:"N/A"}),c=({title:e,text:n,className:o,titleWidth:t="four",noText:s})=>(0,a.jsxs)("div",{className:l()("ui row",o),children:[(0,a.jsx)("div",{className:l()(s?"sixteen":t,"wide column title"),children:(0,a.jsx)("div",{className:"ui tiny header",style:{overflow:"hidden"},children:e})}),!s&&(0,a.jsx)("div",{className:"column value",children:r(n)})]}),h=({title:e})=>(0,a.jsx)("div",{className:"ui row",children:(0,a.jsx)("div",{className:"sixteen wide column",children:(0,a.jsx)("div",{className:"ui blue section header",children:e})})}),m=e=>{var{className:n,children:o,columns:t,stackable:s}=e,d=function(e,n){var o={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&n.indexOf(a)<0&&(o[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var t=0;for(a=Object.getOwnPropertySymbols(e);t<a.length;t++)n.indexOf(a[t])<0&&Object.prototype.propertyIsEnumerable.call(e,a[t])&&(o[a[t]]=e[a[t]])}return o}(e,["className","children","columns","stackable"]);return(0,a.jsx)("div",Object.assign({className:l()("ui grid",{[`${t} column`]:!!t},{stackable:s},n)},d,{children:o}))}},79179:(e,n,o)=>{o.d(n,{A:()=>t});const a="favorite_directories",t={MODULE_URL:a,GROUPED_DIRECTORIES_URL:a+"/grouped_paths",DIRECTORIES_URL:a,DIRECTORIES_UPDATED:"favorite_directories_updated"}},88544:(e,n,o)=>{o.d(n,{A:()=>re});var a=o(74848),t=o(96540),l=o(3322),s=o(32389),d=o(93226),i=o(59315),r=o(4425),c=o(88939),h=o(56484),m=o(65385),u=o(99671),A=o(47603),p=o(36076),w=o(42695),f=o(53213),y=o(33968),x=o(8098),v=o(42191),j=o(79179),O=o(27725),g=o(67749),b=o(32728),E=o(83994),C=o(74416),N=o(50489);const I=(e,n,{formatSize:o})=>e.free_space<=0?e.path:` (${n((0,w.j2)("spaceFree",g.KV.COMMON),{defaultValue:"{{freeSpace}} free",replace:{freeSpace:o(e.free_space)}})})`,P=({pathInfo:e,downloadHandler:n,t:o})=>{const t=(0,C.k)();return(0,a.jsxs)("div",{className:"item",children:[(0,a.jsx)(E.A,{icon:r.A.FOLDER}),(0,a.jsx)("div",{className:"content",children:(0,a.jsxs)(N.A,{onClick:()=>n(e.path),"aria-label":e.path,children:[e.path,(0,a.jsx)("span",{className:"disk-info",children:I(e,o,t)})]})})]})},k=(0,h.A)(function({downloadHandler:e,pathInfos:n,t:o}){return(0,a.jsx)("div",{className:"ui relaxed list",children:n.map(n=>(0,a.jsx)(P,{pathInfo:n,downloadHandler:e,t:o},n.path))})},{urls:{pathInfos:({paths:e},n)=>n.post(i.A.DISK_INFO_URL,{paths:e})}}),B=e=>0===e.paths.length?(0,a.jsx)(b.A,{title:(0,w.Tl)("No paths to display",e.t,g.KV.COMMON)}):(0,a.jsx)(k,Object.assign({},e));var D=o(78340);class R extends t.Component{constructor(){super(...arguments),this.formatParent=(e,n)=>{const{downloadHandler:o,t:l}=this.props;return(0,a.jsxs)(t.Fragment,{children:[(0,a.jsxs)(D.J6,{id:e.name,index:n,children:[(0,a.jsx)(E.A,{icon:r.A.DROPDOWN}),e.name]}),(0,a.jsx)(D.ub,{id:e.name,index:n,children:(0,a.jsx)(B,{paths:e.paths,downloadHandler:o,t:l})})]},e.name)}}render(){const{groupedPaths:e,t:n}=this.props;return 0===e.length?(0,a.jsx)(b.A,{title:(0,w.Tl)("No paths to display",n,g.KV.COMMON)}):(0,a.jsx)(D.Ay,{className:"styled download-targets",children:e.map(this.formatParent)})}}const _=R;var S=o(90425);const M=(e,n,o)=>n?[...e,(0,a.jsxs)(O.A,{onClick:n,children:[(0,w.Tl)("Browse",o,g.KV.COMMON),(0,a.jsx)(E.A,{icon:r.A.BROWSE})]},"browse")]:e,T=({menuItems:e,title:n,handleBrowse:o,t,children:l})=>(0,a.jsxs)("div",{className:"mobile layout",children:[(0,a.jsx)(S.A,{selection:!0,caption:n,children:M(e,o,t)}),(0,a.jsx)("div",{className:"ui segment main-content",children:l})]});var H=o(96529),L=o(73070);const V=({menuItems:e,title:n,handleBrowse:o,t,children:l})=>(0,a.jsxs)(L.xA,{className:"normal layout",children:[(0,a.jsxs)("div",{className:"four wide column",children:[(0,a.jsx)("div",{className:"ui vertical fluid tabular menu",role:"navigation","aria-label":"Download sections",children:(0,a.jsx)("div",{role:"tablist",children:e})}),!!o&&(0,a.jsx)(H.A,{className:"fluid basic",caption:(0,w.Tl)("Browse",t,g.KV.COMMON),onClick:o,icon:r.A.BROWSE})]}),(0,a.jsx)("div",{className:"twelve wide stretched column",children:(0,a.jsx)("div",{className:"ui segment main-content",children:l})})]}),U=e=>`download-panel-${e}`,F=e=>`download-tab-${e}`,K=(0,h.A)(e=>{const{t:n}=(0,s.Bd)(),[o,l]=(0,t.useState)("history"),d=t.useMemo(()=>{const{historyPaths:n,sharePaths:o,favoritePaths:t,itemInfo:l}=e;return(e=>{const{sharePaths:n,favoritePaths:o,historyPaths:t,dupePaths:l}=e;return[{name:"Previous",key:"history",list:t,component:({downloadHandler:e,t:n})=>(0,a.jsx)(B,{paths:t,downloadHandler:e,t:n})},{name:"Shared",key:"shared",list:n,component:({downloadHandler:e,t:o})=>(0,a.jsx)(_,{groupedPaths:n,downloadHandler:e,t:o})},{name:"Favorites",key:"favorites",list:o,component:({downloadHandler:e,t:n})=>(0,a.jsx)(_,{groupedPaths:o,downloadHandler:e,t:n})},{name:"Dupes",key:"dupes",list:l,component:({downloadHandler:e,t:n})=>(0,a.jsx)(B,{paths:l,downloadHandler:e,t:n})}]})({historyPaths:n,sharePaths:o,favoritePaths:t,dupePaths:l.dupe?l.dupe.paths.map(e=>(0,y._6)(e)):[]})},[]),i=d.find(e=>e.key===o);if(!i)return null;const r=d.map(e=>((e,n,o,t)=>{const l=t((0,w.j2)(e.key,g.KV.COMMON),e.name);return(0,a.jsx)(O.A,{onClick:()=>o(e.key),active:n===e.key,id:F(e.key),role:"tab","aria-controls":U(e.key),"aria-label":l,children:(0,a.jsxs)(a.Fragment,{children:[l,!!e.list&&(0,a.jsx)("div",{className:"ui small label",children:e.list.length})]})},e.key)})(e,o,l,n)),c=(0,x.vU)()?T:V;return(0,a.jsx)(c,{menuItems:r,title:i.name,handleBrowse:e.handleBrowse,t:n,children:(0,a.jsx)("div",{role:"tabpanel",id:U(i.key),"aria-labelledby":F(i.key),children:(0,a.jsx)(i.component,{t:n,downloadHandler:e.downloadHandler})})},i.key)},{urls:{sharePaths:v.A.GROUPED_ROOTS_GET_URL,favoritePaths:j.A.GROUPED_DIRECTORIES_URL}});var G=o(86038),W=o(85072),$=o.n(W),Y=o(97825),q=o.n(Y),z=o(77659),Z=o.n(z),J=o(55056),Q=o.n(J),X=o(10540),ee=o.n(X),ne=o(41113),oe=o.n(ne),ae=o(20082),te={};te.styleTagTransform=oe(),te.setAttributes=Q(),te.insert=Z().bind(null,"head"),te.domAPI=q(),te.insertStyleElement=ee(),$()(ae.A,te),ae.A&&ae.A.locals&&ae.A.locals;var le=o(39364),se=o(48249),de=o(70756),ie=function(e,n,o,a){return new(o||(o=Promise))(function(t,l){function s(e){try{i(a.next(e))}catch(e){l(e)}}function d(e){try{i(a.throw(e))}catch(e){l(e)}}function i(e){var n;e.done?t(e.value):(n=e.value,n instanceof o?n:new o(function(e){e(n)})).then(s,d)}i((a=a.apply(e,n||[])).next())})};const re=(0,m.A)((0,h.A)(e=>{const{t:n}=(0,s.Bd)(),o=(0,l.Zp)(),t=(0,le.wV)(),h=(0,se.F)(),{downloadHandler:m,itemInfo:x,userGetter:v,params:j,sessionItem:O,historyPaths:b,handleClose:E}=e,C=function(e,n){var o={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&n.indexOf(a)<0&&(o[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var t=0;for(a=Object.getOwnPropertySymbols(e);t<a.length;t++)n.indexOf(a[t])<0&&Object.prototype.propertyIsEnumerable.call(e,a[t])&&(o[a[t]]=e[a[t]])}return o}(e,["downloadHandler","itemInfo","userGetter","params","sessionItem","historyPaths","handleClose"]),N=(o,a)=>ie(void 0,void 0,void 0,function*(){try{const n={itemInfo:x,user:v?v(j.downloadItemId,e):void 0,entity:O},t={target_name:a||x.name,target_directory:o,priority:G.Fm.DEFAULT};yield m(n,t,h)}catch(e){c.A.error({title:n((0,w.j2)("queueingFailed",g.KV.COMMON),{defaultValue:"Failed to queue the item {{item.name}}",replace:{item:x}}),message:e.message})}(0,p.bd)(()=>(0,f.G)(h,d.n2.DOWNLOAD_DIR,o),n)}),I={subHeader:x.name,title:(0,w.Tl)("Download",n,g.KV.COMMON),icon:r.A.DOWNLOAD,closable:!1},P=(0,de.z)(t,G.US.FILESYSTEM_VIEW);return(0,a.jsxs)(l.BV,{children:[(0,a.jsx)(l.qh,{path:"browse/*",element:(0,a.jsx)(A.d,Object.assign({onConfirm:e=>ie(void 0,void 0,void 0,function*(){yield N((0,y.oK)(e),(0,y.WP)(e))}),initialPath:(()=>{const e=b.length>0?b[b.length-1]:"";return"directory"===x.type.id?e:e+x.name})(),selectMode:"directory"===x.type.id?g.bV.DIRECTORY:g.bV.FILE,historyId:i.A.LOCATION_DOWNLOAD,approveCaption:(0,w.Tl)("Download",n,g.KV.COMMON),modalComponent:u.A},I))}),(0,a.jsx)(l.qh,{index:!0,element:(0,a.jsx)(u.A,Object.assign({className:"download-dialog",fullHeight:!0},I,C,{children:(0,a.jsx)(K,{downloadHandler:(e,n)=>ie(void 0,void 0,void 0,function*(){yield N(e,n),yield E()}),handleBrowse:P?()=>{o("browse")}:void 0,historyPaths:b,itemInfo:x})}))})]})},{urls:{historyPaths:`${d.Ay.STRINGS_URL}/${d.n2.DOWNLOAD_DIR}`,itemInfo:({params:e,itemDataGetter:n},o)=>n(e.downloadItemId,o)}}),"/download/:downloadItemId")}}]);
|
|
2
|
-
//# sourceMappingURL=544.
|
|
2
|
+
//# sourceMappingURL=544.e7ebc14895b0324a3c8c.chunk.js.map
|
package/dist/js/{544.2cd91849513cb11c9998.chunk.js.gz → 544.e7ebc14895b0324a3c8c.chunk.js.gz}
RENAMED
|
Binary file
|
package/dist/js/{544.2cd91849513cb11c9998.chunk.js.map → 544.e7ebc14895b0324a3c8c.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js/544.2cd91849513cb11c9998.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/download/style.css","webpack://airdcpp-webui/./src/services/api/HistoryApi.ts","webpack://airdcpp-webui/./src/components/semantic/Grid.tsx","webpack://airdcpp-webui/./src/constants/FavoriteDirectoryConstants.ts","webpack://airdcpp-webui/./src/components/download/layout/sections/PathListItem.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/PathList.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/AccordionTargets.tsx","webpack://airdcpp-webui/./src/components/download/layout/MobileDownloadLayout.tsx","webpack://airdcpp-webui/./src/components/download/layout/NormalDownloadLayout.tsx","webpack://airdcpp-webui/./src/components/download/layout/DownloadView.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/sections.tsx","webpack://airdcpp-webui/./src/components/download/style.css?6643","webpack://airdcpp-webui/./src/components/download/DownloadDialog.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.download-dialog .accordion.download-targets {\n overflow-y: auto;\n}\n\n.download-dialog .main-content,\n.download-dialog .mobile.layout {\n display: flex;\n flex-direction: column;\n}\n\n.download-dialog .main-content .list {\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.download-dialog .content > div,\n.download-dialog .ui.grid .column,\n.download-dialog .main-content {\n height: 100%;\n}\n\n.download-dialog .download-handler {\n display: flex;\n align-items: baseline;\n}\n\n.download-dialog .disk-info {\n color: black;\n font-size: 90%;\n font-style: italic;\n}\n\n.download-dialog .normal.layout .four.wide.column {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/download/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,aAAa;EACb,qBAAqB;AACvB;;AAEA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AAChC\",\"sourcesContent\":[\".download-dialog .accordion.download-targets {\\n overflow-y: auto;\\n}\\n\\n.download-dialog .main-content,\\n.download-dialog .mobile.layout {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.download-dialog .main-content .list {\\n overflow-y: auto;\\n overflow-x: hidden;\\n}\\n\\n.download-dialog .content > div,\\n.download-dialog .ui.grid .column,\\n.download-dialog .main-content {\\n height: 100%;\\n}\\n\\n.download-dialog .download-handler {\\n display: flex;\\n align-items: baseline;\\n}\\n\\n.download-dialog .disk-info {\\n color: black;\\n font-size: 90%;\\n font-style: italic;\\n}\\n\\n.download-dialog .normal.layout .four.wide.column {\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { APISocket } from '@/services/SocketService';\nimport HistoryConstants from '@/constants/HistoryConstants';\n\nexport const addHistory = (socket: APISocket, historyId: string, text: string) => {\n return socket.post(`${HistoryConstants.STRINGS_URL}/${historyId}`, {\n string: text,\n });\n};\n","import * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport { Trans } from 'react-i18next';\r\nimport { toI18nKey } from '@/utils/TranslationUtils';\r\n\r\nimport * as UI from '@/types/ui';\r\n\r\nexport interface RowProps {\r\n title: React.ReactNode;\r\n text?: React.ReactNode;\r\n titleWidth?: string;\r\n className?: string;\r\n noText?: boolean;\r\n}\r\n\r\nconst formatText = (text: React.ReactNode) => {\r\n if (!!text) {\r\n return text;\r\n }\r\n\r\n return <Trans i18nKey={toI18nKey('na', UI.Modules.COMMON)}>N/A</Trans>;\r\n};\r\n\r\nexport const Row: React.FC<RowProps> = ({\r\n title,\r\n text,\r\n className,\r\n titleWidth = 'four',\r\n noText,\r\n}) => (\r\n <div className={classNames('ui row', className)}>\r\n <div className={classNames(noText ? 'sixteen' : titleWidth, 'wide column title')}>\r\n <div className=\"ui tiny header\" style={{ overflow: 'hidden' }}>\r\n {title}\r\n </div>\r\n </div>\r\n {!noText && <div className=\"column value\">{formatText(text)}</div>}\r\n </div>\r\n);\r\n\r\nexport interface HeaderProps {\r\n title: React.ReactNode;\r\n}\r\n\r\nexport const Header: React.FC<HeaderProps> = ({ title }) => (\r\n <div className=\"ui row\">\r\n <div className=\"sixteen wide column\">\r\n <div className=\"ui blue section header\">{title}</div>\r\n </div>\r\n </div>\r\n);\r\n\r\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\r\n columns?: string;\r\n stackable?: boolean;\r\n}\r\n\r\nexport const Grid: React.FC<GridProps> = ({\r\n className,\r\n children,\r\n columns,\r\n stackable,\r\n ...other\r\n}) => (\r\n <div\r\n className={classNames(\r\n 'ui grid',\r\n //`${columns} column`,\r\n { [`${columns} column`]: !!columns },\r\n { stackable: stackable },\r\n className,\r\n )}\r\n {...other}\r\n >\r\n {children}\r\n </div>\r\n);\r\n","const MODULE_URL = 'favorite_directories';\nexport default {\n MODULE_URL: MODULE_URL,\n\n GROUPED_DIRECTORIES_URL: MODULE_URL + '/grouped_paths',\n DIRECTORIES_URL: MODULE_URL,\n\n DIRECTORIES_UPDATED: 'favorite_directories_updated',\n};\n","import * as React from 'react';\n\nimport IconConstants from '@/constants/IconConstants';\n\nimport Icon from '@/components/semantic/Icon';\n\nimport { toI18nKey } from '@/utils/TranslationUtils';\nimport { Formatter, useFormatter } from '@/context/FormatterContext';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\nimport { PathDownloadHandler } from '../../types';\nimport LinkButton from '@/components/semantic/LinkButton';\n\ninterface PathItemProps {\n pathInfo: API.DiskSpaceInfo;\n downloadHandler: PathDownloadHandler;\n t: UI.TranslateF;\n}\n\nconst formatFreeSpace = (\n pathInfo: API.DiskSpaceInfo,\n t: UI.TranslateF,\n { formatSize }: Formatter,\n) => {\n if (pathInfo.free_space <= 0) {\n return pathInfo.path;\n }\n\n return ` (${t(toI18nKey('spaceFree', UI.Modules.COMMON), {\n defaultValue: '{{freeSpace}} free',\n replace: {\n freeSpace: formatSize(pathInfo.free_space),\n },\n })})`;\n};\n\nexport const PathListItem: React.FC<PathItemProps> = ({\n pathInfo,\n downloadHandler,\n t,\n}) => {\n const formatter = useFormatter();\n return (\n <div className=\"item\">\n <Icon icon={IconConstants.FOLDER} />\n <div className=\"content\">\n <LinkButton\n onClick={() => downloadHandler(pathInfo.path)}\n aria-label={pathInfo.path}\n >\n {pathInfo.path}\n <span className=\"disk-info\">{formatFreeSpace(pathInfo, t, formatter)}</span>\n </LinkButton>\n </div>\n </div>\n );\n};\n","import FilesystemConstants from '@/constants/FilesystemConstants';\r\n\r\nimport DataProviderDecorator from '@/decorators/DataProviderDecorator';\r\n\r\nimport Message from '@/components/semantic/Message';\r\n\r\nimport { translate } from '@/utils/TranslationUtils';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { PathDownloadHandler } from '../../types';\r\nimport { PathListItem } from './PathListItem';\r\n\r\ninterface PathListProps {\r\n // Function handling the path selection\r\n downloadHandler: PathDownloadHandler;\r\n\r\n // Array of paths to list\r\n paths: string[];\r\n t: UI.TranslateF;\r\n}\r\n\r\ninterface PathListDataProps {\r\n pathInfos: API.DiskSpaceInfo[];\r\n}\r\n\r\nconst PathListWithData = DataProviderDecorator<PathListProps, PathListDataProps>(\r\n function PathList({ downloadHandler, pathInfos, t }) {\r\n return (\r\n <div className=\"ui relaxed list\">\r\n {pathInfos.map((pathInfo) => (\r\n <PathListItem\r\n key={pathInfo.path}\r\n pathInfo={pathInfo}\r\n downloadHandler={downloadHandler}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n );\r\n },\r\n {\r\n urls: {\r\n pathInfos: ({ paths }, socket) =>\r\n socket.post(FilesystemConstants.DISK_INFO_URL, { paths }),\r\n },\r\n },\r\n);\r\n\r\nconst PathList: React.FC<PathListProps> = (props) => {\r\n if (props.paths.length === 0) {\r\n return (\r\n <Message title={translate('No paths to display', props.t, UI.Modules.COMMON)} />\r\n );\r\n }\r\n\r\n return <PathListWithData {...props} />;\r\n};\r\n\r\nexport default PathList;\r\n","import React, { Component } from 'react';\n\nimport IconConstants from '@/constants/IconConstants';\n\nimport Accordion, {\n AccordionContent,\n AccordionTitle,\n} from '@/components/semantic/Accordion';\nimport Icon from '@/components/semantic/Icon';\nimport Message from '@/components/semantic/Message';\n\nimport { translate } from '@/utils/TranslationUtils';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\nimport { PathDownloadHandler } from '../../types';\n\nimport PathList from './PathList';\n\ninterface AccordionTargetsProps {\n // Grouped paths to list\n groupedPaths: API.GroupedPath[];\n\n // Function handling the path selection. Receives the selected path as argument.\n downloadHandler: PathDownloadHandler;\n\n t: UI.TranslateF;\n}\n\nclass AccordionTargets extends Component<AccordionTargetsProps> {\n formatParent = (parent: API.GroupedPath, index: number) => {\n const { downloadHandler, t } = this.props;\n return (\n <React.Fragment key={parent.name}>\n <AccordionTitle id={parent.name} index={index}>\n <Icon icon={IconConstants.DROPDOWN} />\n {parent.name}\n </AccordionTitle>\n\n <AccordionContent id={parent.name} index={index}>\n <PathList paths={parent.paths} downloadHandler={downloadHandler} t={t} />\n </AccordionContent>\n </React.Fragment>\n );\n };\n\n render() {\n const { groupedPaths, t } = this.props;\n if (groupedPaths.length === 0) {\n return <Message title={translate('No paths to display', t, UI.Modules.COMMON)} />;\n }\n\n return (\n <Accordion className=\"styled download-targets\">\n {groupedPaths.map(this.formatParent)}\n </Accordion>\n );\n }\n}\n\nexport default AccordionTargets;\n","import * as React from 'react';\r\n\r\nimport { translate } from '@/utils/TranslationUtils';\r\n\r\nimport Dropdown from '@/components/semantic/Dropdown';\r\nimport MenuItemLink from '@/components/semantic/MenuItemLink';\r\n\r\nimport * as UI from '@/types/ui';\r\n\r\nimport Icon from '@/components/semantic/Icon';\r\nimport { BrowseHandler, DownloadLayoutProps } from '../types';\r\nimport IconConstants from '@/constants/IconConstants';\r\n\r\nconst appendBrowseItem = (\r\n menuItems: React.ReactNode[],\r\n handleBrowse: BrowseHandler,\r\n t: UI.TranslateF,\r\n) => {\r\n if (!handleBrowse) {\r\n return menuItems;\r\n }\r\n\r\n return [\r\n ...menuItems,\r\n <MenuItemLink key=\"browse\" onClick={handleBrowse}>\r\n {translate('Browse', t, UI.Modules.COMMON)}\r\n <Icon icon={IconConstants.BROWSE} />\r\n </MenuItemLink>,\r\n ];\r\n};\r\n\r\nexport const MobileDownloadLayout: React.FC<DownloadLayoutProps> = ({\r\n menuItems,\r\n title,\r\n handleBrowse,\r\n t,\r\n children,\r\n}) => (\r\n <div className=\"mobile layout\">\r\n <Dropdown selection={true} caption={title}>\r\n {appendBrowseItem(menuItems, handleBrowse, t)}\r\n </Dropdown>\r\n <div className=\"ui segment main-content\">{children}</div>\r\n </div>\r\n);\r\n","import * as React from 'react';\n\nimport IconConstants from '@/constants/IconConstants';\n\nimport { translate } from '@/utils/TranslationUtils';\n\nimport Button from '@/components/semantic/Button';\nimport { Grid } from '@/components/semantic/Grid';\n\nimport * as UI from '@/types/ui';\nimport { DownloadLayoutProps } from '../types';\n\nexport const NormalDownloadLayout: React.FC<DownloadLayoutProps> = ({\n menuItems,\n title,\n handleBrowse,\n t,\n children,\n}) => (\n <Grid className=\"normal layout\">\n <div className=\"four wide column\">\n <div\n className=\"ui vertical fluid tabular menu\"\n role=\"navigation\"\n aria-label=\"Download sections\"\n >\n <div role=\"tablist\">{menuItems}</div>\n </div>\n {!!handleBrowse && (\n <Button\n className=\"fluid basic\"\n caption={translate('Browse', t, UI.Modules.COMMON)}\n onClick={handleBrowse}\n icon={IconConstants.BROWSE}\n />\n )}\n </div>\n <div className=\"twelve wide stretched column\">\n <div className=\"ui segment main-content\">{children}</div>\n </div>\n </Grid>\n);\n","import { useState } from 'react';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { getParentPath } from '@/utils/FileUtils';\r\nimport { usingMobileLayout } from '@/utils/BrowserUtils';\r\nimport { toI18nKey } from '@/utils/TranslationUtils';\r\n\r\nimport ShareConstants from '@/constants/ShareConstants';\r\nimport FavoriteDirectoryConstants from '@/constants/FavoriteDirectoryConstants';\r\n\r\nimport MenuItemLink from '@/components/semantic/MenuItemLink';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { getDownloadSections, DownloadSection } from './sections';\r\nimport { BrowseHandler, PathDownloadHandler } from '../types';\r\n\r\nimport { MobileDownloadLayout } from './MobileDownloadLayout';\r\nimport { NormalDownloadLayout } from './NormalDownloadLayout';\r\nimport DataProviderDecorator from '@/decorators/DataProviderDecorator';\r\n\r\nconst toPanelId = (key: string) => `download-panel-${key}`;\r\nconst toTabId = (key: string) => `download-tab-${key}`;\r\n\r\nexport interface DownloadLayoutDataProps {\r\n sharePaths: API.GroupedPath[];\r\n favoritePaths: API.GroupedPath[];\r\n}\r\n\r\nexport interface DownloadLayoutProps<\r\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo,\r\n> {\r\n downloadHandler: PathDownloadHandler;\r\n handleBrowse: BrowseHandler;\r\n\r\n historyPaths: string[];\r\n itemInfo: ItemT;\r\n}\r\n\r\nconst getMenuItem = (\r\n section: DownloadSection,\r\n activeSection: string,\r\n onClick: (key: string) => void,\r\n t: UI.TranslateF,\r\n) => {\r\n const label = t(toI18nKey(section.key, UI.Modules.COMMON), section.name);\r\n return (\r\n <MenuItemLink\r\n key={section.key}\r\n onClick={() => onClick(section.key)}\r\n active={activeSection === section.key}\r\n id={toTabId(section.key)}\r\n role=\"tab\"\r\n aria-controls={toPanelId(section.key)}\r\n aria-label={label}\r\n >\r\n <>\r\n {label}\r\n {!!section.list && <div className=\"ui small label\">{section.list.length}</div>}\r\n </>\r\n </MenuItemLink>\r\n );\r\n};\r\n\r\ntype Props<ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo> =\r\n DownloadLayoutProps<ItemT> & DownloadLayoutDataProps;\r\n\r\nconst DownloadLayout: React.FC<Props> = (props) => {\r\n const { t } = useTranslation();\r\n const [activeSectionKey, setActiveSectionKey] = useState('history');\r\n\r\n const sections = React.useMemo(() => {\r\n const { historyPaths, sharePaths, favoritePaths, itemInfo } = props;\r\n const dupePaths = itemInfo.dupe\r\n ? itemInfo.dupe.paths.map((path) => getParentPath(path))\r\n : [];\r\n\r\n return getDownloadSections({\r\n historyPaths,\r\n sharePaths,\r\n favoritePaths,\r\n dupePaths,\r\n });\r\n }, []);\r\n\r\n const activeSection = sections.find((s) => s.key === activeSectionKey);\r\n if (!activeSection) {\r\n return null;\r\n }\r\n\r\n const menuItems = sections.map((s) =>\r\n getMenuItem(s, activeSectionKey, setActiveSectionKey, t),\r\n );\r\n\r\n const Component = usingMobileLayout() ? MobileDownloadLayout : NormalDownloadLayout;\r\n\r\n return (\r\n <Component\r\n key={activeSection.key} // Ensure that section-specific data is refetched\r\n menuItems={menuItems}\r\n title={activeSection.name}\r\n handleBrowse={props.handleBrowse}\r\n t={t}\r\n >\r\n <div\r\n role=\"tabpanel\"\r\n id={toPanelId(activeSection.key)}\r\n aria-labelledby={toTabId(activeSection.key)}\r\n >\r\n <activeSection.component t={t} downloadHandler={props.downloadHandler} />\r\n </div>\r\n </Component>\r\n );\r\n};\r\n\r\nconst DownloadLayoutDecorated = DataProviderDecorator<\r\n DownloadLayoutProps,\r\n DownloadLayoutDataProps\r\n>(DownloadLayout, {\r\n urls: {\r\n sharePaths: ShareConstants.GROUPED_ROOTS_GET_URL,\r\n favoritePaths: FavoriteDirectoryConstants.GROUPED_DIRECTORIES_URL,\r\n },\r\n});\r\n\r\nexport { DownloadLayoutDecorated as DownloadLayout };\r\n","import * as React from 'react';\n\nimport PathList from './PathList';\nimport AccordionTargets from './AccordionTargets';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\n\nimport { PathDownloadHandler } from '../../types';\n\nexport interface DownloadSectionChildProps {\n t: UI.TranslateF;\n downloadHandler: PathDownloadHandler;\n}\n\nexport interface DownloadSection {\n name: string;\n key: string;\n list?: string[] | API.GroupedPath[];\n component: React.ComponentType<DownloadSectionChildProps>;\n}\n\ninterface PathInfo {\n sharePaths: API.GroupedPath[];\n favoritePaths: API.GroupedPath[];\n historyPaths: string[];\n dupePaths: string[];\n}\n\nexport const getDownloadSections = (pathInfo: PathInfo) => {\n const { sharePaths, favoritePaths, historyPaths, dupePaths } = pathInfo;\n\n const sections: DownloadSection[] = [\n {\n name: 'Previous',\n key: 'history',\n list: historyPaths,\n component: ({ downloadHandler, t }) => (\n <PathList paths={historyPaths} downloadHandler={downloadHandler} t={t} />\n ),\n },\n {\n name: 'Shared',\n key: 'shared',\n list: sharePaths,\n component: ({ downloadHandler, t }) => (\n <AccordionTargets\n groupedPaths={sharePaths}\n downloadHandler={downloadHandler}\n t={t}\n />\n ),\n },\n {\n name: 'Favorites',\n key: 'favorites',\n list: favoritePaths,\n component: ({ downloadHandler, t }) => (\n <AccordionTargets\n groupedPaths={favoritePaths}\n downloadHandler={downloadHandler}\n t={t}\n />\n ),\n },\n {\n name: 'Dupes',\n key: 'dupes',\n list: dupePaths,\n component: ({ downloadHandler, t }) => (\n <PathList paths={dupePaths} downloadHandler={downloadHandler} t={t} />\n ),\n },\n ];\n\n return sections;\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\r\nimport { Route, Routes, useNavigate } from 'react-router';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport {\r\n default as HistoryConstants,\r\n HistoryStringEnum,\r\n} from '@/constants/HistoryConstants';\r\nimport FilesystemConstants from '@/constants/FilesystemConstants';\r\nimport IconConstants from '@/constants/IconConstants';\r\n\r\nimport NotificationActions from '@/actions/NotificationActions';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from '@/decorators/DataProviderDecorator';\r\nimport ModalRouteDecorator, {\r\n ModalRouteDecoratorChildProps,\r\n} from '@/decorators/ModalRouteDecorator';\r\n\r\nimport RouteModal, { RouteModalProps } from '@/components/semantic/RouteModal';\r\nimport { FileBrowserDialog } from '@/components/filebrowser';\r\n\r\nimport { runBackgroundSocketAction } from '@/utils/ActionUtils';\r\nimport { toI18nKey, translate } from '@/utils/TranslationUtils';\r\nimport { addHistory } from '@/services/api/HistoryApi';\r\n\r\nimport { DownloadLayout } from './layout';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\nimport { PathDownloadHandler } from './types';\r\n\r\nimport './style.css';\r\nimport { useSession } from '@/context/AppStoreContext';\r\nimport { useSocket } from '@/context/SocketContext';\r\nimport { getFileName, getFilePath } from '@/utils/FileUtils';\r\nimport { hasAccess } from '@/utils/AuthUtils';\r\n\r\nexport type DownloadDialogProps<\r\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo,\r\n> = UI.ItemDownloadHandler<ItemT, Props<ItemT>>;\r\n\r\ntype DownloadDialogRouteProps = ModalRouteDecoratorChildProps;\r\n\r\ninterface DownloadDialogDataProps<\r\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo,\r\n> extends DataProviderDecoratorChildProps {\r\n historyPaths: string[];\r\n itemInfo: ItemT;\r\n}\r\n\r\ntype Props<ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo> =\r\n DownloadDialogProps<ItemT> & DownloadDialogDataProps<ItemT> & DownloadDialogRouteProps;\r\n\r\nconst DownloadDialog: React.FC<Props> = (props) => {\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n const session = useSession();\r\n const socket = useSocket();\r\n\r\n const {\r\n downloadHandler,\r\n itemInfo,\r\n userGetter,\r\n params,\r\n sessionItem,\r\n historyPaths,\r\n handleClose,\r\n ...other\r\n } = props;\r\n\r\n const handleDownload: PathDownloadHandler = async (targetPath, targetFilename) => {\r\n try {\r\n const itemData = {\r\n itemInfo,\r\n user: !!userGetter ? userGetter(params.downloadItemId!, props) : undefined,\r\n entity: sessionItem,\r\n };\r\n\r\n const downloadData = {\r\n target_name: !!targetFilename ? targetFilename : itemInfo.name,\r\n target_directory: targetPath,\r\n priority: API.QueuePriorityEnum.DEFAULT,\r\n };\r\n\r\n await downloadHandler(itemData, downloadData, socket);\r\n } catch (e) {\r\n NotificationActions.error({\r\n title: t(toI18nKey('queueingFailed', UI.Modules.COMMON), {\r\n defaultValue: 'Failed to queue the item {{item.name}}',\r\n replace: {\r\n item: itemInfo,\r\n },\r\n }),\r\n message: e.message,\r\n });\r\n }\r\n\r\n runBackgroundSocketAction(\r\n () => addHistory(socket, HistoryStringEnum.DOWNLOAD_DIR, targetPath),\r\n t,\r\n );\r\n };\r\n\r\n const getInitialBrowsePath = () => {\r\n const path = historyPaths.length > 0 ? historyPaths[historyPaths.length - 1] : '';\r\n return itemInfo.type.id === 'directory' ? path : path + itemInfo.name;\r\n };\r\n\r\n const handleBrowse = () => {\r\n navigate(`browse`);\r\n };\r\n\r\n const commonDialogProps: RouteModalProps = {\r\n subHeader: itemInfo.name,\r\n title: translate('Download', t, UI.Modules.COMMON),\r\n icon: IconConstants.DOWNLOAD,\r\n closable: false,\r\n };\r\n\r\n const hasFileBrowserAccess = hasAccess(session, API.AccessEnum.FILESYSTEM_VIEW);\r\n return (\r\n <Routes>\r\n <Route\r\n path=\"browse/*\"\r\n element={\r\n <FileBrowserDialog\r\n onConfirm={async (path) => {\r\n await handleDownload(getFilePath(path), getFileName(path));\r\n }}\r\n initialPath={getInitialBrowsePath()}\r\n selectMode={\r\n itemInfo.type.id === 'directory'\r\n ? UI.FileSelectModeEnum.DIRECTORY\r\n : UI.FileSelectModeEnum.FILE\r\n }\r\n historyId={FilesystemConstants.LOCATION_DOWNLOAD}\r\n approveCaption={translate('Download', t, UI.Modules.COMMON)}\r\n modalComponent={RouteModal}\r\n {...commonDialogProps}\r\n />\r\n }\r\n />\r\n <Route\r\n index\r\n element={\r\n <RouteModal\r\n className=\"download-dialog\"\r\n fullHeight={true}\r\n {...commonDialogProps}\r\n {...other}\r\n >\r\n <DownloadLayout\r\n downloadHandler={async (targetPath, targetFilename) => {\r\n await handleDownload(targetPath, targetFilename);\r\n await handleClose();\r\n }}\r\n handleBrowse={hasFileBrowserAccess ? handleBrowse : undefined}\r\n historyPaths={historyPaths}\r\n itemInfo={itemInfo}\r\n />\r\n </RouteModal>\r\n }\r\n />\r\n </Routes>\r\n );\r\n};\r\n\r\nexport default ModalRouteDecorator<DownloadDialogProps>(\r\n DataProviderDecorator<\r\n DownloadDialogProps & DownloadDialogRouteProps,\r\n DownloadDialogDataProps\r\n >(DownloadDialog, {\r\n urls: {\r\n historyPaths: `${HistoryConstants.STRINGS_URL}/${HistoryStringEnum.DOWNLOAD_DIR}`,\r\n itemInfo: ({ params, itemDataGetter }, socket) => {\r\n return itemDataGetter(params.downloadItemId!, socket);\r\n },\r\n },\r\n }),\r\n '/download/:downloadItemId',\r\n);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","addHistory","socket","historyId","text","post","STRINGS_URL","string","formatText","i18nKey","COMMON","Row","title","className","titleWidth","noText","style","overflow","Header","Grid","children","columns","stackable","other","MODULE_URL","GROUPED_DIRECTORIES_URL","DIRECTORIES_URL","DIRECTORIES_UPDATED","formatFreeSpace","pathInfo","t","formatSize","free_space","path","defaultValue","replace","freeSpace","PathListItem","downloadHandler","formatter","Icon","icon","IconConstants","FOLDER","LinkButton","onClick","PathListWithData","DataProviderDecorator","pathInfos","map","urls","paths","FilesystemConstants","DISK_INFO_URL","props","length","Message","AccordionTargets","Component","formatParent","parent","index","this","Accordion","name","DROPDOWN","render","groupedPaths","appendBrowseItem","menuItems","handleBrowse","MenuItemLink","BROWSE","MobileDownloadLayout","Dropdown","selection","caption","NormalDownloadLayout","role","Button","toPanelId","key","toTabId","DownloadLayoutDecorated","activeSectionKey","setActiveSectionKey","useState","sections","historyPaths","sharePaths","favoritePaths","itemInfo","dupePaths","list","component","getDownloadSections","dupe","activeSection","find","s","section","label","active","getMenuItem","ShareConstants","GROUPED_ROOTS_GET_URL","FavoriteDirectoryConstants","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","ModalRouteDecorator","navigate","session","userGetter","params","sessionItem","handleClose","handleDownload","targetPath","targetFilename","itemData","user","downloadItemId","undefined","entity","downloadData","target_name","target_directory","priority","DEFAULT","e","NotificationActions","error","item","message","DOWNLOAD_DIR","commonDialogProps","subHeader","DOWNLOAD","closable","hasFileBrowserAccess","FILESYSTEM_VIEW","element","onConfirm","initialPath","type","getInitialBrowsePath","selectMode","DIRECTORY","FILE","LOCATION_DOWNLOAD","approveCaption","modalComponent","RouteModal","fullHeight","HistoryConstants","itemDataGetter"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"js/544.e7ebc14895b0324a3c8c.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/download/style.css","webpack://airdcpp-webui/./src/services/api/HistoryApi.ts","webpack://airdcpp-webui/./src/components/semantic/Grid.tsx","webpack://airdcpp-webui/./src/constants/FavoriteDirectoryConstants.ts","webpack://airdcpp-webui/./src/components/download/layout/sections/PathListItem.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/PathList.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/AccordionTargets.tsx","webpack://airdcpp-webui/./src/components/download/layout/MobileDownloadLayout.tsx","webpack://airdcpp-webui/./src/components/download/layout/NormalDownloadLayout.tsx","webpack://airdcpp-webui/./src/components/download/layout/DownloadView.tsx","webpack://airdcpp-webui/./src/components/download/layout/sections/sections.tsx","webpack://airdcpp-webui/./src/components/download/style.css?6643","webpack://airdcpp-webui/./src/components/download/DownloadDialog.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.download-dialog .accordion.download-targets {\n overflow-y: auto;\n}\n\n.download-dialog .main-content,\n.download-dialog .mobile.layout {\n display: flex;\n flex-direction: column;\n}\n\n.download-dialog .main-content .list {\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.download-dialog .content > div,\n.download-dialog .ui.grid .column,\n.download-dialog .main-content {\n height: 100%;\n}\n\n.download-dialog .download-handler {\n display: flex;\n align-items: baseline;\n}\n\n.download-dialog .disk-info {\n color: black;\n font-size: 90%;\n font-style: italic;\n}\n\n.download-dialog .normal.layout .four.wide.column {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/download/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,aAAa;EACb,qBAAqB;AACvB;;AAEA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AAChC\",\"sourcesContent\":[\".download-dialog .accordion.download-targets {\\n overflow-y: auto;\\n}\\n\\n.download-dialog .main-content,\\n.download-dialog .mobile.layout {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.download-dialog .main-content .list {\\n overflow-y: auto;\\n overflow-x: hidden;\\n}\\n\\n.download-dialog .content > div,\\n.download-dialog .ui.grid .column,\\n.download-dialog .main-content {\\n height: 100%;\\n}\\n\\n.download-dialog .download-handler {\\n display: flex;\\n align-items: baseline;\\n}\\n\\n.download-dialog .disk-info {\\n color: black;\\n font-size: 90%;\\n font-style: italic;\\n}\\n\\n.download-dialog .normal.layout .four.wide.column {\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { APISocket } from '@/services/SocketService';\nimport HistoryConstants from '@/constants/HistoryConstants';\n\nexport const addHistory = (socket: APISocket, historyId: string, text: string) => {\n return socket.post(`${HistoryConstants.STRINGS_URL}/${historyId}`, {\n string: text,\n });\n};\n","import * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport { Trans } from 'react-i18next';\r\nimport { toI18nKey } from '@/utils/TranslationUtils';\r\n\r\nimport * as UI from '@/types/ui';\r\n\r\nexport interface RowProps {\r\n title: React.ReactNode;\r\n text?: React.ReactNode;\r\n titleWidth?: string;\r\n className?: string;\r\n noText?: boolean;\r\n}\r\n\r\nconst formatText = (text: React.ReactNode) => {\r\n if (!!text) {\r\n return text;\r\n }\r\n\r\n return <Trans i18nKey={toI18nKey('na', UI.Modules.COMMON)}>N/A</Trans>;\r\n};\r\n\r\nexport const Row: React.FC<RowProps> = ({\r\n title,\r\n text,\r\n className,\r\n titleWidth = 'four',\r\n noText,\r\n}) => (\r\n <div className={classNames('ui row', className)}>\r\n <div className={classNames(noText ? 'sixteen' : titleWidth, 'wide column title')}>\r\n <div className=\"ui tiny header\" style={{ overflow: 'hidden' }}>\r\n {title}\r\n </div>\r\n </div>\r\n {!noText && <div className=\"column value\">{formatText(text)}</div>}\r\n </div>\r\n);\r\n\r\nexport interface HeaderProps {\r\n title: React.ReactNode;\r\n}\r\n\r\nexport const Header: React.FC<HeaderProps> = ({ title }) => (\r\n <div className=\"ui row\">\r\n <div className=\"sixteen wide column\">\r\n <div className=\"ui blue section header\">{title}</div>\r\n </div>\r\n </div>\r\n);\r\n\r\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\r\n columns?: string;\r\n stackable?: boolean;\r\n}\r\n\r\nexport const Grid: React.FC<GridProps> = ({\r\n className,\r\n children,\r\n columns,\r\n stackable,\r\n ...other\r\n}) => (\r\n <div\r\n className={classNames(\r\n 'ui grid',\r\n //`${columns} column`,\r\n { [`${columns} column`]: !!columns },\r\n { stackable: stackable },\r\n className,\r\n )}\r\n {...other}\r\n >\r\n {children}\r\n </div>\r\n);\r\n","const MODULE_URL = 'favorite_directories';\nexport default {\n MODULE_URL: MODULE_URL,\n\n GROUPED_DIRECTORIES_URL: MODULE_URL + '/grouped_paths',\n DIRECTORIES_URL: MODULE_URL,\n\n DIRECTORIES_UPDATED: 'favorite_directories_updated',\n};\n","import * as React from 'react';\n\nimport IconConstants from '@/constants/IconConstants';\n\nimport Icon from '@/components/semantic/Icon';\n\nimport { toI18nKey } from '@/utils/TranslationUtils';\nimport { Formatter, useFormatter } from '@/context/FormatterContext';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\nimport { PathDownloadHandler } from '../../types';\nimport LinkButton from '@/components/semantic/LinkButton';\n\ninterface PathItemProps {\n pathInfo: API.DiskSpaceInfo;\n downloadHandler: PathDownloadHandler;\n t: UI.TranslateF;\n}\n\nconst formatFreeSpace = (\n pathInfo: API.DiskSpaceInfo,\n t: UI.TranslateF,\n { formatSize }: Formatter,\n) => {\n if (pathInfo.free_space <= 0) {\n return pathInfo.path;\n }\n\n return ` (${t(toI18nKey('spaceFree', UI.Modules.COMMON), {\n defaultValue: '{{freeSpace}} free',\n replace: {\n freeSpace: formatSize(pathInfo.free_space),\n },\n })})`;\n};\n\nexport const PathListItem: React.FC<PathItemProps> = ({\n pathInfo,\n downloadHandler,\n t,\n}) => {\n const formatter = useFormatter();\n return (\n <div className=\"item\">\n <Icon icon={IconConstants.FOLDER} />\n <div className=\"content\">\n <LinkButton\n onClick={() => downloadHandler(pathInfo.path)}\n aria-label={pathInfo.path}\n >\n {pathInfo.path}\n <span className=\"disk-info\">{formatFreeSpace(pathInfo, t, formatter)}</span>\n </LinkButton>\n </div>\n </div>\n );\n};\n","import FilesystemConstants from '@/constants/FilesystemConstants';\r\n\r\nimport DataProviderDecorator from '@/decorators/DataProviderDecorator';\r\n\r\nimport Message from '@/components/semantic/Message';\r\n\r\nimport { translate } from '@/utils/TranslationUtils';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { PathDownloadHandler } from '../../types';\r\nimport { PathListItem } from './PathListItem';\r\n\r\ninterface PathListProps {\r\n // Function handling the path selection\r\n downloadHandler: PathDownloadHandler;\r\n\r\n // Array of paths to list\r\n paths: string[];\r\n t: UI.TranslateF;\r\n}\r\n\r\ninterface PathListDataProps {\r\n pathInfos: API.DiskSpaceInfo[];\r\n}\r\n\r\nconst PathListWithData = DataProviderDecorator<PathListProps, PathListDataProps>(\r\n function PathList({ downloadHandler, pathInfos, t }) {\r\n return (\r\n <div className=\"ui relaxed list\">\r\n {pathInfos.map((pathInfo) => (\r\n <PathListItem\r\n key={pathInfo.path}\r\n pathInfo={pathInfo}\r\n downloadHandler={downloadHandler}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n );\r\n },\r\n {\r\n urls: {\r\n pathInfos: ({ paths }, socket) =>\r\n socket.post(FilesystemConstants.DISK_INFO_URL, { paths }),\r\n },\r\n },\r\n);\r\n\r\nconst PathList: React.FC<PathListProps> = (props) => {\r\n if (props.paths.length === 0) {\r\n return (\r\n <Message title={translate('No paths to display', props.t, UI.Modules.COMMON)} />\r\n );\r\n }\r\n\r\n return <PathListWithData {...props} />;\r\n};\r\n\r\nexport default PathList;\r\n","import React, { Component } from 'react';\n\nimport IconConstants from '@/constants/IconConstants';\n\nimport Accordion, {\n AccordionContent,\n AccordionTitle,\n} from '@/components/semantic/Accordion';\nimport Icon from '@/components/semantic/Icon';\nimport Message from '@/components/semantic/Message';\n\nimport { translate } from '@/utils/TranslationUtils';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\nimport { PathDownloadHandler } from '../../types';\n\nimport PathList from './PathList';\n\ninterface AccordionTargetsProps {\n // Grouped paths to list\n groupedPaths: API.GroupedPath[];\n\n // Function handling the path selection. Receives the selected path as argument.\n downloadHandler: PathDownloadHandler;\n\n t: UI.TranslateF;\n}\n\nclass AccordionTargets extends Component<AccordionTargetsProps> {\n formatParent = (parent: API.GroupedPath, index: number) => {\n const { downloadHandler, t } = this.props;\n return (\n <React.Fragment key={parent.name}>\n <AccordionTitle id={parent.name} index={index}>\n <Icon icon={IconConstants.DROPDOWN} />\n {parent.name}\n </AccordionTitle>\n\n <AccordionContent id={parent.name} index={index}>\n <PathList paths={parent.paths} downloadHandler={downloadHandler} t={t} />\n </AccordionContent>\n </React.Fragment>\n );\n };\n\n render() {\n const { groupedPaths, t } = this.props;\n if (groupedPaths.length === 0) {\n return <Message title={translate('No paths to display', t, UI.Modules.COMMON)} />;\n }\n\n return (\n <Accordion className=\"styled download-targets\">\n {groupedPaths.map(this.formatParent)}\n </Accordion>\n );\n }\n}\n\nexport default AccordionTargets;\n","import * as React from 'react';\r\n\r\nimport { translate } from '@/utils/TranslationUtils';\r\n\r\nimport Dropdown from '@/components/semantic/Dropdown';\r\nimport MenuItemLink from '@/components/semantic/MenuItemLink';\r\n\r\nimport * as UI from '@/types/ui';\r\n\r\nimport Icon from '@/components/semantic/Icon';\r\nimport { BrowseHandler, DownloadLayoutProps } from '../types';\r\nimport IconConstants from '@/constants/IconConstants';\r\n\r\nconst appendBrowseItem = (\r\n menuItems: React.ReactNode[],\r\n handleBrowse: BrowseHandler,\r\n t: UI.TranslateF,\r\n) => {\r\n if (!handleBrowse) {\r\n return menuItems;\r\n }\r\n\r\n return [\r\n ...menuItems,\r\n <MenuItemLink key=\"browse\" onClick={handleBrowse}>\r\n {translate('Browse', t, UI.Modules.COMMON)}\r\n <Icon icon={IconConstants.BROWSE} />\r\n </MenuItemLink>,\r\n ];\r\n};\r\n\r\nexport const MobileDownloadLayout: React.FC<DownloadLayoutProps> = ({\r\n menuItems,\r\n title,\r\n handleBrowse,\r\n t,\r\n children,\r\n}) => (\r\n <div className=\"mobile layout\">\r\n <Dropdown selection={true} caption={title}>\r\n {appendBrowseItem(menuItems, handleBrowse, t)}\r\n </Dropdown>\r\n <div className=\"ui segment main-content\">{children}</div>\r\n </div>\r\n);\r\n","import * as React from 'react';\n\nimport IconConstants from '@/constants/IconConstants';\n\nimport { translate } from '@/utils/TranslationUtils';\n\nimport Button from '@/components/semantic/Button';\nimport { Grid } from '@/components/semantic/Grid';\n\nimport * as UI from '@/types/ui';\nimport { DownloadLayoutProps } from '../types';\n\nexport const NormalDownloadLayout: React.FC<DownloadLayoutProps> = ({\n menuItems,\n title,\n handleBrowse,\n t,\n children,\n}) => (\n <Grid className=\"normal layout\">\n <div className=\"four wide column\">\n <div\n className=\"ui vertical fluid tabular menu\"\n role=\"navigation\"\n aria-label=\"Download sections\"\n >\n <div role=\"tablist\">{menuItems}</div>\n </div>\n {!!handleBrowse && (\n <Button\n className=\"fluid basic\"\n caption={translate('Browse', t, UI.Modules.COMMON)}\n onClick={handleBrowse}\n icon={IconConstants.BROWSE}\n />\n )}\n </div>\n <div className=\"twelve wide stretched column\">\n <div className=\"ui segment main-content\">{children}</div>\n </div>\n </Grid>\n);\n","import { useState } from 'react';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { getParentPath } from '@/utils/FileUtils';\r\nimport { usingMobileLayout } from '@/utils/BrowserUtils';\r\nimport { toI18nKey } from '@/utils/TranslationUtils';\r\n\r\nimport ShareConstants from '@/constants/ShareConstants';\r\nimport FavoriteDirectoryConstants from '@/constants/FavoriteDirectoryConstants';\r\n\r\nimport MenuItemLink from '@/components/semantic/MenuItemLink';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\n\r\nimport { getDownloadSections, DownloadSection } from './sections';\r\nimport { BrowseHandler, PathDownloadHandler } from '../types';\r\n\r\nimport { MobileDownloadLayout } from './MobileDownloadLayout';\r\nimport { NormalDownloadLayout } from './NormalDownloadLayout';\r\nimport DataProviderDecorator from '@/decorators/DataProviderDecorator';\r\n\r\nconst toPanelId = (key: string) => `download-panel-${key}`;\r\nconst toTabId = (key: string) => `download-tab-${key}`;\r\n\r\nexport interface DownloadLayoutDataProps {\r\n sharePaths: API.GroupedPath[];\r\n favoritePaths: API.GroupedPath[];\r\n}\r\n\r\nexport interface DownloadLayoutProps<\r\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo,\r\n> {\r\n downloadHandler: PathDownloadHandler;\r\n handleBrowse: BrowseHandler;\r\n\r\n historyPaths: string[];\r\n itemInfo: ItemT;\r\n}\r\n\r\nconst getMenuItem = (\r\n section: DownloadSection,\r\n activeSection: string,\r\n onClick: (key: string) => void,\r\n t: UI.TranslateF,\r\n) => {\r\n const label = t(toI18nKey(section.key, UI.Modules.COMMON), section.name);\r\n return (\r\n <MenuItemLink\r\n key={section.key}\r\n onClick={() => onClick(section.key)}\r\n active={activeSection === section.key}\r\n id={toTabId(section.key)}\r\n role=\"tab\"\r\n aria-controls={toPanelId(section.key)}\r\n aria-label={label}\r\n >\r\n <>\r\n {label}\r\n {!!section.list && <div className=\"ui small label\">{section.list.length}</div>}\r\n </>\r\n </MenuItemLink>\r\n );\r\n};\r\n\r\ntype Props<ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo> =\r\n DownloadLayoutProps<ItemT> & DownloadLayoutDataProps;\r\n\r\nconst DownloadLayout: React.FC<Props> = (props) => {\r\n const { t } = useTranslation();\r\n const [activeSectionKey, setActiveSectionKey] = useState('history');\r\n\r\n const sections = React.useMemo(() => {\r\n const { historyPaths, sharePaths, favoritePaths, itemInfo } = props;\r\n const dupePaths = itemInfo.dupe\r\n ? itemInfo.dupe.paths.map((path) => getParentPath(path))\r\n : [];\r\n\r\n return getDownloadSections({\r\n historyPaths,\r\n sharePaths,\r\n favoritePaths,\r\n dupePaths,\r\n });\r\n }, []);\r\n\r\n const activeSection = sections.find((s) => s.key === activeSectionKey);\r\n if (!activeSection) {\r\n return null;\r\n }\r\n\r\n const menuItems = sections.map((s) =>\r\n getMenuItem(s, activeSectionKey, setActiveSectionKey, t),\r\n );\r\n\r\n const Component = usingMobileLayout() ? MobileDownloadLayout : NormalDownloadLayout;\r\n\r\n return (\r\n <Component\r\n key={activeSection.key} // Ensure that section-specific data is refetched\r\n menuItems={menuItems}\r\n title={activeSection.name}\r\n handleBrowse={props.handleBrowse}\r\n t={t}\r\n >\r\n <div\r\n role=\"tabpanel\"\r\n id={toPanelId(activeSection.key)}\r\n aria-labelledby={toTabId(activeSection.key)}\r\n >\r\n <activeSection.component t={t} downloadHandler={props.downloadHandler} />\r\n </div>\r\n </Component>\r\n );\r\n};\r\n\r\nconst DownloadLayoutDecorated = DataProviderDecorator<\r\n DownloadLayoutProps,\r\n DownloadLayoutDataProps\r\n>(DownloadLayout, {\r\n urls: {\r\n sharePaths: ShareConstants.GROUPED_ROOTS_GET_URL,\r\n favoritePaths: FavoriteDirectoryConstants.GROUPED_DIRECTORIES_URL,\r\n },\r\n});\r\n\r\nexport { DownloadLayoutDecorated as DownloadLayout };\r\n","import * as React from 'react';\n\nimport PathList from './PathList';\nimport AccordionTargets from './AccordionTargets';\n\nimport * as API from '@/types/api';\nimport * as UI from '@/types/ui';\n\nimport { PathDownloadHandler } from '../../types';\n\nexport interface DownloadSectionChildProps {\n t: UI.TranslateF;\n downloadHandler: PathDownloadHandler;\n}\n\nexport interface DownloadSection {\n name: string;\n key: string;\n list?: string[] | API.GroupedPath[];\n component: React.ComponentType<DownloadSectionChildProps>;\n}\n\ninterface PathInfo {\n sharePaths: API.GroupedPath[];\n favoritePaths: API.GroupedPath[];\n historyPaths: string[];\n dupePaths: string[];\n}\n\nexport const getDownloadSections = (pathInfo: PathInfo) => {\n const { sharePaths, favoritePaths, historyPaths, dupePaths } = pathInfo;\n\n const sections: DownloadSection[] = [\n {\n name: 'Previous',\n key: 'history',\n list: historyPaths,\n component: ({ downloadHandler, t }) => (\n <PathList paths={historyPaths} downloadHandler={downloadHandler} t={t} />\n ),\n },\n {\n name: 'Shared',\n key: 'shared',\n list: sharePaths,\n component: ({ downloadHandler, t }) => (\n <AccordionTargets\n groupedPaths={sharePaths}\n downloadHandler={downloadHandler}\n t={t}\n />\n ),\n },\n {\n name: 'Favorites',\n key: 'favorites',\n list: favoritePaths,\n component: ({ downloadHandler, t }) => (\n <AccordionTargets\n groupedPaths={favoritePaths}\n downloadHandler={downloadHandler}\n t={t}\n />\n ),\n },\n {\n name: 'Dupes',\n key: 'dupes',\n list: dupePaths,\n component: ({ downloadHandler, t }) => (\n <PathList paths={dupePaths} downloadHandler={downloadHandler} t={t} />\n ),\n },\n ];\n\n return sections;\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\r\nimport { Route, Routes, useNavigate } from 'react-router';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport {\r\n default as HistoryConstants,\r\n HistoryStringEnum,\r\n} from '@/constants/HistoryConstants';\r\nimport FilesystemConstants from '@/constants/FilesystemConstants';\r\nimport IconConstants from '@/constants/IconConstants';\r\n\r\nimport NotificationActions from '@/actions/NotificationActions';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from '@/decorators/DataProviderDecorator';\r\nimport ModalRouteDecorator, {\r\n ModalRouteDecoratorChildProps,\r\n} from '@/decorators/ModalRouteDecorator';\r\n\r\nimport RouteModal, { RouteModalProps } from '@/components/semantic/RouteModal';\r\nimport { FileBrowserDialog } from '@/components/filebrowser';\r\n\r\nimport { runBackgroundSocketAction } from '@/utils/ActionUtils';\r\nimport { toI18nKey, translate } from '@/utils/TranslationUtils';\r\nimport { addHistory } from '@/services/api/HistoryApi';\r\n\r\nimport { DownloadLayout } from './layout';\r\n\r\nimport * as API from '@/types/api';\r\nimport * as UI from '@/types/ui';\r\nimport { PathDownloadHandler } from './types';\r\n\r\nimport './style.css';\r\nimport { useSession } from '@/context/AppStoreContext';\r\nimport { useSocket } from '@/context/SocketContext';\r\nimport { getFileName, getFilePath } from '@/utils/FileUtils';\r\nimport { hasAccess } from '@/utils/AuthUtils';\r\n\r\nexport type DownloadDialogProps<\r\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo,\r\n> = UI.ItemDownloadHandler<ItemT, Props<ItemT>>;\r\n\r\ntype DownloadDialogRouteProps = ModalRouteDecoratorChildProps;\r\n\r\ninterface DownloadDialogDataProps<\r\n ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo,\r\n> extends DataProviderDecoratorChildProps {\r\n historyPaths: string[];\r\n itemInfo: ItemT;\r\n}\r\n\r\ntype Props<ItemT extends UI.DownloadableItemInfo = UI.DownloadableItemInfo> =\r\n DownloadDialogProps<ItemT> & DownloadDialogDataProps<ItemT> & DownloadDialogRouteProps;\r\n\r\nconst DownloadDialog: React.FC<Props> = (props) => {\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n const session = useSession();\r\n const socket = useSocket();\r\n\r\n const {\r\n downloadHandler,\r\n itemInfo,\r\n userGetter,\r\n params,\r\n sessionItem,\r\n historyPaths,\r\n handleClose,\r\n ...other\r\n } = props;\r\n\r\n const handleDownload: PathDownloadHandler = async (targetPath, targetFilename) => {\r\n try {\r\n const itemData = {\r\n itemInfo,\r\n user: !!userGetter ? userGetter(params.downloadItemId!, props) : undefined,\r\n entity: sessionItem,\r\n };\r\n\r\n const downloadData = {\r\n target_name: !!targetFilename ? targetFilename : itemInfo.name,\r\n target_directory: targetPath,\r\n priority: API.QueuePriorityEnum.DEFAULT,\r\n };\r\n\r\n await downloadHandler(itemData, downloadData, socket);\r\n } catch (e) {\r\n NotificationActions.error({\r\n title: t(toI18nKey('queueingFailed', UI.Modules.COMMON), {\r\n defaultValue: 'Failed to queue the item {{item.name}}',\r\n replace: {\r\n item: itemInfo,\r\n },\r\n }),\r\n message: e.message,\r\n });\r\n }\r\n\r\n runBackgroundSocketAction(\r\n () => addHistory(socket, HistoryStringEnum.DOWNLOAD_DIR, targetPath),\r\n t,\r\n );\r\n };\r\n\r\n const getInitialBrowsePath = () => {\r\n const path = historyPaths.length > 0 ? historyPaths[historyPaths.length - 1] : '';\r\n return itemInfo.type.id === 'directory' ? path : path + itemInfo.name;\r\n };\r\n\r\n const handleBrowse = () => {\r\n navigate(`browse`);\r\n };\r\n\r\n const commonDialogProps: RouteModalProps = {\r\n subHeader: itemInfo.name,\r\n title: translate('Download', t, UI.Modules.COMMON),\r\n icon: IconConstants.DOWNLOAD,\r\n closable: false,\r\n };\r\n\r\n const hasFileBrowserAccess = hasAccess(session, API.AccessEnum.FILESYSTEM_VIEW);\r\n return (\r\n <Routes>\r\n <Route\r\n path=\"browse/*\"\r\n element={\r\n <FileBrowserDialog\r\n onConfirm={async (path) => {\r\n await handleDownload(getFilePath(path), getFileName(path));\r\n }}\r\n initialPath={getInitialBrowsePath()}\r\n selectMode={\r\n itemInfo.type.id === 'directory'\r\n ? UI.FileSelectModeEnum.DIRECTORY\r\n : UI.FileSelectModeEnum.FILE\r\n }\r\n historyId={FilesystemConstants.LOCATION_DOWNLOAD}\r\n approveCaption={translate('Download', t, UI.Modules.COMMON)}\r\n modalComponent={RouteModal}\r\n {...commonDialogProps}\r\n />\r\n }\r\n />\r\n <Route\r\n index\r\n element={\r\n <RouteModal\r\n className=\"download-dialog\"\r\n fullHeight={true}\r\n {...commonDialogProps}\r\n {...other}\r\n >\r\n <DownloadLayout\r\n downloadHandler={async (targetPath, targetFilename) => {\r\n await handleDownload(targetPath, targetFilename);\r\n await handleClose();\r\n }}\r\n handleBrowse={hasFileBrowserAccess ? handleBrowse : undefined}\r\n historyPaths={historyPaths}\r\n itemInfo={itemInfo}\r\n />\r\n </RouteModal>\r\n }\r\n />\r\n </Routes>\r\n );\r\n};\r\n\r\nexport default ModalRouteDecorator<DownloadDialogProps>(\r\n DataProviderDecorator<\r\n DownloadDialogProps & DownloadDialogRouteProps,\r\n DownloadDialogDataProps\r\n >(DownloadDialog, {\r\n urls: {\r\n historyPaths: `${HistoryConstants.STRINGS_URL}/${HistoryStringEnum.DOWNLOAD_DIR}`,\r\n itemInfo: ({ params, itemDataGetter }, socket) => {\r\n return itemDataGetter(params.downloadItemId!, socket);\r\n },\r\n },\r\n }),\r\n '/download/:downloadItemId',\r\n);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","addHistory","socket","historyId","text","post","STRINGS_URL","string","formatText","i18nKey","COMMON","Row","title","className","titleWidth","noText","style","overflow","Header","Grid","children","columns","stackable","other","MODULE_URL","GROUPED_DIRECTORIES_URL","DIRECTORIES_URL","DIRECTORIES_UPDATED","formatFreeSpace","pathInfo","t","formatSize","free_space","path","defaultValue","replace","freeSpace","PathListItem","downloadHandler","formatter","Icon","icon","IconConstants","FOLDER","LinkButton","onClick","PathListWithData","DataProviderDecorator","pathInfos","map","urls","paths","FilesystemConstants","DISK_INFO_URL","props","length","Message","AccordionTargets","Component","formatParent","parent","index","this","Accordion","name","DROPDOWN","render","groupedPaths","appendBrowseItem","menuItems","handleBrowse","MenuItemLink","BROWSE","MobileDownloadLayout","Dropdown","selection","caption","NormalDownloadLayout","role","Button","toPanelId","key","toTabId","DownloadLayoutDecorated","activeSectionKey","setActiveSectionKey","useState","sections","historyPaths","sharePaths","favoritePaths","itemInfo","dupePaths","list","component","getDownloadSections","dupe","activeSection","find","s","section","label","active","getMenuItem","ShareConstants","GROUPED_ROOTS_GET_URL","FavoriteDirectoryConstants","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","ModalRouteDecorator","navigate","session","userGetter","params","sessionItem","handleClose","handleDownload","targetPath","targetFilename","itemData","user","downloadItemId","undefined","entity","downloadData","target_name","target_directory","priority","DEFAULT","e","NotificationActions","error","item","message","DOWNLOAD_DIR","commonDialogProps","subHeader","DOWNLOAD","closable","hasFileBrowserAccess","FILESYSTEM_VIEW","element","onConfirm","initialPath","type","getInitialBrowsePath","selectMode","DIRECTORY","FILE","LOCATION_DOWNLOAD","approveCaption","modalComponent","RouteModal","fullHeight","HistoryConstants","itemDataGetter"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[550],{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}`)})},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})]})},46510:(n,e,s)=>{s.d(e,{A:()=>a});var i=s(71354),t=s.n(i),o=s(76314),r=s.n(o)()(t());r.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 span.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.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 span.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.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 a=r},78046:(n,e,s)=>{s.d(e,{Z:()=>c});var i=s(74848),t=(s(96540),s(99347)),o=s(67749),r=s(32389),a=s(42695),A=s(3322),l=s(97145);const c=(n,e,s)=>c=>{const{t:d}=(0,r.Bd)(),m=(0,a.lw)(d,s),u=(0,A.g)(),p=(0,l.c7)(n=>e(n).sessions);return p?(0,i.jsx)(n,{items:p,params:u,sessionT:m}):(0,i.jsx)(t.A,{text:(0,a.Tl)("Loading sessions",d,o.KV.COMMON)})}},80783:(n,e,s)=>{s.d(e,{q:()=>l});var i=s(96540),t=s(97145),o=s(48249),r=s(39364),a=s(80377),A=s(35106);const l=(n,e,s,l=!1)=>{const c=(0,r.sL)(),d=(0,o.F)(),m=(0,t.c7)(n=>n.activity.userActive),u=(0,t.c7)(n=>s(n).setActiveSession),p=i.useRef(void 0),h=n=>{(0,A.m)(n,()=>{e.setRead(n,d)}),p.current=void 0};i.useEffect(()=>()=>{u(null)},[]),i.useEffect(()=>(u(n),()=>{p.current&&(clearTimeout(p.current),n&&h(n))}),[n.id]),i.useEffect(()=>{m&&(n=>{const e=l?1e3*c.getState().settings.getValue(a.x.UNREAD_LABEL_DELAY):0;p.current=window.setTimeout(()=>h(n),e)})(n)},[m,n.id])}},91950:(n,e,s)=>{s.d(e,{A:()=>sn});var i=s(74848),t=s(96540),o=s(99347),r=s(8098),a=s(68514),A=s(31104),l=s(19247),c=s(25906),d=s(67749),m=s(42695),u=s(4425),p=s(32389),h=s(97145);const g=({sessionMenuItemsGetter:n,newButtonGetter:e,sessionStoreSelector:s,listActionMenuGetter:t})=>{const{t:o}=(0,p.Bd)(),r=(0,h.c7)(n=>s(n).getTotalUrgencies),a=n({role:"menuitem"}),u=e({role:"menuitem"});return(0,i.jsxs)(A.A,{triggerIcon:(0,i.jsx)(c.Z,{label:"Session menu",urgencies:r()}),children:[(0,i.jsx)(l.A,{caption:(0,m.Tl)("New",o,d.KV.COMMON),children:u}),(0,i.jsx)(l.A,{caption:(0,m.Tl)("Current sessions",o,d.KV.COMMON),children:a}),(0,i.jsx)(l.A,{children:t()})]})},E=({actions:n,activeItem:e})=>{if(!e||(0,r.vU)())return null;const s=Object.values(n.actions)[Object.values(n.actions).length-1];return(0,i.jsx)(a.A,{className:"basic small item close-button",action:s,moduleData:n.moduleData,itemData:e,icon:u.A.CLOSE})},f=({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)(g,Object.assign({},t)),(0,i.jsx)(f,Object.assign({},t))]}),(0,i.jsx)(E,Object.assign({},t))]}),(0,i.jsx)("div",{className:"session-layout",children:e})]})};var x=s(31224),v=s(73070);const C="session-content-panel",w=({sessionMenuItemsGetter:n,newButtonGetter:e,itemHeaderIcon:s,itemHeaderTitle:t,children:o,itemHeaderDescription:a,onKeyDown:A})=>{const l=e({role:"tab","aria-controls":C,className:"ui fluid button"}),c=n(Object.assign({role:"tab","aria-controls":C},r.DE));return(0,i.jsxs)(v.xA,{className:"session-container horizontal",onKeyDown:A,children:[(0,i.jsxs)("nav",{className:"four wide column menu-column","aria-label":"Session items",children:[l,!!c.length&&(0,i.jsx)("div",{className:"ui vertical secondary menu",role:"tablist","aria-orientation":"vertical",children:c})]}),(0,i.jsx)("div",{id:C,role:"tabpanel",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:t}),subHeader:a}),(0,i.jsx)("div",{className:"ui divider",style:{margin:"5px 0px 0px 0px"}}),o]})})]})};var b=s(32728),y=s(18220),j=s(3322),O=s(20311),I=s.n(O);const N=({baseUrl:n})=>{const e=(0,j.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})}}};var S=s(48249);const z=(n,e)=>n.find(n=>n.id===e);var k=s(71352),T=s(46942),M=s.n(T),D=s(45325);const H=n=>{var{url:e,title:s,className:t}=n,o=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,["url","title","className"]);return(0,i.jsx)(D.A,Object.assign({className:M()("new",t),icon:u.A.CREATE,url:e},o,{children:s}),"button-new")};const U=n=>{var{sessionItem:e,status:s,name:t,unreadInfoStoreSelector:o,url:r}=n,a=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,["sessionItem","status","name","unreadInfoStoreSelector","url"]);return(0,i.jsx)(D.A,Object.assign({url:r,className:"session-item",icon:s,sessionItem:e,unreadInfoStoreSelector:o,"aria-label":t},a,{children:t}))};var G=s(83994),K=s(27725),L=s(39364),V=s(85072),Y=s.n(V),P=s(97825),W=s.n(P),R=s(77659),$=s.n(R),q=s(55056),_=s.n(q),F=s(10540),Z=s.n(F),J=s(41113),X=s.n(J),Q=s(46510),nn={};nn.styleTagTransform=X(),nn.setAttributes=_(),nn.insert=$().bind(null,"head"),nn.domAPI=W(),nn.insertStyleElement=Z(),Y()(Q.A,nn),Q.A&&Q.A.locals&&Q.A.locals;var en=s(70756);const sn=n=>{const e=(0,L.wV)(),s=(0,y.y)(),a=(0,j.Zp)(),A=(0,j.zy)(),{activeItem:l,onKeyDown:c}=(n=>{const[e,s]=t.useState(null),i=(0,j.zy)(),o=(0,S.F)(),{pushSession:a,replaceSession:A,newUrl:l,replaceNew:c}=N({baseUrl:n.baseUrl}),d=()=>`${n.baseUrl}_last_active`;return t.useLayoutEffect(()=>{if(i.pathname===l)return void(e&&s(null));if((()=>{const e=i,t=e.state&&e.state.pending,o=z(n.items,n.activeId);return o?t?(A(o.id,{pending:!1}),!0):(s(o),(0,r.MS)(d(),n.activeId),!0):!!t||0===n.items.length&&(c(),s(null),!0)})())return;if(!e){const e=(0,r.H5)(d());if(e&&z(n.items,e))return void A(e)}const{items:t,activeId:o}=n;let a=0;const m=z(t,o);m&&(a=t.indexOf(m),a===t.length-1&&(a-=1)),A(t[a].id)},[i,n.items]),{onKeyDown:e=>{const{key:s,altKey:i}=e;if(!i||"ArrowUp"!==s&&"ArrowDown"!==s){if(i&&"Insert"===s)e.preventDefault(),c();else if(i&&"Delete"===s){e.preventDefault();const{items:s,activeId:i,sessionApi:t}=n,r=z(s,i);r&&t.removeSession(r,o)}}else{e.preventDefault();const{items:i,activeId:t}=n,o=z(i,t);if(!o)return;const r=i.indexOf(o);if(-1===r)return;const A=i["ArrowUp"===s?r-1:r+1];A&&a(A.id)}},activeItem:e}})(n),h=(0,en.z)(e,n.editAccess),g=!!n.newLayout&&A.pathname.endsWith("/new"),{disableSideMenu:E,items:f,sessionStoreSelector:x,sessionT:v,uiActions:C}=n,O=E||(0,r.vU)(s),{getItemHeaderTitle:I,getItemHeaderDescription:T,getItemHeaderIcon:M,getNewButton:D,getSessionMenuItems:V,getSessionActionMenuItems:Y}=(n=>{const e=(0,S.F)(),s=(0,j.zy)(),{t:o}=(0,p.Bd)(),{newUrl:r,getSessionUrl:a}=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)(G.A,{icon:t(e)})};return{getItemHeaderDescription:()=>{const{itemHeaderDescriptionGetter:e,newDescription:s,activeItem:i,isNewLayout:t}=n;return t?s:i?e(i):null},getItemHeaderIcon:()=>{const{itemHeaderIconGetter:e,newIcon:s,activeItem:t,isNewLayout:o}=n;return o?(0,i.jsx)(G.A,{icon:s}):t?(0,i.jsx)(G.A,{icon:e(t)}):null},getItemHeaderTitle:()=>{const{activeItem:e,newCaption:t,remoteMenuId:o,isNewLayout:r}=n;if(r)return(0,i.jsx)("div",{children:t});if(!e)return null;const{uiActions:a,actionIds:A,itemNameGetter:l,itemHeaderTitleGetter:c}=n,d=A?[...A,"divider","remove"]:void 0,m=(0,i.jsx)(k.Wy,{caption:l(e),actions:a,itemData:e,ids:d,remoteMenuId:o});if(c){const n=c(e,s,m);if(n)return n}return m},getSessionActionMenuItems:()=>{const{items:s,hasEditAccess:t}=n;return t&&0!==s.length?(0,i.jsx)(K.A,{onClick:()=>{const{sessionApi:s,items:i}=n;i.forEach(n=>s.removeSession(n,e))},icon:u.A.REMOVE,children:(0,m.Tl)("Close all",o,d.KV.COMMON)},"close"):null},getNewButton:e=>{const{newCaption:s,hasEditAccess:t}=n;return t&&s?(0,i.jsx)(H,Object.assign({title:s,url:r},e),"new-button"):null},getSessionMenuItems:e=>n.items.map(s=>{const{itemNameGetter:i,sessionStoreSelector:o}=n;return(0,t.createElement)(U,Object.assign({},e,{key:s.id,url:a(s.id),name:i(s),unreadInfoStoreSelector:o,status:A(s),sessionItem:s}))})}})(Object.assign(Object.assign({},n),{activeItem:l,hasEditAccess:h,isNewLayout:g}));if(!h&&0===f.length)return(0,i.jsx)(b.A,{title:(0,m.Tl)("No items to show",v.plainT,d.KV.COMMON),description:v.plainT((0,m.j2)("noSessionEditAccess",d.KV.COMMON),"You aren't allowed to open new sessions")});const P=O?B:w;return(0,i.jsx)(P,{itemHeaderTitle:I(),itemHeaderDescription:T(),itemHeaderIcon:M(),newButtonGetter:D,sessionMenuItemsGetter:V,listActionMenuGetter:Y,activeItem:l,sessionStoreSelector:x,onKeyDown:c,actions:C,children:(()=>{const{newLayout:e,sessionT:s}=n;return g&&e?(0,i.jsx)(e,{navigate:a,location:A,sessionT:s}):(()=>{const{activeId:e,items:s,sessionItemLayout:t,sessionApi:r,uiActions:c,sessionT:u,baseUrl:p}=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,{sessionItem:l,sessionApi:r,uiActions:c,location:A,navigate:a,sessionT:u,baseUrl:p})})()})()})}}}]);
|
|
2
|
-
//# sourceMappingURL=550.
|
|
2
|
+
//# sourceMappingURL=550.5af63eac940d4bdf4a4b.chunk.js.map
|
|
Binary file
|