graphdb-workbench 3.1.0-TR12 → 3.1.0-TR13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{12396.fcc54d85460017a32ca1.bundle.js → 12396.a4cb05c47cf17cbfd891.bundle.js} +2 -2
- package/dist/{12396.fcc54d85460017a32ca1.bundle.js.map → 12396.a4cb05c47cf17cbfd891.bundle.js.map} +1 -1
- package/dist/{13486.58f89862c40c0f84cb09.bundle.js → 13486.b4c8bf17c522084e59fb.bundle.js} +2 -2
- package/dist/13486.b4c8bf17c522084e59fb.bundle.js.map +1 -0
- package/dist/13813.84b8832e83dec53d66b9.bundle.js +2 -0
- package/dist/13813.84b8832e83dec53d66b9.bundle.js.map +1 -0
- package/dist/{15535.4f5aebf06ef94d0d730c.bundle.js → 15535.aa936791f2b5dd74f7ee.bundle.js} +2 -2
- package/dist/{15535.4f5aebf06ef94d0d730c.bundle.js.map → 15535.aa936791f2b5dd74f7ee.bundle.js.map} +1 -1
- package/dist/{16162.93e0b5dcd33d9227fd60.bundle.js → 16162.dca58b88b4d145a7fcf7.bundle.js} +2 -2
- package/dist/{16162.93e0b5dcd33d9227fd60.bundle.js.map → 16162.dca58b88b4d145a7fcf7.bundle.js.map} +1 -1
- package/dist/{20287.c6714e25dfba36a7abff.bundle.js → 20287.22c94209c4a5b0aa569b.bundle.js} +2 -2
- package/dist/{20287.c6714e25dfba36a7abff.bundle.js.map → 20287.22c94209c4a5b0aa569b.bundle.js.map} +1 -1
- package/dist/{21136.92d89e72506eccad7d06.bundle.js → 21136.b0b60f89d0aecc146390.bundle.js} +2 -2
- package/dist/{21136.92d89e72506eccad7d06.bundle.js.map → 21136.b0b60f89d0aecc146390.bundle.js.map} +1 -1
- package/dist/{21142.3f3aa7d3ef22074e49a3.bundle.js → 21142.c1026a9490be83c3be64.bundle.js} +2 -2
- package/dist/{21142.3f3aa7d3ef22074e49a3.bundle.js.map → 21142.c1026a9490be83c3be64.bundle.js.map} +1 -1
- package/dist/{21170.43dc0783a81039cd2eca.bundle.js → 21170.4f1089c6ecb858d32307.bundle.js} +2 -2
- package/dist/{21170.43dc0783a81039cd2eca.bundle.js.map → 21170.4f1089c6ecb858d32307.bundle.js.map} +1 -1
- package/dist/{21195.e4da0e7735e18c1c24d7.bundle.js → 21195.4025ee868703a7826ae6.bundle.js} +2 -2
- package/dist/{21195.e4da0e7735e18c1c24d7.bundle.js.map → 21195.4025ee868703a7826ae6.bundle.js.map} +1 -1
- package/dist/24785.ff0689efffa1540e2904.bundle.js +2 -0
- package/dist/24785.ff0689efffa1540e2904.bundle.js.map +1 -0
- package/dist/25090.a073fc84568f38c40d67.bundle.js +2 -0
- package/dist/25090.a073fc84568f38c40d67.bundle.js.map +1 -0
- package/dist/{25747.5c8e79ac3088d275e4f6.bundle.js → 25747.d8d9c4a6472dddad834f.bundle.js} +2 -2
- package/dist/{25747.5c8e79ac3088d275e4f6.bundle.js.map → 25747.d8d9c4a6472dddad834f.bundle.js.map} +1 -1
- package/dist/{27580.70186989dfc08ef0506b.bundle.js → 27580.af47ce7d030e916c7a4e.bundle.js} +2 -2
- package/dist/{27580.70186989dfc08ef0506b.bundle.js.map → 27580.af47ce7d030e916c7a4e.bundle.js.map} +1 -1
- package/dist/{31636.4e5d6e986e990a12facf.bundle.js → 31636.fbeed6706183663eeee2.bundle.js} +2 -2
- package/dist/{31636.4e5d6e986e990a12facf.bundle.js.map → 31636.fbeed6706183663eeee2.bundle.js.map} +1 -1
- package/dist/{32489.ca36d6c8822d9a770a8b.bundle.js → 32489.fafc19e8e0eb964a3ec5.bundle.js} +2 -2
- package/dist/{32489.ca36d6c8822d9a770a8b.bundle.js.map → 32489.fafc19e8e0eb964a3ec5.bundle.js.map} +1 -1
- package/dist/34330.298b3fb714ce7fc0bda1.bundle.js +2 -0
- package/dist/34330.298b3fb714ce7fc0bda1.bundle.js.map +1 -0
- package/dist/{34495.7b0a4828632863d0fdd4.bundle.js → 34495.bcc635daf309f60ba23b.bundle.js} +2 -2
- package/dist/{34495.7b0a4828632863d0fdd4.bundle.js.map → 34495.bcc635daf309f60ba23b.bundle.js.map} +1 -1
- package/dist/36737.9d37e743918e6d45c10b.bundle.js +2 -0
- package/dist/36737.9d37e743918e6d45c10b.bundle.js.map +1 -0
- package/dist/{38360.1361bf281a19ba415d10.bundle.js → 38360.55d84891b7ad65b37108.bundle.js} +2 -2
- package/dist/{38360.1361bf281a19ba415d10.bundle.js.map → 38360.55d84891b7ad65b37108.bundle.js.map} +1 -1
- package/dist/{38644.d90ed562660e1bfeddd3.bundle.js → 38644.62bda02822616b30f0c7.bundle.js} +2 -2
- package/dist/{38644.d90ed562660e1bfeddd3.bundle.js.map → 38644.62bda02822616b30f0c7.bundle.js.map} +1 -1
- package/dist/{38843.297cc7a018bd4df634e8.bundle.js → 38843.28a56aadf139c5f83a07.bundle.js} +2 -2
- package/dist/{38843.297cc7a018bd4df634e8.bundle.js.map → 38843.28a56aadf139c5f83a07.bundle.js.map} +1 -1
- package/dist/39448.10bcf72a104ce8276328.bundle.js +2 -0
- package/dist/39448.10bcf72a104ce8276328.bundle.js.map +1 -0
- package/dist/{39518.8547d972593f8717ee28.bundle.js → 39518.24cdd6c870b5b026f43b.bundle.js} +2 -2
- package/dist/{39518.8547d972593f8717ee28.bundle.js.map → 39518.24cdd6c870b5b026f43b.bundle.js.map} +1 -1
- package/dist/{39539.9693149f20106d3b0884.bundle.js → 39539.cb091b6ad5074999b72d.bundle.js} +2 -2
- package/dist/{39539.9693149f20106d3b0884.bundle.js.map → 39539.cb091b6ad5074999b72d.bundle.js.map} +1 -1
- package/dist/{39874.6ca23ead080b52dc1bc6.bundle.js → 39874.ff510b958fcdbda4db58.bundle.js} +2 -2
- package/dist/39874.ff510b958fcdbda4db58.bundle.js.map +1 -0
- package/dist/4125.fd7946ca01aa51acba15.bundle.js +2 -0
- package/dist/4125.fd7946ca01aa51acba15.bundle.js.map +1 -0
- package/dist/{41453.f28b2cc3e8e80afc8871.bundle.js → 41453.b696ac82dcadda585f04.bundle.js} +2 -2
- package/dist/{41453.f28b2cc3e8e80afc8871.bundle.js.map → 41453.b696ac82dcadda585f04.bundle.js.map} +1 -1
- package/dist/{41621.d1b7d799116c07df17d1.bundle.js → 41621.68c5ebc2104a62e2b41d.bundle.js} +2 -2
- package/dist/41621.68c5ebc2104a62e2b41d.bundle.js.map +1 -0
- package/dist/{42129.64ead03391752af23325.bundle.js → 42129.f9f2bafc4520aad7f942.bundle.js} +2 -2
- package/dist/{42129.64ead03391752af23325.bundle.js.map → 42129.f9f2bafc4520aad7f942.bundle.js.map} +1 -1
- package/dist/42143.1483a9470e09485cc4e4.bundle.js +2 -0
- package/dist/42143.1483a9470e09485cc4e4.bundle.js.map +1 -0
- package/dist/{44444.77a79ddd001ef03216fc.bundle.js → 44444.153ba656276a2f1bfdc3.bundle.js} +2 -2
- package/dist/{44444.77a79ddd001ef03216fc.bundle.js.map → 44444.153ba656276a2f1bfdc3.bundle.js.map} +1 -1
- package/dist/{45843.49565fdfa9b426eeb208.bundle.js → 45843.2fb1782023f0992f82c1.bundle.js} +2 -2
- package/dist/{45843.49565fdfa9b426eeb208.bundle.js.map → 45843.2fb1782023f0992f82c1.bundle.js.map} +1 -1
- package/dist/51087.2e79fab6ad7c1282ee52.bundle.js +2 -0
- package/dist/51087.2e79fab6ad7c1282ee52.bundle.js.map +1 -0
- package/dist/{55862.9f799792bc876532e44f.bundle.js → 55862.88796a9db69e193b8b83.bundle.js} +2 -2
- package/dist/{55862.9f799792bc876532e44f.bundle.js.map → 55862.88796a9db69e193b8b83.bundle.js.map} +1 -1
- package/dist/57952.b096d19a802e06030ef0.bundle.js +2 -0
- package/dist/57952.b096d19a802e06030ef0.bundle.js.map +1 -0
- package/dist/{58306.2a9393e91eef386c5162.bundle.js → 58306.f76e839a5a73f4f4e23a.bundle.js} +2 -2
- package/dist/{58306.2a9393e91eef386c5162.bundle.js.map → 58306.f76e839a5a73f4f4e23a.bundle.js.map} +1 -1
- package/dist/{59718.f1ae3d1480c7179c57f0.bundle.js → 59718.dfd5982de2b39ccaa2ee.bundle.js} +2 -2
- package/dist/59718.dfd5982de2b39ccaa2ee.bundle.js.map +1 -0
- package/dist/67232.5a23ef1e641a2ca030c6.bundle.js +2 -0
- package/dist/67232.5a23ef1e641a2ca030c6.bundle.js.map +1 -0
- package/dist/{67888.da842e9221435c4ce47f.bundle.js → 67888.1537da0fa115fd7a2f06.bundle.js} +2 -2
- package/dist/{67888.da842e9221435c4ce47f.bundle.js.map → 67888.1537da0fa115fd7a2f06.bundle.js.map} +1 -1
- package/dist/68685.3ec66ceae3e494eba19b.bundle.js +2 -0
- package/dist/68685.3ec66ceae3e494eba19b.bundle.js.map +1 -0
- package/dist/{69112.817cf7b4d2911108c736.bundle.js → 69112.82e4d57df53e40b54050.bundle.js} +2 -2
- package/dist/69112.82e4d57df53e40b54050.bundle.js.map +1 -0
- package/dist/{70938.aee60e09777981a03d4c.bundle.js → 70938.fd6dd4e05b512128a074.bundle.js} +2 -2
- package/dist/{70938.aee60e09777981a03d4c.bundle.js.map → 70938.fd6dd4e05b512128a074.bundle.js.map} +1 -1
- package/dist/{72379.6eecf9bfd4bd4c65b659.bundle.js → 72379.207930bac55b212354ae.bundle.js} +2 -2
- package/dist/{72379.6eecf9bfd4bd4c65b659.bundle.js.map → 72379.207930bac55b212354ae.bundle.js.map} +1 -1
- package/dist/{73667.942b41c1d4ad078e2a6a.bundle.js → 73667.f42971a7477d6744c54c.bundle.js} +2 -2
- package/dist/{73667.942b41c1d4ad078e2a6a.bundle.js.map → 73667.f42971a7477d6744c54c.bundle.js.map} +1 -1
- package/dist/{73793.67628222a731868e5ddc.bundle.js → 73793.adf7b10d53a8ee7fa07c.bundle.js} +2 -2
- package/dist/{73793.67628222a731868e5ddc.bundle.js.map → 73793.adf7b10d53a8ee7fa07c.bundle.js.map} +1 -1
- package/dist/74106.f94ca66e9fc021789d6a.bundle.js +2 -0
- package/dist/74106.f94ca66e9fc021789d6a.bundle.js.map +1 -0
- package/dist/{75282.eae2387932c55dc997e3.bundle.js → 75282.f097da30576bae97c906.bundle.js} +2 -2
- package/dist/{75282.eae2387932c55dc997e3.bundle.js.map → 75282.f097da30576bae97c906.bundle.js.map} +1 -1
- package/dist/{75849.f5d1a50a8b03fb10008f.bundle.js → 75849.9c78b9889eccbaee7ae0.bundle.js} +2 -2
- package/dist/{75849.f5d1a50a8b03fb10008f.bundle.js.map → 75849.9c78b9889eccbaee7ae0.bundle.js.map} +1 -1
- package/dist/{78250.52061302438b3c0323d3.bundle.js → 78250.9f4b0c688bdb06967ed6.bundle.js} +2 -2
- package/dist/{78250.52061302438b3c0323d3.bundle.js.map → 78250.9f4b0c688bdb06967ed6.bundle.js.map} +1 -1
- package/dist/79329.69815208f7a0b1678dc2.bundle.js +2 -0
- package/dist/79329.69815208f7a0b1678dc2.bundle.js.map +1 -0
- package/dist/{82926.32c69a801c99f029c69f.bundle.js → 82926.ce06c4bb3d76b9fe5fa9.bundle.js} +2 -2
- package/dist/{82926.32c69a801c99f029c69f.bundle.js.map → 82926.ce06c4bb3d76b9fe5fa9.bundle.js.map} +1 -1
- package/dist/86142.3f4acbd124c99af11e48.bundle.js +2 -0
- package/dist/86142.3f4acbd124c99af11e48.bundle.js.map +1 -0
- package/dist/86639.5584db5b403656b75ad4.bundle.js +2 -0
- package/dist/86639.5584db5b403656b75ad4.bundle.js.map +1 -0
- package/dist/89695.9a36bd7b51d76634b902.bundle.js +2 -0
- package/dist/89695.9a36bd7b51d76634b902.bundle.js.map +1 -0
- package/dist/{9062.8a9659bd978a5ac7a1e2.bundle.js → 9062.91ba683ec5a6cb53c23f.bundle.js} +2 -2
- package/dist/{9062.8a9659bd978a5ac7a1e2.bundle.js.map → 9062.91ba683ec5a6cb53c23f.bundle.js.map} +1 -1
- package/dist/94519.1b7b699d10f1278380c3.bundle.js +2 -0
- package/dist/94519.1b7b699d10f1278380c3.bundle.js.map +1 -0
- package/dist/{95953.f930b9ba889a452ca771.bundle.js → 95953.4ea6a7c68a22779ba299.bundle.js} +2 -2
- package/dist/95953.4ea6a7c68a22779ba299.bundle.js.map +1 -0
- package/dist/98860.5ade579c8f05a0df416b.bundle.js +2 -0
- package/dist/98860.5ade579c8f05a0df416b.bundle.js.map +1 -0
- package/dist/{99448.66df63e0704114d6127a.bundle.js → 99448.b2524aa8fdf2f3aee82a.bundle.js} +2 -2
- package/dist/{99448.66df63e0704114d6127a.bundle.js.map → 99448.b2524aa8fdf2f3aee82a.bundle.js.map} +1 -1
- package/dist/api/ontotext-workbench-api.js +1 -1
- package/dist/api/ontotext-workbench-api.js.map +1 -1
- package/dist/css/ttyg/agent-settings-modal.css +1 -1
- package/dist/i18n/locale-en.json +1 -0
- package/dist/i18n/locale-fr.json +1 -0
- package/dist/index.html +8 -8
- package/dist/js/angular/clustermanagement/templates/cluster-nodes-configuration.html +1 -1
- package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +1 -1
- package/dist/js/angular/core/directives/dynamic-form/templates/dynamic-form.html +1 -1
- package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +1 -1
- package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
- package/dist/js/angular/core/directives/shuttle-multiselect/templates/shuttle-multiselect.html +1 -1
- package/dist/js/angular/core/directives/yasgui-component/templates/yasgui-component.html +1 -1
- package/dist/js/angular/core/templates/cookie-policy/cookie-consent.html +1 -1
- package/dist/js/angular/core/templates/cookie-policy/cookie-policy.html +1 -1
- package/dist/js/angular/core/templates/editable-content/editable-content.html +1 -1
- package/dist/js/angular/core/templates/markdown-content/markdown-content.html +1 -1
- package/dist/js/angular/core/templates/search-resource-input.html +1 -1
- package/dist/js/angular/graphql/templates/create-graphql-endpoint.html +2 -2
- package/dist/js/angular/graphql/templates/graphql-endpoint-management.html +1 -1
- package/dist/js/angular/graphql/templates/graphql-playground.html +1 -1
- package/dist/js/angular/graphql/templates/modal/endpoint-configuration-modal.html +1 -1
- package/dist/js/angular/graphql/templates/modal/endpoint-generation-failure-result-modal.html +1 -1
- package/dist/js/angular/graphql/templates/modal/import-endpoint-definition-modal.html +1 -1
- package/dist/js/angular/security/templates/user.html +2 -2
- package/dist/js/angular/ttyg/templates/agent-list.html +1 -1
- package/dist/js/angular/ttyg/templates/agent-select-menu.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-item-detail.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-list.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-panel.html +1 -1
- package/dist/js/angular/ttyg/templates/modal/agent-instructions-explain-modal.html +1 -1
- package/dist/js/angular/ttyg/templates/modal/agent-settings-modal.html +4 -3
- package/dist/js/angular/ttyg/templates/modal/external-integration-configuration-modal.html +1 -1
- package/dist/js/angular/ttyg/templates/no-agents-view.html +1 -1
- package/dist/js/angular/ttyg/templates/ttyg.html +1 -1
- package/dist/{legacyWorkbench.a918490fca19fd205bef.js → legacyWorkbench.c5245455051fd0bab730.js} +3 -3
- package/dist/{legacyWorkbench.a918490fca19fd205bef.js.map → legacyWorkbench.c5245455051fd0bab730.js.map} +1 -1
- package/dist/{main.5a06ce3271fcd9cb93e7.js → main.fa0b99f721588e894d1d.js} +3 -3
- package/dist/{main.5a06ce3271fcd9cb93e7.js.map → main.fa0b99f721588e894d1d.js.map} +1 -1
- package/dist/pages/aclmanagement.html +2 -2
- package/dist/pages/autocomplete.html +1 -1
- package/dist/pages/choose-repository-type.html +1 -1
- package/dist/pages/cluster-management/clusterInfo.html +3 -3
- package/dist/pages/create-index.html +1 -1
- package/dist/pages/dependencies.html +1 -1
- package/dist/pages/domainRangeInfo.html +2 -2
- package/dist/pages/edit.html +1 -1
- package/dist/pages/explore.html +1 -1
- package/dist/pages/export.html +1 -1
- package/dist/pages/find.html +1 -1
- package/dist/pages/graph-config/saveGraphConfig.html +8 -8
- package/dist/pages/graphs-visualizations.html +7 -7
- package/dist/pages/guides.html +1 -1
- package/dist/pages/import.html +2 -2
- package/dist/pages/jdbc-create.html +1 -1
- package/dist/pages/login.html +1 -1
- package/dist/pages/monitor/backup-and-restore.html +1 -1
- package/dist/pages/monitor/queries.html +1 -1
- package/dist/pages/monitor/resources.html +1 -1
- package/dist/pages/namespaces.html +2 -2
- package/dist/pages/plugins.html +1 -1
- package/dist/pages/rdfClassHierarchyInfo.html +7 -7
- package/dist/pages/rdfrank.html +2 -2
- package/dist/pages/repositories.html +1 -1
- package/dist/pages/repository.html +1 -1
- package/dist/pages/similarity-indexes.html +1 -1
- package/dist/pages/sparql-editor.html +1 -1
- package/dist/pages/sparql-template-create.html +1 -1
- package/dist/pages/ux-test1.html +2 -2
- package/dist/pages/webapi.html +2 -2
- package/dist/plugins.js +1 -1
- package/dist/res/swagger5/index.html +11 -11
- package/dist/shared-components/cjs/onto-layout.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-layout.cjs.entry.js.map +1 -1
- package/dist/shared-components/cjs/onto-layout.entry.cjs.js.map +1 -1
- package/dist/shared-components/collection/components/onto-layout/onto-layout.js +1 -1
- package/dist/shared-components/collection/components/onto-layout/onto-layout.js.map +1 -1
- package/dist/shared-components/esm/onto-layout.entry.js +1 -1
- package/dist/shared-components/esm/onto-layout.entry.js.map +1 -1
- package/dist/shared-components/shared-components/onto-layout.entry.esm.js.map +1 -1
- package/dist/shared-components/shared-components/p-504c7e8e.entry.js +1 -0
- package/dist/shared-components/shared-components/p-504c7e8e.entry.js.map +1 -0
- package/dist/shared-components/shared-components/shared-components.esm.js +1 -1
- package/package.json +1 -1
- package/dist/13486.58f89862c40c0f84cb09.bundle.js.map +0 -1
- package/dist/13813.a49f3fcf17ecd10c738e.bundle.js +0 -2
- package/dist/13813.a49f3fcf17ecd10c738e.bundle.js.map +0 -1
- package/dist/24785.07db24a70db7d20d268a.bundle.js +0 -2
- package/dist/24785.07db24a70db7d20d268a.bundle.js.map +0 -1
- package/dist/25090.8336e69433235ea3dfc6.bundle.js +0 -2
- package/dist/25090.8336e69433235ea3dfc6.bundle.js.map +0 -1
- package/dist/34330.a2a4211b14d118bd4c03.bundle.js +0 -2
- package/dist/34330.a2a4211b14d118bd4c03.bundle.js.map +0 -1
- package/dist/36737.0f3e0ff6942f79d49804.bundle.js +0 -2
- package/dist/36737.0f3e0ff6942f79d49804.bundle.js.map +0 -1
- package/dist/39448.a6ec42f0d72642fe9ee9.bundle.js +0 -2
- package/dist/39448.a6ec42f0d72642fe9ee9.bundle.js.map +0 -1
- package/dist/39874.6ca23ead080b52dc1bc6.bundle.js.map +0 -1
- package/dist/4125.28d3c85c122f270c9b2c.bundle.js +0 -2
- package/dist/4125.28d3c85c122f270c9b2c.bundle.js.map +0 -1
- package/dist/41621.d1b7d799116c07df17d1.bundle.js.map +0 -1
- package/dist/42143.87a6b0a089da7a2318dd.bundle.js +0 -2
- package/dist/42143.87a6b0a089da7a2318dd.bundle.js.map +0 -1
- package/dist/51087.8bc01b7861b40bc7082d.bundle.js +0 -2
- package/dist/51087.8bc01b7861b40bc7082d.bundle.js.map +0 -1
- package/dist/57952.afa9e0608388e5bae876.bundle.js +0 -2
- package/dist/57952.afa9e0608388e5bae876.bundle.js.map +0 -1
- package/dist/59718.f1ae3d1480c7179c57f0.bundle.js.map +0 -1
- package/dist/67232.ca7667a39c74efdb90e1.bundle.js +0 -2
- package/dist/67232.ca7667a39c74efdb90e1.bundle.js.map +0 -1
- package/dist/68685.314faeaa55a342568c0b.bundle.js +0 -2
- package/dist/68685.314faeaa55a342568c0b.bundle.js.map +0 -1
- package/dist/69112.817cf7b4d2911108c736.bundle.js.map +0 -1
- package/dist/74106.82ee18377b0ae14c6a7f.bundle.js +0 -2
- package/dist/74106.82ee18377b0ae14c6a7f.bundle.js.map +0 -1
- package/dist/79329.d966e9755b8abe0219dc.bundle.js +0 -2
- package/dist/79329.d966e9755b8abe0219dc.bundle.js.map +0 -1
- package/dist/86142.ed366f6953d750eb99b8.bundle.js +0 -2
- package/dist/86142.ed366f6953d750eb99b8.bundle.js.map +0 -1
- package/dist/86639.6cf8f34680ceacc7298d.bundle.js +0 -2
- package/dist/86639.6cf8f34680ceacc7298d.bundle.js.map +0 -1
- package/dist/89695.2d49f93862aee2cf23af.bundle.js +0 -2
- package/dist/89695.2d49f93862aee2cf23af.bundle.js.map +0 -1
- package/dist/94519.f41b6f4fb1b1bb6e3bf5.bundle.js +0 -2
- package/dist/94519.f41b6f4fb1b1bb6e3bf5.bundle.js.map +0 -1
- package/dist/95953.f930b9ba889a452ca771.bundle.js.map +0 -1
- package/dist/98860.30ea9a212cf6e622ec36.bundle.js +0 -2
- package/dist/98860.30ea9a212cf6e622ec36.bundle.js.map +0 -1
- package/dist/shared-components/shared-components/p-28a4ce8f.entry.js +0 -1
- package/dist/shared-components/shared-components/p-28a4ce8f.entry.js.map +0 -1
- /package/dist/{legacyWorkbench.a918490fca19fd205bef.js.LICENSE.txt → legacyWorkbench.c5245455051fd0bab730.js.LICENSE.txt} +0 -0
- /package/dist/{main.5a06ce3271fcd9cb93e7.js.LICENSE.txt → main.fa0b99f721588e894d1d.js.LICENSE.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"onto-layout.entry.cjs.js","mappings":"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","names":["ServiceProvider","SecurityContextService","AuthenticationService","NavigationContextService","SubscriptionList","WindowService","EventService","EventName","h","Host","LocalStorageSubscriptionHandlerService","RestrictedPages","getPathName"],"sources":["src/utils/function-utils.ts","src/models/constants.ts","src/components/onto-layout/onto-layout.scss?tag=onto-layout","src/components/onto-layout/onto-layout.tsx"],"sourcesContent":["export function debounce(func, wait = 300) {\n let timer: string | number | NodeJS.Timeout;\n return (...args: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => func.apply(this, args), wait);\n };\n}\n","export const RESPONSIVE_BREAKPOINTS = {\n SM: 640,\n MD: 768,\n LG: 1024,\n XL: 1280,\n XXL: 1400,\n};\n\n/**\n * The width of the window in pixels at which the navbar should collapse.\n */\nexport const WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR = RESPONSIVE_BREAKPOINTS.MD;\n",":host {\n display: block;\n height: 100%;\n}\n.wb-layout {\n display: grid;\n grid-template-columns: 15rem minmax(200px, 1fr);\n grid-template-rows: auto 1fr auto;\n grid-template-areas:\n \"nav header\"\n \"nav main\"\n \"nav footer\";\n min-height: 100vh;\n margin: 0;\n\n &.expanded {\n grid-template-columns: 4.375rem 1fr;\n }\n\n nav {\n grid-area: nav;\n }\n\n header {\n grid-area: header;\n }\n\n main {\n grid-area: main;\n }\n\n main .main-container {\n /* This is a temporary solution to properly align the main container next to the sidebar until a proper layout is in place. */\n margin-left: 0;\n }\n\n .default-slot-wrapper {\n display: none;\n }\n\n footer {\n grid-area: footer;\n }\n}\n\n.wb-header {\n position: sticky;\n top: 0;\n z-index: 999;\n}\n","import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot></div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n this.securityContextService.updateRestrictedPages(new RestrictedPages());\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n // Delegate to legacy, when a user has authority in order to show the authority banner, which is not migrated yet\n this.hasPermission = !permissions.isRestricted(path) ? true : !this.authenticationService.hasAuthority();\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"onto-layout.entry.cjs.js","mappings":"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","names":["ServiceProvider","SecurityContextService","AuthenticationService","NavigationContextService","SubscriptionList","WindowService","EventService","EventName","h","Host","LocalStorageSubscriptionHandlerService","getPathName"],"sources":["src/utils/function-utils.ts","src/models/constants.ts","src/components/onto-layout/onto-layout.scss?tag=onto-layout","src/components/onto-layout/onto-layout.tsx"],"sourcesContent":["export function debounce(func, wait = 300) {\n let timer: string | number | NodeJS.Timeout;\n return (...args: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => func.apply(this, args), wait);\n };\n}\n","export const RESPONSIVE_BREAKPOINTS = {\n SM: 640,\n MD: 768,\n LG: 1024,\n XL: 1280,\n XXL: 1400,\n};\n\n/**\n * The width of the window in pixels at which the navbar should collapse.\n */\nexport const WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR = RESPONSIVE_BREAKPOINTS.MD;\n",":host {\n display: block;\n height: 100%;\n}\n.wb-layout {\n display: grid;\n grid-template-columns: 15rem minmax(200px, 1fr);\n grid-template-rows: auto 1fr auto;\n grid-template-areas:\n \"nav header\"\n \"nav main\"\n \"nav footer\";\n min-height: 100vh;\n margin: 0;\n\n &.expanded {\n grid-template-columns: 4.375rem 1fr;\n }\n\n nav {\n grid-area: nav;\n }\n\n header {\n grid-area: header;\n }\n\n main {\n grid-area: main;\n }\n\n main .main-container {\n /* This is a temporary solution to properly align the main container next to the sidebar until a proper layout is in place. */\n margin-left: 0;\n }\n\n .default-slot-wrapper {\n display: none;\n }\n\n footer {\n grid-area: footer;\n }\n}\n\n.wb-header {\n position: sticky;\n top: 0;\n z-index: 999;\n}\n","import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot>\n </div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n this.hasPermission = !permissions.isRestricted(path);\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"],"version":3}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onto-layout.entry.cjs.js","sources":["src/utils/function-utils.ts","src/models/constants.ts","src/components/onto-layout/onto-layout.scss?tag=onto-layout","src/components/onto-layout/onto-layout.tsx"],"sourcesContent":["export function debounce(func, wait = 300) {\n let timer: string | number | NodeJS.Timeout;\n return (...args: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => func.apply(this, args), wait);\n };\n}\n","export const RESPONSIVE_BREAKPOINTS = {\n SM: 640,\n MD: 768,\n LG: 1024,\n XL: 1280,\n XXL: 1400,\n};\n\n/**\n * The width of the window in pixels at which the navbar should collapse.\n */\nexport const WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR = RESPONSIVE_BREAKPOINTS.MD;\n",":host {\n display: block;\n height: 100%;\n}\n.wb-layout {\n display: grid;\n grid-template-columns: 15rem minmax(200px, 1fr);\n grid-template-rows: auto 1fr auto;\n grid-template-areas:\n \"nav header\"\n \"nav main\"\n \"nav footer\";\n min-height: 100vh;\n margin: 0;\n\n &.expanded {\n grid-template-columns: 4.375rem 1fr;\n }\n\n nav {\n grid-area: nav;\n }\n\n header {\n grid-area: header;\n }\n\n main {\n grid-area: main;\n }\n\n main .main-container {\n /* This is a temporary solution to properly align the main container next to the sidebar until a proper layout is in place. */\n margin-left: 0;\n }\n\n .default-slot-wrapper {\n display: none;\n }\n\n footer {\n grid-area: footer;\n }\n}\n\n.wb-header {\n position: sticky;\n top: 0;\n z-index: 999;\n}\n","import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot></div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n this.securityContextService.updateRestrictedPages(new RestrictedPages());\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n // Delegate to legacy, when a user has authority in order to show the authority banner, which is not migrated yet\n this.hasPermission = !permissions.isRestricted(path) ? true : !this.authenticationService.hasAuthority();\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"],"names":["ServiceProvider","SecurityContextService","AuthenticationService","NavigationContextService","SubscriptionList","WindowService","EventService","EventName","h","Host","LocalStorageSubscriptionHandlerService","RestrictedPages","getPathName"],"mappings":";;;;;SAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,EAAA;AACvC,IAAA,IAAI,KAAuC;AAC3C,IAAA,OAAO,CAAC,GAAG,IAAS,KAAI;QACtB,YAAY,CAAC,KAAK,CAAC;AACnB,QAAA,KAAK,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AACxD,KAAC;AACH;;ACNO,MAAM,sBAAsB,GAAG;AACpC,IACA,EAAE,EAAE,IAIL;AAED;;AAEG;AACI,MAAM,iCAAiC,GAAG,sBAAsB,CAAC,EAAE;;ACX1E,MAAM,aAAa,GAAG,qiBAAqiB;;MCwB9iB,UAAU,GAAA,MAAA;;;;AAsCrB,IAAA,WAAA,CAAA,OAAA,EAAA;;;;;QAlCiB,IAAA,CAAA,sBAAsB,GAAGA,4BAAe,CAAC,GAAG,CAACC,mCAAsB,CAAC;QACpE,IAAA,CAAA,qBAAqB,GAAGD,4BAAe,CAAC,GAAG,CAACE,kCAAqB,CAAC;QAClE,IAAA,CAAA,wBAAwB,GAAGF,4BAAe,CAAC,GAAG,CAACG,qCAAwB,CAAC;AAchF,QAAA,IAAe,CAAA,eAAA,GAAG,KAAK;AACvB,QAAA,IAAa,CAAA,aAAA,GAAY,IAAI;AAC7B,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE;;;;AAMjD;;AAEK;AACY,QAAA,IAAA,CAAA,aAAa,GAAqB,IAAIC,6BAAgB,EAAE;AAEjE,QAAA,IAAiB,CAAA,iBAAA,GAAG,KAAK;AAM/B,QAAA,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,EAAE,CAAC;AAC1E,QAAAC,0BAAa,CAAC,SAAS,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC;AAChF;IAED,gBAAgB,GAAA;QACd,IAAI,CAAC,mBAAmB,EAAE;;IAG5B,iBAAiB,GAAA;QACf,IAAI,CAAC,0BAA0B,EAAE;QACjC,IAAI,CAAC,gBAAgB,EAAE;;QAEvB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,wBAAwB,CAAC,CAAC,eAAe,KAAK,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC;QACtI,IAAI,CAAC,aAAa,CAAC,GAAG,CACpBL,4BAAe,CAAC,GAAG,CAACM,yBAAY,CAAC,CAAC,SAAS,CAACC,sBAAS,CAAC,cAAc,EAAE,CAAC,oBAA0C,KAAI;YACnH,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAC9E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;SACrE,CAAC,CAAC;QACL,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;;AAGtE;;;AAGG;IACH,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE;;IAGrC,MAAM,GAAA;QACJ,QACEC,OAAC,CAAAC,UAAI,EAAC,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,WAAW,EAAA,EAErBD,OAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,sBAAsB,EAAA,EAC/BA,OAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,SAAS,EAAA,CAAQ,CACxB,EACNA,OAAQ,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,WAAW,EAAA,EACtB,IAAI,CAAC,SAAS,IAAIA,OAAA,CAAA,aAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAA2B,CACvC,EAETA,OAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,WAAW,EAAA,EACpBA,OAAa,CAAA,aAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,EAAA,kBAAA,EACT,IAAI,CAAC,eAAe,EAAA,CAAgB,CAC/D,EAEL,IAAI,CAAC,aAAa,IACjBA,OAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,mBAAmB,EAAA,EAC5BA,OAAM,CAAA,MAAA,EAAA,EAAA,IAAI,EAAC,MAAM,EAAQ,CAAA,CAAM,KAEjCA,OAAA,CAAA,wBAAA,EAAA,IAAA,CAAiD,CAClD,EACDA,OAAQ,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,WAAW,EAAA,EACtB,IAAI,CAAC,SAAS,IAAIA,OAAA,CAAA,aAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAA2B,CACvC,EACTA,OAA6B,CAAA,cAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAA,EAC7BA,OAA2B,CAAA,aAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAA,CACtB;;;;;AAOX;;;;AAIG;AAEH,IAAA,eAAe,CAAC,KAAsC,EAAA;QACpD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO;AAC7C,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;;aACrC;YACL,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;;;AAIjD;;;AAGG;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,oBAAoB,EAAE;;;;;IAMrB,mBAAmB,GAAA;QACzB,IAAI,CAAC,eAAe,GAAGH,0BAAa,CAAC,SAAS,EAAE,CAAC,UAAU,IAAI,iCAAiC;QAChG,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACpD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;;aACxC;YACL,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;;;AAItC,IAAA,mBAAmB,CAAC,KAAmB,EAAA;QAC7C,MAAM,OAAO,GAAGL,4BAAe,CAAC,GAAG,CAACU,mDAAsC,CAAC;AAC3E,QAAA,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC;;;;;IAM5B,0BAA0B,GAAA;QAChC,MAAM,sBAAsB,GAAGV,4BAAe,CAAC,GAAG,CAACC,mCAAsB,CAAC;AAC1E,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,sBAAsB,CAAC,0BAA0B,CAAC,CAAC,iBAAiB,KAAI;AACtE,YAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB;YAC1C,IAAI,CAAC,gBAAgB,EAAE;SACxB,CAAC,CACH;AAED,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,sBAAsB,CAAC,uBAAuB,CAAC,CAAC,cAAc,KAAI;AAChE,YAAA,IAAI,CAAC,cAAc,GAAG,cAAc;YACpC,IAAI,CAAC,gBAAgB,EAAE;SACxB,CAAC,CACH;AAED,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpBD,4BAAe,CAAC,GAAG,CAACM,yBAAY,CAAC,CAAC,SAAS,CAACC,sBAAS,CAAC,MAAM,EAAE,MAAK;YACjE,IAAI,CAAC,uBAAuB,EAAE;YAC9B,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,IAAII,4BAAe,EAAE,CAAC;SACzE,CAAC,CACH;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,sBAAsB,CAAC,kBAAkB,CAAC,MAAI;YAC5C,IAAI,CAAC,uBAAuB,EAAE;YAC9B,IAAI,CAAC,gBAAgB,EAAE;SACxB,CAAC,CACH;;AAGK,IAAA,aAAa,CAAC,WAA4B,EAAA;QAChD,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,IAAI,GAAGC,wBAAW,EAAE;;YAE1B,IAAI,CAAC,aAAa,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE;;aACnG;;AAEL,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;;QAG3B,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAgB;QAC5E,IAAI,WAAW,EAAE;AACf,YAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,GAAG,OAAO,GAAG,MAAM;;;IAI7D,gBAAgB,GAAA;QACtB,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,EAAE;AACnD,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;;aACjB;AACL,YAAA,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc;AACjE,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE;AAElH,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO,IAAI,eAAe;AAC3C,YAAA,IAAI,CAAC,UAAU,GAAG,eAAe;;;IAI7B,oBAAoB,GAAA;QAC1B,MAAM,WAAW,GAAGZ,4BAAe,CAAC,GAAG,CAACE,kCAAqB,CAAC;AAC9D,QAAA,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CAAC,aAAa,EAAE;;AAGjG,IAAA,cAAc,CAAC,IAAe,EAAA;QACpC,OAAO,IAAI,CAAC,oBAAoB;eAC3BF,4BAAe,CAAC,GAAG,CAACE,kCAAqB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;;;;;IAMvD,eAAe,GAAA;QACrB,OAAO,CAAC,MAA6B,KAAI;AACvC,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAGG,0BAAa,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC;YACpF,IAAI,CAAC,uBAAuB,EAAE;AAChC,SAAC;;IAGK,uBAAuB,GAAA;;AAC7B,QAAA,IAAI,EAAC,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,SAAS,CAAA,EAAE;YAC9B;;;AAGF,QAAA,MAAM,WAAW,GAAG,CAAC,IAA2B,KAAI;;YAClD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAiB,CAAC;YAC7D,IAAI,MAAA,IAAI,CAAC,QAAQ,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,MAAM,EAAE;AACzB,gBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;;AAEtC,SAAC;QAED,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,CAAC,MAAM,IAAG;AAC1C,YAAA,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;AACnC,SAAC,CAAC;;AAEF,QAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"onto-layout.entry.cjs.js","sources":["src/utils/function-utils.ts","src/models/constants.ts","src/components/onto-layout/onto-layout.scss?tag=onto-layout","src/components/onto-layout/onto-layout.tsx"],"sourcesContent":["export function debounce(func, wait = 300) {\n let timer: string | number | NodeJS.Timeout;\n return (...args: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => func.apply(this, args), wait);\n };\n}\n","export const RESPONSIVE_BREAKPOINTS = {\n SM: 640,\n MD: 768,\n LG: 1024,\n XL: 1280,\n XXL: 1400,\n};\n\n/**\n * The width of the window in pixels at which the navbar should collapse.\n */\nexport const WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR = RESPONSIVE_BREAKPOINTS.MD;\n",":host {\n display: block;\n height: 100%;\n}\n.wb-layout {\n display: grid;\n grid-template-columns: 15rem minmax(200px, 1fr);\n grid-template-rows: auto 1fr auto;\n grid-template-areas:\n \"nav header\"\n \"nav main\"\n \"nav footer\";\n min-height: 100vh;\n margin: 0;\n\n &.expanded {\n grid-template-columns: 4.375rem 1fr;\n }\n\n nav {\n grid-area: nav;\n }\n\n header {\n grid-area: header;\n }\n\n main {\n grid-area: main;\n }\n\n main .main-container {\n /* This is a temporary solution to properly align the main container next to the sidebar until a proper layout is in place. */\n margin-left: 0;\n }\n\n .default-slot-wrapper {\n display: none;\n }\n\n footer {\n grid-area: footer;\n }\n}\n\n.wb-header {\n position: sticky;\n top: 0;\n z-index: 999;\n}\n","import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot>\n </div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n this.hasPermission = !permissions.isRestricted(path);\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"],"names":["ServiceProvider","SecurityContextService","AuthenticationService","NavigationContextService","SubscriptionList","WindowService","EventService","EventName","h","Host","LocalStorageSubscriptionHandlerService","getPathName"],"mappings":";;;;;SAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,EAAA;AACvC,IAAA,IAAI,KAAuC;AAC3C,IAAA,OAAO,CAAC,GAAG,IAAS,KAAI;QACtB,YAAY,CAAC,KAAK,CAAC;AACnB,QAAA,KAAK,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AACxD,KAAC;AACH;;ACNO,MAAM,sBAAsB,GAAG;AACpC,IACA,EAAE,EAAE,IAIL;AAED;;AAEG;AACI,MAAM,iCAAiC,GAAG,sBAAsB,CAAC,EAAE;;ACX1E,MAAM,aAAa,GAAG,qiBAAqiB;;MCwB9iB,UAAU,GAAA,MAAA;;;;AAsCrB,IAAA,WAAA,CAAA,OAAA,EAAA;;;;;QAlCiB,IAAA,CAAA,sBAAsB,GAAGA,4BAAe,CAAC,GAAG,CAACC,mCAAsB,CAAC;QACpE,IAAA,CAAA,qBAAqB,GAAGD,4BAAe,CAAC,GAAG,CAACE,kCAAqB,CAAC;QAClE,IAAA,CAAA,wBAAwB,GAAGF,4BAAe,CAAC,GAAG,CAACG,qCAAwB,CAAC;AAchF,QAAA,IAAe,CAAA,eAAA,GAAG,KAAK;AACvB,QAAA,IAAa,CAAA,aAAA,GAAY,IAAI;AAC7B,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE;;;;AAMjD;;AAEK;AACY,QAAA,IAAA,CAAA,aAAa,GAAqB,IAAIC,6BAAgB,EAAE;AAEjE,QAAA,IAAiB,CAAA,iBAAA,GAAG,KAAK;AAM/B,QAAA,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,EAAE,CAAC;AAC1E,QAAAC,0BAAa,CAAC,SAAS,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC;AAChF;IAED,gBAAgB,GAAA;QACd,IAAI,CAAC,mBAAmB,EAAE;;IAG5B,iBAAiB,GAAA;QACf,IAAI,CAAC,0BAA0B,EAAE;QACjC,IAAI,CAAC,gBAAgB,EAAE;;QAEvB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,wBAAwB,CAAC,CAAC,eAAe,KAAK,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC;QACtI,IAAI,CAAC,aAAa,CAAC,GAAG,CACpBL,4BAAe,CAAC,GAAG,CAACM,yBAAY,CAAC,CAAC,SAAS,CAACC,sBAAS,CAAC,cAAc,EAAE,CAAC,oBAA0C,KAAI;YACnH,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAC9E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;SACrE,CAAC,CAAC;QACL,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;;AAGtE;;;AAGG;IACH,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE;;IAGrC,MAAM,GAAA;QACJ,QACEC,OAAC,CAAAC,UAAI,EAAC,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,WAAW,EAAA,EAErBD,OAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,sBAAsB,EAAA,EAC/BA,OAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,SAAS,EAAA,CAAQ,CACxB,EACNA,OAAQ,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,WAAW,EAAA,EACtB,IAAI,CAAC,SAAS,IAAIA,OAAA,CAAA,aAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAA2B,CACvC,EAETA,OAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,WAAW,EAAA,EACpBA,OAAa,CAAA,aAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,EAAA,kBAAA,EACT,IAAI,CAAC,eAAe,EAAA,CAAgB,CAC/D,EAEL,IAAI,CAAC,aAAa,IACjBA,OAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,mBAAmB,EAAA,EAC5BA,OAAM,CAAA,MAAA,EAAA,EAAA,IAAI,EAAC,MAAM,EAAQ,CAAA,CACrB,KAENA,OAAA,CAAA,wBAAA,EAAA,IAAA,CAAiD,CAClD,EACDA,OAAQ,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,WAAW,EAAA,EACtB,IAAI,CAAC,SAAS,IAAIA,OAAA,CAAA,aAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAA2B,CACvC,EACTA,OAA6B,CAAA,cAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAA,EAC7BA,OAA2B,CAAA,aAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAA,CACtB;;;;;AAOX;;;;AAIG;AAEH,IAAA,eAAe,CAAC,KAAsC,EAAA;QACpD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO;AAC7C,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;;aACrC;YACL,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;;;AAIjD;;;AAGG;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,oBAAoB,EAAE;;;;;IAMrB,mBAAmB,GAAA;QACzB,IAAI,CAAC,eAAe,GAAGH,0BAAa,CAAC,SAAS,EAAE,CAAC,UAAU,IAAI,iCAAiC;QAChG,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACpD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;;aACxC;YACL,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;;;AAItC,IAAA,mBAAmB,CAAC,KAAmB,EAAA;QAC7C,MAAM,OAAO,GAAGL,4BAAe,CAAC,GAAG,CAACU,mDAAsC,CAAC;AAC3E,QAAA,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC;;;;;IAM5B,0BAA0B,GAAA;QAChC,MAAM,sBAAsB,GAAGV,4BAAe,CAAC,GAAG,CAACC,mCAAsB,CAAC;AAC1E,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,sBAAsB,CAAC,0BAA0B,CAAC,CAAC,iBAAiB,KAAI;AACtE,YAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB;YAC1C,IAAI,CAAC,gBAAgB,EAAE;SACxB,CAAC,CACH;AAED,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,sBAAsB,CAAC,uBAAuB,CAAC,CAAC,cAAc,KAAI;AAChE,YAAA,IAAI,CAAC,cAAc,GAAG,cAAc;YACpC,IAAI,CAAC,gBAAgB,EAAE;SACxB,CAAC,CACH;AAED,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpBD,4BAAe,CAAC,GAAG,CAACM,yBAAY,CAAC,CAAC,SAAS,CAACC,sBAAS,CAAC,MAAM,EAAE,MAAK;YACjE,IAAI,CAAC,uBAAuB,EAAE;YAC9B,IAAI,CAAC,gBAAgB,EAAE;SACxB,CAAC,CACH;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,sBAAsB,CAAC,kBAAkB,CAAC,MAAI;YAC5C,IAAI,CAAC,uBAAuB,EAAE;YAC9B,IAAI,CAAC,gBAAgB,EAAE;SACxB,CAAC,CACH;;AAGK,IAAA,aAAa,CAAC,WAA4B,EAAA;QAChD,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,IAAI,GAAGI,wBAAW,EAAE;YAC1B,IAAI,CAAC,aAAa,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC;;aAC/C;;AAEL,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;;QAG3B,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAgB;QAC5E,IAAI,WAAW,EAAE;AACf,YAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,GAAG,OAAO,GAAG,MAAM;;;IAI7D,gBAAgB,GAAA;QACtB,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,EAAE;AACnD,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;;aACjB;AACL,YAAA,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc;AACjE,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE;AAElH,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO,IAAI,eAAe;AAC3C,YAAA,IAAI,CAAC,UAAU,GAAG,eAAe;;;IAI7B,oBAAoB,GAAA;QAC1B,MAAM,WAAW,GAAGX,4BAAe,CAAC,GAAG,CAACE,kCAAqB,CAAC;AAC9D,QAAA,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CAAC,aAAa,EAAE;;AAGjG,IAAA,cAAc,CAAC,IAAe,EAAA;QACpC,OAAO,IAAI,CAAC,oBAAoB;eAC3BF,4BAAe,CAAC,GAAG,CAACE,kCAAqB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;;;;;IAMvD,eAAe,GAAA;QACrB,OAAO,CAAC,MAA6B,KAAI;AACvC,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAGG,0BAAa,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC;YACpF,IAAI,CAAC,uBAAuB,EAAE;AAChC,SAAC;;IAGK,uBAAuB,GAAA;;AAC7B,QAAA,IAAI,EAAC,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,SAAS,CAAA,EAAE;YAC9B;;;AAGF,QAAA,MAAM,WAAW,GAAG,CAAC,IAA2B,KAAI;;YAClD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAiB,CAAC;YAC7D,IAAI,MAAA,IAAI,CAAC,QAAQ,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,MAAM,EAAE;AACzB,gBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;;AAEtC,SAAC;QAED,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,CAAC,MAAM,IAAG;AAC1C,YAAA,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;AACnC,SAAC,CAAC;;AAEF,QAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Host,h}from"@stencil/core";import{debounce}from"../../utils/function-utils";import{WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR}from"../../models/constants";import{ServiceProvider,LocalStorageSubscriptionHandlerService,SecurityContextService,
|
|
1
|
+
import{Host,h}from"@stencil/core";import{debounce}from"../../utils/function-utils";import{WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR}from"../../models/constants";import{ServiceProvider,LocalStorageSubscriptionHandlerService,SecurityContextService,EventService,EventName,SubscriptionList,AuthenticationService,NavigationContextService,getPathName,WindowService}from"../../../../../api/dist/ontotext-workbench-api";export class OntoLayout{constructor(){this.securityContextService=ServiceProvider.get(SecurityContextService),this.authenticationService=ServiceProvider.get(AuthenticationService),this.navigationContextService=ServiceProvider.get(NavigationContextService),this.isLowResolution=!1,this.hasPermission=!0,this.showFooter=this.isAuthenticatedFully(),this.subscriptions=new SubscriptionList,this.isNavbarCollapsed=!1,this.windowResizeObserver=debounce(()=>this.windowResizeHandler(),50),WindowService.getWindow().addEventListener("storage",this.handleStorageChange)}componentDidLoad(){this.windowResizeHandler()}connectedCallback(){this.subscribeToSecurityChanges(),this.updateVisibility(),this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged(e=>this.setPermission(e))),this.subscriptions.add(ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END,e=>{this.navigationContextService.updatePreviousRoute(e.oldUrl),this.setPermission(this.securityContextService.getRestrictedPages())})),this.setPermission(this.securityContextService.getRestrictedPages())}disconnectedCallback(){this.subscriptions.unsubscribeAll()}render(){return h(Host,{key:"5d814f892fde4148f87848dbfb6a1297479b110d",class:"wb-layout"},h("div",{key:"3189f4fd2434630807d924b656e70e0f91aac9ec",class:"default-slot-wrapper"},h("slot",{key:"58aafe83a0ca87647bf9de541228b07f2acebdc8",name:"default"})),h("header",{key:"ee1a6fc5254f30e198b190725bdbfebf76c3932d",class:"wb-header"},this.isVisible&&h("onto-header",{key:"6eed310ab3e1707d24c4331fe70962b41e628bb9"})),h("nav",{key:"7759747f8d91d95e569e9a603b9d11c20d46a75c",class:"wb-navbar"},h("onto-navbar",{key:"08946fa871e0cb2bd84831b4ab57592ade2813b1",ref:this.assignNavbarRef(),"navbar-collapsed":this.isLowResolution})),this.hasPermission?h("div",{class:"main-slot-wrapper"},h("slot",{name:"main"})):h("onto-permission-banner",null),h("footer",{key:"4094b415a835ca67ef922404c4a105e7052fcdb9",class:"wb-footer"},this.isVisible&&h("onto-footer",{key:"d425c29158a1b26792e71b4e60193c57ee860e09"})),h("onto-tooltip",{key:"2cb4c8b15a44683773ef6796b070d9a4936bbff3"}),h("onto-toastr",{key:"f24a99bf4a4c01ff4ea0db6a23c5d0caf0c60ed4"}))}onNavbarToggled(e){this.isNavbarCollapsed=e.detail.payload,this.isNavbarCollapsed?this.hostElement.classList.add("expanded"):this.hostElement.classList.remove("expanded")}onResize(){this.windowResizeObserver()}windowResizeHandler(){this.isLowResolution=WindowService.getWindow().innerWidth<=WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR,this.isLowResolution||this.isNavbarCollapsed?this.hostElement.classList.add("expanded"):this.hostElement.classList.remove("expanded")}handleStorageChange(e){ServiceProvider.get(LocalStorageSubscriptionHandlerService).handleStorageChange(e)}subscribeToSecurityChanges(){const e=ServiceProvider.get(SecurityContextService);this.subscriptions.add(e.onAuthenticatedUserChanged(e=>{this.authenticatedUser=e,this.updateVisibility()})),this.subscriptions.add(e.onSecurityConfigChanged(e=>{this.securityConfig=e,this.updateVisibility()})),this.subscriptions.add(ServiceProvider.get(EventService).subscribe(EventName.LOGOUT,()=>{this.setNavbarItemVisibility(),this.updateVisibility()})),this.subscriptions.add(e.onAuthTokenChanged(()=>{this.setNavbarItemVisibility(),this.updateVisibility()}))}setPermission(e){if(e){const i=getPathName();this.hasPermission=!e.isRestricted(i)}else this.hasPermission=!0;const i=document.querySelector(".wb-layout main");i&&(i.style.display=this.hasPermission?"block":"none")}updateVisibility(){if(this.authenticationService.isSecurityEnabled()){const e=!!this.authenticatedUser&&!!this.securityConfig,i=this.authenticationService.isAuthenticated()||this.authenticationService.hasFreeAccess();this.isVisible=e&&i,this.showFooter=i}else this.isVisible=!0,this.showFooter=!0}isAuthenticatedFully(){const e=ServiceProvider.get(AuthenticationService);return!e.isSecurityEnabled()||e.isAuthenticated()||e.hasFreeAccess()}shouldShowMenu(e){return this.isAuthenticatedFully()&&ServiceProvider.get(AuthenticationService).hasRole(e)}assignNavbarRef(){return e=>{this.navbarRef=e,this.navbarRef.menuItems=WindowService.getWindow().PluginRegistry.get("main.menu"),this.setNavbarItemVisibility()}}setNavbarItemVisibility(){var e,i,t;if(!(null===(e=this.navbarRef)||void 0===e?void 0:e.menuItems))return;const s=e=>{var i;e.shouldShow=this.shouldShowMenu(e.role),(null===(i=e.children)||void 0===i?void 0:i.length)&&e.children.forEach(s)};null===(t=null===(i=this.navbarRef)||void 0===i?void 0:i.menuItems)||void 0===t||t.forEach(e=>{e.items.forEach(s)}),this.navbarRef.menuItems=[...this.navbarRef.menuItems]}static get is(){return"onto-layout"}static get originalStyleUrls(){return{$:["onto-layout.scss"]}}static get styleUrls(){return{$:["onto-layout.css"]}}static get states(){return{authenticatedUser:{},authToken:{},securityConfig:{},isLowResolution:{},hasPermission:{},showFooter:{},isVisible:{}}}static get elementRef(){return"hostElement"}static get listeners(){return[{name:"navbarToggled",method:"onNavbarToggled",target:void 0,capture:!1,passive:!1},{name:"resize",method:"onResize",target:"window",capture:!1,passive:!0}]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onto-layout.js","sourceRoot":"","sources":["../../../../../src/components/onto-layout/onto-layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot></div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n this.securityContextService.updateRestrictedPages(new RestrictedPages());\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n // Delegate to legacy, when a user has authority in order to show the authority banner, which is not migrated yet\n this.hasPermission = !permissions.isRestricted(path) ? true : !this.authenticationService.hasAuthority();\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"onto-layout.js","sourceRoot":"","sources":["../../../../../src/components/onto-layout/onto-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAC,MAAM,eAAe,CAAC;AAEzE,OAAO,EAAC,QAAQ,EAAC,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAC,iCAAiC,EAAC,MAAM,wBAAwB,CAAC;AACzE,OAAO,EACL,eAAe,EACf,sCAAsC,EACtC,sBAAsB,EAEtB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EAEd,qBAAqB,EAAwB,wBAAwB,EAAE,WAAW,EAAE,aAAa,EAClG,MAAM,yBAAyB,CAAC;AAQjC,MAAM,OAAO,UAAU;IAmCrB,2BAA2B;IAC3B,oBAAoB;IACpB,2BAA2B;IAC3B;QArCA,2BAA2B;QAC3B,WAAW;QACX,2BAA2B;QACV,2BAAsB,GAAG,eAAe,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACrE,0BAAqB,GAAG,eAAe,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnE,6BAAwB,GAAG,eAAe,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAcjF,oBAAe,GAAG,KAAK,CAAC;QACxB,kBAAa,GAAY,IAAI,CAAC;QAC9B,eAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAGlD,2BAA2B;QAC3B,UAAU;QACV,2BAA2B;QAC3B;;aAEK;QACY,kBAAa,GAAqB,IAAI,gBAAgB,EAAE,CAAC;QAElE,sBAAiB,GAAG,KAAK,CAAC;QAMhC,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3E,aAAa,CAAC,SAAS,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;KACjF;IAED,gBAAgB;QACd,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAClC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,qIAAqI;QACrI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,wBAAwB,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACvI,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,oBAA0C,EAAE,EAAE;YACnH,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC/E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC,CAAC;QACN,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACvE,CAAC;IAED;;;OAGG;IACH,oBAAoB;QAClB,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;IACtC,CAAC;IAED,MAAM;QACJ,OAAO,CACL,EAAC,IAAI,qDAAC,KAAK,EAAC,WAAW;YAErB,4DAAK,KAAK,EAAC,sBAAsB;gBAC/B,6DAAM,IAAI,EAAC,SAAS,GAAQ,CACxB;YACN,+DAAQ,KAAK,EAAC,WAAW,IACtB,IAAI,CAAC,SAAS,IAAI,qEAA2B,CACvC;YAET,4DAAK,KAAK,EAAC,WAAW;gBACpB,oEAAa,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,sBACT,IAAI,CAAC,eAAe,GAAgB,CAC/D;YAEL,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CACpB,WAAK,KAAK,EAAC,mBAAmB;gBAC5B,YAAM,IAAI,EAAC,MAAM,GAAQ,CACrB,CACP,CAAC,CAAC,CAAC,CACF,iCAAiD,CAClD;YACD,+DAAQ,KAAK,EAAC,WAAW,IACtB,IAAI,CAAC,SAAS,IAAI,qEAA2B,CACvC;YACT,sEAA6B;YAC7B,qEAA2B,CACtB,CACR,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,kBAAkB;IAClB,2BAA2B;IAC3B;;;;OAIG;IAEH,eAAe,CAAC,KAAsC;QACpD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QAC9C,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;;OAGG;IAEH,QAAQ;QACN,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,2BAA2B;IAC3B,WAAW;IACX,2BAA2B;IACnB,mBAAmB;QACzB,IAAI,CAAC,eAAe,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC,UAAU,IAAI,iCAAiC,CAAC;QACjG,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,KAAmB;QAC7C,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAC5E,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,2BAA2B;IAC3B,yBAAyB;IACzB,2BAA2B;IACnB,0BAA0B;QAChC,MAAM,sBAAsB,GAAG,eAAe,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC3E,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,sBAAsB,CAAC,0BAA0B,CAAC,CAAC,iBAAiB,EAAE,EAAE;YACtE,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;YAC3C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,sBAAsB,CAAC,uBAAuB,CAAC,CAAC,cAAc,EAAE,EAAE;YAChE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;YACrC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE;YACjE,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC,CAAC,CACH,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,sBAAsB,CAAC,kBAAkB,CAAC,GAAE,EAAE;YAC5C,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,WAA4B;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,gEAAgE;YAChE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAgB,CAAC;QAC7E,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACpE,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;YAClE,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,CAAC;YAEnH,IAAI,CAAC,SAAS,GAAG,OAAO,IAAI,eAAe,CAAC;YAC5C,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,oBAAoB;QAC1B,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC/D,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;IAC1G,CAAC;IAEO,cAAc,CAAC,IAAe;QACpC,OAAO,IAAI,CAAC,oBAAoB,EAAE;eAC7B,eAAe,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC;IAED,2BAA2B;IAC3B,eAAe;IACf,2BAA2B;IACnB,eAAe;QACrB,OAAO,CAAC,MAA6B,EAAE,EAAE;YACvC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACrF,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACjC,CAAC,CAAA;IACH,CAAC;IAEO,uBAAuB;;QAC7B,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,SAAS,CAAA,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,mEAAmE;QACnE,MAAM,WAAW,GAAG,CAAC,IAA2B,EAAE,EAAE;;YAClD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAiB,CAAC,CAAC;YAC9D,IAAI,MAAA,IAAI,CAAC,QAAQ,0CAAE,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC;QAEF,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,SAAS,0CAAE,OAAO,CAAC,MAAM,CAAC,EAAE;YAC1C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,8CAA8C;QAC9C,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot>\n </div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n this.hasPermission = !permissions.isRestricted(path);\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as registerInstance,h,a as Host,g as getElement}from"./index-I_gcXFWK.js";import{ServiceProvider,SecurityContextService,AuthenticationService,NavigationContextService,SubscriptionList,WindowService,EventService,EventName,LocalStorageSubscriptionHandlerService,
|
|
1
|
+
import{r as registerInstance,h,a as Host,g as getElement}from"./index-I_gcXFWK.js";import{ServiceProvider,SecurityContextService,AuthenticationService,NavigationContextService,SubscriptionList,WindowService,EventService,EventName,LocalStorageSubscriptionHandlerService,getPathName}from"@ontotext/workbench-api";function debounce(e,i=300){let t;return(...s)=>{clearTimeout(t),t=setTimeout(()=>e.apply(this,s),i)}}const RESPONSIVE_BREAKPOINTS={MD:768},WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR=RESPONSIVE_BREAKPOINTS.MD,ontoLayoutCss=':host{display:block;height:100%}.wb-layout{display:grid;grid-template-columns:15rem minmax(200px, 1fr);grid-template-rows:auto 1fr auto;grid-template-areas:"nav header" "nav main" "nav footer";min-height:100vh;margin:0}.wb-layout.expanded{grid-template-columns:4.375rem 1fr}.wb-layout nav{grid-area:nav}.wb-layout header{grid-area:header}.wb-layout main{grid-area:main}.wb-layout main .main-container{margin-left:0}.wb-layout .default-slot-wrapper{display:none}.wb-layout footer{grid-area:footer}.wb-header{position:sticky;top:0;z-index:999}',OntoLayout=class{constructor(e){registerInstance(this,e),this.securityContextService=ServiceProvider.get(SecurityContextService),this.authenticationService=ServiceProvider.get(AuthenticationService),this.navigationContextService=ServiceProvider.get(NavigationContextService),this.isLowResolution=!1,this.hasPermission=!0,this.showFooter=this.isAuthenticatedFully(),this.subscriptions=new SubscriptionList,this.isNavbarCollapsed=!1,this.windowResizeObserver=debounce(()=>this.windowResizeHandler(),50),WindowService.getWindow().addEventListener("storage",this.handleStorageChange)}componentDidLoad(){this.windowResizeHandler()}connectedCallback(){this.subscribeToSecurityChanges(),this.updateVisibility(),this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged(e=>this.setPermission(e))),this.subscriptions.add(ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END,e=>{this.navigationContextService.updatePreviousRoute(e.oldUrl),this.setPermission(this.securityContextService.getRestrictedPages())})),this.setPermission(this.securityContextService.getRestrictedPages())}disconnectedCallback(){this.subscriptions.unsubscribeAll()}render(){return h(Host,{key:"5d814f892fde4148f87848dbfb6a1297479b110d",class:"wb-layout"},h("div",{key:"3189f4fd2434630807d924b656e70e0f91aac9ec",class:"default-slot-wrapper"},h("slot",{key:"58aafe83a0ca87647bf9de541228b07f2acebdc8",name:"default"})),h("header",{key:"ee1a6fc5254f30e198b190725bdbfebf76c3932d",class:"wb-header"},this.isVisible&&h("onto-header",{key:"6eed310ab3e1707d24c4331fe70962b41e628bb9"})),h("nav",{key:"7759747f8d91d95e569e9a603b9d11c20d46a75c",class:"wb-navbar"},h("onto-navbar",{key:"08946fa871e0cb2bd84831b4ab57592ade2813b1",ref:this.assignNavbarRef(),"navbar-collapsed":this.isLowResolution})),this.hasPermission?h("div",{class:"main-slot-wrapper"},h("slot",{name:"main"})):h("onto-permission-banner",null),h("footer",{key:"4094b415a835ca67ef922404c4a105e7052fcdb9",class:"wb-footer"},this.isVisible&&h("onto-footer",{key:"d425c29158a1b26792e71b4e60193c57ee860e09"})),h("onto-tooltip",{key:"2cb4c8b15a44683773ef6796b070d9a4936bbff3"}),h("onto-toastr",{key:"f24a99bf4a4c01ff4ea0db6a23c5d0caf0c60ed4"}))}onNavbarToggled(e){this.isNavbarCollapsed=e.detail.payload,this.isNavbarCollapsed?this.hostElement.classList.add("expanded"):this.hostElement.classList.remove("expanded")}onResize(){this.windowResizeObserver()}windowResizeHandler(){this.isLowResolution=WindowService.getWindow().innerWidth<=WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR,this.isLowResolution||this.isNavbarCollapsed?this.hostElement.classList.add("expanded"):this.hostElement.classList.remove("expanded")}handleStorageChange(e){ServiceProvider.get(LocalStorageSubscriptionHandlerService).handleStorageChange(e)}subscribeToSecurityChanges(){const e=ServiceProvider.get(SecurityContextService);this.subscriptions.add(e.onAuthenticatedUserChanged(e=>{this.authenticatedUser=e,this.updateVisibility()})),this.subscriptions.add(e.onSecurityConfigChanged(e=>{this.securityConfig=e,this.updateVisibility()})),this.subscriptions.add(ServiceProvider.get(EventService).subscribe(EventName.LOGOUT,()=>{this.setNavbarItemVisibility(),this.updateVisibility()})),this.subscriptions.add(e.onAuthTokenChanged(()=>{this.setNavbarItemVisibility(),this.updateVisibility()}))}setPermission(e){if(e){const i=getPathName();this.hasPermission=!e.isRestricted(i)}else this.hasPermission=!0;const i=document.querySelector(".wb-layout main");i&&(i.style.display=this.hasPermission?"block":"none")}updateVisibility(){if(this.authenticationService.isSecurityEnabled()){const e=!!this.authenticatedUser&&!!this.securityConfig,i=this.authenticationService.isAuthenticated()||this.authenticationService.hasFreeAccess();this.isVisible=e&&i,this.showFooter=i}else this.isVisible=!0,this.showFooter=!0}isAuthenticatedFully(){const e=ServiceProvider.get(AuthenticationService);return!e.isSecurityEnabled()||e.isAuthenticated()||e.hasFreeAccess()}shouldShowMenu(e){return this.isAuthenticatedFully()&&ServiceProvider.get(AuthenticationService).hasRole(e)}assignNavbarRef(){return e=>{this.navbarRef=e,this.navbarRef.menuItems=WindowService.getWindow().PluginRegistry.get("main.menu"),this.setNavbarItemVisibility()}}setNavbarItemVisibility(){var e,i,t;if(!(null===(e=this.navbarRef)||void 0===e?void 0:e.menuItems))return;const s=e=>{var i;e.shouldShow=this.shouldShowMenu(e.role),(null===(i=e.children)||void 0===i?void 0:i.length)&&e.children.forEach(s)};null===(t=null===(i=this.navbarRef)||void 0===i?void 0:i.menuItems)||void 0===t||t.forEach(e=>{e.items.forEach(s)}),this.navbarRef.menuItems=[...this.navbarRef.menuItems]}get hostElement(){return getElement(this)}};OntoLayout.style=ontoLayoutCss;export{OntoLayout as onto_layout};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onto-layout.entry.js","sources":["src/utils/function-utils.ts","src/models/constants.ts","src/components/onto-layout/onto-layout.scss?tag=onto-layout","src/components/onto-layout/onto-layout.tsx"],"sourcesContent":["export function debounce(func, wait = 300) {\n let timer: string | number | NodeJS.Timeout;\n return (...args: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => func.apply(this, args), wait);\n };\n}\n","export const RESPONSIVE_BREAKPOINTS = {\n SM: 640,\n MD: 768,\n LG: 1024,\n XL: 1280,\n XXL: 1400,\n};\n\n/**\n * The width of the window in pixels at which the navbar should collapse.\n */\nexport const WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR = RESPONSIVE_BREAKPOINTS.MD;\n",":host {\n display: block;\n height: 100%;\n}\n.wb-layout {\n display: grid;\n grid-template-columns: 15rem minmax(200px, 1fr);\n grid-template-rows: auto 1fr auto;\n grid-template-areas:\n \"nav header\"\n \"nav main\"\n \"nav footer\";\n min-height: 100vh;\n margin: 0;\n\n &.expanded {\n grid-template-columns: 4.375rem 1fr;\n }\n\n nav {\n grid-area: nav;\n }\n\n header {\n grid-area: header;\n }\n\n main {\n grid-area: main;\n }\n\n main .main-container {\n /* This is a temporary solution to properly align the main container next to the sidebar until a proper layout is in place. */\n margin-left: 0;\n }\n\n .default-slot-wrapper {\n display: none;\n }\n\n footer {\n grid-area: footer;\n }\n}\n\n.wb-header {\n position: sticky;\n top: 0;\n z-index: 999;\n}\n","import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot></div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n this.securityContextService.updateRestrictedPages(new RestrictedPages());\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n // Delegate to legacy, when a user has authority in order to show the authority banner, which is not migrated yet\n this.hasPermission = !permissions.isRestricted(path) ? true : !this.authenticationService.hasAuthority();\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"onto-layout.entry.js","sources":["src/utils/function-utils.ts","src/models/constants.ts","src/components/onto-layout/onto-layout.scss?tag=onto-layout","src/components/onto-layout/onto-layout.tsx"],"sourcesContent":["export function debounce(func, wait = 300) {\n let timer: string | number | NodeJS.Timeout;\n return (...args: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => func.apply(this, args), wait);\n };\n}\n","export const RESPONSIVE_BREAKPOINTS = {\n SM: 640,\n MD: 768,\n LG: 1024,\n XL: 1280,\n XXL: 1400,\n};\n\n/**\n * The width of the window in pixels at which the navbar should collapse.\n */\nexport const WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR = RESPONSIVE_BREAKPOINTS.MD;\n",":host {\n display: block;\n height: 100%;\n}\n.wb-layout {\n display: grid;\n grid-template-columns: 15rem minmax(200px, 1fr);\n grid-template-rows: auto 1fr auto;\n grid-template-areas:\n \"nav header\"\n \"nav main\"\n \"nav footer\";\n min-height: 100vh;\n margin: 0;\n\n &.expanded {\n grid-template-columns: 4.375rem 1fr;\n }\n\n nav {\n grid-area: nav;\n }\n\n header {\n grid-area: header;\n }\n\n main {\n grid-area: main;\n }\n\n main .main-container {\n /* This is a temporary solution to properly align the main container next to the sidebar until a proper layout is in place. */\n margin-left: 0;\n }\n\n .default-slot-wrapper {\n display: none;\n }\n\n footer {\n grid-area: footer;\n }\n}\n\n.wb-header {\n position: sticky;\n top: 0;\n z-index: 999;\n}\n","import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot>\n </div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n this.hasPermission = !permissions.isRestricted(path);\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onto-layout.entry.esm.js","sources":["src/utils/function-utils.ts","src/models/constants.ts","src/components/onto-layout/onto-layout.scss?tag=onto-layout","src/components/onto-layout/onto-layout.tsx"],"sourcesContent":["export function debounce(func, wait = 300) {\n let timer: string | number | NodeJS.Timeout;\n return (...args: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => func.apply(this, args), wait);\n };\n}\n","export const RESPONSIVE_BREAKPOINTS = {\n SM: 640,\n MD: 768,\n LG: 1024,\n XL: 1280,\n XXL: 1400,\n};\n\n/**\n * The width of the window in pixels at which the navbar should collapse.\n */\nexport const WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR = RESPONSIVE_BREAKPOINTS.MD;\n",":host {\n display: block;\n height: 100%;\n}\n.wb-layout {\n display: grid;\n grid-template-columns: 15rem minmax(200px, 1fr);\n grid-template-rows: auto 1fr auto;\n grid-template-areas:\n \"nav header\"\n \"nav main\"\n \"nav footer\";\n min-height: 100vh;\n margin: 0;\n\n &.expanded {\n grid-template-columns: 4.375rem 1fr;\n }\n\n nav {\n grid-area: nav;\n }\n\n header {\n grid-area: header;\n }\n\n main {\n grid-area: main;\n }\n\n main .main-container {\n /* This is a temporary solution to properly align the main container next to the sidebar until a proper layout is in place. */\n margin-left: 0;\n }\n\n .default-slot-wrapper {\n display: none;\n }\n\n footer {\n grid-area: footer;\n }\n}\n\n.wb-header {\n position: sticky;\n top: 0;\n z-index: 999;\n}\n","import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot></div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n this.securityContextService.updateRestrictedPages(new RestrictedPages());\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n // Delegate to legacy, when a user has authority in order to show the authority banner, which is not migrated yet\n this.hasPermission = !permissions.isRestricted(path) ? true : !this.authenticationService.hasAuthority();\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"onto-layout.entry.esm.js","sources":["src/utils/function-utils.ts","src/models/constants.ts","src/components/onto-layout/onto-layout.scss?tag=onto-layout","src/components/onto-layout/onto-layout.tsx"],"sourcesContent":["export function debounce(func, wait = 300) {\n let timer: string | number | NodeJS.Timeout;\n return (...args: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => func.apply(this, args), wait);\n };\n}\n","export const RESPONSIVE_BREAKPOINTS = {\n SM: 640,\n MD: 768,\n LG: 1024,\n XL: 1280,\n XXL: 1400,\n};\n\n/**\n * The width of the window in pixels at which the navbar should collapse.\n */\nexport const WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR = RESPONSIVE_BREAKPOINTS.MD;\n",":host {\n display: block;\n height: 100%;\n}\n.wb-layout {\n display: grid;\n grid-template-columns: 15rem minmax(200px, 1fr);\n grid-template-rows: auto 1fr auto;\n grid-template-areas:\n \"nav header\"\n \"nav main\"\n \"nav footer\";\n min-height: 100vh;\n margin: 0;\n\n &.expanded {\n grid-template-columns: 4.375rem 1fr;\n }\n\n nav {\n grid-area: nav;\n }\n\n header {\n grid-area: header;\n }\n\n main {\n grid-area: main;\n }\n\n main .main-container {\n /* This is a temporary solution to properly align the main container next to the sidebar until a proper layout is in place. */\n margin-left: 0;\n }\n\n .default-slot-wrapper {\n display: none;\n }\n\n footer {\n grid-area: footer;\n }\n}\n\n.wb-header {\n position: sticky;\n top: 0;\n z-index: 999;\n}\n","import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot>\n </div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n this.hasPermission = !permissions.isRestricted(path);\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as t,h as e,a as i,g as s}from"./p-I_gcXFWK.js";import{ServiceProvider as a,SecurityContextService as o,AuthenticationService as n,NavigationContextService as h,SubscriptionList as r,WindowService as d,EventService as l,EventName as c,LocalStorageSubscriptionHandlerService as b,getPathName as f}from"@ontotext/workbench-api";function u(e,t=300){let i;return(...s)=>{clearTimeout(i),i=setTimeout(()=>e.apply(this,s),t)}}const m={MD:768},p=m.MD,y=':host{display:block;height:100%}.wb-layout{display:grid;grid-template-columns:15rem minmax(200px, 1fr);grid-template-rows:auto 1fr auto;grid-template-areas:"nav header" "nav main" "nav footer";min-height:100vh;margin:0}.wb-layout.expanded{grid-template-columns:4.375rem 1fr}.wb-layout nav{grid-area:nav}.wb-layout header{grid-area:header}.wb-layout main{grid-area:main}.wb-layout main .main-container{margin-left:0}.wb-layout .default-slot-wrapper{display:none}.wb-layout footer{grid-area:footer}.wb-header{position:sticky;top:0;z-index:999}',v=class{constructor(e){t(this,e),this.securityContextService=a.get(o),this.authenticationService=a.get(n),this.navigationContextService=a.get(h),this.isLowResolution=!1,this.hasPermission=!0,this.showFooter=this.isAuthenticatedFully(),this.subscriptions=new r,this.isNavbarCollapsed=!1,this.windowResizeObserver=u(()=>this.windowResizeHandler(),50),d.getWindow().addEventListener("storage",this.handleStorageChange)}componentDidLoad(){this.windowResizeHandler()}connectedCallback(){this.subscribeToSecurityChanges(),this.updateVisibility(),this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged(e=>this.setPermission(e))),this.subscriptions.add(a.get(l).subscribe(c.NAVIGATION_END,e=>{this.navigationContextService.updatePreviousRoute(e.oldUrl),this.setPermission(this.securityContextService.getRestrictedPages())})),this.setPermission(this.securityContextService.getRestrictedPages())}disconnectedCallback(){this.subscriptions.unsubscribeAll()}render(){return e(i,{key:"5d814f892fde4148f87848dbfb6a1297479b110d",class:"wb-layout"},e("div",{key:"3189f4fd2434630807d924b656e70e0f91aac9ec",class:"default-slot-wrapper"},e("slot",{key:"58aafe83a0ca87647bf9de541228b07f2acebdc8",name:"default"})),e("header",{key:"ee1a6fc5254f30e198b190725bdbfebf76c3932d",class:"wb-header"},this.isVisible&&e("onto-header",{key:"6eed310ab3e1707d24c4331fe70962b41e628bb9"})),e("nav",{key:"7759747f8d91d95e569e9a603b9d11c20d46a75c",class:"wb-navbar"},e("onto-navbar",{key:"08946fa871e0cb2bd84831b4ab57592ade2813b1",ref:this.assignNavbarRef(),"navbar-collapsed":this.isLowResolution})),this.hasPermission?e("div",{class:"main-slot-wrapper"},e("slot",{name:"main"})):e("onto-permission-banner",null),e("footer",{key:"4094b415a835ca67ef922404c4a105e7052fcdb9",class:"wb-footer"},this.isVisible&&e("onto-footer",{key:"d425c29158a1b26792e71b4e60193c57ee860e09"})),e("onto-tooltip",{key:"2cb4c8b15a44683773ef6796b070d9a4936bbff3"}),e("onto-toastr",{key:"f24a99bf4a4c01ff4ea0db6a23c5d0caf0c60ed4"}))}onNavbarToggled(e){this.isNavbarCollapsed=e.detail.payload,this.isNavbarCollapsed?this.hostElement.classList.add("expanded"):this.hostElement.classList.remove("expanded")}onResize(){this.windowResizeObserver()}windowResizeHandler(){this.isLowResolution=d.getWindow().innerWidth<=p,this.isLowResolution||this.isNavbarCollapsed?this.hostElement.classList.add("expanded"):this.hostElement.classList.remove("expanded")}handleStorageChange(e){a.get(b).handleStorageChange(e)}subscribeToSecurityChanges(){const e=a.get(o);this.subscriptions.add(e.onAuthenticatedUserChanged(e=>{this.authenticatedUser=e,this.updateVisibility()})),this.subscriptions.add(e.onSecurityConfigChanged(e=>{this.securityConfig=e,this.updateVisibility()})),this.subscriptions.add(a.get(l).subscribe(c.LOGOUT,()=>{this.setNavbarItemVisibility(),this.updateVisibility()})),this.subscriptions.add(e.onAuthTokenChanged(()=>{this.setNavbarItemVisibility(),this.updateVisibility()}))}setPermission(e){if(e){const t=f();this.hasPermission=!e.isRestricted(t)}else this.hasPermission=!0;const t=document.querySelector(".wb-layout main");t&&(t.style.display=this.hasPermission?"block":"none")}updateVisibility(){if(this.authenticationService.isSecurityEnabled()){const e=!!this.authenticatedUser&&!!this.securityConfig,t=this.authenticationService.isAuthenticated()||this.authenticationService.hasFreeAccess();this.isVisible=e&&t,this.showFooter=t}else this.isVisible=!0,this.showFooter=!0}isAuthenticatedFully(){const e=a.get(n);return!e.isSecurityEnabled()||e.isAuthenticated()||e.hasFreeAccess()}shouldShowMenu(e){return this.isAuthenticatedFully()&&a.get(n).hasRole(e)}assignNavbarRef(){return e=>{this.navbarRef=e,this.navbarRef.menuItems=d.getWindow().PluginRegistry.get("main.menu"),this.setNavbarItemVisibility()}}setNavbarItemVisibility(){var e,t,i;if(!(null===(e=this.navbarRef)||void 0===e?void 0:e.menuItems))return;const s=e=>{var t;e.shouldShow=this.shouldShowMenu(e.role),(null===(t=e.children)||void 0===t?void 0:t.length)&&e.children.forEach(s)};null===(i=null===(t=this.navbarRef)||void 0===t?void 0:t.menuItems)||void 0===i||i.forEach(e=>{e.items.forEach(s)}),this.navbarRef.menuItems=[...this.navbarRef.menuItems]}get hostElement(){return s(this)}};v.style=y;export{v as onto_layout};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["debounce","func","wait","timer","args","clearTimeout","setTimeout","apply","this","RESPONSIVE_BREAKPOINTS","MD","WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR","ontoLayoutCss","OntoLayout","constructor","hostRef","securityContextService","ServiceProvider","get","SecurityContextService","authenticationService","AuthenticationService","navigationContextService","NavigationContextService","isLowResolution","hasPermission","showFooter","isAuthenticatedFully","subscriptions","SubscriptionList","isNavbarCollapsed","windowResizeObserver","windowResizeHandler","WindowService","getWindow","addEventListener","handleStorageChange","componentDidLoad","connectedCallback","subscribeToSecurityChanges","updateVisibility","add","onRestrictedPagesChanged","restrictedPages","setPermission","EventService","subscribe","EventName","NAVIGATION_END","navigationEndPayload","updatePreviousRoute","oldUrl","getRestrictedPages","disconnectedCallback","unsubscribeAll","render","h","Host","key","class","name","isVisible","ref","assignNavbarRef","onNavbarToggled","event","detail","payload","hostElement","classList","remove","onResize","innerWidth","service","LocalStorageSubscriptionHandlerService","onAuthenticatedUserChanged","authenticatedUser","onSecurityConfigChanged","securityConfig","LOGOUT","setNavbarItemVisibility","onAuthTokenChanged","permissions","path","getPathName","isRestricted","mainContent","document","querySelector","style","display","isSecurityEnabled","hasAuth","isAuthenticated","hasFreeAccess","authService","shouldShowMenu","role","hasRole","navbar","navbarRef","menuItems","PluginRegistry","_a","processItem","item","shouldShow","children","length","forEach","_c","_b","plugin","items"],"sources":["src/utils/function-utils.ts","src/models/constants.ts","src/components/onto-layout/onto-layout.scss?tag=onto-layout","src/components/onto-layout/onto-layout.tsx"],"sourcesContent":["export function debounce(func, wait = 300) {\n let timer: string | number | NodeJS.Timeout;\n return (...args: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => func.apply(this, args), wait);\n };\n}\n","export const RESPONSIVE_BREAKPOINTS = {\n SM: 640,\n MD: 768,\n LG: 1024,\n XL: 1280,\n XXL: 1400,\n};\n\n/**\n * The width of the window in pixels at which the navbar should collapse.\n */\nexport const WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR = RESPONSIVE_BREAKPOINTS.MD;\n",":host {\n display: block;\n height: 100%;\n}\n.wb-layout {\n display: grid;\n grid-template-columns: 15rem minmax(200px, 1fr);\n grid-template-rows: auto 1fr auto;\n grid-template-areas:\n \"nav header\"\n \"nav main\"\n \"nav footer\";\n min-height: 100vh;\n margin: 0;\n\n &.expanded {\n grid-template-columns: 4.375rem 1fr;\n }\n\n nav {\n grid-area: nav;\n }\n\n header {\n grid-area: header;\n }\n\n main {\n grid-area: main;\n }\n\n main .main-container {\n /* This is a temporary solution to properly align the main container next to the sidebar until a proper layout is in place. */\n margin-left: 0;\n }\n\n .default-slot-wrapper {\n display: none;\n }\n\n footer {\n grid-area: footer;\n }\n}\n\n.wb-header {\n position: sticky;\n top: 0;\n z-index: 999;\n}\n","import {Component, Host, h, Listen, Element, State} from '@stencil/core';\nimport {NavbarToggledEvent} from \"../onto-navbar/navbar-toggled-event\";\nimport {debounce} from \"../../utils/function-utils\";\nimport {WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR} from \"../../models/constants\";\nimport {\n ServiceProvider,\n LocalStorageSubscriptionHandlerService,\n SecurityContextService,\n RestrictedPages,\n EventService,\n EventName,\n SubscriptionList,\n AuthenticatedUser,\n SecurityConfig,\n Authority,\n AuthenticationService, NavigationEndPayload, NavigationContextService, getPathName, WindowService\n} from '@ontotext/workbench-api';\nimport {ExternalMenuItemModel} from '../onto-navbar/external-menu-model';\n\n@Component({\n tag: 'onto-layout',\n styleUrl: 'onto-layout.scss',\n shadow: false,\n})\nexport class OntoLayout {\n // ========================\n // Services\n // ========================\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n private readonly authenticationService = ServiceProvider.get(AuthenticationService);\n private readonly navigationContextService = ServiceProvider.get(NavigationContextService);\n\n // ========================\n // DOM Refs\n // ========================\n @Element() hostElement: HTMLOntoLayoutElement;\n private navbarRef: HTMLOntoNavbarElement;\n\n // ========================\n // State\n // ========================\n @State() authenticatedUser: AuthenticatedUser;\n @State() authToken: string | null;\n @State() securityConfig: SecurityConfig;\n @State() isLowResolution = false;\n @State() hasPermission: boolean = true;\n @State() showFooter = this.isAuthenticatedFully();\n @State() isVisible: boolean;\n\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n private readonly subscriptions: SubscriptionList = new SubscriptionList();\n private readonly windowResizeObserver: (...args: any) => void;\n private isNavbarCollapsed = false;\n\n // ========================\n // Lifecycle methods\n // ========================\n constructor() {\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener(\"storage\", this.handleStorageChange);\n }\n\n componentDidLoad() {\n this.windowResizeHandler();\n }\n\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n // Subscribing here, because after a disconnectedCallback the connectedCallback is called, instead of componentDidLoad or constructor\n this.subscriptions.add(this.securityContextService.onRestrictedPagesChanged((restrictedPages) => this.setPermission(restrictedPages)));\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.NAVIGATION_END, (navigationEndPayload: NavigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n this.setPermission(this.securityContextService.getRestrictedPages());\n }));\n this.setPermission(this.securityContextService.getRestrictedPages());\n }\n\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n\n render() {\n return (\n <Host class=\"wb-layout\">\n {/* Default slot is explicitly defined to be able to hide the main content in the user permission check */}\n <div class=\"default-slot-wrapper\">\n <slot name=\"default\"></slot>\n </div>\n <header class=\"wb-header\">\n {this.isVisible && <onto-header></onto-header>}\n </header>\n\n <nav class=\"wb-navbar\">\n <onto-navbar ref={this.assignNavbarRef()}\n navbar-collapsed={this.isLowResolution}></onto-navbar>\n </nav>\n\n {this.hasPermission ? (\n <div class='main-slot-wrapper'>\n <slot name=\"main\"></slot>\n </div>\n ) : (\n <onto-permission-banner></onto-permission-banner>\n )}\n <footer class=\"wb-footer\">\n {this.isVisible && <onto-footer></onto-footer>}\n </footer>\n <onto-tooltip></onto-tooltip>\n <onto-toastr></onto-toastr>\n </Host>\n );\n }\n\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n @Listen('navbarToggled')\n onNavbarToggled(event: CustomEvent<NavbarToggledEvent>) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n } else {\n this.hostElement.classList.remove('expanded');\n }\n }\n\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n @Listen('resize', {target: 'window'})\n onResize() {\n this.windowResizeObserver();\n }\n\n // ========================\n // Handlers\n // ========================\n private windowResizeHandler(): void {\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n } else {\n this.hostElement.classList.add('expanded');\n }\n }\n\n private handleStorageChange(event: StorageEvent) {\n const service = ServiceProvider.get(LocalStorageSubscriptionHandlerService);\n service.handleStorageChange(event);\n }\n\n // ========================\n // Security & Permissions\n // ========================\n private subscribeToSecurityChanges() {\n const securityContextService = ServiceProvider.get(SecurityContextService);\n this.subscriptions.add(\n securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n })\n );\n\n this.subscriptions.add(\n ServiceProvider.get(EventService).subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n this.subscriptions.add(\n securityContextService.onAuthTokenChanged(()=>{\n this.setNavbarItemVisibility();\n this.updateVisibility();\n })\n );\n }\n\n private setPermission(permissions: RestrictedPages) {\n if (permissions) {\n const path = getPathName();\n this.hasPermission = !permissions.isRestricted(path);\n } else {\n // If the permissions are undefined, the user can access the url\n this.hasPermission = true;\n }\n\n const mainContent = document.querySelector('.wb-layout main') as HTMLElement;\n if (mainContent) {\n mainContent.style.display = this.hasPermission ? 'block' : 'none';\n }\n }\n\n private updateVisibility() {\n if (!this.authenticationService.isSecurityEnabled()) {\n this.isVisible = true;\n this.showFooter = true;\n } else {\n const hasAuth = !!this.authenticatedUser && !!this.securityConfig;\n const isAuthenticated = this.authenticationService.isAuthenticated() || this.authenticationService.hasFreeAccess();\n\n this.isVisible = hasAuth && isAuthenticated;\n this.showFooter = isAuthenticated;\n }\n }\n\n private isAuthenticatedFully() {\n const authService = ServiceProvider.get(AuthenticationService);\n return !authService.isSecurityEnabled() || authService.isAuthenticated() || authService.hasFreeAccess();\n }\n\n private shouldShowMenu(role: Authority): boolean {\n return this.isAuthenticatedFully()\n && ServiceProvider.get(AuthenticationService).hasRole(role);\n }\n\n // ========================\n // Navbar logic\n // ========================\n private assignNavbarRef() {\n return (navbar: HTMLOntoNavbarElement) => {\n this.navbarRef = navbar;\n this.navbarRef.menuItems = WindowService.getWindow().PluginRegistry.get('main.menu');\n this.setNavbarItemVisibility();\n }\n }\n\n private setNavbarItemVisibility() {\n if (!this.navbarRef?.menuItems) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item: ExternalMenuItemModel) => {\n item.shouldShow = this.shouldShowMenu(item.role as Authority);\n if (item.children?.length) {\n item.children.forEach(processItem);\n }\n };\n\n this.navbarRef?.menuItems?.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n}\n"],"mappings":"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","ignoreList":[]}
|