graphdb-workbench 3.5.0-TR8 → 3.5.0-TR9
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/17487.e23998d0953518a9258e.bundle.js +2 -0
- package/dist/17487.e23998d0953518a9258e.bundle.js.map +1 -0
- package/dist/{21156.ac45edf4d4aac855fedf.bundle.js → 21156.63548683f637e0115466.bundle.js} +2 -2
- package/dist/21156.63548683f637e0115466.bundle.js.map +1 -0
- package/dist/43239.b39579736b18d118a4ed.bundle.js +2 -0
- package/dist/43239.b39579736b18d118a4ed.bundle.js.map +1 -0
- package/dist/{44906.3d40209be900c399a67d.bundle.js → 44906.e904c90b4fa1be47a171.bundle.js} +2 -2
- package/dist/44906.e904c90b4fa1be47a171.bundle.js.map +1 -0
- package/dist/{64709.40854e00ee2fd5886e0b.bundle.js → 64709.bb56d27e07c6644dbbec.bundle.js} +2 -2
- package/dist/{64709.40854e00ee2fd5886e0b.bundle.js.map → 64709.bb56d27e07c6644dbbec.bundle.js.map} +1 -1
- package/dist/{65677.874fa9da2b408067729f.bundle.js → 65677.e5ebee847f631b3a4c84.bundle.js} +2 -2
- package/dist/{65677.874fa9da2b408067729f.bundle.js.map → 65677.e5ebee847f631b3a4c84.bundle.js.map} +1 -1
- package/dist/{66574.d0f77e4d4b7bc6e38e8b.bundle.js → 66574.5c29ec83dcde35bec1ff.bundle.js} +2 -2
- package/dist/66574.5c29ec83dcde35bec1ff.bundle.js.map +1 -0
- package/dist/{80933.61966a88f32ee2ba8e9a.bundle.js → 80933.f6a2d16cbc1dbdaf41f5.bundle.js} +2 -2
- package/dist/{80933.61966a88f32ee2ba8e9a.bundle.js.map → 80933.f6a2d16cbc1dbdaf41f5.bundle.js.map} +1 -1
- package/dist/{82917.80da0c265a0ab6345204.bundle.js → 82917.700281c4cd83c28f4e92.bundle.js} +2 -2
- package/dist/{82917.80da0c265a0ab6345204.bundle.js.map → 82917.700281c4cd83c28f4e92.bundle.js.map} +1 -1
- package/dist/{86099.91a638f3ab3a23eac370.bundle.js → 86099.7d2d0fd3ec8766530f5f.bundle.js} +2 -2
- package/dist/{86099.91a638f3ab3a23eac370.bundle.js.map → 86099.7d2d0fd3ec8766530f5f.bundle.js.map} +1 -1
- package/dist/api/ontotext-workbench-api.js +1 -1
- package/dist/api/ontotext-workbench-api.js.map +1 -1
- package/dist/api/services/domain/guides/guide-context.service.d.ts +27 -0
- package/dist/api/services/domain/guides/shepherd.service.d.ts +7 -4
- package/dist/api/services/user-preferences/user-preferences.service.d.ts +32 -22
- package/dist/i18n/locale-en.json +3 -1
- package/dist/i18n/locale-fr.json +2 -0
- 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 +2 -2
- package/dist/js/angular/security/templates/users.html +1 -1
- 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.d5a98059880321391ecf.js +3 -0
- package/dist/{legacyWorkbench.77e52518db7c72ea2e54.js.map → legacyWorkbench.d5a98059880321391ecf.js.map} +1 -1
- package/dist/{main.f7ee292bd47afd05f886.js → main.47ecea8b624a1eb4f5d9.js} +3 -3
- package/dist/{main.f7ee292bd47afd05f886.js.map → main.47ecea8b624a1eb4f5d9.js.map} +1 -1
- 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/onto-layout.cjs.entry.js +1 -1
- package/dist/shared-components/collection/components/onto-layout/onto-layout.js +1 -1
- package/dist/shared-components/esm/onto-layout.entry.js +1 -1
- package/dist/shared-components/shared-components/p-51caf191.entry.js +1 -0
- package/dist/shared-components/shared-components/shared-components.esm.js +1 -1
- package/dist/shared-components/types/components/onto-layout/onto-layout.d.ts +3 -1
- package/package.json +1 -1
- package/dist/17487.7d7f5b22d4aac72fdaa9.bundle.js +0 -2
- package/dist/17487.7d7f5b22d4aac72fdaa9.bundle.js.map +0 -1
- package/dist/21156.ac45edf4d4aac855fedf.bundle.js.map +0 -1
- package/dist/43239.71707ff04a220130d250.bundle.js +0 -2
- package/dist/43239.71707ff04a220130d250.bundle.js.map +0 -1
- package/dist/44906.3d40209be900c399a67d.bundle.js.map +0 -1
- package/dist/66574.d0f77e4d4b7bc6e38e8b.bundle.js.map +0 -1
- package/dist/legacyWorkbench.77e52518db7c72ea2e54.js +0 -3
- package/dist/shared-components/shared-components/p-23d30101.entry.js +0 -1
- /package/dist/{legacyWorkbench.77e52518db7c72ea2e54.js.LICENSE.txt → legacyWorkbench.d5a98059880321391ecf.js.LICENSE.txt} +0 -0
- /package/dist/{main.f7ee292bd47afd05f886.js.LICENSE.txt → main.47ecea8b624a1eb4f5d9.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export const __webpack_esm_id__=17487;export const __webpack_esm_ids__=[17487,27928,30581,31538,72290,82344,93370];export const __webpack_esm_modules__={30581(e,t,r){r.d(t,{s:()=>o});const o={GENERIC:"generic",MY_SQL:"mySQL",POSTGRESS:"postgreSQL",ORACLE:"oracle",MS_SQL:"msSQL",DB2:"DB2",DREMIO:"dremio",DATABRICKS:"databricks",SNOWFLAKE:"snowflake"}},27928(e,t,r){r.d(t,{L:()=>o});class o{constructor(e="generic"){this.driverType=e,this.hostName="",this.port=void 0,this.databaseName="",this.username="",this.password="",this.driverClass="",this.url="",this.urlUserInput=""}}},31538(e,t,r){r.d(t,{t:()=>a});var o=r(30581);class a{constructor(){this.classAvailable=!1,this.downloadDriverUrl="",this.driverClass="",this.driverName="",this.driverType="",this.portRequired=!1,this.urlTemplate=""}static isGenericDriver(e){return e===o.s.GENERIC}static isSnowflakeDriver(e){return e===o.s.SNOWFLAKE}}},93370(e,t,r){r.d(t,{T:()=>o});class o{constructor(e,t=!1){this.type=e,this.fileName="",this.loading=!1,this.required=t}}},72290(e,t,r){r.d(t,{x:()=>o});const o={OBDA:"obdaFile",OWL:"owlFile",CONSTRAINT:"constraintFile",LENSES:"lensesFile",DB_METADATA:"dbMetadataFile"}},82344(e,t,r){r.d(t,{L:()=>o});class o extends Error{}},17487(e,t,r){var o=r(44906),a=r(72290),n=r(27928),i=r(93370),s=r(82344),l=r(31538),p=r(30581),c=r(71315),d=r(75504);const m=c.I.logger;function f(e,t,r,c,f){return{restrict:"E",scope:!1,templateUrl:"js/angular/repositories/templates/ontop-repo.html",link:function(u){let v;u.isGenericDriver=!0,u.defaultUrlTemplate="jdbc:database://localhost:port/database_name",u.ontopProperiesLink="https://ontop-vkg.org/guide/advanced/configuration.html",u.ontopFileType=a.x,u.selectedDriver=new l.t,u.supportedDriversData=[],u.formData={connectionInformation:new n.L,settings:{additionalProperties:"",ontopFiles:[]}},u.selectDriver=e=>{u.selectedDriver=u.supportedDriversData.find(t=>t.driverType===e),u.isGenericDriver=l.t.isGenericDriver(u.selectedDriver.driverType),u.editRepoPage&&u.currentOntopRepoInfo&&u.currentOntopRepoInfo.connectionInformation.driverType===e?u.formData=_.cloneDeep(u.currentOntopRepoInfo):(C(),u.formData.connectionInformation.driverType=u.selectedDriver.driverType),u.formData.connectionInformation.driverClass=u.selectedDriver.driverClass,u.updateUrl()},u.getOntopFileInfo=e=>u.formData.settings.ontopFiles.find(t=>e===t.type),u.getHostNameLabel=()=>{const e=l.t.isSnowflakeDriver(u.selectedDriver.driverType)?"ontop.repo.database.snowflake.host_name":"ontop.repo.database.host_name";return f.instant(e)+"*"},u.getDatabaseNameLabel=()=>{let e="";switch(u.selectedDriver.driverType){case p.s.SNOWFLAKE:e="ontop.repo.database.warehouse.database_name";break;case p.s.DATABRICKS:e="ontop.repo.database.http_path.database_name";break;case p.s.DREMIO:e="ontop.repo.database.schema.database_name";break;default:e="ontop.repo.database.database_name"}return f.instant(e)},u.updateUrl=()=>{const e=h()||"";u.formData.connectionInformation.url=e+u.formData.connectionInformation.urlUserInput},u.isTestConnectionDisabled=()=>{const e=u.formData.connectionInformation,t=u.selectedDriver;return!(e.driverClass&&e.url&&(!t.portRequired||e.port)&&(l.t.isGenericDriver(t.driverType)||e.hostName&&e.databaseName))},u.testConnection=()=>{w().then(O).then(T).then(L).then(P).then(b).then(()=>t.validateOntopPropertiesConnection(u.repositoryInfo)).then(()=>r.success(f.instant("ontop.repo.successful.connection.msg"))).catch(e=>{e instanceof s.L?r.error(e.message):N(f.instant("ontop.repo.failed.to.connect"),e)})},u.editFile=r=>{const a=u.repositoryInfo.params[r.type].label,n=f.instant("update.file.edit.content.header",{fileName:a});e.open({templateUrl:"js/angular/templates/modal/editRepoFile.html",controller:"EditRepositoryFileCtrl",windowClass:"update-ontop-repo-dialog",resolve:{file:()=>{const e=u.repositoryInfo.params[r.type];return e?e.value:""},dialogTitle:()=>n,repositoryReference:()=>v}}).result.then(e=>{t.updateRepositoryFileContent(e.fileLocation,e.content,v).success(e=>{r.fileName=(0,o.W)(e.fileLocation),u.repositoryInfo.params[r.type].value=e.fileLocation}).error(e=>{N(f.instant("common.error"),e)})})},u.uploadOntopFile=(e,t)=>{if(e&&e.length){const o=e[0];t.loading=!0;const a={url:"rest/repositories/file/upload",data:{file:o,location:v?.location,repositoryID:v?.id}};c.upload(a).success(e=>{e.success?(t.fileName=o.name,u.repositoryInfo.params[t.type].value=e.fileLocation):r.error(e.errorMessage)}).error(e=>{N(f.instant("common.error"),e),u.uploadFile=""}).finally(()=>{t.loading=!1})}},u.updateOntopRepo=()=>{const e=u.editRepoPage?u.editRepository:u.createRepo;R().then(w).then(O).then(T).then(L).then(P).then(F).then(b).then(e).catch(e=>{e instanceof s.L?r.error(e.message):m.info(e)})},u.onKeyDownInUrlInput=e=>{const t=e.keyCode;if(37===t||39===t||36===t||35===t)return;const r=h();if(!r)return;const o=e.ctrlKey||e.metaKey;if(o&&65===t||o&&67===t)return;const a=e.target.selectionStart;8===t&&a-1<r.length&&(e.preventDefault(),e.stopPropagation()),a<r.length&&(e.preventDefault(),e.stopPropagation())},u.onKeyUpInUrlInput=()=>{D()};const D=()=>{const e=h();e&&u.formData.connectionInformation.url.startsWith(e)?u.formData.connectionInformation.urlUserInput=u.formData.connectionInformation.url.substring(e.length):u.formData.connectionInformation.urlUserInput=u.formData.connectionInformation.url},h=()=>l.t.isSnowflakeDriver(u.selectedDriver.driverType)?I():g(),I=()=>{let e=u.selectedDriver.urlTemplate;const t=u.formData.connectionInformation;return t.hostName&&(e=e.replace("{identifier}",t.hostName)),t.port&&(e=e.replace(".snowflakecomputing.com/?",`.snowflakecomputing.com:${t.port}/?`)),t.databaseName&&(e=e.replace("{database}",t.databaseName)),e},g=()=>{let e=u.selectedDriver.urlTemplate;const t=u.formData.connectionInformation;return t.hostName&&(e=t.port?e.replace("{hostport}",`${t.hostName}:${t.port}`):e.replace("{hostport}",`${t.hostName}`)),t.databaseName&&(e=e.replace("{database}",t.databaseName)),e},y=e=>{u.formData.settings.ontopFiles.forEach(t=>{t.loading=e})},b=()=>{y(!0);const e=u.formData.connectionInformation,r={hostName:e.hostName,port:e.port,databaseName:e.databaseName,userName:e.username,password:e.password,driverClass:e.driverClass,url:e.url,additionalProperties:u.formData.settings.additionalProperties};return t.updatePropertiesFile(u.repositoryInfo.params.propertiesFile.value,r,v,u.selectedDriver.driverType).success(e=>{u.repositoryInfo.params.propertiesFile.value=e.fileLocation}).error(e=>{N(f.instant("common.error"),e)}).finally(()=>y(!1))},N=(e,t)=>{const o=getError(t);r.error(o,e)},w=()=>l.t.isGenericDriver(u.selectedDriver.driverType)||u.formData.connectionInformation.hostName?Promise.resolve():Promise.reject(new s.L(f.instant("missing.required.field",{fieldName:f.instant("ontop.repo.database.host_name")}))),T=()=>l.t.isGenericDriver(u.selectedDriver.driverType)||u.formData.connectionInformation.databaseName?Promise.resolve():Promise.reject(new s.L(f.instant("missing.required.field",{fieldName:f.instant("ontop.repo.database.database_name")}))),L=()=>u.formData.connectionInformation.driverClass?Promise.resolve():Promise.reject(new s.L(f.instant("missing.required.field",{fieldName:f.instant("ontop.repo.database.driver_class")}))),P=()=>u.formData.connectionInformation.url?Promise.resolve():Promise.reject(new s.L(f.instant("missing.required.field",{fieldName:f.instant("ontop.repo.database.url")}))),R=()=>u.repositoryInfo.id?Promise.resolve():Promise.reject(new s.L(f.instant("empty.repoid.warning"))),F=()=>u.getOntopFileInfo(a.x.OBDA).fileName?Promise.resolve():Promise.reject(new s.L(f.instant("ontop.repo.missing.required.file",{fileName:u.repositoryInfo.params[a.x.OBDA].label}))),O=()=>u.selectedDriver.portRequired&&!u.formData.connectionInformation.port?Promise.reject(new s.L(f.instant("missing.required.field",{fieldName:f.instant("ontop.repo.database.port")}))):Promise.resolve(),C=()=>{u.formData={connectionInformation:new n.L,settings:{additionalProperties:"",ontopFiles:[]}},Object.values(a.x).forEach(e=>{const t=new i.T(e);u.formData.settings.ontopFiles.push(t)}),u.getOntopFileInfo(a.x.OBDA).required=!0};v=(e=>{if(u.editRepoPage)return new d.EO(e.id,e.location)})(u.repositoryInfo),t.getSupportedDriversData(u.repositoryInfo).success(e=>{u.supportedDriversData=e}).error(e=>{N(f.instant("common.error"),e)}).then(()=>{u.editRepoPage?(y(!0),t.loadPropertiesFile(u.repositoryInfo.params.propertiesFile.value,v,u.selectedDriver.driverType).success(e=>{let t=u.supportedDriversData.find(t=>t.driverClass===e.driverClass);t&&e.hostName||(t=u.supportedDriversData.find(e=>l.t.isGenericDriver(e.driverType))),u.selectDriver(t.driverType),u.formData.connectionInformation.driverType=t.driverType,u.formData.connectionInformation.driverClass=e.driverClass,u.formData.connectionInformation.password=e.password,u.formData.connectionInformation.username=e.userName,u.formData.connectionInformation.url=e.url,u.formData.settings.additionalProperties=e.additionalProperties,l.t.isGenericDriver(t.driverType)||(u.formData.connectionInformation.hostName=e.hostName,u.formData.connectionInformation.databaseName=e.databaseName,u.formData.connectionInformation.port=e.port?parseInt(e.port,10):void 0),D(),u.updateUrl(),Object.values(a.x).forEach(e=>{const t=u.repositoryInfo.params[e],r=u.getOntopFileInfo(e);t&&(r.fileName=(0,o.W)(t.value))}),u.currentOntopRepoInfo=_.cloneDeep(u.formData)}).error(e=>{N(f.instant("common.error"),e)}).finally(()=>{y(!1)})):u.selectDriver(p.s.GENERIC)})}}}angular.module("graphdb.framework.repositories.ontop-repo.directive",[]).directive("ontopRepo",f),f.$inject=["$uibModal","RepositoriesRestService","toastr","Upload","$translate"]}};
|
|
2
|
+
//# sourceMappingURL=17487.e23998d0953518a9258e.bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"17487.e23998d0953518a9258e.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/models/ontop/jdbc-driver-type.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/ontop/ontop-connection-information.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/ontop/ontop-driver-data.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/ontop/ontop-file-info.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/ontop/ontop-file-type.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/ontop/ontop-repository-error.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/repositories/ontop-repo.directive.js"],"sourcesContent":["export const JdbcDriverType = {\n 'GENERIC': 'generic',\n 'MY_SQL': 'mySQL',\n 'POSTGRESS': 'postgreSQL',\n 'ORACLE': 'oracle',\n 'MS_SQL': 'msSQL',\n 'DB2': 'DB2',\n 'DREMIO': 'dremio',\n 'DATABRICKS': 'databricks',\n 'SNOWFLAKE': 'snowflake'\n};\n","export class OntopConnectionInformation {\n constructor(driverType = 'generic') {\n this.driverType = driverType;\n this.hostName = '';\n this.port = undefined;\n this.databaseName = '';\n this.username = '';\n this.password = '';\n this.driverClass = '';\n this.url = '';\n this.urlUserInput = '';\n }\n}\n","import {JdbcDriverType} from \"./jdbc-driver-type\";\n\nexport class OntopDriverData {\n constructor() {\n this.classAvailable = false;\n this.downloadDriverUrl = '';\n this.driverClass = '';\n this.driverName = '';\n this.driverType = '';\n this.portRequired = false;\n this.urlTemplate = '';\n }\n\n static isGenericDriver(type) {\n return type === JdbcDriverType.GENERIC;\n }\n\n static isSnowflakeDriver(type) {\n return type === JdbcDriverType.SNOWFLAKE;\n }\n}\n","export class OntopFileInfo {\n\n /**\n * Initializes ontop file info object.\n * @param {string} type - the type of ontop file. It's value have to be one of {@link OntopFileType};\n * @param {boolean} required - true if file is required.\n */\n constructor(type, required = false) {\n this.type = type;\n this.fileName = '';\n this.loading = false;\n this.required = required;\n }\n}\n","export const OntopFileType = {\n 'OBDA': 'obdaFile',\n 'OWL': 'owlFile',\n 'CONSTRAINT': 'constraintFile',\n 'LENSES': 'lensesFile',\n 'DB_METADATA': 'dbMetadataFile'\n};\n","export class OntopRepositoryError extends Error {\n}\n","import {getFileName} from \"./controllers\";\nimport {OntopFileType} from \"../models/ontop/ontop-file-type\";\nimport {OntopConnectionInformation} from \"../models/ontop/ontop-connection-information\";\nimport {OntopFileInfo} from \"../models/ontop/ontop-file-info\";\nimport {OntopRepositoryError} from \"../models/ontop/ontop-repository-error\";\nimport {OntopDriverData} from \"../models/ontop/ontop-driver-data\";\nimport {JdbcDriverType} from \"../models/ontop/jdbc-driver-type\";\nimport {LoggerProvider} from \"../core/services/logger-provider\";\nimport {RepositoryReference} from '../models/repository/repository';\n\nconst logger = LoggerProvider.logger;\n// A link to Ontop's website with all Ontop configuration keys\nconst ONTOP_PROPERTIES_LINK = 'https://ontop-vkg.org/guide/advanced/configuration.html';\n\nangular\n .module('graphdb.framework.repositories.ontop-repo.directive', [])\n .directive('ontopRepo', ontopRepoDirective);\n\nontopRepoDirective.$inject = ['$uibModal', 'RepositoriesRestService', 'toastr', 'Upload', '$translate'];\n\nfunction ontopRepoDirective($uibModal, RepositoriesRestService, toastr, Upload, $translate) {\n return {\n restrict: 'E',\n scope: false,\n templateUrl: 'js/angular/repositories/templates/ontop-repo.html',\n\n link: linkFunc,\n };\n\n function linkFunc($scope) {\n const HOME_KEY = 36;\n const END_KEY = 35;\n const LEFT_ARROW = 37;\n const RIGHT_ARROW = 39;\n const BACKSPACE = 8;\n const KEY_C = 67;\n const KEY_A = 65;\n /**\n * A reference to the otnop repository when the form was initialized.\n * It preserves access to the initial repository object while `$scope.repositoryInfo`\n * may be replaced or modified by the form.\n * @type {RepositoryReference|undefined}\n */\n let repositoryReference = undefined;\n $scope.isGenericDriver = true;\n $scope.defaultUrlTemplate = 'jdbc:database://localhost:port/database_name';\n $scope.ontopProperiesLink = ONTOP_PROPERTIES_LINK;\n $scope.ontopFileType = OntopFileType;\n\n /**\n * Holds reference to selected driver.\n *\n * @type {OntopDriverData}\n */\n $scope.selectedDriver = new OntopDriverData();\n\n /**\n * Holds all supported jdbc drivers.\n * @type {OntopDriverData[]}\n */\n $scope.supportedDriversData = [];\n $scope.formData = {\n connectionInformation: new OntopConnectionInformation(),\n settings: {\n additionalProperties: '',\n /**\n * Holds information about repository files.\n */\n ontopFiles: [],\n },\n };\n\n // =========================\n\n /**\n * Changes selected driver and updates url field.\n * @param {string} driverType - the type of driver.\n */\n $scope.selectDriver = (driverType) => {\n $scope.selectedDriver = $scope.supportedDriversData.find((driver) => driver.driverType === driverType);\n $scope.isGenericDriver = OntopDriverData.isGenericDriver($scope.selectedDriver.driverType);\n if ($scope.editRepoPage && $scope.currentOntopRepoInfo && $scope.currentOntopRepoInfo.connectionInformation.driverType === driverType) {\n $scope.formData = _.cloneDeep($scope.currentOntopRepoInfo);\n } else {\n clearFormData();\n $scope.formData.connectionInformation.driverType = $scope.selectedDriver.driverType;\n }\n $scope.formData.connectionInformation.driverClass = $scope.selectedDriver.driverClass;\n $scope.updateUrl();\n };\n\n /**\n * Finds ontop file depends on file type <code>ontopFileType</code>\n * @param {OntopFileType} ontopFileType - the type of searched ontop file.\n * @return {OntopFileInfo} found ontop file.\n */\n $scope.getOntopFileInfo = (ontopFileType) => {\n return $scope.formData.settings.ontopFiles.find((ontopFileInfo) => ontopFileType === ontopFileInfo.type);\n };\n\n $scope.getHostNameLabel = () => {\n const hostNameLabel = OntopDriverData.isSnowflakeDriver($scope.selectedDriver.driverType) ? 'ontop.repo.database.snowflake.host_name' : 'ontop.repo.database.host_name';\n return $translate.instant(hostNameLabel) + '*';\n };\n\n $scope.getDatabaseNameLabel = () => {\n let dataBaseNameLabelKey = '';\n switch ($scope.selectedDriver.driverType) {\n case JdbcDriverType.SNOWFLAKE:\n dataBaseNameLabelKey = 'ontop.repo.database.warehouse.database_name';\n break;\n case JdbcDriverType.DATABRICKS:\n dataBaseNameLabelKey = 'ontop.repo.database.http_path.database_name';\n break;\n case JdbcDriverType.DREMIO:\n dataBaseNameLabelKey = 'ontop.repo.database.schema.database_name';\n break;\n default:\n dataBaseNameLabelKey = 'ontop.repo.database.database_name';\n }\n return $translate.instant(dataBaseNameLabelKey);\n };\n\n /**\n * Updates value of <code>$scope.formData.connectionInformation.url</code> depends on other connection information: Host name, Port...\n */\n $scope.updateUrl = () => {\n const templateUrl = calculateTemplateUrl() || '';\n $scope.formData.connectionInformation.url = templateUrl + $scope.formData.connectionInformation.urlUserInput;\n };\n\n /**\n * Checks if test connection can be executed.\n * @return {boolean} true if all needed data is filled by the user.\n */\n $scope.isTestConnectionDisabled = () => {\n const connectionInformation = $scope.formData.connectionInformation;\n const selectedDriver = $scope.selectedDriver;\n if (!connectionInformation.driverClass || !connectionInformation.url || selectedDriver.portRequired && !connectionInformation.port) {\n return true;\n }\n return !OntopDriverData.isGenericDriver(selectedDriver.driverType) && (!connectionInformation.hostName || !connectionInformation.databaseName);\n };\n\n /**\n * Performs a test connection.\n */\n $scope.testConnection = () => {\n validateHostName()\n .then(validatePort)\n .then(validateDatabaseName)\n .then(validateDriverClass)\n .then(validateUrl)\n .then(updatePropertiesFile)\n .then(() => RepositoriesRestService.validateOntopPropertiesConnection($scope.repositoryInfo))\n .then(() => toastr.success($translate.instant('ontop.repo.successful.connection.msg')))\n .catch((error) => {\n if (error instanceof OntopRepositoryError) {\n toastr.error(error.message);\n } else {\n showErrorMsg($translate.instant('ontop.repo.failed.to.connect'), error);\n }\n });\n };\n\n /**\n * Updates the file with type <code>ontopFileType</code>.\n *\n * @param {OntopFileInfo} ontopFileInfo\n */\n $scope.editFile = (ontopFileInfo) => {\n const fileName = $scope.repositoryInfo.params[ontopFileInfo.type].label;\n const title = $translate.instant('update.file.edit.content.header', {fileName});\n const modalInstance = $uibModal.open({\n templateUrl: 'js/angular/templates/modal/editRepoFile.html',\n controller: 'EditRepositoryFileCtrl',\n windowClass: 'update-ontop-repo-dialog',\n resolve: {\n file: () => {\n const ontopFile = $scope.repositoryInfo.params[ontopFileInfo.type];\n return ontopFile ? ontopFile.value : '';\n },\n dialogTitle: () => {\n return title;\n },\n repositoryReference: () => {\n return repositoryReference;\n },\n },\n });\n\n modalInstance.result.then((data) => {\n // send data to backend\n RepositoriesRestService.updateRepositoryFileContent(data.fileLocation, data.content, repositoryReference)\n .success((result) => {\n ontopFileInfo.fileName = getFileName(result.fileLocation);\n $scope.repositoryInfo.params[ontopFileInfo.type].value = result.fileLocation;\n }).error((error) => {\n showErrorMsg($translate.instant('common.error'), error);\n });\n });\n };\n\n $scope.uploadOntopFile = (files, ontopFileInfo) => {\n if (files && files.length) {\n const uploadFile = files[0];\n ontopFileInfo.loading = true;\n const uploadData = {\n url: `rest/repositories/file/upload`,\n data: {\n file: uploadFile,\n location: repositoryReference?.location,\n repositoryID: repositoryReference?.id,\n },\n };\n Upload.upload(uploadData)\n .success((data) => {\n if (!data.success) {\n toastr.error(data.errorMessage);\n } else {\n ontopFileInfo.fileName = uploadFile.name;\n $scope.repositoryInfo.params[ontopFileInfo.type].value = data.fileLocation;\n }\n })\n .error((data) => {\n showErrorMsg($translate.instant('common.error'), data);\n $scope.uploadFile = '';\n })\n .finally(() => {\n ontopFileInfo.loading = false;\n });\n }\n };\n\n $scope.updateOntopRepo = () => {\n const createOrUpdate = $scope.editRepoPage ? $scope.editRepository : $scope.createRepo;\n validateRepositoryId()\n .then(validateHostName)\n .then(validatePort)\n .then(validateDatabaseName)\n .then(validateDriverClass)\n .then(validateUrl)\n .then(validateOntopFiles)\n .then(updatePropertiesFile)\n .then(createOrUpdate)\n .catch((error) => {\n if (error instanceof OntopRepositoryError) {\n toastr.error(error.message);\n } else {\n logger.info(error);\n }\n });\n };\n\n /**\n * Some databases expect additional properties than hostname, port, database name in order to establish the connection.\n * So url is not readonly and user can modify it. Every driver instead generic one has template tha can't be changed by the user, it\n * is filled automatically when user writes hostname, port, and database name.\n *\n * This function prevent modification of driver template.\n *\n * @param {*} event - event fired by key down.\n */\n $scope.onKeyDownInUrlInput = (event) => {\n const keyCode = event.keyCode;\n // We don't prevent event if user clicked on left, right arrow, home or end key,\n // the client can move cursor without matter where the cursor is.\n if (keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW || keyCode === HOME_KEY || keyCode === END_KEY) {\n return;\n }\n\n const templateUrl = calculateTemplateUrl();\n // If templateUrl is empty this means that chosen driver is generic or user is not filled hostname, port, or database name.\n // So user can type any characters into url input.\n if (!templateUrl) {\n return;\n }\n\n // Allows user to select all and copy the url value regardless that cursor position is in url template area.\n // event.metaKey -> Mac support\n const ctrlDown = event.ctrlKey || event.metaKey;\n if (ctrlDown && KEY_A === keyCode || ctrlDown && KEY_C === keyCode) {\n return;\n }\n\n const cursorPosition = event.target.selectionStart;\n\n if (keyCode === BACKSPACE && cursorPosition - 1 < templateUrl.length) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (cursorPosition < templateUrl.length) {\n // If templateUrl is not empty and cursor is in the middle of it, we will prevent the event and not allow to modify the url.\n event.preventDefault();\n event.stopPropagation();\n }\n\n // If templateUrl is not empty and cursor is after it, the user can write any character into the url input.\n };\n\n $scope.onKeyUpInUrlInput = () => {\n extractExtraUrl();\n };\n\n // =========================\n // Private functions\n // =========================\n\n /**\n * Extracts manual user input from url input element.\n */\n const extractExtraUrl = () => {\n const templateUrl = calculateTemplateUrl();\n if (templateUrl) {\n if ($scope.formData.connectionInformation.url.startsWith(templateUrl)) {\n // If templateUrl is not empty and url input value starts with the templateUrl, the text entered by user is part after the templateUrl.\n $scope.formData.connectionInformation.urlUserInput = $scope.formData.connectionInformation.url.substring(templateUrl.length);\n } else {\n // If templateUrl is not empty and url input value don't start with the templateUrl, all url is entered by the user.\n $scope.formData.connectionInformation.urlUserInput = $scope.formData.connectionInformation.url;\n }\n } else {\n // If templateUrl is empty this means that chosen driver is generic or user is not filled hostname, port, or database name.\n // So all characters in url input are entered by user.\n $scope.formData.connectionInformation.urlUserInput = $scope.formData.connectionInformation.url;\n }\n };\n\n const calculateTemplateUrl = () => {\n if (OntopDriverData.isSnowflakeDriver($scope.selectedDriver.driverType)) {\n return calculateSnowflakeTemplateUrl();\n }\n return calculateDefaultTemplateUrl();\n };\n\n const calculateSnowflakeTemplateUrl = () => {\n let url = $scope.selectedDriver.urlTemplate;\n const connectionInformation = $scope.formData.connectionInformation;\n\n if (connectionInformation.hostName) {\n url = url.replace('{identifier}', connectionInformation.hostName);\n }\n\n if (connectionInformation.port) {\n url = url.replace('.snowflakecomputing.com/?', `.snowflakecomputing.com:${connectionInformation.port}/?`);\n }\n\n if (connectionInformation.databaseName) {\n url = url.replace('{database}', connectionInformation.databaseName);\n }\n return url;\n };\n\n const calculateDefaultTemplateUrl = () => {\n let url = $scope.selectedDriver.urlTemplate;\n const connectionInformation = $scope.formData.connectionInformation;\n if (connectionInformation.hostName) {\n if (connectionInformation.port) {\n url = url.replace('{hostport}', `${connectionInformation.hostName}:${connectionInformation.port}`);\n } else {\n url = url.replace('{hostport}', `${connectionInformation.hostName}`);\n }\n }\n if (connectionInformation.databaseName) {\n url = url.replace('{database}', connectionInformation.databaseName);\n }\n return url;\n };\n\n const loadSupportedDriversData = () => {\n return RepositoriesRestService.getSupportedDriversData($scope.repositoryInfo)\n .success((response) => {\n $scope.supportedDriversData = response;\n }).error((response) => {\n showErrorMsg($translate.instant('common.error'), response);\n });\n };\n\n const setLoading = (loading) => {\n $scope.formData.settings.ontopFiles.forEach((ontopFile) => {\n ontopFile.loading = loading;\n });\n };\n\n /**\n * Creates a reference to the repository being edited.\n *\n * @param {object} repositoryInfo Information about the repository.\n * @returns {RepositoryReference|undefined} The repository reference when the edit page is open, otherwise, `undefined`.\n */\n const getRepositoryReference = (repositoryInfo) => {\n if ($scope.editRepoPage) {\n return new RepositoryReference(repositoryInfo.id, repositoryInfo.location);\n }\n return undefined;\n };\n\n const loadPropertiesFile = () => {\n setLoading(true);\n RepositoriesRestService.loadPropertiesFile($scope.repositoryInfo.params.propertiesFile.value, repositoryReference, $scope.selectedDriver.driverType)\n .success((driverData) => {\n let driver = $scope.supportedDriversData.find((driver) => driver.driverClass === driverData.driverClass);\n // If driver not found this means that driver is generic.\n // If the driver is found, but the data returned by the server does not contain a hostname,\n // it means that the driver class (which we support) is filled in as the driver class of a generic type.\n if (!driver || !driverData.hostName) {\n driver = $scope.supportedDriversData.find((driver) => OntopDriverData.isGenericDriver(driver.driverType));\n }\n $scope.selectDriver(driver.driverType);\n $scope.formData.connectionInformation.driverType = driver.driverType;\n $scope.formData.connectionInformation.driverClass = driverData.driverClass;\n $scope.formData.connectionInformation.password = driverData.password;\n $scope.formData.connectionInformation.username = driverData.userName;\n $scope.formData.connectionInformation.url = driverData.url;\n $scope.formData.settings.additionalProperties = driverData.additionalProperties;\n\n if (!OntopDriverData.isGenericDriver(driver.driverType)) {\n $scope.formData.connectionInformation.hostName = driverData.hostName;\n $scope.formData.connectionInformation.databaseName = driverData.databaseName;\n $scope.formData.connectionInformation.port = driverData.port ? parseInt(driverData.port, 10) : undefined;\n }\n\n extractExtraUrl();\n $scope.updateUrl();\n\n Object.values(OntopFileType)\n .forEach((ontopFileType) => {\n const ontopFileInfo = $scope.repositoryInfo.params[ontopFileType];\n const ontopFile = $scope.getOntopFileInfo(ontopFileType);\n if (ontopFileInfo) {\n ontopFile.fileName = getFileName(ontopFileInfo.value);\n }\n });\n $scope.currentOntopRepoInfo = _.cloneDeep($scope.formData);\n })\n .error((data) => {\n showErrorMsg($translate.instant('common.error'), data);\n })\n .finally(() => {\n setLoading(false);\n });\n };\n\n const updatePropertiesFile = () => {\n setLoading(true);\n const connectionInformation = $scope.formData.connectionInformation;\n\n const jdbc = {\n hostName: connectionInformation.hostName,\n port: connectionInformation.port,\n databaseName: connectionInformation.databaseName,\n userName: connectionInformation.username,\n password: connectionInformation.password,\n driverClass: connectionInformation.driverClass,\n url: connectionInformation.url,\n additionalProperties: $scope.formData.settings.additionalProperties,\n };\n\n return RepositoriesRestService\n .updatePropertiesFile($scope.repositoryInfo.params.propertiesFile.value, jdbc, repositoryReference, $scope.selectedDriver.driverType)\n .success((data) => {\n $scope.repositoryInfo.params.propertiesFile.value = data.fileLocation;\n }).error((data) => {\n showErrorMsg($translate.instant('common.error'), data);\n })\n .finally(() => setLoading(false));\n };\n\n const showErrorMsg = (title, data) => {\n const msg = getError(data);\n toastr.error(msg, title);\n };\n\n const validateHostName = () => {\n if (!OntopDriverData.isGenericDriver($scope.selectedDriver.driverType)) {\n if (!$scope.formData.connectionInformation.hostName) {\n return Promise.reject(new OntopRepositoryError($translate.instant('missing.required.field', {fieldName: $translate.instant('ontop.repo.database.host_name')})));\n }\n }\n return Promise.resolve();\n };\n\n const validateDatabaseName = () => {\n if (!OntopDriverData.isGenericDriver($scope.selectedDriver.driverType)) {\n if (!$scope.formData.connectionInformation.databaseName) {\n return Promise.reject(new OntopRepositoryError($translate.instant('missing.required.field', {fieldName: $translate.instant('ontop.repo.database.database_name')})));\n }\n }\n return Promise.resolve();\n };\n\n const validateDriverClass = () => {\n if (!$scope.formData.connectionInformation.driverClass) {\n return Promise.reject(new OntopRepositoryError($translate.instant('missing.required.field', {fieldName: $translate.instant('ontop.repo.database.driver_class')})));\n }\n return Promise.resolve();\n };\n\n const validateUrl = () => {\n if (!$scope.formData.connectionInformation.url) {\n return Promise.reject(new OntopRepositoryError($translate.instant('missing.required.field', {fieldName: $translate.instant('ontop.repo.database.url')})));\n }\n return Promise.resolve();\n };\n\n const validateRepositoryId = () => {\n if (!$scope.repositoryInfo.id) {\n return Promise.reject(new OntopRepositoryError($translate.instant('empty.repoid.warning')));\n }\n return Promise.resolve();\n };\n\n const validateOntopFiles = () => {\n if (!$scope.getOntopFileInfo(OntopFileType.OBDA).fileName) {\n return Promise.reject(new OntopRepositoryError($translate.instant('ontop.repo.missing.required.file', {fileName: $scope.repositoryInfo.params[OntopFileType.OBDA].label})));\n }\n return Promise.resolve();\n };\n\n const validatePort = () => {\n if ($scope.selectedDriver.portRequired && !$scope.formData.connectionInformation.port) {\n return Promise.reject(new OntopRepositoryError($translate.instant('missing.required.field', {fieldName: $translate.instant('ontop.repo.database.port')})));\n }\n return Promise.resolve();\n };\n\n const clearFormData = () => {\n $scope.formData = {\n connectionInformation: new OntopConnectionInformation(),\n settings: {\n additionalProperties: '',\n ontopFiles: [],\n },\n };\n\n Object.values(OntopFileType)\n .forEach((ontopFileType) => {\n const ontopFileInfo = new OntopFileInfo(ontopFileType);\n $scope.formData.settings.ontopFiles.push(ontopFileInfo);\n });\n\n $scope.getOntopFileInfo(OntopFileType.OBDA).required = true;\n };\n\n const init = () => {\n repositoryReference = getRepositoryReference($scope.repositoryInfo);\n loadSupportedDriversData()\n .then(() => {\n if ($scope.editRepoPage) {\n loadPropertiesFile();\n } else {\n $scope.selectDriver(JdbcDriverType.GENERIC);\n }\n });\n };\n\n // =========================\n // Initialize component data\n // =========================\n init();\n }\n}\n"],"names":["JdbcDriverType","OntopConnectionInformation","constructor","driverType","this","hostName","port","undefined","databaseName","username","password","driverClass","url","urlUserInput","OntopDriverData","classAvailable","downloadDriverUrl","driverName","portRequired","urlTemplate","isGenericDriver","type","GENERIC","isSnowflakeDriver","SNOWFLAKE","OntopFileInfo","required","fileName","loading","OntopFileType","OntopRepositoryError","Error","logger","LoggerProvider","ontopRepoDirective","$uibModal","RepositoriesRestService","toastr","Upload","$translate","restrict","scope","templateUrl","link","$scope","repositoryReference","defaultUrlTemplate","ontopProperiesLink","ontopFileType","selectedDriver","supportedDriversData","formData","connectionInformation","settings","additionalProperties","ontopFiles","selectDriver","find","driver","editRepoPage","currentOntopRepoInfo","_","cloneDeep","clearFormData","updateUrl","getOntopFileInfo","ontopFileInfo","getHostNameLabel","hostNameLabel","instant","getDatabaseNameLabel","dataBaseNameLabelKey","DATABRICKS","DREMIO","calculateTemplateUrl","isTestConnectionDisabled","testConnection","validateHostName","then","validatePort","validateDatabaseName","validateDriverClass","validateUrl","updatePropertiesFile","validateOntopPropertiesConnection","repositoryInfo","success","catch","error","message","showErrorMsg","editFile","params","label","title","open","controller","windowClass","resolve","file","ontopFile","value","dialogTitle","result","data","updateRepositoryFileContent","fileLocation","content","getFileName","uploadOntopFile","files","length","uploadFile","uploadData","location","repositoryID","id","upload","name","errorMessage","finally","updateOntopRepo","createOrUpdate","editRepository","createRepo","validateRepositoryId","validateOntopFiles","info","onKeyDownInUrlInput","event","keyCode","ctrlDown","ctrlKey","metaKey","cursorPosition","target","selectionStart","preventDefault","stopPropagation","onKeyUpInUrlInput","extractExtraUrl","startsWith","substring","calculateSnowflakeTemplateUrl","calculateDefaultTemplateUrl","replace","setLoading","forEach","jdbc","userName","propertiesFile","msg","getError","Promise","reject","fieldName","OBDA","Object","values","push","RepositoryReference","getRepositoryReference","getSupportedDriversData","response","loadPropertiesFile","driverData","parseInt","angular","module","directive","$inject"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const __webpack_esm_id__=21156;export const __webpack_esm_ids__=[1767,21156,72348];export const __webpack_esm_modules__={21156(e,t,r){r(22742),r(28918),r(82146);var s=r(82805),n=(r(72348),r(1767)),o=r(82385),i=r(57154),a=r(41767);const c=angular.module("graphdb.framework.security.controllers",["ngCookies","ui.bootstrap","graphdb.framework.core.services.jwtauth","graphdb.framework.core.services.security-service","toastr","ngTagsInput"]);c.controller("UsersCtrl",["$scope","$uibModal","toastr","$window","$jwtAuth","$timeout","ModalService","SecurityService","$translate","productInfo",function(e,t,r,c,u,d,l,p,E,h){const g=(0,i.service)(i.AuthorizationService),A=(0,i.service)(i.AuthenticationService),m=(0,i.service)(i.SecurityService),R=(0,i.service)(i.OntoToastrService),f=(0,i.service)(i.UsersService),y=(0,i.service)(i.RepositoryAuthorityService),w=(0,i.service)(i.SecurityContextService),S=(0,i.service)(i.LanguageContextService);e.usersData=[],e.loader=!0,e.isSecurityToggleAllowed=w.getSecurityConfig()?.isSecurityToggleAllowed(),e.isPasswordLoginEnabled=w.getSecurityConfig()?.isPasswordLoginEnabled(),e.isOpenIDEnabled=w.getSecurityConfig()?.isOpenIdEnabled(),e.authSource=w.getSecurityConfig()?.getAuthSourceType(),e.canExtendExternalUserRole=g.canExtendExternalUsers(),e.additionalAuthSources=w.getSecurityConfig()?.additionalAuthSources.join(", "),e.toggleState={hovered:!1};const P=()=>{const t=e.securityEnabled()?E.instant("disable"):E.instant("enable");return E.instant("security.toggle.tooltip",{action:t})};e.securityToggleNotAllowedDocUrl=o.m.getDocumentationUrl(h.productShortVersion,"security.html"),e.securityEnabled=function(){return A.isSecurityEnabled()},e.securityToggleTooltip=P();const U=[S.onSelectedLanguageChanged(()=>{e.securityToggleTooltip=P()})];e.hasExternalAuth=function(){return u.hasExternalAuth()},e.freeAccessEnabled=function(){return g.hasFreeAccess()};const x=t=>{const r=t.getUserType(),n=e.canExtendExternalUserRole&&!!t.authorities.size(),o={username:t.username,dateCreated:t.dateCreated,userTypeDescription:t.getUserTypeDescription(),repositoryRights:(i=t.authorities.getRepositoriesPermissions(),Object.entries(i).map(([e,t])=>{let r,s;return t.manage?(r="ri-folder-settings-line",s="security.has.manage.permission"):t.write?(r="ri-edit-line",s="security.has.write.permission"):t.read&&(r="ri-eye-line",s="security.has.read.permission"),{repository:e,iconClass:r,tooltipKey:s,hasGraphqlAccess:t.graphql,graphqlTooltipKey:t.write?"security.has.mutation_permission":"security.no.mutation_permission"}})),customRoles:t.authorities.getCustomRoles(),isExtended:n,showRepositoryRights:r===s.ut.USER,showUnrestrictedRights:r!==s.ut.USER,showPendingExternalLogin:e.canExtendExternalUserRole&&!t.hasExternalLogin,canRemoveExtendedPermissions:n&&t.hasExternalLogin};var i;return o.canDelete=(t=>!t.canRemoveExtendedPermissions&&(e.canExtendExternalUserRole?t.isExtended:!e.hasExternalAuth()&&"admin"!==t.username))(o),o};e.getUsers=()=>f.getUsers().then(function(t){e.usersData=t.map(x),e.loader=!1}).catch(function(t){const s=getError(t);r.error(s,E.instant("common.error")),e.loader=!1}),e.getUsers(),e.$on("repositoryIsSet",function(){e.getUsers()}),e.toggleSecurity=function(){if(!e.isSecurityToggleAllowed)return;const t=A.isSecurityEnabled();u.toggleSecurity(!t).then(()=>{c.location.reload()})};const T=function(e,t){return m.setFreeAccess(e,t)};e.toggleFreeAccess=function(e){!g.hasFreeAccess()||g.hasFreeAccess()&&e?m.getFreeAccess().then(t=>{const r=(0,i.mapGrantedAuthoritiesResponseToModel)(t.authorities).getItems(),s=t.appSettings??{DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0};return C(s,r,e)}).then(t=>T(e||!u.isFreeAccessEnabled(),t)).then(()=>{const t=e?"jwt.auth.free.access.updated.msg":"jwt.auth.free.access.status";R.success(E.instant(t,{status:E.instant("enabled.status")}))}).catch(e=>{"cancel"!==e&&R.error(e.data??e,E.instant("common.error"))}):T(!g.hasFreeAccess()).then(()=>{R.success(E.instant("jwt.auth.free.access.status",{status:E.instant("disabled.status")}))}).catch(e=>{R.error(e.data,E.instant("common.error"))})};const C=(r,s,o)=>t.open({templateUrl:"js/angular/security/templates/modal/default-authorities.html",controller:"DefaultAuthoritiesCtrl",resolve:{data:function(){return{defaultAuthorities:function(){const t={[n.aj]:{},[n.DX]:{},[n.w0]:{}},r=_.mapKeys(e.getRepositories(),function(e){return y.getLocationSpecificId(e)});return _.each(s,function(e){0===e.indexOf(n._5)?r.hasOwnProperty(e.substr(11))&&(t[n.DX][e.substr(11)]=!0):0===e.indexOf(n.xF)?r.hasOwnProperty(e.substr(10))&&(t[n.aj][e.substr(10)]=!0):0===e.indexOf(n.B1)&&r.hasOwnProperty(e.substr(8))&&(t[n.w0][e.substr(8)]=!0)}),t},appSettings:r}}}}).result.then(function(e){return s=e.authorities,r=e.appSettings,(0,i.mapAuthSettingsResponseToModel)({enabled:o||!g.hasFreeAccess(),appSettings:r,authorities:s})});e.editFreeAccess=function(){e.toggleFreeAccess(!0)},e.removeUser=function(t){let s=E.instant("common.confirm.delete"),n=E.instant("security.confirm.delete.user",{name:t.username});if(e.canExtendExternalUserRole){const r=t.canRemoveExtendedPermissions,o=r?"security.confirm.remove.extended.user.permissions.title":"security.confirm.delete.extended.user.title",i=r?"security.confirm.remove.extended.user.permissions.body":"security.confirm.delete.extended.user.body";s=(0,a.Gz)(E.instant(o,{name:t.username})),n=(0,a.Gz)(E.instant(i,{name:t.username,authSource:e.authSource}))}l.openSimpleModal({title:s,message:n,warning:!0}).result.then(function(){e.loader=!0,f.deleteUser(t.username).then(()=>e.getUsers()).catch(t=>{const s=getError(t);r.error(s,E.instant("common.error")),e.loader=!1})})},e.encodeURIComponent=function(e){return encodeURIComponent(e)},e.$on("$destroy",function(){U.forEach(e=>e())})}]),c.controller("DefaultAuthoritiesCtrl",["$scope","$http","$uibModalInstance","data","$rootScope",function(e,t,r,s,o){const a=(0,i.service)(i.RepositoryAuthorityService);e.grantedAuthorities=s.defaultAuthorities(),e.appSettings=s.appSettings,e.hasActiveLocation=function(){return!_.isEmpty(o.globalLocation)},e.getRepositories=function(){return o.globalRepositories},e.ok=function(){const t=[];e.repositoryCheckError=!0;for(const r in e.grantedAuthorities.WRITE_REPO)e.grantedAuthorities.WRITE_REPO[r]&&(t.push(n._5+r),t.push(n.xF+r),e.repositoryCheckError=!1);for(const r in e.grantedAuthorities.READ_REPO)e.grantedAuthorities.READ_REPO[r]&&-1===t.indexOf(n.xF+r)&&(t.push(n.xF+r),e.repositoryCheckError=!1);for(const r in e.grantedAuthorities.GRAPHQL)e.grantedAuthorities.GRAPHQL[r]&&-1===t.indexOf(n.B1+r)&&t.push(n.B1+r);e.repositoryCheckError||r.close({authorities:t,appSettings:e.appSettings})},e.cancel=function(){r.dismiss("cancel")},e.createUniqueKey=function(e){return a.getLocationSpecificId(e)}}]),c.controller("CommonUserCtrl",["$rootScope","$scope","$http","toastr","$window","$timeout","$location","$jwtAuth","$translate","passwordPlaceholder",function(e,t,r,o,a,c,u,d,l,p){const E=(0,i.service)(i.AuthorizationService),h=(0,i.service)(i.RepositoryAuthorityService),g=(0,i.service)(i.SecurityContextService);t.canExtendExternalUserRole=E.canExtendExternalUsers(),t.authSource=g.getSecurityConfig()?.getAuthSourceType(),e.$on("$translateChangeSuccess",function(){t.passwordPlaceholder=l.instant(p)}),t.isAdmin=function(){return E.hasRole(s.gG.ROLE_ADMIN)},t.hasExternalAuth=function(){return d.hasExternalAuth()},t.hasEditRestrictions=function(){return t.user&&t.user.username===s.ut.ADMIN},t.isOverrideAuth=function(){return d.isDefaultAuthEnabled()},t.isGraphQlOnlyRight=function(e){const r=t.hasManageRepositoryPermission(e),s=t.hasGraphqlPermission(e)||t.hasGraphqlPermission("*"),n=t.hasReadPermission(e)||t.hasReadPermission("*")||t.hasWritePermission(e)||t.hasWritePermission("*");return!r&&s&&n},t.setGrantedAuthorities=function(){function e(...e){for(let r=0;r<e.length;r++){const s=e[r];_.indexOf(t.user.grantedAuthorities,s)<0&&t.user.grantedAuthorities.push(s)}}if(t.user.grantedAuthorities=[],t.repositoryCheckError=!0,t.userType===s.ut.ADMIN)t.repositoryCheckError=!1,e(s.gG.ROLE_ADMIN);else if(t.userType===s.ut.REPO_MANAGER)t.repositoryCheckError=!1,e(s.gG.ROLE_REPO_MANAGER);else{e(s.gG.ROLE_USER);for(const r in t.grantedAuthorities.MANAGE_REPO)t.grantedAuthorities.MANAGE_REPO[r]&&(t.repositoryCheckError=!1,e(n.w$+r,n._5+r,n.xF+r));for(const r in t.grantedAuthorities.WRITE_REPO)t.grantedAuthorities.WRITE_REPO[r]&&(t.repositoryCheckError=!1,e(n._5+r,n.xF+r));for(const r in t.grantedAuthorities.READ_REPO)t.grantedAuthorities.READ_REPO[r]&&(t.repositoryCheckError=!1,e(n.xF+r));for(const r in t.grantedAuthorities.GRAPHQL)if(t.grantedAuthorities.GRAPHQL[r]){const s=t.grantedAuthorities.READ_REPO[r]||t.grantedAuthorities.READ_REPO["*"],o=t.grantedAuthorities.WRITE_REPO[r]||t.grantedAuthorities.WRITE_REPO["*"];(s||o)&&e(n.B1+r)}}t.customRoles&&t.customRoles.forEach(t=>e("CUSTOM_"+t))},t.$watch("userType",function(){t.isUser()||(t.customRoles="")}),t.isUser=function(){return t.userType===s.ut.USER},t.hasReadPermission=function(e){const r=h.getLocationSpecificId(e);return t.userType===s.ut.ADMIN||t.userType===s.ut.REPO_MANAGER||e.id!==n.n5&&(t.grantedAuthorities.READ_REPO["*"]||t.grantedAuthorities.WRITE_REPO["*"])||t.grantedAuthorities.READ_REPO[r]||t.grantedAuthorities.WRITE_REPO[r]||t.grantedAuthorities.MANAGE_REPO[r]},t.hasWritePermission=function(e){const r=h.getLocationSpecificId(e);return t.userType===s.ut.ADMIN||t.userType===s.ut.REPO_MANAGER||e.id!==n.n5&&t.grantedAuthorities.WRITE_REPO["*"]||t.grantedAuthorities.MANAGE_REPO[r]||t.grantedAuthorities.WRITE_REPO[r]},t.hasManageRepositoryPermission=function(e){const r=h.getLocationSpecificId(e);return t.userType===s.ut.ADMIN||t.userType===s.ut.REPO_MANAGER||t.grantedAuthorities.MANAGE_REPO[r]},t.hasGraphqlPermission=function(e){const r=h.getLocationSpecificId(e),s=t.hasManageRepositoryPermission(e),o=t.grantedAuthorities.GRAPHQL["*"]||t.grantedAuthorities.GRAPHQL[r],i=t.hasReadPermission(e),a=e.id===n.n5;return!s&&!a&&o&&i},t.readCheckDisabled=function(e){return!(!t.canExtendExternalUserRole||t.allowRoleExtension)||t.hasWritePermission(e)||e.id!==n.n5&&"*"!==e&&t.grantedAuthorities.READ_REPO["*"]||t.hasEditRestrictions()},t.writeCheckDisabled=function(e){return!(!t.canExtendExternalUserRole||t.allowRoleExtension)||t.hasManageRepositoryPermission(e)||e.id!==n.n5&&"*"!==e&&t.grantedAuthorities.WRITE_REPO["*"]||t.hasEditRestrictions()},t.manageRepoCheckDisabled=function(){return!(!t.canExtendExternalUserRole||t.allowRoleExtension)||t.userType===s.ut.ADMIN||t.userType===s.ut.REPO_MANAGER||t.hasEditRestrictions()},t.graphqlCheckDisabled=function(e){if(t.hasManageRepositoryPermission(e))return!0;if(t.hasEditRestrictions())return!0;if(t.canExtendExternalUserRole&&!t.allowRoleExtension)return!0;const r=t.grantedAuthorities.READ_REPO["*"],s=t.grantedAuthorities.WRITE_REPO["*"],n=t.grantedAuthorities.GRAPHQL["*"];if("*"!==e&&n)return!0;if("*"===e&&n&&r)return!1;let o;o=null!==e&&"object"==typeof e?h.getLocationSpecificId(e):e;const i=t.grantedAuthorities.READ_REPO[o],a=t.grantedAuthorities.WRITE_REPO[o];return!(r||s||i||a)},t.createUniqueKey=function(e){return h.getLocationSpecificId(e)},t.userType=s.ut.USER,t.grantedAuthorities={[n.aj]:{},[n.DX]:{},[n.ln]:{},[n.w0]:{}},t.validatePassword=function(){return t.noPassword?(t.passwordError="",t.confirmPasswordError="",!0):t.user.password!==t.user.confirmpassword?(t.user.password?(t.passwordError="",t.confirmPasswordError=l.instant("security.confirm.password")):(t.passwordError=l.instant("security.enter.password"),t.confirmPasswordError=""),!1):(t.passwordError="",t.confirmPasswordError="",!0)},t.isLocalAuthentication=function(){return"Local"===d.getAuthImplementation()},t.updateUser=function(){if(!t.validateForm())return!1;(t.isLocalAuthentication()||t.canExtendExternalUserRole&&t.allowRoleExtension)&&t.setGrantedAuthorities(),t.repositoryCheckError||t.updateUserHttp()},t.setNoPassword=function(){t.noPassword&&(t.user.password="",t.user.confirmpassword="",t.passwordError="",t.confirmPasswordError="")},t.shouldDisableSameAs=function(){const e=$("#sameAsCheck");return t.user&&!t.user.appSettings.DEFAULT_INFERENCE&&e.prop("checked")&&(e.prop("checked",!1),t.user.appSettings.DEFAULT_SAMEAS=!1),t.user&&!t.user.appSettings.DEFAULT_INFERENCE},t.isRoleValid=!0,t.addCustomRole=function(e){return t.isRoleValid=!0,e.text=e.text.toUpperCase(),e},t.isCustomRoleValid=function(e){return t.isRoleValid=e.text.length>=2,t.isRoleValid},t.checkUserInput=function(e){8!==e.keyCode&&46!==e.keyCode||(t.isRoleValid=!0)},t.removeErrorOnCut=function(){t.isRoleValid=!0}}]),c.controller("AddUserCtrl",["$scope","$http","toastr","$window","$timeout","$location","$jwtAuth","$controller","SecurityService","ModalService","$translate",function(e,t,r,n,o,a,c,u,d,l,p){angular.extend(this,u("CommonUserCtrl",{$scope:e,passwordPlaceholder:"security.password.placeholder"}));const E=(0,i.service)(i.UsersService);e.mode="add",e.saveButtonText=p.instant("common.create.btn"),e.goBack=function(){a.url("users")},e.pageTitle=p.instant("view.create.user.title"),e.passwordPlaceholder=p.instant("security.password.placeholder"),e.user={username:"",password:"",confirmpassword:"",grantedAuthorities:[],appSettings:{DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0}},e.allowRoleExtension=!0,e.disableRoleExtension=!0,e.canExtendExternalUserRole&&(e.noPassword=!0,e.setNoPassword()),e.submit=function(){!e.canExtendExternalUserRole&&e.noPassword&&e.userType===s.ut.ADMIN?l.openSimpleModal({title:p.instant("security.create.admin"),message:p.instant("security.admin.login.warning"),warning:!0}).result.then(function(){e.createUser()}):e.createUser()},e.createUserHttp=function(){e.loader=!0;const t=new i.User({username:e.user.username,password:e.user.password,appSettings:new i.AppSettings(e.user.appSettings),authorities:new i.AuthorityList(e.user.grantedAuthorities)});E.createUser(t).then(()=>{r.success(p.instant("security.user.created",{name:e.user.username}));const t=o(function(){e.loader=!1,a.path("users")},2e3);e.$on("$destroy",function(){o.cancel(t)})}).catch(async t=>{e.loader=!1,r.error(getError(t),p.instant("common.error"))})},e.createUser=function(){e.validateForm()&&(e.setGrantedAuthorities(),e.repositoryCheckError||e.createUserHttp())},e.validateForm=function(){let t=!0;return e.user.username?e.usernameError="":(e.usernameError=p.instant("security.enter.username"),t=!1),e.noPassword?(e.passwordError="",e.confirmPasswordError=""):(e.user.password?e.passwordError="":(e.passwordError=p.instant("security.enter.password"),t=!1),e.user.confirmpassword&&e.user.password===e.user.confirmpassword?e.confirmPasswordError="":(e.confirmPasswordError=p.instant("security.confirm.password"),t=!1)),t}}]),c.controller("EditUserCtrl",["$scope","$http","toastr","$window","$routeParams","$timeout","$location","$jwtAuth","$controller","SecurityService","ModalService","$translate",function(e,t,r,n,o,a,c,u,d,l,p,E){angular.extend(this,d("CommonUserCtrl",{$scope:e,passwordPlaceholder:"security.new.password"}));const h=(0,i.service)(i.UsersService),g=(0,i.service)(i.AuthorizationService),A=(0,i.service)(i.SecurityContextService);e.mode="edit",e.saveButtonText=E.instant("common.save.btn"),e.goBack=function(){c.url("users")},e.params=o,e.pageTitle=E.instant("view.edit.user.title",{userId:e.params.userId}),e.passwordPlaceholder=E.instant("security.new.password"),e.userType=s.ut.USER;const m={DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0};e.allowRoleExtension=!1,e.disableRoleExtension=!1,g.hasRole(s.gG.ROLE_ADMIN)||c.url("settings"),e.getUserData=function(){h.getUser(e.params.userId).then(function(t){e.user={username:t.username},e.user.password="",e.user.confirmpassword="",e.user.appSettings=t.appSettings||m,e.userType=t.getUserType(),e.grantedAuthorities=t.authorities.toUIModel(),e.customRoles=t.authorities.getCustomRoles(),e.user.isExtended=e.canExtendExternalUserRole&&!!t.authorities.size(),e.allowRoleExtension=e.user?.isExtended??!1}).catch(function(e){const t=getError(e);r.error(t,E.instant("common.error"))})},e.getUserData(),e.submit=function(){!e.canExtendExternalUserRole&&e.noPassword&&e.userType===s.ut.ADMIN?p.openSimpleModal({title:E.instant("security.save.admin.settings"),message:E.instant("security.admin.pass.unset"),warning:!0}).result.then(function(){e.updateUser()}):e.updateUser()},e.updateUserHttp=function(){e.loader=!0;const t=new i.User({username:e.user.username,password:e.noPassword?"":e.user.password||void 0,appSettings:new i.AppSettings(e.user.appSettings),authorities:new i.AuthorityList(e.user.grantedAuthorities)});h.updateUser(t).then(()=>{r.success(E.instant("security.user.updated",{name:e.user.username}));const t=a(function(){e.loader=!1,c.path("users")},2e3);e.$on("$destroy",function(){a.cancel(t)});const s=A.getAuthenticatedUser();e.user.username===s.username&&s.setAppSettings(new i.AppSettings(e.user.appSettings))}).catch(t=>{const s=getError(t);e.loader=!1,r.error(s,E.instant("common.error"))})},e.validateForm=function(){return e.validatePassword()}}]),c.controller("RolesMappingController",["$scope","toastr","SecurityService","$translate",function(e,t,r,s){e.debugMapping=function(e,t){const s=t.split(":");r.getRolesMapping({role:e,method:s[1],mapping:s[0]})},e.$on("repositoryIsSet",function(){r.getRoles().success(function(t){e.roleMappings=t,e.roles=_.keys(e.roleMappings),e.mappings=_.keys(e.roleMappings[e.roles[0]]);const r=_.map(e.roles,function(t){return[t,_.filter(e.roleMappings[t]).length]});e.roles=_.reverse(_.map(_.orderBy(r,function(e){return e[1]}),function(e){return e[0]}))}).error(function(r){const n=getError(r);e.loader=!1,t.error(n,s.instant("common.error"))})})}]),c.controller("DeleteUserCtrl",["$scope","$uibModalInstance","username",function(e,t,r){e.username=r,e.ok=function(){t.close()},e.cancel=function(){t.dismiss("cancel")}}])},72348(){angular.module("graphdb.framework.security.directives",[]).directive("customPrefixTagsInput",function(){return{restrict:"A",link:function(e,t,r){const s=[];function n(e){return e.startsWith("CUSTOM_")||e.startsWith("!CUSTOM_")}const o="tags-input"===t[0].nodeName.toLowerCase();if(o&&r.ngModel){const i=t.controller("ngModel");o&&(i.$parsers.push(function(e){return Array.isArray(e)&&(i.$warning=e.some(e=>n(e))),e}),s.push(e.$watch(r.ngModel,function(e){Array.isArray(e)&&(i.$warning=e.some(e=>n(e)))},!0)))}s.push(e.$on("$destroy",()=>{s.forEach(e=>e())}))}}})},1767(e,t,r){r.d(t,{B1:()=>l,DX:()=>i,_5:()=>u,aj:()=>n,ln:()=>a,n5:()=>s,w$:()=>d,w0:()=>c,xF:()=>o});const s="SYSTEM",n="READ_REPO",o="READ_REPO_",i="WRITE_REPO",a="MANAGE_REPO",c="GRAPHQL",u="WRITE_REPO_",d="MANAGE_REPO_",l="GRAPHQL_"}};
|
|
2
|
-
//# sourceMappingURL=21156.
|
|
1
|
+
export const __webpack_esm_id__=21156;export const __webpack_esm_ids__=[1767,21156,72348];export const __webpack_esm_modules__={21156(e,t,r){r(22742),r(28918),r(82146);var s=r(82805),n=(r(72348),r(1767)),o=r(82385),i=r(57154),a=r(41767);const c=angular.module("graphdb.framework.security.controllers",["ngCookies","ui.bootstrap","graphdb.framework.core.services.jwtauth","graphdb.framework.core.services.security-service","toastr","ngTagsInput"]);c.controller("UsersCtrl",["$scope","$uibModal","toastr","$window","$jwtAuth","$timeout","ModalService","SecurityService","$translate","productInfo",function(e,t,r,c,u,d,l,p,E,h){const g=(0,i.service)(i.AuthorizationService),m=(0,i.service)(i.AuthenticationService),A=(0,i.service)(i.SecurityService),R=(0,i.service)(i.OntoToastrService),f=(0,i.service)(i.UsersService),y=(0,i.service)(i.RepositoryAuthorityService),w=(0,i.service)(i.SecurityContextService),S=(0,i.service)(i.LanguageContextService);e.usersData=[],e.loader=!0,e.isSecurityToggleAllowed=w.getSecurityConfig()?.isSecurityToggleAllowed(),e.isPasswordLoginEnabled=w.getSecurityConfig()?.isPasswordLoginEnabled(),e.isOpenIDEnabled=w.getSecurityConfig()?.isOpenIdEnabled(),e.authSource=w.getSecurityConfig()?.getAuthSourceType(),e.canExtendExternalUserRole=g.canExtendExternalUsers(),e.additionalAuthSources=w.getSecurityConfig()?.additionalAuthSources.join(", "),e.toggleState={hovered:!1};const P=()=>{const t=e.securityEnabled()?E.instant("disable"):E.instant("enable");return E.instant("security.toggle.tooltip",{action:t})};e.securityToggleNotAllowedDocUrl=o.m.getDocumentationUrl(h.productShortVersion,"security.html"),e.securityEnabled=function(){return m.isSecurityEnabled()},e.securityToggleTooltip=P();const U=[S.onSelectedLanguageChanged(()=>{e.securityToggleTooltip=P()})];e.hasExternalAuth=function(){return u.hasExternalAuth()},e.freeAccessEnabled=function(){return g.hasFreeAccess()};const x=t=>{const r=t.getUserType(),n=e.canExtendExternalUserRole&&!!t.authorities.size(),o={username:t.username,dateCreated:t.dateCreated,userTypeDescription:t.getUserTypeDescription(),repositoryRights:(i=t.authorities.getRepositoriesPermissions(),Object.entries(i).map(([e,t])=>{let r,s;return t.manage?(r="ri-folder-settings-line",s="security.has.manage.permission"):t.write?(r="ri-edit-line",s="security.has.write.permission"):t.read&&(r="ri-eye-line",s="security.has.read.permission"),{repository:e,iconClass:r,tooltipKey:s,hasGraphqlAccess:t.graphql,graphqlTooltipKey:t.write?"security.has.mutation_permission":"security.no.mutation_permission"}})),customRoles:t.authorities.getCustomRoles(),isExtended:n,showRepositoryRights:r===s.ut.USER,showUnrestrictedRights:r!==s.ut.USER,showPendingExternalLogin:e.canExtendExternalUserRole&&!t.hasExternalLogin,canRemoveExtendedPermissions:n&&t.hasExternalLogin};var i;return o.canDelete=(t=>!t.canRemoveExtendedPermissions&&(e.canExtendExternalUserRole?t.isExtended:!e.hasExternalAuth()&&"admin"!==t.username))(o),o};e.getUsers=()=>f.getUsers().then(function(t){e.usersData=t.map(x),e.loader=!1}).catch(function(t){const s=getError(t);r.error(s,E.instant("common.error")),e.loader=!1}),e.getUsers(),e.$on("repositoryIsSet",function(){e.getUsers()}),e.toggleSecurity=function(){if(!e.isSecurityToggleAllowed)return;const t=m.isSecurityEnabled();u.toggleSecurity(!t).then(()=>{c.location.reload()})};const T=function(e,t){return A.setFreeAccess(e,t)};e.toggleFreeAccess=function(e){!g.hasFreeAccess()||g.hasFreeAccess()&&e?A.getFreeAccess().then(t=>{const r=(0,i.mapGrantedAuthoritiesResponseToModel)(t.authorities).getItems(),s=t.appSettings??{DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0};return v(s,r,e)}).then(t=>T(e||!u.isFreeAccessEnabled(),t)).then(()=>{const t=e?"jwt.auth.free.access.updated.msg":"jwt.auth.free.access.status";R.success(E.instant(t,{status:E.instant("enabled.status")}))}).catch(e=>{"cancel"!==e&&R.error(e.data??e,E.instant("common.error"))}):T(!g.hasFreeAccess()).then(()=>{R.success(E.instant("jwt.auth.free.access.status",{status:E.instant("disabled.status")}))}).catch(e=>{R.error(e.data,E.instant("common.error"))})};const v=(r,s,o)=>t.open({templateUrl:"js/angular/security/templates/modal/default-authorities.html",controller:"DefaultAuthoritiesCtrl",resolve:{data:function(){return{defaultAuthorities:function(){const t={[n.aj]:{},[n.DX]:{},[n.w0]:{}},r=_.mapKeys(e.getRepositories(),function(e){return y.getLocationSpecificId(e)});return _.each(s,function(e){0===e.indexOf(n._5)?r.hasOwnProperty(e.substr(11))&&(t[n.DX][e.substr(11)]=!0):0===e.indexOf(n.xF)?r.hasOwnProperty(e.substr(10))&&(t[n.aj][e.substr(10)]=!0):0===e.indexOf(n.B1)&&r.hasOwnProperty(e.substr(8))&&(t[n.w0][e.substr(8)]=!0)}),t},appSettings:r}}}}).result.then(function(e){return s=e.authorities,r=e.appSettings,(0,i.mapAuthSettingsResponseToModel)({enabled:o||!g.hasFreeAccess(),appSettings:r,authorities:s})});e.editFreeAccess=function(){e.toggleFreeAccess(!0)},e.removeUser=function(t){let s=E.instant("common.confirm.delete"),n=E.instant("security.confirm.delete.user",{name:t.username});if(e.canExtendExternalUserRole){const r=t.canRemoveExtendedPermissions,o=r?"security.confirm.remove.extended.user.permissions.title":"security.confirm.delete.extended.user.title",i=r?"security.confirm.remove.extended.user.permissions.body":"security.confirm.delete.extended.user.body";s=(0,a.Gz)(E.instant(o,{name:t.username})),n=(0,a.Gz)(E.instant(i,{name:t.username,authSource:e.authSource}))}l.openSimpleModal({title:s,message:n,warning:!0}).result.then(function(){e.loader=!0,f.deleteUser(t.username).then(()=>e.getUsers()).catch(t=>{const s=getError(t);r.error(s,E.instant("common.error")),e.loader=!1})})},e.encodeURIComponent=function(e){return encodeURIComponent(e)},e.$on("$destroy",function(){U.forEach(e=>e())})}]),c.controller("DefaultAuthoritiesCtrl",["$scope","$http","$uibModalInstance","data","$rootScope",function(e,t,r,s,o){const a=(0,i.service)(i.RepositoryAuthorityService);e.grantedAuthorities=s.defaultAuthorities(),e.appSettings=s.appSettings,e.hasActiveLocation=function(){return!_.isEmpty(o.globalLocation)},e.getRepositories=function(){return o.globalRepositories},e.ok=function(){const t=[];e.repositoryCheckError=!0;for(const r in e.grantedAuthorities.WRITE_REPO)e.grantedAuthorities.WRITE_REPO[r]&&(t.push(n._5+r),t.push(n.xF+r),e.repositoryCheckError=!1);for(const r in e.grantedAuthorities.READ_REPO)e.grantedAuthorities.READ_REPO[r]&&-1===t.indexOf(n.xF+r)&&(t.push(n.xF+r),e.repositoryCheckError=!1);for(const r in e.grantedAuthorities.GRAPHQL)e.grantedAuthorities.GRAPHQL[r]&&-1===t.indexOf(n.B1+r)&&t.push(n.B1+r);e.repositoryCheckError||r.close({authorities:t,appSettings:e.appSettings})},e.cancel=function(){r.dismiss("cancel")},e.createUniqueKey=function(e){return a.getLocationSpecificId(e)}}]),c.controller("CommonUserCtrl",["$rootScope","$scope","$http","toastr","$window","$timeout","$location","$jwtAuth","$translate","passwordPlaceholder",function(e,t,r,o,a,c,u,d,l,p){const E=(0,i.service)(i.AuthorizationService),h=(0,i.service)(i.RepositoryAuthorityService),g=(0,i.service)(i.SecurityContextService);t.canExtendExternalUserRole=E.canExtendExternalUsers(),t.authSource=g.getSecurityConfig()?.getAuthSourceType(),e.$on("$translateChangeSuccess",function(){t.passwordPlaceholder=l.instant(p)}),t.isAdmin=function(){return E.hasRole(s.gG.ROLE_ADMIN)},t.hasExternalAuth=function(){return d.hasExternalAuth()},t.hasEditRestrictions=function(){return t.user&&t.user.username===s.ut.ADMIN},t.isOverrideAuth=function(){return d.isDefaultAuthEnabled()},t.isGraphQlOnlyRight=function(e){const r=t.hasManageRepositoryPermission(e),s=t.hasGraphqlPermission(e)||t.hasGraphqlPermission("*"),n=t.hasReadPermission(e)||t.hasReadPermission("*")||t.hasWritePermission(e)||t.hasWritePermission("*");return!r&&s&&n},t.setGrantedAuthorities=function(){function e(...e){for(let r=0;r<e.length;r++){const s=e[r];_.indexOf(t.user.grantedAuthorities,s)<0&&t.user.grantedAuthorities.push(s)}}if(t.user.grantedAuthorities=[],t.repositoryCheckError=!0,t.userType===s.ut.ADMIN)t.repositoryCheckError=!1,e(s.gG.ROLE_ADMIN);else if(t.userType===s.ut.REPO_MANAGER)t.repositoryCheckError=!1,e(s.gG.ROLE_REPO_MANAGER);else{e(s.gG.ROLE_USER);for(const r in t.grantedAuthorities.MANAGE_REPO)t.grantedAuthorities.MANAGE_REPO[r]&&(t.repositoryCheckError=!1,e(n.w$+r,n._5+r,n.xF+r));for(const r in t.grantedAuthorities.WRITE_REPO)t.grantedAuthorities.WRITE_REPO[r]&&(t.repositoryCheckError=!1,e(n._5+r,n.xF+r));for(const r in t.grantedAuthorities.READ_REPO)t.grantedAuthorities.READ_REPO[r]&&(t.repositoryCheckError=!1,e(n.xF+r));for(const r in t.grantedAuthorities.GRAPHQL)if(t.grantedAuthorities.GRAPHQL[r]){const s=t.grantedAuthorities.READ_REPO[r]||t.grantedAuthorities.READ_REPO["*"],o=t.grantedAuthorities.WRITE_REPO[r]||t.grantedAuthorities.WRITE_REPO["*"];(s||o)&&e(n.B1+r)}}t.customRoles&&t.customRoles.forEach(t=>e("CUSTOM_"+t))},t.$watch("userType",function(){t.isUser()||(t.customRoles="")}),t.isUser=function(){return t.userType===s.ut.USER},t.hasReadPermission=function(e){const r=h.getLocationSpecificId(e);return t.userType===s.ut.ADMIN||t.userType===s.ut.REPO_MANAGER||e.id!==n.n5&&(t.grantedAuthorities.READ_REPO["*"]||t.grantedAuthorities.WRITE_REPO["*"])||t.grantedAuthorities.READ_REPO[r]||t.grantedAuthorities.WRITE_REPO[r]||t.grantedAuthorities.MANAGE_REPO[r]},t.hasWritePermission=function(e){const r=h.getLocationSpecificId(e);return t.userType===s.ut.ADMIN||t.userType===s.ut.REPO_MANAGER||e.id!==n.n5&&t.grantedAuthorities.WRITE_REPO["*"]||t.grantedAuthorities.MANAGE_REPO[r]||t.grantedAuthorities.WRITE_REPO[r]},t.hasManageRepositoryPermission=function(e){const r=h.getLocationSpecificId(e);return t.userType===s.ut.ADMIN||t.userType===s.ut.REPO_MANAGER||t.grantedAuthorities.MANAGE_REPO[r]},t.hasGraphqlPermission=function(e){const r=h.getLocationSpecificId(e),s=t.hasManageRepositoryPermission(e),o=t.grantedAuthorities.GRAPHQL["*"]||t.grantedAuthorities.GRAPHQL[r],i=t.hasReadPermission(e),a=e.id===n.n5;return!s&&!a&&o&&i},t.readCheckDisabled=function(e){return!(!t.canExtendExternalUserRole||t.allowRoleExtension)||t.hasWritePermission(e)||e.id!==n.n5&&"*"!==e&&t.grantedAuthorities.READ_REPO["*"]||t.hasEditRestrictions()},t.writeCheckDisabled=function(e){return!(!t.canExtendExternalUserRole||t.allowRoleExtension)||t.hasManageRepositoryPermission(e)||e.id!==n.n5&&"*"!==e&&t.grantedAuthorities.WRITE_REPO["*"]||t.hasEditRestrictions()},t.manageRepoCheckDisabled=function(){return!(!t.canExtendExternalUserRole||t.allowRoleExtension)||t.userType===s.ut.ADMIN||t.userType===s.ut.REPO_MANAGER||t.hasEditRestrictions()},t.graphqlCheckDisabled=function(e){if(t.hasManageRepositoryPermission(e))return!0;if(t.hasEditRestrictions())return!0;if(t.canExtendExternalUserRole&&!t.allowRoleExtension)return!0;const r=t.grantedAuthorities.READ_REPO["*"],s=t.grantedAuthorities.WRITE_REPO["*"],n=t.grantedAuthorities.GRAPHQL["*"];if("*"!==e&&n)return!0;if("*"===e&&n&&r)return!1;let o;o=null!==e&&"object"==typeof e?h.getLocationSpecificId(e):e;const i=t.grantedAuthorities.READ_REPO[o],a=t.grantedAuthorities.WRITE_REPO[o];return!(r||s||i||a)},t.createUniqueKey=function(e){return h.getLocationSpecificId(e)},t.userType=s.ut.USER,t.grantedAuthorities={[n.aj]:{},[n.DX]:{},[n.ln]:{},[n.w0]:{}},t.validatePassword=function(){return t.noPassword?(t.passwordError="",t.confirmPasswordError="",!0):t.user.password!==t.user.confirmpassword?(t.user.password?(t.passwordError="",t.confirmPasswordError=l.instant("security.confirm.password")):(t.passwordError=l.instant("security.enter.password"),t.confirmPasswordError=""),!1):(t.passwordError="",t.confirmPasswordError="",!0)},t.isLocalAuthentication=function(){return"Local"===d.getAuthImplementation()},t.updateUser=function(){if(!t.validateForm())return!1;(t.isLocalAuthentication()||t.canExtendExternalUserRole&&t.allowRoleExtension)&&t.setGrantedAuthorities(),t.repositoryCheckError||t.updateUserHttp()},t.setNoPassword=function(){t.noPassword&&(t.user.password="",t.user.confirmpassword="",t.passwordError="",t.confirmPasswordError="")},t.shouldDisableSameAs=function(){const e=$("#sameAsCheck");return t.user&&!t.user.appSettings.DEFAULT_INFERENCE&&e.prop("checked")&&(e.prop("checked",!1),t.user.appSettings.DEFAULT_SAMEAS=!1),t.user&&!t.user.appSettings.DEFAULT_INFERENCE},t.isRoleValid=!0,t.addCustomRole=function(e){return t.isRoleValid=!0,e.text=e.text.toUpperCase(),e},t.isCustomRoleValid=function(e){return t.isRoleValid=e.text.length>=2,t.isRoleValid},t.checkUserInput=function(e){8!==e.keyCode&&46!==e.keyCode||(t.isRoleValid=!0)},t.removeErrorOnCut=function(){t.isRoleValid=!0}}]),c.controller("AddUserCtrl",["$scope","$http","toastr","$window","$timeout","$location","$jwtAuth","$controller","SecurityService","ModalService","$translate",function(e,t,r,n,o,a,c,u,d,l,p){angular.extend(this,u("CommonUserCtrl",{$scope:e,passwordPlaceholder:"security.password.placeholder"}));const E=(0,i.service)(i.UsersService);e.mode="add",e.saveButtonText=p.instant("common.create.btn"),e.goBack=function(){a.url("users")},e.pageTitle=p.instant("view.create.user.title"),e.passwordPlaceholder=p.instant("security.password.placeholder"),e.user={username:"",password:"",confirmpassword:"",grantedAuthorities:[],appSettings:{DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0}},e.allowRoleExtension=!0,e.disableRoleExtension=!0,e.canExtendExternalUserRole&&(e.noPassword=!0,e.setNoPassword()),e.submit=function(){!e.canExtendExternalUserRole&&e.noPassword&&e.userType===s.ut.ADMIN?l.openSimpleModal({title:p.instant("security.create.admin"),message:p.instant("security.admin.login.warning"),warning:!0}).result.then(function(){e.createUser()}):e.createUser()},e.createUserHttp=function(){e.loader=!0;const t=new i.User({username:e.user.username,password:e.user.password,appSettings:new i.AppSettings(e.user.appSettings),authorities:new i.AuthorityList(e.user.grantedAuthorities)});E.createUser(t).then(()=>{r.success(p.instant("security.user.created",{name:e.user.username}));const t=o(function(){e.loader=!1,a.path("users")},2e3);e.$on("$destroy",function(){o.cancel(t)})}).catch(async t=>{e.loader=!1,r.error(getError(t),p.instant("common.error"))})},e.createUser=function(){e.validateForm()&&(e.setGrantedAuthorities(),e.repositoryCheckError||e.createUserHttp())},e.validateForm=function(){let t=!0;return e.user.username?e.usernameError="":(e.usernameError=p.instant("security.enter.username"),t=!1),e.noPassword?(e.passwordError="",e.confirmPasswordError=""):(e.user.password?e.passwordError="":(e.passwordError=p.instant("security.enter.password"),t=!1),e.user.confirmpassword&&e.user.password===e.user.confirmpassword?e.confirmPasswordError="":(e.confirmPasswordError=p.instant("security.confirm.password"),t=!1)),t}}]),c.controller("EditUserCtrl",["$scope","$http","toastr","$window","$routeParams","$timeout","$location","$jwtAuth","$controller","SecurityService","ModalService","$translate",function(e,t,r,n,o,c,u,d,l,p,E,h){angular.extend(this,l("CommonUserCtrl",{$scope:e,passwordPlaceholder:"security.new.password"}));const g=(0,i.service)(i.UsersService),m=(0,i.service)(i.AuthorizationService),A=(0,i.service)(i.SecurityContextService);e.mode="edit",e.saveButtonText=h.instant("common.save.btn"),e.goBack=function(){u.url("users")},e.params=o,e.pageTitle=h.instant("view.edit.user.title",{userId:e.params.userId}),e.passwordPlaceholder=h.instant("security.new.password"),e.userType=s.ut.USER;const R={DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0};e.allowRoleExtension=!1,e.disableRoleExtension=!1,m.hasRole(s.gG.ROLE_ADMIN)||u.url("settings"),e.getUserData=function(){g.getUser(e.params.userId).then(function(t){const r=e.canExtendExternalUserRole&&!!t.authorities.size();e.user={username:t.username},e.user.password="",e.user.confirmpassword="",e.user.appSettings=t.appSettings||R,e.userType=t.getUserType(),e.grantedAuthorities=t.authorities.toUIModel(),e.customRoles=t.authorities.getCustomRoles(),e.user.isExtended=r,e.user.canRemoveExtendedPermissions=r&&t.hasExternalLogin,e.allowRoleExtension=r??!1}).catch(function(e){const t=getError(e);r.error(t,h.instant("common.error"))})},e.getUserData(),e.submit=function(){if(!e.canExtendExternalUserRole&&e.noPassword&&e.userType===s.ut.ADMIN)E.openSimpleModal({title:h.instant("security.save.admin.settings"),message:h.instant("security.admin.pass.unset"),warning:!0}).result.then(function(){e.updateUser()});else if(e.user.isExtended&&!e.allowRoleExtension){const t=(0,a.Gz)(h.instant("security.confirm.save.extended.user.remove.permissions.title",{name:e.user.username})),r=(0,a.Gz)(h.instant("security.confirm.save.extended.user.remove.permissions.body",{name:e.user.username,authSource:e.authSource}));E.openSimpleModal({title:t,message:r,warning:!0}).result.then(function(){e.updateUser()})}else e.updateUser()},e.updateUserHttp=function(){e.loader=!0;const t=new i.User({username:e.user.username,password:e.noPassword?"":e.user.password||void 0,appSettings:new i.AppSettings(e.user.appSettings),authorities:new i.AuthorityList(e.user.grantedAuthorities)});g.updateUser(t).then(()=>{r.success(h.instant("security.user.updated",{name:e.user.username}));const t=c(function(){e.loader=!1,u.path("users")},2e3);e.$on("$destroy",function(){c.cancel(t)});const s=A.getAuthenticatedUser();e.user.username===s.username&&s.setAppSettings(new i.AppSettings(e.user.appSettings))}).catch(t=>{const s=getError(t);e.loader=!1,r.error(s,h.instant("common.error"))})},e.validateForm=function(){return e.validatePassword()}}]),c.controller("RolesMappingController",["$scope","toastr","SecurityService","$translate",function(e,t,r,s){e.debugMapping=function(e,t){const s=t.split(":");r.getRolesMapping({role:e,method:s[1],mapping:s[0]})},e.$on("repositoryIsSet",function(){r.getRoles().success(function(t){e.roleMappings=t,e.roles=_.keys(e.roleMappings),e.mappings=_.keys(e.roleMappings[e.roles[0]]);const r=_.map(e.roles,function(t){return[t,_.filter(e.roleMappings[t]).length]});e.roles=_.reverse(_.map(_.orderBy(r,function(e){return e[1]}),function(e){return e[0]}))}).error(function(r){const n=getError(r);e.loader=!1,t.error(n,s.instant("common.error"))})})}]),c.controller("DeleteUserCtrl",["$scope","$uibModalInstance","username",function(e,t,r){e.username=r,e.ok=function(){t.close()},e.cancel=function(){t.dismiss("cancel")}}])},72348(){angular.module("graphdb.framework.security.directives",[]).directive("customPrefixTagsInput",function(){return{restrict:"A",link:function(e,t,r){const s=[];function n(e){return e.startsWith("CUSTOM_")||e.startsWith("!CUSTOM_")}const o="tags-input"===t[0].nodeName.toLowerCase();if(o&&r.ngModel){const i=t.controller("ngModel");o&&(i.$parsers.push(function(e){return Array.isArray(e)&&(i.$warning=e.some(e=>n(e))),e}),s.push(e.$watch(r.ngModel,function(e){Array.isArray(e)&&(i.$warning=e.some(e=>n(e)))},!0)))}s.push(e.$on("$destroy",()=>{s.forEach(e=>e())}))}}})},1767(e,t,r){r.d(t,{B1:()=>l,DX:()=>i,_5:()=>u,aj:()=>n,ln:()=>a,n5:()=>s,w$:()=>d,w0:()=>c,xF:()=>o});const s="SYSTEM",n="READ_REPO",o="READ_REPO_",i="WRITE_REPO",a="MANAGE_REPO",c="GRAPHQL",u="WRITE_REPO_",d="MANAGE_REPO_",l="GRAPHQL_"}};
|
|
2
|
+
//# sourceMappingURL=21156.63548683f637e0115466.bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"21156.63548683f637e0115466.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/security/controllers.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/services/constants.js"],"sourcesContent":["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, MANAGE_REPO, MANAGE_REPO_PREFIX, READ_REPO, READ_REPO_PREFIX, SYSTEM_REPO, WRITE_REPO, WRITE_REPO_PREFIX} from './services/constants';\nimport {DocumentationUrlResolver} from '../utils/documentation-url-resolver';\nimport {\n AppSettings,\n AuthenticationService,\n AuthorityList,\n AuthorizationService,\n LanguageContextService,\n mapAuthSettingsResponseToModel,\n mapGrantedAuthoritiesResponseToModel,\n OntoToastrService,\n RepositoryAuthorityService,\n SecurityContextService,\n SecurityService as SecurityServiceAPI,\n service,\n User,\n UsersService,\n} from '@ontotext/workbench-api';\nimport {decodeHTML} from '../../../app';\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', 'productInfo',\n function($scope, $uibModal, toastr, $window, $jwtAuth, $timeout, ModalService, SecurityService, $translate, productInfo) {\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 repositoryAuthorityService = service(RepositoryAuthorityService);\n const securityContextService = service(SecurityContextService);\n const languageContextService = service(LanguageContextService);\n\n // UI view-model\n $scope.usersData = [];\n\n $scope.loader = true;\n $scope.isSecurityToggleAllowed = securityContextService.getSecurityConfig()?.isSecurityToggleAllowed();\n $scope.isPasswordLoginEnabled = securityContextService.getSecurityConfig()?.isPasswordLoginEnabled();\n $scope.isOpenIDEnabled = securityContextService.getSecurityConfig()?.isOpenIdEnabled();\n $scope.authSource = securityContextService.getSecurityConfig()?.getAuthSourceType();\n $scope.canExtendExternalUserRole = authorizationService.canExtendExternalUsers();\n $scope.additionalAuthSources = securityContextService.getSecurityConfig()?.additionalAuthSources.join(', ');\n $scope.toggleState = {hovered: false};\n\n const getSecurityToggleTooltip = () => {\n const action = $scope.securityEnabled() ? $translate.instant('disable') : $translate.instant('enable');\n return $translate.instant('security.toggle.tooltip', {action});\n };\n\n $scope.securityToggleNotAllowedDocUrl = DocumentationUrlResolver.getDocumentationUrl(productInfo.productShortVersion, 'security.html');\n\n $scope.securityEnabled = function() {\n return authenticationService.isSecurityEnabled();\n };\n\n $scope.securityToggleTooltip = getSecurityToggleTooltip();\n\n const subscribeToLanguageChange = () => {\n return languageContextService.onSelectedLanguageChanged(() => {\n $scope.securityToggleTooltip = getSecurityToggleTooltip();\n });\n };\n\n const subscriptions = [\n subscribeToLanguageChange(),\n ];\n\n $scope.hasExternalAuth = function() {\n return $jwtAuth.hasExternalAuth();\n };\n\n $scope.freeAccessEnabled = function() {\n return authorizationService.hasFreeAccess();\n };\n\n const canDeleteUser = (user) => {\n if (user.canRemoveExtendedPermissions) {\n return false;\n }\n\n if ($scope.canExtendExternalUserRole) {\n return user.isExtended;\n }\n\n return !$scope.hasExternalAuth() && user.username !== 'admin';\n };\n\n const mapRepositoryRights = (repositories) => Object.entries(repositories).map(([repository, rights]) => {\n let iconClass;\n let tooltipKey;\n if (rights.manage) {\n iconClass = 'ri-folder-settings-line';\n tooltipKey = 'security.has.manage.permission';\n } else if (rights.write) {\n iconClass = 'ri-edit-line';\n tooltipKey = 'security.has.write.permission';\n } else if (rights.read) {\n iconClass = 'ri-eye-line';\n tooltipKey = 'security.has.read.permission';\n }\n\n return {\n repository,\n iconClass,\n tooltipKey,\n hasGraphqlAccess: rights.graphql,\n graphqlTooltipKey: rights.write ? 'security.has.mutation_permission' : 'security.no.mutation_permission',\n };\n });\n\n const createUserViewModel = (user) => {\n const userType = user.getUserType();\n const isExtended = $scope.canExtendExternalUserRole && !!user.authorities.size();\n const viewModel = {\n username: user.username,\n dateCreated: user.dateCreated,\n userTypeDescription: user.getUserTypeDescription(),\n repositoryRights: mapRepositoryRights(user.authorities.getRepositoriesPermissions()),\n customRoles: user.authorities.getCustomRoles(),\n isExtended,\n showRepositoryRights: userType === UserType.USER,\n showUnrestrictedRights: userType !== UserType.USER,\n showPendingExternalLogin: $scope.canExtendExternalUserRole && !user.hasExternalLogin,\n canRemoveExtendedPermissions: isExtended && user.hasExternalLogin,\n };\n viewModel.canDelete = canDeleteUser(viewModel);\n return viewModel;\n };\n\n $scope.getUsers = () => {\n return usersService.getUsers()\n .then(function(data) {\n $scope.usersData = data.map(createUserViewModel);\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 if (!$scope.isSecurityToggleAllowed) {\n return;\n }\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 repositoryAuthorityService.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 /**\n * Removes a user or the locally assigned permissions of an established external user.\n *\n * @param {object} user - User view model selected from the users table.\n */\n $scope.removeUser = function(user) {\n let title = $translate.instant('common.confirm.delete');\n let message = $translate.instant('security.confirm.delete.user', {name: user.username});\n if ($scope.canExtendExternalUserRole) {\n const canDowngradedUserPermissions = user.canRemoveExtendedPermissions;\n const dialogTitleKey = canDowngradedUserPermissions ? 'security.confirm.remove.extended.user.permissions.title' : 'security.confirm.delete.extended.user.title';\n const dialogMessageKey = canDowngradedUserPermissions ? 'security.confirm.remove.extended.user.permissions.body' : 'security.confirm.delete.extended.user.body';\n title = decodeHTML($translate.instant(dialogTitleKey, {name: user.username}));\n message = decodeHTML($translate.instant(dialogMessageKey, {name: user.username, authSource: $scope.authSource}));\n }\n ModalService.openSimpleModal({\n title,\n message,\n warning: true,\n }).result.then(function() {\n $scope.loader = true;\n usersService.deleteUser(user.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 $scope.$on('$destroy', function() {\n subscriptions.forEach((unsubscribe) => unsubscribe());\n });\n }]);\n\nsecurityModule.controller('DefaultAuthoritiesCtrl', ['$scope', '$http', '$uibModalInstance', 'data', '$rootScope',\n function($scope, $http, $uibModalInstance, data, $rootScope) {\n const repositoryAuthorityService = service(RepositoryAuthorityService);\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 repositoryAuthorityService.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 repositoryAuthorityService = service(RepositoryAuthorityService);\n const securityContextService = service(SecurityContextService);\n\n $scope.canExtendExternalUserRole = authorizationService.canExtendExternalUsers();\n $scope.authSource = securityContextService.getSecurityConfig()?.getAuthSourceType();\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.isGraphQlOnlyRight = function(repository) {\n const isManageRepoUser = $scope.hasManageRepositoryPermission(repository);\n const hasGraphQlPermissions = $scope.hasGraphqlPermission(repository) || $scope.hasGraphqlPermission('*');\n const hasReadWritePermissions = $scope.hasReadPermission(repository) || $scope.hasReadPermission('*') || $scope.hasWritePermission(repository) || $scope.hasWritePermission('*');\n return !isManageRepoUser && hasGraphQlPermissions && hasReadWritePermissions;\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 $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.MANAGE_REPO) {\n if ($scope.grantedAuthorities.MANAGE_REPO[index]) {\n $scope.repositoryCheckError = false;\n pushAuthority(MANAGE_REPO_PREFIX + index, WRITE_REPO_PREFIX + index, READ_REPO_PREFIX + index);\n }\n }\n\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 const hasReadPermission = $scope.grantedAuthorities.READ_REPO[index] || $scope.grantedAuthorities.READ_REPO['*'];\n const hasWritePermission = $scope.grantedAuthorities.WRITE_REPO[index] || $scope.grantedAuthorities.WRITE_REPO['*'];\n if (hasReadPermission || hasWritePermission) {\n pushAuthority(GRAPHQL_PREFIX + index);\n }\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 = repositoryAuthorityService.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 || $scope.grantedAuthorities.MANAGE_REPO[uniqueKey];\n };\n\n $scope.hasWritePermission = function(repoOrWildCard) {\n const uniqueKey = repositoryAuthorityService.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.MANAGE_REPO[uniqueKey]\n || $scope.grantedAuthorities.WRITE_REPO[uniqueKey];\n };\n\n $scope.hasManageRepositoryPermission = function(repoOrWildCard) {\n const uniqueKey = repositoryAuthorityService.getLocationSpecificId(repoOrWildCard);\n return $scope.userType === UserType.ADMIN\n || $scope.userType === UserType.REPO_MANAGER\n || $scope.grantedAuthorities.MANAGE_REPO[uniqueKey];\n };\n\n $scope.hasGraphqlPermission = function(repository) {\n const uniqueKey = repositoryAuthorityService.getLocationSpecificId(repository);\n const isManageRepoUser = $scope.hasManageRepositoryPermission(repository);\n const hasGraphQlPermissions = $scope.grantedAuthorities.GRAPHQL['*'] || $scope.grantedAuthorities.GRAPHQL[uniqueKey];\n const hasReadWritePermissions = $scope.hasReadPermission(repository);\n const isSystemRepo = repository.id === SYSTEM_REPO;\n\n return !isManageRepoUser && (!isSystemRepo && hasGraphQlPermissions && hasReadWritePermissions);\n };\n\n $scope.readCheckDisabled = function(repoOrWildCard) {\n if ($scope.canExtendExternalUserRole && !$scope.allowRoleExtension) {\n return true;\n }\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 if ($scope.canExtendExternalUserRole && !$scope.allowRoleExtension) {\n return true;\n }\n return $scope.hasManageRepositoryPermission(repoOrWildCard)\n || repoOrWildCard.id !== SYSTEM_REPO && repoOrWildCard !== '*' && $scope.grantedAuthorities.WRITE_REPO['*']\n || $scope.hasEditRestrictions();\n };\n\n $scope.manageRepoCheckDisabled = function() {\n if ($scope.canExtendExternalUserRole && !$scope.allowRoleExtension) {\n return true;\n }\n return $scope.userType === UserType.ADMIN\n || $scope.userType === UserType.REPO_MANAGER\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.hasManageRepositoryPermission(repoOrWildCard)) {\n return true;\n }\n\n if ($scope.hasEditRestrictions()) {\n return true;\n }\n\n if ($scope.canExtendExternalUserRole && !$scope.allowRoleExtension) {\n return true;\n }\n\n const hasReadWildcard = $scope.grantedAuthorities.READ_REPO['*'];\n const hasWriteWildcard = $scope.grantedAuthorities.WRITE_REPO['*'];\n const hasGraphqlWildcard = $scope.grantedAuthorities.GRAPHQL['*'];\n\n\n if (repoOrWildCard !== '*' && hasGraphqlWildcard) {\n return true;\n }\n\n if (repoOrWildCard === '*' && hasGraphqlWildcard && hasReadWildcard) {\n return false;\n }\n\n let uniqueKey;\n if (repoOrWildCard !== null && typeof repoOrWildCard === 'object') {\n uniqueKey = repositoryAuthorityService.getLocationSpecificId(repoOrWildCard);\n } else {\n uniqueKey = repoOrWildCard;\n }\n\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 repositoryAuthorityService.getLocationSpecificId(repository);\n };\n\n $scope.userType = UserType.USER;\n $scope.grantedAuthorities = {\n [READ_REPO]: {},\n [WRITE_REPO]: {},\n [MANAGE_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() || ($scope.canExtendExternalUserRole && $scope.allowRoleExtension)) {\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 $location.url('users');\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 /**\n * Controls whether role and repository permission editing is enabled for an external user.\n *\n * @type {boolean}\n */\n $scope.allowRoleExtension = true;\n\n /**\n * Disablel role extension toggle for new users and user settings\n *\n * @type {boolean}\n */\n $scope.disableRoleExtension = true;\n\n if ($scope.canExtendExternalUserRole) {\n $scope.noPassword = true;\n $scope.setNoPassword();\n }\n\n $scope.submit = function() {\n if (!$scope.canExtendExternalUserRole && $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 $location.url('users');\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 /**\n * Controls whether role and repository permission editing is enabled for an external user.\n *\n * @type {boolean}\n */\n $scope.allowRoleExtension = false;\n\n /**\n * Disablel role extension toggle for new users and user settings\n *\n * @type {boolean}\n */\n $scope.disableRoleExtension = false;\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 const isExtended = $scope.canExtendExternalUserRole && !!data.authorities.size();\n $scope.user = {username: data.username};\n $scope.user.password = '';\n $scope.user.confirmpassword = '';\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 $scope.user.isExtended = isExtended;\n $scope.user.canRemoveExtendedPermissions = isExtended && data.hasExternalLogin;\n $scope.allowRoleExtension = isExtended ?? false;\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.canExtendExternalUserRole && $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 if ($scope.user.isExtended && !$scope.allowRoleExtension) {\n const title = decodeHTML($translate.instant('security.confirm.save.extended.user.remove.permissions.title', {name: $scope.user.username}));\n const message = decodeHTML($translate.instant('security.confirm.save.extended.user.remove.permissions.body', {name: $scope.user.username, authSource: $scope.authSource}));\n ModalService.openSimpleModal({\n title,\n message,\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 $location.path('users');\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","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","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 MANAGE_REPO = 'MANAGE_REPO';\nexport const GRAPHQL = 'GRAPHQL';\nexport const WRITE_REPO_PREFIX = 'WRITE_REPO_';\nexport const MANAGE_REPO_PREFIX = 'MANAGE_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"],"names":["securityModule","angular","module","controller","$scope","$uibModal","toastr","$window","$jwtAuth","$timeout","ModalService","SecurityService","$translate","productInfo","authorizationService","service","AuthorizationService","authenticationService","AuthenticationService","securityServiceAPI","SecurityServiceAPI","toastrService","OntoToastrService","usersService","UsersService","repositoryAuthorityService","RepositoryAuthorityService","securityContextService","SecurityContextService","languageContextService","LanguageContextService","usersData","loader","isSecurityToggleAllowed","getSecurityConfig","isPasswordLoginEnabled","isOpenIDEnabled","isOpenIdEnabled","authSource","getAuthSourceType","canExtendExternalUserRole","canExtendExternalUsers","additionalAuthSources","join","toggleState","hovered","getSecurityToggleTooltip","action","securityEnabled","instant","securityToggleNotAllowedDocUrl","DocumentationUrlResolver","getDocumentationUrl","productShortVersion","isSecurityEnabled","securityToggleTooltip","subscriptions","onSelectedLanguageChanged","hasExternalAuth","freeAccessEnabled","hasFreeAccess","createUserViewModel","user","userType","getUserType","isExtended","authorities","size","viewModel","username","dateCreated","userTypeDescription","getUserTypeDescription","repositoryRights","repositories","getRepositoriesPermissions","Object","entries","map","repository","rights","iconClass","tooltipKey","manage","write","read","hasGraphqlAccess","graphql","graphqlTooltipKey","customRoles","getCustomRoles","showRepositoryRights","UserType","USER","showUnrestrictedRights","showPendingExternalLogin","hasExternalLogin","canRemoveExtendedPermissions","canDelete","canDeleteUser","getUsers","then","data","catch","msg","getError","error","$on","toggleSecurity","location","reload","setFreeAccess","enabled","authSettings","toggleFreeAccess","updateFreeAccess","getFreeAccess","freeAccessAuthSettings","mapGrantedAuthoritiesResponseToModel","getItems","appSettings","configureFreeAccess","updatedFreeAccessAuthSettings","isFreeAccessEnabled","translateKey","success","status","err","open","templateUrl","resolve","defaultAuthorities","READ_REPO","WRITE_REPO","GRAPHQL","repoIds","_","mapKeys","getRepositories","r","getLocationSpecificId","each","a","indexOf","WRITE_REPO_PREFIX","hasOwnProperty","substr","READ_REPO_PREFIX","GRAPHQL_PREFIX","result","mapAuthSettingsResponseToModel","editFreeAccess","removeUser","title","message","name","canDowngradedUserPermissions","dialogTitleKey","dialogMessageKey","decodeHTML","openSimpleModal","warning","deleteUser","encodeURIComponent","forEach","unsubscribe","$http","$uibModalInstance","$rootScope","grantedAuthorities","hasActiveLocation","isEmpty","globalLocation","globalRepositories","ok","auth","repositoryCheckError","index","push","close","cancel","dismiss","createUniqueKey","$location","passwordPlaceholder","isAdmin","hasRole","UserRole","ROLE_ADMIN","hasEditRestrictions","ADMIN","isOverrideAuth","isDefaultAuthEnabled","isGraphQlOnlyRight","isManageRepoUser","hasManageRepositoryPermission","hasGraphQlPermissions","hasGraphqlPermission","hasReadWritePermissions","hasReadPermission","hasWritePermission","setGrantedAuthorities","pushAuthority","i","length","authority","REPO_MANAGER","ROLE_REPO_MANAGER","ROLE_USER","MANAGE_REPO","MANAGE_REPO_PREFIX","role","$watch","isUser","uniqueKey","id","SYSTEM_REPO","repoOrWildCard","isSystemRepo","readCheckDisabled","allowRoleExtension","writeCheckDisabled","manageRepoCheckDisabled","graphqlCheckDisabled","hasReadWildcard","hasWriteWildcard","hasGraphqlWildcard","hasReadForRepo","hasWriteForRepo","validatePassword","noPassword","passwordError","confirmPasswordError","password","confirmpassword","isLocalAuthentication","getAuthImplementation","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","url","pageTitle","disableRoleExtension","submit","createUser","createUserHttp","User","AppSettings","AuthorityList","timer","path","async","usernameError","$routeParams","params","userId","defaultUserSettings","getUserData","getUser","toUIModel","undefined","principal","getAuthenticatedUser","setAppSettings","debugMapping","mapping","method","split","getRolesMapping","getRoles","roleMappings","roles","keys","mappings","permissionsCount","filter","reverse","orderBy","p","directive","restrict","link","scope","element","attrs","hasCustomOrNegatedPrefix","tag","startsWith","isNgTagsInput","nodeName","toLowerCase","ngModel","ngModelCtrl","$parsers","viewValue","Array","isArray","$warning","some","newVal","unsubscribeListeners","subscription"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export const __webpack_esm_id__=43239;export const __webpack_esm_ids__=[43239];export const __webpack_esm_modules__={29229(e,t,i){function a(e,t=300){let i;return(...a)=>{clearTimeout(i),i=setTimeout(()=>e.apply(this,a),t)}}i.d(t,{d:()=>a})},43239(e,t,i){i.r(t),i.d(t,{onto_layout:()=>o});var a=i(18072),s=i(29229),n=i(57154),r=i(54096);const o=class{constructor(e){(0,a.r)(this,e),this.authenticationService=(0,n.service)(n.AuthenticationService),this.authorizationService=(0,n.service)(n.AuthorizationService),this.navigationContextService=(0,n.service)(n.NavigationContextService),this.authStorageService=(0,n.service)(n.AuthenticationStorageService),this.runtimeConfigurationContextService=(0,n.service)(n.RuntimeConfigurationContextService),this.eventService=(0,n.service)(n.EventService),this.applicationLifecycleContextService=(0,n.service)(n.ApplicationLifecycleContextService),this.userPreferencesService=(0,n.service)(n.UserPreferencesService),this.userPreferencesContextService=(0,n.service)(n.UserPreferencesContextService),this.guideContextService=(0,n.service)(n.GuideContextService),this.fullJwtKey=`${n.StorageKey.GLOBAL_NAMESPACE}.${this.authStorageService.NAMESPACE}.${this.authStorageService.jwtKey}`,this.fullAuthenticatedKey=`${n.StorageKey.GLOBAL_NAMESPACE}.${this.authStorageService.NAMESPACE}.${this.authStorageService.authenticatedKey}`,this.authEvents=[this.fullJwtKey,this.fullAuthenticatedKey],this.isLowResolution=!1,this.showHeader=this.isAuthenticatedFully(),this.showNavbar=!1,this.isEmbedded=!1,this.loading=!0,this.hideSolrDeprecationBanner=!1,this.subscriptions=new n.SubscriptionList,this.isNavbarCollapsed=!1,this.handleStorageChange=e=>{(0,n.service)(n.LocalStorageSubscriptionHandlerService).handleStorageChange(e),this.handleAuthChange(e.key)},this.windowResizeObserver=(0,s.d)(()=>this.windowResizeHandler(),50),n.WindowService.getWindow().addEventListener("storage",this.handleStorageChange)}componentDidRender(){this.windowResizeHandler()}componentDidLoad(){this.updateSolrDeprecationBannerVisibility()}connectedCallback(){this.subscribeToSecurityChanges(),this.updateVisibility(),this.subscribeToNavigationEnd(),this.subscribeToRuntimeConfigurationChanges(),this.subscribeToUserPreferencesChange(),this.subscribeToBeforeMountRouting(),this.subscribeToGuideChanges(),this.loading=!1}disconnectedCallback(){this.subscriptions.unsubscribeAll()}render(){return(0,a.h)(a.a,{key:"a2c03bbf9950679eaa453acbaa4a19b0b2531954",class:{"wb-layout":!0,"is-embedded":this.isEmbedded,"hide-navbar":!this.showNavbar,loading:this.loading}},(0,a.h)("div",{key:"abf73ea34785478a64aa8d9bfa1145ef0b4aa928",class:"default-slot-wrapper"},(0,a.h)("slot",{key:"dfadb7305e3a4c66f0420d5a6b6aeb1886d9f919",name:"default"})),!this.isEmbedded&&(0,a.h)("div",{key:"62b265aa0d85f3f268db59887504499df5350431",class:"wb-header"},!this.hideSolrDeprecationBanner&&(0,a.h)("onto-deprecation-banner",{key:"1f0e0f4b03891e54312c49af7338cfbfdb13fa34",class:"onto-deprecation-banner",onCloseBanner:this.onSolrDeprecationBannerClosedHandler()},(0,a.h)("span",{key:"1cb04339edac35746531faf974b2e4326487459f",slot:"content"},(0,a.h)("translate-label",{key:"6c878b7aa6e2d5f43080e228e0d09416c5c4dca9",labelKey:"deprecation-banner.solr.content"}))),(0,a.h)("header",{key:"ef2c7f171bc9106665c45edf35e5adeff1c37f82"},this.showHeader&&(0,a.h)("onto-header",{key:"38b45fa90a8f260f06c5e2d9a677aa59531dc5fa"}))),!this.isEmbedded&&this.showNavbar&&(0,a.h)("nav",{key:"3b960854719196924a1c5f2b0878f3aac02f5bbf",class:"wb-navbar"},(0,a.h)("onto-navbar",{key:"81dd034f009313391b85a962a0650f364a406eaf",ref:this.assignNavbarRef(),"navbar-collapsed":this.isLowResolution})),(0,a.h)("slot",{key:"58c1783a734f5c1af0dd775d98fa185a634791d6",name:"main"},(0,a.h)("onto-loader",{key:"4e8ef836d44566a9d2c8770fbb2fa0acbbf9455a",loading:this.loading,targetSelector:"main",size:96,messageText:r.T.translate("common.loading")})),!this.isEmbedded&&(0,a.h)("footer",{key:"39857f329a5978cca0f725e535730eef6c4bffe9",class:"wb-footer"},(0,a.h)("onto-footer",{key:"28bc198484360d99850149531e475a0e3ba1f426"})))}onNavbarToggled(e){this.isNavbarCollapsed=e.detail.payload,this.isNavbarCollapsed?this.hostElement.classList.add("expanded"):this.hostElement.classList.remove("expanded")}onResize(){this.windowResizeObserver()}onSolrDeprecationBannerClosedHandler(){return()=>{this.userPreferencesService.dismissSolrDeprecationBanner()}}windowResizeHandler(){var e,t,i,a;this.isLowResolution=n.WindowService.getWindow().innerWidth<=768;const s=document.querySelector(".navbar-component");if(s){const n=document.querySelector(".cookie-consent-banner"),r=document.querySelector(".wb-header"),o=null!==(t=null===(e=null==r?void 0:r.getBoundingClientRect())||void 0===e?void 0:e.height)&&void 0!==t?t:0,h=null!==(a=null===(i=null==n?void 0:n.getBoundingClientRect())||void 0===i?void 0:i.height)&&void 0!==a?a:0;s.style.height=`calc(100% - ${o}px - ${h}px)`}this.isLowResolution||this.isNavbarCollapsed?this.hostElement.classList.add("expanded"):this.hostElement.classList.remove("expanded")}handleAuthChange(e){var t;e&&this.authEvents.includes(e)&&(this.authStorageService.isAuthenticated()?(0,n.navigate)(null!==(t=this.navigationContextService.getPreviousRoute())&&void 0!==t?t:"./"):(0,n.navigate)("login"),n.WindowService.getWindow().location.reload())}subscribeToSecurityChanges(){const e=(0,n.service)(n.SecurityContextService);this.subscriptions.add(e.onAuthenticatedUserChanged(e=>{this.authenticatedUser=e,this.updateVisibility()})),this.subscriptions.add(e.onSecurityConfigChanged(e=>{this.securityConfig=e,this.updateVisibility()})),this.subscriptions.add(this.eventService.subscribe(n.EventName.LOGIN,()=>{this.setNavbarItemVisibility(),this.updateVisibility()})),this.subscriptions.add(this.eventService.subscribe(n.EventName.LOGOUT,()=>{this.setNavbarItemVisibility(),this.updateVisibility(),(0,n.navigate)("login")}))}subscribeToRuntimeConfigurationChanges(){this.subscriptions.add(this.runtimeConfigurationContextService.onRuntimeConfigurationChanged(e=>{var t;this.isEmbedded=null!==(t=null==e?void 0:e.isEmbedded)&&void 0!==t&&t}))}updateVisibility(){this.updateSolrDeprecationBannerVisibility(),this.authenticationService.isSecurityEnabled()?(this.showHeader=this.authenticationService.isAuthenticated()||this.authorizationService.hasFreeAccess(),this.showNavbar=this.authenticationService.isAuthenticated()||this.authorizationService.hasFreeAccess()):(this.showNavbar=!0,this.showHeader=!0)}isAuthenticatedFully(){return!this.authenticationService.isSecurityEnabled()||this.authenticationService.isAuthenticated()||this.authorizationService.hasFreeAccess()}shouldShowMenu(e){return this.isAuthenticatedFully()&&this.authorizationService.hasRole(e)}assignNavbarRef(){return e=>{this.navbarRef=e,this.navbarRef&&(this.navbarRef.menuItems=n.WindowService.getPluginRegistry().get(n.MainMenuExtensionPoint.NAME),this.setNavbarItemVisibility())}}setNavbarItemVisibility(){var e,t,i;if(!(null===(e=this.navbarRef)||void 0===e?void 0:e.menuItems))return;const a=e=>{var t;e.shouldShow=this.shouldShowMenu(e.role),(null===(t=e.children)||void 0===t?void 0:t.length)&&e.children.forEach(a)};null===(i=null===(t=this.navbarRef)||void 0===t?void 0:t.menuItems)||void 0===i||i.forEach(e=>{e.items.forEach(a)}),this.navbarRef.menuItems=[...this.navbarRef.menuItems]}subscribeToNavigationEnd(){this.subscriptions.add(this.eventService.subscribe(n.EventName.NAVIGATION_END,e=>{this.navigationContextService.updatePreviousRoute(e.oldUrl),setTimeout(()=>{this.loading=!1})}))}subscribeToBeforeMountRouting(){this.subscriptions.add(this.applicationLifecycleContextService.onNavigationBeforeMountRouting(e=>{e&&(this.loading=!0)}))}subscribeToUserPreferencesChange(){this.subscriptions.add(this.userPreferencesContextService.onUserPreferencesChanged(()=>{this.updateSolrDeprecationBannerVisibility()}))}subscribeToGuideChanges(){this.subscriptions.add(this.guideContextService.onHasRunningGuideChanged(()=>this.updateSolrDeprecationBannerVisibility()))}updateSolrDeprecationBannerVisibility(){return this.hideSolrDeprecationBanner=this.userPreferencesService.isSolrDeprecationBannerDismissed()||this.guideContextService.hasRunningGuide()}get hostElement(){return(0,a.d)(this)}};o.style=':host{display:block;height:100%}.wb-layout{display:grid;grid-template:"header header" auto "nav main" 1fr "nav footer" auto/15rem minmax(200px, 1fr);min-height:100vh;margin:0;}.wb-layout.expanded{grid-template-columns:4.375rem 1fr}.wb-layout.is-embedded{grid-template-columns:1fr;grid-template-areas:"main";padding-top:1rem}.wb-layout.hide-navbar{grid-template:"header" auto "main" 1fr "footer" auto/1fr;}.wb-layout.hide-navbar.expanded{grid-template-columns:1fr}.wb-layout main .main-container{margin-left:0}.wb-layout main{grid-area:main}.wb-layout.loading main{position:relative;visibility:hidden}.wb-layout .default-slot-wrapper{display:none}.wb-layout .wb-header{grid-area:header;position:sticky;top:0;z-index:999}.wb-layout nav{grid-area:nav}.wb-layout footer{grid-area:footer}'},54096(e,t,i){i.d(t,{L:()=>n,T:()=>o,s:()=>s});var a=i(57154);function s(e){const t=document.createElement("textarea");return t.innerHTML=e,t.value}class n{static get logger(){return a.Loggers.getLoggerInstance("SharedComponents")}}class r{constructor(){this.languageContextService=a.ServiceProvider.get(a.LanguageContextService),this.translationChangedObservers={},this.logger=n.logger,this.defaultBundle=this.languageContextService.getDefaultBundle(),this.subscribeToBundleChange()}onTranslate(e,t=[],i=()=>{}){this.translationChangedObservers[e]=this.translationChangedObservers[e]||[];const a={parameters:t,callback:i};return this.translationChangedObservers[e].push(a),i(this.translate(e,t)),()=>{const t=this.translationChangedObservers[e].indexOf(a);-1!==t&&this.translationChangedObservers[e].splice(t,1)}}translate(e,t){return this.translateInLocale(e,t)}translateInLocale(e,t){let i=this.translateFromBundle(this.currentBundle,e);return i||(i=this.translateFromBundle(this.defaultBundle,e)),i?(i=this.applyParameters(i,t),s(i)):(this.logger.warn(`Missing translation for key: [${e}]`),e)}translateFromBundle(e,t){if(!e)return;let i=e[t];return"string"!=typeof i&&(i=this.translateAsJsonObject(e,t)),i}translateAsJsonObject(e,t){if(!t)return;let i=t.split(".");return this.getTranslation(e,i)}getTranslation(e,t){if(!t||!e)return;const i=e[t.splice(0,1)[0]];return 0===t.length?i:"string"!=typeof i?t.length>0?this.getTranslation(i,t):i:void 0}applyParameters(e,t){return t?t.reduce((e,t)=>r.replaceAll(e,t),e):e}static replaceAll(e,t){return t?e.split(`{{${t.key}}}`).join(t.value):e}notifyTranslationsChanged(){Object.keys(this.translationChangedObservers).forEach(e=>{(this.translationChangedObservers[e]||[]).forEach(t=>t.callback(this.translate(e,t.parameters)))})}subscribeToBundleChange(){this.languageChangeSubscription=this.languageContextService.onLanguageBundleChanged(e=>{e&&(this.currentBundle=e,this.notifyTranslationsChanged())})}destroy(){this.languageChangeSubscription&&this.languageChangeSubscription()}}const o=new r}};
|
|
2
|
+
//# sourceMappingURL=43239.b39579736b18d118a4ed.bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"43239.b39579736b18d118a4ed.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/shared-components/dist/esm/function-utils-D1ZpXQQS.js","webpack://root-config/./packages/shared-components/dist/esm/onto-layout.entry.js","webpack://root-config/./packages/shared-components/dist/esm/translation.service-CyWR_ReZ.js"],"sourcesContent":["function debounce(func, wait = 300) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => func.apply(this, args), wait);\n };\n}\n\nexport { debounce as d };\n","import { r as registerInstance, h, a as Host, d as getElement } from './index-BntG-4Sv.js';\nimport { d as debounce } from './function-utils-D1ZpXQQS.js';\nimport { service, AuthenticationService, AuthorizationService, NavigationContextService, AuthenticationStorageService, RuntimeConfigurationContextService, EventService, ApplicationLifecycleContextService, UserPreferencesService, UserPreferencesContextService, GuideContextService, StorageKey, SubscriptionList, LocalStorageSubscriptionHandlerService, WindowService, navigate, SecurityContextService, EventName, MainMenuExtensionPoint } from '@ontotext/workbench-api';\nimport { T as TranslationService } from './translation.service-CyWR_ReZ.js';\n\nconst RESPONSIVE_BREAKPOINTS = {\n MD: 768};\n/**\n * The width of the window in pixels at which the navbar should collapse.\n */\nconst WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR = RESPONSIVE_BREAKPOINTS.MD;\n\nconst ontoLayoutCss = \":host{display:block;height:100%}.wb-layout{display:grid;grid-template:\\\"header header\\\" auto \\\"nav main\\\" 1fr \\\"nav footer\\\" auto/15rem minmax(200px, 1fr);min-height:100vh;margin:0;}.wb-layout.expanded{grid-template-columns:4.375rem 1fr}.wb-layout.is-embedded{grid-template-columns:1fr;grid-template-areas:\\\"main\\\";padding-top:1rem}.wb-layout.hide-navbar{grid-template:\\\"header\\\" auto \\\"main\\\" 1fr \\\"footer\\\" auto/1fr;}.wb-layout.hide-navbar.expanded{grid-template-columns:1fr}.wb-layout main .main-container{margin-left:0}.wb-layout main{grid-area:main}.wb-layout.loading main{position:relative;visibility:hidden}.wb-layout .default-slot-wrapper{display:none}.wb-layout .wb-header{grid-area:header;position:sticky;top:0;z-index:999}.wb-layout nav{grid-area:nav}.wb-layout footer{grid-area:footer}\";\n\nconst OntoLayout = class {\n // ========================\n // Lifecycle methods\n // ========================\n constructor(hostRef) {\n registerInstance(this, hostRef);\n // ========================\n // Services\n // ========================\n this.authenticationService = service(AuthenticationService);\n this.authorizationService = service(AuthorizationService);\n this.navigationContextService = service(NavigationContextService);\n this.authStorageService = service(AuthenticationStorageService);\n this.runtimeConfigurationContextService = service(RuntimeConfigurationContextService);\n this.eventService = service(EventService);\n this.applicationLifecycleContextService = service(ApplicationLifecycleContextService);\n this.userPreferencesService = service(UserPreferencesService);\n this.userPreferencesContextService = service(UserPreferencesContextService);\n this.guideContextService = service(GuideContextService);\n this.fullJwtKey = `${StorageKey.GLOBAL_NAMESPACE}.${this.authStorageService.NAMESPACE}.${this.authStorageService.jwtKey}`;\n this.fullAuthenticatedKey = `${StorageKey.GLOBAL_NAMESPACE}.${this.authStorageService.NAMESPACE}.${this.authStorageService.authenticatedKey}`;\n this.authEvents = [this.fullJwtKey, this.fullAuthenticatedKey];\n this.isLowResolution = false;\n this.showHeader = this.isAuthenticatedFully();\n this.showNavbar = false;\n this.isEmbedded = false;\n this.loading = true;\n this.hideSolrDeprecationBanner = false;\n // ========================\n // Private\n // ========================\n /**\n * List of subscriptions to manage component lifecycle\n * */\n this.subscriptions = new SubscriptionList();\n this.isNavbarCollapsed = false;\n this.handleStorageChange = (event) => {\n const localStorageSubscriptionHandlerService = service(LocalStorageSubscriptionHandlerService);\n localStorageSubscriptionHandlerService.handleStorageChange(event);\n this.handleAuthChange(event.key);\n };\n this.windowResizeObserver = debounce(() => this.windowResizeHandler(), 50);\n WindowService.getWindow().addEventListener('storage', this.handleStorageChange);\n }\n componentDidRender() {\n this.windowResizeHandler();\n }\n componentDidLoad() {\n this.updateSolrDeprecationBannerVisibility();\n }\n connectedCallback() {\n this.subscribeToSecurityChanges();\n this.updateVisibility();\n this.subscribeToNavigationEnd();\n this.subscribeToRuntimeConfigurationChanges();\n this.subscribeToUserPreferencesChange();\n this.subscribeToBeforeMountRouting();\n this.subscribeToGuideChanges();\n this.loading = false;\n }\n /**\n * Lifecycle method called when the component is about to be removed from the DOM.\n * Unsubscribes from all subscriptions to prevent memory leaks.\n */\n disconnectedCallback() {\n this.subscriptions.unsubscribeAll();\n }\n render() {\n return (h(Host, { key: 'a2c03bbf9950679eaa453acbaa4a19b0b2531954', class: {\n 'wb-layout': true,\n 'is-embedded': this.isEmbedded,\n 'hide-navbar': !this.showNavbar,\n 'loading': this.loading\n } }, h(\"div\", { key: 'abf73ea34785478a64aa8d9bfa1145ef0b4aa928', class: \"default-slot-wrapper\" }, h(\"slot\", { key: 'dfadb7305e3a4c66f0420d5a6b6aeb1886d9f919', name: \"default\" })), !this.isEmbedded && h(\"div\", { key: '62b265aa0d85f3f268db59887504499df5350431', class: \"wb-header\" }, !this.hideSolrDeprecationBanner &&\n h(\"onto-deprecation-banner\", { key: '1f0e0f4b03891e54312c49af7338cfbfdb13fa34', class: 'onto-deprecation-banner', onCloseBanner: this.onSolrDeprecationBannerClosedHandler() }, h(\"span\", { key: '1cb04339edac35746531faf974b2e4326487459f', slot: 'content' }, h(\"translate-label\", { key: '6c878b7aa6e2d5f43080e228e0d09416c5c4dca9', labelKey: 'deprecation-banner.solr.content' }))), h(\"header\", { key: 'ef2c7f171bc9106665c45edf35e5adeff1c37f82' }, this.showHeader && h(\"onto-header\", { key: '38b45fa90a8f260f06c5e2d9a677aa59531dc5fa' }))), !this.isEmbedded && this.showNavbar &&\n h(\"nav\", { key: '3b960854719196924a1c5f2b0878f3aac02f5bbf', class: \"wb-navbar\" }, h(\"onto-navbar\", { key: '81dd034f009313391b85a962a0650f364a406eaf', ref: this.assignNavbarRef(), \"navbar-collapsed\": this.isLowResolution })), h(\"slot\", { key: '58c1783a734f5c1af0dd775d98fa185a634791d6', name: \"main\" }, h(\"onto-loader\", { key: '4e8ef836d44566a9d2c8770fbb2fa0acbbf9455a', loading: this.loading, targetSelector: 'main', size: 96, messageText: TranslationService.translate('common.loading') })), !this.isEmbedded &&\n h(\"footer\", { key: '39857f329a5978cca0f725e535730eef6c4bffe9', class: \"wb-footer\" }, h(\"onto-footer\", { key: '28bc198484360d99850149531e475a0e3ba1f426' }))));\n }\n // ========================\n // Event Listeners\n // ========================\n /**\n * Event listener for the navbar toggled event. The layout needs to respond properly when the navbar is toggled in\n * order to fit the content.\n * @param event\n */\n onNavbarToggled(event) {\n this.isNavbarCollapsed = event.detail.payload;\n if (this.isNavbarCollapsed) {\n this.hostElement.classList.add('expanded');\n }\n else {\n this.hostElement.classList.remove('expanded');\n }\n }\n /**\n * Event listener for window resize event. We need to handle this in order to allow the navbar to collapse when the\n * window is resized.\n */\n onResize() {\n this.windowResizeObserver();\n }\n onSolrDeprecationBannerClosedHandler() {\n return () => {\n this.userPreferencesService.dismissSolrDeprecationBanner();\n };\n }\n // ========================\n // Handlers\n // ========================\n windowResizeHandler() {\n var _a, _b, _c, _d;\n this.isLowResolution = WindowService.getWindow().innerWidth <= WINDOW_WIDTH_FOR_COLLAPSED_NAVBAR;\n const navbar = document.querySelector('.navbar-component');\n if (navbar) {\n const cookieBanner = document.querySelector('.cookie-consent-banner');\n const header = document.querySelector('.wb-header');\n const headerHeight = (_b = (_a = header === null || header === void 0 ? void 0 : header.getBoundingClientRect()) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : 0;\n const bannerHeight = (_d = (_c = cookieBanner === null || cookieBanner === void 0 ? void 0 : cookieBanner.getBoundingClientRect()) === null || _c === void 0 ? void 0 : _c.height) !== null && _d !== void 0 ? _d : 0;\n navbar.style.height = `calc(100% - ${headerHeight}px - ${bannerHeight}px)`;\n }\n if (!this.isLowResolution && !this.isNavbarCollapsed) {\n this.hostElement.classList.remove('expanded');\n }\n else {\n this.hostElement.classList.add('expanded');\n }\n }\n handleAuthChange(changedKey) {\n var _a;\n if (!changedKey) {\n return;\n }\n if (this.authEvents.includes(changedKey)) {\n const authenticated = this.authStorageService.isAuthenticated();\n if (authenticated) {\n navigate((_a = this.navigationContextService.getPreviousRoute()) !== null && _a !== void 0 ? _a : './');\n }\n else {\n navigate('login');\n }\n WindowService.getWindow().location.reload();\n }\n }\n // ========================\n // Security & Permissions\n // ========================\n subscribeToSecurityChanges() {\n const securityContextService = service(SecurityContextService);\n this.subscriptions.add(securityContextService.onAuthenticatedUserChanged((authenticatedUser) => {\n this.authenticatedUser = authenticatedUser;\n this.updateVisibility();\n }));\n this.subscriptions.add(securityContextService.onSecurityConfigChanged((securityConfig) => {\n this.securityConfig = securityConfig;\n this.updateVisibility();\n }));\n this.subscriptions.add(this.eventService.subscribe(EventName.LOGIN, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n }));\n this.subscriptions.add(this.eventService.subscribe(EventName.LOGOUT, () => {\n this.setNavbarItemVisibility();\n this.updateVisibility();\n navigate('login');\n }));\n }\n subscribeToRuntimeConfigurationChanges() {\n this.subscriptions.add(this.runtimeConfigurationContextService.onRuntimeConfigurationChanged((config) => {\n var _a;\n this.isEmbedded = (_a = config === null || config === void 0 ? void 0 : config.isEmbedded) !== null && _a !== void 0 ? _a : false;\n }));\n }\n updateVisibility() {\n this.updateSolrDeprecationBannerVisibility();\n if (!this.authenticationService.isSecurityEnabled()) {\n this.showNavbar = true;\n this.showHeader = true;\n }\n else {\n this.showHeader = this.authenticationService.isAuthenticated() || this.authorizationService.hasFreeAccess();\n this.showNavbar = this.authenticationService.isAuthenticated() || this.authorizationService.hasFreeAccess();\n }\n }\n isAuthenticatedFully() {\n return !this.authenticationService.isSecurityEnabled() || this.authenticationService.isAuthenticated() || this.authorizationService.hasFreeAccess();\n }\n shouldShowMenu(role) {\n return this.isAuthenticatedFully() && this.authorizationService.hasRole(role);\n }\n // ========================\n // Navbar logic\n // ========================\n assignNavbarRef() {\n return (navbar) => {\n this.navbarRef = navbar;\n if (!this.navbarRef) {\n return;\n }\n this.navbarRef.menuItems = WindowService.getPluginRegistry().get(MainMenuExtensionPoint.NAME);\n this.setNavbarItemVisibility();\n };\n }\n setNavbarItemVisibility() {\n var _a, _b, _c;\n if (!((_a = this.navbarRef) === null || _a === void 0 ? void 0 : _a.menuItems)) {\n return;\n }\n // recursively check for children and set their shouldShow property\n const processItem = (item) => {\n var _a;\n item.shouldShow = this.shouldShowMenu(item.role);\n if ((_a = item.children) === null || _a === void 0 ? void 0 : _a.length) {\n item.children.forEach(processItem);\n }\n };\n (_c = (_b = this.navbarRef) === null || _b === void 0 ? void 0 : _b.menuItems) === null || _c === void 0 ? void 0 : _c.forEach(plugin => {\n plugin.items.forEach(processItem);\n });\n // Update the reference to trigger a re-render\n this.navbarRef.menuItems = [...this.navbarRef.menuItems];\n }\n subscribeToNavigationEnd() {\n this.subscriptions.add(this.eventService.subscribe(EventName.NAVIGATION_END, (navigationEndPayload) => {\n this.navigationContextService.updatePreviousRoute(navigationEndPayload.oldUrl);\n // NAVIGATION_END appears to happen in the same tick as BeforeMountRouting, so the loader never gets shown\n setTimeout(() => {\n this.loading = false;\n });\n }));\n }\n subscribeToBeforeMountRouting() {\n this.subscriptions.add(this.applicationLifecycleContextService.onNavigationBeforeMountRouting((payload) => {\n if (payload) {\n this.loading = true;\n }\n }));\n }\n subscribeToUserPreferencesChange() {\n this.subscriptions.add(this.userPreferencesContextService.onUserPreferencesChanged(() => {\n this.updateSolrDeprecationBannerVisibility();\n }));\n }\n subscribeToGuideChanges() {\n this.subscriptions.add(this.guideContextService.onHasRunningGuideChanged(() => this.updateSolrDeprecationBannerVisibility()));\n }\n updateSolrDeprecationBannerVisibility() {\n return this.hideSolrDeprecationBanner = this.userPreferencesService.isSolrDeprecationBannerDismissed() || this.guideContextService.hasRunningGuide();\n }\n get hostElement() { return getElement(this); }\n};\nOntoLayout.style = ontoLayoutCss;\n\nexport { OntoLayout as onto_layout };\n","import { Loggers, ServiceProvider, LanguageContextService } from '@ontotext/workbench-api';\n\nfunction sanitizeHTML(html) {\n const element = document.createElement('textarea');\n element.innerHTML = html;\n return element.value;\n}\n\nconst MODULE_NAME = 'SharedComponents';\n/**\n * Logger for the Shared Components module.\n */\nclass LoggerProvider {\n /**\n * Gets the logger instance for the Shared Components module.\n *\n * @returns LoggerService instance for the Shared Components module\n */\n static get logger() {\n return Loggers.getLoggerInstance(MODULE_NAME);\n }\n}\n\n/**\n * Service responsible for translation operations in the component.\n */\nclass TranslationServiceClassDefinition {\n constructor() {\n this.languageContextService = ServiceProvider.get(LanguageContextService);\n this.translationChangedObservers = {};\n this.logger = LoggerProvider.logger;\n // log with background color\n this.defaultBundle = this.languageContextService.getDefaultBundle();\n this.subscribeToBundleChange();\n }\n /**\n * Translates the <code>messageLabelKey</code> with <code>translationParameter</code> and call <code>translationCallback</code> with translation of current language.\n * The <code>translationCallback</code> is called upon subscription and whenever the selected language is changed.\n *\n * @param messageLabelKey - The label key for the translation.\n * @param translationParameter - Parameters, if needed, for translation.\n * @param translationCallback - A function to be called when translating the `messageLabelKey`.\n * @returns A function that, when called, unsubscribes the provided callback from further translation updates.\n */\n onTranslate(messageLabelKey, translationParameter = [], translationCallback = () => { }) {\n this.translationChangedObservers[messageLabelKey] = this.translationChangedObservers[messageLabelKey] || [];\n const observer = { parameters: translationParameter, callback: translationCallback };\n this.translationChangedObservers[messageLabelKey].push(observer);\n translationCallback(this.translate(messageLabelKey, translationParameter));\n return () => {\n const index = this.translationChangedObservers[messageLabelKey].indexOf(observer);\n if (index !== -1) {\n this.translationChangedObservers[messageLabelKey].splice(index, 1);\n }\n };\n }\n /**\n * Translates the provided key using the currently selected language by applying the parameters if\n * provided.\n * @param key The key for the label which needs to be translated.\n * @param parameters Optional parameters which to be applied during the translation.\n */\n translate(key, parameters) {\n return this.translateInLocale(key, parameters);\n }\n /**\n * Translates a given key into the specified locale. If parameters are provided,\n * they will be applied to the translation.\n *\n * @param key - The translation key, which can be dot-separated for nested translations.\n * @param parameters - Optional parameters to be substituted into the translation string.\n * @returns The translated string with parameters applied if available, or the key itself if not found.\n */\n translateInLocale(key, parameters) {\n // Attempt to retrieve the translation from the specified locale's bundle.\n let translation = this.translateFromBundle(this.currentBundle, key);\n // If not found, fall back to the default language bundle.\n if (!translation) {\n translation = this.translateFromBundle(this.defaultBundle, key);\n }\n // If translation was found, apply any parameters provided and return the result.\n if (translation) {\n translation = this.applyParameters(translation, parameters);\n return sanitizeHTML(translation);\n }\n this.logger.warn(`Missing translation for key: [${key}]`);\n return key;\n }\n /**\n * Retrieves a translation from a specified translation bundle using the given key.\n * If the key represents a nested JSON path, it attempts to resolve the key as such.\n *\n * @param bundle - The translation bundle for the specified locale.\n * @param key - The key to translate, which may be a simple key or dot-separated for nested keys.\n * @returns The translation string if found, or `undefined` if not available.\n */\n translateFromBundle(bundle, key) {\n if (!bundle) {\n return undefined;\n }\n // Try to retrieve the translation directly if it is defined as a whole string,\n // for instance as \"some_function.btn.label\".\n let translation = bundle[key];\n // If not found, attempt to retrieve the translation if it is defined as a JSON object.\n if (typeof translation !== 'string') {\n translation = this.translateAsJsonObject(bundle, key);\n }\n return translation;\n }\n /**\n * Resolves a nested translation key by treating it as a path in a JSON object.\n * For example, if the key is \"some.key.path\", this method will navigate through\n * the JSON object structure to retrieve the value at that path.\n *\n * @param bundle - The translation bundle containing nested keys.\n * @param key - The dot-separated key representing the path to the translation.\n * @returns The translation string if found, or `undefined` if the path does not exist.\n */\n translateAsJsonObject(bundle, key) {\n if (!key) {\n return;\n }\n let path = key.split('.');\n return this.getTranslation(bundle, path);\n }\n /**\n * Recursively navigates through a JSON object based on a path array to retrieve\n * a translation string. Each element in the path array represents a nested key.\n *\n * @param jsonObject - The current JSON object or nested object being searched.\n * @param path - An array representing the path to the translation, where each element is a key.\n * @returns The translation string if found, or `undefined` if the path does not exist.\n */\n getTranslation(jsonObject, path) {\n // Stop the recursion if path or reach the inner element\n if (!path || !jsonObject) {\n return undefined;\n }\n const jsonOrTranslation = jsonObject[path.splice(0, 1)[0]];\n if (path.length === 0) {\n return jsonOrTranslation;\n }\n if (typeof jsonOrTranslation !== 'string') {\n // continue if the inner element is not reached.\n if (path.length > 0) {\n return this.getTranslation(jsonOrTranslation, path);\n }\n return jsonOrTranslation;\n }\n return undefined;\n }\n applyParameters(translation, parameters) {\n if (parameters) {\n return parameters.reduce(\n // replace all occurrence of parameter key with parameter value.\n (translation, parameter) => TranslationServiceClassDefinition.replaceAll(translation, parameter), translation);\n }\n return translation;\n }\n static replaceAll(translation, parameter) {\n return parameter ? translation.split(`{{${parameter.key}}}`).join(parameter.value) : translation;\n }\n notifyTranslationsChanged() {\n Object.keys(this.translationChangedObservers).forEach((eventName) => {\n const observers = this.translationChangedObservers[eventName] || [];\n observers.forEach((observer) => observer.callback(this.translate(eventName, observer.parameters)));\n });\n }\n subscribeToBundleChange() {\n this.languageChangeSubscription = this.languageContextService.onLanguageBundleChanged((bundle) => {\n if (bundle) {\n this.currentBundle = bundle;\n this.notifyTranslationsChanged();\n }\n });\n }\n destroy() {\n if (this.languageChangeSubscription) {\n this.languageChangeSubscription();\n }\n }\n}\nconst TranslationService = new TranslationServiceClassDefinition();\n\nexport { LoggerProvider as L, TranslationService as T, sanitizeHTML as s };\n"],"names":["debounce","func","wait","timer","args","clearTimeout","setTimeout","apply","this","OntoLayout","constructor","hostRef","registerInstance","authenticationService","service","AuthenticationService","authorizationService","AuthorizationService","navigationContextService","NavigationContextService","authStorageService","AuthenticationStorageService","runtimeConfigurationContextService","RuntimeConfigurationContextService","eventService","EventService","applicationLifecycleContextService","ApplicationLifecycleContextService","userPreferencesService","UserPreferencesService","userPreferencesContextService","UserPreferencesContextService","guideContextService","GuideContextService","fullJwtKey","StorageKey","GLOBAL_NAMESPACE","NAMESPACE","jwtKey","fullAuthenticatedKey","authenticatedKey","authEvents","isLowResolution","showHeader","isAuthenticatedFully","showNavbar","isEmbedded","loading","hideSolrDeprecationBanner","subscriptions","SubscriptionList","isNavbarCollapsed","handleStorageChange","event","LocalStorageSubscriptionHandlerService","handleAuthChange","key","windowResizeObserver","windowResizeHandler","WindowService","getWindow","addEventListener","componentDidRender","componentDidLoad","updateSolrDeprecationBannerVisibility","connectedCallback","subscribeToSecurityChanges","updateVisibility","subscribeToNavigationEnd","subscribeToRuntimeConfigurationChanges","subscribeToUserPreferencesChange","subscribeToBeforeMountRouting","subscribeToGuideChanges","disconnectedCallback","unsubscribeAll","render","h","Host","class","name","onCloseBanner","onSolrDeprecationBannerClosedHandler","slot","labelKey","ref","assignNavbarRef","targetSelector","size","messageText","TranslationService","translate","onNavbarToggled","detail","payload","hostElement","classList","add","remove","onResize","dismissSolrDeprecationBanner","_a","_b","_c","_d","innerWidth","navbar","document","querySelector","cookieBanner","header","headerHeight","getBoundingClientRect","height","bannerHeight","style","changedKey","includes","isAuthenticated","navigate","getPreviousRoute","location","reload","securityContextService","SecurityContextService","onAuthenticatedUserChanged","authenticatedUser","onSecurityConfigChanged","securityConfig","subscribe","EventName","LOGIN","setNavbarItemVisibility","LOGOUT","onRuntimeConfigurationChanged","config","isSecurityEnabled","hasFreeAccess","shouldShowMenu","role","hasRole","navbarRef","menuItems","getPluginRegistry","get","MainMenuExtensionPoint","NAME","processItem","item","shouldShow","children","length","forEach","plugin","items","NAVIGATION_END","navigationEndPayload","updatePreviousRoute","oldUrl","onNavigationBeforeMountRouting","onUserPreferencesChanged","onHasRunningGuideChanged","isSolrDeprecationBannerDismissed","hasRunningGuide","getElement","sanitizeHTML","html","element","createElement","innerHTML","value","LoggerProvider","logger","Loggers","getLoggerInstance","TranslationServiceClassDefinition","languageContextService","ServiceProvider","LanguageContextService","translationChangedObservers","defaultBundle","getDefaultBundle","subscribeToBundleChange","onTranslate","messageLabelKey","translationParameter","translationCallback","observer","parameters","callback","push","index","indexOf","splice","translateInLocale","translation","translateFromBundle","currentBundle","applyParameters","warn","bundle","translateAsJsonObject","path","split","getTranslation","jsonObject","jsonOrTranslation","reduce","parameter","replaceAll","join","notifyTranslationsChanged","Object","keys","eventName","languageChangeSubscription","onLanguageBundleChanged","destroy"],"sourceRoot":""}
|