graphdb-workbench 3.5.1-TR2 → 3.5.1-TR3

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 (96) hide show
  1. package/dist/{31415.c1d93b653699cefd4e14.bundle.js → 31415.aba4cdda066690a2769d.bundle.js} +2 -2
  2. package/dist/{31415.c1d93b653699cefd4e14.bundle.js.map → 31415.aba4cdda066690a2769d.bundle.js.map} +1 -1
  3. package/dist/3395.ded80bae10361d1d4573.bundle.js +2 -0
  4. package/dist/3395.ded80bae10361d1d4573.bundle.js.map +1 -0
  5. package/dist/{64709.ee1c17ee7de2cbf4e64f.bundle.js → 64709.d6d3d413c90077b5d0cc.bundle.js} +2 -2
  6. package/dist/{64709.ee1c17ee7de2cbf4e64f.bundle.js.map → 64709.d6d3d413c90077b5d0cc.bundle.js.map} +1 -1
  7. package/dist/{65677.2dc4cc317664386a2f5a.bundle.js → 65677.0e8ab27737300e991c60.bundle.js} +2 -2
  8. package/dist/{65677.2dc4cc317664386a2f5a.bundle.js.map → 65677.0e8ab27737300e991c60.bundle.js.map} +1 -1
  9. package/dist/{80933.1020a14ed44c3f0e9faf.bundle.js → 80933.bd439bb6f5fad66637ac.bundle.js} +2 -2
  10. package/dist/{80933.1020a14ed44c3f0e9faf.bundle.js.map → 80933.bd439bb6f5fad66637ac.bundle.js.map} +1 -1
  11. package/dist/{82917.9eb3a3582e35b429090a.bundle.js → 82917.c97f7cec0372ff2f6fdd.bundle.js} +2 -2
  12. package/dist/{82917.9eb3a3582e35b429090a.bundle.js.map → 82917.c97f7cec0372ff2f6fdd.bundle.js.map} +1 -1
  13. package/dist/{85698.3342d281dbe7fe2f3dcb.bundle.js → 85698.ee9962969a310107ccf8.bundle.js} +2 -2
  14. package/dist/{85698.3342d281dbe7fe2f3dcb.bundle.js.map → 85698.ee9962969a310107ccf8.bundle.js.map} +1 -1
  15. package/dist/{86099.70a92c30b2940c5b5b72.bundle.js → 86099.ab3779d6538a6648b2b7.bundle.js} +2 -2
  16. package/dist/{86099.70a92c30b2940c5b5b72.bundle.js.map → 86099.ab3779d6538a6648b2b7.bundle.js.map} +1 -1
  17. package/dist/assets/i18n/language-config.json +1 -1
  18. package/dist/css/cluster-configuration/multi-region.css +1 -1
  19. package/dist/css/user.css +1 -1
  20. package/dist/i18n/locale-en.json +2 -0
  21. package/dist/i18n/locale-fr.json +2 -0
  22. package/dist/index.html +8 -8
  23. package/dist/js/angular/clustermanagement/templates/cluster-configuration/cluster-configuration.html +1 -1
  24. package/dist/js/angular/clustermanagement/templates/cluster-configuration/multi-region.html +6 -2
  25. package/dist/js/angular/clustermanagement/templates/cluster-nodes-configuration.html +1 -1
  26. package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +1 -1
  27. package/dist/js/angular/core/directives/dynamic-form/templates/dynamic-form.html +1 -1
  28. package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +1 -1
  29. package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
  30. package/dist/js/angular/core/directives/shuttle-multiselect/templates/shuttle-multiselect.html +1 -1
  31. package/dist/js/angular/core/directives/yasgui-component/templates/yasgui-component.html +2 -2
  32. package/dist/js/angular/core/templates/cookie-policy/cookie-consent.html +1 -1
  33. package/dist/js/angular/core/templates/cookie-policy/cookie-policy.html +1 -1
  34. package/dist/js/angular/core/templates/editable-content/editable-content.html +1 -1
  35. package/dist/js/angular/core/templates/markdown-content/markdown-content.html +1 -1
  36. package/dist/js/angular/core/templates/search-resource-input.html +1 -1
  37. package/dist/js/angular/graphql/templates/create-graphql-endpoint.html +2 -2
  38. package/dist/js/angular/graphql/templates/graphql-endpoint-management.html +1 -1
  39. package/dist/js/angular/graphql/templates/graphql-playground.html +2 -2
  40. package/dist/js/angular/graphql/templates/modal/endpoint-configuration-modal.html +1 -1
  41. package/dist/js/angular/graphql/templates/modal/endpoint-generation-failure-result-modal.html +1 -1
  42. package/dist/js/angular/graphql/templates/modal/import-endpoint-definition-modal.html +1 -1
  43. package/dist/js/angular/security/templates/user.html +8 -5
  44. package/dist/js/angular/security/templates/users.html +1 -1
  45. package/dist/js/angular/ttyg/templates/agent-list.html +1 -1
  46. package/dist/js/angular/ttyg/templates/agent-select-menu.html +1 -1
  47. package/dist/js/angular/ttyg/templates/chat-item-detail.html +1 -1
  48. package/dist/js/angular/ttyg/templates/chat-list.html +1 -1
  49. package/dist/js/angular/ttyg/templates/chat-panel.html +1 -1
  50. package/dist/js/angular/ttyg/templates/modal/agent-instructions-explain-modal.html +1 -1
  51. package/dist/js/angular/ttyg/templates/modal/agent-settings-modal.html +3 -3
  52. package/dist/js/angular/ttyg/templates/modal/external-integration-configuration-modal.html +1 -1
  53. package/dist/js/angular/ttyg/templates/no-agents-view.html +1 -1
  54. package/dist/js/angular/ttyg/templates/ttyg.html +1 -1
  55. package/dist/{legacyWorkbench.a2fa07a08b20056d81d3.js → legacyWorkbench.cdb2fb6bc573f9a9b49d.js} +3 -3
  56. package/dist/{legacyWorkbench.a2fa07a08b20056d81d3.js.map → legacyWorkbench.cdb2fb6bc573f9a9b49d.js.map} +1 -1
  57. package/dist/pages/aclmanagement.html +1 -1
  58. package/dist/pages/autocomplete.html +1 -1
  59. package/dist/pages/choose-repository-type.html +1 -1
  60. package/dist/pages/cluster-management/clusterInfo.html +2 -2
  61. package/dist/pages/connectorsInfo.html +3 -3
  62. package/dist/pages/create-index.html +1 -1
  63. package/dist/pages/createConnector.html +2 -2
  64. package/dist/pages/dependencies.html +1 -1
  65. package/dist/pages/domainRangeInfo.html +2 -2
  66. package/dist/pages/edit.html +1 -1
  67. package/dist/pages/explore.html +1 -1
  68. package/dist/pages/export.html +1 -1
  69. package/dist/pages/find.html +1 -1
  70. package/dist/pages/graph-config/saveGraphConfig.html +8 -8
  71. package/dist/pages/graphs-visualizations.html +7 -7
  72. package/dist/pages/guides.html +1 -1
  73. package/dist/pages/home.html +1 -1
  74. package/dist/pages/import.html +2 -2
  75. package/dist/pages/jdbc-create.html +1 -1
  76. package/dist/pages/jdbc.html +1 -1
  77. package/dist/pages/monitor/backup-and-restore.html +1 -1
  78. package/dist/pages/monitor/queries.html +1 -1
  79. package/dist/pages/monitor/resources.html +1 -1
  80. package/dist/pages/namespaces.html +2 -2
  81. package/dist/pages/plugins.html +1 -1
  82. package/dist/pages/rdfClassHierarchyInfo.html +7 -7
  83. package/dist/pages/rdfrank.html +2 -2
  84. package/dist/pages/repositories.html +1 -1
  85. package/dist/pages/repository.html +1 -1
  86. package/dist/pages/similarity-indexes.html +1 -1
  87. package/dist/pages/sparql-editor.html +1 -1
  88. package/dist/pages/sparql-template-create.html +1 -1
  89. package/dist/pages/sparql-templates.html +1 -1
  90. package/dist/pages/ux-test1.html +2 -2
  91. package/dist/pages/webapi.html +2 -2
  92. package/dist/res/swagger5/index.html +11 -11
  93. package/package.json +1 -1
  94. package/dist/3395.d91c0fe998bffd4b4a7a.bundle.js +0 -2
  95. package/dist/3395.d91c0fe998bffd4b4a7a.bundle.js.map +0 -1
  96. /package/dist/{legacyWorkbench.a2fa07a08b20056d81d3.js.LICENSE.txt → legacyWorkbench.cdb2fb6bc573f9a9b49d.js.LICENSE.txt} +0 -0
@@ -1,2 +1,2 @@
1
- export const __webpack_esm_id__=85698;export const __webpack_esm_ids__=[4552,33931,58325,80706,85698];export const __webpack_esm_modules__={85698(e,t,n){n(4552),n(33931);var r=n(8981),a=n(58325),o=n(57154);const i={minLen:"3",maxLen:"255"};function s(e,t,n,s,c,l,u){return{restrict:"E",templateUrl:"js/angular/clustermanagement/templates/cluster-configuration/multi-region.html",scope:{clusterModel:"=",clusterConfiguration:"="},link:e=>{const g=(0,o.service)(o.AuthorizationService),_=(0,o.service)(o.AuthenticationService),d=[];e.topology=void 0,e.TopologyState=a.zB,e.isAdmin=!1,e.addingTag=!1,e.loaderTimeout=void 0,e.secondaryTag=void 0,e.TagLengthConstraints=i,e.loader=!1,e.statusLoader=!1,e.add=()=>{e.addingTag=!0},e.cancel=()=>{e.addingTag=!1},e.createTag=n=>{const r={tag:n};return O(!0),l.addCusterTag(r).then(()=>{s.success(t.instant("cluster_management.cluster_configuration_multi_region.created_tag",{tag:n}))}).catch(e=>{const n=getError(e);s.error(n,t.instant("cluster_management.cluster_configuration_multi_region.error.creating"))}).finally(()=>{e.addingTag=!1,O(!1)})},e.deleteTag=e=>{c.openSimpleModal({title:t.instant("cluster_management.cluster_configuration_multi_region.confirm.delete",{tag:e}),message:t.instant("cluster_management.cluster_configuration_multi_region.confirm.warning"),warning:!0,backdrop:"static",stopPropagation:!0}).result.then(()=>(O(!0),l.deleteClusterTag(e))).then(()=>s.success(t.instant("cluster_management.cluster_configuration_multi_region.deleted_tag",{tag:e}))).catch(e=>{if("cancel"===e||"escape key press"===e)return;const n=getError(e);s.error(n,t.instant("cluster_management.cluster_configuration_multi_region.error.deleting"))}).finally(()=>O(!1))},e.enableSecondaryMode=()=>{e.addingTag=!1;const n={title:t.instant("cluster_management.cluster_configuration_multi_region.confirm.enable_secondary"),message:t.instant("cluster_management.cluster_configuration_multi_region.confirm.enable_secondary_warning"),warning:!0,backdrop:"static",confirmButtonKey:"common.ok.btn",stopPropagation:!0};c.openSimpleModal(n).result.then(()=>m()).then(e=>(O(!0),l.enableSecondaryMode(e))).then(()=>s.success(t.instant("cluster_management.cluster_configuration_multi_region.secondary_enabled"))).catch(e=>{if("cancel"===e||"escape key press"===e)return;const n=getError(e);s.error(n,t.instant("cluster_management.cluster_configuration_multi_region.error.secondary"))}).finally(()=>O(!1))},e.disableSecondaryMode=()=>{c.openSimpleModal({title:t.instant("cluster_management.cluster_configuration_multi_region.confirm.disable_secondary_mode"),message:t.instant("cluster_management.cluster_configuration_multi_region.confirm.disable_secondary_mode_warning"),warning:!0,backdrop:"static",stopPropagation:!0}).result.then(()=>(O(!0),l.disableSecondaryMode())).then(()=>s.success(t.instant("cluster_management.cluster_configuration_multi_region.disabled_secondary_mode"))).catch(e=>{if("cancel"===e||"escape key press"===e)return;const n=getError(e);s.error(n,t.instant("cluster_management.cluster_configuration_multi_region.error.disabling"))}).finally(()=>O(!1))};const m=()=>{const e={title:t.instant("cluster_management.cluster_configuration_multi_region.secondary_cluster_settings"),templateUrl:"js/angular/clustermanagement/templates/modal/secondary-mode-modal.html",controller:["$scope","$uibModalInstance","config",function(e,t,n){e.rpcAddress="",e.tag="",e.title=n.title,e.onClick=e=>e.stopPropagation(),e.ok=()=>{t.close({primaryNode:e.rpcAddress,tag:e.tag})},e.cancel=()=>{t.dismiss("cancel")}}],size:"lg",warning:!0,backdrop:"static"};return c.openCustomModal(e).result},N=n=>{S(!0),l.getClusterConfig().then(t=>{e.secondaryTag=r.v9.fromJSON(t.data).secondaryTag,(t=>{const n=t.nodes.find(e=>e.nodeState===a.UY.LEADER);e.topology=n.topologyStatus})(r.kY.fromJSON(n))}).catch(e=>{const n=getError(e);s.error(n,t.instant("cluster_management.cluster_configuration_multi_region.error.disabling"))}).finally(()=>S(!1))},O=(t,r)=>{n.cancel(e.loaderTimeout),t?(e.loaderMessage=r,e.loaderTimeout=n(()=>{e.loader=t},150)):e.loader=!1},S=(t,r)=>{n.cancel(e.loaderTimeout),t?(e.loaderMessage=r,e.loaderTimeout=n(()=>{e.statusLoader=t},150)):e.statusLoader=!1};e.$on("$destroy",function(){d.forEach(e=>e())}),e.isAdmin=_.isAuthenticated()&&g.isAdmin(),d.push(e.$watch("clusterModel",function(e,t){e!==t&&N(e)},!0)),d.push(u.onShowClusterConfigurationPanel(t=>{t||(e.addingTag=!1)})),N(e.clusterModel)}}}angular.module("graphdb.framework.clustermanagement.directives.cluster-configuration.multi-region",["graphdb.framework.core.directives.ascii-validator","graphdb.framework.core.directives.length-validator"]).directive("multiRegion",s),s.$inject=["$jwtAuth","$translate","$timeout","toastr","ModalService","ClusterRestService","ClusterViewContextService"]},4552(){angular.module("graphdb.framework.core.directives.ascii-validator",[]).directive("asciiValidator",function(){return{restrict:"A",require:"ngModel",link:function(e,t,n,r){function a(e){const t=/^[\x21-\x7E]*$/.test(e);return r.$setValidity("asciiValidator",t),e}r.$parsers.push(a),r.$formatters.push(a)}}})},33931(){angular.module("graphdb.framework.core.directives.length-validator",[]).directive("lengthValidator",function(){return{restrict:"A",require:"ngModel",link:function(e,t,n,r){function a(e){const t=n.minLength?parseInt(n.minLength,10):0,a=n.maxLength?parseInt(n.maxLength,10):1/0,o=e&&e.length>=t&&e.length<=a;return r.$setValidity("lengthValidator",o),e}r.$parsers.push(a),r.$formatters.push(a)}}})},58325(e,t,n){n.d(t,{UY:()=>r,gC:()=>o,vQ:()=>a,zB:()=>i});const r={LEADER:"LEADER",FOLLOWER:"FOLLOWER",CANDIDATE:"CANDIDATE",OUT_OF_SYNC:"OUT_OF_SYNC",NO_CONNECTION:"NO_CONNECTION",READ_ONLY:"READ_ONLY",RESTRICTED:"RESTRICTED",NO_CLUSTER:"NO_CLUSTER"},a={SEARCHING_FOR_NODE:"SEARCHING_FOR_NODE",WAITING_FOR_SNAPSHOT:"WAITING_FOR_SNAPSHOT",RECEIVING_SNAPSHOT:"RECEIVING_SNAPSHOT",APPLYING_SNAPSHOT:"APPLYING_SNAPSHOT",BUILDING_SNAPSHOT:"BUILDING_SNAPSHOT",SENDING_SNAPSHOT:"SENDING_SNAPSHOT",RECOVERY_OPERATION_FAILURE_WARNING:"RECOVERY_OPERATION_FAILURE_WARNING"},o={IN_SYNC:"IN_SYNC",OUT_OF_SYNC:"OUT_OF_SYNC",SYNCING:"SYNCING",NO_CONNECTION:"NO_CONNECTION",RECEIVING_SNAPSHOT:"RECEIVING_SNAPSHOT"},i={PRIMARY_NODE:"PRIMARY_NODE",SECONDARY_NODE:"SECONDARY_NODE"}}};
2
- //# sourceMappingURL=85698.3342d281dbe7fe2f3dcb.bundle.js.map
1
+ export const __webpack_esm_id__=85698;export const __webpack_esm_ids__=[4552,33931,58325,80706,85698];export const __webpack_esm_modules__={85698(e,t,n){n(4552),n(33931);var r=n(8981),a=n(58325),o=n(57154);const i={minLen:"3",maxLen:"255"};function s(e,t,n,s,c,l,u){return{restrict:"E",templateUrl:"js/angular/clustermanagement/templates/cluster-configuration/multi-region.html",scope:{clusterModel:"=",clusterConfiguration:"="},link:e=>{const g=(0,o.service)(o.AuthorizationService),_=(0,o.service)(o.AuthenticationService),d=[];e.topology=void 0,e.TopologyState=a.zB,e.isAdmin=!1,e.addingTag=!1,e.loaderTimeout=void 0,e.secondaryTag=void 0,e.TagLengthConstraints=i,e.loader=!1,e.statusLoader=!1,e.add=()=>{e.addingTag=!0},e.cancel=()=>{e.addingTag=!1},e.createTag=n=>{const r={tag:n};return O(!0),l.addCusterTag(r).then(()=>{s.success(t.instant("cluster_management.cluster_configuration_multi_region.created_tag",{tag:n}))}).catch(e=>{const n=getError(e);s.error(n,t.instant("cluster_management.cluster_configuration_multi_region.error.creating"))}).finally(()=>{e.addingTag=!1,O(!1)})},e.deleteTag=e=>{c.openSimpleModal({title:t.instant("cluster_management.cluster_configuration_multi_region.confirm.delete",{tag:e}),message:t.instant("cluster_management.cluster_configuration_multi_region.confirm.warning"),warning:!0,backdrop:"static",stopPropagation:!0}).result.then(()=>(O(!0),l.deleteClusterTag(e))).then(()=>s.success(t.instant("cluster_management.cluster_configuration_multi_region.deleted_tag",{tag:e}))).catch(e=>{if("cancel"===e||"escape key press"===e)return;const n=getError(e);s.error(n,t.instant("cluster_management.cluster_configuration_multi_region.error.deleting"))}).finally(()=>O(!1))},e.enableSecondaryMode=()=>{e.addingTag=!1;const n={title:t.instant("cluster_management.cluster_configuration_multi_region.confirm.enable_secondary"),message:t.instant("cluster_management.cluster_configuration_multi_region.confirm.enable_secondary_warning"),warning:!0,backdrop:"static",confirmButtonKey:"common.ok.btn",stopPropagation:!0};c.openSimpleModal(n).result.then(()=>m()).then(e=>(O(!0),l.enableSecondaryMode(e))).then(()=>s.success(t.instant("cluster_management.cluster_configuration_multi_region.secondary_enabled"))).catch(e=>{if("cancel"===e||"escape key press"===e)return;const n=getError(e);s.error(n,t.instant("cluster_management.cluster_configuration_multi_region.error.secondary"))}).finally(()=>O(!1))},e.disableSecondaryMode=()=>{c.openSimpleModal({title:t.instant("cluster_management.cluster_configuration_multi_region.confirm.disable_secondary_mode"),message:t.instant("cluster_management.cluster_configuration_multi_region.confirm.disable_secondary_mode_warning"),warning:!0,backdrop:"static",stopPropagation:!0}).result.then(()=>(O(!0),l.disableSecondaryMode())).then(()=>s.success(t.instant("cluster_management.cluster_configuration_multi_region.disabled_secondary_mode"))).catch(e=>{if("cancel"===e||"escape key press"===e)return;const n=getError(e);s.error(n,t.instant("cluster_management.cluster_configuration_multi_region.error.disabling"))}).finally(()=>O(!1))};const m=()=>{const e={title:t.instant("cluster_management.cluster_configuration_multi_region.secondary_cluster_settings"),templateUrl:"js/angular/clustermanagement/templates/modal/secondary-mode-modal.html",controller:["$scope","$uibModalInstance","config",function(e,t,n){e.rpcAddress="",e.tag="",e.title=n.title,e.onClick=e=>e.stopPropagation(),e.ok=()=>{t.close({primaryNode:e.rpcAddress,tag:e.tag})},e.cancel=()=>{t.dismiss("cancel")}}],size:"lg",warning:!0,backdrop:"static"};return c.openCustomModal(e).result},N=n=>{S(!0),l.getClusterConfig().then(t=>{e.secondaryTag=r.v9.fromJSON(t.data).secondaryTag,(t=>{const n=t.nodes.find(e=>e.nodeState===a.UY.LEADER);e.topology=n?.topologyStatus})(r.kY.fromJSON(n))}).catch(e=>{const n=getError(e);s.error(n,t.instant("cluster_management.cluster_configuration_multi_region.error.disabling"))}).finally(()=>S(!1))},O=(t,r)=>{n.cancel(e.loaderTimeout),t?(e.loaderMessage=r,e.loaderTimeout=n(()=>{e.loader=t},150)):e.loader=!1},S=(t,r)=>{n.cancel(e.loaderTimeout),t?(e.loaderMessage=r,e.loaderTimeout=n(()=>{e.statusLoader=t},150)):e.statusLoader=!1};e.$on("$destroy",function(){d.forEach(e=>e())}),e.isAdmin=_.isAuthenticated()&&g.isAdmin(),d.push(e.$watch("clusterModel",function(e,t){e!==t&&N(e)},!0)),d.push(u.onShowClusterConfigurationPanel(t=>{t||(e.addingTag=!1)})),N(e.clusterModel)}}}angular.module("graphdb.framework.clustermanagement.directives.cluster-configuration.multi-region",["graphdb.framework.core.directives.ascii-validator","graphdb.framework.core.directives.length-validator"]).directive("multiRegion",s),s.$inject=["$jwtAuth","$translate","$timeout","toastr","ModalService","ClusterRestService","ClusterViewContextService"]},4552(){angular.module("graphdb.framework.core.directives.ascii-validator",[]).directive("asciiValidator",function(){return{restrict:"A",require:"ngModel",link:function(e,t,n,r){function a(e){const t=/^[\x21-\x7E]*$/.test(e);return r.$setValidity("asciiValidator",t),e}r.$parsers.push(a),r.$formatters.push(a)}}})},33931(){angular.module("graphdb.framework.core.directives.length-validator",[]).directive("lengthValidator",function(){return{restrict:"A",require:"ngModel",link:function(e,t,n,r){function a(e){const t=n.minLength?parseInt(n.minLength,10):0,a=n.maxLength?parseInt(n.maxLength,10):1/0,o=e&&e.length>=t&&e.length<=a;return r.$setValidity("lengthValidator",o),e}r.$parsers.push(a),r.$formatters.push(a)}}})},58325(e,t,n){n.d(t,{UY:()=>r,gC:()=>o,vQ:()=>a,zB:()=>i});const r={LEADER:"LEADER",FOLLOWER:"FOLLOWER",CANDIDATE:"CANDIDATE",OUT_OF_SYNC:"OUT_OF_SYNC",NO_CONNECTION:"NO_CONNECTION",READ_ONLY:"READ_ONLY",RESTRICTED:"RESTRICTED",NO_CLUSTER:"NO_CLUSTER"},a={SEARCHING_FOR_NODE:"SEARCHING_FOR_NODE",WAITING_FOR_SNAPSHOT:"WAITING_FOR_SNAPSHOT",RECEIVING_SNAPSHOT:"RECEIVING_SNAPSHOT",APPLYING_SNAPSHOT:"APPLYING_SNAPSHOT",BUILDING_SNAPSHOT:"BUILDING_SNAPSHOT",SENDING_SNAPSHOT:"SENDING_SNAPSHOT",RECOVERY_OPERATION_FAILURE_WARNING:"RECOVERY_OPERATION_FAILURE_WARNING"},o={IN_SYNC:"IN_SYNC",OUT_OF_SYNC:"OUT_OF_SYNC",SYNCING:"SYNCING",NO_CONNECTION:"NO_CONNECTION",RECEIVING_SNAPSHOT:"RECEIVING_SNAPSHOT"},i={PRIMARY_NODE:"PRIMARY_NODE",SECONDARY_NODE:"SECONDARY_NODE"}}};
2
+ //# sourceMappingURL=85698.ee9962969a310107ccf8.bundle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"85698.3342d281dbe7fe2f3dcb.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/clustermanagement/directives/cluster-configuration/multi-region.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/core/directives/ascii-validator.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/core/directives/length-validator.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/clustermanagement/states.js"],"sourcesContent":["import 'angular/core/directives/ascii-validator.directive';\nimport 'angular/core/directives/length-validator.directive';\nimport {ClusterConfiguration, ClusterModel} from '../../../models/clustermanagement/cluster';\nimport {NodeState, TopologyState} from '../../../models/clustermanagement/states';\nimport {\n AuthorizationService,\n AuthenticationService,\n service,\n} from '@ontotext/workbench-api';\n\nconst modules = [\n 'graphdb.framework.core.directives.ascii-validator',\n 'graphdb.framework.core.directives.length-validator',\n];\n\nconst TagLengthConstraints = {\n minLen: '3',\n maxLen: '255',\n};\n\nangular\n .module('graphdb.framework.clustermanagement.directives.cluster-configuration.multi-region', modules)\n .directive('multiRegion', MultiRegion);\n\nMultiRegion.$inject = ['$jwtAuth', '$translate', '$timeout', 'toastr', 'ModalService', 'ClusterRestService', 'ClusterViewContextService'];\n\nfunction MultiRegion($jwtAuth, $translate, $timeout, toastr, ModalService, ClusterRestService, ClusterViewContextService) {\n return {\n restrict: 'E',\n templateUrl: 'js/angular/clustermanagement/templates/cluster-configuration/multi-region.html',\n scope: {\n clusterModel: '=',\n clusterConfiguration: '=',\n },\n link: ($scope) => {\n // =========================\n // Private variables\n // =========================\n const authorizationService = service(AuthorizationService);\n const authenticationService = service(AuthenticationService);\n const subscriptions = [];\n\n // =========================\n // Public variables\n // =========================\n /**\n * @type {TopologyStatus}\n */\n $scope.topology = undefined;\n $scope.TopologyState = TopologyState;\n $scope.isAdmin = false;\n $scope.addingTag = false;\n $scope.loaderTimeout = undefined;\n $scope.secondaryTag = undefined;\n $scope.TagLengthConstraints = TagLengthConstraints;\n $scope.loader = false;\n $scope.statusLoader = false;\n\n // =========================\n // Public functions\n // =========================\n $scope.add = () => {\n $scope.addingTag = true;\n };\n\n $scope.cancel = () => {\n $scope.addingTag = false;\n };\n\n $scope.createTag = (tag) => {\n const payload = {\n tag,\n };\n setLoader(true);\n return ClusterRestService.addCusterTag(payload)\n .then(() => {\n toastr.success($translate.instant('cluster_management.cluster_configuration_multi_region.created_tag', {tag}));\n }).catch((response) => {\n const msg = getError(response);\n toastr.error(msg, $translate.instant('cluster_management.cluster_configuration_multi_region.error.creating'));\n }).finally(() => {\n $scope.addingTag = false;\n setLoader(false);\n });\n };\n\n $scope.deleteTag = (tag) => {\n ModalService.openSimpleModal({\n title: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.delete', {tag}),\n message: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.warning'),\n warning: true,\n backdrop: 'static',\n stopPropagation: true,\n }).result\n .then(() => {\n setLoader(true);\n return ClusterRestService.deleteClusterTag(tag);\n })\n .then(() => toastr.success($translate.instant('cluster_management.cluster_configuration_multi_region.deleted_tag', {tag})))\n .catch((response) => {\n if (response === 'cancel' || response === 'escape key press') {\n return;\n }\n const msg = getError(response);\n toastr.error(msg, $translate.instant('cluster_management.cluster_configuration_multi_region.error.deleting'));\n })\n .finally(() => setLoader(false));\n };\n\n $scope.enableSecondaryMode = () => {\n $scope.addingTag = false;\n const confirmConfig = {\n title: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.enable_secondary'),\n message: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.enable_secondary_warning'),\n warning: true,\n backdrop: 'static',\n confirmButtonKey: 'common.ok.btn',\n stopPropagation: true,\n };\n\n ModalService.openSimpleModal(confirmConfig).result\n .then(() => openSecondaryModeModal())\n .then((payload) => {\n setLoader(true);\n return ClusterRestService.enableSecondaryMode(payload);\n })\n .then(() => toastr.success($translate.instant('cluster_management.cluster_configuration_multi_region.secondary_enabled')))\n .catch((response) => {\n if (response === 'cancel' || response === 'escape key press') {\n return;\n }\n const msg = getError(response);\n toastr.error(msg, $translate.instant('cluster_management.cluster_configuration_multi_region.error.secondary'));\n })\n .finally(() => setLoader(false));\n };\n\n $scope.disableSecondaryMode = () => {\n ModalService.openSimpleModal({\n title: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.disable_secondary_mode'),\n message: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.disable_secondary_mode_warning'),\n warning: true,\n backdrop: 'static',\n stopPropagation: true,\n }).result\n .then(() => {\n setLoader(true);\n return ClusterRestService.disableSecondaryMode();\n })\n .then(() => toastr.success($translate.instant('cluster_management.cluster_configuration_multi_region.disabled_secondary_mode')))\n .catch((response) => {\n if (response === 'cancel' || response === 'escape key press') {\n return;\n }\n const msg = getError(response);\n toastr.error(msg, $translate.instant('cluster_management.cluster_configuration_multi_region.error.disabling'));\n })\n .finally(() => setLoader(false));\n };\n\n // =========================\n // Private functions\n // =========================\n const setTopology = (clusterModel) => {\n const leader = clusterModel.nodes.find((node) => node.nodeState === NodeState.LEADER);\n $scope.topology = leader.topologyStatus;\n };\n\n const openSecondaryModeModal = () => {\n const secondaryModalConfig = {\n title: $translate.instant('cluster_management.cluster_configuration_multi_region.secondary_cluster_settings'),\n templateUrl: 'js/angular/clustermanagement/templates/modal/secondary-mode-modal.html',\n controller: ['$scope', '$uibModalInstance', 'config', secondaryModeModalController],\n size: 'lg',\n warning: true,\n backdrop: 'static',\n };\n\n return ModalService.openCustomModal(secondaryModalConfig).result;\n\n // Controller for the secondary mode modal\n function secondaryModeModalController($scope, $uibModalInstance, config) {\n $scope.rpcAddress = '';\n $scope.tag = '';\n $scope.title = config.title;\n\n $scope.onClick = ($event) => $event.stopPropagation();\n $scope.ok = () => {\n $uibModalInstance.close({\n primaryNode: $scope.rpcAddress,\n tag: $scope.tag,\n });\n };\n $scope.cancel = () => {\n $uibModalInstance.dismiss('cancel');\n };\n }\n };\n\n const updateClusterData = (clusterModel) => {\n setStatusLoader(true);\n ClusterRestService.getClusterConfig()\n .then((response) => {\n $scope.secondaryTag = ClusterConfiguration.fromJSON(response.data).secondaryTag;\n setTopology(ClusterModel.fromJSON(clusterModel));\n }).catch((response) => {\n const msg = getError(response);\n toastr.error(msg, $translate.instant('cluster_management.cluster_configuration_multi_region.error.disabling'));\n })\n .finally(() => setStatusLoader(false));\n };\n\n const handleClusterConfigurationPanelVisibility = (show) => {\n if (!show) {\n $scope.addingTag = false;\n }\n };\n\n const setLoader = (loader, message) => {\n $timeout.cancel($scope.loaderTimeout);\n if (loader) {\n $scope.loaderMessage = message;\n $scope.loaderTimeout = $timeout(() => {\n $scope.loader = loader;\n }, 150);\n } else {\n $scope.loader = false;\n }\n };\n\n const setStatusLoader = (loader, message) => {\n $timeout.cancel($scope.loaderTimeout);\n if (loader) {\n $scope.loaderMessage = message;\n $scope.loaderTimeout = $timeout(() => {\n $scope.statusLoader = loader;\n }, 150);\n } else {\n $scope.statusLoader = false;\n }\n };\n\n // =========================\n // Events and watchers\n // =========================\n const subscribeHandlers = () => {\n subscriptions.push($scope.$watch('clusterModel', function(newValue, oldValue) {\n if (newValue !== oldValue) {\n updateClusterData(newValue);\n }\n }, true));\n subscriptions.push(ClusterViewContextService.onShowClusterConfigurationPanel(handleClusterConfigurationPanelVisibility));\n };\n\n const removeAllListeners = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n $scope.$on('$destroy', function() {\n removeAllListeners();\n });\n\n // =========================\n // Initialization\n // =========================\n const init = () => {\n $scope.isAdmin = authenticationService.isAuthenticated() && authorizationService.isAdmin();\n subscribeHandlers();\n updateClusterData($scope.clusterModel);\n };\n init();\n },\n };\n}\n","/**\n * @ngdoc directive\n * @name asciiValidator\n * @restrict A\n * @module graphdb.framework.core.directives.ascii-validator\n * @description\n * A custom AngularJS directive that validates if an input string contains only printable ASCII characters,\n * excluding spaces. Printable ASCII characters range from ASCII code 33 (`!`) to ASCII code 126 (`~`).\n *\n * **Usage:**\n * ```html\n * <input type=\"text\" ng-model=\"inputText\" ascii-validator>\n * ```\n *\n * @requires ngModel\n */\nangular.module('graphdb.framework.core.directives.ascii-validator', [])\n .directive('asciiValidator', function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n function validateAscii(value) {\n // Regular expression for printable ASCII characters excluding space (ASCII codes 33-126)\n const asciiRegex = /^[\\x21-\\x7E]*$/;\n\n const isValid = asciiRegex.test(value);\n ngModel.$setValidity('asciiValidator', isValid);\n return value;\n }\n ngModel.$parsers.push(validateAscii);\n ngModel.$formatters.push(validateAscii);\n }\n };\n});\n","/**\n * @ngdoc directive\n * @name lengthValidator\n * @restrict A\n * @module graphdb.framework.core.directives.length-validator\n * @description\n * A custom AngularJS directive that validates the length of an input string.\n * The directive ensures that the string length falls within a specified range,\n * using the `min-length` and `max-length` attributes.\n *\n * If no `min-length` is provided, the minimum length is set to 0.\n * If no `max-length` is provided, the maximum length is set to Infinity.\n *\n * **Usage:**\n * ```html\n * <input type=\"text\" ng-model=\"inputText\" length-validator min-length=\"5\" max-length=\"10\">\n * ```\n *\n * @param {number} minLength (optional) The minimum length of the input string. Defaults to 0 if not provided.\n * @param {number} maxLength (optional) The maximum length of the input string. Defaults to Infinity if not provided.\n * @requires ngModel\n */\nangular.module('graphdb.framework.core.directives.length-validator', [])\n .directive('lengthValidator', function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n function validateLength(value) {\n const minLength = attrs.minLength ? parseInt(attrs.minLength, 10) : 0;\n const maxLength = attrs.maxLength ? parseInt(attrs.maxLength, 10) : Infinity;\n const isValid = value && value.length >= minLength && value.length <= maxLength;\n ngModel.$setValidity('lengthValidator', isValid);\n return value;\n }\n ngModel.$parsers.push(validateLength);\n ngModel.$formatters.push(validateLength);\n }\n };\n});\n","export const NodeState = {\n LEADER: 'LEADER',\n FOLLOWER: 'FOLLOWER',\n CANDIDATE: 'CANDIDATE',\n OUT_OF_SYNC: 'OUT_OF_SYNC',\n NO_CONNECTION: 'NO_CONNECTION',\n READ_ONLY: 'READ_ONLY',\n RESTRICTED: 'RESTRICTED',\n NO_CLUSTER: 'NO_CLUSTER'\n};\n\nexport const RecoveryState = {\n SEARCHING_FOR_NODE: 'SEARCHING_FOR_NODE',\n WAITING_FOR_SNAPSHOT: 'WAITING_FOR_SNAPSHOT',\n RECEIVING_SNAPSHOT: 'RECEIVING_SNAPSHOT',\n APPLYING_SNAPSHOT: 'APPLYING_SNAPSHOT',\n BUILDING_SNAPSHOT: 'BUILDING_SNAPSHOT',\n SENDING_SNAPSHOT: 'SENDING_SNAPSHOT',\n RECOVERY_OPERATION_FAILURE_WARNING: 'RECOVERY_OPERATION_FAILURE_WARNING'\n};\n\nexport const LinkState = {\n IN_SYNC: 'IN_SYNC',\n OUT_OF_SYNC: 'OUT_OF_SYNC',\n SYNCING: 'SYNCING',\n NO_CONNECTION: 'NO_CONNECTION',\n // complimentary state, built based on the recovery state of two nodes when one is receiving snapshot to the other\n RECEIVING_SNAPSHOT: 'RECEIVING_SNAPSHOT'\n};\n\nexport const TopologyState = {\n PRIMARY_NODE: 'PRIMARY_NODE',\n SECONDARY_NODE: 'SECONDARY_NODE'\n};\n"],"names":["TagLengthConstraints","minLen","maxLen","MultiRegion","$jwtAuth","$translate","$timeout","toastr","ModalService","ClusterRestService","ClusterViewContextService","restrict","templateUrl","scope","clusterModel","clusterConfiguration","link","$scope","authorizationService","service","AuthorizationService","authenticationService","AuthenticationService","subscriptions","topology","undefined","TopologyState","isAdmin","addingTag","loaderTimeout","secondaryTag","loader","statusLoader","add","cancel","createTag","tag","payload","setLoader","addCusterTag","then","success","instant","catch","response","msg","getError","error","finally","deleteTag","openSimpleModal","title","message","warning","backdrop","stopPropagation","result","deleteClusterTag","enableSecondaryMode","confirmConfig","confirmButtonKey","openSecondaryModeModal","disableSecondaryMode","secondaryModalConfig","controller","$uibModalInstance","config","rpcAddress","onClick","$event","ok","close","primaryNode","dismiss","size","openCustomModal","updateClusterData","setStatusLoader","getClusterConfig","ClusterConfiguration","fromJSON","data","leader","nodes","find","node","nodeState","NodeState","LEADER","topologyStatus","setTopology","ClusterModel","loaderMessage","$on","forEach","subscription","isAuthenticated","push","$watch","newValue","oldValue","onShowClusterConfigurationPanel","show","angular","module","directive","$inject","require","element","attrs","ngModel","validateAscii","value","isValid","test","$setValidity","$parsers","$formatters","validateLength","minLength","parseInt","maxLength","Infinity","length","FOLLOWER","CANDIDATE","OUT_OF_SYNC","NO_CONNECTION","READ_ONLY","RESTRICTED","NO_CLUSTER","RecoveryState","SEARCHING_FOR_NODE","WAITING_FOR_SNAPSHOT","RECEIVING_SNAPSHOT","APPLYING_SNAPSHOT","BUILDING_SNAPSHOT","SENDING_SNAPSHOT","RECOVERY_OPERATION_FAILURE_WARNING","LinkState","IN_SYNC","SYNCING","PRIMARY_NODE","SECONDARY_NODE"],"sourceRoot":""}
1
+ {"version":3,"file":"85698.ee9962969a310107ccf8.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/clustermanagement/directives/cluster-configuration/multi-region.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/core/directives/ascii-validator.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/core/directives/length-validator.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/clustermanagement/states.js"],"sourcesContent":["import 'angular/core/directives/ascii-validator.directive';\nimport 'angular/core/directives/length-validator.directive';\nimport {ClusterConfiguration, ClusterModel} from '../../../models/clustermanagement/cluster';\nimport {NodeState, TopologyState} from '../../../models/clustermanagement/states';\nimport {\n AuthorizationService,\n AuthenticationService,\n service,\n} from '@ontotext/workbench-api';\n\nconst modules = [\n 'graphdb.framework.core.directives.ascii-validator',\n 'graphdb.framework.core.directives.length-validator',\n];\n\nconst TagLengthConstraints = {\n minLen: '3',\n maxLen: '255',\n};\n\nangular\n .module('graphdb.framework.clustermanagement.directives.cluster-configuration.multi-region', modules)\n .directive('multiRegion', MultiRegion);\n\nMultiRegion.$inject = ['$jwtAuth', '$translate', '$timeout', 'toastr', 'ModalService', 'ClusterRestService', 'ClusterViewContextService'];\n\nfunction MultiRegion($jwtAuth, $translate, $timeout, toastr, ModalService, ClusterRestService, ClusterViewContextService) {\n return {\n restrict: 'E',\n templateUrl: 'js/angular/clustermanagement/templates/cluster-configuration/multi-region.html',\n scope: {\n clusterModel: '=',\n clusterConfiguration: '=',\n },\n link: ($scope) => {\n // =========================\n // Private variables\n // =========================\n const authorizationService = service(AuthorizationService);\n const authenticationService = service(AuthenticationService);\n const subscriptions = [];\n\n // =========================\n // Public variables\n // =========================\n /**\n * @type {TopologyStatus}\n */\n $scope.topology = undefined;\n $scope.TopologyState = TopologyState;\n $scope.isAdmin = false;\n $scope.addingTag = false;\n $scope.loaderTimeout = undefined;\n $scope.secondaryTag = undefined;\n $scope.TagLengthConstraints = TagLengthConstraints;\n $scope.loader = false;\n $scope.statusLoader = false;\n\n // =========================\n // Public functions\n // =========================\n $scope.add = () => {\n $scope.addingTag = true;\n };\n\n $scope.cancel = () => {\n $scope.addingTag = false;\n };\n\n $scope.createTag = (tag) => {\n const payload = {\n tag,\n };\n setLoader(true);\n return ClusterRestService.addCusterTag(payload)\n .then(() => {\n toastr.success($translate.instant('cluster_management.cluster_configuration_multi_region.created_tag', {tag}));\n }).catch((response) => {\n const msg = getError(response);\n toastr.error(msg, $translate.instant('cluster_management.cluster_configuration_multi_region.error.creating'));\n }).finally(() => {\n $scope.addingTag = false;\n setLoader(false);\n });\n };\n\n $scope.deleteTag = (tag) => {\n ModalService.openSimpleModal({\n title: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.delete', {tag}),\n message: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.warning'),\n warning: true,\n backdrop: 'static',\n stopPropagation: true,\n }).result\n .then(() => {\n setLoader(true);\n return ClusterRestService.deleteClusterTag(tag);\n })\n .then(() => toastr.success($translate.instant('cluster_management.cluster_configuration_multi_region.deleted_tag', {tag})))\n .catch((response) => {\n if (response === 'cancel' || response === 'escape key press') {\n return;\n }\n const msg = getError(response);\n toastr.error(msg, $translate.instant('cluster_management.cluster_configuration_multi_region.error.deleting'));\n })\n .finally(() => setLoader(false));\n };\n\n $scope.enableSecondaryMode = () => {\n $scope.addingTag = false;\n const confirmConfig = {\n title: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.enable_secondary'),\n message: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.enable_secondary_warning'),\n warning: true,\n backdrop: 'static',\n confirmButtonKey: 'common.ok.btn',\n stopPropagation: true,\n };\n\n ModalService.openSimpleModal(confirmConfig).result\n .then(() => openSecondaryModeModal())\n .then((payload) => {\n setLoader(true);\n return ClusterRestService.enableSecondaryMode(payload);\n })\n .then(() => toastr.success($translate.instant('cluster_management.cluster_configuration_multi_region.secondary_enabled')))\n .catch((response) => {\n if (response === 'cancel' || response === 'escape key press') {\n return;\n }\n const msg = getError(response);\n toastr.error(msg, $translate.instant('cluster_management.cluster_configuration_multi_region.error.secondary'));\n })\n .finally(() => setLoader(false));\n };\n\n $scope.disableSecondaryMode = () => {\n ModalService.openSimpleModal({\n title: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.disable_secondary_mode'),\n message: $translate.instant('cluster_management.cluster_configuration_multi_region.confirm.disable_secondary_mode_warning'),\n warning: true,\n backdrop: 'static',\n stopPropagation: true,\n }).result\n .then(() => {\n setLoader(true);\n return ClusterRestService.disableSecondaryMode();\n })\n .then(() => toastr.success($translate.instant('cluster_management.cluster_configuration_multi_region.disabled_secondary_mode')))\n .catch((response) => {\n if (response === 'cancel' || response === 'escape key press') {\n return;\n }\n const msg = getError(response);\n toastr.error(msg, $translate.instant('cluster_management.cluster_configuration_multi_region.error.disabling'));\n })\n .finally(() => setLoader(false));\n };\n\n // =========================\n // Private functions\n // =========================\n const setTopology = (clusterModel) => {\n const leader = clusterModel.nodes.find((node) => node.nodeState === NodeState.LEADER);\n $scope.topology = leader?.topologyStatus;\n };\n\n const openSecondaryModeModal = () => {\n const secondaryModalConfig = {\n title: $translate.instant('cluster_management.cluster_configuration_multi_region.secondary_cluster_settings'),\n templateUrl: 'js/angular/clustermanagement/templates/modal/secondary-mode-modal.html',\n controller: ['$scope', '$uibModalInstance', 'config', secondaryModeModalController],\n size: 'lg',\n warning: true,\n backdrop: 'static',\n };\n\n return ModalService.openCustomModal(secondaryModalConfig).result;\n\n // Controller for the secondary mode modal\n function secondaryModeModalController($scope, $uibModalInstance, config) {\n $scope.rpcAddress = '';\n $scope.tag = '';\n $scope.title = config.title;\n\n $scope.onClick = ($event) => $event.stopPropagation();\n $scope.ok = () => {\n $uibModalInstance.close({\n primaryNode: $scope.rpcAddress,\n tag: $scope.tag,\n });\n };\n $scope.cancel = () => {\n $uibModalInstance.dismiss('cancel');\n };\n }\n };\n\n const updateClusterData = (clusterModel) => {\n setStatusLoader(true);\n ClusterRestService.getClusterConfig()\n .then((response) => {\n $scope.secondaryTag = ClusterConfiguration.fromJSON(response.data).secondaryTag;\n setTopology(ClusterModel.fromJSON(clusterModel));\n }).catch((response) => {\n const msg = getError(response);\n toastr.error(msg, $translate.instant('cluster_management.cluster_configuration_multi_region.error.disabling'));\n })\n .finally(() => setStatusLoader(false));\n };\n\n const handleClusterConfigurationPanelVisibility = (show) => {\n if (!show) {\n $scope.addingTag = false;\n }\n };\n\n const setLoader = (loader, message) => {\n $timeout.cancel($scope.loaderTimeout);\n if (loader) {\n $scope.loaderMessage = message;\n $scope.loaderTimeout = $timeout(() => {\n $scope.loader = loader;\n }, 150);\n } else {\n $scope.loader = false;\n }\n };\n\n const setStatusLoader = (loader, message) => {\n $timeout.cancel($scope.loaderTimeout);\n if (loader) {\n $scope.loaderMessage = message;\n $scope.loaderTimeout = $timeout(() => {\n $scope.statusLoader = loader;\n }, 150);\n } else {\n $scope.statusLoader = false;\n }\n };\n\n // =========================\n // Events and watchers\n // =========================\n const subscribeHandlers = () => {\n subscriptions.push($scope.$watch('clusterModel', function(newValue, oldValue) {\n if (newValue !== oldValue) {\n updateClusterData(newValue);\n }\n }, true));\n subscriptions.push(ClusterViewContextService.onShowClusterConfigurationPanel(handleClusterConfigurationPanelVisibility));\n };\n\n const removeAllListeners = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n $scope.$on('$destroy', function() {\n removeAllListeners();\n });\n\n // =========================\n // Initialization\n // =========================\n const init = () => {\n $scope.isAdmin = authenticationService.isAuthenticated() && authorizationService.isAdmin();\n subscribeHandlers();\n updateClusterData($scope.clusterModel);\n };\n init();\n },\n };\n}\n","/**\n * @ngdoc directive\n * @name asciiValidator\n * @restrict A\n * @module graphdb.framework.core.directives.ascii-validator\n * @description\n * A custom AngularJS directive that validates if an input string contains only printable ASCII characters,\n * excluding spaces. Printable ASCII characters range from ASCII code 33 (`!`) to ASCII code 126 (`~`).\n *\n * **Usage:**\n * ```html\n * <input type=\"text\" ng-model=\"inputText\" ascii-validator>\n * ```\n *\n * @requires ngModel\n */\nangular.module('graphdb.framework.core.directives.ascii-validator', [])\n .directive('asciiValidator', function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n function validateAscii(value) {\n // Regular expression for printable ASCII characters excluding space (ASCII codes 33-126)\n const asciiRegex = /^[\\x21-\\x7E]*$/;\n\n const isValid = asciiRegex.test(value);\n ngModel.$setValidity('asciiValidator', isValid);\n return value;\n }\n ngModel.$parsers.push(validateAscii);\n ngModel.$formatters.push(validateAscii);\n }\n };\n});\n","/**\n * @ngdoc directive\n * @name lengthValidator\n * @restrict A\n * @module graphdb.framework.core.directives.length-validator\n * @description\n * A custom AngularJS directive that validates the length of an input string.\n * The directive ensures that the string length falls within a specified range,\n * using the `min-length` and `max-length` attributes.\n *\n * If no `min-length` is provided, the minimum length is set to 0.\n * If no `max-length` is provided, the maximum length is set to Infinity.\n *\n * **Usage:**\n * ```html\n * <input type=\"text\" ng-model=\"inputText\" length-validator min-length=\"5\" max-length=\"10\">\n * ```\n *\n * @param {number} minLength (optional) The minimum length of the input string. Defaults to 0 if not provided.\n * @param {number} maxLength (optional) The maximum length of the input string. Defaults to Infinity if not provided.\n * @requires ngModel\n */\nangular.module('graphdb.framework.core.directives.length-validator', [])\n .directive('lengthValidator', function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n function validateLength(value) {\n const minLength = attrs.minLength ? parseInt(attrs.minLength, 10) : 0;\n const maxLength = attrs.maxLength ? parseInt(attrs.maxLength, 10) : Infinity;\n const isValid = value && value.length >= minLength && value.length <= maxLength;\n ngModel.$setValidity('lengthValidator', isValid);\n return value;\n }\n ngModel.$parsers.push(validateLength);\n ngModel.$formatters.push(validateLength);\n }\n };\n});\n","export const NodeState = {\n LEADER: 'LEADER',\n FOLLOWER: 'FOLLOWER',\n CANDIDATE: 'CANDIDATE',\n OUT_OF_SYNC: 'OUT_OF_SYNC',\n NO_CONNECTION: 'NO_CONNECTION',\n READ_ONLY: 'READ_ONLY',\n RESTRICTED: 'RESTRICTED',\n NO_CLUSTER: 'NO_CLUSTER'\n};\n\nexport const RecoveryState = {\n SEARCHING_FOR_NODE: 'SEARCHING_FOR_NODE',\n WAITING_FOR_SNAPSHOT: 'WAITING_FOR_SNAPSHOT',\n RECEIVING_SNAPSHOT: 'RECEIVING_SNAPSHOT',\n APPLYING_SNAPSHOT: 'APPLYING_SNAPSHOT',\n BUILDING_SNAPSHOT: 'BUILDING_SNAPSHOT',\n SENDING_SNAPSHOT: 'SENDING_SNAPSHOT',\n RECOVERY_OPERATION_FAILURE_WARNING: 'RECOVERY_OPERATION_FAILURE_WARNING'\n};\n\nexport const LinkState = {\n IN_SYNC: 'IN_SYNC',\n OUT_OF_SYNC: 'OUT_OF_SYNC',\n SYNCING: 'SYNCING',\n NO_CONNECTION: 'NO_CONNECTION',\n // complimentary state, built based on the recovery state of two nodes when one is receiving snapshot to the other\n RECEIVING_SNAPSHOT: 'RECEIVING_SNAPSHOT'\n};\n\nexport const TopologyState = {\n PRIMARY_NODE: 'PRIMARY_NODE',\n SECONDARY_NODE: 'SECONDARY_NODE'\n};\n"],"names":["TagLengthConstraints","minLen","maxLen","MultiRegion","$jwtAuth","$translate","$timeout","toastr","ModalService","ClusterRestService","ClusterViewContextService","restrict","templateUrl","scope","clusterModel","clusterConfiguration","link","$scope","authorizationService","service","AuthorizationService","authenticationService","AuthenticationService","subscriptions","topology","undefined","TopologyState","isAdmin","addingTag","loaderTimeout","secondaryTag","loader","statusLoader","add","cancel","createTag","tag","payload","setLoader","addCusterTag","then","success","instant","catch","response","msg","getError","error","finally","deleteTag","openSimpleModal","title","message","warning","backdrop","stopPropagation","result","deleteClusterTag","enableSecondaryMode","confirmConfig","confirmButtonKey","openSecondaryModeModal","disableSecondaryMode","secondaryModalConfig","controller","$uibModalInstance","config","rpcAddress","onClick","$event","ok","close","primaryNode","dismiss","size","openCustomModal","updateClusterData","setStatusLoader","getClusterConfig","ClusterConfiguration","fromJSON","data","leader","nodes","find","node","nodeState","NodeState","LEADER","topologyStatus","setTopology","ClusterModel","loaderMessage","$on","forEach","subscription","isAuthenticated","push","$watch","newValue","oldValue","onShowClusterConfigurationPanel","show","angular","module","directive","$inject","require","element","attrs","ngModel","validateAscii","value","isValid","test","$setValidity","$parsers","$formatters","validateLength","minLength","parseInt","maxLength","Infinity","length","FOLLOWER","CANDIDATE","OUT_OF_SYNC","NO_CONNECTION","READ_ONLY","RESTRICTED","NO_CLUSTER","RecoveryState","SEARCHING_FOR_NODE","WAITING_FOR_SNAPSHOT","RECEIVING_SNAPSHOT","APPLYING_SNAPSHOT","BUILDING_SNAPSHOT","SENDING_SNAPSHOT","RECOVERY_OPERATION_FAILURE_WARNING","LinkState","IN_SYNC","SYNCING","PRIMARY_NODE","SECONDARY_NODE"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- export const __webpack_esm_id__=86099;export const __webpack_esm_ids__=[86099];export const __webpack_esm_modules__={86099(e,t,n){var a=n(82667),r=n(89687),i=n(9508),s=n(44482),c=n(66886),o=(n(38473),n(57154));function l(e,t,n,l,d,h,u,f,p,g,x,m){return{restrict:"AE",template:'<div id="classChart"></div>',scope:{classHierarchyData:"=",flattenedClassNames:"=",selectedClass:"=",currentSliderValue:"=",showClassInfoPanel:"=",showExternalElements:"=",hidePrefixes:"=",currentBrowserLimit:"="},link:function(y,A,v){!function(y){let A=!1;let v,S;const C=s.pack().size([780,780]),R=s.scaleLinear().domain([0,4]).range(["hsl(19, 70%, 90%)","hsl(19, 70%, 50%)"]).interpolate(s.interpolateHcl),E=s.select("#classChart").insert("svg:svg","h2").attr("viewBox","0 0 800 800").attr("preserveAspectRatio","xMidYMid meet").on("dblclick.zoom",null);function P(){return E.append("svg:g").attrs({id:"main-group",transform:"translate(400,400)"})}function w(){return"true"===g.get(x.CLASS_HIERARCHY_HIDE_PREFIXES)}function H(){const e=c.A.Export.getCSSRules("css/rdf-class-hierarchy-labels.css?v=3.5.1-TR2");s.selectAll("#main-group").append("defs"),$("defs").append('<style type="text/css"><![CDATA['+e+"]]></style>"),s.selectAll("g").style("opacity",1);const t=c.A.Export.generateBase64ImageSource("#classChart svg");s.select(this).attrs({href:t,download:"class-hierarchy-"+h.getActiveRepository()+".svg"})}y.hidePrefixes=w();let I=P();const T=!!y.classHierarchyData?.classCount,L=h.getActiveRepository()&&!h.isSystemRepository();let k,D,N,b,F;(0,o.service)(o.LicenseContextService).onLicenseChanged(t=>{t?.valid&&!T&&L&&function(){e.loader=!0,e.hierarchyError=!1;const t=g.get(`classHierarchy-selectedGraph-${h.getActiveRepository()}`);n.getClassHierarchyData(null!==t?t.contextID.uri:"").success(function(t,n){e.loader=!1,207===n&&u.warning(m.instant("graphexplore.update.diagram"),m.instant("graphexplore.repository.data.changed")),y.classHierarchyData=t,s.select("#download-svg").on("mouseover",H)}).error(function(t){e.loader=!1,e.hierarchyError=getError(t),u.error(m.instant("graphexplore.error.request.failed",{name:p,error:getError(t)}))})}()});const O={};function z(n,c,o,h){b&&b(),F&&F(),s.selectAll("#main-group").remove(),I=P(),r.A.SingleChild.addPlaceholders(n,!0),S=s.hierarchy(n),S.sum(function(e){return e.size}),N=o||S,C(S);const u=S.descendants();let g;N.isInFocusTransitive=!0,r.A.SingleChild.removePlaceholders(u),r.A.SingleChild.centerNodes(u),r.A.SingleChild.makePositionsRelativeToZero(u),v||(v=(0,a.A)().attr("class","d3-tip").customPosition(function(e,t){return{top:"inherit",bottom:l.innerHeight-t.clientY+"px",right:l.innerWidth-t.clientX+"px"}}).html(function(e){return e.data.name}),E.call(v));const x=I.selectAll("circle").data(u).enter().append("g");c.doFade&&x.each(function(e){i.A.Transition.fadeIn(s.select(this),550)});let m=[];const w=x.append("circle").attr("class",function(e){return e.data.role}).attr("data-test",function(e){return"class-"+e.data.name}).attr("guide-selector",function(e){return"class-"+e.data.name}).style("fill",function(e){return e.children?R(e.depth):"#E0D0D0"}).each(function(e){if(e.circle=s.select(this),e.data.name!==p){const t=e.data.name;m.push({name:t}),O[[t]]=e,e.circle.classed("rdf-class",!0),e.circle.on("mouseover",function(t){c.noPrefixes||e.textHidden?v.show(e,t):v.hide(e)}),e.circle.on("mouseout",v.hide)}}).on("gdb-focus",(e,t)=>D(t)).on("gdb-zoom",(e,t)=>Z(t));let H;function T(e){s.selectAll(".selected").classed("selected",e.selected=!1),e.circle.classed("selected",e.selected=!0),H=e}function L(){y.showClassInfoPanel=!1}m&&(m=_.uniqBy(m,"name"),y.flattenedClassNames=m);const $=i.A.Click.delayDblClick();s.selectAll(".parent, .topLevelParent, .child, .root").call($),D=function(e){Z(e),e.data.name===p?(L(),s.selectAll(".selected").classed("selected",!1)):(T(e),A||(y.selectedClass=H,y.showClassInfoPanel=!0),y.$on("sidePanelClosed",function(t){s.selectAll(".selected").classed("selected",e.selected=!1)}))},$.on("click",function(e,t){t.data.id&&l.history.pushState({id:t.data.id},"classHierarchyPage"+t.data.id,"hierarchy#"+t.data.id),v.hide(),D(t)}),$.on("dblclick",function(t,a){a!==n&&(v.hide(),T(a),e.$broadcast("goToDomainRangeGraphView",H,N),t.stopPropagation())});let z=0;E.on("wheel",function(e){v.hide(),e.preventDefault(),e.stopPropagation();const t=Date.now();if(!(t-z>100))return;z=t;let n="";e.deltaY<=-1?n="in":e.deltaY>=1&&(n="out");let a=e.target.__data__;if(a||(a=N),"in"===n){if(a!==N){for(;a.parent&&!a.parent.isInFocusTransitive;)a=a.parent;a.depth<N.depth&&(a=N)}if(a===N&&a.children){let e=a.children[0];for(let t=1;t<a.children.length;t++)a.children[t].sortingRank>e.sortingRank&&(e=a.children[t]);e.children&&(a=e)}else a.children||(a=a.parent);Z(a,!0)}else"out"===n&&(a=N.parent,a&&Z(a,!0));N.data.name===p&&l.history.replaceState({id:1},"classHierarchyPage1","hierarchy#1"),U()});const Y=I.selectAll("text").data(u).enter().append("text").attr("class",function(e){return e.children&&e.children.length?"label":"label child-label"}).each(function(e){e.textSel=s.select(this)});c.noPrefixes?(Y.each(function(e){const t=e.data.name.indexOf(":");e.data.name.indexOf("http://")>-1?e.noPrefixName=e.data.name:t>-1&&(e.noPrefixName=e.data.name.substring(t+1))}),Y.style("font-size",function(e){return i.A.Text.calcFontSize(e.noPrefixName,e.r)}).text(function(e){return i.A.Text.getTextWithElipsisIfNeeded(e.noPrefixName,e.r/3)})):Y.style("font-size",function(e){return i.A.Text.calcFontSize(e.data.name,e.r)}).text(function(e){return i.A.Text.getTextWithElipsisIfNeeded(e.data.name,e.r/3)}),Y.style("display",function(e){return e.parent&&e.parent.data===N.data?(e.textHidden=this.textContent.indexOf("...")+3===this.textContent.length,null):(e.textHidden=!0,"none")}),c.doFade&&!c.keepPrevState&&Y.each(function(e){i.A.Transition.fadeIn(s.select(this),550)}),k=function(){function e(e){e&&w.each(function(t){+e===t.data.id&&D(t)})}const n=t.hash();l.onpopstate=function(t){t.state&&!t.state.skipOnPopState&&e(t.state.id)},e(n)};const B=I.selectAll("circle, text");function V(e,t){const n=800/e[2];g=e,B.attr("transform",function(t){return"translate("+(t.x-e[0])*n+","+(t.y-e[1])*n+")"}),w.attr("r",function(e){return e.r*n}),t&&Y.each(function(e){e.data.fullName!==N.data.topLevelParentUri&&N.data.topLevelParentUri!==p||(e.textSel.style("display","none"),N.children&&N.children.length?_.each(N.children,function(e){e.textSel.style("display","inline")}):N.textSel.style("display","inline"),N.parent&&_.each(N.parent.children,function(e){e.data.name!==N.data.name&&e.textSel.style("display","inline")}))}),Y.style("font-size",function(e){return c.noPrefixes?i.A.Text.calcFontSize(e.noPrefixName,e.r*n):i.A.Text.calcFontSize(e.data.name,e.r*n)}).text(function(e){return c.noPrefixes?i.A.Text.getTextWithElipsisIfNeeded(e.noPrefixName,e.r*n/3):i.A.Text.getTextWithElipsisIfNeeded(e.data.name,e.r*n/3)})}function M(e){let t=2*e+20;return 2*e/t<.3&&(t=2*e+2),t}function W(e){!e.isInFocusTransitive&&e.parent&&e.parent.isInFocusTransitive?(e.textHidden=this.textContent.indexOf("...")+3===this.textContent.length,this.style.display=""):(e.textHidden=!0,this.style.display="none")}function Z(e,t){if(d(function(){y.showExternalElements=e.data.name===p}),N===e)return;if(e.data.id&&l.history.replaceState({id:e.data.id,skipOnPopState:!0},"classHierarchyPage"+e.data.id,"hierarchy#"+e.data.id),!e.children&&(e=e.parent,N===e))return;if(t&&(L(),s.selectAll(".selected").classed("selected",!1)),N.parent){let e=N;for(;e;)e.isInFocusTransitive=!1,e=e.parent}let n=e;for(;n;)n.isInFocusTransitive=!!n.children,n=n.parent;N=e,2*N.r/(2*N.r+20)<.3||y.currentSliderValue>y.currentBrowserLimit?(V([N.x,N.y,M(N.r)]),Y.each(function(e){W.call(this,e)})):s.transition().duration(f).tween("zoom",function(e){const t=s.interpolateZoom(g,[N.x,N.y,M(N.r)]);return function(e){V(t(e))}}).selectAll("text").each(W)}V([N.x,N.y,M(N.r)],h),b=y.$on("rootFocus",function(){l.history.pushState({id:1},"classHierarchyPage1","hierarchy#1"),D(S)}),F=y.$on("classSearch",function(e){D(e)})}function U(){const t=y.classHierarchyData.classCount;let n=g.get(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);(!n||n>t)&&(n=t,g.set(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE,n)),e.$broadcast("classCount",t,n)}let Y,B,V,M;window.addEventListener("resize",U),window.addEventListener("beforeunload",function e(){window.removeEventListener("resize",U),window.removeEventListener("beforeunload",e)}),y.$watch("classHierarchyData",function(){Y&&Y(),B&&B(),V&&V(),M&&M();let e=w();if(y.classHierarchyData.classCount){U();const t=structuredClone(y.classHierarchyData);const n=s.hierarchy(t).descendants().sort(function(e,t){return e.data.sortingRank>t.data.sortingRank?-1:e.data.sortingRank<t.data.sortingRank||e.data.depth>t.data.depth?1:e.data.depth<t.data.depth?-1:0});let a,r;function i(e,t){const n={keepPrevState:!0,noPrefixes:w()};r=n.noPrefixes,z(a||e,n,N,!0),d(()=>{g.set(x.CLASS_HIERARCHY_SWITCH_PREFIXES,t),k(),A=!1},70)}function c(e,n,s){if(!e)return;g.set(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE,e),a={name:p,children:[]};const c=new Set;for(let t=1;t<=e;t++)c.add(n[t].data.id),n[t].parent===n[0]&&a.children.push(n[t].data);(function e(t){if(!t.children)return;const n=[];for(const e of t.children)c.has(e.id)&&n.push($.extend({},e));t.children=n;for(const n of t.children)e(n)})(a),s?(r=angular.isUndefined(r)?w():r,z(a,{noPrefixes:r})):i(t)}const o=g.get(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);if(o)c(o,n);else{const h={doFade:!0,keepPrevState:!0,noPrefixes:w()};z(t,h),k()}let l;Y=y.$watch("hidePrefixes",function(n){angular.isUndefined(n)||e?e=void 0:d(function(){A=!0,function(e){angular.isUndefined(e)||g.set(x.CLASS_HIERARCHY_HIDE_PREFIXES,e)}(n),i(t,!0)},50)},!0),B=y.$watch("currentSliderValue",function(e){c(e,n,!0)},!0),M=y.$on("onEnterKeypressSearchAction",function(e){l&&D(l)}),V=y.$on("searchedClass",function(e,t){l=O[t.name],l&&D(l)})}},!0)}(y)}}}angular.module("graphdb.framework.graphexplore.directives.class",["graphdb.framework.graphexplore.controllers.class","graphdb.framework.utils.localstorageadapter"]).constant("ZOOM_DURATION",500).constant("ROOT_OBJ_NAME","RDF Class Hierarchy").directive("rdfClassHierarchy",l),l.$inject=["$rootScope","$location","GraphDataRestService","$window","$timeout","$repositories","toastr","ZOOM_DURATION","ROOT_OBJ_NAME","LocalStorageAdapter","LSKeys","$translate"]},89687(e,t,n){n.d(t,{A:()=>r});var a=a||{};a.SingleChild={addPlaceholders:function e(t,n){if(t.children){for(var a=0;a<t.children.length;a++)e(t.children[a]);if(1===t.children.length){var r=1.2*t.size;n&&(r=.1*t.children[0].size),t.children.push({name:"placeholder",size:r})}}},removePlaceholders:function e(t){for(var n=t.length-1;n>=0;n--){var a=t[n];"placeholder"===a.data.name?t.splice(n,1):a.children&&e(a.children)}},centerNodes:function(e){for(var t=0;t<e.length;t++){var n=e[t];if(n.children&&1===n.children.length){var a=n.x-n.children[0].x;n.children[0].x+=a,r(n.children[0],a)}}function r(e,t){if(e.children)for(var n=0;n<e.children.length;n++)e.children[n].x+=t,r(e.children[n],t)}},makePositionsRelativeToZero:function(e){for(var t=e[0].x,n=e[0].y,a=0;a<e.length;a++){var r=e[a];r.x-=t,r.y-=n}}};const r=a},66886(e,t,n){n.d(t,{A:()=>i}),n(11014);const a={selectAll:n(44482).selectAll};var r=r||{};r.Export={getCSSRules:function(e){const t=$('link[href="'+e+'"]')[0].sheet.rules;let n="";return _.each(t,function(e){n+=e.cssText}),n},generateBase64ImageSource:function(e){e||(e="svg");const t=a.selectAll(e).attr("version","1.1").attr("xmlns","http://www.w3.org/2000/svg").node().parentNode.innerHTML;return"data:image/svg+xml;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(t)))}};const i=r}};
2
- //# sourceMappingURL=86099.70a92c30b2940c5b5b72.bundle.js.map
1
+ export const __webpack_esm_id__=86099;export const __webpack_esm_ids__=[86099];export const __webpack_esm_modules__={86099(e,t,n){var a=n(82667),r=n(89687),i=n(9508),s=n(44482),c=n(66886),o=(n(38473),n(57154));function l(e,t,n,l,d,h,u,f,p,g,x,m){return{restrict:"AE",template:'<div id="classChart"></div>',scope:{classHierarchyData:"=",flattenedClassNames:"=",selectedClass:"=",currentSliderValue:"=",showClassInfoPanel:"=",showExternalElements:"=",hidePrefixes:"=",currentBrowserLimit:"="},link:function(y,A,v){!function(y){let A=!1;let v,S;const C=s.pack().size([780,780]),R=s.scaleLinear().domain([0,4]).range(["hsl(19, 70%, 90%)","hsl(19, 70%, 50%)"]).interpolate(s.interpolateHcl),E=s.select("#classChart").insert("svg:svg","h2").attr("viewBox","0 0 800 800").attr("preserveAspectRatio","xMidYMid meet").on("dblclick.zoom",null);function P(){return E.append("svg:g").attrs({id:"main-group",transform:"translate(400,400)"})}function w(){return"true"===g.get(x.CLASS_HIERARCHY_HIDE_PREFIXES)}function H(){const e=c.A.Export.getCSSRules("css/rdf-class-hierarchy-labels.css?v=3.5.1-TR3");s.selectAll("#main-group").append("defs"),$("defs").append('<style type="text/css"><![CDATA['+e+"]]></style>"),s.selectAll("g").style("opacity",1);const t=c.A.Export.generateBase64ImageSource("#classChart svg");s.select(this).attrs({href:t,download:"class-hierarchy-"+h.getActiveRepository()+".svg"})}y.hidePrefixes=w();let I=P();const T=!!y.classHierarchyData?.classCount,L=h.getActiveRepository()&&!h.isSystemRepository();let k,D,N,b,F;(0,o.service)(o.LicenseContextService).onLicenseChanged(t=>{t?.valid&&!T&&L&&function(){e.loader=!0,e.hierarchyError=!1;const t=g.get(`classHierarchy-selectedGraph-${h.getActiveRepository()}`);n.getClassHierarchyData(null!==t?t.contextID.uri:"").success(function(t,n){e.loader=!1,207===n&&u.warning(m.instant("graphexplore.update.diagram"),m.instant("graphexplore.repository.data.changed")),y.classHierarchyData=t,s.select("#download-svg").on("mouseover",H)}).error(function(t){e.loader=!1,e.hierarchyError=getError(t),u.error(m.instant("graphexplore.error.request.failed",{name:p,error:getError(t)}))})}()});const O={};function z(n,c,o,h){b&&b(),F&&F(),s.selectAll("#main-group").remove(),I=P(),r.A.SingleChild.addPlaceholders(n,!0),S=s.hierarchy(n),S.sum(function(e){return e.size}),N=o||S,C(S);const u=S.descendants();let g;N.isInFocusTransitive=!0,r.A.SingleChild.removePlaceholders(u),r.A.SingleChild.centerNodes(u),r.A.SingleChild.makePositionsRelativeToZero(u),v||(v=(0,a.A)().attr("class","d3-tip").customPosition(function(e,t){return{top:"inherit",bottom:l.innerHeight-t.clientY+"px",right:l.innerWidth-t.clientX+"px"}}).html(function(e){return e.data.name}),E.call(v));const x=I.selectAll("circle").data(u).enter().append("g");c.doFade&&x.each(function(e){i.A.Transition.fadeIn(s.select(this),550)});let m=[];const w=x.append("circle").attr("class",function(e){return e.data.role}).attr("data-test",function(e){return"class-"+e.data.name}).attr("guide-selector",function(e){return"class-"+e.data.name}).style("fill",function(e){return e.children?R(e.depth):"#E0D0D0"}).each(function(e){if(e.circle=s.select(this),e.data.name!==p){const t=e.data.name;m.push({name:t}),O[[t]]=e,e.circle.classed("rdf-class",!0),e.circle.on("mouseover",function(t){c.noPrefixes||e.textHidden?v.show(e,t):v.hide(e)}),e.circle.on("mouseout",v.hide)}}).on("gdb-focus",(e,t)=>D(t)).on("gdb-zoom",(e,t)=>Z(t));let H;function T(e){s.selectAll(".selected").classed("selected",e.selected=!1),e.circle.classed("selected",e.selected=!0),H=e}function L(){y.showClassInfoPanel=!1}m&&(m=_.uniqBy(m,"name"),y.flattenedClassNames=m);const $=i.A.Click.delayDblClick();s.selectAll(".parent, .topLevelParent, .child, .root").call($),D=function(e){Z(e),e.data.name===p?(L(),s.selectAll(".selected").classed("selected",!1)):(T(e),A||(y.selectedClass=H,y.showClassInfoPanel=!0),y.$on("sidePanelClosed",function(t){s.selectAll(".selected").classed("selected",e.selected=!1)}))},$.on("click",function(e,t){t.data.id&&l.history.pushState({id:t.data.id},"classHierarchyPage"+t.data.id,"hierarchy#"+t.data.id),v.hide(),D(t)}),$.on("dblclick",function(t,a){a!==n&&(v.hide(),T(a),e.$broadcast("goToDomainRangeGraphView",H,N),t.stopPropagation())});let z=0;E.on("wheel",function(e){v.hide(),e.preventDefault(),e.stopPropagation();const t=Date.now();if(!(t-z>100))return;z=t;let n="";e.deltaY<=-1?n="in":e.deltaY>=1&&(n="out");let a=e.target.__data__;if(a||(a=N),"in"===n){if(a!==N){for(;a.parent&&!a.parent.isInFocusTransitive;)a=a.parent;a.depth<N.depth&&(a=N)}if(a===N&&a.children){let e=a.children[0];for(let t=1;t<a.children.length;t++)a.children[t].sortingRank>e.sortingRank&&(e=a.children[t]);e.children&&(a=e)}else a.children||(a=a.parent);Z(a,!0)}else"out"===n&&(a=N.parent,a&&Z(a,!0));N.data.name===p&&l.history.replaceState({id:1},"classHierarchyPage1","hierarchy#1"),U()});const Y=I.selectAll("text").data(u).enter().append("text").attr("class",function(e){return e.children&&e.children.length?"label":"label child-label"}).each(function(e){e.textSel=s.select(this)});c.noPrefixes?(Y.each(function(e){const t=e.data.name.indexOf(":");e.data.name.indexOf("http://")>-1?e.noPrefixName=e.data.name:t>-1&&(e.noPrefixName=e.data.name.substring(t+1))}),Y.style("font-size",function(e){return i.A.Text.calcFontSize(e.noPrefixName,e.r)}).text(function(e){return i.A.Text.getTextWithElipsisIfNeeded(e.noPrefixName,e.r/3)})):Y.style("font-size",function(e){return i.A.Text.calcFontSize(e.data.name,e.r)}).text(function(e){return i.A.Text.getTextWithElipsisIfNeeded(e.data.name,e.r/3)}),Y.style("display",function(e){return e.parent&&e.parent.data===N.data?(e.textHidden=this.textContent.indexOf("...")+3===this.textContent.length,null):(e.textHidden=!0,"none")}),c.doFade&&!c.keepPrevState&&Y.each(function(e){i.A.Transition.fadeIn(s.select(this),550)}),k=function(){function e(e){e&&w.each(function(t){+e===t.data.id&&D(t)})}const n=t.hash();l.onpopstate=function(t){t.state&&!t.state.skipOnPopState&&e(t.state.id)},e(n)};const B=I.selectAll("circle, text");function V(e,t){const n=800/e[2];g=e,B.attr("transform",function(t){return"translate("+(t.x-e[0])*n+","+(t.y-e[1])*n+")"}),w.attr("r",function(e){return e.r*n}),t&&Y.each(function(e){e.data.fullName!==N.data.topLevelParentUri&&N.data.topLevelParentUri!==p||(e.textSel.style("display","none"),N.children&&N.children.length?_.each(N.children,function(e){e.textSel.style("display","inline")}):N.textSel.style("display","inline"),N.parent&&_.each(N.parent.children,function(e){e.data.name!==N.data.name&&e.textSel.style("display","inline")}))}),Y.style("font-size",function(e){return c.noPrefixes?i.A.Text.calcFontSize(e.noPrefixName,e.r*n):i.A.Text.calcFontSize(e.data.name,e.r*n)}).text(function(e){return c.noPrefixes?i.A.Text.getTextWithElipsisIfNeeded(e.noPrefixName,e.r*n/3):i.A.Text.getTextWithElipsisIfNeeded(e.data.name,e.r*n/3)})}function M(e){let t=2*e+20;return 2*e/t<.3&&(t=2*e+2),t}function W(e){!e.isInFocusTransitive&&e.parent&&e.parent.isInFocusTransitive?(e.textHidden=this.textContent.indexOf("...")+3===this.textContent.length,this.style.display=""):(e.textHidden=!0,this.style.display="none")}function Z(e,t){if(d(function(){y.showExternalElements=e.data.name===p}),N===e)return;if(e.data.id&&l.history.replaceState({id:e.data.id,skipOnPopState:!0},"classHierarchyPage"+e.data.id,"hierarchy#"+e.data.id),!e.children&&(e=e.parent,N===e))return;if(t&&(L(),s.selectAll(".selected").classed("selected",!1)),N.parent){let e=N;for(;e;)e.isInFocusTransitive=!1,e=e.parent}let n=e;for(;n;)n.isInFocusTransitive=!!n.children,n=n.parent;N=e,2*N.r/(2*N.r+20)<.3||y.currentSliderValue>y.currentBrowserLimit?(V([N.x,N.y,M(N.r)]),Y.each(function(e){W.call(this,e)})):s.transition().duration(f).tween("zoom",function(e){const t=s.interpolateZoom(g,[N.x,N.y,M(N.r)]);return function(e){V(t(e))}}).selectAll("text").each(W)}V([N.x,N.y,M(N.r)],h),b=y.$on("rootFocus",function(){l.history.pushState({id:1},"classHierarchyPage1","hierarchy#1"),D(S)}),F=y.$on("classSearch",function(e){D(e)})}function U(){const t=y.classHierarchyData.classCount;let n=g.get(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);(!n||n>t)&&(n=t,g.set(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE,n)),e.$broadcast("classCount",t,n)}let Y,B,V,M;window.addEventListener("resize",U),window.addEventListener("beforeunload",function e(){window.removeEventListener("resize",U),window.removeEventListener("beforeunload",e)}),y.$watch("classHierarchyData",function(){Y&&Y(),B&&B(),V&&V(),M&&M();let e=w();if(y.classHierarchyData.classCount){U();const t=structuredClone(y.classHierarchyData);const n=s.hierarchy(t).descendants().sort(function(e,t){return e.data.sortingRank>t.data.sortingRank?-1:e.data.sortingRank<t.data.sortingRank||e.data.depth>t.data.depth?1:e.data.depth<t.data.depth?-1:0});let a,r;function i(e,t){const n={keepPrevState:!0,noPrefixes:w()};r=n.noPrefixes,z(a||e,n,N,!0),d(()=>{g.set(x.CLASS_HIERARCHY_SWITCH_PREFIXES,t),k(),A=!1},70)}function c(e,n,s){if(!e)return;g.set(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE,e),a={name:p,children:[]};const c=new Set;for(let t=1;t<=e;t++)c.add(n[t].data.id),n[t].parent===n[0]&&a.children.push(n[t].data);(function e(t){if(!t.children)return;const n=[];for(const e of t.children)c.has(e.id)&&n.push($.extend({},e));t.children=n;for(const n of t.children)e(n)})(a),s?(r=angular.isUndefined(r)?w():r,z(a,{noPrefixes:r})):i(t)}const o=g.get(x.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);if(o)c(o,n);else{const h={doFade:!0,keepPrevState:!0,noPrefixes:w()};z(t,h),k()}let l;Y=y.$watch("hidePrefixes",function(n){angular.isUndefined(n)||e?e=void 0:d(function(){A=!0,function(e){angular.isUndefined(e)||g.set(x.CLASS_HIERARCHY_HIDE_PREFIXES,e)}(n),i(t,!0)},50)},!0),B=y.$watch("currentSliderValue",function(e){c(e,n,!0)},!0),M=y.$on("onEnterKeypressSearchAction",function(e){l&&D(l)}),V=y.$on("searchedClass",function(e,t){l=O[t.name],l&&D(l)})}},!0)}(y)}}}angular.module("graphdb.framework.graphexplore.directives.class",["graphdb.framework.graphexplore.controllers.class","graphdb.framework.utils.localstorageadapter"]).constant("ZOOM_DURATION",500).constant("ROOT_OBJ_NAME","RDF Class Hierarchy").directive("rdfClassHierarchy",l),l.$inject=["$rootScope","$location","GraphDataRestService","$window","$timeout","$repositories","toastr","ZOOM_DURATION","ROOT_OBJ_NAME","LocalStorageAdapter","LSKeys","$translate"]},89687(e,t,n){n.d(t,{A:()=>r});var a=a||{};a.SingleChild={addPlaceholders:function e(t,n){if(t.children){for(var a=0;a<t.children.length;a++)e(t.children[a]);if(1===t.children.length){var r=1.2*t.size;n&&(r=.1*t.children[0].size),t.children.push({name:"placeholder",size:r})}}},removePlaceholders:function e(t){for(var n=t.length-1;n>=0;n--){var a=t[n];"placeholder"===a.data.name?t.splice(n,1):a.children&&e(a.children)}},centerNodes:function(e){for(var t=0;t<e.length;t++){var n=e[t];if(n.children&&1===n.children.length){var a=n.x-n.children[0].x;n.children[0].x+=a,r(n.children[0],a)}}function r(e,t){if(e.children)for(var n=0;n<e.children.length;n++)e.children[n].x+=t,r(e.children[n],t)}},makePositionsRelativeToZero:function(e){for(var t=e[0].x,n=e[0].y,a=0;a<e.length;a++){var r=e[a];r.x-=t,r.y-=n}}};const r=a},66886(e,t,n){n.d(t,{A:()=>i}),n(11014);const a={selectAll:n(44482).selectAll};var r=r||{};r.Export={getCSSRules:function(e){const t=$('link[href="'+e+'"]')[0].sheet.rules;let n="";return _.each(t,function(e){n+=e.cssText}),n},generateBase64ImageSource:function(e){e||(e="svg");const t=a.selectAll(e).attr("version","1.1").attr("xmlns","http://www.w3.org/2000/svg").node().parentNode.innerHTML;return"data:image/svg+xml;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(t)))}};const i=r}};
2
+ //# sourceMappingURL=86099.ab3779d6538a6648b2b7.bundle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"86099.70a92c30b2940c5b5b72.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/graphexplore/directives/rdf-class-hierarchy.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/common/circle-packing.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/common/svg-export.js"],"sourcesContent":["/* eslint-disable no-invalid-this */\nimport d3tip from 'lib/d3-tip/d3-tip-patch';\nimport CirclePacking from 'lib/common/circle-packing';\nimport D3 from 'lib/common/d3-utils';\nimport * as d3 from 'd3';\nimport SVG from 'lib/common/svg-export';\nimport 'angular/utils/local-storage-adapter';\nimport {service, LicenseContextService} from '@ontotext/workbench-api';\n\nangular\n .module('graphdb.framework.graphexplore.directives.class', [\n 'graphdb.framework.graphexplore.controllers.class',\n 'graphdb.framework.utils.localstorageadapter',\n ])\n .constant(\"ZOOM_DURATION\", 500)\n .constant(\"ROOT_OBJ_NAME\", \"RDF Class Hierarchy\")\n .directive('rdfClassHierarchy', classHierarchyDirective);\n\nclassHierarchyDirective.$inject = ['$rootScope', '$location', 'GraphDataRestService', '$window', '$timeout', '$repositories', 'toastr', 'ZOOM_DURATION', 'ROOT_OBJ_NAME', 'LocalStorageAdapter', 'LSKeys', '$translate'];\n\nfunction classHierarchyDirective($rootScope, $location, GraphDataRestService, $window, $timeout, $repositories, toastr, ZOOM_DURATION, ROOT_OBJ_NAME, LocalStorageAdapter, LSKeys, $translate) {\n return {\n restrict: 'AE',\n template: '<div id=\"classChart\"></div>',\n scope: {\n classHierarchyData: '=',\n flattenedClassNames: '=',\n selectedClass: '=',\n currentSliderValue: '=',\n showClassInfoPanel: '=',\n showExternalElements: '=',\n hidePrefixes: '=',\n currentBrowserLimit: '=',\n },\n link: linkFunc,\n };\n\n function linkFunc(scope, element, attrs) {\n renderCirclePacking(scope, element);\n }\n\n function renderCirclePacking(scope, element) {\n /**\n * A boolean flag that determines whether the opening of the side info panel\n * should be suppressed when focusing on the chart while a class is selected.\n */\n let suppressPanelOpen = false;\n\n const width = 800;\n const height = 800;\n const diameter = height;\n const margin = 20;\n let tip;\n let rootHierarchy;\n\n const packLayout = d3.pack()\n .size([diameter - margin, diameter - margin]);\n\n const color = d3.scaleLinear()\n .domain([0, 4])\n .range([\"hsl(19, 70%, 90%)\", \"hsl(19, 70%, 50%)\"])\n .interpolate(d3.interpolateHcl);\n\n const svg = d3.select(\"#classChart\")\n .insert(\"svg:svg\", \"h2\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\")\n .on(\"dblclick.zoom\", null);\n\n function appendMainGroup() {\n return svg.append(\"svg:g\")\n .attrs({\n id: \"main-group\",\n transform: \"translate(\" + width / 2 + \",\" + height / 2 + \")\",\n });\n }\n\n function savePrefixesState(hidePrefixes) {\n if (!angular.isUndefined(hidePrefixes)) {\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_HIDE_PREFIXES, hidePrefixes);\n }\n }\n\n function getPrefixesState() {\n return LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_HIDE_PREFIXES) === \"true\";\n }\n\n /*\n * Prepares SVG document image export by adding xml namespaces and\n * additional style information\n */\n function prepareForSVGImageExport() {\n // get css rules for the diagram\n const cssRules = SVG.Export.getCSSRules(\"css/rdf-class-hierarchy-labels.css?v=3.5.1-TR2\");\n // inline css rules in a defs tag\n d3.selectAll(\"#main-group\")\n .append(\"defs\");\n $(\"defs\").append('<style type=\"text/css\"><![CDATA[' + cssRules + ']]></style>');\n\n // switch opacity to visible\n d3.selectAll(\"g\")\n .style(\"opacity\", 1);\n\n // convert selected html to base64\n const imgSrc = SVG.Export.generateBase64ImageSource(\"#classChart svg\");\n\n // set the binary image and a name for the downloadable file on the export button\n d3.select(this).attrs({\n href: imgSrc,\n download: \"class-hierarchy-\" + $repositories.getActiveRepository() + \".svg\",\n });\n }\n\n scope.hidePrefixes = getPrefixesState();\n\n let g = appendMainGroup();\n\n function fetchClassHierarchy() {\n $rootScope.loader = true;\n $rootScope.hierarchyError = false;\n const selGraphFromCache = LocalStorageAdapter.get(`classHierarchy-selectedGraph-${$repositories.getActiveRepository()}`);\n GraphDataRestService.getClassHierarchyData(selGraphFromCache !== null ? selGraphFromCache.contextID.uri : \"\")\n .success(function(response, status) {\n $rootScope.loader = false;\n if (status === 207) {\n toastr.warning(\n $translate.instant('graphexplore.update.diagram'),\n $translate.instant('graphexplore.repository.data.changed'),\n );\n }\n scope.classHierarchyData = response;\n d3.select(\"#download-svg\").on(\"mouseover\", prepareForSVGImageExport);\n })\n .error(function(response) {\n $rootScope.loader = false;\n $rootScope.hierarchyError = getError(response);\n toastr.error(\n $translate.instant('graphexplore.error.request.failed', {\n name: ROOT_OBJ_NAME,\n error: getError(response),\n }),\n );\n });\n }\n\n const hasData = !!scope.classHierarchyData?.classCount;\n const canUseRepo = $repositories.getActiveRepository() && !$repositories.isSystemRepository();\n\n service(LicenseContextService).onLicenseChanged((license) => {\n if (license?.valid && !hasData && canUseRepo) {\n fetchClassHierarchy();\n }\n });\n\n let autoZoomToPreviousState;\n let doFocus;\n\n let focus;\n let rootFocusEvent;\n let classSearchEvent;\n const flattenedClassData = {};\n\n function drawDiagram(root, config, newFocus, switchPrefixes) {\n if (rootFocusEvent) rootFocusEvent();\n if (classSearchEvent) classSearchEvent();\n // remove old group tag containing the diagram\n d3.selectAll(\"#main-group\").remove();\n\n // append new empty group tag in order to rerender new diagram\n g = appendMainGroup();\n\n // fix for single child classes\n CirclePacking.SingleChild.addPlaceholders(root, true);\n\n rootHierarchy = d3.hierarchy(root);\n rootHierarchy.sum(function(d) {\n return d.size;\n });\n focus = newFocus ? newFocus : rootHierarchy;\n\n packLayout(rootHierarchy);\n\n const nodes = rootHierarchy.descendants();\n let view;\n\n focus.isInFocusTransitive = true;\n\n // fixes for single child classes\n CirclePacking.SingleChild.removePlaceholders(nodes);\n CirclePacking.SingleChild.centerNodes(nodes);\n CirclePacking.SingleChild.makePositionsRelativeToZero(nodes);\n\n if (!tip) {\n tip = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function(d, event) {\n return {\n top: 'inherit',\n bottom: ($window.innerHeight - event.clientY) + 'px',\n right: ($window.innerWidth - event.clientX) + 'px',\n };\n })\n .html(function(d) {\n return d.data.name;\n });\n svg.call(tip);\n }\n\n const circleGroup = g.selectAll(\"circle\")\n .data(nodes)\n .enter().append(\"g\");\n\n if (config.doFade) {\n circleGroup.each(function(d) {\n D3.Transition.fadeIn(d3.select(this), 550);\n });\n }\n\n let flattenedClassNames = [];\n\n const circle = circleGroup\n .append(\"circle\")\n .attr(\"class\", function(d) {\n return d.data.role;\n })\n .attr(\"data-test\", function(d) {\n return \"class-\" + d.data.name;\n })\n .attr(\"guide-selector\", function(d) {\n return \"class-\" + d.data.name;\n })\n .style(\"fill\", function(d) {\n //return colors[d.depth % 6];\n return d.children ? color(d.depth) : \"#E0D0D0\";\n })\n .each(function(d) {\n d.circle = d3.select(this);\n if (d.data.name !== ROOT_OBJ_NAME) {\n const key = d.data.name;\n flattenedClassNames.push({name: key});\n flattenedClassData[[key]] = d;\n\n d.circle.classed(\"rdf-class\", true);\n d.circle.on('mouseover', function(event) {\n if (config.noPrefixes) {\n tip.show(d, event);\n } else if (!d.textHidden) {\n tip.hide(d);\n } else {\n tip.show(d, event);\n }\n });\n d.circle.on('mouseout', tip.hide);\n }\n })\n // custom event used when user is following a guide\n .on(\"gdb-focus\", (event, d) => doFocus(d))\n .on(\"gdb-zoom\", (event, d) => zoom(d));\n\n\n if (flattenedClassNames) {\n flattenedClassNames = _.uniqBy(flattenedClassNames, 'name');\n scope.flattenedClassNames = flattenedClassNames;\n }\n\n let selectedClass;\n\n function getCurrentClassDataAndMarkSelected(obj) {\n d3.selectAll(\".selected\").classed(\"selected\", obj.selected = false);\n obj.circle.classed(\"selected\", obj.selected = true);\n selectedClass = obj;\n }\n\n function showClassInfoPanel() {\n scope.selectedClass = selectedClass;\n scope.showClassInfoPanel = true;\n }\n\n function closeClassInfoPanel() {\n scope.showClassInfoPanel = false;\n }\n\n function goToDomainRangeGraphView() {\n $rootScope.$broadcast('goToDomainRangeGraphView', selectedClass, focus);\n }\n\n const clickCancel = D3.Click.delayDblClick();\n d3.selectAll(\".parent, .topLevelParent, .child, .root\")\n .call(clickCancel);\n\n doFocus = function(obj) {\n zoom(obj);\n\n if (obj.data.name === ROOT_OBJ_NAME) {\n closeClassInfoPanel();\n d3.selectAll(\".selected\").classed(\"selected\", false);\n } else {\n getCurrentClassDataAndMarkSelected(obj);\n if (!suppressPanelOpen) {\n showClassInfoPanel();\n }\n\n // FIXME: is it ok to bind this event handler every time and not just once?\n scope.$on('sidePanelClosed', function(event) {\n d3.selectAll(\".selected\").classed(\"selected\", obj.selected = false);\n });\n }\n\n\n //do not stop event propagation here\n };\n\n clickCancel.on(\"click\", function(event, obj) {\n // add clicked class to browser history\n if (obj.data.id) {\n $window.history.pushState({id: obj.data.id}, \"classHierarchyPage\" + obj.data.id, \"hierarchy#\" + obj.data.id);\n }\n\n //hide current d3-tip tooltip\n tip.hide();\n\n doFocus(obj);\n });\n\n clickCancel.on(\"dblclick\", function(event, obj) {\n if (obj === root) {\n return;\n }\n // hide current d3-tip tooltip in order not to appear in the next view\n tip.hide();\n getCurrentClassDataAndMarkSelected(obj);\n goToDomainRangeGraphView();\n\n event.stopPropagation();\n });\n\n let lastTimeWheel = 0;\n svg.on('wheel', function(event) {\n // hide current d3-tip tooltip\n tip.hide();\n\n event.preventDefault();\n event.stopPropagation();\n\n // at least 100ms must have passed since last time we updated\n const now = Date.now();\n if (now - lastTimeWheel > 100) {\n lastTimeWheel = now;\n } else {\n return;\n }\n\n let direction = '';\n if (event.deltaY <= -1) {\n direction = 'in';\n } else if (event.deltaY >= 1) {\n direction = 'out';\n }\n\n let obj = event.target.__data__;\n\n if (!obj) {\n // scroll outside the big circle\n obj = focus;\n }\n\n if (direction === 'in') {\n // determine object to zoom to\n\n if (obj !== focus) {\n // consider the object on which the scroll event occurred\n // and find the furthest parent that has no focused children\n while (obj.parent && !obj.parent.isInFocusTransitive) {\n obj = obj.parent;\n }\n if (obj.depth < focus.depth) {\n // however if that parent is of lower depth than the focus we ignore it\n obj = focus;\n }\n }\n\n if (obj === focus && obj.children) {\n // if object is in focus and it has children we zoom to its biggest child\n // TODO: sort children on backend\n let newobj = obj.children[0];\n for (let i = 1; i < obj.children.length; i++) {\n if (obj.children[i].sortingRank > newobj.sortingRank) {\n newobj = obj.children[i];\n }\n }\n if (newobj.children) {\n // Use the child only if it has children\n obj = newobj;\n }\n } else if (!obj.children) {\n // If node has no children use its parent instead\n obj = obj.parent;\n }\n\n zoom(obj, true);\n } else if (direction === 'out') {\n // zooming out simply goes one parent up\n obj = focus.parent;\n if (obj) {\n zoom(obj, true);\n }\n }\n\n if (focus.data.name === ROOT_OBJ_NAME) {\n $window.history.replaceState({id: 1}, \"classHierarchyPage1\", \"hierarchy#1\");\n }\n\n // redraw slider on zoom out\n sendSliderData();\n });\n\n const text = g.selectAll(\"text\")\n .data(nodes)\n .enter().append(\"text\")\n .attr(\"class\", function(d) {\n return d.children && d.children.length ? \"label\" : \"label child-label\";\n })\n .each(function(d) {\n d.textSel = d3.select(this);\n });\n\n function trimPrefixes(d) {\n const idx = d.data.name.indexOf(\":\");\n const absUriIdx = d.data.name.indexOf(\"http://\");\n if (absUriIdx > -1) {\n // if we have no prefix available ignore\n d.noPrefixName = d.data.name;\n } else if (idx > -1) {\n d.noPrefixName = d.data.name.substring(idx + 1);\n }\n }\n\n if (config.noPrefixes) {\n text.each(trimPrefixes);\n text\n .style(\"font-size\", function(d) {\n return D3.Text.calcFontSize(d.noPrefixName, d.r);\n })\n .text(function(d) {\n return D3.Text.getTextWithElipsisIfNeeded(d.noPrefixName, d.r / 3);\n });\n } else {\n text\n .style(\"font-size\", function(d) {\n return D3.Text.calcFontSize(d.data.name, d.r);\n })\n .text(function(d) {\n return D3.Text.getTextWithElipsisIfNeeded(d.data.name, d.r / 3);\n });\n }\n\n // TODO: make this use the full version (same as zoom)\n text.style(\"display\", function(d) {\n if (d.parent && d.parent.data === focus.data) {\n d.textHidden = this.textContent.indexOf(\"...\") + 3 === this.textContent.length;\n return null;\n } else {\n d.textHidden = true;\n return \"none\";\n }\n });\n\n if (config.doFade && !config.keepPrevState) {\n text.each(function(d) {\n D3.Transition.fadeIn(d3.select(this), 550);\n });\n }\n\n autoZoomToPreviousState = function() {\n function focusOnCurrentClass(focusHistoryId) {\n if (focusHistoryId) {\n circle.each(function(d) {\n if (+focusHistoryId === d.data.id) {\n doFocus(d);\n }\n });\n }\n }\n\n const focusHistoryId = $location.hash();\n\n $window.onpopstate = function(event) {\n if (event.state && !event.state.skipOnPopState) {\n const focusHistoryId = event.state.id;\n focusOnCurrentClass(focusHistoryId);\n }\n };\n\n focusOnCurrentClass(focusHistoryId);\n };\n\n const node = g.selectAll(\"circle, text\");\n\n function zoomTo(v, switchPrefixes) {\n const k = diameter / v[2];\n view = v;\n\n node.attr(\"transform\", function(d) {\n return \"translate(\" + (d.x - v[0]) * k + \",\" + (d.y - v[1]) * k + \")\";\n });\n\n circle.attr(\"r\", function(d) {\n return d.r * k;\n });\n\n function switchPrefixesInPlace(d) {\n // if uris match with the topLevelParentUri of the focused element\n // or your focus is a top level parent hide its label and if it is not\n // a child element show all of its child labels. If it is a child element\n // only show its label.\n if (d.data.fullName === focus.data.topLevelParentUri || focus.data.topLevelParentUri === ROOT_OBJ_NAME) {\n d.textSel.style(\"display\", \"none\");\n if (focus.children && focus.children.length) {\n _.each(focus.children, function(c) {\n c.textSel.style(\"display\", \"inline\");\n });\n } else {\n focus.textSel.style(\"display\", \"inline\");\n }\n\n // in order to show prefixes of siblings check if the focused\n // element has a parent and show all of its children except\n // for the name of the focused element because you need to see\n // its children\n if (focus.parent) {\n _.each(focus.parent.children, function(c) {\n if (c.data.name !== focus.data.name) {\n c.textSel.style(\"display\", \"inline\");\n }\n });\n }\n }\n }\n\n if (switchPrefixes) {\n text.each(switchPrefixesInPlace);\n }\n\n text\n .style(\"font-size\", function(d) {\n if (config.noPrefixes) {\n return D3.Text.calcFontSize(d.noPrefixName, d.r * k);\n }\n return D3.Text.calcFontSize(d.data.name, d.r * k);\n })\n .text(function(d) {\n if (config.noPrefixes) {\n return D3.Text.getTextWithElipsisIfNeeded(d.noPrefixName, d.r * k / 3);\n }\n return D3.Text.getTextWithElipsisIfNeeded(d.data.name, d.r * k / 3);\n });\n }\n\n\n function adjustRadius(r) {\n let newr = r * 2 + margin;\n if (r * 2 / newr < 0.3) {\n // for very small circles we need to adjust\n newr = r * 2 + 2;\n }\n return newr;\n }\n\n zoomTo([focus.x, focus.y, adjustRadius(focus.r)], switchPrefixes);\n\n function textUpdate(d) {\n if (d.isInFocusTransitive || !(d.parent && d.parent.isInFocusTransitive)) {\n // hide labels of classes that are in focus (including children) OR whose parents aren't in focus\n d.textHidden = true;\n this.style.display = \"none\";\n } else {\n // show all other labels\n d.textHidden = this.textContent.indexOf(\"...\") + 3 === this.textContent.length;\n this.style.display = \"\";\n }\n }\n\n function zoom(d, shouldClosePanel) {\n // use empty timeout to force the following code to be executed on the next $digest cycle\n // in order to avoid '$digest in progress' error\n $timeout(function() {\n scope.showExternalElements = (d.data.name === ROOT_OBJ_NAME);\n });\n\n if (focus === d) {\n // Node is already zoomed to\n // Important to return before we modify the history, otherwise we choke the browser\n return;\n }\n\n if (d.data.id) {\n // Set the `skipOnPopState` flag so the popstate handler ignores this history update,\n // preventing a recursive history state change triggered by the zoom operation.\n $window.history.replaceState({id: d.data.id, skipOnPopState: true}, \"classHierarchyPage\" + d.data.id, \"hierarchy#\" + d.data.id);\n }\n\n if (!d.children) {\n // No children - zoom to parent instead\n d = d.parent;\n if (focus === d) {\n // Parent is already zoomed to\n return;\n }\n }\n\n if (shouldClosePanel) {\n closeClassInfoPanel();\n d3.selectAll(\".selected\").classed(\"selected\", false);\n }\n\n if (focus.parent) {\n let p = focus;\n while (p) {\n p.isInFocusTransitive = false;\n p = p.parent;\n }\n }\n\n let p = d;\n while (p) {\n p.isInFocusTransitive = !!p.children;\n p = p.parent;\n }\n\n focus = d;\n\n const isVerySmallCircle = focus.r * 2 / (focus.r * 2 + margin) < 0.3;\n\n if (isVerySmallCircle || scope.currentSliderValue > scope.currentBrowserLimit) {\n // no fancy animation for slower browsers if above the limit or if zooming to a very small circle\n zoomTo([focus.x, focus.y, adjustRadius(focus.r)]);\n\n text.each(function(d) {\n textUpdate.call(this, d);\n });\n } else {\n // the fancy version for faster browsers\n const transition = d3.transition()\n .duration(ZOOM_DURATION)\n .tween(\"zoom\", function(d) {\n const i = d3.interpolateZoom(view, [focus.x, focus.y, adjustRadius(focus.r)]);\n return function(t) {\n zoomTo(i(t));\n };\n });\n\n transition.selectAll(\"text\")\n // Experimental: hide texts to be hidden on \"start\", show texts to be shown on \"end\"\n .each(textUpdate);\n }\n }\n\n rootFocusEvent = scope.$on('rootFocus', function() {\n $window.history.pushState({id: 1}, \"classHierarchyPage1\", \"hierarchy#1\");\n doFocus(rootHierarchy);\n });\n\n classSearchEvent = scope.$on('classSearch', function(selectedClass) {\n doFocus(selectedClass);\n });\n }\n\n function sendSliderData() {\n const currentClassCount = scope.classHierarchyData.classCount;\n let currentSliderValue = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);\n\n if (!currentSliderValue || currentSliderValue > currentClassCount) {\n currentSliderValue = currentClassCount;\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE, currentSliderValue);\n }\n\n $rootScope.$broadcast(\"classCount\", currentClassCount, currentSliderValue);\n }\n\n window.addEventListener('resize', sendSliderData);\n\n window.addEventListener('beforeunload', removeResizeListener);\n\n function removeResizeListener() {\n window.removeEventListener('resize', sendSliderData);\n window.removeEventListener('beforeunload', removeResizeListener);\n }\n\n let prefixesWatch;\n let currentClassCountWatch;\n let searchedClassBroadcast;\n let onEnterClassSearchBroadcast;\n\n scope.$watch('classHierarchyData', function() {\n // when data changes unregister watchers by calling them\n if (prefixesWatch) prefixesWatch();\n if (currentClassCountWatch) currentClassCountWatch();\n if (searchedClassBroadcast) searchedClassBroadcast();\n if (onEnterClassSearchBroadcast) onEnterClassSearchBroadcast();\n\n // get initial state of prefixes (hidden or not) when changing repositories\n // in order to avoid triggering an unwanted prefixes watch\n let initialPrefixesState = getPrefixesState();\n\n if (scope.classHierarchyData.classCount) {\n sendSliderData();\n\n const rootData = structuredClone(scope.classHierarchyData);\n\n const root = d3.hierarchy(rootData);\n\n function sortRoot(root) {\n // add all classes to a flat array, add parent information\n // and sort according to instancesCount DESC, depth ASC\n\n return root.descendants()\n .sort(function(a, b) {\n if (a.data.sortingRank > b.data.sortingRank) {\n return -1;\n } else if (a.data.sortingRank < b.data.sortingRank) {\n return 1;\n } else if (a.data.depth > b.data.depth) {\n return 1;\n } else if (a.data.depth < b.data.depth) {\n return -1;\n } else {\n return 0;\n }\n });\n }\n\n const sortedChildren = sortRoot(root);\n\n // we start with an empty new rootData\n let filteredRootData;\n let noPrefixesGlobal;\n\n\n function restoreDiagramState(currentRootData, switchPrefixes) {\n const prefixesConfig = {\n keepPrevState: true,\n noPrefixes: getPrefixesState(),\n };\n\n // get noPrefixes flag from drawDiagram configuration params\n noPrefixesGlobal = prefixesConfig.noPrefixes;\n\n if (filteredRootData) {\n drawDiagram(filteredRootData, prefixesConfig, focus, true);\n } else {\n drawDiagram(currentRootData, prefixesConfig, focus, true);\n }\n\n $timeout(() => {\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_SWITCH_PREFIXES, switchPrefixes);\n autoZoomToPreviousState();\n // Need to set this to false to enable the info panel to work when selecting a class.\n // The panel opening will be suppressed only when the prefixes are toggled.\n suppressPanelOpen = false;\n }, 70);\n }\n\n function redrawFilteredDiagram(currentSliderValue, sortedChildrenArray, useSlider) {\n if (!currentSliderValue) {\n return;\n }\n\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE, currentSliderValue);\n\n filteredRootData = {\n name: ROOT_OBJ_NAME,\n children: [],\n };\n\n // walk through the given count of (sortedChildrenArray) classes\n // - record the id of each class we've seen\n // - add the rootData level classes to the new rootData\n const addedIds = new Set();\n for (let k = 1; k <= currentSliderValue; k++) {\n addedIds.add(sortedChildrenArray[k].data.id);\n if (sortedChildrenArray[k].parent === sortedChildrenArray[0]) { // i.e. the parent is the \"class hierarchy\"\n filteredRootData.children.push(sortedChildrenArray[k].data);\n }\n }\n\n // walk through all the classes in the new rootData and only keep those that have an \"added id\"\n // we create separate copies of the arrays in order not to contaminate the original data\n // we also copy each class's object ($.extend ...) for the same reason\n function fixChildren(node) {\n if (!node.children) {\n return;\n }\n const newChildren = [];\n for (const child of node.children) {\n if (addedIds.has(child.id)) {\n newChildren.push($.extend({}, child));\n }\n }\n node.children = newChildren;\n for (const child of node.children) {\n fixChildren(child);\n }\n }\n\n fixChildren(filteredRootData);\n\n if (useSlider) {\n // redraw diagram when slider value changes and persist current state\n // in local storage\n noPrefixesGlobal = angular.isUndefined(noPrefixesGlobal) ? getPrefixesState() : noPrefixesGlobal;\n const redrawConfig = {\n noPrefixes: noPrefixesGlobal,\n };\n drawDiagram(filteredRootData, redrawConfig);\n } else {\n // if the user returns to the diagram with back browser button\n // read the saved state (show/hide prefixes, current slider value)\n // from local storage and render the diagram according to the saved metrics\n restoreDiagramState(rootData);\n }\n }\n\n const currentSliderValue = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);\n if (currentSliderValue) {\n redrawFilteredDiagram(currentSliderValue, sortedChildren);\n } else {\n const basicConfig = {\n doFade: true,\n keepPrevState: true,\n noPrefixes: getPrefixesState(),\n };\n drawDiagram(rootData, basicConfig);\n autoZoomToPreviousState();\n }\n\n prefixesWatch = scope.$watch('hidePrefixes', function(hidePrefixes) {\n if (angular.isUndefined(hidePrefixes) || initialPrefixesState) {\n initialPrefixesState = undefined;\n return;\n }\n // if digest overflows a possible fix might be wrapping this in $timeout\n $timeout(function() {\n suppressPanelOpen = true;\n savePrefixesState(hidePrefixes);\n restoreDiagramState(rootData, true);\n }, 50);\n }, true);\n\n currentClassCountWatch = scope.$watch('currentSliderValue', function(currentSliderValue) {\n redrawFilteredDiagram(currentSliderValue, sortedChildren, true);\n }, true);\n\n // we handle this event for the cases where we already have searched for a given class and\n // hit enter again on the already selected class in order again react and zoom to it again\n // if we are not at the moment\n let currentSearchedClass;\n onEnterClassSearchBroadcast = scope.$on('onEnterKeypressSearchAction', function(event) {\n if (currentSearchedClass) {\n doFocus(currentSearchedClass);\n }\n });\n\n searchedClassBroadcast = scope.$on('searchedClass', function(event, searchedClass) {\n currentSearchedClass = flattenedClassData[searchedClass.name];\n if (currentSearchedClass) {\n doFocus(currentSearchedClass);\n }\n });\n }\n }, true);\n }\n}\n","var CirclePacking = CirclePacking || {};\n\nCirclePacking.SingleChild = function () {\n /*\n Functions that enable single child circles to display properly, see\n http://stackoverflow.com/questions/22307486/d3-js-packed-circle-layout-how-to-adjust-child-radius\n */\n function addPlaceholders(node, first) {\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n var child = node.children[i];\n addPlaceholders(child);\n }\n\n if (node.children.length === 1) {\n var placeholderSize = node.size * 1.2;\n if (first) {\n placeholderSize = node.children[0].size * 0.1;\n }\n node.children.push({\n name: 'placeholder', size: placeholderSize,\n // children: []\n });\n }\n }\n }\n\n function removePlaceholders(nodes) {\n for (var i = nodes.length - 1; i >= 0; i--) {\n var node = nodes[i];\n\n if (node.data.name === 'placeholder') {\n nodes.splice(i, 1);\n } else {\n if (node.children) {\n removePlaceholders(node.children);\n }\n }\n }\n }\n\n function centerNodes(nodes) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n\n if (node.children) {\n if (node.children.length === 1) {\n var offset = node.x - node.children[0].x;\n node.children[0].x += offset;\n reposition(node.children[0], offset);\n }\n }\n }\n\n function reposition(node, offset) {\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n node.children[i].x += offset;\n reposition(node.children[i], offset);\n }\n }\n }\n }\n\n function makePositionsRelativeToZero(nodes) {\n //use this to have vis centered at 0,0,0 (easier for positioning)\n var offsetX = nodes[0].x;\n var offsetY = nodes[0].y;\n\n for (var i = 0; i < nodes.length; i++) {\n\n var node = nodes[i];\n\n node.x -= offsetX;\n node.y -= offsetY;\n }\n }\n\n return {\n addPlaceholders: addPlaceholders,\n removePlaceholders: removePlaceholders,\n centerNodes: centerNodes,\n makePositionsRelativeToZero: makePositionsRelativeToZero\n }\n}();\n\nexport default CirclePacking;\n","import 'lib/d3.patch.js'\nimport {selectAll} from 'd3';\n\nconst d3 = {selectAll};\nvar SVG = SVG || {};\n\nSVG.Export = function () {\n function getCSSRules(cssSourceFilePath) {\n const cssRules = $('link[href=\"' + cssSourceFilePath + '\"]')[0].sheet.rules;\n let cssStr = \"\";\n _.each(cssRules, function (value) {\n cssStr += value.cssText;\n });\n return cssStr;\n }\n\n function generateBase64ImageSource(svgSelectorClass) {\n if (!svgSelectorClass) {\n svgSelectorClass = \"svg\";\n }\n // add needed xml namespace\n const exportSvg = d3.selectAll(svgSelectorClass)\n .attr(\"version\", \"1.1\")\n .attr(\"xmlns\", \"http://www.w3.org/2000/svg\")\n .node().parentNode.innerHTML;\n\n // convert selected html to base64\n return \"data:image/svg+xml;charset=utf-8;base64,\" + btoa(unescape(encodeURIComponent(exportSvg)));\n }\n\n return {\n getCSSRules: getCSSRules,\n generateBase64ImageSource: generateBase64ImageSource\n };\n}();\n\nexport default SVG;\n"],"names":["classHierarchyDirective","$rootScope","$location","GraphDataRestService","$window","$timeout","$repositories","toastr","ZOOM_DURATION","ROOT_OBJ_NAME","LocalStorageAdapter","LSKeys","$translate","restrict","template","scope","classHierarchyData","flattenedClassNames","selectedClass","currentSliderValue","showClassInfoPanel","showExternalElements","hidePrefixes","currentBrowserLimit","link","element","attrs","suppressPanelOpen","tip","rootHierarchy","packLayout","d3","size","diameter","color","domain","range","interpolate","svg","insert","attr","on","appendMainGroup","append","id","transform","getPrefixesState","get","CLASS_HIERARCHY_HIDE_PREFIXES","prepareForSVGImageExport","cssRules","SVG","Export","getCSSRules","$","style","imgSrc","generateBase64ImageSource","this","href","download","getActiveRepository","g","hasData","classCount","canUseRepo","isSystemRepository","autoZoomToPreviousState","doFocus","focus","rootFocusEvent","classSearchEvent","service","LicenseContextService","onLicenseChanged","license","valid","loader","hierarchyError","selGraphFromCache","getClassHierarchyData","contextID","uri","success","response","status","warning","instant","error","getError","name","fetchClassHierarchy","flattenedClassData","drawDiagram","root","config","newFocus","switchPrefixes","remove","CirclePacking","SingleChild","addPlaceholders","sum","d","nodes","descendants","view","isInFocusTransitive","removePlaceholders","centerNodes","makePositionsRelativeToZero","d3tip","customPosition","event","top","bottom","innerHeight","clientY","right","innerWidth","clientX","html","data","call","circleGroup","selectAll","enter","doFade","each","D3","Transition","fadeIn","circle","role","children","depth","key","push","classed","noPrefixes","textHidden","show","hide","zoom","getCurrentClassDataAndMarkSelected","obj","selected","closeClassInfoPanel","_","uniqBy","clickCancel","Click","delayDblClick","$on","history","pushState","$broadcast","stopPropagation","lastTimeWheel","preventDefault","now","Date","direction","deltaY","target","__data__","parent","newobj","i","length","sortingRank","replaceState","sendSliderData","text","textSel","idx","indexOf","noPrefixName","substring","Text","calcFontSize","r","getTextWithElipsisIfNeeded","textContent","keepPrevState","focusOnCurrentClass","focusHistoryId","hash","onpopstate","state","skipOnPopState","node","zoomTo","v","k","x","y","fullName","topLevelParentUri","c","adjustRadius","newr","textUpdate","display","shouldClosePanel","p","duration","tween","t","currentClassCount","CLASS_HIERARCHY_CURRENT_SLIDER_VALUE","set","prefixesWatch","currentClassCountWatch","searchedClassBroadcast","onEnterClassSearchBroadcast","window","addEventListener","removeResizeListener","removeEventListener","$watch","initialPrefixesState","rootData","structuredClone","sortedChildren","sort","a","b","filteredRootData","noPrefixesGlobal","restoreDiagramState","currentRootData","prefixesConfig","CLASS_HIERARCHY_SWITCH_PREFIXES","redrawFilteredDiagram","sortedChildrenArray","useSlider","addedIds","Set","add","fixChildren","newChildren","child","has","extend","angular","isUndefined","basicConfig","currentSearchedClass","undefined","savePrefixesState","searchedClass","renderCirclePacking","module","constant","directive","$inject","first","placeholderSize","splice","offset","reposition","offsetX","offsetY","cssSourceFilePath","sheet","rules","cssStr","value","cssText","svgSelectorClass","exportSvg","parentNode","innerHTML","btoa","unescape","encodeURIComponent"],"sourceRoot":""}
1
+ {"version":3,"file":"86099.ab3779d6538a6648b2b7.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/graphexplore/directives/rdf-class-hierarchy.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/common/circle-packing.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/common/svg-export.js"],"sourcesContent":["/* eslint-disable no-invalid-this */\nimport d3tip from 'lib/d3-tip/d3-tip-patch';\nimport CirclePacking from 'lib/common/circle-packing';\nimport D3 from 'lib/common/d3-utils';\nimport * as d3 from 'd3';\nimport SVG from 'lib/common/svg-export';\nimport 'angular/utils/local-storage-adapter';\nimport {service, LicenseContextService} from '@ontotext/workbench-api';\n\nangular\n .module('graphdb.framework.graphexplore.directives.class', [\n 'graphdb.framework.graphexplore.controllers.class',\n 'graphdb.framework.utils.localstorageadapter',\n ])\n .constant(\"ZOOM_DURATION\", 500)\n .constant(\"ROOT_OBJ_NAME\", \"RDF Class Hierarchy\")\n .directive('rdfClassHierarchy', classHierarchyDirective);\n\nclassHierarchyDirective.$inject = ['$rootScope', '$location', 'GraphDataRestService', '$window', '$timeout', '$repositories', 'toastr', 'ZOOM_DURATION', 'ROOT_OBJ_NAME', 'LocalStorageAdapter', 'LSKeys', '$translate'];\n\nfunction classHierarchyDirective($rootScope, $location, GraphDataRestService, $window, $timeout, $repositories, toastr, ZOOM_DURATION, ROOT_OBJ_NAME, LocalStorageAdapter, LSKeys, $translate) {\n return {\n restrict: 'AE',\n template: '<div id=\"classChart\"></div>',\n scope: {\n classHierarchyData: '=',\n flattenedClassNames: '=',\n selectedClass: '=',\n currentSliderValue: '=',\n showClassInfoPanel: '=',\n showExternalElements: '=',\n hidePrefixes: '=',\n currentBrowserLimit: '=',\n },\n link: linkFunc,\n };\n\n function linkFunc(scope, element, attrs) {\n renderCirclePacking(scope, element);\n }\n\n function renderCirclePacking(scope, element) {\n /**\n * A boolean flag that determines whether the opening of the side info panel\n * should be suppressed when focusing on the chart while a class is selected.\n */\n let suppressPanelOpen = false;\n\n const width = 800;\n const height = 800;\n const diameter = height;\n const margin = 20;\n let tip;\n let rootHierarchy;\n\n const packLayout = d3.pack()\n .size([diameter - margin, diameter - margin]);\n\n const color = d3.scaleLinear()\n .domain([0, 4])\n .range([\"hsl(19, 70%, 90%)\", \"hsl(19, 70%, 50%)\"])\n .interpolate(d3.interpolateHcl);\n\n const svg = d3.select(\"#classChart\")\n .insert(\"svg:svg\", \"h2\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\")\n .on(\"dblclick.zoom\", null);\n\n function appendMainGroup() {\n return svg.append(\"svg:g\")\n .attrs({\n id: \"main-group\",\n transform: \"translate(\" + width / 2 + \",\" + height / 2 + \")\",\n });\n }\n\n function savePrefixesState(hidePrefixes) {\n if (!angular.isUndefined(hidePrefixes)) {\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_HIDE_PREFIXES, hidePrefixes);\n }\n }\n\n function getPrefixesState() {\n return LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_HIDE_PREFIXES) === \"true\";\n }\n\n /*\n * Prepares SVG document image export by adding xml namespaces and\n * additional style information\n */\n function prepareForSVGImageExport() {\n // get css rules for the diagram\n const cssRules = SVG.Export.getCSSRules(\"css/rdf-class-hierarchy-labels.css?v=3.5.1-TR3\");\n // inline css rules in a defs tag\n d3.selectAll(\"#main-group\")\n .append(\"defs\");\n $(\"defs\").append('<style type=\"text/css\"><![CDATA[' + cssRules + ']]></style>');\n\n // switch opacity to visible\n d3.selectAll(\"g\")\n .style(\"opacity\", 1);\n\n // convert selected html to base64\n const imgSrc = SVG.Export.generateBase64ImageSource(\"#classChart svg\");\n\n // set the binary image and a name for the downloadable file on the export button\n d3.select(this).attrs({\n href: imgSrc,\n download: \"class-hierarchy-\" + $repositories.getActiveRepository() + \".svg\",\n });\n }\n\n scope.hidePrefixes = getPrefixesState();\n\n let g = appendMainGroup();\n\n function fetchClassHierarchy() {\n $rootScope.loader = true;\n $rootScope.hierarchyError = false;\n const selGraphFromCache = LocalStorageAdapter.get(`classHierarchy-selectedGraph-${$repositories.getActiveRepository()}`);\n GraphDataRestService.getClassHierarchyData(selGraphFromCache !== null ? selGraphFromCache.contextID.uri : \"\")\n .success(function(response, status) {\n $rootScope.loader = false;\n if (status === 207) {\n toastr.warning(\n $translate.instant('graphexplore.update.diagram'),\n $translate.instant('graphexplore.repository.data.changed'),\n );\n }\n scope.classHierarchyData = response;\n d3.select(\"#download-svg\").on(\"mouseover\", prepareForSVGImageExport);\n })\n .error(function(response) {\n $rootScope.loader = false;\n $rootScope.hierarchyError = getError(response);\n toastr.error(\n $translate.instant('graphexplore.error.request.failed', {\n name: ROOT_OBJ_NAME,\n error: getError(response),\n }),\n );\n });\n }\n\n const hasData = !!scope.classHierarchyData?.classCount;\n const canUseRepo = $repositories.getActiveRepository() && !$repositories.isSystemRepository();\n\n service(LicenseContextService).onLicenseChanged((license) => {\n if (license?.valid && !hasData && canUseRepo) {\n fetchClassHierarchy();\n }\n });\n\n let autoZoomToPreviousState;\n let doFocus;\n\n let focus;\n let rootFocusEvent;\n let classSearchEvent;\n const flattenedClassData = {};\n\n function drawDiagram(root, config, newFocus, switchPrefixes) {\n if (rootFocusEvent) rootFocusEvent();\n if (classSearchEvent) classSearchEvent();\n // remove old group tag containing the diagram\n d3.selectAll(\"#main-group\").remove();\n\n // append new empty group tag in order to rerender new diagram\n g = appendMainGroup();\n\n // fix for single child classes\n CirclePacking.SingleChild.addPlaceholders(root, true);\n\n rootHierarchy = d3.hierarchy(root);\n rootHierarchy.sum(function(d) {\n return d.size;\n });\n focus = newFocus ? newFocus : rootHierarchy;\n\n packLayout(rootHierarchy);\n\n const nodes = rootHierarchy.descendants();\n let view;\n\n focus.isInFocusTransitive = true;\n\n // fixes for single child classes\n CirclePacking.SingleChild.removePlaceholders(nodes);\n CirclePacking.SingleChild.centerNodes(nodes);\n CirclePacking.SingleChild.makePositionsRelativeToZero(nodes);\n\n if (!tip) {\n tip = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function(d, event) {\n return {\n top: 'inherit',\n bottom: ($window.innerHeight - event.clientY) + 'px',\n right: ($window.innerWidth - event.clientX) + 'px',\n };\n })\n .html(function(d) {\n return d.data.name;\n });\n svg.call(tip);\n }\n\n const circleGroup = g.selectAll(\"circle\")\n .data(nodes)\n .enter().append(\"g\");\n\n if (config.doFade) {\n circleGroup.each(function(d) {\n D3.Transition.fadeIn(d3.select(this), 550);\n });\n }\n\n let flattenedClassNames = [];\n\n const circle = circleGroup\n .append(\"circle\")\n .attr(\"class\", function(d) {\n return d.data.role;\n })\n .attr(\"data-test\", function(d) {\n return \"class-\" + d.data.name;\n })\n .attr(\"guide-selector\", function(d) {\n return \"class-\" + d.data.name;\n })\n .style(\"fill\", function(d) {\n //return colors[d.depth % 6];\n return d.children ? color(d.depth) : \"#E0D0D0\";\n })\n .each(function(d) {\n d.circle = d3.select(this);\n if (d.data.name !== ROOT_OBJ_NAME) {\n const key = d.data.name;\n flattenedClassNames.push({name: key});\n flattenedClassData[[key]] = d;\n\n d.circle.classed(\"rdf-class\", true);\n d.circle.on('mouseover', function(event) {\n if (config.noPrefixes) {\n tip.show(d, event);\n } else if (!d.textHidden) {\n tip.hide(d);\n } else {\n tip.show(d, event);\n }\n });\n d.circle.on('mouseout', tip.hide);\n }\n })\n // custom event used when user is following a guide\n .on(\"gdb-focus\", (event, d) => doFocus(d))\n .on(\"gdb-zoom\", (event, d) => zoom(d));\n\n\n if (flattenedClassNames) {\n flattenedClassNames = _.uniqBy(flattenedClassNames, 'name');\n scope.flattenedClassNames = flattenedClassNames;\n }\n\n let selectedClass;\n\n function getCurrentClassDataAndMarkSelected(obj) {\n d3.selectAll(\".selected\").classed(\"selected\", obj.selected = false);\n obj.circle.classed(\"selected\", obj.selected = true);\n selectedClass = obj;\n }\n\n function showClassInfoPanel() {\n scope.selectedClass = selectedClass;\n scope.showClassInfoPanel = true;\n }\n\n function closeClassInfoPanel() {\n scope.showClassInfoPanel = false;\n }\n\n function goToDomainRangeGraphView() {\n $rootScope.$broadcast('goToDomainRangeGraphView', selectedClass, focus);\n }\n\n const clickCancel = D3.Click.delayDblClick();\n d3.selectAll(\".parent, .topLevelParent, .child, .root\")\n .call(clickCancel);\n\n doFocus = function(obj) {\n zoom(obj);\n\n if (obj.data.name === ROOT_OBJ_NAME) {\n closeClassInfoPanel();\n d3.selectAll(\".selected\").classed(\"selected\", false);\n } else {\n getCurrentClassDataAndMarkSelected(obj);\n if (!suppressPanelOpen) {\n showClassInfoPanel();\n }\n\n // FIXME: is it ok to bind this event handler every time and not just once?\n scope.$on('sidePanelClosed', function(event) {\n d3.selectAll(\".selected\").classed(\"selected\", obj.selected = false);\n });\n }\n\n\n //do not stop event propagation here\n };\n\n clickCancel.on(\"click\", function(event, obj) {\n // add clicked class to browser history\n if (obj.data.id) {\n $window.history.pushState({id: obj.data.id}, \"classHierarchyPage\" + obj.data.id, \"hierarchy#\" + obj.data.id);\n }\n\n //hide current d3-tip tooltip\n tip.hide();\n\n doFocus(obj);\n });\n\n clickCancel.on(\"dblclick\", function(event, obj) {\n if (obj === root) {\n return;\n }\n // hide current d3-tip tooltip in order not to appear in the next view\n tip.hide();\n getCurrentClassDataAndMarkSelected(obj);\n goToDomainRangeGraphView();\n\n event.stopPropagation();\n });\n\n let lastTimeWheel = 0;\n svg.on('wheel', function(event) {\n // hide current d3-tip tooltip\n tip.hide();\n\n event.preventDefault();\n event.stopPropagation();\n\n // at least 100ms must have passed since last time we updated\n const now = Date.now();\n if (now - lastTimeWheel > 100) {\n lastTimeWheel = now;\n } else {\n return;\n }\n\n let direction = '';\n if (event.deltaY <= -1) {\n direction = 'in';\n } else if (event.deltaY >= 1) {\n direction = 'out';\n }\n\n let obj = event.target.__data__;\n\n if (!obj) {\n // scroll outside the big circle\n obj = focus;\n }\n\n if (direction === 'in') {\n // determine object to zoom to\n\n if (obj !== focus) {\n // consider the object on which the scroll event occurred\n // and find the furthest parent that has no focused children\n while (obj.parent && !obj.parent.isInFocusTransitive) {\n obj = obj.parent;\n }\n if (obj.depth < focus.depth) {\n // however if that parent is of lower depth than the focus we ignore it\n obj = focus;\n }\n }\n\n if (obj === focus && obj.children) {\n // if object is in focus and it has children we zoom to its biggest child\n // TODO: sort children on backend\n let newobj = obj.children[0];\n for (let i = 1; i < obj.children.length; i++) {\n if (obj.children[i].sortingRank > newobj.sortingRank) {\n newobj = obj.children[i];\n }\n }\n if (newobj.children) {\n // Use the child only if it has children\n obj = newobj;\n }\n } else if (!obj.children) {\n // If node has no children use its parent instead\n obj = obj.parent;\n }\n\n zoom(obj, true);\n } else if (direction === 'out') {\n // zooming out simply goes one parent up\n obj = focus.parent;\n if (obj) {\n zoom(obj, true);\n }\n }\n\n if (focus.data.name === ROOT_OBJ_NAME) {\n $window.history.replaceState({id: 1}, \"classHierarchyPage1\", \"hierarchy#1\");\n }\n\n // redraw slider on zoom out\n sendSliderData();\n });\n\n const text = g.selectAll(\"text\")\n .data(nodes)\n .enter().append(\"text\")\n .attr(\"class\", function(d) {\n return d.children && d.children.length ? \"label\" : \"label child-label\";\n })\n .each(function(d) {\n d.textSel = d3.select(this);\n });\n\n function trimPrefixes(d) {\n const idx = d.data.name.indexOf(\":\");\n const absUriIdx = d.data.name.indexOf(\"http://\");\n if (absUriIdx > -1) {\n // if we have no prefix available ignore\n d.noPrefixName = d.data.name;\n } else if (idx > -1) {\n d.noPrefixName = d.data.name.substring(idx + 1);\n }\n }\n\n if (config.noPrefixes) {\n text.each(trimPrefixes);\n text\n .style(\"font-size\", function(d) {\n return D3.Text.calcFontSize(d.noPrefixName, d.r);\n })\n .text(function(d) {\n return D3.Text.getTextWithElipsisIfNeeded(d.noPrefixName, d.r / 3);\n });\n } else {\n text\n .style(\"font-size\", function(d) {\n return D3.Text.calcFontSize(d.data.name, d.r);\n })\n .text(function(d) {\n return D3.Text.getTextWithElipsisIfNeeded(d.data.name, d.r / 3);\n });\n }\n\n // TODO: make this use the full version (same as zoom)\n text.style(\"display\", function(d) {\n if (d.parent && d.parent.data === focus.data) {\n d.textHidden = this.textContent.indexOf(\"...\") + 3 === this.textContent.length;\n return null;\n } else {\n d.textHidden = true;\n return \"none\";\n }\n });\n\n if (config.doFade && !config.keepPrevState) {\n text.each(function(d) {\n D3.Transition.fadeIn(d3.select(this), 550);\n });\n }\n\n autoZoomToPreviousState = function() {\n function focusOnCurrentClass(focusHistoryId) {\n if (focusHistoryId) {\n circle.each(function(d) {\n if (+focusHistoryId === d.data.id) {\n doFocus(d);\n }\n });\n }\n }\n\n const focusHistoryId = $location.hash();\n\n $window.onpopstate = function(event) {\n if (event.state && !event.state.skipOnPopState) {\n const focusHistoryId = event.state.id;\n focusOnCurrentClass(focusHistoryId);\n }\n };\n\n focusOnCurrentClass(focusHistoryId);\n };\n\n const node = g.selectAll(\"circle, text\");\n\n function zoomTo(v, switchPrefixes) {\n const k = diameter / v[2];\n view = v;\n\n node.attr(\"transform\", function(d) {\n return \"translate(\" + (d.x - v[0]) * k + \",\" + (d.y - v[1]) * k + \")\";\n });\n\n circle.attr(\"r\", function(d) {\n return d.r * k;\n });\n\n function switchPrefixesInPlace(d) {\n // if uris match with the topLevelParentUri of the focused element\n // or your focus is a top level parent hide its label and if it is not\n // a child element show all of its child labels. If it is a child element\n // only show its label.\n if (d.data.fullName === focus.data.topLevelParentUri || focus.data.topLevelParentUri === ROOT_OBJ_NAME) {\n d.textSel.style(\"display\", \"none\");\n if (focus.children && focus.children.length) {\n _.each(focus.children, function(c) {\n c.textSel.style(\"display\", \"inline\");\n });\n } else {\n focus.textSel.style(\"display\", \"inline\");\n }\n\n // in order to show prefixes of siblings check if the focused\n // element has a parent and show all of its children except\n // for the name of the focused element because you need to see\n // its children\n if (focus.parent) {\n _.each(focus.parent.children, function(c) {\n if (c.data.name !== focus.data.name) {\n c.textSel.style(\"display\", \"inline\");\n }\n });\n }\n }\n }\n\n if (switchPrefixes) {\n text.each(switchPrefixesInPlace);\n }\n\n text\n .style(\"font-size\", function(d) {\n if (config.noPrefixes) {\n return D3.Text.calcFontSize(d.noPrefixName, d.r * k);\n }\n return D3.Text.calcFontSize(d.data.name, d.r * k);\n })\n .text(function(d) {\n if (config.noPrefixes) {\n return D3.Text.getTextWithElipsisIfNeeded(d.noPrefixName, d.r * k / 3);\n }\n return D3.Text.getTextWithElipsisIfNeeded(d.data.name, d.r * k / 3);\n });\n }\n\n\n function adjustRadius(r) {\n let newr = r * 2 + margin;\n if (r * 2 / newr < 0.3) {\n // for very small circles we need to adjust\n newr = r * 2 + 2;\n }\n return newr;\n }\n\n zoomTo([focus.x, focus.y, adjustRadius(focus.r)], switchPrefixes);\n\n function textUpdate(d) {\n if (d.isInFocusTransitive || !(d.parent && d.parent.isInFocusTransitive)) {\n // hide labels of classes that are in focus (including children) OR whose parents aren't in focus\n d.textHidden = true;\n this.style.display = \"none\";\n } else {\n // show all other labels\n d.textHidden = this.textContent.indexOf(\"...\") + 3 === this.textContent.length;\n this.style.display = \"\";\n }\n }\n\n function zoom(d, shouldClosePanel) {\n // use empty timeout to force the following code to be executed on the next $digest cycle\n // in order to avoid '$digest in progress' error\n $timeout(function() {\n scope.showExternalElements = (d.data.name === ROOT_OBJ_NAME);\n });\n\n if (focus === d) {\n // Node is already zoomed to\n // Important to return before we modify the history, otherwise we choke the browser\n return;\n }\n\n if (d.data.id) {\n // Set the `skipOnPopState` flag so the popstate handler ignores this history update,\n // preventing a recursive history state change triggered by the zoom operation.\n $window.history.replaceState({id: d.data.id, skipOnPopState: true}, \"classHierarchyPage\" + d.data.id, \"hierarchy#\" + d.data.id);\n }\n\n if (!d.children) {\n // No children - zoom to parent instead\n d = d.parent;\n if (focus === d) {\n // Parent is already zoomed to\n return;\n }\n }\n\n if (shouldClosePanel) {\n closeClassInfoPanel();\n d3.selectAll(\".selected\").classed(\"selected\", false);\n }\n\n if (focus.parent) {\n let p = focus;\n while (p) {\n p.isInFocusTransitive = false;\n p = p.parent;\n }\n }\n\n let p = d;\n while (p) {\n p.isInFocusTransitive = !!p.children;\n p = p.parent;\n }\n\n focus = d;\n\n const isVerySmallCircle = focus.r * 2 / (focus.r * 2 + margin) < 0.3;\n\n if (isVerySmallCircle || scope.currentSliderValue > scope.currentBrowserLimit) {\n // no fancy animation for slower browsers if above the limit or if zooming to a very small circle\n zoomTo([focus.x, focus.y, adjustRadius(focus.r)]);\n\n text.each(function(d) {\n textUpdate.call(this, d);\n });\n } else {\n // the fancy version for faster browsers\n const transition = d3.transition()\n .duration(ZOOM_DURATION)\n .tween(\"zoom\", function(d) {\n const i = d3.interpolateZoom(view, [focus.x, focus.y, adjustRadius(focus.r)]);\n return function(t) {\n zoomTo(i(t));\n };\n });\n\n transition.selectAll(\"text\")\n // Experimental: hide texts to be hidden on \"start\", show texts to be shown on \"end\"\n .each(textUpdate);\n }\n }\n\n rootFocusEvent = scope.$on('rootFocus', function() {\n $window.history.pushState({id: 1}, \"classHierarchyPage1\", \"hierarchy#1\");\n doFocus(rootHierarchy);\n });\n\n classSearchEvent = scope.$on('classSearch', function(selectedClass) {\n doFocus(selectedClass);\n });\n }\n\n function sendSliderData() {\n const currentClassCount = scope.classHierarchyData.classCount;\n let currentSliderValue = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);\n\n if (!currentSliderValue || currentSliderValue > currentClassCount) {\n currentSliderValue = currentClassCount;\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE, currentSliderValue);\n }\n\n $rootScope.$broadcast(\"classCount\", currentClassCount, currentSliderValue);\n }\n\n window.addEventListener('resize', sendSliderData);\n\n window.addEventListener('beforeunload', removeResizeListener);\n\n function removeResizeListener() {\n window.removeEventListener('resize', sendSliderData);\n window.removeEventListener('beforeunload', removeResizeListener);\n }\n\n let prefixesWatch;\n let currentClassCountWatch;\n let searchedClassBroadcast;\n let onEnterClassSearchBroadcast;\n\n scope.$watch('classHierarchyData', function() {\n // when data changes unregister watchers by calling them\n if (prefixesWatch) prefixesWatch();\n if (currentClassCountWatch) currentClassCountWatch();\n if (searchedClassBroadcast) searchedClassBroadcast();\n if (onEnterClassSearchBroadcast) onEnterClassSearchBroadcast();\n\n // get initial state of prefixes (hidden or not) when changing repositories\n // in order to avoid triggering an unwanted prefixes watch\n let initialPrefixesState = getPrefixesState();\n\n if (scope.classHierarchyData.classCount) {\n sendSliderData();\n\n const rootData = structuredClone(scope.classHierarchyData);\n\n const root = d3.hierarchy(rootData);\n\n function sortRoot(root) {\n // add all classes to a flat array, add parent information\n // and sort according to instancesCount DESC, depth ASC\n\n return root.descendants()\n .sort(function(a, b) {\n if (a.data.sortingRank > b.data.sortingRank) {\n return -1;\n } else if (a.data.sortingRank < b.data.sortingRank) {\n return 1;\n } else if (a.data.depth > b.data.depth) {\n return 1;\n } else if (a.data.depth < b.data.depth) {\n return -1;\n } else {\n return 0;\n }\n });\n }\n\n const sortedChildren = sortRoot(root);\n\n // we start with an empty new rootData\n let filteredRootData;\n let noPrefixesGlobal;\n\n\n function restoreDiagramState(currentRootData, switchPrefixes) {\n const prefixesConfig = {\n keepPrevState: true,\n noPrefixes: getPrefixesState(),\n };\n\n // get noPrefixes flag from drawDiagram configuration params\n noPrefixesGlobal = prefixesConfig.noPrefixes;\n\n if (filteredRootData) {\n drawDiagram(filteredRootData, prefixesConfig, focus, true);\n } else {\n drawDiagram(currentRootData, prefixesConfig, focus, true);\n }\n\n $timeout(() => {\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_SWITCH_PREFIXES, switchPrefixes);\n autoZoomToPreviousState();\n // Need to set this to false to enable the info panel to work when selecting a class.\n // The panel opening will be suppressed only when the prefixes are toggled.\n suppressPanelOpen = false;\n }, 70);\n }\n\n function redrawFilteredDiagram(currentSliderValue, sortedChildrenArray, useSlider) {\n if (!currentSliderValue) {\n return;\n }\n\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE, currentSliderValue);\n\n filteredRootData = {\n name: ROOT_OBJ_NAME,\n children: [],\n };\n\n // walk through the given count of (sortedChildrenArray) classes\n // - record the id of each class we've seen\n // - add the rootData level classes to the new rootData\n const addedIds = new Set();\n for (let k = 1; k <= currentSliderValue; k++) {\n addedIds.add(sortedChildrenArray[k].data.id);\n if (sortedChildrenArray[k].parent === sortedChildrenArray[0]) { // i.e. the parent is the \"class hierarchy\"\n filteredRootData.children.push(sortedChildrenArray[k].data);\n }\n }\n\n // walk through all the classes in the new rootData and only keep those that have an \"added id\"\n // we create separate copies of the arrays in order not to contaminate the original data\n // we also copy each class's object ($.extend ...) for the same reason\n function fixChildren(node) {\n if (!node.children) {\n return;\n }\n const newChildren = [];\n for (const child of node.children) {\n if (addedIds.has(child.id)) {\n newChildren.push($.extend({}, child));\n }\n }\n node.children = newChildren;\n for (const child of node.children) {\n fixChildren(child);\n }\n }\n\n fixChildren(filteredRootData);\n\n if (useSlider) {\n // redraw diagram when slider value changes and persist current state\n // in local storage\n noPrefixesGlobal = angular.isUndefined(noPrefixesGlobal) ? getPrefixesState() : noPrefixesGlobal;\n const redrawConfig = {\n noPrefixes: noPrefixesGlobal,\n };\n drawDiagram(filteredRootData, redrawConfig);\n } else {\n // if the user returns to the diagram with back browser button\n // read the saved state (show/hide prefixes, current slider value)\n // from local storage and render the diagram according to the saved metrics\n restoreDiagramState(rootData);\n }\n }\n\n const currentSliderValue = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);\n if (currentSliderValue) {\n redrawFilteredDiagram(currentSliderValue, sortedChildren);\n } else {\n const basicConfig = {\n doFade: true,\n keepPrevState: true,\n noPrefixes: getPrefixesState(),\n };\n drawDiagram(rootData, basicConfig);\n autoZoomToPreviousState();\n }\n\n prefixesWatch = scope.$watch('hidePrefixes', function(hidePrefixes) {\n if (angular.isUndefined(hidePrefixes) || initialPrefixesState) {\n initialPrefixesState = undefined;\n return;\n }\n // if digest overflows a possible fix might be wrapping this in $timeout\n $timeout(function() {\n suppressPanelOpen = true;\n savePrefixesState(hidePrefixes);\n restoreDiagramState(rootData, true);\n }, 50);\n }, true);\n\n currentClassCountWatch = scope.$watch('currentSliderValue', function(currentSliderValue) {\n redrawFilteredDiagram(currentSliderValue, sortedChildren, true);\n }, true);\n\n // we handle this event for the cases where we already have searched for a given class and\n // hit enter again on the already selected class in order again react and zoom to it again\n // if we are not at the moment\n let currentSearchedClass;\n onEnterClassSearchBroadcast = scope.$on('onEnterKeypressSearchAction', function(event) {\n if (currentSearchedClass) {\n doFocus(currentSearchedClass);\n }\n });\n\n searchedClassBroadcast = scope.$on('searchedClass', function(event, searchedClass) {\n currentSearchedClass = flattenedClassData[searchedClass.name];\n if (currentSearchedClass) {\n doFocus(currentSearchedClass);\n }\n });\n }\n }, true);\n }\n}\n","var CirclePacking = CirclePacking || {};\n\nCirclePacking.SingleChild = function () {\n /*\n Functions that enable single child circles to display properly, see\n http://stackoverflow.com/questions/22307486/d3-js-packed-circle-layout-how-to-adjust-child-radius\n */\n function addPlaceholders(node, first) {\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n var child = node.children[i];\n addPlaceholders(child);\n }\n\n if (node.children.length === 1) {\n var placeholderSize = node.size * 1.2;\n if (first) {\n placeholderSize = node.children[0].size * 0.1;\n }\n node.children.push({\n name: 'placeholder', size: placeholderSize,\n // children: []\n });\n }\n }\n }\n\n function removePlaceholders(nodes) {\n for (var i = nodes.length - 1; i >= 0; i--) {\n var node = nodes[i];\n\n if (node.data.name === 'placeholder') {\n nodes.splice(i, 1);\n } else {\n if (node.children) {\n removePlaceholders(node.children);\n }\n }\n }\n }\n\n function centerNodes(nodes) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n\n if (node.children) {\n if (node.children.length === 1) {\n var offset = node.x - node.children[0].x;\n node.children[0].x += offset;\n reposition(node.children[0], offset);\n }\n }\n }\n\n function reposition(node, offset) {\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n node.children[i].x += offset;\n reposition(node.children[i], offset);\n }\n }\n }\n }\n\n function makePositionsRelativeToZero(nodes) {\n //use this to have vis centered at 0,0,0 (easier for positioning)\n var offsetX = nodes[0].x;\n var offsetY = nodes[0].y;\n\n for (var i = 0; i < nodes.length; i++) {\n\n var node = nodes[i];\n\n node.x -= offsetX;\n node.y -= offsetY;\n }\n }\n\n return {\n addPlaceholders: addPlaceholders,\n removePlaceholders: removePlaceholders,\n centerNodes: centerNodes,\n makePositionsRelativeToZero: makePositionsRelativeToZero\n }\n}();\n\nexport default CirclePacking;\n","import 'lib/d3.patch.js'\nimport {selectAll} from 'd3';\n\nconst d3 = {selectAll};\nvar SVG = SVG || {};\n\nSVG.Export = function () {\n function getCSSRules(cssSourceFilePath) {\n const cssRules = $('link[href=\"' + cssSourceFilePath + '\"]')[0].sheet.rules;\n let cssStr = \"\";\n _.each(cssRules, function (value) {\n cssStr += value.cssText;\n });\n return cssStr;\n }\n\n function generateBase64ImageSource(svgSelectorClass) {\n if (!svgSelectorClass) {\n svgSelectorClass = \"svg\";\n }\n // add needed xml namespace\n const exportSvg = d3.selectAll(svgSelectorClass)\n .attr(\"version\", \"1.1\")\n .attr(\"xmlns\", \"http://www.w3.org/2000/svg\")\n .node().parentNode.innerHTML;\n\n // convert selected html to base64\n return \"data:image/svg+xml;charset=utf-8;base64,\" + btoa(unescape(encodeURIComponent(exportSvg)));\n }\n\n return {\n getCSSRules: getCSSRules,\n generateBase64ImageSource: generateBase64ImageSource\n };\n}();\n\nexport default SVG;\n"],"names":["classHierarchyDirective","$rootScope","$location","GraphDataRestService","$window","$timeout","$repositories","toastr","ZOOM_DURATION","ROOT_OBJ_NAME","LocalStorageAdapter","LSKeys","$translate","restrict","template","scope","classHierarchyData","flattenedClassNames","selectedClass","currentSliderValue","showClassInfoPanel","showExternalElements","hidePrefixes","currentBrowserLimit","link","element","attrs","suppressPanelOpen","tip","rootHierarchy","packLayout","d3","size","diameter","color","domain","range","interpolate","svg","insert","attr","on","appendMainGroup","append","id","transform","getPrefixesState","get","CLASS_HIERARCHY_HIDE_PREFIXES","prepareForSVGImageExport","cssRules","SVG","Export","getCSSRules","$","style","imgSrc","generateBase64ImageSource","this","href","download","getActiveRepository","g","hasData","classCount","canUseRepo","isSystemRepository","autoZoomToPreviousState","doFocus","focus","rootFocusEvent","classSearchEvent","service","LicenseContextService","onLicenseChanged","license","valid","loader","hierarchyError","selGraphFromCache","getClassHierarchyData","contextID","uri","success","response","status","warning","instant","error","getError","name","fetchClassHierarchy","flattenedClassData","drawDiagram","root","config","newFocus","switchPrefixes","remove","CirclePacking","SingleChild","addPlaceholders","sum","d","nodes","descendants","view","isInFocusTransitive","removePlaceholders","centerNodes","makePositionsRelativeToZero","d3tip","customPosition","event","top","bottom","innerHeight","clientY","right","innerWidth","clientX","html","data","call","circleGroup","selectAll","enter","doFade","each","D3","Transition","fadeIn","circle","role","children","depth","key","push","classed","noPrefixes","textHidden","show","hide","zoom","getCurrentClassDataAndMarkSelected","obj","selected","closeClassInfoPanel","_","uniqBy","clickCancel","Click","delayDblClick","$on","history","pushState","$broadcast","stopPropagation","lastTimeWheel","preventDefault","now","Date","direction","deltaY","target","__data__","parent","newobj","i","length","sortingRank","replaceState","sendSliderData","text","textSel","idx","indexOf","noPrefixName","substring","Text","calcFontSize","r","getTextWithElipsisIfNeeded","textContent","keepPrevState","focusOnCurrentClass","focusHistoryId","hash","onpopstate","state","skipOnPopState","node","zoomTo","v","k","x","y","fullName","topLevelParentUri","c","adjustRadius","newr","textUpdate","display","shouldClosePanel","p","duration","tween","t","currentClassCount","CLASS_HIERARCHY_CURRENT_SLIDER_VALUE","set","prefixesWatch","currentClassCountWatch","searchedClassBroadcast","onEnterClassSearchBroadcast","window","addEventListener","removeResizeListener","removeEventListener","$watch","initialPrefixesState","rootData","structuredClone","sortedChildren","sort","a","b","filteredRootData","noPrefixesGlobal","restoreDiagramState","currentRootData","prefixesConfig","CLASS_HIERARCHY_SWITCH_PREFIXES","redrawFilteredDiagram","sortedChildrenArray","useSlider","addedIds","Set","add","fixChildren","newChildren","child","has","extend","angular","isUndefined","basicConfig","currentSearchedClass","undefined","savePrefixesState","searchedClass","renderCirclePacking","module","constant","directive","$inject","first","placeholderSize","splice","offset","reposition","offsetX","offsetY","cssSourceFilePath","sheet","rules","cssStr","value","cssText","svgSelectorClass","exportSvg","parentNode","innerHTML","btoa","unescape","encodeURIComponent"],"sourceRoot":""}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "defaultLanguage": "en",
3
- "languageBundleVersion": "3.5.1-TR2",
3
+ "languageBundleVersion": "3.5.1-TR3",
4
4
  "availableLanguages": [
5
5
  {
6
6
  "key": "en",
@@ -1 +1 @@
1
- .multi-region{display:flex;height:100%}.multi-region .multi-region-content{display:flex;flex:1;flex-direction:column;gap:1.5rem}.multi-region .multi-region-form{display:flex;flex-direction:column;overflow:hidden}.multi-region .multi-region-table{overflow:auto}.multi-region .multi-region-error{flex:0 0 auto}.multi-region-loader .ot-loader-new-content{background-color:var(--gw-neutral-50-alpha-50);height:100%;position:absolute;width:100%}.cluster-status-loader{color:var(--gw-foreground-on-surface-secondary);font-size:1.5rem}.multi-region .tags-table{border-collapse:separate;border-spacing:0}.multi-region .tags-table td,.multi-region .tags-table th{padding:.4rem}.multi-region .tags-table .tag-column{width:auto}.multi-region .tags-table .tag-index-column{width:16%}.multi-region .tags-table .index-column{width:10%}.multi-region .multi-region-table thead th{border-bottom:var(--gw-datatable-header-background);height:2rem;position:sticky;top:0;z-index:1}.multi-region .multi-region-table .add-tag-row{position:sticky;top:2.4rem;z-index:1}.multi-region .tag-input.ng-invalid.ng-dirty{border-color:var(--gw-tag-danger-color)!important}.multi-region .tag-input.ng-valid.ng-dirty{border-color:initial}
1
+ .multi-region .multi-region-content{display:flex;flex:1;flex-direction:column;gap:1.5rem;height:100%}.multi-region .multi-region-form{display:flex;flex-direction:column;overflow:hidden}.multi-region .multi-region-table{overflow:auto}.multi-region .multi-region-error{flex:0 0 auto}.multi-region-loader .ot-loader-new-content{background-color:var(--gw-neutral-50-alpha-50);height:100%;position:absolute;width:100%}.cluster-status-loader{color:var(--gw-foreground-on-surface-secondary);font-size:1.5rem}.multi-region .tags-table{border-collapse:separate;border-spacing:0}.multi-region .tags-table td,.multi-region .tags-table th{padding:.4rem}.multi-region .tags-table .tag-column{width:auto}.multi-region .tags-table .tag-index-column{width:16%}.multi-region .tags-table .index-column{width:10%}.multi-region .multi-region-table thead th{border-bottom:var(--gw-datatable-header-background);height:2rem;position:sticky;top:0;z-index:1}.multi-region .multi-region-table .add-tag-row{position:sticky;top:2.4rem;z-index:1}.multi-region .tag-input.ng-invalid.ng-dirty{border-color:var(--gw-tag-danger-color)!important}.multi-region .tag-input.ng-valid.ng-dirty{border-color:initial}
package/dist/css/user.css CHANGED
@@ -1 +1 @@
1
- .wb-user .auth-column-label{margin-right:4px}.wb-user .repository-column{width:50%}.wb-user .graphql-column,.wb-user .maintain-repository-column,.wb-user .read-column,.wb-user .write-column{width:15%}.wb-user .graphql-any,.wb-user .graphql-column,.wb-user .graphql-rights{border-left:1px solid #eceeef}.wb-user .table-fixed{table-layout:fixed;width:100%}.wb-user .bordered-table{border:1px solid var(--gw-datatable-border-color);border-collapse:collapse;width:100%}.wb-user .graphql-icon{margin-left:4px}.wb-user .repository-name{word-wrap:break-word}.wb-user .fa-user{font-size:2rem;padding-bottom:0;padding-left:.25rem}.theme-select-wrapper{align-items:center;display:flex;flex-wrap:wrap}.theme-select-wrapper label{margin-bottom:0}.theme-select-wrapper select{flex:0 1 30%;min-width:150px}.roles{gap:1.5rem;margin-bottom:2.5rem}.roles,.user-roles{display:flex;flex-direction:column}.user-roles{gap:1rem}.user-repositories{display:flex;flex-direction:column}.user-repositories .user-repositories-label{margin-bottom:1.5rem}.left-column{display:flex;flex-direction:column;gap:1rem}.auth-info{font-weight:700}.sparql-editor-settings .label{font-weight:400}.sparql-editor-settings .setting-toggle{align-items:center;display:flex;justify-content:space-between}
1
+ .wb-user .auth-column-label{margin-right:4px}.wb-user .repository-column{vertical-align:top;width:40%}.wb-user .graphql-column,.wb-user .maintain-repository-column,.wb-user .read-column,.wb-user .write-column{width:15%}.wb-user .graphql-any,.wb-user .graphql-column,.wb-user .graphql-rights,.wb-user .permissions-column,.wb-user .read-column{border-left:1px solid #eceeef}.wb-user .table-fixed{table-layout:fixed;width:100%}.wb-user .bordered-table{border:1px solid var(--gw-datatable-border-color);border-collapse:separate;width:100%}.wb-user .permissions-subheader th{border-bottom:1px solid var(--gw-datatable-header-cell-border-color)}.wb-user .graphql-icon{margin-left:4px}.wb-user .repository-name{word-wrap:break-word}.wb-user .fa-user{font-size:2rem;padding-bottom:0;padding-left:.25rem}.theme-select-wrapper{align-items:center;display:flex;flex-wrap:wrap}.theme-select-wrapper label{margin-bottom:0}.theme-select-wrapper select{flex:0 1 30%;min-width:150px}.roles{gap:1.5rem;margin-bottom:2.5rem}.roles,.user-roles{display:flex;flex-direction:column}.user-roles{gap:1rem}.user-repositories{display:flex;flex-direction:column}.user-repositories .user-repositories-label{margin-bottom:1.5rem}.left-column{display:flex;flex-direction:column;gap:1rem}.auth-info{font-weight:700}.sparql-editor-settings .label{font-weight:400}.sparql-editor-settings .setting-toggle{align-items:center;display:flex;justify-content:space-between}
@@ -96,6 +96,7 @@
96
96
  "secondary_enabled": "Successfully enabled secondary mode",
97
97
  "disabled_secondary_mode": "Secondary mode is disabled",
98
98
  "secondary_cluster_settings": "Secondary cluster settings",
99
+ "leader_not_elected": "Leader is not elected",
99
100
  "column": {
100
101
  "index": "",
101
102
  "tag": "Identifier tag",
@@ -1673,6 +1674,7 @@
1673
1674
  "security.tooltip.not.available.for.role": "Not available for the selected role",
1674
1675
  "security.tooltip.not.available.for.repository.type": "Not available for this repository type",
1675
1676
  "security.tooltip.graphql": "GraphQL only rights",
1677
+ "security.label.permissions": "Permissions",
1676
1678
  "security.label.read": "Read",
1677
1679
  "security.label.write": "Write",
1678
1680
  "security.label.maintain_repository": "Maintain",
@@ -96,6 +96,7 @@
96
96
  "secondary_enabled": "Mode secondaire activé avec succès",
97
97
  "disabled_secondary_mode": "Le mode secondaire est désactivé",
98
98
  "secondary_cluster_settings": "Paramètres du cluster secondaire",
99
+ "leader_not_elected": "Aucun leader n'est élu",
99
100
  "column": {
100
101
  "index": "",
101
102
  "tag": "Balise d'identification",
@@ -1672,6 +1673,7 @@
1672
1673
  "security.tooltip.maintain_repository": "Autorisations de maintenance",
1673
1674
  "security.tooltip.not.available.for.role": "Non disponible pour le rôle sélectionné",
1674
1675
  "security.tooltip.not.available.for.repository.type": "Non disponible pour ce type de dépôt",
1676
+ "security.label.permissions": "Autorisations",
1675
1677
  "security.label.read": "Lire",
1676
1678
  "security.label.write": "Ecriture",
1677
1679
  "security.label.maintain_repository": "Maintenance",