airdcpp-webui 2.11.2 → 2.11.3-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.html +2 -2
- package/dist/js/{285.902dc3166e82226541a5.chunk.js → 285.c10a92f5e683562b290c.chunk.js} +2 -2
- package/dist/js/285.c10a92f5e683562b290c.chunk.js.gz +0 -0
- package/dist/js/{285.902dc3166e82226541a5.chunk.js.map → 285.c10a92f5e683562b290c.chunk.js.map} +1 -1
- package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js +2 -0
- package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js.gz +0 -0
- package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js.map +1 -0
- package/dist/js/{424.b407aaf3218fa480b144.chunk.js → 424.2b137728423ffe5720b9.chunk.js} +1 -1
- package/dist/js/424.2b137728423ffe5720b9.chunk.js.gz +0 -0
- package/dist/js/{424.b407aaf3218fa480b144.chunk.js.map → 424.2b137728423ffe5720b9.chunk.js.map} +1 -1
- package/dist/js/{668.d0b45ae92f54a69beee3.chunk.js → 668.d8fc363a0da7c52c6cf3.chunk.js} +1 -1
- package/dist/js/668.d8fc363a0da7c52c6cf3.chunk.js.gz +0 -0
- package/dist/js/{668.d0b45ae92f54a69beee3.chunk.js.map → 668.d8fc363a0da7c52c6cf3.chunk.js.map} +1 -1
- package/dist/js/{69.8ca10b3d679cc4c52a20.chunk.js → 69.90201ebd79a3d236605f.chunk.js} +2 -2
- package/dist/js/69.90201ebd79a3d236605f.chunk.js.gz +0 -0
- package/dist/js/69.90201ebd79a3d236605f.chunk.js.map +1 -0
- package/dist/js/{702.99e6ce480dc579b6e542.chunk.js → 702.d36d38b2be52ab51c0a9.chunk.js} +1 -1
- package/dist/js/702.d36d38b2be52ab51c0a9.chunk.js.gz +0 -0
- package/dist/js/{702.99e6ce480dc579b6e542.chunk.js.map → 702.d36d38b2be52ab51c0a9.chunk.js.map} +1 -1
- package/dist/js/760.28a29fef05eb0889fc25.chunk.js +3 -0
- package/dist/js/{760.75d229a05d7b9bdf414b.chunk.js.LICENSE.txt → 760.28a29fef05eb0889fc25.chunk.js.LICENSE.txt} +0 -0
- package/dist/js/760.28a29fef05eb0889fc25.chunk.js.gz +0 -0
- package/dist/js/760.28a29fef05eb0889fc25.chunk.js.map +1 -0
- package/dist/js/{favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js → favorite-hubs.d78427e6a9006438d07b.chunk.js} +1 -1
- package/dist/js/favorite-hubs.d78427e6a9006438d07b.chunk.js.gz +0 -0
- package/dist/js/{favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js.map → favorite-hubs.d78427e6a9006438d07b.chunk.js.map} +1 -1
- package/dist/js/{filelists.a1ecb558a5c0c376191d.chunk.js → filelists.726450e0ff6e77eaa054.chunk.js} +1 -1
- package/dist/js/filelists.726450e0ff6e77eaa054.chunk.js.gz +0 -0
- package/dist/js/{filelists.a1ecb558a5c0c376191d.chunk.js.map → filelists.726450e0ff6e77eaa054.chunk.js.map} +1 -1
- package/dist/js/{files.9b2b25680e1e04de1931.chunk.js → files.50c047ffc599c58eb13a.chunk.js} +2 -2
- package/dist/js/files.50c047ffc599c58eb13a.chunk.js.gz +0 -0
- package/dist/js/{files.9b2b25680e1e04de1931.chunk.js.map → files.50c047ffc599c58eb13a.chunk.js.map} +1 -1
- package/dist/js/home.ed1091a84aa53f290563.chunk.js +3 -0
- package/dist/js/{home.21a1fe21d45ac82fafe5.chunk.js.LICENSE.txt → home.ed1091a84aa53f290563.chunk.js.LICENSE.txt} +0 -0
- package/dist/js/home.ed1091a84aa53f290563.chunk.js.gz +0 -0
- package/dist/js/home.ed1091a84aa53f290563.chunk.js.map +1 -0
- package/dist/js/{hubs.f336a1aeaac00fab20ce.chunk.js → hubs.eed2f41d894688465906.chunk.js} +2 -2
- package/dist/js/hubs.eed2f41d894688465906.chunk.js.gz +0 -0
- package/dist/js/{hubs.f336a1aeaac00fab20ce.chunk.js.map → hubs.eed2f41d894688465906.chunk.js.map} +1 -1
- package/dist/js/locales/{ca.7409d603c21de58635a6.chunk.js → ca.ed09d3a3d4bcca929ba1.chunk.js} +0 -0
- package/dist/js/locales/{ca.7409d603c21de58635a6.chunk.js.gz → ca.ed09d3a3d4bcca929ba1.chunk.js.gz} +0 -0
- package/dist/js/locales/{da.bd0c6f71e355d0794e71.chunk.js → da.6f60a77e9ef082dd3bf4.chunk.js} +0 -0
- package/dist/js/locales/{da.bd0c6f71e355d0794e71.chunk.js.gz → da.6f60a77e9ef082dd3bf4.chunk.js.gz} +0 -0
- package/dist/js/locales/{de.5adea2a7ce417c784479.chunk.js → de.3b7d3665460384259e82.chunk.js} +0 -0
- package/dist/js/locales/{de.5adea2a7ce417c784479.chunk.js.gz → de.3b7d3665460384259e82.chunk.js.gz} +0 -0
- package/dist/js/locales/{el.648369d465eb99118703.chunk.js → el.598573d2a5ed18804fe0.chunk.js} +0 -0
- package/dist/js/locales/{el.648369d465eb99118703.chunk.js.gz → el.598573d2a5ed18804fe0.chunk.js.gz} +0 -0
- package/dist/js/locales/{en.c66f69f706afd2da9eb5.chunk.js → en.f0fe75dca201449e5e47.chunk.js} +0 -0
- package/dist/js/locales/{en.c66f69f706afd2da9eb5.chunk.js.gz → en.f0fe75dca201449e5e47.chunk.js.gz} +0 -0
- package/dist/js/locales/{es.793f17d88083bf7f0738.chunk.js → es.cbe6378a22cf5ee485cd.chunk.js} +0 -0
- package/dist/js/locales/{es.793f17d88083bf7f0738.chunk.js.gz → es.cbe6378a22cf5ee485cd.chunk.js.gz} +0 -0
- package/dist/js/locales/{eu.010416cbe0a067839d4a.chunk.js → eu.7734fc077f26418d6b32.chunk.js} +0 -0
- package/dist/js/locales/{eu.010416cbe0a067839d4a.chunk.js.gz → eu.7734fc077f26418d6b32.chunk.js.gz} +0 -0
- package/dist/js/locales/{fi.7ecbf3197777fb8fd70f.chunk.js → fi.d1f8a5f4048236243b0f.chunk.js} +0 -0
- package/dist/js/locales/{fi.7ecbf3197777fb8fd70f.chunk.js.gz → fi.d1f8a5f4048236243b0f.chunk.js.gz} +0 -0
- package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js +1 -0
- package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js.gz +0 -0
- package/dist/js/locales/{hu.37c8f09717da5f1bc37c.chunk.js → hu.d0d2c38a03a3b38c2bc5.chunk.js} +0 -0
- package/dist/js/locales/{hu.37c8f09717da5f1bc37c.chunk.js.gz → hu.d0d2c38a03a3b38c2bc5.chunk.js.gz} +0 -0
- package/dist/js/locales/{it.9842f3b2b5bb3b7420c5.chunk.js → it.0c911d75c50ea83190ad.chunk.js} +0 -0
- package/dist/js/locales/{it.9842f3b2b5bb3b7420c5.chunk.js.gz → it.0c911d75c50ea83190ad.chunk.js.gz} +0 -0
- package/dist/js/locales/{nl.88085590f152551ec225.chunk.js → nl.36d288d75b3d3cbabf11.chunk.js} +0 -0
- package/dist/js/locales/{nl.88085590f152551ec225.chunk.js.gz → nl.36d288d75b3d3cbabf11.chunk.js.gz} +0 -0
- package/dist/js/locales/{no.cfa0a90ce428e087e846.chunk.js → no.8f2f465d5f785650175d.chunk.js} +0 -0
- package/dist/js/locales/{no.cfa0a90ce428e087e846.chunk.js.gz → no.8f2f465d5f785650175d.chunk.js.gz} +0 -0
- package/dist/js/locales/{pl.89540648cb16acad8d27.chunk.js → pl.06e51d7d7b09ba14714d.chunk.js} +0 -0
- package/dist/js/locales/{pl.89540648cb16acad8d27.chunk.js.gz → pl.06e51d7d7b09ba14714d.chunk.js.gz} +0 -0
- package/dist/js/locales/{pt-br.a537d1e531731dbec9dd.chunk.js → pt-br.9d19d92899e8c0917c66.chunk.js} +0 -0
- package/dist/js/locales/{pt-br.a537d1e531731dbec9dd.chunk.js.gz → pt-br.9d19d92899e8c0917c66.chunk.js.gz} +0 -0
- package/dist/js/locales/{pt.08213e494539393b14d1.chunk.js → pt.4390db3955db29b0e7dd.chunk.js} +0 -0
- package/dist/js/locales/{pt.08213e494539393b14d1.chunk.js.gz → pt.4390db3955db29b0e7dd.chunk.js.gz} +0 -0
- package/dist/js/locales/{ro.23f02315e6d9ab090aac.chunk.js → ro.705fcd327263fcf419bf.chunk.js} +0 -0
- package/dist/js/locales/{ro.23f02315e6d9ab090aac.chunk.js.gz → ro.705fcd327263fcf419bf.chunk.js.gz} +0 -0
- package/dist/js/locales/{ru.c775ae5709b4e2affc37.chunk.js → ru.8ab7e1c0d9eee7aa7afb.chunk.js} +0 -0
- package/dist/js/locales/{ru.c775ae5709b4e2affc37.chunk.js.gz → ru.8ab7e1c0d9eee7aa7afb.chunk.js.gz} +0 -0
- package/dist/js/locales/{sv.60ec4539680a48384a56.chunk.js → sv.be546e605910932db11f.chunk.js} +0 -0
- package/dist/js/locales/{sv.60ec4539680a48384a56.chunk.js.gz → sv.be546e605910932db11f.chunk.js.gz} +0 -0
- package/dist/js/locales/{tr.c19f95d7bf191aad9a74.chunk.js → tr.25a0d0f19e007e2febc9.chunk.js} +0 -0
- package/dist/js/locales/{tr.c19f95d7bf191aad9a74.chunk.js.gz → tr.25a0d0f19e007e2febc9.chunk.js.gz} +0 -0
- package/dist/js/locales/uk_UA.64a1a537c623ae0259dd.chunk.js +1 -0
- package/dist/js/locales/uk_UA.64a1a537c623ae0259dd.chunk.js.gz +0 -0
- package/dist/js/locales/{zh_CN.d27ea53dd79304789681.chunk.js → zh_CN.4b75674e4815a965ccea.chunk.js} +0 -0
- package/dist/js/locales/{zh_CN.d27ea53dd79304789681.chunk.js.gz → zh_CN.4b75674e4815a965ccea.chunk.js.gz} +0 -0
- package/dist/js/{main.d64158ea2453985dde98.entry.js → main.ad3d59f07b32feb5be60.entry.js} +3 -3
- package/dist/js/{main.d64158ea2453985dde98.entry.js.LICENSE.txt → main.ad3d59f07b32feb5be60.entry.js.LICENSE.txt} +0 -0
- package/dist/js/main.ad3d59f07b32feb5be60.entry.js.gz +0 -0
- package/dist/js/main.ad3d59f07b32feb5be60.entry.js.map +1 -0
- package/dist/js/{messages.e4523315258f6dab0f37.chunk.js → messages.d213dd0ac314a64b5a6c.chunk.js} +1 -1
- package/dist/js/messages.d213dd0ac314a64b5a6c.chunk.js.gz +0 -0
- package/dist/js/{messages.e4523315258f6dab0f37.chunk.js.map → messages.d213dd0ac314a64b5a6c.chunk.js.map} +1 -1
- package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js → queue.2fcf7a1381f1fb4af03f.chunk.js} +1 -1
- package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js.gz → queue.2fcf7a1381f1fb4af03f.chunk.js.gz} +0 -0
- package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js.map → queue.2fcf7a1381f1fb4af03f.chunk.js.map} +1 -1
- package/dist/js/{search.321f771dd92b51431378.chunk.js → search.24ec8c5fe5f45b1180a9.chunk.js} +2 -2
- package/dist/js/search.24ec8c5fe5f45b1180a9.chunk.js.gz +0 -0
- package/dist/js/{search.321f771dd92b51431378.chunk.js.map → search.24ec8c5fe5f45b1180a9.chunk.js.map} +1 -1
- package/dist/js/settings.83541ccd8eafaab78d16.chunk.js +2 -0
- package/dist/js/settings.83541ccd8eafaab78d16.chunk.js.gz +0 -0
- package/dist/js/settings.83541ccd8eafaab78d16.chunk.js.map +1 -0
- package/dist/js/{share.ecb413c8d6a1cc8a6154.chunk.js → share.d94de2f3077842a88c25.chunk.js} +2 -2
- package/dist/js/share.d94de2f3077842a88c25.chunk.js.gz +0 -0
- package/dist/js/{share.ecb413c8d6a1cc8a6154.chunk.js.map → share.d94de2f3077842a88c25.chunk.js.map} +1 -1
- package/dist/js/{system-log.7aa8ba9d8b4a5711c4fc.chunk.js → system-log.b3fc65678cc7480e44e0.chunk.js} +1 -1
- package/dist/js/system-log.b3fc65678cc7480e44e0.chunk.js.gz +0 -0
- package/dist/js/{system-log.7aa8ba9d8b4a5711c4fc.chunk.js.map → system-log.b3fc65678cc7480e44e0.chunk.js.map} +1 -1
- package/dist/js/{transfers.5a7661c5701a462d4c53.chunk.js → transfers.5ec21f789068ff2e228f.chunk.js} +2 -2
- package/dist/js/transfers.5ec21f789068ff2e228f.chunk.js.gz +0 -0
- package/dist/js/{transfers.5a7661c5701a462d4c53.chunk.js.map → transfers.5ec21f789068ff2e228f.chunk.js.map} +1 -1
- package/dist/sw.js +1 -1
- package/dist/sw.js.gz +0 -0
- package/package.json +53 -51
- package/dist/js/285.902dc3166e82226541a5.chunk.js.gz +0 -0
- package/dist/js/334.f72694a737e72404ed6e.chunk.js +0 -2
- package/dist/js/334.f72694a737e72404ed6e.chunk.js.gz +0 -0
- package/dist/js/334.f72694a737e72404ed6e.chunk.js.map +0 -1
- package/dist/js/424.b407aaf3218fa480b144.chunk.js.gz +0 -0
- package/dist/js/668.d0b45ae92f54a69beee3.chunk.js.gz +0 -0
- package/dist/js/69.8ca10b3d679cc4c52a20.chunk.js.gz +0 -0
- package/dist/js/69.8ca10b3d679cc4c52a20.chunk.js.map +0 -1
- package/dist/js/702.99e6ce480dc579b6e542.chunk.js.gz +0 -0
- package/dist/js/760.75d229a05d7b9bdf414b.chunk.js +0 -3
- package/dist/js/760.75d229a05d7b9bdf414b.chunk.js.gz +0 -0
- package/dist/js/760.75d229a05d7b9bdf414b.chunk.js.map +0 -1
- package/dist/js/favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js.gz +0 -0
- package/dist/js/filelists.a1ecb558a5c0c376191d.chunk.js.gz +0 -0
- package/dist/js/files.9b2b25680e1e04de1931.chunk.js.gz +0 -0
- package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js +0 -3
- package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js.gz +0 -0
- package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js.map +0 -1
- package/dist/js/hubs.f336a1aeaac00fab20ce.chunk.js.gz +0 -0
- package/dist/js/locales/fr.cf760489c7a0a9a02e31.chunk.js +0 -1
- package/dist/js/locales/fr.cf760489c7a0a9a02e31.chunk.js.gz +0 -0
- package/dist/js/locales/uk_UA.0678837b62a41e004e9c.chunk.js +0 -1
- package/dist/js/locales/uk_UA.0678837b62a41e004e9c.chunk.js.gz +0 -0
- package/dist/js/main.d64158ea2453985dde98.entry.js.gz +0 -0
- package/dist/js/main.d64158ea2453985dde98.entry.js.map +0 -1
- package/dist/js/messages.e4523315258f6dab0f37.chunk.js.gz +0 -0
- package/dist/js/search.321f771dd92b51431378.chunk.js.gz +0 -0
- package/dist/js/settings.3c031a77619c7df3a86e.chunk.js +0 -2
- package/dist/js/settings.3c031a77619c7df3a86e.chunk.js.gz +0 -0
- package/dist/js/settings.3c031a77619c7df3a86e.chunk.js.map +0 -1
- package/dist/js/share.ecb413c8d6a1cc8a6154.chunk.js.gz +0 -0
- package/dist/js/system-log.7aa8ba9d8b4a5711c4fc.chunk.js.gz +0 -0
- package/dist/js/transfers.5a7661c5701a462d4c53.chunk.js.gz +0 -0
package/dist/js/{424.b407aaf3218fa480b144.chunk.js.map → 424.2b137728423ffe5720b9.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js/424.b407aaf3218fa480b144.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/table/style.css","webpack://airdcpp-webui/./src/actions/TableActions.js","webpack://airdcpp-webui/./src/components/format/FormattedIp.tsx","webpack://airdcpp-webui/./src/components/table/Cell.tsx","webpack://airdcpp-webui/./src/components/table/TextFilter.tsx","webpack://airdcpp-webui/./src/components/table/TableFooter.tsx","webpack://airdcpp-webui/./src/components/table/RowWrapperCell.tsx","webpack://airdcpp-webui/./src/components/table/TableContainer.tsx","webpack://airdcpp-webui/./src/components/table/style.css?53ed","webpack://airdcpp-webui/./src/components/table/VirtualTable.tsx","webpack://airdcpp-webui/./src/components/table/RowDataLoader.js","webpack://airdcpp-webui/./src/decorators/TableFilterDecorator.tsx","webpack://airdcpp-webui/./src/mixins/ViewStoreMixin.js"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Generic table styles */\\r\\n.virtual-table {\\r\\n height: 100%;\\r\\n width: 100%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.virtual-table .table-container-wrapper {\\r\\n width: 100%;\\r\\n flex: 1 1 auto;\\r\\n\\r\\n /* The table won't shrink properly without this */\\r\\n height: calc(100% - 50px);\\r\\n}\\r\\n\\r\\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\\r\\n cursor:pointer;\\r\\n}\\r\\n\\r\\n.virtual-table .fixedDataTableLayout_main {\\r\\n background-color: rgba(250, 250, 250, 0.8);\\r\\n}\\r\\n\\r\\n.virtual-table .fixedDataTableLayout_main:focus {\\r\\n outline: inherit;\\r\\n}\\r\\n\\r\\n.virtual-table .public_fixedDataTable_header a, .public_fixedDataTableCell_main a {\\r\\n color: black;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Common cell content styles */\\r\\n\\r\\n.virtual-table .cell-wrapper {\\r\\n position: relative;\\r\\n top: 50%;\\r\\n transform: translateY(-50%);\\r\\n max-height: 50px;\\r\\n padding: 5px;\\r\\n}\\r\\n\\r\\n.virtual-table .cell-wrapper .plain.cell,\\r\\n.virtual-table .cell-wrapper .empty.dropdown {\\r\\n margin: 0px 3px;\\r\\n}\\r\\n\\r\\n.virtual-table .cell-wrapper .ui.progress .bar {\\r\\n height: 5px;\\r\\n}\\r\\n\\r\\n\\r\\n/* Footer */\\r\\n\\r\\n.table-footer {\\r\\n width: 100%;\\r\\n padding: 5px;\\r\\n background-color: #f6f7f8;\\r\\n background-image: -webkit-linear-gradient(#fff, #efefef);\\r\\n background-image: linear-gradient(#fff, #efefef);\\r\\n display:flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.table-footer .filter {\\r\\n margin-left: auto;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.table-footer .count-info {\\r\\n margin-right: 0px;\\r\\n color: grey;\\r\\n}\\r\\n\\r\\n.table-footer .filter > div:last-child {\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.table-footer .filter .filter-method.dropdown.button {\\r\\n padding-left: 0px !important;\\r\\n padding-right: 0px !important;\\r\\n}\\r\\n\\r\\n.table-footer .filter .dropdown .trigger.icon {\\r\\n margin-right: 0px;\\r\\n}\\r\\n\\r\\n.table-footer .filter input {\\r\\n width: 90%;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Table dropdowns */\\r\\n.table-container-wrapper .dropdown .trigger {\\r\\n line-height: 21px;\\r\\n display: flex;\\r\\n align-items: flex-start;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger:hover, .public_fixedDataTableCell_main a:hover {\\r\\n cursor:pointer;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger:hover span, .public_fixedDataTableCell_main a:hover {\\r\\n text-decoration:underline;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger i.angle.icon {\\r\\n margin: 0px;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .icon-caption .icon {\\r\\n width: inherit !important;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\\r\\n padding-left: 22px;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger i {\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger span {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Table dropdown popup content */\\r\\n.popup.dropdown-content {\\r\\n padding: 5px 15px;\\r\\n}\\r\\n\\r\\n.popup.dropdown-content .ui.dropdown.item {\\r\\n margin: 0px 0px;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/table/style.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;AACzB;EACE,YAAY;EACZ,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,cAAc;;EAEd,iDAAiD;EACjD,yBAAyB;AAC3B;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,0CAA0C;AAC5C;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,YAAY;AACd;;;;AAIA,+BAA+B;;AAE/B;EACE,kBAAkB;EAClB,QAAQ;EACR,2BAA2B;EAC3B,gBAAgB;EAChB,YAAY;AACd;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,WAAW;AACb;;;AAGA,WAAW;;AAEX;EACE,WAAW;EACX,YAAY;EACZ,yBAAyB;EACzB,wDAAwD;EACxD,gDAAgD;EAChD,YAAY;EACZ,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;EACjB,aAAa;AACf;;AAEA;EACE,iBAAiB;EACjB,WAAW;AACb;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,4BAA4B;EAC5B,6BAA6B;AAC/B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,UAAU;AACZ;;;;AAIA,oBAAoB;AACpB;EACE,iBAAiB;EACjB,aAAa;EACb,uBAAuB;AACzB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,OAAO;AACT;;;;AAIA,iCAAiC;AACjC;EACE,iBAAiB;AACnB;;AAEA;EACE,eAAe;AACjB\",\"sourcesContent\":[\"/* Generic table styles */\\r\\n.virtual-table {\\r\\n height: 100%;\\r\\n width: 100%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.virtual-table .table-container-wrapper {\\r\\n width: 100%;\\r\\n flex: 1 1 auto;\\r\\n\\r\\n /* The table won't shrink properly without this */\\r\\n height: calc(100% - 50px);\\r\\n}\\r\\n\\r\\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\\r\\n cursor:pointer;\\r\\n}\\r\\n\\r\\n.virtual-table .fixedDataTableLayout_main {\\r\\n background-color: rgba(250, 250, 250, 0.8);\\r\\n}\\r\\n\\r\\n.virtual-table .fixedDataTableLayout_main:focus {\\r\\n outline: inherit;\\r\\n}\\r\\n\\r\\n.virtual-table .public_fixedDataTable_header a, .public_fixedDataTableCell_main a {\\r\\n color: black;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Common cell content styles */\\r\\n\\r\\n.virtual-table .cell-wrapper {\\r\\n position: relative;\\r\\n top: 50%;\\r\\n transform: translateY(-50%);\\r\\n max-height: 50px;\\r\\n padding: 5px;\\r\\n}\\r\\n\\r\\n.virtual-table .cell-wrapper .plain.cell,\\r\\n.virtual-table .cell-wrapper .empty.dropdown {\\r\\n margin: 0px 3px;\\r\\n}\\r\\n\\r\\n.virtual-table .cell-wrapper .ui.progress .bar {\\r\\n height: 5px;\\r\\n}\\r\\n\\r\\n\\r\\n/* Footer */\\r\\n\\r\\n.table-footer {\\r\\n width: 100%;\\r\\n padding: 5px;\\r\\n background-color: #f6f7f8;\\r\\n background-image: -webkit-linear-gradient(#fff, #efefef);\\r\\n background-image: linear-gradient(#fff, #efefef);\\r\\n display:flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.table-footer .filter {\\r\\n margin-left: auto;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.table-footer .count-info {\\r\\n margin-right: 0px;\\r\\n color: grey;\\r\\n}\\r\\n\\r\\n.table-footer .filter > div:last-child {\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.table-footer .filter .filter-method.dropdown.button {\\r\\n padding-left: 0px !important;\\r\\n padding-right: 0px !important;\\r\\n}\\r\\n\\r\\n.table-footer .filter .dropdown .trigger.icon {\\r\\n margin-right: 0px;\\r\\n}\\r\\n\\r\\n.table-footer .filter input {\\r\\n width: 90%;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Table dropdowns */\\r\\n.table-container-wrapper .dropdown .trigger {\\r\\n line-height: 21px;\\r\\n display: flex;\\r\\n align-items: flex-start;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger:hover, .public_fixedDataTableCell_main a:hover {\\r\\n cursor:pointer;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger:hover span, .public_fixedDataTableCell_main a:hover {\\r\\n text-decoration:underline;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger i.angle.icon {\\r\\n margin: 0px;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .icon-caption .icon {\\r\\n width: inherit !important;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\\r\\n padding-left: 22px;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger i {\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger span {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Table dropdown popup content */\\r\\n.popup.dropdown-content {\\r\\n padding: 5px 15px;\\r\\n}\\r\\n\\r\\n.popup.dropdown-content .ui.dropdown.item {\\r\\n margin: 0px 0px;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import Reflux from 'reflux';\r\n\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\n\r\nconst TableActions = Reflux.createActions([\r\n { 'setRange': { asyncResult: true } },\r\n { 'setSort': { asyncResult: true } },\r\n { 'close': { asyncResult: true } },\r\n { 'pause': { asyncResult: true } },\r\n { 'init': { asyncResult: true } },\r\n 'clear',\r\n]);\r\n\r\nconst postSettings = (settings, viewUrl, action) => {\r\n return SocketService.post(viewUrl + '/settings', settings)\r\n .then(data => action.completed(viewUrl, data))\r\n .catch(error => action.failed(viewUrl, error));\r\n};\r\n\r\nTableActions.close.listen(function (viewUrl, sessionExists) {\r\n if (sessionExists && LoginStore.socketAuthenticated) {\r\n let that = this;\r\n return SocketService.delete(viewUrl)\r\n .then(data => that.completed(viewUrl, data))\r\n .catch(error => this.failed(viewUrl, error));\r\n }\r\n\r\n return Promise.resolve();\r\n});\r\n\r\nTableActions.setSort.listen(function (viewUrl, sortProperty, sortAscending) {\r\n postSettings({ \r\n sort_property: sortProperty,\r\n sort_ascending: sortAscending,\r\n }, viewUrl, this);\r\n});\r\n\r\nTableActions.setRange.listen(function (viewUrl, rangeStart, maxRows) {\r\n console.assert(maxRows > 0, 'Invalid max rows');\r\n postSettings({ \r\n range_start: rangeStart, \r\n max_count: maxRows,\r\n }, viewUrl, this);\r\n});\r\n\r\nTableActions.pause.listen(function (viewUrl, pause) {\r\n postSettings({ \r\n paused: pause,\r\n }, viewUrl, this);\r\n});\r\n\r\nTableActions.init.listen(function (viewUrl, entityId, filterData) {\r\n if (filterData) {\r\n postSettings({ \r\n source_filter: filterData,\r\n }, viewUrl, this);\r\n }\r\n});\r\n\r\n\r\nexport default TableActions;\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport 'fomantic-ui-css/components/flag.min.css';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\nexport interface FormattedIpProps {\r\n item: API.IP;\r\n}\r\n\r\nconst FormattedIp: React.FC<FormattedIpProps> = ({ item }) => (\r\n <div className=\"ip flag\">\r\n <i className={ 'ui flag ' + item.country.toLowerCase() }/>\r\n { item.str }\r\n </div>\r\n);\r\n\r\n/*FormattedIp.propTypes = {\r\n item: PropTypes.object.isRequired,\r\n};*/\r\n\r\nexport default FormattedIp;","import * as React from 'react';\r\n\r\nimport { TableActionMenu, TableDownloadMenu, TableActionMenuProps, TableDownloadMenuProps } from 'components/menu';\r\nimport { \r\n formatDecimal, formatAbbreviatedDuration, formatConnection, formatDateTime, \r\n formatShortDate, formatSize, formatSpeed, formatRelativeTime \r\n} from 'utils/ValueFormat';\r\n\r\nimport FormattedFile from 'components/format/FormattedFile';\r\nimport FormattedIp from 'components/format/FormattedIp';\r\n\r\nimport Checkbox, { CheckboxProps } from 'components/semantic/Checkbox';\r\nimport { showAction } from 'utils/ActionUtils';\r\nimport { Cell, CellProps } from 'fixed-data-table-2';\r\n//import { withRouter, RouteComponentProps } from 'react-router-dom';\r\n//import { DownloadHandlerType } from 'decorators/menu/DownloadMenuDecorator';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as UI from 'types/ui';\r\nimport * as API from 'types/api';\r\n//import { ActionHandlerDecorator, ActionHandlerDecoratorChildProps } from 'decorators/ActionHandlerDecorator';\r\n//import ActionButton, { ActionButtonProps } from 'components/ActionButton';\r\nimport { ActionHandlerDecorator } from 'decorators/ActionHandlerDecorator';\r\n\r\n\r\nconst getCellContent = (cellData: any) => {\r\n if (typeof cellData === 'object') {\r\n return Array.isArray(cellData) ? cellData.length : cellData.str;\r\n }\r\n\r\n //if (typeof cellData === 'boolean') {\r\n // return cellData ? 'Yes' : 'No';\r\n //}\r\n\r\n if (cellData === 0) {\r\n return null;\r\n }\r\n\r\n return cellData;\r\n};\r\n\r\n// Default cell\r\nexport const TextCell = ({ cellData }: { cellData?: any }) => (\r\n <span className=\"plain text cell\">\r\n { getCellContent(cellData) }\r\n </span>\r\n);\r\n\r\n// Column header\r\ninterface HeaderCellProps extends CellProps {\r\n onClick: () => void;\r\n label: React.ReactNode;\r\n columnKey?: string; // REQUIRED, CLONED\r\n}\r\n\r\nexport const HeaderCell = ({ onClick, label, columnKey, ...props }: HeaderCellProps) => (\r\n <Cell { ...props }>\r\n <a onClick={ onClick }>\r\n { label }\r\n </a>\r\n </Cell>\r\n);\r\n\r\nexport interface ActionCellProps<CellDataT, ItemDataT extends UI.ActionItemDataValueType> extends \r\n Omit<RowWrapperCellChildProps<CellDataT, ItemDataT>, 't'>, \r\n Omit<TableActionMenuProps<ItemDataT>, 'caption' | 'itemData'> {\r\n\r\n}\r\n\r\ninterface FileItemBase {\r\n type: API.FileItemType;\r\n}\r\n\r\nexport const FileActionCell = <CellDataT, ItemDataT extends UI.ActionItemDataValueType & FileItemBase>(\r\n { cellData, rowDataGetter, ...props }: ActionCellProps<CellDataT, ItemDataT>\r\n) => (\r\n <TableActionMenu \r\n caption={ \r\n <FormattedFile \r\n typeInfo={ rowDataGetter!().type }\r\n caption={ cellData }\r\n />\r\n }\r\n itemData={ rowDataGetter! }\r\n { ...props }\r\n />\r\n);\r\n\r\nexport const ActionMenuCell = <CellDataT, ItemDataT extends UI.ActionItemDataValueType>(\r\n { cellData, rowDataGetter, ...props }: ActionCellProps<CellDataT, ItemDataT>\r\n) => (\r\n <TableActionMenu\r\n caption={ cellData }\r\n itemData={ rowDataGetter! }\r\n { ...props }\r\n />\r\n);\r\n\r\nexport interface ActionLinkCellProps<CellDataT, ItemDataT extends UI.ActionItemDataValueType> \r\n extends RowWrapperCellChildProps<CellDataT, ItemDataT> {\r\n /*Pick<ActionButtonProps<ItemDataT>, 'actions' | 'actionId'>*/\r\n\r\n //action: (itemData: any, location: Location) => void;\r\n //action: UI.ActionType<ItemDataT>;\r\n actions: UI.ModuleActions<ItemDataT>;\r\n actionId: string;\r\n}\r\n\r\nexport const ActionLinkCell = <CellDataT, ItemDataT extends UI.ActionItemDataValueType>(\r\n { \r\n cellData, \r\n rowDataGetter, \r\n //location, \r\n //onClickAction, action,\r\n actions, actionId,\r\n ...props\r\n }: ActionLinkCellProps<CellDataT, ItemDataT> /*& ActionHandlerDecoratorChildProps*/\r\n) => {\r\n const action = actions.actions[actionId]!;\r\n if (!showAction(action, rowDataGetter!())) {\r\n return (\r\n <TextCell \r\n cellData={ cellData }\r\n { ...props }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <ActionHandlerDecorator<ItemDataT>>\r\n { ({ onClickAction }) => (\r\n <a \r\n className=\"plain link cell\" \r\n onClick={ () => onClickAction({\r\n actionId,\r\n action,\r\n moduleId: actions.moduleId,\r\n itemData: rowDataGetter!(),\r\n }) }\r\n >\r\n { getCellContent(cellData) }\r\n </a>\r\n ) }\r\n </ActionHandlerDecorator>\r\n );\r\n\r\n /*return (\r\n <ActionButton\r\n actions={ actions }\r\n actionId={ actionId }\r\n tag=\"a\"\r\n semanticClassName=\"plain link cell\"\r\n icon={ null }\r\n caption={ getCellContent(cellData) }\r\n />\r\n );*/\r\n};\r\n\r\n//export const ActionLinkCell = ActionHandlerDecorator(ActionLinkCellPlain);\r\n\r\nexport interface NumberCellProps extends RowWrapperCellChildProps<number, any> {\r\n cellData?: number;\r\n}\r\n\r\nexport const SizeCell: React.FC<NumberCellProps> = ({ cellData, t }) => (\r\n <span className=\"plain size cell\">\r\n { formatSize(cellData!, t!) }\r\n </span>\r\n);\r\n\r\nexport const SpeedCell: React.FC<NumberCellProps> = ({ cellData, t }) => (\r\n <span className=\"plain speed cell\">\r\n { formatSpeed(cellData!, t!) }\r\n </span>\r\n);\r\n\r\nexport const DateCell: React.FC<NumberCellProps> = ({ cellData, width }) => (\r\n <span className=\"plain date cell\">\r\n { !!width && width > 150 ? formatDateTime(cellData!) : formatShortDate(cellData!) }\r\n </span>\r\n);\r\n\r\nexport const DurationCell: React.FC<NumberCellProps> = ({ cellData }) => (\r\n <span className=\"plain duration cell\">\r\n { formatRelativeTime(cellData!) }\r\n </span>\r\n);\r\n\r\nexport const AbbreviatedDurationCell: React.FC<NumberCellProps> = ({ cellData }) => (\r\n <span className=\"plain abbr-duration cell\">\r\n { formatAbbreviatedDuration(cellData!) }\r\n </span>\r\n);\r\n\r\nexport interface IpCellProps { \r\n cellData?: API.IP;\r\n}\r\n\r\nexport const IpCell: React.FC<IpCellProps> = ({ cellData }) => (\r\n <FormattedIp item={ cellData! }/>\r\n);\r\n\r\nexport const ConnectionCell: React.FC<NumberCellProps> = ({ cellData, t }) => (\r\n <span className=\"plain connection cell\">\r\n { formatConnection(cellData!, t!) }\r\n </span>\r\n);\r\n\r\nexport const DecimalCell: React.FC<NumberCellProps> = ({ cellData }) => (\r\n <span className=\"plain decimal cell\">\r\n { formatDecimal(cellData!) }\r\n </span>\r\n);\r\n\r\nexport type FileDownloadCellClickHandler = (cellData: any, rowDataGetter: () => any) => (() => void) | undefined;\r\n\r\nexport interface FileDownloadCellProps<CellDataT, ItemDataT extends UI.DownloadableItemInfo> \r\n extends RowWrapperCellChildProps<CellDataT, ItemDataT>, \r\n Omit<TableDownloadMenuProps<ItemDataT>, 'user' | 'itemInfoGetter' | 'caption'> {\r\n\r\n userGetter: (rowData: ItemDataT) => UI.DownloadSource;\r\n clickHandlerGetter?: FileDownloadCellClickHandler;\r\n}\r\n\r\nexport const FileDownloadCell = <CellDataT, ItemDataT extends UI.DownloadableItemInfo & FileItemBase>(\r\n { cellData, rowDataGetter, clickHandlerGetter, \r\n userGetter, downloadHandler, ...props \r\n }: FileDownloadCellProps<CellDataT, ItemDataT>\r\n) => (\r\n <TableDownloadMenu \r\n caption={ \r\n <FormattedFile \r\n typeInfo={ rowDataGetter!().type }\r\n onClick={ clickHandlerGetter ? clickHandlerGetter(cellData, rowDataGetter!) : null }\r\n caption={ cellData }\r\n />\r\n }\r\n user={ userGetter(rowDataGetter!()) }\r\n linkCaption={ !!clickHandlerGetter ? false : true }\r\n itemInfoGetter={ rowDataGetter! }\r\n downloadHandler={ downloadHandler }\r\n { ...props }\r\n />\r\n);\r\n\r\n/*FileDownloadCell.propTypes = {\r\n rowDataGetter: PropTypes.func, // REQUIRED\r\n cellData: PropTypes.any, // REQUIRED\r\n userGetter: PropTypes.func.isRequired,\r\n clickHandlerGetter: PropTypes.func,\r\n downloadHandler: PropTypes.func.isRequired,\r\n};*/\r\n\r\n// tslint:disable-next-line:max-line-length\r\nexport interface CheckboxCellProps extends \r\n Omit<RowWrapperCellChildProps<boolean, any>, 'onChange'>, \r\n Omit<CheckboxProps, 'onChange' | 'checked'> {\r\n \r\n onChange: (checked: boolean, rowData: any) => void;\r\n}\r\n\r\nexport const CheckboxCell: React.FC<CheckboxCellProps> = ({ cellData, rowDataGetter, onChange, ...props }) => (\r\n <Checkbox \r\n checked={ cellData! } \r\n onChange={ checked => onChange(checked, rowDataGetter!()) }\r\n { ...props }\r\n />\r\n);\r\n\r\n/*CheckboxCell.propTypes = {\r\n rowDataGetter: PropTypes.func, // REQUIRED\r\n cellData: PropTypes.bool, // REQUIRED\r\n onChange: PropTypes.func.isRequired,\r\n};*/","import * as React from 'react';\r\n\r\nimport SectionedDropdown from 'components/semantic/SectionedDropdown';\r\nimport MenuSection from 'components/semantic/MenuSection';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport TableFilterDecorator, { TableFilterDecoratorChildProps } from 'decorators/TableFilterDecorator';\r\n\r\nimport { FilterMethod } from 'types/api';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\nimport { TFunction } from 'i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { Translation } from 'react-i18next';\r\n\r\n\r\nconst getFilterMethodCaption = (method: FilterMethod) => {\r\n switch (method) {\r\n case FilterMethod.REGEX: return 'Regex';\r\n case FilterMethod.WILDCARD: return 'Wildcard';\r\n case FilterMethod.EXACT: return 'Exact';\r\n default: return 'Partial';\r\n }\r\n};\r\n\r\nconst filterMethodToString = (method: FilterMethod, t: TFunction) => {\r\n const methodTitle = getFilterMethodCaption(method);\r\n return translate(methodTitle, t, 'table.filter');\r\n};\r\n\r\nconst getPlaceholder = (method: FilterMethod, t: TFunction) => {\r\n let ret = t('table.filter.filter', 'Filter');\r\n if (method !== FilterMethod.PARTIAL) {\r\n ret += ` (${filterMethodToString(method, t).toLowerCase()})`;\r\n }\r\n\r\n return ret + '...';\r\n};\r\n\r\nexport interface TextFilterProps {\r\n autoFocus?: boolean;\r\n}\r\n\r\nclass TextFilter extends React.PureComponent<TextFilterProps & TableFilterDecoratorChildProps> {\r\n state = { \r\n value: '',\r\n method: FilterMethod.PARTIAL,\r\n };\r\n\r\n timer: number | undefined;\r\n input: HTMLInputElement;\r\n\r\n static defaultProps: Pick<TextFilterProps, 'autoFocus'> = {\r\n autoFocus: true,\r\n };\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.timer);\r\n }\r\n\r\n onFilterUpdated = () => {\r\n const { value, method } = this.state;\r\n this.props.onFilterUpdated(value, method);\r\n }\r\n\r\n onTextChanged = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({ \r\n value: event.target.value \r\n });\r\n\r\n clearTimeout(this.timer);\r\n\r\n this.timer = window.setTimeout(\r\n () => {\r\n this.onFilterUpdated();\r\n }, \r\n 200\r\n );\r\n }\r\n\r\n onMethodChanged = (method: FilterMethod) => {\r\n this.setState({ \r\n method,\r\n });\r\n\r\n setTimeout(() => this.onFilterUpdated());\r\n this.input.focus();\r\n }\r\n\r\n getFilterMethod = (method: FilterMethod, t: TFunction) => {\r\n const isCurrent = method === this.state.method;\r\n return (\r\n <MenuItemLink \r\n key={ method }\r\n onClick={ () => this.onMethodChanged(method) }\r\n active={ isCurrent }\r\n >\r\n { filterMethodToString(method, t) }\r\n </MenuItemLink>\r\n );\r\n }\r\n\r\n render() {\r\n const { value, method } = this.state;\r\n const { autoFocus } = this.props;\r\n return (\r\n <Translation>\r\n { t => (\r\n <div className=\"text-filter\">\r\n <div \r\n className=\"ui action input\" \r\n >\r\n <input \r\n ref={ (c: any) => this.input = c }\r\n placeholder={ getPlaceholder(method, t) } \r\n onChange={ this.onTextChanged } \r\n value={ value }\r\n type=\"text\"\r\n autoFocus={ !useMobileLayout() && autoFocus }\r\n />\r\n <SectionedDropdown \r\n className=\"filter-method right top pointing\"\r\n button={ true }\r\n direction=\"upward\"\r\n >\r\n <MenuSection caption={ translate('Match type', t, 'table.filter') }>\r\n { Object.keys(FilterMethod)\r\n .filter(key => isNaN(Number(key)))\r\n .map(key => this.getFilterMethod(FilterMethod[key], t)) }\r\n </MenuSection>\r\n </SectionedDropdown>\r\n </div>\r\n </div>\r\n ) }\r\n </Translation>\r\n );\r\n }\r\n}\r\n\r\nexport default TableFilterDecorator<TextFilterProps>(TextFilter);","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport TextFilter, { TextFilterProps } from './TextFilter';\r\nimport Icon from 'components/semantic/Icon';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { TableFilterDecoratorProps } from 'decorators/TableFilterDecorator';\r\n\r\n\r\nconst CountInfo: React.FC<{ store: any }> = ({ store }) => {\r\n if (store.totalCount < 0) {\r\n // Not initialized yet\r\n return null;\r\n }\r\n\r\n let ret = store.totalCount;\r\n if (store.totalCount !== store.rowCount) {\r\n ret = store.rowCount + '/' + store.totalCount;\r\n }\r\n\r\n return (\r\n <div className=\"count-info\">\r\n <Icon icon={ IconConstants.FILTER }/>\r\n { ret }\r\n </div>\r\n );\r\n};\r\n\r\nexport type CustomTableFilter = React.ComponentType<TableFilterDecoratorProps>;\r\n\r\nexport interface TableFooterProps {\r\n footerData?: React.ReactNode;\r\n customFilter?: CustomTableFilter;\r\n store: any;\r\n textFilterProps?: TextFilterProps;\r\n // viewId?: string | number;\r\n}\r\n\r\nconst TableFooter: React.FC<TableFooterProps> = (\r\n { store, customFilter: CustomFilter, footerData, textFilterProps }\r\n) => (\r\n <div className=\"table-footer\">\r\n { footerData }\r\n <div className=\"filter item\">\r\n { !CustomFilter ? null : (\r\n <CustomFilter\r\n viewUrl={ store.viewUrl }\r\n />\r\n ) }\r\n <TextFilter \r\n viewUrl={ store.viewUrl }\r\n //viewId={ viewId }\r\n { ...textFilterProps }\r\n />\r\n <CountInfo store={ store }/>\r\n </div>\r\n </div>\r\n);\r\n\r\n/*TableFooter.propTypes = {\r\n customFilter: PropTypes.node,\r\n footerData: PropTypes.node,\r\n store: PropTypes.object.isRequired,\r\n};*/\r\n\r\nexport default TableFooter;","import * as React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { CellProps } from 'fixed-data-table-2';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { TFunction } from 'i18next';\r\n\r\n\r\nexport interface RowWrapperCellChildProps<\r\n CellDataT, \r\n RowDataT extends UI.ActionItemDataValueType\r\n> extends CellProps {\r\n cellData?: CellDataT;\r\n rowDataGetter?: () => RowDataT;\r\n rowData?: RowDataT;\r\n t?: TFunction;\r\n}\r\n\r\nexport interface RowWrapperCellProps extends CellProps {\r\n dataLoader: any;\r\n\r\n renderCondition?: (columnData: any, rowData: any) => boolean;\r\n rowClassNameGetter?: (rowData: any) => string;\r\n columnKey?: string; // REQUIRED, CLONED\r\n\r\n children: React.ReactElement<any>;\r\n t: TFunction;\r\n}\r\n\r\ninterface State {\r\n rowData: any;\r\n}\r\n\r\n// Generic wrapper for all cells that will handle data loading\r\nclass RowWrapperCell extends React.Component<RowWrapperCellProps> {\r\n static propTypes = {\r\n rowIndex: PropTypes.number, // required\r\n dataLoader: PropTypes.object.isRequired,\r\n width: PropTypes.number, // required\r\n };\r\n\r\n state: State = {\r\n rowData: null,\r\n };\r\n\r\n componentDidMount() {\r\n this.loadData(this.props.rowIndex!);\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: RowWrapperCellProps) {\r\n if (nextProps.rowIndex !== this.props.rowIndex) {\r\n // Remove pending update callbacks to avoid rendering each of them when the data is received\r\n // (there can be lots of pending requests when scrolling for long distances)\r\n this.props.dataLoader.removePendingRequests(this.props.rowIndex, this.onDataLoaded);\r\n }\r\n\r\n // Check if there is new data available (rowIndex may have changed as well)\r\n if (!this.loadData(nextProps.rowIndex!)) {\r\n // Avoid displaying old data\r\n this.setState({ rowData: null });\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.dataLoader.removePendingRequests(this.props.rowIndex, this.onDataLoaded);\r\n }\r\n\r\n loadData = (rowIndex: number) => {\r\n return this.props.dataLoader.updateRowData(rowIndex, this.onDataLoaded);\r\n }\r\n\r\n shouldComponentUpdate(nextProps: RowWrapperCellProps, nextState: State) {\r\n return nextState.rowData !== this.state.rowData || \r\n nextProps.width !== this.props.width;\r\n }\r\n\r\n rowDataGetter = () => {\r\n return this.state.rowData;\r\n }\r\n\r\n onDataLoaded = (data: any) => {\r\n this.setState({ rowData: data });\r\n }\r\n\r\n render() {\r\n const { columnKey, children, renderCondition, rowClassNameGetter, ...other } = this.props;\r\n const { rowData } = this.state;\r\n\r\n if (!rowData) {\r\n return null;\r\n }\r\n\r\n if (renderCondition && !renderCondition(rowData[columnKey!], rowData)) {\r\n return null;\r\n }\r\n\r\n let className = columnKey;\r\n if (!!rowClassNameGetter) {\r\n className += ' ' + rowClassNameGetter(rowData);\r\n }\r\n\r\n return (\r\n <div className={ 'cell-wrapper ' + className }>\r\n { React.cloneElement(children, {\r\n cellData: rowData[columnKey!],\r\n\r\n // Don't pass the actual row data to allow cells to skip \r\n // re-rendering using shallow equality checks when the row data is \r\n // updated without leaving them with an outdated item data\r\n rowDataGetter: this.rowDataGetter,\r\n ...other,\r\n }) }\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default RowWrapperCell;","import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport { TFunction } from 'i18next';\r\n\r\nimport { Table, ColumnProps } from 'fixed-data-table-2';\r\n\r\nimport TableActions from 'actions/TableActions';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport Measure, { ContentRect } from 'react-measure';\r\nimport RowWrapperCell from 'components/table/RowWrapperCell';\r\nimport { TextCell, HeaderCell } from 'components/table/Cell';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { textToI18nKey, toArray } from 'utils/TranslationUtils';\r\n\r\n\r\n\r\nconst TABLE_ROW_HEIGHT = 50;\r\n\r\nfunction convertStartToRows(pixels: number) {\r\n return Math.max(Math.floor(pixels / TABLE_ROW_HEIGHT), 0);\r\n}\r\n\r\nfunction convertEndToRows(pixels: number) {\r\n return Math.ceil(pixels / TABLE_ROW_HEIGHT);\r\n}\r\n\r\nexport interface TableContainerProps {\r\n entityId?: API.IdType;\r\n rowClassNameGetter?: (rowData: any) => string;\r\n store: any;\r\n dataLoader: any;\r\n t: TFunction;\r\n moduleId: string | string[];\r\n viewId?: number | string;\r\n}\r\n\r\ninterface State {\r\n width: number;\r\n height: number;\r\n columnWidths: object;\r\n}\r\n\r\n\r\nconst formatColumnName = (\r\n column: React.ReactElement<ColumnProps>, \r\n store: any, \r\n moduleId: string | string[], \r\n t: TFunction\r\n) => {\r\n const { name, columnKey } = column.props;\r\n let displayName = t(\r\n textToI18nKey(columnKey as string, [ ...toArray(moduleId), UI.SubNamespaces.TABLE ]),\r\n name\r\n );\r\n\r\n {\r\n const sortDirArrow = store.sortAscending ? ' ↑' : ' ↓';\r\n displayName += ((store.sortProperty === columnKey) ? sortDirArrow : '');\r\n }\r\n\r\n return displayName;\r\n};\r\n\r\nclass TableContainer extends React.Component<TableContainerProps, State> {\r\n static propTypes = {\r\n\r\n /**\r\n * Store implementing ViewStoreMixin that contains the items\r\n */\r\n store: PropTypes.object.isRequired,\r\n\r\n /**\r\n * Append class names to row (takes row data as param)\r\n */\r\n rowClassNameGetter: PropTypes.func,\r\n\r\n /**\r\n * ID of the current entity for non-singleton sources\r\n */\r\n entityId: PropTypes.any,\r\n\r\n \r\n dataLoader: PropTypes.any.isRequired,\r\n };\r\n\r\n state: State = {\r\n width: 0,\r\n height: 0,\r\n columnWidths: {},\r\n };\r\n\r\n getInitialProps = () => {\r\n return {\r\n rowClassNameGetter: null,\r\n entityId: null\r\n };\r\n }\r\n\r\n scrollTimer: number | undefined;\r\n scrollPosition = 0;\r\n setInitialScrollRow = true;\r\n\r\n // This will also be used for setting the initial rows\r\n componentDidUpdate(prevProps: TableContainerProps, prevState: State) {\r\n if (prevState.height !== this.state.height) {\r\n this.updateRowRange();\r\n } else if (prevProps.entityId !== this.props.entityId || prevProps.viewId !== this.props.viewId) {\r\n if (this.props.store.DEBUG) {\r\n console.log(`Enabling initial scroll, entity/viewId changed (view ${this.props.viewId})`);\r\n }\r\n\r\n this.setInitialScrollRow = true;\r\n this.updateRowRange();\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.scrollTimer);\r\n }\r\n\r\n updateRowRange = () => {\r\n const { store } = this.props;\r\n const { height } = this.state;\r\n\r\n const startRows = convertStartToRows(this.scrollPosition);\r\n const maxRows = convertEndToRows(height);\r\n\r\n if (store.DEBUG) {\r\n // tslint:disable-next-line:max-line-length\r\n console.log(`Settings changed, start: ${startRows}, end: ${maxRows}, height: ${height}`, store.viewName);\r\n }\r\n\r\n console.assert(store.active, 'Posting data for an inactive view');\r\n TableActions.setRange(store.viewUrl, startRows, maxRows);\r\n }\r\n\r\n onScrollStart = (horizontal: number, vertical: number) => {\r\n const { store } = this.props;\r\n\r\n if (store.DEBUG) {\r\n console.log(`Scrolling started: ${vertical}`, store.viewUrl);\r\n }\r\n\r\n console.assert(store.active, 'Sending pause for an inactive view');\r\n TableActions.pause(store.viewUrl, true);\r\n }\r\n\r\n onScrollEnd = (horizontal: number, vertical: number) => {\r\n const { store, viewId } = this.props;\r\n\r\n this.scrollPosition = vertical;\r\n console.assert(store.active, 'Sending pause for an inactive view');\r\n TableActions.pause(store.viewUrl, false);\r\n\r\n clearTimeout(this.scrollTimer);\r\n this.scrollTimer = window.setTimeout(this.updateRowRange, 500);\r\n\r\n if (this.setInitialScrollRow) {\r\n this.setInitialScrollRow = false;\r\n\r\n if (store.DEBUG) {\r\n console.log(`Disabling initial scroll (view ${viewId})`);\r\n }\r\n }\r\n\r\n store.setScrollData(vertical, viewId);\r\n if (store.DEBUG) {\r\n console.log(`Scrolling ended: ${vertical}`, store.viewUrl);\r\n }\r\n }\r\n\r\n onColumnClicked = (sortProperty: string) => {\r\n const { store } = this.props;\r\n\r\n let sortAscending = true;\r\n if (sortProperty === store.sortProperty && store.sortAscending) {\r\n sortAscending = false;\r\n }\r\n\r\n TableActions.setSort(this.props.store.viewUrl, sortProperty, sortAscending);\r\n }\r\n\r\n onColumnResizeEndCallback = (newColumnWidth: number, columnKey: string) => {\r\n this.setState(({ columnWidths }) => ({\r\n columnWidths: {\r\n ...columnWidths,\r\n [columnKey]: newColumnWidth,\r\n }\r\n }));\r\n }\r\n\r\n childToColumn = (column: React.ReactElement<ColumnProps>) => {\r\n if (!!column.props.hideWidth && column.props.hideWidth > this.state.width) {\r\n return null;\r\n }\r\n\r\n let { flexGrow, width, cell, columnKey, renderCondition } = column.props;\r\n const { store, rowClassNameGetter, moduleId, t } = this.props;\r\n\r\n const mobileView = useMobileLayout();\r\n if (!mobileView) {\r\n // Get column width\r\n if (!!columnKey && !!this.state.columnWidths[columnKey]) {\r\n width = this.state.columnWidths[columnKey];\r\n flexGrow = undefined;\r\n }\r\n }\r\n\r\n return React.cloneElement(column, {\r\n header: (\r\n <HeaderCell \r\n onClick={ this.onColumnClicked.bind(null, columnKey) } \r\n label={ formatColumnName(column, store, moduleId, t) }\r\n />\r\n ),\r\n flexGrow,\r\n width,\r\n isResizable: !mobileView,\r\n allowCellsRecycling: true,\r\n cell: (\t\t\t\r\n <RowWrapperCell \r\n dataLoader={ this.props.dataLoader } \r\n renderCondition={ renderCondition } \r\n rowClassNameGetter={ rowClassNameGetter }\r\n t={ t }\r\n >\r\n { cell ? cell as React.ReactElement<any> : <TextCell/> }\r\n </RowWrapperCell>\r\n ),\r\n });\r\n }\r\n\r\n onResizeView = (contentRect: ContentRect) => {\r\n if (!contentRect.bounds) {\r\n return;\r\n }\r\n\r\n // Bounds may contain incorrect (or outdated) dimensions with animations (such as when opening a modal)\r\n const { width, height } = !!contentRect.entry ? contentRect.entry : contentRect.bounds;\r\n this.setState({\r\n width,\r\n height,\r\n });\r\n }\r\n\r\n render() {\r\n // Update and insert generic columns props\r\n const children = React.Children.map(this.props.children, this.childToColumn);\r\n\r\n const { store, viewId } = this.props;\r\n return (\r\n <Measure \r\n bounds={ true }\r\n onResize={ this.onResizeView }\r\n >\r\n { ({ measureRef }) => (\r\n <div \r\n ref={ measureRef } \r\n className=\"table-container-wrapper\"\r\n >\r\n <Table\r\n width={ this.state.width }\r\n height={ this.state.height } \r\n\r\n rowHeight={ 50 }\r\n rowsCount={ store.rowCount }\r\n headerHeight={ 50 }\r\n isColumnResizing={ false }\r\n onColumnResizeEndCallback={ this.onColumnResizeEndCallback }\r\n\r\n touchScrollEnabled={ true }\r\n\r\n onScrollStart={ this.onScrollStart }\r\n onScrollEnd={ this.onScrollEnd }\r\n scrollTop={ this.setInitialScrollRow ? store.getScrollData(viewId) : undefined }\r\n >\r\n { children }\r\n </Table>\r\n </div>\r\n ) }\r\n </Measure>\r\n );\r\n }\r\n}\r\n\r\nexport default TableContainer;","\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;\n\n options.insert = insertFn.bind(null, \"head\");\n \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 PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport TableActions from 'actions/TableActions';\r\n\r\nimport TableFooter, { TableFooterProps } from './TableFooter';\r\nimport TableContainer, { TableContainerProps } from './TableContainer';\r\nimport RowDataLoader from './RowDataLoader';\r\n\r\nimport './style.css';\r\nimport 'fixed-data-table-2/dist/fixed-data-table.css';\r\n\r\nimport * as API from 'types/api';\r\nimport { Translation } from 'react-i18next';\r\n\r\n\r\ndeclare module 'fixed-data-table-2' {\r\n export interface ColumnProps {\r\n name: string;\r\n hideWidth?: number;\r\n renderCondition?: (cellData: any, rowData: any) => boolean;\r\n }\r\n}\r\n\r\nexport interface VirtualTableProps extends \r\n Omit<TableFooterProps, 't'>, \r\n Omit<TableContainerProps, 'store' | 'dataLoader' | 't'> {\r\n \r\n store: any;\r\n sessionStore?: any;\r\n sourceFilter?: API.TableFilter;\r\n emptyRowsNodeGetter?: () => React.ReactNode;\r\n}\r\n\r\nclass VirtualTable extends React.PureComponent<VirtualTableProps> {\r\n static propTypes = {\r\n // Elements to append to the table footer\r\n footerData: PropTypes.node,\r\n\r\n // Returns a node to render if there are no rows to display\r\n emptyRowsNodeGetter: PropTypes.func,\r\n\r\n // Possible ID of the current view (items will be cleared when the ID changes)\r\n viewId: PropTypes.any,\r\n\r\n // Store containing sessions (must be provided together with entityId)\r\n sessionStore: PropTypes.object,\r\n\r\n // Custom filter that will be displayed in addition to regular text filter\r\n customFilter: PropTypes.node,\r\n\r\n // Filter that is always applied for source items (those will never be displayed or included in the total count)\r\n sourceFilter: PropTypes.object,\r\n };\r\n\r\n dataLoader = new RowDataLoader(this.props.store, () => this.forceUpdate());\r\n unsubscribe = this.props.store.listen(this.dataLoader.onItemsUpdated.bind(this.dataLoader));\r\n\r\n componentDidMount() {\r\n //this._dataLoader = new RowDataLoader(this.props.store, () => this.forceUpdate() );\r\n\r\n //this.unsubscribe = this.props.store.listen(this._dataLoader.onItemsUpdated.bind(this._dataLoader));\r\n\r\n this.start(this.props.entityId);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.close(this.props.entityId);\r\n this.unsubscribe();\r\n }\r\n\r\n componentDidUpdate(prevProps: VirtualTableProps) {\r\n if (prevProps.entityId !== this.props.entityId) {\r\n this.close(prevProps.entityId);\r\n this.start(this.props.entityId);\r\n }\r\n\r\n if (prevProps.viewId !== this.props.viewId) {\r\n const { store } = this.props;\r\n if (store.paused) {\r\n // We need to receive the new items\r\n TableActions.pause(store.viewUrl, false);\r\n }\r\n\r\n TableActions.clear(store.viewUrl);\r\n }\r\n }\r\n\r\n moduleExists = (entityId: API.IdType | undefined) => {\r\n if (!entityId || !this.props.sessionStore) {\r\n return true;\r\n }\r\n\r\n return this.props.sessionStore.getSession(entityId);\r\n }\r\n\r\n start = (entityId: API.IdType | undefined) => {\r\n const { store, sourceFilter } = this.props;\r\n\r\n TableActions.init(store.viewUrl, entityId, sourceFilter);\r\n TableActions.setSort(store.viewUrl, store.sortProperty, store.sortAscending);\r\n }\r\n\r\n close = (entityId: API.IdType | undefined) => {\r\n // Don't send the close command if the session was removed\r\n TableActions.close(this.props.store.viewUrl, this.moduleExists(entityId));\r\n }\r\n\r\n render() {\r\n const { store, footerData, emptyRowsNodeGetter, customFilter, textFilterProps, ...other } = this.props;\r\n\r\n if (emptyRowsNodeGetter && store.totalCount === -1) {\r\n // Row count is unknown, don't flash the table\r\n return <div className=\"virtual-table\"/>;\r\n }\r\n\r\n if (emptyRowsNodeGetter && store.totalCount === 0) {\r\n return emptyRowsNodeGetter();\r\n }\r\n\r\n //console.log('Render virtual table');\r\n return (\r\n <div className=\"virtual-table\">\r\n <Translation>\r\n { t => (\r\n <>\r\n <TableContainer \r\n { ...other }\r\n dataLoader={ this.dataLoader }\r\n store={ store }\r\n t={ t }\r\n />\r\n\r\n <TableFooter\r\n store={ store }\r\n customFilter={ customFilter }\r\n footerData={ footerData }\r\n textFilterProps={ textFilterProps }\r\n />\r\n </>\r\n ) }\r\n </Translation>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default VirtualTable;\r\n","import SocketService from 'services/SocketService';\r\nimport update from 'immutability-helper';\r\n\r\nimport isEqual from 'lodash/isEqual';\r\n\r\nconst NUMBER_OF_ROWS_PER_REQUEST = 10;\r\nconst DEBUG = false;\r\n\r\n// This will handle fetching only when scrolling. Otherwise the data will be updated through the socket listener.\r\nclass RowDataLoader {\r\n constructor(store, onDataLoad) {\r\n this._onDataLoad = onDataLoad;\r\n this._store = store;\r\n this._data = [];\r\n this._pendingRequest = {};\r\n this._initialDataReceived = false;\r\n }\r\n\r\n clear() {\r\n this._pendingRequest = {};\r\n this._data = [];\r\n }\r\n\r\n // Returns true if the item was updated\r\n updateItem(updated, item, index) {\r\n let old = this._data[index];\r\n\r\n // Objects equal most of the time\r\n if (old === item || isEqual(this._data[index], item)) {\r\n return updated;\r\n }\r\n\r\n if (old) {\r\n this._data[index] = update(old, { $merge: item });\r\n } else {\r\n this._data[index] = update(old, { $set: item });\r\n }\r\n\r\n return updated + 1;\r\n }\r\n\r\n onItemsUpdated(items, rangeOffset = 0, rowCount) {\r\n // Rows removed?\r\n let hasChanges = rowCount < this._data.length;\r\n\r\n if (!items || items.length === 0) {\r\n // The view was cleared\r\n this.clear();\r\n hasChanges = true;\r\n\r\n this._initialDataReceived = false;\r\n\r\n if (DEBUG) {\r\n console.log('onItemsUpdated, cleared');\r\n }\r\n } else {\r\n this._initialDataReceived = true;\r\n\r\n // Remove rows outside the range\r\n // Leave the current range in case all old items can be reused \r\n // (avoids flickering because there is no need to re-render)\r\n for (let i = 0; i < this._data.length; i++) {\r\n if (!items[i]) {\r\n delete this._data[i];\r\n }\r\n }\r\n\r\n // Update rows\r\n const updatedCount = items.reduce(this.updateItem.bind(this), 0);\r\n if (updatedCount > 0 || rangeOffset !== 0) {\r\n if (DEBUG) {\r\n console.log('onItemsUpdated, changed (updatedCount, rangeOffset)', updatedCount, rangeOffset);\r\n }\r\n\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n if (hasChanges) {\r\n this._onDataLoad();\r\n }\r\n }\r\n\r\n get rangeOffset() {\r\n const ret = this._rangeOffset;\r\n this._rangeOffset = 0;\r\n return ret;\r\n }\r\n\t\r\n getRowData(rowIndex) {\r\n return this._data[rowIndex];\r\n }\r\n\r\n // onDataLoaded is called when the data is ready\r\n updateRowData(rowIndex, onDataLoaded) {\r\n const rowData = this._data[rowIndex];\r\n if (!rowData) {\r\n if (this._initialDataReceived) {\r\n this._queueRequestFor(rowIndex, onDataLoaded);\r\n }\r\n\t\t\t\r\n return false;\r\n }\r\n\r\n onDataLoaded(rowData);\r\n return true;\r\n }\r\n\r\n removePendingRequests(rowIndex, onDataLoaded) {\r\n delete this._pendingRequest[rowIndex];\r\n }\r\n\r\n _queueRequestFor(rowIndex, onDataLoaded) {\r\n const rowBase = rowIndex - (rowIndex % NUMBER_OF_ROWS_PER_REQUEST);\r\n\r\n const request = this._pendingRequest[rowIndex];\r\n if (request) {\r\n request.push(onDataLoaded);\r\n return;\r\n }\r\n\r\n this._pendingRequest[rowIndex] = [ onDataLoaded ];\r\n if (rowIndex !== rowBase) {\r\n if (this._pendingRequest[rowBase]) {\r\n return;\r\n }\r\n\r\n this._pendingRequest[rowBase] = [ ];\r\n }\r\n\r\n const endRow = Math.min(rowBase + NUMBER_OF_ROWS_PER_REQUEST, this._store.rowCount);\r\n SocketService.get(this._store.viewUrl + '/items/' + rowBase + '/' + endRow)\r\n .then(this.onRowsReceived.bind(this, rowBase))\r\n .catch(error => {\r\n console.error('Failed to load data', error);\r\n for (let i=rowBase; i < endRow; i++) {\r\n if (this._pendingRequest[i]) {\r\n delete this._pendingRequest[i];\r\n }\r\n }\r\n });\r\n }\r\n\r\n onRowsReceived(start, rows) {\r\n if (!this._pendingRequest[start]) {\r\n // View changed\r\n return;\r\n }\r\n\r\n for (let i=0; i < rows.length; i++) {\r\n const rowIndex = start+i;\r\n if (!isEqual(this._data[rowIndex], rows[i])) {\r\n this._data[rowIndex] = rows[i];\r\n\r\n if (this._pendingRequest[rowIndex]) {\r\n this._pendingRequest[rowIndex].forEach(f => f(rows[i]));\r\n }\r\n } else if (DEBUG) {\r\n console.log('onRowsReceived, row data equals', rowIndex);\r\n }\r\n\r\n delete this._pendingRequest[rowIndex];\r\n }\r\n }\r\n}\r\n\r\nexport default RowDataLoader;","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport * as API from 'types/api';\r\nimport { ErrorResponse } from 'airdcpp-apisocket';\r\n\r\n\r\ninterface FilterType {\r\n id: number;\r\n}\r\n\r\nexport interface TableFilterDecoratorProps {\r\n viewUrl: string;\r\n}\r\n\r\nexport interface TableFilterDecoratorDataProps {\r\n filter: FilterType;\r\n}\r\n\r\nexport interface TableFilterDecoratorChildProps {\r\n onFilterUpdated: (value: string | number, method?: API.FilterMethod) => void;\r\n}\r\n\r\nexport default function <PropsT>(\r\n Component: React.ComponentType<PropsT & TableFilterDecoratorChildProps>, \r\n propertyName: string = 'any'\r\n) {\r\n type Props = PropsT & TableFilterDecoratorProps & DataProviderDecoratorChildProps & TableFilterDecoratorDataProps;\r\n class TableFilterDecorator extends React.PureComponent<Props> {\r\n //static propTypes = {\r\n // viewUrl: PropTypes.string.isRequired,\r\n // filter: PropTypes.object.isRequired,\r\n //};\r\n\r\n onFilterUpdated = (pattern: string, method: API.FilterMethod = API.FilterMethod.PARTIAL) => {\r\n const data = {\r\n pattern,\r\n method,\r\n property: propertyName,\r\n } as API.TableFilter;\r\n\r\n const { viewUrl, filter } = this.props;\r\n SocketService.put(viewUrl + '/filter/' + filter.id, data)\r\n .catch((error: ErrorResponse) => console.error('Failed to add table filter'));\r\n }\r\n\r\n render() {\r\n return (\r\n <Component \r\n { ...this.props } \r\n onFilterUpdated={ this.onFilterUpdated }\r\n />\r\n );\r\n }\r\n }\r\n\r\n return DataProviderDecorator<PropsT & TableFilterDecoratorProps, TableFilterDecoratorDataProps>(\r\n TableFilterDecorator, \r\n {\r\n urls: {\r\n filter: ({ viewUrl }, socket) => socket.post(`${viewUrl}/filter`),\r\n },\r\n loaderText: null,\r\n }\r\n );\r\n}\r\n","import SocketService from 'services/SocketService';\r\nimport TableActions from 'actions/TableActions';\r\n\r\nimport invariant from 'invariant';\r\n\r\n\r\n// TODO: this should be handled on component level (instead of using global stores)\r\nexport default (defaultSortProperty, defaultSortAscending = true) => {\r\n let active = false;\r\n let totalCount = -1; // Not zero to avoid using emptyRowsNodeGetter when it's not wanted\r\n let matchingCount = 0;\r\n let startPos = 0;\r\n let items = [];\r\n let entityId = null;\r\n let paused = false;\r\n let scrollPosition = 0;\r\n const DEBUG = false;\r\n\r\n let sortProperty = defaultSortProperty;\r\n let sortAscending = defaultSortAscending;\r\n\r\n const findItem = (id) => {\r\n return items.find(item => !item ? false : item.id === id );\r\n };\r\n\r\n const clear = () => {\r\n items = [];\r\n startPos = 0;\r\n matchingCount = 0;\r\n totalCount = -1;\r\n };\r\n\r\n const addItems = (itemsObj) => {\r\n items = itemsObj.reduce((newViewItems, rawItem, index) => {\r\n // Either a new item, existing one in a different position or we are updating properties\r\n let viewItem = findItem(rawItem.id) || { id: rawItem.id };\r\n\r\n if (rawItem.properties) {\r\n viewItem = Object.assign({}, viewItem, rawItem.properties);\r\n } else if (Object.keys(viewItem).length === 1) {\r\n console.error('No properties were sent for a new view item', viewItem.id);\r\n }\r\n\r\n newViewItems[startPos + index] = viewItem;\r\n\r\n return newViewItems;\r\n }, []);\r\n };\r\n\r\n const parseDataProperties = (data) => {\r\n if (data.range_start != undefined) {\r\n startPos = data.range_start;\r\n }\r\n\r\n if (data.total_items != undefined) {\r\n totalCount = data.total_items;\r\n }\r\n\r\n if (data.matching_items != undefined) {\r\n matchingCount = data.matching_items;\r\n }\r\n\r\n if (data.items != undefined) {\r\n addItems(data.items);\r\n }\r\n };\r\n\r\n const ViewStoreMixin = {\r\n listenables: TableActions,\r\n\r\n onClose(viewUrl) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n if (this.DEBUG) {\r\n console.log(`Closing view ${this.viewUrl}`);\r\n }\r\n\r\n this._removeMessageListener();\r\n clear();\r\n\r\n active = false;\r\n this.trigger();\r\n },\r\n\r\n onClear(viewUrl) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n clear();\r\n this.trigger();\r\n },\r\n\r\n onPause(viewUrl, enabled) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n paused = enabled;\r\n },\r\n\r\n onInit(viewUrl, entity) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n invariant(!active, 'Trying start an active table view');\r\n\r\n entityId = entity;\r\n\r\n this.addMessageListener();\r\n if (this.DEBUG) {\r\n console.log(`Starting view ${this.viewUrl}`);\r\n }\r\n\r\n active = true;\r\n },\r\n\r\n onSetSort(viewUrl, property, ascending) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n sortProperty = property;\r\n sortAscending = ascending;\r\n //this.trigger(items);\r\n },\r\n\r\n addMessageListener() {\r\n this._removeMessageListener = SocketService.addViewUpdateListener(this._viewName, this._handleUpdate, entityId);\r\n },\r\n\r\n get items() {\r\n return items;\r\n },\r\n\r\n get viewUrl() {\r\n let viewUrl = this._apiUrl + '/';\r\n if (entityId) {\r\n viewUrl += entityId + '/';\r\n }\r\n\r\n viewUrl += this._viewName;\r\n return viewUrl;\r\n },\r\n\r\n get viewName() {\r\n return viewName;\r\n },\r\n\r\n get rowCount() {\r\n return matchingCount;\r\n },\r\n\r\n get totalCount() {\r\n return totalCount;\r\n },\r\n\r\n get active() {\r\n return active;\r\n },\r\n\r\n get sortProperty() {\r\n return sortProperty;\r\n },\r\n\r\n get sortAscending() {\r\n return sortAscending;\r\n },\r\n\r\n get paused() {\r\n return paused;\r\n },\r\n\r\n setScrollData(data, viewId) {\r\n if (this._sessionStore) {\r\n this._sessionStore.scroll.setScrollData(data, entityId, viewId);\r\n return;\r\n }\r\n\r\n if (this.DEBUG) {\r\n console.log(`Setting scroll position ${data} for view ${this.viewUrl} (view ID ${viewId})`);\r\n }\r\n\r\n scrollPosition = data;\r\n },\r\n\r\n getScrollData(viewId) {\r\n if (this._sessionStore) {\r\n return this._sessionStore.scroll.getScrollData(entityId, viewId);\r\n }\r\n\r\n if (this.DEBUG) {\r\n console.log(`Getting scroll position ${scrollPosition} for view ${this.viewUrl} (view ID ${viewId})`);\r\n }\r\n\r\n return scrollPosition;\r\n },\r\n\r\n _handleUpdate(data) {\r\n parseDataProperties(data);\r\n this.trigger(items, data.range_offset, matchingCount);\r\n }\r\n };\r\n\r\n return ViewStoreMixin;\r\n};\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","TableActions","asyncResult","postSettings","settings","viewUrl","action","then","data","completed","catch","error","failed","close","listen","sessionExists","that","this","Promise","resolve","setSort","sortProperty","sortAscending","sort_property","sort_ascending","setRange","rangeStart","maxRows","console","assert","range_start","max_count","pause","paused","init","entityId","filterData","source_filter","item","className","country","toLowerCase","str","getCellContent","cellData","Array","isArray","length","TextCell","HeaderCell","onClick","label","columnKey","props","Cell","FileActionCell","rowDataGetter","caption","typeInfo","type","itemData","ActionMenuCell","ActionLinkCell","actions","actionId","onClickAction","moduleId","SizeCell","t","SpeedCell","DurationCell","AbbreviatedDurationCell","IpCell","ConnectionCell","DecimalCell","FileDownloadCell","clickHandlerGetter","userGetter","downloadHandler","user","linkCaption","itemInfoGetter","CheckboxCell","onChange","checked","filterMethodToString","method","methodTitle","getFilterMethodCaption","getPlaceholder","ret","TextFilter","state","value","onFilterUpdated","onTextChanged","event","setState","target","clearTimeout","timer","window","setTimeout","onMethodChanged","input","focus","getFilterMethod","isCurrent","MenuItemLink","active","componentWillUnmount","render","autoFocus","Translation","ref","c","placeholder","SectionedDropdown","button","direction","MenuSection","Object","keys","filter","key","isNaN","Number","map","defaultProps","TableFilterDecorator","CountInfo","store","totalCount","rowCount","Icon","icon","IconConstants","customFilter","CustomFilter","footerData","textFilterProps","RowWrapperCell","rowData","loadData","rowIndex","dataLoader","updateRowData","onDataLoaded","componentDidMount","UNSAFE_componentWillReceiveProps","nextProps","removePendingRequests","shouldComponentUpdate","nextState","width","children","renderCondition","rowClassNameGetter","other","propTypes","formatColumnName","column","name","displayName","sortDirArrow","TableContainer","height","columnWidths","getInitialProps","scrollPosition","setInitialScrollRow","updateRowRange","startRows","pixels","Math","max","floor","ceil","convertEndToRows","DEBUG","log","viewName","onScrollStart","horizontal","vertical","onScrollEnd","viewId","scrollTimer","setScrollData","onColumnClicked","onColumnResizeEndCallback","newColumnWidth","childToColumn","hideWidth","flexGrow","cell","mobileView","undefined","header","bind","isResizable","allowCellsRecycling","onResizeView","contentRect","bounds","entry","componentDidUpdate","prevProps","prevState","onResize","measureRef","Table","rowHeight","rowsCount","headerHeight","isColumnResizing","touchScrollEnabled","scrollTop","getScrollData","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","VirtualTable","constructor","onDataLoad","_onDataLoad","_store","_data","_pendingRequest","_initialDataReceived","clear","updateItem","updated","index","old","$merge","$set","onItemsUpdated","items","rangeOffset","hasChanges","i","reduce","_rangeOffset","getRowData","_queueRequestFor","rowBase","request","endRow","min","SocketService","onRowsReceived","start","rows","forEach","f","forceUpdate","unsubscribe","moduleExists","sessionStore","getSession","sourceFilter","emptyRowsNodeGetter","Component","propertyName","pattern","property","urls","socket","post","loaderText","defaultSortProperty","defaultSortAscending","matchingCount","startPos","listenables","onClose","_removeMessageListener","trigger","onClear","onPause","enabled","onInit","entity","addMessageListener","onSetSort","ascending","_viewName","_handleUpdate","_apiUrl","_sessionStore","scroll","itemsObj","total_items","matching_items","newViewItems","rawItem","viewItem","find","properties","assign","parseDataProperties","range_offset"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"js/424.2b137728423ffe5720b9.chunk.js","mappings":"iKAGIA,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACC,EAAOC,GAAI,k+FAAm+F,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,8CAA8C,MAAQ,GAAG,SAAW,w5BAAw5B,eAAiB,CAAC,m+FAAm+F,WAAa,MAErgO,W,6ECDA,MAAMC,EAAe,kBAAqB,CACxC,CAAE,SAAY,CAAEC,aAAa,IAC7B,CAAE,QAAW,CAAEA,aAAa,IAC5B,CAAE,MAAS,CAAEA,aAAa,IAC1B,CAAE,MAAS,CAAEA,aAAa,IAC1B,CAAE,KAAQ,CAAEA,aAAa,IACzB,UAGIC,EAAe,CAACC,EAAUC,EAASC,IAChC,SAAmBD,EAAU,YAAaD,GAC9CG,MAAKC,GAAQF,EAAOG,UAAUJ,EAASG,KACvCE,OAAMC,GAASL,EAAOM,OAAOP,EAASM,KAG3CV,EAAaY,MAAMC,QAAO,SAAUT,EAASU,GAC3C,GAAIA,GAAiB,wBAAgC,CACnD,IAAIC,EAAOC,KACX,OAAO,WAAqBZ,GACzBE,MAAKC,GAAQQ,EAAKP,UAAUJ,EAASG,KACrCE,OAAMC,GAASM,KAAKL,OAAOP,EAASM,KAGzC,OAAOO,QAAQC,aAGjBlB,EAAamB,QAAQN,QAAO,SAAUT,EAASgB,EAAcC,GAC3DnB,EAAa,CACXoB,cAAeF,EACfG,eAAgBF,GACfjB,EAASY,SAGdhB,EAAawB,SAASX,QAAO,SAAUT,EAASqB,EAAYC,GAC1DC,QAAQC,OAAOF,EAAU,EAAG,oBAC5BxB,EAAa,CACX2B,YAAaJ,EACbK,UAAWJ,GACVtB,EAASY,SAGdhB,EAAa+B,MAAMlB,QAAO,SAAUT,EAAS2B,GAC3C7B,EAAa,CACX8B,OAAQD,GACP3B,EAASY,SAGdhB,EAAaiC,KAAKpB,QAAO,SAAUT,EAAS8B,EAAUC,GAChDA,GACFjC,EAAa,CACXkC,cAAeD,GACd/B,EAASY,SAKhB,W,kEClDA,MAWA,EAXgD,EAAGqB,KAAAA,MACjD,+BAAKC,UAAU,WAAS,YACtB,cAAGA,UAAY,WAAaD,EAAKE,QAAQC,oBAAa,GACpDH,EAAKI,YAAG,I,olBCUd,MAAMC,EAAkBC,GACE,iBAAbA,EACFC,MAAMC,QAAQF,GAAYA,EAASG,OAASH,EAASF,IAO7C,IAAbE,EACK,KAGFA,EAIII,EAAW,EAAGJ,SAAAA,MACzB,+BAAML,UAAU,mBAAiB,UAC7BI,EAAeC,UAAS,GAWjBK,EAAc,I,IAAA,QAAEC,EAAO,MAAEC,EAAK,UAAEC,GAAS,EAAKC,EAAK,IAArC,iCAA6D,OACtF,SAAC,EAAAC,KAAI,iBAAMD,EAAK,WACd,4BAAGH,QAAUA,GAAO,UAChBC,SAAK,UACL,IAcKI,EACX,I,IAAA,SAAEX,EAAQ,cAAEY,GAAa,EAAKH,EAAK,IAAnC,8BACG,OACH,SAAC,KAAe,eACdI,SACE,SAAC,IAAa,CACZC,SAAWF,IAAiBG,KAC5BF,QAAUb,QAAQ,GAGtBgB,SAAWJ,GACNH,QAAK,IAIDQ,EACX,I,IAAA,SAAEjB,EAAQ,cAAEY,GAAa,EAAKH,EAAK,IAAnC,8BACG,OACH,SAAC,KAAe,eACdI,QAAUb,EACVgB,SAAWJ,GACNH,QAAK,IAcDS,EACX,I,IAAA,SACElB,EAAQ,cACRY,EAAa,QAGbO,EAAO,SAAEC,GAAQ,EACdX,EAAK,IANV,mDASA,MAAM/C,EAASyD,EAAQA,QAAQC,GAC/B,OAAK,QAAW1D,EAAQkD,MAUtB,SAAC,IAAsB,UACnB,EAAGS,cAAAA,MACH,4BACE1B,UAAU,kBACVW,QAAU,IAAMe,EAAc,CAC5BD,SAAAA,EACA1D,OAAAA,EACA4D,SAAUH,EAAQG,SAClBN,SAAUJ,OACV,UAEAb,EAAeC,UAAS,SAE7B,IArBD,SAACI,EAAQ,eACPJ,SAAWA,GACNS,QAAK,IAyCLc,EAAsC,EAAGvB,SAAAA,EAAUwB,EAAAA,MAC9D,+BAAM7B,UAAU,mBAAiB,WAC7B,QAAWK,EAAWwB,UAAG,GAIlBC,EAAuC,EAAGzB,SAAAA,EAAUwB,EAAAA,MAC/D,+BAAM7B,UAAU,oBAAkB,WAC9B,QAAYK,EAAWwB,UAAG,GAUnBE,EAA0C,EAAG1B,SAAAA,MACxD,+BAAML,UAAU,uBAAqB,WACjC,QAAmBK,UAAU,GAItB2B,EAAqD,EAAG3B,SAAAA,MACnE,+BAAML,UAAU,4BAA0B,WACtC,QAA0BK,UAAU,GAQ7B4B,EAAgC,EAAG5B,SAAAA,MAC9C,SAAC,IAAW,CAACN,KAAOM,QAAS,GAGlB6B,EAA4C,EAAG7B,SAAAA,EAAUwB,EAAAA,MACpE,+BAAM7B,UAAU,yBAAuB,WACnC,QAAiBK,EAAWwB,UAAG,GAIxBM,EAAyC,EAAG9B,SAAAA,MACvD,+BAAML,UAAU,sBAAoB,WAChC,QAAcK,UAAU,GAcjB+B,EACX,I,IAAA,SAAE/B,EAAQ,cAAEY,EAAa,mBAAEoB,EAAkB,WAC3CC,EAAU,gBAAEC,GAAe,EAAKzB,EAAK,IADvC,kFAGG,OACH,SAAC,KAAiB,eAChBI,SACE,SAAC,IAAa,CACZC,SAAWF,IAAiBG,KAC5BT,QAAU0B,EAAqBA,EAAmBhC,EAAUY,GAAkB,KAC9EC,QAAUb,QAAQ,GAGtBmC,KAAOF,EAAWrB,KAClBwB,aAAgBJ,EAChBK,eAAiBzB,EACjBsB,gBAAkBA,GACbzB,QAAK,IAoBD6B,EAA6C,I,IAAA,SAAEtC,EAAQ,cAAEY,EAAa,SAAE2B,GAAQ,EAAK9B,EAAK,IAA7C,yCAAoD,OAC5G,SAAC,IAAQ,eACP+B,QAAUxC,EACVuC,SAAWC,GAAWD,EAASC,EAAS5B,MACnCH,QAAK,K,gLC1Pd,MASMgC,EAAuB,CAACC,EAAsBlB,KAClD,MAAMmB,EAVuB,CAACD,IAC9B,OAAQA,GACR,KAAK,WAAoB,MAAO,QAChC,KAAK,cAAuB,MAAO,WACnC,KAAK,WAAoB,MAAO,QAChC,QAAS,MAAO,YAKIE,CAAuBF,GAC3C,OAAO,QAAUC,EAAanB,EAAG,iBAG7BqB,EAAiB,CAACH,EAAsBlB,KAC5C,IAAIsB,EAAMtB,EAAE,sBAAuB,UAKnC,OAJIkB,IAAW,eACbI,GAAO,KAAKL,EAAqBC,EAAQlB,GAAG3B,kBAGvCiD,EAAM,OAOf,MAAMC,UAAmB,gBAAzB,c,oBACE,KAAAC,MAAQ,CACNC,MAAO,GACPP,OAAQ,cAcV,KAAAQ,gBAAkB,KAChB,MAAM,MAAED,EAAK,OAAEP,GAAWrE,KAAK2E,MAC/B3E,KAAKoC,MAAMyC,gBAAgBD,EAAOP,IAGpC,KAAAS,cAAiBC,IACf/E,KAAKgF,SAAS,CACZJ,MAAOG,EAAME,OAAOL,QAGtBM,aAAalF,KAAKmF,OAElBnF,KAAKmF,MAAQC,OAAOC,YAClB,KACErF,KAAK6E,oBAEP,MAIJ,KAAAS,gBAAmBjB,IACjBrE,KAAKgF,SAAS,CACZX,OAAAA,IAGFgB,YAAW,IAAMrF,KAAK6E,oBACtB7E,KAAKuF,MAAMC,SAGb,KAAAC,gBAAkB,CAACpB,EAAsBlB,KACvC,MAAMuC,EAAYrB,IAAWrE,KAAK2E,MAAMN,OACxC,OACE,SAACsB,EAAA,EAAY,eAEX1D,QAAU,IAAMjC,KAAKsF,gBAAgBjB,GACrCuB,OAASF,GAAS,UAEhBtB,EAAqBC,EAAQlB,KAJzBkB,IArCZwB,uBACEX,aAAalF,KAAKmF,OA6CpBW,SACE,MAAM,MAAElB,EAAK,OAAEP,GAAWrE,KAAK2E,OACzB,UAAEoB,GAAc/F,KAAKoC,MAC3B,OACE,SAAC4D,EAAA,EAAW,UACR7C,IACA,8BAAK7B,UAAU,eAAa,WAC1B,+BACEA,UAAU,mBAAiB,YAE3B,kBACE2E,IAAOC,GAAWlG,KAAKuF,MAAQW,EAC/BC,YAAc3B,EAAeH,EAAQlB,GACrCe,SAAWlE,KAAK8E,cAChBF,MAAQA,EACRlC,KAAK,OACLqD,YAAa,WAAqBA,QAAS,IAE7C,SAACK,EAAA,EAAiB,eAChB9E,UAAU,mCACV+E,QAAS,EACTC,UAAU,UAAQ,WAElB,SAACC,EAAA,EAAW,eAAC/D,SAAU,QAAU,aAAcW,EAAG,iBAAe,UAC7DqD,OAAOC,KAAK,MACXC,QAAOC,GAAOC,MAAMC,OAAOF,MAC3BG,KAAIH,GAAO3G,KAAKyF,gBAAgB,KAAakB,GAAMxD,YAAG,UAC7C,WACI,UAChB,SAET,IAjFA,EAAA4D,aAAmD,CACxDhB,WAAW,GAsFf,SAAe,EAAAiB,EAAA,GAAsCtC,G,0BCjIrD,MAAMuC,EAAsC,EAAGC,MAAAA,MAC7C,GAAIA,EAAMC,WAAa,EAErB,OAAO,KAGT,IAAI1C,EAAMyC,EAAMC,WAKhB,OAJID,EAAMC,aAAeD,EAAME,WAC7B3C,EAAMyC,EAAME,SAAW,IAAMF,EAAMC,aAInC,+BAAK7F,UAAU,cAAY,YACzB,SAAC+F,EAAA,EAAI,CAACC,KAAOC,EAAA,eAAoB,GAC/B9C,UAAG,IA0CX,EA3BgD,EAC5CyC,MAAAA,EAAOM,aAAcC,EAAcC,WAAAA,EAAYC,gBAAAA,MAEjD,+BAAKrG,UAAU,gBAAc,WACzBoG,GACF,+BAAKpG,UAAU,eAAa,WACvBmG,GACD,SAACA,EAAY,CACXrI,QAAU8H,EAAM9H,cAAO,GAFT,MAKlB,SAAC,EAAU,eACTA,QAAU8H,EAAM9H,SAEXuI,QAAe,IAEtB,SAACV,EAAS,CAACC,MAAQA,QAAK,WAAI,WACxB,G,0BCrBV,MAAMU,UAAuB,YAA7B,c,oBAOE,KAAAjD,MAAe,CACbkD,QAAS,MAyBX,KAAAC,SAAYC,GACH/H,KAAKoC,MAAM4F,WAAWC,cAAcF,EAAU/H,KAAKkI,cAQ5D,KAAA3F,cAAgB,IACPvC,KAAK2E,MAAMkD,QAGpB,KAAAK,aAAgB3I,IACdS,KAAKgF,SAAS,CAAE6C,QAAStI,KApC3B4I,oBACEnI,KAAK8H,SAAS9H,KAAKoC,MAAM2F,UAG3BK,iCAAiCC,GAC3BA,EAAUN,WAAa/H,KAAKoC,MAAM2F,UAGpC/H,KAAKoC,MAAM4F,WAAWM,sBAAsBtI,KAAKoC,MAAM2F,SAAU/H,KAAKkI,cAInElI,KAAK8H,SAASO,EAAUN,WAE3B/H,KAAKgF,SAAS,CAAE6C,QAAS,OAI7BhC,uBACE7F,KAAKoC,MAAM4F,WAAWM,sBAAsBtI,KAAKoC,MAAM2F,SAAU/H,KAAKkI,cAOxEK,sBAAsBF,EAAgCG,GACpD,OAAOA,EAAUX,UAAY7H,KAAK2E,MAAMkD,SACtCQ,EAAUI,QAAUzI,KAAKoC,MAAMqG,MAWnC3C,SACE,MAAM,EAAyE9F,KAAKoC,OAA9E,UAAED,EAAS,SAAEuG,EAAQ,gBAAEC,EAAe,mBAAEC,GAAkB,EAAKC,E,yUAAK,GAApE,kEACA,QAAEhB,GAAY7H,KAAK2E,MAEzB,IAAKkD,EACH,OAAO,KAGT,GAAIc,IAAoBA,EAAgBd,EAAQ1F,GAAa0F,GAC3D,OAAO,KAGT,IAAIvG,EAAYa,EAKhB,OAJMyG,IACJtH,GAAa,IAAMsH,EAAmBf,KAItC,8BAAKvG,UAAY,gBAAkBA,GAAS,UACxC,eAAmBoH,EAAU,OAAF,QAC3B/G,SAAUkG,EAAQ1F,GAKlBI,cAAevC,KAAKuC,eACjBsG,WACH,IA5ED,EAAAC,UAAY,CACjBf,SAAU,WACVC,WAAY,sBACZS,MAAO,YA+EX,U,0BCtEA,MAAMM,EAAmB,CACvBC,EACA9B,EACAjE,EACAE,KAEA,MAAM,KAAE8F,EAAI,UAAE9G,GAAc6G,EAAO5G,MACnC,IAAI8G,EAAc/F,GAChB,QAAchB,EAAqB,KAAK,QAAQc,GAAW,aAC3DgG,GAGF,CACE,MAAME,EAAejC,EAAM7G,cAAgB,KAAO,KAClD6I,GAAiBhC,EAAM9G,eAAiB+B,EAAagH,EAAe,GAGtE,OAAOD,GAGT,MAAME,UAAuB,YAA7B,c,oBAsBE,KAAAzE,MAAe,CACb8D,MAAO,EACPY,OAAQ,EACRC,aAAc,IAGhB,KAAAC,gBAAkB,KACT,CACLX,mBAAoB,KACpB1H,SAAU,OAKd,KAAAsI,eAAiB,EACjB,KAAAC,qBAAsB,EAoBtB,KAAAC,eAAiB,KACf,MAAM,MAAExC,GAAUlH,KAAKoC,OACjB,OAAEiH,GAAWrJ,KAAK2E,MAElBgF,GA1GkBC,EA0Ga5J,KAAKwJ,eAzGrCK,KAAKC,IAAID,KAAKE,MAAMH,EAHJ,IAGgC,IADzD,IAA4BA,EA2GxB,MAAMlJ,EAvGV,SAA0BkJ,GACxB,OAAOC,KAAKG,KAAKJ,EAPM,IA6GLK,CAAiBZ,GAE7BnC,EAAMgD,OAERvJ,QAAQwJ,IAAI,4BAA4BR,WAAmBjJ,cAAoB2I,IAAUnC,EAAMkD,UAGjGzJ,QAAQC,OAAOsG,EAAMtB,OAAQ,qCAC7B5G,EAAA,WAAsBkI,EAAM9H,QAASuK,EAAWjJ,IAGlD,KAAA2J,cAAgB,CAACC,EAAoBC,KACnC,MAAM,MAAErD,GAAUlH,KAAKoC,MAEnB8E,EAAMgD,OACRvJ,QAAQwJ,IAAI,sBAAsBI,IAAYrD,EAAM9H,SAGtDuB,QAAQC,OAAOsG,EAAMtB,OAAQ,sCAC7B5G,EAAA,QAAmBkI,EAAM9H,SAAS,IAGpC,KAAAoL,YAAc,CAACF,EAAoBC,KACjC,MAAM,MAAErD,EAAK,OAAEuD,GAAWzK,KAAKoC,MAE/BpC,KAAKwJ,eAAiBe,EACtB5J,QAAQC,OAAOsG,EAAMtB,OAAQ,sCAC7B5G,EAAA,QAAmBkI,EAAM9H,SAAS,GAElC8F,aAAalF,KAAK0K,aAClB1K,KAAK0K,YAActF,OAAOC,WAAWrF,KAAK0J,eAAgB,KAEtD1J,KAAKyJ,sBACPzJ,KAAKyJ,qBAAsB,EAEvBvC,EAAMgD,OACRvJ,QAAQwJ,IAAI,kCAAkCM,OAIlDvD,EAAMyD,cAAcJ,EAAUE,GAC1BvD,EAAMgD,OACRvJ,QAAQwJ,IAAI,oBAAoBI,IAAYrD,EAAM9H,UAItD,KAAAwL,gBAAmBxK,IACjB,MAAM,MAAE8G,GAAUlH,KAAKoC,MAEvB,IAAI/B,GAAgB,EAChBD,IAAiB8G,EAAM9G,cAAgB8G,EAAM7G,gBAC/CA,GAAgB,GAGlBrB,EAAA,UAAqBgB,KAAKoC,MAAM8E,MAAM9H,QAASgB,EAAcC,IAG/D,KAAAwK,0BAA4B,CAACC,EAAwB3I,KACnDnC,KAAKgF,UAAS,EAAGsE,aAAAA,MAAmB,CAClCA,aAAc,OAAF,wBACPA,GAAY,CACf,CAACnH,GAAY2I,SAKnB,KAAAC,cAAiB/B,IACf,GAAMA,EAAO5G,MAAM4I,WAAahC,EAAO5G,MAAM4I,UAAYhL,KAAK2E,MAAM8D,MAClE,OAAO,KAGT,IAAI,SAAEwC,EAAQ,MAAExC,EAAK,KAAEyC,EAAI,UAAE/I,EAAS,gBAAEwG,GAAoBK,EAAO5G,MACnE,MAAM,MAAE8E,EAAK,mBAAE0B,EAAkB,SAAE3F,EAAQ,EAAEE,GAAMnD,KAAKoC,MAElD+I,GAAa,UASnB,OARKA,GAEGhJ,GAAenC,KAAK2E,MAAM2E,aAAanH,KAC3CsG,EAAQzI,KAAK2E,MAAM2E,aAAanH,GAChC8I,OAAWG,GAIR,eAAmBpC,EAAQ,CAChCqC,QACE,SAAC,KAAU,CACTpJ,QAAUjC,KAAK4K,gBAAgBU,KAAK,KAAMnJ,GAC1CD,MAAQ6G,EAAiBC,EAAQ9B,EAAOjE,EAAUE,SAAE,GAGxD8H,SAAAA,EACAxC,MAAAA,EACA8C,aAAcJ,EACdK,qBAAqB,EACrBN,MACE,SAAC,EAAc,eACblD,WAAahI,KAAKoC,MAAM4F,WACxBW,gBAAkBA,EAClBC,mBAAqBA,EACrBzF,EAAIA,GAAC,UAEH+H,IAAyC,SAAC,KAAQ,kBAAE,MAM9D,KAAAO,aAAgBC,IACd,IAAKA,EAAYC,OACf,OAIF,MAAM,MAAElD,EAAK,OAAEY,GAAaqC,EAAYE,MAAQF,EAAYE,MAAQF,EAAYC,OAChF3L,KAAKgF,SAAS,CACZyD,MAAAA,EACAY,OAAAA,KA1IJwC,mBAAmBC,EAAgCC,GAC7CA,EAAU1C,SAAWrJ,KAAK2E,MAAM0E,OAClCrJ,KAAK0J,iBACIoC,EAAU5K,WAAalB,KAAKoC,MAAMlB,UAAY4K,EAAUrB,SAAWzK,KAAKoC,MAAMqI,SACnFzK,KAAKoC,MAAM8E,MAAMgD,OACnBvJ,QAAQwJ,IAAI,wDAAwDnK,KAAKoC,MAAMqI,WAGjFzK,KAAKyJ,qBAAsB,EAC3BzJ,KAAK0J,kBAIT7D,uBACEX,aAAalF,KAAK0K,aAgIpB5E,SAEE,MAAM4C,EAAW,eAAmB1I,KAAKoC,MAAMsG,SAAU1I,KAAK+K,gBAExD,MAAE7D,EAAK,OAAEuD,GAAWzK,KAAKoC,MAC/B,OACE,SAAC,IAAO,eACNuJ,QAAS,EACTK,SAAWhM,KAAKyL,cAAY,UAE1B,EAAGQ,WAAAA,MACH,8BACEhG,IAAMgG,EACN3K,UAAU,2BAAyB,WAEnC,SAAC,EAAA4K,MAAK,eACJzD,MAAQzI,KAAK2E,MAAM8D,MACnBY,OAASrJ,KAAK2E,MAAM0E,OAEpB8C,UAAY,GACZC,UAAYlF,EAAME,SAClBiF,aAAe,GACfC,kBAAmB,EACnBzB,0BAA4B7K,KAAK6K,0BAEjC0B,oBAAqB,EAErBlC,cAAgBrK,KAAKqK,cACrBG,YAAcxK,KAAKwK,YACnBgC,UAAYxM,KAAKyJ,oBAAsBvC,EAAMuF,cAAchC,QAAUW,GAAS,UAE5E1C,SAAQ,UACJ,UAEX,IAvNA,EAAAI,UAAY,CAKjB5B,MAAO,sBAKP0B,mBAAoB,SAKpB1H,SAAU,QAGV8G,WAAY,oBA2MhB,U,wLCtRI0E,EAAU,GAEdA,EAAQC,kBAAoB,IAC5BD,EAAQE,cAAgB,IAElBF,EAAQG,OAAS,SAAc,KAAM,QAE3CH,EAAQI,OAAS,IACjBJ,EAAQK,mBAAqB,IAEhB,IAAI,IAASL,GAKJ,KAAW,YAAiB,W,SCQlD,MAAMM,UAAqB,gBAA3B,c,oBAqBE,KAAAhF,WAAa,IC9Cf,MACEiF,YAAY/F,EAAOgG,GACjBlN,KAAKmN,YAAcD,EACnBlN,KAAKoN,OAASlG,EACdlH,KAAKqN,MAAQ,GACbrN,KAAKsN,gBAAkB,GACvBtN,KAAKuN,sBAAuB,EAG9BC,QACExN,KAAKsN,gBAAkB,GACvBtN,KAAKqN,MAAQ,GAIfI,WAAWC,EAASrM,EAAMsM,GACxB,IAAIC,EAAM5N,KAAKqN,MAAMM,GAGrB,OAAIC,IAAQvM,GAAQ,IAAQrB,KAAKqN,MAAMM,GAAQtM,GACtCqM,GAIP1N,KAAKqN,MAAMM,GADTC,EACkB,IAAOA,EAAK,CAAEC,OAAQxM,IAEtB,IAAOuM,EAAK,CAAEE,KAAMzM,IAGnCqM,EAAU,GAGnBK,eAAeC,EAAOC,EAAc,EAAG7G,GAErC,IAAI8G,EAAa9G,EAAWpH,KAAKqN,MAAMvL,OAEvC,GAAKkM,GAA0B,IAAjBA,EAAMlM,OAUb,CACL9B,KAAKuN,sBAAuB,EAK5B,IAAK,IAAIY,EAAI,EAAGA,EAAInO,KAAKqN,MAAMvL,OAAQqM,IAChCH,EAAMG,WACFnO,KAAKqN,MAAMc,IAKDH,EAAMI,OAAOpO,KAAKyN,WAAWnC,KAAKtL,MAAO,GAC3C,GAAqB,IAAhBiO,KAKtBC,GAAa,QA3BflO,KAAKwN,QACLU,GAAa,EAEblO,KAAKuN,sBAAuB,EA4B1BW,GACFlO,KAAKmN,cAIT,kBACE,MAAM1I,EAAMzE,KAAKqO,aAEjB,OADArO,KAAKqO,aAAe,EACb5J,EAGT6J,WAAWvG,GACT,OAAO/H,KAAKqN,MAAMtF,GAIpBE,cAAcF,EAAUG,GACtB,MAAML,EAAU7H,KAAKqN,MAAMtF,GAC3B,OAAKF,GAQLK,EAAaL,IACN,IARD7H,KAAKuN,sBACPvN,KAAKuO,iBAAiBxG,EAAUG,IAG3B,GAOXI,sBAAsBP,EAAUG,UACvBlI,KAAKsN,gBAAgBvF,GAG9BwG,iBAAiBxG,EAAUG,GACzB,MAAMsG,EAAUzG,EAAYA,EA5GG,GA8GzB0G,EAAUzO,KAAKsN,gBAAgBvF,GACrC,GAAI0G,EAEF,YADAA,EAAQ5P,KAAKqJ,GAKf,GADAlI,KAAKsN,gBAAgBvF,GAAY,CAAEG,GAC/BH,IAAayG,EAAS,CACxB,GAAIxO,KAAKsN,gBAAgBkB,GACvB,OAGFxO,KAAKsN,gBAAgBkB,GAAW,GAGlC,MAAME,EAAS7E,KAAK8E,IAAIH,EA7HO,GA6H+BxO,KAAKoN,OAAOhG,UAC1EwH,EAAA,MAAkB5O,KAAKoN,OAAOhO,QAAU,UAAYoP,EAAU,IAAME,GACjEpP,KAAKU,KAAK6O,eAAevD,KAAKtL,KAAMwO,IACpC/O,OAAMC,IACLiB,QAAQjB,MAAM,sBAAuBA,GACrC,IAAK,IAAIyO,EAAEK,EAASL,EAAIO,EAAQP,IAC1BnO,KAAKsN,gBAAgBa,WAChBnO,KAAKsN,gBAAgBa,MAMtCU,eAAeC,EAAOC,GACpB,GAAK/O,KAAKsN,gBAAgBwB,GAK1B,IAAK,IAAIX,EAAE,EAAGA,EAAIY,EAAKjN,OAAQqM,IAAK,CAClC,MAAMpG,EAAW+G,EAAMX,EAClB,IAAQnO,KAAKqN,MAAMtF,GAAWgH,EAAKZ,MACtCnO,KAAKqN,MAAMtF,GAAYgH,EAAKZ,GAExBnO,KAAKsN,gBAAgBvF,IACvB/H,KAAKsN,gBAAgBvF,GAAUiH,SAAQC,GAAKA,EAAEF,EAAKZ,cAMhDnO,KAAKsN,gBAAgBvF,MD1GD/H,KAAKoC,MAAM8E,OAAO,IAAMlH,KAAKkP,gBAC5D,KAAAC,YAAcnP,KAAKoC,MAAM8E,MAAMrH,OAAOG,KAAKgI,WAAW+F,eAAezC,KAAKtL,KAAKgI,aAgC/E,KAAAoH,aAAgBlO,IACTA,IAAalB,KAAKoC,MAAMiN,cAItBrP,KAAKoC,MAAMiN,aAAaC,WAAWpO,GAG5C,KAAA4N,MAAS5N,IACP,MAAM,MAAEgG,EAAK,aAAEqI,GAAiBvP,KAAKoC,MAErCpD,EAAA,OAAkBkI,EAAM9H,QAAS8B,EAAUqO,GAC3CvQ,EAAA,UAAqBkI,EAAM9H,QAAS8H,EAAM9G,aAAc8G,EAAM7G,gBAGhE,KAAAT,MAASsB,IAEPlC,EAAA,QAAmBgB,KAAKoC,MAAM8E,MAAM9H,QAASY,KAAKoP,aAAalO,KA/CjEiH,oBAKEnI,KAAK8O,MAAM9O,KAAKoC,MAAMlB,UAGxB2E,uBACE7F,KAAKJ,MAAMI,KAAKoC,MAAMlB,UACtBlB,KAAKmP,cAGPtD,mBAAmBC,GAMjB,GALIA,EAAU5K,WAAalB,KAAKoC,MAAMlB,WACpClB,KAAKJ,MAAMkM,EAAU5K,UACrBlB,KAAK8O,MAAM9O,KAAKoC,MAAMlB,WAGpB4K,EAAUrB,SAAWzK,KAAKoC,MAAMqI,OAAQ,CAC1C,MAAM,MAAEvD,GAAUlH,KAAKoC,MACnB8E,EAAMlG,QAERhC,EAAA,QAAmBkI,EAAM9H,SAAS,GAGpCJ,EAAA,QAAmBkI,EAAM9H,UAwB7B0G,SACE,MAAM,EAAsF9F,KAAKoC,OAA3F,MAAE8E,EAAK,WAAEQ,EAAU,oBAAE8H,EAAmB,aAAEhI,EAAY,gBAAEG,GAAe,EAAKkB,E,yUAAK,GAAjF,+EAEN,OAAI2G,IAA6C,IAAtBtI,EAAMC,YAExB,gBAAK7F,UAAU,sBAAe,GAGnCkO,GAA4C,IAArBtI,EAAMC,WACxBqI,KAKP,8BAAKlO,UAAU,iBAAe,WAC5B,SAAC0E,EAAA,EAAW,UACR7C,IACA,iCACE,SAAC,EAAc,iBACR0F,EAAK,CACVb,WAAahI,KAAKgI,WAClBd,MAAQA,EACR/D,SAAK,IAGP,SAAC,EAAW,CACV+D,MAAQA,EACRM,aAAeA,EACfE,WAAaA,EACbC,gBAAkBA,QAAe,UACjC,SAEL,UACW,IA1Gb,EAAAmB,UAAY,CAEjBpB,WAAY,SAGZ8H,oBAAqB,SAGrB/E,OAAQ,QAGR4E,aAAc,WAGd7H,aAAc,SAGd+H,aAAc,YA+FlB,W,0FEzHe,SAAS,EACtBE,EACAC,EAAuB,OAGvB,MAAM1I,UAA6B,gBAAnC,c,oBAME,KAAAnC,gBAAkB,CAAC8K,EAAiBtL,EAA2B,gBAC7D,MAAM9E,EAAO,CACXoQ,QAAAA,EACAtL,OAAAA,EACAuL,SAAUF,IAGN,QAAEtQ,EAAO,OAAEsH,GAAW1G,KAAKoC,MACjC,QAAkBhD,EAAU,WAAasH,EAAO3H,GAAIQ,GACjDE,OAAOC,GAAyBiB,QAAQjB,MAAM,iCAGnDoG,SACE,OACE,SAAC2J,EAAS,iBACHzP,KAAKoC,MAAK,CACfyC,gBAAkB7E,KAAK6E,uBAAe,IAM9C,OAAO,OACLmC,EACA,CACE6I,KAAM,CACJnJ,OAAQ,EAAGtH,QAAAA,GAAW0Q,IAAWA,EAAOC,KAAK,GAAG3Q,aAElD4Q,WAAY,S,6EC1DlB,SAAgBC,EAAqBC,GAAuB,KAC1D,IAAItK,GAAS,EACTuB,GAAc,EACdgJ,EAAgB,EAChBC,EAAW,EACXpC,EAAQ,GACR9M,EAAW,KACXF,GAAS,EACTwI,EAAiB,EAGjBpJ,EAAe6P,EACf5P,EAAgB6P,EAEpB,MAIM1C,EAAQ,KACZQ,EAAQ,GACRoC,EAAW,EACXD,EAAgB,EAChBhJ,GAAc,GAkLhB,MA5IuB,CACrBkJ,YAAa,IAEbC,QAAQlR,GACFA,IAAYY,KAAKZ,UAIjBY,KAAKkK,OACPvJ,QAAQwJ,IAAI,gBAAgBnK,KAAKZ,WAGnCY,KAAKuQ,yBACL/C,IAEA5H,GAAS,EACT5F,KAAKwQ,YAGPC,QAAQrR,GACFA,IAAYY,KAAKZ,UAIrBoO,IACAxN,KAAKwQ,YAGPE,QAAQtR,EAASuR,GACXvR,IAAYY,KAAKZ,UAIrB4B,EAAS2P,IAGXC,OAAOxR,EAASyR,GACVzR,IAAYY,KAAKZ,UAIrB,KAAWwG,EAAQ,qCAEnB1E,EAAW2P,EAEX7Q,KAAK8Q,qBACD9Q,KAAKkK,OACPvJ,QAAQwJ,IAAI,iBAAiBnK,KAAKZ,WAGpCwG,GAAS,IAGXmL,UAAU3R,EAASwQ,EAAUoB,GACvB5R,IAAYY,KAAKZ,UAIrBgB,EAAewP,EACfvP,EAAgB2Q,IAIlBF,qBACE9Q,KAAKuQ,uBAAyB,0BAAoCvQ,KAAKiR,UAAWjR,KAAKkR,cAAehQ,IAGxG,YACE,OAAO8M,GAGT,cACE,IAAI5O,EAAUY,KAAKmR,QAAU,IAM7B,OALIjQ,IACF9B,GAAW8B,EAAW,KAGxB9B,GAAWY,KAAKiR,UACT7R,GAGT,eACE,OAAOgL,UAGT,eACE,OAAO+F,GAGT,iBACE,OAAOhJ,GAGT,aACE,OAAOvB,GAGT,mBACE,OAAOxF,GAGT,oBACE,OAAOC,GAGT,aACE,OAAOW,GAGT2J,cAAcpL,EAAMkL,GACdzK,KAAKoR,cACPpR,KAAKoR,cAAcC,OAAO1G,cAAcpL,EAAM2B,EAAUuJ,IAItDzK,KAAKkK,OACPvJ,QAAQwJ,IAAI,2BAA2B5K,cAAiBS,KAAKZ,oBAAoBqL,MAGnFjB,EAAiBjK,IAGnBkN,cAAchC,GACZ,OAAIzK,KAAKoR,cACApR,KAAKoR,cAAcC,OAAO5E,cAAcvL,EAAUuJ,IAGvDzK,KAAKkK,OACPvJ,QAAQwJ,IAAI,2BAA2BX,cAA2BxJ,KAAKZ,oBAAoBqL,MAGtFjB,IAGT0H,cAAc3R,GAxJY,CAACA,IAjBZ,IAAC+R,EAkBQlG,MAApB7L,EAAKsB,cACPuP,EAAW7Q,EAAKsB,aAGMuK,MAApB7L,EAAKgS,cACPpK,EAAa5H,EAAKgS,aAGOnG,MAAvB7L,EAAKiS,iBACPrB,EAAgB5Q,EAAKiS,gBAGLpG,MAAd7L,EAAKyO,QA9BOsD,EA+BL/R,EAAKyO,MA9BhBA,EAAQsD,EAASlD,QAAO,CAACqD,EAAcC,EAAS/D,KAE9C,IAAIgE,GAdU5S,EAcU2S,EAAQ3S,GAb3BiP,EAAM4D,MAAKvQ,KAASA,GAAeA,EAAKtC,KAAOA,KAab,CAAEA,GAAI2S,EAAQ3S,KAdxC,IAACA,EAwBd,OARI2S,EAAQG,WACVF,EAAWnL,OAAOsL,OAAO,GAAIH,EAAUD,EAAQG,YACL,IAAjCrL,OAAOC,KAAKkL,GAAU7P,QAC/BnB,QAAQjB,MAAM,8CAA+CiS,EAAS5S,IAGxE0S,EAAarB,EAAWzC,GAASgE,EAE1BF,IACN,MA4JDM,CAAoBxS,GACpBS,KAAKwQ,QAAQxC,EAAOzO,EAAKyS,aAAc7B","sources":["webpack://airdcpp-webui/./src/components/table/style.css","webpack://airdcpp-webui/./src/actions/TableActions.js","webpack://airdcpp-webui/./src/components/format/FormattedIp.tsx","webpack://airdcpp-webui/./src/components/table/Cell.tsx","webpack://airdcpp-webui/./src/components/table/TextFilter.tsx","webpack://airdcpp-webui/./src/components/table/TableFooter.tsx","webpack://airdcpp-webui/./src/components/table/RowWrapperCell.tsx","webpack://airdcpp-webui/./src/components/table/TableContainer.tsx","webpack://airdcpp-webui/./src/components/table/style.css?53ed","webpack://airdcpp-webui/./src/components/table/VirtualTable.tsx","webpack://airdcpp-webui/./src/components/table/RowDataLoader.js","webpack://airdcpp-webui/./src/decorators/TableFilterDecorator.tsx","webpack://airdcpp-webui/./src/mixins/ViewStoreMixin.js"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Generic table styles */\\r\\n.virtual-table {\\r\\n height: 100%;\\r\\n width: 100%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.virtual-table .table-container-wrapper {\\r\\n width: 100%;\\r\\n flex: 1 1 auto;\\r\\n\\r\\n /* The table won't shrink properly without this */\\r\\n height: calc(100% - 50px);\\r\\n}\\r\\n\\r\\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\\r\\n cursor:pointer;\\r\\n}\\r\\n\\r\\n.virtual-table .fixedDataTableLayout_main {\\r\\n background-color: rgba(250, 250, 250, 0.8);\\r\\n}\\r\\n\\r\\n.virtual-table .fixedDataTableLayout_main:focus {\\r\\n outline: inherit;\\r\\n}\\r\\n\\r\\n.virtual-table .public_fixedDataTable_header a, .public_fixedDataTableCell_main a {\\r\\n color: black;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Common cell content styles */\\r\\n\\r\\n.virtual-table .cell-wrapper {\\r\\n position: relative;\\r\\n top: 50%;\\r\\n transform: translateY(-50%);\\r\\n max-height: 50px;\\r\\n padding: 5px;\\r\\n}\\r\\n\\r\\n.virtual-table .cell-wrapper .plain.cell,\\r\\n.virtual-table .cell-wrapper .empty.dropdown {\\r\\n margin: 0px 3px;\\r\\n}\\r\\n\\r\\n.virtual-table .cell-wrapper .ui.progress .bar {\\r\\n height: 5px;\\r\\n}\\r\\n\\r\\n\\r\\n/* Footer */\\r\\n\\r\\n.table-footer {\\r\\n width: 100%;\\r\\n padding: 5px;\\r\\n background-color: #f6f7f8;\\r\\n background-image: -webkit-linear-gradient(#fff, #efefef);\\r\\n background-image: linear-gradient(#fff, #efefef);\\r\\n display:flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.table-footer .filter {\\r\\n margin-left: auto;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.table-footer .count-info {\\r\\n margin-right: 0px;\\r\\n color: grey;\\r\\n}\\r\\n\\r\\n.table-footer .filter > div:last-child {\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.table-footer .filter .filter-method.dropdown.button {\\r\\n padding-left: 0px !important;\\r\\n padding-right: 0px !important;\\r\\n}\\r\\n\\r\\n.table-footer .filter .dropdown .trigger.icon {\\r\\n margin-right: 0px;\\r\\n}\\r\\n\\r\\n.table-footer .filter input {\\r\\n width: 90%;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Table dropdowns */\\r\\n.table-container-wrapper .dropdown .trigger {\\r\\n line-height: 21px;\\r\\n display: flex;\\r\\n align-items: flex-start;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger:hover, .public_fixedDataTableCell_main a:hover {\\r\\n cursor:pointer;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger:hover span, .public_fixedDataTableCell_main a:hover {\\r\\n text-decoration:underline;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger i.angle.icon {\\r\\n margin: 0px;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .icon-caption .icon {\\r\\n width: inherit !important;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\\r\\n padding-left: 22px;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger i {\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger span {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Table dropdown popup content */\\r\\n.popup.dropdown-content {\\r\\n padding: 5px 15px;\\r\\n}\\r\\n\\r\\n.popup.dropdown-content .ui.dropdown.item {\\r\\n margin: 0px 0px;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/table/style.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;AACzB;EACE,YAAY;EACZ,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,cAAc;;EAEd,iDAAiD;EACjD,yBAAyB;AAC3B;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,0CAA0C;AAC5C;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,YAAY;AACd;;;;AAIA,+BAA+B;;AAE/B;EACE,kBAAkB;EAClB,QAAQ;EACR,2BAA2B;EAC3B,gBAAgB;EAChB,YAAY;AACd;;AAEA;;EAEE,eAAe;AACjB;;AAEA;EACE,WAAW;AACb;;;AAGA,WAAW;;AAEX;EACE,WAAW;EACX,YAAY;EACZ,yBAAyB;EACzB,wDAAwD;EACxD,gDAAgD;EAChD,YAAY;EACZ,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;EACjB,aAAa;AACf;;AAEA;EACE,iBAAiB;EACjB,WAAW;AACb;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,4BAA4B;EAC5B,6BAA6B;AAC/B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,UAAU;AACZ;;;;AAIA,oBAAoB;AACpB;EACE,iBAAiB;EACjB,aAAa;EACb,uBAAuB;AACzB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,OAAO;AACT;;;;AAIA,iCAAiC;AACjC;EACE,iBAAiB;AACnB;;AAEA;EACE,eAAe;AACjB\",\"sourcesContent\":[\"/* Generic table styles */\\r\\n.virtual-table {\\r\\n height: 100%;\\r\\n width: 100%;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.virtual-table .table-container-wrapper {\\r\\n width: 100%;\\r\\n flex: 1 1 auto;\\r\\n\\r\\n /* The table won't shrink properly without this */\\r\\n height: calc(100% - 50px);\\r\\n}\\r\\n\\r\\n.virtual-table .public_fixedDataTable_bodyRow a i:hover {\\r\\n cursor:pointer;\\r\\n}\\r\\n\\r\\n.virtual-table .fixedDataTableLayout_main {\\r\\n background-color: rgba(250, 250, 250, 0.8);\\r\\n}\\r\\n\\r\\n.virtual-table .fixedDataTableLayout_main:focus {\\r\\n outline: inherit;\\r\\n}\\r\\n\\r\\n.virtual-table .public_fixedDataTable_header a, .public_fixedDataTableCell_main a {\\r\\n color: black;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Common cell content styles */\\r\\n\\r\\n.virtual-table .cell-wrapper {\\r\\n position: relative;\\r\\n top: 50%;\\r\\n transform: translateY(-50%);\\r\\n max-height: 50px;\\r\\n padding: 5px;\\r\\n}\\r\\n\\r\\n.virtual-table .cell-wrapper .plain.cell,\\r\\n.virtual-table .cell-wrapper .empty.dropdown {\\r\\n margin: 0px 3px;\\r\\n}\\r\\n\\r\\n.virtual-table .cell-wrapper .ui.progress .bar {\\r\\n height: 5px;\\r\\n}\\r\\n\\r\\n\\r\\n/* Footer */\\r\\n\\r\\n.table-footer {\\r\\n width: 100%;\\r\\n padding: 5px;\\r\\n background-color: #f6f7f8;\\r\\n background-image: -webkit-linear-gradient(#fff, #efefef);\\r\\n background-image: linear-gradient(#fff, #efefef);\\r\\n display:flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.table-footer .filter {\\r\\n margin-left: auto;\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.table-footer .count-info {\\r\\n margin-right: 0px;\\r\\n color: grey;\\r\\n}\\r\\n\\r\\n.table-footer .filter > div:last-child {\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.table-footer .filter .filter-method.dropdown.button {\\r\\n padding-left: 0px !important;\\r\\n padding-right: 0px !important;\\r\\n}\\r\\n\\r\\n.table-footer .filter .dropdown .trigger.icon {\\r\\n margin-right: 0px;\\r\\n}\\r\\n\\r\\n.table-footer .filter input {\\r\\n width: 90%;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Table dropdowns */\\r\\n.table-container-wrapper .dropdown .trigger {\\r\\n line-height: 21px;\\r\\n display: flex;\\r\\n align-items: flex-start;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger:hover, .public_fixedDataTableCell_main a:hover {\\r\\n cursor:pointer;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger:hover span, .public_fixedDataTableCell_main a:hover {\\r\\n text-decoration:underline;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger i.angle.icon {\\r\\n margin: 0px;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .icon-caption .icon {\\r\\n width: inherit !important;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .empty.dropdown.filtered:not(.no-access) > div {\\r\\n padding-left: 22px;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger i {\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.table-container-wrapper .dropdown .trigger span {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Table dropdown popup content */\\r\\n.popup.dropdown-content {\\r\\n padding: 5px 15px;\\r\\n}\\r\\n\\r\\n.popup.dropdown-content .ui.dropdown.item {\\r\\n margin: 0px 0px;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import Reflux from 'reflux';\r\n\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\n\r\nconst TableActions = Reflux.createActions([\r\n { 'setRange': { asyncResult: true } },\r\n { 'setSort': { asyncResult: true } },\r\n { 'close': { asyncResult: true } },\r\n { 'pause': { asyncResult: true } },\r\n { 'init': { asyncResult: true } },\r\n 'clear',\r\n]);\r\n\r\nconst postSettings = (settings, viewUrl, action) => {\r\n return SocketService.post(viewUrl + '/settings', settings)\r\n .then(data => action.completed(viewUrl, data))\r\n .catch(error => action.failed(viewUrl, error));\r\n};\r\n\r\nTableActions.close.listen(function (viewUrl, sessionExists) {\r\n if (sessionExists && LoginStore.socketAuthenticated) {\r\n let that = this;\r\n return SocketService.delete(viewUrl)\r\n .then(data => that.completed(viewUrl, data))\r\n .catch(error => this.failed(viewUrl, error));\r\n }\r\n\r\n return Promise.resolve();\r\n});\r\n\r\nTableActions.setSort.listen(function (viewUrl, sortProperty, sortAscending) {\r\n postSettings({ \r\n sort_property: sortProperty,\r\n sort_ascending: sortAscending,\r\n }, viewUrl, this);\r\n});\r\n\r\nTableActions.setRange.listen(function (viewUrl, rangeStart, maxRows) {\r\n console.assert(maxRows > 0, 'Invalid max rows');\r\n postSettings({ \r\n range_start: rangeStart, \r\n max_count: maxRows,\r\n }, viewUrl, this);\r\n});\r\n\r\nTableActions.pause.listen(function (viewUrl, pause) {\r\n postSettings({ \r\n paused: pause,\r\n }, viewUrl, this);\r\n});\r\n\r\nTableActions.init.listen(function (viewUrl, entityId, filterData) {\r\n if (filterData) {\r\n postSettings({ \r\n source_filter: filterData,\r\n }, viewUrl, this);\r\n }\r\n});\r\n\r\n\r\nexport default TableActions;\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport 'fomantic-ui-css/components/flag.min.css';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\nexport interface FormattedIpProps {\r\n item: API.IP;\r\n}\r\n\r\nconst FormattedIp: React.FC<FormattedIpProps> = ({ item }) => (\r\n <div className=\"ip flag\">\r\n <i className={ 'ui flag ' + item.country.toLowerCase() }/>\r\n { item.str }\r\n </div>\r\n);\r\n\r\n/*FormattedIp.propTypes = {\r\n item: PropTypes.object.isRequired,\r\n};*/\r\n\r\nexport default FormattedIp;","import * as React from 'react';\r\n\r\nimport { TableActionMenu, TableDownloadMenu, TableActionMenuProps, TableDownloadMenuProps } from 'components/menu';\r\nimport { \r\n formatDecimal, formatAbbreviatedDuration, formatConnection, formatDateTime, \r\n formatShortDate, formatSize, formatSpeed, formatRelativeTime \r\n} from 'utils/ValueFormat';\r\n\r\nimport FormattedFile from 'components/format/FormattedFile';\r\nimport FormattedIp from 'components/format/FormattedIp';\r\n\r\nimport Checkbox, { CheckboxProps } from 'components/semantic/Checkbox';\r\nimport { showAction } from 'utils/ActionUtils';\r\nimport { Cell, CellProps } from 'fixed-data-table-2';\r\n//import { withRouter, RouteComponentProps } from 'react-router-dom';\r\n//import { DownloadHandlerType } from 'decorators/menu/DownloadMenuDecorator';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as UI from 'types/ui';\r\nimport * as API from 'types/api';\r\n//import { ActionHandlerDecorator, ActionHandlerDecoratorChildProps } from 'decorators/ActionHandlerDecorator';\r\n//import ActionButton, { ActionButtonProps } from 'components/ActionButton';\r\nimport { ActionHandlerDecorator } from 'decorators/ActionHandlerDecorator';\r\n\r\n\r\nconst getCellContent = (cellData: any) => {\r\n if (typeof cellData === 'object') {\r\n return Array.isArray(cellData) ? cellData.length : cellData.str;\r\n }\r\n\r\n //if (typeof cellData === 'boolean') {\r\n // return cellData ? 'Yes' : 'No';\r\n //}\r\n\r\n if (cellData === 0) {\r\n return null;\r\n }\r\n\r\n return cellData;\r\n};\r\n\r\n// Default cell\r\nexport const TextCell = ({ cellData }: { cellData?: any }) => (\r\n <span className=\"plain text cell\">\r\n { getCellContent(cellData) }\r\n </span>\r\n);\r\n\r\n// Column header\r\ninterface HeaderCellProps extends CellProps {\r\n onClick: () => void;\r\n label: React.ReactNode;\r\n columnKey?: string; // REQUIRED, CLONED\r\n}\r\n\r\nexport const HeaderCell = ({ onClick, label, columnKey, ...props }: HeaderCellProps) => (\r\n <Cell { ...props }>\r\n <a onClick={ onClick }>\r\n { label }\r\n </a>\r\n </Cell>\r\n);\r\n\r\nexport interface ActionCellProps<CellDataT, ItemDataT extends UI.ActionItemDataValueType> extends \r\n Omit<RowWrapperCellChildProps<CellDataT, ItemDataT>, 't'>, \r\n Omit<TableActionMenuProps<ItemDataT>, 'caption' | 'itemData'> {\r\n\r\n}\r\n\r\ninterface FileItemBase {\r\n type: API.FileItemType;\r\n}\r\n\r\nexport const FileActionCell = <CellDataT, ItemDataT extends UI.ActionItemDataValueType & FileItemBase>(\r\n { cellData, rowDataGetter, ...props }: ActionCellProps<CellDataT, ItemDataT>\r\n) => (\r\n <TableActionMenu \r\n caption={ \r\n <FormattedFile \r\n typeInfo={ rowDataGetter!().type }\r\n caption={ cellData }\r\n />\r\n }\r\n itemData={ rowDataGetter! }\r\n { ...props }\r\n />\r\n);\r\n\r\nexport const ActionMenuCell = <CellDataT, ItemDataT extends UI.ActionItemDataValueType>(\r\n { cellData, rowDataGetter, ...props }: ActionCellProps<CellDataT, ItemDataT>\r\n) => (\r\n <TableActionMenu\r\n caption={ cellData }\r\n itemData={ rowDataGetter! }\r\n { ...props }\r\n />\r\n);\r\n\r\nexport interface ActionLinkCellProps<CellDataT, ItemDataT extends UI.ActionItemDataValueType> \r\n extends RowWrapperCellChildProps<CellDataT, ItemDataT> {\r\n /*Pick<ActionButtonProps<ItemDataT>, 'actions' | 'actionId'>*/\r\n\r\n //action: (itemData: any, location: Location) => void;\r\n //action: UI.ActionType<ItemDataT>;\r\n actions: UI.ModuleActions<ItemDataT>;\r\n actionId: string;\r\n}\r\n\r\nexport const ActionLinkCell = <CellDataT, ItemDataT extends UI.ActionItemDataValueType>(\r\n { \r\n cellData, \r\n rowDataGetter, \r\n //location, \r\n //onClickAction, action,\r\n actions, actionId,\r\n ...props\r\n }: ActionLinkCellProps<CellDataT, ItemDataT> /*& ActionHandlerDecoratorChildProps*/\r\n) => {\r\n const action = actions.actions[actionId]!;\r\n if (!showAction(action, rowDataGetter!())) {\r\n return (\r\n <TextCell \r\n cellData={ cellData }\r\n { ...props }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <ActionHandlerDecorator<ItemDataT>>\r\n { ({ onClickAction }) => (\r\n <a \r\n className=\"plain link cell\" \r\n onClick={ () => onClickAction({\r\n actionId,\r\n action,\r\n moduleId: actions.moduleId,\r\n itemData: rowDataGetter!(),\r\n }) }\r\n >\r\n { getCellContent(cellData) }\r\n </a>\r\n ) }\r\n </ActionHandlerDecorator>\r\n );\r\n\r\n /*return (\r\n <ActionButton\r\n actions={ actions }\r\n actionId={ actionId }\r\n tag=\"a\"\r\n semanticClassName=\"plain link cell\"\r\n icon={ null }\r\n caption={ getCellContent(cellData) }\r\n />\r\n );*/\r\n};\r\n\r\n//export const ActionLinkCell = ActionHandlerDecorator(ActionLinkCellPlain);\r\n\r\nexport interface NumberCellProps extends RowWrapperCellChildProps<number, any> {\r\n cellData?: number;\r\n}\r\n\r\nexport const SizeCell: React.FC<NumberCellProps> = ({ cellData, t }) => (\r\n <span className=\"plain size cell\">\r\n { formatSize(cellData!, t!) }\r\n </span>\r\n);\r\n\r\nexport const SpeedCell: React.FC<NumberCellProps> = ({ cellData, t }) => (\r\n <span className=\"plain speed cell\">\r\n { formatSpeed(cellData!, t!) }\r\n </span>\r\n);\r\n\r\nexport const DateCell: React.FC<NumberCellProps> = ({ cellData, width }) => (\r\n <span className=\"plain date cell\">\r\n { !!width && width > 150 ? formatDateTime(cellData!) : formatShortDate(cellData!) }\r\n </span>\r\n);\r\n\r\nexport const DurationCell: React.FC<NumberCellProps> = ({ cellData }) => (\r\n <span className=\"plain duration cell\">\r\n { formatRelativeTime(cellData!) }\r\n </span>\r\n);\r\n\r\nexport const AbbreviatedDurationCell: React.FC<NumberCellProps> = ({ cellData }) => (\r\n <span className=\"plain abbr-duration cell\">\r\n { formatAbbreviatedDuration(cellData!) }\r\n </span>\r\n);\r\n\r\nexport interface IpCellProps { \r\n cellData?: API.IP;\r\n}\r\n\r\nexport const IpCell: React.FC<IpCellProps> = ({ cellData }) => (\r\n <FormattedIp item={ cellData! }/>\r\n);\r\n\r\nexport const ConnectionCell: React.FC<NumberCellProps> = ({ cellData, t }) => (\r\n <span className=\"plain connection cell\">\r\n { formatConnection(cellData!, t!) }\r\n </span>\r\n);\r\n\r\nexport const DecimalCell: React.FC<NumberCellProps> = ({ cellData }) => (\r\n <span className=\"plain decimal cell\">\r\n { formatDecimal(cellData!) }\r\n </span>\r\n);\r\n\r\nexport type FileDownloadCellClickHandler = (cellData: any, rowDataGetter: () => any) => (() => void) | undefined;\r\n\r\nexport interface FileDownloadCellProps<CellDataT, ItemDataT extends UI.DownloadableItemInfo> \r\n extends RowWrapperCellChildProps<CellDataT, ItemDataT>, \r\n Omit<TableDownloadMenuProps<ItemDataT>, 'user' | 'itemInfoGetter' | 'caption'> {\r\n\r\n userGetter: (rowData: ItemDataT) => UI.DownloadSource;\r\n clickHandlerGetter?: FileDownloadCellClickHandler;\r\n}\r\n\r\nexport const FileDownloadCell = <CellDataT, ItemDataT extends UI.DownloadableItemInfo & FileItemBase>(\r\n { cellData, rowDataGetter, clickHandlerGetter, \r\n userGetter, downloadHandler, ...props \r\n }: FileDownloadCellProps<CellDataT, ItemDataT>\r\n) => (\r\n <TableDownloadMenu \r\n caption={ \r\n <FormattedFile \r\n typeInfo={ rowDataGetter!().type }\r\n onClick={ clickHandlerGetter ? clickHandlerGetter(cellData, rowDataGetter!) : null }\r\n caption={ cellData }\r\n />\r\n }\r\n user={ userGetter(rowDataGetter!()) }\r\n linkCaption={ !!clickHandlerGetter ? false : true }\r\n itemInfoGetter={ rowDataGetter! }\r\n downloadHandler={ downloadHandler }\r\n { ...props }\r\n />\r\n);\r\n\r\n/*FileDownloadCell.propTypes = {\r\n rowDataGetter: PropTypes.func, // REQUIRED\r\n cellData: PropTypes.any, // REQUIRED\r\n userGetter: PropTypes.func.isRequired,\r\n clickHandlerGetter: PropTypes.func,\r\n downloadHandler: PropTypes.func.isRequired,\r\n};*/\r\n\r\n// tslint:disable-next-line:max-line-length\r\nexport interface CheckboxCellProps extends \r\n Omit<RowWrapperCellChildProps<boolean, any>, 'onChange'>, \r\n Omit<CheckboxProps, 'onChange' | 'checked'> {\r\n \r\n onChange: (checked: boolean, rowData: any) => void;\r\n}\r\n\r\nexport const CheckboxCell: React.FC<CheckboxCellProps> = ({ cellData, rowDataGetter, onChange, ...props }) => (\r\n <Checkbox \r\n checked={ cellData! } \r\n onChange={ checked => onChange(checked, rowDataGetter!()) }\r\n { ...props }\r\n />\r\n);\r\n\r\n/*CheckboxCell.propTypes = {\r\n rowDataGetter: PropTypes.func, // REQUIRED\r\n cellData: PropTypes.bool, // REQUIRED\r\n onChange: PropTypes.func.isRequired,\r\n};*/","import * as React from 'react';\r\n\r\nimport SectionedDropdown from 'components/semantic/SectionedDropdown';\r\nimport MenuSection from 'components/semantic/MenuSection';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport TableFilterDecorator, { TableFilterDecoratorChildProps } from 'decorators/TableFilterDecorator';\r\n\r\nimport { FilterMethod } from 'types/api';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\nimport { TFunction } from 'i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { Translation } from 'react-i18next';\r\n\r\n\r\nconst getFilterMethodCaption = (method: FilterMethod) => {\r\n switch (method) {\r\n case FilterMethod.REGEX: return 'Regex';\r\n case FilterMethod.WILDCARD: return 'Wildcard';\r\n case FilterMethod.EXACT: return 'Exact';\r\n default: return 'Partial';\r\n }\r\n};\r\n\r\nconst filterMethodToString = (method: FilterMethod, t: TFunction) => {\r\n const methodTitle = getFilterMethodCaption(method);\r\n return translate(methodTitle, t, 'table.filter');\r\n};\r\n\r\nconst getPlaceholder = (method: FilterMethod, t: TFunction) => {\r\n let ret = t('table.filter.filter', 'Filter');\r\n if (method !== FilterMethod.PARTIAL) {\r\n ret += ` (${filterMethodToString(method, t).toLowerCase()})`;\r\n }\r\n\r\n return ret + '...';\r\n};\r\n\r\nexport interface TextFilterProps {\r\n autoFocus?: boolean;\r\n}\r\n\r\nclass TextFilter extends React.PureComponent<TextFilterProps & TableFilterDecoratorChildProps> {\r\n state = { \r\n value: '',\r\n method: FilterMethod.PARTIAL,\r\n };\r\n\r\n timer: number | undefined;\r\n input: HTMLInputElement;\r\n\r\n static defaultProps: Pick<TextFilterProps, 'autoFocus'> = {\r\n autoFocus: true,\r\n };\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.timer);\r\n }\r\n\r\n onFilterUpdated = () => {\r\n const { value, method } = this.state;\r\n this.props.onFilterUpdated(value, method);\r\n }\r\n\r\n onTextChanged = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({ \r\n value: event.target.value \r\n });\r\n\r\n clearTimeout(this.timer);\r\n\r\n this.timer = window.setTimeout(\r\n () => {\r\n this.onFilterUpdated();\r\n }, \r\n 200\r\n );\r\n }\r\n\r\n onMethodChanged = (method: FilterMethod) => {\r\n this.setState({ \r\n method,\r\n });\r\n\r\n setTimeout(() => this.onFilterUpdated());\r\n this.input.focus();\r\n }\r\n\r\n getFilterMethod = (method: FilterMethod, t: TFunction) => {\r\n const isCurrent = method === this.state.method;\r\n return (\r\n <MenuItemLink \r\n key={ method }\r\n onClick={ () => this.onMethodChanged(method) }\r\n active={ isCurrent }\r\n >\r\n { filterMethodToString(method, t) }\r\n </MenuItemLink>\r\n );\r\n }\r\n\r\n render() {\r\n const { value, method } = this.state;\r\n const { autoFocus } = this.props;\r\n return (\r\n <Translation>\r\n { t => (\r\n <div className=\"text-filter\">\r\n <div \r\n className=\"ui action input\" \r\n >\r\n <input \r\n ref={ (c: any) => this.input = c }\r\n placeholder={ getPlaceholder(method, t) } \r\n onChange={ this.onTextChanged } \r\n value={ value }\r\n type=\"text\"\r\n autoFocus={ !useMobileLayout() && autoFocus }\r\n />\r\n <SectionedDropdown \r\n className=\"filter-method right top pointing\"\r\n button={ true }\r\n direction=\"upward\"\r\n >\r\n <MenuSection caption={ translate('Match type', t, 'table.filter') }>\r\n { Object.keys(FilterMethod)\r\n .filter(key => isNaN(Number(key)))\r\n .map(key => this.getFilterMethod(FilterMethod[key], t)) }\r\n </MenuSection>\r\n </SectionedDropdown>\r\n </div>\r\n </div>\r\n ) }\r\n </Translation>\r\n );\r\n }\r\n}\r\n\r\nexport default TableFilterDecorator<TextFilterProps>(TextFilter);","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport TextFilter, { TextFilterProps } from './TextFilter';\r\nimport Icon from 'components/semantic/Icon';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { TableFilterDecoratorProps } from 'decorators/TableFilterDecorator';\r\n\r\n\r\nconst CountInfo: React.FC<{ store: any }> = ({ store }) => {\r\n if (store.totalCount < 0) {\r\n // Not initialized yet\r\n return null;\r\n }\r\n\r\n let ret = store.totalCount;\r\n if (store.totalCount !== store.rowCount) {\r\n ret = store.rowCount + '/' + store.totalCount;\r\n }\r\n\r\n return (\r\n <div className=\"count-info\">\r\n <Icon icon={ IconConstants.FILTER }/>\r\n { ret }\r\n </div>\r\n );\r\n};\r\n\r\nexport type CustomTableFilter = React.ComponentType<TableFilterDecoratorProps>;\r\n\r\nexport interface TableFooterProps {\r\n footerData?: React.ReactNode;\r\n customFilter?: CustomTableFilter;\r\n store: any;\r\n textFilterProps?: TextFilterProps;\r\n // viewId?: string | number;\r\n}\r\n\r\nconst TableFooter: React.FC<TableFooterProps> = (\r\n { store, customFilter: CustomFilter, footerData, textFilterProps }\r\n) => (\r\n <div className=\"table-footer\">\r\n { footerData }\r\n <div className=\"filter item\">\r\n { !CustomFilter ? null : (\r\n <CustomFilter\r\n viewUrl={ store.viewUrl }\r\n />\r\n ) }\r\n <TextFilter \r\n viewUrl={ store.viewUrl }\r\n //viewId={ viewId }\r\n { ...textFilterProps }\r\n />\r\n <CountInfo store={ store }/>\r\n </div>\r\n </div>\r\n);\r\n\r\n/*TableFooter.propTypes = {\r\n customFilter: PropTypes.node,\r\n footerData: PropTypes.node,\r\n store: PropTypes.object.isRequired,\r\n};*/\r\n\r\nexport default TableFooter;","import * as React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { CellProps } from 'fixed-data-table-2';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { TFunction } from 'i18next';\r\n\r\n\r\nexport interface RowWrapperCellChildProps<\r\n CellDataT, \r\n RowDataT extends UI.ActionItemDataValueType\r\n> extends CellProps {\r\n cellData?: CellDataT;\r\n rowDataGetter?: () => RowDataT;\r\n rowData?: RowDataT;\r\n t?: TFunction;\r\n}\r\n\r\nexport interface RowWrapperCellProps extends CellProps {\r\n dataLoader: any;\r\n\r\n renderCondition?: (columnData: any, rowData: any) => boolean;\r\n rowClassNameGetter?: (rowData: any) => string;\r\n columnKey?: string; // REQUIRED, CLONED\r\n\r\n children: React.ReactElement<any>;\r\n t: TFunction;\r\n}\r\n\r\ninterface State {\r\n rowData: any;\r\n}\r\n\r\n// Generic wrapper for all cells that will handle data loading\r\nclass RowWrapperCell extends React.Component<RowWrapperCellProps> {\r\n static propTypes = {\r\n rowIndex: PropTypes.number, // required\r\n dataLoader: PropTypes.object.isRequired,\r\n width: PropTypes.number, // required\r\n };\r\n\r\n state: State = {\r\n rowData: null,\r\n };\r\n\r\n componentDidMount() {\r\n this.loadData(this.props.rowIndex!);\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: RowWrapperCellProps) {\r\n if (nextProps.rowIndex !== this.props.rowIndex) {\r\n // Remove pending update callbacks to avoid rendering each of them when the data is received\r\n // (there can be lots of pending requests when scrolling for long distances)\r\n this.props.dataLoader.removePendingRequests(this.props.rowIndex, this.onDataLoaded);\r\n }\r\n\r\n // Check if there is new data available (rowIndex may have changed as well)\r\n if (!this.loadData(nextProps.rowIndex!)) {\r\n // Avoid displaying old data\r\n this.setState({ rowData: null });\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.dataLoader.removePendingRequests(this.props.rowIndex, this.onDataLoaded);\r\n }\r\n\r\n loadData = (rowIndex: number) => {\r\n return this.props.dataLoader.updateRowData(rowIndex, this.onDataLoaded);\r\n }\r\n\r\n shouldComponentUpdate(nextProps: RowWrapperCellProps, nextState: State) {\r\n return nextState.rowData !== this.state.rowData || \r\n nextProps.width !== this.props.width;\r\n }\r\n\r\n rowDataGetter = () => {\r\n return this.state.rowData;\r\n }\r\n\r\n onDataLoaded = (data: any) => {\r\n this.setState({ rowData: data });\r\n }\r\n\r\n render() {\r\n const { columnKey, children, renderCondition, rowClassNameGetter, ...other } = this.props;\r\n const { rowData } = this.state;\r\n\r\n if (!rowData) {\r\n return null;\r\n }\r\n\r\n if (renderCondition && !renderCondition(rowData[columnKey!], rowData)) {\r\n return null;\r\n }\r\n\r\n let className = columnKey;\r\n if (!!rowClassNameGetter) {\r\n className += ' ' + rowClassNameGetter(rowData);\r\n }\r\n\r\n return (\r\n <div className={ 'cell-wrapper ' + className }>\r\n { React.cloneElement(children, {\r\n cellData: rowData[columnKey!],\r\n\r\n // Don't pass the actual row data to allow cells to skip \r\n // re-rendering using shallow equality checks when the row data is \r\n // updated without leaving them with an outdated item data\r\n rowDataGetter: this.rowDataGetter,\r\n ...other,\r\n }) }\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default RowWrapperCell;","import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport { TFunction } from 'i18next';\r\n\r\nimport { Table, ColumnProps } from 'fixed-data-table-2';\r\n\r\nimport TableActions from 'actions/TableActions';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport Measure, { ContentRect } from 'react-measure';\r\nimport RowWrapperCell from 'components/table/RowWrapperCell';\r\nimport { TextCell, HeaderCell } from 'components/table/Cell';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { textToI18nKey, toArray } from 'utils/TranslationUtils';\r\n\r\n\r\n\r\nconst TABLE_ROW_HEIGHT = 50;\r\n\r\nfunction convertStartToRows(pixels: number) {\r\n return Math.max(Math.floor(pixels / TABLE_ROW_HEIGHT), 0);\r\n}\r\n\r\nfunction convertEndToRows(pixels: number) {\r\n return Math.ceil(pixels / TABLE_ROW_HEIGHT);\r\n}\r\n\r\nexport interface TableContainerProps {\r\n entityId?: API.IdType;\r\n rowClassNameGetter?: (rowData: any) => string;\r\n store: any;\r\n dataLoader: any;\r\n t: TFunction;\r\n moduleId: string | string[];\r\n viewId?: number | string;\r\n}\r\n\r\ninterface State {\r\n width: number;\r\n height: number;\r\n columnWidths: object;\r\n}\r\n\r\n\r\nconst formatColumnName = (\r\n column: React.ReactElement<ColumnProps>, \r\n store: any, \r\n moduleId: string | string[], \r\n t: TFunction\r\n) => {\r\n const { name, columnKey } = column.props;\r\n let displayName = t(\r\n textToI18nKey(columnKey as string, [ ...toArray(moduleId), UI.SubNamespaces.TABLE ]),\r\n name\r\n );\r\n\r\n {\r\n const sortDirArrow = store.sortAscending ? ' ↑' : ' ↓';\r\n displayName += ((store.sortProperty === columnKey) ? sortDirArrow : '');\r\n }\r\n\r\n return displayName;\r\n};\r\n\r\nclass TableContainer extends React.Component<TableContainerProps, State> {\r\n static propTypes = {\r\n\r\n /**\r\n * Store implementing ViewStoreMixin that contains the items\r\n */\r\n store: PropTypes.object.isRequired,\r\n\r\n /**\r\n * Append class names to row (takes row data as param)\r\n */\r\n rowClassNameGetter: PropTypes.func,\r\n\r\n /**\r\n * ID of the current entity for non-singleton sources\r\n */\r\n entityId: PropTypes.any,\r\n\r\n \r\n dataLoader: PropTypes.any.isRequired,\r\n };\r\n\r\n state: State = {\r\n width: 0,\r\n height: 0,\r\n columnWidths: {},\r\n };\r\n\r\n getInitialProps = () => {\r\n return {\r\n rowClassNameGetter: null,\r\n entityId: null\r\n };\r\n }\r\n\r\n scrollTimer: number | undefined;\r\n scrollPosition = 0;\r\n setInitialScrollRow = true;\r\n\r\n // This will also be used for setting the initial rows\r\n componentDidUpdate(prevProps: TableContainerProps, prevState: State) {\r\n if (prevState.height !== this.state.height) {\r\n this.updateRowRange();\r\n } else if (prevProps.entityId !== this.props.entityId || prevProps.viewId !== this.props.viewId) {\r\n if (this.props.store.DEBUG) {\r\n console.log(`Enabling initial scroll, entity/viewId changed (view ${this.props.viewId})`);\r\n }\r\n\r\n this.setInitialScrollRow = true;\r\n this.updateRowRange();\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.scrollTimer);\r\n }\r\n\r\n updateRowRange = () => {\r\n const { store } = this.props;\r\n const { height } = this.state;\r\n\r\n const startRows = convertStartToRows(this.scrollPosition);\r\n const maxRows = convertEndToRows(height);\r\n\r\n if (store.DEBUG) {\r\n // tslint:disable-next-line:max-line-length\r\n console.log(`Settings changed, start: ${startRows}, end: ${maxRows}, height: ${height}`, store.viewName);\r\n }\r\n\r\n console.assert(store.active, 'Posting data for an inactive view');\r\n TableActions.setRange(store.viewUrl, startRows, maxRows);\r\n }\r\n\r\n onScrollStart = (horizontal: number, vertical: number) => {\r\n const { store } = this.props;\r\n\r\n if (store.DEBUG) {\r\n console.log(`Scrolling started: ${vertical}`, store.viewUrl);\r\n }\r\n\r\n console.assert(store.active, 'Sending pause for an inactive view');\r\n TableActions.pause(store.viewUrl, true);\r\n }\r\n\r\n onScrollEnd = (horizontal: number, vertical: number) => {\r\n const { store, viewId } = this.props;\r\n\r\n this.scrollPosition = vertical;\r\n console.assert(store.active, 'Sending pause for an inactive view');\r\n TableActions.pause(store.viewUrl, false);\r\n\r\n clearTimeout(this.scrollTimer);\r\n this.scrollTimer = window.setTimeout(this.updateRowRange, 500);\r\n\r\n if (this.setInitialScrollRow) {\r\n this.setInitialScrollRow = false;\r\n\r\n if (store.DEBUG) {\r\n console.log(`Disabling initial scroll (view ${viewId})`);\r\n }\r\n }\r\n\r\n store.setScrollData(vertical, viewId);\r\n if (store.DEBUG) {\r\n console.log(`Scrolling ended: ${vertical}`, store.viewUrl);\r\n }\r\n }\r\n\r\n onColumnClicked = (sortProperty: string) => {\r\n const { store } = this.props;\r\n\r\n let sortAscending = true;\r\n if (sortProperty === store.sortProperty && store.sortAscending) {\r\n sortAscending = false;\r\n }\r\n\r\n TableActions.setSort(this.props.store.viewUrl, sortProperty, sortAscending);\r\n }\r\n\r\n onColumnResizeEndCallback = (newColumnWidth: number, columnKey: string) => {\r\n this.setState(({ columnWidths }) => ({\r\n columnWidths: {\r\n ...columnWidths,\r\n [columnKey]: newColumnWidth,\r\n }\r\n }));\r\n }\r\n\r\n childToColumn = (column: React.ReactElement<ColumnProps>) => {\r\n if (!!column.props.hideWidth && column.props.hideWidth > this.state.width) {\r\n return null;\r\n }\r\n\r\n let { flexGrow, width, cell, columnKey, renderCondition } = column.props;\r\n const { store, rowClassNameGetter, moduleId, t } = this.props;\r\n\r\n const mobileView = useMobileLayout();\r\n if (!mobileView) {\r\n // Get column width\r\n if (!!columnKey && !!this.state.columnWidths[columnKey]) {\r\n width = this.state.columnWidths[columnKey];\r\n flexGrow = undefined;\r\n }\r\n }\r\n\r\n return React.cloneElement(column, {\r\n header: (\r\n <HeaderCell \r\n onClick={ this.onColumnClicked.bind(null, columnKey) } \r\n label={ formatColumnName(column, store, moduleId, t) }\r\n />\r\n ),\r\n flexGrow,\r\n width,\r\n isResizable: !mobileView,\r\n allowCellsRecycling: true,\r\n cell: (\t\t\t\r\n <RowWrapperCell \r\n dataLoader={ this.props.dataLoader } \r\n renderCondition={ renderCondition } \r\n rowClassNameGetter={ rowClassNameGetter }\r\n t={ t }\r\n >\r\n { cell ? cell as React.ReactElement<any> : <TextCell/> }\r\n </RowWrapperCell>\r\n ),\r\n });\r\n }\r\n\r\n onResizeView = (contentRect: ContentRect) => {\r\n if (!contentRect.bounds) {\r\n return;\r\n }\r\n\r\n // Bounds may contain incorrect (or outdated) dimensions with animations (such as when opening a modal)\r\n const { width, height } = !!contentRect.entry ? contentRect.entry : contentRect.bounds;\r\n this.setState({\r\n width,\r\n height,\r\n });\r\n }\r\n\r\n render() {\r\n // Update and insert generic columns props\r\n const children = React.Children.map(this.props.children, this.childToColumn);\r\n\r\n const { store, viewId } = this.props;\r\n return (\r\n <Measure \r\n bounds={ true }\r\n onResize={ this.onResizeView }\r\n >\r\n { ({ measureRef }) => (\r\n <div \r\n ref={ measureRef } \r\n className=\"table-container-wrapper\"\r\n >\r\n <Table\r\n width={ this.state.width }\r\n height={ this.state.height } \r\n\r\n rowHeight={ 50 }\r\n rowsCount={ store.rowCount }\r\n headerHeight={ 50 }\r\n isColumnResizing={ false }\r\n onColumnResizeEndCallback={ this.onColumnResizeEndCallback }\r\n\r\n touchScrollEnabled={ true }\r\n\r\n onScrollStart={ this.onScrollStart }\r\n onScrollEnd={ this.onScrollEnd }\r\n scrollTop={ this.setInitialScrollRow ? store.getScrollData(viewId) : undefined }\r\n >\r\n { children }\r\n </Table>\r\n </div>\r\n ) }\r\n </Measure>\r\n );\r\n }\r\n}\r\n\r\nexport default TableContainer;","\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;\n\n options.insert = insertFn.bind(null, \"head\");\n \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 PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport TableActions from 'actions/TableActions';\r\n\r\nimport TableFooter, { TableFooterProps } from './TableFooter';\r\nimport TableContainer, { TableContainerProps } from './TableContainer';\r\nimport RowDataLoader from './RowDataLoader';\r\n\r\nimport './style.css';\r\nimport 'fixed-data-table-2/dist/fixed-data-table.css';\r\n\r\nimport * as API from 'types/api';\r\nimport { Translation } from 'react-i18next';\r\n\r\n\r\ndeclare module 'fixed-data-table-2' {\r\n export interface ColumnProps {\r\n name: string;\r\n hideWidth?: number;\r\n renderCondition?: (cellData: any, rowData: any) => boolean;\r\n }\r\n}\r\n\r\nexport interface VirtualTableProps extends \r\n Omit<TableFooterProps, 't'>, \r\n Omit<TableContainerProps, 'store' | 'dataLoader' | 't'> {\r\n \r\n store: any;\r\n sessionStore?: any;\r\n sourceFilter?: API.TableFilter;\r\n emptyRowsNodeGetter?: () => React.ReactNode;\r\n}\r\n\r\nclass VirtualTable extends React.PureComponent<VirtualTableProps> {\r\n static propTypes = {\r\n // Elements to append to the table footer\r\n footerData: PropTypes.node,\r\n\r\n // Returns a node to render if there are no rows to display\r\n emptyRowsNodeGetter: PropTypes.func,\r\n\r\n // Possible ID of the current view (items will be cleared when the ID changes)\r\n viewId: PropTypes.any,\r\n\r\n // Store containing sessions (must be provided together with entityId)\r\n sessionStore: PropTypes.object,\r\n\r\n // Custom filter that will be displayed in addition to regular text filter\r\n customFilter: PropTypes.node,\r\n\r\n // Filter that is always applied for source items (those will never be displayed or included in the total count)\r\n sourceFilter: PropTypes.object,\r\n };\r\n\r\n dataLoader = new RowDataLoader(this.props.store, () => this.forceUpdate());\r\n unsubscribe = this.props.store.listen(this.dataLoader.onItemsUpdated.bind(this.dataLoader));\r\n\r\n componentDidMount() {\r\n //this._dataLoader = new RowDataLoader(this.props.store, () => this.forceUpdate() );\r\n\r\n //this.unsubscribe = this.props.store.listen(this._dataLoader.onItemsUpdated.bind(this._dataLoader));\r\n\r\n this.start(this.props.entityId);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.close(this.props.entityId);\r\n this.unsubscribe();\r\n }\r\n\r\n componentDidUpdate(prevProps: VirtualTableProps) {\r\n if (prevProps.entityId !== this.props.entityId) {\r\n this.close(prevProps.entityId);\r\n this.start(this.props.entityId);\r\n }\r\n\r\n if (prevProps.viewId !== this.props.viewId) {\r\n const { store } = this.props;\r\n if (store.paused) {\r\n // We need to receive the new items\r\n TableActions.pause(store.viewUrl, false);\r\n }\r\n\r\n TableActions.clear(store.viewUrl);\r\n }\r\n }\r\n\r\n moduleExists = (entityId: API.IdType | undefined) => {\r\n if (!entityId || !this.props.sessionStore) {\r\n return true;\r\n }\r\n\r\n return this.props.sessionStore.getSession(entityId);\r\n }\r\n\r\n start = (entityId: API.IdType | undefined) => {\r\n const { store, sourceFilter } = this.props;\r\n\r\n TableActions.init(store.viewUrl, entityId, sourceFilter);\r\n TableActions.setSort(store.viewUrl, store.sortProperty, store.sortAscending);\r\n }\r\n\r\n close = (entityId: API.IdType | undefined) => {\r\n // Don't send the close command if the session was removed\r\n TableActions.close(this.props.store.viewUrl, this.moduleExists(entityId));\r\n }\r\n\r\n render() {\r\n const { store, footerData, emptyRowsNodeGetter, customFilter, textFilterProps, ...other } = this.props;\r\n\r\n if (emptyRowsNodeGetter && store.totalCount === -1) {\r\n // Row count is unknown, don't flash the table\r\n return <div className=\"virtual-table\"/>;\r\n }\r\n\r\n if (emptyRowsNodeGetter && store.totalCount === 0) {\r\n return emptyRowsNodeGetter();\r\n }\r\n\r\n //console.log('Render virtual table');\r\n return (\r\n <div className=\"virtual-table\">\r\n <Translation>\r\n { t => (\r\n <>\r\n <TableContainer \r\n { ...other }\r\n dataLoader={ this.dataLoader }\r\n store={ store }\r\n t={ t }\r\n />\r\n\r\n <TableFooter\r\n store={ store }\r\n customFilter={ customFilter }\r\n footerData={ footerData }\r\n textFilterProps={ textFilterProps }\r\n />\r\n </>\r\n ) }\r\n </Translation>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default VirtualTable;\r\n","import SocketService from 'services/SocketService';\r\nimport update from 'immutability-helper';\r\n\r\nimport isEqual from 'lodash/isEqual';\r\n\r\nconst NUMBER_OF_ROWS_PER_REQUEST = 10;\r\nconst DEBUG = false;\r\n\r\n// This will handle fetching only when scrolling. Otherwise the data will be updated through the socket listener.\r\nclass RowDataLoader {\r\n constructor(store, onDataLoad) {\r\n this._onDataLoad = onDataLoad;\r\n this._store = store;\r\n this._data = [];\r\n this._pendingRequest = {};\r\n this._initialDataReceived = false;\r\n }\r\n\r\n clear() {\r\n this._pendingRequest = {};\r\n this._data = [];\r\n }\r\n\r\n // Returns true if the item was updated\r\n updateItem(updated, item, index) {\r\n let old = this._data[index];\r\n\r\n // Objects equal most of the time\r\n if (old === item || isEqual(this._data[index], item)) {\r\n return updated;\r\n }\r\n\r\n if (old) {\r\n this._data[index] = update(old, { $merge: item });\r\n } else {\r\n this._data[index] = update(old, { $set: item });\r\n }\r\n\r\n return updated + 1;\r\n }\r\n\r\n onItemsUpdated(items, rangeOffset = 0, rowCount) {\r\n // Rows removed?\r\n let hasChanges = rowCount < this._data.length;\r\n\r\n if (!items || items.length === 0) {\r\n // The view was cleared\r\n this.clear();\r\n hasChanges = true;\r\n\r\n this._initialDataReceived = false;\r\n\r\n if (DEBUG) {\r\n console.log('onItemsUpdated, cleared');\r\n }\r\n } else {\r\n this._initialDataReceived = true;\r\n\r\n // Remove rows outside the range\r\n // Leave the current range in case all old items can be reused \r\n // (avoids flickering because there is no need to re-render)\r\n for (let i = 0; i < this._data.length; i++) {\r\n if (!items[i]) {\r\n delete this._data[i];\r\n }\r\n }\r\n\r\n // Update rows\r\n const updatedCount = items.reduce(this.updateItem.bind(this), 0);\r\n if (updatedCount > 0 || rangeOffset !== 0) {\r\n if (DEBUG) {\r\n console.log('onItemsUpdated, changed (updatedCount, rangeOffset)', updatedCount, rangeOffset);\r\n }\r\n\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n if (hasChanges) {\r\n this._onDataLoad();\r\n }\r\n }\r\n\r\n get rangeOffset() {\r\n const ret = this._rangeOffset;\r\n this._rangeOffset = 0;\r\n return ret;\r\n }\r\n\t\r\n getRowData(rowIndex) {\r\n return this._data[rowIndex];\r\n }\r\n\r\n // onDataLoaded is called when the data is ready\r\n updateRowData(rowIndex, onDataLoaded) {\r\n const rowData = this._data[rowIndex];\r\n if (!rowData) {\r\n if (this._initialDataReceived) {\r\n this._queueRequestFor(rowIndex, onDataLoaded);\r\n }\r\n\t\t\t\r\n return false;\r\n }\r\n\r\n onDataLoaded(rowData);\r\n return true;\r\n }\r\n\r\n removePendingRequests(rowIndex, onDataLoaded) {\r\n delete this._pendingRequest[rowIndex];\r\n }\r\n\r\n _queueRequestFor(rowIndex, onDataLoaded) {\r\n const rowBase = rowIndex - (rowIndex % NUMBER_OF_ROWS_PER_REQUEST);\r\n\r\n const request = this._pendingRequest[rowIndex];\r\n if (request) {\r\n request.push(onDataLoaded);\r\n return;\r\n }\r\n\r\n this._pendingRequest[rowIndex] = [ onDataLoaded ];\r\n if (rowIndex !== rowBase) {\r\n if (this._pendingRequest[rowBase]) {\r\n return;\r\n }\r\n\r\n this._pendingRequest[rowBase] = [ ];\r\n }\r\n\r\n const endRow = Math.min(rowBase + NUMBER_OF_ROWS_PER_REQUEST, this._store.rowCount);\r\n SocketService.get(this._store.viewUrl + '/items/' + rowBase + '/' + endRow)\r\n .then(this.onRowsReceived.bind(this, rowBase))\r\n .catch(error => {\r\n console.error('Failed to load data', error);\r\n for (let i=rowBase; i < endRow; i++) {\r\n if (this._pendingRequest[i]) {\r\n delete this._pendingRequest[i];\r\n }\r\n }\r\n });\r\n }\r\n\r\n onRowsReceived(start, rows) {\r\n if (!this._pendingRequest[start]) {\r\n // View changed\r\n return;\r\n }\r\n\r\n for (let i=0; i < rows.length; i++) {\r\n const rowIndex = start+i;\r\n if (!isEqual(this._data[rowIndex], rows[i])) {\r\n this._data[rowIndex] = rows[i];\r\n\r\n if (this._pendingRequest[rowIndex]) {\r\n this._pendingRequest[rowIndex].forEach(f => f(rows[i]));\r\n }\r\n } else if (DEBUG) {\r\n console.log('onRowsReceived, row data equals', rowIndex);\r\n }\r\n\r\n delete this._pendingRequest[rowIndex];\r\n }\r\n }\r\n}\r\n\r\nexport default RowDataLoader;","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport * as API from 'types/api';\r\nimport { ErrorResponse } from 'airdcpp-apisocket';\r\n\r\n\r\ninterface FilterType {\r\n id: number;\r\n}\r\n\r\nexport interface TableFilterDecoratorProps {\r\n viewUrl: string;\r\n}\r\n\r\nexport interface TableFilterDecoratorDataProps {\r\n filter: FilterType;\r\n}\r\n\r\nexport interface TableFilterDecoratorChildProps {\r\n onFilterUpdated: (value: string | number, method?: API.FilterMethod) => void;\r\n}\r\n\r\nexport default function <PropsT>(\r\n Component: React.ComponentType<PropsT & TableFilterDecoratorChildProps>, \r\n propertyName: string = 'any'\r\n) {\r\n type Props = PropsT & TableFilterDecoratorProps & DataProviderDecoratorChildProps & TableFilterDecoratorDataProps;\r\n class TableFilterDecorator extends React.PureComponent<Props> {\r\n //static propTypes = {\r\n // viewUrl: PropTypes.string.isRequired,\r\n // filter: PropTypes.object.isRequired,\r\n //};\r\n\r\n onFilterUpdated = (pattern: string, method: API.FilterMethod = API.FilterMethod.PARTIAL) => {\r\n const data = {\r\n pattern,\r\n method,\r\n property: propertyName,\r\n } as API.TableFilter;\r\n\r\n const { viewUrl, filter } = this.props;\r\n SocketService.put(viewUrl + '/filter/' + filter.id, data)\r\n .catch((error: ErrorResponse) => console.error('Failed to add table filter'));\r\n }\r\n\r\n render() {\r\n return (\r\n <Component \r\n { ...this.props } \r\n onFilterUpdated={ this.onFilterUpdated }\r\n />\r\n );\r\n }\r\n }\r\n\r\n return DataProviderDecorator<PropsT & TableFilterDecoratorProps, TableFilterDecoratorDataProps>(\r\n TableFilterDecorator, \r\n {\r\n urls: {\r\n filter: ({ viewUrl }, socket) => socket.post(`${viewUrl}/filter`),\r\n },\r\n loaderText: null,\r\n }\r\n );\r\n}\r\n","import SocketService from 'services/SocketService';\r\nimport TableActions from 'actions/TableActions';\r\n\r\nimport invariant from 'invariant';\r\n\r\n\r\n// TODO: this should be handled on component level (instead of using global stores)\r\nexport default (defaultSortProperty, defaultSortAscending = true) => {\r\n let active = false;\r\n let totalCount = -1; // Not zero to avoid using emptyRowsNodeGetter when it's not wanted\r\n let matchingCount = 0;\r\n let startPos = 0;\r\n let items = [];\r\n let entityId = null;\r\n let paused = false;\r\n let scrollPosition = 0;\r\n const DEBUG = false;\r\n\r\n let sortProperty = defaultSortProperty;\r\n let sortAscending = defaultSortAscending;\r\n\r\n const findItem = (id) => {\r\n return items.find(item => !item ? false : item.id === id );\r\n };\r\n\r\n const clear = () => {\r\n items = [];\r\n startPos = 0;\r\n matchingCount = 0;\r\n totalCount = -1;\r\n };\r\n\r\n const addItems = (itemsObj) => {\r\n items = itemsObj.reduce((newViewItems, rawItem, index) => {\r\n // Either a new item, existing one in a different position or we are updating properties\r\n let viewItem = findItem(rawItem.id) || { id: rawItem.id };\r\n\r\n if (rawItem.properties) {\r\n viewItem = Object.assign({}, viewItem, rawItem.properties);\r\n } else if (Object.keys(viewItem).length === 1) {\r\n console.error('No properties were sent for a new view item', viewItem.id);\r\n }\r\n\r\n newViewItems[startPos + index] = viewItem;\r\n\r\n return newViewItems;\r\n }, []);\r\n };\r\n\r\n const parseDataProperties = (data) => {\r\n if (data.range_start != undefined) {\r\n startPos = data.range_start;\r\n }\r\n\r\n if (data.total_items != undefined) {\r\n totalCount = data.total_items;\r\n }\r\n\r\n if (data.matching_items != undefined) {\r\n matchingCount = data.matching_items;\r\n }\r\n\r\n if (data.items != undefined) {\r\n addItems(data.items);\r\n }\r\n };\r\n\r\n const ViewStoreMixin = {\r\n listenables: TableActions,\r\n\r\n onClose(viewUrl) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n if (this.DEBUG) {\r\n console.log(`Closing view ${this.viewUrl}`);\r\n }\r\n\r\n this._removeMessageListener();\r\n clear();\r\n\r\n active = false;\r\n this.trigger();\r\n },\r\n\r\n onClear(viewUrl) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n clear();\r\n this.trigger();\r\n },\r\n\r\n onPause(viewUrl, enabled) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n paused = enabled;\r\n },\r\n\r\n onInit(viewUrl, entity) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n invariant(!active, 'Trying start an active table view');\r\n\r\n entityId = entity;\r\n\r\n this.addMessageListener();\r\n if (this.DEBUG) {\r\n console.log(`Starting view ${this.viewUrl}`);\r\n }\r\n\r\n active = true;\r\n },\r\n\r\n onSetSort(viewUrl, property, ascending) {\r\n if (viewUrl !== this.viewUrl) {\r\n return;\r\n }\r\n\r\n sortProperty = property;\r\n sortAscending = ascending;\r\n //this.trigger(items);\r\n },\r\n\r\n addMessageListener() {\r\n this._removeMessageListener = SocketService.addViewUpdateListener(this._viewName, this._handleUpdate, entityId);\r\n },\r\n\r\n get items() {\r\n return items;\r\n },\r\n\r\n get viewUrl() {\r\n let viewUrl = this._apiUrl + '/';\r\n if (entityId) {\r\n viewUrl += entityId + '/';\r\n }\r\n\r\n viewUrl += this._viewName;\r\n return viewUrl;\r\n },\r\n\r\n get viewName() {\r\n return viewName;\r\n },\r\n\r\n get rowCount() {\r\n return matchingCount;\r\n },\r\n\r\n get totalCount() {\r\n return totalCount;\r\n },\r\n\r\n get active() {\r\n return active;\r\n },\r\n\r\n get sortProperty() {\r\n return sortProperty;\r\n },\r\n\r\n get sortAscending() {\r\n return sortAscending;\r\n },\r\n\r\n get paused() {\r\n return paused;\r\n },\r\n\r\n setScrollData(data, viewId) {\r\n if (this._sessionStore) {\r\n this._sessionStore.scroll.setScrollData(data, entityId, viewId);\r\n return;\r\n }\r\n\r\n if (this.DEBUG) {\r\n console.log(`Setting scroll position ${data} for view ${this.viewUrl} (view ID ${viewId})`);\r\n }\r\n\r\n scrollPosition = data;\r\n },\r\n\r\n getScrollData(viewId) {\r\n if (this._sessionStore) {\r\n return this._sessionStore.scroll.getScrollData(entityId, viewId);\r\n }\r\n\r\n if (this.DEBUG) {\r\n console.log(`Getting scroll position ${scrollPosition} for view ${this.viewUrl} (view ID ${viewId})`);\r\n }\r\n\r\n return scrollPosition;\r\n },\r\n\r\n _handleUpdate(data) {\r\n parseDataProperties(data);\r\n this.trigger(items, data.range_offset, matchingCount);\r\n }\r\n };\r\n\r\n return ViewStoreMixin;\r\n};\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","TableActions","asyncResult","postSettings","settings","viewUrl","action","then","data","completed","catch","error","failed","close","listen","sessionExists","that","this","Promise","resolve","setSort","sortProperty","sortAscending","sort_property","sort_ascending","setRange","rangeStart","maxRows","console","assert","range_start","max_count","pause","paused","init","entityId","filterData","source_filter","item","className","country","toLowerCase","str","getCellContent","cellData","Array","isArray","length","TextCell","HeaderCell","onClick","label","columnKey","props","Cell","FileActionCell","rowDataGetter","caption","typeInfo","type","itemData","ActionMenuCell","ActionLinkCell","actions","actionId","onClickAction","moduleId","SizeCell","t","SpeedCell","DurationCell","AbbreviatedDurationCell","IpCell","ConnectionCell","DecimalCell","FileDownloadCell","clickHandlerGetter","userGetter","downloadHandler","user","linkCaption","itemInfoGetter","CheckboxCell","onChange","checked","filterMethodToString","method","methodTitle","getFilterMethodCaption","getPlaceholder","ret","TextFilter","state","value","onFilterUpdated","onTextChanged","event","setState","target","clearTimeout","timer","window","setTimeout","onMethodChanged","input","focus","getFilterMethod","isCurrent","MenuItemLink","active","componentWillUnmount","render","autoFocus","Translation","ref","c","placeholder","SectionedDropdown","button","direction","MenuSection","Object","keys","filter","key","isNaN","Number","map","defaultProps","TableFilterDecorator","CountInfo","store","totalCount","rowCount","Icon","icon","IconConstants","customFilter","CustomFilter","footerData","textFilterProps","RowWrapperCell","rowData","loadData","rowIndex","dataLoader","updateRowData","onDataLoaded","componentDidMount","UNSAFE_componentWillReceiveProps","nextProps","removePendingRequests","shouldComponentUpdate","nextState","width","children","renderCondition","rowClassNameGetter","other","propTypes","formatColumnName","column","name","displayName","sortDirArrow","TableContainer","height","columnWidths","getInitialProps","scrollPosition","setInitialScrollRow","updateRowRange","startRows","pixels","Math","max","floor","ceil","convertEndToRows","DEBUG","log","viewName","onScrollStart","horizontal","vertical","onScrollEnd","viewId","scrollTimer","setScrollData","onColumnClicked","onColumnResizeEndCallback","newColumnWidth","childToColumn","hideWidth","flexGrow","cell","mobileView","undefined","header","bind","isResizable","allowCellsRecycling","onResizeView","contentRect","bounds","entry","componentDidUpdate","prevProps","prevState","onResize","measureRef","Table","rowHeight","rowsCount","headerHeight","isColumnResizing","touchScrollEnabled","scrollTop","getScrollData","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","VirtualTable","constructor","onDataLoad","_onDataLoad","_store","_data","_pendingRequest","_initialDataReceived","clear","updateItem","updated","index","old","$merge","$set","onItemsUpdated","items","rangeOffset","hasChanges","i","reduce","_rangeOffset","getRowData","_queueRequestFor","rowBase","request","endRow","min","SocketService","onRowsReceived","start","rows","forEach","f","forceUpdate","unsubscribe","moduleExists","sessionStore","getSession","sourceFilter","emptyRowsNodeGetter","Component","propertyName","pattern","property","urls","socket","post","loaderText","defaultSortProperty","defaultSortAscending","matchingCount","startPos","listenables","onClose","_removeMessageListener","trigger","onClear","onPause","enabled","onInit","entity","addMessageListener","onSetSort","ascending","_viewName","_handleUpdate","_apiUrl","_sessionStore","scroll","itemsObj","total_items","matching_items","newViewItems","rawItem","viewItem","find","properties","assign","parseDataProperties","range_offset"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[668],{90500:(n,e,s)=>{s.d(e,{Z:()=>a});var i=s(87537),r=s.n(i),t=s(23645),o=s.n(t)()(r());o.push([n.id,".session-container.horizontal.ui.grid {\r\n margin: 0px !important;\r\n}\r\n\r\n.session-container.horizontal .menu-column .item.new {\r\n padding: .78571429em 1.1em !important;\r\n}\r\n\r\n.session-container.horizontal .ui.vertical.menu .item>i.icon {\r\n margin: 0 .35714286em 0 0 !important;\r\n}\r\n\r\n.session-container.horizontal .session-layout > .ui.divider {\r\n margin: 5px 0px 0px 0px;\r\n}\r\n\r\n.session-container.vertical {\r\n padding: 15px;\r\n display: flex;\r\n flex-direction: column;\r\n background-color: white;\r\n}\r\n\r\n.session-layout {\r\n flex: 100 100 auto;\r\n display: flex;\r\n overflow: hidden;\r\n}\r\n\r\n.session-container.horizontal .session-layout {\r\n flex-direction: column;\r\n}\r\n\r\n.session-container.vertical .menu-bar {\r\n justify-content: space-between;\r\n margin: 0px !important;\r\n}\r\n\r\n.session-container.vertical .menu-bar .content-left {\r\n width: 100%;\r\n}\r\n\r\n.session-container.vertical .menu-bar .close-button.item:before {\r\n background: none !important;\r\n}\r\n\r\n.session-container.vertical .menu-bar .close-button.item {\r\n box-shadow: none !important;\r\n}\r\n\r\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\r\n float: left;\r\n}\r\n\r\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\r\n max-height: calc(100vh - 140px);\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n max-width: calc(100vw - 30px);\r\n}\r\n\r\n.session-container.vertical .session-item .count.label {\r\n margin-left: 1em !important;\r\n}\r\n\r\n.session-container.vertical .session-header {\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n}\r\n\r\n.session-container.vertical .session-header > div {\r\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\r\n padding: .82857143em 0.4285714em;\r\n line-height: 1.2;\r\n}\r\n\r\n.session-container.vertical .session-header > div:before {\r\n background: none !important;\r\n}\r\n\r\n.session-container.vertical .session-header > i {\r\n margin-left: 10px;\r\n}\r\n\r\n.session-container.vertical .session-header .ui.dropdown > i {\r\n margin: 0px 5px;\r\n}\r\n\r\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\r\n.session-container.horizontal .session-header .header > i,\r\n.session-container.vertical .session-header > i {\r\n width: inherit !important;\r\n font-size: 1.5em;\r\n}\r\n\r\n.session-container.horizontal .session-header .ui.header {\r\n align-items: center;\r\n}\r\n\r\n.session-container.vertical .menu-bar {\r\n border-radius: 0px !important;\r\n padding-bottom: 0px;\r\n}\r\n\r\n.session-container, \r\n.session-layout, \r\n.session-container.horizontal .column {\r\n height: 100%;\r\n}\r\n\r\n.session-container.horizontal .column > div {\r\n max-height: 100%;\r\n}\r\n\r\n.session-container .session-item {\r\n overflow: hidden;\r\n display: flex !important;\r\n align-items: center;\r\n padding: .68571429em .92857143em !important;\r\n height: 35px;\r\n}\r\n\r\n.session-container .session-item .session-status {\r\n float: none !important;\r\n margin: 0 .5em 0 0 !important;\r\n}\r\n\r\n.session-container .session-item .session-name {\r\n overflow: hidden;\r\n flex: 1 1 100%;\r\n line-height: 1.2;\r\n}\r\n\r\n.session-container .session-status {\r\n margin-right: 5px;\r\n margin-top: 3px;\r\n}\r\n\r\n.session-container.horizontal .menu-column {\r\n display: flex !important;\r\n flex-direction: column;\r\n padding-right: 0px !important;\r\n}\r\n\r\n.session-container.horizontal .menu-column .menu {\r\n width: initial !important;\r\n overflow-y: auto;\r\n padding-top: 10px;\r\n flex: 1;\r\n}\r\n\r\n.session-container.horizontal .menu-column .session-item span.session-name,\r\n.session-container .session-header .ui.dropdown .caption {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\n.session-container .session-header .title .ui.dropdown {\r\n width: 100%;\r\n}\r\n\r\n.session-layout .sub.header {\r\n overflow: hidden;\r\n}\r\n\r\n.session-layout .sub.header img {\r\n vertical-align: text-top;\r\n}\r\n\r\n.session-footer .info-grid {\r\n margin-top: 7px !important;\r\n font-size: small;\r\n color: grey;\r\n display: flex;\r\n flex: 1;\r\n align-items: flex-end;\r\n}\r\n\r\n.session-footer .info-grid > div {\r\n flex: 1;\r\n}\r\n\r\n.session-footer .info-grid > div:last-child > div {\r\n float: right;\r\n}\r\n\r\n.session-footer .info-grid > div:only-child > div {\r\n float: inherit;\r\n}\r\n\r\n.session-footer .ui.checkbox {\r\n min-height: inherit !important;\r\n}\r\n\r\n.session-footer .divider {\r\n margin-top: 8px;\r\n margin-bottom: 0px;\r\n}\r\n\r\n/* New session layout */\r\n.session.new {\r\n flex: 100 100 0%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow-y: hidden;\r\n margin-top: 20px;\r\n padding: 1px;\r\n}\r\n\r\n.session.new .recents {\r\n flex: 100 100 0%;\r\n display: flex;\r\n flex-direction: column;\r\n margin-top: 20px;\r\n overflow-y: hidden;\r\n}\r\n\r\n.session.new .recents .list {\r\n padding: 3px 5px;\r\n flex: 100 100 0%;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n}","",{version:3,sources:["webpack://./src/routes/Sidebar/sessions.css"],names:[],mappings:"AAAA;EACE,sBAAsB;AACxB;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,oCAAoC;AACtC;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,aAAa;EACb,sBAAsB;EACtB,uBAAuB;AACzB;;AAEA;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,+BAA+B;EAC/B,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,gCAAgC;EAChC,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,2CAA2C;EAC3C,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,6BAA6B;AAC/B;;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.horizontal.ui.grid {\r\n margin: 0px !important;\r\n}\r\n\r\n.session-container.horizontal .menu-column .item.new {\r\n padding: .78571429em 1.1em !important;\r\n}\r\n\r\n.session-container.horizontal .ui.vertical.menu .item>i.icon {\r\n margin: 0 .35714286em 0 0 !important;\r\n}\r\n\r\n.session-container.horizontal .session-layout > .ui.divider {\r\n margin: 5px 0px 0px 0px;\r\n}\r\n\r\n.session-container.vertical {\r\n padding: 15px;\r\n display: flex;\r\n flex-direction: column;\r\n background-color: white;\r\n}\r\n\r\n.session-layout {\r\n flex: 100 100 auto;\r\n display: flex;\r\n overflow: hidden;\r\n}\r\n\r\n.session-container.horizontal .session-layout {\r\n flex-direction: column;\r\n}\r\n\r\n.session-container.vertical .menu-bar {\r\n justify-content: space-between;\r\n margin: 0px !important;\r\n}\r\n\r\n.session-container.vertical .menu-bar .content-left {\r\n width: 100%;\r\n}\r\n\r\n.session-container.vertical .menu-bar .close-button.item:before {\r\n background: none !important;\r\n}\r\n\r\n.session-container.vertical .menu-bar .close-button.item {\r\n box-shadow: none !important;\r\n}\r\n\r\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\r\n float: left;\r\n}\r\n\r\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\r\n max-height: calc(100vh - 140px);\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n max-width: calc(100vw - 30px);\r\n}\r\n\r\n.session-container.vertical .session-item .count.label {\r\n margin-left: 1em !important;\r\n}\r\n\r\n.session-container.vertical .session-header {\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n}\r\n\r\n.session-container.vertical .session-header > div {\r\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\r\n padding: .82857143em 0.4285714em;\r\n line-height: 1.2;\r\n}\r\n\r\n.session-container.vertical .session-header > div:before {\r\n background: none !important;\r\n}\r\n\r\n.session-container.vertical .session-header > i {\r\n margin-left: 10px;\r\n}\r\n\r\n.session-container.vertical .session-header .ui.dropdown > i {\r\n margin: 0px 5px;\r\n}\r\n\r\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\r\n.session-container.horizontal .session-header .header > i,\r\n.session-container.vertical .session-header > i {\r\n width: inherit !important;\r\n font-size: 1.5em;\r\n}\r\n\r\n.session-container.horizontal .session-header .ui.header {\r\n align-items: center;\r\n}\r\n\r\n.session-container.vertical .menu-bar {\r\n border-radius: 0px !important;\r\n padding-bottom: 0px;\r\n}\r\n\r\n.session-container, \r\n.session-layout, \r\n.session-container.horizontal .column {\r\n height: 100%;\r\n}\r\n\r\n.session-container.horizontal .column > div {\r\n max-height: 100%;\r\n}\r\n\r\n.session-container .session-item {\r\n overflow: hidden;\r\n display: flex !important;\r\n align-items: center;\r\n padding: .68571429em .92857143em !important;\r\n height: 35px;\r\n}\r\n\r\n.session-container .session-item .session-status {\r\n float: none !important;\r\n margin: 0 .5em 0 0 !important;\r\n}\r\n\r\n.session-container .session-item .session-name {\r\n overflow: hidden;\r\n flex: 1 1 100%;\r\n line-height: 1.2;\r\n}\r\n\r\n.session-container .session-status {\r\n margin-right: 5px;\r\n margin-top: 3px;\r\n}\r\n\r\n.session-container.horizontal .menu-column {\r\n display: flex !important;\r\n flex-direction: column;\r\n padding-right: 0px !important;\r\n}\r\n\r\n.session-container.horizontal .menu-column .menu {\r\n width: initial !important;\r\n overflow-y: auto;\r\n padding-top: 10px;\r\n flex: 1;\r\n}\r\n\r\n.session-container.horizontal .menu-column .session-item span.session-name,\r\n.session-container .session-header .ui.dropdown .caption {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\n.session-container .session-header .title .ui.dropdown {\r\n width: 100%;\r\n}\r\n\r\n.session-layout .sub.header {\r\n overflow: hidden;\r\n}\r\n\r\n.session-layout .sub.header img {\r\n vertical-align: text-top;\r\n}\r\n\r\n.session-footer .info-grid {\r\n margin-top: 7px !important;\r\n font-size: small;\r\n color: grey;\r\n display: flex;\r\n flex: 1;\r\n align-items: flex-end;\r\n}\r\n\r\n.session-footer .info-grid > div {\r\n flex: 1;\r\n}\r\n\r\n.session-footer .info-grid > div:last-child > div {\r\n float: right;\r\n}\r\n\r\n.session-footer .info-grid > div:only-child > div {\r\n float: inherit;\r\n}\r\n\r\n.session-footer .ui.checkbox {\r\n min-height: inherit !important;\r\n}\r\n\r\n.session-footer .divider {\r\n margin-top: 8px;\r\n margin-bottom: 0px;\r\n}\r\n\r\n/* New session layout */\r\n.session.new {\r\n flex: 100 100 0%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow-y: hidden;\r\n margin-top: 20px;\r\n padding: 1px;\r\n}\r\n\r\n.session.new .recents {\r\n flex: 100 100 0%;\r\n display: flex;\r\n flex-direction: column;\r\n margin-top: 20px;\r\n overflow-y: hidden;\r\n}\r\n\r\n.session.new .recents .list {\r\n padding: 3px 5px;\r\n flex: 100 100 0%;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n}"],sourceRoot:""}]);const a=o},38982:(n,e,s)=>{s.d(e,{Z:()=>t});var i=s(518),r=s(48117);function t(n,e,s){const t={divider:null,removeSession:{displayName:"Close",access:s,icon:r.Z.REMOVE,handler:({data:n})=>i.Z.delete(`${e}/${n.id}`)}};return Object.assign(n,t)}},8576:(n,e,s)=>{s.d(e,{Z:()=>a});var i=s(85893),r=s(67294),t=s(96818),o=s(33612);function a(n,e=!1){class s extends r.Component{constructor(){super(...arguments),this.setRead=n=>{this.props.sessionApi.setRead(n),this.readTimeout=void 0},this.setSession=n=>{if(this.readTimeout&&(clearTimeout(this.readTimeout),this.setRead(this.props.session)),this.props.sessionApi.sessionChanged(n),!n)return;const s=e?1e3*t.Z.getValue(o.Qp.UNREAD_LABEL_DELAY):0;this.readTimeout=window.setTimeout((()=>this.setRead(n)),s)}}componentDidMount(){this.setSession(this.props.session)}componentWillUnmount(){this.setSession(null)}componentDidUpdate(n){this.props.session.id!==n.session.id&&this.setSession(this.props.session)}render(){return(0,i.jsx)(n,Object.assign({},this.props),void 0)}}return s}},88998:(n,e,s)=>{s.d(e,{o:()=>r,C:()=>t});var i=s(85893);s(67294);const r=({label:n,text:e})=>(0,i.jsx)("div",Object.assign({className:"grid-item"},{children:(0,i.jsx)("div",Object.assign({className:"item-inner"},{children:n&&"string"==typeof e?`${n}: ${e}`:e}),void 0)}),void 0),t=({children:n})=>(0,i.jsxs)("div",Object.assign({className:"session-footer"},{children:[(0,i.jsx)("div",{className:"ui footer divider"},void 0),(0,i.jsx)("div",Object.assign({className:"info-grid ui"},{children:n}),void 0)]}),void 0)},10907:(n,e,s)=>{s.d(e,{Z:()=>nn});var i=s(85893),r=s(45697),t=s.n(r),o=s(67294),a=s(5977),A=s(41143),c=s.n(A),l=s(20097),d=s(54883),m=s(10606),h=s(45807),p=s(1059),u=s(99005),g=s(39142),v=s(32347),E=s(8717),B=s(48117);const x=({sessionMenuItems:n,newButton:e,unreadInfoStore:s,listActionMenuGetter:r,t})=>(0,i.jsxs)(p.Z,Object.assign({triggerIcon:(0,i.jsx)(g.O,{urgencies:s?s.getTotalUrgencies():null},void 0)},{children:[(0,i.jsx)(u.Z,Object.assign({caption:(0,E.Iu)("New",t,v.jv.COMMON)},{children:e}),void 0),(0,i.jsx)(u.Z,Object.assign({caption:(0,E.Iu)("Current sessions",t,v.jv.COMMON)},{children:n}),void 0),(0,i.jsx)(u.Z,{children:r()},void 0)]}),void 0),f=({actions:n,activeItem:e})=>!e||(0,m.wd)()?null:(0,i.jsx)(h.Z,{className:"basic small item close-button",actions:n,actionId:"removeSession",itemData:e,icon:B.Z.CLOSE},void 0),C=({itemHeaderIcon:n,itemHeaderTitle:e})=>(0,i.jsxs)("div",Object.assign({className:"session-header"},{children:[n,e]}),void 0),w=n=>{var{children:e,onKeyDown:s}=n,r=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 r=0;for(i=Object.getOwnPropertySymbols(n);r<i.length;r++)e.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(n,i[r])&&(s[i[r]]=n[i[r]])}return s}(n,["children","onKeyDown"]);return(0,i.jsxs)("div",Object.assign({className:"session-container vertical",onKeyDown:s,tabIndex:0},{children:[(0,i.jsxs)("div",Object.assign({className:"ui main menu menu-bar"},{children:[(0,i.jsxs)("div",Object.assign({className:"content-left"},{children:[(0,i.jsx)(x,Object.assign({},r),void 0),(0,i.jsx)(C,Object.assign({},r),void 0)]}),void 0),(0,i.jsx)(f,Object.assign({},r),void 0)]}),void 0),(0,i.jsx)("div",Object.assign({className:"session-layout"},{children:e}),void 0)]}),void 0)};var b=s(91462),j=s(24101);const y=({sessionMenuItems:n,newButton:e,itemHeaderIcon:s,itemHeaderTitle:r,children:t,itemHeaderDescription:a,onKeyDown:A})=>(e&&(e=o.cloneElement(e,{className:e.props.className+" ui fluid button"})),(0,i.jsxs)(j.rj,Object.assign({className:"session-container horizontal",onKeyDown:A,tabIndex:0},{children:[(0,i.jsxs)("div",Object.assign({className:"four wide column menu-column"},{children:[e,!!n.length&&(0,i.jsx)("div",Object.assign({className:"ui vertical secondary menu"},{children:n}),void 0)]}),void 0),(0,i.jsx)("div",Object.assign({className:"twelve wide stretched column content-column session"},{children:(0,i.jsxs)("div",Object.assign({className:"ui segment session-layout"},{children:[(0,i.jsx)(b.Z,{className:"session-header",icon:s,title:(0,i.jsx)("div",Object.assign({className:"title"},{children:r}),void 0),subHeader:a},void 0),(0,i.jsx)("div",{className:"ui divider",style:{margin:"5px 0px 0px 0px"}},void 0),t]}),void 0)}),void 0)]}),void 0));var I=s(93379),O=s.n(I),N=s(7795),S=s.n(N),k=s(90569),Z=s.n(k),z=s(3565),M=s.n(z),D=s(19216),T=s.n(D),H=s(44589),U=s.n(H),R=s(90500),G={};G.styleTagTransform=U(),G.setAttributes=M(),G.insert=Z().bind(null,"head"),G.domAPI=S(),G.insertStyleElement=T(),O()(R.Z,G),R.Z&&R.Z.locals&&R.Z.locals;var L=s(47021),q=s(94184),W=s.n(q),Y=s(6596);const K=({url:n,title:e,pushNew:s,className:r})=>(0,i.jsx)(Y.Z,Object.assign({className:W()("new",r),icon:B.Z.CREATE,url:n,onClick:n=>((n,e)=>{n.preventDefault(),e()})(n,s)},{children:e}),"button-new"),$=({sessionItem:n,status:e,name:s,unreadInfoStore:r,url:t,pushSession:o})=>(0,i.jsx)(Y.Z,Object.assign({url:t,className:"session-item",onClick:e=>((n,e,s)=>{n.preventDefault(),s(e.id)})(e,n,o),icon:e,session:n,unreadInfoStore:r},{children:(0,i.jsx)("span",Object.assign({className:"session-name"},{children:s}),void 0)}),void 0);var P=s(35936),_=s(27695),F=s(66883),V=s(98374),J=s(54080);const Q=(n,e)=>n.find((n=>n.id===e));class X extends o.Component{constructor(){super(...arguments),this.state={activeItem:null},this.getSessionUrl=n=>(c()(!!n,"Trying to get session URL without a session"),`/${this.props.baseUrl}/session/${n}`),this.getNewUrl=()=>`/${this.props.baseUrl}/new`,this.getStorageKey=n=>`${n.baseUrl}_last_active`,this.pushSession=n=>{l.Z.push(this.getSessionUrl(n))},this.replaceSession=n=>{l.Z.replace(this.getSessionUrl(n))},this.pushNew=()=>{l.Z.push(this.getNewUrl())},this.hasEditAccess=()=>F.Z.hasAccess(this.props.editAccess),this.checkActiveItem=n=>{const e=n.location,s=e.state&&e.state.pending,i=Q(n.items,n.activeId);return i?s?(l.Z.replace({state:{pending:!1}}),!0):(this.setState({activeItem:i}),(0,m.Ay)(this.getStorageKey(n),n.activeId),!0):!!s||0===n.items.length&&(l.Z.replace(this.getNewUrl()),this.setState({activeItem:null}),!0)},this.onKeyDown=n=>{const{key:e,altKey:s}=n;if(!s||"ArrowUp"!==e&&"ArrowDown"!==e){if(s&&"Insert"===e)n.preventDefault(),l.Z.replace(this.getNewUrl());else if(s&&"Delete"===e){n.preventDefault();const{items:e,activeId:s,sessionApi:i}=this.props,r=Q(e,s);r&&i.removeSession(r)}}else{n.preventDefault();const{items:s,activeId:i}=this.props,r=Q(s,i);if(!r)return;const t=s.indexOf(r);if(-1===t)return;const o=s["ArrowUp"===e?t-1:t+1];o&&this.pushSession(o.id)}},this.getItemStatus=n=>{const{itemStatusGetter:e,itemHeaderIconGetter:s}=this.props;return e?(0,i.jsx)("div",{className:"ui session-status empty circular left mini label "+e(n)},void 0):(0,i.jsx)(P.Z,{icon:s(n)},void 0)},this.getSessionMenuItem=n=>(0,i.jsx)($,{url:this.getSessionUrl(n.id),name:this.props.itemNameGetter(n),unreadInfoStore:this.props.unreadInfoStore,status:this.getItemStatus(n),sessionItem:n,pushSession:this.pushSession},n.id),this.getItemHeaderTitle=()=>{const{uiActions:n,actionIds:e,itemNameGetter:s,itemHeaderTitleGetter:r}=this.props,{activeItem:t}=this.state;if(!t)return(0,i.jsx)("div",{children:this.props.newCaption},void 0);let o;e&&(o=[...e,"divider","removeSession"]);const a=(0,i.jsx)(L.PC,{caption:s(t),actions:n,itemData:t,ids:o},void 0);if(r){const n=r(t,this.props.location,a);if(n)return n}return a},this.getItemHeaderDescription=()=>{const{activeItem:n}=this.state,{itemHeaderDescriptionGetter:e,newDescription:s}=this.props;return n?e(n):s},this.getItemHeaderIcon=()=>{const{activeItem:n}=this.state,{itemHeaderIconGetter:e,newIcon:s}=this.props;return(0,i.jsx)(P.Z,{icon:n?e(n):s},void 0)},this.getNewButton=()=>this.hasEditAccess()&&this.props.newCaption?(0,i.jsx)(K,{title:this.props.newCaption,url:this.getNewUrl(),pushNew:this.pushNew},"new-button"):null,this.handleCloseAll=()=>{const{sessionApi:n,items:e}=this.props;e.forEach((e=>n.removeSession(e)))},this.getListActionMenu=()=>{const{items:n,t:e}=this.props;return this.hasEditAccess()&&0!==n.length?(0,i.jsx)(V.Z,Object.assign({onClick:this.handleCloseAll,icon:B.Z.REMOVE},{children:(0,E.Iu)("Close all",e,v.jv.COMMON)}),"close"):null},this.sessionT=(0,E.HY)(this.props.t,this.props.uiActions.moduleId)}UNSAFE_componentWillReceiveProps(n){if(n.location.pathname===this.getNewUrl())return void(this.state.activeItem&&this.setState({activeItem:null}));if(this.checkActiveItem(n))return;let e=0;const s=Q(this.props.items,this.props.activeId);s&&(e=this.props.items.indexOf(s),e===this.props.items.length-1&&(e-=1)),this.replaceSession(n.items[e].id)}componentDidMount(){if(this.checkActiveItem(this.props))return;let n=(0,m.C)(this.getStorageKey(this.props));n&&Q(this.props.items,n)?this.replaceSession(n):this.props.items.length>0&&this.replaceSession(this.props.items[0].id)}render(){const{disableSideMenu:n,items:e,unreadInfoStore:s,location:r,t,sessionApi:o,uiActions:A,newLayout:c,sessionItemLayout:l,activeId:h}=this.props;if(!this.hasEditAccess()&&0===e.length)return(0,i.jsx)(_.Z,{title:(0,E.Iu)("No items to show",t,v.jv.COMMON),description:t((0,E.zS)("noSessionEditAccess",v.jv.COMMON),"You aren't allowed to open new sessions")},void 0);const{activeItem:p}=this.state,u=n||(0,m.wd)(this.context)?w:y;return(0,i.jsxs)(u,Object.assign({itemHeaderTitle:this.getItemHeaderTitle(),itemHeaderDescription:this.getItemHeaderDescription(),itemHeaderIcon:this.getItemHeaderIcon(),activeItem:p,unreadInfoStore:s,newButton:this.getNewButton(),sessionMenuItems:e.map(this.getSessionMenuItem),listActionMenuGetter:this.getListActionMenu,onKeyDown:this.onKeyDown,actions:A,t},{children:[(0,i.jsx)(a.AW,{path:this.getSessionUrl(":id"),render:n=>{if(!p){const{state:n}=this.props.location;return n&&n.pending?(0,i.jsx)(d.Z,{text:(0,E.Iu)("Waiting for server response",t,v.jv.COMMON)},void 0):h||0!==e.length?(0,i.jsx)(d.Z,{text:(0,E.Iu)("Loading session",t,v.jv.COMMON)},void 0):void console.error("SessionLayout route: active session missing")}return(0,i.jsx)(l,{session:p,sessionApi:o,uiActions:A,location:r,sessionT:this.sessionT},void 0)}},void 0),!!c&&(0,i.jsx)(a.AW,{path:this.getNewUrl(),render:n=>(0,i.jsx)(c,Object.assign({},n,{sessionT:this.sessionT}),void 0)},void 0)]}),void 0)}}X.displayName="SessionLayout",X.propTypes={baseUrl:t().string.isRequired,location:t().object.isRequired,items:t().array.isRequired,itemHeaderTitleGetter:t().func,itemHeaderDescriptionGetter:t().func.isRequired,itemHeaderIconGetter:t().func.isRequired,unreadInfoStore:t().object,itemNameGetter:t().func.isRequired,itemStatusGetter:t().func,uiActions:t().object.isRequired,actionIds:t().array,activeId:t().any,newCaption:t().any,newDescription:t().any,newIcon:t().any,disableSideMenu:t().bool,editAccess:t().string.isRequired,sessionItemLayout:t().any.isRequired,newLayout:t().func},X.contextType=J.c;const nn=X},93101:(n,e,s)=>{s.d(e,{J:()=>c});var i=s(85893),r=(s(67294),s(54883)),t=s(92408),o=s(32347),a=s(26793),A=s(8717);const c=(n,e)=>s=>{const{t:c}=(0,a.$)(),l=(0,t.o)(e);return e.isInitialized()?(0,i.jsx)(n,Object.assign({items:l,t:c},s),void 0):(0,i.jsx)(r.Z,{text:(0,A.Iu)("Loading sessions",c,o.jv.COMMON)},void 0)}}}]);
|
|
2
|
-
//# sourceMappingURL=668.
|
|
2
|
+
//# sourceMappingURL=668.d8fc363a0da7c52c6cf3.chunk.js.map
|
|
Binary file
|