graphdb-workbench 3.3.2-TR1 → 3.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/13231.d7107e7549453805e13a.bundle.js +2 -0
- package/dist/13231.d7107e7549453805e13a.bundle.js.map +1 -0
- package/dist/{20694.a738f5634ec09369dc85.bundle.js → 20694.4becb7771236462dcc5a.bundle.js} +2 -2
- package/dist/20694.4becb7771236462dcc5a.bundle.js.map +1 -0
- package/dist/21015.ea34b563b4149ad0975e.bundle.js +2 -0
- package/dist/21015.ea34b563b4149ad0975e.bundle.js.map +1 -0
- package/dist/38644.0e8652c647a0f341abd7.bundle.js +2 -0
- package/dist/38644.0e8652c647a0f341abd7.bundle.js.map +1 -0
- package/dist/39518.4d72b74fffba395c6b2a.bundle.js +2 -0
- package/dist/{39518.2871b32c37b20075dba3.bundle.js.map → 39518.4d72b74fffba395c6b2a.bundle.js.map} +1 -1
- package/dist/39874.710e94f211579215f997.bundle.js +2 -0
- package/dist/39874.710e94f211579215f997.bundle.js.map +1 -0
- package/dist/60560.6ba1b091a34af6c00770.bundle.js +2 -0
- package/dist/60560.6ba1b091a34af6c00770.bundle.js.map +1 -0
- package/dist/67888.41803878170b6c7a5ca5.bundle.js +2 -0
- package/dist/67888.41803878170b6c7a5ca5.bundle.js.map +1 -0
- package/dist/7815.2aec5ebbcd434f5582ff.bundle.js +2 -0
- package/dist/7815.2aec5ebbcd434f5582ff.bundle.js.map +1 -0
- package/dist/78681.9e1d4e064e9e1fb5fb21.bundle.js +2 -0
- package/dist/78681.9e1d4e064e9e1fb5fb21.bundle.js.map +1 -0
- package/dist/{82926.99231caacc379c66487a.bundle.js → 82926.ce1d6bf65b09288a2b10.bundle.js} +2 -2
- package/dist/{82926.99231caacc379c66487a.bundle.js.map → 82926.ce1d6bf65b09288a2b10.bundle.js.map} +1 -1
- package/dist/94229.47dbdba202106c61dff1.bundle.js.map +1 -1
- package/dist/99448.2a87f387a8062617d893.bundle.js +2 -0
- package/dist/99448.2a87f387a8062617d893.bundle.js.map +1 -0
- package/dist/api/models/cookie/cookie-options.d.ts +17 -0
- package/dist/api/models/cookie/index.d.ts +1 -1
- package/dist/api/models/security/authenticated-user.d.ts +2 -0
- package/dist/api/models/tracking/cookie-consent.d.ts +39 -0
- package/dist/api/models/tracking/index.d.ts +1 -0
- package/dist/api/models/users/app-settings.d.ts +2 -2
- package/dist/api/ontotext-workbench-api.d.ts +3 -1
- package/dist/api/ontotext-workbench-api.js +1 -1
- package/dist/api/ontotext-workbench-api.js.map +1 -1
- package/dist/api/services/cookie/browser-cookie-store.d.ts +19 -0
- package/dist/api/services/cookie/cookie-builder.d.ts +77 -0
- package/dist/api/services/cookie/cookie-store.d.ts +16 -0
- package/dist/api/services/cookie/cookie.service.d.ts +34 -7
- package/dist/api/services/cookie/error/invalid-cookie-expiration.d.ts +8 -0
- package/dist/api/services/cookie/index.d.ts +3 -0
- package/dist/api/services/cookie/test/cookie-builder.spec.d.ts +1 -0
- package/dist/api/services/cookie/test/in-memory-cookie-store.d.ts +11 -0
- package/dist/api/services/security/auth-strategies/tests/provider-response-mocks.d.ts +2 -2
- package/dist/api/services/security/security-context.service.d.ts +6 -0
- package/dist/api/services/tracking/google-analytics-cookie.service.d.ts +50 -0
- package/dist/api/services/tracking/index.d.ts +4 -0
- package/dist/api/services/tracking/installation-cookie.service.d.ts +37 -0
- package/dist/api/services/tracking/test/tracking-storage.service.spec.d.ts +1 -0
- package/dist/api/services/tracking/test/tracking.service.spec.d.ts +1 -0
- package/dist/api/services/tracking/tracking-storage.service.d.ts +27 -0
- package/dist/api/services/tracking/tracking.service.d.ts +56 -0
- package/dist/api/services/users/response/user-response.d.ts +1 -1
- package/dist/api/services/utils/date-util.d.ts +11 -0
- package/dist/api/services/utils/index.d.ts +1 -0
- package/dist/api/services/window/window.service.d.ts +6 -0
- package/dist/assets/i18n/fr.json +1 -1
- package/dist/index.html +9 -9
- package/dist/js/angular/clustermanagement/templates/cluster-nodes-configuration.html +1 -1
- package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +1 -1
- package/dist/js/angular/core/directives/dynamic-form/templates/dynamic-form.html +1 -1
- package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +1 -1
- package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
- package/dist/js/angular/core/directives/shuttle-multiselect/templates/shuttle-multiselect.html +1 -1
- package/dist/js/angular/core/directives/yasgui-component/templates/yasgui-component.html +2 -2
- package/dist/js/angular/core/templates/cookie-policy/cookie-consent.html +1 -1
- package/dist/js/angular/core/templates/cookie-policy/cookie-policy.html +1 -1
- package/dist/js/angular/core/templates/editable-content/editable-content.html +1 -1
- package/dist/js/angular/core/templates/markdown-content/markdown-content.html +1 -1
- package/dist/js/angular/core/templates/search-resource-input.html +1 -1
- package/dist/js/angular/graphql/templates/create-graphql-endpoint.html +2 -2
- package/dist/js/angular/graphql/templates/graphql-endpoint-management.html +1 -1
- package/dist/js/angular/graphql/templates/graphql-playground.html +2 -2
- package/dist/js/angular/graphql/templates/modal/endpoint-configuration-modal.html +1 -1
- package/dist/js/angular/graphql/templates/modal/endpoint-generation-failure-result-modal.html +1 -1
- package/dist/js/angular/graphql/templates/modal/import-endpoint-definition-modal.html +1 -1
- package/dist/js/angular/security/templates/user.html +5 -2
- package/dist/js/angular/ttyg/templates/agent-list.html +1 -1
- package/dist/js/angular/ttyg/templates/agent-select-menu.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-item-detail.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-list.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-panel.html +1 -1
- package/dist/js/angular/ttyg/templates/modal/agent-instructions-explain-modal.html +1 -1
- package/dist/js/angular/ttyg/templates/modal/agent-settings-modal.html +3 -3
- package/dist/js/angular/ttyg/templates/modal/external-integration-configuration-modal.html +1 -1
- package/dist/js/angular/ttyg/templates/no-agents-view.html +1 -1
- package/dist/js/angular/ttyg/templates/ttyg.html +1 -1
- package/dist/legacyWorkbench.40eba9e09196e1483221.js +3 -0
- package/dist/{legacyWorkbench.88e1d4d209e51c6f9b65.js.map → legacyWorkbench.40eba9e09196e1483221.js.map} +1 -1
- package/dist/license-checker-static.json +0 -7
- package/dist/{main.1be0fc11ab24b99f8800.js → main.14f083264cd64618d96a.js} +3 -3
- package/dist/main.14f083264cd64618d96a.js.map +1 -0
- package/dist/pages/aclmanagement.html +1 -1
- package/dist/pages/autocomplete.html +1 -1
- package/dist/pages/choose-repository-type.html +1 -1
- package/dist/pages/cluster-management/clusterInfo.html +3 -3
- package/dist/pages/create-index.html +1 -1
- package/dist/pages/dependencies.html +1 -1
- package/dist/pages/domainRangeInfo.html +2 -2
- package/dist/pages/edit.html +1 -1
- package/dist/pages/explore.html +1 -1
- package/dist/pages/export.html +1 -1
- package/dist/pages/find.html +1 -1
- package/dist/pages/graph-config/saveGraphConfig.html +8 -8
- package/dist/pages/graphs-visualizations.html +7 -7
- package/dist/pages/guides.html +1 -1
- package/dist/pages/home.html +1 -1
- package/dist/pages/import.html +2 -2
- package/dist/pages/jdbc-create.html +1 -1
- package/dist/pages/jdbc.html +1 -1
- package/dist/pages/monitor/backup-and-restore.html +1 -1
- package/dist/pages/monitor/queries.html +1 -1
- package/dist/pages/monitor/resources.html +1 -1
- package/dist/pages/namespaces.html +2 -2
- package/dist/pages/plugins.html +1 -1
- package/dist/pages/rdfClassHierarchyInfo.html +7 -7
- package/dist/pages/rdfrank.html +2 -2
- package/dist/pages/repositories.html +1 -1
- package/dist/pages/repository.html +1 -1
- package/dist/pages/similarity-indexes.html +1 -1
- package/dist/pages/sparql-editor.html +1 -1
- package/dist/pages/sparql-template-create.html +1 -1
- package/dist/pages/sparql-templates.html +1 -1
- package/dist/pages/ux-test1.html +2 -2
- package/dist/pages/webapi.html +2 -2
- package/dist/res/swagger5/index.html +11 -11
- package/dist/shared-components/cjs/function-utils-WB47AWpR.js +1 -0
- package/dist/shared-components/cjs/loader.cjs.js +1 -1
- package/dist/shared-components/cjs/onto-cookie-consent_2.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-dialog_2.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-footer_5.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-layout.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-test-context.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/shared-components.cjs.js +1 -1
- package/dist/shared-components/collection/components/dialogs/onto-cookie-policy-dialog/onto-cookie-policy-dialog.js +1 -1
- package/dist/shared-components/collection/components/dialogs/onto-dialog.js +1 -1
- package/dist/shared-components/collection/components/onto-cookie-consent/onto-cookie-consent.css +1 -1
- package/dist/shared-components/collection/components/onto-cookie-consent/onto-cookie-consent.js +1 -1
- package/dist/shared-components/collection/components/onto-footer/onto-footer.js +1 -1
- package/dist/shared-components/esm/function-utils-D1ZpXQQS.js +1 -0
- package/dist/shared-components/esm/loader.js +1 -1
- package/dist/shared-components/esm/onto-cookie-consent_2.entry.js +1 -1
- package/dist/shared-components/esm/onto-dialog_2.entry.js +1 -1
- package/dist/shared-components/esm/onto-footer_5.entry.js +1 -1
- package/dist/shared-components/esm/onto-layout.entry.js +1 -1
- package/dist/shared-components/esm/onto-test-context.entry.js +1 -1
- package/dist/shared-components/esm/shared-components.js +1 -1
- package/dist/shared-components/shared-components/{p-279a026b.entry.js → p-5886e663.entry.js} +1 -1
- package/dist/shared-components/shared-components/p-598d33d7.entry.js +1 -0
- package/dist/shared-components/shared-components/p-6d34b2cb.entry.js +1 -0
- package/dist/shared-components/shared-components/p-74888633.entry.js +1 -0
- package/dist/shared-components/shared-components/p-D1ZpXQQS.js +1 -0
- package/dist/shared-components/shared-components/p-b5d4081d.entry.js +1 -0
- package/dist/shared-components/shared-components/shared-components.esm.js +1 -1
- package/dist/shared-components/types/components/dialogs/onto-cookie-policy-dialog/onto-cookie-policy-dialog.d.ts +31 -7
- package/dist/shared-components/types/components/onto-cookie-consent/onto-cookie-consent.d.ts +2 -2
- package/dist/shared-components/types/components/onto-footer/onto-footer.d.ts +9 -2
- package/dist/shared-components/types/components.d.ts +17 -8
- package/dist/shared-components/types/models/dialog/dialog-handler.d.ts +4 -0
- package/package.json +1 -1
- package/dist/13231.9b625e487e6385faa36f.bundle.js +0 -2
- package/dist/13231.9b625e487e6385faa36f.bundle.js.map +0 -1
- package/dist/20694.a738f5634ec09369dc85.bundle.js.map +0 -1
- package/dist/21015.68c7c667ef64ad8e8e0d.bundle.js +0 -2
- package/dist/21015.68c7c667ef64ad8e8e0d.bundle.js.map +0 -1
- package/dist/38644.37a8cd71112da94401d9.bundle.js +0 -2
- package/dist/38644.37a8cd71112da94401d9.bundle.js.map +0 -1
- package/dist/39518.2871b32c37b20075dba3.bundle.js +0 -2
- package/dist/39874.47a6948df3520a7bf37a.bundle.js +0 -2
- package/dist/39874.47a6948df3520a7bf37a.bundle.js.map +0 -1
- package/dist/60560.275a89ab1375e91de0aa.bundle.js +0 -2
- package/dist/60560.275a89ab1375e91de0aa.bundle.js.map +0 -1
- package/dist/67888.b75d9678cf65cd82f065.bundle.js +0 -2
- package/dist/67888.b75d9678cf65cd82f065.bundle.js.map +0 -1
- package/dist/7815.f09f8d6953d2c964e04d.bundle.js +0 -2
- package/dist/7815.f09f8d6953d2c964e04d.bundle.js.map +0 -1
- package/dist/78681.0cfa1e86d4dac1b7e7e8.bundle.js +0 -2
- package/dist/78681.0cfa1e86d4dac1b7e7e8.bundle.js.map +0 -1
- package/dist/99448.272a4ba1ce8032167bea.bundle.js +0 -2
- package/dist/99448.272a4ba1ce8032167bea.bundle.js.map +0 -1
- package/dist/api/models/cookie/cookie-consent.d.ts +0 -14
- package/dist/legacyWorkbench.88e1d4d209e51c6f9b65.js +0 -3
- package/dist/main.1be0fc11ab24b99f8800.js.map +0 -1
- package/dist/shared-components/collection/models/dialog/onto-dialog.js +0 -1
- package/dist/shared-components/shared-components/p-2075209c.entry.js +0 -1
- package/dist/shared-components/shared-components/p-30e4880f.entry.js +0 -1
- package/dist/shared-components/shared-components/p-413b3789.entry.js +0 -1
- package/dist/shared-components/shared-components/p-67199a46.entry.js +0 -1
- package/dist/shared-components/types/models/dialog/onto-dialog.d.ts +0 -4
- /package/dist/{legacyWorkbench.88e1d4d209e51c6f9b65.js.LICENSE.txt → legacyWorkbench.40eba9e09196e1483221.js.LICENSE.txt} +0 -0
- /package/dist/{main.1be0fc11ab24b99f8800.js.LICENSE.txt → main.14f083264cd64618d96a.js.LICENSE.txt} +0 -0
package/dist/{39518.2871b32c37b20075dba3.bundle.js.map → 39518.4d72b74fffba395c6b2a.bundle.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"39518.2871b32c37b20075dba3.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/repositories/repository.constants.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/common/d3-utils.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/graphexplore/controllers/graphs-visualizations.controller.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/d3.patch.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/d3-tip/d3-tip-patch.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/utils/string-utils.js"],"sourcesContent":["export const STATIC_RULESETS = [\n {id: 'empty', name: 'No inference'},\n {id: 'rdfs-optimized', name: 'RDFS (Optimized)'},\n {id: 'rdfs', name: 'RDFS'},\n {id: 'rdfsplus-optimized', name: 'RDFS-Plus (Optimized)'},\n {id: 'owl-horst-optimized', name: 'OWL-Horst (Optimized)'},\n {id: 'owl-horst', name: 'OWL-Horst'},\n {id: 'owl2-ql-optimized', name: 'OWL2-QL (Optimized)'},\n {id: 'owl2-ql', name: 'OWL2-QL'},\n {id: 'owl-max-optimized', name: 'OWL-Max (Optimized)'},\n {id: 'owl-max', name: 'OWL-Max'},\n {id: 'owl2-rl-optimized', name: 'OWL2-RL (Optimized)'},\n {id: 'owl2-rl', name: 'OWL2-RL'},\n\n];\n\nexport const REPOSITORY_TYPES = {graphdbRepo: 'graphdb', free: 'free', eeWorker: 'worker', eeMaster: 'master', ontop: 'ontop', se: 'se', fedx: 'fedx'};\nexport const FILENAME_PATTERN = new RegExp('^[a-zA-Z0-9-_]+$');\nexport const NUMBER_PATTERN = new RegExp('^[0-9]+$');\n","import 'lib/d3.patch.js'\nimport {dispatch, pointer} from 'd3';\n\nconst d3 = {\n dispatch,\n pointer\n}\n\nvar D3 = D3 || {};\n\nD3.Text = function () {\n function calcFontSizeRaw(text, radius, minimumSize, isMultiline) {\n minimumSize = minimumSize || 10;\n\n var textSize = radius / 3;\n if (typeof text === \"string\") {\n var len = text.substring(0, radius / 3).length + 1.5;\n textSize *= 10 / len;\n textSize += 1;\n // experimental alternative method:\n // var textSize = 3.3 * radius / text.length;\n\n // Tweak for Indian scripts and CJK ones\n if (text.match(/[\\u0900-\\u0DFF\\u1100-\\u11FF\\u2E80-\\u2EFF\\u3000-\\u9FFF]/)) {\n textSize *= 0.6;\n }\n\n if (textSize < minimumSize) {\n textSize = minimumSize;\n }\n\n /* Disabled for the time being, better without this\n if (isMultiline) {\n var numWords = text.split(/\\s+/).length;\n if (numWords > 1) {\n if (numWords > 4) {\n numWords = 4;\n }\n textSize += textSize * (4 - numWords) * 0.1;\n }\n }\n */\n\n return Math.round(textSize);\n }\n\n if (textSize < minimumSize) {\n textSize = minimumSize;\n }\n\n return Math.round(textSize);\n }\n\n function calcFontSize(text, radius, minimumSize, isMultiline) {\n return calcFontSizeRaw(text, radius, minimumSize, isMultiline) + 'px';\n }\n\n function getTextWithElipsisIfNeeded(str, threshold) {\n if (typeof str === \"string\") {\n if (str.length > threshold) {\n return str.substring(0, threshold - 3) + \"...\";\n }\n }\n return str;\n }\n\n return {\n calcFontSizeRaw: calcFontSizeRaw,\n calcFontSize: calcFontSize,\n getTextWithElipsisIfNeeded: getTextWithElipsisIfNeeded\n };\n}();\n\nD3.Transition = function () {\n function fadeIn(sel, duration) {\n sel.style(\"opacity\", 0.0)\n .transition()\n .duration(duration)\n .style(\"opacity\", 1.0);\n }\n\n function fadeOut(sel, duration) {\n sel.style(\"opacity\", 1.0)\n .transition()\n .duration(duration)\n .style(\"opacity\", 0.0);\n }\n\n return {\n fadeIn: fadeIn,\n fadeOut: fadeOut\n };\n}();\n\nD3.Click = function () {\n function delayDblClick() {\n var dispatchedEvent = d3.dispatch('click', 'dblclick');\n\n function cc(selection) {\n var down,\n tolerance = 5,\n last,\n wait = null;\n\n // euclidean distance\n function dist(a, b) {\n return Math.sqrt(Math.pow(a[0] - b[0], 2), Math.pow(a[1] - b[1], 2));\n }\n\n selection.on('mousedown', function () {\n down = d3.pointer(document.body);\n last = +new Date();\n });\n selection.on('mouseup', function (event, d) {\n if (dist(down, d3.pointer(document.body)) > tolerance) {\n return;\n } else {\n if (wait) {\n window.clearTimeout(wait);\n wait = null;\n dispatchedEvent.call('dblclick', event, event, d);\n } else {\n wait = window.setTimeout((function (e) {\n return function () {\n dispatchedEvent.call('click', e, e, d)\n wait = null;\n };\n })(event), 250);\n }\n }\n });\n }\n\n return rebind(cc, dispatchedEvent, 'on');\n }\n\n // Copies a variable number of methods from source to target.\n const rebind = function (target, source) {\n let i = 1, n = arguments.length, method;\n while (++i < n) {\n method = arguments[i]\n target[method] = d3_rebind(target, source, source[method]);\n }\n return target;\n }\n\n // Method is assumed to be a standard D3 getter-setter:\n // If passed with no arguments, gets the value.\n // If passed with arguments, sets the value and returns the target.\n function d3_rebind(target, source, method) {\n return function () {\n var value = method.apply(source, arguments);\n return value === source ? target : value;\n };\n }\n\n return {\n delayDblClick: delayDblClick\n };\n}();\n\nexport default D3;\n","import 'angular/core/services';\nimport 'angular/core/services/workbench-context.service';\nimport 'angular/core/services/rdf4j-repositories.service';\nimport D3 from 'lib/common/d3-utils.js';\nimport d3tip from 'lib/d3-tip/d3-tip-patch';\nimport * as d3 from 'd3';\nimport 'angular/utils/local-storage-adapter';\nimport {NUMBER_PATTERN} from \"../../repositories/repository.constants\";\nimport {removeSpecialChars} from \"../../utils/string-utils\";\nimport {NamespacesListModel} from \"../../models/namespaces/namespaces-list\";\nimport {HtmlUtil} from \"../../utils/html-util\";\nimport {\n RepositoryContextService,\n SecurityContextService,\n LicenseContextService,\n REPOSITORY_ID_PARAM,\n service,\n} from \"@ontotext/workbench-api\";\n\nconst modules = [\n 'ui.scroll.jqlite',\n 'ui.scroll',\n 'toastr',\n 'ui.bootstrap',\n 'ngTagsInput',\n 'graphdb.framework.utils.localstorageadapter',\n 'graphdb.core.services.workbench-context',\n 'graphdb.framework.core.services.rdf4j.repositories',\n];\n\nangular\n .module('graphdb.framework.graphexplore.controllers.graphviz', modules)\n .controller('GraphsVisualizationsCtrl', GraphsVisualizationsCtrl)\n .controller('SaveGraphModalCtrl', SaveGraphModalCtrl)\n .config(['$uibTooltipProvider', function($uibTooltipProvider) {\n $uibTooltipProvider.options({appendToBody: true});\n }]);\n\nGraphsVisualizationsCtrl.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$repositories\",\n \"toastr\",\n \"$timeout\",\n \"ClassInstanceDetailsService\",\n \"$q\",\n \"$location\",\n \"$jwtAuth\",\n \"UiScrollService\",\n \"ModalService\",\n \"$uibModal\",\n \"$window\",\n \"LocalStorageAdapter\",\n \"LSKeys\",\n \"SavedGraphsRestService\",\n \"GraphConfigRestService\",\n \"GraphDataRestService\",\n \"$translate\",\n \"GuidesService\",\n \"WorkbenchContextService\",\n 'RDF4JRepositoriesService',\n];\n\nfunction GraphsVisualizationsCtrl(\n $scope,\n $rootScope,\n $repositories,\n toastr,\n $timeout,\n ClassInstanceDetailsService,\n $q,\n $location,\n $jwtAuth,\n UiScrollService,\n ModalService,\n $uibModal,\n $window,\n LocalStorageAdapter,\n LSKeys,\n SavedGraphsRestService,\n GraphConfigRestService,\n GraphDataRestService,\n $translate,\n GuidesService,\n WorkbenchContextService,\n RDF4JRepositoriesService,\n) {\n const securityContextService = service(SecurityContextService);\n const repositoryContextService = service(RepositoryContextService);\n // Multiplier to calculate the height of the labels element based on the font size.\n // Based on this, we display different numbers of rows. Currently, this results in 3 rows of text\n const heightMultiplier = 4.2;\n\n // =========================\n // Public fields\n // =========================\n\n $scope.languageChanged = false;\n $scope.propertiesObj = {};\n $scope.propertiesObj.items = [];\n $scope.propertiesQueryObj = {};\n $scope.propertiesQueryObj.query = '';\n $scope.propertiesSearchPlaceholder = $translate.instant(\"visual.search.instance.placeholder\");\n $scope.propertiesNotFiltered = [];\n $scope.searchVisible = false;\n $scope.nodeSelected = false;\n $scope.queryResultsMode = false;\n $scope.embedded = $location.search().embedded;\n $scope.openedNodeInfoPanel = undefined;\n $scope.invalidLimit = false;\n $scope.INVALID_LINKS_MSG = $translate.instant('sidepanel.invalid.limit.links.msg');\n $scope.INVALID_LINKS_TOOLTIP = $translate.instant('sidepanel.invalid.limit.links.tooltip');\n $scope.datasource = undefined;\n // adapter implementation for ui-scroll directive\n $scope.adapterContainer = {adapter: {remain: true}};\n // Flag to avoid calling repo init logic twice\n $scope.hasInitedRepository = false;\n $scope.defaultSettings = {\n linksLimit: 20,\n includeInferred: true,\n sameAsState: true,\n truncateNodeLabels: true,\n languages: ['en'],\n showLinksText: true,\n preferredTypes: [],\n rejectedTypes: [],\n preferredPredicates: [],\n rejectedPredicates: [\"http://dbpedia.org/property/logo\",\n \"http://dbpedia.org/property/hasPhotoCollection\",\n \"http://dbpedia.org/property/website\",\n \"http://dbpedia.org/property/homepage\",\n \"http://dbpedia.org/ontology/thumbnail\",\n \"http://xmlns.com/foaf/0.1/depiction\",\n \"http://xmlns.com/foaf/0.1/homepage\",\n \"http://xmlns.com/foaf/0.1/mbox\",\n \"http://dbpedia.org/ontology/wikiPage*\",\n \"http://dbpedia.org/property/wikiPage*\",\n \"http://factforge.net/*\"],\n preferredTypesOnly: false,\n preferredPredicatesOnly: false,\n includeSchema: true,\n };\n // Static defaults before we do the actual dynamic default settings in initSettings\n $scope.saveSettings = _.cloneDeep($scope.defaultSettings);\n $scope.defaultGraphConfig = {\n id: 'default',\n name: 'Easy graph',\n startMode: 'search',\n };\n\n // TODO: check if this can be moved in the local scope and not in the global one\n $rootScope.key = \"\";\n\n\n // =========================\n // Public functions\n // =========================\n\n // Handle pageslide directive callbacks which incidentally appeared to be present in the angular's\n // scope, so we need to define our's and pass them to pageslide, otherwise it throws an error.\n $scope.onopen = $scope.onclose = () => angular.noop();\n\n $scope.goToHome = () => {\n resetState();\n // When closing the visualization screen, remove the config parameter from the URL. Leave other search params intact.\n // eslint-disable-next-line no-unused-vars\n const {config, ...searchParams} = $location.search();\n $location.path('/graphs-visualizations').search(searchParams);\n };\n\n $scope.shouldShowSettings = () => {\n return $scope.configLoaded && $scope.configLoaded.id === $scope.defaultGraphConfig.id;\n };\n\n $scope.shouldDisableSameAs = () => {\n const sameAsCheckbox = $('#sameAsCheck');\n if ($scope.settings && !$scope.settings['includeInferred'] && sameAsCheckbox.prop('checked')) {\n sameAsCheckbox.prop(\"checked\", false);\n $scope.settings['sameAsState'] = false;\n }\n\n return $scope.settings && !$scope.settings['includeInferred'];\n };\n\n $scope.propertiesFilterFunc = (item) => {\n return item.key.toLowerCase().indexOf($scope.propertiesQueryObj.query.toLowerCase()) >= 0;\n };\n\n $scope.toggleMoreInfo = (ev) => {\n angular.element(ev.currentTarget).parent().next().toggle(200);\n angular.element(ev.currentTarget).children('span').toggleClass(\"ri-arrow-down-s-line\").toggleClass(\"ri-arrow-up-s-line\");\n };\n\n $scope.copyToClipboard = (uri) => {\n ModalService.openCopyToClipboardModal(uri);\n };\n\n $scope.resetSettings = () => {\n $scope.settings = _.cloneDeep($scope.defaultSettings);\n $scope.validateLinksLimit();\n renderSettings();\n };\n\n $scope.changeLimit = (delta) => {\n let linksLimit = $scope.settings.linksLimit + delta;\n if (linksLimit < 1) {\n linksLimit = 1;\n }\n if (linksLimit > 1000) {\n linksLimit = 1000;\n }\n $scope.settings.linksLimit = linksLimit;\n };\n\n $scope.validateLinksLimit = () => {\n $scope.invalidLimit = !NUMBER_PATTERN.test($scope.settings.linksLimit);\n };\n\n $scope.showSettings = () => {\n $scope.showInfoPanel = true;\n $scope.showFilter = true;\n $scope.showNodeInfo = false;\n $scope.showPredicates = false;\n if (!$scope.saveSettings) {\n $scope.settings = _.cloneDeep($scope.defaultSettings);\n } else {\n $scope.settings = _.cloneDeep($scope.saveSettings);\n }\n renderSettings();\n };\n\n $scope.updateSettings = () => {\n if ($scope.invalidLimit) {\n toastr.error($scope.INVALID_LINKS_TOOLTIP, $scope.INVALID_LINKS_MSG);\n return;\n }\n $scope.saveSettings = $scope.settings;\n $scope.saveSettings.languages = _.map($scope.saveSettings['languagesMap'], function(s) {\n return s['text'];\n });\n\n $scope.saveSettings.preferredTypes = _.map($scope.saveSettings['preferredTypesMap'], function(t) {\n return t['text'];\n });\n $scope.saveSettings.rejectedTypes = _.map($scope.saveSettings['rejectedTypesMap'], function(t) {\n return t['text'];\n });\n\n $scope.saveSettings.preferredPredicates = _.map($scope.saveSettings['preferredPredicatesMap'], function(t) {\n return t['text'];\n });\n $scope.saveSettings.rejectedPredicates = _.map($scope.saveSettings['rejectedPredicatesMap'], function(t) {\n return t['text'];\n });\n\n // TODO\n // reexpand root node\n if ($scope.rootNodeIri) {\n reExpandNode($scope.rootNodeIri);\n } else if ($scope.queryResultsMode && $location.search().query) {\n loadGraphForQuery($location.search().query,\n $location.search().sameAs,\n $location.search().inference);\n } else if ($scope.configLoaded.startMode === 'query') {\n loadGraphConfig($scope.configLoaded);\n }\n\n updatePredicateLabels();\n\n $scope.showInfoPanel = false;\n $scope.showFilter = false;\n\n LocalStorageAdapter.set(LSKeys.GRAPHS_VIZ, $scope.saveSettings);\n };\n\n // Graph Config\n $scope.getGraphConfigs = (graphCallback) => {\n GraphConfigRestService.getGraphConfigs()\n .success(function(data) {\n $scope.graphConfigs = data;\n if (graphCallback) {\n graphCallback();\n }\n }).error(function(data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.graph.configs.short.msg'));\n });\n };\n\n $scope.findConfigById = function(configId) {\n if (configId === $scope.defaultGraphConfig.id) {\n return $scope.defaultGraphConfig;\n }\n return $.grep($scope.graphConfigs, function(e) {\n return e.id === configId;\n })[0];\n };\n\n $scope.easyGraphSearch = (iri) => {\n $scope.configLoaded = $scope.defaultGraphConfig;\n $scope.openUri(iri);\n };\n\n /**\n * Handles the delete graph config action.\n * @param {GraphsConfig} config\n */\n $scope.deleteConfig = (config) => {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('graphexplore.delete.graph', {configName: config.name}),\n warning: true,\n }).result\n .then(function() {\n GraphConfigRestService.deleteGraphConfig(config)\n .success(function() {\n $scope.getGraphConfigs();\n $scope.refreshSavedGraphs();\n }).error(function(data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.cannot.delete.config'));\n });\n });\n };\n\n $scope.goToGraphConfig = (config) => {\n const searchParams = {\n config: config.id,\n [REPOSITORY_ID_PARAM]: repositoryContextService.getSelectedRepository().id,\n };\n pushHistory(searchParams, {config: config});\n resetState();\n loadGraphConfig(config);\n };\n\n $scope.replaceIRIWithPrefix = (iri) => {\n const namespaces = $scope.namespaces;\n const namespacePrefix = _.findLast(namespaces, function(o) {\n return iri.indexOf(o.uri) === 0;\n });\n return namespacePrefix ? (namespacePrefix.prefix + \":\" + iri.substring(namespacePrefix.uri.length)) : iri;\n };\n\n const onSelectedRepositoryUpdated = (repository) => {\n if (!repository) {\n $scope.repositoryNamespaces = new NamespacesListModel();\n return;\n }\n RDF4JRepositoriesService.getNamespaces(repository.id)\n .then((repositoryNamespaces) => {\n $scope.repositoryNamespaces = repositoryNamespaces;\n $scope.namespaces = repositoryNamespaces.namespaces;\n })\n .catch((error) => {\n const msg = getError(error);\n toastr.error(msg, $translate.instant('error.getting.namespaces.for.repo'));\n });\n };\n\n const onAutocompleteEnabledUpdated = (autocompleteEnabled) => {\n $scope.isAutocompleteEnabled = autocompleteEnabled;\n };\n\n // =========================\n // Event handlers\n // =========================\n\n const subscriptions = [];\n\n subscriptions.push($rootScope.$on('$translateChangeSuccess', function() {\n $scope.INVALID_LINKS_MSG = $translate.instant('sidepanel.invalid.limit.links.msg');\n $scope.INVALID_LINKS_TOOLTIP = $translate.instant('sidepanel.invalid.limit.links.tooltip');\n $scope.propertiesSearchPlaceholder = $translate.instant(\"visual.search.instance.placeholder\");\n }));\n\n subscriptions.push(WorkbenchContextService.onAutocompleteEnabledUpdated(onAutocompleteEnabledUpdated));\n subscriptions.push(repositoryContextService.onSelectedRepositoryChanged(onSelectedRepositoryUpdated));\n\n subscriptions.push($scope.$on('repositoryIsSet', function(event, args) {\n const payload = args || {newRepo: false};\n // New repo set from dropdown, clear init state\n if (payload.newRepo) {\n $scope.hasInitedRepository = false;\n }\n\n initForRepository(!!payload.newRepo);\n\n // New repo set from dropdown, clear state and go to home page\n if (payload.newRepo) {\n resetState();\n // Quick-n-dirty way to get rid of the existing vis\n $('.graph-visualization svg').empty();\n\n // When we come from the sparql view and then change the repo though the dropdown,\n // should goToHome and reinit the view, for the search to view on the home page\n if ($location.search().query) {\n $scope.goToHome();\n initGraphFromQueryParam();\n }\n }\n }));\n\n const rootScopeGenericWatcher = () => $rootScope.key;\n const rootScopeGenericChangeHandler = () => {\n position = 0;\n _.each($scope.propertiesObj.items, function(item) {\n if ($rootScope.key > item) {\n position++;\n }\n });\n current++;\n };\n subscriptions.push($rootScope.$watch(rootScopeGenericWatcher, rootScopeGenericChangeHandler));\n\n const propertiesItemsChangeHandler = () => {\n if (angular.isDefined($scope.propertiesObj.items) && $scope.propertiesObj.items.length > 0) {\n $timeout(function() {\n $scope.adapterContainer.adapter.reload();\n }, 500);\n }\n };\n subscriptions.push($scope.$watch('propertiesObj.items', propertiesItemsChangeHandler));\n\n // ========================= Save graph modal =========================\n let modalIsOpen = false;\n // When restarting the modal (\"Save as new...\" button press) opens a new modal and closes the old one\n let openModalCount = 0;\n\n function handleKeyDown(e) {\n if (modalIsOpen) {\n e.stopPropagation();\n }\n }\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n const removeAllListeners = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n const destroyHandler = () => {\n removeAllListeners();\n document.removeEventListener('keydown', handleKeyDown, true);\n\n window.onpopstate = null;\n };\n\n // Deregister the watcher when the scope/directive is destroyed\n $scope.$on('$destroy', destroyHandler);\n\n // =========================\n // Private functions\n // =========================\n\n const pushHistory = (searchParams, state) => {\n if ($scope.embedded) {\n searchParams.embedded = true;\n }\n $location.search(searchParams);\n state.skipOnPopState = true;\n $location.state(state);\n };\n\n const resetState = () => {\n $scope.searchVisible = false;\n $scope.nodeSelected = false;\n $scope.configLoaded = null;\n $scope.queryResultsMode = false;\n $scope.lastSavedGraphName = null;\n $scope.lastSavedGraphId = null;\n $scope.shared = false;\n $scope.numberOfPinnedNodes = 0;\n\n // Reset type colours\n type2color = {};\n colorIndex = 0;\n };\n\n const getSettings = () => {\n // When a guide is active, we really want the default settings to make sure the user gets\n // the same as the author of the guide intended\n return GuidesService.isActive() ? $scope.defaultSettings : $scope.saveSettings;\n };\n\n const updatePredicateLabels = () => {\n if (!getSettings()['showLinksText']) {\n d3.selectAll(\"svg .link-wrapper text\")\n .style(\"display\", \"none\");\n } else {\n d3.selectAll(\"svg .link-wrapper text\")\n .style(\"display\", \"block\");\n }\n };\n\n const updateNodeLabels = (nodeLabels) => {\n nodeLabels.each(function(d) {\n d.fontSize = D3.Text.calcFontSizeRaw(d.labels[0].label, d.size, nodeLabelMinFontSize, true);\n // TODO: get language and set it on the label html tag\n })\n .attr(\"height\", function(d) {\n return d.fontSize * heightMultiplier;\n })\n // if this was kosher we would use xhtml:body here but if we do that angular (or the browser)\n // goes crazy and resizes/messes up other unrelated elements. div seems to work too.\n .append(\"xhtml:div\")\n .attr(\"class\", \"node-label-body\")\n .classed(\"truncated-label\", $scope.saveSettings.truncateNodeLabels)\n .style(\"font-size\", function(d) {\n return d.fontSize + 'px';\n })\n .append('xhtml:div')\n .html(function(d) {\n return HtmlUtil.getText(d.labels[0].label).replaceAll(\"\\n\", \"<br>\");\n });\n };\n\n const initSettings = (principal) => {\n const settingsFromPrincipal = principal.appSettings;\n\n // New style settings from principal\n $scope.defaultSettings.includeInferred = settingsFromPrincipal['DEFAULT_INFERENCE'];\n $scope.defaultSettings.sameAsState = settingsFromPrincipal['DEFAULT_INFERENCE'] && settingsFromPrincipal['DEFAULT_SAMEAS'];\n $scope.defaultSettings.includeSchema = settingsFromPrincipal['DEFAULT_VIS_GRAPH_SCHEMA'];\n\n const localStorageSettings = LocalStorageAdapter.get(LSKeys.GRAPHS_VIZ);\n if (localStorageSettings && typeof localStorageSettings === 'object') {\n // Patch existing settings\n try {\n $scope.saveSettings = localStorageSettings;\n if ($scope.saveSettings['includeSchema'] === undefined) {\n // Add the new defaults when migrating from an old GDB\n $scope.saveSettings['includeSchema'] = $scope.defaultSettings['includeSchema'];\n $scope.saveSettings['rejectedPredicates'] = [...$scope.saveSettings['rejectedPredicates'], ...$scope.defaultSettings['rejectedPredicates']].unique();\n }\n } catch {\n $scope.saveSettings = _.cloneDeep($scope.defaultSettings);\n LocalStorageAdapter.set(LSKeys.GRAPHS_VIZ, $scope.saveSettings);\n }\n } else {\n $scope.saveSettings = _.cloneDeep($scope.defaultSettings);\n }\n };\n\n const renderSettings = () => {\n $scope.settings.languagesMap = _.map($scope.settings.languages, function(v) {\n return {'text': v};\n });\n\n $scope.settings.preferredTypesMap = _.map($scope.settings.preferredTypes, function(v) {\n return {'text': v};\n });\n\n $scope.settings.rejectedTypesMap = _.map($scope.settings.rejectedTypes, function(v) {\n return {'text': v};\n });\n\n $scope.settings.preferredPredicatesMap = _.map($scope.settings.preferredPredicates, function(v) {\n return {'text': v};\n });\n\n $scope.settings.rejectedPredicatesMap = _.map($scope.settings.rejectedPredicates, function(v) {\n return {'text': v};\n });\n };\n\n const reExpandNode = () => {\n if ($scope.rootNodeIri) {\n $scope.$broadcast(\"onRootNodeChange\", $scope.rootNodeIri);\n }\n };\n\n const initGraphFromQueryParam = () => {\n // view sparql\n if ($location.search().query) {\n $scope.searchVisible = false;\n $scope.queryResultsMode = true;\n loadGraphForQuery($location.search().query,\n $location.search().sameAs,\n $location.search().inference);\n } else {\n // broadcasted event from view resource directive to take input value\n $scope.$on('onRootNodeChange', function(e, inputValue) {\n $scope.loading = true;\n const settings = getSettings();\n if (angular.isDefined(inputValue)) {\n $scope.rootNodeIri = inputValue;\n GraphDataRestService.getInstanceNode({\n iri: inputValue,\n config: $scope.configLoaded ? $scope.configLoaded.id : $scope.defaultGraphConfig.id,\n languages: !$scope.shouldShowSettings() ? [] : settings['languages'],\n includeInferred: settings['includeInferred'],\n sameAsState: settings['sameAsState'],\n }).then(function(response) {\n $scope.nodeSelected = true;\n $scope.searchVisible = false;\n if (response.data.types === null) {\n response.data.types = \"greyColor\";\n }\n graph = new Graph();\n const rootNode = graph.addNode(response.data, width / 2, height / 2);\n\n transformValues = INITIAL_CONTAINER_TRANSFORM;\n\n expandNode(rootNode, true);\n }).catch(function(err) {\n $scope.loading = false;\n toastr.error(getError(err), $translate.instant('graphexplore.error.could.not.load.graph'));\n });\n }\n });\n }\n\n if ($location.search().uri) {\n $scope.openUri($location.search().uri, true);\n }\n\n if ($location.search().saved) {\n SavedGraphsRestService.getSavedGraph($location.search().saved)\n .success(function(data) {\n $scope.loadSavedGraph(data);\n })\n .error(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.could.not.open'));\n });\n }\n };\n\n const loadGraphForQuery = (queryString, sameAsParam, inferredParam) => {\n const settings = getSettings();\n const sendSameAs = (sameAsParam === undefined) ? (settings['sameAsState']) : sameAsParam === true;\n const sendInferred = (inferredParam === undefined) ? (settings['includeInferred']) : inferredParam === true;\n $scope.loading = true;\n GraphDataRestService.updateGraph({\n query: queryString,\n linksLimit: settings['linksLimit'],\n languages: !$scope.shouldShowSettings() ? [] : settings['languages'],\n includeInferred: sendInferred,\n sameAsState: sendSameAs,\n }).then(function(response) {\n // Node draw will turn off the loader\n initGraphFromResponse(response);\n }, function(response) {\n $scope.loading = false;\n toastr.error(getError(response.data), $translate.instant('graphexplore.error.cannot.load.graph'));\n });\n };\n\n /**\n * Converts triple to link id or generates unique id (needed for arrows)\n * @param {string} triple\n * @param {boolean} tripleLike\n * @return {string}\n */\n const convertTripleToLinkId = (triple, tripleLike) => {\n const tripleParts = triple.split(' ');\n if (tripleLike) {\n return [tripleParts[0], tripleParts[1], tripleParts[2]].join('>');\n }\n return [tripleParts[0], tripleParts[2]].join('>');\n };\n\n const convertLinkDataToLinkId = (link) => {\n return [link.source.iri, link.target.iri].join('>');\n };\n\n /**\n * If source or target of a link is a triple returns a x\n * for the link, otherwise returns this of the node.\n * Because tick is called before links are created we return node's x,\n * which afterwards will be overridden\n * @param {object} node\n * @return {number|number|*}\n */\n const getNodeX = (node) => {\n if (node.isTriple) {\n const el = document.getElementById(removeSpecialChars(convertTripleToLinkId(node.iri)));\n if (el && typeof el.__data__.x !== \"undefined\") {\n return el.__data__.x;\n }\n }\n return node.x;\n };\n\n /**\n * If source or target of a link is a triple returns a y\n * for the link, otherwise returns this of the node.\n * Because tick is called before links are created we return node's y,\n * which afterwards will be overridden\n * @param {object} node\n * @return {number|number|*}\n */\n const getNodeY = (node) => {\n if (node.isTriple) {\n const el = document.getElementById(removeSpecialChars(convertTripleToLinkId(node.iri)));\n if (el && typeof el.__data__.y !== \"undefined\") {\n return el.__data__.y;\n }\n }\n return node.y;\n };\n\n const createTriple = (value) => {\n const tripleParts = value.trim().split(' ');\n return `<<<${tripleParts[0]}> <${tripleParts[1]}> <${tripleParts[2]}>>>`;\n };\n\n /**\n * Creates unique arrow-marker id will allow change color and refX for particular one\n * @param {object} d\n * @return {string}\n */\n const createArrowMarkerUniqueID = (d) => {\n const source = d.source.isTriple ? convertTripleToLinkId(d.source.iri, true) : d.source.iri;\n const target = d.target.isTriple ? convertTripleToLinkId(d.target.iri, true) : d.target.iri;\n return removeSpecialChars(`${source}>${target}>marker`);\n };\n\n /**\n * Filters nodes array on a given field\n * @param {string} iri\n * @param {Array} array\n * @return {*}\n */\n const distinctBy = (iri, array) => {\n const keys = array.map((value) => value[iri]);\n return array.filter((value, index) => keys.indexOf(value[iri]) === index);\n };\n\n const loadConfigForId = (configId, successCallback) => {\n if (configId === $scope.defaultGraphConfig.id) {\n loadGraphConfig($scope.defaultGraphConfig);\n } else {\n GraphConfigRestService.getConfig(configId)\n .then((data) => {\n loadGraphConfig(data);\n successCallback();\n })\n .catch((data) => {\n toastr.error(getError(data), $translate.instant('graphexplore.error.could.not.load.config', {configId: configId}));\n });\n }\n };\n\n const loadGraphConfig = (config) => {\n $scope.configLoaded = config;\n if (config.startMode === 'search') {\n $scope.searchVisible = true;\n } else if (config.startMode === 'node' && config.startIRI) {\n $timeout(function() {\n $scope.openUri(config.startIRI, true);\n }, 0);\n } else if (config.startMode === 'query' && config.startGraphQuery) {\n $scope.loading = true;\n GraphConfigRestService.loadGraphForConfig(config, config.startQueryIncludeInferred, getSettings()['linksLimit'], config.startQuerySameAs)\n .then(function(response) {\n // Node drawing will turn off loader\n initGraphFromResponse(response);\n }, function(data) {\n $scope.loading = false;\n toastr.error(getError(data), $translate.instant('graphexplore.error.graph.load'));\n });\n }\n };\n\n const loadGraphFromQueryParam = function() {\n // view graph config\n if ($location.search().config) {\n loadConfigForId($location.search().config, initGraphFromQueryParam);\n } else if ($location.search().query || $location.search().uri) {\n loadGraphConfig($scope.defaultGraphConfig);\n initGraphFromQueryParam();\n } else {\n initGraphFromQueryParam();\n }\n };\n\n // Global\n $window.onpopstate = function(event) {\n // Single spa triggers this event in some unwanted cases, for example, when displaying the Visual graph view.\n // By adding skipOnPopState we can skip the execution, whenever we don't need it\n if (event.state && event.state.skipOnPopState) {\n return;\n }\n\n resetState();\n\n if (event.state) {\n if (event.state.config) {\n loadGraphConfig(event.state.config);\n if (event.state.uri) {\n $scope.openUri(event.state.uri, true);\n }\n } else if (event.state.savedGraph) {\n $scope.loadSavedGraph(event.state.savedGraph, true);\n }\n }\n };\n\n // embedded and other params when the controller is initialized\n if ($scope.embedded && ($location.search().query ||\n $location.search().uri ||\n $location.search().config ||\n $location.search().saved)) {\n $scope.noGoHome = true;\n }\n\n let position = 0;\n let current = 0;\n let type2color = {};\n let colorIndex = 0;\n const nodeLabelMinFontSize = 16; // in pixels\n // define zoom and drag behavior; keep this out of draw() to preserve state when nodes are added/removed\n const zoomLayout = d3.zoom().scaleExtent([0.1, 10]);\n let container;\n const INITIAL_CONTAINER_TRANSFORM = d3.zoomIdentity.translate(0, -70).scale(1);\n\n function zoomed(event) {\n if (GuidesService.isActive()) {\n // disable zooming if a guide is active.\n return;\n }\n transformValues = event.transform;\n container.attr(\"transform\", transformValues);\n }\n\n zoomLayout.on(\"zoom\", zoomed);\n\n let transformValues = INITIAL_CONTAINER_TRANSFORM;\n // build svg element\n const width = 1000;\n const height = 1000;\n let tipElement;\n let openedLink;\n\n // creating datasource for class properties data\n $scope.datasource = {\n get: function(index, count, success) {\n return UiScrollService.initLazyList(index, count, success, position, $scope.propertiesObj.items);\n },\n revision: function() {\n return current;\n },\n };\n\n $scope.showInfoPanel = false;\n\n function Graph() {\n this.nodes = [];\n this.links = [];\n this.tripleNodes = new Map();\n this.tripleLinksCopy = new Map();\n\n this.addNode = function(node, x, y) {\n node.x = x;\n node.y = y;\n this.nodes.push(node);\n return node;\n };\n\n // computes a \"connectedness\" metric on each link, which is then used to hint for longer links.\n // this results in improved clustering and appearance.\n this.computeConnectedness = function() {\n // count the the number of times a given node is connected to other nodes\n // (only for nodes connected to more than one node)\n const counts = {};\n const seenLinks = {};\n _.each(this.links, function(link) {\n const i1 = link.source.iri;\n const i2 = link.target.iri;\n const seenKey = _.min([i1, i2]) + \"|\" + _.max([i1, i2]);\n if (!seenLinks[seenKey]) {\n seenLinks[seenKey] = 1;\n counts[i1] = (counts[i1] || 0) + 1;\n counts[i2] = (counts[i2] || 0) + 1;\n }\n });\n\n // computes the connectedness of each link based on the number of times its nodes were connected\n // (only for links to/from nodes connected to more than one node)\n _.each(this.links, function(link) {\n if (counts[link.source.iri] > 1 && counts[link.target.iri] > 1) {\n link.connectedness = Math.min(5, Math.max(counts[link.source.iri], counts[link.target.iri]) - 1);\n } else {\n link.connectedness = 0;\n }\n });\n };\n\n this.addAndMatchLinks = function(newLinks) {\n const nodes = this.nodes;\n Array.prototype.push.apply(this.links, matchLinksToNodes(newLinks, nodes));\n for (const key of graph.tripleLinksCopy.keys()) {\n if (graph.tripleLinksCopy.get(key).length === 1) {\n graph.tripleLinksCopy.delete(key);\n }\n }\n this.links = this.links.filter((link) => link !== null);\n this.computeConnectedness();\n };\n\n const countLinks = function(d, links) {\n return findLinksForNode(d, links).length;\n };\n\n this.countLinks = countLinks;\n\n function findLinksForNode(d, links) {\n return _.filter(links, function(l) {\n return l.source.iri === d.iri || l.target.iri === d.iri;\n });\n }\n\n function linksTypes(d, links) {\n const linksForNode = findLinksForNode(d, links);\n const types = _.map(linksForNode, function(l) {\n return (l.source.iri === d.iri) ? l.target.types : l.source.types;\n });\n return _.uniq(_.flatten(types));\n }\n\n function linksPredicates(d, links) {\n const linksForNode = findLinksForNode(d, links);\n const predicates = _.map(linksForNode, function(l) {\n return l.predicates;\n });\n return _.uniq(_.flatten(predicates));\n }\n\n this.linksTypes = linksTypes;\n\n this.linksPredicates = linksPredicates;\n\n /**\n * Removes generated triple links and related nodes\n * @param triplesToRemove\n */\n this.removeTriples = function(triplesToRemove) {\n const targetTriples = [];\n if (this.tripleNodes.size > 0) {\n triplesToRemove.forEach((source) => {\n if (this.tripleNodes.has(source)) {\n this.tripleNodes.delete(source);\n this.links = _.reject(this.links, function(l) {\n const sourceSplit = source.split('>');\n const lSource = convertTripleToLinkId(l.source.iri);\n const lTarget = convertTripleToLinkId(l.target.iri);\n // Handle triple targets\n if (lSource === source && graph.tripleNodes.delete(lTarget)) {\n const targetSplit = lTarget.split('>');\n targetTriples.push({\n source: targetSplit[0],\n target: targetSplit[1],\n });\n }\n const isRejected = lSource === source || lTarget === source || (l.source.iri === sourceSplit[0] && l.target.iri === sourceSplit[1]);\n if (isRejected) {\n graph.tripleLinksCopy.delete(`${lSource}>${lTarget}`);\n graph.tripleLinksCopy.delete(`${lTarget}>${lSource}`);\n }\n return isRejected;\n });\n }\n });\n }\n\n // This step is needed for removing artificially created links representing triples\n targetTriples.forEach((target) => {\n this.links = _.reject(this.links, function(l) {\n return l.source.iri === target.source && l.target.iri === target.target;\n });\n });\n };\n\n this.removeNode = function(d) {\n const triplesToRemove = [];\n this.links = _.reject(this.links, function(l) {\n const isRejected = l.source.iri === d.iri || l.target.iri === d.iri;\n if (isRejected) {\n if (l.target.isTriple) {\n triplesToRemove.push(convertTripleToLinkId(l.target.iri));\n }\n if (!l.source.isTriple && !l.target.isTriple) {\n triplesToRemove.push([l.source.iri, l.target.iri].join('>'));\n }\n }\n return isRejected;\n });\n\n this.removeTriples(triplesToRemove);\n\n const links = this.links;\n this.nodes = _.reject(this.nodes, function(n) {\n return countLinks(n, links) === 0;\n });\n if (this.nodes.length === 0) {\n $scope.nodeSelected = false;\n }\n\n this.computeConnectedness();\n };\n\n this.removeNodeLeafLinks = function(d) {\n const triplesToRemove = [];\n let links = this.links;\n this.links = _.reject(this.links, function(l) {\n let isRejected = (l.source.iri === d.iri && countLinks(l.target, links) === 1 && !l.target.isTriple) ||\n (l.target.iri === d.iri && countLinks(l.source, links) === 1 && !l.source.isTriple);\n if (!isRejected) {\n let targetLinks;\n if (l.source.iri === d.iri && countLinks(l.target, links) === 2 && !l.target.isTriple) {\n targetLinks = findLinksForNode(l.target, links);\n } else if (l.target.iri === d.iri && countLinks(l.source, links) === 2 && !l.source.isTriple) {\n targetLinks = findLinksForNode(l.source, links);\n }\n if (!targetLinks) {\n return false;\n }\n // the node to which (or from which) d has link to has only two links, check if the second one is to d also\n isRejected = (targetLinks[0].source.iri === d.iri || targetLinks[0].target.iri) &&\n (targetLinks[1].source.iri === d.iri || targetLinks[1].target.iri);\n }\n if (isRejected) {\n if (l.target.isTriple) {\n triplesToRemove.push(convertTripleToLinkId(l.target.iri));\n }\n if (!l.source.isTriple && !l.target.isTriple) {\n triplesToRemove.push([l.source.iri, l.target.iri].join('>'));\n }\n }\n return isRejected;\n });\n\n this.removeTriples(triplesToRemove);\n\n links = this.links;\n this.nodes = _.reject(this.nodes, function(n) {\n return countLinks(n, links) === 0 && n.iri !== d.iri;\n });\n\n this.computeConnectedness();\n };\n\n this.addTriple = function(triple, x, y) {\n triple.x = x;\n triple.y = y;\n triple.weight = 0;\n const key = convertTripleToLinkId(triple.iri);\n if (!this.tripleNodes.has(key)) {\n triple.weight = 10;\n this.tripleNodes.set(key, [triple]);\n } else {\n const value = this.tripleNodes.get(key);\n value.push(triple);\n this.tripleNodes.set(key, value);\n }\n };\n\n function matchLinksToNodes(newLinks, nodes) {\n return _.map(newLinks, function(link) {\n let source;\n let target;\n if (link.isTripleSource) {\n source = getTripleNode(link.source);\n } else {\n source = _.find(nodes, function(o) {\n return o.iri === link.source;\n });\n }\n if (link.isTripleTarget) {\n target = getTripleNode(link.target);\n } else {\n target = _.find(nodes, function(o) {\n return o.iri === link.target;\n });\n }\n const matchedLink = {\n \"source\": source,\n \"target\": target,\n \"predicates\": link.predicates,\n };\n // make copy of links with triples in them\n if (link.isTripleSource || link.isTripleTarget) {\n const sourceId = matchedLink.source.isTriple ? convertTripleToLinkId(matchedLink.source.iri) : matchedLink.source.iri;\n const targetId = matchedLink.target.isTriple ? convertTripleToLinkId(matchedLink.target.iri) : matchedLink.target.iri;\n const linkId = `${sourceId}>${targetId}`;\n if (graph.tripleLinksCopy.has(linkId)) {\n const value = graph.tripleLinksCopy.get(linkId);\n value[0].predicates.push(...matchedLink.predicates);\n value.push(matchedLink);\n graph.tripleLinksCopy.set(linkId, value);\n return null;\n } else {\n graph.tripleLinksCopy.set(linkId, [matchedLink]);\n }\n }\n return matchedLink;\n });\n }\n\n this.copyState = function() {\n const nodesCopy = _.map(this.nodes, function(node) {\n return {\n iri: node.iri,\n isTriple: node.isTriple,\n size: node.size,\n labels: _.cloneDeep(node.labels),\n types: _.cloneDeep(node.types),\n rdfRank: node.rdfRank,\n x: node.x,\n y: node.y,\n fixed: node.fixed,\n };\n });\n\n const triplesCopy = JSON.stringify(Array.from(this.tripleNodes.entries()));\n const tripleLinksCopy = JSON.stringify(Array.from(this.tripleLinksCopy.entries()));\n\n const linksCopy = _.map(this.links, function(link) {\n return {\n source: link.source.iri,\n isTripleSource: link.source.isTriple,\n target: link.target.iri,\n isTripleTarget: link.target.isTriple,\n predicates: link.predicates,\n };\n });\n\n return {\n nodes: nodesCopy,\n links: linksCopy,\n tripleNodes: triplesCopy,\n tripleLinksCopy: tripleLinksCopy,\n colorIndex: colorIndex,\n type2color: type2color,\n transform: transformValues,\n };\n };\n\n this.restoreState = function(state) {\n $scope.nodeSelected = true;\n $scope.searchVisible = false;\n\n this.nodes = _.cloneDeep(state.nodes);\n // check if triples exists is needed for old configs\n this.tripleNodes = state.tripleNodes ? new Map(JSON.parse(state.tripleNodes)) : new Map();\n this.links = [];\n this.addAndMatchLinks(state.links);\n this.tripleLinksCopy = state.tripleLinksCopy ? new Map(JSON.parse(state.tripleLinksCopy)) : new Map();\n\n _.each(this.nodes, function(d) {\n if (d.fixed) {\n $scope.numberOfPinnedNodes++;\n }\n });\n\n if (angular.isDefined(state.colorIndex) && angular.isDefined(state.type2color)) {\n colorIndex = state.colorIndex;\n type2color = _.cloneDeep(state.type2color);\n }\n\n if (angular.isDefined(state.transform)) {\n transformValues = d3.zoomIdentity.translate(state.transform.x, state.transform.y).scale(state.transform.k);\n }\n\n draw();\n };\n }\n\n let graph = new Graph();\n\n function expandPrefix(str, namespaces) {\n const ABS_URI_REGEX = /^<?(http|urn).*>?/;\n if (!ABS_URI_REGEX.test(str)) {\n const uriParts = str.split(':');\n const uriPart = uriParts[0];\n const localName = uriParts[1];\n if (!angular.isUndefined(localName)) {\n const expandedUri = ClassInstanceDetailsService.getNamespaceUriForPrefix(namespaces, uriPart);\n if (expandedUri) {\n return expandedUri + localName;\n }\n }\n }\n return str;\n }\n\n $scope.addedTag = function(tag) {\n if (tag.text.indexOf(':') < 0) {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri'));\n return null;\n }\n tag.text = expandPrefix(tag.text, $scope.namespaces);\n $scope.pageslideExpanded = true;\n return tag;\n };\n\n $scope.validateTag = function(tag, category, wildcardOK) {\n if (tag.text.indexOf(':') < 0) {\n if (wildcardOK) {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri.option'), category);\n } else {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri'), category);\n }\n return false;\n }\n const wildcardPos = tag.text.indexOf('*');\n if (wildcardPos >= 0) {\n if (!wildcardOK) {\n toastr.warning($translate.instant('graphexplore.wildcards.not.allowed'), category);\n return false;\n } else if (wildcardPos < tag.text.length - 1) {\n toastr.warning($translate.instant('graphexplore.wildcards.last.char'), category);\n return false;\n }\n }\n return true;\n };\n\n $scope.getTagClass = function(tagText) {\n if (tagText.endsWith('*')) {\n return 'tag-item-wildcard';\n }\n return null;\n };\n\n $scope.getActiveRepository = function() {\n return $repositories.getActiveRepository();\n };\n\n $scope.isLicenseValid = function() {\n return service(LicenseContextService).getLicenseSnapshot().valid;\n };\n\n // This method may be called twice - once by us explicitly and once by the repositoryInit event.\n // In some race conditions getActiveRepository() will be already set when we enter it the first\n // time but then we'll be called again by the event, so we need the above flag to avoid double\n // initialization and weirdness.\n function initForRepository(newRepo) {\n if (!$repositories.getActiveRepository() || $scope.hasInitedRepository && !newRepo) {\n return;\n }\n\n $scope.hasInitedRepository = true;\n\n if (!newRepo) {\n // Process params only if this isn't a repo that was just selected from the dropdown menu\n $scope.getGraphConfigs(loadGraphFromQueryParam);\n }\n }\n\n const multiClickDelay = 500; // max delay between clicks for multiple click events\n\n const nodeLabelRectScaleX = 1.75;\n\n const color1 = d3.scaleLinear()\n .domain([0, 9])\n .range([\"hsl(0, 100%, 75%)\", \"hsl(360, 90%, 82%)\"])\n .interpolate(d3.interpolateHslLong);\n\n const color2 = d3.scaleLinear()\n .domain([0, 9])\n .range([\"hsl(180, 50%, 75%)\", \"hsl(540, 40%, 82%)\"])\n .interpolate(d3.interpolateHslLong);\n\n $scope.getColor = function(type) {\n if (angular.isUndefined(type2color[type])) {\n type2color[type] = colorIndex;\n colorIndex++;\n }\n\n const index = type2color[type];\n if (index > 39) {\n return \"#c2c2c2\";\n } else if (index % 2 === 0) {\n return color1(index / 2);\n } else {\n return color2(index / 2);\n }\n };\n\n const forceX = d3.forceX(width / 2).strength(0.005);\n const forceY = d3.forceY(height / 2).strength(0.005);\n\n const force = d3.forceSimulation()\n .force('x', forceX)\n .force('y', forceY);\n\n const svg = d3.select(\".main-container .graph-visualization\").append(\"svg\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\");\n\n let showNodeTipAndIconsTimer = 0;\n let removeIconsTimer = 0;\n\n const loader = new Loader();\n\n function draw(resetRootNode) {\n // remove all group elements and rec to rebuild the graph when the user clicks on it\n d3.selectAll(\"svg g\").remove();\n d3.selectAll('.d3-tip').remove();\n d3.selectAll('.menu-events').remove();\n\n\n container = svg.append(\"g\").attr(\"class\", \"nodes-container\")\n .attr(\"transform\", function() {\n if (angular.isDefined(transformValues) && !resetRootNode) {\n return transformValues;\n }\n return '';\n });\n\n const tip = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function() {\n const bbox = tipElement.getBoundingClientRect();\n return {\n top: (bbox.bottom + 10) + 'px',\n left: (bbox.left - 30) + 'px',\n };\n })\n .html(function(d) {\n let html = '';\n\n if (d.fixed) {\n // add pin icon if pinned down\n html += '<i class=\"ri-pushpin-line\"></i> ';\n }\n\n if (d.types.length > 0) {\n html += d.types\n .map((type) => `<div> \\u00B7 ${$scope.replaceIRIWithPrefix(type)}</div>`)\n .join('');\n } else {\n html += `<i>${$translate.instant('visual.node.tooltip.no_types')}</i>`;\n }\n return html;\n });\n\n const numberOfPredLeft = function(d) {\n return d.predicates.length - 10;\n };\n\n // This will create text that will appear in d3tip\n const createTipText = function(d) {\n let html = '';\n html += _.join(_.map(d.predicates, function(p, index) {\n if (index === 0) {\n return getShortPredicate(p);\n // If we have less than or ten predicates should show them with middle dot separated\n } else if (index < 10) {\n return ' \\u00B7 ' + getShortPredicate(p);\n // On eleventh predicate just append how many more predicates left to show to the user\n } else if (index === 10) {\n const numOfPredLeft = numberOfPredLeft(d);\n // Show how many predicates left\n const textToShow = numOfPredLeft > 1 ? numOfPredLeft + ' predicates'\n : numOfPredLeft + ' predicate';\n return ' \\u00B7 ' + $translate.instant('graphexplore.tip.text', {textToShow: textToShow});\n }\n }), '');\n\n return html;\n };\n\n const calculateWidth = function(d) {\n const text = createTipText(d);\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext(\"2d\");\n ctx.font = \"13px Arial\";\n\n if (d.predicates.length < 10) {\n return ctx.measureText(text).width;\n } else {\n return ctx.measureText(text).width / 2;\n }\n };\n\n let tipPredicateElement;\n let tipPredicateTimer;\n\n const tipPredicates = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function(d) {\n const bbox = tipPredicateElement.getBoundingClientRect();\n const textWidth = calculateWidth(d);\n return {\n top: (bbox.top - 30) + 'px',\n left: (bbox.left - 30) + 'px',\n width: textWidth + 'px',\n };\n })\n .html(function(d) {\n return createTipText(d);\n });\n\n let tipTimer;\n // Shows the tooltip for a node but with a slight delay\n const showTipForNode = function(d, event) {\n $timeout.cancel(tipTimer);\n const thisTipElement = tipElement = event.target;\n $timeout(function() {\n if (tipElement === thisTipElement) {\n tip.show(d, tipElement);\n }\n }, 300);\n };\n\n // Hides the tooltip for the node and resets some variables\n const hideTipForNode = function() {\n $timeout.cancel(tipTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n tipElement = null;\n tip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n };\n\n // Updates the text in the tooltip if already visible\n const updateTipForNode = function(d) {\n if (tipElement) {\n tip.show(d, tipElement);\n }\n };\n\n svg.call(tip);\n\n // Shows like tooltip list of predicates but with a slight delay\n const showPredicateToolTip = function(event, d) {\n $timeout.cancel(tipPredicateTimer);\n const thisPredicateTipElement = tipPredicateElement = event.target;\n $timeout(function() {\n if (tipPredicateElement === thisPredicateTipElement && d.predicates.length > 1) {\n tipPredicates.show(d, tipPredicateElement);\n }\n }, 300);\n };\n\n // Hides the tooltip with predicates and resets some variables\n const hidePredicateToolTip = function() {\n $timeout.cancel(tipPredicateTimer);\n tipPredicateElement = null;\n tipPredicates.hide();\n };\n\n svg.call(tipPredicates);\n\n let link = svg.selectAll(\".link\");\n let node = svg.selectAll(\".node\");\n\n const collisionForce = d3.forceCollide((d) => d.size + 5).strength(0.5);\n const chargeForce = d3.forceManyBody().strength(-300);\n const centerForce = d3.forceCenter(width/2, height/2);\n\n force.nodes(graph.nodes)\n .force(\"charge\", chargeForce)\n .force(\"collide\", collisionForce)\n .force(\"center\", centerForce)\n .force(\"link\", d3.forceLink(graph.links).distance(function(l) {\n if (l.source.isTriple || l.target.isTriple) {\n return 0;\n }\n // link distance depends on length of text with an added bonus for strongly connected nodes,\n // i.e. they will be pushed further from each other so that their common nodes can cluster up\n return getPredicateTextLength(l) + 30 * l.connectedness;\n }));\n\n // arrow markers\n container.append(\"defs\").selectAll(\"marker\")\n .data(graph.links)\n .enter().append(\"marker\")\n .attr(\"class\", \"arrow-marker\")\n .attr(\"id\", function(d) {\n return createArrowMarkerUniqueID(d);\n })\n .attr(\"viewBox\", \"0 -5 10 10\")\n .attr(\"refX\", function(d) {\n // The positioning of the arrow for triple target nodes differ from normal ones\n return d.target.isTriple ? 11 : d.target.size + 11;\n })\n .attr(\"refY\", 0)\n .attr(\"markerWidth\", 10)\n .attr(\"markerHeight\", 10)\n .attr(\"orient\", \"auto\")\n .append(\"path\")\n .attr(\"d\", \"M0,-5L10,0L0,5 L10,0 L0, -5\");\n\n // add the links, nodes, predicates and node labels\n link = container.selectAll(\".link\")\n .data(graph.links)\n .enter().append(\"g\")\n .attr(\"class\", \"link-wrapper\")\n .attr(\"id\", function(d) {\n return removeSpecialChars(convertLinkDataToLinkId(d));\n })\n .append(\"line\")\n .attr(\"class\", \"link\")\n .style(\"stroke-width\", 1)\n .style(\"fill\", \"transparent\")\n .style(\"marker-end\", function(d) {\n const targetArrowId = createArrowMarkerUniqueID(d);\n return `url(#${targetArrowId})`;\n });\n\n const predicate = container.selectAll(\".link-wrapper\")\n .append(\"text\")\n .text(function(d) {\n return getPredicate(d);\n })\n .attr(\"class\", function(d) {\n if (d.predicates.length > 1 || graph.tripleNodes.has(convertLinkDataToLinkId(d))) {\n return \"predicates\";\n }\n return \"predicate\";\n })\n .attr(\"dy\", \"-0.5em\")\n .style(\"text-anchor\", \"middle\")\n .style(\"display\", getSettings()['showLinksText'] ? \"\" : \"none\")\n .on(\"mouseover\", function(event, d) {\n event.stopPropagation();\n showPredicateToolTip(event, d);\n })\n .on('mouseout', hidePredicateToolTip)\n .on(\"click\", function(event, d) {\n event.stopPropagation();\n linkActions(event, d);\n });\n\n // node events and variables\n let touchHoldEventTimer;\n let moveEventCount = 0;\n let singleClickTimer = null;\n let clickTarget = null;\n\n // track single and double click events\n const clickEventHandler = function(event, d) {\n if (event.button && event.button !== 0) {\n return;\n }\n\n const element = event.currentTarget;\n\n if (singleClickTimer && clickTarget === element) {\n $timeout.cancel(singleClickTimer);\n singleClickTimer = null;\n // expand node\n expandEventHandler(d, 0, element.parentNode);\n return;\n }\n\n clickTarget = element;\n\n\n hideTipForNode();\n $scope.showPredicates = false;\n\n if (!GuidesService.isActive()) {\n $timeout.cancel(singleClickTimer);\n // Show node info\n singleClickTimer = $timeout(function() {\n clickedNode(d, element, event);\n singleClickTimer = null;\n }, 40 + multiClickDelay);\n }\n };\n\n // builds upon clickEventHandler and adds additional functionality for touch devices\n const touchStartEventHandler = function(d) {\n // for touch devices we track touch and hold for 1s in order to remove a node\n moveEventCount = 0;\n touchHoldEventTimer = $timeout(function() {\n if (moveEventCount < 5) {\n // remove the node only if not many move events were fired,\n // this avoids conflict with dragging nodes\n hideNode(d);\n }\n touchHoldEventTimer = null;\n }, 1000);\n };\n\n const touchEndEventHandler = function() {\n $timeout.cancel(touchHoldEventTimer);\n touchHoldEventTimer = null;\n };\n\n // tracks the number of move events (checked in the touchend event handler)\n const moveEventHandler = function() {\n moveEventCount++;\n };\n\n const showNodeTipAndIcons = function(event, d) {\n if (!d.isBeingDragged) {\n $timeout.cancel(removeIconsTimer);\n const element = event.currentTarget;\n showNodeTipAndIconsTimer = $timeout(() => {\n if (expandNodeIcons(d, element)) {\n showTipForNode(d, event);\n }\n }, 400);\n }\n };\n\n const expandEventHandler = function(d, i, parentNode) {\n const parent = Array.isArray(parentNode) ? parentNode[i] : parentNode;\n\n const shownLinks = graph.countLinks(d, graph.links);\n if (shownLinks <= getSettings()['linksLimit']) {\n expandNode(d, false, parent);\n } else {\n toastr.info($translate.instant('graphexplore.increase.limit'), $translate.instant('graphexplore.node.at.max'));\n }\n $scope.closeInfoPanel();\n };\n\n // Shows growing or shrinking pin animation\n function showPinAnimation(d, type) {\n let startSize;\n let endSize;\n let startOpacity;\n let endOpacity;\n let animate = true;\n\n if (type === 'down') {\n startSize = d.size * 2;\n endSize = d.size / 3;\n startOpacity = 0.8;\n endOpacity = 0.3;\n } else if (type === 'down-fixed') {\n startSize = d.size * 2;\n endSize = d.size;\n startOpacity = 0.8;\n endOpacity = 0.66;\n } else if (type === 'up') {\n startSize = d.size / 3;\n endSize = d.size * 2;\n startOpacity = 0.3;\n endOpacity = 0.8;\n } else if (type === 'fixed') {\n startSize = d.size;\n startOpacity = 0.66;\n animate = false;\n } else {\n return; // unknown\n }\n\n let pin = container.selectAll('.node-wrapper')\n .filter(function(innerD) {\n return innerD === d;\n })\n .append('text')\n .text('\\ue90f') // pin icon\n .classed('icon-any pinned', true)\n .style('font-size', startSize + 'px')\n .attr('x', function(d) {\n return d.x;\n })\n .attr('y', function(d) {\n return d.y;\n })\n .attr('opacity', startOpacity);\n\n if (type === 'fixed' || type === 'down-fixed') {\n d.pin = pin;\n }\n\n if (animate) {\n pin = pin.transition()\n .duration(1000)\n .style('font-size', function() {\n return endSize + 'px';\n })\n .attr('opacity', endOpacity);\n\n if (type !== 'down-fixed') {\n pin.remove();\n }\n }\n }\n\n function removePin() {\n d3.select('.pinned').remove();\n }\n\n // Unfixes nodes that were dragged previously\n const rightClickHandler = function(event, d) {\n if (event.shiftKey) {\n // Do nothing with the shift key, use to access the context menu\n return;\n }\n\n event.preventDefault();\n\n removeMenuIfVisible();\n $scope.closeInfoPanel();\n\n if (d.fixed) {\n // unpin\n $scope.numberOfPinnedNodes--;\n d.fixed = false;\n d.fx =null;\n d.fy =null;\n showPinAnimation(d, 'up');\n force.alpha(1).restart();\n } else {\n // pin down\n $scope.numberOfPinnedNodes++;\n d.fixed = true;\n showPinAnimation(d, 'down');\n }\n // update pin in tooltip\n updateTipForNode(d);\n };\n\n const drag = d3.drag()\n .subject(function(d) {\n return d;\n })\n .on(\"start\", dragstarted)\n .on(\"drag\", dragged)\n .on(\"end\", dragended);\n\n\n function dragstarted(event, d) {\n if (GuidesService.isActive()) {\n // disable dragging if a guide is active.\n return;\n }\n if (event.sourceEvent.button === 0) {\n d.fixedBeforeDrag = d.fixed;\n d.isBeingDragged = true;\n d.beginDragging = true;\n removeMenuIfVisible();\n d3.select(event.currentTarget).classed(\"dragging\", true);\n force.alphaTarget(0.3).restart();\n }\n }\n\n function dragged(event, d) {\n if (d.isBeingDragged) {\n d.fx = event.x;\n d.fy = event.y;\n if (!d.fixed) {\n $scope.numberOfPinnedNodes++;\n d.fixed = true;\n showPinAnimation(d, 'down-fixed');\n } else if (d.beginDragging) {\n showPinAnimation(d, 'fixed');\n }\n d.pinWasFixed = true;\n d.beginDragging = null;\n }\n }\n\n function dragended(event, d) {\n if (d.isBeingDragged) {\n if (d.pinWasFixed) {\n d.pinWasFixed = null;\n removePin();\n }\n d.isBeingDragged = false;\n d3.select(event.currentTarget).classed(\"dragging\", false);\n }\n force.alphaTarget(0);\n }\n\n node = container.selectAll(\".node\")\n .data(graph.nodes)\n .enter().append(\"g\")\n .attr(\"class\", \"node-wrapper\")\n .attr(\"id\", function(d) {\n return d.iri;\n })\n .append(\"circle\")\n .attr(\"class\", \"node\")\n .attr(\"r\", function(d) {\n return d.size;\n })\n .style(\"fill\", function(d) {\n if (d.types === \"greyColor\") {\n return \"c2c2c2\";\n }\n return $scope.getColor(d.types[0]);\n })\n .on('mouseover', showNodeTipAndIcons)\n .on('mouseout', hideTipForNode)\n .on(\"click\", clickEventHandler)\n .on(\"touchstart\", (event, d) => touchStartEventHandler(d))\n // no need to track move for mouse\n .on(\"touchmove\", moveEventHandler)\n .on(\"touchend\", touchEndEventHandler)\n .on(\"contextmenu\", rightClickHandler)\n // custom event used when user is following a guide\n .on(\"gdb-expand-node\", (event, d) => expandEventHandler(d, 0, event.srcElement.parentNode))\n // custom event used when user is following a guide\n .on(\"gdb-show-node-info\", (event, d) => showNodeInfo(d))\n .call(drag);\n\n const overflow = $scope.saveSettings.truncateNodeLabels ? 'hidden' : 'visible';\n const nodeLabels = container.selectAll(\".node-wrapper\").append(\"foreignObject\")\n .style(\"pointer-events\", \"none\")\n .style(\"overflow\", overflow)\n .attr(\"width\", function(d) {\n return d.size * 2 * nodeLabelRectScaleX;\n });\n // height will be computed by updateNodeLabels\n\n container.insert(\"g\").attr(\"class\", \"menu-events\");\n\n updateNodeLabels(nodeLabels);\n\n force.on(\"tick\", function() {\n // recalculate links attributes\n link.attr(\"x1\", function(d) {\n return getNodeX(d.source);\n }).attr(\"y1\", function(d) {\n return getNodeY(d.source);\n }).attr(\"x2\", function(d) {\n return getNodeX(d.target);\n }).attr(\"y2\", function(d) {\n return getNodeY(d.target);\n });\n\n // recalculate predicates attributes\n predicate.attr(\"x\", function(d) {\n const sourceX = getNodeX(d.source);\n const targetX = getNodeX(d.target);\n return d.x = (sourceX + targetX) * 0.5;\n }).attr(\"y\", function(d) {\n const sourceY = getNodeY(d.source);\n const targetY = getNodeY(d.target);\n return d.y = (sourceY + targetY) * 0.5;\n }).attr(\"transform\", function(d) {\n const angle = findAngleBetweenNodes(d, d.direction);\n return \"rotate(\" + angle + \", \" + d.x + \", \" + d.y + \")\";\n });\n\n // recalculate nodes attributes\n node.attr(\"cx\", function(d) {\n return d.x;\n }).attr(\"cy\", function(d) {\n return d.y;\n });\n\n // update node loader position\n container.select(\".node-loader\").attr(\"x\", function(d) {\n return d.x - d.size + 3; //square svg is not perfectly centered and need +3 units on x ordinate to fit in circle\n }).attr(\"y\", function(d) {\n return d.y - d.size;\n });\n\n container.select(\".loader-container\").attr(\"cx\", function(d) {\n return d.x;\n }).attr(\"cy\", function(d) {\n return d.y;\n });\n\n nodeLabels.attr(\"x\", function(d) {\n return d.x - (d.size * nodeLabelRectScaleX);\n }).attr(\"y\", function(d) {\n // the height of the nodeLabel box is `heightMultiplier` times the fontSize computed by updateNodeLabels\n // and we want to offset it so that its middle matches the centre of the circle, hence divided by 2\n return d.y - heightMultiplier * d.fontSize / 2;\n });\n\n // Update position of shrinking pin animation (if any)\n d3.select('.pinned').attr(\"x\", function(d) {\n return d.x;\n }).attr(\"y\", function(d) {\n return d.y;\n });\n\n updateAlphaInScope();\n });\n\n if (angular.isDefined(loader)) {\n loader.setLoadingState(false);\n }\n\n if ($scope.loading) {\n $scope.loading = false;\n }\n\n d3.selectAll('.link-wrapper').each(function() {\n // eslint-disable-next-line no-invalid-this\n const source = $(this).attr(\"id\").split(\">\")[0];\n // eslint-disable-next-line no-invalid-this\n const target = $(this).attr(\"id\").split(\">\")[1];\n d3.selectAll('.link').each(function(link) {\n const sourceId = removeSpecialChars(link.source.iri);\n const targetId = removeSpecialChars(link.target.iri);\n if (sourceId === target && targetId === source) {\n let twoWayLinkID = sourceId;\n twoWayLinkID += \">\";\n twoWayLinkID += targetId;\n const textNode = document.createTextNode(' \\u27F6');\n document.getElementById(twoWayLinkID).lastChild.appendChild(textNode);\n link.direction = \"double\";\n }\n });\n });\n\n d3.selectAll('.d3-actions-tip').remove();\n\n force.alpha(0.3).restart();\n }\n\n function updateAlphaInScope() {\n // other code can use the value of d3alpha to determine when the force layout has settled\n $rootScope.d3alpha = force.alpha();\n }\n\n // find angle between pair of nodes so we can position predicates\n function findAngleBetweenNodes(linkedNodes, direction) {\n const p1 = {\n x: getNodeX(linkedNodes.source),\n y: getNodeY(linkedNodes.source),\n };\n\n const p2 = {\n x: getNodeX(linkedNodes.target),\n y: getNodeY(linkedNodes.target),\n };\n if (direction) {\n return Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;\n } else {\n const angleDeg = Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;\n if (angleDeg <= 90 && angleDeg >= -90) {\n return angleDeg;\n }\n return (angleDeg > 0 ? -1 : 1) * (180 - Math.abs(angleDeg));\n }\n }\n\n const menuEvents = new MenuEvents();\n\n // expanding and collapsing of the nodes\n function clickedNode(d, element, event) {\n $scope.showInfoPanel = false;\n $scope.showPredicates = false;\n $scope.showNodeInfo = false;\n\n // shift + ctrl/cmd + click focuses node\n if (event.shiftKey && (event.ctrlKey || event.metaKey)) {\n $rootScope.$broadcast(\"onRootNodeChange\", d.iri);\n return false;\n }\n\n // ctrl/cmd + click hides the node\n if (event.ctrlKey || event.metaKey) {\n hideNode(d);\n return false;\n }\n\n // If value of openedNodeInfoPanel is different than \"undefined\"\n // we evaluate if clicked node value is the same and close it\n if (typeof $scope.openedNodeInfoPanel !== \"undefined\" && $scope.openedNodeInfoPanel === d) {\n $scope.pageslideExpanded = false;\n $scope.openedNodeInfoPanel = undefined;\n return false;\n }\n\n showNodeInfo(d);\n return true;\n }\n\n function expandNodeIcons(d, element) {\n if ($scope.showInfoPanel) {\n return false;\n }\n\n if (menuEvents.closeIcon || menuEvents.expandIcon || menuEvents.focusIcon || menuEvents.copyURIIcon) {\n menuEvents.removeIcons();\n }\n\n // If nodes are still rearranging result of force.alpha() is more than 0.02\n // and we don't want to show node's icons on mouse over and stop rearrangement.\n // The chosen value 0.1 is somewhat magic and works well with 0.02 in awaitAlphaDropD3()\n // in the guides code.\n if (force.alpha() < 0.1) {\n menuEvents.initIcons(d, element.parentNode);\n force.stop();\n updateAlphaInScope();\n\n return true;\n }\n\n return false;\n }\n\n function hideNode(d) {\n graph.removeNode(d);\n draw();\n }\n\n function collapseNode(d) {\n d.isExpanded = false;\n graph.removeNodeLeafLinks(d);\n draw();\n }\n\n function initGraph(response) {\n $scope.nodeSelected = true;\n if (response.data.types === null) {\n response.data.types = \"greyColor\";\n }\n graph = new Graph();\n transformValues = INITIAL_CONTAINER_TRANSFORM;\n }\n\n function initGraphFromResponse(response) {\n initGraph(response);\n renderGraphFromResponse(response);\n }\n\n function renderGraphFromResponse(response, d, isStartNode) {\n let linksFound = response.data;\n // filter existing links\n linksFound = _.filter(linksFound, function(newLink) {\n return _.findIndex(graph.links,\n function(existingLink) {\n return newLink.source === existingLink.source.iri && newLink.target === existingLink.target.iri;\n }) === -1;\n });\n const linksCopy = [];\n const tripleLinksIt = graph.tripleLinksCopy.values();\n for (let i = 0; i < graph.tripleLinksCopy.size; i++) {\n const linkCopy = tripleLinksIt.next().value;\n linkCopy.forEach((link) => {\n linksCopy.push(link);\n });\n }\n // filter existing shadow links\n linksFound = _.filter(linksFound, function(newLink) {\n return _.findIndex(linksCopy,\n function(existingLink) {\n return newLink.source === existingLink.source.iri && newLink.target === existingLink.target.iri;\n }) === -1;\n });\n // filter reflexive links until we find a way to render them GDB-1853\n linksFound = _.filter(linksFound, function(newLink) {\n return newLink.source !== newLink.target;\n });\n const nodesFromLinks = distinctBy('iri', _.union(_.flatten(_.map(response.data, function(link) {\n return [\n {iri: link.source, isTriple: link.isTripleSource},\n {iri: link.target, isTriple: link.isTripleTarget},\n ];\n }))));\n const existingNodes = _.map(graph.nodes, function(n) {\n return {\n iri: n.iri,\n isTriple: Boolean(n.isTriple),\n };\n });\n const tripleNodesIt = graph.tripleNodes.values();\n for (let i = 0; i < graph.tripleNodes.size; i++) {\n const nodes = tripleNodesIt.next().value;\n nodes.forEach((node) => {\n existingNodes.push({\n iri: node.iri,\n isTriple: node.isTriple,\n });\n });\n }\n const newNodes = _.reject(nodesFromLinks, function(n) {\n return _.some(existingNodes, n);\n });\n\n if (newNodes.length === 0) {\n // All nodes from links minus 1 gives number of connections\n const connectionsCount = nodesFromLinks.length > 0 ? nodesFromLinks.length - 1 : 0;\n if (isStartNode) {\n toastr.info($translate.instant('graphexplore.error.node.connections', {count: connectionsCount}));\n } else if (linksFound.length === 0) {\n toastr.info($translate.instant('graphexplore.error.node.connections', {count: connectionsCount}));\n }\n\n graph.addAndMatchLinks(linksFound);\n draw();\n } else {\n const promises = [];\n const newNodesData = [];\n\n const settings = getSettings();\n\n _.forEach(newNodes, function(newNode, index) {\n promises.push(GraphDataRestService.getInstanceNode({\n iri: newNode.isTriple ? createTriple(newNode.iri) : newNode.iri,\n config: $scope.configLoaded.id,\n languages: !$scope.shouldShowSettings() ? [] : settings['languages'],\n includeInferred: settings['includeInferred'],\n sameAsState: settings['sameAsState'],\n }).then(function(res) {\n // Save the data for later\n newNodesData[index] = res.data;\n }));\n });\n\n // Waits for all of the collected promises and then:\n // - adds each new node\n // - redraws the graph\n $q.all(promises).then(function() {\n _.forEach(newNodesData, function(newNodeData, index) {\n // Calculate initial positions for the new nodes based on spreading them evenly\n // on a circle around the node we came from.\n const theta = 2 * Math.PI * index / newNodesData.length;\n const x = (d ? d.x : 0) + Math.cos(theta) * height / 3;\n const y = (d ? d.y : 0) + Math.sin(theta) * height / 3;\n if (newNodeData.isTriple) {\n graph.addTriple(newNodeData, x, y);\n } else {\n graph.addNode(newNodeData, x, y);\n }\n });\n\n graph.addAndMatchLinks(linksFound);\n if (d) {\n d.isExpanded = true;\n }\n draw();\n });\n }\n }\n\n function expandNode(d, isStartNode, parentNode) {\n if (loader.getLoadingState()) {\n return;\n }\n loader.init(d, parentNode);\n\n const settings = getSettings();\n const expandIri = d.iri;\n GraphDataRestService.getInstanceNodeLinks({\n iri: expandIri, linksLimit: settings['linksLimit'],\n includeInferred: settings['includeInferred'],\n config: $scope.configLoaded.id,\n preferredTypes: !$scope.shouldShowSettings() ? [] : settings['preferredTypes'],\n rejectedTypes: !$scope.shouldShowSettings() ? [] : settings['rejectedTypes'],\n preferredPredicates: !$scope.shouldShowSettings() ? [] : settings['preferredPredicates'],\n rejectedPredicates: !$scope.shouldShowSettings() ? [] : settings['rejectedPredicates'],\n preferredTypesOnly: !$scope.shouldShowSettings() ? [] : settings['preferredTypesOnly'],\n preferredPredicatesOnly: !$scope.shouldShowSettings() ? [] : settings['preferredPredicatesOnly'],\n languages: !$scope.shouldShowSettings() ? [] : settings['languages'],\n sameAsState: settings['sameAsState'],\n includeSchema: settings['includeSchema'],\n }).then(function(response) {\n renderGraphFromResponse(response, d, isStartNode);\n }, function(response) {\n const msg = getError(response.data);\n toastr.error(msg, $translate.instant('graphexplore.error.exploring.node'));\n $scope.loading = false;\n loader.setLoadingState(false);\n });\n }\n\n function removeMenuIfVisible() {\n if (angular.isDefined(menuEvents) && menuEvents.expandedState) {\n menuEvents.removeIcons();\n }\n }\n\n function MenuEvents() {\n this.closeIcon = undefined;\n this.expandIcon = undefined;\n this.collapseIcon = undefined;\n this.focusIcon = undefined;\n this.copyURIIcon = undefined;\n this.actionsTip = undefined;\n\n this.removeIcons = function() {\n this.closeIcon.remove(\"g\");\n if (this.expandIcon) {\n this.expandIcon.remove(\"g\");\n }\n\n if (this.collapseIcon) {\n this.collapseIcon.remove(\"g\");\n }\n\n this.focusIcon.remove(\"g\");\n this.copyURIIcon.remove(\"g\");\n this.closeIcon = undefined;\n this.expandIcon = undefined;\n this.collapseIcon = undefined;\n this.focusIcon = undefined;\n this.copyURIIcon = undefined;\n\n this.expandedState = false;\n };\n\n this.expandedState = false;\n\n function getPositionAndAngle(angle, d) {\n const x = d.x - 14 + (d.size + 15) * Math.cos(angle * Math.PI / 180 - Math.PI / 2);\n const y = d.y - 14 + (d.size + 15) * Math.sin(angle * Math.PI / 180 - Math.PI / 2);\n return \"translate(\" + x + \",\" + y + \")\";\n }\n\n this.initIcons = function(node, parentNode) {\n // init action tips on hover of the icons\n const actionsTip = d3tip()\n .attr('class', 'd3-tip d3-actions-tip')\n .customPosition(function(d, event) {\n const bbox = event.target.getBoundingClientRect();\n return {\n top: (bbox.top - 20) + 'px',\n left: (bbox.right + 10) + 'px',\n };\n })\n .html(function(name) {\n return name;\n });\n svg.call(actionsTip);\n const angle = 20;\n if (node.isExpanded) {\n this.collapseIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"collapse-icon\")\n .attr(\"name\", \"collapse\")\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n });\n this.collapseIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.collapseIcon.append(\"path\")\n .attr(\"d\", \"M22.67,12a.59.59,0,0,1-.53.65l-6.88.72H15.2a.59.59,0,0,1-.59-.65l.72-6.88A.58.58,0,0,1,16,5.33a.59.59,0,0,1,.53.65L16,11.11,21.3,5.79a.64.64,0,0,1,.91.91L16.89,12,22,11.49A.59.59,0,0,1,22.67,12ZM12.59,14.75l-6.75.85a.59.59,0,0,0-.51.66.58.58,0,0,0,.66.51l4.95-.62-5.2,5.2a.64.64,0,1,0,.91.91l5.2-5.2L11.23,22a.59.59,0,0,0,.51.66h.07a.59.59,0,0,0,.59-.52l.85-6.75a.59.59,0,0,0-.17-.49A.58.58,0,0,0,12.59,14.75Z\")\n .style(\"fill\", \"var(--gw-primary-base)\");\n\n this.collapseIcon.on(\"click\", function() {\n collapseNode(node);\n }).on('mouseover', function(event) {\n actionsTip.show(event.currentTarget.getAttribute(\"name\"), event);\n $timeout.cancel(showNodeTipAndIconsTimer);\n $timeout.cancel(removeIconsTimer);\n }).on('mouseout', function() {\n actionsTip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n });\n } else {\n this.expandIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"expand-icon\")\n .attr(\"name\", \"expand\")\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n });\n this.expandIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.expandIcon.append(\"path\")\n .attr(\"d\", \"M22.37,6.28l-.72,6.88a.59.59,0,0,1-.59.53H21a.59.59,0,0,1-.53-.65L21,7.9l-5.32,5.32a.64.64,0,0,1-.91-.91L20.1,7,15,7.53a.59.59,0,0,1-.12-1.18l6.88-.72a.59.59,0,0,1,.65.65ZM12.89,20.34,7.95,21l5.2-5.2a.64.64,0,0,0-.91-.91L7,20.05l.62-4.95A.59.59,0,0,0,6.48,15l-.85,6.75a.59.59,0,0,0,.59.67h.07L13,21.52a.59.59,0,1,0-.15-1.18Z\")\n .style(\"fill\", \"var(--gw-primary-base)\");\n\n this.expandIcon.on(\"click\", function() {\n expandNode(node, false, parentNode);\n }).on('mouseover', function(event) {\n actionsTip.show(event.currentTarget.getAttribute(\"name\"), event);\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function() {\n actionsTip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n });\n }\n\n this.focusIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"focus-icon\")\n .attr(\"name\", \"focus\")\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n });\n this.focusIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.focusIcon.append(\"path\")\n .attr(\"d\", \"M14.2,23.81a9.8,9.8,0,1,1,6.93-2.87h0A9.74,9.74,0,0,1,14.2,23.81Zm0-18.17a8.37,8.37,0,1,0,5.92,14.29h0A8.37,8.37,0,0,0,14.2,5.64Zm1.42,6.95a2,2,0,1,0,0,2.85A2,2,0,0,0,15.62,12.59Z\")\n .style(\"fill\", \"var(--gw-primary-base)\");\n\n this.focusIcon.on(\"click\", function() {\n $rootScope.$broadcast(\"onRootNodeChange\", node.iri);\n }).on('mouseover', function(event) {\n actionsTip.show(event.currentTarget.getAttribute(\"name\"), event);\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function() {\n actionsTip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.copyURIIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"ri-links-line\")\n .attr(\"name\", \"link\")\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n });\n this.copyURIIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.copyURIIcon.append(\"path\")\n .attr(\"d\", \"M 13.457031 10.164062 C 13.648438 10.164062 13.820312 10.242188 13.941406 10.363281 L 15.492188 11.859375 C 15.984375 12.332031 16.292969 12.992188 16.292969 13.714844 C 16.292969 14.441406 15.984375 15.097656 15.492188 15.574219 L 10.394531 20.496094 C 9.902344 20.972656 9.222656 21.265625 8.472656 21.265625 C 7.71875 21.265625 7.039062 20.972656 6.546875 20.496094 L 4.996094 19 C 4.507812 18.523438 4.203125 17.867188 4.203125 17.144531 C 4.203125 16.421875 4.507812 15.765625 4.996094 15.289062 L 7.542969 12.824219 C 7.667969 12.707031 7.84375 12.628906 8.035156 12.628906 C 8.417969 12.628906 8.726562 12.929688 8.726562 13.300781 C 8.726562 13.484375 8.648438 13.652344 8.523438 13.773438 L 5.976562 16.234375 C 5.738281 16.46875 5.589844 16.792969 5.589844 17.148438 C 5.589844 17.503906 5.738281 17.824219 5.976562 18.058594 L 7.527344 19.566406 C 7.773438 19.792969 8.105469 19.929688 8.472656 19.929688 C 8.835938 19.929688 9.167969 19.792969 9.414062 19.566406 L 14.511719 14.644531 C 14.753906 14.410156 14.90625 14.089844 14.90625 13.730469 C 14.90625 13.375 14.753906 13.054688 14.511719 12.820312 L 12.964844 11.324219 C 12.839844 11.203125 12.761719 11.039062 12.761719 10.855469 C 12.761719 10.488281 13.070312 10.1875 13.449219 10.1875 Z M 17.082031 3.976562 C 17.082031 3.976562 17.085938 3.976562 17.085938 3.976562 C 17.824219 3.976562 18.492188 4.261719 18.980469 4.722656 L 20.535156 6.203125 C 21.042969 6.679688 21.355469 7.34375 21.355469 8.082031 C 21.355469 8.792969 21.058594 9.441406 20.582031 9.914062 L 18.0625 12.402344 C 17.9375 12.527344 17.761719 12.605469 17.566406 12.605469 C 17.183594 12.605469 16.875 12.304688 16.875 11.9375 C 16.875 11.753906 16.949219 11.589844 17.070312 11.46875 L 19.605469 8.984375 C 19.847656 8.75 19.996094 8.429688 19.996094 8.070312 C 19.996094 7.714844 19.847656 7.394531 19.605469 7.160156 L 18.019531 5.667969 C 17.773438 5.445312 17.4375 5.304688 17.070312 5.300781 C 16.703125 5.304688 16.367188 5.453125 16.128906 5.691406 L 11.085938 10.667969 C 10.84375 10.898438 10.695312 11.222656 10.695312 11.578125 C 10.695312 11.933594 10.84375 12.257812 11.085938 12.488281 L 12.675781 13.980469 C 12.804688 14.101562 12.882812 14.273438 12.882812 14.457031 C 12.882812 14.828125 12.574219 15.128906 12.191406 15.128906 C 12.003906 15.128906 11.832031 15.054688 11.707031 14.9375 L 10.140625 13.457031 C 9.636719 12.980469 9.324219 12.316406 9.324219 11.582031 C 9.324219 10.863281 9.621094 10.214844 10.101562 9.742188 L 15.140625 4.765625 C 15.625 4.285156 16.304688 3.980469 17.054688 3.976562 Z M 17.082031 3.976562\")\n .style(\"fill\", \"var(--gw-primary-base)\");\n\n this.copyURIIcon.on(\"click\", function() {\n $scope.copyToClipboard(node.iri);\n removeMenuIfVisible();\n actionsTip.hide();\n }).on('mouseover', function(event) {\n actionsTip.show(\"<div style='text-align: center;'><b>Copy to ClipBoard</b><br>\" + node.iri + \"</div>\", event);\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function() {\n actionsTip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.closeIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"close-icon\")\n .attr(\"name\", \"remove\")\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n });\n this.closeIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.closeIcon.append(\"path\")\n .attr(\"d\", \"M14.94,14l5.87-5.87a.66.66,0,1,0-.94-.94L14,13.06,8.13,7.19a.66.66,0,0,0-.94.94L13.06,14,7.19,19.87a.66.66,0,1,0,.94.94L14,14.94l5.87,5.87a.66.66,0,1,0,.94-.94Z\")\n .style(\"fill\", \"var(--gw-primary-base)\");\n\n this.closeIcon.on(\"click\", function() {\n hideNode(node);\n }).on('mouseover', function(event) {\n actionsTip.show(event.currentTarget.getAttribute(\"name\"), event);\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function() {\n actionsTip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.animateMenu(node);\n };\n\n this.animateMenu = function(node) {\n const animationDuration = 100;\n const easeEffect = d3.easeSin;\n let delay = 0;\n const dellayAddition = 35;\n let angle = 20; // angle of the first icon 0 is at 12 o'clock\n\n if (this.expandIcon) {\n this.expandIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n }\n\n if (this.collapseIcon) {\n this.collapseIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n }\n\n this.copyURIIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function() {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n this.focusIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function() {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n\n this.closeIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function() {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n this.expandedState = true;\n };\n }\n\n function Loader() {\n this.state = false;\n\n this.setLoadingState = function(state) {\n this.state = state;\n };\n\n this.getLoadingState = function() {\n return this.state;\n };\n\n this.init = function(node, parentNode) {\n d3.select(parentNode).append(\"circle\")\n .attr(\"cx\", function() {\n return node.x;\n })\n .attr(\"cy\", function() {\n return node.y;\n })\n .attr(\"class\", \"loader-container\")\n .attr(\"r\", function() {\n return node.size;\n })\n .style(\"fill\", \"fff\")\n .style(\"opacity\", \"0.7\");\n\n d3.select(parentNode).append(\"image\")\n .attr(\"xlink:href\", \"js/angular/templates/loader/ot-loader.svg?v=3.3.2-TR1\")\n .attr(\"x\", function() {\n return node.x - node.size + 5;\n })\n .attr(\"y\", function() {\n return node.y - node.size;\n })\n .attr(\"width\", function() {\n return node.size * 2;\n })\n .attr(\"height\", function() {\n return node.size * 2;\n })\n .attr(\"class\", \"node-loader\");\n };\n }\n\n function showNodeInfo(d) {\n force.stop();\n // Assign value of node, which info panel has been opened\n $scope.openedNodeInfoPanel = d;\n $scope.showNodeInfo = true;\n $scope.showFilter = false;\n $scope.showPredicates = false;\n $scope.nodeLabels = d.labels;\n $scope.nodeTypes = d.types;\n $scope.rdfRank = d.rdfRank;\n $scope.nodeIri = d.iri;\n $scope.resourceType = d.isTriple ? 'triple' : 'uri';\n $scope.encodedIri = d.isTriple ? encodeURIComponent(createTriple(d.iri)) : encodeURIComponent(d.iri);\n $scope.showInfoPanel = true;\n\n $scope.rdfsLabel = d.labels[0].label;\n $scope.rdfsComment = d.comment;\n $scope.expanded = false;\n\n $scope.propertiesQueryObj.query = '';\n $scope.dataNodeKeysQuery = '';\n const settings = getSettings();\n GraphDataRestService.getProperties({\n iri: d.isTriple ? createTriple(d.iri) : d.iri,\n config: $scope.configLoaded.id,\n languages: !$scope.shouldShowSettings() ? [] : settings['languages'],\n includeInferred: settings['includeInferred'],\n sameAsState: settings['sameAsState'],\n rejectedPredicates: !$scope.shouldShowSettings() ? [] : settings['rejectedPredicates'],\n }).then(function(response) {\n $scope.data = _.mapKeys(response.data, function(value, key) {\n return $scope.replaceIRIWithPrefix(key);\n });\n $scope.propertiesObj.items = [];\n\n _.forEach($scope.data, function(value, key) {\n $scope.propertiesObj.items.push({key: key, value: value});\n });\n $scope.nodeImage = undefined;\n\n $scope.propertiesNotFiltered = $scope.propertiesObj.items;\n\n const imageVal = _.find($scope.propertiesObj.items, function(o) {\n return o.key === 'image';\n });\n if (imageVal) {\n $scope.nodeImage = imageVal['value'][0].v;\n }\n $scope.propertiesObj.items = _.reject($scope.propertiesObj.items, function(o) {\n return o.key === 'image';\n });\n $scope.propertiesNotFiltered = $scope.propertiesObj.items;\n }, function(response) {\n toastr.warning(getError(response.data), \"Error\");\n });\n }\n\n $scope.toggleSidePanel = function() {\n $scope.pageslideExpanded = !$scope.pageslideExpanded;\n };\n\n $scope.closeInfoPanel = function() {\n $scope.pageslideExpanded = false;\n $scope.openedNodeInfoPanel = undefined;\n $scope.predicates = [];\n openedLink = null;\n // o, angular, o, miracle\n $timeout(function() {\n $scope.showInfoPanel = false;\n });\n };\n\n function applyElementsStyleChanges(tripleNode) {\n updatePredicatesColor('predicate', 'var(--gw-primary-dark)', tripleNode);\n updatePredicatesColor('predicates', 'var(--gw-primary-dark)', tripleNode);\n\n const links = document.getElementsByClassName('link');\n if (links) {\n _.each(links, function(link) {\n const linkLink = link.__data__;\n if (linkLink.source.iri.indexOf(tripleNode.iri) >= 0 || linkLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n link.style.stroke = 'var(--gw-primary-dark)';\n link.style.strokeWidth = 4;\n }\n });\n }\n\n const markers = document.getElementsByClassName('arrow-marker');\n if (markers) {\n _.each(markers, function(marker) {\n const markerLink = marker.__data__;\n if (markerLink.source.iri.indexOf(tripleNode.iri) >= 0 || markerLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n marker.style.stroke = 'var(--gw-primary-dark)';\n if (!marker.__data__.target.isTriple) {\n marker.setAttribute(\"refX\", \"23\");\n }\n }\n });\n }\n }\n\n $scope.clickLink = function(predData) {\n if (graph.tripleNodes.has(predData.linkId)) {\n revertElementsStyleToDefault();\n const tripleNode = graph.tripleNodes.get(predData.linkId)[predData.nodeIndex];\n // Shows selected triple and its properties\n showNodeInfo(tripleNode);\n $scope.showPredicates = true;\n\n const clickedEl = document.getElementById(predData.linkId + predData.nodeIndex);\n if (clickedEl) {\n clickedEl.style.fontWeight = \"bold\";\n }\n\n const nodeCopy = {};\n const tripleLinksIt = graph.tripleLinksCopy.values();\n for (let i = 0; i < graph.tripleLinksCopy.size; i++) {\n const links = tripleLinksIt.next().value;\n if (links.length > 1) {\n links.every((link) => {\n if (link.source.iri === tripleNode.iri) {\n nodeCopy.iri = links[0].source.iri;\n if (link.target.isTriple) {\n nodeCopy.oppLinkIRI = convertTripleToLinkId(link.target.iri);\n nodeCopy.oppTriplePred = getShortPredicate(link.target.iri.split(' ')[1]);\n }\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n if (link.predicates.length === 1) {\n nodeCopy.linkPred = link.predicates[0];\n }\n return false;\n }\n if (link.target.iri === tripleNode.iri) {\n nodeCopy.iri = links[0].target.iri;\n if (link.source.isTriple) {\n nodeCopy.oppLinkIRI = convertTripleToLinkId(link.source.iri);\n nodeCopy.oppTriplePred = getShortPredicate(link.source.iri.split(' ')[1]);\n }\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n if (link.predicates.length === 1) {\n nodeCopy.linkPred = link.predicates[0];\n }\n return false;\n }\n return true;\n });\n }\n }\n\n if (!nodeCopy.iri) {\n nodeCopy.iri = tripleNode.iri;\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n }\n\n applyElementsStyleChanges(nodeCopy);\n }\n };\n\n function updatePredicatesColor(className, color, tripleNode) {\n const preds = document.getElementsByClassName(className);\n\n if (preds) {\n _.each(preds, function(pred) {\n const predLink = pred.__data__;\n if (tripleNode) {\n if (predLink.source.iri.indexOf(tripleNode.iri) >= 0 || predLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n pred.style.fill = color;\n }\n if (convertTripleToLinkId(tripleNode.iri) === convertLinkDataToLinkId(predLink)) {\n pred.textContent = tripleNode.pred;\n pred.style.fill = color;\n }\n if (tripleNode.oppLinkIRI && tripleNode.oppLinkIRI === convertLinkDataToLinkId(predLink)) {\n pred.textContent = tripleNode.oppTriplePred;\n pred.style.fill = color;\n }\n } else {\n pred.style.fill = color;\n pred.textContent = getPredicate(predLink);\n }\n });\n }\n }\n\n function revertElementsStyleToDefault() {\n _.each($scope.predicates, function(pred) {\n const currEl = document.getElementById(pred.linkId + pred.nodeIndex);\n if (currEl) {\n currEl.style.fontWeight = \"normal\";\n }\n });\n const links = document.getElementsByClassName('link');\n if (links) {\n _.each(links, function(link) {\n link.style.stroke = '#999';\n link.style.strokeWidth = 1;\n });\n }\n updatePredicatesColor('predicate', '');\n updatePredicatesColor('predicates', '');\n\n const markers = document.getElementsByClassName('arrow-marker');\n\n if (markers) {\n _.each(markers, function(marker) {\n marker.style.stroke = '#999';\n // RefX for triple targets isn't changed because they are not affected by increasing of stroke-width\n if (!marker.__data__.target.isTriple) {\n marker.setAttribute(\"refX\", \"59\");\n }\n });\n }\n }\n\n function linkActions(event, d) {\n revertElementsStyleToDefault();\n const linkId = convertLinkDataToLinkId(d);\n if (d.predicates.length === 1 && graph.tripleNodes.has(linkId)) {\n openedLink = null;\n const tripleNode = graph.tripleNodes.get(linkId)[0];\n // If there is a triple in this link, show its properties\n if (clickedNode(tripleNode, event.currentTarget, event.button)) {\n const nodeCopy = {};\n nodeCopy.iri = tripleNode.iri;\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n applyElementsStyleChanges(nodeCopy);\n }\n return;\n }\n openPredicates(d);\n }\n\n function openPredicates(d) {\n $scope.showNodeInfo = false;\n // open predicates sidebar if they are more than one\n $scope.showPredicates = d.predicates.length > 1;\n $scope.showFilter = false;\n $scope.showInfoPanel = false;\n\n if (openedLink === d) {\n $scope.showNodeInfo = false;\n $scope.showInfoPanel = false;\n openedLink = null;\n return;\n }\n\n openedLink = d;\n\n if ($scope.showPredicates) {\n $scope.predicates = _.map(d.predicates, function(p) {\n const foundNodeIndex = getTripleNodeIndex(p, d);\n const isPartOfTriple = foundNodeIndex > -1;\n return {\n value: getShortPredicate(p),\n partOfTriple: isPartOfTriple,\n linkId: isPartOfTriple ? convertLinkDataToLinkId(d) : '',\n nodeIndex: foundNodeIndex,\n };\n });\n $scope.showInfoPanel = true;\n }\n }\n\n function getTripleNode(triple) {\n const linkId = convertTripleToLinkId(triple);\n if (graph.tripleNodes.has(linkId)) {\n return graph.tripleNodes.get(linkId).find((el) => el.iri === triple);\n }\n }\n\n function getTripleNodeIndex(pred, d) {\n const linkId = convertLinkDataToLinkId(d);\n if (graph.tripleNodes.has(linkId)) {\n return graph.tripleNodes.get(linkId).findIndex((el) => el.iri.indexOf(pred) >= 0);\n } else {\n return -1;\n }\n }\n\n // get each predicate and check if there are more than one for same source and target\n function getPredicate(d) {\n if (d.predicates.length > 1) {\n return d.predicates.length + \" predicates\";\n }\n return getShortPredicate(d.predicates[0]);\n }\n\n function getShortPredicate(p) {\n const shortIRI = $scope.replaceIRIWithPrefix(p);\n if (shortIRI.length === p.length) {\n return p.split('/')[p.split('/').length - 1];\n } else {\n return shortIRI;\n }\n }\n\n // calculate predicate text length so we can have dynamic link lengths\n function getPredicateTextLength(link) {\n const span = $('<span></span>');\n const splitedLink = link.predicates[0].split('/');\n const predicateText = splitedLink[splitedLink.length - 1];\n span.addClass('predicate-text').text(predicateText);\n $('body').append(span);\n const textLength = span.width() + link.source.size * 2 + link.target.size * 2 + 50;\n span.remove();\n return textLength * 0.75;\n }\n\n $scope.splitPredicate = function(predicate) {\n return predicate.split('/')[predicate.split('/').length - 1];\n };\n\n $scope.getActiveRepository = function() {\n return $repositories.getActiveRepository();\n };\n\n $scope.isLoadingLocation = function() {\n return $repositories.isLoadingLocation();\n };\n\n $scope.hasActiveLocation = function() {\n return $repositories.hasActiveLocation();\n };\n\n $scope.rotate = function(isLeft) {\n removeMenuIfVisible();\n\n // compute common rotation math such as the angle, its sine and cosine and the pivot point\n const theta = (isLeft ? 1 : -1) * 10 * Math.PI / 180; // + rotates left, - rotates right\n const cos = Math.cos(theta);\n const sin = Math.sin(theta);\n const pivotX = width / 2; // i.e. centre of viewport\n const pivotY = height / 2;\n\n // rotates each node around the pivot\n d3.selectAll(\".node-wrapper\")\n .each(function(d) {\n d.x = pivotX + (cos * (d.x - pivotX) + sin * (d.y - pivotY));\n d.y = pivotY + (-sin * (d.x - pivotX) + cos * (d.y - pivotY));\n if (d.fixed) {\n // Fixed nodes need their px and py updated too\n d.fx = d.x;\n d.fy = d.y;\n }\n });\n\n force.alpha(1).restart();\n };\n\n $scope.openUri = function(uri, noHistory) {\n if (!noHistory) {\n const searchParams = {};\n if ($scope.configLoaded.id !== $scope.defaultGraphConfig.id) {\n searchParams.config = $scope.configLoaded.id;\n }\n searchParams.uri = uri;\n searchParams[REPOSITORY_ID_PARAM] = repositoryContextService.getSelectedRepository().id;\n pushHistory(searchParams, {uri: uri, config: $scope.configLoaded});\n }\n $scope.$broadcast(\"onRootNodeChange\", uri);\n };\n\n function saveGraphHttp(graph) {\n if ($scope.configLoaded) {\n graph.config = $scope.configLoaded.id;\n }\n SavedGraphsRestService.addNewSavedGraph(graph)\n .success(function(data, status, headers) {\n $scope.lastSavedGraphName = graph.name;\n $scope.lastSavedGraphId = headers()['x-saved-graph-id'];\n $scope.shared = graph.shared;\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph', {name: graph.name}));\n })\n .error(function(data, status) {\n if (status === 422) {\n $scope.saveGraphModal('new', graph, true);\n } else {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.create.graph'));\n }\n });\n }\n\n $scope.saveOrUpdateGraph = function() {\n const data = JSON.stringify(graph.copyState());\n const graphToSave = {\n id: $scope.lastSavedGraphId,\n name: $scope.lastSavedGraphName,\n data: data,\n shared: $scope.shared,\n repositoryId: repositoryContextService.getSelectedRepository().id,\n };\n\n if (graphToSave.id) {\n $scope.saveGraphModal('update', graphToSave);\n } else {\n $scope.saveGraphModal('new', graphToSave);\n }\n };\n\n $scope.renameSavedGraph = function(graphToRename) {\n // By not sending the 'data' part of a graph we only change the name\n $scope.saveGraphModal('rename', {\n id: graphToRename.id,\n name: graphToRename.name,\n config: graphToRename.config,\n shared: graphToRename.shared,\n });\n };\n\n const editSavedGraphHttp = function(savedGraph) {\n SavedGraphsRestService.editSavedGraph(savedGraph)\n .success(function() {\n $scope.lastSavedGraphName = savedGraph.name;\n $scope.shared = savedGraph.shared;\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph.was.edited', {name: savedGraph.name}));\n })\n .error(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.edit'));\n });\n };\n\n $scope.saveGraphModal = function(mode, graphToSave, graphExists) {\n const modalInstance = $uibModal.open({\n templateUrl: 'js/angular/graphexplore/templates/modal/save-graph.html',\n controller: 'SaveGraphModalCtrl',\n resolve: {\n data: function() {\n return {\n mode: mode,\n graph: graphToSave,\n graphExists: graphExists,\n shared: graphToSave.shared,\n };\n },\n },\n });\n openModalCount++;\n modalIsOpen = true;\n\n modalInstance.result.then(function(data) {\n if (data.restart) {\n $scope.saveGraphModal(data.mode, data.graph, false);\n return;\n }\n switch (data.mode) {\n case 'new':\n saveGraphHttp(data.graph);\n break;\n case 'update':\n editSavedGraphHttp(data.graph);\n break;\n case 'rename':\n editSavedGraphHttp(data.graph);\n break;\n }\n }).finally(() => {\n openModalCount--;\n // Ensure that all modals are closed before resetting the flag\n if (openModalCount <= 0) {\n modalIsOpen = false;\n openModalCount = 0;\n }\n });\n };\n\n $scope.refreshSavedGraphs = function() {\n SavedGraphsRestService.getSavedGraphs()\n .success(function(data) {\n $scope.savedGraphs = data;\n })\n .error(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.getting.saved.graphs'));\n });\n };\n\n $scope.loadSavedGraph = function(graphToLoad, noHistory) {\n if (graphToLoad.owner) {\n // Own saved graph\n $scope.lastSavedGraphName = graphToLoad.name;\n $scope.lastSavedGraphId = graphToLoad.id;\n $scope.shared = graphToLoad.shared;\n $scope.configLoaded = $scope.findConfigById(graphToLoad.config);\n } else {\n // Someone else's saved graph\n $scope.lastSavedGraphName = null;\n $scope.lastSavedGraphId = null;\n $scope.shared = graphToLoad.shared;\n }\n\n if (!$scope.configLoaded) {\n // Fallback to default config, either because config is gone or because graph isn't owned\n $scope.configLoaded = $scope.defaultGraphConfig;\n }\n\n // Preserve existing query params and only set/override `saved`\n const currentSearch = $location.search();\n const newSearch = {\n ...currentSearch,\n saved: graphToLoad.id,\n [REPOSITORY_ID_PARAM]: repositoryContextService.getSelectedRepository().id,\n };\n graph.restoreState(JSON.parse(graphToLoad.data));\n if (!noHistory) {\n pushHistory(newSearch, {savedGraph: graphToLoad});\n }\n };\n\n $scope.copyToClipboardSavedGraph = function(savedGraph) {\n const url = new URL(window.location.href);\n url.searchParams.set('saved', savedGraph.id);\n url.searchParams.set(REPOSITORY_ID_PARAM, repositoryContextService.getSelectedRepository().id);\n $scope.copyToClipboard(url.toString());\n };\n\n function deleteSavedGraphHttp(savedGraph) {\n SavedGraphsRestService.deleteSavedGraph(savedGraph)\n .success(function() {\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph.was.deleted', {name: savedGraph.name}));\n })\n .error(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.delete'));\n });\n }\n\n $scope.deleteSavedGraph = function(savedGraph) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('graphexplore.confirm.delete.graph', {graphName: savedGraph.name}),\n warning: true,\n }).result\n .then(function() {\n deleteSavedGraphHttp(savedGraph);\n });\n };\n\n $scope.openIRI = function(link, event) {\n if (event.shiftKey) {\n $scope.$broadcast(\"onRootNodeChange\", link);\n } else {\n window.open(link, '_blank');\n }\n return false;\n };\n\n $scope.togglePinAllNodes = function() {\n removeMenuIfVisible();\n\n const value = angular.isUndefined($scope.numberOfPinnedNodes) || $scope.numberOfPinnedNodes <= 0;\n\n $scope.numberOfPinnedNodes = 0;\n d3.selectAll('.node').each(function(d) {\n d.fixed = value;\n if (value) {\n $scope.numberOfPinnedNodes++;\n d.fx = d.x;\n d.fy = d.y;\n } else {\n d.fx = null;\n d.fy = null;\n }\n });\n\n force.alpha(1).restart();\n };\n\n // event for capturing left and right arrows used for rotation\n $('body').on(\"keydown\", function(event) {\n if (GuidesService.isActive() || event.target.nodeName === 'input' || !$scope.nodeSelected) {\n // don't do anything when the target is an input field or no node is selected or a guide is active.\n return;\n }\n\n if (event.keyCode === 37) {\n // left arrow rotates left\n $scope.rotate(true);\n } else if (event.keyCode === 39) {\n // right arrow rotates right\n $scope.rotate(false);\n }\n });\n\n $scope.getLiteralFromPropValue = function(value) {\n return value.substring(value.indexOf(':') + 1);\n };\n\n let backgroundRectCreated = false;\n\n // initialization logic follows below\n const init = () => {\n // create background rect once\n if (!backgroundRectCreated) {\n // building rectangular so we can bind zoom and drag effects\n svg.append(\"rect\")\n .attr(\"width\", width * 10)\n .attr(\"height\", height * 10)\n .attr(\"x\", -(width * 10 - width) / 2)\n .attr(\"y\", -(height * 10 - height) / 2)\n .style(\"fill\", \"none\")\n .style(\"pointer-events\", \"all\")\n .call(zoomLayout)\n .on(\"click\", function(event) {\n event.stopPropagation();\n removeMenuIfVisible();\n // Clicking outside the graph stops the layout\n force.stop();\n });\n const wheelHandler = (event) => {\n // Safari intercepts wheel events before D3's zoom handler, preventing scroll-based zooming.\n // Suppressing the default behavior on the svg ensures D3 receives and processes the event correctly.\n event.preventDefault();\n };\n svg.node().addEventListener('wheel', wheelHandler, {passive: false});\n subscriptions.push(() => svg.node().removeEventListener('wheel', wheelHandler));\n backgroundRectCreated = true;\n }\n const principal = securityContextService.getAuthenticatedUser();\n initSettings(principal);\n initForRepository();\n };\n init();\n}\n\nSaveGraphModalCtrl.$inject = ['$scope', '$uibModalInstance', 'data', '$translate'];\n\nfunction SaveGraphModalCtrl($scope, $uibModalInstance, data, $translate) {\n $scope.mode = data.mode;\n $scope.graph = _.cloneDeep(data.graph);\n $scope.graphExists = data.graphExists;\n\n switch ($scope.mode) {\n case 'new':\n $scope.title = $translate.instant('graphexplore.create.new.graph');\n $scope.okButtonText = $translate.instant('common.create.btn');\n break;\n case 'update':\n $scope.title = $translate.instant('graphexplore.update');\n $scope.okButtonText = $translate.instant('common.save.btn');\n break;\n case 'rename':\n $scope.title = $translate.instant('graphexplore.rename');\n $scope.okButtonText = $translate.instant('common.save.btn');\n }\n\n $scope.ok = function() {\n if ($scope.form.$valid) {\n $scope.graph.name = normalizeString($scope.graph.name);\n $uibModalInstance.close({graph: $scope.graph, mode: $scope.mode});\n }\n };\n\n $scope.saveNew = function() {\n $scope.graph.name = normalizeString($scope.graph.name) + ' (new)';\n $uibModalInstance.close({graph: $scope.graph, mode: 'new', restart: true});\n };\n\n $scope.cancel = function() {\n $uibModalInstance.dismiss('cancel');\n };\n\n const normalizeString = (text) => {\n return text.replace(/\\s+/g, ' ').trim();\n };\n}\n","define(['d3'],\n function(d3) {\n (function() {\n\n // Node/CommonJS - require D3\n if (typeof (module) !== 'undefined' && typeof (exports) !== 'undefined' && typeof (d3) == 'undefined') {\n d3 = require('d3');\n }\n })();\n\n function attrsFunction(selection, map) {\n return selection.each(function () {\n var x = map.apply(this, arguments), s = select(this);\n for (var name in x) s.attr(name, x[name]);\n });\n }\n\n function attrsObject(selection, map) {\n for (var name in map) selection.attr(name, map[name]);\n return selection;\n }\n\n function selection_attrs(map) {\n return (typeof map === \"function\" ? attrsFunction : attrsObject)(this, map);\n }\n\n d3.selection.prototype.attrs = selection_attrs\n\n d3.selection.prototype.moveToFront = function () {\n return this.each(function () {\n d3.select(this.parentNode.appendChild(this));\n });\n };\n\n d3.selection.prototype.moveToBack = function () {\n return this.each(function () {\n const firstChild = this.parentNode.firstChild;\n if (firstChild) {\n this.parentNode.insertBefore(this, firstChild);\n }\n });\n };\n\n return d3;\n });\n","import {selection, select} from 'd3';\n\nconst d3 = {\n select,\n selection\n}\n\n// d3.tip\n// Copyright (c) 2013 Justin Palmer\n//\n// Tooltips for d3.js SVG visualizations\n\n// Public - contructs a new tooltip\n//\n// Returns a tip\nvar d3tip = function () {\n var direction = d3_tip_direction,\n offset = d3_tip_offset,\n html = d3_tip_html,\n node = initNode(),\n svg = null,\n point = null,\n target = null,\n customPosition = null\n\n function tip(vis) {\n svg = getSVGNode(vis)\n point = svg.createSVGPoint()\n document.body.appendChild(node)\n }\n\n // Public - show the tooltip on the screen\n //\n // Returns a tip\n tip.show = function () {\n var args = Array.prototype.slice.call(arguments)\n if (args[args.length - 1] instanceof SVGElement) target = args.pop()\n\n var content = html.apply(this, args),\n poffset = offset.apply(this, args),\n dir = direction.apply(this, args),\n nodel = getNodeEl(),\n i = directions.length,\n coords,\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft,\n customPos = customPosition.apply(this, args)\n\n nodel.html(content)\n .style('opacity', 1)\n .style('pointer-events', 'all')\n\n while (i--) nodel.classed(directions[i], false)\n const event = args.filter((arg) => arg instanceof Event);\n coords = direction_callbacks.get(dir).apply(this, event)\n\n if (customPos) {\n Object.keys(customPos).forEach(function (key) {\n nodel.style(key, customPos[key]);\n })\n } else {\n nodel.classed(dir, true)\n .style(\"top\", (coords.top + poffset[0]) + scrollTop + 'px')\n .style(\"left\", (coords.left + poffset[1]) + scrollLeft + 'px')\n }\n\n return tip\n }\n\n // Public - hide the tooltip\n //\n // Returns a tip\n tip.hide = function () {\n var nodel = getNodeEl()\n nodel\n .style('opacity', 0)\n .style('pointer-events', 'none')\n\n return tip\n }\n\n // Public: Proxy attr calls to the d3 tip container. Sets or gets attribute value.\n //\n // n - name of the attribute\n // v - value of the attribute\n //\n // Returns tip or attribute value\n tip.attr = function (n, v) {\n if (arguments.length < 2 && typeof n === 'string') {\n return getNodeEl().attr(n)\n } else {\n var args = Array.prototype.slice.call(arguments)\n d3.selection.prototype.attr.apply(getNodeEl(), args)\n }\n\n return tip\n }\n\n // Public: Proxy style calls to the d3 tip container. Sets or gets a style value.\n //\n // n - name of the property\n // v - value of the property\n //\n // Returns tip or style property value\n tip.style = function (n, v) {\n if (arguments.length < 2 && typeof n === 'string') {\n return getNodeEl().style(n)\n } else {\n var args = Array.prototype.slice.call(arguments)\n d3.selection.prototype.style.apply(getNodeEl(), args)\n }\n\n return tip\n }\n\n // Public: Set or get the direction of the tooltip\n //\n // v - One of n(north), s(south), e(east), or w(west), nw(northwest),\n // sw(southwest), ne(northeast) or se(southeast)\n //\n // Returns tip or direction\n tip.direction = function (v) {\n if (!arguments.length) return direction\n direction = v == null ? v : d3_functor(v)\n\n return tip\n }\n\n // Public: Sets or gets the offset of the tip\n //\n // v - Array of [x, y] offset\n //\n // Returns offset or\n tip.offset = function (v) {\n if (!arguments.length) return offset\n offset = v == null ? v : d3_functor(v)\n\n return tip\n }\n\n // Public: sets or gets the html value of the tooltip\n //\n // v - String value of the tip\n //\n // Returns html value or tip\n tip.html = function (v) {\n if (!arguments.length) return html\n html = v == null ? v : d3_functor(v)\n\n return tip\n }\n\n tip.customPosition = function (v) {\n if (!arguments.length) return customPosition\n customPosition = v == null ? v : d3_functor(v)\n\n return tip\n }\n\n // Public: destroys the tooltip and removes it from the DOM\n //\n // Returns a tip\n tip.destroy = function () {\n if (node) {\n getNodeEl().remove();\n node = null;\n }\n return tip;\n }\n\n function d3_tip_direction() {\n return 'n'\n }\n\n function d3_tip_offset() {\n return [0, 0]\n }\n\n function d3_tip_html() {\n return ' '\n }\n\n var direction_callbacks = new Map(Object.entries({\n n: direction_n,\n s: direction_s,\n e: direction_e,\n w: direction_w,\n nw: direction_nw,\n ne: direction_ne,\n sw: direction_sw,\n se: direction_se\n })),\n directions = direction_callbacks.keys()\n\n function direction_n(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.n.y - node.offsetHeight,\n left: bbox.n.x - node.offsetWidth / 2\n }\n }\n\n function direction_s(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.s.y,\n left: bbox.s.x - node.offsetWidth / 2\n }\n }\n\n function direction_e(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.e.y - node.offsetHeight / 2,\n left: bbox.e.x\n }\n }\n\n function direction_w(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.w.y - node.offsetHeight / 2,\n left: bbox.w.x - node.offsetWidth\n }\n }\n\n function direction_nw(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.nw.y - node.offsetHeight,\n left: bbox.nw.x - node.offsetWidth\n }\n }\n\n function direction_ne(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.ne.y - node.offsetHeight,\n left: bbox.ne.x\n }\n }\n\n function direction_sw(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.sw.y,\n left: bbox.sw.x - node.offsetWidth\n }\n }\n\n function direction_se(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.se.y,\n left: bbox.e.x\n }\n }\n\n function initNode() {\n var node = d3.select(document.createElement('div'))\n node.style(\"position\", 'absolute')\n .style(\"top\", 0)\n .style(\"opacity\", 0)\n .style(\"pointer-events\", 'none')\n .style(\"box-sizing\", 'border-box');\n\n return node.node()\n }\n\n function getSVGNode(el) {\n el = el.node()\n if (el.tagName.toLowerCase() === 'svg')\n return el\n\n return el.ownerSVGElement\n }\n\n function getNodeEl() {\n if (node === null) {\n node = initNode();\n // re-add node to DOM\n document.body.appendChild(node);\n }\n ;\n return d3.select(node);\n }\n\n // Private - gets the screen coordinates of a shape\n //\n // Given a shape on the screen, will return an SVGPoint for the directions\n // n(north), s(south), e(east), w(west), ne(northeast), se(southeast), nw(northwest),\n // sw(southwest).\n //\n // +-+-+\n // | |\n // + +\n // | |\n // +-+-+\n //\n // Returns an Object {n, s, e, w, nw, sw, ne, se}\n function getScreenBBox(event) {\n var targetel = target || event.target;\n\n while ('undefined' === typeof targetel.getScreenCTM && 'undefined' === targetel.parentNode) {\n targetel = targetel.parentNode;\n }\n\n var bbox = {},\n matrix = targetel.getScreenCTM(),\n tbbox = targetel.getBBox(),\n width = tbbox.width,\n height = tbbox.height,\n x = tbbox.x,\n y = tbbox.y\n\n point.x = x\n point.y = y\n bbox.nw = point.matrixTransform(matrix)\n point.x += width\n bbox.ne = point.matrixTransform(matrix)\n point.y += height\n bbox.se = point.matrixTransform(matrix)\n point.x -= width\n bbox.sw = point.matrixTransform(matrix)\n point.y -= height / 2\n bbox.w = point.matrixTransform(matrix)\n point.x += width\n bbox.e = point.matrixTransform(matrix)\n point.x -= width / 2\n point.y -= height / 2\n bbox.n = point.matrixTransform(matrix)\n point.y += height\n bbox.s = point.matrixTransform(matrix)\n\n return bbox\n }\n\n function d3_functor(v) {\n return typeof v === \"function\" ? v : function() { return v; };\n }\n\n return tip\n};\nexport default d3tip;\n","import {upperFirst} from \"lodash\";\n\n/**\n * Removes brackets and serial commas from IRIs\n * when used to create ids for links and markers,\n * because elements with ids that contain such\n * are not valid XHTML and cause a host problems\n * when trying to style individual elements\n * @param {string} string The string to be processed.\n * @return {string} A string where the special characters are removed.\n */\nconst removeSpecialChars = (string) => {\n return string.replace(/[()']/g, \"\");\n};\n\nconst toBoolean = (value) => {\n if (typeof value === 'string') {\n return value === 'true';\n }\n return Boolean(value);\n};\n\nconst toTitleCase = (text) => {\n if (!text) {\n return text;\n }\n return upperFirst(text.toLowerCase());\n};\n\nexport {\n removeSpecialChars,\n toBoolean,\n toTitleCase\n};\n\n"],"names":["STATIC_RULESETS","id","name","REPOSITORY_TYPES","graphdbRepo","free","eeWorker","eeMaster","ontop","se","fedx","FILENAME_PATTERN","RegExp","NUMBER_PATTERN","d3","dispatch","pointer","D3","Text","calcFontSizeRaw","text","radius","minimumSize","isMultiline","textSize","substring","length","match","Math","round","calcFontSize","getTextWithElipsisIfNeeded","str","threshold","Transition","fadeIn","sel","duration","style","transition","fadeOut","Click","d3_rebind","target","source","method","value","apply","arguments","delayDblClick","dispatchedEvent","i","n","rebind","selection","down","wait","on","document","body","Date","event","d","e","a","b","sqrt","pow","window","clearTimeout","call","setTimeout","GraphsVisualizationsCtrl","$scope","$rootScope","$repositories","toastr","$timeout","ClassInstanceDetailsService","$q","$location","$jwtAuth","UiScrollService","ModalService","$uibModal","$window","LocalStorageAdapter","LSKeys","SavedGraphsRestService","GraphConfigRestService","GraphDataRestService","$translate","GuidesService","WorkbenchContextService","RDF4JRepositoriesService","securityContextService","service","SecurityContextService","repositoryContextService","RepositoryContextService","languageChanged","propertiesObj","items","propertiesQueryObj","query","propertiesSearchPlaceholder","instant","propertiesNotFiltered","searchVisible","nodeSelected","queryResultsMode","embedded","search","openedNodeInfoPanel","undefined","invalidLimit","INVALID_LINKS_MSG","INVALID_LINKS_TOOLTIP","datasource","adapterContainer","adapter","remain","hasInitedRepository","defaultSettings","linksLimit","includeInferred","sameAsState","truncateNodeLabels","languages","showLinksText","preferredTypes","rejectedTypes","preferredPredicates","rejectedPredicates","preferredTypesOnly","preferredPredicatesOnly","includeSchema","saveSettings","_","cloneDeep","defaultGraphConfig","startMode","key","onopen","onclose","angular","noop","goToHome","resetState","config","searchParams","path","shouldShowSettings","configLoaded","shouldDisableSameAs","sameAsCheckbox","$","settings","prop","propertiesFilterFunc","item","toLowerCase","indexOf","toggleMoreInfo","ev","element","currentTarget","parent","next","toggle","children","toggleClass","copyToClipboard","uri","openCopyToClipboardModal","resetSettings","validateLinksLimit","renderSettings","changeLimit","delta","test","showSettings","showInfoPanel","showFilter","showNodeInfo","showPredicates","updateSettings","error","map","s","t","rootNodeIri","reExpandNode","loadGraphForQuery","sameAs","inference","loadGraphConfig","updatePredicateLabels","set","GRAPHS_VIZ","getGraphConfigs","graphCallback","success","data","graphConfigs","getError","findConfigById","configId","grep","easyGraphSearch","iri","openUri","deleteConfig","openSimpleModal","title","message","configName","warning","result","then","deleteGraphConfig","refreshSavedGraphs","goToGraphConfig","REPOSITORY_ID_PARAM","getSelectedRepository","pushHistory","replaceIRIWithPrefix","namespaces","namespacePrefix","findLast","o","prefix","subscriptions","push","$on","onAutocompleteEnabledUpdated","autocompleteEnabled","isAutocompleteEnabled","onSelectedRepositoryChanged","repository","getNamespaces","repositoryNamespaces","catch","msg","NamespacesListModel","args","payload","newRepo","initForRepository","empty","initGraphFromQueryParam","$watch","rootScopeGenericWatcher","rootScopeGenericChangeHandler","position","each","current","propertiesItemsChangeHandler","isDefined","reload","modalIsOpen","openModalCount","handleKeyDown","stopPropagation","addEventListener","destroyHandler","forEach","subscription","removeEventListener","onpopstate","state","skipOnPopState","lastSavedGraphName","lastSavedGraphId","shared","numberOfPinnedNodes","type2color","colorIndex","getSettings","isActive","languagesMap","v","preferredTypesMap","rejectedTypesMap","preferredPredicatesMap","rejectedPredicatesMap","$broadcast","inputValue","loading","getInstanceNode","response","types","graph","Graph","rootNode","addNode","width","height","transformValues","INITIAL_CONTAINER_TRANSFORM","expandNode","err","saved","getSavedGraph","loadSavedGraph","queryString","sameAsParam","inferredParam","sendSameAs","sendInferred","updateGraph","initGraphFromResponse","convertTripleToLinkId","triple","tripleLike","tripleParts","split","join","convertLinkDataToLinkId","link","getNodeX","node","isTriple","el","getElementById","removeSpecialChars","__data__","x","getNodeY","y","createTriple","trim","createArrowMarkerUniqueID","distinctBy","array","keys","filter","index","startIRI","startGraphQuery","loadGraphForConfig","startQueryIncludeInferred","startQuerySameAs","loadGraphFromQueryParam","loadConfigForId","successCallback","getConfig","savedGraph","noGoHome","nodeLabelMinFontSize","zoomLayout","scaleExtent","container","translate","scale","transform","attr","tipElement","openedLink","this","nodes","links","tripleNodes","Map","tripleLinksCopy","computeConnectedness","counts","seenLinks","i1","i2","seenKey","min","max","connectedness","addAndMatchLinks","newLinks","Array","prototype","isTripleSource","getTripleNode","find","isTripleTarget","matchedLink","predicates","linkId","has","get","matchLinksToNodes","delete","countLinks","findLinksForNode","l","linksTypes","linksForNode","uniq","flatten","linksPredicates","removeTriples","triplesToRemove","targetTriples","size","reject","sourceSplit","lSource","lTarget","targetSplit","isRejected","removeNode","removeNodeLeafLinks","targetLinks","addTriple","weight","copyState","nodesCopy","labels","rdfRank","fixed","triplesCopy","JSON","stringify","from","entries","restoreState","parse","k","draw","count","initLazyList","revision","getActiveRepository","addedTag","tag","uriParts","uriPart","localName","isUndefined","expandedUri","getNamespaceUriForPrefix","expandPrefix","pageslideExpanded","validateTag","category","wildcardOK","wildcardPos","getTagClass","tagText","endsWith","isLicenseValid","LicenseContextService","getLicenseSnapshot","valid","multiClickDelay","nodeLabelRectScaleX","color1","domain","range","interpolate","color2","getColor","type","forceX","strength","forceY","force","svg","append","showNodeTipAndIconsTimer","removeIconsTimer","loader","setLoadingState","getLoadingState","init","parentNode","resetRootNode","remove","tip","d3tip","customPosition","bbox","getBoundingClientRect","top","bottom","left","html","createTipText","p","getShortPredicate","numOfPredLeft","numberOfPredLeft","textToShow","tipPredicateElement","tipPredicateTimer","tipPredicates","textWidth","ctx","createElement","getContext","font","measureText","calculateWidth","tipTimer","hideTipForNode","cancel","hide","removeMenuIfVisible","selectAll","collisionForce","chargeForce","centerForce","distance","span","splitedLink","predicateText","addClass","textLength","getPredicateTextLength","enter","predicate","getPredicate","thisPredicateTipElement","show","showPredicateToolTip","revertElementsStyleToDefault","tripleNode","clickedNode","button","nodeCopy","pred","applyElementsStyleChanges","foundNodeIndex","findIndex","getTripleNodeIndex","isPartOfTriple","partOfTriple","nodeIndex","openPredicates","linkActions","touchHoldEventTimer","moveEventCount","singleClickTimer","clickTarget","expandEventHandler","isArray","info","closeInfoPanel","showPinAnimation","startSize","endSize","startOpacity","endOpacity","animate","pin","innerD","classed","drag","subject","sourceEvent","fixedBeforeDrag","isBeingDragged","beginDragging","alphaTarget","restart","fx","fy","pinWasFixed","menuEvents","closeIcon","expandIcon","focusIcon","copyURIIcon","removeIcons","alpha","initIcons","stop","updateAlphaInScope","expandNodeIcons","thisTipElement","showTipForNode","hideNode","touchStartEventHandler","shiftKey","preventDefault","updateTipForNode","srcElement","overflow","nodeLabels","insert","fontSize","label","HtmlUtil","getText","replaceAll","updateNodeLabels","sourceX","targetX","sourceY","targetY","linkedNodes","direction","p1","p2","atan2","PI","angleDeg","abs","findAngleBetweenNodes","select","sourceId","targetId","twoWayLinkID","textNode","createTextNode","lastChild","appendChild","d3alpha","getPositionAndAngle","angle","cos","sin","collapseIcon","actionsTip","expandedState","right","isExpanded","getAttribute","animateMenu","animationDuration","easeEffect","delay","ease","ctrlKey","metaKey","initGraph","renderGraphFromResponse","isStartNode","linksFound","newLink","existingLink","linksCopy","tripleLinksIt","values","nodesFromLinks","union","existingNodes","Boolean","tripleNodesIt","newNodes","some","connectionsCount","promises","newNodesData","newNode","res","all","newNodeData","theta","expandIri","getInstanceNodeLinks","nodeTypes","nodeIri","resourceType","encodedIri","encodeURIComponent","rdfsLabel","rdfsComment","comment","expanded","dataNodeKeysQuery","getProperties","mapKeys","nodeImage","imageVal","updatePredicatesColor","getElementsByClassName","linkLink","stroke","strokeWidth","markers","marker","markerLink","setAttribute","className","color","preds","predLink","fill","textContent","oppLinkIRI","oppTriplePred","currEl","fontWeight","shortIRI","toggleSidePanel","clickLink","predData","clickedEl","every","linkPred","splitPredicate","isLoadingLocation","hasActiveLocation","rotate","isLeft","pivotX","pivotY","noHistory","saveOrUpdateGraph","graphToSave","repositoryId","saveGraphModal","renameSavedGraph","graphToRename","mode","graphExists","modalInstance","open","templateUrl","controller","resolve","addNewSavedGraph","status","headers","saveGraphHttp","editSavedGraph","finally","getSavedGraphs","savedGraphs","graphToLoad","owner","newSearch","copyToClipboardSavedGraph","url","URL","location","href","toString","deleteSavedGraph","graphName","deleteSavedGraphHttp","openIRI","togglePinAllNodes","nodeName","keyCode","getLiteralFromPropValue","backgroundRectCreated","wheelHandler","passive","principal","settingsFromPrincipal","appSettings","localStorageSettings","unique","initSettings","getAuthenticatedUser","SaveGraphModalCtrl","$uibModalInstance","okButtonText","ok","form","$valid","normalizeString","close","saveNew","dismiss","replace","module","$uibTooltipProvider","options","appendToBody","$inject","define","attrsFunction","attrsObject","require","attrs","moveToFront","moveToBack","firstChild","insertBefore","offset","initNode","point","vis","tagName","ownerSVGElement","createSVGPoint","slice","SVGElement","pop","coords","content","poffset","dir","nodel","getNodeEl","directions","scrollTop","documentElement","scrollLeft","customPos","arg","Event","direction_callbacks","Object","d3_functor","destroy","getScreenBBox","offsetHeight","offsetWidth","w","nw","ne","sw","targetel","getScreenCTM","matrix","tbbox","getBBox","matrixTransform","string","toBoolean","toTitleCase","upperFirst"],"ignoreList":[],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"39518.4d72b74fffba395c6b2a.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/repositories/repository.constants.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/common/d3-utils.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/graphexplore/controllers/graphs-visualizations.controller.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/d3.patch.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/d3-tip/d3-tip-patch.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/utils/string-utils.js"],"sourcesContent":["export const STATIC_RULESETS = [\n {id: 'empty', name: 'No inference'},\n {id: 'rdfs-optimized', name: 'RDFS (Optimized)'},\n {id: 'rdfs', name: 'RDFS'},\n {id: 'rdfsplus-optimized', name: 'RDFS-Plus (Optimized)'},\n {id: 'owl-horst-optimized', name: 'OWL-Horst (Optimized)'},\n {id: 'owl-horst', name: 'OWL-Horst'},\n {id: 'owl2-ql-optimized', name: 'OWL2-QL (Optimized)'},\n {id: 'owl2-ql', name: 'OWL2-QL'},\n {id: 'owl-max-optimized', name: 'OWL-Max (Optimized)'},\n {id: 'owl-max', name: 'OWL-Max'},\n {id: 'owl2-rl-optimized', name: 'OWL2-RL (Optimized)'},\n {id: 'owl2-rl', name: 'OWL2-RL'},\n\n];\n\nexport const REPOSITORY_TYPES = {graphdbRepo: 'graphdb', free: 'free', eeWorker: 'worker', eeMaster: 'master', ontop: 'ontop', se: 'se', fedx: 'fedx'};\nexport const FILENAME_PATTERN = new RegExp('^[a-zA-Z0-9-_]+$');\nexport const NUMBER_PATTERN = new RegExp('^[0-9]+$');\n","import 'lib/d3.patch.js'\nimport {dispatch, pointer} from 'd3';\n\nconst d3 = {\n dispatch,\n pointer\n}\n\nvar D3 = D3 || {};\n\nD3.Text = function () {\n function calcFontSizeRaw(text, radius, minimumSize, isMultiline) {\n minimumSize = minimumSize || 10;\n\n var textSize = radius / 3;\n if (typeof text === \"string\") {\n var len = text.substring(0, radius / 3).length + 1.5;\n textSize *= 10 / len;\n textSize += 1;\n // experimental alternative method:\n // var textSize = 3.3 * radius / text.length;\n\n // Tweak for Indian scripts and CJK ones\n if (text.match(/[\\u0900-\\u0DFF\\u1100-\\u11FF\\u2E80-\\u2EFF\\u3000-\\u9FFF]/)) {\n textSize *= 0.6;\n }\n\n if (textSize < minimumSize) {\n textSize = minimumSize;\n }\n\n /* Disabled for the time being, better without this\n if (isMultiline) {\n var numWords = text.split(/\\s+/).length;\n if (numWords > 1) {\n if (numWords > 4) {\n numWords = 4;\n }\n textSize += textSize * (4 - numWords) * 0.1;\n }\n }\n */\n\n return Math.round(textSize);\n }\n\n if (textSize < minimumSize) {\n textSize = minimumSize;\n }\n\n return Math.round(textSize);\n }\n\n function calcFontSize(text, radius, minimumSize, isMultiline) {\n return calcFontSizeRaw(text, radius, minimumSize, isMultiline) + 'px';\n }\n\n function getTextWithElipsisIfNeeded(str, threshold) {\n if (typeof str === \"string\") {\n if (str.length > threshold) {\n return str.substring(0, threshold - 3) + \"...\";\n }\n }\n return str;\n }\n\n return {\n calcFontSizeRaw: calcFontSizeRaw,\n calcFontSize: calcFontSize,\n getTextWithElipsisIfNeeded: getTextWithElipsisIfNeeded\n };\n}();\n\nD3.Transition = function () {\n function fadeIn(sel, duration) {\n sel.style(\"opacity\", 0.0)\n .transition()\n .duration(duration)\n .style(\"opacity\", 1.0);\n }\n\n function fadeOut(sel, duration) {\n sel.style(\"opacity\", 1.0)\n .transition()\n .duration(duration)\n .style(\"opacity\", 0.0);\n }\n\n return {\n fadeIn: fadeIn,\n fadeOut: fadeOut\n };\n}();\n\nD3.Click = function () {\n function delayDblClick() {\n var dispatchedEvent = d3.dispatch('click', 'dblclick');\n\n function cc(selection) {\n var down,\n tolerance = 5,\n last,\n wait = null;\n\n // euclidean distance\n function dist(a, b) {\n return Math.sqrt(Math.pow(a[0] - b[0], 2), Math.pow(a[1] - b[1], 2));\n }\n\n selection.on('mousedown', function () {\n down = d3.pointer(document.body);\n last = +new Date();\n });\n selection.on('mouseup', function (event, d) {\n if (dist(down, d3.pointer(document.body)) > tolerance) {\n return;\n } else {\n if (wait) {\n window.clearTimeout(wait);\n wait = null;\n dispatchedEvent.call('dblclick', event, event, d);\n } else {\n wait = window.setTimeout((function (e) {\n return function () {\n dispatchedEvent.call('click', e, e, d)\n wait = null;\n };\n })(event), 250);\n }\n }\n });\n }\n\n return rebind(cc, dispatchedEvent, 'on');\n }\n\n // Copies a variable number of methods from source to target.\n const rebind = function (target, source) {\n let i = 1, n = arguments.length, method;\n while (++i < n) {\n method = arguments[i]\n target[method] = d3_rebind(target, source, source[method]);\n }\n return target;\n }\n\n // Method is assumed to be a standard D3 getter-setter:\n // If passed with no arguments, gets the value.\n // If passed with arguments, sets the value and returns the target.\n function d3_rebind(target, source, method) {\n return function () {\n var value = method.apply(source, arguments);\n return value === source ? target : value;\n };\n }\n\n return {\n delayDblClick: delayDblClick\n };\n}();\n\nexport default D3;\n","import 'angular/core/services';\nimport 'angular/core/services/workbench-context.service';\nimport 'angular/core/services/rdf4j-repositories.service';\nimport D3 from 'lib/common/d3-utils.js';\nimport d3tip from 'lib/d3-tip/d3-tip-patch';\nimport * as d3 from 'd3';\nimport 'angular/utils/local-storage-adapter';\nimport {NUMBER_PATTERN} from \"../../repositories/repository.constants\";\nimport {removeSpecialChars} from \"../../utils/string-utils\";\nimport {NamespacesListModel} from \"../../models/namespaces/namespaces-list\";\nimport {HtmlUtil} from \"../../utils/html-util\";\nimport {\n RepositoryContextService,\n SecurityContextService,\n LicenseContextService,\n REPOSITORY_ID_PARAM,\n service,\n} from \"@ontotext/workbench-api\";\n\nconst modules = [\n 'ui.scroll.jqlite',\n 'ui.scroll',\n 'toastr',\n 'ui.bootstrap',\n 'ngTagsInput',\n 'graphdb.framework.utils.localstorageadapter',\n 'graphdb.core.services.workbench-context',\n 'graphdb.framework.core.services.rdf4j.repositories',\n];\n\nangular\n .module('graphdb.framework.graphexplore.controllers.graphviz', modules)\n .controller('GraphsVisualizationsCtrl', GraphsVisualizationsCtrl)\n .controller('SaveGraphModalCtrl', SaveGraphModalCtrl)\n .config(['$uibTooltipProvider', function($uibTooltipProvider) {\n $uibTooltipProvider.options({appendToBody: true});\n }]);\n\nGraphsVisualizationsCtrl.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"$repositories\",\n \"toastr\",\n \"$timeout\",\n \"ClassInstanceDetailsService\",\n \"$q\",\n \"$location\",\n \"$jwtAuth\",\n \"UiScrollService\",\n \"ModalService\",\n \"$uibModal\",\n \"$window\",\n \"LocalStorageAdapter\",\n \"LSKeys\",\n \"SavedGraphsRestService\",\n \"GraphConfigRestService\",\n \"GraphDataRestService\",\n \"$translate\",\n \"GuidesService\",\n \"WorkbenchContextService\",\n 'RDF4JRepositoriesService',\n];\n\nfunction GraphsVisualizationsCtrl(\n $scope,\n $rootScope,\n $repositories,\n toastr,\n $timeout,\n ClassInstanceDetailsService,\n $q,\n $location,\n $jwtAuth,\n UiScrollService,\n ModalService,\n $uibModal,\n $window,\n LocalStorageAdapter,\n LSKeys,\n SavedGraphsRestService,\n GraphConfigRestService,\n GraphDataRestService,\n $translate,\n GuidesService,\n WorkbenchContextService,\n RDF4JRepositoriesService,\n) {\n const securityContextService = service(SecurityContextService);\n const repositoryContextService = service(RepositoryContextService);\n // Multiplier to calculate the height of the labels element based on the font size.\n // Based on this, we display different numbers of rows. Currently, this results in 3 rows of text\n const heightMultiplier = 4.2;\n\n // =========================\n // Public fields\n // =========================\n\n $scope.languageChanged = false;\n $scope.propertiesObj = {};\n $scope.propertiesObj.items = [];\n $scope.propertiesQueryObj = {};\n $scope.propertiesQueryObj.query = '';\n $scope.propertiesSearchPlaceholder = $translate.instant(\"visual.search.instance.placeholder\");\n $scope.propertiesNotFiltered = [];\n $scope.searchVisible = false;\n $scope.nodeSelected = false;\n $scope.queryResultsMode = false;\n $scope.embedded = $location.search().embedded;\n $scope.openedNodeInfoPanel = undefined;\n $scope.invalidLimit = false;\n $scope.INVALID_LINKS_MSG = $translate.instant('sidepanel.invalid.limit.links.msg');\n $scope.INVALID_LINKS_TOOLTIP = $translate.instant('sidepanel.invalid.limit.links.tooltip');\n $scope.datasource = undefined;\n // adapter implementation for ui-scroll directive\n $scope.adapterContainer = {adapter: {remain: true}};\n // Flag to avoid calling repo init logic twice\n $scope.hasInitedRepository = false;\n $scope.defaultSettings = {\n linksLimit: 20,\n includeInferred: true,\n sameAsState: true,\n truncateNodeLabels: true,\n languages: ['en'],\n showLinksText: true,\n preferredTypes: [],\n rejectedTypes: [],\n preferredPredicates: [],\n rejectedPredicates: [\"http://dbpedia.org/property/logo\",\n \"http://dbpedia.org/property/hasPhotoCollection\",\n \"http://dbpedia.org/property/website\",\n \"http://dbpedia.org/property/homepage\",\n \"http://dbpedia.org/ontology/thumbnail\",\n \"http://xmlns.com/foaf/0.1/depiction\",\n \"http://xmlns.com/foaf/0.1/homepage\",\n \"http://xmlns.com/foaf/0.1/mbox\",\n \"http://dbpedia.org/ontology/wikiPage*\",\n \"http://dbpedia.org/property/wikiPage*\",\n \"http://factforge.net/*\"],\n preferredTypesOnly: false,\n preferredPredicatesOnly: false,\n includeSchema: true,\n };\n // Static defaults before we do the actual dynamic default settings in initSettings\n $scope.saveSettings = _.cloneDeep($scope.defaultSettings);\n $scope.defaultGraphConfig = {\n id: 'default',\n name: 'Easy graph',\n startMode: 'search',\n };\n\n // TODO: check if this can be moved in the local scope and not in the global one\n $rootScope.key = \"\";\n\n\n // =========================\n // Public functions\n // =========================\n\n // Handle pageslide directive callbacks which incidentally appeared to be present in the angular's\n // scope, so we need to define our's and pass them to pageslide, otherwise it throws an error.\n $scope.onopen = $scope.onclose = () => angular.noop();\n\n $scope.goToHome = () => {\n resetState();\n // When closing the visualization screen, remove the config parameter from the URL. Leave other search params intact.\n // eslint-disable-next-line no-unused-vars\n const {config, ...searchParams} = $location.search();\n $location.path('/graphs-visualizations').search(searchParams);\n };\n\n $scope.shouldShowSettings = () => {\n return $scope.configLoaded && $scope.configLoaded.id === $scope.defaultGraphConfig.id;\n };\n\n $scope.shouldDisableSameAs = () => {\n const sameAsCheckbox = $('#sameAsCheck');\n if ($scope.settings && !$scope.settings['includeInferred'] && sameAsCheckbox.prop('checked')) {\n sameAsCheckbox.prop(\"checked\", false);\n $scope.settings['sameAsState'] = false;\n }\n\n return $scope.settings && !$scope.settings['includeInferred'];\n };\n\n $scope.propertiesFilterFunc = (item) => {\n return item.key.toLowerCase().indexOf($scope.propertiesQueryObj.query.toLowerCase()) >= 0;\n };\n\n $scope.toggleMoreInfo = (ev) => {\n angular.element(ev.currentTarget).parent().next().toggle(200);\n angular.element(ev.currentTarget).children('span').toggleClass(\"ri-arrow-down-s-line\").toggleClass(\"ri-arrow-up-s-line\");\n };\n\n $scope.copyToClipboard = (uri) => {\n ModalService.openCopyToClipboardModal(uri);\n };\n\n $scope.resetSettings = () => {\n $scope.settings = _.cloneDeep($scope.defaultSettings);\n $scope.validateLinksLimit();\n renderSettings();\n };\n\n $scope.changeLimit = (delta) => {\n let linksLimit = $scope.settings.linksLimit + delta;\n if (linksLimit < 1) {\n linksLimit = 1;\n }\n if (linksLimit > 1000) {\n linksLimit = 1000;\n }\n $scope.settings.linksLimit = linksLimit;\n };\n\n $scope.validateLinksLimit = () => {\n $scope.invalidLimit = !NUMBER_PATTERN.test($scope.settings.linksLimit);\n };\n\n $scope.showSettings = () => {\n $scope.showInfoPanel = true;\n $scope.showFilter = true;\n $scope.showNodeInfo = false;\n $scope.showPredicates = false;\n if (!$scope.saveSettings) {\n $scope.settings = _.cloneDeep($scope.defaultSettings);\n } else {\n $scope.settings = _.cloneDeep($scope.saveSettings);\n }\n renderSettings();\n };\n\n $scope.updateSettings = () => {\n if ($scope.invalidLimit) {\n toastr.error($scope.INVALID_LINKS_TOOLTIP, $scope.INVALID_LINKS_MSG);\n return;\n }\n $scope.saveSettings = $scope.settings;\n $scope.saveSettings.languages = _.map($scope.saveSettings['languagesMap'], function(s) {\n return s['text'];\n });\n\n $scope.saveSettings.preferredTypes = _.map($scope.saveSettings['preferredTypesMap'], function(t) {\n return t['text'];\n });\n $scope.saveSettings.rejectedTypes = _.map($scope.saveSettings['rejectedTypesMap'], function(t) {\n return t['text'];\n });\n\n $scope.saveSettings.preferredPredicates = _.map($scope.saveSettings['preferredPredicatesMap'], function(t) {\n return t['text'];\n });\n $scope.saveSettings.rejectedPredicates = _.map($scope.saveSettings['rejectedPredicatesMap'], function(t) {\n return t['text'];\n });\n\n // TODO\n // reexpand root node\n if ($scope.rootNodeIri) {\n reExpandNode($scope.rootNodeIri);\n } else if ($scope.queryResultsMode && $location.search().query) {\n loadGraphForQuery($location.search().query,\n $location.search().sameAs,\n $location.search().inference);\n } else if ($scope.configLoaded.startMode === 'query') {\n loadGraphConfig($scope.configLoaded);\n }\n\n updatePredicateLabels();\n\n $scope.showInfoPanel = false;\n $scope.showFilter = false;\n\n LocalStorageAdapter.set(LSKeys.GRAPHS_VIZ, $scope.saveSettings);\n };\n\n // Graph Config\n $scope.getGraphConfigs = (graphCallback) => {\n GraphConfigRestService.getGraphConfigs()\n .success(function(data) {\n $scope.graphConfigs = data;\n if (graphCallback) {\n graphCallback();\n }\n }).error(function(data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.graph.configs.short.msg'));\n });\n };\n\n $scope.findConfigById = function(configId) {\n if (configId === $scope.defaultGraphConfig.id) {\n return $scope.defaultGraphConfig;\n }\n return $.grep($scope.graphConfigs, function(e) {\n return e.id === configId;\n })[0];\n };\n\n $scope.easyGraphSearch = (iri) => {\n $scope.configLoaded = $scope.defaultGraphConfig;\n $scope.openUri(iri);\n };\n\n /**\n * Handles the delete graph config action.\n * @param {GraphsConfig} config\n */\n $scope.deleteConfig = (config) => {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('graphexplore.delete.graph', {configName: config.name}),\n warning: true,\n }).result\n .then(function() {\n GraphConfigRestService.deleteGraphConfig(config)\n .success(function() {\n $scope.getGraphConfigs();\n $scope.refreshSavedGraphs();\n }).error(function(data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.cannot.delete.config'));\n });\n });\n };\n\n $scope.goToGraphConfig = (config) => {\n const searchParams = {\n config: config.id,\n [REPOSITORY_ID_PARAM]: repositoryContextService.getSelectedRepository().id,\n };\n pushHistory(searchParams, {config: config});\n resetState();\n loadGraphConfig(config);\n };\n\n $scope.replaceIRIWithPrefix = (iri) => {\n const namespaces = $scope.namespaces;\n const namespacePrefix = _.findLast(namespaces, function(o) {\n return iri.indexOf(o.uri) === 0;\n });\n return namespacePrefix ? (namespacePrefix.prefix + \":\" + iri.substring(namespacePrefix.uri.length)) : iri;\n };\n\n const onSelectedRepositoryUpdated = (repository) => {\n if (!repository) {\n $scope.repositoryNamespaces = new NamespacesListModel();\n return;\n }\n RDF4JRepositoriesService.getNamespaces(repository.id)\n .then((repositoryNamespaces) => {\n $scope.repositoryNamespaces = repositoryNamespaces;\n $scope.namespaces = repositoryNamespaces.namespaces;\n })\n .catch((error) => {\n const msg = getError(error);\n toastr.error(msg, $translate.instant('error.getting.namespaces.for.repo'));\n });\n };\n\n const onAutocompleteEnabledUpdated = (autocompleteEnabled) => {\n $scope.isAutocompleteEnabled = autocompleteEnabled;\n };\n\n // =========================\n // Event handlers\n // =========================\n\n const subscriptions = [];\n\n subscriptions.push($rootScope.$on('$translateChangeSuccess', function() {\n $scope.INVALID_LINKS_MSG = $translate.instant('sidepanel.invalid.limit.links.msg');\n $scope.INVALID_LINKS_TOOLTIP = $translate.instant('sidepanel.invalid.limit.links.tooltip');\n $scope.propertiesSearchPlaceholder = $translate.instant(\"visual.search.instance.placeholder\");\n }));\n\n subscriptions.push(WorkbenchContextService.onAutocompleteEnabledUpdated(onAutocompleteEnabledUpdated));\n subscriptions.push(repositoryContextService.onSelectedRepositoryChanged(onSelectedRepositoryUpdated));\n\n subscriptions.push($scope.$on('repositoryIsSet', function(event, args) {\n const payload = args || {newRepo: false};\n // New repo set from dropdown, clear init state\n if (payload.newRepo) {\n $scope.hasInitedRepository = false;\n }\n\n initForRepository(!!payload.newRepo);\n\n // New repo set from dropdown, clear state and go to home page\n if (payload.newRepo) {\n resetState();\n // Quick-n-dirty way to get rid of the existing vis\n $('.graph-visualization svg').empty();\n\n // When we come from the sparql view and then change the repo though the dropdown,\n // should goToHome and reinit the view, for the search to view on the home page\n if ($location.search().query) {\n $scope.goToHome();\n initGraphFromQueryParam();\n }\n }\n }));\n\n const rootScopeGenericWatcher = () => $rootScope.key;\n const rootScopeGenericChangeHandler = () => {\n position = 0;\n _.each($scope.propertiesObj.items, function(item) {\n if ($rootScope.key > item) {\n position++;\n }\n });\n current++;\n };\n subscriptions.push($rootScope.$watch(rootScopeGenericWatcher, rootScopeGenericChangeHandler));\n\n const propertiesItemsChangeHandler = () => {\n if (angular.isDefined($scope.propertiesObj.items) && $scope.propertiesObj.items.length > 0) {\n $timeout(function() {\n $scope.adapterContainer.adapter.reload();\n }, 500);\n }\n };\n subscriptions.push($scope.$watch('propertiesObj.items', propertiesItemsChangeHandler));\n\n // ========================= Save graph modal =========================\n let modalIsOpen = false;\n // When restarting the modal (\"Save as new...\" button press) opens a new modal and closes the old one\n let openModalCount = 0;\n\n function handleKeyDown(e) {\n if (modalIsOpen) {\n e.stopPropagation();\n }\n }\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n const removeAllListeners = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n const destroyHandler = () => {\n removeAllListeners();\n document.removeEventListener('keydown', handleKeyDown, true);\n\n window.onpopstate = null;\n };\n\n // Deregister the watcher when the scope/directive is destroyed\n $scope.$on('$destroy', destroyHandler);\n\n // =========================\n // Private functions\n // =========================\n\n const pushHistory = (searchParams, state) => {\n if ($scope.embedded) {\n searchParams.embedded = true;\n }\n $location.search(searchParams);\n state.skipOnPopState = true;\n $location.state(state);\n };\n\n const resetState = () => {\n $scope.searchVisible = false;\n $scope.nodeSelected = false;\n $scope.configLoaded = null;\n $scope.queryResultsMode = false;\n $scope.lastSavedGraphName = null;\n $scope.lastSavedGraphId = null;\n $scope.shared = false;\n $scope.numberOfPinnedNodes = 0;\n\n // Reset type colours\n type2color = {};\n colorIndex = 0;\n };\n\n const getSettings = () => {\n // When a guide is active, we really want the default settings to make sure the user gets\n // the same as the author of the guide intended\n return GuidesService.isActive() ? $scope.defaultSettings : $scope.saveSettings;\n };\n\n const updatePredicateLabels = () => {\n if (!getSettings()['showLinksText']) {\n d3.selectAll(\"svg .link-wrapper text\")\n .style(\"display\", \"none\");\n } else {\n d3.selectAll(\"svg .link-wrapper text\")\n .style(\"display\", \"block\");\n }\n };\n\n const updateNodeLabels = (nodeLabels) => {\n nodeLabels.each(function(d) {\n d.fontSize = D3.Text.calcFontSizeRaw(d.labels[0].label, d.size, nodeLabelMinFontSize, true);\n // TODO: get language and set it on the label html tag\n })\n .attr(\"height\", function(d) {\n return d.fontSize * heightMultiplier;\n })\n // if this was kosher we would use xhtml:body here but if we do that angular (or the browser)\n // goes crazy and resizes/messes up other unrelated elements. div seems to work too.\n .append(\"xhtml:div\")\n .attr(\"class\", \"node-label-body\")\n .classed(\"truncated-label\", $scope.saveSettings.truncateNodeLabels)\n .style(\"font-size\", function(d) {\n return d.fontSize + 'px';\n })\n .append('xhtml:div')\n .html(function(d) {\n return HtmlUtil.getText(d.labels[0].label).replaceAll(\"\\n\", \"<br>\");\n });\n };\n\n const initSettings = (principal) => {\n const settingsFromPrincipal = principal.appSettings;\n\n // New style settings from principal\n $scope.defaultSettings.includeInferred = settingsFromPrincipal['DEFAULT_INFERENCE'];\n $scope.defaultSettings.sameAsState = settingsFromPrincipal['DEFAULT_INFERENCE'] && settingsFromPrincipal['DEFAULT_SAMEAS'];\n $scope.defaultSettings.includeSchema = settingsFromPrincipal['DEFAULT_VIS_GRAPH_SCHEMA'];\n\n const localStorageSettings = LocalStorageAdapter.get(LSKeys.GRAPHS_VIZ);\n if (localStorageSettings && typeof localStorageSettings === 'object') {\n // Patch existing settings\n try {\n $scope.saveSettings = localStorageSettings;\n if ($scope.saveSettings['includeSchema'] === undefined) {\n // Add the new defaults when migrating from an old GDB\n $scope.saveSettings['includeSchema'] = $scope.defaultSettings['includeSchema'];\n $scope.saveSettings['rejectedPredicates'] = [...$scope.saveSettings['rejectedPredicates'], ...$scope.defaultSettings['rejectedPredicates']].unique();\n }\n } catch {\n $scope.saveSettings = _.cloneDeep($scope.defaultSettings);\n LocalStorageAdapter.set(LSKeys.GRAPHS_VIZ, $scope.saveSettings);\n }\n } else {\n $scope.saveSettings = _.cloneDeep($scope.defaultSettings);\n }\n };\n\n const renderSettings = () => {\n $scope.settings.languagesMap = _.map($scope.settings.languages, function(v) {\n return {'text': v};\n });\n\n $scope.settings.preferredTypesMap = _.map($scope.settings.preferredTypes, function(v) {\n return {'text': v};\n });\n\n $scope.settings.rejectedTypesMap = _.map($scope.settings.rejectedTypes, function(v) {\n return {'text': v};\n });\n\n $scope.settings.preferredPredicatesMap = _.map($scope.settings.preferredPredicates, function(v) {\n return {'text': v};\n });\n\n $scope.settings.rejectedPredicatesMap = _.map($scope.settings.rejectedPredicates, function(v) {\n return {'text': v};\n });\n };\n\n const reExpandNode = () => {\n if ($scope.rootNodeIri) {\n $scope.$broadcast(\"onRootNodeChange\", $scope.rootNodeIri);\n }\n };\n\n const initGraphFromQueryParam = () => {\n // view sparql\n if ($location.search().query) {\n $scope.searchVisible = false;\n $scope.queryResultsMode = true;\n loadGraphForQuery($location.search().query,\n $location.search().sameAs,\n $location.search().inference);\n } else {\n // broadcasted event from view resource directive to take input value\n $scope.$on('onRootNodeChange', function(e, inputValue) {\n $scope.loading = true;\n const settings = getSettings();\n if (angular.isDefined(inputValue)) {\n $scope.rootNodeIri = inputValue;\n GraphDataRestService.getInstanceNode({\n iri: inputValue,\n config: $scope.configLoaded ? $scope.configLoaded.id : $scope.defaultGraphConfig.id,\n languages: !$scope.shouldShowSettings() ? [] : settings['languages'],\n includeInferred: settings['includeInferred'],\n sameAsState: settings['sameAsState'],\n }).then(function(response) {\n $scope.nodeSelected = true;\n $scope.searchVisible = false;\n if (response.data.types === null) {\n response.data.types = \"greyColor\";\n }\n graph = new Graph();\n const rootNode = graph.addNode(response.data, width / 2, height / 2);\n\n transformValues = INITIAL_CONTAINER_TRANSFORM;\n\n expandNode(rootNode, true);\n }).catch(function(err) {\n $scope.loading = false;\n toastr.error(getError(err), $translate.instant('graphexplore.error.could.not.load.graph'));\n });\n }\n });\n }\n\n if ($location.search().uri) {\n $scope.openUri($location.search().uri, true);\n }\n\n if ($location.search().saved) {\n SavedGraphsRestService.getSavedGraph($location.search().saved)\n .success(function(data) {\n $scope.loadSavedGraph(data);\n })\n .error(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.could.not.open'));\n });\n }\n };\n\n const loadGraphForQuery = (queryString, sameAsParam, inferredParam) => {\n const settings = getSettings();\n const sendSameAs = (sameAsParam === undefined) ? (settings['sameAsState']) : sameAsParam === true;\n const sendInferred = (inferredParam === undefined) ? (settings['includeInferred']) : inferredParam === true;\n $scope.loading = true;\n GraphDataRestService.updateGraph({\n query: queryString,\n linksLimit: settings['linksLimit'],\n languages: !$scope.shouldShowSettings() ? [] : settings['languages'],\n includeInferred: sendInferred,\n sameAsState: sendSameAs,\n }).then(function(response) {\n // Node draw will turn off the loader\n initGraphFromResponse(response);\n }, function(response) {\n $scope.loading = false;\n toastr.error(getError(response.data), $translate.instant('graphexplore.error.cannot.load.graph'));\n });\n };\n\n /**\n * Converts triple to link id or generates unique id (needed for arrows)\n * @param {string} triple\n * @param {boolean} tripleLike\n * @return {string}\n */\n const convertTripleToLinkId = (triple, tripleLike) => {\n const tripleParts = triple.split(' ');\n if (tripleLike) {\n return [tripleParts[0], tripleParts[1], tripleParts[2]].join('>');\n }\n return [tripleParts[0], tripleParts[2]].join('>');\n };\n\n const convertLinkDataToLinkId = (link) => {\n return [link.source.iri, link.target.iri].join('>');\n };\n\n /**\n * If source or target of a link is a triple returns a x\n * for the link, otherwise returns this of the node.\n * Because tick is called before links are created we return node's x,\n * which afterwards will be overridden\n * @param {object} node\n * @return {number|number|*}\n */\n const getNodeX = (node) => {\n if (node.isTriple) {\n const el = document.getElementById(removeSpecialChars(convertTripleToLinkId(node.iri)));\n if (el && typeof el.__data__.x !== \"undefined\") {\n return el.__data__.x;\n }\n }\n return node.x;\n };\n\n /**\n * If source or target of a link is a triple returns a y\n * for the link, otherwise returns this of the node.\n * Because tick is called before links are created we return node's y,\n * which afterwards will be overridden\n * @param {object} node\n * @return {number|number|*}\n */\n const getNodeY = (node) => {\n if (node.isTriple) {\n const el = document.getElementById(removeSpecialChars(convertTripleToLinkId(node.iri)));\n if (el && typeof el.__data__.y !== \"undefined\") {\n return el.__data__.y;\n }\n }\n return node.y;\n };\n\n const createTriple = (value) => {\n const tripleParts = value.trim().split(' ');\n return `<<<${tripleParts[0]}> <${tripleParts[1]}> <${tripleParts[2]}>>>`;\n };\n\n /**\n * Creates unique arrow-marker id will allow change color and refX for particular one\n * @param {object} d\n * @return {string}\n */\n const createArrowMarkerUniqueID = (d) => {\n const source = d.source.isTriple ? convertTripleToLinkId(d.source.iri, true) : d.source.iri;\n const target = d.target.isTriple ? convertTripleToLinkId(d.target.iri, true) : d.target.iri;\n return removeSpecialChars(`${source}>${target}>marker`);\n };\n\n /**\n * Filters nodes array on a given field\n * @param {string} iri\n * @param {Array} array\n * @return {*}\n */\n const distinctBy = (iri, array) => {\n const keys = array.map((value) => value[iri]);\n return array.filter((value, index) => keys.indexOf(value[iri]) === index);\n };\n\n const loadConfigForId = (configId, successCallback) => {\n if (configId === $scope.defaultGraphConfig.id) {\n loadGraphConfig($scope.defaultGraphConfig);\n } else {\n GraphConfigRestService.getConfig(configId)\n .then((data) => {\n loadGraphConfig(data);\n successCallback();\n })\n .catch((data) => {\n toastr.error(getError(data), $translate.instant('graphexplore.error.could.not.load.config', {configId: configId}));\n });\n }\n };\n\n const loadGraphConfig = (config) => {\n $scope.configLoaded = config;\n if (config.startMode === 'search') {\n $scope.searchVisible = true;\n } else if (config.startMode === 'node' && config.startIRI) {\n $timeout(function() {\n $scope.openUri(config.startIRI, true);\n }, 0);\n } else if (config.startMode === 'query' && config.startGraphQuery) {\n $scope.loading = true;\n GraphConfigRestService.loadGraphForConfig(config, config.startQueryIncludeInferred, getSettings()['linksLimit'], config.startQuerySameAs)\n .then(function(response) {\n // Node drawing will turn off loader\n initGraphFromResponse(response);\n }, function(data) {\n $scope.loading = false;\n toastr.error(getError(data), $translate.instant('graphexplore.error.graph.load'));\n });\n }\n };\n\n const loadGraphFromQueryParam = function() {\n // view graph config\n if ($location.search().config) {\n loadConfigForId($location.search().config, initGraphFromQueryParam);\n } else if ($location.search().query || $location.search().uri) {\n loadGraphConfig($scope.defaultGraphConfig);\n initGraphFromQueryParam();\n } else {\n initGraphFromQueryParam();\n }\n };\n\n // Global\n $window.onpopstate = function(event) {\n // Single spa triggers this event in some unwanted cases, for example, when displaying the Visual graph view.\n // By adding skipOnPopState we can skip the execution, whenever we don't need it\n if (event.state && event.state.skipOnPopState) {\n return;\n }\n\n resetState();\n\n if (event.state) {\n if (event.state.config) {\n loadGraphConfig(event.state.config);\n if (event.state.uri) {\n $scope.openUri(event.state.uri, true);\n }\n } else if (event.state.savedGraph) {\n $scope.loadSavedGraph(event.state.savedGraph, true);\n }\n }\n };\n\n // embedded and other params when the controller is initialized\n if ($scope.embedded && ($location.search().query ||\n $location.search().uri ||\n $location.search().config ||\n $location.search().saved)) {\n $scope.noGoHome = true;\n }\n\n let position = 0;\n let current = 0;\n let type2color = {};\n let colorIndex = 0;\n const nodeLabelMinFontSize = 16; // in pixels\n // define zoom and drag behavior; keep this out of draw() to preserve state when nodes are added/removed\n const zoomLayout = d3.zoom().scaleExtent([0.1, 10]);\n let container;\n const INITIAL_CONTAINER_TRANSFORM = d3.zoomIdentity.translate(0, -70).scale(1);\n\n function zoomed(event) {\n if (GuidesService.isActive()) {\n // disable zooming if a guide is active.\n return;\n }\n transformValues = event.transform;\n container.attr(\"transform\", transformValues);\n }\n\n zoomLayout.on(\"zoom\", zoomed);\n\n let transformValues = INITIAL_CONTAINER_TRANSFORM;\n // build svg element\n const width = 1000;\n const height = 1000;\n let tipElement;\n let openedLink;\n\n // creating datasource for class properties data\n $scope.datasource = {\n get: function(index, count, success) {\n return UiScrollService.initLazyList(index, count, success, position, $scope.propertiesObj.items);\n },\n revision: function() {\n return current;\n },\n };\n\n $scope.showInfoPanel = false;\n\n function Graph() {\n this.nodes = [];\n this.links = [];\n this.tripleNodes = new Map();\n this.tripleLinksCopy = new Map();\n\n this.addNode = function(node, x, y) {\n node.x = x;\n node.y = y;\n this.nodes.push(node);\n return node;\n };\n\n // computes a \"connectedness\" metric on each link, which is then used to hint for longer links.\n // this results in improved clustering and appearance.\n this.computeConnectedness = function() {\n // count the the number of times a given node is connected to other nodes\n // (only for nodes connected to more than one node)\n const counts = {};\n const seenLinks = {};\n _.each(this.links, function(link) {\n const i1 = link.source.iri;\n const i2 = link.target.iri;\n const seenKey = _.min([i1, i2]) + \"|\" + _.max([i1, i2]);\n if (!seenLinks[seenKey]) {\n seenLinks[seenKey] = 1;\n counts[i1] = (counts[i1] || 0) + 1;\n counts[i2] = (counts[i2] || 0) + 1;\n }\n });\n\n // computes the connectedness of each link based on the number of times its nodes were connected\n // (only for links to/from nodes connected to more than one node)\n _.each(this.links, function(link) {\n if (counts[link.source.iri] > 1 && counts[link.target.iri] > 1) {\n link.connectedness = Math.min(5, Math.max(counts[link.source.iri], counts[link.target.iri]) - 1);\n } else {\n link.connectedness = 0;\n }\n });\n };\n\n this.addAndMatchLinks = function(newLinks) {\n const nodes = this.nodes;\n Array.prototype.push.apply(this.links, matchLinksToNodes(newLinks, nodes));\n for (const key of graph.tripleLinksCopy.keys()) {\n if (graph.tripleLinksCopy.get(key).length === 1) {\n graph.tripleLinksCopy.delete(key);\n }\n }\n this.links = this.links.filter((link) => link !== null);\n this.computeConnectedness();\n };\n\n const countLinks = function(d, links) {\n return findLinksForNode(d, links).length;\n };\n\n this.countLinks = countLinks;\n\n function findLinksForNode(d, links) {\n return _.filter(links, function(l) {\n return l.source.iri === d.iri || l.target.iri === d.iri;\n });\n }\n\n function linksTypes(d, links) {\n const linksForNode = findLinksForNode(d, links);\n const types = _.map(linksForNode, function(l) {\n return (l.source.iri === d.iri) ? l.target.types : l.source.types;\n });\n return _.uniq(_.flatten(types));\n }\n\n function linksPredicates(d, links) {\n const linksForNode = findLinksForNode(d, links);\n const predicates = _.map(linksForNode, function(l) {\n return l.predicates;\n });\n return _.uniq(_.flatten(predicates));\n }\n\n this.linksTypes = linksTypes;\n\n this.linksPredicates = linksPredicates;\n\n /**\n * Removes generated triple links and related nodes\n * @param triplesToRemove\n */\n this.removeTriples = function(triplesToRemove) {\n const targetTriples = [];\n if (this.tripleNodes.size > 0) {\n triplesToRemove.forEach((source) => {\n if (this.tripleNodes.has(source)) {\n this.tripleNodes.delete(source);\n this.links = _.reject(this.links, function(l) {\n const sourceSplit = source.split('>');\n const lSource = convertTripleToLinkId(l.source.iri);\n const lTarget = convertTripleToLinkId(l.target.iri);\n // Handle triple targets\n if (lSource === source && graph.tripleNodes.delete(lTarget)) {\n const targetSplit = lTarget.split('>');\n targetTriples.push({\n source: targetSplit[0],\n target: targetSplit[1],\n });\n }\n const isRejected = lSource === source || lTarget === source || (l.source.iri === sourceSplit[0] && l.target.iri === sourceSplit[1]);\n if (isRejected) {\n graph.tripleLinksCopy.delete(`${lSource}>${lTarget}`);\n graph.tripleLinksCopy.delete(`${lTarget}>${lSource}`);\n }\n return isRejected;\n });\n }\n });\n }\n\n // This step is needed for removing artificially created links representing triples\n targetTriples.forEach((target) => {\n this.links = _.reject(this.links, function(l) {\n return l.source.iri === target.source && l.target.iri === target.target;\n });\n });\n };\n\n this.removeNode = function(d) {\n const triplesToRemove = [];\n this.links = _.reject(this.links, function(l) {\n const isRejected = l.source.iri === d.iri || l.target.iri === d.iri;\n if (isRejected) {\n if (l.target.isTriple) {\n triplesToRemove.push(convertTripleToLinkId(l.target.iri));\n }\n if (!l.source.isTriple && !l.target.isTriple) {\n triplesToRemove.push([l.source.iri, l.target.iri].join('>'));\n }\n }\n return isRejected;\n });\n\n this.removeTriples(triplesToRemove);\n\n const links = this.links;\n this.nodes = _.reject(this.nodes, function(n) {\n return countLinks(n, links) === 0;\n });\n if (this.nodes.length === 0) {\n $scope.nodeSelected = false;\n }\n\n this.computeConnectedness();\n };\n\n this.removeNodeLeafLinks = function(d) {\n const triplesToRemove = [];\n let links = this.links;\n this.links = _.reject(this.links, function(l) {\n let isRejected = (l.source.iri === d.iri && countLinks(l.target, links) === 1 && !l.target.isTriple) ||\n (l.target.iri === d.iri && countLinks(l.source, links) === 1 && !l.source.isTriple);\n if (!isRejected) {\n let targetLinks;\n if (l.source.iri === d.iri && countLinks(l.target, links) === 2 && !l.target.isTriple) {\n targetLinks = findLinksForNode(l.target, links);\n } else if (l.target.iri === d.iri && countLinks(l.source, links) === 2 && !l.source.isTriple) {\n targetLinks = findLinksForNode(l.source, links);\n }\n if (!targetLinks) {\n return false;\n }\n // the node to which (or from which) d has link to has only two links, check if the second one is to d also\n isRejected = (targetLinks[0].source.iri === d.iri || targetLinks[0].target.iri) &&\n (targetLinks[1].source.iri === d.iri || targetLinks[1].target.iri);\n }\n if (isRejected) {\n if (l.target.isTriple) {\n triplesToRemove.push(convertTripleToLinkId(l.target.iri));\n }\n if (!l.source.isTriple && !l.target.isTriple) {\n triplesToRemove.push([l.source.iri, l.target.iri].join('>'));\n }\n }\n return isRejected;\n });\n\n this.removeTriples(triplesToRemove);\n\n links = this.links;\n this.nodes = _.reject(this.nodes, function(n) {\n return countLinks(n, links) === 0 && n.iri !== d.iri;\n });\n\n this.computeConnectedness();\n };\n\n this.addTriple = function(triple, x, y) {\n triple.x = x;\n triple.y = y;\n triple.weight = 0;\n const key = convertTripleToLinkId(triple.iri);\n if (!this.tripleNodes.has(key)) {\n triple.weight = 10;\n this.tripleNodes.set(key, [triple]);\n } else {\n const value = this.tripleNodes.get(key);\n value.push(triple);\n this.tripleNodes.set(key, value);\n }\n };\n\n function matchLinksToNodes(newLinks, nodes) {\n return _.map(newLinks, function(link) {\n let source;\n let target;\n if (link.isTripleSource) {\n source = getTripleNode(link.source);\n } else {\n source = _.find(nodes, function(o) {\n return o.iri === link.source;\n });\n }\n if (link.isTripleTarget) {\n target = getTripleNode(link.target);\n } else {\n target = _.find(nodes, function(o) {\n return o.iri === link.target;\n });\n }\n const matchedLink = {\n \"source\": source,\n \"target\": target,\n \"predicates\": link.predicates,\n };\n // make copy of links with triples in them\n if (link.isTripleSource || link.isTripleTarget) {\n const sourceId = matchedLink.source.isTriple ? convertTripleToLinkId(matchedLink.source.iri) : matchedLink.source.iri;\n const targetId = matchedLink.target.isTriple ? convertTripleToLinkId(matchedLink.target.iri) : matchedLink.target.iri;\n const linkId = `${sourceId}>${targetId}`;\n if (graph.tripleLinksCopy.has(linkId)) {\n const value = graph.tripleLinksCopy.get(linkId);\n value[0].predicates.push(...matchedLink.predicates);\n value.push(matchedLink);\n graph.tripleLinksCopy.set(linkId, value);\n return null;\n } else {\n graph.tripleLinksCopy.set(linkId, [matchedLink]);\n }\n }\n return matchedLink;\n });\n }\n\n this.copyState = function() {\n const nodesCopy = _.map(this.nodes, function(node) {\n return {\n iri: node.iri,\n isTriple: node.isTriple,\n size: node.size,\n labels: _.cloneDeep(node.labels),\n types: _.cloneDeep(node.types),\n rdfRank: node.rdfRank,\n x: node.x,\n y: node.y,\n fixed: node.fixed,\n };\n });\n\n const triplesCopy = JSON.stringify(Array.from(this.tripleNodes.entries()));\n const tripleLinksCopy = JSON.stringify(Array.from(this.tripleLinksCopy.entries()));\n\n const linksCopy = _.map(this.links, function(link) {\n return {\n source: link.source.iri,\n isTripleSource: link.source.isTriple,\n target: link.target.iri,\n isTripleTarget: link.target.isTriple,\n predicates: link.predicates,\n };\n });\n\n return {\n nodes: nodesCopy,\n links: linksCopy,\n tripleNodes: triplesCopy,\n tripleLinksCopy: tripleLinksCopy,\n colorIndex: colorIndex,\n type2color: type2color,\n transform: transformValues,\n };\n };\n\n this.restoreState = function(state) {\n $scope.nodeSelected = true;\n $scope.searchVisible = false;\n\n this.nodes = _.cloneDeep(state.nodes);\n // check if triples exists is needed for old configs\n this.tripleNodes = state.tripleNodes ? new Map(JSON.parse(state.tripleNodes)) : new Map();\n this.links = [];\n this.addAndMatchLinks(state.links);\n this.tripleLinksCopy = state.tripleLinksCopy ? new Map(JSON.parse(state.tripleLinksCopy)) : new Map();\n\n _.each(this.nodes, function(d) {\n if (d.fixed) {\n $scope.numberOfPinnedNodes++;\n }\n });\n\n if (angular.isDefined(state.colorIndex) && angular.isDefined(state.type2color)) {\n colorIndex = state.colorIndex;\n type2color = _.cloneDeep(state.type2color);\n }\n\n if (angular.isDefined(state.transform)) {\n transformValues = d3.zoomIdentity.translate(state.transform.x, state.transform.y).scale(state.transform.k);\n }\n\n draw();\n };\n }\n\n let graph = new Graph();\n\n function expandPrefix(str, namespaces) {\n const ABS_URI_REGEX = /^<?(http|urn).*>?/;\n if (!ABS_URI_REGEX.test(str)) {\n const uriParts = str.split(':');\n const uriPart = uriParts[0];\n const localName = uriParts[1];\n if (!angular.isUndefined(localName)) {\n const expandedUri = ClassInstanceDetailsService.getNamespaceUriForPrefix(namespaces, uriPart);\n if (expandedUri) {\n return expandedUri + localName;\n }\n }\n }\n return str;\n }\n\n $scope.addedTag = function(tag) {\n if (tag.text.indexOf(':') < 0) {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri'));\n return null;\n }\n tag.text = expandPrefix(tag.text, $scope.namespaces);\n $scope.pageslideExpanded = true;\n return tag;\n };\n\n $scope.validateTag = function(tag, category, wildcardOK) {\n if (tag.text.indexOf(':') < 0) {\n if (wildcardOK) {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri.option'), category);\n } else {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri'), category);\n }\n return false;\n }\n const wildcardPos = tag.text.indexOf('*');\n if (wildcardPos >= 0) {\n if (!wildcardOK) {\n toastr.warning($translate.instant('graphexplore.wildcards.not.allowed'), category);\n return false;\n } else if (wildcardPos < tag.text.length - 1) {\n toastr.warning($translate.instant('graphexplore.wildcards.last.char'), category);\n return false;\n }\n }\n return true;\n };\n\n $scope.getTagClass = function(tagText) {\n if (tagText.endsWith('*')) {\n return 'tag-item-wildcard';\n }\n return null;\n };\n\n $scope.getActiveRepository = function() {\n return $repositories.getActiveRepository();\n };\n\n $scope.isLicenseValid = function() {\n return service(LicenseContextService).getLicenseSnapshot().valid;\n };\n\n // This method may be called twice - once by us explicitly and once by the repositoryInit event.\n // In some race conditions getActiveRepository() will be already set when we enter it the first\n // time but then we'll be called again by the event, so we need the above flag to avoid double\n // initialization and weirdness.\n function initForRepository(newRepo) {\n if (!$repositories.getActiveRepository() || $scope.hasInitedRepository && !newRepo) {\n return;\n }\n\n $scope.hasInitedRepository = true;\n\n if (!newRepo) {\n // Process params only if this isn't a repo that was just selected from the dropdown menu\n $scope.getGraphConfigs(loadGraphFromQueryParam);\n }\n }\n\n const multiClickDelay = 500; // max delay between clicks for multiple click events\n\n const nodeLabelRectScaleX = 1.75;\n\n const color1 = d3.scaleLinear()\n .domain([0, 9])\n .range([\"hsl(0, 100%, 75%)\", \"hsl(360, 90%, 82%)\"])\n .interpolate(d3.interpolateHslLong);\n\n const color2 = d3.scaleLinear()\n .domain([0, 9])\n .range([\"hsl(180, 50%, 75%)\", \"hsl(540, 40%, 82%)\"])\n .interpolate(d3.interpolateHslLong);\n\n $scope.getColor = function(type) {\n if (angular.isUndefined(type2color[type])) {\n type2color[type] = colorIndex;\n colorIndex++;\n }\n\n const index = type2color[type];\n if (index > 39) {\n return \"#c2c2c2\";\n } else if (index % 2 === 0) {\n return color1(index / 2);\n } else {\n return color2(index / 2);\n }\n };\n\n const forceX = d3.forceX(width / 2).strength(0.005);\n const forceY = d3.forceY(height / 2).strength(0.005);\n\n const force = d3.forceSimulation()\n .force('x', forceX)\n .force('y', forceY);\n\n const svg = d3.select(\".main-container .graph-visualization\").append(\"svg\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\");\n\n let showNodeTipAndIconsTimer = 0;\n let removeIconsTimer = 0;\n\n const loader = new Loader();\n\n function draw(resetRootNode) {\n // remove all group elements and rec to rebuild the graph when the user clicks on it\n d3.selectAll(\"svg g\").remove();\n d3.selectAll('.d3-tip').remove();\n d3.selectAll('.menu-events').remove();\n\n\n container = svg.append(\"g\").attr(\"class\", \"nodes-container\")\n .attr(\"transform\", function() {\n if (angular.isDefined(transformValues) && !resetRootNode) {\n return transformValues;\n }\n return '';\n });\n\n const tip = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function() {\n const bbox = tipElement.getBoundingClientRect();\n return {\n top: (bbox.bottom + 10) + 'px',\n left: (bbox.left - 30) + 'px',\n };\n })\n .html(function(d) {\n let html = '';\n\n if (d.fixed) {\n // add pin icon if pinned down\n html += '<i class=\"ri-pushpin-line\"></i> ';\n }\n\n if (d.types.length > 0) {\n html += d.types\n .map((type) => `<div> \\u00B7 ${$scope.replaceIRIWithPrefix(type)}</div>`)\n .join('');\n } else {\n html += `<i>${$translate.instant('visual.node.tooltip.no_types')}</i>`;\n }\n return html;\n });\n\n const numberOfPredLeft = function(d) {\n return d.predicates.length - 10;\n };\n\n // This will create text that will appear in d3tip\n const createTipText = function(d) {\n let html = '';\n html += _.join(_.map(d.predicates, function(p, index) {\n if (index === 0) {\n return getShortPredicate(p);\n // If we have less than or ten predicates should show them with middle dot separated\n } else if (index < 10) {\n return ' \\u00B7 ' + getShortPredicate(p);\n // On eleventh predicate just append how many more predicates left to show to the user\n } else if (index === 10) {\n const numOfPredLeft = numberOfPredLeft(d);\n // Show how many predicates left\n const textToShow = numOfPredLeft > 1 ? numOfPredLeft + ' predicates'\n : numOfPredLeft + ' predicate';\n return ' \\u00B7 ' + $translate.instant('graphexplore.tip.text', {textToShow: textToShow});\n }\n }), '');\n\n return html;\n };\n\n const calculateWidth = function(d) {\n const text = createTipText(d);\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext(\"2d\");\n ctx.font = \"13px Arial\";\n\n if (d.predicates.length < 10) {\n return ctx.measureText(text).width;\n } else {\n return ctx.measureText(text).width / 2;\n }\n };\n\n let tipPredicateElement;\n let tipPredicateTimer;\n\n const tipPredicates = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function(d) {\n const bbox = tipPredicateElement.getBoundingClientRect();\n const textWidth = calculateWidth(d);\n return {\n top: (bbox.top - 30) + 'px',\n left: (bbox.left - 30) + 'px',\n width: textWidth + 'px',\n };\n })\n .html(function(d) {\n return createTipText(d);\n });\n\n let tipTimer;\n // Shows the tooltip for a node but with a slight delay\n const showTipForNode = function(d, event) {\n $timeout.cancel(tipTimer);\n const thisTipElement = tipElement = event.target;\n $timeout(function() {\n if (tipElement === thisTipElement) {\n tip.show(d, tipElement);\n }\n }, 300);\n };\n\n // Hides the tooltip for the node and resets some variables\n const hideTipForNode = function() {\n $timeout.cancel(tipTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n tipElement = null;\n tip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n };\n\n // Updates the text in the tooltip if already visible\n const updateTipForNode = function(d) {\n if (tipElement) {\n tip.show(d, tipElement);\n }\n };\n\n svg.call(tip);\n\n // Shows like tooltip list of predicates but with a slight delay\n const showPredicateToolTip = function(event, d) {\n $timeout.cancel(tipPredicateTimer);\n const thisPredicateTipElement = tipPredicateElement = event.target;\n $timeout(function() {\n if (tipPredicateElement === thisPredicateTipElement && d.predicates.length > 1) {\n tipPredicates.show(d, tipPredicateElement);\n }\n }, 300);\n };\n\n // Hides the tooltip with predicates and resets some variables\n const hidePredicateToolTip = function() {\n $timeout.cancel(tipPredicateTimer);\n tipPredicateElement = null;\n tipPredicates.hide();\n };\n\n svg.call(tipPredicates);\n\n let link = svg.selectAll(\".link\");\n let node = svg.selectAll(\".node\");\n\n const collisionForce = d3.forceCollide((d) => d.size + 5).strength(0.5);\n const chargeForce = d3.forceManyBody().strength(-300);\n const centerForce = d3.forceCenter(width/2, height/2);\n\n force.nodes(graph.nodes)\n .force(\"charge\", chargeForce)\n .force(\"collide\", collisionForce)\n .force(\"center\", centerForce)\n .force(\"link\", d3.forceLink(graph.links).distance(function(l) {\n if (l.source.isTriple || l.target.isTriple) {\n return 0;\n }\n // link distance depends on length of text with an added bonus for strongly connected nodes,\n // i.e. they will be pushed further from each other so that their common nodes can cluster up\n return getPredicateTextLength(l) + 30 * l.connectedness;\n }));\n\n // arrow markers\n container.append(\"defs\").selectAll(\"marker\")\n .data(graph.links)\n .enter().append(\"marker\")\n .attr(\"class\", \"arrow-marker\")\n .attr(\"id\", function(d) {\n return createArrowMarkerUniqueID(d);\n })\n .attr(\"viewBox\", \"0 -5 10 10\")\n .attr(\"refX\", function(d) {\n // The positioning of the arrow for triple target nodes differ from normal ones\n return d.target.isTriple ? 11 : d.target.size + 11;\n })\n .attr(\"refY\", 0)\n .attr(\"markerWidth\", 10)\n .attr(\"markerHeight\", 10)\n .attr(\"orient\", \"auto\")\n .append(\"path\")\n .attr(\"d\", \"M0,-5L10,0L0,5 L10,0 L0, -5\");\n\n // add the links, nodes, predicates and node labels\n link = container.selectAll(\".link\")\n .data(graph.links)\n .enter().append(\"g\")\n .attr(\"class\", \"link-wrapper\")\n .attr(\"id\", function(d) {\n return removeSpecialChars(convertLinkDataToLinkId(d));\n })\n .append(\"line\")\n .attr(\"class\", \"link\")\n .style(\"stroke-width\", 1)\n .style(\"fill\", \"transparent\")\n .style(\"marker-end\", function(d) {\n const targetArrowId = createArrowMarkerUniqueID(d);\n return `url(#${targetArrowId})`;\n });\n\n const predicate = container.selectAll(\".link-wrapper\")\n .append(\"text\")\n .text(function(d) {\n return getPredicate(d);\n })\n .attr(\"class\", function(d) {\n if (d.predicates.length > 1 || graph.tripleNodes.has(convertLinkDataToLinkId(d))) {\n return \"predicates\";\n }\n return \"predicate\";\n })\n .attr(\"dy\", \"-0.5em\")\n .style(\"text-anchor\", \"middle\")\n .style(\"display\", getSettings()['showLinksText'] ? \"\" : \"none\")\n .on(\"mouseover\", function(event, d) {\n event.stopPropagation();\n showPredicateToolTip(event, d);\n })\n .on('mouseout', hidePredicateToolTip)\n .on(\"click\", function(event, d) {\n event.stopPropagation();\n linkActions(event, d);\n });\n\n // node events and variables\n let touchHoldEventTimer;\n let moveEventCount = 0;\n let singleClickTimer = null;\n let clickTarget = null;\n\n // track single and double click events\n const clickEventHandler = function(event, d) {\n if (event.button && event.button !== 0) {\n return;\n }\n\n const element = event.currentTarget;\n\n if (singleClickTimer && clickTarget === element) {\n $timeout.cancel(singleClickTimer);\n singleClickTimer = null;\n // expand node\n expandEventHandler(d, 0, element.parentNode);\n return;\n }\n\n clickTarget = element;\n\n\n hideTipForNode();\n $scope.showPredicates = false;\n\n if (!GuidesService.isActive()) {\n $timeout.cancel(singleClickTimer);\n // Show node info\n singleClickTimer = $timeout(function() {\n clickedNode(d, element, event);\n singleClickTimer = null;\n }, 40 + multiClickDelay);\n }\n };\n\n // builds upon clickEventHandler and adds additional functionality for touch devices\n const touchStartEventHandler = function(d) {\n // for touch devices we track touch and hold for 1s in order to remove a node\n moveEventCount = 0;\n touchHoldEventTimer = $timeout(function() {\n if (moveEventCount < 5) {\n // remove the node only if not many move events were fired,\n // this avoids conflict with dragging nodes\n hideNode(d);\n }\n touchHoldEventTimer = null;\n }, 1000);\n };\n\n const touchEndEventHandler = function() {\n $timeout.cancel(touchHoldEventTimer);\n touchHoldEventTimer = null;\n };\n\n // tracks the number of move events (checked in the touchend event handler)\n const moveEventHandler = function() {\n moveEventCount++;\n };\n\n const showNodeTipAndIcons = function(event, d) {\n if (!d.isBeingDragged) {\n $timeout.cancel(removeIconsTimer);\n const element = event.currentTarget;\n showNodeTipAndIconsTimer = $timeout(() => {\n if (expandNodeIcons(d, element)) {\n showTipForNode(d, event);\n }\n }, 400);\n }\n };\n\n const expandEventHandler = function(d, i, parentNode) {\n const parent = Array.isArray(parentNode) ? parentNode[i] : parentNode;\n\n const shownLinks = graph.countLinks(d, graph.links);\n if (shownLinks <= getSettings()['linksLimit']) {\n expandNode(d, false, parent);\n } else {\n toastr.info($translate.instant('graphexplore.increase.limit'), $translate.instant('graphexplore.node.at.max'));\n }\n $scope.closeInfoPanel();\n };\n\n // Shows growing or shrinking pin animation\n function showPinAnimation(d, type) {\n let startSize;\n let endSize;\n let startOpacity;\n let endOpacity;\n let animate = true;\n\n if (type === 'down') {\n startSize = d.size * 2;\n endSize = d.size / 3;\n startOpacity = 0.8;\n endOpacity = 0.3;\n } else if (type === 'down-fixed') {\n startSize = d.size * 2;\n endSize = d.size;\n startOpacity = 0.8;\n endOpacity = 0.66;\n } else if (type === 'up') {\n startSize = d.size / 3;\n endSize = d.size * 2;\n startOpacity = 0.3;\n endOpacity = 0.8;\n } else if (type === 'fixed') {\n startSize = d.size;\n startOpacity = 0.66;\n animate = false;\n } else {\n return; // unknown\n }\n\n let pin = container.selectAll('.node-wrapper')\n .filter(function(innerD) {\n return innerD === d;\n })\n .append('text')\n .text('\\ue90f') // pin icon\n .classed('icon-any pinned', true)\n .style('font-size', startSize + 'px')\n .attr('x', function(d) {\n return d.x;\n })\n .attr('y', function(d) {\n return d.y;\n })\n .attr('opacity', startOpacity);\n\n if (type === 'fixed' || type === 'down-fixed') {\n d.pin = pin;\n }\n\n if (animate) {\n pin = pin.transition()\n .duration(1000)\n .style('font-size', function() {\n return endSize + 'px';\n })\n .attr('opacity', endOpacity);\n\n if (type !== 'down-fixed') {\n pin.remove();\n }\n }\n }\n\n function removePin() {\n d3.select('.pinned').remove();\n }\n\n // Unfixes nodes that were dragged previously\n const rightClickHandler = function(event, d) {\n if (event.shiftKey) {\n // Do nothing with the shift key, use to access the context menu\n return;\n }\n\n event.preventDefault();\n\n removeMenuIfVisible();\n $scope.closeInfoPanel();\n\n if (d.fixed) {\n // unpin\n $scope.numberOfPinnedNodes--;\n d.fixed = false;\n d.fx =null;\n d.fy =null;\n showPinAnimation(d, 'up');\n force.alpha(1).restart();\n } else {\n // pin down\n $scope.numberOfPinnedNodes++;\n d.fixed = true;\n showPinAnimation(d, 'down');\n }\n // update pin in tooltip\n updateTipForNode(d);\n };\n\n const drag = d3.drag()\n .subject(function(d) {\n return d;\n })\n .on(\"start\", dragstarted)\n .on(\"drag\", dragged)\n .on(\"end\", dragended);\n\n\n function dragstarted(event, d) {\n if (GuidesService.isActive()) {\n // disable dragging if a guide is active.\n return;\n }\n if (event.sourceEvent.button === 0) {\n d.fixedBeforeDrag = d.fixed;\n d.isBeingDragged = true;\n d.beginDragging = true;\n removeMenuIfVisible();\n d3.select(event.currentTarget).classed(\"dragging\", true);\n force.alphaTarget(0.3).restart();\n }\n }\n\n function dragged(event, d) {\n if (d.isBeingDragged) {\n d.fx = event.x;\n d.fy = event.y;\n if (!d.fixed) {\n $scope.numberOfPinnedNodes++;\n d.fixed = true;\n showPinAnimation(d, 'down-fixed');\n } else if (d.beginDragging) {\n showPinAnimation(d, 'fixed');\n }\n d.pinWasFixed = true;\n d.beginDragging = null;\n }\n }\n\n function dragended(event, d) {\n if (d.isBeingDragged) {\n if (d.pinWasFixed) {\n d.pinWasFixed = null;\n removePin();\n }\n d.isBeingDragged = false;\n d3.select(event.currentTarget).classed(\"dragging\", false);\n }\n force.alphaTarget(0);\n }\n\n node = container.selectAll(\".node\")\n .data(graph.nodes)\n .enter().append(\"g\")\n .attr(\"class\", \"node-wrapper\")\n .attr(\"id\", function(d) {\n return d.iri;\n })\n .append(\"circle\")\n .attr(\"class\", \"node\")\n .attr(\"r\", function(d) {\n return d.size;\n })\n .style(\"fill\", function(d) {\n if (d.types === \"greyColor\") {\n return \"c2c2c2\";\n }\n return $scope.getColor(d.types[0]);\n })\n .on('mouseover', showNodeTipAndIcons)\n .on('mouseout', hideTipForNode)\n .on(\"click\", clickEventHandler)\n .on(\"touchstart\", (event, d) => touchStartEventHandler(d))\n // no need to track move for mouse\n .on(\"touchmove\", moveEventHandler)\n .on(\"touchend\", touchEndEventHandler)\n .on(\"contextmenu\", rightClickHandler)\n // custom event used when user is following a guide\n .on(\"gdb-expand-node\", (event, d) => expandEventHandler(d, 0, event.srcElement.parentNode))\n // custom event used when user is following a guide\n .on(\"gdb-show-node-info\", (event, d) => showNodeInfo(d))\n .call(drag);\n\n const overflow = $scope.saveSettings.truncateNodeLabels ? 'hidden' : 'visible';\n const nodeLabels = container.selectAll(\".node-wrapper\").append(\"foreignObject\")\n .style(\"pointer-events\", \"none\")\n .style(\"overflow\", overflow)\n .attr(\"width\", function(d) {\n return d.size * 2 * nodeLabelRectScaleX;\n });\n // height will be computed by updateNodeLabels\n\n container.insert(\"g\").attr(\"class\", \"menu-events\");\n\n updateNodeLabels(nodeLabels);\n\n force.on(\"tick\", function() {\n // recalculate links attributes\n link.attr(\"x1\", function(d) {\n return getNodeX(d.source);\n }).attr(\"y1\", function(d) {\n return getNodeY(d.source);\n }).attr(\"x2\", function(d) {\n return getNodeX(d.target);\n }).attr(\"y2\", function(d) {\n return getNodeY(d.target);\n });\n\n // recalculate predicates attributes\n predicate.attr(\"x\", function(d) {\n const sourceX = getNodeX(d.source);\n const targetX = getNodeX(d.target);\n return d.x = (sourceX + targetX) * 0.5;\n }).attr(\"y\", function(d) {\n const sourceY = getNodeY(d.source);\n const targetY = getNodeY(d.target);\n return d.y = (sourceY + targetY) * 0.5;\n }).attr(\"transform\", function(d) {\n const angle = findAngleBetweenNodes(d, d.direction);\n return \"rotate(\" + angle + \", \" + d.x + \", \" + d.y + \")\";\n });\n\n // recalculate nodes attributes\n node.attr(\"cx\", function(d) {\n return d.x;\n }).attr(\"cy\", function(d) {\n return d.y;\n });\n\n // update node loader position\n container.select(\".node-loader\").attr(\"x\", function(d) {\n return d.x - d.size + 3; //square svg is not perfectly centered and need +3 units on x ordinate to fit in circle\n }).attr(\"y\", function(d) {\n return d.y - d.size;\n });\n\n container.select(\".loader-container\").attr(\"cx\", function(d) {\n return d.x;\n }).attr(\"cy\", function(d) {\n return d.y;\n });\n\n nodeLabels.attr(\"x\", function(d) {\n return d.x - (d.size * nodeLabelRectScaleX);\n }).attr(\"y\", function(d) {\n // the height of the nodeLabel box is `heightMultiplier` times the fontSize computed by updateNodeLabels\n // and we want to offset it so that its middle matches the centre of the circle, hence divided by 2\n return d.y - heightMultiplier * d.fontSize / 2;\n });\n\n // Update position of shrinking pin animation (if any)\n d3.select('.pinned').attr(\"x\", function(d) {\n return d.x;\n }).attr(\"y\", function(d) {\n return d.y;\n });\n\n updateAlphaInScope();\n });\n\n if (angular.isDefined(loader)) {\n loader.setLoadingState(false);\n }\n\n if ($scope.loading) {\n $scope.loading = false;\n }\n\n d3.selectAll('.link-wrapper').each(function() {\n // eslint-disable-next-line no-invalid-this\n const source = $(this).attr(\"id\").split(\">\")[0];\n // eslint-disable-next-line no-invalid-this\n const target = $(this).attr(\"id\").split(\">\")[1];\n d3.selectAll('.link').each(function(link) {\n const sourceId = removeSpecialChars(link.source.iri);\n const targetId = removeSpecialChars(link.target.iri);\n if (sourceId === target && targetId === source) {\n let twoWayLinkID = sourceId;\n twoWayLinkID += \">\";\n twoWayLinkID += targetId;\n const textNode = document.createTextNode(' \\u27F6');\n document.getElementById(twoWayLinkID).lastChild.appendChild(textNode);\n link.direction = \"double\";\n }\n });\n });\n\n d3.selectAll('.d3-actions-tip').remove();\n\n force.alpha(0.3).restart();\n }\n\n function updateAlphaInScope() {\n // other code can use the value of d3alpha to determine when the force layout has settled\n $rootScope.d3alpha = force.alpha();\n }\n\n // find angle between pair of nodes so we can position predicates\n function findAngleBetweenNodes(linkedNodes, direction) {\n const p1 = {\n x: getNodeX(linkedNodes.source),\n y: getNodeY(linkedNodes.source),\n };\n\n const p2 = {\n x: getNodeX(linkedNodes.target),\n y: getNodeY(linkedNodes.target),\n };\n if (direction) {\n return Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;\n } else {\n const angleDeg = Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;\n if (angleDeg <= 90 && angleDeg >= -90) {\n return angleDeg;\n }\n return (angleDeg > 0 ? -1 : 1) * (180 - Math.abs(angleDeg));\n }\n }\n\n const menuEvents = new MenuEvents();\n\n // expanding and collapsing of the nodes\n function clickedNode(d, element, event) {\n $scope.showInfoPanel = false;\n $scope.showPredicates = false;\n $scope.showNodeInfo = false;\n\n // shift + ctrl/cmd + click focuses node\n if (event.shiftKey && (event.ctrlKey || event.metaKey)) {\n $rootScope.$broadcast(\"onRootNodeChange\", d.iri);\n return false;\n }\n\n // ctrl/cmd + click hides the node\n if (event.ctrlKey || event.metaKey) {\n hideNode(d);\n return false;\n }\n\n // If value of openedNodeInfoPanel is different than \"undefined\"\n // we evaluate if clicked node value is the same and close it\n if (typeof $scope.openedNodeInfoPanel !== \"undefined\" && $scope.openedNodeInfoPanel === d) {\n $scope.pageslideExpanded = false;\n $scope.openedNodeInfoPanel = undefined;\n return false;\n }\n\n showNodeInfo(d);\n return true;\n }\n\n function expandNodeIcons(d, element) {\n if ($scope.showInfoPanel) {\n return false;\n }\n\n if (menuEvents.closeIcon || menuEvents.expandIcon || menuEvents.focusIcon || menuEvents.copyURIIcon) {\n menuEvents.removeIcons();\n }\n\n // If nodes are still rearranging result of force.alpha() is more than 0.02\n // and we don't want to show node's icons on mouse over and stop rearrangement.\n // The chosen value 0.1 is somewhat magic and works well with 0.02 in awaitAlphaDropD3()\n // in the guides code.\n if (force.alpha() < 0.1) {\n menuEvents.initIcons(d, element.parentNode);\n force.stop();\n updateAlphaInScope();\n\n return true;\n }\n\n return false;\n }\n\n function hideNode(d) {\n graph.removeNode(d);\n draw();\n }\n\n function collapseNode(d) {\n d.isExpanded = false;\n graph.removeNodeLeafLinks(d);\n draw();\n }\n\n function initGraph(response) {\n $scope.nodeSelected = true;\n if (response.data.types === null) {\n response.data.types = \"greyColor\";\n }\n graph = new Graph();\n transformValues = INITIAL_CONTAINER_TRANSFORM;\n }\n\n function initGraphFromResponse(response) {\n initGraph(response);\n renderGraphFromResponse(response);\n }\n\n function renderGraphFromResponse(response, d, isStartNode) {\n let linksFound = response.data;\n // filter existing links\n linksFound = _.filter(linksFound, function(newLink) {\n return _.findIndex(graph.links,\n function(existingLink) {\n return newLink.source === existingLink.source.iri && newLink.target === existingLink.target.iri;\n }) === -1;\n });\n const linksCopy = [];\n const tripleLinksIt = graph.tripleLinksCopy.values();\n for (let i = 0; i < graph.tripleLinksCopy.size; i++) {\n const linkCopy = tripleLinksIt.next().value;\n linkCopy.forEach((link) => {\n linksCopy.push(link);\n });\n }\n // filter existing shadow links\n linksFound = _.filter(linksFound, function(newLink) {\n return _.findIndex(linksCopy,\n function(existingLink) {\n return newLink.source === existingLink.source.iri && newLink.target === existingLink.target.iri;\n }) === -1;\n });\n // filter reflexive links until we find a way to render them GDB-1853\n linksFound = _.filter(linksFound, function(newLink) {\n return newLink.source !== newLink.target;\n });\n const nodesFromLinks = distinctBy('iri', _.union(_.flatten(_.map(response.data, function(link) {\n return [\n {iri: link.source, isTriple: link.isTripleSource},\n {iri: link.target, isTriple: link.isTripleTarget},\n ];\n }))));\n const existingNodes = _.map(graph.nodes, function(n) {\n return {\n iri: n.iri,\n isTriple: Boolean(n.isTriple),\n };\n });\n const tripleNodesIt = graph.tripleNodes.values();\n for (let i = 0; i < graph.tripleNodes.size; i++) {\n const nodes = tripleNodesIt.next().value;\n nodes.forEach((node) => {\n existingNodes.push({\n iri: node.iri,\n isTriple: node.isTriple,\n });\n });\n }\n const newNodes = _.reject(nodesFromLinks, function(n) {\n return _.some(existingNodes, n);\n });\n\n if (newNodes.length === 0) {\n // All nodes from links minus 1 gives number of connections\n const connectionsCount = nodesFromLinks.length > 0 ? nodesFromLinks.length - 1 : 0;\n if (isStartNode) {\n toastr.info($translate.instant('graphexplore.error.node.connections', {count: connectionsCount}));\n } else if (linksFound.length === 0) {\n toastr.info($translate.instant('graphexplore.error.node.connections', {count: connectionsCount}));\n }\n\n graph.addAndMatchLinks(linksFound);\n draw();\n } else {\n const promises = [];\n const newNodesData = [];\n\n const settings = getSettings();\n\n _.forEach(newNodes, function(newNode, index) {\n promises.push(GraphDataRestService.getInstanceNode({\n iri: newNode.isTriple ? createTriple(newNode.iri) : newNode.iri,\n config: $scope.configLoaded.id,\n languages: !$scope.shouldShowSettings() ? [] : settings['languages'],\n includeInferred: settings['includeInferred'],\n sameAsState: settings['sameAsState'],\n }).then(function(res) {\n // Save the data for later\n newNodesData[index] = res.data;\n }));\n });\n\n // Waits for all of the collected promises and then:\n // - adds each new node\n // - redraws the graph\n $q.all(promises).then(function() {\n _.forEach(newNodesData, function(newNodeData, index) {\n // Calculate initial positions for the new nodes based on spreading them evenly\n // on a circle around the node we came from.\n const theta = 2 * Math.PI * index / newNodesData.length;\n const x = (d ? d.x : 0) + Math.cos(theta) * height / 3;\n const y = (d ? d.y : 0) + Math.sin(theta) * height / 3;\n if (newNodeData.isTriple) {\n graph.addTriple(newNodeData, x, y);\n } else {\n graph.addNode(newNodeData, x, y);\n }\n });\n\n graph.addAndMatchLinks(linksFound);\n if (d) {\n d.isExpanded = true;\n }\n draw();\n });\n }\n }\n\n function expandNode(d, isStartNode, parentNode) {\n if (loader.getLoadingState()) {\n return;\n }\n loader.init(d, parentNode);\n\n const settings = getSettings();\n const expandIri = d.iri;\n GraphDataRestService.getInstanceNodeLinks({\n iri: expandIri, linksLimit: settings['linksLimit'],\n includeInferred: settings['includeInferred'],\n config: $scope.configLoaded.id,\n preferredTypes: !$scope.shouldShowSettings() ? [] : settings['preferredTypes'],\n rejectedTypes: !$scope.shouldShowSettings() ? [] : settings['rejectedTypes'],\n preferredPredicates: !$scope.shouldShowSettings() ? [] : settings['preferredPredicates'],\n rejectedPredicates: !$scope.shouldShowSettings() ? [] : settings['rejectedPredicates'],\n preferredTypesOnly: !$scope.shouldShowSettings() ? [] : settings['preferredTypesOnly'],\n preferredPredicatesOnly: !$scope.shouldShowSettings() ? [] : settings['preferredPredicatesOnly'],\n languages: !$scope.shouldShowSettings() ? [] : settings['languages'],\n sameAsState: settings['sameAsState'],\n includeSchema: settings['includeSchema'],\n }).then(function(response) {\n renderGraphFromResponse(response, d, isStartNode);\n }, function(response) {\n const msg = getError(response.data);\n toastr.error(msg, $translate.instant('graphexplore.error.exploring.node'));\n $scope.loading = false;\n loader.setLoadingState(false);\n });\n }\n\n function removeMenuIfVisible() {\n if (angular.isDefined(menuEvents) && menuEvents.expandedState) {\n menuEvents.removeIcons();\n }\n }\n\n function MenuEvents() {\n this.closeIcon = undefined;\n this.expandIcon = undefined;\n this.collapseIcon = undefined;\n this.focusIcon = undefined;\n this.copyURIIcon = undefined;\n this.actionsTip = undefined;\n\n this.removeIcons = function() {\n this.closeIcon.remove(\"g\");\n if (this.expandIcon) {\n this.expandIcon.remove(\"g\");\n }\n\n if (this.collapseIcon) {\n this.collapseIcon.remove(\"g\");\n }\n\n this.focusIcon.remove(\"g\");\n this.copyURIIcon.remove(\"g\");\n this.closeIcon = undefined;\n this.expandIcon = undefined;\n this.collapseIcon = undefined;\n this.focusIcon = undefined;\n this.copyURIIcon = undefined;\n\n this.expandedState = false;\n };\n\n this.expandedState = false;\n\n function getPositionAndAngle(angle, d) {\n const x = d.x - 14 + (d.size + 15) * Math.cos(angle * Math.PI / 180 - Math.PI / 2);\n const y = d.y - 14 + (d.size + 15) * Math.sin(angle * Math.PI / 180 - Math.PI / 2);\n return \"translate(\" + x + \",\" + y + \")\";\n }\n\n this.initIcons = function(node, parentNode) {\n // init action tips on hover of the icons\n const actionsTip = d3tip()\n .attr('class', 'd3-tip d3-actions-tip')\n .customPosition(function(d, event) {\n const bbox = event.target.getBoundingClientRect();\n return {\n top: (bbox.top - 20) + 'px',\n left: (bbox.right + 10) + 'px',\n };\n })\n .html(function(name) {\n return name;\n });\n svg.call(actionsTip);\n const angle = 20;\n if (node.isExpanded) {\n this.collapseIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"collapse-icon\")\n .attr(\"name\", \"collapse\")\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n });\n this.collapseIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.collapseIcon.append(\"path\")\n .attr(\"d\", \"M22.67,12a.59.59,0,0,1-.53.65l-6.88.72H15.2a.59.59,0,0,1-.59-.65l.72-6.88A.58.58,0,0,1,16,5.33a.59.59,0,0,1,.53.65L16,11.11,21.3,5.79a.64.64,0,0,1,.91.91L16.89,12,22,11.49A.59.59,0,0,1,22.67,12ZM12.59,14.75l-6.75.85a.59.59,0,0,0-.51.66.58.58,0,0,0,.66.51l4.95-.62-5.2,5.2a.64.64,0,1,0,.91.91l5.2-5.2L11.23,22a.59.59,0,0,0,.51.66h.07a.59.59,0,0,0,.59-.52l.85-6.75a.59.59,0,0,0-.17-.49A.58.58,0,0,0,12.59,14.75Z\")\n .style(\"fill\", \"var(--gw-primary-base)\");\n\n this.collapseIcon.on(\"click\", function() {\n collapseNode(node);\n }).on('mouseover', function(event) {\n actionsTip.show(event.currentTarget.getAttribute(\"name\"), event);\n $timeout.cancel(showNodeTipAndIconsTimer);\n $timeout.cancel(removeIconsTimer);\n }).on('mouseout', function() {\n actionsTip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n });\n } else {\n this.expandIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"expand-icon\")\n .attr(\"name\", \"expand\")\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n });\n this.expandIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.expandIcon.append(\"path\")\n .attr(\"d\", \"M22.37,6.28l-.72,6.88a.59.59,0,0,1-.59.53H21a.59.59,0,0,1-.53-.65L21,7.9l-5.32,5.32a.64.64,0,0,1-.91-.91L20.1,7,15,7.53a.59.59,0,0,1-.12-1.18l6.88-.72a.59.59,0,0,1,.65.65ZM12.89,20.34,7.95,21l5.2-5.2a.64.64,0,0,0-.91-.91L7,20.05l.62-4.95A.59.59,0,0,0,6.48,15l-.85,6.75a.59.59,0,0,0,.59.67h.07L13,21.52a.59.59,0,1,0-.15-1.18Z\")\n .style(\"fill\", \"var(--gw-primary-base)\");\n\n this.expandIcon.on(\"click\", function() {\n expandNode(node, false, parentNode);\n }).on('mouseover', function(event) {\n actionsTip.show(event.currentTarget.getAttribute(\"name\"), event);\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function() {\n actionsTip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n });\n }\n\n this.focusIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"focus-icon\")\n .attr(\"name\", \"focus\")\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n });\n this.focusIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.focusIcon.append(\"path\")\n .attr(\"d\", \"M14.2,23.81a9.8,9.8,0,1,1,6.93-2.87h0A9.74,9.74,0,0,1,14.2,23.81Zm0-18.17a8.37,8.37,0,1,0,5.92,14.29h0A8.37,8.37,0,0,0,14.2,5.64Zm1.42,6.95a2,2,0,1,0,0,2.85A2,2,0,0,0,15.62,12.59Z\")\n .style(\"fill\", \"var(--gw-primary-base)\");\n\n this.focusIcon.on(\"click\", function() {\n $rootScope.$broadcast(\"onRootNodeChange\", node.iri);\n }).on('mouseover', function(event) {\n actionsTip.show(event.currentTarget.getAttribute(\"name\"), event);\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function() {\n actionsTip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.copyURIIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"ri-links-line\")\n .attr(\"name\", \"link\")\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n });\n this.copyURIIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.copyURIIcon.append(\"path\")\n .attr(\"d\", \"M 13.457031 10.164062 C 13.648438 10.164062 13.820312 10.242188 13.941406 10.363281 L 15.492188 11.859375 C 15.984375 12.332031 16.292969 12.992188 16.292969 13.714844 C 16.292969 14.441406 15.984375 15.097656 15.492188 15.574219 L 10.394531 20.496094 C 9.902344 20.972656 9.222656 21.265625 8.472656 21.265625 C 7.71875 21.265625 7.039062 20.972656 6.546875 20.496094 L 4.996094 19 C 4.507812 18.523438 4.203125 17.867188 4.203125 17.144531 C 4.203125 16.421875 4.507812 15.765625 4.996094 15.289062 L 7.542969 12.824219 C 7.667969 12.707031 7.84375 12.628906 8.035156 12.628906 C 8.417969 12.628906 8.726562 12.929688 8.726562 13.300781 C 8.726562 13.484375 8.648438 13.652344 8.523438 13.773438 L 5.976562 16.234375 C 5.738281 16.46875 5.589844 16.792969 5.589844 17.148438 C 5.589844 17.503906 5.738281 17.824219 5.976562 18.058594 L 7.527344 19.566406 C 7.773438 19.792969 8.105469 19.929688 8.472656 19.929688 C 8.835938 19.929688 9.167969 19.792969 9.414062 19.566406 L 14.511719 14.644531 C 14.753906 14.410156 14.90625 14.089844 14.90625 13.730469 C 14.90625 13.375 14.753906 13.054688 14.511719 12.820312 L 12.964844 11.324219 C 12.839844 11.203125 12.761719 11.039062 12.761719 10.855469 C 12.761719 10.488281 13.070312 10.1875 13.449219 10.1875 Z M 17.082031 3.976562 C 17.082031 3.976562 17.085938 3.976562 17.085938 3.976562 C 17.824219 3.976562 18.492188 4.261719 18.980469 4.722656 L 20.535156 6.203125 C 21.042969 6.679688 21.355469 7.34375 21.355469 8.082031 C 21.355469 8.792969 21.058594 9.441406 20.582031 9.914062 L 18.0625 12.402344 C 17.9375 12.527344 17.761719 12.605469 17.566406 12.605469 C 17.183594 12.605469 16.875 12.304688 16.875 11.9375 C 16.875 11.753906 16.949219 11.589844 17.070312 11.46875 L 19.605469 8.984375 C 19.847656 8.75 19.996094 8.429688 19.996094 8.070312 C 19.996094 7.714844 19.847656 7.394531 19.605469 7.160156 L 18.019531 5.667969 C 17.773438 5.445312 17.4375 5.304688 17.070312 5.300781 C 16.703125 5.304688 16.367188 5.453125 16.128906 5.691406 L 11.085938 10.667969 C 10.84375 10.898438 10.695312 11.222656 10.695312 11.578125 C 10.695312 11.933594 10.84375 12.257812 11.085938 12.488281 L 12.675781 13.980469 C 12.804688 14.101562 12.882812 14.273438 12.882812 14.457031 C 12.882812 14.828125 12.574219 15.128906 12.191406 15.128906 C 12.003906 15.128906 11.832031 15.054688 11.707031 14.9375 L 10.140625 13.457031 C 9.636719 12.980469 9.324219 12.316406 9.324219 11.582031 C 9.324219 10.863281 9.621094 10.214844 10.101562 9.742188 L 15.140625 4.765625 C 15.625 4.285156 16.304688 3.980469 17.054688 3.976562 Z M 17.082031 3.976562\")\n .style(\"fill\", \"var(--gw-primary-base)\");\n\n this.copyURIIcon.on(\"click\", function() {\n $scope.copyToClipboard(node.iri);\n removeMenuIfVisible();\n actionsTip.hide();\n }).on('mouseover', function(event) {\n actionsTip.show(\"<div style='text-align: center;'><b>Copy to ClipBoard</b><br>\" + node.iri + \"</div>\", event);\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function() {\n actionsTip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.closeIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"close-icon\")\n .attr(\"name\", \"remove\")\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n });\n this.closeIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.closeIcon.append(\"path\")\n .attr(\"d\", \"M14.94,14l5.87-5.87a.66.66,0,1,0-.94-.94L14,13.06,8.13,7.19a.66.66,0,0,0-.94.94L13.06,14,7.19,19.87a.66.66,0,1,0,.94.94L14,14.94l5.87,5.87a.66.66,0,1,0,.94-.94Z\")\n .style(\"fill\", \"var(--gw-primary-base)\");\n\n this.closeIcon.on(\"click\", function() {\n hideNode(node);\n }).on('mouseover', function(event) {\n actionsTip.show(event.currentTarget.getAttribute(\"name\"), event);\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function() {\n actionsTip.hide();\n removeIconsTimer = $timeout(function() {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.animateMenu(node);\n };\n\n this.animateMenu = function(node) {\n const animationDuration = 100;\n const easeEffect = d3.easeSin;\n let delay = 0;\n const dellayAddition = 35;\n let angle = 20; // angle of the first icon 0 is at 12 o'clock\n\n if (this.expandIcon) {\n this.expandIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n }\n\n if (this.collapseIcon) {\n this.collapseIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function() {\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n }\n\n this.copyURIIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function() {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n this.focusIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function() {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n\n this.closeIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function() {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n this.expandedState = true;\n };\n }\n\n function Loader() {\n this.state = false;\n\n this.setLoadingState = function(state) {\n this.state = state;\n };\n\n this.getLoadingState = function() {\n return this.state;\n };\n\n this.init = function(node, parentNode) {\n d3.select(parentNode).append(\"circle\")\n .attr(\"cx\", function() {\n return node.x;\n })\n .attr(\"cy\", function() {\n return node.y;\n })\n .attr(\"class\", \"loader-container\")\n .attr(\"r\", function() {\n return node.size;\n })\n .style(\"fill\", \"fff\")\n .style(\"opacity\", \"0.7\");\n\n d3.select(parentNode).append(\"image\")\n .attr(\"xlink:href\", \"js/angular/templates/loader/ot-loader.svg?v=3.3.2\")\n .attr(\"x\", function() {\n return node.x - node.size + 5;\n })\n .attr(\"y\", function() {\n return node.y - node.size;\n })\n .attr(\"width\", function() {\n return node.size * 2;\n })\n .attr(\"height\", function() {\n return node.size * 2;\n })\n .attr(\"class\", \"node-loader\");\n };\n }\n\n function showNodeInfo(d) {\n force.stop();\n // Assign value of node, which info panel has been opened\n $scope.openedNodeInfoPanel = d;\n $scope.showNodeInfo = true;\n $scope.showFilter = false;\n $scope.showPredicates = false;\n $scope.nodeLabels = d.labels;\n $scope.nodeTypes = d.types;\n $scope.rdfRank = d.rdfRank;\n $scope.nodeIri = d.iri;\n $scope.resourceType = d.isTriple ? 'triple' : 'uri';\n $scope.encodedIri = d.isTriple ? encodeURIComponent(createTriple(d.iri)) : encodeURIComponent(d.iri);\n $scope.showInfoPanel = true;\n\n $scope.rdfsLabel = d.labels[0].label;\n $scope.rdfsComment = d.comment;\n $scope.expanded = false;\n\n $scope.propertiesQueryObj.query = '';\n $scope.dataNodeKeysQuery = '';\n const settings = getSettings();\n GraphDataRestService.getProperties({\n iri: d.isTriple ? createTriple(d.iri) : d.iri,\n config: $scope.configLoaded.id,\n languages: !$scope.shouldShowSettings() ? [] : settings['languages'],\n includeInferred: settings['includeInferred'],\n sameAsState: settings['sameAsState'],\n rejectedPredicates: !$scope.shouldShowSettings() ? [] : settings['rejectedPredicates'],\n }).then(function(response) {\n $scope.data = _.mapKeys(response.data, function(value, key) {\n return $scope.replaceIRIWithPrefix(key);\n });\n $scope.propertiesObj.items = [];\n\n _.forEach($scope.data, function(value, key) {\n $scope.propertiesObj.items.push({key: key, value: value});\n });\n $scope.nodeImage = undefined;\n\n $scope.propertiesNotFiltered = $scope.propertiesObj.items;\n\n const imageVal = _.find($scope.propertiesObj.items, function(o) {\n return o.key === 'image';\n });\n if (imageVal) {\n $scope.nodeImage = imageVal['value'][0].v;\n }\n $scope.propertiesObj.items = _.reject($scope.propertiesObj.items, function(o) {\n return o.key === 'image';\n });\n $scope.propertiesNotFiltered = $scope.propertiesObj.items;\n }, function(response) {\n toastr.warning(getError(response.data), \"Error\");\n });\n }\n\n $scope.toggleSidePanel = function() {\n $scope.pageslideExpanded = !$scope.pageslideExpanded;\n };\n\n $scope.closeInfoPanel = function() {\n $scope.pageslideExpanded = false;\n $scope.openedNodeInfoPanel = undefined;\n $scope.predicates = [];\n openedLink = null;\n // o, angular, o, miracle\n $timeout(function() {\n $scope.showInfoPanel = false;\n });\n };\n\n function applyElementsStyleChanges(tripleNode) {\n updatePredicatesColor('predicate', 'var(--gw-primary-dark)', tripleNode);\n updatePredicatesColor('predicates', 'var(--gw-primary-dark)', tripleNode);\n\n const links = document.getElementsByClassName('link');\n if (links) {\n _.each(links, function(link) {\n const linkLink = link.__data__;\n if (linkLink.source.iri.indexOf(tripleNode.iri) >= 0 || linkLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n link.style.stroke = 'var(--gw-primary-dark)';\n link.style.strokeWidth = 4;\n }\n });\n }\n\n const markers = document.getElementsByClassName('arrow-marker');\n if (markers) {\n _.each(markers, function(marker) {\n const markerLink = marker.__data__;\n if (markerLink.source.iri.indexOf(tripleNode.iri) >= 0 || markerLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n marker.style.stroke = 'var(--gw-primary-dark)';\n if (!marker.__data__.target.isTriple) {\n marker.setAttribute(\"refX\", \"23\");\n }\n }\n });\n }\n }\n\n $scope.clickLink = function(predData) {\n if (graph.tripleNodes.has(predData.linkId)) {\n revertElementsStyleToDefault();\n const tripleNode = graph.tripleNodes.get(predData.linkId)[predData.nodeIndex];\n // Shows selected triple and its properties\n showNodeInfo(tripleNode);\n $scope.showPredicates = true;\n\n const clickedEl = document.getElementById(predData.linkId + predData.nodeIndex);\n if (clickedEl) {\n clickedEl.style.fontWeight = \"bold\";\n }\n\n const nodeCopy = {};\n const tripleLinksIt = graph.tripleLinksCopy.values();\n for (let i = 0; i < graph.tripleLinksCopy.size; i++) {\n const links = tripleLinksIt.next().value;\n if (links.length > 1) {\n links.every((link) => {\n if (link.source.iri === tripleNode.iri) {\n nodeCopy.iri = links[0].source.iri;\n if (link.target.isTriple) {\n nodeCopy.oppLinkIRI = convertTripleToLinkId(link.target.iri);\n nodeCopy.oppTriplePred = getShortPredicate(link.target.iri.split(' ')[1]);\n }\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n if (link.predicates.length === 1) {\n nodeCopy.linkPred = link.predicates[0];\n }\n return false;\n }\n if (link.target.iri === tripleNode.iri) {\n nodeCopy.iri = links[0].target.iri;\n if (link.source.isTriple) {\n nodeCopy.oppLinkIRI = convertTripleToLinkId(link.source.iri);\n nodeCopy.oppTriplePred = getShortPredicate(link.source.iri.split(' ')[1]);\n }\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n if (link.predicates.length === 1) {\n nodeCopy.linkPred = link.predicates[0];\n }\n return false;\n }\n return true;\n });\n }\n }\n\n if (!nodeCopy.iri) {\n nodeCopy.iri = tripleNode.iri;\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n }\n\n applyElementsStyleChanges(nodeCopy);\n }\n };\n\n function updatePredicatesColor(className, color, tripleNode) {\n const preds = document.getElementsByClassName(className);\n\n if (preds) {\n _.each(preds, function(pred) {\n const predLink = pred.__data__;\n if (tripleNode) {\n if (predLink.source.iri.indexOf(tripleNode.iri) >= 0 || predLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n pred.style.fill = color;\n }\n if (convertTripleToLinkId(tripleNode.iri) === convertLinkDataToLinkId(predLink)) {\n pred.textContent = tripleNode.pred;\n pred.style.fill = color;\n }\n if (tripleNode.oppLinkIRI && tripleNode.oppLinkIRI === convertLinkDataToLinkId(predLink)) {\n pred.textContent = tripleNode.oppTriplePred;\n pred.style.fill = color;\n }\n } else {\n pred.style.fill = color;\n pred.textContent = getPredicate(predLink);\n }\n });\n }\n }\n\n function revertElementsStyleToDefault() {\n _.each($scope.predicates, function(pred) {\n const currEl = document.getElementById(pred.linkId + pred.nodeIndex);\n if (currEl) {\n currEl.style.fontWeight = \"normal\";\n }\n });\n const links = document.getElementsByClassName('link');\n if (links) {\n _.each(links, function(link) {\n link.style.stroke = '#999';\n link.style.strokeWidth = 1;\n });\n }\n updatePredicatesColor('predicate', '');\n updatePredicatesColor('predicates', '');\n\n const markers = document.getElementsByClassName('arrow-marker');\n\n if (markers) {\n _.each(markers, function(marker) {\n marker.style.stroke = '#999';\n // RefX for triple targets isn't changed because they are not affected by increasing of stroke-width\n if (!marker.__data__.target.isTriple) {\n marker.setAttribute(\"refX\", \"59\");\n }\n });\n }\n }\n\n function linkActions(event, d) {\n revertElementsStyleToDefault();\n const linkId = convertLinkDataToLinkId(d);\n if (d.predicates.length === 1 && graph.tripleNodes.has(linkId)) {\n openedLink = null;\n const tripleNode = graph.tripleNodes.get(linkId)[0];\n // If there is a triple in this link, show its properties\n if (clickedNode(tripleNode, event.currentTarget, event.button)) {\n const nodeCopy = {};\n nodeCopy.iri = tripleNode.iri;\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n applyElementsStyleChanges(nodeCopy);\n }\n return;\n }\n openPredicates(d);\n }\n\n function openPredicates(d) {\n $scope.showNodeInfo = false;\n // open predicates sidebar if they are more than one\n $scope.showPredicates = d.predicates.length > 1;\n $scope.showFilter = false;\n $scope.showInfoPanel = false;\n\n if (openedLink === d) {\n $scope.showNodeInfo = false;\n $scope.showInfoPanel = false;\n openedLink = null;\n return;\n }\n\n openedLink = d;\n\n if ($scope.showPredicates) {\n $scope.predicates = _.map(d.predicates, function(p) {\n const foundNodeIndex = getTripleNodeIndex(p, d);\n const isPartOfTriple = foundNodeIndex > -1;\n return {\n value: getShortPredicate(p),\n partOfTriple: isPartOfTriple,\n linkId: isPartOfTriple ? convertLinkDataToLinkId(d) : '',\n nodeIndex: foundNodeIndex,\n };\n });\n $scope.showInfoPanel = true;\n }\n }\n\n function getTripleNode(triple) {\n const linkId = convertTripleToLinkId(triple);\n if (graph.tripleNodes.has(linkId)) {\n return graph.tripleNodes.get(linkId).find((el) => el.iri === triple);\n }\n }\n\n function getTripleNodeIndex(pred, d) {\n const linkId = convertLinkDataToLinkId(d);\n if (graph.tripleNodes.has(linkId)) {\n return graph.tripleNodes.get(linkId).findIndex((el) => el.iri.indexOf(pred) >= 0);\n } else {\n return -1;\n }\n }\n\n // get each predicate and check if there are more than one for same source and target\n function getPredicate(d) {\n if (d.predicates.length > 1) {\n return d.predicates.length + \" predicates\";\n }\n return getShortPredicate(d.predicates[0]);\n }\n\n function getShortPredicate(p) {\n const shortIRI = $scope.replaceIRIWithPrefix(p);\n if (shortIRI.length === p.length) {\n return p.split('/')[p.split('/').length - 1];\n } else {\n return shortIRI;\n }\n }\n\n // calculate predicate text length so we can have dynamic link lengths\n function getPredicateTextLength(link) {\n const span = $('<span></span>');\n const splitedLink = link.predicates[0].split('/');\n const predicateText = splitedLink[splitedLink.length - 1];\n span.addClass('predicate-text').text(predicateText);\n $('body').append(span);\n const textLength = span.width() + link.source.size * 2 + link.target.size * 2 + 50;\n span.remove();\n return textLength * 0.75;\n }\n\n $scope.splitPredicate = function(predicate) {\n return predicate.split('/')[predicate.split('/').length - 1];\n };\n\n $scope.getActiveRepository = function() {\n return $repositories.getActiveRepository();\n };\n\n $scope.isLoadingLocation = function() {\n return $repositories.isLoadingLocation();\n };\n\n $scope.hasActiveLocation = function() {\n return $repositories.hasActiveLocation();\n };\n\n $scope.rotate = function(isLeft) {\n removeMenuIfVisible();\n\n // compute common rotation math such as the angle, its sine and cosine and the pivot point\n const theta = (isLeft ? 1 : -1) * 10 * Math.PI / 180; // + rotates left, - rotates right\n const cos = Math.cos(theta);\n const sin = Math.sin(theta);\n const pivotX = width / 2; // i.e. centre of viewport\n const pivotY = height / 2;\n\n // rotates each node around the pivot\n d3.selectAll(\".node-wrapper\")\n .each(function(d) {\n d.x = pivotX + (cos * (d.x - pivotX) + sin * (d.y - pivotY));\n d.y = pivotY + (-sin * (d.x - pivotX) + cos * (d.y - pivotY));\n if (d.fixed) {\n // Fixed nodes need their px and py updated too\n d.fx = d.x;\n d.fy = d.y;\n }\n });\n\n force.alpha(1).restart();\n };\n\n $scope.openUri = function(uri, noHistory) {\n if (!noHistory) {\n const searchParams = {};\n if ($scope.configLoaded.id !== $scope.defaultGraphConfig.id) {\n searchParams.config = $scope.configLoaded.id;\n }\n searchParams.uri = uri;\n searchParams[REPOSITORY_ID_PARAM] = repositoryContextService.getSelectedRepository().id;\n pushHistory(searchParams, {uri: uri, config: $scope.configLoaded});\n }\n $scope.$broadcast(\"onRootNodeChange\", uri);\n };\n\n function saveGraphHttp(graph) {\n if ($scope.configLoaded) {\n graph.config = $scope.configLoaded.id;\n }\n SavedGraphsRestService.addNewSavedGraph(graph)\n .success(function(data, status, headers) {\n $scope.lastSavedGraphName = graph.name;\n $scope.lastSavedGraphId = headers()['x-saved-graph-id'];\n $scope.shared = graph.shared;\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph', {name: graph.name}));\n })\n .error(function(data, status) {\n if (status === 422) {\n $scope.saveGraphModal('new', graph, true);\n } else {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.create.graph'));\n }\n });\n }\n\n $scope.saveOrUpdateGraph = function() {\n const data = JSON.stringify(graph.copyState());\n const graphToSave = {\n id: $scope.lastSavedGraphId,\n name: $scope.lastSavedGraphName,\n data: data,\n shared: $scope.shared,\n repositoryId: repositoryContextService.getSelectedRepository().id,\n };\n\n if (graphToSave.id) {\n $scope.saveGraphModal('update', graphToSave);\n } else {\n $scope.saveGraphModal('new', graphToSave);\n }\n };\n\n $scope.renameSavedGraph = function(graphToRename) {\n // By not sending the 'data' part of a graph we only change the name\n $scope.saveGraphModal('rename', {\n id: graphToRename.id,\n name: graphToRename.name,\n config: graphToRename.config,\n shared: graphToRename.shared,\n });\n };\n\n const editSavedGraphHttp = function(savedGraph) {\n SavedGraphsRestService.editSavedGraph(savedGraph)\n .success(function() {\n $scope.lastSavedGraphName = savedGraph.name;\n $scope.shared = savedGraph.shared;\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph.was.edited', {name: savedGraph.name}));\n })\n .error(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.edit'));\n });\n };\n\n $scope.saveGraphModal = function(mode, graphToSave, graphExists) {\n const modalInstance = $uibModal.open({\n templateUrl: 'js/angular/graphexplore/templates/modal/save-graph.html',\n controller: 'SaveGraphModalCtrl',\n resolve: {\n data: function() {\n return {\n mode: mode,\n graph: graphToSave,\n graphExists: graphExists,\n shared: graphToSave.shared,\n };\n },\n },\n });\n openModalCount++;\n modalIsOpen = true;\n\n modalInstance.result.then(function(data) {\n if (data.restart) {\n $scope.saveGraphModal(data.mode, data.graph, false);\n return;\n }\n switch (data.mode) {\n case 'new':\n saveGraphHttp(data.graph);\n break;\n case 'update':\n editSavedGraphHttp(data.graph);\n break;\n case 'rename':\n editSavedGraphHttp(data.graph);\n break;\n }\n }).finally(() => {\n openModalCount--;\n // Ensure that all modals are closed before resetting the flag\n if (openModalCount <= 0) {\n modalIsOpen = false;\n openModalCount = 0;\n }\n });\n };\n\n $scope.refreshSavedGraphs = function() {\n SavedGraphsRestService.getSavedGraphs()\n .success(function(data) {\n $scope.savedGraphs = data;\n })\n .error(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.getting.saved.graphs'));\n });\n };\n\n $scope.loadSavedGraph = function(graphToLoad, noHistory) {\n if (graphToLoad.owner) {\n // Own saved graph\n $scope.lastSavedGraphName = graphToLoad.name;\n $scope.lastSavedGraphId = graphToLoad.id;\n $scope.shared = graphToLoad.shared;\n $scope.configLoaded = $scope.findConfigById(graphToLoad.config);\n } else {\n // Someone else's saved graph\n $scope.lastSavedGraphName = null;\n $scope.lastSavedGraphId = null;\n $scope.shared = graphToLoad.shared;\n }\n\n if (!$scope.configLoaded) {\n // Fallback to default config, either because config is gone or because graph isn't owned\n $scope.configLoaded = $scope.defaultGraphConfig;\n }\n\n // Preserve existing query params and only set/override `saved`\n const currentSearch = $location.search();\n const newSearch = {\n ...currentSearch,\n saved: graphToLoad.id,\n [REPOSITORY_ID_PARAM]: repositoryContextService.getSelectedRepository().id,\n };\n graph.restoreState(JSON.parse(graphToLoad.data));\n if (!noHistory) {\n pushHistory(newSearch, {savedGraph: graphToLoad});\n }\n };\n\n $scope.copyToClipboardSavedGraph = function(savedGraph) {\n const url = new URL(window.location.href);\n url.searchParams.set('saved', savedGraph.id);\n url.searchParams.set(REPOSITORY_ID_PARAM, repositoryContextService.getSelectedRepository().id);\n $scope.copyToClipboard(url.toString());\n };\n\n function deleteSavedGraphHttp(savedGraph) {\n SavedGraphsRestService.deleteSavedGraph(savedGraph)\n .success(function() {\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph.was.deleted', {name: savedGraph.name}));\n })\n .error(function(data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.delete'));\n });\n }\n\n $scope.deleteSavedGraph = function(savedGraph) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('graphexplore.confirm.delete.graph', {graphName: savedGraph.name}),\n warning: true,\n }).result\n .then(function() {\n deleteSavedGraphHttp(savedGraph);\n });\n };\n\n $scope.openIRI = function(link, event) {\n if (event.shiftKey) {\n $scope.$broadcast(\"onRootNodeChange\", link);\n } else {\n window.open(link, '_blank');\n }\n return false;\n };\n\n $scope.togglePinAllNodes = function() {\n removeMenuIfVisible();\n\n const value = angular.isUndefined($scope.numberOfPinnedNodes) || $scope.numberOfPinnedNodes <= 0;\n\n $scope.numberOfPinnedNodes = 0;\n d3.selectAll('.node').each(function(d) {\n d.fixed = value;\n if (value) {\n $scope.numberOfPinnedNodes++;\n d.fx = d.x;\n d.fy = d.y;\n } else {\n d.fx = null;\n d.fy = null;\n }\n });\n\n force.alpha(1).restart();\n };\n\n // event for capturing left and right arrows used for rotation\n $('body').on(\"keydown\", function(event) {\n if (GuidesService.isActive() || event.target.nodeName === 'input' || !$scope.nodeSelected) {\n // don't do anything when the target is an input field or no node is selected or a guide is active.\n return;\n }\n\n if (event.keyCode === 37) {\n // left arrow rotates left\n $scope.rotate(true);\n } else if (event.keyCode === 39) {\n // right arrow rotates right\n $scope.rotate(false);\n }\n });\n\n $scope.getLiteralFromPropValue = function(value) {\n return value.substring(value.indexOf(':') + 1);\n };\n\n let backgroundRectCreated = false;\n\n // initialization logic follows below\n const init = () => {\n // create background rect once\n if (!backgroundRectCreated) {\n // building rectangular so we can bind zoom and drag effects\n svg.append(\"rect\")\n .attr(\"width\", width * 10)\n .attr(\"height\", height * 10)\n .attr(\"x\", -(width * 10 - width) / 2)\n .attr(\"y\", -(height * 10 - height) / 2)\n .style(\"fill\", \"none\")\n .style(\"pointer-events\", \"all\")\n .call(zoomLayout)\n .on(\"click\", function(event) {\n event.stopPropagation();\n removeMenuIfVisible();\n // Clicking outside the graph stops the layout\n force.stop();\n });\n const wheelHandler = (event) => {\n // Safari intercepts wheel events before D3's zoom handler, preventing scroll-based zooming.\n // Suppressing the default behavior on the svg ensures D3 receives and processes the event correctly.\n event.preventDefault();\n };\n svg.node().addEventListener('wheel', wheelHandler, {passive: false});\n subscriptions.push(() => svg.node().removeEventListener('wheel', wheelHandler));\n backgroundRectCreated = true;\n }\n const principal = securityContextService.getAuthenticatedUser();\n initSettings(principal);\n initForRepository();\n };\n init();\n}\n\nSaveGraphModalCtrl.$inject = ['$scope', '$uibModalInstance', 'data', '$translate'];\n\nfunction SaveGraphModalCtrl($scope, $uibModalInstance, data, $translate) {\n $scope.mode = data.mode;\n $scope.graph = _.cloneDeep(data.graph);\n $scope.graphExists = data.graphExists;\n\n switch ($scope.mode) {\n case 'new':\n $scope.title = $translate.instant('graphexplore.create.new.graph');\n $scope.okButtonText = $translate.instant('common.create.btn');\n break;\n case 'update':\n $scope.title = $translate.instant('graphexplore.update');\n $scope.okButtonText = $translate.instant('common.save.btn');\n break;\n case 'rename':\n $scope.title = $translate.instant('graphexplore.rename');\n $scope.okButtonText = $translate.instant('common.save.btn');\n }\n\n $scope.ok = function() {\n if ($scope.form.$valid) {\n $scope.graph.name = normalizeString($scope.graph.name);\n $uibModalInstance.close({graph: $scope.graph, mode: $scope.mode});\n }\n };\n\n $scope.saveNew = function() {\n $scope.graph.name = normalizeString($scope.graph.name) + ' (new)';\n $uibModalInstance.close({graph: $scope.graph, mode: 'new', restart: true});\n };\n\n $scope.cancel = function() {\n $uibModalInstance.dismiss('cancel');\n };\n\n const normalizeString = (text) => {\n return text.replace(/\\s+/g, ' ').trim();\n };\n}\n","define(['d3'],\n function(d3) {\n (function() {\n\n // Node/CommonJS - require D3\n if (typeof (module) !== 'undefined' && typeof (exports) !== 'undefined' && typeof (d3) == 'undefined') {\n d3 = require('d3');\n }\n })();\n\n function attrsFunction(selection, map) {\n return selection.each(function () {\n var x = map.apply(this, arguments), s = select(this);\n for (var name in x) s.attr(name, x[name]);\n });\n }\n\n function attrsObject(selection, map) {\n for (var name in map) selection.attr(name, map[name]);\n return selection;\n }\n\n function selection_attrs(map) {\n return (typeof map === \"function\" ? attrsFunction : attrsObject)(this, map);\n }\n\n d3.selection.prototype.attrs = selection_attrs\n\n d3.selection.prototype.moveToFront = function () {\n return this.each(function () {\n d3.select(this.parentNode.appendChild(this));\n });\n };\n\n d3.selection.prototype.moveToBack = function () {\n return this.each(function () {\n const firstChild = this.parentNode.firstChild;\n if (firstChild) {\n this.parentNode.insertBefore(this, firstChild);\n }\n });\n };\n\n return d3;\n });\n","import {selection, select} from 'd3';\n\nconst d3 = {\n select,\n selection\n}\n\n// d3.tip\n// Copyright (c) 2013 Justin Palmer\n//\n// Tooltips for d3.js SVG visualizations\n\n// Public - contructs a new tooltip\n//\n// Returns a tip\nvar d3tip = function () {\n var direction = d3_tip_direction,\n offset = d3_tip_offset,\n html = d3_tip_html,\n node = initNode(),\n svg = null,\n point = null,\n target = null,\n customPosition = null\n\n function tip(vis) {\n svg = getSVGNode(vis)\n point = svg.createSVGPoint()\n document.body.appendChild(node)\n }\n\n // Public - show the tooltip on the screen\n //\n // Returns a tip\n tip.show = function () {\n var args = Array.prototype.slice.call(arguments)\n if (args[args.length - 1] instanceof SVGElement) target = args.pop()\n\n var content = html.apply(this, args),\n poffset = offset.apply(this, args),\n dir = direction.apply(this, args),\n nodel = getNodeEl(),\n i = directions.length,\n coords,\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft,\n customPos = customPosition.apply(this, args)\n\n nodel.html(content)\n .style('opacity', 1)\n .style('pointer-events', 'all')\n\n while (i--) nodel.classed(directions[i], false)\n const event = args.filter((arg) => arg instanceof Event);\n coords = direction_callbacks.get(dir).apply(this, event)\n\n if (customPos) {\n Object.keys(customPos).forEach(function (key) {\n nodel.style(key, customPos[key]);\n })\n } else {\n nodel.classed(dir, true)\n .style(\"top\", (coords.top + poffset[0]) + scrollTop + 'px')\n .style(\"left\", (coords.left + poffset[1]) + scrollLeft + 'px')\n }\n\n return tip\n }\n\n // Public - hide the tooltip\n //\n // Returns a tip\n tip.hide = function () {\n var nodel = getNodeEl()\n nodel\n .style('opacity', 0)\n .style('pointer-events', 'none')\n\n return tip\n }\n\n // Public: Proxy attr calls to the d3 tip container. Sets or gets attribute value.\n //\n // n - name of the attribute\n // v - value of the attribute\n //\n // Returns tip or attribute value\n tip.attr = function (n, v) {\n if (arguments.length < 2 && typeof n === 'string') {\n return getNodeEl().attr(n)\n } else {\n var args = Array.prototype.slice.call(arguments)\n d3.selection.prototype.attr.apply(getNodeEl(), args)\n }\n\n return tip\n }\n\n // Public: Proxy style calls to the d3 tip container. Sets or gets a style value.\n //\n // n - name of the property\n // v - value of the property\n //\n // Returns tip or style property value\n tip.style = function (n, v) {\n if (arguments.length < 2 && typeof n === 'string') {\n return getNodeEl().style(n)\n } else {\n var args = Array.prototype.slice.call(arguments)\n d3.selection.prototype.style.apply(getNodeEl(), args)\n }\n\n return tip\n }\n\n // Public: Set or get the direction of the tooltip\n //\n // v - One of n(north), s(south), e(east), or w(west), nw(northwest),\n // sw(southwest), ne(northeast) or se(southeast)\n //\n // Returns tip or direction\n tip.direction = function (v) {\n if (!arguments.length) return direction\n direction = v == null ? v : d3_functor(v)\n\n return tip\n }\n\n // Public: Sets or gets the offset of the tip\n //\n // v - Array of [x, y] offset\n //\n // Returns offset or\n tip.offset = function (v) {\n if (!arguments.length) return offset\n offset = v == null ? v : d3_functor(v)\n\n return tip\n }\n\n // Public: sets or gets the html value of the tooltip\n //\n // v - String value of the tip\n //\n // Returns html value or tip\n tip.html = function (v) {\n if (!arguments.length) return html\n html = v == null ? v : d3_functor(v)\n\n return tip\n }\n\n tip.customPosition = function (v) {\n if (!arguments.length) return customPosition\n customPosition = v == null ? v : d3_functor(v)\n\n return tip\n }\n\n // Public: destroys the tooltip and removes it from the DOM\n //\n // Returns a tip\n tip.destroy = function () {\n if (node) {\n getNodeEl().remove();\n node = null;\n }\n return tip;\n }\n\n function d3_tip_direction() {\n return 'n'\n }\n\n function d3_tip_offset() {\n return [0, 0]\n }\n\n function d3_tip_html() {\n return ' '\n }\n\n var direction_callbacks = new Map(Object.entries({\n n: direction_n,\n s: direction_s,\n e: direction_e,\n w: direction_w,\n nw: direction_nw,\n ne: direction_ne,\n sw: direction_sw,\n se: direction_se\n })),\n directions = direction_callbacks.keys()\n\n function direction_n(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.n.y - node.offsetHeight,\n left: bbox.n.x - node.offsetWidth / 2\n }\n }\n\n function direction_s(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.s.y,\n left: bbox.s.x - node.offsetWidth / 2\n }\n }\n\n function direction_e(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.e.y - node.offsetHeight / 2,\n left: bbox.e.x\n }\n }\n\n function direction_w(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.w.y - node.offsetHeight / 2,\n left: bbox.w.x - node.offsetWidth\n }\n }\n\n function direction_nw(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.nw.y - node.offsetHeight,\n left: bbox.nw.x - node.offsetWidth\n }\n }\n\n function direction_ne(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.ne.y - node.offsetHeight,\n left: bbox.ne.x\n }\n }\n\n function direction_sw(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.sw.y,\n left: bbox.sw.x - node.offsetWidth\n }\n }\n\n function direction_se(event) {\n var bbox = getScreenBBox(event)\n return {\n top: bbox.se.y,\n left: bbox.e.x\n }\n }\n\n function initNode() {\n var node = d3.select(document.createElement('div'))\n node.style(\"position\", 'absolute')\n .style(\"top\", 0)\n .style(\"opacity\", 0)\n .style(\"pointer-events\", 'none')\n .style(\"box-sizing\", 'border-box');\n\n return node.node()\n }\n\n function getSVGNode(el) {\n el = el.node()\n if (el.tagName.toLowerCase() === 'svg')\n return el\n\n return el.ownerSVGElement\n }\n\n function getNodeEl() {\n if (node === null) {\n node = initNode();\n // re-add node to DOM\n document.body.appendChild(node);\n }\n ;\n return d3.select(node);\n }\n\n // Private - gets the screen coordinates of a shape\n //\n // Given a shape on the screen, will return an SVGPoint for the directions\n // n(north), s(south), e(east), w(west), ne(northeast), se(southeast), nw(northwest),\n // sw(southwest).\n //\n // +-+-+\n // | |\n // + +\n // | |\n // +-+-+\n //\n // Returns an Object {n, s, e, w, nw, sw, ne, se}\n function getScreenBBox(event) {\n var targetel = target || event.target;\n\n while ('undefined' === typeof targetel.getScreenCTM && 'undefined' === targetel.parentNode) {\n targetel = targetel.parentNode;\n }\n\n var bbox = {},\n matrix = targetel.getScreenCTM(),\n tbbox = targetel.getBBox(),\n width = tbbox.width,\n height = tbbox.height,\n x = tbbox.x,\n y = tbbox.y\n\n point.x = x\n point.y = y\n bbox.nw = point.matrixTransform(matrix)\n point.x += width\n bbox.ne = point.matrixTransform(matrix)\n point.y += height\n bbox.se = point.matrixTransform(matrix)\n point.x -= width\n bbox.sw = point.matrixTransform(matrix)\n point.y -= height / 2\n bbox.w = point.matrixTransform(matrix)\n point.x += width\n bbox.e = point.matrixTransform(matrix)\n point.x -= width / 2\n point.y -= height / 2\n bbox.n = point.matrixTransform(matrix)\n point.y += height\n bbox.s = point.matrixTransform(matrix)\n\n return bbox\n }\n\n function d3_functor(v) {\n return typeof v === \"function\" ? v : function() { return v; };\n }\n\n return tip\n};\nexport default d3tip;\n","import {upperFirst} from \"lodash\";\n\n/**\n * Removes brackets and serial commas from IRIs\n * when used to create ids for links and markers,\n * because elements with ids that contain such\n * are not valid XHTML and cause a host problems\n * when trying to style individual elements\n * @param {string} string The string to be processed.\n * @return {string} A string where the special characters are removed.\n */\nconst removeSpecialChars = (string) => {\n return string.replace(/[()']/g, \"\");\n};\n\nconst toBoolean = (value) => {\n if (typeof value === 'string') {\n return value === 'true';\n }\n return Boolean(value);\n};\n\nconst toTitleCase = (text) => {\n if (!text) {\n return text;\n }\n return upperFirst(text.toLowerCase());\n};\n\nexport {\n removeSpecialChars,\n toBoolean,\n toTitleCase\n};\n\n"],"names":["STATIC_RULESETS","id","name","REPOSITORY_TYPES","graphdbRepo","free","eeWorker","eeMaster","ontop","se","fedx","FILENAME_PATTERN","RegExp","NUMBER_PATTERN","d3","dispatch","pointer","D3","Text","calcFontSizeRaw","text","radius","minimumSize","isMultiline","textSize","substring","length","match","Math","round","calcFontSize","getTextWithElipsisIfNeeded","str","threshold","Transition","fadeIn","sel","duration","style","transition","fadeOut","Click","d3_rebind","target","source","method","value","apply","arguments","delayDblClick","dispatchedEvent","i","n","rebind","selection","down","wait","on","document","body","Date","event","d","e","a","b","sqrt","pow","window","clearTimeout","call","setTimeout","GraphsVisualizationsCtrl","$scope","$rootScope","$repositories","toastr","$timeout","ClassInstanceDetailsService","$q","$location","$jwtAuth","UiScrollService","ModalService","$uibModal","$window","LocalStorageAdapter","LSKeys","SavedGraphsRestService","GraphConfigRestService","GraphDataRestService","$translate","GuidesService","WorkbenchContextService","RDF4JRepositoriesService","securityContextService","service","SecurityContextService","repositoryContextService","RepositoryContextService","languageChanged","propertiesObj","items","propertiesQueryObj","query","propertiesSearchPlaceholder","instant","propertiesNotFiltered","searchVisible","nodeSelected","queryResultsMode","embedded","search","openedNodeInfoPanel","undefined","invalidLimit","INVALID_LINKS_MSG","INVALID_LINKS_TOOLTIP","datasource","adapterContainer","adapter","remain","hasInitedRepository","defaultSettings","linksLimit","includeInferred","sameAsState","truncateNodeLabels","languages","showLinksText","preferredTypes","rejectedTypes","preferredPredicates","rejectedPredicates","preferredTypesOnly","preferredPredicatesOnly","includeSchema","saveSettings","_","cloneDeep","defaultGraphConfig","startMode","key","onopen","onclose","angular","noop","goToHome","resetState","config","searchParams","path","shouldShowSettings","configLoaded","shouldDisableSameAs","sameAsCheckbox","$","settings","prop","propertiesFilterFunc","item","toLowerCase","indexOf","toggleMoreInfo","ev","element","currentTarget","parent","next","toggle","children","toggleClass","copyToClipboard","uri","openCopyToClipboardModal","resetSettings","validateLinksLimit","renderSettings","changeLimit","delta","test","showSettings","showInfoPanel","showFilter","showNodeInfo","showPredicates","updateSettings","error","map","s","t","rootNodeIri","reExpandNode","loadGraphForQuery","sameAs","inference","loadGraphConfig","updatePredicateLabels","set","GRAPHS_VIZ","getGraphConfigs","graphCallback","success","data","graphConfigs","getError","findConfigById","configId","grep","easyGraphSearch","iri","openUri","deleteConfig","openSimpleModal","title","message","configName","warning","result","then","deleteGraphConfig","refreshSavedGraphs","goToGraphConfig","REPOSITORY_ID_PARAM","getSelectedRepository","pushHistory","replaceIRIWithPrefix","namespaces","namespacePrefix","findLast","o","prefix","subscriptions","push","$on","onAutocompleteEnabledUpdated","autocompleteEnabled","isAutocompleteEnabled","onSelectedRepositoryChanged","repository","getNamespaces","repositoryNamespaces","catch","msg","NamespacesListModel","args","payload","newRepo","initForRepository","empty","initGraphFromQueryParam","$watch","rootScopeGenericWatcher","rootScopeGenericChangeHandler","position","each","current","propertiesItemsChangeHandler","isDefined","reload","modalIsOpen","openModalCount","handleKeyDown","stopPropagation","addEventListener","destroyHandler","forEach","subscription","removeEventListener","onpopstate","state","skipOnPopState","lastSavedGraphName","lastSavedGraphId","shared","numberOfPinnedNodes","type2color","colorIndex","getSettings","isActive","languagesMap","v","preferredTypesMap","rejectedTypesMap","preferredPredicatesMap","rejectedPredicatesMap","$broadcast","inputValue","loading","getInstanceNode","response","types","graph","Graph","rootNode","addNode","width","height","transformValues","INITIAL_CONTAINER_TRANSFORM","expandNode","err","saved","getSavedGraph","loadSavedGraph","queryString","sameAsParam","inferredParam","sendSameAs","sendInferred","updateGraph","initGraphFromResponse","convertTripleToLinkId","triple","tripleLike","tripleParts","split","join","convertLinkDataToLinkId","link","getNodeX","node","isTriple","el","getElementById","removeSpecialChars","__data__","x","getNodeY","y","createTriple","trim","createArrowMarkerUniqueID","distinctBy","array","keys","filter","index","startIRI","startGraphQuery","loadGraphForConfig","startQueryIncludeInferred","startQuerySameAs","loadGraphFromQueryParam","loadConfigForId","successCallback","getConfig","savedGraph","noGoHome","nodeLabelMinFontSize","zoomLayout","scaleExtent","container","translate","scale","transform","attr","tipElement","openedLink","this","nodes","links","tripleNodes","Map","tripleLinksCopy","computeConnectedness","counts","seenLinks","i1","i2","seenKey","min","max","connectedness","addAndMatchLinks","newLinks","Array","prototype","isTripleSource","getTripleNode","find","isTripleTarget","matchedLink","predicates","linkId","has","get","matchLinksToNodes","delete","countLinks","findLinksForNode","l","linksTypes","linksForNode","uniq","flatten","linksPredicates","removeTriples","triplesToRemove","targetTriples","size","reject","sourceSplit","lSource","lTarget","targetSplit","isRejected","removeNode","removeNodeLeafLinks","targetLinks","addTriple","weight","copyState","nodesCopy","labels","rdfRank","fixed","triplesCopy","JSON","stringify","from","entries","restoreState","parse","k","draw","count","initLazyList","revision","getActiveRepository","addedTag","tag","uriParts","uriPart","localName","isUndefined","expandedUri","getNamespaceUriForPrefix","expandPrefix","pageslideExpanded","validateTag","category","wildcardOK","wildcardPos","getTagClass","tagText","endsWith","isLicenseValid","LicenseContextService","getLicenseSnapshot","valid","multiClickDelay","nodeLabelRectScaleX","color1","domain","range","interpolate","color2","getColor","type","forceX","strength","forceY","force","svg","append","showNodeTipAndIconsTimer","removeIconsTimer","loader","setLoadingState","getLoadingState","init","parentNode","resetRootNode","remove","tip","d3tip","customPosition","bbox","getBoundingClientRect","top","bottom","left","html","createTipText","p","getShortPredicate","numOfPredLeft","numberOfPredLeft","textToShow","tipPredicateElement","tipPredicateTimer","tipPredicates","textWidth","ctx","createElement","getContext","font","measureText","calculateWidth","tipTimer","hideTipForNode","cancel","hide","removeMenuIfVisible","selectAll","collisionForce","chargeForce","centerForce","distance","span","splitedLink","predicateText","addClass","textLength","getPredicateTextLength","enter","predicate","getPredicate","thisPredicateTipElement","show","showPredicateToolTip","revertElementsStyleToDefault","tripleNode","clickedNode","button","nodeCopy","pred","applyElementsStyleChanges","foundNodeIndex","findIndex","getTripleNodeIndex","isPartOfTriple","partOfTriple","nodeIndex","openPredicates","linkActions","touchHoldEventTimer","moveEventCount","singleClickTimer","clickTarget","expandEventHandler","isArray","info","closeInfoPanel","showPinAnimation","startSize","endSize","startOpacity","endOpacity","animate","pin","innerD","classed","drag","subject","sourceEvent","fixedBeforeDrag","isBeingDragged","beginDragging","alphaTarget","restart","fx","fy","pinWasFixed","menuEvents","closeIcon","expandIcon","focusIcon","copyURIIcon","removeIcons","alpha","initIcons","stop","updateAlphaInScope","expandNodeIcons","thisTipElement","showTipForNode","hideNode","touchStartEventHandler","shiftKey","preventDefault","updateTipForNode","srcElement","overflow","nodeLabels","insert","fontSize","label","HtmlUtil","getText","replaceAll","updateNodeLabels","sourceX","targetX","sourceY","targetY","linkedNodes","direction","p1","p2","atan2","PI","angleDeg","abs","findAngleBetweenNodes","select","sourceId","targetId","twoWayLinkID","textNode","createTextNode","lastChild","appendChild","d3alpha","getPositionAndAngle","angle","cos","sin","collapseIcon","actionsTip","expandedState","right","isExpanded","getAttribute","animateMenu","animationDuration","easeEffect","delay","ease","ctrlKey","metaKey","initGraph","renderGraphFromResponse","isStartNode","linksFound","newLink","existingLink","linksCopy","tripleLinksIt","values","nodesFromLinks","union","existingNodes","Boolean","tripleNodesIt","newNodes","some","connectionsCount","promises","newNodesData","newNode","res","all","newNodeData","theta","expandIri","getInstanceNodeLinks","nodeTypes","nodeIri","resourceType","encodedIri","encodeURIComponent","rdfsLabel","rdfsComment","comment","expanded","dataNodeKeysQuery","getProperties","mapKeys","nodeImage","imageVal","updatePredicatesColor","getElementsByClassName","linkLink","stroke","strokeWidth","markers","marker","markerLink","setAttribute","className","color","preds","predLink","fill","textContent","oppLinkIRI","oppTriplePred","currEl","fontWeight","shortIRI","toggleSidePanel","clickLink","predData","clickedEl","every","linkPred","splitPredicate","isLoadingLocation","hasActiveLocation","rotate","isLeft","pivotX","pivotY","noHistory","saveOrUpdateGraph","graphToSave","repositoryId","saveGraphModal","renameSavedGraph","graphToRename","mode","graphExists","modalInstance","open","templateUrl","controller","resolve","addNewSavedGraph","status","headers","saveGraphHttp","editSavedGraph","finally","getSavedGraphs","savedGraphs","graphToLoad","owner","newSearch","copyToClipboardSavedGraph","url","URL","location","href","toString","deleteSavedGraph","graphName","deleteSavedGraphHttp","openIRI","togglePinAllNodes","nodeName","keyCode","getLiteralFromPropValue","backgroundRectCreated","wheelHandler","passive","principal","settingsFromPrincipal","appSettings","localStorageSettings","unique","initSettings","getAuthenticatedUser","SaveGraphModalCtrl","$uibModalInstance","okButtonText","ok","form","$valid","normalizeString","close","saveNew","dismiss","replace","module","$uibTooltipProvider","options","appendToBody","$inject","define","attrsFunction","attrsObject","require","attrs","moveToFront","moveToBack","firstChild","insertBefore","offset","initNode","point","vis","tagName","ownerSVGElement","createSVGPoint","slice","SVGElement","pop","coords","content","poffset","dir","nodel","getNodeEl","directions","scrollTop","documentElement","scrollLeft","customPos","arg","Event","direction_callbacks","Object","d3_functor","destroy","getScreenBBox","offsetHeight","offsetWidth","w","nw","ne","sw","targetel","getScreenCTM","matrix","tbbox","getBBox","matrixTransform","string","toBoolean","toTitleCase","upperFirst"],"ignoreList":[],"sourceRoot":""}
|