graphdb-workbench 3.3.2-TR1 → 3.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/13231.d7107e7549453805e13a.bundle.js +2 -0
- package/dist/13231.d7107e7549453805e13a.bundle.js.map +1 -0
- package/dist/{20694.a738f5634ec09369dc85.bundle.js → 20694.4becb7771236462dcc5a.bundle.js} +2 -2
- package/dist/20694.4becb7771236462dcc5a.bundle.js.map +1 -0
- package/dist/21015.ea34b563b4149ad0975e.bundle.js +2 -0
- package/dist/21015.ea34b563b4149ad0975e.bundle.js.map +1 -0
- package/dist/38644.0e8652c647a0f341abd7.bundle.js +2 -0
- package/dist/38644.0e8652c647a0f341abd7.bundle.js.map +1 -0
- package/dist/39518.4d72b74fffba395c6b2a.bundle.js +2 -0
- package/dist/{39518.2871b32c37b20075dba3.bundle.js.map → 39518.4d72b74fffba395c6b2a.bundle.js.map} +1 -1
- package/dist/39874.710e94f211579215f997.bundle.js +2 -0
- package/dist/39874.710e94f211579215f997.bundle.js.map +1 -0
- package/dist/60560.6ba1b091a34af6c00770.bundle.js +2 -0
- package/dist/60560.6ba1b091a34af6c00770.bundle.js.map +1 -0
- package/dist/67888.41803878170b6c7a5ca5.bundle.js +2 -0
- package/dist/67888.41803878170b6c7a5ca5.bundle.js.map +1 -0
- package/dist/7815.2aec5ebbcd434f5582ff.bundle.js +2 -0
- package/dist/7815.2aec5ebbcd434f5582ff.bundle.js.map +1 -0
- package/dist/78681.9e1d4e064e9e1fb5fb21.bundle.js +2 -0
- package/dist/78681.9e1d4e064e9e1fb5fb21.bundle.js.map +1 -0
- package/dist/{82926.99231caacc379c66487a.bundle.js → 82926.ce1d6bf65b09288a2b10.bundle.js} +2 -2
- package/dist/{82926.99231caacc379c66487a.bundle.js.map → 82926.ce1d6bf65b09288a2b10.bundle.js.map} +1 -1
- package/dist/94229.47dbdba202106c61dff1.bundle.js.map +1 -1
- package/dist/99448.2a87f387a8062617d893.bundle.js +2 -0
- package/dist/99448.2a87f387a8062617d893.bundle.js.map +1 -0
- package/dist/api/models/cookie/cookie-options.d.ts +17 -0
- package/dist/api/models/cookie/index.d.ts +1 -1
- package/dist/api/models/security/authenticated-user.d.ts +2 -0
- package/dist/api/models/tracking/cookie-consent.d.ts +39 -0
- package/dist/api/models/tracking/index.d.ts +1 -0
- package/dist/api/models/users/app-settings.d.ts +2 -2
- package/dist/api/ontotext-workbench-api.d.ts +3 -1
- package/dist/api/ontotext-workbench-api.js +1 -1
- package/dist/api/ontotext-workbench-api.js.map +1 -1
- package/dist/api/services/cookie/browser-cookie-store.d.ts +19 -0
- package/dist/api/services/cookie/cookie-builder.d.ts +77 -0
- package/dist/api/services/cookie/cookie-store.d.ts +16 -0
- package/dist/api/services/cookie/cookie.service.d.ts +34 -7
- package/dist/api/services/cookie/error/invalid-cookie-expiration.d.ts +8 -0
- package/dist/api/services/cookie/index.d.ts +3 -0
- package/dist/api/services/cookie/test/cookie-builder.spec.d.ts +1 -0
- package/dist/api/services/cookie/test/in-memory-cookie-store.d.ts +11 -0
- package/dist/api/services/security/auth-strategies/tests/provider-response-mocks.d.ts +2 -2
- package/dist/api/services/security/security-context.service.d.ts +6 -0
- package/dist/api/services/tracking/google-analytics-cookie.service.d.ts +50 -0
- package/dist/api/services/tracking/index.d.ts +4 -0
- package/dist/api/services/tracking/installation-cookie.service.d.ts +37 -0
- package/dist/api/services/tracking/test/tracking-storage.service.spec.d.ts +1 -0
- package/dist/api/services/tracking/test/tracking.service.spec.d.ts +1 -0
- package/dist/api/services/tracking/tracking-storage.service.d.ts +27 -0
- package/dist/api/services/tracking/tracking.service.d.ts +56 -0
- package/dist/api/services/users/response/user-response.d.ts +1 -1
- package/dist/api/services/utils/date-util.d.ts +11 -0
- package/dist/api/services/utils/index.d.ts +1 -0
- package/dist/api/services/window/window.service.d.ts +6 -0
- package/dist/assets/i18n/fr.json +1 -1
- package/dist/index.html +9 -9
- 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 +2 -2
- 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 +2 -2
- 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 +5 -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 +3 -3
- package/dist/js/angular/ttyg/templates/modal/external-integration-configuration-modal.html +1 -1
- package/dist/js/angular/ttyg/templates/no-agents-view.html +1 -1
- package/dist/js/angular/ttyg/templates/ttyg.html +1 -1
- package/dist/legacyWorkbench.40eba9e09196e1483221.js +3 -0
- package/dist/{legacyWorkbench.88e1d4d209e51c6f9b65.js.map → legacyWorkbench.40eba9e09196e1483221.js.map} +1 -1
- package/dist/license-checker-static.json +0 -7
- package/dist/{main.1be0fc11ab24b99f8800.js → main.14f083264cd64618d96a.js} +3 -3
- package/dist/main.14f083264cd64618d96a.js.map +1 -0
- package/dist/pages/aclmanagement.html +1 -1
- 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/home.html +1 -1
- package/dist/pages/import.html +2 -2
- package/dist/pages/jdbc-create.html +1 -1
- package/dist/pages/jdbc.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/sparql-templates.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/function-utils-WB47AWpR.js +1 -0
- package/dist/shared-components/cjs/loader.cjs.js +1 -1
- package/dist/shared-components/cjs/onto-cookie-consent_2.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-dialog_2.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-footer_5.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-layout.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-test-context.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/shared-components.cjs.js +1 -1
- package/dist/shared-components/collection/components/dialogs/onto-cookie-policy-dialog/onto-cookie-policy-dialog.js +1 -1
- package/dist/shared-components/collection/components/dialogs/onto-dialog.js +1 -1
- package/dist/shared-components/collection/components/onto-cookie-consent/onto-cookie-consent.css +1 -1
- package/dist/shared-components/collection/components/onto-cookie-consent/onto-cookie-consent.js +1 -1
- package/dist/shared-components/collection/components/onto-footer/onto-footer.js +1 -1
- package/dist/shared-components/esm/function-utils-D1ZpXQQS.js +1 -0
- package/dist/shared-components/esm/loader.js +1 -1
- package/dist/shared-components/esm/onto-cookie-consent_2.entry.js +1 -1
- package/dist/shared-components/esm/onto-dialog_2.entry.js +1 -1
- package/dist/shared-components/esm/onto-footer_5.entry.js +1 -1
- package/dist/shared-components/esm/onto-layout.entry.js +1 -1
- package/dist/shared-components/esm/onto-test-context.entry.js +1 -1
- package/dist/shared-components/esm/shared-components.js +1 -1
- package/dist/shared-components/shared-components/{p-279a026b.entry.js → p-5886e663.entry.js} +1 -1
- package/dist/shared-components/shared-components/p-598d33d7.entry.js +1 -0
- package/dist/shared-components/shared-components/p-6d34b2cb.entry.js +1 -0
- package/dist/shared-components/shared-components/p-74888633.entry.js +1 -0
- package/dist/shared-components/shared-components/p-D1ZpXQQS.js +1 -0
- package/dist/shared-components/shared-components/p-b5d4081d.entry.js +1 -0
- package/dist/shared-components/shared-components/shared-components.esm.js +1 -1
- package/dist/shared-components/types/components/dialogs/onto-cookie-policy-dialog/onto-cookie-policy-dialog.d.ts +31 -7
- package/dist/shared-components/types/components/onto-cookie-consent/onto-cookie-consent.d.ts +2 -2
- package/dist/shared-components/types/components/onto-footer/onto-footer.d.ts +9 -2
- package/dist/shared-components/types/components.d.ts +17 -8
- package/dist/shared-components/types/models/dialog/dialog-handler.d.ts +4 -0
- package/package.json +1 -1
- package/dist/13231.9b625e487e6385faa36f.bundle.js +0 -2
- package/dist/13231.9b625e487e6385faa36f.bundle.js.map +0 -1
- package/dist/20694.a738f5634ec09369dc85.bundle.js.map +0 -1
- package/dist/21015.68c7c667ef64ad8e8e0d.bundle.js +0 -2
- package/dist/21015.68c7c667ef64ad8e8e0d.bundle.js.map +0 -1
- package/dist/38644.37a8cd71112da94401d9.bundle.js +0 -2
- package/dist/38644.37a8cd71112da94401d9.bundle.js.map +0 -1
- package/dist/39518.2871b32c37b20075dba3.bundle.js +0 -2
- package/dist/39874.47a6948df3520a7bf37a.bundle.js +0 -2
- package/dist/39874.47a6948df3520a7bf37a.bundle.js.map +0 -1
- package/dist/60560.275a89ab1375e91de0aa.bundle.js +0 -2
- package/dist/60560.275a89ab1375e91de0aa.bundle.js.map +0 -1
- package/dist/67888.b75d9678cf65cd82f065.bundle.js +0 -2
- package/dist/67888.b75d9678cf65cd82f065.bundle.js.map +0 -1
- package/dist/7815.f09f8d6953d2c964e04d.bundle.js +0 -2
- package/dist/7815.f09f8d6953d2c964e04d.bundle.js.map +0 -1
- package/dist/78681.0cfa1e86d4dac1b7e7e8.bundle.js +0 -2
- package/dist/78681.0cfa1e86d4dac1b7e7e8.bundle.js.map +0 -1
- package/dist/99448.272a4ba1ce8032167bea.bundle.js +0 -2
- package/dist/99448.272a4ba1ce8032167bea.bundle.js.map +0 -1
- package/dist/api/models/cookie/cookie-consent.d.ts +0 -14
- package/dist/legacyWorkbench.88e1d4d209e51c6f9b65.js +0 -3
- package/dist/main.1be0fc11ab24b99f8800.js.map +0 -1
- package/dist/shared-components/collection/models/dialog/onto-dialog.js +0 -1
- package/dist/shared-components/shared-components/p-2075209c.entry.js +0 -1
- package/dist/shared-components/shared-components/p-30e4880f.entry.js +0 -1
- package/dist/shared-components/shared-components/p-413b3789.entry.js +0 -1
- package/dist/shared-components/shared-components/p-67199a46.entry.js +0 -1
- package/dist/shared-components/types/models/dialog/onto-dialog.d.ts +0 -4
- /package/dist/{legacyWorkbench.88e1d4d209e51c6f9b65.js.LICENSE.txt → legacyWorkbench.40eba9e09196e1483221.js.LICENSE.txt} +0 -0
- /package/dist/{main.1be0fc11ab24b99f8800.js.LICENSE.txt → main.14f083264cd64618d96a.js.LICENSE.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"94229.47dbdba202106c61dff1.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/security/services/constants.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/security/directives/custom-prefix-tags-input.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/security/controllers.js"],"sourcesContent":["export const SYSTEM_REPO = 'SYSTEM';\nexport const READ_REPO = 'READ_REPO';\nexport const READ_REPO_PREFIX = 'READ_REPO_';\nexport const WRITE_REPO = 'WRITE_REPO';\nexport const GRAPHQL = 'GRAPHQL';\nexport const WRITE_REPO_PREFIX = 'WRITE_REPO_';\nexport const GRAPHQL_PREFIX = 'GRAPHQL_';\nexport const GRAPHQL_SUFFIX = 'GRAPHQL';\nexport const SUFFIX_DELIMITER = ':';\nexport const GRAPHQL_SUFFIX_WITH_DELIMITER = SUFFIX_DELIMITER + GRAPHQL_SUFFIX;\nexport const CUSTOM_PREFIX = 'CUSTOM_'\n","angular\n .module('graphdb.framework.security.directives', [])\n .directive('customPrefixTagsInput', customPrefixTagsInputDirective);\n\n/**\n * @ngdoc directive\n * @name customPrefixTagsInput\n * @module app\n * @restrict A\n * @description\n * The `customPrefixTagsInput` directive is used to check 'tags-input' for roles containing 'CUSTOM_' or '!CUSTOM_' prefix.\n *\n * If the value starts with either of these prefixes, a warning property will be set in ngModel.\n *\n * @usage\n * <tags-input custom-prefix-tags-input>{{yourModel.role}}</tags-input>\n *\n * @return {Object} Directive definition object with restrict and link properties.\n */\nfunction customPrefixTagsInputDirective() {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n const customPrefix = \"CUSTOM_\";\n const negatedCustomPrefix = \"!CUSTOM_\";\n const subscriptions = [];\n\n function hasCustomOrNegatedPrefix(tag) {\n return tag.startsWith(customPrefix) || tag.startsWith(negatedCustomPrefix);\n }\n\n // Check if the element is tags-input and has ngModel associated with it\n const isNgTagsInput = element[0].nodeName.toLowerCase() === 'tags-input';\n\n if (isNgTagsInput && attrs.ngModel) {\n const ngModelCtrl = element.controller('ngModel');\n\n if (isNgTagsInput) {\n ngModelCtrl.$parsers.push(function (viewValue) {\n if (Array.isArray(viewValue)) {\n ngModelCtrl.$warning = viewValue.some((tag) => hasCustomOrNegatedPrefix(tag));\n }\n return viewValue;\n });\n\n subscriptions.push(scope.$watch(attrs.ngModel, function (newVal) {\n if (Array.isArray(newVal)) {\n ngModelCtrl.$warning = newVal.some((tag) => hasCustomOrNegatedPrefix(tag));\n }\n }, true));\n }\n }\n\n const unsubscribeListeners = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n subscriptions.push(scope.$on('$destroy', unsubscribeListeners));\n }\n };\n}\n","import 'angular/core/services';\nimport 'angular/core/services/jwt-auth.service';\nimport 'angular/core/services/security.service';\nimport {UserRole, UserType} from 'angular/utils/user-utils';\nimport 'angular/security/directives/custom-prefix-tags-input.directive';\nimport {GRAPHQL, GRAPHQL_PREFIX, READ_REPO, READ_REPO_PREFIX, SYSTEM_REPO, WRITE_REPO, WRITE_REPO_PREFIX} from './services/constants';\nimport {\n AppSettings,\n AuthorityList,\n AuthorizationService,\n SecurityContextService,\n AuthenticationService,\n mapAuthSettingsResponseToModel,\n mapGrantedAuthoritiesResponseToModel,\n OntoToastrService,\n RepositoryService,\n SecurityService as SecurityServiceAPI,\n service,\n User,\n UsersService,\n} from '@ontotext/workbench-api';\n\nconst modules = [\n 'ngCookies',\n 'ui.bootstrap',\n 'graphdb.framework.core.services.jwtauth',\n 'graphdb.framework.core.services.security-service',\n 'toastr',\n 'ngTagsInput',\n];\n\nconst securityModule = angular.module('graphdb.framework.security.controllers', modules);\n\nsecurityModule.controller('UsersCtrl', ['$scope', '$uibModal', 'toastr', '$window', '$jwtAuth', '$timeout', 'ModalService', 'SecurityService', '$translate',\n function($scope, $uibModal, toastr, $window, $jwtAuth, $timeout, ModalService, SecurityService, $translate) {\n const authorizationService = service(AuthorizationService);\n const authenticationService = service(AuthenticationService);\n const securityServiceAPI = service(SecurityServiceAPI);\n const toastrService = service(OntoToastrService);\n const usersService = service(UsersService);\n const repositoryService = service(RepositoryService);\n\n // UI view-model\n $scope.usersData = [];\n\n $scope.loader = true;\n $scope.securityEnabled = function() {\n return authenticationService.isSecurityEnabled();\n };\n $scope.hasExternalAuth = function() {\n return $jwtAuth.hasExternalAuth();\n };\n $scope.getAuthImplementation = function() {\n return $jwtAuth.getAuthImplementation();\n };\n $scope.freeAccessEnabled = function() {\n return authorizationService.hasFreeAccess();\n };\n $scope.getUsers = () => {\n return usersService.getUsers()\n .then(function(data) {\n $scope.usersData = data.map((user) => ({\n username: user.username,\n dateCreated: user.dateCreated,\n userType: user.getUserType(),\n userTypeDescription: user.getUserTypeDescription(),\n repositories: user.authorities.getRepositoriesPermissions(),\n customRoles: user.authorities.getCustomRoles(),\n }));\n $scope.loader = false;\n }).catch(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('common.error'));\n $scope.loader = false;\n });\n };\n $scope.getUsers();\n\n $scope.$on('repositoryIsSet', function() {\n $scope.getUsers();\n });\n\n $scope.toggleSecurity = function() {\n const isSecurityEnabled = authenticationService.isSecurityEnabled();\n $jwtAuth.toggleSecurity(!isSecurityEnabled)\n .then(() => {\n // reload UI\n // TODO: Not sure if we really need to reload the page here. The UI state is updated just fine. But maybe the reload is needed for something else?\n // Remove and fix this when migrated\n $window.location.reload();\n });\n };\n\n const setFreeAccess = function(enabled, authSettings) {\n return securityServiceAPI.setFreeAccess(enabled, authSettings);\n };\n\n /**\n * @param {boolean|undefined} updateFreeAccess - Whether to enable or disable free access. If undefined, the\n * free access has not been set yet.\n */\n $scope.toggleFreeAccess = function(updateFreeAccess) {\n if (!authorizationService.hasFreeAccess() || (authorizationService.hasFreeAccess() && updateFreeAccess)) {\n // enable and configure or only configure\n securityServiceAPI.getFreeAccess()\n .then((freeAccessAuthSettings) => {\n const authorities = mapGrantedAuthoritiesResponseToModel(freeAccessAuthSettings.authorities).getItems();\n const appSettings = freeAccessAuthSettings.appSettings ?? {\n 'DEFAULT_SAMEAS': true,\n 'DEFAULT_INFERENCE': true,\n 'EXECUTE_COUNT': true,\n 'IGNORE_SHARED_QUERIES': false,\n 'DEFAULT_VIS_GRAPH_SCHEMA': true,\n };\n return configureFreeAccess(appSettings, authorities, updateFreeAccess);\n })\n .then((updatedFreeAccessAuthSettings) => setFreeAccess(updateFreeAccess || !$jwtAuth.isFreeAccessEnabled(), updatedFreeAccessAuthSettings))\n .then(() => {\n const translateKey = updateFreeAccess ? 'jwt.auth.free.access.updated.msg' : 'jwt.auth.free.access.status';\n toastrService.success($translate.instant(translateKey, {status: $translate.instant('enabled.status')}));\n })\n .catch((err) => {\n if (err === 'cancel') {\n // Check if modal was dismissed by user\n return;\n }\n toastrService.error(err.data ?? err, $translate.instant('common.error'));\n });\n } else {\n // disable\n setFreeAccess(!authorizationService.hasFreeAccess())\n .then(() => {\n toastrService.success($translate.instant('jwt.auth.free.access.status', {status: ($translate.instant('disabled.status'))}));\n })\n .catch((err) => {\n toastrService.error(err.data, $translate.instant('common.error'));\n });\n }\n };\n\n const configureFreeAccess = (appSettings, authorities, updateFreeAccess) => {\n const modalInstance = $uibModal.open({\n templateUrl: 'js/angular/security/templates/modal/default-authorities.html',\n controller: 'DefaultAuthoritiesCtrl',\n resolve: {\n data: function() {\n return {\n // converts the array rights to hash ones. why, oh, why do we have both formats?\n defaultAuthorities: function() {\n const defaultAuthorities = {\n [READ_REPO]: {},\n [WRITE_REPO]: {},\n [GRAPHQL]: {},\n };\n // We might have old (no longer existing) repositories so we have to check that\n const repoIds = _.mapKeys($scope.getRepositories(), function(r) {\n return repositoryService.getLocationSpecificId(r);\n });\n _.each(authorities, function(a) {\n // indexOf works in IE 11, startsWith doesn't\n if (a.indexOf(WRITE_REPO_PREFIX) === 0) {\n if (repoIds.hasOwnProperty(a.substr(11))) {\n defaultAuthorities[WRITE_REPO][a.substr(11)] = true;\n }\n } else if (a.indexOf(READ_REPO_PREFIX) === 0) {\n if (repoIds.hasOwnProperty(a.substr(10))) {\n defaultAuthorities[READ_REPO][a.substr(10)] = true;\n }\n } else if (a.indexOf(GRAPHQL_PREFIX) === 0) {\n if (repoIds.hasOwnProperty(a.substr(8))) {\n defaultAuthorities[GRAPHQL][a.substr(8)] = true;\n }\n }\n });\n return defaultAuthorities;\n },\n appSettings: appSettings,\n };\n },\n },\n });\n return modalInstance.result.then(function(data) {\n authorities = data.authorities;\n appSettings = data.appSettings;\n return mapAuthSettingsResponseToModel({\n enabled: updateFreeAccess || !authorizationService.hasFreeAccess(),\n appSettings,\n authorities,\n });\n });\n };\n\n $scope.editFreeAccess = function() {\n $scope.toggleFreeAccess(true);\n };\n\n $scope.removeUser = function(username) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm.delete'),\n message: $translate.instant('security.confirm.delete.user', {name: username}),\n warning: true,\n }).result.then(function() {\n $scope.loader = true;\n usersService.deleteUser(username)\n .then(() => $scope.getUsers())\n .catch((data) => {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('common.error'));\n $scope.loader = false;\n });\n });\n };\n\n // Should be able to send the original username to $routeParams\n $scope.encodeURIComponent = function(name) {\n return encodeURIComponent(name);\n };\n }]);\n\nsecurityModule.controller('DefaultAuthoritiesCtrl', ['$scope', '$http', '$uibModalInstance', 'data', '$rootScope',\n function($scope, $http, $uibModalInstance, data, $rootScope) {\n const repositoryService = service(RepositoryService);\n\n $scope.grantedAuthorities = data.defaultAuthorities();\n $scope.appSettings = data.appSettings;\n\n $scope.hasActiveLocation = function() {\n // Hack to get this from root scope to avoid cyclic dependency\n return !_.isEmpty($rootScope.globalLocation);\n };\n\n $scope.getRepositories = function() {\n // Hack to get this from root scope to avoid cyclic dependency\n return $rootScope.globalRepositories;\n };\n\n $scope.ok = function() {\n const auth = [];\n $scope.repositoryCheckError = true;\n for (const index in $scope.grantedAuthorities.WRITE_REPO) {\n if ($scope.grantedAuthorities.WRITE_REPO[index]) {\n auth.push(WRITE_REPO_PREFIX + index);\n auth.push(READ_REPO_PREFIX + index);\n $scope.repositoryCheckError = false;\n }\n }\n for (const index in $scope.grantedAuthorities.READ_REPO) {\n if ($scope.grantedAuthorities.READ_REPO[index] && auth.indexOf(READ_REPO_PREFIX + index) === -1) {\n auth.push(READ_REPO_PREFIX + index);\n $scope.repositoryCheckError = false;\n }\n }\n for (const index in $scope.grantedAuthorities.GRAPHQL) {\n if ($scope.grantedAuthorities.GRAPHQL[index] && auth.indexOf(GRAPHQL_PREFIX + index) === -1) {\n auth.push(GRAPHQL_PREFIX + index);\n }\n }\n if (!$scope.repositoryCheckError) {\n $uibModalInstance.close({authorities: auth, appSettings: $scope.appSettings});\n }\n };\n\n $scope.cancel = function() {\n $uibModalInstance.dismiss('cancel');\n };\n\n $scope.createUniqueKey = function(repository) {\n return repositoryService.getLocationSpecificId(repository);\n };\n }]);\n\nsecurityModule.controller('CommonUserCtrl', ['$rootScope', '$scope', '$http', 'toastr', '$window', '$timeout', '$location', '$jwtAuth', '$translate', 'passwordPlaceholder',\n function($rootScope, $scope, $http, toastr, $window, $timeout, $location, $jwtAuth, $translate, passwordPlaceholder) {\n const authorizationService = service(AuthorizationService);\n const repositoryService = service(RepositoryService);\n\n $rootScope.$on('$translateChangeSuccess', function() {\n $scope.passwordPlaceholder = $translate.instant(passwordPlaceholder);\n });\n $scope.isAdmin = function() {\n return authorizationService.hasRole(UserRole.ROLE_ADMIN);\n };\n $scope.hasExternalAuth = function() {\n return $jwtAuth.hasExternalAuth();\n };\n\n $scope.hasEditRestrictions = function() {\n return $scope.user && $scope.user.username === UserType.ADMIN;\n };\n\n $scope.isOverrideAuth = function() {\n return $jwtAuth.isDefaultAuthEnabled();\n };\n\n $scope.setGrantedAuthorities = function() {\n function pushAuthority(...authorities) {\n for (let i = 0; i < authorities.length; i++) {\n const authority = authorities[i];\n if (_.indexOf($scope.user.grantedAuthorities, authority) < 0) {\n $scope.user.grantedAuthorities.push(authority);\n }\n }\n }\n\n $scope.user.grantedAuthorities = [];\n\n $scope.repositoryCheckError = true;\n if ($scope.userType === UserType.ADMIN) {\n $scope.repositoryCheckError = false;\n pushAuthority(UserRole.ROLE_ADMIN);\n } else if ($scope.userType === UserType.REPO_MANAGER) {\n $scope.repositoryCheckError = false;\n pushAuthority(UserRole.ROLE_REPO_MANAGER);\n } else {\n pushAuthority(UserRole.ROLE_USER);\n for (const index in $scope.grantedAuthorities.WRITE_REPO) {\n if ($scope.grantedAuthorities.WRITE_REPO[index]) {\n $scope.repositoryCheckError = false;\n pushAuthority(WRITE_REPO_PREFIX + index, READ_REPO_PREFIX + index);\n }\n }\n for (const index in $scope.grantedAuthorities.READ_REPO) {\n if ($scope.grantedAuthorities.READ_REPO[index]) {\n $scope.repositoryCheckError = false;\n pushAuthority(READ_REPO_PREFIX + index);\n }\n }\n for (const index in $scope.grantedAuthorities.GRAPHQL) {\n if ($scope.grantedAuthorities.GRAPHQL[index]) {\n pushAuthority(GRAPHQL_PREFIX + index);\n }\n }\n }\n if ($scope.customRoles) {\n $scope.customRoles.forEach((role) => pushAuthority('CUSTOM_' + role));\n }\n };\n\n $scope.$watch('userType', function() {\n if (!$scope.isUser()) {\n $scope.customRoles = '';\n }\n });\n\n $scope.isUser = function() {\n return $scope.userType === UserType.USER;\n };\n\n $scope.hasReadPermission = function(repository) {\n const uniqueKey = repositoryService.getLocationSpecificId(repository);\n return $scope.userType === UserType.ADMIN\n || $scope.userType === UserType.REPO_MANAGER\n || repository.id !== SYSTEM_REPO && ($scope.grantedAuthorities.READ_REPO['*']\n || $scope.grantedAuthorities.WRITE_REPO['*'])\n || $scope.grantedAuthorities.READ_REPO[uniqueKey]\n || $scope.grantedAuthorities.WRITE_REPO[uniqueKey];\n };\n\n $scope.hasWritePermission = function(repoOrWildCard) {\n const uniqueKey = repositoryService.getLocationSpecificId(repoOrWildCard);\n return $scope.userType === UserType.ADMIN\n || $scope.userType === UserType.REPO_MANAGER\n || repoOrWildCard.id !== SYSTEM_REPO && $scope.grantedAuthorities.WRITE_REPO['*']\n || $scope.grantedAuthorities.WRITE_REPO[uniqueKey];\n };\n\n $scope.hasGraphqlPermission = function(repository) {\n const uniqueKey = repositoryService.getLocationSpecificId(repository);\n return repository.id !== SYSTEM_REPO && $scope.grantedAuthorities.GRAPHQL['*']\n || $scope.grantedAuthorities.GRAPHQL[uniqueKey];\n };\n\n $scope.readCheckDisabled = function(repoOrWildCard) {\n return $scope.hasWritePermission(repoOrWildCard)\n || repoOrWildCard.id !== SYSTEM_REPO && repoOrWildCard !== '*' && $scope.grantedAuthorities.READ_REPO['*']\n || $scope.hasEditRestrictions();\n };\n\n $scope.writeCheckDisabled = function(repoOrWildCard) {\n return $scope.userType === UserType.ADMIN\n || $scope.userType === UserType.REPO_MANAGER\n || repoOrWildCard.id !== SYSTEM_REPO && repoOrWildCard !== '*' && $scope.grantedAuthorities.WRITE_REPO['*']\n || $scope.hasEditRestrictions();\n };\n\n /**\n * Determines whether the GraphQL checkbox for a given repository or wildcard\n * should be disabled.\n *\n * @param {Object|string} repoOrWildCard - A repo object or the string wildcard '*'\n * @returns {boolean} true if disabled, false if enabled\n */\n $scope.graphqlCheckDisabled = function(repoOrWildCard) {\n if ($scope.userType === UserType.ADMIN || $scope.userType === UserType.REPO_MANAGER) {\n return true;\n }\n\n if ($scope.hasEditRestrictions()) {\n return true;\n }\n\n if (repoOrWildCard !== '*' && $scope.grantedAuthorities.GRAPHQL['*']) {\n return true;\n }\n\n if (repoOrWildCard === '*' && $scope.grantedAuthorities.GRAPHQL['*']) {\n return false;\n }\n\n let uniqueKey;\n if (repoOrWildCard !== null && typeof repoOrWildCard === 'object') {\n uniqueKey = repositoryService.getLocationSpecificId(repoOrWildCard);\n } else {\n uniqueKey = repoOrWildCard;\n }\n\n const hasReadWildcard = $scope.grantedAuthorities.READ_REPO['*'];\n const hasWriteWildcard = $scope.grantedAuthorities.WRITE_REPO['*'];\n const hasReadForRepo = $scope.grantedAuthorities.READ_REPO[uniqueKey];\n const hasWriteForRepo = $scope.grantedAuthorities.WRITE_REPO[uniqueKey];\n\n return !(hasReadWildcard || hasWriteWildcard || hasReadForRepo || hasWriteForRepo);\n };\n\n $scope.createUniqueKey = function(repository) {\n return repositoryService.getLocationSpecificId(repository);\n };\n\n $scope.userType = UserType.USER;\n $scope.grantedAuthorities = {\n [READ_REPO]: {},\n [WRITE_REPO]: {},\n [GRAPHQL]: {},\n };\n\n $scope.validatePassword = function() {\n if ($scope.noPassword) {\n $scope.passwordError = '';\n $scope.confirmPasswordError = '';\n return true;\n }\n if ($scope.user.password !== $scope.user.confirmpassword) {\n if (!$scope.user.password) {\n $scope.passwordError = $translate.instant('security.enter.password');\n $scope.confirmPasswordError = '';\n } else {\n $scope.passwordError = '';\n $scope.confirmPasswordError = $translate.instant('security.confirm.password');\n }\n return false;\n } else {\n $scope.passwordError = '';\n $scope.confirmPasswordError = '';\n }\n return true;\n };\n\n $scope.isLocalAuthentication = function() {\n return $jwtAuth.getAuthImplementation() === 'Local';\n };\n\n $scope.updateUser = function() {\n if (!$scope.validateForm()) {\n return false;\n }\n\n if ($scope.isLocalAuthentication()) {\n $scope.setGrantedAuthorities();\n }\n\n if (!$scope.repositoryCheckError) {\n $scope.updateUserHttp();\n }\n };\n\n $scope.setNoPassword = function() {\n if ($scope.noPassword) {\n $scope.user.password = '';\n $scope.user.confirmpassword = '';\n $scope.passwordError = '';\n $scope.confirmPasswordError = '';\n }\n };\n\n $scope.shouldDisableSameAs = function() {\n const sameAsCheckbox = $('#sameAsCheck');\n if ($scope.user && !$scope.user.appSettings.DEFAULT_INFERENCE && sameAsCheckbox.prop('checked')) {\n sameAsCheckbox.prop('checked', false);\n $scope.user.appSettings.DEFAULT_SAMEAS = false;\n }\n\n return $scope.user && !$scope.user.appSettings.DEFAULT_INFERENCE;\n };\n\n /**\n * The validity of the last user typed custom role.\n * @type {boolean}\n */\n $scope.isRoleValid = true;\n const minTagLength = 2;\n\n /**\n * Adds the user typed custom role and sets role validity flag to true.\n *\n * @param {{text: string}} role the user input\n * @return {{text: string}} the user input in uppercase\n */\n $scope.addCustomRole = function(role) {\n $scope.isRoleValid = true;\n role.text = role.text.toUpperCase();\n return role;\n };\n\n /**\n * Checks if the input text is valid or not.\n *\n * @param {{text: string}} fieldValue the user input\n * @return {boolean} true if valid, otherwise false\n */\n $scope.isCustomRoleValid = function(fieldValue) {\n $scope.isRoleValid = fieldValue.text.length >= minTagLength;\n return $scope.isRoleValid;\n };\n\n /**\n * Checks if the user pressed the 'Backspace' or 'Delete' key and sets the role validity flag accordingly.\n *\n * @param {Object} event\n */\n $scope.checkUserInput = function(event) {\n // If the key pressed is the backspace or delete key, the tag error message will be hidden\n if (event.keyCode === 8 || event.keyCode === 46) {\n $scope.isRoleValid = true;\n }\n };\n\n /**\n * Sets the role validity flag to true.\n */\n $scope.removeErrorOnCut = function() {\n // If the user cuts text from the field, the tag error message will be hidden\n $scope.isRoleValid = true;\n };\n }]);\n\nsecurityModule.controller('AddUserCtrl', ['$scope', '$http', 'toastr', '$window', '$timeout', '$location', '$jwtAuth', '$controller', 'SecurityService', 'ModalService', '$translate',\n function($scope, $http, toastr, $window, $timeout, $location, $jwtAuth, $controller, SecurityService, ModalService, $translate) {\n // eslint-disable-next-line no-invalid-this\n angular.extend(this, $controller('CommonUserCtrl', {$scope: $scope, passwordPlaceholder: 'security.password.placeholder'}));\n const usersService = service(UsersService);\n\n $scope.mode = 'add';\n $scope.saveButtonText = $translate.instant('common.create.btn');\n $scope.goBack = function() {\n const timer = $timeout(function() {\n $window.history.back();\n }, 100);\n $scope.$on('$destroy', function() {\n $timeout.cancel(timer);\n });\n };\n $scope.pageTitle = $translate.instant('view.create.user.title');\n $scope.passwordPlaceholder = $translate.instant('security.password.placeholder');\n\n $scope.user = {\n 'username': '',\n 'password': '',\n 'confirmpassword': '',\n 'grantedAuthorities': [],\n 'appSettings': {\n 'DEFAULT_SAMEAS': true,\n 'DEFAULT_INFERENCE': true,\n 'EXECUTE_COUNT': true,\n 'IGNORE_SHARED_QUERIES': false,\n 'DEFAULT_VIS_GRAPH_SCHEMA': true,\n },\n };\n\n $scope.submit = function() {\n if ($scope.noPassword && $scope.userType === UserType.ADMIN) {\n ModalService.openSimpleModal({\n title: $translate.instant('security.create.admin'),\n message: $translate.instant('security.admin.login.warning'),\n warning: true,\n }).result.then(function() {\n $scope.createUser();\n });\n } else {\n $scope.createUser();\n }\n };\n\n $scope.createUserHttp = function() {\n $scope.loader = true;\n const user = new User({\n username: $scope.user.username,\n password: $scope.user.password,\n appSettings: new AppSettings($scope.user.appSettings),\n authorities: new AuthorityList($scope.user.grantedAuthorities),\n });\n usersService.createUser(user)\n .then(() => {\n toastr.success($translate.instant('security.user.created', {name: $scope.user.username}));\n const timer = $timeout(function() {\n $scope.loader = false;\n $location.path('/users');\n }, 2000);\n $scope.$on('$destroy', function() {\n $timeout.cancel(timer);\n });\n })\n .catch(async (data) => {\n $scope.loader = false;\n toastr.error(getError(data), $translate.instant('common.error'));\n });\n };\n\n $scope.createUser = function() {\n if ($scope.validateForm()) {\n $scope.setGrantedAuthorities();\n\n if (!$scope.repositoryCheckError) {\n $scope.createUserHttp();\n }\n }\n };\n\n $scope.validateForm = function() {\n let result = true;\n if (!$scope.user.username) {\n $scope.usernameError = $translate.instant('security.enter.username');\n result = false;\n } else {\n $scope.usernameError = '';\n }\n if ($scope.noPassword) {\n $scope.passwordError = '';\n $scope.confirmPasswordError = '';\n } else {\n if (!$scope.user.password) {\n $scope.passwordError = $translate.instant('security.enter.password');\n result = false;\n } else {\n $scope.passwordError = '';\n }\n if (!$scope.user.confirmpassword || $scope.user.password !== $scope.user.confirmpassword) {\n $scope.confirmPasswordError = $translate.instant('security.confirm.password');\n result = false;\n } else {\n $scope.confirmPasswordError = '';\n }\n }\n\n return result;\n };\n }]);\n\nsecurityModule.controller('EditUserCtrl', ['$scope', '$http', 'toastr', '$window', '$routeParams', '$timeout', '$location', '$jwtAuth', '$controller', 'SecurityService', 'ModalService', '$translate',\n function($scope, $http, toastr, $window, $routeParams, $timeout, $location, $jwtAuth, $controller, SecurityService, ModalService, $translate) {\n // eslint-disable-next-line no-invalid-this\n angular.extend(this, $controller('CommonUserCtrl', {$scope: $scope, passwordPlaceholder: 'security.new.password'}));\n const usersService = service(UsersService);\n const authorizationService = service(AuthorizationService);\n const securityContextService = service(SecurityContextService);\n\n $scope.mode = 'edit';\n $scope.saveButtonText = $translate.instant('common.save.btn');\n $scope.goBack = function() {\n const timer = $timeout(function() {\n $window.history.back();\n }, 100);\n $scope.$on('$destroy', function() {\n $timeout.cancel(timer);\n });\n };\n $scope.params = $routeParams;\n $scope.pageTitle = $translate.instant('view.edit.user.title', {userId: $scope.params.userId});\n $scope.passwordPlaceholder = $translate.instant('security.new.password');\n $scope.userType = UserType.USER;\n const defaultUserSettings = {\n 'DEFAULT_SAMEAS': true,\n 'DEFAULT_INFERENCE': true,\n 'EXECUTE_COUNT': true,\n 'IGNORE_SHARED_QUERIES': false,\n 'DEFAULT_VIS_GRAPH_SCHEMA': true,\n };\n\n if (!authorizationService.hasRole(UserRole.ROLE_ADMIN)) {\n $location.url('settings');\n }\n $scope.getUserData = function() {\n usersService.getUser($scope.params.userId).then(function(data) {\n $scope.user = {username: data.username};\n $scope.user.password = '';\n $scope.user.confirmpassword = '';\n $scope.user.external = data.external;\n $scope.user.appSettings = data.appSettings || defaultUserSettings;\n $scope.userType = data.getUserType();\n $scope.grantedAuthorities = data.authorities.toUIModel();\n $scope.customRoles = data.authorities.getCustomRoles();\n }).catch(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('common.error'));\n });\n };\n\n $scope.getUserData();\n\n $scope.submit = function() {\n if ($scope.noPassword && $scope.userType === UserType.ADMIN) {\n ModalService.openSimpleModal({\n title: $translate.instant('security.save.admin.settings'),\n message: $translate.instant('security.admin.pass.unset'),\n warning: true,\n }).result.then(function() {\n $scope.updateUser();\n });\n } else {\n $scope.updateUser();\n }\n };\n\n $scope.updateUserHttp = function() {\n $scope.loader = true;\n const user = new User({\n username: $scope.user.username,\n password: $scope.noPassword ? '' : $scope.user.password || undefined,\n appSettings: new AppSettings($scope.user.appSettings),\n authorities: new AuthorityList($scope.user.grantedAuthorities),\n });\n usersService.updateUser(user).then(() => {\n toastr.success($translate.instant('security.user.updated', {name: $scope.user.username}));\n const timer = $timeout(function() {\n $scope.loader = false;\n $window.history.back();\n }, 2000);\n $scope.$on('$destroy', function() {\n $timeout.cancel(timer);\n });\n // if we update the settings of the currently logged user, update the principal\n const principal = securityContextService.getAuthenticatedUser();\n if ($scope.user.username === principal.username) {\n // TODO: Discuss what's the point in updating the principal's appSettings here?!\n // principal.appSettings = $scope.user.appSettings;\n principal.setAppSettings(new AppSettings($scope.user.appSettings));\n }\n }).catch((data) => {\n const msg = getError(data);\n $scope.loader = false;\n toastr.error(msg, $translate.instant('common.error'));\n });\n };\n\n $scope.validateForm = function() {\n return $scope.validatePassword();\n };\n }]);\n\nsecurityModule.controller('RolesMappingController', ['$scope', 'toastr', 'SecurityService', '$translate',\n function($scope, toastr, SecurityService, $translate) {\n $scope.debugMapping = function(role, mapping) {\n const method = mapping.split(':');\n SecurityService.getRolesMapping({\n role: role,\n method: method[1],\n mapping: method[0],\n });\n };\n\n const loadRoles = function() {\n SecurityService.getRoles()\n .success(function(data) {\n $scope.roleMappings = data;\n $scope.roles = _.keys($scope.roleMappings);\n $scope.mappings = _.keys($scope.roleMappings[$scope.roles[0]]);\n const permissionsCount = _.map($scope.roles, function(role) {\n return [role, _.filter($scope.roleMappings[role]).length];\n });\n $scope.roles = _.reverse(_.map(_.orderBy(permissionsCount, function(p) {\n return p[1];\n }), function(p) {\n return p[0];\n }));\n })\n .error(function(data) {\n const msg = getError(data);\n $scope.loader = false;\n toastr.error(msg, $translate.instant('common.error'));\n });\n };\n\n $scope.$on('repositoryIsSet', function() {\n loadRoles();\n });\n }]);\n\nsecurityModule.controller('DeleteUserCtrl', ['$scope', '$uibModalInstance', 'username', function($scope, $uibModalInstance, username) {\n $scope.username = username;\n\n $scope.ok = function() {\n $uibModalInstance.close();\n };\n\n $scope.cancel = function() {\n $uibModalInstance.dismiss('cancel');\n };\n}]);\n"],"names":["SYSTEM_REPO","READ_REPO","READ_REPO_PREFIX","WRITE_REPO","GRAPHQL","WRITE_REPO_PREFIX","GRAPHQL_PREFIX","angular","module","directive","restrict","link","scope","element","attrs","subscriptions","hasCustomOrNegatedPrefix","tag","startsWith","isNgTagsInput","nodeName","toLowerCase","ngModel","ngModelCtrl","controller","$parsers","push","viewValue","Array","isArray","$warning","some","$watch","newVal","$on","unsubscribeListeners","forEach","subscription","securityModule","$scope","$uibModal","toastr","$window","$jwtAuth","$timeout","ModalService","SecurityService","$translate","authorizationService","service","AuthorizationService","authenticationService","AuthenticationService","securityServiceAPI","SecurityServiceAPI","toastrService","OntoToastrService","usersService","UsersService","repositoryService","RepositoryService","usersData","loader","securityEnabled","isSecurityEnabled","hasExternalAuth","getAuthImplementation","freeAccessEnabled","hasFreeAccess","getUsers","then","data","map","user","username","dateCreated","userType","getUserType","userTypeDescription","getUserTypeDescription","repositories","authorities","getRepositoriesPermissions","customRoles","getCustomRoles","catch","msg","getError","error","instant","toggleSecurity","location","reload","setFreeAccess","enabled","authSettings","toggleFreeAccess","updateFreeAccess","getFreeAccess","freeAccessAuthSettings","mapGrantedAuthoritiesResponseToModel","getItems","appSettings","configureFreeAccess","updatedFreeAccessAuthSettings","isFreeAccessEnabled","translateKey","success","status","err","open","templateUrl","resolve","defaultAuthorities","repoIds","_","mapKeys","getRepositories","r","getLocationSpecificId","each","a","indexOf","hasOwnProperty","substr","result","mapAuthSettingsResponseToModel","editFreeAccess","removeUser","openSimpleModal","title","message","name","warning","deleteUser","encodeURIComponent","$http","$uibModalInstance","$rootScope","grantedAuthorities","hasActiveLocation","isEmpty","globalLocation","globalRepositories","ok","auth","repositoryCheckError","index","close","cancel","dismiss","createUniqueKey","repository","$location","passwordPlaceholder","isAdmin","hasRole","UserRole","ROLE_ADMIN","hasEditRestrictions","UserType","ADMIN","isOverrideAuth","isDefaultAuthEnabled","setGrantedAuthorities","pushAuthority","i","length","authority","REPO_MANAGER","ROLE_REPO_MANAGER","ROLE_USER","role","isUser","USER","hasReadPermission","uniqueKey","id","hasWritePermission","repoOrWildCard","hasGraphqlPermission","readCheckDisabled","writeCheckDisabled","graphqlCheckDisabled","hasReadWildcard","hasWriteWildcard","hasReadForRepo","hasWriteForRepo","validatePassword","noPassword","passwordError","confirmPasswordError","password","confirmpassword","isLocalAuthentication","updateUser","validateForm","updateUserHttp","setNoPassword","shouldDisableSameAs","sameAsCheckbox","$","DEFAULT_INFERENCE","prop","DEFAULT_SAMEAS","isRoleValid","addCustomRole","text","toUpperCase","isCustomRoleValid","fieldValue","checkUserInput","event","keyCode","removeErrorOnCut","$controller","extend","this","mode","saveButtonText","goBack","timer","history","back","pageTitle","submit","createUser","createUserHttp","User","AppSettings","AuthorityList","path","async","usernameError","$routeParams","securityContextService","SecurityContextService","params","userId","defaultUserSettings","url","getUserData","getUser","external","toUIModel","undefined","principal","getAuthenticatedUser","setAppSettings","debugMapping","mapping","method","split","getRolesMapping","getRoles","roleMappings","roles","keys","mappings","permissionsCount","filter","reverse","orderBy","p"],"ignoreList":[],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"94229.47dbdba202106c61dff1.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/security/services/constants.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/security/directives/custom-prefix-tags-input.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/security/controllers.js"],"sourcesContent":["export const SYSTEM_REPO = 'SYSTEM';\nexport const READ_REPO = 'READ_REPO';\nexport const READ_REPO_PREFIX = 'READ_REPO_';\nexport const WRITE_REPO = 'WRITE_REPO';\nexport const GRAPHQL = 'GRAPHQL';\nexport const WRITE_REPO_PREFIX = 'WRITE_REPO_';\nexport const GRAPHQL_PREFIX = 'GRAPHQL_';\nexport const GRAPHQL_SUFFIX = 'GRAPHQL';\nexport const SUFFIX_DELIMITER = ':';\nexport const GRAPHQL_SUFFIX_WITH_DELIMITER = SUFFIX_DELIMITER + GRAPHQL_SUFFIX;\nexport const CUSTOM_PREFIX = 'CUSTOM_'\n","angular\n .module('graphdb.framework.security.directives', [])\n .directive('customPrefixTagsInput', customPrefixTagsInputDirective);\n\n/**\n * @ngdoc directive\n * @name customPrefixTagsInput\n * @module app\n * @restrict A\n * @description\n * The `customPrefixTagsInput` directive is used to check 'tags-input' for roles containing 'CUSTOM_' or '!CUSTOM_' prefix.\n *\n * If the value starts with either of these prefixes, a warning property will be set in ngModel.\n *\n * @usage\n * <tags-input custom-prefix-tags-input>{{yourModel.role}}</tags-input>\n *\n * @return {Object} Directive definition object with restrict and link properties.\n */\nfunction customPrefixTagsInputDirective() {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n const customPrefix = \"CUSTOM_\";\n const negatedCustomPrefix = \"!CUSTOM_\";\n const subscriptions = [];\n\n function hasCustomOrNegatedPrefix(tag) {\n return tag.startsWith(customPrefix) || tag.startsWith(negatedCustomPrefix);\n }\n\n // Check if the element is tags-input and has ngModel associated with it\n const isNgTagsInput = element[0].nodeName.toLowerCase() === 'tags-input';\n\n if (isNgTagsInput && attrs.ngModel) {\n const ngModelCtrl = element.controller('ngModel');\n\n if (isNgTagsInput) {\n ngModelCtrl.$parsers.push(function (viewValue) {\n if (Array.isArray(viewValue)) {\n ngModelCtrl.$warning = viewValue.some((tag) => hasCustomOrNegatedPrefix(tag));\n }\n return viewValue;\n });\n\n subscriptions.push(scope.$watch(attrs.ngModel, function (newVal) {\n if (Array.isArray(newVal)) {\n ngModelCtrl.$warning = newVal.some((tag) => hasCustomOrNegatedPrefix(tag));\n }\n }, true));\n }\n }\n\n const unsubscribeListeners = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n subscriptions.push(scope.$on('$destroy', unsubscribeListeners));\n }\n };\n}\n","import 'angular/core/services';\nimport 'angular/core/services/jwt-auth.service';\nimport 'angular/core/services/security.service';\nimport {UserRole, UserType} from 'angular/utils/user-utils';\nimport 'angular/security/directives/custom-prefix-tags-input.directive';\nimport {GRAPHQL, GRAPHQL_PREFIX, READ_REPO, READ_REPO_PREFIX, SYSTEM_REPO, WRITE_REPO, WRITE_REPO_PREFIX} from './services/constants';\nimport {\n AppSettings,\n AuthorityList,\n AuthorizationService,\n SecurityContextService,\n AuthenticationService,\n mapAuthSettingsResponseToModel,\n mapGrantedAuthoritiesResponseToModel,\n OntoToastrService,\n RepositoryService,\n SecurityService as SecurityServiceAPI,\n service,\n User,\n UsersService,\n} from '@ontotext/workbench-api';\n\nconst modules = [\n 'ngCookies',\n 'ui.bootstrap',\n 'graphdb.framework.core.services.jwtauth',\n 'graphdb.framework.core.services.security-service',\n 'toastr',\n 'ngTagsInput',\n];\n\nconst securityModule = angular.module('graphdb.framework.security.controllers', modules);\n\nsecurityModule.controller('UsersCtrl', ['$scope', '$uibModal', 'toastr', '$window', '$jwtAuth', '$timeout', 'ModalService', 'SecurityService', '$translate',\n function($scope, $uibModal, toastr, $window, $jwtAuth, $timeout, ModalService, SecurityService, $translate) {\n const authorizationService = service(AuthorizationService);\n const authenticationService = service(AuthenticationService);\n const securityServiceAPI = service(SecurityServiceAPI);\n const toastrService = service(OntoToastrService);\n const usersService = service(UsersService);\n const repositoryService = service(RepositoryService);\n\n // UI view-model\n $scope.usersData = [];\n\n $scope.loader = true;\n $scope.securityEnabled = function() {\n return authenticationService.isSecurityEnabled();\n };\n $scope.hasExternalAuth = function() {\n return $jwtAuth.hasExternalAuth();\n };\n $scope.getAuthImplementation = function() {\n return $jwtAuth.getAuthImplementation();\n };\n $scope.freeAccessEnabled = function() {\n return authorizationService.hasFreeAccess();\n };\n $scope.getUsers = () => {\n return usersService.getUsers()\n .then(function(data) {\n $scope.usersData = data.map((user) => ({\n username: user.username,\n dateCreated: user.dateCreated,\n userType: user.getUserType(),\n userTypeDescription: user.getUserTypeDescription(),\n repositories: user.authorities.getRepositoriesPermissions(),\n customRoles: user.authorities.getCustomRoles(),\n }));\n $scope.loader = false;\n }).catch(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('common.error'));\n $scope.loader = false;\n });\n };\n $scope.getUsers();\n\n $scope.$on('repositoryIsSet', function() {\n $scope.getUsers();\n });\n\n $scope.toggleSecurity = function() {\n const isSecurityEnabled = authenticationService.isSecurityEnabled();\n $jwtAuth.toggleSecurity(!isSecurityEnabled)\n .then(() => {\n // reload UI\n // TODO: Not sure if we really need to reload the page here. The UI state is updated just fine. But maybe the reload is needed for something else?\n // Remove and fix this when migrated\n $window.location.reload();\n });\n };\n\n const setFreeAccess = function(enabled, authSettings) {\n // TODO: check this what app settings are provided here and if cookie settings should be updated in the storage\n return securityServiceAPI.setFreeAccess(enabled, authSettings);\n };\n\n /**\n * @param {boolean|undefined} updateFreeAccess - Whether to enable or disable free access. If undefined, the\n * free access has not been set yet.\n */\n $scope.toggleFreeAccess = function(updateFreeAccess) {\n if (!authorizationService.hasFreeAccess() || (authorizationService.hasFreeAccess() && updateFreeAccess)) {\n // enable and configure or only configure\n securityServiceAPI.getFreeAccess()\n .then((freeAccessAuthSettings) => {\n const authorities = mapGrantedAuthoritiesResponseToModel(freeAccessAuthSettings.authorities).getItems();\n const appSettings = freeAccessAuthSettings.appSettings ?? {\n 'DEFAULT_SAMEAS': true,\n 'DEFAULT_INFERENCE': true,\n 'EXECUTE_COUNT': true,\n 'IGNORE_SHARED_QUERIES': false,\n 'DEFAULT_VIS_GRAPH_SCHEMA': true,\n };\n return configureFreeAccess(appSettings, authorities, updateFreeAccess);\n })\n .then((updatedFreeAccessAuthSettings) => setFreeAccess(updateFreeAccess || !$jwtAuth.isFreeAccessEnabled(), updatedFreeAccessAuthSettings))\n .then(() => {\n const translateKey = updateFreeAccess ? 'jwt.auth.free.access.updated.msg' : 'jwt.auth.free.access.status';\n toastrService.success($translate.instant(translateKey, {status: $translate.instant('enabled.status')}));\n })\n .catch((err) => {\n if (err === 'cancel') {\n // Check if modal was dismissed by user\n return;\n }\n toastrService.error(err.data ?? err, $translate.instant('common.error'));\n });\n } else {\n // disable\n setFreeAccess(!authorizationService.hasFreeAccess())\n .then(() => {\n toastrService.success($translate.instant('jwt.auth.free.access.status', {status: ($translate.instant('disabled.status'))}));\n })\n .catch((err) => {\n toastrService.error(err.data, $translate.instant('common.error'));\n });\n }\n };\n\n const configureFreeAccess = (appSettings, authorities, updateFreeAccess) => {\n const modalInstance = $uibModal.open({\n templateUrl: 'js/angular/security/templates/modal/default-authorities.html',\n controller: 'DefaultAuthoritiesCtrl',\n resolve: {\n data: function() {\n return {\n // converts the array rights to hash ones. why, oh, why do we have both formats?\n defaultAuthorities: function() {\n const defaultAuthorities = {\n [READ_REPO]: {},\n [WRITE_REPO]: {},\n [GRAPHQL]: {},\n };\n // We might have old (no longer existing) repositories so we have to check that\n const repoIds = _.mapKeys($scope.getRepositories(), function(r) {\n return repositoryService.getLocationSpecificId(r);\n });\n _.each(authorities, function(a) {\n // indexOf works in IE 11, startsWith doesn't\n if (a.indexOf(WRITE_REPO_PREFIX) === 0) {\n if (repoIds.hasOwnProperty(a.substr(11))) {\n defaultAuthorities[WRITE_REPO][a.substr(11)] = true;\n }\n } else if (a.indexOf(READ_REPO_PREFIX) === 0) {\n if (repoIds.hasOwnProperty(a.substr(10))) {\n defaultAuthorities[READ_REPO][a.substr(10)] = true;\n }\n } else if (a.indexOf(GRAPHQL_PREFIX) === 0) {\n if (repoIds.hasOwnProperty(a.substr(8))) {\n defaultAuthorities[GRAPHQL][a.substr(8)] = true;\n }\n }\n });\n return defaultAuthorities;\n },\n appSettings: appSettings,\n };\n },\n },\n });\n return modalInstance.result.then(function(data) {\n authorities = data.authorities;\n appSettings = data.appSettings;\n return mapAuthSettingsResponseToModel({\n enabled: updateFreeAccess || !authorizationService.hasFreeAccess(),\n appSettings,\n authorities,\n });\n });\n };\n\n $scope.editFreeAccess = function() {\n $scope.toggleFreeAccess(true);\n };\n\n $scope.removeUser = function(username) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm.delete'),\n message: $translate.instant('security.confirm.delete.user', {name: username}),\n warning: true,\n }).result.then(function() {\n $scope.loader = true;\n usersService.deleteUser(username)\n .then(() => $scope.getUsers())\n .catch((data) => {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('common.error'));\n $scope.loader = false;\n });\n });\n };\n\n // Should be able to send the original username to $routeParams\n $scope.encodeURIComponent = function(name) {\n return encodeURIComponent(name);\n };\n }]);\n\nsecurityModule.controller('DefaultAuthoritiesCtrl', ['$scope', '$http', '$uibModalInstance', 'data', '$rootScope',\n function($scope, $http, $uibModalInstance, data, $rootScope) {\n const repositoryService = service(RepositoryService);\n\n $scope.grantedAuthorities = data.defaultAuthorities();\n $scope.appSettings = data.appSettings;\n\n $scope.hasActiveLocation = function() {\n // Hack to get this from root scope to avoid cyclic dependency\n return !_.isEmpty($rootScope.globalLocation);\n };\n\n $scope.getRepositories = function() {\n // Hack to get this from root scope to avoid cyclic dependency\n return $rootScope.globalRepositories;\n };\n\n $scope.ok = function() {\n const auth = [];\n $scope.repositoryCheckError = true;\n for (const index in $scope.grantedAuthorities.WRITE_REPO) {\n if ($scope.grantedAuthorities.WRITE_REPO[index]) {\n auth.push(WRITE_REPO_PREFIX + index);\n auth.push(READ_REPO_PREFIX + index);\n $scope.repositoryCheckError = false;\n }\n }\n for (const index in $scope.grantedAuthorities.READ_REPO) {\n if ($scope.grantedAuthorities.READ_REPO[index] && auth.indexOf(READ_REPO_PREFIX + index) === -1) {\n auth.push(READ_REPO_PREFIX + index);\n $scope.repositoryCheckError = false;\n }\n }\n for (const index in $scope.grantedAuthorities.GRAPHQL) {\n if ($scope.grantedAuthorities.GRAPHQL[index] && auth.indexOf(GRAPHQL_PREFIX + index) === -1) {\n auth.push(GRAPHQL_PREFIX + index);\n }\n }\n if (!$scope.repositoryCheckError) {\n $uibModalInstance.close({authorities: auth, appSettings: $scope.appSettings});\n }\n };\n\n $scope.cancel = function() {\n $uibModalInstance.dismiss('cancel');\n };\n\n $scope.createUniqueKey = function(repository) {\n return repositoryService.getLocationSpecificId(repository);\n };\n }]);\n\nsecurityModule.controller('CommonUserCtrl', ['$rootScope', '$scope', '$http', 'toastr', '$window', '$timeout', '$location', '$jwtAuth', '$translate', 'passwordPlaceholder',\n function($rootScope, $scope, $http, toastr, $window, $timeout, $location, $jwtAuth, $translate, passwordPlaceholder) {\n const authorizationService = service(AuthorizationService);\n const repositoryService = service(RepositoryService);\n\n $rootScope.$on('$translateChangeSuccess', function() {\n $scope.passwordPlaceholder = $translate.instant(passwordPlaceholder);\n });\n $scope.isAdmin = function() {\n return authorizationService.hasRole(UserRole.ROLE_ADMIN);\n };\n $scope.hasExternalAuth = function() {\n return $jwtAuth.hasExternalAuth();\n };\n\n $scope.hasEditRestrictions = function() {\n return $scope.user && $scope.user.username === UserType.ADMIN;\n };\n\n $scope.isOverrideAuth = function() {\n return $jwtAuth.isDefaultAuthEnabled();\n };\n\n $scope.setGrantedAuthorities = function() {\n function pushAuthority(...authorities) {\n for (let i = 0; i < authorities.length; i++) {\n const authority = authorities[i];\n if (_.indexOf($scope.user.grantedAuthorities, authority) < 0) {\n $scope.user.grantedAuthorities.push(authority);\n }\n }\n }\n\n $scope.user.grantedAuthorities = [];\n\n $scope.repositoryCheckError = true;\n if ($scope.userType === UserType.ADMIN) {\n $scope.repositoryCheckError = false;\n pushAuthority(UserRole.ROLE_ADMIN);\n } else if ($scope.userType === UserType.REPO_MANAGER) {\n $scope.repositoryCheckError = false;\n pushAuthority(UserRole.ROLE_REPO_MANAGER);\n } else {\n pushAuthority(UserRole.ROLE_USER);\n for (const index in $scope.grantedAuthorities.WRITE_REPO) {\n if ($scope.grantedAuthorities.WRITE_REPO[index]) {\n $scope.repositoryCheckError = false;\n pushAuthority(WRITE_REPO_PREFIX + index, READ_REPO_PREFIX + index);\n }\n }\n for (const index in $scope.grantedAuthorities.READ_REPO) {\n if ($scope.grantedAuthorities.READ_REPO[index]) {\n $scope.repositoryCheckError = false;\n pushAuthority(READ_REPO_PREFIX + index);\n }\n }\n for (const index in $scope.grantedAuthorities.GRAPHQL) {\n if ($scope.grantedAuthorities.GRAPHQL[index]) {\n pushAuthority(GRAPHQL_PREFIX + index);\n }\n }\n }\n if ($scope.customRoles) {\n $scope.customRoles.forEach((role) => pushAuthority('CUSTOM_' + role));\n }\n };\n\n $scope.$watch('userType', function() {\n if (!$scope.isUser()) {\n $scope.customRoles = '';\n }\n });\n\n $scope.isUser = function() {\n return $scope.userType === UserType.USER;\n };\n\n $scope.hasReadPermission = function(repository) {\n const uniqueKey = repositoryService.getLocationSpecificId(repository);\n return $scope.userType === UserType.ADMIN\n || $scope.userType === UserType.REPO_MANAGER\n || repository.id !== SYSTEM_REPO && ($scope.grantedAuthorities.READ_REPO['*']\n || $scope.grantedAuthorities.WRITE_REPO['*'])\n || $scope.grantedAuthorities.READ_REPO[uniqueKey]\n || $scope.grantedAuthorities.WRITE_REPO[uniqueKey];\n };\n\n $scope.hasWritePermission = function(repoOrWildCard) {\n const uniqueKey = repositoryService.getLocationSpecificId(repoOrWildCard);\n return $scope.userType === UserType.ADMIN\n || $scope.userType === UserType.REPO_MANAGER\n || repoOrWildCard.id !== SYSTEM_REPO && $scope.grantedAuthorities.WRITE_REPO['*']\n || $scope.grantedAuthorities.WRITE_REPO[uniqueKey];\n };\n\n $scope.hasGraphqlPermission = function(repository) {\n const uniqueKey = repositoryService.getLocationSpecificId(repository);\n return repository.id !== SYSTEM_REPO && $scope.grantedAuthorities.GRAPHQL['*']\n || $scope.grantedAuthorities.GRAPHQL[uniqueKey];\n };\n\n $scope.readCheckDisabled = function(repoOrWildCard) {\n return $scope.hasWritePermission(repoOrWildCard)\n || repoOrWildCard.id !== SYSTEM_REPO && repoOrWildCard !== '*' && $scope.grantedAuthorities.READ_REPO['*']\n || $scope.hasEditRestrictions();\n };\n\n $scope.writeCheckDisabled = function(repoOrWildCard) {\n return $scope.userType === UserType.ADMIN\n || $scope.userType === UserType.REPO_MANAGER\n || repoOrWildCard.id !== SYSTEM_REPO && repoOrWildCard !== '*' && $scope.grantedAuthorities.WRITE_REPO['*']\n || $scope.hasEditRestrictions();\n };\n\n /**\n * Determines whether the GraphQL checkbox for a given repository or wildcard\n * should be disabled.\n *\n * @param {Object|string} repoOrWildCard - A repo object or the string wildcard '*'\n * @returns {boolean} true if disabled, false if enabled\n */\n $scope.graphqlCheckDisabled = function(repoOrWildCard) {\n if ($scope.userType === UserType.ADMIN || $scope.userType === UserType.REPO_MANAGER) {\n return true;\n }\n\n if ($scope.hasEditRestrictions()) {\n return true;\n }\n\n if (repoOrWildCard !== '*' && $scope.grantedAuthorities.GRAPHQL['*']) {\n return true;\n }\n\n if (repoOrWildCard === '*' && $scope.grantedAuthorities.GRAPHQL['*']) {\n return false;\n }\n\n let uniqueKey;\n if (repoOrWildCard !== null && typeof repoOrWildCard === 'object') {\n uniqueKey = repositoryService.getLocationSpecificId(repoOrWildCard);\n } else {\n uniqueKey = repoOrWildCard;\n }\n\n const hasReadWildcard = $scope.grantedAuthorities.READ_REPO['*'];\n const hasWriteWildcard = $scope.grantedAuthorities.WRITE_REPO['*'];\n const hasReadForRepo = $scope.grantedAuthorities.READ_REPO[uniqueKey];\n const hasWriteForRepo = $scope.grantedAuthorities.WRITE_REPO[uniqueKey];\n\n return !(hasReadWildcard || hasWriteWildcard || hasReadForRepo || hasWriteForRepo);\n };\n\n $scope.createUniqueKey = function(repository) {\n return repositoryService.getLocationSpecificId(repository);\n };\n\n $scope.userType = UserType.USER;\n $scope.grantedAuthorities = {\n [READ_REPO]: {},\n [WRITE_REPO]: {},\n [GRAPHQL]: {},\n };\n\n $scope.validatePassword = function() {\n if ($scope.noPassword) {\n $scope.passwordError = '';\n $scope.confirmPasswordError = '';\n return true;\n }\n if ($scope.user.password !== $scope.user.confirmpassword) {\n if (!$scope.user.password) {\n $scope.passwordError = $translate.instant('security.enter.password');\n $scope.confirmPasswordError = '';\n } else {\n $scope.passwordError = '';\n $scope.confirmPasswordError = $translate.instant('security.confirm.password');\n }\n return false;\n } else {\n $scope.passwordError = '';\n $scope.confirmPasswordError = '';\n }\n return true;\n };\n\n $scope.isLocalAuthentication = function() {\n return $jwtAuth.getAuthImplementation() === 'Local';\n };\n\n $scope.updateUser = function() {\n if (!$scope.validateForm()) {\n return false;\n }\n\n if ($scope.isLocalAuthentication()) {\n $scope.setGrantedAuthorities();\n }\n\n if (!$scope.repositoryCheckError) {\n $scope.updateUserHttp();\n }\n };\n\n $scope.setNoPassword = function() {\n if ($scope.noPassword) {\n $scope.user.password = '';\n $scope.user.confirmpassword = '';\n $scope.passwordError = '';\n $scope.confirmPasswordError = '';\n }\n };\n\n $scope.shouldDisableSameAs = function() {\n const sameAsCheckbox = $('#sameAsCheck');\n if ($scope.user && !$scope.user.appSettings.DEFAULT_INFERENCE && sameAsCheckbox.prop('checked')) {\n sameAsCheckbox.prop('checked', false);\n $scope.user.appSettings.DEFAULT_SAMEAS = false;\n }\n\n return $scope.user && !$scope.user.appSettings.DEFAULT_INFERENCE;\n };\n\n /**\n * The validity of the last user typed custom role.\n * @type {boolean}\n */\n $scope.isRoleValid = true;\n const minTagLength = 2;\n\n /**\n * Adds the user typed custom role and sets role validity flag to true.\n *\n * @param {{text: string}} role the user input\n * @return {{text: string}} the user input in uppercase\n */\n $scope.addCustomRole = function(role) {\n $scope.isRoleValid = true;\n role.text = role.text.toUpperCase();\n return role;\n };\n\n /**\n * Checks if the input text is valid or not.\n *\n * @param {{text: string}} fieldValue the user input\n * @return {boolean} true if valid, otherwise false\n */\n $scope.isCustomRoleValid = function(fieldValue) {\n $scope.isRoleValid = fieldValue.text.length >= minTagLength;\n return $scope.isRoleValid;\n };\n\n /**\n * Checks if the user pressed the 'Backspace' or 'Delete' key and sets the role validity flag accordingly.\n *\n * @param {Object} event\n */\n $scope.checkUserInput = function(event) {\n // If the key pressed is the backspace or delete key, the tag error message will be hidden\n if (event.keyCode === 8 || event.keyCode === 46) {\n $scope.isRoleValid = true;\n }\n };\n\n /**\n * Sets the role validity flag to true.\n */\n $scope.removeErrorOnCut = function() {\n // If the user cuts text from the field, the tag error message will be hidden\n $scope.isRoleValid = true;\n };\n }]);\n\nsecurityModule.controller('AddUserCtrl', ['$scope', '$http', 'toastr', '$window', '$timeout', '$location', '$jwtAuth', '$controller', 'SecurityService', 'ModalService', '$translate',\n function($scope, $http, toastr, $window, $timeout, $location, $jwtAuth, $controller, SecurityService, ModalService, $translate) {\n // eslint-disable-next-line no-invalid-this\n angular.extend(this, $controller('CommonUserCtrl', {$scope: $scope, passwordPlaceholder: 'security.password.placeholder'}));\n const usersService = service(UsersService);\n\n $scope.mode = 'add';\n $scope.saveButtonText = $translate.instant('common.create.btn');\n $scope.goBack = function() {\n const timer = $timeout(function() {\n $window.history.back();\n }, 100);\n $scope.$on('$destroy', function() {\n $timeout.cancel(timer);\n });\n };\n $scope.pageTitle = $translate.instant('view.create.user.title');\n $scope.passwordPlaceholder = $translate.instant('security.password.placeholder');\n\n $scope.user = {\n 'username': '',\n 'password': '',\n 'confirmpassword': '',\n 'grantedAuthorities': [],\n 'appSettings': {\n 'DEFAULT_SAMEAS': true,\n 'DEFAULT_INFERENCE': true,\n 'EXECUTE_COUNT': true,\n 'IGNORE_SHARED_QUERIES': false,\n 'DEFAULT_VIS_GRAPH_SCHEMA': true,\n },\n };\n\n $scope.submit = function() {\n if ($scope.noPassword && $scope.userType === UserType.ADMIN) {\n ModalService.openSimpleModal({\n title: $translate.instant('security.create.admin'),\n message: $translate.instant('security.admin.login.warning'),\n warning: true,\n }).result.then(function() {\n $scope.createUser();\n });\n } else {\n $scope.createUser();\n }\n };\n\n $scope.createUserHttp = function() {\n $scope.loader = true;\n const user = new User({\n username: $scope.user.username,\n password: $scope.user.password,\n appSettings: new AppSettings($scope.user.appSettings),\n authorities: new AuthorityList($scope.user.grantedAuthorities),\n });\n usersService.createUser(user)\n .then(() => {\n toastr.success($translate.instant('security.user.created', {name: $scope.user.username}));\n const timer = $timeout(function() {\n $scope.loader = false;\n $location.path('/users');\n }, 2000);\n $scope.$on('$destroy', function() {\n $timeout.cancel(timer);\n });\n })\n .catch(async (data) => {\n $scope.loader = false;\n toastr.error(getError(data), $translate.instant('common.error'));\n });\n };\n\n $scope.createUser = function() {\n if ($scope.validateForm()) {\n $scope.setGrantedAuthorities();\n\n if (!$scope.repositoryCheckError) {\n $scope.createUserHttp();\n }\n }\n };\n\n $scope.validateForm = function() {\n let result = true;\n if (!$scope.user.username) {\n $scope.usernameError = $translate.instant('security.enter.username');\n result = false;\n } else {\n $scope.usernameError = '';\n }\n if ($scope.noPassword) {\n $scope.passwordError = '';\n $scope.confirmPasswordError = '';\n } else {\n if (!$scope.user.password) {\n $scope.passwordError = $translate.instant('security.enter.password');\n result = false;\n } else {\n $scope.passwordError = '';\n }\n if (!$scope.user.confirmpassword || $scope.user.password !== $scope.user.confirmpassword) {\n $scope.confirmPasswordError = $translate.instant('security.confirm.password');\n result = false;\n } else {\n $scope.confirmPasswordError = '';\n }\n }\n\n return result;\n };\n }]);\n\nsecurityModule.controller('EditUserCtrl', ['$scope', '$http', 'toastr', '$window', '$routeParams', '$timeout', '$location', '$jwtAuth', '$controller', 'SecurityService', 'ModalService', '$translate',\n function($scope, $http, toastr, $window, $routeParams, $timeout, $location, $jwtAuth, $controller, SecurityService, ModalService, $translate) {\n // eslint-disable-next-line no-invalid-this\n angular.extend(this, $controller('CommonUserCtrl', {$scope: $scope, passwordPlaceholder: 'security.new.password'}));\n const usersService = service(UsersService);\n const authorizationService = service(AuthorizationService);\n const securityContextService = service(SecurityContextService);\n\n $scope.mode = 'edit';\n $scope.saveButtonText = $translate.instant('common.save.btn');\n $scope.goBack = function() {\n const timer = $timeout(function() {\n $window.history.back();\n }, 100);\n $scope.$on('$destroy', function() {\n $timeout.cancel(timer);\n });\n };\n $scope.params = $routeParams;\n $scope.pageTitle = $translate.instant('view.edit.user.title', {userId: $scope.params.userId});\n $scope.passwordPlaceholder = $translate.instant('security.new.password');\n $scope.userType = UserType.USER;\n const defaultUserSettings = {\n 'DEFAULT_SAMEAS': true,\n 'DEFAULT_INFERENCE': true,\n 'EXECUTE_COUNT': true,\n 'IGNORE_SHARED_QUERIES': false,\n 'DEFAULT_VIS_GRAPH_SCHEMA': true,\n };\n\n if (!authorizationService.hasRole(UserRole.ROLE_ADMIN)) {\n $location.url('settings');\n }\n $scope.getUserData = function() {\n usersService.getUser($scope.params.userId).then(function(data) {\n $scope.user = {username: data.username};\n $scope.user.password = '';\n $scope.user.confirmpassword = '';\n $scope.user.external = data.external;\n $scope.user.appSettings = data.appSettings || defaultUserSettings;\n $scope.userType = data.getUserType();\n $scope.grantedAuthorities = data.authorities.toUIModel();\n $scope.customRoles = data.authorities.getCustomRoles();\n }).catch(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('common.error'));\n });\n };\n\n $scope.getUserData();\n\n $scope.submit = function() {\n if ($scope.noPassword && $scope.userType === UserType.ADMIN) {\n ModalService.openSimpleModal({\n title: $translate.instant('security.save.admin.settings'),\n message: $translate.instant('security.admin.pass.unset'),\n warning: true,\n }).result.then(function() {\n $scope.updateUser();\n });\n } else {\n $scope.updateUser();\n }\n };\n\n $scope.updateUserHttp = function() {\n $scope.loader = true;\n const user = new User({\n username: $scope.user.username,\n password: $scope.noPassword ? '' : $scope.user.password || undefined,\n appSettings: new AppSettings($scope.user.appSettings),\n authorities: new AuthorityList($scope.user.grantedAuthorities),\n });\n usersService.updateUser(user).then(() => {\n toastr.success($translate.instant('security.user.updated', {name: $scope.user.username}));\n const timer = $timeout(function() {\n $scope.loader = false;\n $window.history.back();\n }, 2000);\n $scope.$on('$destroy', function() {\n $timeout.cancel(timer);\n });\n // if we update the settings of the currently logged user, update the principal\n const principal = securityContextService.getAuthenticatedUser();\n if ($scope.user.username === principal.username) {\n // TODO: Discuss what's the point in updating the principal's appSettings here?!\n // principal.appSettings = $scope.user.appSettings;\n principal.setAppSettings(new AppSettings($scope.user.appSettings));\n }\n }).catch((data) => {\n const msg = getError(data);\n $scope.loader = false;\n toastr.error(msg, $translate.instant('common.error'));\n });\n };\n\n $scope.validateForm = function() {\n return $scope.validatePassword();\n };\n }]);\n\nsecurityModule.controller('RolesMappingController', ['$scope', 'toastr', 'SecurityService', '$translate',\n function($scope, toastr, SecurityService, $translate) {\n $scope.debugMapping = function(role, mapping) {\n const method = mapping.split(':');\n SecurityService.getRolesMapping({\n role: role,\n method: method[1],\n mapping: method[0],\n });\n };\n\n const loadRoles = function() {\n SecurityService.getRoles()\n .success(function(data) {\n $scope.roleMappings = data;\n $scope.roles = _.keys($scope.roleMappings);\n $scope.mappings = _.keys($scope.roleMappings[$scope.roles[0]]);\n const permissionsCount = _.map($scope.roles, function(role) {\n return [role, _.filter($scope.roleMappings[role]).length];\n });\n $scope.roles = _.reverse(_.map(_.orderBy(permissionsCount, function(p) {\n return p[1];\n }), function(p) {\n return p[0];\n }));\n })\n .error(function(data) {\n const msg = getError(data);\n $scope.loader = false;\n toastr.error(msg, $translate.instant('common.error'));\n });\n };\n\n $scope.$on('repositoryIsSet', function() {\n loadRoles();\n });\n }]);\n\nsecurityModule.controller('DeleteUserCtrl', ['$scope', '$uibModalInstance', 'username', function($scope, $uibModalInstance, username) {\n $scope.username = username;\n\n $scope.ok = function() {\n $uibModalInstance.close();\n };\n\n $scope.cancel = function() {\n $uibModalInstance.dismiss('cancel');\n };\n}]);\n"],"names":["SYSTEM_REPO","READ_REPO","READ_REPO_PREFIX","WRITE_REPO","GRAPHQL","WRITE_REPO_PREFIX","GRAPHQL_PREFIX","angular","module","directive","restrict","link","scope","element","attrs","subscriptions","hasCustomOrNegatedPrefix","tag","startsWith","isNgTagsInput","nodeName","toLowerCase","ngModel","ngModelCtrl","controller","$parsers","push","viewValue","Array","isArray","$warning","some","$watch","newVal","$on","unsubscribeListeners","forEach","subscription","securityModule","$scope","$uibModal","toastr","$window","$jwtAuth","$timeout","ModalService","SecurityService","$translate","authorizationService","service","AuthorizationService","authenticationService","AuthenticationService","securityServiceAPI","SecurityServiceAPI","toastrService","OntoToastrService","usersService","UsersService","repositoryService","RepositoryService","usersData","loader","securityEnabled","isSecurityEnabled","hasExternalAuth","getAuthImplementation","freeAccessEnabled","hasFreeAccess","getUsers","then","data","map","user","username","dateCreated","userType","getUserType","userTypeDescription","getUserTypeDescription","repositories","authorities","getRepositoriesPermissions","customRoles","getCustomRoles","catch","msg","getError","error","instant","toggleSecurity","location","reload","setFreeAccess","enabled","authSettings","toggleFreeAccess","updateFreeAccess","getFreeAccess","freeAccessAuthSettings","mapGrantedAuthoritiesResponseToModel","getItems","appSettings","configureFreeAccess","updatedFreeAccessAuthSettings","isFreeAccessEnabled","translateKey","success","status","err","open","templateUrl","resolve","defaultAuthorities","repoIds","_","mapKeys","getRepositories","r","getLocationSpecificId","each","a","indexOf","hasOwnProperty","substr","result","mapAuthSettingsResponseToModel","editFreeAccess","removeUser","openSimpleModal","title","message","name","warning","deleteUser","encodeURIComponent","$http","$uibModalInstance","$rootScope","grantedAuthorities","hasActiveLocation","isEmpty","globalLocation","globalRepositories","ok","auth","repositoryCheckError","index","close","cancel","dismiss","createUniqueKey","repository","$location","passwordPlaceholder","isAdmin","hasRole","UserRole","ROLE_ADMIN","hasEditRestrictions","UserType","ADMIN","isOverrideAuth","isDefaultAuthEnabled","setGrantedAuthorities","pushAuthority","i","length","authority","REPO_MANAGER","ROLE_REPO_MANAGER","ROLE_USER","role","isUser","USER","hasReadPermission","uniqueKey","id","hasWritePermission","repoOrWildCard","hasGraphqlPermission","readCheckDisabled","writeCheckDisabled","graphqlCheckDisabled","hasReadWildcard","hasWriteWildcard","hasReadForRepo","hasWriteForRepo","validatePassword","noPassword","passwordError","confirmPasswordError","password","confirmpassword","isLocalAuthentication","updateUser","validateForm","updateUserHttp","setNoPassword","shouldDisableSameAs","sameAsCheckbox","$","DEFAULT_INFERENCE","prop","DEFAULT_SAMEAS","isRoleValid","addCustomRole","text","toUpperCase","isCustomRoleValid","fieldValue","checkUserInput","event","keyCode","removeErrorOnCut","$controller","extend","this","mode","saveButtonText","goBack","timer","history","back","pageTitle","submit","createUser","createUserHttp","User","AppSettings","AuthorityList","path","async","usernameError","$routeParams","securityContextService","SecurityContextService","params","userId","defaultUserSettings","url","getUserData","getUser","external","toUIModel","undefined","principal","getAuthenticatedUser","setAppSettings","debugMapping","mapping","method","split","getRolesMapping","getRoles","roleMappings","roles","keys","mappings","permissionsCount","filter","reverse","orderBy","p"],"ignoreList":[],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export const __webpack_esm_id__=99448;export const __webpack_esm_ids__=[99448];export const __webpack_esm_modules__={64088(e,t,n){n.d(t,{A:()=>r});var a=a||{};a.SingleChild={addPlaceholders:function e(t,n){if(t.children){for(var a=0;a<t.children.length;a++)e(t.children[a]);if(1===t.children.length){var r=1.2*t.size;n&&(r=.1*t.children[0].size),t.children.push({name:"placeholder",size:r})}}},removePlaceholders:function e(t){for(var n=t.length-1;n>=0;n--){var a=t[n];"placeholder"===a.data.name?t.splice(n,1):a.children&&e(a.children)}},centerNodes:function(e){for(var t=0;t<e.length;t++){var n=e[t];if(n.children&&1===n.children.length){var a=n.x-n.children[0].x;n.children[0].x+=a,r(n.children[0],a)}}function r(e,t){if(e.children)for(var n=0;n<e.children.length;n++)e.children[n].x+=t,r(e.children[n],t)}},makePositionsRelativeToZero:function(e){for(var t=e[0].x,n=e[0].y,a=0;a<e.length;a++){var r=e[a];r.x-=t,r.y-=n}}};const r=a},88141(e,t,n){n.d(t,{A:()=>i}),n(62979);const a={selectAll:n(93462).selectAll};var r=r||{};r.Export={getCSSRules:function(e){const t=$('link[href="'+e+'"]')[0].sheet.rules;let n="";return _.each(t,function(e){n+=e.cssText}),n},generateBase64ImageSource:function(e){e||(e="svg");const t=a.selectAll(e).attr("version","1.1").attr("xmlns","http://www.w3.org/2000/svg").node().parentNode.innerHTML;return"data:image/svg+xml;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(t)))}};const i=r},99448(e,t,n){var a=n(75468),r=n(64088),i=n(19935),s=n(93462),c=n(88141),o=(n(32150),n(57154));function l(e,t,n,l,d,h,u,f,p,g,x,m){return{restrict:"AE",template:'<div id="classChart"></div>',scope:{classHierarchyData:"=",flattenedClassNames:"=",selectedClass:"=",currentSliderValue:"=",showClassInfoPanel:"=",showExternalElements:"=",hidePrefixes:"=",currentBrowserLimit:"="},link:function(y,A,v){!function(y){let A=!1;let v,S;const C=s.pack().size([780,780]),R=s.scaleLinear().domain([0,4]).range(["hsl(19, 70%, 90%)","hsl(19, 70%, 50%)"]).interpolate(s.interpolateHcl),E=s.select("#classChart").insert("svg:svg","h2").attr("viewBox","0 0 800 800").attr("preserveAspectRatio","xMidYMid meet").on("dblclick.zoom",null);function P(){return E.append("svg:g").attrs({id:"main-group",transform:"translate(400,400)"})}function w(){return"true"===g.get(x.CLASS_HIERARCHY_HIDE_PREFIXES)}function H(){const e=c.A.Export.getCSSRules("css/rdf-class-hierarchy-labels.css?v=3.3.2");s.selectAll("#main-group").append("defs"),$("defs").append('<style type="text/css"><![CDATA['+e+"]]></style>"),s.selectAll("g").style("opacity",1);const t=c.A.Export.generateBase64ImageSource("#classChart svg");s.select(this).attrs({href:t,download:"class-hierarchy-"+h.getActiveRepository()+".svg"})}y.hidePrefixes=w();let I=P();const T=!!y.classHierarchyData?.classCount,L=h.getActiveRepository()&&!h.isSystemRepository();let D,k,N,b,F;(0,o.service)(o.LicenseContextService).onLicenseChanged(t=>{t?.valid&&!T&&L&&function(){e.loader=!0,e.hierarchyError=!1;const t=g.get(`classHierarchy-selectedGraph-${h.getActiveRepository()}`);n.getClassHierarchyData(null!==t?t.contextID.uri:"").success(function(t,n){e.loader=!1,207===n&&u.warning(m.instant("graphexplore.update.diagram"),m.instant("graphexplore.repository.data.changed")),y.classHierarchyData=t,s.select("#download-svg").on("mouseover",H)}).error(function(t){e.loader=!1,e.hierarchyError=getError(t),u.error(m.instant("graphexplore.error.request.failed",{name:p,error:getError(t)}))})}()});const z={};function O(n,c,o,h){b&&b(),F&&F(),s.selectAll("#main-group").remove(),I=P(),r.A.SingleChild.addPlaceholders(n,!0),S=s.hierarchy(n),S.sum(function(e){return e.size}),N=o||S,C(S);const u=S.descendants();let g;N.isInFocusTransitive=!0,r.A.SingleChild.removePlaceholders(u),r.A.SingleChild.centerNodes(u),r.A.SingleChild.makePositionsRelativeToZero(u),v||(v=(0,a.A)().attr("class","d3-tip").customPosition(function(e,t){return{top:"inherit",bottom:l.innerHeight-t.clientY+"px",right:l.innerWidth-t.clientX+"px"}}).html(function(e){return e.data.name}),E.call(v));const x=I.selectAll("circle").data(u).enter().append("g");c.doFade&&x.each(function(e){i.A.Transition.fadeIn(s.select(this),550)});let m=[];const w=x.append("circle").attr("class",function(e){return e.data.role}).attr("data-test",function(e){return"class-"+e.data.name}).attr("guide-selector",function(e){return"class-"+e.data.name}).style("fill",function(e){return e.children?R(e.depth):"#E0D0D0"}).each(function(e){if(e.circle=s.select(this),e.data.name!==p){const t=e.data.name;m.push({name:t}),z[[t]]=e,e.circle.classed("rdf-class",!0),e.circle.on("mouseover",function(t){c.noPrefixes||e.textHidden?v.show(e,t):v.hide(e)}),e.circle.on("mouseout",v.hide)}}).on("gdb-focus",(e,t)=>k(t)).on("gdb-zoom",(e,t)=>Z(t));let H;function T(e){s.selectAll(".selected").classed("selected",e.selected=!1),e.circle.classed("selected",e.selected=!0),H=e}function L(){y.showClassInfoPanel=!1}m&&(m=_.uniqBy(m,"name"),y.flattenedClassNames=m);const $=i.A.Click.delayDblClick();s.selectAll(".parent, .topLevelParent, .child, .root").call($),k=function(e){Z(e),e.data.name===p?(L(),s.selectAll(".selected").classed("selected",!1)):(T(e),A||(y.selectedClass=H,y.showClassInfoPanel=!0),y.$on("sidePanelClosed",function(t){s.selectAll(".selected").classed("selected",e.selected=!1)}))},$.on("click",function(e,t){t.data.id&&l.history.pushState({id:t.data.id},"classHierarchyPage"+t.data.id,"hierarchy#"+t.data.id),v.hide(),k(t)}),$.on("dblclick",function(t,a){a!==n&&(v.hide(),T(a),e.$broadcast("goToDomainRangeGraphView",H,N),t.stopPropagation())});let O=0;E.on("wheel",function(e){v.hide(),e.preventDefault(),e.stopPropagation();const t=Date.now();if(!(t-O>100))return;O=t;let n="";e.deltaY<=-1?n="in":e.deltaY>=1&&(n="out");let a=e.target.__data__;if(a||(a=N),"in"===n){if(a!==N){for(;a.parent&&!a.parent.isInFocusTransitive;)a=a.parent;a.depth<N.depth&&(a=N)}if(a===N&&a.children){let e=a.children[0];for(let t=1;t<a.children.length;t++)a.children[t].sortingRank>e.sortingRank&&(e=a.children[t]);e.children&&(a=e)}else a.children||(a=a.parent);Z(a,!0)}else"out"===n&&(a=N.parent,a&&Z(a,!0));N.data.name===p&&l.history.replaceState({id:1},"classHierarchyPage1","hierarchy#1"),U()});const Y=I.selectAll("text").data(u).enter().append("text").attr("class",function(e){return e.children&&e.children.length?"label":"label child-label"}).each(function(e){e.textSel=s.select(this)});c.noPrefixes?(Y.each(function(e){const t=e.data.name.indexOf(":");e.data.name.indexOf("http://")>-1?e.noPrefixName=e.data.name:t>-1&&(e.noPrefixName=e.data.name.substring(t+1))}),Y.style("font-size",function(e){return i.A.Text.calcFontSize(e.noPrefixName,e.r)}).text(function(e){return i.A.Text.getTextWithElipsisIfNeeded(e.noPrefixName,e.r/3)})):Y.style("font-size",function(e){return i.A.Text.calcFontSize(e.data.name,e.r)}).text(function(e){return i.A.Text.getTextWithElipsisIfNeeded(e.data.name,e.r/3)}),Y.style("display",function(e){return e.parent&&e.parent.data===N.data?(e.textHidden=this.textContent.indexOf("...")+3===this.textContent.length,null):(e.textHidden=!0,"none")}),c.doFade&&!c.keepPrevState&&Y.each(function(e){i.A.Transition.fadeIn(s.select(this),550)}),D=function(){function e(e){e&&w.each(function(t){+e===t.data.id&&k(t)})}const n=t.hash();l.onpopstate=function(t){t.state&&e(t.state.id)},e(n)};const B=I.selectAll("circle, text");function V(e,t){const n=800/e[2];g=e,B.attr("transform",function(t){return"translate("+(t.x-e[0])*n+","+(t.y-e[1])*n+")"}),w.attr("r",function(e){return e.r*n}),t&&Y.each(function(e){e.data.fullName!==N.data.topLevelParentUri&&N.data.topLevelParentUri!==p||(e.textSel.style("display","none"),N.children&&N.children.length?_.each(N.children,function(e){e.textSel.style("display","inline")}):N.textSel.style("display","inline"),N.parent&&_.each(N.parent.children,function(e){e.data.name!==N.data.name&&e.textSel.style("display","inline")}))}),Y.style("font-size",function(e){return c.noPrefixes?i.A.Text.calcFontSize(e.noPrefixName,e.r*n):i.A.Text.calcFontSize(e.data.name,e.r*n)}).text(function(e){return c.noPrefixes?i.A.Text.getTextWithElipsisIfNeeded(e.noPrefixName,e.r*n/3):i.A.Text.getTextWithElipsisIfNeeded(e.data.name,e.r*n/3)})}function M(e){let t=2*e+20;return 2*e/t<.3&&(t=2*e+2),t}function W(e){!e.isInFocusTransitive&&e.parent&&e.parent.isInFocusTransitive?(e.textHidden=this.textContent.indexOf("...")+3===this.textContent.length,this.style.display=""):(e.textHidden=!0,this.style.display="none")}function Z(e,t){if(d(function(){y.showExternalElements=e.data.name===p}),N===e)return;if(e.data.id&&l.history.replaceState({id:e.data.id},"classHierarchyPage"+e.data.id,"hierarchy#"+e.data.id),!e.children&&(e=e.parent,N===e))return;if(t&&(L(),s.selectAll(".selected").classed("selected",!1)),N.parent){let e=N;for(;e;)e.isInFocusTransitive=!1,e=e.parent}let n=e;for(;n;)n.isInFocusTransitive=!!n.children,n=n.parent;N=e,2*N.r/(2*N.r+20)<.3||y.currentSliderValue>y.currentBrowserLimit?(V([N.x,N.y,M(N.r)]),Y.each(function(e){W.call(this,e)})):s.transition().duration(f).tween("zoom",function(e){const t=s.interpolateZoom(g,[N.x,N.y,M(N.r)]);return function(e){V(t(e))}}).selectAll("text").each(W)}V([N.x,N.y,M(N.r)],h),b=y.$on("rootFocus",function(){l.history.pushState({id:1},"classHierarchyPage1","hierarchy#1"),k(S)}),F=y.$on("classSearch",function(e){k(e)})}function U(){const t=y.classHierarchyData.classCount;let n=g.get(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);(!n||n>t)&&(n=t,g.set(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE,n)),e.$broadcast("classCount",t,n)}let Y,B,V,M;window.addEventListener("resize",U),window.addEventListener("beforeunload",function e(){window.removeEventListener("resize",U),window.removeEventListener("beforeunload",e)}),y.$watch("classHierarchyData",function(){Y&&Y(),B&&B(),V&&V(),M&&M();let e=w();if(y.classHierarchyData.classCount){U();const t=structuredClone(y.classHierarchyData);const n=s.hierarchy(t).descendants().sort(function(e,t){return e.data.sortingRank>t.data.sortingRank?-1:e.data.sortingRank<t.data.sortingRank||e.data.depth>t.data.depth?1:e.data.depth<t.data.depth?-1:0});let a,r;function i(e,t){const n={keepPrevState:!0,noPrefixes:w()};r=n.noPrefixes,O(a||e,n,N,!0),d(()=>{g.set(x.CLASS_HIERARCHY_SWITCH_PREFIXES,t),D(),A=!1},70)}function c(e,n,s){if(!e)return;g.set(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE,e),a={name:p,children:[]};const c=new Set;for(let t=1;t<=e;t++)c.add(n[t].data.id),n[t].parent===n[0]&&a.children.push(n[t].data);(function e(t){if(!t.children)return;const n=[];for(const e of t.children)c.has(e.id)&&n.push($.extend({},e));t.children=n;for(const n of t.children)e(n)})(a),s?(r=angular.isUndefined(r)?w():r,O(a,{noPrefixes:r})):i(t)}const o=g.get(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);if(o)c(o,n);else{const h={doFade:!0,keepPrevState:!0,noPrefixes:w()};O(t,h),D()}let l;Y=y.$watch("hidePrefixes",function(n){angular.isUndefined(n)||e?e=void 0:d(function(){A=!0,function(e){angular.isUndefined(e)||g.set(x.CLASS_HIERARCHY_HIDE_PREFIXES,e)}(n),i(t,!0)},50)},!0),B=y.$watch("currentSliderValue",function(e){c(e,n,!0)},!0),M=y.$on("onEnterKeypressSearchAction",function(e){l&&k(l)}),V=y.$on("searchedClass",function(e,t){l=z[t.name],l&&k(l)})}},!0)}(y)}}}angular.module("graphdb.framework.graphexplore.directives.class",["graphdb.framework.graphexplore.controllers.class","graphdb.framework.utils.localstorageadapter"]).constant("ZOOM_DURATION",500).constant("ROOT_OBJ_NAME","RDF Class Hierarchy").directive("rdfClassHierarchy",l),l.$inject=["$rootScope","$location","GraphDataRestService","$window","$timeout","$repositories","toastr","ZOOM_DURATION","ROOT_OBJ_NAME","LocalStorageAdapter","LSKeys","$translate"]}};
|
|
2
|
+
//# sourceMappingURL=99448.2a87f387a8062617d893.bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"99448.2a87f387a8062617d893.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/lib/common/circle-packing.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/common/svg-export.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/graphexplore/directives/rdf-class-hierarchy.directive.js"],"sourcesContent":["var CirclePacking = CirclePacking || {};\n\nCirclePacking.SingleChild = function () {\n /*\n Functions that enable single child circles to display properly, see\n http://stackoverflow.com/questions/22307486/d3-js-packed-circle-layout-how-to-adjust-child-radius\n */\n function addPlaceholders(node, first) {\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n var child = node.children[i];\n addPlaceholders(child);\n }\n\n if (node.children.length === 1) {\n var placeholderSize = node.size * 1.2;\n if (first) {\n placeholderSize = node.children[0].size * 0.1;\n }\n node.children.push({\n name: 'placeholder', size: placeholderSize,\n // children: []\n });\n }\n }\n }\n\n function removePlaceholders(nodes) {\n for (var i = nodes.length - 1; i >= 0; i--) {\n var node = nodes[i];\n\n if (node.data.name === 'placeholder') {\n nodes.splice(i, 1);\n } else {\n if (node.children) {\n removePlaceholders(node.children);\n }\n }\n }\n }\n\n function centerNodes(nodes) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n\n if (node.children) {\n if (node.children.length === 1) {\n var offset = node.x - node.children[0].x;\n node.children[0].x += offset;\n reposition(node.children[0], offset);\n }\n }\n }\n\n function reposition(node, offset) {\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n node.children[i].x += offset;\n reposition(node.children[i], offset);\n }\n }\n }\n }\n\n function makePositionsRelativeToZero(nodes) {\n //use this to have vis centered at 0,0,0 (easier for positioning)\n var offsetX = nodes[0].x;\n var offsetY = nodes[0].y;\n\n for (var i = 0; i < nodes.length; i++) {\n\n var node = nodes[i];\n\n node.x -= offsetX;\n node.y -= offsetY;\n }\n }\n\n return {\n addPlaceholders: addPlaceholders,\n removePlaceholders: removePlaceholders,\n centerNodes: centerNodes,\n makePositionsRelativeToZero: makePositionsRelativeToZero\n }\n}();\n\nexport default CirclePacking;\n","import 'lib/d3.patch.js'\nimport {selectAll} from 'd3';\n\nconst d3 = {selectAll};\nvar SVG = SVG || {};\n\nSVG.Export = function () {\n function getCSSRules(cssSourceFilePath) {\n const cssRules = $('link[href=\"' + cssSourceFilePath + '\"]')[0].sheet.rules;\n let cssStr = \"\";\n _.each(cssRules, function (value) {\n cssStr += value.cssText;\n });\n return cssStr;\n }\n\n function generateBase64ImageSource(svgSelectorClass) {\n if (!svgSelectorClass) {\n svgSelectorClass = \"svg\";\n }\n // add needed xml namespace\n const exportSvg = d3.selectAll(svgSelectorClass)\n .attr(\"version\", \"1.1\")\n .attr(\"xmlns\", \"http://www.w3.org/2000/svg\")\n .node().parentNode.innerHTML;\n\n // convert selected html to base64\n return \"data:image/svg+xml;charset=utf-8;base64,\" + btoa(unescape(encodeURIComponent(exportSvg)));\n }\n\n return {\n getCSSRules: getCSSRules,\n generateBase64ImageSource: generateBase64ImageSource\n };\n}();\n\nexport default SVG;\n","/* eslint-disable no-invalid-this */\nimport d3tip from 'lib/d3-tip/d3-tip-patch';\nimport CirclePacking from 'lib/common/circle-packing';\nimport D3 from 'lib/common/d3-utils';\nimport * as d3 from 'd3';\nimport SVG from 'lib/common/svg-export';\nimport 'angular/utils/local-storage-adapter';\nimport {service, LicenseContextService} from '@ontotext/workbench-api';\n\nangular\n .module('graphdb.framework.graphexplore.directives.class', [\n 'graphdb.framework.graphexplore.controllers.class',\n 'graphdb.framework.utils.localstorageadapter',\n ])\n .constant(\"ZOOM_DURATION\", 500)\n .constant(\"ROOT_OBJ_NAME\", \"RDF Class Hierarchy\")\n .directive('rdfClassHierarchy', classHierarchyDirective);\n\nclassHierarchyDirective.$inject = ['$rootScope', '$location', 'GraphDataRestService', '$window', '$timeout', '$repositories', 'toastr', 'ZOOM_DURATION', 'ROOT_OBJ_NAME', 'LocalStorageAdapter', 'LSKeys', '$translate'];\n\nfunction classHierarchyDirective($rootScope, $location, GraphDataRestService, $window, $timeout, $repositories, toastr, ZOOM_DURATION, ROOT_OBJ_NAME, LocalStorageAdapter, LSKeys, $translate) {\n return {\n restrict: 'AE',\n template: '<div id=\"classChart\"></div>',\n scope: {\n classHierarchyData: '=',\n flattenedClassNames: '=',\n selectedClass: '=',\n currentSliderValue: '=',\n showClassInfoPanel: '=',\n showExternalElements: '=',\n hidePrefixes: '=',\n currentBrowserLimit: '=',\n },\n link: linkFunc,\n };\n\n function linkFunc(scope, element, attrs) {\n renderCirclePacking(scope, element);\n }\n\n function renderCirclePacking(scope, element) {\n /**\n * A boolean flag that determines whether the opening of the side info panel\n * should be suppressed when focusing on the chart while a class is selected.\n */\n let suppressPanelOpen = false;\n\n const width = 800;\n const height = 800;\n const diameter = height;\n const margin = 20;\n let tip;\n let rootHierarchy;\n\n const packLayout = d3.pack()\n .size([diameter - margin, diameter - margin]);\n\n const color = d3.scaleLinear()\n .domain([0, 4])\n .range([\"hsl(19, 70%, 90%)\", \"hsl(19, 70%, 50%)\"])\n .interpolate(d3.interpolateHcl);\n\n const svg = d3.select(\"#classChart\")\n .insert(\"svg:svg\", \"h2\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\")\n .on(\"dblclick.zoom\", null);\n\n function appendMainGroup() {\n return svg.append(\"svg:g\")\n .attrs({\n id: \"main-group\",\n transform: \"translate(\" + width / 2 + \",\" + height / 2 + \")\",\n });\n }\n\n function savePrefixesState(hidePrefixes) {\n if (!angular.isUndefined(hidePrefixes)) {\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_HIDE_PREFIXES, hidePrefixes);\n }\n }\n\n function getPrefixesState() {\n return LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_HIDE_PREFIXES) === \"true\";\n }\n\n /*\n * Prepares SVG document image export by adding xml namespaces and\n * additional style information\n */\n function prepareForSVGImageExport() {\n // get css rules for the diagram\n const cssRules = SVG.Export.getCSSRules(\"css/rdf-class-hierarchy-labels.css?v=3.3.2\");\n // inline css rules in a defs tag\n d3.selectAll(\"#main-group\")\n .append(\"defs\");\n $(\"defs\").append('<style type=\"text/css\"><![CDATA[' + cssRules + ']]></style>');\n\n // switch opacity to visible\n d3.selectAll(\"g\")\n .style(\"opacity\", 1);\n\n // convert selected html to base64\n const imgSrc = SVG.Export.generateBase64ImageSource(\"#classChart svg\");\n\n // set the binary image and a name for the downloadable file on the export button\n d3.select(this).attrs({\n href: imgSrc,\n download: \"class-hierarchy-\" + $repositories.getActiveRepository() + \".svg\",\n });\n }\n\n scope.hidePrefixes = getPrefixesState();\n\n let g = appendMainGroup();\n\n function fetchClassHierarchy() {\n $rootScope.loader = true;\n $rootScope.hierarchyError = false;\n const selGraphFromCache = LocalStorageAdapter.get(`classHierarchy-selectedGraph-${$repositories.getActiveRepository()}`);\n GraphDataRestService.getClassHierarchyData(selGraphFromCache !== null ? selGraphFromCache.contextID.uri : \"\")\n .success(function(response, status) {\n $rootScope.loader = false;\n if (status === 207) {\n toastr.warning(\n $translate.instant('graphexplore.update.diagram'),\n $translate.instant('graphexplore.repository.data.changed'),\n );\n }\n scope.classHierarchyData = response;\n d3.select(\"#download-svg\").on(\"mouseover\", prepareForSVGImageExport);\n })\n .error(function(response) {\n $rootScope.loader = false;\n $rootScope.hierarchyError = getError(response);\n toastr.error(\n $translate.instant('graphexplore.error.request.failed', {\n name: ROOT_OBJ_NAME,\n error: getError(response),\n }),\n );\n });\n }\n\n const hasData = !!scope.classHierarchyData?.classCount;\n const canUseRepo = $repositories.getActiveRepository() && !$repositories.isSystemRepository();\n\n service(LicenseContextService).onLicenseChanged((license) => {\n if (license?.valid && !hasData && canUseRepo) {\n fetchClassHierarchy();\n }\n });\n\n let autoZoomToPreviousState;\n let doFocus;\n\n let focus;\n let rootFocusEvent;\n let classSearchEvent;\n const flattenedClassData = {};\n\n function drawDiagram(root, config, newFocus, switchPrefixes) {\n if (rootFocusEvent) rootFocusEvent();\n if (classSearchEvent) classSearchEvent();\n // remove old group tag containing the diagram\n d3.selectAll(\"#main-group\").remove();\n\n // append new empty group tag in order to rerender new diagram\n g = appendMainGroup();\n\n // fix for single child classes\n CirclePacking.SingleChild.addPlaceholders(root, true);\n\n rootHierarchy = d3.hierarchy(root);\n rootHierarchy.sum(function(d) {\n return d.size;\n });\n focus = newFocus ? newFocus : rootHierarchy;\n\n packLayout(rootHierarchy);\n\n const nodes = rootHierarchy.descendants();\n let view;\n\n focus.isInFocusTransitive = true;\n\n // fixes for single child classes\n CirclePacking.SingleChild.removePlaceholders(nodes);\n CirclePacking.SingleChild.centerNodes(nodes);\n CirclePacking.SingleChild.makePositionsRelativeToZero(nodes);\n\n if (!tip) {\n tip = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function(d, event) {\n return {\n top: 'inherit',\n bottom: ($window.innerHeight - event.clientY) + 'px',\n right: ($window.innerWidth - event.clientX) + 'px',\n };\n })\n .html(function(d) {\n return d.data.name;\n });\n svg.call(tip);\n }\n\n const circleGroup = g.selectAll(\"circle\")\n .data(nodes)\n .enter().append(\"g\");\n\n if (config.doFade) {\n circleGroup.each(function(d) {\n D3.Transition.fadeIn(d3.select(this), 550);\n });\n }\n\n let flattenedClassNames = [];\n\n const circle = circleGroup\n .append(\"circle\")\n .attr(\"class\", function(d) {\n return d.data.role;\n })\n .attr(\"data-test\", function(d) {\n return \"class-\" + d.data.name;\n })\n .attr(\"guide-selector\", function(d) {\n return \"class-\" + d.data.name;\n })\n .style(\"fill\", function(d) {\n //return colors[d.depth % 6];\n return d.children ? color(d.depth) : \"#E0D0D0\";\n })\n .each(function(d) {\n d.circle = d3.select(this);\n if (d.data.name !== ROOT_OBJ_NAME) {\n const key = d.data.name;\n flattenedClassNames.push({name: key});\n flattenedClassData[[key]] = d;\n\n d.circle.classed(\"rdf-class\", true);\n d.circle.on('mouseover', function(event) {\n if (config.noPrefixes) {\n tip.show(d, event);\n } else if (!d.textHidden) {\n tip.hide(d);\n } else {\n tip.show(d, event);\n }\n });\n d.circle.on('mouseout', tip.hide);\n }\n })\n // custom event used when user is following a guide\n .on(\"gdb-focus\", (event, d) => doFocus(d))\n .on(\"gdb-zoom\", (event, d) => zoom(d));\n\n\n if (flattenedClassNames) {\n flattenedClassNames = _.uniqBy(flattenedClassNames, 'name');\n scope.flattenedClassNames = flattenedClassNames;\n }\n\n let selectedClass;\n\n function getCurrentClassDataAndMarkSelected(obj) {\n d3.selectAll(\".selected\").classed(\"selected\", obj.selected = false);\n obj.circle.classed(\"selected\", obj.selected = true);\n selectedClass = obj;\n }\n\n function showClassInfoPanel() {\n scope.selectedClass = selectedClass;\n scope.showClassInfoPanel = true;\n }\n\n function closeClassInfoPanel() {\n scope.showClassInfoPanel = false;\n }\n\n function goToDomainRangeGraphView() {\n $rootScope.$broadcast('goToDomainRangeGraphView', selectedClass, focus);\n }\n\n const clickCancel = D3.Click.delayDblClick();\n d3.selectAll(\".parent, .topLevelParent, .child, .root\")\n .call(clickCancel);\n\n doFocus = function(obj) {\n zoom(obj);\n\n if (obj.data.name === ROOT_OBJ_NAME) {\n closeClassInfoPanel();\n d3.selectAll(\".selected\").classed(\"selected\", false);\n } else {\n getCurrentClassDataAndMarkSelected(obj);\n if (!suppressPanelOpen) {\n showClassInfoPanel();\n }\n\n // FIXME: is it ok to bind this event handler every time and not just once?\n scope.$on('sidePanelClosed', function(event) {\n d3.selectAll(\".selected\").classed(\"selected\", obj.selected = false);\n });\n }\n\n\n //do not stop event propagation here\n };\n\n clickCancel.on(\"click\", function(event, obj) {\n // add clicked class to browser history\n if (obj.data.id) {\n $window.history.pushState({id: obj.data.id}, \"classHierarchyPage\" + obj.data.id, \"hierarchy#\" + obj.data.id);\n }\n\n //hide current d3-tip tooltip\n tip.hide();\n\n doFocus(obj);\n });\n\n clickCancel.on(\"dblclick\", function(event, obj) {\n if (obj === root) {\n return;\n }\n // hide current d3-tip tooltip in order not to appear in the next view\n tip.hide();\n getCurrentClassDataAndMarkSelected(obj);\n goToDomainRangeGraphView();\n\n event.stopPropagation();\n });\n\n let lastTimeWheel = 0;\n svg.on('wheel', function(event) {\n // hide current d3-tip tooltip\n tip.hide();\n\n event.preventDefault();\n event.stopPropagation();\n\n // at least 100ms must have passed since last time we updated\n const now = Date.now();\n if (now - lastTimeWheel > 100) {\n lastTimeWheel = now;\n } else {\n return;\n }\n\n let direction = '';\n if (event.deltaY <= -1) {\n direction = 'in';\n } else if (event.deltaY >= 1) {\n direction = 'out';\n }\n\n let obj = event.target.__data__;\n\n if (!obj) {\n // scroll outside the big circle\n obj = focus;\n }\n\n if (direction === 'in') {\n // determine object to zoom to\n\n if (obj !== focus) {\n // consider the object on which the scroll event occurred\n // and find the furthest parent that has no focused children\n while (obj.parent && !obj.parent.isInFocusTransitive) {\n obj = obj.parent;\n }\n if (obj.depth < focus.depth) {\n // however if that parent is of lower depth than the focus we ignore it\n obj = focus;\n }\n }\n\n if (obj === focus && obj.children) {\n // if object is in focus and it has children we zoom to its biggest child\n // TODO: sort children on backend\n let newobj = obj.children[0];\n for (let i = 1; i < obj.children.length; i++) {\n if (obj.children[i].sortingRank > newobj.sortingRank) {\n newobj = obj.children[i];\n }\n }\n if (newobj.children) {\n // Use the child only if it has children\n obj = newobj;\n }\n } else if (!obj.children) {\n // If node has no children use its parent instead\n obj = obj.parent;\n }\n\n zoom(obj, true);\n } else if (direction === 'out') {\n // zooming out simply goes one parent up\n obj = focus.parent;\n if (obj) {\n zoom(obj, true);\n }\n }\n\n if (focus.data.name === ROOT_OBJ_NAME) {\n $window.history.replaceState({id: 1}, \"classHierarchyPage1\", \"hierarchy#1\");\n }\n\n // redraw slider on zoom out\n sendSliderData();\n });\n\n const text = g.selectAll(\"text\")\n .data(nodes)\n .enter().append(\"text\")\n .attr(\"class\", function(d) {\n return d.children && d.children.length ? \"label\" : \"label child-label\";\n })\n .each(function(d) {\n d.textSel = d3.select(this);\n });\n\n function trimPrefixes(d) {\n const idx = d.data.name.indexOf(\":\");\n const absUriIdx = d.data.name.indexOf(\"http://\");\n if (absUriIdx > -1) {\n // if we have no prefix available ignore\n d.noPrefixName = d.data.name;\n } else if (idx > -1) {\n d.noPrefixName = d.data.name.substring(idx + 1);\n }\n }\n\n if (config.noPrefixes) {\n text.each(trimPrefixes);\n text\n .style(\"font-size\", function(d) {\n return D3.Text.calcFontSize(d.noPrefixName, d.r);\n })\n .text(function(d) {\n return D3.Text.getTextWithElipsisIfNeeded(d.noPrefixName, d.r / 3);\n });\n } else {\n text\n .style(\"font-size\", function(d) {\n return D3.Text.calcFontSize(d.data.name, d.r);\n })\n .text(function(d) {\n return D3.Text.getTextWithElipsisIfNeeded(d.data.name, d.r / 3);\n });\n }\n\n // TODO: make this use the full version (same as zoom)\n text.style(\"display\", function(d) {\n if (d.parent && d.parent.data === focus.data) {\n d.textHidden = this.textContent.indexOf(\"...\") + 3 === this.textContent.length;\n return null;\n } else {\n d.textHidden = true;\n return \"none\";\n }\n });\n\n if (config.doFade && !config.keepPrevState) {\n text.each(function(d) {\n D3.Transition.fadeIn(d3.select(this), 550);\n });\n }\n\n autoZoomToPreviousState = function() {\n function focusOnCurrentClass(focusHistoryId) {\n if (focusHistoryId) {\n circle.each(function(d) {\n if (+focusHistoryId === d.data.id) {\n doFocus(d);\n }\n });\n }\n }\n\n const focusHistoryId = $location.hash();\n\n $window.onpopstate = function(event) {\n if (event.state) {\n const focusHistoryId = event.state.id;\n focusOnCurrentClass(focusHistoryId);\n }\n };\n\n focusOnCurrentClass(focusHistoryId);\n };\n\n const node = g.selectAll(\"circle, text\");\n\n function zoomTo(v, switchPrefixes) {\n const k = diameter / v[2];\n view = v;\n\n node.attr(\"transform\", function(d) {\n return \"translate(\" + (d.x - v[0]) * k + \",\" + (d.y - v[1]) * k + \")\";\n });\n\n circle.attr(\"r\", function(d) {\n return d.r * k;\n });\n\n function switchPrefixesInPlace(d) {\n // if uris match with the topLevelParentUri of the focused element\n // or your focus is a top level parent hide its label and if it is not\n // a child element show all of its child labels. If it is a child element\n // only show its label.\n if (d.data.fullName === focus.data.topLevelParentUri || focus.data.topLevelParentUri === ROOT_OBJ_NAME) {\n d.textSel.style(\"display\", \"none\");\n if (focus.children && focus.children.length) {\n _.each(focus.children, function(c) {\n c.textSel.style(\"display\", \"inline\");\n });\n } else {\n focus.textSel.style(\"display\", \"inline\");\n }\n\n // in order to show prefixes of siblings check if the focused\n // element has a parent and show all of its children except\n // for the name of the focused element because you need to see\n // its children\n if (focus.parent) {\n _.each(focus.parent.children, function(c) {\n if (c.data.name !== focus.data.name) {\n c.textSel.style(\"display\", \"inline\");\n }\n });\n }\n }\n }\n\n if (switchPrefixes) {\n text.each(switchPrefixesInPlace);\n }\n\n text\n .style(\"font-size\", function(d) {\n if (config.noPrefixes) {\n return D3.Text.calcFontSize(d.noPrefixName, d.r * k);\n }\n return D3.Text.calcFontSize(d.data.name, d.r * k);\n })\n .text(function(d) {\n if (config.noPrefixes) {\n return D3.Text.getTextWithElipsisIfNeeded(d.noPrefixName, d.r * k / 3);\n }\n return D3.Text.getTextWithElipsisIfNeeded(d.data.name, d.r * k / 3);\n });\n }\n\n\n function adjustRadius(r) {\n let newr = r * 2 + margin;\n if (r * 2 / newr < 0.3) {\n // for very small circles we need to adjust\n newr = r * 2 + 2;\n }\n return newr;\n }\n\n zoomTo([focus.x, focus.y, adjustRadius(focus.r)], switchPrefixes);\n\n function textUpdate(d) {\n if (d.isInFocusTransitive || !(d.parent && d.parent.isInFocusTransitive)) {\n // hide labels of classes that are in focus (including children) OR whose parents aren't in focus\n d.textHidden = true;\n this.style.display = \"none\";\n } else {\n // show all other labels\n d.textHidden = this.textContent.indexOf(\"...\") + 3 === this.textContent.length;\n this.style.display = \"\";\n }\n }\n\n function zoom(d, shouldClosePanel) {\n // use empty timeout to force the following code to be executed on the next $digest cycle\n // in order to avoid '$digest in progress' error\n $timeout(function() {\n scope.showExternalElements = (d.data.name === ROOT_OBJ_NAME);\n });\n\n if (focus === d) {\n // Node is already zoomed to\n // Important to return before we modify the history, otherwise we choke the browser\n return;\n }\n\n if (d.data.id) {\n $window.history.replaceState({id: d.data.id}, \"classHierarchyPage\" + d.data.id, \"hierarchy#\" + d.data.id);\n }\n\n if (!d.children) {\n // No children - zoom to parent instead\n d = d.parent;\n if (focus === d) {\n // Parent is already zoomed to\n return;\n }\n }\n\n if (shouldClosePanel) {\n closeClassInfoPanel();\n d3.selectAll(\".selected\").classed(\"selected\", false);\n }\n\n if (focus.parent) {\n let p = focus;\n while (p) {\n p.isInFocusTransitive = false;\n p = p.parent;\n }\n }\n\n let p = d;\n while (p) {\n p.isInFocusTransitive = !!p.children;\n p = p.parent;\n }\n\n focus = d;\n\n const isVerySmallCircle = focus.r * 2 / (focus.r * 2 + margin) < 0.3;\n\n if (isVerySmallCircle || scope.currentSliderValue > scope.currentBrowserLimit) {\n // no fancy animation for slower browsers if above the limit or if zooming to a very small circle\n zoomTo([focus.x, focus.y, adjustRadius(focus.r)]);\n\n text.each(function(d) {\n textUpdate.call(this, d);\n });\n } else {\n // the fancy version for faster browsers\n const transition = d3.transition()\n .duration(ZOOM_DURATION)\n .tween(\"zoom\", function(d) {\n const i = d3.interpolateZoom(view, [focus.x, focus.y, adjustRadius(focus.r)]);\n return function(t) {\n zoomTo(i(t));\n };\n });\n\n transition.selectAll(\"text\")\n // Experimental: hide texts to be hidden on \"start\", show texts to be shown on \"end\"\n .each(textUpdate);\n }\n }\n\n rootFocusEvent = scope.$on('rootFocus', function() {\n $window.history.pushState({id: 1}, \"classHierarchyPage1\", \"hierarchy#1\");\n doFocus(rootHierarchy);\n });\n\n classSearchEvent = scope.$on('classSearch', function(selectedClass) {\n doFocus(selectedClass);\n });\n }\n\n function sendSliderData() {\n const currentClassCount = scope.classHierarchyData.classCount;\n let currentSliderValue = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);\n\n if (!currentSliderValue || currentSliderValue > currentClassCount) {\n currentSliderValue = currentClassCount;\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE, currentSliderValue);\n }\n\n $rootScope.$broadcast(\"classCount\", currentClassCount, currentSliderValue);\n }\n\n window.addEventListener('resize', sendSliderData);\n\n window.addEventListener('beforeunload', removeResizeListener);\n\n function removeResizeListener() {\n window.removeEventListener('resize', sendSliderData);\n window.removeEventListener('beforeunload', removeResizeListener);\n }\n\n let prefixesWatch;\n let currentClassCountWatch;\n let searchedClassBroadcast;\n let onEnterClassSearchBroadcast;\n\n scope.$watch('classHierarchyData', function() {\n // when data changes unregister watchers by calling them\n if (prefixesWatch) prefixesWatch();\n if (currentClassCountWatch) currentClassCountWatch();\n if (searchedClassBroadcast) searchedClassBroadcast();\n if (onEnterClassSearchBroadcast) onEnterClassSearchBroadcast();\n\n // get initial state of prefixes (hidden or not) when changing repositories\n // in order to avoid triggering an unwanted prefixes watch\n let initialPrefixesState = getPrefixesState();\n\n if (scope.classHierarchyData.classCount) {\n sendSliderData();\n\n const rootData = structuredClone(scope.classHierarchyData);\n\n const root = d3.hierarchy(rootData);\n\n function sortRoot(root) {\n // add all classes to a flat array, add parent information\n // and sort according to instancesCount DESC, depth ASC\n\n return root.descendants()\n .sort(function(a, b) {\n if (a.data.sortingRank > b.data.sortingRank) {\n return -1;\n } else if (a.data.sortingRank < b.data.sortingRank) {\n return 1;\n } else if (a.data.depth > b.data.depth) {\n return 1;\n } else if (a.data.depth < b.data.depth) {\n return -1;\n } else {\n return 0;\n }\n });\n }\n\n const sortedChildren = sortRoot(root);\n\n // we start with an empty new rootData\n let filteredRootData;\n let noPrefixesGlobal;\n\n\n function restoreDiagramState(currentRootData, switchPrefixes) {\n const prefixesConfig = {\n keepPrevState: true,\n noPrefixes: getPrefixesState(),\n };\n\n // get noPrefixes flag from drawDiagram configuration params\n noPrefixesGlobal = prefixesConfig.noPrefixes;\n\n if (filteredRootData) {\n drawDiagram(filteredRootData, prefixesConfig, focus, true);\n } else {\n drawDiagram(currentRootData, prefixesConfig, focus, true);\n }\n\n $timeout(() => {\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_SWITCH_PREFIXES, switchPrefixes);\n autoZoomToPreviousState();\n // Need to set this to false to enable the info panel to work when selecting a class.\n // The panel opening will be suppressed only when the prefixes are toggled.\n suppressPanelOpen = false;\n }, 70);\n }\n\n function redrawFilteredDiagram(currentSliderValue, sortedChildrenArray, useSlider) {\n if (!currentSliderValue) {\n return;\n }\n\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE, currentSliderValue);\n\n filteredRootData = {\n name: ROOT_OBJ_NAME,\n children: [],\n };\n\n // walk through the given count of (sortedChildrenArray) classes\n // - record the id of each class we've seen\n // - add the rootData level classes to the new rootData\n const addedIds = new Set();\n for (let k = 1; k <= currentSliderValue; k++) {\n addedIds.add(sortedChildrenArray[k].data.id);\n if (sortedChildrenArray[k].parent === sortedChildrenArray[0]) { // i.e. the parent is the \"class hierarchy\"\n filteredRootData.children.push(sortedChildrenArray[k].data);\n }\n }\n\n // walk through all the classes in the new rootData and only keep those that have an \"added id\"\n // we create separate copies of the arrays in order not to contaminate the original data\n // we also copy each class's object ($.extend ...) for the same reason\n function fixChildren(node) {\n if (!node.children) {\n return;\n }\n const newChildren = [];\n for (const child of node.children) {\n if (addedIds.has(child.id)) {\n newChildren.push($.extend({}, child));\n }\n }\n node.children = newChildren;\n for (const child of node.children) {\n fixChildren(child);\n }\n }\n\n fixChildren(filteredRootData);\n\n if (useSlider) {\n // redraw diagram when slider value changes and persist current state\n // in local storage\n noPrefixesGlobal = angular.isUndefined(noPrefixesGlobal) ? getPrefixesState() : noPrefixesGlobal;\n const redrawConfig = {\n noPrefixes: noPrefixesGlobal,\n };\n drawDiagram(filteredRootData, redrawConfig);\n } else {\n // if the user returns to the diagram with back browser button\n // read the saved state (show/hide prefixes, current slider value)\n // from local storage and render the diagram according to the saved metrics\n restoreDiagramState(rootData);\n }\n }\n\n const currentSliderValue = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);\n if (currentSliderValue) {\n redrawFilteredDiagram(currentSliderValue, sortedChildren);\n } else {\n const basicConfig = {\n doFade: true,\n keepPrevState: true,\n noPrefixes: getPrefixesState(),\n };\n drawDiagram(rootData, basicConfig);\n autoZoomToPreviousState();\n }\n\n prefixesWatch = scope.$watch('hidePrefixes', function(hidePrefixes) {\n if (angular.isUndefined(hidePrefixes) || initialPrefixesState) {\n initialPrefixesState = undefined;\n return;\n }\n // if digest overflows a possible fix might be wrapping this in $timeout\n $timeout(function() {\n suppressPanelOpen = true;\n savePrefixesState(hidePrefixes);\n restoreDiagramState(rootData, true);\n }, 50);\n }, true);\n\n currentClassCountWatch = scope.$watch('currentSliderValue', function(currentSliderValue) {\n redrawFilteredDiagram(currentSliderValue, sortedChildren, true);\n }, true);\n\n // we handle this event for the cases where we already have searched for a given class and\n // hit enter again on the already selected class in order again react and zoom to it again\n // if we are not at the moment\n let currentSearchedClass;\n onEnterClassSearchBroadcast = scope.$on('onEnterKeypressSearchAction', function(event) {\n if (currentSearchedClass) {\n doFocus(currentSearchedClass);\n }\n });\n\n searchedClassBroadcast = scope.$on('searchedClass', function(event, searchedClass) {\n currentSearchedClass = flattenedClassData[searchedClass.name];\n if (currentSearchedClass) {\n doFocus(currentSearchedClass);\n }\n });\n }\n }, true);\n }\n}\n"],"names":["CirclePacking","SingleChild","addPlaceholders","node","first","children","i","length","placeholderSize","size","push","name","removePlaceholders","nodes","data","splice","centerNodes","offset","x","reposition","makePositionsRelativeToZero","offsetX","offsetY","y","d3","selectAll","SVG","Export","getCSSRules","cssSourceFilePath","cssRules","$","sheet","rules","cssStr","_","each","value","cssText","generateBase64ImageSource","svgSelectorClass","exportSvg","attr","parentNode","innerHTML","btoa","unescape","encodeURIComponent","classHierarchyDirective","$rootScope","$location","GraphDataRestService","$window","$timeout","$repositories","toastr","ZOOM_DURATION","ROOT_OBJ_NAME","LocalStorageAdapter","LSKeys","$translate","restrict","template","scope","classHierarchyData","flattenedClassNames","selectedClass","currentSliderValue","showClassInfoPanel","showExternalElements","hidePrefixes","currentBrowserLimit","link","element","attrs","suppressPanelOpen","tip","rootHierarchy","packLayout","diameter","color","domain","range","interpolate","svg","insert","on","appendMainGroup","append","id","transform","getPrefixesState","get","CLASS_HIERARCHY_HIDE_PREFIXES","prepareForSVGImageExport","style","imgSrc","this","href","download","getActiveRepository","g","hasData","classCount","canUseRepo","isSystemRepository","autoZoomToPreviousState","doFocus","focus","rootFocusEvent","classSearchEvent","service","LicenseContextService","onLicenseChanged","license","valid","loader","hierarchyError","selGraphFromCache","getClassHierarchyData","contextID","uri","success","response","status","warning","instant","error","getError","fetchClassHierarchy","flattenedClassData","drawDiagram","root","config","newFocus","switchPrefixes","remove","sum","d","descendants","view","isInFocusTransitive","d3tip","customPosition","event","top","bottom","innerHeight","clientY","right","innerWidth","clientX","html","call","circleGroup","enter","doFade","D3","Transition","fadeIn","circle","role","depth","key","classed","noPrefixes","textHidden","show","hide","zoom","getCurrentClassDataAndMarkSelected","obj","selected","closeClassInfoPanel","uniqBy","clickCancel","Click","delayDblClick","$on","history","pushState","$broadcast","stopPropagation","lastTimeWheel","preventDefault","now","Date","direction","deltaY","target","__data__","parent","newobj","sortingRank","replaceState","sendSliderData","text","textSel","idx","indexOf","noPrefixName","substring","Text","calcFontSize","r","getTextWithElipsisIfNeeded","textContent","keepPrevState","focusOnCurrentClass","focusHistoryId","hash","onpopstate","state","zoomTo","v","k","fullName","topLevelParentUri","c","adjustRadius","newr","textUpdate","display","shouldClosePanel","p","duration","tween","t","currentClassCount","CLASS_HIERARCHY_CURRENT_SLIDER_VALUE","set","prefixesWatch","currentClassCountWatch","searchedClassBroadcast","onEnterClassSearchBroadcast","window","addEventListener","removeResizeListener","removeEventListener","$watch","initialPrefixesState","rootData","structuredClone","sortedChildren","sort","a","b","filteredRootData","noPrefixesGlobal","restoreDiagramState","currentRootData","prefixesConfig","CLASS_HIERARCHY_SWITCH_PREFIXES","redrawFilteredDiagram","sortedChildrenArray","useSlider","addedIds","Set","add","fixChildren","newChildren","child","has","extend","angular","isUndefined","basicConfig","currentSearchedClass","undefined","savePrefixesState","searchedClass","renderCirclePacking","module","constant","directive","$inject"],"ignoreList":[],"sourceRoot":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for cookie options used in the CookieBuilder class.
|
|
3
|
+
*/
|
|
4
|
+
export interface CookieOptions {
|
|
5
|
+
/** Number of days until the cookie expires. Max supported by browsers is 400 days (or less depending on the browser). If omitted this is a session cookie. */
|
|
6
|
+
expiration?: number;
|
|
7
|
+
/** The URL path that must exist for the cookie to be sent. Defaults to '/'. */
|
|
8
|
+
path?: string;
|
|
9
|
+
/** The domain the cookie is accessible from. */
|
|
10
|
+
domain?: string;
|
|
11
|
+
/** If `true`, the cookie will only be sent over HTTPS. */
|
|
12
|
+
secure?: boolean;
|
|
13
|
+
/** If `true`, the cookie cannot be accessed via JavaScript. */
|
|
14
|
+
httpOnly?: boolean;
|
|
15
|
+
/** SameSite cookie attribute ('Strict', 'Lax', 'None'). */
|
|
16
|
+
sameSite?: string;
|
|
17
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from './cookie-options';
|
|
@@ -2,6 +2,7 @@ import { Model } from '../common';
|
|
|
2
2
|
import { AuthorityList } from './authorization/authority-list';
|
|
3
3
|
import { AppSettings } from '../users/app-settings';
|
|
4
4
|
import { User } from '../users/user';
|
|
5
|
+
import { CookieConsent } from '../tracking';
|
|
5
6
|
/**
|
|
6
7
|
* Represents an authenticated user in the system
|
|
7
8
|
*/
|
|
@@ -24,6 +25,7 @@ export declare class AuthenticatedUser extends Model<AuthenticatedUser> {
|
|
|
24
25
|
*/
|
|
25
26
|
static fromUser(user: User): AuthenticatedUser;
|
|
26
27
|
constructor(data?: Partial<AuthenticatedUser>);
|
|
28
|
+
getCookieConsent(): CookieConsent | undefined;
|
|
27
29
|
setAuthorities(authorityList?: AuthorityList): this;
|
|
28
30
|
setAppSettings(appSettings?: AppSettings): this;
|
|
29
31
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents the user's consent for various types of cookies.
|
|
3
|
+
*/
|
|
4
|
+
export declare class CookieConsent {
|
|
5
|
+
/** Indicates whether the cookie policy has been accepted. */
|
|
6
|
+
policyAccepted?: boolean;
|
|
7
|
+
/** Indicates consent for statistical cookies. */
|
|
8
|
+
statistic?: boolean;
|
|
9
|
+
/** Indicates consent for third-party cookies. */
|
|
10
|
+
thirdParty?: boolean;
|
|
11
|
+
/** Epoch timestamp of last update in seconds. */
|
|
12
|
+
updatedAt?: number;
|
|
13
|
+
constructor(data?: Partial<CookieConsent>);
|
|
14
|
+
/**
|
|
15
|
+
* Checks if the cookie consent status has been explicitly set by the user.
|
|
16
|
+
* @return true if the policyAccepted property is defined, false otherwise.
|
|
17
|
+
*/
|
|
18
|
+
hasChanged(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Predefined default: policy not accepted, but statistic and third-party cookies are allowed.
|
|
21
|
+
* Equivalent to: new CookieConsent(undefined, true, true)
|
|
22
|
+
* @return A new CookieConsent instance with policyAccepted undefined, statistic true, and thirdParty true.
|
|
23
|
+
*/
|
|
24
|
+
static NOT_ACCEPTED_WITH_TRACKING(): CookieConsent;
|
|
25
|
+
/**
|
|
26
|
+
* Predefined default: policy accepted, no statistic or third-party cookies allowed.
|
|
27
|
+
* Equivalent to: new CookieConsent(true, false, false)
|
|
28
|
+
* @return A new CookieConsent instance with policyAccepted true, statistic false, and thirdParty false.
|
|
29
|
+
*/
|
|
30
|
+
static ACCEPTED_NO_TRACKING(): CookieConsent;
|
|
31
|
+
/**
|
|
32
|
+
* Creates a CookieConsent instance from a JSON object.
|
|
33
|
+
* If values are missing in the JSON object, they will remain undefined.
|
|
34
|
+
*
|
|
35
|
+
* @param json - The JSON object to initialize the CookieConsent instance.
|
|
36
|
+
* @return A new CookieConsent instance with values set from the JSON object.
|
|
37
|
+
*/
|
|
38
|
+
static fromJSON(json: Partial<CookieConsent>): CookieConsent;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CookieConsent } from './cookie-consent';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CookieConsent } from '../
|
|
1
|
+
import { CookieConsent } from '../tracking';
|
|
2
2
|
/**
|
|
3
3
|
* Represents application settings for a user.
|
|
4
4
|
*/
|
|
@@ -8,7 +8,7 @@ export declare class AppSettings {
|
|
|
8
8
|
DEFAULT_SAMEAS: boolean;
|
|
9
9
|
IGNORE_SHARED_QUERIES: boolean;
|
|
10
10
|
EXECUTE_COUNT: boolean;
|
|
11
|
-
COOKIE_CONSENT?:
|
|
11
|
+
COOKIE_CONSENT?: CookieConsent;
|
|
12
12
|
constructor(data?: Partial<AppSettings>);
|
|
13
13
|
/**
|
|
14
14
|
* Converts the AppSettings instance to a POJO.
|
|
@@ -10,6 +10,7 @@ export * from './models/product-info';
|
|
|
10
10
|
export * from './models/storage';
|
|
11
11
|
export * from './models/language';
|
|
12
12
|
export * from './models/cookie';
|
|
13
|
+
export * from './models/tracking';
|
|
13
14
|
export * from './models/monitoring';
|
|
14
15
|
export * from './models/toastr';
|
|
15
16
|
export * from './models/rdf-search';
|
|
@@ -37,6 +38,7 @@ export * from './services/storage';
|
|
|
37
38
|
export * from './services/security';
|
|
38
39
|
export * from './services/event-service';
|
|
39
40
|
export * from './services/cookie';
|
|
41
|
+
export * from './services/tracking';
|
|
40
42
|
export * from './services/monitoring';
|
|
41
43
|
export * from './services/toastr';
|
|
42
44
|
export * from './services/autocomplete';
|
|
@@ -57,4 +59,4 @@ export * from './interceptor';
|
|
|
57
59
|
export * from './services/utils';
|
|
58
60
|
export * from './error';
|
|
59
61
|
export { HTTP_REQUEST_DONE_EVENT } from './services/http/http.service';
|
|
60
|
-
export { COOKIE_CONSENT_CHANGED_EVENT } from './services/
|
|
62
|
+
export { COOKIE_CONSENT_CHANGED_EVENT } from './services/tracking/tracking.service';
|