graphdb-workbench 3.4.0-TR3 → 3.4.0-TR5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/dist/19057.a52dd7b0e356e884a792.bundle.js +3 -0
  2. package/dist/19057.a52dd7b0e356e884a792.bundle.js.map +1 -0
  3. package/dist/23236.1490d29a6e40f437885b.bundle.js +2 -0
  4. package/dist/23236.1490d29a6e40f437885b.bundle.js.map +1 -0
  5. package/dist/24125.0fd6b7797f2630fe59c6.bundle.js +2 -0
  6. package/dist/24125.0fd6b7797f2630fe59c6.bundle.js.map +1 -0
  7. package/dist/24690.79fd696f08f3ebbb1c6f.bundle.js +2 -0
  8. package/dist/24690.79fd696f08f3ebbb1c6f.bundle.js.map +1 -0
  9. package/dist/{3395.8452312923e6a77d2ffd.bundle.js → 3395.8dfba5922c8aad6d860c.bundle.js} +2 -2
  10. package/dist/3395.8dfba5922c8aad6d860c.bundle.js.map +1 -0
  11. package/dist/34985.8ef74b317fc8bff7e8e1.bundle.js +2 -0
  12. package/dist/34985.8ef74b317fc8bff7e8e1.bundle.js.map +1 -0
  13. package/dist/50244.69475a004173b61902a8.bundle.js +2 -0
  14. package/dist/50244.69475a004173b61902a8.bundle.js.map +1 -0
  15. package/dist/60447.4fd8b4ce9b95b98deade.bundle.js +2 -0
  16. package/dist/60447.4fd8b4ce9b95b98deade.bundle.js.map +1 -0
  17. package/dist/63842.68a1c5451a236b8ede97.bundle.js +2 -0
  18. package/dist/63842.68a1c5451a236b8ede97.bundle.js.map +1 -0
  19. package/dist/{64709.9f6594f730a4b54d6fc9.bundle.js → 64709.93e616541b4b18e88892.bundle.js} +2 -2
  20. package/dist/{64709.9f6594f730a4b54d6fc9.bundle.js.map → 64709.93e616541b4b18e88892.bundle.js.map} +1 -1
  21. package/dist/{65677.038185dcd07233e07f52.bundle.js → 65677.77bf484a0da0eec48f0b.bundle.js} +2 -2
  22. package/dist/{65677.038185dcd07233e07f52.bundle.js.map → 65677.77bf484a0da0eec48f0b.bundle.js.map} +1 -1
  23. package/dist/66574.cae68c94f87ba873b322.bundle.js +2 -0
  24. package/dist/66574.cae68c94f87ba873b322.bundle.js.map +1 -0
  25. package/dist/{80933.ef5e85af9b19067ee89b.bundle.js → 80933.ddbcb2688f7d93009c04.bundle.js} +2 -2
  26. package/dist/{80933.ef5e85af9b19067ee89b.bundle.js.map → 80933.ddbcb2688f7d93009c04.bundle.js.map} +1 -1
  27. package/dist/{82917.e537e5e649be4a5a0e20.bundle.js → 82917.e234e043395ff0b7d48f.bundle.js} +2 -2
  28. package/dist/82917.e234e043395ff0b7d48f.bundle.js.map +1 -0
  29. package/dist/{86099.acb890d2b6e1d841c4c3.bundle.js → 86099.0abe4f96d87490fe332e.bundle.js} +2 -2
  30. package/dist/{86099.acb890d2b6e1d841c4c3.bundle.js.map → 86099.0abe4f96d87490fe332e.bundle.js.map} +1 -1
  31. package/dist/{90418.0a737513ff59bfee423a.bundle.js → 90418.ee1af575862a64c12457.bundle.js} +2 -2
  32. package/dist/90418.ee1af575862a64c12457.bundle.js.map +1 -0
  33. package/dist/{96972.896f91c5874df70d14bb.bundle.js → 96972.fc25a13bb1bc69ad785c.bundle.js} +2 -2
  34. package/dist/96972.fc25a13bb1bc69ad785c.bundle.js.map +1 -0
  35. package/dist/9923.74654347e1812dd0f90a.bundle.js +3 -0
  36. package/dist/9923.74654347e1812dd0f90a.bundle.js.map +1 -0
  37. package/dist/api/models/application-settings/application-settings.d.ts +8 -1
  38. package/dist/api/models/application-settings/test/application-settings.spec.d.ts +1 -0
  39. package/dist/api/ontotext-workbench-api.js +1 -1
  40. package/dist/api/ontotext-workbench-api.js.map +1 -1
  41. package/dist/api/services/application-settings/application-settings-storage.service.d.ts +6 -0
  42. package/dist/api/services/runtime-configuration/runtime-configuration-context.service.d.ts +20 -0
  43. package/dist/api/services/theme/theme.service.d.ts +14 -3
  44. package/dist/css/explore.css +1 -1
  45. package/dist/css/lib/ontotext-yasgui-web-component.css +1 -1
  46. package/dist/css/user.css +1 -1
  47. package/dist/i18n/locale-en.json +4 -1
  48. package/dist/i18n/locale-fr.json +6 -3
  49. package/dist/index.html +9 -9
  50. package/dist/js/angular/clustermanagement/templates/cluster-nodes-configuration.html +1 -1
  51. package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +1 -1
  52. package/dist/js/angular/core/directives/dynamic-form/templates/dynamic-form.html +1 -1
  53. package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +1 -1
  54. package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
  55. package/dist/js/angular/core/directives/shuttle-multiselect/templates/shuttle-multiselect.html +1 -1
  56. package/dist/js/angular/core/directives/yasgui-component/templates/yasgui-component.html +2 -2
  57. package/dist/js/angular/core/templates/cookie-policy/cookie-consent.html +1 -1
  58. package/dist/js/angular/core/templates/cookie-policy/cookie-policy.html +1 -1
  59. package/dist/js/angular/core/templates/editable-content/editable-content.html +1 -1
  60. package/dist/js/angular/core/templates/markdown-content/markdown-content.html +1 -1
  61. package/dist/js/angular/core/templates/search-resource-input.html +1 -1
  62. package/dist/js/angular/graphql/templates/create-graphql-endpoint.html +2 -2
  63. package/dist/js/angular/graphql/templates/graphql-endpoint-management.html +1 -1
  64. package/dist/js/angular/graphql/templates/graphql-playground.html +2 -2
  65. package/dist/js/angular/graphql/templates/modal/endpoint-configuration-modal.html +1 -1
  66. package/dist/js/angular/graphql/templates/modal/endpoint-generation-failure-result-modal.html +1 -1
  67. package/dist/js/angular/graphql/templates/modal/import-endpoint-definition-modal.html +1 -1
  68. package/dist/js/angular/security/templates/user.html +13 -16
  69. package/dist/js/angular/ttyg/templates/agent-list.html +1 -1
  70. package/dist/js/angular/ttyg/templates/agent-select-menu.html +1 -1
  71. package/dist/js/angular/ttyg/templates/chat-item-detail.html +1 -1
  72. package/dist/js/angular/ttyg/templates/chat-list.html +1 -1
  73. package/dist/js/angular/ttyg/templates/chat-panel.html +1 -1
  74. package/dist/js/angular/ttyg/templates/modal/agent-instructions-explain-modal.html +1 -1
  75. package/dist/js/angular/ttyg/templates/modal/agent-settings-modal.html +3 -3
  76. package/dist/js/angular/ttyg/templates/modal/external-integration-configuration-modal.html +1 -1
  77. package/dist/js/angular/ttyg/templates/no-agents-view.html +1 -1
  78. package/dist/js/angular/ttyg/templates/ttyg.html +1 -1
  79. package/dist/{legacyWorkbench.77dd92ce99a75c4ee674.js → legacyWorkbench.cb08fa647eed6afe60e8.js} +3 -3
  80. package/dist/{legacyWorkbench.77dd92ce99a75c4ee674.js.map → legacyWorkbench.cb08fa647eed6afe60e8.js.map} +1 -1
  81. package/dist/{main.6db145d35852092cde59.js → main.1198f08d1cc597b94cbc.js} +3 -3
  82. package/dist/main.1198f08d1cc597b94cbc.js.map +1 -0
  83. package/dist/pages/aclmanagement.html +1 -1
  84. package/dist/pages/autocomplete.html +1 -1
  85. package/dist/pages/choose-repository-type.html +1 -1
  86. package/dist/pages/cluster-management/clusterInfo.html +3 -3
  87. package/dist/pages/create-index.html +5 -3
  88. package/dist/pages/dependencies.html +3 -3
  89. package/dist/pages/domainRangeInfo.html +2 -2
  90. package/dist/pages/edit.html +1 -1
  91. package/dist/pages/explore.html +72 -75
  92. package/dist/pages/export.html +1 -1
  93. package/dist/pages/find.html +1 -1
  94. package/dist/pages/graph-config/saveGraphConfig.html +8 -8
  95. package/dist/pages/graphs-visualizations.html +7 -7
  96. package/dist/pages/guides.html +1 -1
  97. package/dist/pages/home.html +1 -1
  98. package/dist/pages/import.html +2 -2
  99. package/dist/pages/jdbc-create.html +1 -1
  100. package/dist/pages/jdbc.html +1 -1
  101. package/dist/pages/monitor/backup-and-restore.html +1 -1
  102. package/dist/pages/monitor/queries.html +1 -1
  103. package/dist/pages/monitor/resources.html +1 -1
  104. package/dist/pages/namespaces.html +2 -2
  105. package/dist/pages/plugins.html +1 -1
  106. package/dist/pages/rdfClassHierarchyInfo.html +7 -7
  107. package/dist/pages/rdfrank.html +2 -2
  108. package/dist/pages/repositories.html +1 -1
  109. package/dist/pages/repository.html +1 -1
  110. package/dist/pages/similarity-indexes.html +1 -1
  111. package/dist/pages/sparql-editor.html +1 -1
  112. package/dist/pages/sparql-template-create.html +1 -1
  113. package/dist/pages/sparql-templates.html +1 -1
  114. package/dist/pages/ux-test1.html +2 -2
  115. package/dist/pages/webapi.html +2 -2
  116. package/dist/res/swagger5/index.html +11 -11
  117. package/dist/shared-components/cjs/onto-graph-explore-split-button.cjs.entry.js +1 -1
  118. package/dist/shared-components/collection/components/onto-graph-explore-split-button/onto-graph-explore-split-button.js +1 -1
  119. package/dist/shared-components/esm/onto-graph-explore-split-button.entry.js +1 -1
  120. package/dist/shared-components/shared-components/p-cd5cc683.entry.js +1 -0
  121. package/dist/shared-components/shared-components/shared-components.esm.js +1 -1
  122. package/package.json +1 -1
  123. package/dist/19057.c644732712725c1a6d3d.bundle.js +0 -3
  124. package/dist/19057.c644732712725c1a6d3d.bundle.js.map +0 -1
  125. package/dist/23236.36dabf6a87d61107178d.bundle.js +0 -2
  126. package/dist/23236.36dabf6a87d61107178d.bundle.js.map +0 -1
  127. package/dist/24125.fc41760fdae44b0480c8.bundle.js +0 -2
  128. package/dist/24125.fc41760fdae44b0480c8.bundle.js.map +0 -1
  129. package/dist/24690.d4ed1c24eded4eb0da85.bundle.js +0 -2
  130. package/dist/24690.d4ed1c24eded4eb0da85.bundle.js.map +0 -1
  131. package/dist/3395.8452312923e6a77d2ffd.bundle.js.map +0 -1
  132. package/dist/34985.a6b52e4b364c7efd3046.bundle.js +0 -2
  133. package/dist/34985.a6b52e4b364c7efd3046.bundle.js.map +0 -1
  134. package/dist/50244.35b37c35412261341adb.bundle.js +0 -2
  135. package/dist/50244.35b37c35412261341adb.bundle.js.map +0 -1
  136. package/dist/60447.fd8b44d92859a3481ad7.bundle.js +0 -2
  137. package/dist/60447.fd8b44d92859a3481ad7.bundle.js.map +0 -1
  138. package/dist/63842.e62b43ae192a642531c6.bundle.js +0 -2
  139. package/dist/63842.e62b43ae192a642531c6.bundle.js.map +0 -1
  140. package/dist/66574.8591bdbb6983d8d07c04.bundle.js +0 -2
  141. package/dist/66574.8591bdbb6983d8d07c04.bundle.js.map +0 -1
  142. package/dist/82917.e537e5e649be4a5a0e20.bundle.js.map +0 -1
  143. package/dist/90418.0a737513ff59bfee423a.bundle.js.map +0 -1
  144. package/dist/96972.896f91c5874df70d14bb.bundle.js.map +0 -1
  145. package/dist/9923.6963c46c47330a6ba2d0.bundle.js +0 -3
  146. package/dist/9923.6963c46c47330a6ba2d0.bundle.js.map +0 -1
  147. package/dist/main.6db145d35852092cde59.js.map +0 -1
  148. package/dist/shared-components/shared-components/p-1b143527.entry.js +0 -1
  149. /package/dist/{19057.c644732712725c1a6d3d.bundle.js.LICENSE.txt → 19057.a52dd7b0e356e884a792.bundle.js.LICENSE.txt} +0 -0
  150. /package/dist/{9923.6963c46c47330a6ba2d0.bundle.js.LICENSE.txt → 9923.74654347e1812dd0f90a.bundle.js.LICENSE.txt} +0 -0
  151. /package/dist/{legacyWorkbench.77dd92ce99a75c4ee674.js.LICENSE.txt → legacyWorkbench.cb08fa647eed6afe60e8.js.LICENSE.txt} +0 -0
  152. /package/dist/{main.6db145d35852092cde59.js.LICENSE.txt → main.1198f08d1cc597b94cbc.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"82917.e234e043395ff0b7d48f.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/core/directives/markdown-content/markdown-content.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/core/services/markdown/markdown.service.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/core/services/markdown/plugins/markdown-code-copy-plugin.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/core/services/markdown/plugins/markdown-open-in-sparql-editor-plugin.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/graphexplore/constants.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/graphexplore/controllers/graphs-visualizations.controller.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/repositories/repository.constants.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/utils/string-utils.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/common/d3-utils.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/d3-tip/d3-tip-patch.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/d3.patch.js"],"sourcesContent":["import 'angular/core/services/markdown/markdown.service';\n\nconst modules = [\n 'graphdb.framework.core.services.markdown-service',\n];\n\n/**\n * @ngdoc directive\n * @name graphdb.framework.core.directives.markdown-content:markdownContent\n * @restrict E\n *\n * @description\n * The `markdownContent` directive is used to render and compile Markdown content inside AngularJS applications.\n * It dynamically compiles any AngularJS directives within the rendered Markdown content, ensuring that the\n * directives are properly recognized and executed.\n *\n * @param {string=} content The markdown content to be rendered. This can be passed dynamically from the scope.\n * @param {object=} options Optional configuration object to pass to the Markdown rendering engine, providing\n * customization for how the Markdown is rendered.\n *\n * @example\n * Usage:\n * <markdown-content content=\"markdownText\" options=\"markdownOptions\"></markdown-content>\n */\nangular\n .module('graphdb.framework.core.directives.markdown-content', modules)\n .directive('markdownContent', markdownContentDirective);\n\nmarkdownContentDirective.$inject = ['$compile', 'MarkdownService'];\n\nfunction markdownContentDirective($compile, MarkdownService) {\n return {\n templateUrl: 'js/angular/core/templates/markdown-content/markdown-content.html',\n restrict: 'E',\n scope: {\n content: '@',\n options: '=',\n trusted: '@',\n },\n link: function($scope, element) {\n // =========================\n // Public variables\n // =========================\n\n /**\n * The rendered HTML content generated from the provided Markdown.\n *\n * @type {string|undefined} markdownContent\n */\n $scope.markdownContent = undefined;\n\n // =========================\n // Private functions\n // =========================\n\n const init = () => {\n if (!$scope.content) {\n $scope.markdownContent = undefined;\n return;\n }\n if ($scope.trusted === 'true') {\n $scope.markdownContent = MarkdownService.renderMarkdown($scope.content, $scope.options);\n compileMarkdownAnswerContents();\n } else {\n $scope.markdownContent = MarkdownService.renderMarkdown($scope.content, $scope.options, false);\n }\n };\n\n /**\n * Manually compiles AngularJS directives within the dynamically generated markdown HTML content.\n * AngularJS does not automatically detect and compile directives inside HTML that is dynamically\n * inserted, so this function ensures that the content is compiled after it is rendered.\n */\n const compileMarkdownAnswerContents = () => {\n $scope.$evalAsync(() => {\n // Find the dynamically rendered element that needs to be compiled\n const markdownElement = element.find('.markdown-content');\n $compile(angular.element(markdownElement).contents())($scope);\n });\n };\n\n $scope.$watch('content', (newVal, oldVal) => {\n if (newVal !== oldVal) {\n init();\n }\n });\n\n init();\n },\n };\n}\n","import markdownIt from 'markdown-it';\nimport {markdownCodeCopyPlugin} from \"./plugins/markdown-code-copy-plugin\";\nimport {markdownOpenInSparqlEditorPlugin} from \"./plugins/markdown-open-in-sparql-editor-plugin\";\nimport {LoggerProvider} from \"../logger-provider\";\n\nconst OPEN_IN_SPARQL_PLUGIN_OPTIONS = {\n buttonStyle: 'position: absolute; top: 0; right: 0; margin-right: 24px',\n};\n\nconst logger = LoggerProvider.logger;\n\n/**\n * AngularJS service that provides methods for rendering Markdown text.\n * @class MarkdownService\n * @param {$sce} $sce - AngularJS service for Strict Contextual Escaping.\n */\nangular\n .module('graphdb.framework.core.services.markdown-service', ['ngSanitize'])\n .service('MarkdownService', MarkdownService);\n\nMarkdownService.$inject = ['$sce', '$sanitize'];\n\nfunction MarkdownService($sce, $sanitize) {\n const markdownInstance = markdownIt()\n .use(markdownCodeCopyPlugin)\n .use(markdownOpenInSparqlEditorPlugin, OPEN_IN_SPARQL_PLUGIN_OPTIONS);\n\n /**\n * Retrieves a Markdown-it instance with optional custom configuration.\n * @function getMarkdown\n * @param {Object} [config] - Optional custom configuration for Markdown-it.\n * @return {Object} The Markdown instance.\n */\n const getMarkdown = (config) => {\n if (config) {\n return markdownIt()\n .use(markdownCodeCopyPlugin, config)\n .use(markdownOpenInSparqlEditorPlugin, _.merge({}, OPEN_IN_SPARQL_PLUGIN_OPTIONS, config));\n }\n return markdownInstance;\n };\n\n /**\n * Renders Markdown text into HTML.\n * @function renderMarkdown\n * @param {string} text - The Markdown text to render.\n * @param {Object} [config] - Optional custom configuration for Markdown rendering.\n * @param {boolean} [trusted=true] - Indicates whether the rendered HTML should be treated as trusted. If false, the\n * HTML will be sanitized to prevent potential security risks.\n * @return {string} The rendered HTML, or the original text in case of an error.\n */\n const renderMarkdown = (text, config, trusted = true) => {\n try {\n const html = getMarkdown(config).render(text);\n return trusted\n // trusted: skip sanitize (plugins may add custom HTML)\n ? $sce.trustAsHtml(html)\n // untrusted: sanitize before content that may have angular bindings\n : $sce.trustAsHtml($sanitize(html));\n } catch (e) {\n logger.error('Error rendering markdown:', e);\n return $sce.trustAsHtml(trusted ? text : $sanitize(text));\n }\n };\n\n return {\n renderMarkdown,\n };\n}\n","const DEFAULT_MARKDOWN_CONFIGURATION = {\n buttonStyle: \"position: absolute; top: 0; right: 0;\",\n buttonClass: \"\"\n};\n\n/**\n * This function enhances the rendering of code blocks in markdown by appending a \"copy to clipboard\" button to each code block.\n *\n * @param {Function} origRule The original rule function responsible for rendering code blocks.\n * @param {Object} options The options to customize the rendering. These will be merged with the default configuration.\n * Options model description:\n * ```JSON\n * {\n * // Inline CSS styles applied to position the button inside the code block. Defaults to positioning the button at the top-right of the block.\n * buttonStyle: \"position: absolute; top: 0; right: 0;\",\n * // The CSS class for styling the button. The default applies Bootstrap-like styles with a small button size and a secondary theme\n * buttonClass: \"btn btn-link btn-sm secondary\",\n * }\n * ```\n * @return {Function} A function that renders a code block with a \"copy to clipboard\" button, when a fenced code block is detected.\n */\nfunction renderCode(origRule, options) {\n options = _.merge({}, DEFAULT_MARKDOWN_CONFIGURATION, options);\n return (...args) => {\n const [tokens, idx] = args;\n const token = tokens[idx];\n\n const content = tokens[idx].content\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", \"&apos;\");\n const origRendered = origRule(...args);\n\n if (token.type === 'fence' && origRendered.trim()) {\n return `<div style=\"position: relative\">\n ${origRendered}\n <copy-to-clipboard\n style=\"${options.buttonStyle}\"\n class=\"${options.buttonClass}\"\n tooltip-text=\"ttyg.chat_panel.btn.copy_sparql.tooltip\"\n text-to-copy=\"${content}\">\n </copy-to-clipboard>\n </div>`;\n } else {\n return origRendered;\n }\n };\n}\n\nexport const markdownCodeCopyPlugin = (md, options) => {\n md.renderer.rules.code_block = renderCode(md.renderer.rules.code_block, options);\n md.renderer.rules.fence = renderCode(md.renderer.rules.fence, options);\n};\n","const DEFAULT_MARKDOWN_CONFIGURATION = {\n buttonStyle: \"position: absolute; top: 0; right: 0;\",\n buttonClass: \"\"\n};\n\n/**\n * This function enhances the rendering of fenced code blocks in markdown that contain SPARQL queries\n * by appending an \"open in SPARQL editor\" button to each SPARQL code block.\n *\n * @param {Function} origRule The original rule function responsible for rendering code blocks.\n * @param {Object} options The options to customize the rendering. These will be merged with the default configuration.\n * Options model description:\n * ```JSON\n * {\n * // Inline CSS styles applied to position the button inside the code block. Defaults to positioning the button at the top-right of the block.\n * buttonStyle: \"position: absolute; top: 0; right: 0;\",\n * // The CSS class for styling the button.\n * buttonClass: \"\",\n * // A flag that determines whether the SPARQL query should be automatically executed when opened in the SPARQL editor. Defaults to `false`.\n * executeQuery: false,\n * // The ID of the repository that the SPARQL query will be executed against.\n * repositoryId: ''\n * }\n * ```\n *\n * @return {Function} A function that renders a fenced code block with an \"open in SPARQL editor\" button when the block is recognized as containing SPARQL code.\n */\nfunction renderCode(origRule, options) {\n options = _.merge({}, DEFAULT_MARKDOWN_CONFIGURATION, options);\n return (...args) => {\n const [tokens, idx] = args;\n const token = tokens[idx];\n\n const content = tokens[idx].content\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", \"&apos;\");\n const origRendered = origRule(...args);\n\n if (token.type === 'fence' && token.info === 'sparql' && origRendered.trim()) {\n return `<div style=\"position: relative\">\n ${origRendered}\n <open-in-sparql-editor\n style=\"${options.buttonStyle}\"\n class=\"${options.buttonClass}\"\n execute-query=\"${options.executeQuery}\"\n repository-id=\"${options.repositoryId}\"\n query=\"${content}\">\n </open-in-sparql-editor>\n </div>`;\n } else {\n return origRendered;\n }\n };\n}\n\nexport const markdownOpenInSparqlEditorPlugin = (md, options) => {\n md.renderer.rules.code_block = renderCode(md.renderer.rules.code_block, options);\n md.renderer.rules.fence = renderCode(md.renderer.rules.fence, options);\n};\n","/**\n * The event name for the graph operation event. This event is emitted when a user clicks on a node or edge in the graph.\n * @type {{EXTERNAL_CLICK_HANDLER: string}}\n */\nexport const VISGRAPH_OPERATION = {\n EXTERNAL_CLICK_HANDLER: 'externalClickHandler',\n};\n\n/**\n * The types of operations that can be performed on the graph. These are used to identify the type of operation that is\n * being performed when the VISGRAPH_OPERATION event is emitted.\n * @type {{NODE_CLICK: string, EDGE_CLICK: string}}\n */\nexport const VISGRAPH_OPERATION_TYPE = {\n NODE_CLICK: 'visgraph.click.node',\n EDGE_CLICK: 'visgraph.click.edge',\n};\n\n","import 'angular/core/services';\nimport 'angular/core/services/workbench-context.service';\nimport 'angular/core/services/rdf4j-repositories.service';\nimport 'angular/core/directives/markdown-content/markdown-content';\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 OntoToastrService,\n ParentWindowMessageService,\n RepositoryContextService,\n SecurityContextService,\n LicenseContextService,\n REPOSITORY_ID_PARAM,\n WindowService,\n service,\n GuidesService,\n RuntimeConfigurationContextService,\n} from \"@ontotext/workbench-api\";\nimport {VISGRAPH_OPERATION, VISGRAPH_OPERATION_TYPE} from '../constants';\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 'graphdb.framework.core.directives.markdown-content',\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 \"WorkbenchContextService\",\n 'RDF4JRepositoriesService',\n];\n\nconst MIN_LINKS_LIMIT = 1;\nconst MAX_LINKS_LIMIT = 1000;\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 WorkbenchContextService,\n RDF4JRepositoriesService,\n) {\n const securityContextService = service(SecurityContextService);\n const repositoryContextService = service(RepositoryContextService);\n const parentWindowMessageService = service(ParentWindowMessageService);\n const HIGHLIGHT_COLOR = 'var(--gw-focus-ring-color)';\n const guidesService = service(GuidesService);\n const ontoToastrService = service(OntoToastrService);\n const runtimeConfigContextService = service(RuntimeConfigurationContextService);\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 let openedLink;\n const MARKDOWN_DATATYPES = new Set([\n 'lt:http://www.ontotext.com/proton/protonsys#Markdown',\n 'lt:http://ns.ontowiki.net/SysOnt/Markdown',\n 'lt:https://www.w3.org/ns/iana/media-types/text/markdown#Resource',\n 'lt:http://www.w3.org/ns/iana/media-types/text/markdown#Resource',\n ]);\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 // This is used to determine whether the view is embedded in another application. When embedded, we want to hide\n // some elements and disable the \"go to home\" functionality, as it doesn't make sense in that context.\n $scope.embedded = $location.search().embedded;\n // This is used to determine the specific action thet the external application wants to perform, for example, when\n // node or edge is clicked, and the graph is embedded in the external application, the external application might\n // want to handle the click in a specific way.\n // Possible operation types are defined in VISGRAPH_OPERATION_TYPE.\n $scope.visgraphOperation = $location.search().visgraphOperation;\n $scope.openedNodeInfoPanel = undefined;\n $scope.linksLimit = {\n value: 100,\n min: MIN_LINKS_LIMIT,\n max: MAX_LINKS_LIMIT,\n decreaseDisabled: false,\n increaseDisabled: false,\n };\n $scope.invalidLimit = false;\n let linksLimitDebounceTimer = null;\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 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 // Variables to hold the filter predicate text.\n // Reset the filter whenever new predicates are loaded\n $scope.predicateFilter = {text: ''};\n // All unfiltered predicates between two nodes. Used for restoring the full list of predicates when the filter is cleared.\n $scope.allPredicates = [];\n // All unfiltered reverse predicates between two nodes. Used for restoring the full list of reverse predicates when the filter is cleared.\n $scope.allReversePredicates = [];\n\n // =========================\n // Public functions\n // =========================\n\n /**\n * Checks if the given datatype is one of the supported markdown datatypes. This is used to determine whether the\n * value should be rendered as markdown or not.\n * @param type {string} The datatype to check, in the form of \"lt:datatypeIRI\"\n * @returns {boolean} True if the datatype is a supported markdown datatype, false otherwise.\n */\n $scope.isMarkdownLiteral = function(type) {\n return MARKDOWN_DATATYPES.has(type);\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.filterPredicates = () =>{\n const filter = ($scope.predicateFilter.text || '').toLowerCase();\n if (filter) {\n $scope.predicates = ($scope.allPredicates || []).filter((p)=> {\n return $scope.splitPredicate(p.value).toLowerCase().includes(filter);\n });\n $scope.reversePredicates = ($scope.allReversePredicates || []).filter((p)=> {\n return $scope.splitPredicate(p.value).toLowerCase().includes(filter);\n });\n } else {\n $scope.predicates = $scope.allPredicates;\n $scope.reversePredicates = $scope.allReversePredicates;\n }\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 renderSettings();\n };\n\n const updateLinksLimitModel = (value) => {\n if (value !== undefined) {\n $scope.linksLimit.value = value;\n }\n $scope.linksLimit.decreaseDisabled = $scope.linksLimit.value <= MIN_LINKS_LIMIT;\n $scope.linksLimit.increaseDisabled = $scope.linksLimit.value >= MAX_LINKS_LIMIT;\n };\n\n $scope.changeLimit = (delta) => {\n let linksLimit = $scope.linksLimit.value + delta;\n if (linksLimit < MIN_LINKS_LIMIT) {\n linksLimit = MIN_LINKS_LIMIT;\n }\n if (linksLimit > MAX_LINKS_LIMIT) {\n linksLimit = MAX_LINKS_LIMIT;\n }\n updateLinksLimitModel(linksLimit);\n $scope.updateLinksLimit();\n };\n\n $scope.updateLinksLimit = () => {\n $scope.invalidLimit = !NUMBER_PATTERN.test($scope.linksLimit.value);\n updateLinksLimitModel();\n applyLinksLimit();\n };\n\n /**\n * Debounced handler for links limit changes. Updates the URL parameter and reloads\n * the graph 500ms after the last change, preventing excessive requests while typing\n * or rapidly clicking the increment/decrement buttons.\n */\n const applyLinksLimit = () => {\n if (linksLimitDebounceTimer) {\n $timeout.cancel(linksLimitDebounceTimer);\n }\n linksLimitDebounceTimer = $timeout(() => {\n if ($scope.invalidLimit) {\n return;\n }\n $location.search('linksLimit', $scope.linksLimit.value);\n $location.state({skipOnPopState: true});\n reloadGraph();\n }, 500);\n };\n\n $scope.showSettings = () => {\n $scope.showInfoPanel = true;\n $scope.showFilter = true;\n $scope.showNodeInfo = false;\n $scope.showPredicates = false;\n $scope.reversePredicates = [];\n if (!$scope.saveSettings) {\n $scope.settings = _.cloneDeep($scope.defaultSettings);\n } else {\n $scope.settings = _.cloneDeep($scope.saveSettings);\n }\n renderSettings();\n };\n\n function reloadGraph() {\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\n $scope.updateSettings = () => {\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 reloadGraph();\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 const onThemeModeChange = (themeMode) => {\n if (themeMode) {\n resetColors();\n draw();\n }\n };\n\n // =========================\n // Event handlers\n // =========================\n\n const subscriptions = [];\n\n subscriptions.push($rootScope.$on('$translateChangeSuccess', function() {\n $scope.propertiesSearchPlaceholder = $translate.instant(\"visual.search.instance.placeholder\");\n }));\n\n subscriptions.push(runtimeConfigContextService.onThemeModeChanged(onThemeModeChange, true));\n subscriptions.push(WorkbenchContextService.onAutocompleteEnabledUpdated(onAutocompleteEnabledUpdated));\n subscriptions.push(repositoryContextService.onSelectedRepositoryChanged(onSelectedRepositoryUpdated));\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 // ========================= 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\n const removeAllListeners = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n const destroyHandler = () => {\n removeAllListeners();\n document.removeEventListener('keydown', handleKeyDown, true);\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 // Handles the case where the graph hasn't been rendered yet.\n const getGraphContainer = () => {\n return document.querySelector('.graph-visualization');\n };\n\n const pushHistory = (searchParams, state) => {\n if ($scope.embedded) {\n searchParams.embedded = true;\n }\n if ($scope.visgraphOperation) {\n searchParams.visgraphOperation = $scope.visgraphOperation;\n }\n searchParams.linksLimit = $scope.linksLimit.value;\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 function configureLinkLimit() {\n const linksLimitParam = $location.search().linksLimit;\n if (!linksLimitParam) {\n $location.replace();\n $location.search('linksLimit', $scope.linksLimit.value);\n $location.state({skipOnPopState: true});\n return;\n }\n const parsedLinkLimit = Number.parseInt(linksLimitParam, 10);\n if (Number.isNaN(parsedLinkLimit) || parsedLinkLimit < MIN_LINKS_LIMIT || parsedLinkLimit > MAX_LINKS_LIMIT) {\n // An invalid link limit was provided in the URL. Use the default value and update the url for consistency\n toastr.error(\n $translate.instant('visual.links.invalid.limit.tooltip', {MIN_LINKS_LIMIT, MAX_LINKS_LIMIT}),\n $translate.instant('visual.links.invalid.limit.title'),\n );\n $location.search('linksLimit', $scope.linksLimit.value);\n $location.state({skipOnPopState: true});\n return;\n }\n updateLinksLimitModel(parsedLinkLimit);\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: $scope.linksLimit.value,\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, $scope.linksLimit.value, 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 // The visual graph view can be accessed from two entry points:\n //\n // 1. \"SPARQL Query & Update\" view\n // - The \"query\" URL parameter is always provided.\n // - The query from this view is used as the graph expansion query.\n //\n // 2. \"Resources\" view\n // - The \"uri\" parameter value is used as the start node.\n // - The step for selecting a start node is skipped.\n //\n // The \"config\" URL parameter (configuration ID) is optional.\n // If provided, the specified configuration is used, otherwise, the default configuration is applied.\n //\n // After the initial visualization is rendered, all subsequent node expansions follow the loaded configuration.\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(100, 50).scale(1);\n\n function zoomed(event) {\n if (!guidesService.isScrollingAllowed()) {\n // disable zooming if it is not explicitly allowed by the guide.\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\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 \"rawPredicates\": link.rawPredicates,\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 // Capture length before pushing so we know how many head predicates\n // existed without a corresponding raw entry.\n const existingPredicateCount = value[0].predicates.length;\n\n value[0].predicates.push(...matchedLink.predicates);\n\n // Keep rawPredicates index-aligned with predicates at all times.\n // If the head link never had rawPredicates, backfill nulls for its\n // existing predicates first (fixes Case B).\n if (!value[0].rawPredicates) {\n value[0].rawPredicates = new Array(existingPredicateCount).fill(null);\n }\n // If the incoming link has no rawPredicates, pad with nulls so the\n // arrays stay in sync.\n const incomingRaw = matchedLink.rawPredicates\n || new Array(matchedLink.predicates.length).fill(null);\n value[0].rawPredicates.push(...incomingRaw);\n\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 rawPredicates: link.rawPredicates,\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 const styles = getComputedStyle(document.documentElement);\n const getPropertyStyleValue = (property) => styles.getPropertyValue(property).trim();\n\n let interpolation1Colors;\n let interpolation2Colors;\n\n let color1;\n let color2;\n\n const resetColors = () => {\n interpolation1Colors = [\n '--gw-vizgraph-node-color1-1',\n '--gw-vizgraph-node-color2-1',\n '--gw-vizgraph-node-color3-1'].map(getPropertyStyleValue);\n interpolation2Colors = [\n '--gw-vizgraph-node-color1-2',\n '--gw-vizgraph-node-color2-2',\n '--gw-vizgraph-node-color3-2'].map(getPropertyStyleValue);\n type2color = {};\n colorIndex = 0;\n color1 = d3.interpolateRgbBasis(interpolation1Colors);\n color2 = d3.interpolateRgbBasis(interpolation2Colors);\n };\n\n const getInterpolationIndex = (index) => {\n // returns a value between 0 and 1 for color interpolation based on the index,\n // with a non-linear distribution to give more distinct colors for the first 20 types\n return (index + (index / 2.6)) % 1;\n };\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 getPropertyStyleValue('--gw-vizgraph-node-color4');\n } else if (index % 2 === 0) {\n return color1(getInterpolationIndex(index));\n } else {\n return color2(getInterpolationIndex(index));\n }\n };\n\n const forceX = d3.forceX(width / 2).strength(0.03);\n const forceY = d3.forceY(height / 2).strength(0.03);\n\n const force = d3.forceSimulation()\n .velocityDecay(0.6)\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>&nbsp;&nbsp;';\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 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 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\n force.nodes(graph.nodes)\n .force(\"charge\", chargeForce)\n .force(\"collide\", collisionForce)\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(\"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 .each(function(d) {\n // computed once, and not on each tick\n d.predicateLabel = getPredicate(d);\n })\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(\"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 <= $scope.linksLimit.value) {\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 // Pre-compute per-datum geometry in a single pass — getNodeX/getNodeY may\n // hit document.getElementById for triple nodes, so call each exactly once.\n predicate.each(function(d) {\n const sx = getNodeX(d.source);\n const sy = getNodeY(d.source);\n const tx = getNodeX(d.target);\n const ty = getNodeY(d.target);\n d.x = (sx + tx) * 0.5;\n d.y = (sy + ty) * 0.5;\n const raw = Math.atan2(ty - sy, tx - sx) * 180 / Math.PI;\n d._rawAngle = raw;\n // Normalize to [-90°, 90°] so labels are never upside-down (inlined from findAngleBetweenNodes)\n d._normAngle = (raw <= 90 && raw >= -90) ? raw : (raw > 0 ? -1 : 1) * (180 - Math.abs(raw));\n });\n\n // set predicates attributes\n predicate\n .attr(\"x\", function(d) {\n return d.x;\n })\n .attr(\"y\", function(d) {\n return d.y;\n })\n .attr(\"dy\", function(d) {\n if (d.direction !== \"double\") return \"-0.5em\";\n return (d._rawAngle > 90 || d._rawAngle < -90) ? \"1.5em\" : \"-0.5em\";\n })\n .attr(\"transform\", function(d) {\n return `rotate(${d._normAngle}, ${d.x}, ${d.y})`;\n });\n\n // Only update text for bidirectional links — single-link labels never change.\n predicate.filter(function(d) {\n return d.direction === \"double\";\n }).text(function(d) {\n return getPredicateLabelWithArrow(d);\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 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 const menuEvents = new MenuEvents();\n\n // expanding and collapsing of the nodes\n function clickedNode(d, element, event) {\n revertElementsStyleToDefault();\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 ($scope.embedded && $scope.visgraphOperation === VISGRAPH_OPERATION.EXTERNAL_CLICK_HANDLER) {\n parentWindowMessageService.postMessage({\n type: VISGRAPH_OPERATION_TYPE.NODE_CLICK,\n iri: d.iri,\n labels: d.labels,\n types: d.types,\n rdfRank: d.rdfRank,\n comment: d.comment,\n }, WindowService.getReferer());\n return true;\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.closeInfoPanel();\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: $scope.linksLimit.value,\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.4.0-TR5\")\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 const panelWasAlreadyOpen = $scope.showInfoPanel;\n openedLink = null;\n // Assign value of node, which info panel has been opened\n $scope.openedNodeInfoPanel = d;\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\n highlightNode(d);\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\n const items = [];\n\n _.forEach($scope.data, function(value, key) {\n items.push({key: key, value: value});\n });\n $scope.nodeImage = undefined;\n\n $scope.propertiesNotFiltered = items;\n\n const imageVal = _.find(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(items, function(o) {\n return o.key === 'image';\n });\n $scope.propertiesNotFiltered = $scope.propertiesObj.items;\n\n $scope.showInfoPanel = true;\n $scope.showNodeInfo = true;\n if (panelWasAlreadyOpen) {\n // ui-scroll doesn't re-init automatically when panel stays open\n $timeout(() => $scope.adapterContainer.adapter.reload(), 500);\n }\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 revertElementsStyleToDefault();\n $scope.pageslideExpanded = false;\n $scope.openedNodeInfoPanel = undefined;\n $scope.predicates = [];\n $scope.reversePredicates = [];\n openedLink = null;\n $scope.predicateFilter.text = '';\n $scope.allPredicates = [];\n $scope.allReversePredicates = [];\n // o, angular, o, miracle\n $timeout(function() {\n $scope.showInfoPanel = false;\n });\n };\n\n function applyElementsStyleChanges(tripleNode) {\n const container = getGraphContainer();\n updatePredicatesColor('predicate', 'var(--gw-primary-dark)', tripleNode);\n updatePredicatesColor('predicates', 'var(--gw-primary-dark)', tripleNode);\n\n const links = container?.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 = container?.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 /**\n * Highlights the single clicked node circle.\n */\n function highlightNode(d) {\n const wrapper = document.getElementById(d.iri);\n const nodeEl = wrapper?.querySelector('.node');\n if (nodeEl) {\n nodeEl.style.stroke = HIGHLIGHT_COLOR;\n nodeEl.style.strokeWidth = '3px';\n }\n }\n\n /**\n * Highlights the source node, target node, and link line(s) for the given\n * link datum when the predicates side-panel opens. Also highlights the\n * reverse link when present (it is shown in the same panel).\n */\n function highlightLinkAndNodes(d) {\n // Highlight the two endpoint nodes of the link.\n [d.source, d.target].forEach(function(endpoint) {\n const nodeEl = document.getElementById(endpoint.iri)?.querySelector('.node');\n if (nodeEl) {\n nodeEl.style.stroke = HIGHLIGHT_COLOR;\n nodeEl.style.strokeWidth = '3px';\n }\n });\n\n // Highlight the link — one getElementById + two child queries ──\n const linkId = removeSpecialChars(convertLinkDataToLinkId(d));\n const linkWrapper = document.getElementById(linkId);\n if (linkWrapper) {\n const linkEl = linkWrapper.querySelector('.link');\n if (linkEl) {\n linkEl.style.stroke = HIGHLIGHT_COLOR;\n linkEl.style.strokeWidth = '2.5';\n }\n\n const predEl = linkWrapper.querySelector('.predicate, .predicates');\n if (predEl) {\n predEl.style.fill = HIGHLIGHT_COLOR;\n }\n }\n\n // Highlight the arrow marker on the link, if present (not all links have markers, e.g. self-links)\n const markerEl = document.getElementById(createArrowMarkerUniqueID(d));\n if (markerEl) {\n markerEl.style.stroke = HIGHLIGHT_COLOR;\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 const showFeedback = () => {\n ontoToastrService.success($translate.instant('common.messages.copied_to_clipboard'));\n };\n\n $scope.copyPredicateIri = function(event, iri) {\n event.stopPropagation();\n\n const fallback = function() {\n const textarea = document.createElement('textarea');\n textarea.value = iri;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n try {\n document.execCommand('copy');\n } catch (e) {\n /* not available */\n console.warn('Copy to clipboard failed.', e);\n }\n textarea.remove();\n showFeedback();\n };\n\n if (navigator.clipboard) {\n navigator.clipboard.writeText(iri).then(showFeedback).catch(fallback);\n } else {\n fallback();\n }\n };\n\n /**\n * Returns true when the link's angle puts its label in \"upside-down\" territory\n * (rawAngle outside [-90°, 90°]), meaning the arrow and label should be flipped.\n * Uses the angle pre-computed by the tick when available to avoid redundant DOM reads.\n */\n function isLinkReversed(link) {\n const rawAngle = (link._rawAngle === undefined)\n ? Math.atan2(\n getNodeY(link.target) - getNodeY(link.source),\n getNodeX(link.target) - getNodeX(link.source),\n ) * 180 / Math.PI\n : link._rawAngle;\n return rawAngle > 90 || rawAngle < -90;\n }\n\n function getPredicateLabelWithArrow(d) {\n const base = d.predicateLabel || getPredicate(d);\n if (d.direction !== \"double\") {\n return base;\n }\n // Reuse the angle pre-computed by the tick's .each() pass when available —\n // getNodeX/getNodeY may hit the DOM for triple nodes, so avoid redundant calls.\n // Falls back to computing only when called outside the tick (e.g. updatePredicatesColor).\n return isLinkReversed(d)\n ? '\\u27F5 ' + base// ⟵ label\n : base + ' \\u27F6';// label ⟶\n }\n\n function updatePredicatesColor(className, color, tripleNode) {\n const container = getGraphContainer();\n const preds = container?.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 = getPredicateLabelWithArrow(predLink);\n }\n });\n }\n }\n\n function revertElementsStyleToDefault() {\n const container = getGraphContainer();\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 = container?.getElementsByClassName('link');\n if (links) {\n _.each(links, function(link) {\n link.style.stroke = '';\n link.style.strokeWidth = '';\n });\n }\n updatePredicatesColor('predicate', '');\n updatePredicatesColor('predicates', '');\n\n const markers = container?.getElementsByClassName('arrow-marker');\n if (markers) {\n _.each(markers, function(marker) {\n marker.style.stroke = '';\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 // clear node highlight\n const nodes = container?.getElementsByClassName('node');\n if (nodes) {\n _.each(nodes, function(node) {\n node.style.stroke = '';\n node.style.strokeWidth = '';\n });\n }\n }\n\n function linkActions(event, d) {\n if ($scope.embedded && $scope.visgraphOperation === VISGRAPH_OPERATION.EXTERNAL_CLICK_HANDLER) {\n parentWindowMessageService.postMessage({\n type: VISGRAPH_OPERATION_TYPE.EDGE_CLICK,\n predicates: d.predicates,\n source: d.source,\n target: d.target,\n }, WindowService.getReferer());\n return;\n }\n\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\n openPredicates(d);\n\n // We need to manually trigger a digest because linkActions runs outside angular's digest cycle (it's triggered\n // by a D3 .on(\"click\") handler, not by angular), so scope changes like $scope.showPredicates, $scope.predicates,\n // etc. don't render until the next digest happens.\n $scope.$applyAsync();\n }\n\n function openPredicates(d) {\n $scope.showNodeInfo = false;\n $scope.showFilter = false;\n $scope.showInfoPanel = false;\n $scope.openedNodeInfoPanel = undefined;\n\n // Find the reverse direction link (if any)\n const reverseLink = graph.links.find(function(l) {\n return l.source.iri === d.target.iri && l.target.iri === d.source.iri;\n });\n // Show panel if this direction has predicates OR a reverse link exists\n $scope.showPredicates = d.predicates.length >= 1 || (!!reverseLink && reverseLink.predicates.length > 0);\n\n if (openedLink === d) {\n $scope.showNodeInfo = false;\n $scope.showInfoPanel = false;\n openedLink = null;\n $scope.predicateFilter.text = '';\n return;\n }\n\n openedLink = d;\n\n if ($scope.showPredicates) {\n // Build lookup: local name → full IRI.\n // Server sends predicates (short) and rawPredicates (full) in independent orderings.\n const rawByLocalName = new Map();\n if (d.rawPredicates) {\n d.rawPredicates.forEach(function(raw) {\n const localName = raw.split(/[/#]/).pop();\n if (!rawByLocalName.has(localName)) {\n rawByLocalName.set(localName, raw);\n }\n });\n }\n // Compute direction once — same for every predicate on this link.\n $scope.predicates = _.map(d.predicates, function(p) {\n const foundNodeIndex = getTripleNodeIndex(p, d);\n const isPartOfTriple = foundNodeIndex > -1;\n const pLocalName = p.split(/[/#]/).pop();\n return {\n value: getShortPredicate(p),\n rawIri: rawByLocalName.get(pLocalName) || p,\n partOfTriple: isPartOfTriple,\n linkId: isPartOfTriple ? convertLinkDataToLinkId(d) : '',\n nodeIndex: foundNodeIndex,\n };\n });\n\n $scope.allPredicates = $scope.predicates;\n\n // Reset scroll before the new list renders\n const predicatesContainer = document.querySelector('.predicates-panel .predicates');\n if (predicatesContainer) {\n predicatesContainer.scrollTop = 0;\n }\n\n // Reverse predicates\n if (reverseLink) {\n const reverseRawByLocalName = new Map();\n if (reverseLink.rawPredicates) {\n reverseLink.rawPredicates.forEach(function(raw) {\n const localName = raw.split(/[/#]/).pop();\n if (!reverseRawByLocalName.has(localName)) {\n reverseRawByLocalName.set(localName, raw);\n }\n });\n }\n\n $scope.reversePredicates = _.map(reverseLink.predicates, function(p) {\n const foundNodeIndex = getTripleNodeIndex(p, reverseLink);\n const isPartOfTriple = foundNodeIndex > -1;\n const pLocalName = p.split(/[/#]/).pop();\n return {\n value: getShortPredicate(p),\n rawIri: reverseRawByLocalName.get(pLocalName) || p,\n partOfTriple: isPartOfTriple,\n linkId: isPartOfTriple ? convertLinkDataToLinkId(reverseLink) : '',\n nodeIndex: foundNodeIndex,\n };\n });\n\n $scope.allReversePredicates = $scope.reversePredicates;\n } else {\n $scope.reversePredicates = [];\n $scope.allReversePredicates = [];\n }\n\n // reapply the filter automatically after new selection\n $scope.filterPredicates();\n\n const getNodeDisplayLabel = (node) =>\n (node.labels?.length && node.labels[0].label)\n ? node.labels[0].label\n : $scope.replaceIRIWithPrefix(node.iri);\n\n $scope.predicatesSource = {label: getNodeDisplayLabel(d.source), iri: d.source.iri};\n $scope.predicatesTarget = {label: getNodeDisplayLabel(d.target), iri: d.target.iri};\n $scope.showInfoPanel = true;\n // highlight both endpoint nodes and the links\n highlightLinkAndNodes(d);\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 };\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 = {...currentSearch, saved: graphToLoad.id};\n $location.search('saved', graphToLoad.id);\n graph.restoreState(JSON.parse(graphToLoad.data));\n if (!noHistory) {\n pushHistory(newSearch, {savedGraph: graphToLoad});\n }\n };\n\n $scope.copyToClipboardSavedGraph = function(savedGraph) {\n // TODO: Not sure we must add the repositoryId param here.\n const url = [location.protocol, '//', location.host, location.pathname, '?saved=', savedGraph.id].join('');\n $scope.copyToClipboard(url);\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 configureLinkLimit();\n initForRepository();\n resetColors();\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","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 {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","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 {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","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"],"names":["markdownContentDirective","$compile","MarkdownService","templateUrl","restrict","scope","content","options","trusted","link","$scope","element","markdownContent","undefined","init","renderMarkdown","compileMarkdownAnswerContents","$evalAsync","markdownElement","find","angular","contents","$watch","newVal","oldVal","module","directive","$inject","OPEN_IN_SPARQL_PLUGIN_OPTIONS","buttonStyle","logger","LoggerProvider","$sce","$sanitize","markdownInstance","markdownIt","use","markdownCodeCopyPlugin","markdownOpenInSparqlEditorPlugin","text","config","html","_","merge","getMarkdown","render","trustAsHtml","e","error","service","DEFAULT_MARKDOWN_CONFIGURATION","buttonClass","renderCode","origRule","args","tokens","idx","token","replaceAll","origRendered","type","trim","md","renderer","rules","code_block","fence","info","executeQuery","repositoryId","VISGRAPH_OPERATION","EXTERNAL_CLICK_HANDLER","VISGRAPH_OPERATION_TYPE","NODE_CLICK","EDGE_CLICK","controller","GraphsVisualizationsCtrl","SaveGraphModalCtrl","$uibTooltipProvider","appendToBody","MAX_LINKS_LIMIT","$rootScope","$repositories","toastr","$timeout","ClassInstanceDetailsService","$q","$location","$jwtAuth","UiScrollService","ModalService","$uibModal","$window","LocalStorageAdapter","LSKeys","SavedGraphsRestService","GraphConfigRestService","GraphDataRestService","$translate","WorkbenchContextService","RDF4JRepositoriesService","securityContextService","SecurityContextService","repositoryContextService","RepositoryContextService","parentWindowMessageService","ParentWindowMessageService","HIGHLIGHT_COLOR","guidesService","GuidesService","ontoToastrService","OntoToastrService","runtimeConfigContextService","RuntimeConfigurationContextService","openedLink","MARKDOWN_DATATYPES","Set","languageChanged","propertiesObj","items","propertiesQueryObj","query","propertiesSearchPlaceholder","instant","propertiesNotFiltered","searchVisible","nodeSelected","queryResultsMode","embedded","search","visgraphOperation","openedNodeInfoPanel","linksLimit","value","min","max","decreaseDisabled","increaseDisabled","invalidLimit","linksLimitDebounceTimer","datasource","adapterContainer","adapter","remain","hasInitedRepository","defaultSettings","includeInferred","sameAsState","truncateNodeLabels","languages","showLinksText","preferredTypes","rejectedTypes","preferredPredicates","rejectedPredicates","preferredTypesOnly","preferredPredicatesOnly","includeSchema","saveSettings","cloneDeep","defaultGraphConfig","id","name","startMode","key","predicateFilter","allPredicates","allReversePredicates","isMarkdownLiteral","has","onopen","onclose","noop","goToHome","resetState","searchParams","path","filterPredicates","filter","toLowerCase","predicates","p","splitPredicate","includes","reversePredicates","shouldShowSettings","configLoaded","shouldDisableSameAs","sameAsCheckbox","$","settings","prop","propertiesFilterFunc","item","indexOf","toggleMoreInfo","ev","currentTarget","parent","next","toggle","children","toggleClass","copyToClipboard","uri","openCopyToClipboardModal","resetSettings","renderSettings","updateLinksLimitModel","changeLimit","delta","updateLinksLimit","NUMBER_PATTERN","test","applyLinksLimit","cancel","state","skipOnPopState","reloadGraph","rootNodeIri","reExpandNode","loadGraphForQuery","sameAs","inference","loadGraphConfig","showSettings","showInfoPanel","showFilter","showNodeInfo","showPredicates","updateSettings","map","s","t","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","substring","length","subscriptions","push","$on","onThemeModeChanged","themeMode","resetColors","draw","onAutocompleteEnabledUpdated","autocompleteEnabled","isAutocompleteEnabled","onSelectedRepositoryChanged","repository","getNamespaces","repositoryNamespaces","catch","msg","NamespacesListModel","event","payload","newRepo","initForRepository","empty","initGraphFromQueryParam","rootScopeGenericWatcher","rootScopeGenericChangeHandler","position","each","current","modalIsOpen","openModalCount","handleKeyDown","stopPropagation","document","addEventListener","destroyHandler","forEach","subscription","removeEventListener","window","onpopstate","getGraphContainer","querySelector","lastSavedGraphName","lastSavedGraphId","shared","numberOfPinnedNodes","type2color","colorIndex","getSettings","isActive","d3","style","updateNodeLabels","nodeLabels","d","fontSize","D3","Text","calcFontSizeRaw","labels","label","size","nodeLabelMinFontSize","attr","append","classed","HtmlUtil","getText","languagesMap","v","preferredTypesMap","rejectedTypesMap","preferredPredicatesMap","rejectedPredicatesMap","$broadcast","inputValue","loading","isDefined","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","source","target","getNodeX","node","isTriple","el","getElementById","removeSpecialChars","__data__","x","getNodeY","y","createTriple","createArrowMarkerUniqueID","distinctBy","array","keys","index","startIRI","startGraphQuery","loadGraphForConfig","startQueryIncludeInferred","startQuerySameAs","loadGraphFromQueryParam","loadConfigForId","successCallback","getConfig","savedGraph","noGoHome","zoomLayout","scaleExtent","container","translate","scale","on","isScrollingAllowed","transform","tipElement","this","nodes","links","tripleNodes","Map","tripleLinksCopy","computeConnectedness","counts","seenLinks","i1","i2","seenKey","connectedness","Math","addAndMatchLinks","newLinks","Array","prototype","apply","isTripleSource","getTripleNode","isTripleTarget","matchedLink","rawPredicates","linkId","get","existingPredicateCount","fill","incomingRaw","matchLinksToNodes","delete","countLinks","findLinksForNode","l","linksTypes","linksForNode","uniq","flatten","linksPredicates","removeTriples","triplesToRemove","targetTriples","reject","sourceSplit","lSource","lTarget","targetSplit","isRejected","removeNode","n","removeNodeLeafLinks","targetLinks","addTriple","weight","copyState","nodesCopy","rdfRank","fixed","triplesCopy","JSON","stringify","from","entries","restoreState","parse","k","count","initLazyList","revision","getActiveRepository","addedTag","tag","str","uriParts","uriPart","localName","isUndefined","expandedUri","getNamespaceUriForPrefix","expandPrefix","pageslideExpanded","validateTag","category","wildcardOK","wildcardPos","getTagClass","tagText","endsWith","isLicenseValid","LicenseContextService","getLicenseSnapshot","valid","multiClickDelay","nodeLabelRectScaleX","styles","getComputedStyle","documentElement","getPropertyStyleValue","property","getPropertyValue","interpolation1Colors","interpolation2Colors","color1","color2","getInterpolationIndex","getColor","forceX","strength","forceY","force","velocityDecay","svg","showNodeTipAndIconsTimer","removeIconsTimer","loader","setLoadingState","getLoadingState","parentNode","resetRootNode","remove","tip","d3tip","customPosition","bbox","getBoundingClientRect","top","bottom","left","tipTimer","hideTipForNode","hide","removeMenuIfVisible","call","selectAll","collisionForce","chargeForce","distance","span","splitedLink","predicateText","addClass","textLength","getPredicateTextLength","enter","predicate","predicateLabel","getPredicate","postMessage","WindowService","getReferer","revertElementsStyleToDefault","tripleNode","clickedNode","button","nodeCopy","pred","getShortPredicate","applyElementsStyleChanges","reverseLink","rawByLocalName","raw","pop","foundNodeIndex","getTripleNodeIndex","isPartOfTriple","pLocalName","rawIri","partOfTriple","nodeIndex","predicatesContainer","scrollTop","reverseRawByLocalName","getNodeDisplayLabel","predicatesSource","predicatesTarget","endpoint","nodeEl","stroke","strokeWidth","linkWrapper","linkEl","predEl","markerEl","highlightLinkAndNodes","openPredicates","$applyAsync","linkActions","touchHoldEventTimer","moveEventCount","singleClickTimer","clickTarget","expandEventHandler","i","isArray","closeInfoPanel","showPinAnimation","startSize","endSize","startOpacity","endOpacity","animate","pin","innerD","transition","duration","drag","subject","sourceEvent","fixedBeforeDrag","isBeingDragged","beginDragging","alphaTarget","restart","fx","fy","pinWasFixed","menuEvents","closeIcon","expandIcon","focusIcon","copyURIIcon","removeIcons","alpha","initIcons","stop","updateAlphaInScope","expandNodeIcons","thisTipElement","show","showTipForNode","hideNode","touchStartEventHandler","shiftKey","preventDefault","updateTipForNode","srcElement","overflow","insert","sx","sy","tx","ty","atan2","PI","_rawAngle","_normAngle","abs","direction","getPredicateLabelWithArrow","select","sourceId","targetId","d3alpha","getPositionAndAngle","angle","cos","sin","collapseIcon","actionsTip","expandedState","right","isExpanded","getAttribute","animateMenu","animationDuration","easeEffect","delay","ease","ctrlKey","metaKey","comment","initGraph","renderGraphFromResponse","isStartNode","linksFound","newLink","findIndex","existingLink","linksCopy","tripleLinksIt","values","nodesFromLinks","union","existingNodes","Boolean","tripleNodesIt","newNodes","some","connectionsCount","promises","newNodesData","newNode","res","all","newNodeData","theta","expandIri","getInstanceNodeLinks","panelWasAlreadyOpen","nodeTypes","nodeIri","resourceType","encodedIri","encodeURIComponent","wrapper","highlightNode","rdfsLabel","rdfsComment","expanded","dataNodeKeysQuery","getProperties","mapKeys","nodeImage","imageVal","reload","updatePredicatesColor","getElementsByClassName","linkLink","markers","marker","markerLink","setAttribute","toggleSidePanel","clickLink","predData","clickedEl","fontWeight","every","oppLinkIRI","oppTriplePred","linkPred","showFeedback","base","rawAngle","isLinkReversed","className","color","preds","predLink","textContent","currEl","shortIRI","copyPredicateIri","fallback","textarea","createElement","opacity","body","appendChild","execCommand","console","warn","navigator","clipboard","writeText","isLoadingLocation","hasActiveLocation","rotate","isLeft","pivotX","pivotY","noHistory","saveOrUpdateGraph","graphToSave","saveGraphModal","renameSavedGraph","graphToRename","mode","graphExists","modalInstance","open","resolve","addNewSavedGraph","status","headers","saveGraphHttp","editSavedGraph","finally","getSavedGraphs","savedGraphs","graphToLoad","owner","newSearch","copyToClipboardSavedGraph","url","location","protocol","host","pathname","deleteSavedGraph","graphName","deleteSavedGraphHttp","openIRI","togglePinAllNodes","nodeName","keyCode","getLiteralFromPropValue","backgroundRectCreated","wheelHandler","passive","principal","settingsFromPrincipal","appSettings","localStorageSettings","unique","initSettings","getAuthenticatedUser","linksLimitParam","replace","parsedLinkLimit","Number","parseInt","isNaN","MIN_LINKS_LIMIT","configureLinkLimit","$uibModalInstance","okButtonText","ok","form","$valid","normalizeString","close","saveNew","dismiss","STATIC_RULESETS","REPOSITORY_TYPES","graphdbRepo","free","eeWorker","eeMaster","ontop","se","fedx","FILENAME_PATTERN","RegExp","string","toBoolean","toTitleCase","upperFirst","dispatch","pointer","radius","minimumSize","isMultiline","textSize","match","round","calcFontSize","getTextWithElipsisIfNeeded","threshold","Transition","fadeIn","sel","fadeOut","Click","d3_rebind","method","arguments","delayDblClick","dispatchedEvent","rebind","selection","down","wait","Date","a","b","sqrt","pow","clearTimeout","setTimeout","offset","initNode","point","vis","tagName","ownerSVGElement","createSVGPoint","slice","SVGElement","coords","poffset","dir","nodel","getNodeEl","directions","scrollLeft","customPos","arg","Event","direction_callbacks","Object","d3_functor","destroy","getScreenBBox","offsetHeight","offsetWidth","w","nw","ne","sw","targetel","getScreenCTM","matrix","tbbox","getBBox","matrixTransform","define","attrsFunction","attrsObject","require","attrs","moveToFront","moveToBack","firstChild","insertBefore"],"sourceRoot":""}