graphdb-workbench 2.8.8-TR1 → 2.8.8

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.
Files changed (79) hide show
  1. package/dist/186.d2a7c6668b2f2198549a.bundle.js +1 -1
  2. package/dist/23.56301f1a97cc94310f2d.bundle.js +1 -1
  3. package/dist/32.a52b26adcd7755172626.bundle.js +1 -0
  4. package/dist/348.b09b5350639beca8034e.bundle.js +1 -1
  5. package/dist/354.474aa50f195477e48af9.bundle.js +1 -1
  6. package/dist/357.603fceaaeb0992019407.bundle.js +1 -1
  7. package/dist/358.5398b6635b1fc42b581a.bundle.js +1 -1
  8. package/dist/359.a2f8d884c46015ae98ed.bundle.js +1 -1
  9. package/dist/360.40b2c9f3610b0f8dea80.bundle.js +1 -1
  10. package/dist/361.91ac80c8c5586b0546a5.bundle.js +1 -1
  11. package/dist/391.45bf699afe7aba531cd9.bundle.js +1 -1
  12. package/dist/40.159ef797572a6c14eab5.bundle.js +1 -0
  13. package/dist/403.61a61ce1c12385533859.bundle.js +1 -1
  14. package/dist/404.b53dc0ad0aaedcf3f809.bundle.js +1 -1
  15. package/dist/405.eb8906e00f241da08275.bundle.js +1 -1
  16. package/dist/406.48298a2b9c49b99170f8.bundle.js +1 -1
  17. package/dist/407.56a20539c08f5d616640.bundle.js +1 -1
  18. package/dist/409.72d548b44e2f1c414a24.bundle.js +1 -1
  19. package/dist/410.df9406357dc52e98d0c4.bundle.js +1 -1
  20. package/dist/411.3a8907f7c02b1e9581e2.bundle.js +1 -1
  21. package/dist/412.5feece7f4c5164d2eadb.bundle.js +1 -1
  22. package/dist/42.68cf9fea9586d95c7ef2.bundle.js +1 -1
  23. package/dist/43.53bafbaf1332f99c7e74.bundle.js +1 -1
  24. package/dist/61.f553a4c10a25b9af3cd7.bundle.js +1 -1
  25. package/dist/72.6f58ccfef39ec2ee9614.bundle.js +1 -1
  26. package/dist/{9.2240f89a03deb8b59d52.bundle.js → 9.4b42fc29ab253cd7ad0d.bundle.js} +1 -1
  27. package/dist/{bundle.66ea1d16e0fa220667a8.bundle.js → bundle.8b5133c2bd45c3446e7b.bundle.js} +3 -3
  28. package/dist/index.html +3 -3
  29. package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +1 -1
  30. package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +1 -1
  31. package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
  32. package/dist/js/angular/core/directives/yasgui-component/templates/yasgui-component.html +1 -1
  33. package/dist/js/angular/core/templates/cookie-policy/cookie-consent.html +1 -1
  34. package/dist/js/angular/core/templates/cookie-policy/cookie-policy.html +1 -1
  35. package/dist/js/angular/security/templates/user.html +1 -1
  36. package/dist/js/angular/ttyg/templates/agent-list.html +1 -1
  37. package/dist/js/angular/ttyg/templates/agent-select-menu.html +1 -1
  38. package/dist/js/angular/ttyg/templates/chat-item-detail.html +1 -1
  39. package/dist/js/angular/ttyg/templates/chat-list.html +1 -1
  40. package/dist/js/angular/ttyg/templates/chat-panel.html +1 -1
  41. package/dist/js/angular/ttyg/templates/modal/agent-instructions-explain-modal.html +1 -1
  42. package/dist/js/angular/ttyg/templates/modal/agent-settings-modal.html +1 -1
  43. package/dist/js/angular/ttyg/templates/no-agents-view.html +1 -1
  44. package/dist/js/angular/ttyg/templates/ttyg.html +1 -1
  45. package/dist/license-checker.json +2 -2
  46. package/dist/pages/aclmanagement.html +2 -2
  47. package/dist/pages/autocomplete.html +1 -1
  48. package/dist/pages/choose-repository-type.html +1 -1
  49. package/dist/pages/cluster-management/clusterInfo.html +3 -3
  50. package/dist/pages/create-index.html +1 -1
  51. package/dist/pages/dependencies.html +1 -1
  52. package/dist/pages/domainRangeInfo.html +2 -2
  53. package/dist/pages/edit.html +1 -1
  54. package/dist/pages/explore.html +1 -1
  55. package/dist/pages/export.html +1 -1
  56. package/dist/pages/find.html +1 -1
  57. package/dist/pages/graph-config/saveGraphConfig.html +8 -8
  58. package/dist/pages/graphs-visualizations.html +7 -7
  59. package/dist/pages/guides.html +1 -1
  60. package/dist/pages/import.html +2 -2
  61. package/dist/pages/jdbc-create.html +1 -1
  62. package/dist/pages/monitor/backup-and-restore.html +1 -1
  63. package/dist/pages/monitor/queries.html +1 -1
  64. package/dist/pages/monitor/resources.html +1 -1
  65. package/dist/pages/namespaces.html +2 -2
  66. package/dist/pages/plugins.html +1 -1
  67. package/dist/pages/rdfClassHierarchyInfo.html +7 -7
  68. package/dist/pages/rdfrank.html +2 -2
  69. package/dist/pages/repositories.html +1 -1
  70. package/dist/pages/repository.html +1 -1
  71. package/dist/pages/similarity-indexes.html +1 -1
  72. package/dist/pages/sparql-editor.html +1 -1
  73. package/dist/pages/sparql-template-create.html +1 -1
  74. package/dist/pages/ux-test1.html +2 -2
  75. package/dist/pages/webapi.html +2 -2
  76. package/dist/res/swagger5/index.html +12 -12
  77. package/package.json +1 -1
  78. package/dist/32.8ee350e470a8b508d5dd.bundle.js +0 -1
  79. package/dist/40.6e3f76815d12ac821ae3.bundle.js +0 -1
@@ -0,0 +1 @@
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[32,40,100,122,217,218,219,220,221,286,308],{124:function(e,r,t){"use strict";t.r(r),t.d(r,"JdbcDriverType",(function(){return o}));const o={GENERIC:"generic",MY_SQL:"mySQL",POSTGRESS:"postgreSQL",ORACLE:"oracle",MS_SQL:"msSQL",DB2:"DB2",DREMIO:"dremio",DATABRICKS:"databricks",SNOWFLAKE:"snowflake"}},186:function(e,r,t){"use strict";t.r(r),t.d(r,"OntopConnectionInformation",(function(){return 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=""}}},187:function(e,r,t){"use strict";t.r(r),t.d(r,"OntopDriverData",(function(){return n}));var o=t(124);class n{constructor(){this.classAvailable=!1,this.downloadDriverUrl="",this.driverClass="",this.driverName="",this.driverType="",this.portRequired=!1,this.urlTemplate=""}static isGenericDriver(e){return e===o.JdbcDriverType.GENERIC}static isSnowflakeDriver(e){return e===o.JdbcDriverType.SNOWFLAKE}}},188:function(e,r,t){"use strict";t.r(r),t.d(r,"OntopFileInfo",(function(){return o}));class o{constructor(e,r=!1){this.type=e,this.fileName="",this.loading=!1,this.required=r}}},189:function(e,r,t){"use strict";t.r(r),t.d(r,"OntopFileType",(function(){return o}));const o={OBDA:"obdaFile",OWL:"owlFile",CONSTRAINT:"constraintFile",LENSES:"lensesFile",DB_METADATA:"dbMetadataFile"}},190:function(e,r,t){"use strict";t.r(r),t.d(r,"OntopRepositoryError",(function(){return o}));class o extends Error{}},197:function(e,r,t){"use strict";t.r(r);t(9),t(42);function o(e,r,t,o,n){e.supportsStatistics=!0,e.settings={statistics:!1},e.getSettings=function(){e.loader=!0,o.getStatistics().then((function(r){e.settings.statistics="true"===r.data,e.supportsStatistics=!0}),(function(t){if(404===t.status)e.supportsStatistics=!1;else{const e=getError(t.data);r.error(e,n.instant("error.getting.settings"))}}))},e.getSettings(),e.setSettings=function(){e.loader=!0,o.toggleStatistics(e.settings.statistics).then((function(){t.close(),r.success(n.instant("saving.settings.success"))}),(function(e){const t=getError(e.data);r.error(t,n.instant("saving.settings.error"))}))},e.submitForm=function(){e.setSettings()},e.cancel=function(){t.dismiss("cancel")}}function n(e,r,t,o,n,i,s,a){e.loadingLicense=function(){return t.loadingLicense()},t.checkLicenseStatus(),e.revertToFree=function(){i.openSimpleModal({title:s.instant("confirm.operation"),message:s.instant("revert.to.free.warning.msg"),warning:!0}).result.then((function(){r.unregisterLicense().success((function(){t.checkLicenseStatus().then(()=>a.init())}))}))}}function i(e,r,t,o,n,i,s,a){e.$on("securityInit",(function(){s.isAdmin()||t.path("/license")})),e.sendLicenseToValidateAndActivate=p;const c=$(".license-textarea");function p(e){r.sendLicenseToValidate(e).success((function(t){"Invalid"!==t.licensee?(c.val(e),function(e,t){o.open({templateUrl:"js/angular/settings/modal/validate-license.html",controller:"ValidateLicenseModalCtrl",size:"lg",resolve:{license:function(){return e}}}).result.then((function(){!function(e){e||(e=c.val());if(e){const t=atob(e.replace(/\s/g,""));r.registerLicense(t).success((function(){i.history.back()})).error((function(){n.error(a.instant("license.register.error"))}))}else n.error(a.instant("no.license.code.error"))}(t)}))}(t,e)):(c.val(""),n.error(t.message))})).error((function(){n.error(a.instant("invalid.license"))}))}e.$watch("currentFile",(function(){if(e.currentFile){const t=e.currentFile;r.extractFromLicenseFile(t).success((function(e){p(e)})).error((function(){n.error(a.instant("could.not.upload.file.error"))}))}})),e.getBackToPreviousPage=function(){i.history.back()}}function s(e,r,t){e.ok=function(){r.close()},e.cancel=function(){r.dismiss("cancel")},e.license=t}function a(e){e.loader=!0,e.setLoader=function(r){e.loader=r}}angular.module("graphdb.framework.settings.controllers",["ngCookies","ui.bootstrap","graphdb.framework.core.services.jwtauth","toastr"]).controller("ActiveLocationSettingsCtrl",o).controller("ValidateLicenseModalCtrl",s).controller("LicenseCtrl",n).controller("RegisterLicenseCtrl",i).controller("LoaderSamplesCtrl",a),o.$inject=["$scope","toastr","$uibModalInstance","LicenseRestService","$translate"],n.$inject=["$scope","LicenseRestService","$licenseService","toastr","$rootScope","ModalService","$translate","TrackingService"],i.$inject=["$scope","LicenseRestService","$location","$uibModal","toastr","$window","$jwtAuth","$translate"],s.$inject=["$scope","$uibModalInstance","license"],a.$inject=["$scope"]},305:function(e,r,t){"use strict";t.r(r);var o=t(156),n=t(189),i=t(186),s=t(188),a=t(190),c=t(187),p=t(124);function l(e,r,t,l,d){return{restrict:"E",scope:!1,templateUrl:"js/angular/repositories/templates/ontop-repo.html",link:function(m){m.isGenericDriver=!0,m.defaultUrlTemplate="jdbc:database://localhost:port/database_name",m.ontopProperiesLink="https://ontop-vkg.org/guide/advanced/configuration.html",m.ontopFileType=n.OntopFileType,m.selectedDriver=new c.OntopDriverData,m.supportedDriversData=[],m.formData={connectionInformation:new i.OntopConnectionInformation,settings:{additionalProperties:"",ontopFiles:[]}},m.selectDriver=e=>{m.selectedDriver=m.supportedDriversData.find(r=>r.driverType===e),m.isGenericDriver=c.OntopDriverData.isGenericDriver(m.selectedDriver.driverType),m.editRepoPage&&m.currentOntopRepoInfo&&m.currentOntopRepoInfo.connectionInformation.driverType===e?m.formData=_.cloneDeep(m.currentOntopRepoInfo):(T(),m.formData.connectionInformation.driverType=m.selectedDriver.driverType),m.formData.connectionInformation.driverClass=m.selectedDriver.driverClass,m.updateUrl()},m.getOntopFileInfo=e=>m.formData.settings.ontopFiles.find(r=>e===r.type),m.getHostNameLabel=()=>{const e=c.OntopDriverData.isSnowflakeDriver(m.selectedDriver.driverType)?"ontop.repo.database.snowflake.host_name":"ontop.repo.database.host_name";return d.instant(e)+"*"},m.getDatabaseNameLabel=()=>{let e="";switch(m.selectedDriver.driverType){case p.JdbcDriverType.SNOWFLAKE:e="ontop.repo.database.warehouse.database_name";break;case p.JdbcDriverType.DATABRICKS:e="ontop.repo.database.http_path.database_name";break;case p.JdbcDriverType.DREMIO:e="ontop.repo.database.schema.database_name";break;default:e="ontop.repo.database.database_name"}return d.instant(e)},m.updateUrl=()=>{const e=f()||"";m.formData.connectionInformation.url=e+m.formData.connectionInformation.urlUserInput},m.isTestConnectionDisabled=()=>{const e=m.formData.connectionInformation,r=m.selectedDriver;return!(e.driverClass&&e.url&&(!r.portRequired||e.port))||!(c.OntopDriverData.isGenericDriver(r.driverType)||e.hostName&&e.databaseName)},m.testConnection=()=>{D().then(O).then(R).then(w).then(I).then(b).then(()=>r.validateOntopPropertiesConnection(m.repositoryInfo)).then(()=>t.success(d.instant("ontop.repo.successful.connection.msg"))).catch(e=>{e instanceof a.OntopRepositoryError?t.error(e.message):h(d.instant("ontop.repo.failed.to.connect"),e)})},m.editFile=t=>{const n=m.repositoryInfo.params[t.type].label,i=d.instant("update.file.edit.content.header",{fileName:n});e.open({templateUrl:"js/angular/templates/modal/editRepoFile.html",controller:"EditRepositoryFileCtrl",windowClass:"update-ontop-repo-dialog",resolve:{file:()=>{const e=m.repositoryInfo.params[t.type];return e?e.value:""},dialogTitle:()=>i,location:()=>m.repositoryInfo.location}}).result.then(e=>{r.updateRepositoryFileContent(e.fileLocation,e.content,m.repositoryInfo.location).success(e=>{t.fileName=Object(o.getFileName)(e.fileLocation),m.repositoryInfo.params[t.type].value=e.fileLocation}).error(e=>{h(d.instant("common.error"),e)})})},m.uploadOntopFile=(e,r)=>{if(e&&e.length){const o=e[0];r.loading=!0;const n={url:"rest/repositories/file/upload",data:{file:o,location:m.repositoryInfo.location}};l.upload(n).success(e=>{e.success?(r.fileName=o.name,m.repositoryInfo.params[r.type].value=e.fileLocation):t.error(e.errorMessage)}).error(e=>{h(d.instant("common.error"),e),m.uploadFile=""}).finally(()=>{r.loading=!1})}},m.updateOntopRepo=()=>{const e=m.editRepoPage?m.editRepository:m.createRepo;N().then(D).then(O).then(R).then(w).then(I).then(S).then(b).then(e).catch(e=>{e instanceof a.OntopRepositoryError?t.error(e.message):console.log(e)})},m.onKeyDownInUrlInput=e=>{const r=e.keyCode;if(37===r||39===r||36===r||35===r)return;const t=f();if(!t)return;const o=e.ctrlKey||e.metaKey;if(o&&65===r||o&&67===r)return;const n=e.target.selectionStart;8===r&&n-1<t.length&&(e.preventDefault(),e.stopPropagation()),n<t.length&&(e.preventDefault(),e.stopPropagation())},m.onKeyUpInUrlInput=()=>{u()};const u=()=>{const e=f();e&&m.formData.connectionInformation.url.startsWith(e)?m.formData.connectionInformation.urlUserInput=m.formData.connectionInformation.url.substring(e.length):m.formData.connectionInformation.urlUserInput=m.formData.connectionInformation.url},f=()=>c.OntopDriverData.isSnowflakeDriver(m.selectedDriver.driverType)?v():y(),v=()=>{let e=m.selectedDriver.urlTemplate;const r=m.formData.connectionInformation;return r.hostName&&(e=e.replace("{identifier}",r.hostName)),r.port&&(e=e.replace(".snowflakecomputing.com/?",`.snowflakecomputing.com:${r.port}/?`)),r.databaseName&&(e=e.replace("{database}",r.databaseName)),e},y=()=>{let e=m.selectedDriver.urlTemplate;const r=m.formData.connectionInformation;return r.hostName&&(e=r.port?e.replace("{hostport}",`${r.hostName}:${r.port}`):e.replace("{hostport}",""+r.hostName)),r.databaseName&&(e=e.replace("{database}",r.databaseName)),e},g=e=>{m.formData.settings.ontopFiles.forEach(r=>{r.loading=e})},b=()=>{g(!0);const e=m.formData.connectionInformation,t={hostName:e.hostName,port:e.port,databaseName:e.databaseName,userName:e.username,password:e.password,driverClass:e.driverClass,url:e.url,additionalProperties:m.formData.settings.additionalProperties};return r.updatePropertiesFile(m.repositoryInfo.params.propertiesFile.value,t,m.repositoryInfo.location,m.selectedDriver.driverType).success(e=>{m.repositoryInfo.params.propertiesFile.value=e.fileLocation}).error(e=>{h(d.instant("common.error"),e)}).finally(()=>g(!1))},h=(e,r)=>{const o=getError(r);t.error(o,e)},D=()=>c.OntopDriverData.isGenericDriver(m.selectedDriver.driverType)||m.formData.connectionInformation.hostName?Promise.resolve():Promise.reject(new a.OntopRepositoryError(d.instant("missing.required.field",{fieldName:d.instant("ontop.repo.database.host_name")}))),R=()=>c.OntopDriverData.isGenericDriver(m.selectedDriver.driverType)||m.formData.connectionInformation.databaseName?Promise.resolve():Promise.reject(new a.OntopRepositoryError(d.instant("missing.required.field",{fieldName:d.instant("ontop.repo.database.database_name")}))),w=()=>m.formData.connectionInformation.driverClass?Promise.resolve():Promise.reject(new a.OntopRepositoryError(d.instant("missing.required.field",{fieldName:d.instant("ontop.repo.database.driver_class")}))),I=()=>m.formData.connectionInformation.url?Promise.resolve():Promise.reject(new a.OntopRepositoryError(d.instant("missing.required.field",{fieldName:d.instant("ontop.repo.database.url")}))),N=()=>m.repositoryInfo.id?Promise.resolve():Promise.reject(new a.OntopRepositoryError(d.instant("empty.repoid.warning"))),S=()=>m.getOntopFileInfo(n.OntopFileType.OBDA).fileName?Promise.resolve():Promise.reject(new a.OntopRepositoryError(d.instant("ontop.repo.missing.required.file",{fileName:m.repositoryInfo.params[n.OntopFileType.OBDA].label}))),O=()=>m.selectedDriver.portRequired&&!m.formData.connectionInformation.port?Promise.reject(new a.OntopRepositoryError(d.instant("missing.required.field",{fieldName:d.instant("ontop.repo.database.port")}))):Promise.resolve(),T=()=>{m.formData={connectionInformation:new i.OntopConnectionInformation,settings:{additionalProperties:"",ontopFiles:[]}},Object.values(n.OntopFileType).forEach(e=>{const r=new s.OntopFileInfo(e);m.formData.settings.ontopFiles.push(r)}),m.getOntopFileInfo(n.OntopFileType.OBDA).required=!0};r.getSupportedDriversData(m.repositoryInfo).success(e=>{m.supportedDriversData=e}).error(e=>{h(d.instant("common.error"),e)}).then(()=>{m.editRepoPage?(g(!0),r.loadPropertiesFile(m.repositoryInfo.params.propertiesFile.value,m.repositoryInfo.location,m.selectedDriver.driverType).success(e=>{let r=m.supportedDriversData.find(r=>r.driverClass===e.driverClass);r&&e.hostName||(r=m.supportedDriversData.find(e=>c.OntopDriverData.isGenericDriver(e.driverType))),m.selectDriver(r.driverType),m.formData.connectionInformation.driverType=r.driverType,m.formData.connectionInformation.driverClass=e.driverClass,m.formData.connectionInformation.password=e.password,m.formData.connectionInformation.username=e.userName,m.formData.connectionInformation.url=e.url,m.formData.settings.additionalProperties=e.additionalProperties,c.OntopDriverData.isGenericDriver(r.driverType)||(m.formData.connectionInformation.hostName=e.hostName,m.formData.connectionInformation.databaseName=e.databaseName,m.formData.connectionInformation.port=e.port?parseInt(e.port,10):void 0),u(),m.updateUrl(),Object.values(n.OntopFileType).forEach(e=>{const r=m.repositoryInfo.params[e],t=m.getOntopFileInfo(e);r&&(t.fileName=Object(o.getFileName)(r.value))}),m.currentOntopRepoInfo=_.cloneDeep(m.formData)}).error(e=>{h(d.instant("common.error"),e)}).finally(()=>{g(!1)})):m.selectDriver(p.JdbcDriverType.GENERIC)})}}}angular.module("graphdb.framework.repositories.ontop-repo.directive",[]).directive("ontopRepo",l),l.$inject=["$uibModal","RepositoriesRestService","toastr","Upload","$translate"]},306:function(e,r){function t(e,r,t,o){return{restrict:"E",scope:!0,templateUrl:"js/angular/repositories/templates/fedx-repo.html",link:function(n){const i="ResolvableRepository";n.fedxMembers=[],n.knownRepos=[],n.allAttachedRepos=[],n.editRepoPage&&(n.fedxMembers=n.repositoryInfo.params.member.value.slice());function s(){for(const e of n.fedxMembers)n.knownRepos=n.knownRepos.filter((function(r){return e.repositoryServer?r.id!==e.repositoryName||r.location!==e.repositoryServer:r.id!==e.repositoryName||!r.local}))}function a(){r.getRepositories(n.repositoryInfo.location).success((function(e){let r=[];_.values(e).forEach(e=>{r.push.apply(r,e)}),n.allAttachedRepos=_.cloneDeep(r)})).error((function(e){const r=getError(e);t.error(r,o.instant("common.error"))})).then((function(){n.knownRepos=n.allAttachedRepos.slice(),s()}))}n.setWritableRepo=function(e){let r=n.fedxMembers.find(e=>"true"===e.writable);r&&((r.store!==i||e.store===i&&r.repositoryName===e.repositoryName)&&("RemoteRepository"!==r.store||"RemoteRepository"===e.store&&r.repositoryName===e.repositoryName&&r.repositoryServer===e.repositoryServer)||(r.writable="false")),e.writable=JSON.stringify("false"===e.writable)},n.getActiveClass=function(e){return"true"===e.writable?" active":""},n.checkIfRepoExist=function(e){return!n.allAttachedRepos.length||(e.store===i?n.allAttachedRepos.find(r=>r.id===e.repositoryName&&!r.location):"RemoteRepository"!==e.store||n.allAttachedRepos.find(r=>r.id===e.repositoryName&&r.location===e.repositoryServer))},n.getRepositoryServer=function(e){return e.local?"Local":e.location};const c=setInterval((function(){a()}),5e3);function p(e){n.fedxMembers.push(e),n.repositoryInfo.params.member.value=n.fedxMembers}function l(e){return"/"===e.slice(-1)?e.slice(0,-1):e}function d(){return n.editRepoPage&&!n.editRepoPage||!n.model.editMode}n.$on("$destroy",(function(){clearInterval(c)})),n.addMember=function(e){let r;r="Local"===n.getRepositoryServer(e)?{store:i,repositoryName:e.id,repoType:e.type,respectRights:"true",writable:"false"}:{store:"RemoteRepository",repositoryName:e.id,repositoryServer:e.location,username:"",password:"",supportsASKQueries:"true",writable:"false"},n.knownRepos=n.knownRepos.filter(r=>r.id!==e.id||r.location!==e.location),p(r)},n.removeMember=function(e){e.store&&e.store===i?(n.fedxMembers=n.fedxMembers.filter(r=>r.store!==e.store||r.repositoryName!==e.repositoryName&&!r.repositoryServer),a()):e.store&&"SPARQLEndpoint"===e.store?n.fedxMembers=n.fedxMembers.filter(r=>r.endpoint!==e.endpoint):e.store&&"NativeStore"===e.store?n.fedxMembers=n.fedxMembers.filter(r=>r.repositoryLocation!==e.repositoryLocation):e.store&&"RemoteRepository"===e.store&&(n.fedxMembers=n.fedxMembers.filter(r=>r.store!==e.store||r.repositoryName!==e.repositoryName||r.repositoryServer!==e.repositoryServer),a()),n.repositoryInfo.params.member.value=n.fedxMembers},n.addRemoteMember=function(){n.mode="remote",n.model={editMode:!1,store:"RemoteRepository",repositoryName:"",repositoryServer:"",sparqlEndpoint:"",username:"",password:"",supportsASKQueries:"true",writable:"false"},n.$uibModalInstance=e.open({templateUrl:"js/angular/templates/modal/add-fedx-remote-repo.html",scope:n})},n.getMemberIcon=function(e){return e.repoType?"icon-repo-"+e.repoType:"NativeStore"===e.store?"icon-warning":"icon-link"},n.editFedXRepository=function(r){r.store===i?(n.mode="local",n.model={editMode:!0,store:r.store,respectRights:r.respectRights,repositoryName:r.repositoryName,repoType:r.repoType,writable:r.writable}):(n.mode="remote",n.model={editMode:!0,store:r.store,repositoryName:r.repositoryName,repositoryServer:r.repositoryServer,sparqlEndpoint:"SPARQLEndpoint"===r.store?r.endpoint:r.repositoryLocation,username:r.username,password:r.password,supportsASKQueries:r.supportsASKQueries,writable:r.writable}),n.$uibModalInstance=e.open({templateUrl:"js/angular/templates/modal/add-fedx-remote-repo.html",scope:n})},n.resolveName=function(e){switch(e.store){case i:return e.repositoryName;case"RemoteRepository":return e.repositoryName+"@"+e.repositoryServer;case"SPARQLEndpoint":return e.endpoint;case"NativeStore":return e.repositoryLocation;default:return""}},n.cancel=function(){n.$uibModalInstance.dismiss("cancel")},n.ok=function(){let e;if(n.model.repositoryName&&n.model.store===i)e={store:i,repositoryName:n.model.repositoryName,repoType:n.model.repoType,respectRights:n.model.respectRights,writable:n.model.writable},n.fedxMembers=n.fedxMembers.filter(r=>r.repositoryName!==e.repositoryName||r.store!==e.store);else if(n.model.repositoryName&&"RemoteRepository"===n.model.store){if(e={store:"RemoteRepository",repositoryName:n.model.repositoryName,repositoryServer:l(n.model.repositoryServer),username:n.model.username,password:n.model.password,writable:n.model.writable},d()&&n.fedxMembers.find(r=>r.repositoryName===e.repositoryName&&r.repositoryServer===e.repositoryServer)){let r=n.resolveName(e);return t.error(o.instant("fedx.repo.already.added.member.error",{name:r})),void n.$uibModalInstance.close()}n.fedxMembers=n.fedxMembers.filter(r=>r.repositoryName!==e.repositoryName||r.repositoryServer!==e.repositoryServer)}else{if(e={store:"SPARQLEndpoint",endpoint:l(n.model.sparqlEndpoint),username:n.model.username,password:n.model.password,supportsASKQueries:n.model.supportsASKQueries,writable:n.model.writable},d()&&n.fedxMembers.find(r=>r.endpoint===e.endpoint)){let r=n.resolveName(e);return t.error(o.instant("fedx.repo.already.added.sparql.endpoint.error",{name:r})),void n.$uibModalInstance.close()}n.fedxMembers=n.fedxMembers.filter(r=>r.endpoint!==e.endpoint)}p(e),s(),n.$uibModalInstance.close()},n.$on("changedLocation",(function(){n.fedxMembers=[],a()})),a()}}}angular.module("graphdb.framework.repositories.fedx-repo.directive",[]).directive("fedxRepo",t),t.$inject=["$uibModal","RepositoriesRestService","toastr","$translate"]},307:function(e,r,t){"use strict";t.r(r);t(9),t(40),t(27),t(197),t(52),t(53),t(42),t(83),t(84);function o(e){e.interceptors.push("$unauthorizedInterceptor"),e.interceptors.push("$authenticationInterceptor")}function n(e,r,t){e.$on("$locationChangeStart",(function(){t.isLicenseHardcoded()&&"/license/register"===r.url()&&r.path("license")}))}angular.module("graphdb.framework.settings",["toastr","ui.bootstrap","graphdb.framework.rest.license.service","graphdb.framework.settings.controllers","graphdb.framework.core.interceptors.unauthorized","graphdb.framework.core.interceptors.authentication","graphdb.framework.core.services.jwtauth"]).config(o).run(n),o.$inject=["$httpProvider","$routeProvider"],n.$inject=["$rootScope","$location","$licenseService"]},391:function(e,r,t){"use strict";t.r(r);t(9),t(40),t(46),t(156),t(305),t(306),t(41),t(307),t(83),t(84);angular.module("graphdb.framework.repositories",["ui.bootstrap","toastr","ngCookies","ngRoute","graphdb.framework.repositories.controllers","graphdb.framework.repositories.ontop-repo.directive","graphdb.framework.repositories.fedx-repo.directive","graphdb.framework.core.services.repositories","graphdb.framework.core.directives","graphdb.framework.core.controllers","graphdb.framework.settings"])}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[348],{468:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/cluster-nodes-configuration.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<div onto-loader-new ng-if="loader" class="create-cluster-loader" message="getLoaderMessage" size="100"></div>\n<div class="add-node-wrapper pull-right mb-1">\n <button ng-click="addNode()" ng-disabled="editedNodeIndex !== undefined"\n class="btn btn-primary add-node-btn"\n gdb-tooltip="{{\'cluster_management.update_cluster_group_dialog.actions.add_node_tooltip\' | translate}}">\n <i class="fa fa-plus"></i> {{\'cluster_management.update_cluster_group_dialog.actions.add_node\' |\n translate}}\n </button>\n</div>\n<div class="table-responsive">\n <form name="form" id="updateClusterGroupForm">\n <table class="cluster-group table table-striped table-hover cluster-group-table" aria-describedby="cluster group table">\n <thead>\n <tr class="labels-row">\n <th scope="col" class="index-column">\n {{\'cluster_management.update_cluster_group_dialog.column.index\' | translate}}\n </th>\n <th scope="col" class="location-column">\n {{\'cluster_management.update_cluster_group_dialog.column.location\' | translate}}\n </th>\n <th scope="col" class="info-column">\n {{\'cluster_management.update_cluster_group_dialog.column.info\' | translate}}\n </th>\n <th scope="col" class="status-column">\n {{\'cluster_management.update_cluster_group_dialog.column.status\' | translate}}\n </th>\n <th scope="col" class="empty-column"></th>\n <th scope="col" class="actions-column"></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-if="!viewModel.length">\n <td colspan="5" class="no-data">\n {{\'cluster_management.update_cluster_group_dialog.messages.no_cluster\' | translate}}\n </td>\n </tr>\n\n <tr ng-repeat-start="node in viewModel track by $index" ng-if="0"></tr>\n <tr ng-if="$index !== editedNodeIndex" class="node preview-node-row" data-endpoint="{{node.endpoint}}"\n capture-height="$index"\n ng-class="{\'selected\': $index === selectedNode || $index === editedNodeIndex}">\n <td class="index-cell"><span ng-if="!node.isDeleted">{{node.index + 1}}</span></td>\n <td class="location-cell data" ng-class="{\'deleting\': node.isDeleted, \'adding\': !node.item.address}">\n <div class="location-item">\n {{node.item.endpoint}}\n </div>\n </td>\n <td class="info-cell data">\n <span ng-if="node.isLocal">\n {{\'cluster_management.update_cluster_group_dialog.current_node\' | translate}}<span ng-if="node.item.nodeState">, </span>\n </span>\n\n <span ng-if="node.item.nodeState">\n {{ (\'cluster_management.update_cluster_group_dialog.\' + node.item.nodeState.toLowerCase()) |\n translate }}\n </span>\n </td>\n <td class="status-cell data">\n <div ng-if="!node.item.address" class="adding">\n <i class="fa fa-circle-check status-icon"></i>\n {{\'cluster_management.update_cluster_group_dialog.new_node\' | translate}}\n </div>\n <div ng-if="node.isDeleted" class="deleting">\n <i class="fa fa-xmark status-icon"></i>\n {{\'cluster_management.update_cluster_group_dialog.deleted_node\' | translate}}\n </div>\n </td>\n <td class="empty-cell"></td>\n <td class="actions-cell">\n <div ng-if="editedNodeIndex === undefined && !node.isDeleted" class="actions-group">\n <button ng-click="deleteNode($index, node)" ng-disabled="!canDeleteNode"\n class="btn btn-link delete-node-btn secondary"\n gdb-tooltip="{{ canDeleteNode ? (\'cluster_management.update_cluster_group_dialog.actions.delete_node\' | translate) : (\'cluster_management.update_cluster_group_dialog.actions.cannot_delete_node\' | translate) }}"\n title-class="delete-node-tooltip">\n <i class="fa fa-xmark"></i>\n </button>\n <button ng-click="replaceNode($index, node)" class="btn btn-link replace-node-btn"\n gdb-tooltip="{{\'cluster_management.update_cluster_group_dialog.actions.replace_node\' | translate}}">\n <i class="fa fa-arrow-right-arrow-left"></i>\n </button>\n </div>\n <div ng-if="editedNodeIndex === undefined && node.isDeleted" class="actions-group">\n <button ng-click="restoreNode(node)"\n class="btn btn-link restore-node-btn secondary"\n gdb-tooltip="{{\'cluster_management.update_cluster_group_dialog.actions.restore_node\' | translate}}">\n <i class="fa fa-rotate-left"></i>\n </button>\n </div>\n </td>\n </tr>\n <tr ng-if="$index === editedNodeIndex" class="node edit-node-row" data-endpoint="{{node.endpoint}}"\n style="{{getRowHeight}}"\n ng-class="{\'selected table-info\': $index === editedNodeIndex}">\n <td class="index-cell"><span ng-if="!node.isDeleted">{{node.index + 1}}</span></td>\n <td class="data location-cell">\n <div class="autocomplete-container">\n <textarea type="text" name="location" required\n ng-model="node.endpoint"\n ng-change="filterSuggestions(node)"\n ng-blur="hideSuggestions(node)"\n ng-click="filterSuggestions(node)"\n auto-grow\n validate-url exclude="/repositories" exclude-protocol="ftp,ftps"\n validate-duplicate-url excluded-urls="clusterNodesEndpoints"\n allow-empty="false"\n autocomplete="off"\n class="form-control form-control-sm textarea-edit"\n uib-tooltip="{{\'remote.location.enter.url.msg\' | translate}}"\n tooltip-placement="top"\n placeholder="{{\'cluster_management.update_cluster_group_dialog.field_placeholders.location\' | translate}}">\n </textarea>\n <ul ng-show="suggestions.length > 0 && showDropdown" class="autocomplete-dropdown">\n <li ng-repeat="suggestion in suggestions"\n ng-mouseup="selectSuggestion(node, suggestion)">\n {{ suggestion }}\n </li>\n </ul>\n </div>\n </td>\n <td class="info-cell data">\n <span ng-if="node.isLocal">\n {{\'cluster_management.update_cluster_group_dialog.current_node\' | translate}}<span ng-if="node.item.nodeState">, </span>\n </span>\n\n <span ng-if="node.item.nodeState">\n {{ (\'cluster_management.update_cluster_group_dialog.\' + node.item.nodeState.toLowerCase()) |\n translate }}\n </span>\n </td>\n <td class="status-cell"></td>\n <td class="empty-cell"></td>\n <td class="actions-cell">\n <div class="crud-actions-group">\n <button ng-click="cancel()"\n class="btn btn-link cancel-node-replace-btn secondary"\n gdb-tooltip="{{\'cluster_management.update_cluster_group_dialog.actions.cancel\' | translate}}">\n <i class="fa fa-xmark"></i>\n </button>\n <button ng-click="saveNode(node.endpoint)"\n class="btn btn-link save-rule-btn"\n ng-disabled="!form.location.$valid"\n gdb-tooltip="{{form.location.$valid ? \'cluster_management.update_cluster_group_dialog.actions.add_node\' : \'cluster_management.update_cluster_group_dialog.messages.invalid_form\' | translate}}">\n <i class="fa fa-check"></i>\n </button>\n </div>\n </td>\n </tr>\n <tr ng-repeat-end ng-if="0"></tr>\n <tr ng-if="addNewLocation" class="node edit-node-row">\n <td class="index-cell"></td>\n <td class="data location-cell">\n <div class="autocomplete-container">\n <textarea type="text" name="location" required\n ng-model="newLocation.endpoint"\n ng-change="filterSuggestions(newLocation)"\n ng-blur="hideSuggestions(newLocation)"\n ng-click="filterSuggestions(newLocation)"\n auto-grow\n validate-url exclude="/repositories" exclude-protocol="ftp,ftps"\n validate-duplicate-url excluded-urls="clusterNodesEndpoints"\n allow-empty="false"\n autocomplete="off"\n class="form-control form-control-sm textarea-edit"\n uib-tooltip="{{\'remote.location.enter.url.msg\' | translate}}"\n tooltip-placement="top"\n placeholder="{{\'cluster_management.update_cluster_group_dialog.field_placeholders.location\' | translate}}">\n </textarea>\n <ul ng-show="suggestions.length > 0 && showDropdown" class="autocomplete-dropdown">\n <li ng-repeat="suggestion in suggestions"\n ng-mouseup="selectSuggestion(newLocation, suggestion)">\n {{ suggestion }}\n </li>\n </ul>\n </div>\n </td>\n <td class="info-cell data"></td>\n <td class="status-cell"></td>\n <td class="empty-cell"></td>\n <td class="actions-cell">\n <div class="crud-actions-group">\n <button ng-click="cancel()"\n class="btn btn-link cancel-node-replace-btn secondary"\n gdb-tooltip="{{\'cluster_management.update_cluster_group_dialog.actions.cancel\' | translate}}">\n <i class="fa fa-xmark"></i>\n </button>\n <button ng-click="saveNode(newLocation.endpoint)"\n class="btn btn-link save-rule-btn"\n ng-disabled="!form.location.$valid"\n gdb-tooltip="{{form.location.$valid ? \'cluster_management.update_cluster_group_dialog.actions.add_node\' : \'cluster_management.update_cluster_group_dialog.messages.invalid_form\' | translate}}">\n <i class="fa fa-check"></i>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div class="errors">\n <div class="error-message"\n ng-show="form.location.$error.validUrl && !form.location.$pristine">\n * {{\'valid.remote.location.warning\' | translate}} http://server.example.com:7200/.\n </div>\n <div class="error-message"\n ng-show="form.location.$error.duplicateUrl && !form.location.$pristine">\n * {{\'duplicate.remote.location.warning\' | translate}}\n </div>\n <div ng-repeat="error in errors" class="error-message">\n {{error}}\n </div>\n </div>\n <div class="form-horizontal" ng-if="!hasCluster">\n <div class="form-group">\n <div class="indented-div">\n <span class="padding-label wrapper-div"\n gdb-tooltip="{{\'cluster_management.cluster_page.advanced_options_tooltip\' | translate}}">\n <button type="button"\n class="text-btn advanced-options-btn text-left"\n data-toggle="collapse"\n data-target="#advancedOptions">\n <i class="{{getAdvancedOptionsClass()}} advanced-options-toggle" aria-hidden="true"></i>\n {{\'cluster_management.cluster_page.advanced_options\' | translate}}\n </button>\n </span>\n </div>\n\n <div id="advancedOptions" class="collapse pb-1 pl-2">\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.electionMinTimeout.$invalid}">\n <label for="election-minimum-timeout" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.election_min_timeout\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.election_min_timeout_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.electionMinTimeout"\n required id="election-minimum-timeout" min="0" pattern="[0-9]+"\n name="electionMinTimeout">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.electionMinTimeout.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.electionMinTimeout.$error.pattern">\n {{\'cluster_management.cluster_page.errors.only_positive_integers\' | translate}}\n </div>\n </div>\n </div>\n </div>\n\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.electionRangeTimeout.$invalid}">\n <label for="election-range-timeout" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.election_range_timeout\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.election_range_timeout_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.electionRangeTimeout"\n required id="election-range-timeout" min="0" pattern="[0-9]+"\n name="electionRangeTimeout">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.electionRangeTimeout.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.electionRangeTimeout.$error.pattern">\n {{\'cluster_management.cluster_page.errors.only_positive_integers\' | translate}}\n </div>\n </div>\n </div>\n </div>\n\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.heartbeatInterval.$invalid}">\n <label for="heartbeat-interval" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.heartbeat_interval\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.heartbeat_interval_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.heartbeatInterval"\n required id="heartbeat-interval" min="0" pattern="[0-9]+"\n name="heartbeatInterval">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.heartbeatInterval.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.heartbeatInterval.$error.pattern">\n {{\'cluster_management.cluster_page.errors.only_positive_integers\' | translate}}\n </div>\n </div>\n </div>\n </div>\n\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.messageSizeKB.$invalid}">\n <label for="message-size" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.message_size_kb\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.message_size_kb_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.messageSizeKB"\n required id="message-size" min="0" pattern="[0-9]+" name="messageSizeKB">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.messageSizeKB.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.messageSizeKB.$error.pattern">\n {{\'cluster_management.cluster_page.errors.only_positive_integers\' | translate}}\n </div>\n </div>\n </div>\n </div>\n\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.verificationTimeout.$invalid}">\n <label for="verification-timeout" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.verification_timeout\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.verification_timeout_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.verificationTimeout"\n required id="verification-timeout" min="0" pattern="[0-9]+"\n name="verificationTimeout">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.verificationTimeout.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.verificationTimeout.$error.pattern">\n {{\'cluster_management.cluster_page.errors.only_positive_integers\' | translate}}\n </div>\n </div>\n </div>\n </div>\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.transactionLogMaximumSizeGB.$invalid}">\n <label for="verification-timeout" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.transaction_log_maximum_size_gb\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.transaction_log_maximum_size_gb_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.transactionLogMaximumSizeGB"\n required id="transaction-log-maximum-size-gb"\n pattern="-?[1-9][0-9]*(\\.[0-9]+)?" name="transaction_log_maximum_size_gb">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.transactionLogMaximumSizeGB.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.transactionLogMaximumSizeGB.$error.pattern">\n {{\'cluster_management.cluster_page.errors.small_transaction_log_max_size\' |\n translate}}\n </div>\n </div>\n </div>\n </div>\n <div class="form-group">\n <div class="input-group" ng-class="{\'has-danger\': clusterConfigurationForm.batchUpdateInterval.$invalid}">\n <label for="batch-update-interval" class="col-xs-4 col-form-label">\n {{\'cluster_management.cluster_configuration_properties.batch_update_interval\' | translate}}*\n </label>\n <div class="col-xs-8" gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.batch_update_interval_tooltip\' | translate}}">\n <input\n class="form-control"\n placeholder="{{\'required.field\' | translate}}"\n type="number"\n ng-model="clusterConfiguration.batchUpdateInterval"\n required\n id="batch-update-interval"\n min="0"\n name="batchUpdateInterval">\n <div class="form-control-feedback" ng-show="clusterConfigurationForm.batchUpdateInterval.$error.required">\n {{\'required.field\' | translate}}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </form>\n</div>\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[348],{468:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/cluster-nodes-configuration.css?v=2.8.8" rel="stylesheet"/>\n\n<div onto-loader-new ng-if="loader" class="create-cluster-loader" message="getLoaderMessage" size="100"></div>\n<div class="add-node-wrapper pull-right mb-1">\n <button ng-click="addNode()" ng-disabled="editedNodeIndex !== undefined"\n class="btn btn-primary add-node-btn"\n gdb-tooltip="{{\'cluster_management.update_cluster_group_dialog.actions.add_node_tooltip\' | translate}}">\n <i class="fa fa-plus"></i> {{\'cluster_management.update_cluster_group_dialog.actions.add_node\' |\n translate}}\n </button>\n</div>\n<div class="table-responsive">\n <form name="form" id="updateClusterGroupForm">\n <table class="cluster-group table table-striped table-hover cluster-group-table" aria-describedby="cluster group table">\n <thead>\n <tr class="labels-row">\n <th scope="col" class="index-column">\n {{\'cluster_management.update_cluster_group_dialog.column.index\' | translate}}\n </th>\n <th scope="col" class="location-column">\n {{\'cluster_management.update_cluster_group_dialog.column.location\' | translate}}\n </th>\n <th scope="col" class="info-column">\n {{\'cluster_management.update_cluster_group_dialog.column.info\' | translate}}\n </th>\n <th scope="col" class="status-column">\n {{\'cluster_management.update_cluster_group_dialog.column.status\' | translate}}\n </th>\n <th scope="col" class="empty-column"></th>\n <th scope="col" class="actions-column"></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-if="!viewModel.length">\n <td colspan="5" class="no-data">\n {{\'cluster_management.update_cluster_group_dialog.messages.no_cluster\' | translate}}\n </td>\n </tr>\n\n <tr ng-repeat-start="node in viewModel track by $index" ng-if="0"></tr>\n <tr ng-if="$index !== editedNodeIndex" class="node preview-node-row" data-endpoint="{{node.endpoint}}"\n capture-height="$index"\n ng-class="{\'selected\': $index === selectedNode || $index === editedNodeIndex}">\n <td class="index-cell"><span ng-if="!node.isDeleted">{{node.index + 1}}</span></td>\n <td class="location-cell data" ng-class="{\'deleting\': node.isDeleted, \'adding\': !node.item.address}">\n <div class="location-item">\n {{node.item.endpoint}}\n </div>\n </td>\n <td class="info-cell data">\n <span ng-if="node.isLocal">\n {{\'cluster_management.update_cluster_group_dialog.current_node\' | translate}}<span ng-if="node.item.nodeState">, </span>\n </span>\n\n <span ng-if="node.item.nodeState">\n {{ (\'cluster_management.update_cluster_group_dialog.\' + node.item.nodeState.toLowerCase()) |\n translate }}\n </span>\n </td>\n <td class="status-cell data">\n <div ng-if="!node.item.address" class="adding">\n <i class="fa fa-circle-check status-icon"></i>\n {{\'cluster_management.update_cluster_group_dialog.new_node\' | translate}}\n </div>\n <div ng-if="node.isDeleted" class="deleting">\n <i class="fa fa-xmark status-icon"></i>\n {{\'cluster_management.update_cluster_group_dialog.deleted_node\' | translate}}\n </div>\n </td>\n <td class="empty-cell"></td>\n <td class="actions-cell">\n <div ng-if="editedNodeIndex === undefined && !node.isDeleted" class="actions-group">\n <button ng-click="deleteNode($index, node)" ng-disabled="!canDeleteNode"\n class="btn btn-link delete-node-btn secondary"\n gdb-tooltip="{{ canDeleteNode ? (\'cluster_management.update_cluster_group_dialog.actions.delete_node\' | translate) : (\'cluster_management.update_cluster_group_dialog.actions.cannot_delete_node\' | translate) }}"\n title-class="delete-node-tooltip">\n <i class="fa fa-xmark"></i>\n </button>\n <button ng-click="replaceNode($index, node)" class="btn btn-link replace-node-btn"\n gdb-tooltip="{{\'cluster_management.update_cluster_group_dialog.actions.replace_node\' | translate}}">\n <i class="fa fa-arrow-right-arrow-left"></i>\n </button>\n </div>\n <div ng-if="editedNodeIndex === undefined && node.isDeleted" class="actions-group">\n <button ng-click="restoreNode(node)"\n class="btn btn-link restore-node-btn secondary"\n gdb-tooltip="{{\'cluster_management.update_cluster_group_dialog.actions.restore_node\' | translate}}">\n <i class="fa fa-rotate-left"></i>\n </button>\n </div>\n </td>\n </tr>\n <tr ng-if="$index === editedNodeIndex" class="node edit-node-row" data-endpoint="{{node.endpoint}}"\n style="{{getRowHeight}}"\n ng-class="{\'selected table-info\': $index === editedNodeIndex}">\n <td class="index-cell"><span ng-if="!node.isDeleted">{{node.index + 1}}</span></td>\n <td class="data location-cell">\n <div class="autocomplete-container">\n <textarea type="text" name="location" required\n ng-model="node.endpoint"\n ng-change="filterSuggestions(node)"\n ng-blur="hideSuggestions(node)"\n ng-click="filterSuggestions(node)"\n auto-grow\n validate-url exclude="/repositories" exclude-protocol="ftp,ftps"\n validate-duplicate-url excluded-urls="clusterNodesEndpoints"\n allow-empty="false"\n autocomplete="off"\n class="form-control form-control-sm textarea-edit"\n uib-tooltip="{{\'remote.location.enter.url.msg\' | translate}}"\n tooltip-placement="top"\n placeholder="{{\'cluster_management.update_cluster_group_dialog.field_placeholders.location\' | translate}}">\n </textarea>\n <ul ng-show="suggestions.length > 0 && showDropdown" class="autocomplete-dropdown">\n <li ng-repeat="suggestion in suggestions"\n ng-mouseup="selectSuggestion(node, suggestion)">\n {{ suggestion }}\n </li>\n </ul>\n </div>\n </td>\n <td class="info-cell data">\n <span ng-if="node.isLocal">\n {{\'cluster_management.update_cluster_group_dialog.current_node\' | translate}}<span ng-if="node.item.nodeState">, </span>\n </span>\n\n <span ng-if="node.item.nodeState">\n {{ (\'cluster_management.update_cluster_group_dialog.\' + node.item.nodeState.toLowerCase()) |\n translate }}\n </span>\n </td>\n <td class="status-cell"></td>\n <td class="empty-cell"></td>\n <td class="actions-cell">\n <div class="crud-actions-group">\n <button ng-click="cancel()"\n class="btn btn-link cancel-node-replace-btn secondary"\n gdb-tooltip="{{\'cluster_management.update_cluster_group_dialog.actions.cancel\' | translate}}">\n <i class="fa fa-xmark"></i>\n </button>\n <button ng-click="saveNode(node.endpoint)"\n class="btn btn-link save-rule-btn"\n ng-disabled="!form.location.$valid"\n gdb-tooltip="{{form.location.$valid ? \'cluster_management.update_cluster_group_dialog.actions.add_node\' : \'cluster_management.update_cluster_group_dialog.messages.invalid_form\' | translate}}">\n <i class="fa fa-check"></i>\n </button>\n </div>\n </td>\n </tr>\n <tr ng-repeat-end ng-if="0"></tr>\n <tr ng-if="addNewLocation" class="node edit-node-row">\n <td class="index-cell"></td>\n <td class="data location-cell">\n <div class="autocomplete-container">\n <textarea type="text" name="location" required\n ng-model="newLocation.endpoint"\n ng-change="filterSuggestions(newLocation)"\n ng-blur="hideSuggestions(newLocation)"\n ng-click="filterSuggestions(newLocation)"\n auto-grow\n validate-url exclude="/repositories" exclude-protocol="ftp,ftps"\n validate-duplicate-url excluded-urls="clusterNodesEndpoints"\n allow-empty="false"\n autocomplete="off"\n class="form-control form-control-sm textarea-edit"\n uib-tooltip="{{\'remote.location.enter.url.msg\' | translate}}"\n tooltip-placement="top"\n placeholder="{{\'cluster_management.update_cluster_group_dialog.field_placeholders.location\' | translate}}">\n </textarea>\n <ul ng-show="suggestions.length > 0 && showDropdown" class="autocomplete-dropdown">\n <li ng-repeat="suggestion in suggestions"\n ng-mouseup="selectSuggestion(newLocation, suggestion)">\n {{ suggestion }}\n </li>\n </ul>\n </div>\n </td>\n <td class="info-cell data"></td>\n <td class="status-cell"></td>\n <td class="empty-cell"></td>\n <td class="actions-cell">\n <div class="crud-actions-group">\n <button ng-click="cancel()"\n class="btn btn-link cancel-node-replace-btn secondary"\n gdb-tooltip="{{\'cluster_management.update_cluster_group_dialog.actions.cancel\' | translate}}">\n <i class="fa fa-xmark"></i>\n </button>\n <button ng-click="saveNode(newLocation.endpoint)"\n class="btn btn-link save-rule-btn"\n ng-disabled="!form.location.$valid"\n gdb-tooltip="{{form.location.$valid ? \'cluster_management.update_cluster_group_dialog.actions.add_node\' : \'cluster_management.update_cluster_group_dialog.messages.invalid_form\' | translate}}">\n <i class="fa fa-check"></i>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div class="errors">\n <div class="error-message"\n ng-show="form.location.$error.validUrl && !form.location.$pristine">\n * {{\'valid.remote.location.warning\' | translate}} http://server.example.com:7200/.\n </div>\n <div class="error-message"\n ng-show="form.location.$error.duplicateUrl && !form.location.$pristine">\n * {{\'duplicate.remote.location.warning\' | translate}}\n </div>\n <div ng-repeat="error in errors" class="error-message">\n {{error}}\n </div>\n </div>\n <div class="form-horizontal" ng-if="!hasCluster">\n <div class="form-group">\n <div class="indented-div">\n <span class="padding-label wrapper-div"\n gdb-tooltip="{{\'cluster_management.cluster_page.advanced_options_tooltip\' | translate}}">\n <button type="button"\n class="text-btn advanced-options-btn text-left"\n data-toggle="collapse"\n data-target="#advancedOptions">\n <i class="{{getAdvancedOptionsClass()}} advanced-options-toggle" aria-hidden="true"></i>\n {{\'cluster_management.cluster_page.advanced_options\' | translate}}\n </button>\n </span>\n </div>\n\n <div id="advancedOptions" class="collapse pb-1 pl-2">\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.electionMinTimeout.$invalid}">\n <label for="election-minimum-timeout" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.election_min_timeout\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.election_min_timeout_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.electionMinTimeout"\n required id="election-minimum-timeout" min="0" pattern="[0-9]+"\n name="electionMinTimeout">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.electionMinTimeout.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.electionMinTimeout.$error.pattern">\n {{\'cluster_management.cluster_page.errors.only_positive_integers\' | translate}}\n </div>\n </div>\n </div>\n </div>\n\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.electionRangeTimeout.$invalid}">\n <label for="election-range-timeout" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.election_range_timeout\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.election_range_timeout_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.electionRangeTimeout"\n required id="election-range-timeout" min="0" pattern="[0-9]+"\n name="electionRangeTimeout">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.electionRangeTimeout.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.electionRangeTimeout.$error.pattern">\n {{\'cluster_management.cluster_page.errors.only_positive_integers\' | translate}}\n </div>\n </div>\n </div>\n </div>\n\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.heartbeatInterval.$invalid}">\n <label for="heartbeat-interval" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.heartbeat_interval\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.heartbeat_interval_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.heartbeatInterval"\n required id="heartbeat-interval" min="0" pattern="[0-9]+"\n name="heartbeatInterval">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.heartbeatInterval.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.heartbeatInterval.$error.pattern">\n {{\'cluster_management.cluster_page.errors.only_positive_integers\' | translate}}\n </div>\n </div>\n </div>\n </div>\n\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.messageSizeKB.$invalid}">\n <label for="message-size" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.message_size_kb\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.message_size_kb_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.messageSizeKB"\n required id="message-size" min="0" pattern="[0-9]+" name="messageSizeKB">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.messageSizeKB.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.messageSizeKB.$error.pattern">\n {{\'cluster_management.cluster_page.errors.only_positive_integers\' | translate}}\n </div>\n </div>\n </div>\n </div>\n\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.verificationTimeout.$invalid}">\n <label for="verification-timeout" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.verification_timeout\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.verification_timeout_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.verificationTimeout"\n required id="verification-timeout" min="0" pattern="[0-9]+"\n name="verificationTimeout">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.verificationTimeout.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.verificationTimeout.$error.pattern">\n {{\'cluster_management.cluster_page.errors.only_positive_integers\' | translate}}\n </div>\n </div>\n </div>\n </div>\n <div class="form-group">\n <div class="input-group"\n ng-class="{\'has-danger\': clusterConfigurationForm.transactionLogMaximumSizeGB.$invalid}">\n <label for="verification-timeout" class="col-xs-4 col-form-label">{{\'cluster_management.cluster_configuration_properties.transaction_log_maximum_size_gb\'\n | translate}}*</label>\n <div class="col-xs-8"\n gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.transaction_log_maximum_size_gb_tooltip\' | translate}}">\n <input class="form-control" placeholder="{{\'required.field\' | translate}}"\n type="number" ng-model="clusterConfiguration.transactionLogMaximumSizeGB"\n required id="transaction-log-maximum-size-gb"\n pattern="-?[1-9][0-9]*(\\.[0-9]+)?" name="transaction_log_maximum_size_gb">\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.transactionLogMaximumSizeGB.$error.required">\n {{\'required.field\' | translate}}\n </div>\n <div class="form-control-feedback"\n ng-show="clusterConfigurationForm.transactionLogMaximumSizeGB.$error.pattern">\n {{\'cluster_management.cluster_page.errors.small_transaction_log_max_size\' |\n translate}}\n </div>\n </div>\n </div>\n </div>\n <div class="form-group">\n <div class="input-group" ng-class="{\'has-danger\': clusterConfigurationForm.batchUpdateInterval.$invalid}">\n <label for="batch-update-interval" class="col-xs-4 col-form-label">\n {{\'cluster_management.cluster_configuration_properties.batch_update_interval\' | translate}}*\n </label>\n <div class="col-xs-8" gdb-tooltip="{{\'cluster_management.cluster_configuration_properties.batch_update_interval_tooltip\' | translate}}">\n <input\n class="form-control"\n placeholder="{{\'required.field\' | translate}}"\n type="number"\n ng-model="clusterConfiguration.batchUpdateInterval"\n required\n id="batch-update-interval"\n min="0"\n name="batchUpdateInterval">\n <div class="form-control-feedback" ng-show="clusterConfigurationForm.batchUpdateInterval.$error.required">\n {{\'required.field\' | translate}}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </form>\n</div>\n';return __p}}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[354],{474:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/autocomplete-select.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<div class="autocomplete-select-wrapper">\n <div class="autocomplete-select">\n <div ng-hide="isMultiline">\n <input type="text" ng-model="searchInput" ng-change="onChange()" ng-keydown="onKeyDown($event)"\n ng-blur="onBlur()" ng-required="required"\n class="autocomplete-input autocomplete-editable" ng-class="styleClass" placeholder="{{placeholder}}">\n </div>\n <div ng-show="isMultiline">\n <textarea\n ng-model="searchInput"\n ng-change="onChange()"\n ng-keydown="onKeyDown($event)"\n ng-blur="onBlur()"\n ng-required="required"\n class="autocomplete-textarea autocomplete-editable" ng-class="styleClass"\n placeholder="{{placeholder}}"\n rows="{{initialRows}}">\n </textarea>\n </div>\n </div>\n <div class="autocomplete-results-wrapper card">\n <div ng-repeat="autoCompleteUriResult in autoCompleteUriResults track by $index"\n ng-click="selectResource(autoCompleteUriResult)"\n ng-mousemove="setActiveItemIndex($index)"\n ng-class="{active: activeSearchElm === $index, selected: selectedElementIndex === $index}"\n class="result-item">\n <p ng-bind-html="getResultItemHtml(autoCompleteUriResult)"></p>\n </div>\n </div>\n</div>\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[354],{474:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/autocomplete-select.css?v=2.8.8" rel="stylesheet"/>\n\n<div class="autocomplete-select-wrapper">\n <div class="autocomplete-select">\n <div ng-hide="isMultiline">\n <input type="text" ng-model="searchInput" ng-change="onChange()" ng-keydown="onKeyDown($event)"\n ng-blur="onBlur()" ng-required="required"\n class="autocomplete-input autocomplete-editable" ng-class="styleClass" placeholder="{{placeholder}}">\n </div>\n <div ng-show="isMultiline">\n <textarea\n ng-model="searchInput"\n ng-change="onChange()"\n ng-keydown="onKeyDown($event)"\n ng-blur="onBlur()"\n ng-required="required"\n class="autocomplete-textarea autocomplete-editable" ng-class="styleClass"\n placeholder="{{placeholder}}"\n rows="{{initialRows}}">\n </textarea>\n </div>\n </div>\n <div class="autocomplete-results-wrapper card">\n <div ng-repeat="autoCompleteUriResult in autoCompleteUriResults track by $index"\n ng-click="selectResource(autoCompleteUriResult)"\n ng-mousemove="setActiveItemIndex($index)"\n ng-class="{active: activeSearchElm === $index, selected: selectedElementIndex === $index}"\n class="result-item">\n <p ng-bind-html="getResultItemHtml(autoCompleteUriResult)"></p>\n </div>\n </div>\n</div>\n';return __p}}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[357],{477:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/operations-statuses-monitor.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<div ng-if="activeOperations && activeOperations.operations && activeOperations.operations.length > 0"\n class="operations-statuses btn-group">\n <button type="button"\n class="btn btn-secondary operations-statuses-dropdown-toggle dropdown-toggle" data-toggle="dropdown"\n ng-if="operationsSummary && operationsSummary.length > 0"\n ng-class="{\n \'btn-fade-danger\': OPERATION_STATUS.CRITICAL === activeOperations.status,\n \'btn-fade-warning\': OPERATION_STATUS.WARNING === activeOperations.status\n }">\n <div class="operation-status-header" ng-repeat="operationGroup in operationsSummary">\n <div ng-class="{\n \'icon-import\': OPERATION_GROUP_TYPE.IMPORT_OPERATION === operationGroup.type,\n \'icon-exchange\': OPERATION_GROUP_TYPE.QUERIES_OPERATION === operationGroup.type,\n \'fa fa-archive\': OPERATION_GROUP_TYPE.BACKUP_AND_RESTORE_OPERATION === operationGroup.type,\n \'fa fa-sitemap\': OPERATION_GROUP_TYPE.CLUSTER_OPERATION === operationGroup.type,\n \'status-critical\': OPERATION_STATUS.CRITICAL === operationGroup.status,\n \'status-information\': OPERATION_STATUS.INFORMATION === operationGroup.status,\n \'status-warning\': OPERATION_STATUS.WARNING === operationGroup.status}">\n </div>\n <span ng-if="operationGroup.runningOperations" class="running-operation-count">\n <sup class="tag-info">{{operationGroup.runningOperations}}</sup>\n </span>\n </div>\n <span class="caret"></span>\n </button>\n <ul role="menu" class="dropdown-menu dropdown-menu-right">\n <div class="operations-statuses-content">\n <li ng-repeat="operationStatus in activeOperations.operations">\n <a class="operation-status-content btn btn-secondary row" target="_blank" ng-attr-href="{{operationStatus.monitoringViewUrl}}"\n ng-class="{\n \'status-critical\': OPERATION_STATUS.CRITICAL === operationStatus.status,\n \'status-information\': OPERATION_STATUS.INFORMATION === operationStatus.status,\n \'status-warning\': OPERATION_STATUS.WARNING === operationStatus.status\n }">\n <div class="operation-icon col-sm-1" ng-style="noPadding">\n <div ng-class="{\n \'icon-import\': OPERATION_TYPE.IMPORTS === operationStatus.type,\n \'icon-exchange\': OPERATION_TYPE.QUERIES === operationStatus.type || OPERATION_TYPE.UPDATES === operationStatus.type,\n \'fa fa-archive\': OPERATION_TYPE.BACKUP_RESTORE === operationStatus.type,\n \'fa fa-sitemap\': OPERATION_TYPE.CLUSTER_STATUS === operationStatus.type}">\n </div>\n </div>\n <div class="col-sm-8 operation-status-label">\n {{ \'global.operations_statuses.\' + operationStatus.titleLabelKey + \'.title\' | translate }}\n </div>\n <div class="operation-number col-sm-3">\n <div ng-if="operationStatus.runningOperationCount" class="operation-status-running-operation-count tag-info">\n {{operationStatus.runningOperationCount}}\n </div>\n </div>\n </a>\n </li>\n </div>\n </ul>\n</div>\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[357],{477:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/operations-statuses-monitor.css?v=2.8.8" rel="stylesheet"/>\n\n<div ng-if="activeOperations && activeOperations.operations && activeOperations.operations.length > 0"\n class="operations-statuses btn-group">\n <button type="button"\n class="btn btn-secondary operations-statuses-dropdown-toggle dropdown-toggle" data-toggle="dropdown"\n ng-if="operationsSummary && operationsSummary.length > 0"\n ng-class="{\n \'btn-fade-danger\': OPERATION_STATUS.CRITICAL === activeOperations.status,\n \'btn-fade-warning\': OPERATION_STATUS.WARNING === activeOperations.status\n }">\n <div class="operation-status-header" ng-repeat="operationGroup in operationsSummary">\n <div ng-class="{\n \'icon-import\': OPERATION_GROUP_TYPE.IMPORT_OPERATION === operationGroup.type,\n \'icon-exchange\': OPERATION_GROUP_TYPE.QUERIES_OPERATION === operationGroup.type,\n \'fa fa-archive\': OPERATION_GROUP_TYPE.BACKUP_AND_RESTORE_OPERATION === operationGroup.type,\n \'fa fa-sitemap\': OPERATION_GROUP_TYPE.CLUSTER_OPERATION === operationGroup.type,\n \'status-critical\': OPERATION_STATUS.CRITICAL === operationGroup.status,\n \'status-information\': OPERATION_STATUS.INFORMATION === operationGroup.status,\n \'status-warning\': OPERATION_STATUS.WARNING === operationGroup.status}">\n </div>\n <span ng-if="operationGroup.runningOperations" class="running-operation-count">\n <sup class="tag-info">{{operationGroup.runningOperations}}</sup>\n </span>\n </div>\n <span class="caret"></span>\n </button>\n <ul role="menu" class="dropdown-menu dropdown-menu-right">\n <div class="operations-statuses-content">\n <li ng-repeat="operationStatus in activeOperations.operations">\n <a class="operation-status-content btn btn-secondary row" target="_blank" ng-attr-href="{{operationStatus.monitoringViewUrl}}"\n ng-class="{\n \'status-critical\': OPERATION_STATUS.CRITICAL === operationStatus.status,\n \'status-information\': OPERATION_STATUS.INFORMATION === operationStatus.status,\n \'status-warning\': OPERATION_STATUS.WARNING === operationStatus.status\n }">\n <div class="operation-icon col-sm-1" ng-style="noPadding">\n <div ng-class="{\n \'icon-import\': OPERATION_TYPE.IMPORTS === operationStatus.type,\n \'icon-exchange\': OPERATION_TYPE.QUERIES === operationStatus.type || OPERATION_TYPE.UPDATES === operationStatus.type,\n \'fa fa-archive\': OPERATION_TYPE.BACKUP_RESTORE === operationStatus.type,\n \'fa fa-sitemap\': OPERATION_TYPE.CLUSTER_STATUS === operationStatus.type}">\n </div>\n </div>\n <div class="col-sm-8 operation-status-label">\n {{ \'global.operations_statuses.\' + operationStatus.titleLabelKey + \'.title\' | translate }}\n </div>\n <div class="operation-number col-sm-3">\n <div ng-if="operationStatus.runningOperationCount" class="operation-status-running-operation-count tag-info">\n {{operationStatus.runningOperationCount}}\n </div>\n </div>\n </a>\n </li>\n </div>\n </ul>\n</div>\n';return __p}}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[358],{478:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/rdf-resource-search.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<div ng-cloak>\n <div id="search-box"\n class="card search-rdf-input"\n ng-class="{\'show-rdf-search-box-visible\': showRdfSearchInput, \'show-rdf-search-box-invisible\': !showRdfSearchInput}"\n ng-keydown="onKeyDown($event)">\n <div class="card-block">\n <search-resource-input\n repository-namespaces="repositoryNamespaces"\n is-autocomplete-enabled="isAutocompleteEnabled"\n empty="empty"\n open-in-new-tab="true"\n preserve-search="true"\n radio-buttons="true"\n clear-input-icon="true">\n </search-resource-input>\n <button class="btn btn-link close-rdf-search-btn"\n gdb-tooltip="{{\'search.resource.close.msg\' | translate}}" tooltip-placement="bottom"\n ng-click="hideInput()">\n <i class="icon-close icon-2x" aria-hidden="true"></i>\n </button>\n </div>\n </div>\n <button class="btn btn-link search-rdf-btn"\n ng-if="!showRdfSearchInput"\n gdb-tooltip="{{\'search.resources.msg\' | translate}}"\n tooltip-placement="bottom"\n ng-click="showInput()">\n <i class="icon-search" aria-hidden="true"></i>\n </button>\n</div>\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[358],{478:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/rdf-resource-search.css?v=2.8.8" rel="stylesheet"/>\n\n<div ng-cloak>\n <div id="search-box"\n class="card search-rdf-input"\n ng-class="{\'show-rdf-search-box-visible\': showRdfSearchInput, \'show-rdf-search-box-invisible\': !showRdfSearchInput}"\n ng-keydown="onKeyDown($event)">\n <div class="card-block">\n <search-resource-input\n repository-namespaces="repositoryNamespaces"\n is-autocomplete-enabled="isAutocompleteEnabled"\n empty="empty"\n open-in-new-tab="true"\n preserve-search="true"\n radio-buttons="true"\n clear-input-icon="true">\n </search-resource-input>\n <button class="btn btn-link close-rdf-search-btn"\n gdb-tooltip="{{\'search.resource.close.msg\' | translate}}" tooltip-placement="bottom"\n ng-click="hideInput()">\n <i class="icon-close icon-2x" aria-hidden="true"></i>\n </button>\n </div>\n </div>\n <button class="btn btn-link search-rdf-btn"\n ng-if="!showRdfSearchInput"\n gdb-tooltip="{{\'search.resources.msg\' | translate}}"\n tooltip-placement="bottom"\n ng-click="showInput()">\n <i class="icon-search" aria-hidden="true"></i>\n </button>\n</div>\n';return __p}}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[359],{479:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/lib/ontotext-yasgui-web-component.css?v=2.8.8-TR1" rel="stylesheet">\n\n<ontotext-yasgui\n class="{{classToApply}}"\n ng-custom-element\n ngce-prop-config="ontotextYasguiConfig"\n ngce-prop-saved_query_config="savedQueryConfig"\n ngce-prop-language="language"\n ngce-on-create_saved_query="createSavedQuery($event)"\n ngce-on-update_saved_query="updateSavedQuery($event)"\n ngce-on-delete_saved_query="deleteSavedQuery($event)"\n ngce-on-share_saved_query="shareSavedQuery($event)"\n ngce-on-share_query="shareQuery($event)"\n ngce-on-query_share_link_copied="queryShareLinkCopied()"\n ngce-on-load_saved_queries="loadSavedQueries($event)"\n ngce-on-save_query_opened="saveQueryOpened($event)"\n ngce-on-output="output($event)">\n</ontotext-yasgui>\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[359],{479:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/lib/ontotext-yasgui-web-component.css?v=2.8.8" rel="stylesheet">\n\n<ontotext-yasgui\n class="{{classToApply}}"\n ng-custom-element\n ngce-prop-config="ontotextYasguiConfig"\n ngce-prop-saved_query_config="savedQueryConfig"\n ngce-prop-language="language"\n ngce-on-create_saved_query="createSavedQuery($event)"\n ngce-on-update_saved_query="updateSavedQuery($event)"\n ngce-on-delete_saved_query="deleteSavedQuery($event)"\n ngce-on-share_saved_query="shareSavedQuery($event)"\n ngce-on-share_query="shareQuery($event)"\n ngce-on-query_share_link_copied="queryShareLinkCopied()"\n ngce-on-load_saved_queries="loadSavedQueries($event)"\n ngce-on-save_query_opened="saveQueryOpened($event)"\n ngce-on-output="output($event)">\n</ontotext-yasgui>\n';return __p}}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[360],{480:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/cookie-policy.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<div class="cookie-consent-modal" ng-show="showCookieConsent">\n <div class="cookie-consent-content">\n <span>{{\'cookie.cookie_consent\' | translate}} <a href="#" class="btn btn-link p-0"\n ng-click="showCookiePolicy()">{{\'cookie.cookie_policy_url_label\' | translate}}</a>.</span>\n <button class="btn btn-primary" ng-click="acceptConsent()">{{\'common.ok.btn\' | translate}}</button>\n </div>\n</div>\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[360],{480:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/cookie-policy.css?v=2.8.8" rel="stylesheet"/>\n\n<div class="cookie-consent-modal" ng-show="showCookieConsent">\n <div class="cookie-consent-content">\n <span>{{\'cookie.cookie_consent\' | translate}} <a href="#" class="btn btn-link p-0"\n ng-click="showCookiePolicy()">{{\'cookie.cookie_policy_url_label\' | translate}}</a>.</span>\n <button class="btn btn-primary" ng-click="acceptConsent()">{{\'common.ok.btn\' | translate}}</button>\n </div>\n</div>\n';return __p}}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[361],{481:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/cookie-policy.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<div class="cookie-policy-modal">\n <div class="title">{{\'cookie.policy.title\' | translate}}</div>\n\n <div class="heading">{{\'cookie.policy.purpose_heading\' | translate}}</div>\n <div class="text">{{\'cookie.policy.purpose_text\' | translate}}</div>\n <div class="text mt-1">{{\'cookie.policy.purpose_enterprise_text\' | translate}}</div>\n\n <div class="heading">{{\'cookie.policy.privacy_commitment_heading\' | translate}}</div>\n <div class="text">{{\'cookie.policy.privacy_commitment_text\' | translate}}</div>\n <ul>\n <li>{{\'cookie.policy.privacy_commitment_1\' | translate}}</li>\n <li>{{\'cookie.policy.privacy_commitment_2\' | translate}}</li>\n </ul>\n\n <div class="heading">{{\'cookie.policy.cookies_heading\' | translate}}</div>\n <div class="text">{{\'cookie.policy.cookies_text\' | translate}}</div>\n\n <div class="heading">{{\'cookie.policy.manage_cookies_heading\' | translate}}</div>\n <div id="statistic-consent" class="toggle-group">\n <label><strong>{{\'cookie.policy.statistic_cookies\' | translate}}</strong></label>\n <span gdb-tooltip="{{\'cookie.policy.statistic_tooltip\' | translate}}" tooltip-placement="top"\n ng-click="toggleConsent(ConsentTypes.STATISTIC)"\n class="switch">\n <input type="checkbox" class="switch" ng-checked="cookieConsent.getStatisticConsent()"/>\n <label for="statistic-consent"></label>\n </span>\n </div>\n <div class="text">{{\'cookie.policy.statistic_text\' | translate}}</div>\n\n <div id="third-party-consent" class="toggle-group mt-1">\n <label><strong>{{\'cookie.policy.third_party_cookies\' | translate}}</strong></label>\n <span gdb-tooltip="{{\'cookie.policy.third_party_tooltip\' | translate}}" tooltip-placement="top"\n ng-click="toggleConsent(ConsentTypes.THIRD_PARTY)"\n class="switch">\n <input type="checkbox" class="switch" ng-checked="cookieConsent.thirdParty"/>\n <label for="third-party-consent"></label>\n </span>\n </div>\n <div class="text">{{\'cookie.policy.third_party_cookies_text\' | translate}}</div>\n\n <div class="text mt-1"><span>{{\'cookie.policy.change_cookies\' | translate}} <i>{{\'menu.setup.label\' | translate}} > {{\'menu.my.settings.label\' | translate}} > {{\'security.user.settings\' | translate}} > {{\'cookie.policy.change_cookies_location4\' | translate}}</i></span></div>\n\n <div class="text-right">\n <button class="btn btn-primary" ng-click="close()">{{\'common.close.btn\' | translate}}</button>\n </div>\n</div>\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[361],{481:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/cookie-policy.css?v=2.8.8" rel="stylesheet"/>\n\n<div class="cookie-policy-modal">\n <div class="title">{{\'cookie.policy.title\' | translate}}</div>\n\n <div class="heading">{{\'cookie.policy.purpose_heading\' | translate}}</div>\n <div class="text">{{\'cookie.policy.purpose_text\' | translate}}</div>\n <div class="text mt-1">{{\'cookie.policy.purpose_enterprise_text\' | translate}}</div>\n\n <div class="heading">{{\'cookie.policy.privacy_commitment_heading\' | translate}}</div>\n <div class="text">{{\'cookie.policy.privacy_commitment_text\' | translate}}</div>\n <ul>\n <li>{{\'cookie.policy.privacy_commitment_1\' | translate}}</li>\n <li>{{\'cookie.policy.privacy_commitment_2\' | translate}}</li>\n </ul>\n\n <div class="heading">{{\'cookie.policy.cookies_heading\' | translate}}</div>\n <div class="text">{{\'cookie.policy.cookies_text\' | translate}}</div>\n\n <div class="heading">{{\'cookie.policy.manage_cookies_heading\' | translate}}</div>\n <div id="statistic-consent" class="toggle-group">\n <label><strong>{{\'cookie.policy.statistic_cookies\' | translate}}</strong></label>\n <span gdb-tooltip="{{\'cookie.policy.statistic_tooltip\' | translate}}" tooltip-placement="top"\n ng-click="toggleConsent(ConsentTypes.STATISTIC)"\n class="switch">\n <input type="checkbox" class="switch" ng-checked="cookieConsent.getStatisticConsent()"/>\n <label for="statistic-consent"></label>\n </span>\n </div>\n <div class="text">{{\'cookie.policy.statistic_text\' | translate}}</div>\n\n <div id="third-party-consent" class="toggle-group mt-1">\n <label><strong>{{\'cookie.policy.third_party_cookies\' | translate}}</strong></label>\n <span gdb-tooltip="{{\'cookie.policy.third_party_tooltip\' | translate}}" tooltip-placement="top"\n ng-click="toggleConsent(ConsentTypes.THIRD_PARTY)"\n class="switch">\n <input type="checkbox" class="switch" ng-checked="cookieConsent.thirdParty"/>\n <label for="third-party-consent"></label>\n </span>\n </div>\n <div class="text">{{\'cookie.policy.third_party_cookies_text\' | translate}}</div>\n\n <div class="text mt-1"><span>{{\'cookie.policy.change_cookies\' | translate}} <i>{{\'menu.setup.label\' | translate}} > {{\'menu.my.settings.label\' | translate}} > {{\'security.user.settings\' | translate}} > {{\'cookie.policy.change_cookies_location4\' | translate}}</i></span></div>\n\n <div class="text-right">\n <button class="btn btn-primary" ng-click="close()">{{\'common.close.btn\' | translate}}</button>\n </div>\n</div>\n';return __p}}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[391],{511:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<script type="text/ng-template" id="popover-content-user.html">\n\t<h5>{{\'security.user.may\' | translate}}</h5>\n\t<ul>\n <li>{{\'security.use.gdb\' | translate}}</li>\n\t <li>{{\'security.grant.read.access\' | translate}}</li>\n\t\t<li>{{\'security.grant.read.write.access\' | translate}}</li>\n </ul>\n<\/script>\n\n<script type="text/ng-template" id="popover-content-repo-manager.html">\n\t<h5>{{\'security.repo.manager.may\' | translate}}</h5>\n\t<ul>\n\t\t<li>{{\'security.use.gdb\' | translate}}</li>\n\t\t<li>{{\'security.read.write.all.repos\' | translate}}</li>\n\t\t<li>{{\'security.create.edit.delete.repos\' | translate}}</li>\n\t\t<li>{{\'security.access.monitoring\' | translate}}</li>\n\t</ul>\n<\/script>\n\n<script type="text/ng-template" id="popover-content-admin.html">\n\t<h5>{{\'security.admin.may\' | translate}}</h5>\n\t<ul>\n\t\t<li>{{\'security.use.gdb\' | translate}}</li>\n\t\t<li>{{\'security.read.write.all.repos\' | translate}}</li>\n\t\t<li>{{\'security.create.edit.delete.repos\' | translate}}</li>\n\t\t<li>{{\'security.access.monitoring\' | translate}}</li>\n\t\t<li>{{\'security.attach.remote.locations\' | translate}}</li>\n\t\t<li>{{\'security.manage.users.access\' | translate}}</li>\n\t\t<li>{{\'security.manage.cluster\' | translate}}</li>\n\t\t<li>{{\'security.view.sys.info\' | translate}}</li>\n\t</ul>\n<\/script>\n\n<link href="css/lib/ng-tags-input/ng-tags-input.min.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<h1>\n {{pageTitle}}\n <page-info-tooltip></page-info-tooltip>\n</h1>\n\n<div id="wb-user" ng-hide="loader">\n\t<form name="form" class="form newUserForm userForm editUserContainer" ng-submit="submit()" novalidate>\n\t\t<div class="row">\n\t\t\t<div class="col-md-6 us-left-col">\n\t\t\t\t<div class="card login-credentials" ng-hide="isOverrideAuth() || !isLocalAuthentication()">\n\t\t\t\t\t<div class="card-block">\n\t\t\t\t\t\t<h3>{{\'view.login.title\' | translate}}</h3>\n\t\t\t\t\t\t<div class="form-group" ng-class="{\'has-danger\': usernameError}">\n\t\t\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t\t\t<span class="input-group-addon" gdb-tooltip="{{\'security.table.username\' | translate}}"><em class="icon-user icon-2x text-muted"></em></span>\n\t\t\t\t\t\t\t\t<input id="wb-user-username" placeholder="{{\'security.table.username\' | translate}}" name="username" class="form-control form-control-lg" type="text" ng-model="user.username" ng-readonly="mode !== \'add\'">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div ng-show="usernameError" class="form-control-feedback">{{usernameError}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group" ng-class="{\'has-danger\': passwordError}">\n\t\t\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t\t\t<span class="input-group-addon" gdb-tooltip="{{\'security.password.placeholder\' | translate}}"><em class="icon-lock icon-2x text-muted"></em></span>\n\t\t\t\t\t\t\t\t<input id="wb-user-password" placeholder="{{passwordPlaceholder | translate}}" name="password" class="form-control form-control-lg" type="password"\tng-model="user.password" ng-hide="user.external || hasExternalAuthUser()" ng-readonly="noPassword">\n\t\t\t\t\t\t\t\t<span ng-show="user.external || hasExternalAuthUser()">{{\'security.auth.from.external.module\' | translate}}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div ng-show="passwordError" class="form-control-feedback">{{passwordError}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group" ng-class="{\'has-danger\': confirmPasswordError}" ng-hide="user.external || hasExternalAuthUser()">\n\t\t\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t\t\t<span class="input-group-addon" gdb-tooltip="{{\'security.password.confirm\' | translate}}"><em class="icon-lock icon-2x text-muted"></em></span>\n\t\t\t\t\t\t\t\t<input id="wb-user-confirmpassword" placeholder="{{\'security.password.confirm\' | translate}}" name="password_confirm" class="form-control form-control-lg" type="password" ng-model="user.confirmpassword" ng-readonly="noPassword">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div ng-show="confirmPasswordError" class="form-control-feedback">{{confirmPasswordError}}</div>\n\t\t\t\t\t\t</div>\n <div>\n <label class="d-block">\n <input type="checkbox" id="noPassword" ng-model="noPassword" ng-change="setNoPassword()">\n <span ng-show="mode === \'add\'">{{\'security.dont.set.password\' | translate}} </span>\n <span ng-show="mode !== \'add\'">{{\'security.unset.password\' | translate}} </span>\n </label>\n </div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="card sparql-editor-settings" id="user-settings">\n\t\t\t\t\t<div class="card-block">\n\t\t\t\t\t\t<h3>{{\'security.user.settings\' | translate}}</h3>\n\n\t\t\t\t\t\t<div id="sameas-on" class="mb-1">\n\t\t\t\t\t\t\t<span class="sameas-label">\n\t\t\t\t\t\t\t\t{{\'security.expand.sameAs.is\' | translate}}\n\t\t\t\t\t\t\t\t<span class="tag {{user.appSettings.DEFAULT_SAMEAS ? \'tag-primary\' : \'tag-default\'}}">\n\t\t\t\t\t\t\t\t\t{{user.appSettings.DEFAULT_SAMEAS ? \'common.on.btn\' : \'common.off.btn\' | translate}}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span gdb-tooltip="{{shouldDisableSameAs() ? \'core.require.inferred\' : \'security.tooltip.click.me\' | translate}}" tooltip-placement="top"\n\t\t\t\t\t\t\t\t ng-click="user.appSettings.DEFAULT_SAMEAS = !user.appSettings.DEFAULT_SAMEAS"\n\t\t\t\t\t\t\t\t class="switch mr-0">\n\t\t\t\t\t\t\t\t<input id="sameAsCheck" type="checkbox" class="switch"\n ng-checked="user.appSettings.DEFAULT_SAMEAS"\n ng-disabled="shouldDisableSameAs()"/>\n\t\t\t\t\t\t\t\t<label for="sameas-on"></label>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{{\'security.default.editor.graph\' | translate}}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div id="inference-on" class="mb-1">\n\t\t\t\t\t\t\t<span class="inference-label">\n\t\t\t\t\t\t\t\t{{\'security.inference.is\' | translate}}\n\t\t\t\t\t\t\t\t<span class="tag {{user.appSettings.DEFAULT_INFERENCE ? \'tag-primary\' : \'tag-default\'}}">\n\t\t\t\t\t\t\t\t\t{{user.appSettings.DEFAULT_INFERENCE ? \'common.on.btn\' : \'common.off.btn\' | translate}}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span gdb-tooltip="{{\'security.tooltip.click.me\' | translate}}" tooltip-placement="top"\n\t\t\t\t\t\t\t\t ng-click="user.appSettings.DEFAULT_INFERENCE = !user.appSettings.DEFAULT_INFERENCE"\n\t\t\t\t\t\t\t\t class="switch mr-0">\n\t\t\t\t\t\t\t\t<input type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_INFERENCE"/>\n\t\t\t\t\t\t\t\t<label for="inference-on"></label>\n\t\t\t\t\t\t\t</span>\n {{\'security.default.editor.graph\' | translate}}\n\t\t\t\t\t\t</div>\n\n <div id="schema-on" class="mb-1">\n\t\t\t\t\t\t\t<span class="schema-label">\n\t\t\t\t\t\t\t\t{{\'security.show.schema\' | translate}}\n\t\t\t\t\t\t\t\t<span class="tag {{user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA ? \'tag-primary\' : \'tag-default\'}}">\n\t\t\t\t\t\t\t\t\t{{user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA ? \'common.on.btn\' : \'common.off.btn\' | translate}}\n\t\t\t\t\t\t\t\t</span>\n <span gdb-tooltip="{{\'security.tooltip.click.me\' | translate}}" tooltip-placement="top"\n ng-click="user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA = !user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA"\n class="switch mr-0">\n\t\t\t\t\t\t\t\t<input type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA"/>\n\t\t\t\t\t\t\t\t<label for="schema-on"></label>\n\t\t\t\t\t\t\t</span>\n {{\'security.default.visual.graph\' | translate}}\n\t\t\t\t\t\t\t</span>\n </div>\n\n\t\t\t\t\t\t<label class="d-block">\n\t\t\t\t\t\t\t<input type="checkbox" ng-model="user.appSettings.EXECUTE_COUNT" id="defaultCount" checked="appSettings.EXECUTE_COUNT">\n\t\t\t\t\t\t\t{{\'security.count.total.results\' | translate}}\n\t\t\t\t\t\t</label>\n\n\t\t\t\t\t\t<label class="d-block">\n\t\t\t\t\t\t\t<input type="checkbox" ng-model="user.appSettings.IGNORE_SHARED_QUERIES" id="ignore-shared" checked="appSettings.IGNORE_SHARED_QUERIES">\n\t\t\t\t\t\t\t{{\'security.ignore.shared.queries\' | translate}}\n\t\t\t\t\t\t</label>\n\n <label class="d-block" ng-if="showCookiePolicyLink">\n <button class="btn btn-secondary show-cookie-policy-btn" ng-click="showCookiePolicy($event)">{{\'cookie.cookie_policy_url_label\' | translate}}</button>\n </label>\n\n </div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="card" id="workbench-settings" ng-if="showWorkbenchSettings">\n\t\t\t\t\t<div class="card-block">\n\t\t\t\t\t\t<h3>{{\'security.workbench.settings.title\' | translate}}\n\t\t\t\t\t\t\t<em class="icon-info text-tertiary small" gdb-tooltip="{{\'security.workbench.settings.theme.tooltip\' | translate}}"></em></h3>\n\t\t\t\t\t\t<div>\n <div class="form-group">\n <label class="col-lg-2">{{\'security.workbench.settings.theme.label\' | translate}}</label>\n <div class="btn-group theme-selector-dropdown" uib-dropdown>\n <button type="button" class="btn btn-sm btn-secondary dropdown-toggle theme-selector-dropdown-btn" uib-dropdown-toggle>\n {{selectedTheme.label}}\n </button>\n <ul class="dropdown-menu" role="menu">\n <li ng-repeat="theme in themes">\n <a ng-click="setTheme(theme)" class="dropdown-item">{{theme.label}}</a>\n </li>\n </ul>\n </div>\n </div>\n\n <div class="form-group">\n <label class="col-lg-2">{{\'security.workbench.settings.theme.mode.label\' | translate}}</label>\n <div class="radio">\n <label class="px-1">\n <input type="radio" value="light" ng-model="workbenchSettings.mode" ng-change="setThemeMode()"/>\n {{\'security.workbench.settings.theme.mode.light\' | translate}}\n </label>\n <label class="px-1">\n <input type="radio" value="dark" ng-model="workbenchSettings.mode" ng-change="setThemeMode()"/>\n {{\'security.workbench.settings.theme.mode.dark\' | translate}}\n </label>\n </div>\n </div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="col-md-6 us-right-col" ng-hide="!isLocalAuthentication()">\n\t\t\t\t<div class="card user-role" id="user-roles">\n\t\t\t\t\t<div class="card-block">\n\t\t\t\t\t\t<h3>{{\'security.user.role\' | translate}}</h3>\n\t\t\t\t\t\t<label class="mr-1"\n\t\t\t\t\t\t\t uib-popover-template="\'popover-content-user.html\'"\n\t\t\t\t\t\t\t popover-trigger="mouseenter"\n\t\t\t\t\t\t\t popover-placement="bottom">\n\t\t\t\t\t\t\t<input type="radio" ng-model="userType" id="roleUser" value="user" ng-disabled="hasEditRestrictions()" >\n\t\t\t\t\t\t\t{{\'security.user.label\' | translate}}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<label class="mr-1"\n\t\t\t\t\t\t\t uib-popover-template="\'popover-content-repo-manager.html\'"\n\t\t\t\t\t\t\t popover-trigger="mouseenter"\n\t\t\t\t\t\t\t popover-placement="bottom">\n\t\t\t\t\t\t\t<input type="radio" ng-model="userType" id="roleRepoAdmin" value="repoManager" ng-disabled="hasEditRestrictions()">\n\t\t\t\t\t\t\t{{\'security.repo.manager.label\' | translate}}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<label uib-popover-template="\'popover-content-admin.html\'"\n\t\t\t\t\t\t\t popover-trigger="mouseenter"\n\t\t\t\t\t\t\t popover-placement="bottom">\n\t\t\t\t\t\t\t<input type="radio" ng-model="userType" id="roleAdmin" value="admin" ng-disabled="hasEditRestrictions()">\n\t\t\t\t\t\t\t{{\'security.admin.label\' | translate}}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n <div class="card user-custom-roles" id="user-custom-roles">\n <div class="card-block">\n <h3>{{\'security.user.custom_role\' | translate}}</h3>\n <div class="input-group">\n <tags-input name="customRoleTag" class="wb-tags-input" ng-model="customRoles" min-length="1"\n ng-disabled="!isUser() || mode === \'settings\'"\n use-strings="true"\n add-on-space="true"\n add-on-comma="true"\n add-on-paste="true"\n replace-spaces-with-dashes="false"\n paste-split-pattern="[\\s+]"\n on-tag-adding="isCustomRoleValid($tag)"\n on-tag-added="addCustomRole($tag)"\n ng-keydown="checkUserInput($event)"\n ng-cut="removeErrorOnCut()"\n placeholder="{{\'security.user.add.custom_role.msg\' | translate}}"\n custom-prefix-tags-input></tags-input>\n <div class="small" ng-hide="isRoleValid">\n <small>{{\'security.user.role.too.short\' | translate}}</small>\n </div>\n <div class="small prefix-warning" ng-if="form.customRoleTag.$warning">\n <small>{{\'acl_management.rulestable.custom_prefix_warning.text\' | translate}}</small>\n </div>\n </div>\n </div>\n </div>\n\n\t\t\t\t<div id="user-repos" class="card user-repositories">\n\t\t\t\t\t<div class="card-block">\n\t\t\t\t\t\t<h3>{{\'security.repo.rights\' | translate}}</h3>\n\t\t\t\t\t\t<div class="has-danger">\n\t\t\t\t\t\t\t<p ng-show="repositoryCheckError" class="form-control-feedback">\n\t\t\t\t\t\t\t\t{{\'security.user.rights\' | translate}}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n <div class="scrollable-table">\n <table class="table table-hover table-sm" aria-describedby="User rights table">\n <thead>\n <tr>\n <th id="repositoryIdColumn">{{\'security.repository.title\' | translate}}</th>\n <th id="readRightsColumn" class="text-xs-center"><em class="icon-eye icon-lg" gdb-tooltip="{{\'security.tooltip.read\' | translate}}"></em></th>\n <th id="writeRightColumn" class="text-xs-center"><em class="icon-edit icon-lg" gdb-tooltip="{{\'security.tooltip.write\' | translate}}"></em></th>\n </tr>\n <tr>\n <th>{{\'security.any.data.repo\' | translate}}\n <em class="icon-info text-tertiary" gdb-tooltip="{{\'security.data.repos\' | translate}}"></em>\n </th>\n <th class="text-xs-center">\n <input class="read" type="checkbox" ng-model="grantedAuthorities.READ_REPO[\'*\']" ng-checked="hasReadPermission(\'*\')" ng-disabled="readCheckDisabled(\'*\')" ng-click="setGrantedAuthorities()">\n </th>\n <th class="text-xs-center">\n <input class="write" type="checkbox" ng-model="grantedAuthorities.WRITE_REPO[\'*\']" ng-checked="hasWritePermission(\'*\')" ng-disabled="writeCheckDisabled(\'*\')" ng-click="setGrantedAuthorities()">\n </th>\n </tr>\n </thead>\n <tbody>\n <div>\n <tr ng-repeat="repository in getReadableRepositories() | orderBy: [\'location\', \'id\']">\n <td class="repository-name">{{repository.id}}<small> &middot; {{repository.location ? repository.location : \'Local\'}}</small></td>\n <td class="text-xs-center read-rights"><input class="read" type="checkbox" ng-model="grantedAuthorities.READ_REPO[createUniqueKey(repository)]" ng-checked="hasReadPermission(repository)" ng-disabled="readCheckDisabled(repository)" ng-click="setGrantedAuthorities()"></td>\n <td class="text-xs-center write-rights"><input class="write" type="checkbox" ng-model="grantedAuthorities.WRITE_REPO[createUniqueKey(repository)]" ng-checked="hasWritePermission(repository)" ng-disabled="writeCheckDisabled(repository)" ng-click="setGrantedAuthorities()"></td>\n </tr>\n </div>\n </tbody>\n </table>\n </div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n </div>\n\t\t</div>\n\n\t\t<div class="text-right">\n <button id="wb-user-goBack" class="btn btn-secondary" type="button" ng-click="goBack()">{{\'common.cancel.btn\' | translate}}</button>\n <button id="wb-user-submit" class="btn btn-primary" type="submit" ng-disabled="!isRoleValid">{{saveButtonText}}</button>\n\t\t</div>\n\t</form>\n</div>\n<div class="ot-loader ot-main-loader" onto-loader size="50" ng-show="loader"></div>\n\n\n\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[391],{511:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<script type="text/ng-template" id="popover-content-user.html">\n\t<h5>{{\'security.user.may\' | translate}}</h5>\n\t<ul>\n <li>{{\'security.use.gdb\' | translate}}</li>\n\t <li>{{\'security.grant.read.access\' | translate}}</li>\n\t\t<li>{{\'security.grant.read.write.access\' | translate}}</li>\n </ul>\n<\/script>\n\n<script type="text/ng-template" id="popover-content-repo-manager.html">\n\t<h5>{{\'security.repo.manager.may\' | translate}}</h5>\n\t<ul>\n\t\t<li>{{\'security.use.gdb\' | translate}}</li>\n\t\t<li>{{\'security.read.write.all.repos\' | translate}}</li>\n\t\t<li>{{\'security.create.edit.delete.repos\' | translate}}</li>\n\t\t<li>{{\'security.access.monitoring\' | translate}}</li>\n\t</ul>\n<\/script>\n\n<script type="text/ng-template" id="popover-content-admin.html">\n\t<h5>{{\'security.admin.may\' | translate}}</h5>\n\t<ul>\n\t\t<li>{{\'security.use.gdb\' | translate}}</li>\n\t\t<li>{{\'security.read.write.all.repos\' | translate}}</li>\n\t\t<li>{{\'security.create.edit.delete.repos\' | translate}}</li>\n\t\t<li>{{\'security.access.monitoring\' | translate}}</li>\n\t\t<li>{{\'security.attach.remote.locations\' | translate}}</li>\n\t\t<li>{{\'security.manage.users.access\' | translate}}</li>\n\t\t<li>{{\'security.manage.cluster\' | translate}}</li>\n\t\t<li>{{\'security.view.sys.info\' | translate}}</li>\n\t</ul>\n<\/script>\n\n<link href="css/lib/ng-tags-input/ng-tags-input.min.css?v=2.8.8" rel="stylesheet"/>\n\n<h1>\n {{pageTitle}}\n <page-info-tooltip></page-info-tooltip>\n</h1>\n\n<div id="wb-user" ng-hide="loader">\n\t<form name="form" class="form newUserForm userForm editUserContainer" ng-submit="submit()" novalidate>\n\t\t<div class="row">\n\t\t\t<div class="col-md-6 us-left-col">\n\t\t\t\t<div class="card login-credentials" ng-hide="isOverrideAuth() || !isLocalAuthentication()">\n\t\t\t\t\t<div class="card-block">\n\t\t\t\t\t\t<h3>{{\'view.login.title\' | translate}}</h3>\n\t\t\t\t\t\t<div class="form-group" ng-class="{\'has-danger\': usernameError}">\n\t\t\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t\t\t<span class="input-group-addon" gdb-tooltip="{{\'security.table.username\' | translate}}"><em class="icon-user icon-2x text-muted"></em></span>\n\t\t\t\t\t\t\t\t<input id="wb-user-username" placeholder="{{\'security.table.username\' | translate}}" name="username" class="form-control form-control-lg" type="text" ng-model="user.username" ng-readonly="mode !== \'add\'">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div ng-show="usernameError" class="form-control-feedback">{{usernameError}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group" ng-class="{\'has-danger\': passwordError}">\n\t\t\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t\t\t<span class="input-group-addon" gdb-tooltip="{{\'security.password.placeholder\' | translate}}"><em class="icon-lock icon-2x text-muted"></em></span>\n\t\t\t\t\t\t\t\t<input id="wb-user-password" placeholder="{{passwordPlaceholder | translate}}" name="password" class="form-control form-control-lg" type="password"\tng-model="user.password" ng-hide="user.external || hasExternalAuthUser()" ng-readonly="noPassword">\n\t\t\t\t\t\t\t\t<span ng-show="user.external || hasExternalAuthUser()">{{\'security.auth.from.external.module\' | translate}}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div ng-show="passwordError" class="form-control-feedback">{{passwordError}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group" ng-class="{\'has-danger\': confirmPasswordError}" ng-hide="user.external || hasExternalAuthUser()">\n\t\t\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t\t\t<span class="input-group-addon" gdb-tooltip="{{\'security.password.confirm\' | translate}}"><em class="icon-lock icon-2x text-muted"></em></span>\n\t\t\t\t\t\t\t\t<input id="wb-user-confirmpassword" placeholder="{{\'security.password.confirm\' | translate}}" name="password_confirm" class="form-control form-control-lg" type="password" ng-model="user.confirmpassword" ng-readonly="noPassword">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div ng-show="confirmPasswordError" class="form-control-feedback">{{confirmPasswordError}}</div>\n\t\t\t\t\t\t</div>\n <div>\n <label class="d-block">\n <input type="checkbox" id="noPassword" ng-model="noPassword" ng-change="setNoPassword()">\n <span ng-show="mode === \'add\'">{{\'security.dont.set.password\' | translate}} </span>\n <span ng-show="mode !== \'add\'">{{\'security.unset.password\' | translate}} </span>\n </label>\n </div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="card sparql-editor-settings" id="user-settings">\n\t\t\t\t\t<div class="card-block">\n\t\t\t\t\t\t<h3>{{\'security.user.settings\' | translate}}</h3>\n\n\t\t\t\t\t\t<div id="sameas-on" class="mb-1">\n\t\t\t\t\t\t\t<span class="sameas-label">\n\t\t\t\t\t\t\t\t{{\'security.expand.sameAs.is\' | translate}}\n\t\t\t\t\t\t\t\t<span class="tag {{user.appSettings.DEFAULT_SAMEAS ? \'tag-primary\' : \'tag-default\'}}">\n\t\t\t\t\t\t\t\t\t{{user.appSettings.DEFAULT_SAMEAS ? \'common.on.btn\' : \'common.off.btn\' | translate}}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span gdb-tooltip="{{shouldDisableSameAs() ? \'core.require.inferred\' : \'security.tooltip.click.me\' | translate}}" tooltip-placement="top"\n\t\t\t\t\t\t\t\t ng-click="user.appSettings.DEFAULT_SAMEAS = !user.appSettings.DEFAULT_SAMEAS"\n\t\t\t\t\t\t\t\t class="switch mr-0">\n\t\t\t\t\t\t\t\t<input id="sameAsCheck" type="checkbox" class="switch"\n ng-checked="user.appSettings.DEFAULT_SAMEAS"\n ng-disabled="shouldDisableSameAs()"/>\n\t\t\t\t\t\t\t\t<label for="sameas-on"></label>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{{\'security.default.editor.graph\' | translate}}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div id="inference-on" class="mb-1">\n\t\t\t\t\t\t\t<span class="inference-label">\n\t\t\t\t\t\t\t\t{{\'security.inference.is\' | translate}}\n\t\t\t\t\t\t\t\t<span class="tag {{user.appSettings.DEFAULT_INFERENCE ? \'tag-primary\' : \'tag-default\'}}">\n\t\t\t\t\t\t\t\t\t{{user.appSettings.DEFAULT_INFERENCE ? \'common.on.btn\' : \'common.off.btn\' | translate}}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span gdb-tooltip="{{\'security.tooltip.click.me\' | translate}}" tooltip-placement="top"\n\t\t\t\t\t\t\t\t ng-click="user.appSettings.DEFAULT_INFERENCE = !user.appSettings.DEFAULT_INFERENCE"\n\t\t\t\t\t\t\t\t class="switch mr-0">\n\t\t\t\t\t\t\t\t<input type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_INFERENCE"/>\n\t\t\t\t\t\t\t\t<label for="inference-on"></label>\n\t\t\t\t\t\t\t</span>\n {{\'security.default.editor.graph\' | translate}}\n\t\t\t\t\t\t</div>\n\n <div id="schema-on" class="mb-1">\n\t\t\t\t\t\t\t<span class="schema-label">\n\t\t\t\t\t\t\t\t{{\'security.show.schema\' | translate}}\n\t\t\t\t\t\t\t\t<span class="tag {{user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA ? \'tag-primary\' : \'tag-default\'}}">\n\t\t\t\t\t\t\t\t\t{{user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA ? \'common.on.btn\' : \'common.off.btn\' | translate}}\n\t\t\t\t\t\t\t\t</span>\n <span gdb-tooltip="{{\'security.tooltip.click.me\' | translate}}" tooltip-placement="top"\n ng-click="user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA = !user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA"\n class="switch mr-0">\n\t\t\t\t\t\t\t\t<input type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA"/>\n\t\t\t\t\t\t\t\t<label for="schema-on"></label>\n\t\t\t\t\t\t\t</span>\n {{\'security.default.visual.graph\' | translate}}\n\t\t\t\t\t\t\t</span>\n </div>\n\n\t\t\t\t\t\t<label class="d-block">\n\t\t\t\t\t\t\t<input type="checkbox" ng-model="user.appSettings.EXECUTE_COUNT" id="defaultCount" checked="appSettings.EXECUTE_COUNT">\n\t\t\t\t\t\t\t{{\'security.count.total.results\' | translate}}\n\t\t\t\t\t\t</label>\n\n\t\t\t\t\t\t<label class="d-block">\n\t\t\t\t\t\t\t<input type="checkbox" ng-model="user.appSettings.IGNORE_SHARED_QUERIES" id="ignore-shared" checked="appSettings.IGNORE_SHARED_QUERIES">\n\t\t\t\t\t\t\t{{\'security.ignore.shared.queries\' | translate}}\n\t\t\t\t\t\t</label>\n\n <label class="d-block" ng-if="showCookiePolicyLink">\n <button class="btn btn-secondary show-cookie-policy-btn" ng-click="showCookiePolicy($event)">{{\'cookie.cookie_policy_url_label\' | translate}}</button>\n </label>\n\n </div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="card" id="workbench-settings" ng-if="showWorkbenchSettings">\n\t\t\t\t\t<div class="card-block">\n\t\t\t\t\t\t<h3>{{\'security.workbench.settings.title\' | translate}}\n\t\t\t\t\t\t\t<em class="icon-info text-tertiary small" gdb-tooltip="{{\'security.workbench.settings.theme.tooltip\' | translate}}"></em></h3>\n\t\t\t\t\t\t<div>\n <div class="form-group">\n <label class="col-lg-2">{{\'security.workbench.settings.theme.label\' | translate}}</label>\n <div class="btn-group theme-selector-dropdown" uib-dropdown>\n <button type="button" class="btn btn-sm btn-secondary dropdown-toggle theme-selector-dropdown-btn" uib-dropdown-toggle>\n {{selectedTheme.label}}\n </button>\n <ul class="dropdown-menu" role="menu">\n <li ng-repeat="theme in themes">\n <a ng-click="setTheme(theme)" class="dropdown-item">{{theme.label}}</a>\n </li>\n </ul>\n </div>\n </div>\n\n <div class="form-group">\n <label class="col-lg-2">{{\'security.workbench.settings.theme.mode.label\' | translate}}</label>\n <div class="radio">\n <label class="px-1">\n <input type="radio" value="light" ng-model="workbenchSettings.mode" ng-change="setThemeMode()"/>\n {{\'security.workbench.settings.theme.mode.light\' | translate}}\n </label>\n <label class="px-1">\n <input type="radio" value="dark" ng-model="workbenchSettings.mode" ng-change="setThemeMode()"/>\n {{\'security.workbench.settings.theme.mode.dark\' | translate}}\n </label>\n </div>\n </div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="col-md-6 us-right-col" ng-hide="!isLocalAuthentication()">\n\t\t\t\t<div class="card user-role" id="user-roles">\n\t\t\t\t\t<div class="card-block">\n\t\t\t\t\t\t<h3>{{\'security.user.role\' | translate}}</h3>\n\t\t\t\t\t\t<label class="mr-1"\n\t\t\t\t\t\t\t uib-popover-template="\'popover-content-user.html\'"\n\t\t\t\t\t\t\t popover-trigger="mouseenter"\n\t\t\t\t\t\t\t popover-placement="bottom">\n\t\t\t\t\t\t\t<input type="radio" ng-model="userType" id="roleUser" value="user" ng-disabled="hasEditRestrictions()" >\n\t\t\t\t\t\t\t{{\'security.user.label\' | translate}}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<label class="mr-1"\n\t\t\t\t\t\t\t uib-popover-template="\'popover-content-repo-manager.html\'"\n\t\t\t\t\t\t\t popover-trigger="mouseenter"\n\t\t\t\t\t\t\t popover-placement="bottom">\n\t\t\t\t\t\t\t<input type="radio" ng-model="userType" id="roleRepoAdmin" value="repoManager" ng-disabled="hasEditRestrictions()">\n\t\t\t\t\t\t\t{{\'security.repo.manager.label\' | translate}}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<label uib-popover-template="\'popover-content-admin.html\'"\n\t\t\t\t\t\t\t popover-trigger="mouseenter"\n\t\t\t\t\t\t\t popover-placement="bottom">\n\t\t\t\t\t\t\t<input type="radio" ng-model="userType" id="roleAdmin" value="admin" ng-disabled="hasEditRestrictions()">\n\t\t\t\t\t\t\t{{\'security.admin.label\' | translate}}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n <div class="card user-custom-roles" id="user-custom-roles">\n <div class="card-block">\n <h3>{{\'security.user.custom_role\' | translate}}</h3>\n <div class="input-group">\n <tags-input name="customRoleTag" class="wb-tags-input" ng-model="customRoles" min-length="1"\n ng-disabled="!isUser() || mode === \'settings\'"\n use-strings="true"\n add-on-space="true"\n add-on-comma="true"\n add-on-paste="true"\n replace-spaces-with-dashes="false"\n paste-split-pattern="[\\s+]"\n on-tag-adding="isCustomRoleValid($tag)"\n on-tag-added="addCustomRole($tag)"\n ng-keydown="checkUserInput($event)"\n ng-cut="removeErrorOnCut()"\n placeholder="{{\'security.user.add.custom_role.msg\' | translate}}"\n custom-prefix-tags-input></tags-input>\n <div class="small" ng-hide="isRoleValid">\n <small>{{\'security.user.role.too.short\' | translate}}</small>\n </div>\n <div class="small prefix-warning" ng-if="form.customRoleTag.$warning">\n <small>{{\'acl_management.rulestable.custom_prefix_warning.text\' | translate}}</small>\n </div>\n </div>\n </div>\n </div>\n\n\t\t\t\t<div id="user-repos" class="card user-repositories">\n\t\t\t\t\t<div class="card-block">\n\t\t\t\t\t\t<h3>{{\'security.repo.rights\' | translate}}</h3>\n\t\t\t\t\t\t<div class="has-danger">\n\t\t\t\t\t\t\t<p ng-show="repositoryCheckError" class="form-control-feedback">\n\t\t\t\t\t\t\t\t{{\'security.user.rights\' | translate}}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n <div class="scrollable-table">\n <table class="table table-hover table-sm" aria-describedby="User rights table">\n <thead>\n <tr>\n <th id="repositoryIdColumn">{{\'security.repository.title\' | translate}}</th>\n <th id="readRightsColumn" class="text-xs-center"><em class="icon-eye icon-lg" gdb-tooltip="{{\'security.tooltip.read\' | translate}}"></em></th>\n <th id="writeRightColumn" class="text-xs-center"><em class="icon-edit icon-lg" gdb-tooltip="{{\'security.tooltip.write\' | translate}}"></em></th>\n </tr>\n <tr>\n <th>{{\'security.any.data.repo\' | translate}}\n <em class="icon-info text-tertiary" gdb-tooltip="{{\'security.data.repos\' | translate}}"></em>\n </th>\n <th class="text-xs-center">\n <input class="read" type="checkbox" ng-model="grantedAuthorities.READ_REPO[\'*\']" ng-checked="hasReadPermission(\'*\')" ng-disabled="readCheckDisabled(\'*\')" ng-click="setGrantedAuthorities()">\n </th>\n <th class="text-xs-center">\n <input class="write" type="checkbox" ng-model="grantedAuthorities.WRITE_REPO[\'*\']" ng-checked="hasWritePermission(\'*\')" ng-disabled="writeCheckDisabled(\'*\')" ng-click="setGrantedAuthorities()">\n </th>\n </tr>\n </thead>\n <tbody>\n <div>\n <tr ng-repeat="repository in getReadableRepositories() | orderBy: [\'location\', \'id\']">\n <td class="repository-name">{{repository.id}}<small> &middot; {{repository.location ? repository.location : \'Local\'}}</small></td>\n <td class="text-xs-center read-rights"><input class="read" type="checkbox" ng-model="grantedAuthorities.READ_REPO[createUniqueKey(repository)]" ng-checked="hasReadPermission(repository)" ng-disabled="readCheckDisabled(repository)" ng-click="setGrantedAuthorities()"></td>\n <td class="text-xs-center write-rights"><input class="write" type="checkbox" ng-model="grantedAuthorities.WRITE_REPO[createUniqueKey(repository)]" ng-checked="hasWritePermission(repository)" ng-disabled="writeCheckDisabled(repository)" ng-click="setGrantedAuthorities()"></td>\n </tr>\n </div>\n </tbody>\n </table>\n </div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n </div>\n\t\t</div>\n\n\t\t<div class="text-right">\n <button id="wb-user-goBack" class="btn btn-secondary" type="button" ng-click="goBack()">{{\'common.cancel.btn\' | translate}}</button>\n <button id="wb-user-submit" class="btn btn-primary" type="submit" ng-disabled="!isRoleValid">{{saveButtonText}}</button>\n\t\t</div>\n\t</form>\n</div>\n<div class="ot-loader ot-main-loader" onto-loader size="50" ng-show="loader"></div>\n\n\n\n';return __p}}}]);
@@ -0,0 +1 @@
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[40,100,217,218,219,220,221],{124:function(e,r,t){"use strict";t.r(r),t.d(r,"JdbcDriverType",(function(){return o}));const o={GENERIC:"generic",MY_SQL:"mySQL",POSTGRESS:"postgreSQL",ORACLE:"oracle",MS_SQL:"msSQL",DB2:"DB2",DREMIO:"dremio",DATABRICKS:"databricks",SNOWFLAKE:"snowflake"}},186:function(e,r,t){"use strict";t.r(r),t.d(r,"OntopConnectionInformation",(function(){return 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=""}}},187:function(e,r,t){"use strict";t.r(r),t.d(r,"OntopDriverData",(function(){return n}));var o=t(124);class n{constructor(){this.classAvailable=!1,this.downloadDriverUrl="",this.driverClass="",this.driverName="",this.driverType="",this.portRequired=!1,this.urlTemplate=""}static isGenericDriver(e){return e===o.JdbcDriverType.GENERIC}static isSnowflakeDriver(e){return e===o.JdbcDriverType.SNOWFLAKE}}},188:function(e,r,t){"use strict";t.r(r),t.d(r,"OntopFileInfo",(function(){return o}));class o{constructor(e,r=!1){this.type=e,this.fileName="",this.loading=!1,this.required=r}}},189:function(e,r,t){"use strict";t.r(r),t.d(r,"OntopFileType",(function(){return o}));const o={OBDA:"obdaFile",OWL:"owlFile",CONSTRAINT:"constraintFile",LENSES:"lensesFile",DB_METADATA:"dbMetadataFile"}},190:function(e,r,t){"use strict";t.r(r),t.d(r,"OntopRepositoryError",(function(){return o}));class o extends Error{}},305:function(e,r,t){"use strict";t.r(r);var o=t(156),n=t(189),a=t(186),i=t(188),s=t(190),p=t(187),c=t(124);function l(e,r,t,l,d){return{restrict:"E",scope:!1,templateUrl:"js/angular/repositories/templates/ontop-repo.html",link:function(m){m.isGenericDriver=!0,m.defaultUrlTemplate="jdbc:database://localhost:port/database_name",m.ontopProperiesLink="https://ontop-vkg.org/guide/advanced/configuration.html",m.ontopFileType=n.OntopFileType,m.selectedDriver=new p.OntopDriverData,m.supportedDriversData=[],m.formData={connectionInformation:new a.OntopConnectionInformation,settings:{additionalProperties:"",ontopFiles:[]}},m.selectDriver=e=>{m.selectedDriver=m.supportedDriversData.find(r=>r.driverType===e),m.isGenericDriver=p.OntopDriverData.isGenericDriver(m.selectedDriver.driverType),m.editRepoPage&&m.currentOntopRepoInfo&&m.currentOntopRepoInfo.connectionInformation.driverType===e?m.formData=_.cloneDeep(m.currentOntopRepoInfo):(w(),m.formData.connectionInformation.driverType=m.selectedDriver.driverType),m.formData.connectionInformation.driverClass=m.selectedDriver.driverClass,m.updateUrl()},m.getOntopFileInfo=e=>m.formData.settings.ontopFiles.find(r=>e===r.type),m.getHostNameLabel=()=>{const e=p.OntopDriverData.isSnowflakeDriver(m.selectedDriver.driverType)?"ontop.repo.database.snowflake.host_name":"ontop.repo.database.host_name";return d.instant(e)+"*"},m.getDatabaseNameLabel=()=>{let e="";switch(m.selectedDriver.driverType){case c.JdbcDriverType.SNOWFLAKE:e="ontop.repo.database.warehouse.database_name";break;case c.JdbcDriverType.DATABRICKS:e="ontop.repo.database.http_path.database_name";break;case c.JdbcDriverType.DREMIO:e="ontop.repo.database.schema.database_name";break;default:e="ontop.repo.database.database_name"}return d.instant(e)},m.updateUrl=()=>{const e=u()||"";m.formData.connectionInformation.url=e+m.formData.connectionInformation.urlUserInput},m.isTestConnectionDisabled=()=>{const e=m.formData.connectionInformation,r=m.selectedDriver;return!(e.driverClass&&e.url&&(!r.portRequired||e.port))||!(p.OntopDriverData.isGenericDriver(r.driverType)||e.hostName&&e.databaseName)},m.testConnection=()=>{b().then(R).then(O).then(g).then(N).then(h).then(()=>r.validateOntopPropertiesConnection(m.repositoryInfo)).then(()=>t.success(d.instant("ontop.repo.successful.connection.msg"))).catch(e=>{e instanceof s.OntopRepositoryError?t.error(e.message):I(d.instant("ontop.repo.failed.to.connect"),e)})},m.editFile=t=>{const n=m.repositoryInfo.params[t.type].label,a=d.instant("update.file.edit.content.header",{fileName:n});e.open({templateUrl:"js/angular/templates/modal/editRepoFile.html",controller:"EditRepositoryFileCtrl",windowClass:"update-ontop-repo-dialog",resolve:{file:()=>{const e=m.repositoryInfo.params[t.type];return e?e.value:""},dialogTitle:()=>a,location:()=>m.repositoryInfo.location}}).result.then(e=>{r.updateRepositoryFileContent(e.fileLocation,e.content,m.repositoryInfo.location).success(e=>{t.fileName=Object(o.getFileName)(e.fileLocation),m.repositoryInfo.params[t.type].value=e.fileLocation}).error(e=>{I(d.instant("common.error"),e)})})},m.uploadOntopFile=(e,r)=>{if(e&&e.length){const o=e[0];r.loading=!0;const n={url:"rest/repositories/file/upload",data:{file:o,location:m.repositoryInfo.location}};l.upload(n).success(e=>{e.success?(r.fileName=o.name,m.repositoryInfo.params[r.type].value=e.fileLocation):t.error(e.errorMessage)}).error(e=>{I(d.instant("common.error"),e),m.uploadFile=""}).finally(()=>{r.loading=!1})}},m.updateOntopRepo=()=>{const e=m.editRepoPage?m.editRepository:m.createRepo;T().then(b).then(R).then(O).then(g).then(N).then(F).then(h).then(e).catch(e=>{e instanceof s.OntopRepositoryError?t.error(e.message):console.log(e)})},m.onKeyDownInUrlInput=e=>{const r=e.keyCode;if(37===r||39===r||36===r||35===r)return;const t=u();if(!t)return;const o=e.ctrlKey||e.metaKey;if(o&&65===r||o&&67===r)return;const n=e.target.selectionStart;8===r&&n-1<t.length&&(e.preventDefault(),e.stopPropagation()),n<t.length&&(e.preventDefault(),e.stopPropagation())},m.onKeyUpInUrlInput=()=>{f()};const f=()=>{const e=u();e&&m.formData.connectionInformation.url.startsWith(e)?m.formData.connectionInformation.urlUserInput=m.formData.connectionInformation.url.substring(e.length):m.formData.connectionInformation.urlUserInput=m.formData.connectionInformation.url},u=()=>p.OntopDriverData.isSnowflakeDriver(m.selectedDriver.driverType)?D():v(),D=()=>{let e=m.selectedDriver.urlTemplate;const r=m.formData.connectionInformation;return r.hostName&&(e=e.replace("{identifier}",r.hostName)),r.port&&(e=e.replace(".snowflakecomputing.com/?",`.snowflakecomputing.com:${r.port}/?`)),r.databaseName&&(e=e.replace("{database}",r.databaseName)),e},v=()=>{let e=m.selectedDriver.urlTemplate;const r=m.formData.connectionInformation;return r.hostName&&(e=r.port?e.replace("{hostport}",`${r.hostName}:${r.port}`):e.replace("{hostport}",""+r.hostName)),r.databaseName&&(e=e.replace("{database}",r.databaseName)),e},y=e=>{m.formData.settings.ontopFiles.forEach(r=>{r.loading=e})},h=()=>{y(!0);const e=m.formData.connectionInformation,t={hostName:e.hostName,port:e.port,databaseName:e.databaseName,userName:e.username,password:e.password,driverClass:e.driverClass,url:e.url,additionalProperties:m.formData.settings.additionalProperties};return r.updatePropertiesFile(m.repositoryInfo.params.propertiesFile.value,t,m.repositoryInfo.location,m.selectedDriver.driverType).success(e=>{m.repositoryInfo.params.propertiesFile.value=e.fileLocation}).error(e=>{I(d.instant("common.error"),e)}).finally(()=>y(!1))},I=(e,r)=>{const o=getError(r);t.error(o,e)},b=()=>p.OntopDriverData.isGenericDriver(m.selectedDriver.driverType)||m.formData.connectionInformation.hostName?Promise.resolve():Promise.reject(new s.OntopRepositoryError(d.instant("missing.required.field",{fieldName:d.instant("ontop.repo.database.host_name")}))),O=()=>p.OntopDriverData.isGenericDriver(m.selectedDriver.driverType)||m.formData.connectionInformation.databaseName?Promise.resolve():Promise.reject(new s.OntopRepositoryError(d.instant("missing.required.field",{fieldName:d.instant("ontop.repo.database.database_name")}))),g=()=>m.formData.connectionInformation.driverClass?Promise.resolve():Promise.reject(new s.OntopRepositoryError(d.instant("missing.required.field",{fieldName:d.instant("ontop.repo.database.driver_class")}))),N=()=>m.formData.connectionInformation.url?Promise.resolve():Promise.reject(new s.OntopRepositoryError(d.instant("missing.required.field",{fieldName:d.instant("ontop.repo.database.url")}))),T=()=>m.repositoryInfo.id?Promise.resolve():Promise.reject(new s.OntopRepositoryError(d.instant("empty.repoid.warning"))),F=()=>m.getOntopFileInfo(n.OntopFileType.OBDA).fileName?Promise.resolve():Promise.reject(new s.OntopRepositoryError(d.instant("ontop.repo.missing.required.file",{fileName:m.repositoryInfo.params[n.OntopFileType.OBDA].label}))),R=()=>m.selectedDriver.portRequired&&!m.formData.connectionInformation.port?Promise.reject(new s.OntopRepositoryError(d.instant("missing.required.field",{fieldName:d.instant("ontop.repo.database.port")}))):Promise.resolve(),w=()=>{m.formData={connectionInformation:new a.OntopConnectionInformation,settings:{additionalProperties:"",ontopFiles:[]}},Object.values(n.OntopFileType).forEach(e=>{const r=new i.OntopFileInfo(e);m.formData.settings.ontopFiles.push(r)}),m.getOntopFileInfo(n.OntopFileType.OBDA).required=!0};r.getSupportedDriversData(m.repositoryInfo).success(e=>{m.supportedDriversData=e}).error(e=>{I(d.instant("common.error"),e)}).then(()=>{m.editRepoPage?(y(!0),r.loadPropertiesFile(m.repositoryInfo.params.propertiesFile.value,m.repositoryInfo.location,m.selectedDriver.driverType).success(e=>{let r=m.supportedDriversData.find(r=>r.driverClass===e.driverClass);r&&e.hostName||(r=m.supportedDriversData.find(e=>p.OntopDriverData.isGenericDriver(e.driverType))),m.selectDriver(r.driverType),m.formData.connectionInformation.driverType=r.driverType,m.formData.connectionInformation.driverClass=e.driverClass,m.formData.connectionInformation.password=e.password,m.formData.connectionInformation.username=e.userName,m.formData.connectionInformation.url=e.url,m.formData.settings.additionalProperties=e.additionalProperties,p.OntopDriverData.isGenericDriver(r.driverType)||(m.formData.connectionInformation.hostName=e.hostName,m.formData.connectionInformation.databaseName=e.databaseName,m.formData.connectionInformation.port=e.port?parseInt(e.port,10):void 0),f(),m.updateUrl(),Object.values(n.OntopFileType).forEach(e=>{const r=m.repositoryInfo.params[e],t=m.getOntopFileInfo(e);r&&(t.fileName=Object(o.getFileName)(r.value))}),m.currentOntopRepoInfo=_.cloneDeep(m.formData)}).error(e=>{I(d.instant("common.error"),e)}).finally(()=>{y(!1)})):m.selectDriver(c.JdbcDriverType.GENERIC)})}}}angular.module("graphdb.framework.repositories.ontop-repo.directive",[]).directive("ontopRepo",l),l.$inject=["$uibModal","RepositoriesRestService","toastr","Upload","$translate"]}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[403],{525:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/ttyg/agent-list.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<div class="agent-list-component">\n <div class="agents-filter-dropdown btn-group" uib-dropdown>\n <button type="button" uib-dropdown-toggle class="btn btn-outline-primary dropdown-toggle">\n <i class="fa-kit fa-gdb-repo-graphdb mr-1"></i>\n <span class="selected-filter">{{selectedAgentsFilter.label}}</span>\n <i class="fa fa-filter" gdb-tooltip="{{\'ttyg.agent.btn.filter.tooltip\' | translate}}"></i>\n </button>\n <ul class="dropdown-menu" role="menu">\n <li ng-repeat="filterModel in agentListFilterModel">\n <button type="button" class="dropdown-item" ng-click="onAgentsFilterChange(filterModel)"\n data-value="{{filterModel.label}}">\n {{filterModel.label}}\n </button>\n </li>\n </ul>\n </div>\n\n <div class="agent-list">\n <div ng-if="!agentList.agents.length" class="alert alert-warning">\n {{\'ttyg.agent.messages.no_agents\' | translate}}\n </div>\n\n <div ng-repeat="agent in agentList.filterableAgents">\n <div ng-if="!deletingAgent || deletingAgent.agentId !== agent.id" class="agent-item"\n ng-class="{\'selected\': agent.id === selectedAgent.id}">\n <div class="agent-info">\n <div class="agent-name">{{agent.name}}</div>\n <div class="related-repository">\n <i ng-if="!agent.isRepositoryDeleted" class="fa-kit fa-gdb-repo-graphdb"></i>\n <i ng-if="agent.isRepositoryDeleted"\n class="fa fa-triangle-exclamation text-warning agent-with-deleted-repository"\n gdb-tooltip="{{\'ttyg.agent.deleted_repository\' | translate}}">\n </i>\n {{agent.repositoryId}}\n </div>\n </div>\n <div class="btn-group">\n <button class="btn btn-link secondary btn-sm open-agent-actions-btn"\n data-toggle="dropdown" aria-expanded="false"\n ng-if="true"\n ng-click="openAgentActionMenu()"\n ng-disabled="false">\n <i class="fa fa-ellipsis"></i>\n </button>\n <div class="dropdown-menu dropdown-menu-right agent-actions-menu">\n <button class="dropdown-item edit-agent-btn" type="button" ng-click="onEditAgent(agent)">\n <i class="fa fa-gear"></i>\n <span>{{\'ttyg.agent.btn.edit_agent.label\' | translate}}</span>\n </button>\n <button class="dropdown-item clone-agent-btn" type="button" ng-click="onCloneAgent(agent)">\n <i class="fa fa-clone"></i>\n <span>{{\'ttyg.agent.btn.clone_agent.label\' | translate}}</span>\n </button>\n <div class="dropdown-divider"></div>\n <button class="dropdown-item delete-agent-btn" type="button" ng-click="onDeleteAgent(agent)">\n <i class="fa fa-trash-can"></i>\n <span>{{\'ttyg.agent.btn.delete_agent.label\' | translate}}</span>\n </button>\n </div>\n </div>\n </div>\n\n <div class="deleting-agent-loader" ng-if="deletingAgent.agentId === agent.id && deletingAgent.inProgress"\n onto-loader-fancy message="{{\'ttyg.agent.deleting_agent\' | translate}}"\n size="25"></div>\n </div>\n </div>\n</div>\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[403],{525:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/ttyg/agent-list.css?v=2.8.8" rel="stylesheet"/>\n\n<div class="agent-list-component">\n <div class="agents-filter-dropdown btn-group" uib-dropdown>\n <button type="button" uib-dropdown-toggle class="btn btn-outline-primary dropdown-toggle">\n <i class="fa-kit fa-gdb-repo-graphdb mr-1"></i>\n <span class="selected-filter">{{selectedAgentsFilter.label}}</span>\n <i class="fa fa-filter" gdb-tooltip="{{\'ttyg.agent.btn.filter.tooltip\' | translate}}"></i>\n </button>\n <ul class="dropdown-menu" role="menu">\n <li ng-repeat="filterModel in agentListFilterModel">\n <button type="button" class="dropdown-item" ng-click="onAgentsFilterChange(filterModel)"\n data-value="{{filterModel.label}}">\n {{filterModel.label}}\n </button>\n </li>\n </ul>\n </div>\n\n <div class="agent-list">\n <div ng-if="!agentList.agents.length" class="alert alert-warning">\n {{\'ttyg.agent.messages.no_agents\' | translate}}\n </div>\n\n <div ng-repeat="agent in agentList.filterableAgents">\n <div ng-if="!deletingAgent || deletingAgent.agentId !== agent.id" class="agent-item"\n ng-class="{\'selected\': agent.id === selectedAgent.id}">\n <div class="agent-info">\n <div class="agent-name">{{agent.name}}</div>\n <div class="related-repository">\n <i ng-if="!agent.isRepositoryDeleted" class="fa-kit fa-gdb-repo-graphdb"></i>\n <i ng-if="agent.isRepositoryDeleted"\n class="fa fa-triangle-exclamation text-warning agent-with-deleted-repository"\n gdb-tooltip="{{\'ttyg.agent.deleted_repository\' | translate}}">\n </i>\n {{agent.repositoryId}}\n </div>\n </div>\n <div class="btn-group">\n <button class="btn btn-link secondary btn-sm open-agent-actions-btn"\n data-toggle="dropdown" aria-expanded="false"\n ng-if="true"\n ng-click="openAgentActionMenu()"\n ng-disabled="false">\n <i class="fa fa-ellipsis"></i>\n </button>\n <div class="dropdown-menu dropdown-menu-right agent-actions-menu">\n <button class="dropdown-item edit-agent-btn" type="button" ng-click="onEditAgent(agent)">\n <i class="fa fa-gear"></i>\n <span>{{\'ttyg.agent.btn.edit_agent.label\' | translate}}</span>\n </button>\n <button class="dropdown-item clone-agent-btn" type="button" ng-click="onCloneAgent(agent)">\n <i class="fa fa-clone"></i>\n <span>{{\'ttyg.agent.btn.clone_agent.label\' | translate}}</span>\n </button>\n <div class="dropdown-divider"></div>\n <button class="dropdown-item delete-agent-btn" type="button" ng-click="onDeleteAgent(agent)">\n <i class="fa fa-trash-can"></i>\n <span>{{\'ttyg.agent.btn.delete_agent.label\' | translate}}</span>\n </button>\n </div>\n </div>\n </div>\n\n <div class="deleting-agent-loader" ng-if="deletingAgent.agentId === agent.id && deletingAgent.inProgress"\n onto-loader-fancy message="{{\'ttyg.agent.deleting_agent\' | translate}}"\n size="25"></div>\n </div>\n </div>\n</div>\n';return __p}}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[404],{526:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/ttyg/agent-select-menu.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<div class="btn-group agent-select-menu" uib-dropdown>\n <button type="button" class="btn dropdown-toggle-btn" uib-dropdown-toggle\n ng-attr-title="{{selectedAgent && !selectedAgent.isDeleted ? (selectedAgent.name + \' &middot; \' + selectedAgent.repositoryId) : null}}">\n <span ng-if="!selectedAgent">{{\'ttyg.agent.agent_select_menu.no_selection_label\' | translate}}</span>\n <div ng-if="selectedAgent && !selectedAgent.isDeleted" class="selected-agent-option">\n <span class="agent-name">{{selectedAgent.name}}</span> &middot;\n <i ng-if="!selectedAgent.isRepositoryDeleted" class="fa-kit fa-gdb-repo-graphdb"></i>\n <i ng-if="selectedAgent.isRepositoryDeleted"\n class="fa fa-triangle-exclamation text-warning agent-with-deleted-repository"\n gdb-tooltip="{{\'ttyg.agent.deleted_repository\' | translate}}">\n </i>\n <span class="repository-id">{{selectedAgent.repositoryId}}</span>\n </div>\n <span ng-if="selectedAgent && selectedAgent.isDeleted" class="text-warning">\n <i class="fa fa-triangle-exclamation"></i>\n {{\'ttyg.agent.agent_select_menu.deleted_agent\' | translate}}\n </span>\n <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="single-button">\n <li ng-repeat="agentOption in agentOptionsList" role="menuitem" class="agent-menu-item"\n ng-class="{\'selected\': agentOption.selected}"\n ng-attr-title="{{agentOption.label}} &middot; {{agentOption.data.agent.repositoryId}}">\n <a href="#"\n class="agent-option"\n ng-click="onAgentSelected(agentOption.data.agent)">\n <span class="agent-name">{{agentOption.label}}</span> &middot;\n <i ng-if="!agentOption.data.agent.isRepositoryDeleted" class="fa-kit fa-gdb-repo-graphdb"></i>\n <i ng-if="agentOption.data.agent.isRepositoryDeleted"\n class="fa fa-triangle-exclamation text-warning agent-with-deleted-repository"\n gdb-tooltip="{{\'ttyg.agent.deleted_repository\' | translate}}">\n </i>\n <span class="repository-id">{{agentOption.data.agent.repositoryId}}</span>\n </a>\n </li>\n </ul>\n</div>\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[404],{526:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/ttyg/agent-select-menu.css?v=2.8.8" rel="stylesheet"/>\n\n<div class="btn-group agent-select-menu" uib-dropdown>\n <button type="button" class="btn dropdown-toggle-btn" uib-dropdown-toggle\n ng-attr-title="{{selectedAgent && !selectedAgent.isDeleted ? (selectedAgent.name + \' &middot; \' + selectedAgent.repositoryId) : null}}">\n <span ng-if="!selectedAgent">{{\'ttyg.agent.agent_select_menu.no_selection_label\' | translate}}</span>\n <div ng-if="selectedAgent && !selectedAgent.isDeleted" class="selected-agent-option">\n <span class="agent-name">{{selectedAgent.name}}</span> &middot;\n <i ng-if="!selectedAgent.isRepositoryDeleted" class="fa-kit fa-gdb-repo-graphdb"></i>\n <i ng-if="selectedAgent.isRepositoryDeleted"\n class="fa fa-triangle-exclamation text-warning agent-with-deleted-repository"\n gdb-tooltip="{{\'ttyg.agent.deleted_repository\' | translate}}">\n </i>\n <span class="repository-id">{{selectedAgent.repositoryId}}</span>\n </div>\n <span ng-if="selectedAgent && selectedAgent.isDeleted" class="text-warning">\n <i class="fa fa-triangle-exclamation"></i>\n {{\'ttyg.agent.agent_select_menu.deleted_agent\' | translate}}\n </span>\n <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="single-button">\n <li ng-repeat="agentOption in agentOptionsList" role="menuitem" class="agent-menu-item"\n ng-class="{\'selected\': agentOption.selected}"\n ng-attr-title="{{agentOption.label}} &middot; {{agentOption.data.agent.repositoryId}}">\n <a href="#"\n class="agent-option"\n ng-click="onAgentSelected(agentOption.data.agent)">\n <span class="agent-name">{{agentOption.label}}</span> &middot;\n <i ng-if="!agentOption.data.agent.isRepositoryDeleted" class="fa-kit fa-gdb-repo-graphdb"></i>\n <i ng-if="agentOption.data.agent.isRepositoryDeleted"\n class="fa fa-triangle-exclamation text-warning agent-with-deleted-repository"\n gdb-tooltip="{{\'ttyg.agent.deleted_repository\' | translate}}">\n </i>\n <span class="repository-id">{{agentOption.data.agent.repositoryId}}</span>\n </a>\n </li>\n </ul>\n</div>\n';return __p}}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[405],{527:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/ttyg/chat-item-details.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<div class="chat-detail">\n <div class="user-message" ng-if="chatItemDetail.question">\n <div class="question alert-help"\n gdb-tooltip="{{ \'ttyg.chat_panel.labels.question_asked\' | translate : { date: getHumanReadableQuestionTimestamp(chatItemDetail.question.timestamp), time: (chatItemDetail.question.timestamp | date:\'HH:mm\') } }}">\n {{ chatItemDetail.question.message }}\n </div>\n </div>\n <div class="answers" ng-repeat="answer in chatItemDetail.answers">\n <div class="assistant">\n <div class="assistant-icon alert-help"\n gdb-tooltip="{{\'ttyg.chat_panel.labels.agent_name\' | translate : { agentName: agentNameByIdMap[chatItemDetail.agentId], date: getHumanReadableQuestionTimestamp(chatItemDetail.question.timestamp), time: (chatItemDetail.question.timestamp | date:\'HH:mm\') } }}">\n <i class="fa fa-lg fa-message-bot"></i>\n </div>\n <div class="assistant-message">\n <markdown-content class="answer" content="{{answer.message}}" options="markdownContentOptions"></markdown-content>\n <div class="actions" ng-class="{\'hidden-actions\': !explainResponseModel[answer.id].expanded && (!showActions || !$last)}">\n <button class="btn btn-link btn-sm regenerate-question-btn"\n ng-click="regenerateQuestion()"\n ng-disabled="disabled"\n gdb-tooltip="{{\'ttyg.chat_panel.btn.regenerate.tooltip\' | translate}}">\n <i class="fa fa-arrows-rotate"></i>\n </button>\n <copy-to-clipboard tooltip-text="ttyg.chat_panel.btn.copy_answer.tooltip"\n text-to-copy="{{answer.message}}"></copy-to-clipboard>\n <button class="btn btn-link btn-link-only-icons btn-sm explain-response-btn"\n ng-click="explainResponse(answer.id)"\n ng-disabled="disabled && !explainResponseModel[answer.id]"\n gdb-tooltip="{{\'ttyg.chat_panel.btn.explain_response.tooltip\' | translate}}">\n <i class="fa fa-wand-magic-sparkles"></i>\n <i class="fa fa-chevron-up toggle-explain-response-icon"\n ng-class="{expanded: explainResponseModel[answer.id] && explainResponseModel[answer.id].expanded}"></i>\n </button>\n </div>\n <div class="derived-answer-hint"\n ng-if="showActions && $last && explainResponseModel[answer.id].expanded">\n <div ng-bind-html="\'ttyg.chat_panel.btn.derive_answer.hint\' | translate | trustAsHtml"></div>\n <button class="btn btn-secondary deliver-answer-btn" ng-click="onAskHowAnswerWasDerived()">\n {{ \'ttyg.chat_panel.btn.derive_answer.label\' | translate }}\n </button>\n </div>\n <div ng-if="loadingExplainResponse[answer.id]" onto-loader-new size="40"></div>\n <div class="explain-responses" ng-if="explainResponseModel[answer.id] && explainResponseModel[answer.id].expanded">\n <div ng-if="!explainResponseModel[answer.id].queryMethods.items.length"\n class="explain-response">\n {{ \'ttyg.chat_panel.labels.explain_no_methods\' | translate }}\n </div>\n <div ng-if="explainResponseModel[answer.id].queryMethods.items"\n class="explain-response"\n ng-repeat="queryMethod in explainResponseModel[answer.id].queryMethods.items">\n <div class="explain-call">\n <div class="header" gdb-tooltip="">\n <div class="label">\n <span class="query-method" ng-bind-html="\'ttyg.chat_panel.labels.called\' | translate:{name: queryMethod.name} | trustAsHtml">\n </span>{{ \'ttyg.chat_panel.query_colon\' | translate }}\n <span class="query-method-details" ng-bind="(\'ttyg.chat_panel.query_desc.\' + queryMethod.name) | translate">\n </span>\n </div>\n <div ng-if="queryMethod.query" class="actions">\n <open-in-sparql-editor\n ng-if="queryMethod.queryType === ExplainQueryType.SPARQL"\n execute-query="{{!queryMethod.errorMessage}}"\n repository-id="{{repositoryId}}"\n query="{{queryMethod.query}}">\n </open-in-sparql-editor>\n <copy-to-clipboard tooltip-text="ttyg.chat_panel.btn.copy_{{ queryMethod.queryType }}.tooltip"\n text-to-copy="{{queryMethod.query}}"></copy-to-clipboard>\n </div>\n </div>\n <div class="query">\n <div ng-if="!queryMethod.query" class="mb-1">{{ \'ttyg.chat_panel.labels.no_query\' | translate }}</code></div>\n <pre ng-if="queryMethod.query"><code>{{queryMethod.query}}</code></pre>\n </div>\n <div ng-if="showRawQuery(queryMethod)" class="raw-query">\n <span class="label">{{\'ttyg.chat_panel.labels.raw_query\' | translate}}:</span>\n <span class="content">{{queryMethod.rawQuery}}</span>\n <copy-to-clipboard class="copy-to-clipboard-btn" tooltip-text="ttyg.chat_panel.btn.copy_raw_query.tooltip"\n text-to-copy="{{queryMethod.rawQuery}}"></copy-to-clipboard>\n </div>\n <div ng-if="queryMethod.errorMessage" class="alert no-icon alert-warning error-message">\n <div class="error-header">\n <div class="label">{{\'ttyg.chat_panel.labels.error_message\' | translate}}:</div>\n <copy-to-clipboard class="copy-to-clipboard-btn" tooltip-text="ttyg.chat_panel.btn.copy_error_message.tooltip"\n text-to-copy="{{queryMethod.errorMessage}}"></copy-to-clipboard>\n </div>\n <div class="error-content">{{queryMethod.errorMessage}}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div ng-if="asking" onto-loader-new size="40"></div>\n</div>\n\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[405],{527:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/ttyg/chat-item-details.css?v=2.8.8" rel="stylesheet"/>\n\n<div class="chat-detail">\n <div class="user-message" ng-if="chatItemDetail.question">\n <div class="question alert-help"\n gdb-tooltip="{{ \'ttyg.chat_panel.labels.question_asked\' | translate : { date: getHumanReadableQuestionTimestamp(chatItemDetail.question.timestamp), time: (chatItemDetail.question.timestamp | date:\'HH:mm\') } }}">\n {{ chatItemDetail.question.message }}\n </div>\n </div>\n <div class="answers" ng-repeat="answer in chatItemDetail.answers">\n <div class="assistant">\n <div class="assistant-icon alert-help"\n gdb-tooltip="{{\'ttyg.chat_panel.labels.agent_name\' | translate : { agentName: agentNameByIdMap[chatItemDetail.agentId], date: getHumanReadableQuestionTimestamp(chatItemDetail.question.timestamp), time: (chatItemDetail.question.timestamp | date:\'HH:mm\') } }}">\n <i class="fa fa-lg fa-message-bot"></i>\n </div>\n <div class="assistant-message">\n <markdown-content class="answer" content="{{answer.message}}" options="markdownContentOptions"></markdown-content>\n <div class="actions" ng-class="{\'hidden-actions\': !explainResponseModel[answer.id].expanded && (!showActions || !$last)}">\n <button class="btn btn-link btn-sm regenerate-question-btn"\n ng-click="regenerateQuestion()"\n ng-disabled="disabled"\n gdb-tooltip="{{\'ttyg.chat_panel.btn.regenerate.tooltip\' | translate}}">\n <i class="fa fa-arrows-rotate"></i>\n </button>\n <copy-to-clipboard tooltip-text="ttyg.chat_panel.btn.copy_answer.tooltip"\n text-to-copy="{{answer.message}}"></copy-to-clipboard>\n <button class="btn btn-link btn-link-only-icons btn-sm explain-response-btn"\n ng-click="explainResponse(answer.id)"\n ng-disabled="disabled && !explainResponseModel[answer.id]"\n gdb-tooltip="{{\'ttyg.chat_panel.btn.explain_response.tooltip\' | translate}}">\n <i class="fa fa-wand-magic-sparkles"></i>\n <i class="fa fa-chevron-up toggle-explain-response-icon"\n ng-class="{expanded: explainResponseModel[answer.id] && explainResponseModel[answer.id].expanded}"></i>\n </button>\n </div>\n <div class="derived-answer-hint"\n ng-if="showActions && $last && explainResponseModel[answer.id].expanded">\n <div ng-bind-html="\'ttyg.chat_panel.btn.derive_answer.hint\' | translate | trustAsHtml"></div>\n <button class="btn btn-secondary deliver-answer-btn" ng-click="onAskHowAnswerWasDerived()">\n {{ \'ttyg.chat_panel.btn.derive_answer.label\' | translate }}\n </button>\n </div>\n <div ng-if="loadingExplainResponse[answer.id]" onto-loader-new size="40"></div>\n <div class="explain-responses" ng-if="explainResponseModel[answer.id] && explainResponseModel[answer.id].expanded">\n <div ng-if="!explainResponseModel[answer.id].queryMethods.items.length"\n class="explain-response">\n {{ \'ttyg.chat_panel.labels.explain_no_methods\' | translate }}\n </div>\n <div ng-if="explainResponseModel[answer.id].queryMethods.items"\n class="explain-response"\n ng-repeat="queryMethod in explainResponseModel[answer.id].queryMethods.items">\n <div class="explain-call">\n <div class="header" gdb-tooltip="">\n <div class="label">\n <span class="query-method" ng-bind-html="\'ttyg.chat_panel.labels.called\' | translate:{name: queryMethod.name} | trustAsHtml">\n </span>{{ \'ttyg.chat_panel.query_colon\' | translate }}\n <span class="query-method-details" ng-bind="(\'ttyg.chat_panel.query_desc.\' + queryMethod.name) | translate">\n </span>\n </div>\n <div ng-if="queryMethod.query" class="actions">\n <open-in-sparql-editor\n ng-if="queryMethod.queryType === ExplainQueryType.SPARQL"\n execute-query="{{!queryMethod.errorMessage}}"\n repository-id="{{repositoryId}}"\n query="{{queryMethod.query}}">\n </open-in-sparql-editor>\n <copy-to-clipboard tooltip-text="ttyg.chat_panel.btn.copy_{{ queryMethod.queryType }}.tooltip"\n text-to-copy="{{queryMethod.query}}"></copy-to-clipboard>\n </div>\n </div>\n <div class="query">\n <div ng-if="!queryMethod.query" class="mb-1">{{ \'ttyg.chat_panel.labels.no_query\' | translate }}</code></div>\n <pre ng-if="queryMethod.query"><code>{{queryMethod.query}}</code></pre>\n </div>\n <div ng-if="showRawQuery(queryMethod)" class="raw-query">\n <span class="label">{{\'ttyg.chat_panel.labels.raw_query\' | translate}}:</span>\n <span class="content">{{queryMethod.rawQuery}}</span>\n <copy-to-clipboard class="copy-to-clipboard-btn" tooltip-text="ttyg.chat_panel.btn.copy_raw_query.tooltip"\n text-to-copy="{{queryMethod.rawQuery}}"></copy-to-clipboard>\n </div>\n <div ng-if="queryMethod.errorMessage" class="alert no-icon alert-warning error-message">\n <div class="error-header">\n <div class="label">{{\'ttyg.chat_panel.labels.error_message\' | translate}}:</div>\n <copy-to-clipboard class="copy-to-clipboard-btn" tooltip-text="ttyg.chat_panel.btn.copy_error_message.tooltip"\n text-to-copy="{{queryMethod.errorMessage}}"></copy-to-clipboard>\n </div>\n <div class="error-content">{{queryMethod.errorMessage}}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div ng-if="asking" onto-loader-new size="40"></div>\n</div>\n\n';return __p}}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[406],{528:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/ttyg/chat-list.css?v=2.8.8-TR1" rel="stylesheet"/>\n\n<div class="chat-list-component">\n <div class="chat-list">\n <div ng-repeat="chatGroup in chatList.chatsByDay" class="chat-group">\n <label>{{ getHumanReadableChatGroupTimestamp(chatGroup.timestamp) }}</label>\n <ul>\n <li ng-repeat="chat in chatGroup.chats track by chat.hash" class="chat-item"\n ng-class="{\'selected\': chat.id === selectedChat.id, \'edited\': renamedChat && chat.id === renamedChat.id}">\n <div ng-if="!deletingChat || deletingChat.chatId !== chat.id" class="chat-detail">\n <div class="chat-name">\n <inline-editable-text\n field-name="name"\n source="chat"\n is-editing="chat.id && renamedChat && chat.id === renamedChat.id"\n on-save="onRenameChat(newText, source)"\n on-cancel="onCancelChatRenaming()"\n on-dblclick="onSelectChatForRenaming(chat)"\n on-click="onSelectChat(source)"\n title="{{chat.name}}"\n show-tooltip-on-overflow>\n </inline-editable-text>\n </div>\n <div ng-if="chat.id && (!renamedChat || chat.id !== renamedChat.id)" class="btn-group">\n <button class="btn btn-link secondary btn-sm open-chat-actions-btn"\n data-toggle="dropdown" aria-expanded="false"\n ng-if="true"\n ng-click="openChatActionMenu()"\n ng-disabled="false">\n <i class="fa fa-ellipsis"></i>\n </button>\n <div class="dropdown-menu dropdown-menu-right chat-actions-menu">\n <button class="dropdown-item export-chat-btn" type="button" ng-click="onExportChat(chat)">\n <i class="fa fa-arrow-down-to-line"></i>\n <span>{{\'ttyg.chat.btn.export_chat.label\' | translate}}</span>\n </button>\n <button class="dropdown-item rename-chat-btn" type="button" ng-click="onSelectChatForRenaming(chat)">\n <i class="fa fa-pen"></i>\n <span>{{\'ttyg.chat.btn.rename_chat.label\' | translate}}</span>\n </button>\n <div class="dropdown-divider"></div>\n <button class="dropdown-item delete-chat-btn" type="button" ng-click="onDeleteChat(chat)">\n <i class="fa fa-trash-can"></i>\n <span>{{\'ttyg.chat.btn.delete_chat.label\' | translate}}</span>\n </button>\n </div>\n </div>\n </div>\n\n <div class="deleting-chat-loader" ng-if="deletingChat && deletingChat.chatId === chat.id && deletingChat.inProgress"\n onto-loader-fancy message="{{\'ttyg.chat.deleting_chat\' | translate}}"\n size="25"></div>\n </li>\n </ul>\n </div>\n </div>\n</div>\n';return __p}}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[406],{528:function(module,exports){module.exports=function(obj){obj||(obj={});var __t,__p="";with(obj)__p+='<link href="css/ttyg/chat-list.css?v=2.8.8" rel="stylesheet"/>\n\n<div class="chat-list-component">\n <div class="chat-list">\n <div ng-repeat="chatGroup in chatList.chatsByDay" class="chat-group">\n <label>{{ getHumanReadableChatGroupTimestamp(chatGroup.timestamp) }}</label>\n <ul>\n <li ng-repeat="chat in chatGroup.chats track by chat.hash" class="chat-item"\n ng-class="{\'selected\': chat.id === selectedChat.id, \'edited\': renamedChat && chat.id === renamedChat.id}">\n <div ng-if="!deletingChat || deletingChat.chatId !== chat.id" class="chat-detail">\n <div class="chat-name">\n <inline-editable-text\n field-name="name"\n source="chat"\n is-editing="chat.id && renamedChat && chat.id === renamedChat.id"\n on-save="onRenameChat(newText, source)"\n on-cancel="onCancelChatRenaming()"\n on-dblclick="onSelectChatForRenaming(chat)"\n on-click="onSelectChat(source)"\n title="{{chat.name}}"\n show-tooltip-on-overflow>\n </inline-editable-text>\n </div>\n <div ng-if="chat.id && (!renamedChat || chat.id !== renamedChat.id)" class="btn-group">\n <button class="btn btn-link secondary btn-sm open-chat-actions-btn"\n data-toggle="dropdown" aria-expanded="false"\n ng-if="true"\n ng-click="openChatActionMenu()"\n ng-disabled="false">\n <i class="fa fa-ellipsis"></i>\n </button>\n <div class="dropdown-menu dropdown-menu-right chat-actions-menu">\n <button class="dropdown-item export-chat-btn" type="button" ng-click="onExportChat(chat)">\n <i class="fa fa-arrow-down-to-line"></i>\n <span>{{\'ttyg.chat.btn.export_chat.label\' | translate}}</span>\n </button>\n <button class="dropdown-item rename-chat-btn" type="button" ng-click="onSelectChatForRenaming(chat)">\n <i class="fa fa-pen"></i>\n <span>{{\'ttyg.chat.btn.rename_chat.label\' | translate}}</span>\n </button>\n <div class="dropdown-divider"></div>\n <button class="dropdown-item delete-chat-btn" type="button" ng-click="onDeleteChat(chat)">\n <i class="fa fa-trash-can"></i>\n <span>{{\'ttyg.chat.btn.delete_chat.label\' | translate}}</span>\n </button>\n </div>\n </div>\n </div>\n\n <div class="deleting-chat-loader" ng-if="deletingChat && deletingChat.chatId === chat.id && deletingChat.inProgress"\n onto-loader-fancy message="{{\'ttyg.chat.deleting_chat\' | translate}}"\n size="25"></div>\n </li>\n </ul>\n </div>\n </div>\n</div>\n';return __p}}}]);