graphdb-workbench 3.1.0-plugins1 → 3.1.0
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.57f64bf7792ded4df148.bundle.js +2 -0
- package/dist/12396.57f64bf7792ded4df148.bundle.js.map +1 -0
- package/dist/15535.0a0251ba8c0b8b0b6cb6.bundle.js +2 -0
- package/dist/15535.0a0251ba8c0b8b0b6cb6.bundle.js.map +1 -0
- package/dist/16162.d15f619029495fed0ebc.bundle.js +2 -0
- package/dist/16162.d15f619029495fed0ebc.bundle.js.map +1 -0
- package/dist/20287.13f1a4df41ad3296ab89.bundle.js +2 -0
- package/dist/20287.13f1a4df41ad3296ab89.bundle.js.map +1 -0
- package/dist/21136.adcc7971979bb3309fb7.bundle.js +2 -0
- package/dist/21136.adcc7971979bb3309fb7.bundle.js.map +1 -0
- package/dist/21142.fa7d154aab4e4196ee15.bundle.js +2 -0
- package/dist/21142.fa7d154aab4e4196ee15.bundle.js.map +1 -0
- package/dist/21170.6a2e80c18e5aed5ec9be.bundle.js +2 -0
- package/dist/21170.6a2e80c18e5aed5ec9be.bundle.js.map +1 -0
- package/dist/21195.a6350a0800bde37d7389.bundle.js +2 -0
- package/dist/21195.a6350a0800bde37d7389.bundle.js.map +1 -0
- package/dist/25747.7a1ce8b2a54302f76b8f.bundle.js +2 -0
- package/dist/25747.7a1ce8b2a54302f76b8f.bundle.js.map +1 -0
- package/dist/27580.b71e95a28c3236448d85.bundle.js +2 -0
- package/dist/27580.b71e95a28c3236448d85.bundle.js.map +1 -0
- package/dist/31636.b0a799a7e9bf7b696c34.bundle.js +2 -0
- package/dist/31636.b0a799a7e9bf7b696c34.bundle.js.map +1 -0
- package/dist/32489.122d2fd323715b577189.bundle.js +2 -0
- package/dist/32489.122d2fd323715b577189.bundle.js.map +1 -0
- package/dist/34495.b5ed397332326a82fd84.bundle.js +2 -0
- package/dist/34495.b5ed397332326a82fd84.bundle.js.map +1 -0
- package/dist/38360.b15a558bfdc163b18398.bundle.js +2 -0
- package/dist/38360.b15a558bfdc163b18398.bundle.js.map +1 -0
- package/dist/38644.f5f755c7f868cfc5effc.bundle.js +2 -0
- package/dist/38644.f5f755c7f868cfc5effc.bundle.js.map +1 -0
- package/dist/38843.d7163009549d1f943a67.bundle.js +2 -0
- package/dist/38843.d7163009549d1f943a67.bundle.js.map +1 -0
- package/dist/39518.29d190e9d568dd15290c.bundle.js +2 -0
- package/dist/{39518.2605c04e1ba20af1e766.bundle.js.map → 39518.29d190e9d568dd15290c.bundle.js.map} +1 -1
- package/dist/39539.0bfad98c902596627e0c.bundle.js +2 -0
- package/dist/39539.0bfad98c902596627e0c.bundle.js.map +1 -0
- package/dist/{39874.ff5df6ccfc5d259d1240.bundle.js → 39874.ff510b958fcdbda4db58.bundle.js} +2 -2
- package/dist/39874.ff510b958fcdbda4db58.bundle.js.map +1 -0
- package/dist/41453.17a934b7470fd3500438.bundle.js +2 -0
- package/dist/41453.17a934b7470fd3500438.bundle.js.map +1 -0
- package/dist/42129.eb3c9840a263b0286076.bundle.js +2 -0
- package/dist/42129.eb3c9840a263b0286076.bundle.js.map +1 -0
- package/dist/44444.acf9527ea60a79fca57b.bundle.js +2 -0
- package/dist/44444.acf9527ea60a79fca57b.bundle.js.map +1 -0
- package/dist/55862.f96ae9585367b909cd91.bundle.js +2 -0
- package/dist/55862.f96ae9585367b909cd91.bundle.js.map +1 -0
- package/dist/58306.3d83e88616c1b0379c08.bundle.js +2 -0
- package/dist/58306.3d83e88616c1b0379c08.bundle.js.map +1 -0
- package/dist/67888.d4776e4b949a918c8576.bundle.js +2 -0
- package/dist/67888.d4776e4b949a918c8576.bundle.js.map +1 -0
- package/dist/72379.1731e737a91d189d6863.bundle.js +2 -0
- package/dist/72379.1731e737a91d189d6863.bundle.js.map +1 -0
- package/dist/73667.1cd2d5550d194fddb0ab.bundle.js +2 -0
- package/dist/73667.1cd2d5550d194fddb0ab.bundle.js.map +1 -0
- package/dist/73793.7b2e0da4c9137686c453.bundle.js +2 -0
- package/dist/73793.7b2e0da4c9137686c453.bundle.js.map +1 -0
- package/dist/75282.576fc3518f443c2a051d.bundle.js +2 -0
- package/dist/75282.576fc3518f443c2a051d.bundle.js.map +1 -0
- package/dist/75849.cddbdec32788ebfc4e52.bundle.js +2 -0
- package/dist/75849.cddbdec32788ebfc4e52.bundle.js.map +1 -0
- package/dist/78250.6cdf5272a8757c6ad08f.bundle.js +2 -0
- package/dist/78250.6cdf5272a8757c6ad08f.bundle.js.map +1 -0
- package/dist/79329.60e3d03195b6f5170a93.bundle.js +2 -0
- package/dist/79329.60e3d03195b6f5170a93.bundle.js.map +1 -0
- package/dist/{82926.eb6e5cdaa7f6f0a8d160.bundle.js → 82926.9807edeb09281b4bef7a.bundle.js} +2 -2
- package/dist/{82926.eb6e5cdaa7f6f0a8d160.bundle.js.map → 82926.9807edeb09281b4bef7a.bundle.js.map} +1 -1
- package/dist/9062.fe7bedf8616d6bb62120.bundle.js +2 -0
- package/dist/9062.fe7bedf8616d6bb62120.bundle.js.map +1 -0
- package/dist/99448.259dc03b85ced908b67f.bundle.js +2 -0
- package/dist/99448.259dc03b85ced908b67f.bundle.js.map +1 -0
- package/dist/api/interceptor/auth/unauthorized-interceptor.d.ts +5 -0
- package/dist/api/models/plugin-registry/plugin-registry.d.ts +5 -0
- package/dist/api/ontotext-workbench-api.d.ts +0 -2
- package/dist/api/ontotext-workbench-api.js +1 -1
- package/dist/api/ontotext-workbench-api.js.map +1 -1
- package/dist/api/services/utils/routing-utils.d.ts +0 -6
- package/dist/api/services/window/window.service.d.ts +0 -2
- 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 +2 -2
- 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.fac3f92836d2be7e94fd.js +3 -0
- package/dist/{legacyWorkbench.396c3ad569fdb055b184.js.map → legacyWorkbench.fac3f92836d2be7e94fd.js.map} +1 -1
- package/dist/{main.efd2ba99bb5c64dcd211.js → main.fa0b99f721588e894d1d.js} +3 -3
- package/dist/main.fa0b99f721588e894d1d.js.map +1 -0
- 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/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/collection/models/plugin/plugin-registry.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-41ce23b3.entry.js → p-504c7e8e.entry.js} +1 -1
- 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/dist/shared-components/types/home/ubuntu/workspace/PRO/GraphDB UI Jobs/graphdb-workbench-release/packages/shared-components/.stencil/api/src/services/utils/routing-utils.d.ts +0 -6
- package/dist/shared-components/types/home/ubuntu/workspace/PRO/GraphDB UI Jobs/graphdb-workbench-release/packages/shared-components/.stencil/api/src/services/window/window.service.d.ts +0 -2
- package/dist/shared-components/types/models/plugin/plugin-registry.d.ts +2 -2
- package/package.json +1 -3
- package/dist/12396.5583bf0708a92ff0e683.bundle.js +0 -2
- package/dist/12396.5583bf0708a92ff0e683.bundle.js.map +0 -1
- package/dist/15535.be611e4b93264c1d24e8.bundle.js +0 -2
- package/dist/15535.be611e4b93264c1d24e8.bundle.js.map +0 -1
- package/dist/16162.d174e462d078895c1896.bundle.js +0 -2
- package/dist/16162.d174e462d078895c1896.bundle.js.map +0 -1
- package/dist/20287.09c57798d8e85984d5a3.bundle.js +0 -2
- package/dist/20287.09c57798d8e85984d5a3.bundle.js.map +0 -1
- package/dist/21136.55652782e1ad6e7e8fd3.bundle.js +0 -2
- package/dist/21136.55652782e1ad6e7e8fd3.bundle.js.map +0 -1
- package/dist/21142.71b4556e696319905885.bundle.js +0 -2
- package/dist/21142.71b4556e696319905885.bundle.js.map +0 -1
- package/dist/21170.f496748eb5930ce64a71.bundle.js +0 -2
- package/dist/21170.f496748eb5930ce64a71.bundle.js.map +0 -1
- package/dist/21195.cebee32f37e2b84e5a62.bundle.js +0 -2
- package/dist/21195.cebee32f37e2b84e5a62.bundle.js.map +0 -1
- package/dist/25747.c0d4b2b740ad31088095.bundle.js +0 -2
- package/dist/25747.c0d4b2b740ad31088095.bundle.js.map +0 -1
- package/dist/27580.d4a4a6121bba7b503ef7.bundle.js +0 -2
- package/dist/27580.d4a4a6121bba7b503ef7.bundle.js.map +0 -1
- package/dist/31636.3a2363f0362edf12812b.bundle.js +0 -2
- package/dist/31636.3a2363f0362edf12812b.bundle.js.map +0 -1
- package/dist/32489.b29a602924b6adeb19db.bundle.js +0 -2
- package/dist/32489.b29a602924b6adeb19db.bundle.js.map +0 -1
- package/dist/34495.2865eac2251c70cfe1fb.bundle.js +0 -2
- package/dist/34495.2865eac2251c70cfe1fb.bundle.js.map +0 -1
- package/dist/38360.6a3ab93f70c6bd1cb6fc.bundle.js +0 -2
- package/dist/38360.6a3ab93f70c6bd1cb6fc.bundle.js.map +0 -1
- package/dist/38644.4908c19613deb1a7bd17.bundle.js +0 -2
- package/dist/38644.4908c19613deb1a7bd17.bundle.js.map +0 -1
- package/dist/38843.71a4e2af27ca0e134064.bundle.js +0 -2
- package/dist/38843.71a4e2af27ca0e134064.bundle.js.map +0 -1
- package/dist/39518.2605c04e1ba20af1e766.bundle.js +0 -2
- package/dist/39539.9c20ba448ed347994d6f.bundle.js +0 -2
- package/dist/39539.9c20ba448ed347994d6f.bundle.js.map +0 -1
- package/dist/39874.ff5df6ccfc5d259d1240.bundle.js.map +0 -1
- package/dist/41453.6dca834f576930cb7daf.bundle.js +0 -2
- package/dist/41453.6dca834f576930cb7daf.bundle.js.map +0 -1
- package/dist/42129.114af0f72f3c4e004362.bundle.js +0 -2
- package/dist/42129.114af0f72f3c4e004362.bundle.js.map +0 -1
- package/dist/44444.6d6c183b8860926309cf.bundle.js +0 -2
- package/dist/44444.6d6c183b8860926309cf.bundle.js.map +0 -1
- package/dist/55862.36b699a56e4ab6279a4f.bundle.js +0 -2
- package/dist/55862.36b699a56e4ab6279a4f.bundle.js.map +0 -1
- package/dist/58306.595da068a2e0da617617.bundle.js +0 -2
- package/dist/58306.595da068a2e0da617617.bundle.js.map +0 -1
- package/dist/67888.ab6c39a55ee809c3ae8f.bundle.js +0 -2
- package/dist/67888.ab6c39a55ee809c3ae8f.bundle.js.map +0 -1
- package/dist/72379.c57365211e08b3bc6262.bundle.js +0 -2
- package/dist/72379.c57365211e08b3bc6262.bundle.js.map +0 -1
- package/dist/73667.0bfec02355b09d7ce4ab.bundle.js +0 -2
- package/dist/73667.0bfec02355b09d7ce4ab.bundle.js.map +0 -1
- package/dist/73793.af234af46241a49cb9dd.bundle.js +0 -2
- package/dist/73793.af234af46241a49cb9dd.bundle.js.map +0 -1
- package/dist/75282.250017012e14de4ea44c.bundle.js +0 -2
- package/dist/75282.250017012e14de4ea44c.bundle.js.map +0 -1
- package/dist/75849.792b3f20173c7836455a.bundle.js +0 -2
- package/dist/75849.792b3f20173c7836455a.bundle.js.map +0 -1
- package/dist/78250.ff5259a959fee01ec205.bundle.js +0 -2
- package/dist/78250.ff5259a959fee01ec205.bundle.js.map +0 -1
- package/dist/79329.cb5661017d457ff28f48.bundle.js +0 -2
- package/dist/79329.cb5661017d457ff28f48.bundle.js.map +0 -1
- package/dist/9062.9e15930c2d766483e7f3.bundle.js +0 -2
- package/dist/9062.9e15930c2d766483e7f3.bundle.js.map +0 -1
- package/dist/99448.bf1feaa3382f8d429277.bundle.js +0 -2
- package/dist/99448.bf1feaa3382f8d429277.bundle.js.map +0 -1
- package/dist/api/models/plugins/index.d.ts +0 -7
- package/dist/api/models/plugins/plugin-definition-list.d.ts +0 -5
- package/dist/api/models/plugins/plugin-definition.d.ts +0 -7
- package/dist/api/models/plugins/plugin-module.d.ts +0 -7
- package/dist/api/models/plugins/plugin-registry.d.ts +0 -9
- package/dist/api/models/plugins/plugins-manifest-response.d.ts +0 -6
- package/dist/api/models/plugins/plugins-manifest.d.ts +0 -7
- package/dist/api/services/plugins/index.d.ts +0 -2
- package/dist/api/services/plugins/mapper/plugins-manifest.mapper.d.ts +0 -12
- package/dist/api/services/plugins/plugins-rest.service.d.ts +0 -23
- package/dist/api/services/plugins/plugins.service.d.ts +0 -29
- package/dist/api/services/plugins/test/plugins.service.spec.d.ts +0 -1
- package/dist/legacyWorkbench.396c3ad569fdb055b184.js +0 -3
- package/dist/main.efd2ba99bb5c64dcd211.js.map +0 -1
- package/dist/plugins/guides/core-steps-plugin.js +0 -1
- package/dist/plugins/plugins-manifest.json +0 -16
- package/dist/plugins/tools/alert-tool-plugin.js +0 -1
- package/dist/plugins/tools/console-tool-plugin.js +0 -1
- package/dist/shared-components/shared-components/p-41ce23b3.entry.js.map +0 -1
- package/dist/shared-components/types/home/ubuntu/workspace/PRO/GraphDB UI Jobs/graphdb-workbench-release/packages/shared-components/.stencil/api/src/models/plugins/extension-point.d.ts +0 -4
- package/dist/shared-components/types/home/ubuntu/workspace/PRO/GraphDB UI Jobs/graphdb-workbench-release/packages/shared-components/.stencil/api/src/models/plugins/index.d.ts +0 -7
- package/dist/shared-components/types/home/ubuntu/workspace/PRO/GraphDB UI Jobs/graphdb-workbench-release/packages/shared-components/.stencil/api/src/models/plugins/plugin-definition-list.d.ts +0 -5
- package/dist/shared-components/types/home/ubuntu/workspace/PRO/GraphDB UI Jobs/graphdb-workbench-release/packages/shared-components/.stencil/api/src/models/plugins/plugin-definition.d.ts +0 -7
- package/dist/shared-components/types/home/ubuntu/workspace/PRO/GraphDB UI Jobs/graphdb-workbench-release/packages/shared-components/.stencil/api/src/models/plugins/plugin-module.d.ts +0 -7
- package/dist/shared-components/types/home/ubuntu/workspace/PRO/GraphDB UI Jobs/graphdb-workbench-release/packages/shared-components/.stencil/api/src/models/plugins/plugin-registry.d.ts +0 -9
- package/dist/shared-components/types/home/ubuntu/workspace/PRO/GraphDB UI Jobs/graphdb-workbench-release/packages/shared-components/.stencil/api/src/models/plugins/plugins-manifest-response.d.ts +0 -6
- package/dist/shared-components/types/home/ubuntu/workspace/PRO/GraphDB UI Jobs/graphdb-workbench-release/packages/shared-components/.stencil/api/src/models/plugins/plugins-manifest.d.ts +0 -7
- /package/dist/api/models/{plugins → plugin-registry}/extension-point.d.ts +0 -0
- /package/dist/{legacyWorkbench.396c3ad569fdb055b184.js.LICENSE.txt → legacyWorkbench.fac3f92836d2be7e94fd.js.LICENSE.txt} +0 -0
- /package/dist/{main.efd2ba99bb5c64dcd211.js.LICENSE.txt → main.fa0b99f721588e894d1d.js.LICENSE.txt} +0 -0
|
@@ -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,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:"
|
|
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>\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
|
+
{"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>\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
|
-
{"version":3,"file":"plugin-registry.js","sourceRoot":"","sources":["../../../../../src/models/plugin/plugin-registry.ts"],"names":[],"mappings":"","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"plugin-registry.js","sourceRoot":"","sources":["../../../../../src/models/plugin/plugin-registry.ts"],"names":[],"mappings":"","sourcesContent":["import {ExternalMenuModel} from '../../components/onto-navbar/external-menu-model';\n\nexport interface PluginRegistry {\n get(extensionPoint: string): ExternalMenuModel;\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,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:"
|
|
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>\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
|
+
{"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>\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
|
+
{"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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"}
|
package/dist/shared-components/shared-components/{p-41ce23b3.entry.js → p-504c7e8e.entry.js}
RENAMED
|
@@ -1 +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
|
|
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":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{p as o,H as e,b as t}from"./p-I_gcXFWK.js";export{s as setNonce}from"./p-I_gcXFWK.js";import{g as n}from"./p-DQuL1Twl.js";var a=()=>{i(e.prototype);const t=import.meta.url,n={};return""!==t&&(n.resourcesUrl=new URL(".",t).href),o(n)},i=e=>{const o=e.cloneNode;e.cloneNode=function(e){if("TEMPLATE"===this.nodeName)return o.call(this,e);const t=o.call(this,!1),n=this.childNodes;if(e)for(let e=0;e<n.length;e++)2!==n[e].nodeType&&t.appendChild(n[e].cloneNode(!0));return t}};a().then(async e=>(await n(),t([["p-
|
|
1
|
+
import{p as o,H as e,b as t}from"./p-I_gcXFWK.js";export{s as setNonce}from"./p-I_gcXFWK.js";import{g as n}from"./p-DQuL1Twl.js";var a=()=>{i(e.prototype);const t=import.meta.url,n={};return""!==t&&(n.resourcesUrl=new URL(".",t).href),o(n)},i=e=>{const o=e.cloneNode;e.cloneNode=function(e){if("TEMPLATE"===this.nodeName)return o.call(this,e);const t=o.call(this,!1),n=this.childNodes;if(e)for(let e=0;e<n.length;e++)2!==n[e].nodeType&&t.appendChild(n[e].cloneNode(!0));return t}};a().then(async e=>(await n(),t([["p-504c7e8e",[[4,"onto-layout",{authenticatedUser:[32],authToken:[32],securityConfig:[32],isLowResolution:[32],hasPermission:[32],showFooter:[32],isVisible:[32]},[[0,"navbarToggled","onNavbarToggled"],[9,"resize","onResize"]]]]],["p-e1dd3759",[[0,"onto-test-context",{updateLicense:[64],updateProductInfo:[64],loadRepositories:[64],setAuthenticatedUser:[64],setSecurityConfig:[64],changeLanguage:[64],emitNavigateEndEvent:[64],updateRestrictedPage:[64],updateSelectedRepository:[64],updateIsLoadingActiveRepositoryLocation:[64],addToastr:[64],setAutocomplete:[64],updateNamespaces:[64]}]]],["p-4391c0b6",[[0,"onto-dropdown",{dropdownButtonName:[1,"dropdown-button-name"],dropdownButtonNameLabelKey:[1,"dropdown-button-name-label-key"],dropdownButtonGuideSelector:[1,"dropdown-button-guide-selector"],dropdownButtonTooltip:[1,"dropdown-button-tooltip"],dropdownButtonTooltipLabelKey:[1,"dropdown-button-tooltip-label-key"],dropdownTooltipTrigger:[1,"dropdown-tooltip-trigger"],iconClass:[1,"icon-class"],items:[16],tooltipTheme:[1,"tooltip-theme"],tooltipPlacement:[1,"tooltip-placement"],dropdownAlignment:[1,"dropdown-alignment"],autoClose:[4,"auto-close"],open:[32],buttonTooltipContent:[32]},[[8,"keydown","keydownListener"],[8,"click","mouseClickListener"]]]]],["p-879e5fc1",[[0,"translate-label",{labelKey:[1,"label-key"],translationParameters:[16,"translation-parameters"],translatedLabel:[32]}]]],["p-48869cea",[[4,"onto-dialog",{config:[16]}],[0,"onto-toggle-switch",{checked:[1028],labelKey:[1,"label-key"],tooltipTranslationKey:[1,"tooltip-translation-key"],context:[1],tooltipLabel:[32]}]]],["p-5401c1ee",[[0,"onto-cookie-consent",{showModal:[32]}],[0,"onto-cookie-policy-dialog",{dialogHandler:[16,"dialog-handler"]},[[0,"toggleChanged","toggleChanged"]]]]],["p-fa30a30a",[[0,"onto-rdf-search",{isOpen:[32],buttonConfig:[32]},[[8,"click","handleClick"]]],[0,"onto-language-selector",{dropdownAlignment:[1,"dropdown-alignment"],currentLanguage:[32]}],[0,"onto-license-alert",{license:[16]}],[0,"onto-operations-notification",{activeOperations:[16,"active-operations"],isOpen:[32]},[[8,"click","handleOutsideClick"]]],[0,"onto-repository-selector",{currentRepository:[16,"current-repository"],items:[16],repositorySizeInfoFetcher:[16,"repository-size-info-fetcher"],totalTripletsFormatter:[16,"total-triplets-formatter"],canWriteRepo:[16,"can-write-repo"],defaultToggleButtonName:[32],noRepositoriesButtonMessage:[32]},null,{items:["onItemsChanged"]}],[0,"onto-user-login"],[0,"onto-user-menu",{user:[16],securityConfig:[16,"security-config"],isOpen:[32]}],[0,"onto-search-icon",{tooltipLabel:[32]}],[0,"onto-search-resource-input",{context:[1],skipValidation:[4,"skip-validation"],preserveSearch:[4,"preserve-search"],isHidden:[4,"is-hidden"],buttonConfig:[16,"button-config"],inputValue:[32],searchResult:[32],isAutocompleteEnabled:[32]},null,{isHidden:["onVisibilityChange"]}]]],["p-3ab81548",[[0,"onto-header",{activeOperations:[32],license:[32],isFreeAccessEnabled:[32],shouldShowSearch:[32],isHomePage:[32],repositoryList:[32],currentRoute:[32],currentRepository:[32],securityConfig:[32]}],[0,"onto-footer",{productInfo:[32],shouldShowCookieConsent:[32]},[[0,"consentGiven","handleConsentGiven"]]],[0,"onto-navbar",{navbarCollapsed:[4,"navbar-collapsed"],menuItems:[16,"menu-items"],menuModel:[32],isCollapsed:[32]},null,{navbarCollapsed:["navbarCollapsedChange"],menuItems:["menuItemsChanged"]}],[0,"onto-permission-banner"],[0,"onto-toastr",{toasts:[32]},[[16,"create-toast-event","handleToastCreate"]]],[0,"onto-tooltip",null,[[5,"mouseover","onMouseover"],[5,"mouseout","onMouseout"]]]]]],e)));
|
|
@@ -28,12 +28,6 @@ export declare function isHomePage(): boolean;
|
|
|
28
28
|
* @returns {string} The pathname of the current URL, which represents the path segment that comes after the context (if any) and before the query string.
|
|
29
29
|
*/
|
|
30
30
|
export declare function getPathName(): string;
|
|
31
|
-
/**
|
|
32
|
-
* Retrieves the current URL including the context prefix, if present.
|
|
33
|
-
*
|
|
34
|
-
* @returns {string} The current URL including the context prefix.
|
|
35
|
-
*/
|
|
36
|
-
export declare function getOrigin(): string;
|
|
37
31
|
/**
|
|
38
32
|
* Returns the context name (base href) from the `<base>` tag in the document.
|
|
39
33
|
*
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Service } from '../../providers/service/service';
|
|
2
|
-
import { PluginRegistry } from '../../models/plugins';
|
|
3
2
|
/**
|
|
4
3
|
* Service that provides access to browser window-related functionality.
|
|
5
4
|
*/
|
|
@@ -9,5 +8,4 @@ export declare class WindowService implements Service {
|
|
|
9
8
|
* better testability and easier mocking of the window object in unit tests.
|
|
10
9
|
*/
|
|
11
10
|
static getWindow(): Window;
|
|
12
|
-
static getPluginRegistry(): PluginRegistry;
|
|
13
11
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "graphdb-workbench",
|
|
3
|
-
"version": "3.1.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "The web application for GraphDB APIs",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22.17"
|
|
@@ -33,7 +33,6 @@
|
|
|
33
33
|
"validate": "sh scripts/validate.sh",
|
|
34
34
|
"test": "sh scripts/test.sh",
|
|
35
35
|
"test:coverage": "sh scripts/test-coverage.sh",
|
|
36
|
-
"copy-plugins": "sh scripts/copy-plugins.sh",
|
|
37
36
|
"cy:run": "sh scripts/cy.sh",
|
|
38
37
|
"sonar": "sh scripts/sonar.sh",
|
|
39
38
|
"hotdeploy": "node scripts/hotdeploy.js",
|
|
@@ -99,7 +98,6 @@
|
|
|
99
98
|
"resolutions": {},
|
|
100
99
|
"dependencies": {
|
|
101
100
|
"@single-spa/import-map-injector": "^2.0.2",
|
|
102
|
-
"graphdb-workbench-plugins": "^0.0.1-TR14",
|
|
103
101
|
"import-map-overrides": "^6.0.1"
|
|
104
102
|
}
|
|
105
103
|
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export const __webpack_id__=12396;export const __webpack_ids__=[12396];export const __webpack_modules__={12396:(n,o,i)=>{i.r(o),i.d(o,{default:()=>l});const l='<link href="css/graphql/graphql-playground.css?v=3.1.0-plugins1" rel="stylesheet"/> <div class="graphql-playground-view"> <h1 id="title-container"> <span id="graphql-playground-title-label">{{title}}</span> <page-info-tooltip></page-info-tooltip> <div ng-if="!loadingEndpoints && graphqlEndpoints.length" class="toolbar pull-right"> <select ng-model="selectedGraphqlEndpoint" ng-options="endpoint as endpoint.label for endpoint in graphqlEndpoints" ng-change="onGraphqlEndpointChange(selectedGraphqlEndpoint)" class="form-control graphql-endpoint-selector" gdb-tooltip="{{\'graphql.playground.endpoint_selector.tooltip\' | translate}}" tooltip-placement="top"> </select> </div> </h1> <div core-errors></div> <div onto-loader-new ng-show="loadingEndpoints" class="graphql-playground-page-loader" size="100"> </div> <div class="content" ng-if="initialized"> <div class="no-endpoints-view" ng-show="!loadingEndpoints && configuration === undefined && !graphqlEndpoints.length"> <div class="alert alert-warning"> <div ng-bind-html="\'graphql.playground.message.no_schemas_in_repository\' | translate | trustAsHtml"></div> </div> </div> <div class="graphql-playground-container" ng-if="!loadingEndpoints && configuration && getActiveRepositoryNoError()"> <graphql-playground id="graphql-playground" configuration="configuration"></graphql-playground> </div> </div> </div> '}};
|
|
2
|
-
//# sourceMappingURL=12396.5583bf0708a92ff0e683.bundle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"12396.5583bf0708a92ff0e683.bundle.js","mappings":"uJAGA,QAFW,y1C","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/graphql/templates/graphql-playground.html"],"sourcesContent":["// Module\nvar code = `<link href=\"css/graphql/graphql-playground.css?v=3.1.0-plugins1\" rel=\"stylesheet\"/> <div class=\"graphql-playground-view\"> <h1 id=\"title-container\"> <span id=\"graphql-playground-title-label\">{{title}}</span> <page-info-tooltip></page-info-tooltip> <div ng-if=\"!loadingEndpoints && graphqlEndpoints.length\" class=\"toolbar pull-right\"> <select ng-model=\"selectedGraphqlEndpoint\" ng-options=\"endpoint as endpoint.label for endpoint in graphqlEndpoints\" ng-change=\"onGraphqlEndpointChange(selectedGraphqlEndpoint)\" class=\"form-control graphql-endpoint-selector\" gdb-tooltip=\"{{'graphql.playground.endpoint_selector.tooltip' | translate}}\" tooltip-placement=\"top\"> </select> </div> </h1> <div core-errors></div> <div onto-loader-new ng-show=\"loadingEndpoints\" class=\"graphql-playground-page-loader\" size=\"100\"> </div> <div class=\"content\" ng-if=\"initialized\"> <div class=\"no-endpoints-view\" ng-show=\"!loadingEndpoints && configuration === undefined && !graphqlEndpoints.length\"> <div class=\"alert alert-warning\"> <div ng-bind-html=\"'graphql.playground.message.no_schemas_in_repository' | translate | trustAsHtml\"></div> </div> </div> <div class=\"graphql-playground-container\" ng-if=\"!loadingEndpoints && configuration && getActiveRepositoryNoError()\"> <graphql-playground id=\"graphql-playground\" configuration=\"configuration\"></graphql-playground> </div> </div> </div> `;\n// Exports\nexport default code;"],"names":[],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export const __webpack_id__=15535;export const __webpack_ids__=[15535];export const __webpack_modules__={15535:(e,t,s)=>{s.r(t),s.d(t,{default:()=>a});const a='<script type="text/ng-template" id="popover-content-user.html"> <h5>{{\'security.user.may\' | translate}}</h5>\n\t<ul>\n <li>{{\'security.use.gdb\' | translate}}</li>\n\t <li>{{\'security.grant.read.access\' | translate}}</li>\n\t\t<li>{{\'security.grant.read.write.access\' | translate}}</li>\n </ul> <\/script> <script type="text/ng-template" id="popover-content-repo-manager.html"> <h5>{{\'security.repo.manager.may\' | translate}}</h5>\n\t<ul>\n\t\t<li>{{\'security.use.gdb\' | translate}}</li>\n\t\t<li>{{\'security.read.write.all.repos\' | translate}}</li>\n\t\t<li>{{\'security.create.edit.delete.repos\' | translate}}</li>\n\t\t<li>{{\'security.access.monitoring\' | translate}}</li>\n\t</ul> <\/script> <script type="text/ng-template" id="popover-content-admin.html"> <h5>{{\'security.admin.may\' | translate}}</h5>\n\t<ul>\n\t\t<li>{{\'security.use.gdb\' | translate}}</li>\n\t\t<li>{{\'security.read.write.all.repos\' | translate}}</li>\n\t\t<li>{{\'security.create.edit.delete.repos\' | translate}}</li>\n\t\t<li>{{\'security.access.monitoring\' | translate}}</li>\n\t\t<li>{{\'security.attach.remote.locations\' | translate}}</li>\n\t\t<li>{{\'security.manage.users.access\' | translate}}</li>\n\t\t<li>{{\'security.manage.cluster\' | translate}}</li>\n\t\t<li>{{\'security.view.sys.info\' | translate}}</li>\n\t</ul> <\/script> <link href="css/lib/ng-tags-input/ng-tags-input.min.css?v=3.1.0-plugins1" rel="stylesheet"/> <link href="css/user.css?v=3.1.0-plugins1" rel="stylesheet"/> <h1> {{pageTitle}} <page-info-tooltip></page-info-tooltip> </h1> <div id="wb-user" class="wb-user" ng-hide="loader"> <form name="form" class="form newUserForm userForm editUserContainer" ng-submit="submit()" novalidate> <div class="row"> <div class="col-md-6 us-left-col"> <div class="card login-credentials" ng-hide="isOverrideAuth() || !isLocalAuthentication()"> <div class="card-block"> <h3>{{\'view.login.title\' | translate}}</h3> <div class="form-group" ng-class="{\'has-danger\': usernameError}"> <div class="input-group"> <span class="input-group-addon" gdb-tooltip="{{\'security.table.username\' | translate}}"><i class="fa-solid fa-user text-muted"></i></span> <input id="wb-user-username" placeholder="{{\'security.table.username\' | translate}}" name="username" class="form-control form-control-lg" type="text" ng-model="user.username" ng-readonly="mode !== \'add\'"> </div> <div ng-show="usernameError" class="form-control-feedback">{{usernameError}}</div> </div> <div class="form-group" ng-class="{\'has-danger\': passwordError}"> <div class="input-group"> <span class="input-group-addon" gdb-tooltip="{{\'security.password.placeholder\' | translate}}"><em class="icon-lock icon-2x text-muted"></em></span> <input id="wb-user-password" placeholder="{{passwordPlaceholder | translate}}" name="password" class="form-control form-control-lg" type="password" ng-model="user.password" ng-hide="user.external || hasExternalAuthUser()" ng-readonly="noPassword"> <span ng-show="user.external || hasExternalAuthUser()">{{\'security.auth.from.external.module\' | translate}}</span> </div> <div ng-show="passwordError" class="form-control-feedback">{{passwordError}}</div> </div> <div class="form-group" ng-class="{\'has-danger\': confirmPasswordError}" ng-hide="user.external || hasExternalAuthUser()"> <div class="input-group"> <span class="input-group-addon" gdb-tooltip="{{\'security.password.confirm\' | translate}}"><em class="icon-lock icon-2x text-muted"></em></span> <input id="wb-user-confirmpassword" placeholder="{{\'security.password.confirm\' | translate}}" name="password_confirm" class="form-control form-control-lg" type="password" ng-model="user.confirmpassword" ng-readonly="noPassword"> </div> <div ng-show="confirmPasswordError" class="form-control-feedback">{{confirmPasswordError}}</div> </div> <div> <label class="d-block"> <input type="checkbox" id="noPassword" ng-model="noPassword" ng-change="setNoPassword()"> <span ng-show="mode === \'add\'">{{\'security.dont.set.password\' | translate}} </span> <span ng-show="mode !== \'add\'">{{\'security.unset.password\' | translate}} </span> </label> </div> </div> </div> <div class="card sparql-editor-settings" id="user-settings"> <div class="card-block"> <h3>{{\'security.user.settings\' | translate}}</h3> <div id="sameas-on" class="mb-1"> <span class="sameas-label"> {{\'security.expand.sameAs.is\' | translate}} <span class="tag {{user.appSettings.DEFAULT_SAMEAS ? \'tag-primary\' : \'tag-default\'}}"> {{user.appSettings.DEFAULT_SAMEAS ? \'common.on.btn\' : \'common.off.btn\' | translate}} </span> </span> <span gdb-tooltip="{{shouldDisableSameAs() ? \'core.require.inferred\' : \'security.tooltip.click.me\' | translate}}" tooltip-placement="top" ng-click="user.appSettings.DEFAULT_SAMEAS = !user.appSettings.DEFAULT_SAMEAS" class="switch mr-0"> <input id="sameAsCheck" type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_SAMEAS" ng-disabled="shouldDisableSameAs()"/> <label for="sameas-on"></label> </span> {{\'security.default.editor.graph\' | translate}} </div> <div id="inference-on" class="mb-1"> <span class="inference-label"> {{\'security.inference.is\' | translate}} <span class="tag {{user.appSettings.DEFAULT_INFERENCE ? \'tag-primary\' : \'tag-default\'}}"> {{user.appSettings.DEFAULT_INFERENCE ? \'common.on.btn\' : \'common.off.btn\' | translate}} </span> </span> <span gdb-tooltip="{{\'security.tooltip.click.me\' | translate}}" tooltip-placement="top" ng-click="user.appSettings.DEFAULT_INFERENCE = !user.appSettings.DEFAULT_INFERENCE" class="switch mr-0"> <input type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_INFERENCE"/> <label for="inference-on"></label> </span> {{\'security.default.editor.graph\' | translate}} </div> <div id="schema-on" class="mb-1"> <span class="schema-label"> {{\'security.show.schema\' | translate}} <span class="tag {{user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA ? \'tag-primary\' : \'tag-default\'}}"> {{user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA ? \'common.on.btn\' : \'common.off.btn\' | translate}} </span> <span gdb-tooltip="{{\'security.tooltip.click.me\' | translate}}" tooltip-placement="top" ng-click="user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA = !user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA" class="switch mr-0"> <input type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA"/> <label for="schema-on"></label> </span> {{\'security.default.visual.graph\' | translate}} </span> </div> <label class="d-block"> <input type="checkbox" ng-model="user.appSettings.EXECUTE_COUNT" id="defaultCount" checked="appSettings.EXECUTE_COUNT"> {{\'security.count.total.results\' | translate}} </label> <label class="d-block"> <input type="checkbox" ng-model="user.appSettings.IGNORE_SHARED_QUERIES" id="ignore-shared" checked="appSettings.IGNORE_SHARED_QUERIES"> {{\'security.ignore.shared.queries\' | translate}} </label> <label class="d-block" ng-if="showCookiePolicyLink"> <button class="btn btn-secondary show-cookie-policy-btn" ng-click="showCookiePolicy($event)">{{\'cookie.cookie_policy_url_label\' | translate}}</button> </label> </div> </div> <div class="card" id="workbench-settings" ng-if="showWorkbenchSettings"> <div class="card-block"> <h3>{{\'security.workbench.settings.title\' | translate}} <em class="icon-info text-tertiary small" gdb-tooltip="{{\'security.workbench.settings.theme.tooltip\' | translate}}"></em></h3> <div> <div class="form-group"> <label class="col-lg-2">{{\'security.workbench.settings.theme.label\' | translate}}</label> <div class="btn-group theme-selector-dropdown" uib-dropdown> <button type="button" class="btn btn-sm btn-secondary dropdown-toggle theme-selector-dropdown-btn" uib-dropdown-toggle> {{selectedTheme.label}} </button> <ul class="dropdown-menu" role="menu"> <li ng-repeat="theme in themes"> <a ng-click="setTheme(theme)" class="dropdown-item">{{theme.label}}</a> </li> </ul> </div> </div> <div class="form-group"> <label class="col-lg-2">{{\'security.workbench.settings.theme.mode.label\' | translate}}</label> <div class="radio"> <label class="px-1"> <input type="radio" value="light" ng-model="workbenchSettings.mode" ng-change="setThemeMode()"/> {{\'security.workbench.settings.theme.mode.light\' | translate}} </label> <label class="px-1"> <input type="radio" value="dark" ng-model="workbenchSettings.mode" ng-change="setThemeMode()"/> {{\'security.workbench.settings.theme.mode.dark\' | translate}} </label> </div> </div> </div> </div> </div> </div> <div class="col-md-6 us-right-col" ng-hide="!isLocalAuthentication()"> <div class="card user-role" id="user-roles"> <div class="card-block"> <h3>{{\'security.user.role\' | translate}}</h3> <label class="mr-1" uib-popover-template="\'popover-content-user.html\'" popover-trigger="mouseenter" popover-placement="bottom"> <input type="radio" ng-model="userType" id="roleUser" value="user" ng-disabled="hasEditRestrictions()"> {{\'security.user.label\' | translate}} </label> <label class="mr-1" uib-popover-template="\'popover-content-repo-manager.html\'" popover-trigger="mouseenter" popover-placement="bottom"> <input type="radio" ng-model="userType" id="roleRepoAdmin" value="repoManager" ng-disabled="hasEditRestrictions()"> {{\'security.repo.manager.label\' | translate}} </label> <label uib-popover-template="\'popover-content-admin.html\'" popover-trigger="mouseenter" popover-placement="bottom"> <input type="radio" ng-model="userType" id="roleAdmin" value="admin" ng-disabled="hasEditRestrictions()"> {{\'security.admin.label\' | translate}} </label> </div> </div> <div class="card user-custom-roles" id="user-custom-roles"> <div class="card-block"> <h3>{{\'security.user.custom_role\' | translate}}</h3> <div class="input-group"> <tags-input name="customRoleTag" class="wb-tags-input" ng-model="customRoles" min-length="1" ng-disabled="!isUser() || mode === \'settings\'" use-strings="true" add-on-space="true" add-on-comma="true" add-on-paste="true" replace-spaces-with-dashes="false" paste-split-pattern="[\\s+]" on-tag-adding="isCustomRoleValid($tag)" on-tag-added="addCustomRole($tag)" ng-keydown="checkUserInput($event)" ng-cut="removeErrorOnCut()" placeholder="{{\'security.user.add.custom_role.msg\' | translate}}" custom-prefix-tags-input></tags-input> <div class="small" ng-hide="isRoleValid"> <small>{{\'security.user.role.too.short\' | translate}}</small> </div> <div class="small prefix-warning" ng-if="form.customRoleTag.$warning"> <small>{{\'acl_management.rulestable.custom_prefix_warning.text\' | translate}}</small> </div> </div> </div> </div> <div id="user-repos" class="card user-repositories"> <div class="card-block"> <h3>{{\'security.repo.rights\' | translate}}</h3> <div class="has-danger"> <p ng-show="repositoryCheckError" class="form-control-feedback"> {{\'security.user.rights\' | translate}} </p> </div> <div class="scrollable-table"> <table class="table table-hover table-sm table-fixed bordered-table" aria-describedby="User rights table"> <thead> <tr> <th id="repositoryIdColumn" class="repository-column auth-column">{{\'security.repository.title\' | translate}}</th> <th id="readRightsColumn" class="text-xs-center read-column auth-column"><span class="auth-column-label">{{\'security.label.read\' | translate}}</span><em class="icon-eye icon-lg" gdb-tooltip="{{\'security.tooltip.read\' | translate}}"></em></th> <th id="writeRightColumn" class="text-xs-center write-column auth-column"><span class="auth-column-label">{{\'security.label.write\' | translate}}</span><em class="icon-edit icon-lg" gdb-tooltip="{{\'security.tooltip.write\' | translate}}"></em></th> <th id="graphql" class="text-xs-center auth-column graphql-column"><span class="auth-column-label">{{\'security.label.graphql\' | translate}}</span></th> </tr> <tr> <th>{{\'security.any.data.repo\' | translate}} <em class="icon-info text-tertiary" gdb-tooltip="{{\'security.data.repos\' | translate}}"></em> </th> <th class="text-xs-center"> <span ng-click="setGrantedAuthorities()"> <input class="read" type="checkbox" ng-model="grantedAuthorities.READ_REPO[\'*\']" ng-checked="hasReadPermission(\'*\')" ng-disabled="readCheckDisabled(\'*\')"> </span> </th> <th class="text-xs-center write-any"> <span ng-click="setGrantedAuthorities()"> <input class="write" type="checkbox" ng-model="grantedAuthorities.WRITE_REPO[\'*\']" ng-checked="hasWritePermission(\'*\')" ng-disabled="writeCheckDisabled(\'*\')"> </span> </th> <th class="text-xs-center"> <span ng-click="setGrantedAuthorities()"> <input class="graphql" type="checkbox" ng-model="grantedAuthorities.GRAPHQL[\'*\']" ng-checked="hasGraphqlPermission(\'*\')" ng-disabled="graphqlCheckDisabled(\'*\')"> </span> </th> </tr> </thead> <tbody> <div> <tr ng-repeat="repository in getReadableRepositories() | orderBy: [\'location\', \'id\']"> <td class="repository-name">{{repository.id}}<small><em ng-if="(hasGraphqlPermission(repository) || hasGraphqlPermission(\'*\')) && (hasReadPermission(repository) || hasReadPermission(\'*\') || hasWritePermission(repository) || hasWritePermission(\'*\'))" class="fa-kit fa-gdb-graphql graphql-icon text-info" gdb-tooltip="{{\'security.tooltip.graphql\' | translate}}"></em> · {{repository.location ? repository.location : \'repo.local\' | translate}}</small></td> <td class="text-xs-center read-rights"> <span ng-click="setGrantedAuthorities()"> <input class="read" type="checkbox" ng-model="grantedAuthorities.READ_REPO[createUniqueKey(repository)]" ng-checked="hasReadPermission(repository)" ng-disabled="readCheckDisabled(repository)"> </span> </td> <td class="text-xs-center write-rights"> <span ng-click="setGrantedAuthorities()"> <input class="write" type="checkbox" ng-model="grantedAuthorities.WRITE_REPO[createUniqueKey(repository)]" ng-checked="hasWritePermission(repository)" ng-disabled="writeCheckDisabled(repository)"> </span> </td> <td class="text-xs-center graphql-rights"> <span ng-click="setGrantedAuthorities()"> <input class="graphql" type="checkbox" ng-model="grantedAuthorities.GRAPHQL[createUniqueKey(repository)]" ng-checked="hasGraphqlPermission(repository)" ng-disabled="graphqlCheckDisabled(repository)"> </span> </td> </tr> </div> </tbody> </table> </div> </div> </div> </div> </div> <div class="text-right"> <button id="wb-user-goBack" class="btn btn-secondary" type="button" ng-click="goBack()">{{\'common.cancel.btn\' | translate}}</button> <button id="wb-user-submit" class="btn btn-primary" type="submit" ng-disabled="!isRoleValid">{{saveButtonText}}</button> </div> </form> </div> <div class="ot-loader ot-main-loader" onto-loader size="50" ng-show="loader"></div> '}};
|
|
2
|
-
//# sourceMappingURL=15535.be611e4b93264c1d24e8.bundle.js.map
|