graphdb-workbench 3.4.0-TR3 → 3.4.0-TR5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/19057.a52dd7b0e356e884a792.bundle.js +3 -0
- package/dist/19057.a52dd7b0e356e884a792.bundle.js.map +1 -0
- package/dist/23236.1490d29a6e40f437885b.bundle.js +2 -0
- package/dist/23236.1490d29a6e40f437885b.bundle.js.map +1 -0
- package/dist/24125.0fd6b7797f2630fe59c6.bundle.js +2 -0
- package/dist/24125.0fd6b7797f2630fe59c6.bundle.js.map +1 -0
- package/dist/24690.79fd696f08f3ebbb1c6f.bundle.js +2 -0
- package/dist/24690.79fd696f08f3ebbb1c6f.bundle.js.map +1 -0
- package/dist/{3395.8452312923e6a77d2ffd.bundle.js → 3395.8dfba5922c8aad6d860c.bundle.js} +2 -2
- package/dist/3395.8dfba5922c8aad6d860c.bundle.js.map +1 -0
- package/dist/34985.8ef74b317fc8bff7e8e1.bundle.js +2 -0
- package/dist/34985.8ef74b317fc8bff7e8e1.bundle.js.map +1 -0
- package/dist/50244.69475a004173b61902a8.bundle.js +2 -0
- package/dist/50244.69475a004173b61902a8.bundle.js.map +1 -0
- package/dist/60447.4fd8b4ce9b95b98deade.bundle.js +2 -0
- package/dist/60447.4fd8b4ce9b95b98deade.bundle.js.map +1 -0
- package/dist/63842.68a1c5451a236b8ede97.bundle.js +2 -0
- package/dist/63842.68a1c5451a236b8ede97.bundle.js.map +1 -0
- package/dist/{64709.9f6594f730a4b54d6fc9.bundle.js → 64709.93e616541b4b18e88892.bundle.js} +2 -2
- package/dist/{64709.9f6594f730a4b54d6fc9.bundle.js.map → 64709.93e616541b4b18e88892.bundle.js.map} +1 -1
- package/dist/{65677.038185dcd07233e07f52.bundle.js → 65677.77bf484a0da0eec48f0b.bundle.js} +2 -2
- package/dist/{65677.038185dcd07233e07f52.bundle.js.map → 65677.77bf484a0da0eec48f0b.bundle.js.map} +1 -1
- package/dist/66574.cae68c94f87ba873b322.bundle.js +2 -0
- package/dist/66574.cae68c94f87ba873b322.bundle.js.map +1 -0
- package/dist/{80933.ef5e85af9b19067ee89b.bundle.js → 80933.ddbcb2688f7d93009c04.bundle.js} +2 -2
- package/dist/{80933.ef5e85af9b19067ee89b.bundle.js.map → 80933.ddbcb2688f7d93009c04.bundle.js.map} +1 -1
- package/dist/{82917.e537e5e649be4a5a0e20.bundle.js → 82917.e234e043395ff0b7d48f.bundle.js} +2 -2
- package/dist/82917.e234e043395ff0b7d48f.bundle.js.map +1 -0
- package/dist/{86099.acb890d2b6e1d841c4c3.bundle.js → 86099.0abe4f96d87490fe332e.bundle.js} +2 -2
- package/dist/{86099.acb890d2b6e1d841c4c3.bundle.js.map → 86099.0abe4f96d87490fe332e.bundle.js.map} +1 -1
- package/dist/{90418.0a737513ff59bfee423a.bundle.js → 90418.ee1af575862a64c12457.bundle.js} +2 -2
- package/dist/90418.ee1af575862a64c12457.bundle.js.map +1 -0
- package/dist/{96972.896f91c5874df70d14bb.bundle.js → 96972.fc25a13bb1bc69ad785c.bundle.js} +2 -2
- package/dist/96972.fc25a13bb1bc69ad785c.bundle.js.map +1 -0
- package/dist/9923.74654347e1812dd0f90a.bundle.js +3 -0
- package/dist/9923.74654347e1812dd0f90a.bundle.js.map +1 -0
- package/dist/api/models/application-settings/application-settings.d.ts +8 -1
- package/dist/api/models/application-settings/test/application-settings.spec.d.ts +1 -0
- package/dist/api/ontotext-workbench-api.js +1 -1
- package/dist/api/ontotext-workbench-api.js.map +1 -1
- package/dist/api/services/application-settings/application-settings-storage.service.d.ts +6 -0
- package/dist/api/services/runtime-configuration/runtime-configuration-context.service.d.ts +20 -0
- package/dist/api/services/theme/theme.service.d.ts +14 -3
- package/dist/css/explore.css +1 -1
- package/dist/css/lib/ontotext-yasgui-web-component.css +1 -1
- package/dist/css/user.css +1 -1
- package/dist/i18n/locale-en.json +4 -1
- package/dist/i18n/locale-fr.json +6 -3
- package/dist/index.html +9 -9
- package/dist/js/angular/clustermanagement/templates/cluster-nodes-configuration.html +1 -1
- package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +1 -1
- package/dist/js/angular/core/directives/dynamic-form/templates/dynamic-form.html +1 -1
- package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +1 -1
- package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
- package/dist/js/angular/core/directives/shuttle-multiselect/templates/shuttle-multiselect.html +1 -1
- package/dist/js/angular/core/directives/yasgui-component/templates/yasgui-component.html +2 -2
- package/dist/js/angular/core/templates/cookie-policy/cookie-consent.html +1 -1
- package/dist/js/angular/core/templates/cookie-policy/cookie-policy.html +1 -1
- package/dist/js/angular/core/templates/editable-content/editable-content.html +1 -1
- package/dist/js/angular/core/templates/markdown-content/markdown-content.html +1 -1
- package/dist/js/angular/core/templates/search-resource-input.html +1 -1
- package/dist/js/angular/graphql/templates/create-graphql-endpoint.html +2 -2
- package/dist/js/angular/graphql/templates/graphql-endpoint-management.html +1 -1
- package/dist/js/angular/graphql/templates/graphql-playground.html +2 -2
- package/dist/js/angular/graphql/templates/modal/endpoint-configuration-modal.html +1 -1
- package/dist/js/angular/graphql/templates/modal/endpoint-generation-failure-result-modal.html +1 -1
- package/dist/js/angular/graphql/templates/modal/import-endpoint-definition-modal.html +1 -1
- package/dist/js/angular/security/templates/user.html +13 -16
- package/dist/js/angular/ttyg/templates/agent-list.html +1 -1
- package/dist/js/angular/ttyg/templates/agent-select-menu.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-item-detail.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-list.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-panel.html +1 -1
- package/dist/js/angular/ttyg/templates/modal/agent-instructions-explain-modal.html +1 -1
- package/dist/js/angular/ttyg/templates/modal/agent-settings-modal.html +3 -3
- package/dist/js/angular/ttyg/templates/modal/external-integration-configuration-modal.html +1 -1
- package/dist/js/angular/ttyg/templates/no-agents-view.html +1 -1
- package/dist/js/angular/ttyg/templates/ttyg.html +1 -1
- package/dist/{legacyWorkbench.77dd92ce99a75c4ee674.js → legacyWorkbench.cb08fa647eed6afe60e8.js} +3 -3
- package/dist/{legacyWorkbench.77dd92ce99a75c4ee674.js.map → legacyWorkbench.cb08fa647eed6afe60e8.js.map} +1 -1
- package/dist/{main.6db145d35852092cde59.js → main.1198f08d1cc597b94cbc.js} +3 -3
- package/dist/main.1198f08d1cc597b94cbc.js.map +1 -0
- package/dist/pages/aclmanagement.html +1 -1
- package/dist/pages/autocomplete.html +1 -1
- package/dist/pages/choose-repository-type.html +1 -1
- package/dist/pages/cluster-management/clusterInfo.html +3 -3
- package/dist/pages/create-index.html +5 -3
- package/dist/pages/dependencies.html +3 -3
- package/dist/pages/domainRangeInfo.html +2 -2
- package/dist/pages/edit.html +1 -1
- package/dist/pages/explore.html +72 -75
- package/dist/pages/export.html +1 -1
- package/dist/pages/find.html +1 -1
- package/dist/pages/graph-config/saveGraphConfig.html +8 -8
- package/dist/pages/graphs-visualizations.html +7 -7
- package/dist/pages/guides.html +1 -1
- package/dist/pages/home.html +1 -1
- package/dist/pages/import.html +2 -2
- package/dist/pages/jdbc-create.html +1 -1
- package/dist/pages/jdbc.html +1 -1
- package/dist/pages/monitor/backup-and-restore.html +1 -1
- package/dist/pages/monitor/queries.html +1 -1
- package/dist/pages/monitor/resources.html +1 -1
- package/dist/pages/namespaces.html +2 -2
- package/dist/pages/plugins.html +1 -1
- package/dist/pages/rdfClassHierarchyInfo.html +7 -7
- package/dist/pages/rdfrank.html +2 -2
- package/dist/pages/repositories.html +1 -1
- package/dist/pages/repository.html +1 -1
- package/dist/pages/similarity-indexes.html +1 -1
- package/dist/pages/sparql-editor.html +1 -1
- package/dist/pages/sparql-template-create.html +1 -1
- package/dist/pages/sparql-templates.html +1 -1
- package/dist/pages/ux-test1.html +2 -2
- package/dist/pages/webapi.html +2 -2
- package/dist/res/swagger5/index.html +11 -11
- package/dist/shared-components/cjs/onto-graph-explore-split-button.cjs.entry.js +1 -1
- package/dist/shared-components/collection/components/onto-graph-explore-split-button/onto-graph-explore-split-button.js +1 -1
- package/dist/shared-components/esm/onto-graph-explore-split-button.entry.js +1 -1
- package/dist/shared-components/shared-components/p-cd5cc683.entry.js +1 -0
- package/dist/shared-components/shared-components/shared-components.esm.js +1 -1
- package/package.json +1 -1
- package/dist/19057.c644732712725c1a6d3d.bundle.js +0 -3
- package/dist/19057.c644732712725c1a6d3d.bundle.js.map +0 -1
- package/dist/23236.36dabf6a87d61107178d.bundle.js +0 -2
- package/dist/23236.36dabf6a87d61107178d.bundle.js.map +0 -1
- package/dist/24125.fc41760fdae44b0480c8.bundle.js +0 -2
- package/dist/24125.fc41760fdae44b0480c8.bundle.js.map +0 -1
- package/dist/24690.d4ed1c24eded4eb0da85.bundle.js +0 -2
- package/dist/24690.d4ed1c24eded4eb0da85.bundle.js.map +0 -1
- package/dist/3395.8452312923e6a77d2ffd.bundle.js.map +0 -1
- package/dist/34985.a6b52e4b364c7efd3046.bundle.js +0 -2
- package/dist/34985.a6b52e4b364c7efd3046.bundle.js.map +0 -1
- package/dist/50244.35b37c35412261341adb.bundle.js +0 -2
- package/dist/50244.35b37c35412261341adb.bundle.js.map +0 -1
- package/dist/60447.fd8b44d92859a3481ad7.bundle.js +0 -2
- package/dist/60447.fd8b44d92859a3481ad7.bundle.js.map +0 -1
- package/dist/63842.e62b43ae192a642531c6.bundle.js +0 -2
- package/dist/63842.e62b43ae192a642531c6.bundle.js.map +0 -1
- package/dist/66574.8591bdbb6983d8d07c04.bundle.js +0 -2
- package/dist/66574.8591bdbb6983d8d07c04.bundle.js.map +0 -1
- package/dist/82917.e537e5e649be4a5a0e20.bundle.js.map +0 -1
- package/dist/90418.0a737513ff59bfee423a.bundle.js.map +0 -1
- package/dist/96972.896f91c5874df70d14bb.bundle.js.map +0 -1
- package/dist/9923.6963c46c47330a6ba2d0.bundle.js +0 -3
- package/dist/9923.6963c46c47330a6ba2d0.bundle.js.map +0 -1
- package/dist/main.6db145d35852092cde59.js.map +0 -1
- package/dist/shared-components/shared-components/p-1b143527.entry.js +0 -1
- /package/dist/{19057.c644732712725c1a6d3d.bundle.js.LICENSE.txt → 19057.a52dd7b0e356e884a792.bundle.js.LICENSE.txt} +0 -0
- /package/dist/{9923.6963c46c47330a6ba2d0.bundle.js.LICENSE.txt → 9923.74654347e1812dd0f90a.bundle.js.LICENSE.txt} +0 -0
- /package/dist/{legacyWorkbench.77dd92ce99a75c4ee674.js.LICENSE.txt → legacyWorkbench.cb08fa647eed6afe60e8.js.LICENSE.txt} +0 -0
- /package/dist/{main.6db145d35852092cde59.js.LICENSE.txt → main.1198f08d1cc597b94cbc.js.LICENSE.txt} +0 -0
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export const __webpack_esm_id__=23236;export const __webpack_esm_ids__=[4531,23236,24125,33537,58325,80706];export const __webpack_esm_modules__={23236(t,e,n){var s=n(33537),a=n(24125),r=n(58325);const o={select:n(44482).select};function c(t,e,n,c){return{restrict:"E",templateUrl:"js/angular/clustermanagement/templates/cluster-legend.html",scope:{},link:i=>{i.hideLegend=!0;const l=[];let _,d,N;i.toggleLegend=()=>{i.hideLegend=!i.hideLegend,_.classed("hidden-legend",i.hideLegend)};const E=()=>{const t=e.getClusterViewD3Container();T(t),h(),u(_),I(),g(),p(),O()},u=t=>{y(t,"cluster_management.cluster_graphical_view.legend_title_node_state");const e=t.selectAll(".node-group").data(s.N.getLegendNodes()),n=a.kI(e,s.N.SVG_NODE_WIDTH,!0);a.HF(n),n.attr("transform",function(t,e){return p(),`translate(${s.N.LEGEND_ITEM_PADDING_LEFT}, ${d+s.N.LEGEND_ITEM_PADDING_TOP})`}).append("text").classed("links-statuses",!0).style("font-weight",s.N.LEGEND_ITEM_FONT_WEIGHT).attr("x",s.N.PADDING_LEFT+s.N.SVG_NODE_WIDTH).attr("y",3).text(function(t){return D(this,"cluster_management.cluster_graphical_view."+t.customText)})},I=()=>{y(_,"cluster_management.cluster_graphical_view.legend_title_sync_status");const t=_.selectAll(".sync-statuses-group").data(s.N.getSyncStatuses()).enter().append("g").attr("class","sync-statuses-group"),e=new Map;t.append("text").attr("class",t=>`sync-status ${t.classes}`).attr("x",s.N.LEGEND_ITEM_PADDING_LEFT-10).attr("y",function(t,n){const a=n*(20+s.N.LEGEND_ITEM_PADDING_TOP)+d+s.N.LEGEND_ITEMS_PADDING_TOP;return e.set(n,a),a}).text(function(t){return t.icon});const n=(s.N.LEGEND_ITEM_ICON_FONT_SIZE-s.N.LEGEND_ITEM_FONT_SIZE)/2;t.append("text").style("font-weight",s.N.LEGEND_ITEM_FONT_WEIGHT).text(function(t){return D(this,"cluster_management.cluster_graphical_view."+t.labelKey)}).attr("x",s.N.LEGEND_ITEM_PADDING_LEFT+s.N.LEGEND_ITEM_FONT_SIZE).attr("y",function(t,s){return e.get(s)-n}).classed("links-statuses",!0)},g=()=>{y(_,"cluster_management.cluster_graphical_view.legend_title_link_states");const t=_.selectAll(".link-states-group").data(s.N.getLegendLinks()).enter().append("g").attr("class","link-state"),e=new Map;t.append("path").classed("link",!0).attr("stroke-dasharray",a.CQ).attr("stroke",a._D).attr("d",(t,n)=>{const a=n*(s.N.LEGEND_ITEM_FONT_SIZE+s.N.LEGEND_ITEM_PADDING_TOP)+d+s.N.LEGEND_ITEMS_PADDING_TOP,o=N/2;let c;if(e.set(n,a),t.status===r.gC.RECEIVING_SNAPSHOT){const t=o/2;c=`M${s.N.PADDING_LEFT} ${a} L${t} ${a} L${o} ${a}`}else c=`M${s.N.PADDING_LEFT} ${a} ${o} ${a}`;return c}).style("marker-mid",t=>a.Iz(t,a.ZC.SMALL)),t.append("text").style("font-size",s.N.LEGEND_ITEM_FONT_SIZE).style("line-height",s.N.LEGEND_ITEM_LINE_HEIGHT).style("font-weight",s.N.LEGEND_ITEM_FONT_WEIGHT).text(function(t){return D(this,"cluster_management.cluster_graphical_view."+t.linkTypeKey)}).attr("x",N/2+s.N.LEGEND_ITEM_PADDING_LEFT).attr("y",function(t,n){return e.get(n)+4}).classed("links-statuses",!0)},T=t=>{_=t.append("g").classed("hidden-legend",i.hideLegend).classed("cluster-legend-group",!0)},h=()=>{_.append("rect").attr("class","legend-background")},p=()=>{_.call(t=>{d=t.node().getBBox().height}),N=S(_)+30},O=()=>{const t=S(_);_.select(".legend-background").attr("height",d+3*s.N.PADDING_TOP).attr("width",t+s.N.BACKGROUND_PADDING).attr("rx","6")},S=t=>{let e=0;return t.selectAll(":not(.legend-background)").each(function(){const t=this.getBBox();e=Math.max(e,t.width)}),e},y=(t,e)=>t.append("text").attr("class","legend-title").attr("x",s.N.PADDING_LEFT).style("font-size",s.N.TITLE_FONT_SIZE).style("font-weight",s.N.TITLE_FONT_WEIGHT).style("line-height",s.N.TITLE_LINE_HEIGHT).text(function(){return D(this,e)}).attr("y",()=>(p(),d+s.N.TITLE_PADDING_TOP)),D=(e,s)=>(l.push(t.$on("$translateChangeSuccess",()=>{o.select(e).text(n.instant(s)),O()})),n.instant(s)),f=()=>{i.hideLegend=!0,_.classed("hidden-legend",i.hideLegend)};c.on("keydown",t=>{"Escape"===t.key&&f()}),l.push(e.onClusterViewD3ContainerUpdated(E)),i.$on("$destroy",()=>{c.off("keydown",f),l.forEach(t=>t())}),E()}}}angular.module("graphdb.framework.clustermanagement.directives.cluster-legend",[]).directive("clusterLegend",c),c.$inject=["$rootScope","ClusterViewContextService","$translate","$document"]},24125(t,e,n){n.d(e,{$$:()=>f,CQ:()=>C,D6:()=>A,HF:()=>h,Iz:()=>m,J5:()=>N,Wg:()=>v,Xl:()=>u,ZC:()=>L,_D:()=>G,cZ:()=>g,cy:()=>D,dB:()=>E,kI:()=>T,r_:()=>I,ss:()=>x});var s=n(58325),a=n(22723),r=n(44482);const o={line:r.line,select:r.select},c="var(--gw-secondary-base)",i={[s.gC.IN_SYNC]:c,[s.gC.SYNCING]:c,[s.gC.OUT_OF_SYNC]:"var(--gw-neutral-base)",[s.gC.RECEIVING_SNAPSHOT]:c},l={[s.gC.IN_SYNC]:"none",[s.gC.SYNCING]:"10 10",[s.gC.OUT_OF_SYNC]:"10 10",[s.gC.RECEIVING_SNAPSHOT]:"10 10"},_="REMIXICON",d="ICOMOON";function N(t){return o.select(t).append("svg").classed("cluster-diagram",!0)}function E(t){const e=t.append("g");return e.append("circle").classed("cluster-zone",!0).style("fill","transparent").style("stroke-width","4"),e}function u(t,e,n,s=!1){if(e.select(".cluster-zone").classed("no-cluster",!t).classed("has-access",s),t)e.selectAll("#no-cluster-zone").remove();else{const t=e.append("g").attr("id","no-cluster-zone");t.append("text").attr("id","no-cluster-label").text(n.no_cluster_configured).attr("y",-50).classed("h2",!0).style("text-anchor","middle"),s&&t.append("text").attr("id","create-cluster-label").classed("h3",!0).text(n.create_cluster_btn).style("text-anchor","middle"),t.append("text").attr("y",130).attr("class","icon-any repo").attr("fill","var(--gw-primary-base)").style("text-anchor","middle").classed("settings-icon",!0).text("")}}function I(t,e,n){t||(e.select("#no-cluster-zone #no-cluster-label").text(n.no_cluster_configured),e.select("#no-cluster-zone #create-cluster-label").text(n.create_cluster_btn))}function g(t,e,n){t.attr("transform",()=>`translate(${e}, ${n})`)}function T(t,e,n){const s=t.enter().append("g").attr("id","node-group").classed("legend",n),a=s.merge(t).attr("id","node-group").classed("legend",n);return function(t,e){const n=Math.sqrt(3)/2,s=[[e+0,0],[e/2+0,e*n+0],[-e/2+0,e*n+0],[0-e,0],[-e/2+0,-e*n+0],[e/2+0,-e*n+0],[e+0,0],[e/2+0,e*n+0]];t.selectAll("path.area").data([s]).enter().append("path").attr("class","node member").attr("stroke-width","10").attr("stroke-linejoin","round").attr("d",o.line())}(s,e),t.exit().remove(),s.append("text").attr("class","icon-any node-icon"),n||function(t,e){const n=t.append("g");n.append("rect").attr("class","id-host-background").attr("rx",6),n.append("rect").attr("class","node-info-background").attr("rx",6),n.append("text").attr("y",e+25).attr("class","id id-host"),n.append("text").attr("y",e+55).attr("class","node-info-text")}(s,e),a}function h(t){!function(t){t.select(".node-icon").each(function(t){const e=(n=t,(0,a.isEmpty)(n.recoveryStatus)?function(t){return O[t.nodeState]||{icon:"",font:""}}(t):function(t){const e=t.recoveryStatus;return e&&e.state&&p[e.state]||{icon:"",font:""}}(t));var n;o.select(this).classed("icon-any",e.font===d).classed("remixicon",e.font===_).text(e.icon)})}(t),function(t){t.select(".node.member").classed("leader",t=>t.nodeState===s.UY.LEADER).classed("follower",t=>t.nodeState===s.UY.FOLLOWER).classed("candidate",t=>t.nodeState===s.UY.CANDIDATE).classed("other",t=>t.nodeState!==s.UY.LEADER&&t.nodeState!==s.UY.FOLLOWER&&t.nodeState!==s.UY.CANDIDATE)}(t),function(t){t.select(".id.id-host").each(function(t){t.labelNode=this}).text(function(t){return t.hostname}),t.select(".id-host-background").attr("width",function(t){return o.select(t.labelNode).node().getBBox().width+10}).attr("height",function(t){return o.select(t.labelNode).node().getBBox().height+10}).attr("x",function(t){return o.select(t.labelNode).node().getBBox().x-5}).attr("y",function(t){return o.select(t.labelNode).node().getBBox().y-5})}(t),function(t){let e,n;t.select(".node-info-text").each(function(t){t.infoNode=this}).select(function(){return this.parentNode}).append("foreignObject").attr("width",function(t){let s="";(0,a.isEmpty)(t.recoveryStatus)||(s=S(t));const r=y(s);return e=r.height,n=r.width,n}).attr("height",function(t){return e}).attr("x",function(t){return-n/2}).attr("y",function(t){return 78}).classed("hidden",function(t){return(0,a.isEmpty)(t.recoveryStatus)}).style("font-size","12px").style("font-weight","400").style("text-align","center").style("padding","4px").style("background","#EEEEEE").style("border-radius","6px").attr("class","node-info-fo").append("xhtml:div").html(function(t){return S(t)}),t.select(".node-info-text").remove(),function(t){t.select(".node-info-fo").each(function(t){const e=o.select(this);if((0,a.isEmpty)(t.recoveryStatus))return void e.attr("width",0);const n=S(t),s=t.recoveryStatus.message&&t.recoveryStatus.message.length>40&&n!==t.recoveryStatus.message,r=s?n:t.recoveryStatus.message,c=y(n),i=y(t.recoveryStatus.message);e.on(".tooltip",null),s&&function(t,e,n,s,a){t.on("mouseover.tooltip",()=>{t.attr("width",a.width).attr("height",a.height).attr("x",-a.width/2).html(`<div>${e}</div>`)}),t.on("mouseout.tooltip",()=>{t.attr("width",n.width).attr("height",n.height).attr("x",-n.width/2).html(`<div>${s}</div>`)})}(e,t.recoveryStatus.message,c,r,i),e.attr("width",c.width).attr("height",c.height).attr("x",-c.width/2).html(`<div>${r}</div>`)})}(t)}(t)}const p={[s.vQ.SEARCHING_FOR_NODE]:{icon:"",font:_},[s.vQ.WAITING_FOR_SNAPSHOT]:{icon:"",font:_},[s.vQ.RECEIVING_SNAPSHOT]:{icon:"",font:_},[s.vQ.APPLYING_SNAPSHOT]:{icon:"",font:_},[s.vQ.BUILDING_SNAPSHOT]:{icon:"",font:_},[s.vQ.SENDING_SNAPSHOT]:{icon:"",font:_},[s.vQ.RECOVERY_OPERATION_FAILURE_WARNING]:{icon:"",font:d}},O={[s.UY.CANDIDATE]:{icon:"",font:d},[s.UY.NO_CONNECTION]:{icon:"",font:d},[s.UY.OUT_OF_SYNC]:{icon:"",font:d},[s.UY.READ_ONLY]:{icon:"",font:d},[s.UY.RESTRICTED]:{icon:"",font:d}};function S(t){return t.recoveryStatus.message&&t.recoveryStatus.message.length>40?t.recoveryStatus.message.substring(0,40)+"...":t.recoveryStatus.message||""}function y(t){const e=document.createElement("div");e.innerHTML=t,e.style.padding="4px",e.style.position="absolute",e.style.visibility="hidden",e.style.fontSize="12px",e.style.fontWeight="400",e.style.textAlign="center",e.style.height="auto",e.style.width="auto",e.style.whiteSpace="nowrap",document.body.appendChild(e);const n=e.getBoundingClientRect(),s=n.height,a=n.width;return document.body.removeChild(e),{height:s,width:a}}function D(t){t.enter().append("path").classed("link",!0),t.exit().remove()}function f(t,e){t.attr("class",t=>`link ${t.id.replaceAll(":","-")}`).attr("stroke",G).style("stroke-dasharray",C).style("marker-mid",t=>m(t,L.BIG)).attr("d",t=>function(t,e){const n=e.find(e=>e.address===t.source),s=e.find(e=>e.address===t.target),a=s.x-n.x,r=s.y-n.y,o=Math.sqrt(a*a+r*r),c=a/o,i=r/o,l=n.x+55*c,_=n.y+55*i,d=s.x-55*c,N=s.y-55*i;return"M"+l+","+_+"L"+(l+d)/2+","+(_+N)/2+"L"+d+","+N}(t,e))}const L={SMALL:{name:"small",size:3},BIG:{name:"big",size:5}};function A(t,e){t.append("svg:defs").append("svg:marker").attr("id",`arrowhead_${e.name}`).attr("viewBox",`0 0 ${2*e.size} ${2*e.size}`).attr("refX",e.size).attr("refY",e.size).attr("markerWidth",e.size).attr("markerHeight",e.size).attr("orient","auto-start-reverse").append("path").attr("d",`M 0 0 L ${2*e.size} ${e.size} L 0 ${2*e.size} z`).style("fill","var(--gw-secondary-base)")}function m(t,e){if(t.status===s.gC.RECEIVING_SNAPSHOT)return`url(#arrowhead_${e.name})`}function G(t){return i[t.status]||"none"}function C(t){return l[t.status]||"none"}function x(t,e,n,s){t.attr("transform",(a,r)=>{const o=2*Math.PI*r/t.size(),c=e+Math.cos(o)*s,i=n+Math.sin(o)*s;return a.x=c,a.y=i,`translate(${c}, ${i})`})}function v(){o.select(document).selectAll(".node-info-fo").on(".tooltip",null)}},33537(t,e,n){n.d(e,{N:()=>r});var s=n(4531),a=n(58325);const r={getLegendNodes:function(){const t=[];return t.push({nodeState:s.U.LEADER,customText:"node_state_leader"}),t.push({nodeState:s.U.FOLLOWER,customText:"node_state_follower"}),t.push({nodeState:s.U.OUT_OF_SYNC_BLANK,customText:"node_state_out_of_sync"}),t.forEach((t,e)=>t.id=e),t},getSyncStatuses:()=>[{labelKey:"node_state_candidate",classes:"remixicon",icon:""},{labelKey:"node_state_no_cluster",classes:"remixicon",icon:""},{labelKey:"link_state_out_of_sync",classes:"remixicon",icon:""},{labelKey:"node_state_no_connection",classes:"remixicon",icon:""},{labelKey:"node_state_read_only",classes:"remixicon",icon:""},{labelKey:"node_state_restricted",classes:"remixicon",icon:""},{labelKey:"recovery_state.searching_for_node",classes:"remixicon",icon:""},{labelKey:"recovery_state.waiting_for_snapshot",classes:"remixicon",icon:""},{labelKey:"recovery_state.building_snapshot",classes:"remixicon",icon:""},{labelKey:"recovery_state.sending_snapshot",classes:"remixicon",icon:""},{labelKey:"recovery_state.receiving_snapshot",classes:"remixicon",icon:""},{labelKey:"recovery_state.applying_snapshot",classes:"remixicon",icon:""}],getLegendLinks:function(){const t=[];return t.push({status:a.gC.IN_SYNC,linkTypeKey:"link_state_in_sync"}),t.push({status:a.gC.SYNCING,linkTypeKey:"link_state_syncing"}),t.push({status:a.gC.OUT_OF_SYNC,linkTypeKey:"link_state_out_of_sync"}),t.push({status:a.gC.RECEIVING_SNAPSHOT,linkTypeKey:"link_state_receiving_snapshot"}),t.forEach((t,e)=>t.id=e),t},SVG_NODE_WIDTH:15,PADDING_LEFT:12,PADDING_TOP:12,TITLE_PADDING_TOP:15,TITLE_FONT_SIZE:13,TITLE_FONT_WEIGHT:700,TITLE_LINE_HEIGHT:18,LEGEND_ITEM_FONT_SIZE:11,LEGEND_ITEM_ICON_FONT_SIZE:15,LEGEND_ITEM_FONT_WEIGHT:400,LEGEND_ITEM_LINE_HEIGHT:13,LEGEND_ITEM_PADDING_LEFT:27,LEGEND_ITEMS_PADDING_TOP:40,LEGEND_ITEM_PADDING_TOP:8,BACKGROUND_PADDING:24}},4531(t,e,n){n.d(e,{U:()=>s});const s={LEADER:"LEADER",FOLLOWER:"FOLLOWER",CANDIDATE:"CANDIDATE",OUT_OF_SYNC_BLANK:"OUT_OF_SYNC_BLANK"}},58325(t,e,n){n.d(e,{UY:()=>s,gC:()=>r,vQ:()=>a,zB:()=>o});const s={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"},r={IN_SYNC:"IN_SYNC",OUT_OF_SYNC:"OUT_OF_SYNC",SYNCING:"SYNCING",NO_CONNECTION:"NO_CONNECTION",RECEIVING_SNAPSHOT:"RECEIVING_SNAPSHOT"},o={PRIMARY_NODE:"PRIMARY_NODE",SECONDARY_NODE:"SECONDARY_NODE"}}};
|
|
2
|
-
//# sourceMappingURL=23236.36dabf6a87d61107178d.bundle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"23236.36dabf6a87d61107178d.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/clustermanagement/directives/cluster-legend.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/clustermanagement/services/cluster-drawing.service.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/clustermanagement/cluster-management-constants.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/clustermanagement/node-state.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/clustermanagement/states.js"],"sourcesContent":["import {CLUSTER_MANAGEMENT_CONSTANTS} from \"../../models/clustermanagement/cluster-management-constants\";\nimport * as CDS from \"../services/cluster-drawing.service\";\nimport {LinkState} from \"../../models/clustermanagement/states\";\nimport {ARROW_CONFIG} from \"../services/cluster-drawing.service\";\nimport {select} from 'd3';\n\nconst d3 = {select};\nconst modules = [];\nangular.module('graphdb.framework.clustermanagement.directives.cluster-legend', modules)\n .directive('clusterLegend', clusterLegend);\n\nclusterLegend.$inject = ['$rootScope', 'ClusterViewContextService', '$translate', '$document'];\n\nfunction clusterLegend($rootScope, ClusterViewContextService, $translate, $document) {\n return {\n restrict: 'E',\n templateUrl: 'js/angular/clustermanagement/templates/cluster-legend.html',\n scope: {},\n link: ($scope) => {\n\n // =========================\n // Public variables\n // =========================\n\n $scope.hideLegend = true;\n\n // =========================\n // Private variables\n // =========================\n\n const subscriptions = [];\n let legendGroup;\n let legendHeight;\n let legendWidth;\n\n // =========================\n // Public functions\n // =========================\n\n $scope.toggleLegend = () => {\n $scope.hideLegend = !$scope.hideLegend;\n legendGroup.classed('hidden-legend', $scope.hideLegend);\n };\n\n // =========================\n // Private functions\n // =========================\n\n const init = () => {\n const clusterViewD3Container = ClusterViewContextService.getClusterViewD3Container();\n createLegendGroup(clusterViewD3Container);\n createLegendBackground();\n addNodeStates(legendGroup);\n addSyncStatus();\n addLinks();\n updateLegendDimensions();\n updateLegendBackground();\n };\n\n const addNodeStates = (legendGroup) => {\n addTitle(legendGroup, 'cluster_management.cluster_graphical_view.legend_title_node_state');\n const legendNodeData = legendGroup\n .selectAll('.node-group')\n .data(CLUSTER_MANAGEMENT_CONSTANTS.getLegendNodes());\n const legendNodesElements = CDS.createNodes(legendNodeData, CLUSTER_MANAGEMENT_CONSTANTS.SVG_NODE_WIDTH, true);\n CDS.updateNodes(legendNodesElements);\n const LABEL_Y_POSITION = 3;\n legendNodesElements\n .attr('transform', function (d, i) {\n updateLegendDimensions();\n return `translate(${CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_PADDING_LEFT}, ${legendHeight + CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_PADDING_TOP})`;\n })\n .append('text')\n .classed('links-statuses', true)\n .style('font-weight', CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_FONT_WEIGHT)\n .attr('x', CLUSTER_MANAGEMENT_CONSTANTS.PADDING_LEFT + CLUSTER_MANAGEMENT_CONSTANTS.SVG_NODE_WIDTH)\n .attr('y', LABEL_Y_POSITION)\n .text(function (d) {\n return translateAndSubscribe(this, 'cluster_management.cluster_graphical_view.' + d.customText);\n });\n };\n\n const addSyncStatus = () => {\n addTitle(legendGroup, 'cluster_management.cluster_graphical_view.legend_title_sync_status');\n const syncStatusesGroups = legendGroup.selectAll('.sync-statuses-group')\n .data(CLUSTER_MANAGEMENT_CONSTANTS.getSyncStatuses())\n .enter()\n .append('g')\n .attr('class', 'sync-statuses-group');\n\n const rowY = new Map();\n\n syncStatusesGroups\n .append('text')\n .attr('class', (d) => `sync-status ${d.classes}`)\n .attr('x', CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_PADDING_LEFT - 10)\n .attr('y', function (d, index) {\n const rowTop = index * (20 + CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_PADDING_TOP) + legendHeight + CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEMS_PADDING_TOP;\n rowY.set(index, rowTop);\n return rowTop;\n })\n .text(function (d) {\n return d.icon;\n });\n\n const labelOffsetY = (CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_ICON_FONT_SIZE - CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_FONT_SIZE) / 2;\n syncStatusesGroups\n .append('text')\n .style('font-weight', CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_FONT_WEIGHT)\n .text(function (d) {\n return translateAndSubscribe(this, 'cluster_management.cluster_graphical_view.' + d.labelKey);\n })\n .attr('x', CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_PADDING_LEFT + CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_FONT_SIZE)\n .attr('y', function (d, index) {\n return rowY.get(index) - labelOffsetY;\n })\n .classed('links-statuses', true);\n };\n\n const addLinks = () => {\n addTitle(legendGroup, 'cluster_management.cluster_graphical_view.legend_title_link_states');\n const linkStatesGroup = legendGroup.selectAll('.link-states-group')\n .data(CLUSTER_MANAGEMENT_CONSTANTS.getLegendLinks())\n .enter()\n .append('g')\n .attr('class', 'link-state');\n\n // map vertical positions of each link in order to be able to draw labels next to the links\n const rowY = new Map();\n\n linkStatesGroup\n .append('path')\n .classed('link', true)\n .attr('stroke-dasharray', CDS.setLinkStyle)\n .attr('stroke', CDS.setLinkColor)\n .attr('d', (link, index) => {\n const y = index * (CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_FONT_SIZE + CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_PADDING_TOP) + legendHeight + CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEMS_PADDING_TOP;\n const lineWidth = legendWidth / 2;\n rowY.set(index, y);\n let line;\n if (link.status === LinkState.RECEIVING_SNAPSHOT) {\n const lineMidPoint = lineWidth / 2;\n // In order to draw an arrowhead in the middle of a line, the line needs to be composed by\n // two segments, otherwise the arrowhead won't show up.\n line = `M${CLUSTER_MANAGEMENT_CONSTANTS.PADDING_LEFT} ${y} L${lineMidPoint} ${y} L${lineWidth} ${y}`;\n } else {\n line = `M${CLUSTER_MANAGEMENT_CONSTANTS.PADDING_LEFT} ${y} ${lineWidth} ${y}`;\n }\n return line;\n })\n .style(\"marker-mid\", (link) => CDS.setArrowLink(link, ARROW_CONFIG.SMALL));\n\n linkStatesGroup\n .append('text')\n .style('font-size', CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_FONT_SIZE)\n .style('line-height', CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_LINE_HEIGHT)\n .style('font-weight', CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_FONT_WEIGHT)\n .text(function (d) {\n return translateAndSubscribe(this, 'cluster_management.cluster_graphical_view.' + d.linkTypeKey);\n })\n .attr('x', legendWidth/2 + CLUSTER_MANAGEMENT_CONSTANTS.LEGEND_ITEM_PADDING_LEFT)\n .attr('y', function (d, index) {\n return rowY.get(index) + 4;\n })\n .classed('links-statuses', true);\n };\n\n /**\n * Creates main legend container with rectangle that defines width, height and corner radius of legend.\n * @param {*} clusterViewD3Container - main container where legend have to live.\n */\n const createLegendGroup = (clusterViewD3Container) => {\n legendGroup = clusterViewD3Container.append('g')\n .classed('hidden-legend', $scope.hideLegend)\n .classed('cluster-legend-group', true);\n };\n\n const createLegendBackground = () => {\n legendGroup.append('rect')\n .attr('class', 'legend-background');\n };\n\n const updateLegendDimensions = () => {\n legendGroup\n .call((d) => {\n legendHeight = d.node().getBBox().height;\n });\n legendWidth = getMaxWidthOfChildren(legendGroup) + 30;\n };\n\n const updateLegendBackground = () => {\n const maxWidth = getMaxWidthOfChildren(legendGroup);\n legendGroup.select('.legend-background')\n .attr('height', legendHeight + CLUSTER_MANAGEMENT_CONSTANTS.PADDING_TOP * 3)\n .attr('width', maxWidth + CLUSTER_MANAGEMENT_CONSTANTS.BACKGROUND_PADDING)\n .attr('rx', '6');\n };\n\n const getMaxWidthOfChildren = (parent) => {\n let maxWidth = 0;\n\n parent.selectAll(':not(.legend-background)').each(function () {\n const bbox = this.getBBox();\n maxWidth = Math.max(maxWidth, bbox.width);\n });\n\n return maxWidth;\n };\n\n /**\n * Adds title to <code>legendGroup</code>.\n * @param {*} legendGroup - the root group tag (<g>) of legend.\n * @param {string} labelKey\n *\n * @return {*}\n */\n const addTitle = (legendGroup, labelKey) => {\n return legendGroup\n .append('text')\n .attr('class', 'legend-title')\n .attr('x', CLUSTER_MANAGEMENT_CONSTANTS.PADDING_LEFT)\n .style('font-size', CLUSTER_MANAGEMENT_CONSTANTS.TITLE_FONT_SIZE)\n .style('font-weight', CLUSTER_MANAGEMENT_CONSTANTS.TITLE_FONT_WEIGHT)\n .style('line-height', CLUSTER_MANAGEMENT_CONSTANTS.TITLE_LINE_HEIGHT)\n .text(function () {\n return translateAndSubscribe(this, labelKey);\n })\n .attr('y', () => {\n updateLegendDimensions();\n return legendHeight + CLUSTER_MANAGEMENT_CONSTANTS.TITLE_PADDING_TOP;\n });\n };\n\n const translateAndSubscribe = (domElement, labelKey) => {\n subscriptions.push($rootScope.$on('$translateChangeSuccess', () => {\n d3.select(domElement).text($translate.instant(labelKey));\n updateLegendBackground();\n }));\n\n return $translate.instant(labelKey);\n };\n\n const removeAllListeners = () => {\n $document.off('keydown', closeDialog);\n subscriptions.forEach((subscription) => subscription());\n };\n\n const closeDialog = () => {\n $scope.hideLegend = true;\n legendGroup.classed('hidden-legend', $scope.hideLegend);\n };\n\n const onKeyDown = (event) => {\n if (event.key === 'Escape') {\n closeDialog();\n }\n };\n\n // =========================\n // Subscriptions functions\n // =========================\n $document.on('keydown', onKeyDown);\n subscriptions.push(ClusterViewContextService.onClusterViewD3ContainerUpdated(init));\n\n // Deregister the watcher when the scope/directive is destroyed\n $scope.$on('$destroy', removeAllListeners);\n\n init();\n }\n };\n}\n","import {LinkState, NodeState, RecoveryState} from \"../../models/clustermanagement/states\";\nimport {isEmpty} from \"lodash\";\nimport {select, line} from 'd3';\n\nconst d3 = {\n line,\n select\n};\n\nconst clusterColors = {\n ontoOrange: 'var(--gw-primary-base)',\n ontoBlue: 'var(--gw-secondary-base)',\n ontoGreen: 'var(--gw-tertiary-base)',\n ontoGrey: 'var(--gw-neutral-base)'\n};\n\nconst linkStateColors = {\n [LinkState.IN_SYNC]: clusterColors.ontoBlue,\n [LinkState.SYNCING]: clusterColors.ontoBlue,\n [LinkState.OUT_OF_SYNC]: clusterColors.ontoGrey,\n [LinkState.RECEIVING_SNAPSHOT]: clusterColors.ontoBlue\n};\n\nconst linkStateStyle = {\n // solid line\n [LinkState.IN_SYNC]: 'none',\n // dashed line\n [LinkState.SYNCING]: '10 10',\n // dashed line\n [LinkState.OUT_OF_SYNC]: '10 10',\n // dashed line\n [LinkState.RECEIVING_SNAPSHOT]: '10 10'\n};\n\nconst font = {\n REMIXICON: 'REMIXICON',\n ICOMOON: 'ICOMOON',\n};\n\nconst shortMessageLimit = 40;\n\nexport function createClusterSvgElement(element) {\n return d3.select(element)\n .append('svg')\n .classed('cluster-diagram', true);\n}\n\nexport function createClusterZone(parent) {\n const clusterZone = parent.append('g');\n clusterZone\n .append(\"circle\")\n .classed('cluster-zone', true)\n .style('fill', 'transparent')\n .style('stroke-width', '4');\n return clusterZone;\n}\n\nexport function setCreateClusterZone(hasCluster, clusterZone, translationsMap, hasAccess = false) {\n clusterZone\n .select('.cluster-zone')\n .classed('no-cluster', !hasCluster)\n .classed('has-access', hasAccess);\n\n if (hasCluster) {\n clusterZone.selectAll('#no-cluster-zone').remove();\n } else {\n const textGroup = clusterZone\n .append('g')\n .attr(\"id\", \"no-cluster-zone\");\n textGroup\n .append('text')\n .attr('id', 'no-cluster-label')\n .text(translationsMap.no_cluster_configured)\n .attr('y', -50)\n .classed('h2', true)\n .style('text-anchor', \"middle\");\n if (hasAccess) {\n textGroup.append('text')\n .attr('id', 'create-cluster-label')\n .classed('h3', true)\n .text(translationsMap.create_cluster_btn)\n .style('text-anchor', \"middle\");\n }\n textGroup.append('text')\n .attr('y', 130)\n .attr('class', 'icon-any repo')\n .attr('fill', clusterColors.ontoOrange)\n .style('text-anchor', \"middle\")\n .classed('settings-icon', true)\n .text(\"\\ue92b\");\n }\n}\n\nexport function updateClusterZoneLabels(hasCluster, clusterZone, translationsMap) {\n if (hasCluster) {\n return;\n }\n clusterZone.select('#no-cluster-zone #no-cluster-label')\n .text(translationsMap.no_cluster_configured);\n clusterZone.select('#no-cluster-zone #create-cluster-label')\n .text(translationsMap.create_cluster_btn);\n}\n\nexport function moveElement(element, x, y) {\n element.attr('transform', () => {\n return `translate(${x}, ${y})`;\n });\n}\n\nexport function createNodes(nodesDataBinding, nodeRadius, isLegend) {\n const nodeGroup = nodesDataBinding.enter()\n .append('g')\n .attr('id', 'node-group')\n .classed('legend', isLegend);\n\n const nodeUpdateElements = nodeGroup\n .merge(nodesDataBinding)\n .attr('id', 'node-group')\n .classed('legend', isLegend);\n\n createHexagon(nodeGroup, nodeRadius);\n nodesDataBinding.exit().remove();\n\n nodeGroup\n .append('text')\n .attr('class', 'icon-any node-icon');\n\n if (!isLegend) {\n addHostnameToNodes(nodeGroup, nodeRadius, isLegend);\n }\n return nodeUpdateElements;\n}\n\nfunction addHostnameToNodes(nodeElements, nodeRadius) {\n const nodeTextHost = nodeElements.append('g');\n\n nodeTextHost\n .append('rect')\n .attr('class', 'id-host-background')\n .attr('rx', 6);\n\n nodeTextHost\n .append('rect')\n .attr('class', 'node-info-background')\n .attr('rx', 6);\n\n nodeTextHost\n .append('text')\n .attr('y', nodeRadius + 25)\n .attr('class', 'id id-host');\n\n nodeTextHost\n .append('text')\n .attr('y', nodeRadius + 55)\n .attr('class', 'node-info-text');\n}\n\nexport function updateNodes(nodes) {\n updateNodesIcon(nodes);\n updateNodesClasses(nodes);\n updateNodesHostnameText(nodes);\n updateNodesInfoText(nodes);\n}\n\nfunction updateNodesClasses(nodes) {\n nodes\n .select('.node.member')\n .classed('leader', (node) => node.nodeState === NodeState.LEADER)\n .classed('follower', (node) => node.nodeState === NodeState.FOLLOWER)\n .classed('candidate', (node) => node.nodeState === NodeState.CANDIDATE)\n .classed('other', (node) => {\n return node.nodeState !== NodeState.LEADER &&\n node.nodeState !== NodeState.FOLLOWER &&\n node.nodeState !== NodeState.CANDIDATE;\n });\n}\n\nfunction updateNodesIcon(nodes) {\n nodes.select('.node-icon')\n .each(function (d) {\n const iconType = hasRecoveryState(d) ? getNodeInfoIconType(d) : getNodeIconType(d);\n d3.select(this)\n .classed('icon-any', iconType.font === font.ICOMOON)\n .classed('remixicon', iconType.font === font.REMIXICON)\n .text(iconType.icon);\n });\n}\n\nfunction hasRecoveryState(node) {\n return !isEmpty(node.recoveryStatus);\n}\n\nconst iconMap = {\n [RecoveryState.SEARCHING_FOR_NODE]: {icon: '\\uf045', font: font.REMIXICON}, //ri-question-line\n [RecoveryState.WAITING_FOR_SNAPSHOT]: {icon: '\\uf20f', font: font.REMIXICON}, //ri-time-line\n [RecoveryState.RECEIVING_SNAPSHOT]: {icon: '\\uec54', font: font.REMIXICON}, //ri-download-2-line\n [RecoveryState.APPLYING_SNAPSHOT]: {icon: '\\uec30', font: font.REMIXICON}, //ri-device-recover-line\n [RecoveryState.BUILDING_SNAPSHOT]: {icon: '\\uf3a7', font: font.REMIXICON}, //ri-archive-2-line\n [RecoveryState.SENDING_SNAPSHOT]: {icon: '\\uf24a', font: font.REMIXICON}, //ri-upload-2-line\n [RecoveryState.RECOVERY_OPERATION_FAILURE_WARNING]: {icon: '\\ue920', font: font.ICOMOON},\n};\n\nconst nodeStateIcons = {\n [NodeState.CANDIDATE]: {icon: '\\ue914', font: font.ICOMOON},\n [NodeState.NO_CONNECTION]: {icon: '\\ue931', font: font.ICOMOON},\n [NodeState.OUT_OF_SYNC]: {icon: '\\ue920', font: font.ICOMOON},\n [NodeState.READ_ONLY]: {icon: '\\ue95c', font: font.ICOMOON},\n [NodeState.RESTRICTED]: {icon: '\\ue933', font: font.ICOMOON}\n};\n\nfunction getNodeInfoIconType(node) {\n const status = node.recoveryStatus;\n\n if (!status || !status.state) {\n return {icon: '', font: ''};\n }\n\n return iconMap[status.state] || {icon: '', font: ''};\n}\n\nfunction getNodeIconType(node) {\n const iconType = nodeStateIcons[node.nodeState];\n return iconType ? iconType : {icon: '', font: ''};\n}\n\nfunction updateNodesInfoText(nodes) {\n let objectHeight;\n let objectWidth;\n // Set initial text element\n nodes.select('.node-info-text')\n .each(function (d) {\n d.infoNode = this;\n })\n .select(function () {\n return this.parentNode;\n })\n .append('foreignObject')\n .attr('width', function (d) {\n let shortMessage = '';\n if (!isEmpty(d.recoveryStatus)) {\n shortMessage = extractShortMessageFromNode(d);\n }\n const rect = calculateElementSizeByText(shortMessage);\n objectHeight = rect.height;\n objectWidth = rect.width;\n return objectWidth;\n })\n .attr('height', function (d) {\n return objectHeight;\n })\n .attr('x', function (d) {\n return -(objectWidth / 2);\n })\n .attr('y', function (d) {\n return 78;\n })\n .classed('hidden', function (d) {\n return isEmpty(d.recoveryStatus);\n })\n .style('font-size', '12px')\n .style('font-weight', '400')\n .style('text-align', 'center')\n .style('padding', '4px')\n .style('background', '#EEEEEE')\n .style('border-radius', '6px')\n .attr('class', 'node-info-fo')\n .append('xhtml:div')\n .html(function (d) {\n return extractShortMessageFromNode(d);\n });\n\n // Remove the original text elements, as they are now replaced by foreignObjects\n nodes.select('.node-info-text').remove();\n\n resizeLabelDynamic(nodes);\n}\n\nfunction extractShortMessageFromNode(node) {\n return node.recoveryStatus.message && node.recoveryStatus.message.length > shortMessageLimit ?\n node.recoveryStatus.message.substring(0, shortMessageLimit) + '...' : node.recoveryStatus.message || '';\n}\n\nfunction calculateElementSizeByText(text) {\n const tmp = document.createElement('div');\n tmp.innerHTML = text;\n tmp.style.padding = '4px';\n tmp.style.position = 'absolute';\n tmp.style.visibility = 'hidden';\n tmp.style.fontSize = '12px';\n tmp.style.fontWeight = '400';\n tmp.style.textAlign = 'center';\n tmp.style.height = 'auto';\n tmp.style.width = 'auto';\n tmp.style.whiteSpace = 'nowrap';\n\n document.body.appendChild(tmp);\n const rect = tmp.getBoundingClientRect();\n const height = rect.height;\n const width = rect.width;\n document.body.removeChild(tmp);\n\n return {height, width};\n}\n\nfunction addRecoveryLabelListeners(object, message, truncatedSize, displayMessage, fullSize) {\n object.on('mouseover.tooltip', () => {\n object\n .attr('width', fullSize.width)\n .attr('height', fullSize.height)\n .attr('x', -fullSize.width / 2)\n .html(`<div>${message}</div>`);\n });\n object.on('mouseout.tooltip', () => {\n object\n .attr('width', truncatedSize.width)\n .attr('height', truncatedSize.height)\n .attr('x', -truncatedSize.width / 2)\n .html(`<div>${displayMessage}</div>`);\n });\n}\n\nfunction resizeLabelDynamic(nodes) {\n nodes.select('.node-info-fo')\n .each(function (d) {\n const object = d3.select(this);\n if (isEmpty(d.recoveryStatus)) {\n object.attr('width', 0);\n return;\n }\n const shortMessage = extractShortMessageFromNode(d);\n const isShorten = d.recoveryStatus.message && d.recoveryStatus.message.length > shortMessageLimit && shortMessage !== d.recoveryStatus.message;\n const displayMessage = isShorten ? shortMessage : d.recoveryStatus.message;\n const truncatedSize = calculateElementSizeByText(shortMessage);\n const fullSize = calculateElementSizeByText(d.recoveryStatus.message);\n object.on('.tooltip', null);\n\n if (isShorten) {\n addRecoveryLabelListeners(object, d.recoveryStatus.message, truncatedSize, displayMessage, fullSize);\n }\n\n // Set initial size and text\n object\n .attr('width', truncatedSize.width)\n .attr('height', truncatedSize.height)\n .attr('x', -truncatedSize.width / 2)\n .html(`<div>${displayMessage}</div>`);\n });\n}\n\nfunction updateNodesHostnameText(nodes) {\n nodes\n .select('.id.id-host')\n .each(function (d) {\n d.labelNode = this;\n })\n .text(function (d) {\n return d.hostname;\n });\n\n // Add padding styling to text background. left/right/top/bottom +5\n nodes\n .select('.id-host-background')\n .attr('width', function (d) {\n return d3.select(d.labelNode).node().getBBox().width + 10;\n })\n .attr('height', function (d) {\n return d3.select(d.labelNode).node().getBBox().height + 10;\n })\n .attr('x', function (d) {\n return d3.select(d.labelNode).node().getBBox().x - 5;\n })\n .attr('y', function (d) {\n return d3.select(d.labelNode).node().getBBox().y - 5;\n });\n}\n\nexport function createLinks(linksDataBinding) {\n linksDataBinding.enter()\n .append('path')\n .classed('link', true);\n\n linksDataBinding.exit().remove();\n}\n\nexport function updateLinks(linksDataBinding, nodes) {\n linksDataBinding\n .attr('class', (link) => {\n // add the link id as a css class for testing purposes\n const idClass = link.id.replaceAll(':', '-');\n return `link ${idClass}`;\n })\n .attr('stroke', setLinkColor)\n .style('stroke-dasharray', setLinkStyle)\n .style(\"marker-mid\", (link) => setArrowLink(link, ARROW_CONFIG.BIG))\n .attr('d', (link) => getLinkCoordinates(link, nodes));\n}\n\nexport const ARROW_CONFIG = {\n SMALL: {name: 'small', size: 3},\n BIG: {name: 'big', size: 5}\n};\n\nexport function addArrowHead(svg, config) {\n svg.append(\"svg:defs\").append(\"svg:marker\")\n .attr(\"id\", `arrowhead_${config.name}`)\n .attr(\"viewBox\", `0 0 ${config.size * 2} ${config.size * 2}`)\n .attr(\"refX\", config.size)\n .attr(\"refY\", config.size)\n .attr(\"markerWidth\", config.size)\n .attr(\"markerHeight\", config.size)\n .attr(\"orient\", \"auto-start-reverse\")\n .append(\"path\")\n .attr(\"d\", `M 0 0 L ${config.size * 2} ${config.size} L 0 ${config.size * 2} z`)\n .style(\"fill\", \"var(--gw-secondary-base)\");\n}\n\nexport function setArrowLink(link, config) {\n if (link.status === LinkState.RECEIVING_SNAPSHOT) {\n return `url(#arrowhead_${config.name})`;\n }\n}\n\nexport function setLinkColor(link) {\n const linkColor = linkStateColors[link.status];\n return linkColor || 'none';\n}\n\nexport function setLinkStyle(link) {\n const linkStyle = linkStateStyle[link.status];\n return linkStyle || 'none';\n}\n\nfunction getLinkCoordinates(link, nodes) {\n const source = nodes.find((node) => node.address === link.source);\n const target = nodes.find((node) => node.address === link.target);\n const deltaX = target.x - source.x;\n const deltaY = target.y - source.y;\n const dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n const normX = deltaX / dist;\n const normY = deltaY / dist;\n // Padding from node center point\n const sourcePadding = 55;\n const targetPadding = 55;\n const sourceX = source.x + (sourcePadding * normX);\n const sourceY = source.y + (sourcePadding * normY);\n const targetX = target.x - (targetPadding * normX);\n const targetY = target.y - (targetPadding * normY);\n // Calculate midpoint\n const midpointX = (sourceX + targetX) / 2;\n const midpointY = (sourceY + targetY) / 2;\n // In order to draw an arrowhead in the middle of a line, the line needs to be composed by\n // two segments, otherwise the arrowhead won't show up.\n return 'M' + sourceX + ',' + sourceY + 'L' + midpointX + ',' + midpointY +\n 'L' + targetX + ',' + targetY;\n}\n\nexport function positionNodesOnClusterZone(nodeElements, clusterZoneX, clusterZoneY, clusterZoneRadius) {\n nodeElements\n .attr('transform', (node, index) => {\n // Calculate initial positions for the new nodes based on\n // spreading them evenly on a circle around the center of the page.\n const theta = 2 * Math.PI * index / nodeElements.size();\n const x = clusterZoneX + Math.cos(theta) * clusterZoneRadius;\n const y = clusterZoneY + Math.sin(theta) * clusterZoneRadius;\n node.x = x;\n node.y = y;\n return `translate(${x}, ${y})`;\n });\n}\n\nexport function createHexagon(nodeGroup, radius) {\n const _s32 = (Math.sqrt(3) / 2);\n const xDiff = 0;\n const yDiff = 0;\n const points = [[radius + xDiff, yDiff], [radius / 2 + xDiff, radius * _s32 + yDiff], [-radius / 2 + xDiff, radius * _s32 + yDiff],\n [-radius + xDiff, yDiff],\n [-radius / 2 + xDiff, -radius * _s32 + yDiff], [radius / 2 + xDiff, -radius * _s32 + yDiff], [radius + xDiff, yDiff],\n [radius / 2 + xDiff, radius * _s32 + yDiff]];\n return nodeGroup\n .selectAll(\"path.area\")\n .data([points])\n .enter()\n .append(\"path\")\n .attr('class', 'node member')\n .attr(\"stroke-width\", \"10\")\n .attr(\"stroke-linejoin\", \"round\")\n .attr(\"d\", d3.line());\n}\n\nexport function removeEventListeners() {\n d3.select(document).selectAll('.node-info-fo').on('.tooltip', null);\n}\n","import {NodeState} from \"./node-state\";\nimport {LinkState} from \"./states\";\n\nconst CLUSTER_MANAGEMENT_CONSTANTS = (function () {\n const SVG_NODE_WIDTH = 15;\n\n const PADDING_LEFT = 12;\n const PADDING_TOP = 12;\n\n const TITLE_PADDING_TOP = 15;\n const TITLE_FONT_SIZE = 13;\n const TITLE_FONT_WEIGHT = 700;\n const TITLE_LINE_HEIGHT = 18;\n\n const LEGEND_ITEMS_PADDING_TOP = 40;\n const LEGEND_ITEM_PADDING_TOP = 8;\n const LEGEND_ITEM_ICON_FONT_SIZE = 15;\n const LEGEND_ITEM_FONT_SIZE = 11;\n const LEGEND_ITEM_FONT_WEIGHT = 400;\n const LEGEND_ITEM_LINE_HEIGHT = 13;\n const LEGEND_ITEM_PADDING_LEFT = PADDING_LEFT + SVG_NODE_WIDTH;\n\n const BACKGROUND_PADDING = PADDING_LEFT * 2;\n\n const getLegendNodes = function () {\n const legendNodes = [];\n legendNodes.push({nodeState: NodeState.LEADER, customText: 'node_state_leader'});\n legendNodes.push({nodeState: NodeState.FOLLOWER, customText: 'node_state_follower'});\n // the out of sync node in the leged should not have an icon\n legendNodes.push({nodeState: NodeState.OUT_OF_SYNC_BLANK, customText: 'node_state_out_of_sync'});\n legendNodes.forEach((node, index) => node.id = index);\n return legendNodes;\n };\n\n const getLegendLinks = function () {\n const links = [];\n links.push({status: LinkState.IN_SYNC, linkTypeKey: 'link_state_in_sync'});\n links.push({status: LinkState.SYNCING, linkTypeKey: 'link_state_syncing'});\n links.push({status: LinkState.OUT_OF_SYNC, linkTypeKey: 'link_state_out_of_sync'});\n links.push({status: LinkState.RECEIVING_SNAPSHOT, linkTypeKey: 'link_state_receiving_snapshot'});\n links.forEach((link, index) => link.id = index);\n return links;\n };\n\n const getSyncStatuses = () => {\n return [\n {\n labelKey: 'node_state_candidate',\n classes: 'remixicon',\n icon: '\\ueb81', //ri-checkbox-circle-line\n }, {\n labelKey: 'node_state_no_cluster',\n classes: 'remixicon',\n icon: '\\ueb99', //ri-close-line\n }, {\n labelKey: 'link_state_out_of_sync',\n classes: 'remixicon',\n icon: '\\uea21', //ri-alert-line\n }, {\n labelKey: 'node_state_no_connection',\n classes: 'remixicon',\n icon: '\\ueeb1', //ri-link-unlink\n }, {\n labelKey: 'node_state_read_only',\n classes: 'remixicon',\n icon: '\\uece2', //ri-file-forbid-line\n }, {\n labelKey: 'node_state_restricted',\n classes: 'remixicon',\n icon: '\\uee71', //ri-key-line\n }, {\n labelKey: 'recovery_state.searching_for_node',\n classes: 'remixicon',\n icon: '\\uf045', //ri-question-line\n }, {\n labelKey: 'recovery_state.waiting_for_snapshot',\n classes: 'remixicon',\n icon: '\\uf20f', //ri-time-line\n }, {\n labelKey: 'recovery_state.building_snapshot',\n classes: 'remixicon',\n icon: '\\uf3a7', //ri-archive-2-line\n }, {\n labelKey: 'recovery_state.sending_snapshot',\n classes: 'remixicon',\n icon: '\\uf24a', //ri-upload-2-line\n }, {\n labelKey: 'recovery_state.receiving_snapshot',\n classes: 'remixicon',\n icon: '\\uec54', //ri-download-2-line\n }, {\n labelKey: 'recovery_state.applying_snapshot',\n classes: 'remixicon',\n icon: '\\uec30', //ri-device-recover-line\n },\n ];\n };\n\n return {\n getLegendNodes,\n getSyncStatuses,\n getLegendLinks,\n SVG_NODE_WIDTH,\n PADDING_LEFT,\n PADDING_TOP,\n TITLE_PADDING_TOP,\n TITLE_FONT_SIZE,\n TITLE_FONT_WEIGHT,\n TITLE_LINE_HEIGHT,\n LEGEND_ITEM_FONT_SIZE,\n LEGEND_ITEM_ICON_FONT_SIZE,\n LEGEND_ITEM_FONT_WEIGHT,\n LEGEND_ITEM_LINE_HEIGHT,\n LEGEND_ITEM_PADDING_LEFT,\n LEGEND_ITEMS_PADDING_TOP,\n LEGEND_ITEM_PADDING_TOP,\n BACKGROUND_PADDING\n };\n})();\n\nexport {\n CLUSTER_MANAGEMENT_CONSTANTS\n};\n","export const NodeState = {\n LEADER: 'LEADER',\n FOLLOWER: 'FOLLOWER',\n CANDIDATE: 'CANDIDATE',\n // node without icon\n OUT_OF_SYNC_BLANK: 'OUT_OF_SYNC_BLANK'\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":["d3","select","clusterLegend","$rootScope","ClusterViewContextService","$translate","$document","restrict","templateUrl","scope","link","$scope","hideLegend","subscriptions","legendGroup","legendHeight","legendWidth","toggleLegend","classed","init","clusterViewD3Container","getClusterViewD3Container","createLegendGroup","createLegendBackground","addNodeStates","addSyncStatus","addLinks","updateLegendDimensions","updateLegendBackground","addTitle","legendNodeData","selectAll","data","CLUSTER_MANAGEMENT_CONSTANTS","getLegendNodes","legendNodesElements","CDS","SVG_NODE_WIDTH","attr","d","i","LEGEND_ITEM_PADDING_LEFT","LEGEND_ITEM_PADDING_TOP","append","style","LEGEND_ITEM_FONT_WEIGHT","PADDING_LEFT","text","translateAndSubscribe","this","customText","syncStatusesGroups","getSyncStatuses","enter","rowY","Map","classes","index","rowTop","LEGEND_ITEMS_PADDING_TOP","set","icon","labelOffsetY","LEGEND_ITEM_ICON_FONT_SIZE","LEGEND_ITEM_FONT_SIZE","labelKey","get","linkStatesGroup","getLegendLinks","y","lineWidth","line","status","LinkState","RECEIVING_SNAPSHOT","lineMidPoint","ARROW_CONFIG","SMALL","LEGEND_ITEM_LINE_HEIGHT","linkTypeKey","call","node","getBBox","height","getMaxWidthOfChildren","maxWidth","PADDING_TOP","BACKGROUND_PADDING","parent","each","bbox","Math","max","width","TITLE_FONT_SIZE","TITLE_FONT_WEIGHT","TITLE_LINE_HEIGHT","TITLE_PADDING_TOP","domElement","push","$on","instant","closeDialog","on","event","key","onClusterViewD3ContainerUpdated","removeAllListeners","off","forEach","subscription","angular","module","directive","$inject","clusterColors","linkStateColors","IN_SYNC","SYNCING","OUT_OF_SYNC","linkStateStyle","font","createClusterSvgElement","element","createClusterZone","clusterZone","setCreateClusterZone","hasCluster","translationsMap","hasAccess","remove","textGroup","no_cluster_configured","create_cluster_btn","updateClusterZoneLabels","moveElement","x","createNodes","nodesDataBinding","nodeRadius","isLegend","nodeGroup","nodeUpdateElements","merge","radius","_s32","sqrt","points","createHexagon","exit","nodeElements","nodeTextHost","addHostnameToNodes","updateNodes","nodes","iconType","isEmpty","recoveryStatus","nodeStateIcons","nodeState","getNodeIconType","state","iconMap","getNodeInfoIconType","updateNodesIcon","NodeState","LEADER","FOLLOWER","CANDIDATE","updateNodesClasses","labelNode","hostname","updateNodesHostnameText","objectHeight","objectWidth","infoNode","parentNode","shortMessage","extractShortMessageFromNode","rect","calculateElementSizeByText","html","object","isShorten","message","length","displayMessage","truncatedSize","fullSize","addRecoveryLabelListeners","resizeLabelDynamic","updateNodesInfoText","RecoveryState","SEARCHING_FOR_NODE","WAITING_FOR_SNAPSHOT","APPLYING_SNAPSHOT","BUILDING_SNAPSHOT","SENDING_SNAPSHOT","RECOVERY_OPERATION_FAILURE_WARNING","NO_CONNECTION","READ_ONLY","RESTRICTED","substring","tmp","document","createElement","innerHTML","padding","position","visibility","fontSize","fontWeight","textAlign","whiteSpace","body","appendChild","getBoundingClientRect","removeChild","createLinks","linksDataBinding","updateLinks","id","replaceAll","setLinkColor","setLinkStyle","setArrowLink","BIG","source","find","address","target","deltaX","deltaY","dist","normX","normY","sourceX","sourceY","targetX","targetY","getLinkCoordinates","name","size","addArrowHead","svg","config","positionNodesOnClusterZone","clusterZoneX","clusterZoneY","clusterZoneRadius","theta","PI","cos","sin","removeEventListeners","legendNodes","OUT_OF_SYNC_BLANK","links","NO_CLUSTER","TopologyState","PRIMARY_NODE","SECONDARY_NODE"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export const __webpack_esm_id__=24125;export const __webpack_esm_ids__=[24125,58325,80706];export const __webpack_esm_modules__={24125(t,e,n){n.d(e,{$$:()=>A,CQ:()=>v,D6:()=>R,HF:()=>E,Iz:()=>T,J5:()=>N,Wg:()=>D,Xl:()=>h,ZC:()=>m,_D:()=>x,cZ:()=>f,cy:()=>y,dB:()=>_,kI:()=>O,r_:()=>S,ss:()=>Y});var o=n(58325),s=n(22723),r=n(44482);const a={line:r.line,select:r.select},i="var(--gw-secondary-base)",c={[o.gC.IN_SYNC]:i,[o.gC.SYNCING]:i,[o.gC.OUT_OF_SYNC]:"var(--gw-neutral-base)",[o.gC.RECEIVING_SNAPSHOT]:i},d={[o.gC.IN_SYNC]:"none",[o.gC.SYNCING]:"10 10",[o.gC.OUT_OF_SYNC]:"10 10",[o.gC.RECEIVING_SNAPSHOT]:"10 10"},l="REMIXICON",u="ICOMOON";function N(t){return a.select(t).append("svg").classed("cluster-diagram",!0)}function _(t){const e=t.append("g");return e.append("circle").classed("cluster-zone",!0).style("fill","transparent").style("stroke-width","4"),e}function h(t,e,n,o=!1){if(e.select(".cluster-zone").classed("no-cluster",!t).classed("has-access",o),t)e.selectAll("#no-cluster-zone").remove();else{const t=e.append("g").attr("id","no-cluster-zone");t.append("text").attr("id","no-cluster-label").text(n.no_cluster_configured).attr("y",-50).classed("h2",!0).style("text-anchor","middle"),o&&t.append("text").attr("id","create-cluster-label").classed("h3",!0).text(n.create_cluster_btn).style("text-anchor","middle"),t.append("text").attr("y",130).attr("class","icon-any repo").attr("fill","var(--gw-primary-base)").style("text-anchor","middle").classed("settings-icon",!0).text("")}}function S(t,e,n){t||(e.select("#no-cluster-zone #no-cluster-label").text(n.no_cluster_configured),e.select("#no-cluster-zone #create-cluster-label").text(n.create_cluster_btn))}function f(t,e,n){t.attr("transform",()=>`translate(${e}, ${n})`)}function O(t,e,n){const o=t.enter().append("g").attr("id","node-group").classed("legend",n),s=o.merge(t).attr("id","node-group").classed("legend",n);return function(t,e){const n=Math.sqrt(3)/2,o=[[e+0,0],[e/2+0,e*n+0],[-e/2+0,e*n+0],[0-e,0],[-e/2+0,-e*n+0],[e/2+0,-e*n+0],[e+0,0],[e/2+0,e*n+0]];t.selectAll("path.area").data([o]).enter().append("path").attr("class","node member").attr("stroke-width","10").attr("stroke-linejoin","round").attr("d",a.line())}(o,e),t.exit().remove(),o.append("text").attr("class","icon-any node-icon"),n||function(t,e){const n=t.append("g");n.append("rect").attr("class","id-host-background").attr("rx",6),n.append("rect").attr("class","node-info-background").attr("rx",6),n.append("text").attr("y",e+25).attr("class","id id-host"),n.append("text").attr("y",e+55).attr("class","node-info-text")}(o,e),s}function E(t){!function(t){t.select(".node-icon").each(function(t){const e=(n=t,(0,s.isEmpty)(n.recoveryStatus)?function(t){return g[t.nodeState]||{icon:"",font:""}}(t):function(t){const e=t.recoveryStatus;return e&&e.state&&p[e.state]||{icon:"",font:""}}(t));var n;a.select(this).classed("icon-any",e.font===u).classed("remixicon",e.font===l).text(e.icon)})}(t),function(t){t.select(".node.member").classed("leader",t=>t.nodeState===o.UY.LEADER).classed("follower",t=>t.nodeState===o.UY.FOLLOWER).classed("candidate",t=>t.nodeState===o.UY.CANDIDATE).classed("other",t=>t.nodeState!==o.UY.LEADER&&t.nodeState!==o.UY.FOLLOWER&&t.nodeState!==o.UY.CANDIDATE)}(t),function(t){t.select(".id.id-host").each(function(t){t.labelNode=this}).text(function(t){return t.hostname}),t.select(".id-host-background").attr("width",function(t){return a.select(t.labelNode).node().getBBox().width+10}).attr("height",function(t){return a.select(t.labelNode).node().getBBox().height+10}).attr("x",function(t){return a.select(t.labelNode).node().getBBox().x-5}).attr("y",function(t){return a.select(t.labelNode).node().getBBox().y-5})}(t),function(t){let e,n;t.select(".node-info-text").each(function(t){t.infoNode=this}).select(function(){return this.parentNode}).append("foreignObject").attr("width",function(t){let o="";(0,s.isEmpty)(t.recoveryStatus)||(o=I(t));const r=C(o);return e=r.height,n=r.width,n}).attr("height",function(t){return e}).attr("x",function(t){return-n/2}).attr("y",function(t){return 78}).classed("hidden",function(t){return(0,s.isEmpty)(t.recoveryStatus)}).style("font-size","12px").style("font-weight","400").style("text-align","center").style("padding","4px").style("background","#EEEEEE").style("border-radius","6px").attr("class","node-info-fo").append("xhtml:div").html(function(t){return I(t)}),t.select(".node-info-text").remove(),function(t){t.select(".node-info-fo").each(function(t){const e=a.select(this);if((0,s.isEmpty)(t.recoveryStatus))return void e.attr("width",0);const n=I(t),o=t.recoveryStatus.message&&t.recoveryStatus.message.length>40&&n!==t.recoveryStatus.message,r=o?n:t.recoveryStatus.message,i=C(n),c=C(t.recoveryStatus.message);e.on(".tooltip",null),o&&function(t,e,n,o,s){t.on("mouseover.tooltip",()=>{t.attr("width",s.width).attr("height",s.height).attr("x",-s.width/2).html(`<div>${e}</div>`)}),t.on("mouseout.tooltip",()=>{t.attr("width",n.width).attr("height",n.height).attr("x",-n.width/2).html(`<div>${o}</div>`)})}(e,t.recoveryStatus.message,i,r,c),e.attr("width",i.width).attr("height",i.height).attr("x",-i.width/2).html(`<div>${r}</div>`)})}(t)}(t)}const p={[o.vQ.SEARCHING_FOR_NODE]:{icon:"",font:l},[o.vQ.WAITING_FOR_SNAPSHOT]:{icon:"",font:l},[o.vQ.RECEIVING_SNAPSHOT]:{icon:"",font:l},[o.vQ.APPLYING_SNAPSHOT]:{icon:"",font:l},[o.vQ.BUILDING_SNAPSHOT]:{icon:"",font:l},[o.vQ.SENDING_SNAPSHOT]:{icon:"",font:l},[o.vQ.RECOVERY_OPERATION_FAILURE_WARNING]:{icon:"",font:u}},g={[o.UY.CANDIDATE]:{icon:"",font:u},[o.UY.NO_CONNECTION]:{icon:"",font:u},[o.UY.OUT_OF_SYNC]:{icon:"",font:u},[o.UY.READ_ONLY]:{icon:"",font:u},[o.UY.RESTRICTED]:{icon:"",font:u}};function I(t){return t.recoveryStatus.message&&t.recoveryStatus.message.length>40?t.recoveryStatus.message.substring(0,40)+"...":t.recoveryStatus.message||""}function C(t){const e=document.createElement("div");e.innerHTML=t,e.style.padding="4px",e.style.position="absolute",e.style.visibility="hidden",e.style.fontSize="12px",e.style.fontWeight="400",e.style.textAlign="center",e.style.height="auto",e.style.width="auto",e.style.whiteSpace="nowrap",document.body.appendChild(e);const n=e.getBoundingClientRect(),o=n.height,s=n.width;return document.body.removeChild(e),{height:o,width:s}}function y(t){t.enter().append("path").classed("link",!0),t.exit().remove()}function A(t,e){t.attr("class",t=>`link ${t.id.replaceAll(":","-")}`).attr("stroke",x).style("stroke-dasharray",v).style("marker-mid",t=>T(t,m.BIG)).attr("d",t=>function(t,e){const n=e.find(e=>e.address===t.source),o=e.find(e=>e.address===t.target),s=o.x-n.x,r=o.y-n.y,a=Math.sqrt(s*s+r*r),i=s/a,c=r/a,d=n.x+55*i,l=n.y+55*c,u=o.x-55*i,N=o.y-55*c;return"M"+d+","+l+"L"+(d+u)/2+","+(l+N)/2+"L"+u+","+N}(t,e))}const m={SMALL:{name:"small",size:3},BIG:{name:"big",size:5}};function R(t,e){t.append("svg:defs").append("svg:marker").attr("id",`arrowhead_${e.name}`).attr("viewBox",`0 0 ${2*e.size} ${2*e.size}`).attr("refX",e.size).attr("refY",e.size).attr("markerWidth",e.size).attr("markerHeight",e.size).attr("orient","auto-start-reverse").append("path").attr("d",`M 0 0 L ${2*e.size} ${e.size} L 0 ${2*e.size} z`).style("fill","var(--gw-secondary-base)")}function T(t,e){if(t.status===o.gC.RECEIVING_SNAPSHOT)return`url(#arrowhead_${e.name})`}function x(t){return c[t.status]||"none"}function v(t){return d[t.status]||"none"}function Y(t,e,n,o){t.attr("transform",(s,r)=>{const a=2*Math.PI*r/t.size(),i=e+Math.cos(a)*o,c=n+Math.sin(a)*o;return s.x=i,s.y=c,`translate(${i}, ${c})`})}function D(){a.select(document).selectAll(".node-info-fo").on(".tooltip",null)}},58325(t,e,n){n.d(e,{UY:()=>o,gC:()=>r,vQ:()=>s,zB:()=>a});const o={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"},s={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"},r={IN_SYNC:"IN_SYNC",OUT_OF_SYNC:"OUT_OF_SYNC",SYNCING:"SYNCING",NO_CONNECTION:"NO_CONNECTION",RECEIVING_SNAPSHOT:"RECEIVING_SNAPSHOT"},a={PRIMARY_NODE:"PRIMARY_NODE",SECONDARY_NODE:"SECONDARY_NODE"}}};
|
|
2
|
-
//# sourceMappingURL=24125.fc41760fdae44b0480c8.bundle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"24125.fc41760fdae44b0480c8.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/clustermanagement/services/cluster-drawing.service.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/clustermanagement/states.js"],"sourcesContent":["import {LinkState, NodeState, RecoveryState} from \"../../models/clustermanagement/states\";\nimport {isEmpty} from \"lodash\";\nimport {select, line} from 'd3';\n\nconst d3 = {\n line,\n select\n};\n\nconst clusterColors = {\n ontoOrange: 'var(--gw-primary-base)',\n ontoBlue: 'var(--gw-secondary-base)',\n ontoGreen: 'var(--gw-tertiary-base)',\n ontoGrey: 'var(--gw-neutral-base)'\n};\n\nconst linkStateColors = {\n [LinkState.IN_SYNC]: clusterColors.ontoBlue,\n [LinkState.SYNCING]: clusterColors.ontoBlue,\n [LinkState.OUT_OF_SYNC]: clusterColors.ontoGrey,\n [LinkState.RECEIVING_SNAPSHOT]: clusterColors.ontoBlue\n};\n\nconst linkStateStyle = {\n // solid line\n [LinkState.IN_SYNC]: 'none',\n // dashed line\n [LinkState.SYNCING]: '10 10',\n // dashed line\n [LinkState.OUT_OF_SYNC]: '10 10',\n // dashed line\n [LinkState.RECEIVING_SNAPSHOT]: '10 10'\n};\n\nconst font = {\n REMIXICON: 'REMIXICON',\n ICOMOON: 'ICOMOON',\n};\n\nconst shortMessageLimit = 40;\n\nexport function createClusterSvgElement(element) {\n return d3.select(element)\n .append('svg')\n .classed('cluster-diagram', true);\n}\n\nexport function createClusterZone(parent) {\n const clusterZone = parent.append('g');\n clusterZone\n .append(\"circle\")\n .classed('cluster-zone', true)\n .style('fill', 'transparent')\n .style('stroke-width', '4');\n return clusterZone;\n}\n\nexport function setCreateClusterZone(hasCluster, clusterZone, translationsMap, hasAccess = false) {\n clusterZone\n .select('.cluster-zone')\n .classed('no-cluster', !hasCluster)\n .classed('has-access', hasAccess);\n\n if (hasCluster) {\n clusterZone.selectAll('#no-cluster-zone').remove();\n } else {\n const textGroup = clusterZone\n .append('g')\n .attr(\"id\", \"no-cluster-zone\");\n textGroup\n .append('text')\n .attr('id', 'no-cluster-label')\n .text(translationsMap.no_cluster_configured)\n .attr('y', -50)\n .classed('h2', true)\n .style('text-anchor', \"middle\");\n if (hasAccess) {\n textGroup.append('text')\n .attr('id', 'create-cluster-label')\n .classed('h3', true)\n .text(translationsMap.create_cluster_btn)\n .style('text-anchor', \"middle\");\n }\n textGroup.append('text')\n .attr('y', 130)\n .attr('class', 'icon-any repo')\n .attr('fill', clusterColors.ontoOrange)\n .style('text-anchor', \"middle\")\n .classed('settings-icon', true)\n .text(\"\\ue92b\");\n }\n}\n\nexport function updateClusterZoneLabels(hasCluster, clusterZone, translationsMap) {\n if (hasCluster) {\n return;\n }\n clusterZone.select('#no-cluster-zone #no-cluster-label')\n .text(translationsMap.no_cluster_configured);\n clusterZone.select('#no-cluster-zone #create-cluster-label')\n .text(translationsMap.create_cluster_btn);\n}\n\nexport function moveElement(element, x, y) {\n element.attr('transform', () => {\n return `translate(${x}, ${y})`;\n });\n}\n\nexport function createNodes(nodesDataBinding, nodeRadius, isLegend) {\n const nodeGroup = nodesDataBinding.enter()\n .append('g')\n .attr('id', 'node-group')\n .classed('legend', isLegend);\n\n const nodeUpdateElements = nodeGroup\n .merge(nodesDataBinding)\n .attr('id', 'node-group')\n .classed('legend', isLegend);\n\n createHexagon(nodeGroup, nodeRadius);\n nodesDataBinding.exit().remove();\n\n nodeGroup\n .append('text')\n .attr('class', 'icon-any node-icon');\n\n if (!isLegend) {\n addHostnameToNodes(nodeGroup, nodeRadius, isLegend);\n }\n return nodeUpdateElements;\n}\n\nfunction addHostnameToNodes(nodeElements, nodeRadius) {\n const nodeTextHost = nodeElements.append('g');\n\n nodeTextHost\n .append('rect')\n .attr('class', 'id-host-background')\n .attr('rx', 6);\n\n nodeTextHost\n .append('rect')\n .attr('class', 'node-info-background')\n .attr('rx', 6);\n\n nodeTextHost\n .append('text')\n .attr('y', nodeRadius + 25)\n .attr('class', 'id id-host');\n\n nodeTextHost\n .append('text')\n .attr('y', nodeRadius + 55)\n .attr('class', 'node-info-text');\n}\n\nexport function updateNodes(nodes) {\n updateNodesIcon(nodes);\n updateNodesClasses(nodes);\n updateNodesHostnameText(nodes);\n updateNodesInfoText(nodes);\n}\n\nfunction updateNodesClasses(nodes) {\n nodes\n .select('.node.member')\n .classed('leader', (node) => node.nodeState === NodeState.LEADER)\n .classed('follower', (node) => node.nodeState === NodeState.FOLLOWER)\n .classed('candidate', (node) => node.nodeState === NodeState.CANDIDATE)\n .classed('other', (node) => {\n return node.nodeState !== NodeState.LEADER &&\n node.nodeState !== NodeState.FOLLOWER &&\n node.nodeState !== NodeState.CANDIDATE;\n });\n}\n\nfunction updateNodesIcon(nodes) {\n nodes.select('.node-icon')\n .each(function (d) {\n const iconType = hasRecoveryState(d) ? getNodeInfoIconType(d) : getNodeIconType(d);\n d3.select(this)\n .classed('icon-any', iconType.font === font.ICOMOON)\n .classed('remixicon', iconType.font === font.REMIXICON)\n .text(iconType.icon);\n });\n}\n\nfunction hasRecoveryState(node) {\n return !isEmpty(node.recoveryStatus);\n}\n\nconst iconMap = {\n [RecoveryState.SEARCHING_FOR_NODE]: {icon: '\\uf045', font: font.REMIXICON}, //ri-question-line\n [RecoveryState.WAITING_FOR_SNAPSHOT]: {icon: '\\uf20f', font: font.REMIXICON}, //ri-time-line\n [RecoveryState.RECEIVING_SNAPSHOT]: {icon: '\\uec54', font: font.REMIXICON}, //ri-download-2-line\n [RecoveryState.APPLYING_SNAPSHOT]: {icon: '\\uec30', font: font.REMIXICON}, //ri-device-recover-line\n [RecoveryState.BUILDING_SNAPSHOT]: {icon: '\\uf3a7', font: font.REMIXICON}, //ri-archive-2-line\n [RecoveryState.SENDING_SNAPSHOT]: {icon: '\\uf24a', font: font.REMIXICON}, //ri-upload-2-line\n [RecoveryState.RECOVERY_OPERATION_FAILURE_WARNING]: {icon: '\\ue920', font: font.ICOMOON},\n};\n\nconst nodeStateIcons = {\n [NodeState.CANDIDATE]: {icon: '\\ue914', font: font.ICOMOON},\n [NodeState.NO_CONNECTION]: {icon: '\\ue931', font: font.ICOMOON},\n [NodeState.OUT_OF_SYNC]: {icon: '\\ue920', font: font.ICOMOON},\n [NodeState.READ_ONLY]: {icon: '\\ue95c', font: font.ICOMOON},\n [NodeState.RESTRICTED]: {icon: '\\ue933', font: font.ICOMOON}\n};\n\nfunction getNodeInfoIconType(node) {\n const status = node.recoveryStatus;\n\n if (!status || !status.state) {\n return {icon: '', font: ''};\n }\n\n return iconMap[status.state] || {icon: '', font: ''};\n}\n\nfunction getNodeIconType(node) {\n const iconType = nodeStateIcons[node.nodeState];\n return iconType ? iconType : {icon: '', font: ''};\n}\n\nfunction updateNodesInfoText(nodes) {\n let objectHeight;\n let objectWidth;\n // Set initial text element\n nodes.select('.node-info-text')\n .each(function (d) {\n d.infoNode = this;\n })\n .select(function () {\n return this.parentNode;\n })\n .append('foreignObject')\n .attr('width', function (d) {\n let shortMessage = '';\n if (!isEmpty(d.recoveryStatus)) {\n shortMessage = extractShortMessageFromNode(d);\n }\n const rect = calculateElementSizeByText(shortMessage);\n objectHeight = rect.height;\n objectWidth = rect.width;\n return objectWidth;\n })\n .attr('height', function (d) {\n return objectHeight;\n })\n .attr('x', function (d) {\n return -(objectWidth / 2);\n })\n .attr('y', function (d) {\n return 78;\n })\n .classed('hidden', function (d) {\n return isEmpty(d.recoveryStatus);\n })\n .style('font-size', '12px')\n .style('font-weight', '400')\n .style('text-align', 'center')\n .style('padding', '4px')\n .style('background', '#EEEEEE')\n .style('border-radius', '6px')\n .attr('class', 'node-info-fo')\n .append('xhtml:div')\n .html(function (d) {\n return extractShortMessageFromNode(d);\n });\n\n // Remove the original text elements, as they are now replaced by foreignObjects\n nodes.select('.node-info-text').remove();\n\n resizeLabelDynamic(nodes);\n}\n\nfunction extractShortMessageFromNode(node) {\n return node.recoveryStatus.message && node.recoveryStatus.message.length > shortMessageLimit ?\n node.recoveryStatus.message.substring(0, shortMessageLimit) + '...' : node.recoveryStatus.message || '';\n}\n\nfunction calculateElementSizeByText(text) {\n const tmp = document.createElement('div');\n tmp.innerHTML = text;\n tmp.style.padding = '4px';\n tmp.style.position = 'absolute';\n tmp.style.visibility = 'hidden';\n tmp.style.fontSize = '12px';\n tmp.style.fontWeight = '400';\n tmp.style.textAlign = 'center';\n tmp.style.height = 'auto';\n tmp.style.width = 'auto';\n tmp.style.whiteSpace = 'nowrap';\n\n document.body.appendChild(tmp);\n const rect = tmp.getBoundingClientRect();\n const height = rect.height;\n const width = rect.width;\n document.body.removeChild(tmp);\n\n return {height, width};\n}\n\nfunction addRecoveryLabelListeners(object, message, truncatedSize, displayMessage, fullSize) {\n object.on('mouseover.tooltip', () => {\n object\n .attr('width', fullSize.width)\n .attr('height', fullSize.height)\n .attr('x', -fullSize.width / 2)\n .html(`<div>${message}</div>`);\n });\n object.on('mouseout.tooltip', () => {\n object\n .attr('width', truncatedSize.width)\n .attr('height', truncatedSize.height)\n .attr('x', -truncatedSize.width / 2)\n .html(`<div>${displayMessage}</div>`);\n });\n}\n\nfunction resizeLabelDynamic(nodes) {\n nodes.select('.node-info-fo')\n .each(function (d) {\n const object = d3.select(this);\n if (isEmpty(d.recoveryStatus)) {\n object.attr('width', 0);\n return;\n }\n const shortMessage = extractShortMessageFromNode(d);\n const isShorten = d.recoveryStatus.message && d.recoveryStatus.message.length > shortMessageLimit && shortMessage !== d.recoveryStatus.message;\n const displayMessage = isShorten ? shortMessage : d.recoveryStatus.message;\n const truncatedSize = calculateElementSizeByText(shortMessage);\n const fullSize = calculateElementSizeByText(d.recoveryStatus.message);\n object.on('.tooltip', null);\n\n if (isShorten) {\n addRecoveryLabelListeners(object, d.recoveryStatus.message, truncatedSize, displayMessage, fullSize);\n }\n\n // Set initial size and text\n object\n .attr('width', truncatedSize.width)\n .attr('height', truncatedSize.height)\n .attr('x', -truncatedSize.width / 2)\n .html(`<div>${displayMessage}</div>`);\n });\n}\n\nfunction updateNodesHostnameText(nodes) {\n nodes\n .select('.id.id-host')\n .each(function (d) {\n d.labelNode = this;\n })\n .text(function (d) {\n return d.hostname;\n });\n\n // Add padding styling to text background. left/right/top/bottom +5\n nodes\n .select('.id-host-background')\n .attr('width', function (d) {\n return d3.select(d.labelNode).node().getBBox().width + 10;\n })\n .attr('height', function (d) {\n return d3.select(d.labelNode).node().getBBox().height + 10;\n })\n .attr('x', function (d) {\n return d3.select(d.labelNode).node().getBBox().x - 5;\n })\n .attr('y', function (d) {\n return d3.select(d.labelNode).node().getBBox().y - 5;\n });\n}\n\nexport function createLinks(linksDataBinding) {\n linksDataBinding.enter()\n .append('path')\n .classed('link', true);\n\n linksDataBinding.exit().remove();\n}\n\nexport function updateLinks(linksDataBinding, nodes) {\n linksDataBinding\n .attr('class', (link) => {\n // add the link id as a css class for testing purposes\n const idClass = link.id.replaceAll(':', '-');\n return `link ${idClass}`;\n })\n .attr('stroke', setLinkColor)\n .style('stroke-dasharray', setLinkStyle)\n .style(\"marker-mid\", (link) => setArrowLink(link, ARROW_CONFIG.BIG))\n .attr('d', (link) => getLinkCoordinates(link, nodes));\n}\n\nexport const ARROW_CONFIG = {\n SMALL: {name: 'small', size: 3},\n BIG: {name: 'big', size: 5}\n};\n\nexport function addArrowHead(svg, config) {\n svg.append(\"svg:defs\").append(\"svg:marker\")\n .attr(\"id\", `arrowhead_${config.name}`)\n .attr(\"viewBox\", `0 0 ${config.size * 2} ${config.size * 2}`)\n .attr(\"refX\", config.size)\n .attr(\"refY\", config.size)\n .attr(\"markerWidth\", config.size)\n .attr(\"markerHeight\", config.size)\n .attr(\"orient\", \"auto-start-reverse\")\n .append(\"path\")\n .attr(\"d\", `M 0 0 L ${config.size * 2} ${config.size} L 0 ${config.size * 2} z`)\n .style(\"fill\", \"var(--gw-secondary-base)\");\n}\n\nexport function setArrowLink(link, config) {\n if (link.status === LinkState.RECEIVING_SNAPSHOT) {\n return `url(#arrowhead_${config.name})`;\n }\n}\n\nexport function setLinkColor(link) {\n const linkColor = linkStateColors[link.status];\n return linkColor || 'none';\n}\n\nexport function setLinkStyle(link) {\n const linkStyle = linkStateStyle[link.status];\n return linkStyle || 'none';\n}\n\nfunction getLinkCoordinates(link, nodes) {\n const source = nodes.find((node) => node.address === link.source);\n const target = nodes.find((node) => node.address === link.target);\n const deltaX = target.x - source.x;\n const deltaY = target.y - source.y;\n const dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n const normX = deltaX / dist;\n const normY = deltaY / dist;\n // Padding from node center point\n const sourcePadding = 55;\n const targetPadding = 55;\n const sourceX = source.x + (sourcePadding * normX);\n const sourceY = source.y + (sourcePadding * normY);\n const targetX = target.x - (targetPadding * normX);\n const targetY = target.y - (targetPadding * normY);\n // Calculate midpoint\n const midpointX = (sourceX + targetX) / 2;\n const midpointY = (sourceY + targetY) / 2;\n // In order to draw an arrowhead in the middle of a line, the line needs to be composed by\n // two segments, otherwise the arrowhead won't show up.\n return 'M' + sourceX + ',' + sourceY + 'L' + midpointX + ',' + midpointY +\n 'L' + targetX + ',' + targetY;\n}\n\nexport function positionNodesOnClusterZone(nodeElements, clusterZoneX, clusterZoneY, clusterZoneRadius) {\n nodeElements\n .attr('transform', (node, index) => {\n // Calculate initial positions for the new nodes based on\n // spreading them evenly on a circle around the center of the page.\n const theta = 2 * Math.PI * index / nodeElements.size();\n const x = clusterZoneX + Math.cos(theta) * clusterZoneRadius;\n const y = clusterZoneY + Math.sin(theta) * clusterZoneRadius;\n node.x = x;\n node.y = y;\n return `translate(${x}, ${y})`;\n });\n}\n\nexport function createHexagon(nodeGroup, radius) {\n const _s32 = (Math.sqrt(3) / 2);\n const xDiff = 0;\n const yDiff = 0;\n const points = [[radius + xDiff, yDiff], [radius / 2 + xDiff, radius * _s32 + yDiff], [-radius / 2 + xDiff, radius * _s32 + yDiff],\n [-radius + xDiff, yDiff],\n [-radius / 2 + xDiff, -radius * _s32 + yDiff], [radius / 2 + xDiff, -radius * _s32 + yDiff], [radius + xDiff, yDiff],\n [radius / 2 + xDiff, radius * _s32 + yDiff]];\n return nodeGroup\n .selectAll(\"path.area\")\n .data([points])\n .enter()\n .append(\"path\")\n .attr('class', 'node member')\n .attr(\"stroke-width\", \"10\")\n .attr(\"stroke-linejoin\", \"round\")\n .attr(\"d\", d3.line());\n}\n\nexport function removeEventListeners() {\n d3.select(document).selectAll('.node-info-fo').on('.tooltip', null);\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":["d3","line","select","clusterColors","linkStateColors","LinkState","IN_SYNC","SYNCING","OUT_OF_SYNC","RECEIVING_SNAPSHOT","linkStateStyle","font","createClusterSvgElement","element","append","classed","createClusterZone","parent","clusterZone","style","setCreateClusterZone","hasCluster","translationsMap","hasAccess","selectAll","remove","textGroup","attr","text","no_cluster_configured","create_cluster_btn","updateClusterZoneLabels","moveElement","x","y","createNodes","nodesDataBinding","nodeRadius","isLegend","nodeGroup","enter","nodeUpdateElements","merge","radius","_s32","Math","sqrt","points","data","createHexagon","exit","nodeElements","nodeTextHost","addHostnameToNodes","updateNodes","nodes","each","d","iconType","node","isEmpty","recoveryStatus","nodeStateIcons","nodeState","icon","getNodeIconType","status","state","iconMap","getNodeInfoIconType","this","updateNodesIcon","NodeState","LEADER","FOLLOWER","CANDIDATE","updateNodesClasses","labelNode","hostname","getBBox","width","height","updateNodesHostnameText","objectHeight","objectWidth","infoNode","parentNode","shortMessage","extractShortMessageFromNode","rect","calculateElementSizeByText","html","object","isShorten","message","length","displayMessage","truncatedSize","fullSize","on","addRecoveryLabelListeners","resizeLabelDynamic","updateNodesInfoText","RecoveryState","SEARCHING_FOR_NODE","WAITING_FOR_SNAPSHOT","APPLYING_SNAPSHOT","BUILDING_SNAPSHOT","SENDING_SNAPSHOT","RECOVERY_OPERATION_FAILURE_WARNING","NO_CONNECTION","READ_ONLY","RESTRICTED","substring","tmp","document","createElement","innerHTML","padding","position","visibility","fontSize","fontWeight","textAlign","whiteSpace","body","appendChild","getBoundingClientRect","removeChild","createLinks","linksDataBinding","updateLinks","link","id","replaceAll","setLinkColor","setLinkStyle","setArrowLink","ARROW_CONFIG","BIG","source","find","address","target","deltaX","deltaY","dist","normX","normY","sourceX","sourceY","targetX","targetY","getLinkCoordinates","SMALL","name","size","addArrowHead","svg","config","positionNodesOnClusterZone","clusterZoneX","clusterZoneY","clusterZoneRadius","index","theta","PI","cos","sin","removeEventListeners","NO_CLUSTER","TopologyState","PRIMARY_NODE","SECONDARY_NODE"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export const __webpack_esm_id__=24690;export const __webpack_esm_ids__=[16664,24690,40765,63146,90418,94608];export const __webpack_esm_modules__={90418(){function e(){return{restrict:"E",require:"ngModel",scope:{ngModel:"=",ngDisabled:"=",placeholder:"@"},templateUrl:"js/angular/core/templates/editable-content/editable-content.html",link:function(e,t,s,a){const n=t.find("div"),i=()=>{e.ngDisabled||e.$apply(()=>{n.html().length&&!n.text().trim().length&&n.empty(),a.$setViewValue(n[0].innerText)})};a.$render=()=>{n.html(a.$viewValue||"")};const r=e=>{e.preventDefault();const t=(e.originalEvent||e).clipboardData.getData("text/plain"),s=window.getSelection();if(!s.rangeCount)return;s.deleteFromDocument();const a=s.getRangeAt(0),n=document.createDocumentFragment(),i=t.split("\n");i.forEach((e,t)=>{n.appendChild(document.createTextNode(e)),t<i.length-1&&n.appendChild(document.createElement("br"))}),a.insertNode(n),s.collapseToEnd()};e.$on("$destroy",()=>{n.off("blur keyup change input",i),n.off("paste",r)}),n.on("blur keyup change input",i),n.on("paste",r)}}}angular.module("graphdb.framework.core.directives.editable-content",[]).directive("editableContent",e),e.$inject=[]},94608(e,t,s){s.d(t,{T:()=>n,s:()=>i});var a=s(16664);class n{constructor(e,t){this._chatId=e,this._agentId=void 0,this._question=t,this._answers=[]}get chatId(){return this._chatId}set chatId(e){this._chatId=e}get agentId(){return this._agentId}set agentId(e){this._agentId=e}get question(){return this._question}set question(e){this._question=e}get answers(){return this._answers}set answers(e){this._answers=e}setQuestionMessage(e){this._question||(this._question=new a.Z({role:a.W.USER})),this._question.message=e}getQuestionMessage(){return this._question.message}toCreateChatRequestPayload(){return{agentId:this._agentId,question:this._question.message}}toAskRequestPayload(){return{conversationId:this._chatId,agentId:this._agentId,question:this._question.message,tzOffset:-(new Date).getTimezoneOffset()}}toExplainResponsePayload(e){return{conversationId:this._chatId,answerId:e}}}class i{constructor(e=[]){this._items=e}isEmpty(){return 0===this._items.length}appendItem(e){this._items.push(e)}get items(){return this._items}set items(e){this._items=e||[]}getLast(){if(!this.isEmpty())return this._items[this._items.length-1]}}},16664(e,t,s){s.d(t,{W:()=>n,Z:()=>a});class a{constructor(e){this._id=e.id,this._role=e.role,this._message=e.message,this._timestamp=1e3*e.timestamp,this.tokenUsageInfo=e.tokenUsageInfo,this._isTerminalState=e.isTerminalState,this._status=e.status}addToChatAnswer(e){e.messages=[this]}get id(){return this._id}set id(e){this._id=e}get role(){return this._role}set role(e){this._role=e}get message(){return this._message}set message(e){this._message=e}get timestamp(){return this._timestamp}set timestamp(e){this._timestamp=e}get isTerminalState(){return this._isTerminalState}set isTerminalState(e){this._isTerminalState=e}get status(){return this._status}set status(e){this._status=e}}const n={USER:"user",ASSISTANT:"assistant"}},40765(e,t,s){s.d(t,{eP:()=>i,iy:()=>a,kH:()=>r,zc:()=>n});class a{constructor(e={}){this._chatId=e.chatId,this._answerId=e.answerId,this._queryMethods=e.queryMethods,this._expanded=void 0===e.expanded||e.expanded}get chatId(){return this._chatId}set chatId(e){this._chatId=e}get answerId(){return this._answerId}set answerId(e){this._answerId=e}get queryMethods(){return this._queryMethods}set queryMethods(e){this._queryMethods=e}get expanded(){return this._expanded}set expanded(e){this._expanded=e}}class n{constructor(e=[]){this._items=e}get items(){return this._items}set items(e){this._items=e}}class i{constructor(e={}){this._name=e.name,this._rawQuery=e.rawQuery,this._query=e.query,this._queryType=e.queryType,this._errorMessage=e.errorOutput}get name(){return this._name}set name(e){this._name=e}get rawQuery(){return this._rawQuery}set rawQuery(e){this._rawQuery=e}get query(){return this._query}set query(e){this._query=e}get queryType(){return this._queryType}set queryType(e){this._queryType=e}get errorMessage(){return this._errorMessage}set errorMessage(e){this._errorMessage=e}}const r={SPARQL:"sparql",JSON:"json",OTHER:"other"}},542(e,t,s){s(79119),s(90418);var a=s(35197),n=s(16664),i=s(94608),r=s(22723),o=s(41767);function h(e,t,s){return{restrict:"E",templateUrl:"js/angular/ttyg/templates/chat-panel.html",link:(e,h,c)=>{e.chat=void 0,e.selectedAgent=void 0,e.chatItem=void 0,e.askingChatItem=void 0,e.waitingForLastMessage=!1,e.loadingChat=!0,e.showCancelButton=!1,e.ask=()=>{e.chatItem.question.timestamp=Date.now(),e.askingChatItem=(0,r.cloneDeep)(e.chatItem),e.chatItem.chatId?u(e.chatItem):d(),e.chatItem=l(),I(),_()},e.cancelPendingQuestion=()=>{e.showCancelButton=!1,s.emit(a.I.CANCEL_PENDING_QUESTION,e.chatItem)},e.regenerateQuestion=t=>{const s=l();s.setQuestionMessage(t.getQuestionMessage()),s.question.timestamp=Date.now(),e.askingChatItem=s,u(s),I()},e.isAskDisabled=()=>!(e.chatItem.question.message&&e.selectedAgent&&!e.selectedAgent.isDeleted&&!e.waitingForLastMessage&&!e.loadingChat&&!e.askingChatItem),e.onKeypressOnInput=t=>{e.askingChatItem||"Enter"!==t.key||t.shiftKey||t.ctrlKey||e.isAskDisabled()||(t.preventDefault(),e.ask())},e.onAskHowDeliveredAnswer=()=>{const s=l();s.setQuestionMessage(t.instant("ttyg.chat_panel.btn.derive_answer.label")),s.question.timestamp=Date.now(),e.askingChatItem=(0,r.cloneDeep)(s),u(s),I()},e.getAgentName=e=>{const a=s.getAgent(e);return a?a.name:(0,o.Gz)(t.instant("ttyg.chat_panel.deleted_agent"))};const d=()=>{s.emit(a.I.CREATE_CHAT,e.chatItem)},u=e=>{s.emit(a.I.ASK_QUESTION,e)},g=(t,n)=>{e.waitingForLastMessage=t,e.showCancelButton=t,s.emit(a.I.ASK_QUESTION_STATE_CHANGED,{isAsking:t,chatId:n})},m=t=>{e.chatItem=(0,r.cloneDeep)(e.askingChatItem),e.askingChatItem=void 0,g(!1,t)},l=()=>{const t=new i.T;return t.question=new n.Z({role:n.W.USER}),e.chat&&(t.chatId=e.chat.id),e.selectedAgent&&(t.agentId=e.selectedAgent.id),t},_=()=>{setTimeout(()=>{const e=document.querySelector(".question-input");e&&e.focus()})},I=()=>{setTimeout(()=>{const e=h.find(".chat-details")[0];e&&(e.scrollTop=e.scrollHeight)})},p=()=>{e.chat=void 0,e.loadingChat=!1,e.chatItem=l(),e.askingChatItem=void 0,g(!1),_()},y=[e.$watchCollection("chat.chatHistory.items",I),s.onSelectedChatUpdated(t=>{if(e.chat=t,!e.chat||e.chat.isNew())return;e.loadingChat=!1;const a=e.chatItem.question.message;if(e.chatItem=l(),e.chatItem.question.message=a,e.askingChatItem=void 0,e.chat){const t=e.chat.chatHistory.getLast();t&&t.agentId&&s.selectAgent(s.getAgent(t.agentId))}_()}),s.onLastMessageReceived(e=>{g(!1,e.chatId)}),s.onSelectedAgentChanged(t=>{e.selectedAgent=t,e.selectedAgent&&e.chatItem&&(e.chatItem.agentId=e.selectedAgent.id),_()}),s.onSelectedChatChanged(t=>{t?(e.loadingChat=!t.isNew(),e.chatItem=l(),g(!1,t.id),_()):p()}),s.subscribe(a.I.LOAD_CHAT_FAILURE,()=>{e.loadingChat=!1,e.chatItem=l(),_()}),s.subscribe(a.I.ASK_QUESTION_FAILURE,m),s.subscribe(a.I.CREATE_CHAT_FAILURE,m),s.subscribe(a.I.DELETE_CHAT_SUCCESSFUL,t=>{e.chat&&t.id===e.chat.id&&p()}),s.subscribe(a.I.ASK_QUESTION_STARTING,e=>{g(!0,e)})];e.$on("$destroy",()=>{y.forEach(e=>e())}),e.chatItem=l(),_()}}}angular.module("graphdb.framework.ttyg.directives.chat-panel",["graphdb.framework.ttyg.directives.chat-item-detail","graphdb.framework.core.directives.editable-content"]).directive("chatPanel",h),h.$inject=["toastr","$translate","TTYGContextService"]}};
|
|
2
|
-
//# sourceMappingURL=24690.d4ed1c24eded4eb0da85.bundle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"24690.d4ed1c24eded4eb0da85.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/core/directives/editable-content/editable-content.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/ttyg/chat-item.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/ttyg/chat-message.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/ttyg/explain-response.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/directives/chat-panel.directive.js"],"sourcesContent":["/**\n * @ngdoc directive\n * @name editableContent\n * @module graphdb.framework.core.directives.editable-content\n * @restrict E\n * @description\n * A reusable contenteditable directive bound to an ngModel. It allows editable plain-text input and supports disabling and placeholder text.\n *\n * @param {string} ngModel - The model to bind contenteditable input to.\n * @param {boolean=} ngDisabled - Disables the contenteditable field when true.\n * @param {string=} placeholder - Placeholder text to show when input is empty.\n */\nconst modules = [];\n\nangular\n .module('graphdb.framework.core.directives.editable-content', modules)\n .directive('editableContent', editableContent);\n\neditableContent.$inject = [];\n\nfunction editableContent() {\n return {\n restrict: 'E',\n require: 'ngModel',\n scope: {\n ngModel: '=',\n ngDisabled: '=',\n placeholder: '@'\n },\n templateUrl: 'js/angular/core/templates/editable-content/editable-content.html',\n link: function(scope, element, attrs, ngModelCtrl) {\n\n // =========================\n // Private variables\n // =========================\n\n const editableDiv = element.find('div');\n\n // =========================\n // Private functions\n // =========================\n\n /**\n * Updates the bound ngModel with the current contenteditable value.\n * Also clears invalid HTML when only whitespace remains.\n */\n const updateModelValue = () => {\n if (!scope.ngDisabled) {\n scope.$apply(() => {\n if (editableDiv.html().length && !editableDiv.text().trim().length) {\n // Fixes a problem with the placeholder when type some word and delete it.\n editableDiv.empty();\n }\n ngModelCtrl.$setViewValue(editableDiv[0].innerText);\n });\n }\n };\n\n /**\n * Renders the model value into the contenteditable element.\n */\n ngModelCtrl.$render = () => {\n editableDiv.html(ngModelCtrl.$viewValue || '');\n };\n\n /**\n * Handles paste events in the contenteditable element by inserting plain text only.\n * Prevents the default paste behavior and manually inserts the clipboard text as plain text,\n * preserving line breaks by converting them to <br> elements.\n *\n * @param {Event} event - The paste event object containing clipboard data.\n */\n const pasteHandler = (event) => {\n event.preventDefault();\n\n const text = (event.originalEvent || event).clipboardData.getData('text/plain');\n const selection = window.getSelection();\n\n if (!selection.rangeCount) return;\n\n selection.deleteFromDocument();\n const range = selection.getRangeAt(0);\n const fragment = document.createDocumentFragment();\n const lines = text.split('\\n');\n\n lines.forEach((line, index) => {\n fragment.appendChild(document.createTextNode(line));\n if (index < lines.length - 1) {\n fragment.appendChild(document.createElement('br'));\n }\n });\n\n range.insertNode(fragment);\n selection.collapseToEnd();\n }\n\n // =========================\n // Subscriptions\n // =========================\n\n /**\n * Unsubscribes from all watchers and event listeners to prevent memory leaks.\n */\n const removeAllSubscribers = () => {\n editableDiv.off('blur keyup change input', updateModelValue);\n editableDiv.off('paste', pasteHandler);\n };\n\n scope.$on('$destroy', removeAllSubscribers);\n editableDiv.on('blur keyup change input', updateModelValue);\n editableDiv.on('paste', pasteHandler)\n }\n };\n}\n","import {CHAT_MESSAGE_ROLE, ChatMessageModel} from \"./chat-message\";\n\n/**\n *\n * Represents a model that holds a question and the answer of it in a chat.\n *\n */\nexport class ChatItemModel {\n\n /**\n * Creates an instance of ChatItemModel.\n *\n * @param {string} chatId - The unique identifier for the chat associated with this instance.\n * @param {ChatMessageModel} question - The message object representing the question.\n */\n constructor(chatId, question) {\n\n /**\n * @type {string | undefined}\n * @private\n */\n this._chatId = chatId;\n\n /**\n * @type {string | undefined}\n * @private\n */\n this._agentId = undefined;\n\n /**\n * @type {ChatMessageModel}\n * @private\n */\n this._question = question;\n\n /**\n *\n * @type {ChatMessageModel[] | undefined}\n * @private\n */\n this._answers = [];\n }\n\n get chatId() {\n return this._chatId;\n }\n\n set chatId(value) {\n this._chatId = value;\n }\n\n get agentId() {\n return this._agentId;\n }\n\n set agentId(value) {\n this._agentId = value;\n }\n\n get question() {\n return this._question;\n }\n\n set question(value) {\n this._question = value;\n }\n\n get answers() {\n return this._answers;\n }\n\n /**\n *\n * @param {ChatMessageModel[]} value\n */\n set answers(value) {\n this._answers = value;\n }\n\n /**\n * Sets the message for the user's question.\n *\n * @param {string} message - The message content for the user's question.\n */\n setQuestionMessage(message) {\n if (!this._question) {\n this._question = new ChatMessageModel({role: CHAT_MESSAGE_ROLE.USER});\n }\n this._question.message = message;\n }\n\n /**\n * Retrieves the message of the user's question.\n *\n * @return {string} - The message content of the user's question.\n */\n getQuestionMessage() {\n return this._question.message;\n }\n\n /**\n * Converts the instance to a create chat request payload.\n *\n * @return {{agentId: string, question: string}} An object representing the create request payload.\n */\n toCreateChatRequestPayload() {\n return {\n agentId: this._agentId,\n question: this._question.message\n };\n }\n\n /**\n * Converts the instance to an ask request payload.\n *\n * @return {{conversationId: string, agentId: string, question: string}} An object representing the ask request payload.\n */\n toAskRequestPayload() {\n return {\n conversationId: this._chatId,\n agentId: this._agentId,\n question: this._question.message,\n tzOffset: -new Date().getTimezoneOffset() // offsets are reversed here hence the minus\n };\n }\n\n toExplainResponsePayload(answerId) {\n return {\n conversationId: this._chatId,\n answerId\n };\n }\n}\n\nexport class ChatItemsListModel {\n\n /**\n * @param {ChatItemModel[]} items\n */\n constructor(items = []) {\n this._items = items;\n }\n\n isEmpty() {\n return this._items.length === 0;\n }\n\n /**\n * @param {ChatItemModel} chatItem\n */\n appendItem(chatItem) {\n this._items.push(chatItem);\n }\n\n get items() {\n return this._items;\n }\n\n set items(value) {\n this._items = value || [];\n }\n\n getLast() {\n if (!this.isEmpty()) {\n return this._items[this._items.length - 1];\n }\n }\n}\n","export class ChatMessageModel {\n constructor(data) {\n\n /**\n * @type {string}\n */\n this._id = data.id;\n\n /**\n * @type @type {string} - A value from {@link CHAT_MESSAGE_ROLE}, determining the owner of the message (e.g., user, assistant).\n */\n this._role = data.role;\n\n /**\n * @type {string}\n */\n this._message = data.message;\n\n /**\n * @type {number}\n */\n this._timestamp = data.timestamp * 1000;\n\n /**\n * Holds information about the number of tokens used for this answer, including prompt and completion tokens.\n * It is applicable only to the assistant role ({@link CHAT_MESSAGE_ROLE#ASSISTANT}).\n *\n * @type {TokenUsageInfo}\n */\n this.tokenUsageInfo = data.tokenUsageInfo;\n\n /**\n * If the message was terminated via the Abort button\n * @type {boolean}\n */\n this._isTerminalState = data.isTerminalState;\n\n /**\n * Reason for cancellation.\n * @private {string}\n */\n this._status = data.status\n }\n\n /**\n * Updates the chatAnswer.messages array with this message instance.\n * @param {ChatAnswerModel} chatAnswer - The answer object containing the messages.\n */\n addToChatAnswer(chatAnswer) {\n chatAnswer.messages = [this];\n }\n\n get id() {\n return this._id;\n }\n\n set id(value) {\n this._id = value;\n }\n\n get role() {\n return this._role;\n }\n\n set role(value) {\n this._role = value;\n }\n\n get message() {\n return this._message;\n }\n\n set message(value) {\n this._message = value;\n }\n\n get timestamp() {\n return this._timestamp;\n }\n\n set timestamp(value) {\n this._timestamp = value;\n }\n\n get isTerminalState() {\n return this._isTerminalState;\n }\n\n set isTerminalState(value) {\n this._isTerminalState = value;\n }\n\n get status() {\n return this._status;\n }\n\n set status(value) {\n this._status = value;\n }\n}\n\nexport const CHAT_MESSAGE_ROLE = {\n USER: 'user',\n ASSISTANT: 'assistant'\n};\n","export class ExplainResponseModel {\n constructor(data = {}) {\n\n /**\n * @type {string}\n */\n this._chatId = data.chatId;\n\n /**\n * @type {string}\n */\n this._answerId = data.answerId;\n\n /**\n * @type {ExplainQueryMethodsListModel}\n */\n this._queryMethods = data.queryMethods;\n\n this._expanded = data.expanded !== undefined ? data.expanded : true;\n }\n\n get chatId() {\n return this._chatId;\n }\n\n set chatId(value) {\n this._chatId = value;\n }\n\n get answerId() {\n return this._answerId;\n }\n\n set answerId(value) {\n this._answerId = value;\n }\n\n get queryMethods() {\n return this._queryMethods;\n }\n\n set queryMethods(value) {\n this._queryMethods = value;\n }\n\n get expanded() {\n return this._expanded;\n }\n\n set expanded(value) {\n this._expanded = value;\n }\n}\n\nexport class ExplainQueryMethodsListModel {\n constructor(data = []) {\n this._items = data;\n }\n\n get items() {\n return this._items;\n }\n\n set items(value) {\n this._items = value;\n }\n}\n\nexport class ExplainQueryMethodModel {\n constructor(data = {}) {\n /**\n * @type {ExtractionMethod.FTS_SEARCH | ExtractionMethod.RETRIEVAL | ExtractionMethod.SPARQL | ExtractionMethod.SIMILARITY}\n */\n this._name = data.name;\n\n /**\n * @type {string}\n */\n this._rawQuery = data.rawQuery;\n\n /**\n * @type {string}\n */\n this._query = data.query;\n\n /**\n * @Type {ExplainQueryType}\n * @private\n */\n this._queryType = data.queryType;\n\n /**\n * @type {string | null}\n * @private\n */\n this._errorMessage = data.errorOutput;\n }\n\n get name() {\n return this._name;\n }\n\n set name(value) {\n this._name = value;\n }\n\n get rawQuery() {\n return this._rawQuery;\n }\n\n set rawQuery(value) {\n this._rawQuery = value;\n }\n\n get query() {\n return this._query;\n }\n\n set query(value) {\n this._query = value;\n }\n\n get queryType() {\n return this._queryType;\n }\n\n set queryType(value) {\n this._queryType = value;\n }\n\n get errorMessage() {\n return this._errorMessage;\n }\n\n set errorMessage(value) {\n this._errorMessage = value;\n }\n}\n\nexport const ExplainQueryType = {\n SPARQL: 'sparql',\n JSON: 'json',\n OTHER: 'other'\n};\n","import './chat-item-detail.directive';\nimport 'angular/core/directives/editable-content/editable-content';\nimport {TTYGEventName} from \"../services/ttyg-context.service\";\nimport {CHAT_MESSAGE_ROLE, ChatMessageModel} from \"../../models/ttyg/chat-message\";\nimport {ChatItemModel} from \"../../models/ttyg/chat-item\";\nimport {cloneDeep} from \"lodash\";\nimport {decodeHTML} from \"../../../../app\";\n\nconst modules = [\n 'graphdb.framework.ttyg.directives.chat-item-detail',\n 'graphdb.framework.core.directives.editable-content',\n];\n\nangular\n .module('graphdb.framework.ttyg.directives.chat-panel', modules)\n .directive('chatPanel', ChatPanelComponent);\n\nChatPanelComponent.$inject = ['toastr', '$translate', 'TTYGContextService'];\n\n/**\n * @ngdoc directive\n * @name graphdb.framework.ttyg.directives.chat-panel:chatPanel\n * @restrict E\n * @description\n *\n * This directive represents a chat panel component that allows users to interact with a chat. It provides functionality for asking questions,\n * regenerating chat content, and other interactive features.\n *\n * It encapsulates the logic and presentation for displaying and managing chat-related interactions.\n *\n * @example\n * <chat-panel></chat-panel>\n */\nfunction ChatPanelComponent(toastr, $translate, TTYGContextService) {\n return {\n restrict: 'E',\n templateUrl: 'js/angular/ttyg/templates/chat-panel.html',\n link: ($scope, element, attrs) => {\n // =========================\n // Public variables\n // =========================\n\n /**\n * @type {ChatModel}\n */\n $scope.chat = undefined;\n\n /**\n * @type {AgentModel}\n */\n $scope.selectedAgent = undefined;\n\n /**\n * @type {ChatItemModel}\n */\n $scope.chatItem = undefined;\n\n /**\n * @type {ChatItemModel}\n */\n $scope.askingChatItem = undefined;\n\n /**\n * True while a question is being handled. It may involve multiple requests until it turns back to false.\n * @type {boolean}\n */\n $scope.waitingForLastMessage = false;\n\n /**\n * Flag that indicates that the chat is about to be changed.\n * @type {boolean}\n */\n $scope.loadingChat = true;\n\n $scope.showCancelButton = false;\n\n // =========================\n // Private variables\n // =========================\n\n // =========================\n // Public functions\n // =========================\n\n /**\n * Handles the ask question action.\n */\n $scope.ask = () => {\n $scope.chatItem.question.timestamp = Date.now();\n $scope.askingChatItem = cloneDeep($scope.chatItem);\n if (!$scope.chatItem.chatId) {\n createNewChat();\n } else {\n askQuestion($scope.chatItem);\n }\n $scope.chatItem = getEmptyChatItem();\n scrollToBottom();\n focusQuestionInput();\n };\n\n\n /**\n * Cancels a pending question tied to the current scope.\n * Hides cancel button.\n */\n $scope.cancelPendingQuestion = () => {\n $scope.showCancelButton = false;\n TTYGContextService.emit(TTYGEventName.CANCEL_PENDING_QUESTION, $scope.chatItem);\n };\n\n /**\n * Regenerates the answer for the provided chat item.\n *\n * @param {ChatItemModel} chatItem - The chat item that contains the question to be regenerated.\n */\n $scope.regenerateQuestion = (chatItem) => {\n const regenerateChatItem = getEmptyChatItem();\n regenerateChatItem.setQuestionMessage(chatItem.getQuestionMessage());\n regenerateChatItem.question.timestamp = Date.now();\n $scope.askingChatItem = regenerateChatItem;\n askQuestion(regenerateChatItem);\n scrollToBottom();\n };\n\n /**\n * Determines whether the Ask button should be disabled based on the current state of the chat item,\n * selected agent, and ongoing operations.\n * @returns {boolean} True if the Ask button should be disabled, false otherwise.\n */\n $scope.isAskDisabled = () => {\n return !!(!$scope.chatItem.question.message\n || !$scope.selectedAgent\n || $scope.selectedAgent.isDeleted\n || $scope.waitingForLastMessage\n || $scope.loadingChat\n || $scope.askingChatItem);\n };\n\n /**\n * Handles pressing the Enter key in the question input.\n * Will not trigger if `Shift` or `Ctrl` keys are pressed, or if Ask button is disabled.\n *\n * @param {KeyboardEvent} $event - The keyboard event triggered by the user interaction.\n */\n $scope.onKeypressOnInput = ($event) => {\n if (!$scope.askingChatItem && $event.key === 'Enter' && !$event.shiftKey && !$event.ctrlKey) {\n if (!$scope.isAskDisabled()) {\n $event.preventDefault();\n $scope.ask();\n }\n }\n };\n\n $scope.onAskHowDeliveredAnswer = () => {\n const askHowDerivedAnswerChatItem = getEmptyChatItem();\n askHowDerivedAnswerChatItem.setQuestionMessage($translate.instant('ttyg.chat_panel.btn.derive_answer.label'));\n askHowDerivedAnswerChatItem.question.timestamp = Date.now();\n $scope.askingChatItem = cloneDeep(askHowDerivedAnswerChatItem);\n askQuestion(askHowDerivedAnswerChatItem);\n scrollToBottom();\n };\n\n /**\n * Finds out if agent with such id exists and returns its name or a default message for deleted agent.\n * @param {string} agentId\n * @return {string}\n */\n $scope.getAgentName = (agentId) => {\n const agent = TTYGContextService.getAgent(agentId);\n return agent ? agent.name : decodeHTML($translate.instant('ttyg.chat_panel.deleted_agent'));\n };\n\n // =========================\n // Private functions\n // =========================\n\n const createNewChat = () => {\n TTYGContextService.emit(TTYGEventName.CREATE_CHAT, $scope.chatItem);\n };\n\n const askQuestion = (chatItem) => {\n TTYGContextService.emit(TTYGEventName.ASK_QUESTION, chatItem);\n };\n\n const setAskingState = (isAsking, chatId) => {\n $scope.waitingForLastMessage = isAsking;\n $scope.showCancelButton = isAsking;\n TTYGContextService.emit(TTYGEventName.ASK_QUESTION_STATE_CHANGED, {isAsking, chatId});\n };\n\n const onAskQuestionStarted = (chatId) => {\n setAskingState(true, chatId);\n };\n\n /**\n * Handles the update of the selected chat.\n * @param {ChatModel} chat - the new selected chat.\n */\n const onSelectedChatUpdated = (chat) => {\n $scope.chat = chat;\n if (!$scope.chat || $scope.chat.isNew()) {\n // Do nothing if the chat is new and a question is currently being asked.\n return;\n }\n $scope.loadingChat = false;\n const message = $scope.chatItem.question.message;\n $scope.chatItem = getEmptyChatItem();\n $scope.chatItem.question.message = message;\n $scope.askingChatItem = undefined;\n if ($scope.chat) {\n // TODO: Why on earth this is here? The chat changed handler is in the ttyg.view. Why doesn't it handle this\n // but we need to go through 2 more events to achieve the same result?\n const lastChatItem = $scope.chat.chatHistory.getLast();\n if (lastChatItem && lastChatItem.agentId) {\n TTYGContextService.selectAgent(TTYGContextService.getAgent(lastChatItem.agentId));\n }\n }\n focusQuestionInput();\n };\n\n const onLastMessageReceived = (chat) => {\n setAskingState(false, chat.chatId);\n };\n\n /**\n * Handles the failure of loading the chat and the server returns 404. This might happen if the chat does\n * not exist anymore because it was deleted by another user for example.\n */\n const onLoadChatFailure = () => {\n $scope.loadingChat = false;\n $scope.chatItem = getEmptyChatItem();\n focusQuestionInput();\n };\n\n const onSelectedChatChanged = (chat) => {\n if (chat) {\n // Skip the loading indication if it is a new chat that hasn't received an answer yet.\n $scope.loadingChat = !chat.isNew();\n $scope.chatItem = getEmptyChatItem();\n setAskingState(false, chat.id);\n focusQuestionInput();\n } else {\n reset();\n }\n };\n\n const onQuestionFailure = (chatId) => {\n $scope.chatItem = cloneDeep($scope.askingChatItem);\n $scope.askingChatItem = undefined;\n setAskingState(false, chatId);\n };\n\n /**\n * Handles the change of the selected agent.\n * @param {AgentModel} agent - the new selected agent.\n */\n const onSelectedAgentChanged = (agent) => {\n $scope.selectedAgent = agent;\n if ($scope.selectedAgent && $scope.chatItem) {\n $scope.chatItem.agentId = $scope.selectedAgent.id;\n }\n focusQuestionInput();\n };\n\n const onChatDeleted = (deletedChat) => {\n if ($scope.chat && deletedChat.id === $scope.chat.id) {\n reset();\n }\n };\n\n const getEmptyChatItem = () => {\n const chatItem = new ChatItemModel();\n chatItem.question = new ChatMessageModel({role: CHAT_MESSAGE_ROLE.USER});\n\n if ($scope.chat) {\n chatItem.chatId = $scope.chat.id;\n }\n\n if ($scope.selectedAgent) {\n chatItem.agentId = $scope.selectedAgent.id;\n }\n\n return chatItem;\n };\n\n const focusQuestionInput = () => {\n // Moving focus to the end of the JS call stack with a timeout, because on first Agent select,\n // the dropdown .agent-option steals the focus, or the browser assigns it to the document <body>.\n setTimeout(() => {\n const inputElement = document.querySelector('.question-input');\n if (inputElement) {\n inputElement.focus();\n }\n });\n };\n\n const scrollToBottom = () => {\n // Call it in a timeout to ensure that Angular's digest cycle is finished and all elements are displayed.\n setTimeout(() => {\n const chatDetailsElement = element.find(\".chat-details\")[0];\n if (chatDetailsElement) {\n chatDetailsElement.scrollTop = chatDetailsElement.scrollHeight;\n }\n });\n };\n\n const reset = () => {\n $scope.chat = undefined;\n $scope.loadingChat = false;\n $scope.chatItem = getEmptyChatItem();\n $scope.askingChatItem = undefined;\n setAskingState(false);\n focusQuestionInput();\n };\n\n const init = () => {\n $scope.chatItem = getEmptyChatItem();\n focusQuestionInput();\n };\n\n // =========================\n // Subscriptions\n // =========================\n const subscriptions = [\n $scope.$watchCollection('chat.chatHistory.items', scrollToBottom),\n TTYGContextService.onSelectedChatUpdated(onSelectedChatUpdated),\n TTYGContextService.onLastMessageReceived(onLastMessageReceived),\n TTYGContextService.onSelectedAgentChanged(onSelectedAgentChanged),\n TTYGContextService.onSelectedChatChanged(onSelectedChatChanged),\n TTYGContextService.subscribe(TTYGEventName.LOAD_CHAT_FAILURE, onLoadChatFailure),\n TTYGContextService.subscribe(TTYGEventName.ASK_QUESTION_FAILURE, onQuestionFailure),\n TTYGContextService.subscribe(TTYGEventName.CREATE_CHAT_FAILURE, onQuestionFailure),\n TTYGContextService.subscribe(TTYGEventName.DELETE_CHAT_SUCCESSFUL, onChatDeleted),\n TTYGContextService.subscribe(TTYGEventName.ASK_QUESTION_STARTING, onAskQuestionStarted),\n ];\n\n const removeAllSubscribers = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n // Deregister the watcher when the scope/directive is destroyed\n $scope.$on('$destroy', removeAllSubscribers);\n\n // =========================\n // Initialization\n // =========================\n init();\n },\n };\n}\n"],"names":["editableContent","restrict","require","scope","ngModel","ngDisabled","placeholder","templateUrl","link","element","attrs","ngModelCtrl","editableDiv","find","updateModelValue","$apply","html","length","text","trim","empty","$setViewValue","innerText","$render","$viewValue","pasteHandler","event","preventDefault","originalEvent","clipboardData","getData","selection","window","getSelection","rangeCount","deleteFromDocument","range","getRangeAt","fragment","document","createDocumentFragment","lines","split","forEach","line","index","appendChild","createTextNode","createElement","insertNode","collapseToEnd","$on","removeAllSubscribers","off","on","angular","module","directive","$inject","ChatItemModel","constructor","chatId","question","this","_chatId","_agentId","undefined","_question","_answers","value","agentId","answers","setQuestionMessage","message","ChatMessageModel","role","CHAT_MESSAGE_ROLE","USER","getQuestionMessage","toCreateChatRequestPayload","toAskRequestPayload","conversationId","tzOffset","Date","getTimezoneOffset","toExplainResponsePayload","answerId","ChatItemsListModel","items","_items","isEmpty","appendItem","chatItem","push","getLast","data","_id","id","_role","_message","_timestamp","timestamp","tokenUsageInfo","_isTerminalState","isTerminalState","_status","status","addToChatAnswer","chatAnswer","messages","ASSISTANT","ExplainResponseModel","_answerId","_queryMethods","queryMethods","_expanded","expanded","ExplainQueryMethodsListModel","ExplainQueryMethodModel","_name","name","_rawQuery","rawQuery","_query","query","_queryType","queryType","_errorMessage","errorOutput","errorMessage","ExplainQueryType","SPARQL","JSON","OTHER","ChatPanelComponent","toastr","$translate","TTYGContextService","$scope","chat","selectedAgent","askingChatItem","waitingForLastMessage","loadingChat","showCancelButton","ask","now","cloneDeep","askQuestion","createNewChat","getEmptyChatItem","scrollToBottom","focusQuestionInput","cancelPendingQuestion","emit","TTYGEventName","CANCEL_PENDING_QUESTION","regenerateQuestion","regenerateChatItem","isAskDisabled","isDeleted","onKeypressOnInput","$event","key","shiftKey","ctrlKey","onAskHowDeliveredAnswer","askHowDerivedAnswerChatItem","instant","getAgentName","agent","getAgent","decodeHTML","CREATE_CHAT","ASK_QUESTION","setAskingState","isAsking","ASK_QUESTION_STATE_CHANGED","onQuestionFailure","setTimeout","inputElement","querySelector","focus","chatDetailsElement","scrollTop","scrollHeight","reset","subscriptions","$watchCollection","onSelectedChatUpdated","isNew","lastChatItem","chatHistory","selectAgent","onLastMessageReceived","onSelectedAgentChanged","onSelectedChatChanged","subscribe","LOAD_CHAT_FAILURE","onLoadChatFailure","ASK_QUESTION_FAILURE","CREATE_CHAT_FAILURE","DELETE_CHAT_SUCCESSFUL","deletedChat","ASK_QUESTION_STARTING","subscription"],"sourceRoot":""}
|