graphdb-workbench 4.0.0-TR2 → 4.0.0-TR3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/{30575.19fdf3b549db571bb535.bundle.js → 30575.184c5f6f13b5bff89fec.bundle.js} +2 -2
  2. package/dist/30575.184c5f6f13b5bff89fec.bundle.js.map +1 -0
  3. package/dist/32401.e87fc66be912718fffc3.bundle.js +2 -0
  4. package/dist/32401.e87fc66be912718fffc3.bundle.js.map +1 -0
  5. package/dist/44906.42387d9a889a05ef93ae.bundle.js +2 -0
  6. package/dist/44906.42387d9a889a05ef93ae.bundle.js.map +1 -0
  7. package/dist/{64700.a10c20a33a6c92f01733.bundle.js → 64700.847995c53301ff65bccd.bundle.js} +2 -2
  8. package/dist/64700.847995c53301ff65bccd.bundle.js.map +1 -0
  9. package/dist/{64709.dfde8159d07e957a12b0.bundle.js → 64709.d0144177c2b8d83b494f.bundle.js} +2 -2
  10. package/dist/{64709.dfde8159d07e957a12b0.bundle.js.map → 64709.d0144177c2b8d83b494f.bundle.js.map} +1 -1
  11. package/dist/{65677.4ed21f2097d86718611c.bundle.js → 65677.9e40e2d5fe66932a18ab.bundle.js} +2 -2
  12. package/dist/{65677.4ed21f2097d86718611c.bundle.js.map → 65677.9e40e2d5fe66932a18ab.bundle.js.map} +1 -1
  13. package/dist/{75384.cc7de25be91251aa6aa4.bundle.js → 75384.94d3d9790b82fe24ba69.bundle.js} +2 -2
  14. package/dist/75384.94d3d9790b82fe24ba69.bundle.js.map +1 -0
  15. package/dist/79796.9e99cce3ecaefe7b75fc.bundle.js +2 -0
  16. package/dist/79796.9e99cce3ecaefe7b75fc.bundle.js.map +1 -0
  17. package/dist/{80933.19f69bc85c52a8b19311.bundle.js → 80933.d5c0bca925e9cb27ac57.bundle.js} +2 -2
  18. package/dist/{80933.19f69bc85c52a8b19311.bundle.js.map → 80933.d5c0bca925e9cb27ac57.bundle.js.map} +1 -1
  19. package/dist/{82917.c68c153aaca95c11341f.bundle.js → 82917.9da9f14ffe9dc7768d10.bundle.js} +2 -2
  20. package/dist/{82917.c68c153aaca95c11341f.bundle.js.map → 82917.9da9f14ffe9dc7768d10.bundle.js.map} +1 -1
  21. package/dist/{86099.ab0bf43b346e9cfb20d8.bundle.js → 86099.33c740b4d5684dde18c7.bundle.js} +2 -2
  22. package/dist/{86099.ab0bf43b346e9cfb20d8.bundle.js.map → 86099.33c740b4d5684dde18c7.bundle.js.map} +1 -1
  23. package/dist/api/models/broadcast/broadcast-message.d.ts +11 -0
  24. package/dist/api/models/broadcast/index.d.ts +3 -0
  25. package/dist/api/models/broadcast/message-handler.d.ts +5 -0
  26. package/dist/api/models/broadcast/message-type.d.ts +3 -0
  27. package/dist/api/ontotext-workbench-api.d.ts +2 -0
  28. package/dist/api/ontotext-workbench-api.js +1 -1
  29. package/dist/api/ontotext-workbench-api.js.map +1 -1
  30. package/dist/api/services/broadcast/broadcast.service.d.ts +24 -0
  31. package/dist/api/services/broadcast/index.d.ts +1 -0
  32. package/dist/api/services/broadcast/test/broadcast.service.spec.d.ts +1 -0
  33. package/dist/assets/i18n/language-config.json +1 -1
  34. package/dist/css/user.css +1 -1
  35. package/dist/i18n/locale-en.json +1 -0
  36. package/dist/i18n/locale-fr.json +1 -0
  37. package/dist/index.html +8 -8
  38. package/dist/js/angular/clustermanagement/templates/cluster-configuration/cluster-configuration.html +1 -1
  39. package/dist/js/angular/clustermanagement/templates/cluster-configuration/multi-region.html +1 -1
  40. package/dist/js/angular/clustermanagement/templates/cluster-nodes-configuration.html +1 -1
  41. package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +1 -1
  42. package/dist/js/angular/core/directives/dynamic-form/templates/dynamic-form.html +1 -1
  43. package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +1 -1
  44. package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
  45. package/dist/js/angular/core/directives/shuttle-multiselect/templates/shuttle-multiselect.html +1 -1
  46. package/dist/js/angular/core/directives/yasgui-component/templates/yasgui-component.html +2 -2
  47. package/dist/js/angular/core/templates/cookie-policy/cookie-consent.html +1 -1
  48. package/dist/js/angular/core/templates/cookie-policy/cookie-policy.html +1 -1
  49. package/dist/js/angular/core/templates/editable-content/editable-content.html +1 -1
  50. package/dist/js/angular/core/templates/markdown-content/markdown-content.html +1 -1
  51. package/dist/js/angular/core/templates/search-resource-input.html +1 -1
  52. package/dist/js/angular/graphql/templates/create-graphql-endpoint.html +2 -2
  53. package/dist/js/angular/graphql/templates/graphql-endpoint-management.html +1 -1
  54. package/dist/js/angular/graphql/templates/graphql-playground.html +2 -2
  55. package/dist/js/angular/graphql/templates/modal/endpoint-configuration-modal.html +1 -1
  56. package/dist/js/angular/graphql/templates/modal/endpoint-generation-failure-result-modal.html +1 -1
  57. package/dist/js/angular/graphql/templates/modal/import-endpoint-definition-modal.html +1 -1
  58. package/dist/js/angular/security/templates/user.html +8 -5
  59. package/dist/js/angular/security/templates/users.html +1 -1
  60. package/dist/js/angular/ttyg/templates/agent-list.html +1 -1
  61. package/dist/js/angular/ttyg/templates/agent-select-menu.html +1 -1
  62. package/dist/js/angular/ttyg/templates/chat-item-detail.html +1 -1
  63. package/dist/js/angular/ttyg/templates/chat-list.html +1 -1
  64. package/dist/js/angular/ttyg/templates/chat-panel.html +1 -1
  65. package/dist/js/angular/ttyg/templates/modal/agent-instructions-explain-modal.html +1 -1
  66. package/dist/js/angular/ttyg/templates/modal/agent-settings-modal.html +3 -3
  67. package/dist/js/angular/ttyg/templates/modal/external-integration-configuration-modal.html +1 -1
  68. package/dist/js/angular/ttyg/templates/no-agents-view.html +1 -1
  69. package/dist/js/angular/ttyg/templates/ttyg.html +1 -1
  70. package/dist/legacyWorkbench.5ba16dfe45d478531c81.js +3 -0
  71. package/dist/{legacyWorkbench.d546b7e4a3f1505b1746.js.map → legacyWorkbench.5ba16dfe45d478531c81.js.map} +1 -1
  72. package/dist/pages/aclmanagement.html +1 -1
  73. package/dist/pages/autocomplete.html +1 -1
  74. package/dist/pages/choose-repository-type.html +1 -1
  75. package/dist/pages/cluster-management/clusterInfo.html +2 -2
  76. package/dist/pages/create-index.html +1 -1
  77. package/dist/pages/dependencies.html +1 -1
  78. package/dist/pages/domainRangeInfo.html +2 -2
  79. package/dist/pages/edit.html +1 -1
  80. package/dist/pages/explore.html +1 -1
  81. package/dist/pages/export.html +1 -1
  82. package/dist/pages/find.html +1 -1
  83. package/dist/pages/graph-config/saveGraphConfig.html +8 -8
  84. package/dist/pages/graphs-visualizations.html +7 -7
  85. package/dist/pages/guides.html +1 -1
  86. package/dist/pages/home.html +1 -1
  87. package/dist/pages/import.html +2 -2
  88. package/dist/pages/jdbc-create.html +1 -1
  89. package/dist/pages/jdbc.html +1 -1
  90. package/dist/pages/monitor/backup-and-restore.html +1 -1
  91. package/dist/pages/monitor/queries.html +1 -1
  92. package/dist/pages/monitor/resources.html +1 -1
  93. package/dist/pages/namespaces.html +2 -2
  94. package/dist/pages/plugins.html +1 -1
  95. package/dist/pages/rdfClassHierarchyInfo.html +7 -7
  96. package/dist/pages/rdfrank.html +2 -2
  97. package/dist/pages/repositories.html +1 -1
  98. package/dist/pages/repository.html +1 -1
  99. package/dist/pages/similarity-indexes.html +1 -1
  100. package/dist/pages/sparql-editor.html +1 -1
  101. package/dist/pages/sparql-template-create.html +1 -1
  102. package/dist/pages/sparql-templates.html +1 -1
  103. package/dist/pages/ux-test1.html +2 -2
  104. package/dist/pages/webapi.html +2 -2
  105. package/dist/plugins/plugins-bundle.js +1 -1
  106. package/dist/plugins/plugins-bundle.js.map +1 -1
  107. package/dist/plugins.js +1 -1
  108. package/dist/res/swagger5/index.html +11 -11
  109. package/dist/shared-components/collection/pages/js/main.js +1 -1
  110. package/package.json +2 -2
  111. package/dist/30575.19fdf3b549db571bb535.bundle.js.map +0 -1
  112. package/dist/32401.023d0082b98ee532b4d3.bundle.js +0 -2
  113. package/dist/32401.023d0082b98ee532b4d3.bundle.js.map +0 -1
  114. package/dist/44906.6d83b4aafb42ccc2f46c.bundle.js +0 -2
  115. package/dist/44906.6d83b4aafb42ccc2f46c.bundle.js.map +0 -1
  116. package/dist/64700.a10c20a33a6c92f01733.bundle.js.map +0 -1
  117. package/dist/75384.cc7de25be91251aa6aa4.bundle.js.map +0 -1
  118. package/dist/79796.c484b55f1aa1581ac64c.bundle.js +0 -2
  119. package/dist/79796.c484b55f1aa1581ac64c.bundle.js.map +0 -1
  120. package/dist/legacyWorkbench.d546b7e4a3f1505b1746.js +0 -3
  121. /package/dist/{legacyWorkbench.d546b7e4a3f1505b1746.js.LICENSE.txt → legacyWorkbench.5ba16dfe45d478531c81.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"plugins-bundle.js","mappings":"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","sources":["webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-click-to-edit-selected-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-method-ontology-select.js","webpack://graphdb-workbench-plugins/./plugins/guides/autocomplete/autocomplete-enable-checkbox.js","webpack://graphdb-workbench-plugins/./plugins/guides/repositories/select-repository-dropdown.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/copy-text-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-save.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/similarity-click-link.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-parameter-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-readonly-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/input-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/guide-end.js","webpack://graphdb-workbench-plugins/./plugins/guides/options.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-import-file-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-click-tab.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-method-disable.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-click-on-visual-graph-button.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-click-add-namespaces.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ask-ttyg-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-value-filter-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/similarity-search-method.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-types-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-class-list-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-agent-additional-instructions.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-boost-properties-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-id-input.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-create.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-node-focus.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-search-rdf-resources-input.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-value-filter-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-type-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-create-agent-save.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-fts-method-disable.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-editor-run-button.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-connector-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/repositories/repositories-select-repository.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-close-rdf-instances-side-panel.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/wait-for-element-to-hide.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-skip-initial-indexing-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/sparql-search-method.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-editor-expand-results-over-owl.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/read-only-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-search-autocomplete-item.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/select-ttyg-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-parameter-fields-remaining-fields-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/similarity-click-to-create.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-select-agent-from-dropdown.js","webpack://graphdb-workbench-plugins/./plugins/guides/autocomplete/enable-autocomplete.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-stored-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-select-agent-check-for-missing-repository-cancel.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-fts-method-info.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-digram-thickness-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-view-sparql-dialog-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-copy-query-text.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-iri-discovery-search.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-diagram-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-type-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/table-graph-explore.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/fts-search-method.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/similarity-hold-and-wait-until-shown.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-property-chain-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-method-enable.js","webpack://graphdb-workbench-plugins/./plugins/guides/download-guide-resource/download-guide-resource.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-agent-type-agent-name.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-click-to-create-new-chat.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/sparql-search-method-enable-ontology-graph.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-view-sparql-dialog-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-document-filter-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-explain-rdf-instance.js","webpack://graphdb-workbench-plugins/./plugins/guides/import/import-confirm-duplicate-files.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/create-similarity-index.js","webpack://graphdb-workbench-plugins/./plugins/guides/main-menu/click-main-menu.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-fts-method-enable.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-open-view-sparql-query-dialog.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/similarity-type-index-name.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-class-list-selection.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-edit-agent-intro-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-facet-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/conversation-with-ttyg-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-instances.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-search-rdf.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/sparql-search-method-enable-sparql-query.js","webpack://graphdb-workbench-plugins/./plugins/guides/import/import-upload-rdf-file.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-similarity-info-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-edit-agent-click-to-save.js","webpack://graphdb-workbench-plugins/./plugins/guides/autocomplete/autocomplete-focus-on-indexing-status.js","webpack://graphdb-workbench-plugins/./plugins/guides/welcome/welcome.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-expand.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/create-repository.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-hint.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-save.js","webpack://graphdb-workbench-plugins/./plugins/guides/import/import-rdf-file.js","webpack://graphdb-workbench-plugins/./plugins/guides/config.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-field-name-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-zoom-class.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-select-agent-dropdown-open.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/info-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/sparql-search-method-type-graph-name.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-conversation-info-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-results-explain.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-toggle-prefixes.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-create-agent-intro-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-create-agent-click.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-click-on-role.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-default-value-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-digram-predicates-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/edit-ttyg-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-detect-fields-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-import-graph-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-create-graphdb.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-results-explain.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/hold-and-wait-until-hidden.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-editor-include-inferred-data.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-method-sparql-query-select.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-remaining-fields-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-similarity-toggle-off.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-expand-lucene.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-ignore-invalid-values-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-sample-query.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-settings-save.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-top-p.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/clickable-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-select-agent-info-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-strip-markup-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-create-repository.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-ruleset-dropdown.js","webpack://graphdb-workbench-plugins/./plugins/guides/import/import-click-on-import-button.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-ask-agent-explore-sparql.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-starting-point-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-class-list-background-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-share.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/execute-sparql-query.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/toggle-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-array-subparameter-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-settings-click.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/set-max-triples-per-call.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-autocomplete-iri-discovery.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-expand-connector.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/wait-for-element-to-show.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-results-click-on-iri.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-search-rdf-resources-input-autocomplete-item.js","webpack://graphdb-workbench-plugins/./plugins/plugin-service-interface.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/set-max-iris-per-call.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-similarity-select-index.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-description.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-temperature.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-close-view-sparql-query-dialog.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-properties.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-set-maximum-links.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/set-context-window-size.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-datatype-intro.js","webpack://graphdb-workbench-plugins/./plugins/ sync ^(","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-results-click-on-iri.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-explain-class.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-agent-type-model-name.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-link-focus.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-name.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-multivalued-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/import/import-show-progress.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-analyzed-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/create-ttyg-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-ask-explain-answer-more.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-field-name-transform-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-enable-fts.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-create-click.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-analyzer-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/utils.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/focus-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/visualise-sparql-query.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-open-rdf-instances-side-panel.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/show-documentation-link.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/scroll-only-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-starting-point.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-results-visual-button.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-editor.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-dataset-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-languages-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-similarity-toggle-on.js","webpack://graphdb-workbench-plugins/./plugins/guides/rdf-rank/rdf-rank-compute-fill.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-indexed-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-named-graph-selection.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-ask-question.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-select.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-results-row-explain.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-open-view-sparql-query-dialog.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/hold-and-wait-until-shown.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-enabling-sparql-info-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-explain-editor.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-explain-response.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/end-on-api-key-error.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-zoom.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/similarity-view-created-index.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-intro.js","webpack://graphdb-workbench-plugins/webpack/bootstrap","webpack://graphdb-workbench-plugins/webpack/runtime/define property getters","webpack://graphdb-workbench-plugins/webpack/runtime/hasOwnProperty shorthand","webpack://graphdb-workbench-plugins/webpack/runtime/make namespace object","webpack://graphdb-workbench-plugins/./plugins/plugins-bundle.js"],"sourcesContent":["const TTYG_EDIT_AGENT_DEFAULT_TITLE = 'guide.step-action.edit-ttyg-agent';\nconst EDIT_TTYG_AGENT = 'guide.step_plugin.edit-ttyg-agent.edit-agent';\n\n/**\n * @name ttyg-click-to-edit-selected-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click on the edit button to modify the configuration of the selected TTYG agent.\n *\n * Click on edit agent button<br>\n * <img src=\"resources/guides/ttyg/ttyg-click-to-edit-selected-agent.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-click-to-edit-selected-agent\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-click-to-edit-selected-agent',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, EDIT_TTYG_AGENT),\n title: translate(this.translationBundle, TTYG_EDIT_AGENT_DEFAULT_TITLE),\n class: 'edit-agent-btn',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('edit-current-agent')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Edit an agent',\n [EDIT_TTYG_AGENT]: 'Click on the edit agent button to edit the configuration of the selected agent.'\n },\n\n fr: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Modifier un agent',\n [EDIT_TTYG_AGENT]: 'Cliquez sur le bouton « Modifier l\\'agent » pour modifier la configuration de l\\'agent sélectionné.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst ENABLE_ONTOLOGY_FROM_GRAPH = 'guide.step_plugin.sparql-search-method.enable-ontology-from-graph';\n\n/**\n * @name ttyg-sparql-method-ontology-select\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable providing an ontology in a named graph for the SPARQL search method in the TTYG interface.\n * It highlights the checkbox element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable providing an ontology in a named graph.<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-ontology-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-sparql-method-ontology-select\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-method-ontology-select',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, ENABLE_ONTOLOGY_FROM_GRAPH),\n class: 'enable-ontology-from-graph',\n // If mainAction is set the title will be set automatically\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('sparql-ontology-graph-option'),\n clickableElementSelector: GuideUtils.getGuideElementSelector('sparql-ontology-graph-option-input'),\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(GuideUtils.getGuideElementSelector('sparql-ontology-graph-option-input')))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [ENABLE_ONTOLOGY_FROM_GRAPH]: 'Click on the toggle to enable providing an ontology in a named graph.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [ENABLE_ONTOLOGY_FROM_GRAPH]: 'Cliquez sur la case à cocher pour activer la fourniture d\\'une ontologie dans un graphe nommé.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.autocomplete.default.title';\nconst CONTENT = 'guide.step_plugin.autocomplete-enable-checkbox.content';\n\n/**\n * @name autocomplete-enable-checkbox\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `autocomplete-enable-checkbox` step shows the user how to enable the autocomplete index in GraphDB.<br>\n * <img src=\"resources/guides/autocomplete/autocomplete-enable-checkbox.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"autocomplete-enable-checkbox\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'autocomplete-enable-checkbox',\n getSteps: function(options, services) {\n const translate = services.translate;\n let checkboxElement;\n let autocompleteCheckboxClickEventHandler;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n class: 'enable-autocomplete-checkbox',\n ...options,\n url: 'autocomplete',\n elementSelector: services.GuideUtils.getGuideElementSelector('autocompleteCheckbox'),\n // Disable default behavior of service when element is clicked.\n advanceOn: undefined,\n beforeShowPromise: () => services.GuideUtils.getOrWaitFor(services.GuideUtils.getGuideElementSelector('autocompleteCheckbox'), 5),\n show: (guide) => () => {\n checkboxElement = document.querySelector(services.GuideUtils.getGuideElementSelector('autocompleteCheckbox'));\n autocompleteCheckboxClickEventHandler = () => {\n // If autocomplete is enabled go to the next step.\n services.GuideUtils.deferredShow(200)()\n .then(() => {\n if (services.GuideUtils.isGuideElementChecked('autocompleteCheckbox', ' input')) {\n guide.next();\n }\n });\n };\n // Add a listener that will complete this step and continue with the guide if checkbox is checked\n checkboxElement.addEventListener('mouseup', autocompleteCheckboxClickEventHandler);\n },\n onNextClick: (guide) => {\n if (!services.GuideUtils.isGuideElementChecked('autocompleteCheckbox', ' input')) {\n checkboxElement.click();\n }\n guide.next();\n },\n hide: () => () => {\n // Remove the listener from element. It is important when step is hidden.\n checkboxElement.removeEventListener('mouseup', autocompleteCheckboxClickEventHandler);\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Enable autocomplete',\n [CONTENT]: 'Click on the checkbox to enable the index.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Activer la saisie semi-automatique',\n [CONTENT]: 'Cliquez sur la case à cocher pour activer l\\'indexation.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst REPOSITORIES_SELECT_REPOSITORY_DEFAULT_TITLE = 'guide.step-action.select-repository';\nconst CHOOSE_REPOSITORY = 'guide.step_plugin.choose-repository.content';\nconst SELECT_REPOSITORY = 'guide.step_plugin.select-repository.content';\nconst SKIP_SECTION = 'skip-section';\nconst UNEXPECTED_ERROR_MESSAGE = 'guide.unexpected.error.message';\n\n/**\n * @name select-repository-dropdown\n * @memberof module:Interactive Guide\n *\n * @description\n * Composite step, guiding the user to select a repository from the dropdown.\n * It prompts the user to click the dropdown button and select a repository from the list.\n *\n * Click on the dropdown button example<br>\n * <img src=\"resources/guides/repository/select-repository-dropdown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select a repository from the dropdown example<br>\n * <img src=\"resources/guides/repository/select-repository-dropdown-2.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"select-repository-dropdown\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'select-repository-dropdown',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n options.mainAction = 'select-repository';\n let repositorySelectorElement;\n let mouseUpHandler;\n\n options.title = options.title ?? translate(this.translationBundle, REPOSITORIES_SELECT_REPOSITORY_DEFAULT_TITLE);\n\n return [{\n guideBlockName: 'clickable-element',\n options: {\n skipPoint: true,\n skipButtonLabel: translate(this.translationBundle, SKIP_SECTION),\n content: translate(this.translationBundle, CHOOSE_REPOSITORY),\n elementSelector: '.onto-repository-selector',\n class: 'repositories-group-button',\n onNextClick: GuideUtils.clickOnElement('.onto-repository-selector .onto-dropdown-button'),\n ...options\n }\n }, {\n guideBlockName: 'clickable-element',\n options: {\n elementSelector: () => {\n return Utils.getRepositoryElementSelector(services, options);\n },\n class: 'repository-select-button',\n advanceOn: undefined,\n beforeShowPromise: () => services.GuideUtils.waitFor(Utils.getRepositoryElementSelector(services, options), 1)\n .then((element) => repositorySelectorElement = element)\n .catch((error) => {\n services.toastr.error(translate(this.translationBundle, UNEXPECTED_ERROR_MESSAGE));\n throw (error);\n }),\n show: (guide) => () => {\n Utils.setRepositorySelectorAutoClose(false);\n const currentStep = guide.getCurrentStep();\n if (currentStep) {\n // We don't know if the user has created a repo in the previous step, or not.\n // That's why we need to update the step at the time of showing it, to know if the incremented\n // repositoryId exists. If not we default to options.repositoryIdBase\n const repositoryId = Utils.getRepositoryName(services, options);\n currentStep.updateStepOptions({\n text: translate(this.translationBundle, SELECT_REPOSITORY, {repositoryId})\n });\n }\n // Added listener to the element.\n if (repositorySelectorElement) {\n mouseUpHandler = () => guide.next();\n repositorySelectorElement.addEventListener('click', mouseUpHandler);\n }\n },\n onNextClick: () => {\n repositorySelectorElement.click();\n },\n hide: () => () => {\n Utils.setRepositorySelectorAutoClose(true);\n if (repositorySelectorElement) {\n repositorySelectorElement.removeEventListener('click', mouseUpHandler);\n }\n },\n canBePaused: false,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_SELECT_REPOSITORY_DEFAULT_TITLE]: 'Connect to repository',\n [CHOOSE_REPOSITORY]: 'Click on the repository selection dropdown.',\n [SELECT_REPOSITORY]: 'Click on the <b>{{repositoryId}}</b> repository button.',\n [SKIP_SECTION]: 'Skip section',\n [UNEXPECTED_ERROR_MESSAGE]: 'The guide was cancelled due to an unexpected error. Please run the guide again and if the problem persists contact the support.'\n },\n fr: {\n [REPOSITORIES_SELECT_REPOSITORY_DEFAULT_TITLE]: 'Se connecter au dépôt',\n [CHOOSE_REPOSITORY]: 'Cliquez sur la liste déroulante de sélection du dépôt.',\n [SELECT_REPOSITORY]: 'Cliquez sur le bouton de dépôt <b>{{repositoryId}}</b>.',\n [SKIP_SECTION]: 'Sauter la section',\n [UNEXPECTED_ERROR_MESSAGE]: 'Le guide a été annulé en raison d\\'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst COPY_TEXT = 'guide.step_plugin.core-steps.copy-text-element.copy-to-input';\nconst COPY_TEXT_ELEMENT = 'guide.step_plugin.core-steps.copy-text-element.content';\n\n/**\n * @name copy-text-element\n * @memberof module:Interactive Guide\n *\n * @description\n * Step that shows an input-like step with a code block containing provided text and a button to copy that\n * text into a target input (specified by `options.elementSelector`). It internally uses `input-element` to render the\n * step and manages attaching/removing the copy click listener when the step is shown/hidden.\n *\n * Copy text element example<br>\n * <img src=\"resources/guides/core/copy-text-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.text - The text content to display and copy into the target input.\n * @property {string} options.elementSelector - CSS selector of the target input where text will be inserted on copy.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"copy-text-element\",\n * \"options\": {\n * \"elementSelector\": \"#query-input\",\n * \"text\": \"SELECT * WHERE { ?s ?p ?o }\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'copy-text-element',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const GuideUtils = pluginService.GuideUtils;\n\n const text = options.text;\n const code = document.createElement('code');\n code.innerText = text;\n code.dataset.test = 'code-to-copy-element';\n\n const copy = document.createElement('button');\n const copyToInputQueryButtonClass = 'guide-copy-to-input-query-button';\n copy.className = `btn btn-sm btn-secondary ${copyToInputQueryButtonClass}`;\n copy.innerText = translate(this.translationBundle, COPY_TEXT);\n\n let stepHTMLElement;\n const copyToInputListener = Utils.createCopyToInputListener(GuideUtils.getElementSelector(options.elementSelector), text);\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n ...options,\n content: translate(this.translationBundle, COPY_TEXT_ELEMENT, {textAsHtmlCodeElement: '<div class=\"shepherd-code\">' + code.outerHTML + copy.outerHTML + '</div>'}),\n show: (guide) => () => {\n stepHTMLElement = guide.currentStep.el.querySelector(`.${copyToInputQueryButtonClass}`);\n stepHTMLElement.addEventListener('click', copyToInputListener);\n },\n hide: () => () => {\n if (stepHTMLElement) {\n stepHTMLElement.removeEventListener('click', copyToInputListener);\n }\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [COPY_TEXT]: 'Copy to input',\n [COPY_TEXT_ELEMENT]: 'Enter the following in the input: {{textAsHtmlCodeElement}}'\n },\n fr: {\n [COPY_TEXT]: 'Copier dans la saisie',\n [COPY_TEXT_ELEMENT]: 'Entrez le texte suivant dans la saisie : {{textAsHtmlCodeElement}}'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_SAVE_CONTENT = 'guide.step-action.visual-graph-config-save-content';\n\n/**\n * @name visual-graph-config-save\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click the save button to save the visual graph configuration.\n *\n * Save visual graph config step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-save\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-save',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('save-graph-config');\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_SAVE_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n elementSelector,\n onNextClick: GuideUtils.clickOnElement(elementSelector),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_SAVE_CONTENT]: 'Click to save the visual graph configuration.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_SAVE_CONTENT]: 'Cliquez pour enregistrer la configuration du graphique visuel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const CREATE_SIMILARITY_INDEX_DEFAULT = 'guide.step-action.create-similarity-index';\nconst CREATE_INDEX = 'guide.step_plugin.create-similarity-index.create-similarity-index';\n\n/**\n * @name similarity-click-link\n * @memberof module:Interactive Guide\n *\n * @description\n * This step highlights the \"Create Similarity index\" link and prompts the user to click it.\n *\n * Click the link to start creating a new Similarity index<br>\n * <img src=\"resources/guides/similarity-index/similarity-click-link.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-click-link\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'similarity-click-link',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CREATE_INDEX),\n title: translate(this.translationBundle, CREATE_SIMILARITY_INDEX_DEFAULT),\n class: 'similarity-index',\n disableNextFlow: true,\n ...options,\n url: 'similarity',\n elementSelector: GuideUtils.getGuideElementSelector('create-similarity-index'),\n onNextClick: () => {\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Create Similarity index',\n [CREATE_INDEX]: 'Click the link to start creating a new Similarity index'\n },\n fr: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Créer un indice de similitude',\n [CREATE_INDEX]: 'Cliquez sur le lien pour commencer à créer un nouvel indice de similitude.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst FIELD_INTRO_CONTENT = 'guide.step_plugin.connectors-lucene-fields-intro.content';\n\n/**\n * @name connectors-lucene-fields-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the fields configuration of the Lucene connector in GraphDB.\n * It provides an overview of how fields define the synchronization units between GraphDB and Lucene.\n *\n * Lucene connector fields introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, FIELD_INTRO_CONTENT),\n scrollOffset: GuideUtils.SCROLL_OFFSET.CENTER,\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [FIELD_INTRO_CONTENT]: 'The fields define exactly what parts of each entity will be synchronized as well as the specific details on the connector side. The field is the smallest synchronization unit, and it maps a property chain from GraphDB to a field in Lucene. The fields are specified as a list of field objects. At least one field object is required.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [FIELD_INTRO_CONTENT]: 'Les champs définissent exactement quelles parties de chaque entité seront synchronisées ainsi que les détails spécifiques du côté du connecteur. Le champ est la plus petite unité de synchronisation et il mappe une chaîne de propriétés de GraphDB vers un champ dans Lucene. Les champs sont spécifiés sous forme de liste d’objets champ. Au moins un objet champ est requis.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorContentSelector, getConnectorNameSelector, getConnectorParameterSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst PARAMETER_INTRO = 'guide.step_plugin.connectors-parameter-intro.content';\n\n/**\n * @name connectors-parameter-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step showcases a parameter of a connector instance.\n *\n * Connectors parameter introduction<br>\n * <img src=\"resources/guides/connectors/connectors-parameter-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the parameter is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n * @property {string} parameterName - the specific creation parameters name for <code>instanceName</code>.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-parameter-intro\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\",\n * \"parameterName\": \"hosts\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-parameter-intro',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n * - <b>parameterName</b>: string (required) – the specific creation parameters name for <code>instanceName</code>.\n */\n getSteps: function(options, services) {\n const translate = services.translate;\n const connectorNameSelector = getConnectorNameSelector(options, services);\n const connectorContentSelector = getConnectorContentSelector(options, services);\n const parameterSelector = getConnectorParameterSelector(options, services);\n return [{\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-connector-intro',\n content: translate(this.translationBundle, PARAMETER_INTRO),\n ...options,\n elementSelector: `${connectorNameSelector} ${connectorContentSelector} ${parameterSelector}`,\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [PARAMETER_INTRO]: 'The creation parameters for luc:createConnector define how a connector instance is created. They are provided in a JSON object with parameter names as keys. Some parameters are required, others optional, and values can be simple types, lists, or objects.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [PARAMETER_INTRO]: 'Les paramètres de création pour luc:createConnector définissent comment une instance de connecteur est créée. Ils sont fournis dans un objet JSON avec les noms des paramètres comme clés. Certains paramètres sont obligatoires, d\\'autres optionnels, et les valeurs peuvent être des types simples, des listes ou des objets.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst READONLY_INTRO = 'guide.step_plugin.connectors-lucene-readonly-intro.content';\n\n/**\n * @name connectors-lucene-readonly-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Readonly\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Readonly\" option in setting the connector to read-only mode.\n *\n * Lucene connector readonly introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-readonly-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-readonly-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-readonly-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, READONLY_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-readonly-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'readonly'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [READONLY_INTRO]: 'The <b>Readonly</b> option puts the connector in read-only mode. In this mode, the connector indexes data only at creation time and does not respond to updates. Reindexing requires repair or recreation.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [READONLY_INTRO]: 'L’option <b>Lecture seule</b> met le connecteur en mode lecture seule. Dans ce mode, le connecteur indexe les données uniquement lors de la création et ne répond pas aux mises à jour. Le réindexage nécessite une réparation ou une recréation.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\nimport {BASIC_STEP} from '../config.js';\n\n/**\n * @name input-element\n * @memberof module:Interactive Guide\n *\n * @description\n * Focuses a specific input element and allows the user to type into it.\n *\n * Input element example<br>\n * <img src=\"resources/guides/core/input-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"input-element\",\n * \"options\": {\n * \"elementSelector\": \"#query-input\",\n * \"content\": \"Type your query here.\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'input-element',\n getStep: (options, services) => {\n const notOverridable = {\n type: 'input'\n };\n const stepDescription = {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n ...options,\n ...notOverridable\n };\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(services, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\n\nconst GUIDE_END_TITLE = 'guide.step_plugin.guide-ended.title';\nconst GUIDE_END_CONTENT = 'guide.step_plugin.guide-ended.content';\n/**\n * @name guide-end\n * @memberof module:Interactive Guide\n *\n * @description\n * Final step indicating the guide has ended.\n *\n * Final step example<br>\n * <img src=\"resources/guides/core/guide-end.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} [options.title] - A custom title for the final step.\n * @property {string} [options.content] - A custom content/message for the final step.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"guide-end\",\n * \"options\": {\n * \"title\": \"All done!\",\n * \"content\": \"You have completed the guide.\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'guide-end',\n getStep: function(options, pluginService) {\n const translate = pluginService.translate;\n const notOverridable = {\n type: 'readonly',\n title: options.title || translate(this.translationBundle, GUIDE_END_TITLE),\n content: options.content || translate(this.translationBundle, GUIDE_END_CONTENT),\n lastStep: true\n };\n return {\n ...BASIC_STEP,\n initPreviousStep: pluginService.GuideUtils.defaultInitPreviousStep,\n ...options,\n ...notOverridable\n };\n },\n translationBundle: {\n en: {\n [GUIDE_END_TITLE]: 'End of guide',\n [GUIDE_END_CONTENT]: 'This guide has ended.'\n },\n fr: {\n [GUIDE_END_TITLE]: 'Fin du guide',\n [GUIDE_END_CONTENT]: 'Ce guide est terminé.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name Options\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * Common options for configuring a guide step. These options control the behavior\n * and appearance of steps within a guide and applied to all steps.\n *\n * Individual steps can define additional options on top of these common ones as needed.\n *\n * The options object contains settings, parameters, and configurations passed from\n * the guide definition, and they are used by the step to determine its behavior,\n * content, and placement.\n *\n *\n * @property {string} translatedGuideName - The translated name of the interactive guide to which this step belongs.\n * Represents the localized name of the guide currently in progress.\n * @property {string} translatedGuideDescription - The translated description of the interactive guide to which this step belongs.\n * Represents the localized description of the guide currently in progress.\n * @property {string} title - A string that will be displayed as the step title in the dialog header.\n * @property {string} content - The main content displayed in the dialog body.\n * @property {string} extraContent - A string displayed as additional content below the main content in the dialog body.\n * @property {string} [elementSelector] - A CSS selector for the element that should be highlighted when this step is active.\n * @property {string} [placement='bottom'] - A string that defines where the step dialog should be placed\n * relative to the highlighted element:\n * - auto | auto-start | auto-end\n * - top | top-start | top-end\n * - bottom | bottom-start | bottom-end\n * - right | right-start | right-end\n * - left | left-start | left-end\n * @property {string} [url] - A string that defines the URL where the step should be active.\n * If the current URL does not match the step URL, the guide will navigate to the step URL\n * before activating the step.\n * @property {number} [maxWaitTime=3] - The maximum time (in seconds) to wait for the element to appear on the screen.\n * @property {boolean} [disablePreviousFlow=true] - A boolean that defines whether the user can go back to the previous step.\n * @property {boolean} [skipPoint=false] - A boolean that defines whether this step can be used as a skip point. When true, a \"Skip\" button will appear\n * in the dialog, allowing the user to skip the guide from this point. When clicked, the guide will continue at\n * the next step marked as a skip point. If no further skip points are defined, the guide will be finished.\n * @property {string} [className] - A string that defines additional CSS classes to be added to the step dialog.\n * @property {Object} [skipButtonLabel] - The bundle object, containing the label for the skip button in different languages.\n * ```javascript\n * skipButtonLabel = {\n * en: 'Skip',\n * fr: 'Sauter'\n * };\n * ```\n */\nexport class Options {\n translatedGuideName = '';\n translatedGuideDescription = '';\n title = '';\n content = '';\n extraContent = '';\n elementSelector = undefined;\n placement = 'bottom';\n url = undefined;\n maxWaitTime = 3;\n disablePreviousFlow = true;\n skipPoint = false;\n skipButtonLabel = {\n en: 'Skip',\n fr: 'Sauter'\n };\n class = '';\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst IMPORT_FILE = 'guide.step_plugin.connectors-lucene-import-file-intro.content';\n\n/**\n * @name connectors-lucene-import-file-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"importFile\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"importFile\" parameter, which allows creating a connector from an RDF file.\n *\n * Lucene connector importFile introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-import-file-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-import-file-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-import-file-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, IMPORT_FILE),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-import-file-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'importFile'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [IMPORT_FILE]: 'The <b>importFile</b> parameter creates the connector from an RDF file. Requires <b>readonly</b> mode; the value must be the full path to the RDF file.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [IMPORT_FILE]: 'Le paramètre <b>importFile</b> crée le connecteur à partir d’un fichier RDF. Nécessite le mode <b>lecture seule</b> ; la valeur doit être le chemin complet vers le fichier RDF.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_CLICK_TAB_CONTENT = 'guide.step-action.visual-graph-config-click-tab';\nconst TAB_1 = 'guide.step-visual-graph-config-tab.1';\nconst TAB_2 = 'guide.step-visual-graph-config-tab.2';\nconst TAB_3 = 'guide.step-visual-graph-config-tab.3';\nconst TAB_4 = 'guide.step-visual-graph-config-tab.4';\nconst TAB_5 = 'guide.step-visual-graph-config-tab.5';\n\nconst TAB_CONFIG = {\n startingPoint: {index: 1, translationKey: TAB_1},\n graphExpansion: {index: 2, translationKey: TAB_2},\n nodeBasics: {index: 3, translationKey: TAB_3},\n edgeBasics: {index: 4, translationKey: TAB_4},\n nodeExtra: {index: 5, translationKey: TAB_5}\n};\n\n/**\n * @name visual-graph-config-click-tab\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click on a specific tab in the Visual Graph configuration page.\n * The step will be skipped if the tab is already active.<br>\n *\n * Click on a config tab step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-click-tab.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} options.tabName - The name of the tab to click. Must be one of `startingPoint`, `graphExpansion`, `nodeBasics`, `edgeBasics`, or `nodeExtra`.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-click-tab\",\n * \"options\": {\n * \"tabName\": \"startingPoint\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-click-tab',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const tabConfig = TAB_CONFIG[options.tabName];\n const tab = translate(this.translationBundle, tabConfig.translationKey);\n const elementSelector = GuideUtils.getGuideElementSelector(`graph-config-tab-${tabConfig.index}`);\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_CLICK_TAB_CONTENT, {tab}),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n elementSelector: GuideUtils.getGuideElementSelector(`graph-config-tab-${tabConfig.index}`),\n ...options,\n onNextClick: () => {\n document.querySelector(elementSelector)?.click();\n },\n showOn: () => {\n const element = document.querySelector(elementSelector);\n return !element?.classList?.contains('active');\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_CLICK_TAB_CONTENT]: 'Click on the <b>{{tab}}</b> tab',\n [TAB_1]: 'Starting point',\n [TAB_2]: 'Graph expansion',\n [TAB_3]: 'Node basics',\n [TAB_4]: 'Edge basics',\n [TAB_5]: 'Node extra'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_CLICK_TAB_CONTENT]: 'Cliquez sur l\\'onglet <b>{{tab}}</b>',\n [TAB_1]: 'Point de départ',\n [TAB_2]: 'Expansion du graphique',\n [TAB_3]: 'Bases des nœuds',\n [TAB_4]: 'Bases des arêtes',\n [TAB_5]: 'Extra des nœuds'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst DISABLE_TOGGLE = 'guide.step_plugin.sparql-search-method.disable-toggle';\n\n/**\n * @name ttyg-sparql-method-disable\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is used to disable the SPARQL search method in the TTYG plugin.\n * It is a clickable step, which means that the user can disable the switch, but enabling will not be allowed.\n *\n * Disable SPARQL query search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-disable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * guideBlockName: 'ttyg-sparql-method-disable',\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-method-disable',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-sparql_search-input');\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n content: translate(this.translationBundle, DISABLE_TOGGLE),\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n class: 'toggle-sparql-search',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-sparql_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(!GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [DISABLE_TOGGLE]: 'Click on the toggle to disable SPARQL search query method.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [DISABLE_TOGGLE]: 'Cliquez sur le bouton pour désactiver la méthode de recherche SPARQL..'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_TITLE = 'view.resource.title';\nconst RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_CONTENT = 'guide.step_plugin.resource-click-on-visual-graph-button.content';\n/**\n * @name resource-click-on-visual-graph-button\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-click-on-visual-graph-button` guide step guides the user to click on the Visual Graph button\n * in the resource view.\n *\n * <img src=\"resources/guides/resource/resource-click-on-visual-graph-button.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-click-on-visual-graph-button\",\n * \"options\": {\n * \"skipUrl\": false\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-click-on-visual-graph-button',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_CONTENT),\n title: translate(this.translationBundle, RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_TITLE),\n ...options,\n ...(options.skipUrl ? {} : {url: Utils.getResourceURL(options)}),\n elementSelector: GuideUtils.getGuideElementSelector('explore-visual'),\n class: 'resource-click-on-visual-graph-button',\n onNextClick: (guide, step) => {\n GuideUtils.waitFor(step.elementSelector, 3)\n .then(() => document.querySelector(step.elementSelector).click());\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_TITLE]: 'Resource',\n [RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_CONTENT]: 'Click on the <b>Visual graph</b> button.'\n },\n fr: {\n [RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_TITLE]: 'Ressource',\n [RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_CONTENT]: 'Cliquez sur le bouton <b>Graphique visuel</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst ADD_MISSING_NAMESPACES = 'guide.step_plugin.sparql-search-method.add-missing-namespaces';\n/**\n * @name ttyg-sparql-click-add-namespaces\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is used to guide users to enable the \"Add missing namespaces\" option in the TTYG agent SPARQL query settings.\n * It is a toggle step, which means that the user can enable the switch, but disabling will not be allowed.\n *\n * TTYG SPARQL add missing namespaces option<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-click-add-namespaces.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * guideBlockName: 'ttyg-sparql-click-add-namespaces',\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-click-add-namespaces',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE);\n const namespacesCheckbox = GuideUtils.getGuideElementSelector('add-missing-namespaces-input');\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n title,\n content: translate(this.translationBundle, ADD_MISSING_NAMESPACES),\n class: 'enable-sparql-query',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('add-missing-namespaces-option'),\n toggleableElementSelector: namespacesCheckbox,\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(namespacesCheckbox))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [ADD_MISSING_NAMESPACES]: 'Check to automatically add missing namespaces.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [ADD_MISSING_NAMESPACES]: 'Cochez pour ajouter automatiquement les espaces de noms manquants.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name ask-ttyg-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that may show a sequence of steps to guide the user through asking a question to a TTYG agent,\n * explaining the response, exploring SPARQL queries, and asking for more explanations. The difference between this and\n * the `ttyg-ask-question` step is that this step may include explanation and exploring SPARQL queries\n *\n * Ask an individual question<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-question.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Wait for the response<br>\n * <img src=\"resources/guides/ttyg/ttyg-wait-for-response.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Explain the response<br>\n * <img src=\"resources/guides/ttyg/ttyg-explain-response.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Explore the SPARQL query<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-agent-explore-sparql.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Ask for more explanation<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-explain-answer-more.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} [options.question] - The question to be asked to the TTYG agent. This will be displayed in the instructions.\n * @property {boolean} [options.explain] - Whether to include the explanation step after asking the question.\n * @property {boolean} [options.explainMore] - Whether to include the step for asking more explanation after the explanation step.\n * @property {boolean} [options.exploreSparql] - Whether to include the step for exploring the SPARQL query after the explanation step.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ask-ttyg-agent\",\n * \"options\": {\n * \"question\": \"Count all the web pages published in 2020? Provide five sample names.\",\n * \"explain\": true,\n * \"explainMore\": true,\n * \"exploreSparql\": true\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ask-ttyg-agent',\n getSteps: (options) => {\n options.mainAction = 'ask-ttyg-agent';\n options.maxWaitTime = 10;\n options.forceReload = false;\n\n const explain = options.explain;\n const explainMore = options.explainMore;\n const exploreSparql = options.exploreSparql;\n\n const steps = [\n {\n guideBlockName: 'ttyg-ask-question', options: {...options, skipPoint: true}\n }\n ];\n\n if (explain) {\n steps.push(\n {\n guideBlockName: 'ttyg-explain-response', options: {...options}\n }\n );\n }\n\n if (explain && exploreSparql) {\n steps.push(\n {\n guideBlockName: 'ttyg-ask-agent-explore-sparql', options: {...options}\n }\n );\n }\n\n if (explain && explainMore) {\n steps.push(\n {\n guideBlockName: 'ttyg-ask-explain-answer-more', options: {...options}\n }\n );\n }\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst VALUE_FILTER_INTRO = 'guide.step_plugin.connectors-lucene-fields-value-filter-intro.content';\n\n/**\n * @name connectors-lucene-fields-value-filter-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Value Filter\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Value Filter\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector value filter introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-value-filter-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-value-filter-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-value-filter-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, VALUE_FILTER_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-value-filter-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'valueFilter'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [VALUE_FILTER_INTRO]: 'The <b>Value filter</b> specifies the filter applied to values for this field.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [VALUE_FILTER_INTRO]: 'Le <b>filtre de valeurs</b> spécifie le filtre appliqué aux valeurs de ce champ.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.similarity-search-method';\n\n/**\n * @name similarity-search-method\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through enabling or disabling the Similarity search query method in the TTYG interface.\n * It includes steps to provide information about the Similarity search method, enable it if it's disabled, or disable it if it's enabled.\n * If disabled, it will show only the step to disable it. If not disabled, it will show the steps to enable it and select the index to use.\n *\n * Disable Similarity search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-toggle-off.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Show information about Similarity search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enable Similarity search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-toggle-on.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select index for Similarity search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-select-index.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following specific options:\n *\n * @property {boolean} [options.disable] - If true, the step will guide the user to disable the Similarity search method. If false or not provided, it will guide to enable it.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-search-method\",\n * \"options\": {\n * \"disable\": false\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'similarity-search-method',\n getSteps: function(options, services) {\n options.mainAction = 'similarity-search-method';\n const translate = services.translate;\n options.title = options.title ?? translate(this.translationBundle, SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE);\n\n const shouldToggleOff = options.disable;\n\n if (shouldToggleOff) {\n return [{\n guideBlockName: 'ttyg-similarity-toggle-off', options: {...options}\n }];\n }\n\n return [\n {\n guideBlockName: 'ttyg-similarity-info-message', options: {...options}\n },\n {\n guideBlockName: 'ttyg-similarity-toggle-on', options: {...options}\n },\n {\n guideBlockName: 'ttyg-similarity-select-index', options: {...options}\n }\n ];\n },\n translationBundle: {\n en: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Similarity search query method'\n },\n fr: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche par similarité'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst TYPES_INTRO = 'guide.step_plugin.connectors-lucene-types-intro.content';\n\n/**\n * @name connectors-lucene-types-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Types\" parameter within the Lucene connector configuration in GraphDB.\n * It explains the purpose and usage of the \"Types\" option in specifying RDF types of entities to synchronize.\n *\n * Lucene connector types introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-types-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-types-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-types-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, TYPES_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-types-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'types'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [TYPES_INTRO]: 'The <b>Types</b> option specifies RDF types of entities to synchronize, given as a list of IRIs (at least one required).<ul>Special values: <li><b>$any</b>: sync entities with at least one RDF type.</li><li><b>$untyped</b>: sync entities even if they have no RDF type.</li></ul>'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [TYPES_INTRO]: 'L’option <b>Types</b> spécifie les types RDF des entités à synchroniser, sous forme de liste d’IRI (au moins un requis).<ul>Valeurs spéciales : <li><b>$any</b> : synchronise les entités ayant au moins un type RDF.</li><li><b>$untyped</b> : synchronise les entités même si elles n’ont pas de type RDF.</li></ul>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-class-list-intro.content';\n\n/**\n * @name class-relationships-class-list-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-class-list-intro` step displays a dialog that explains class dependency table in\n * the Class relationships view.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-class-list-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-class-list-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-class-list-intro',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('class-list-wrapper'),\n placement: 'right',\n class: 'class-relationships-class-list-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'The left panel shows all classes, sorted by number of links, displaying both incoming and outgoing connections.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Le panneau de gauche montre toutes les classes, triées par nombre de liens, affichant les connexions entrantes et sortantes.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst CONFIGURE_USER_INSTRUCTIONS = 'guide.step_plugin.configure-agent.user-instructions-input';\n\n/**\n * @name configure-agent-additional-instructions\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to add additional instructions for the TTYG agent.\n * It highlights the input area where the user can type their instructions and provides a text to copy\n *\n * * Add additional instructions<br>\n * <img src=\"resources/guides/ttyg/configure-agent-additional-instructions.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n * @property {string} [userInstructions] - The additional instructions to be passed to the agent. This will be displayed in the instructions.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-agent-additional-instructions\",\n * \"options\": {\n * \"userInstructions\": \"When writing SPARQL queries, please do not bind inside the query select clause. Also add all prefix definitions when writing the query\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-agent-additional-instructions',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'copy-text-element',\n options: {\n extraContent: translate(this.translationBundle, CONFIGURE_USER_INSTRUCTIONS),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n class: 'input-user-instructions',\n disablePreviousFlow: false,\n text: options.userInstructions,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('user-instructions'),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(GuideUtils.getGuideElementSelector('user-instructions'), options.userInstructions, false))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [CONFIGURE_USER_INSTRUCTIONS]: 'Those are additional instructions which will be passed to the agent.'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [CONFIGURE_USER_INSTRUCTIONS]: 'Ce sont des instructions supplémentaires qui seront transmises à l\\'agent.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst BOOST_PROPERTIES = 'guide.step_plugin.connectors-lucene-boost-properties-intro.content';\n\n/**\n * @name connectors-lucene-boost-properties-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"boostProperties\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"boostProperties\" in specifying document-specific boost properties.\n *\n * Lucene connector boost properties introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-boost-properties-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-boost-properties-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-boost-properties-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, BOOST_PROPERTIES),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-boost-properties-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'boostProperties'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [BOOST_PROPERTIES]: 'The <b>boostProperties</b> parameter specifies a comma-delimited list of properties whose values will be used for document-specific boost.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [BOOST_PROPERTIES]: 'Le paramètre <b>boostProperties</b> spécifie une liste de propriétés séparées par des virgules dont les valeurs seront utilisées pour un boost spécifique au document.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst REPOSITORY_ID_CONTENT = 'guide.step_plugin.create_repository.repository_id.content';\n\n/**\n * @name repositories-id-input\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enter a repository ID.\n *\n * Repository ID input step<br>\n * <img src=\"resources/guides/repository/repositories-id-input.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Takes repositoryId from\n * repositoryIdBase + index if needed\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-id-input\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-id-input',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const repositoryIdInputSelector = GuideUtils.getGuideElementSelector('graphDBRepositoryIdInput');\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, REPOSITORY_ID_CONTENT, {repositoryId: options.repositoryId}),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'gdb-repository-id-input',\n ...options,\n url: 'repository/create/graphdb',\n elementSelector: repositoryIdInputSelector,\n disablePreviousFlow: false,\n onNextValidate: () =>\n Promise.resolve(\n GuideUtils.validateTextInput(\n repositoryIdInputSelector,\n options.repositoryId\n )\n )\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [REPOSITORY_ID_CONTENT]: 'Enter repository ID: <b>{{repositoryId}}.</b>'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [REPOSITORY_ID_CONTENT]: 'Entrez l\\'ID du dépôt : <b>{{repositoryId}}.</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\n\n/**\n * @name visual-graph-config-create\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through the full process of creating a new visual graph configuration.\n * It includes navigating to the visual graph page, creating and naming the configuration, optionally adding a description\n * and hint, configuring tabs with starting points, SPARQL queries, or resource IRIs, and saving the configuration.\n *\n * The step sequence is dynamic and depends on the provided options. Some steps are always included, while others\n * appear only when certain options are provided.\n *\n * **Always included steps:**\n *\n * Navigate to the visual graph page via the Explore main menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-explore.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click the button to create a new configuration<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-create-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enter a name for the configuration<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Introduction to the starting point configuration<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * **Optional steps (based on options):**\n *\n * Enter a description for the configuration (when `options.configDescription` is provided)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-description.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enter a hint IRI for the configuration (when `options.configHint` is provided)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-hint.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * **Tab configuration steps (based on `options.tabConfig`):**\n *\n * If `options.tabConfig` is not provided or is empty, the step sequence ends after the starting point intro.\n * Otherwise, for each entry in the `tabConfig` array, the following steps are added:\n *\n * Click on a configuration tab (skipped if the tab is already active)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-click-tab.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select a starting point type (when `tabConfig.startingPoint` is provided)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-search.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-fixed.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-query.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Search for a resource IRI (when `tabConfig.iri` and `tabConfig.searchTerm` are provided).\n * **Cannot be combined with `tabConfig.query`** — only one of `iri`/`searchTerm` or `query` should be set per tab config entry.<br>\n * <img src=\"resources/guides/resource/resource-search-rdf.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select the resource from autocomplete results<br>\n * <img src=\"resources/guides/resource/resource-search-autocomplete-item.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enter a SPARQL query (when `tabConfig.query` is provided).\n * **Cannot be combined with `tabConfig.iri`/`tabConfig.searchTerm`** — only one of `query` or `iri`/`searchTerm` should be set per tab config entry.<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Toggle include inferred data (when `tabConfig.includeInferredData` is provided)<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-include-inferred-data.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Toggle expand results over owl:sameAs (when `tabConfig.expandResultsOverOwl` is provided)<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-expand-results-over-owl.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * View sample queries (when `tabConfig.sampleQueryContent` is provided)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-sample-query.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * **Post-configuration steps (only when `options.tabConfig` is provided):**\n *\n * Share the configuration with other users (when `options.shareConfig` is `true`)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-share.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Save the configuration<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select the newly created configuration<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Open graph settings<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-settings-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Set the maximum number of links<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-set-maximum-links.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Save the graph settings<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-settings-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Expand a node in the visual graph (when `options.expandIri` is provided)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-expand.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Zoom the visual graph<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-zoom.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} [options.configDescription] - Optional. The description for the configuration. When provided, the description step is included.\n * @property {string} [options.configHint] - Optional. The hint IRI for the configuration. When provided, the hint step is included.\n * @property {boolean} [options.shareConfig] - Optional. When `true`, the share configuration step is included.\n * @property {Object[]} [options.tabConfig] - Optional. An array of tab configuration objects. When not provided or empty, the step ends early without saving.\n * @property {string} options.tabConfig[].tabName - The name of the tab to click. Must be one of `startingPoint`, `graphExpansion`, `nodeBasics`, `edgeBasics`, or `nodeExtra`.\n * @property {string} [options.tabConfig[].startingPoint] - Optional. The starting point type to select.\n * @property {string} [options.tabConfig[].iri] - Optional. The IRI of the resource to search for. Must be used together with `searchTerm`. Cannot be used together with `query`.\n * @property {string} [options.tabConfig[].searchTerm] - Optional. The search term used to find the resource. Must be used together with `iri`. Cannot be used together with `query`.\n * @property {string} [options.tabConfig[].query] - Optional. The SPARQL query to enter. Cannot be used together with `iri`/`searchTerm`.\n * @property {boolean} [options.tabConfig[].includeInferredData] - Optional. When provided, the include inferred data step is shown.\n * @property {boolean} [options.tabConfig[].expandResultsOverOwl] - Optional. When provided, the expand results over owl:sameAs step is shown.\n * @property {string} [options.tabConfig[].sampleQueryContent] - Optional. When provided, the sample query step is shown with this content.\n * @property {number} [options.linkLimit] - The maximum number of links to set in the graph settings.\n * @property {string} [options.expandIri] - Optional. The IRI of the node to expand in the visual graph. When provided, the expand step is included.\n * @property {string} [options.iriLabel] - Optional. The label to display for the node to expand. When provided, the expand step is included.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-create\",\n * \"options\": {\n * \"configDescription\": \"A visual graph for exploring RDF data.\",\n * \"configHint\": \"http://example.org/resource\",\n * \"shareConfig\": true,\n * \"expandIri\": \"https://swapi.co/resource/Human/6/\",\n * \"iriLabel\": \"Leia Organa\",\n * \"linkLimit\": 20,\n * \"tabConfig\": [\n * {\n * \"tabName\": \"startingPoint\",\n * \"startingPoint\": \"fixed\",\n * \"searchTerm\": \"luke\",\n * \"iri\": \"https://swapi.co/resource/human/1\"\n * },\n * {\n * \"tabName\": \"graphExpansion\",\n * \"query\": \"PREFIX wev: <http://weverify.eu/ontology/>\\nPREFIX schema: <http://schema.org/>\\nconstruct {\\n ?node ?p ?o .\\n ?s ?p ?node .\\n} where {\\n values ?p {\\n schema:hasPart\\n schema:appearance\\n schema:itemReviewed\\n schema:mentionedIn\\n schema:author\\n schema:publisher\\n }\\n { ?node ?p ?o . filter not exists {?o a wev:SupportingEvidence . } }\\n union\\n { ?s ?p ?node . }\\n}\",\n * \"queryExtraContent\": \"The graph expansion query defines what happens when a node is expanded in the visual graph. Expanding a node loads additional resources connected to it and adds them to the graph as new nodes and edges.\",\n * \"sampleQueryContent\": \"The <b>Sample queries</b> includes example graph expansion queries. <b>Unfiltered object properties</b> shows all object property connections of a node, while <b>Filtered object properties</b> shows only selected ones.\",\n * \"includeInferredData\": true,\n * \"expandResultsOverOwl\": true\n * },\n * {\n * \"tabName\": \"nodeBasics\",\n * \"query\": \"PREFIX skos: <http://www.w3.org/2004/02/skos/core#>\\nPREFIX : <http://data.europa.eu/949/>\\nselect * {\\n ?node :opType/skos:prefLabel ?type\\n filter (lang(?type)=\\\"en\\\")\\n ?node :opName ?name; :uopid ?id\\n bind(concat(?name,\\\"\\\\n\\\",?type,\\\": \\\",?id) as ?label)\\n}\",\n * \"queryExtraContent\": \"The <b>Node basics</b> query retrieves basic properties of a node and maps them to visual attributes such as label, type, description, and rank used when rendering the node in the graph.\",\n * \"sampleQueryContent\": \"The Sample queries includes ready examples of Node basics queries. Direct type only uses only the node’s type to determine its color. Direct type, label and rank also retrieves a label to display as the node name and a rank value that controls the node size.\"\n * },\n * {\n * \"tabName\": \"edgeBasics\",\n * \"query\": \"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\\nPREFIX skos: <http://www.w3.org/2004/02/skos/core#>\\n\\nSELECT ?label {\\n ?edge rdfs:label | skos:prefLabel ?label .\\n}\",\n * \"queryExtraContent\": \"This Edge Basics defines the text shown on the edges in the visual graph. It retrieves a label for each relationship so that the edge displays a clear name instead of the full predicate IRI.\",\n * \"sampleQueryContent\": \"The Sample queries provides example queries for retrieving labels for edges. RDFS or SKOS label displays the label stored in rdfs:label or skos:prefLabel. RDFS or SKOS label in English displays the label only when it is available in English.\"\n * },\n * {\n * \"tabName\": \"nodeExtra\",\n * \"query\": \"SELECT ?property ?value {\\n ?node ?property ?value .\\nFILTER(isLiteral(?value))\\n}\",\n * \"queryExtraContent\": \"This Node extra defines the text shown on the nodes in the visual graph. It retrieves a label for each relationship so that the edge displays a clear name instead of the full predicate IRI.\",\n * \"sampleQueryContent\": \"The Sample queries provides examples for retrieving node details. Datatype properties shows properties with literal values, while Image and datatype properties also includes an image URL.\"\n * }\n * ]\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-create',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n options.title = options.title ?? translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE);\n\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'visual-graph',\n showIntro: true,\n ...options\n }\n },\n {\n guideBlockName: 'visual-graph-config-create-click',\n options: {...options}\n },\n {\n guideBlockName: 'visual-graph-config-name',\n options: {...options}\n }\n ];\n\n const configDescription = options.configDescription;\n if (configDescription) {\n steps.push({\n guideBlockName: 'visual-graph-config-description',\n options: {...options}\n });\n }\n\n const configHint = options.configHint;\n if (configHint) {\n steps.push({\n guideBlockName: 'visual-graph-config-hint',\n options: {...options}\n });\n }\n\n steps.push({\n guideBlockName: 'visual-graph-config-starting-point-intro',\n options: {...options}\n });\n\n if (!options.tabConfig?.length) {\n // If we don't configure the graph, we can't proceed to save and view it\n return steps;\n }\n\n (options.tabConfig ?? []).forEach((tabConfig) => {\n // each tab config represents a tab click and the related steps to add in that specific tab\n steps.push({\n guideBlockName: 'visual-graph-config-click-tab',\n options: {\n scrollOffset: GuideUtils.SCROLL_OFFSET.START,\n ...options,\n ...tabConfig\n }\n });\n\n if (tabConfig.startingPoint) {\n steps.push({\n guideBlockName: 'visual-graph-config-starting-point',\n options: {...options, ...tabConfig}\n });\n }\n\n // we can't have iri and query at the same time. They are not simultaneously available in the view\n if (tabConfig.iri && tabConfig.searchTerm) {\n steps.push({\n guideBlockName: 'resource-search-rdf',\n options: {\n url: 'graphs-visualizations/config/save',\n ...options,\n ...tabConfig\n }\n });\n steps.push({\n guideBlockName: 'resource-search-autocomplete-item',\n options: {\n url: 'graphs-visualizations/config/save',\n ...options,\n ...tabConfig\n }\n });\n } else if (tabConfig.query) {\n steps.push({\n guideBlockName: 'sparql-editor',\n options: {\n url: 'graphs-visualizations/config/save',\n scrollOffset: GuideUtils.SCROLL_OFFSET.CENTER,\n ...options,\n ...tabConfig\n }\n });\n }\n\n if (tabConfig.includeInferredData) {\n steps.push({\n guideBlockName: 'sparql-editor-include-inferred-data',\n options: {\n url: 'graphs-visualizations/config/save',\n ...options,\n ...tabConfig\n }\n });\n }\n\n if (tabConfig.expandResultsOverOwl) {\n steps.push({\n guideBlockName: 'sparql-editor-expand-results-over-owl',\n options: {\n url: 'graphs-visualizations/config/save',\n ...options,\n ...tabConfig\n }\n });\n }\n\n if (tabConfig.sampleQueryContent) {\n steps.push({\n guideBlockName: 'visual-graph-config-sample-query',\n options: {\n ...options,\n ...tabConfig,\n content: tabConfig.sampleQueryContent\n }\n });\n }\n });\n\n if (options.shareConfig) {\n steps.push({\n guideBlockName: 'visual-graph-config-share',\n options: {...options}\n });\n }\n\n steps.push({\n guideBlockName: 'visual-graph-config-save',\n options: {...options}\n });\n\n steps.push({\n guideBlockName: 'visual-graph-config-select',\n options: {...options}\n });\n\n if (options.linkLimit) {\n steps.push({\n guideBlockName: 'visual-graph-set-maximum-links',\n options: {...options}\n });\n }\n\n if (options.expandIri) {\n steps.push({\n guideBlockName: 'visual-graph-expand',\n options: {\n ...options,\n iri: options.expandIri,\n url: undefined\n }\n });\n }\n\n steps.push({\n guideBlockName: 'visual-graph-zoom',\n options: {...options}\n });\n\n return steps;\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {disableAllVisualGraphNodes, enableAllVisualGraphNodes} from '../utils.js';\n\nconst VISUAL_GRAPH_NODE_FOCUS_DEFAULT_TITLE = 'guide.step_plugin.visual-graph-node-focus.title';\nconst VISUAL_GRAPH_NODE_FOCUS_CONTENT = 'guide.step_plugin.visual-graph-node-focus.content';\n\n/**\n * @name visual-graph-node-focus\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-node-focus` guide step explains RDF resources in the Visual Graph.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-node-focus.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is available:\n *\n * @property {string} [options.iri] - The IRI used in this step.\n * @property {string} [options.iriLabel] - Label for predicate.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-node-focus\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\",\n * \"iriLabel\": \"my resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-node-focus',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const $rootScope = services.$rootScope;\n const translate = services.translate;\n const elementSelector = `.node-wrapper[id^=\"${options.iri}\"] circle`;\n\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_NODE_FOCUS_DEFAULT_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_NODE_FOCUS_CONTENT, {iriLabel: options.iriLabel}),\n url: 'graphs-visualizations',\n canBePaused: false,\n elementSelector,\n class: 'visual-graph-node-focus',\n show: disableAllVisualGraphNodes,\n hide: enableAllVisualGraphNodes,\n beforeShowPromise: GuideUtils.awaitAlphaDropD3(elementSelector, $rootScope),\n initPreviousStep: (services, stepId) => {\n if (GuideUtils.isVisible(elementSelector)) {\n return Promise.resolve();\n }\n\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.id);\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_NODE_FOCUS_DEFAULT_TITLE]: 'Visual graph nodes',\n [VISUAL_GRAPH_NODE_FOCUS_CONTENT]: 'A circle represents an RDF resource. In this case, <b>{{iriLabel}}</b>.'\n },\n fr: {\n [VISUAL_GRAPH_NODE_FOCUS_DEFAULT_TITLE]: 'Nœuds de graphique visuel',\n [VISUAL_GRAPH_NODE_FOCUS_CONTENT]: 'Un cercle représente une ressource RDF. Dans ce cas, <b>{{iriLabel}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_DEFAULT_TITLE = 'visual.graph.label';\nconst VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_CONTENT = 'guide.step_plugin.visual_graph_input_IRI.content';\n\n/**\n * @name visual-graph-search-rdf-resources-input\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-search-rdf-resources-input` step guides the user to enter an IRI in the Easy graph search input<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-search-rdf-resources-input.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} [options.easyGraphInputText] - The text to be entered in the Easy graph text input.\n */\nconst step = {\n // TODO: Refactor this to use the generic resource-search-rdf.js or remove completely in favor of that step\n guideBlockName: 'visual-graph-search-rdf-resources-input',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n // Title comes from options.title when provided, otherwise use translated default\n title: translate(this.translationBundle, VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_DEFAULT_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_CONTENT, {easyGraphInputText: options.easyGraphInputText}),\n forceReload: true,\n url: 'graphs-visualizations',\n elementSelector: GuideUtils.getGuideElementSelector('graphVisualisationSearchInputNotConfigured', ' input'),\n class: 'visual-graph-input-iri',\n onNextValidate: (step) => Promise.resolve(GuideUtils.validateTextInput(step.elementSelector, step.easyGraphInputText)),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_DEFAULT_TITLE]: 'Visual graph',\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_CONTENT]: 'Enter <b>{{easyGraphInputText}}</b> in the <b>Easy graph</b> text input.'\n },\n fr: {\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_DEFAULT_TITLE]: 'Graphique visuel',\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_CONTENT]: 'Entrez <b>{{easyGraphInputText}}</b> dans la saisie de texte <b>Graphique facile</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst VALUE_FILTER_INTRO = 'guide.step_plugin.connectors-lucene-value-filter-intro.content';\n\n/**\n * @name connectors-lucene-value-filter-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Value filter\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Value filter\" in defining a top-level value filter for documents.\n *\n * Lucene connector value filter introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-value-filter-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-value-filter-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-value-filter-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, VALUE_FILTER_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-value-filter-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'valueFilter'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [VALUE_FILTER_INTRO]: 'The <b>Value filter</b> is an optional string defining a top-level value filter for the document.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [VALUE_FILTER_INTRO]: 'Le <b>filtre de valeurs</b> est une chaîne optionnelle définissant un filtre de valeurs au niveau du document.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst LUCENE_TYPE_INTRO = 'guide.step_plugin.connectors-lucene-type-intro.content';\n\n/**\n * @name connectors-lucene-type-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the Lucene connector in GraphDB.\n * It provides an overview of the connector's capabilities and its integration with the repository data.\n *\n * Lucene connector introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-type-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-type-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-type-intro',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-type-intro',\n options: {\n content: translate(this.translationBundle, LUCENE_TYPE_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n connectorName: LUCENE_CONNECTOR_NAME,\n class: 'connectors-lucene-type-intro'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [LUCENE_TYPE_INTRO]: 'The Lucene Connector in GraphDB enables extremely fast keyword and faceted (aggregation) searches. Unlike traditional setups where indexing is handled externally, this connector stays automatically synchronized with your repository data, ensuring accurate and up-to-date search results at all times.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [LUCENE_TYPE_INTRO]: 'Le connecteur Lucene dans GraphDB permet des recherches par mots-clés et par facettes (agrégation) extrêmement rapides. Contrairement aux configurations traditionnelles où l’indexation est gérée de manière externe, ce connecteur reste automatiquement synchronisé avec les données de votre référentiel, garantissant des résultats de recherche précis et à jour en permanence.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_CREATE_AGENT_DEFAULT_TITLE = 'guide.step-action.create-ttyg-agent';\nconst SAVE_AGENT_SETTINGS = 'guide.step_plugin.create-ttyg-agent.save-agent-settings';\n\n/**\n * @name ttyg-create-agent-save\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to click on the \"Save\" button after configuring an agent in the Talk to Your Graph (TTYG) plugin.\n * It highlights the button and provides instructions on how to save the agent settings.\n *\n * Click on save button<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-create-agent-save\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-create-agent-save',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_CREATE_AGENT_DEFAULT_TITLE);\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, SAVE_AGENT_SETTINGS),\n class: 'save-agent',\n disablePreviousFlow: false,\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('save-agent-settings')\n }\n }\n ];\n },\n\n translationBundle: {\n en: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Create an agent',\n [SAVE_AGENT_SETTINGS]: 'Click to save the agent settings.'\n },\n fr: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Créer un agent',\n [SAVE_AGENT_SETTINGS]: 'Cliquez sur pour enregistrer les paramètres de l\\'agent.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const FTS_METHOD_DEFAULT_TITLE = 'guide.step-action.fts-search-method';\nconst DISABLE_TOGGLE = 'guide.step_plugin.fts-search-method.disable-toggle';\n\n/**\n * @name ttyg-fts-method-disable\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to disable the FTS search query method in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to disable FTS search query method<br>\n * <img src=\"resources/guides/ttyg/ttyg-fts-method-disable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-fts-method-disable\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-fts-method-disable',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-fts_search-input');\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n content: translate(this.translationBundle, DISABLE_TOGGLE),\n title: translate(this.translationBundle, FTS_METHOD_DEFAULT_TITLE),\n class: 'toggle-fts-search',\n ...options,\n disable: true,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-fts_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(!GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [FTS_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [DISABLE_TOGGLE]: 'Click on the toggle to disable FTS search query method.'\n },\n fr: {\n [FTS_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [DISABLE_TOGGLE]: 'Cliquez sur le bouton pour désactiver la méthode de recherche FTS.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst RUN_QUERY = 'guide.step_plugin.execute-sparql-query.run-sparql-query.content';\n\n/**\n * @name sparql-editor-run-button\n * @memberof module:Interactive Guide\n *\n * @description\n * This prompts the user to click on the SPARQL run button to execute the query.\n *\n * Clicking on the button<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-run-button.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-editor-run-button\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-editor-run-button',\n getSteps: function(options, services) {\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n content: translate(this.translationBundle, RUN_QUERY),\n url: 'sparql',\n elementSelector: services.GuideUtils.CSS_SELECTORS.SPARQL_RUN_BUTTON_SELECTOR,\n class: 'yasgui-run-button',\n onNextClick: (guide) => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then((yasgui) => {\n yasgui.query();\n guide.next();\n }),\n scrollToHandler: services.GuideUtils.scrollToTop,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [RUN_QUERY]: 'Click on the <b>Run</b> button.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [RUN_QUERY]: 'Cliquez sur le bouton <b>Exécuter</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorNameSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst CONNECTORS_INTRO_CONTENT = 'guide.step_plugin.connectors-connector-intro.content';\n\n/**\n * @name connectors-connector-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the connectors section of the GraphDB Workbench.\n * It explains the purpose of an individual connector.\n *\n * Connectors section introduction<br>\n * <img src=\"resources/guides/connectors/connectors-connector-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the section is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-connector-intro\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-connector-intro',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n */\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const connectorNameSelector = getConnectorNameSelector(options, services);\n const connectorCardSelector = GuideUtils.getGuideElementSelector(`${options.instanceName}-connector-card`);\n return [{\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-connector-intro',\n content: translate(this.translationBundle, CONNECTORS_INTRO_CONTENT),\n ...options,\n elementSelector: `${connectorNameSelector} ${connectorCardSelector}`,\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [CONNECTORS_INTRO_CONTENT]: 'Each section represents a single connector instance. For every instance, you can use the buttons on the right to copy, repair, or delete it.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [CONNECTORS_INTRO_CONTENT]: 'Chaque section représente une seule instance de connecteur. Pour chaque instance, vous pouvez utiliser les boutons à droite pour la copier, la réparer ou la supprimer.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst REPOSITORIES_DEFAULT_TITLE = 'guide.step_plugin.repositories.default-title';\nconst SELECT_REPO_CONTENT = 'guide.step_plugin.repositories.select-repository.content';\n\n/**\n * @name repositories-select-repository\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to connect to a repository.\n *\n * Connect to a repository<br>\n * <img src=\"resources/guides/repository/repositories-select-repository.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n * @property {string} repositoryIdToSelect - The id of the repository to connect to.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-select-repository\",\n * \"options\": {\n * \"repositoryIdToSelect\": \"my-repo\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-select-repository',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const repositoryId = options.repositoryIdToSelect ?? Utils.getRepositoryName(services, options);\n const selectRepositoryRowSelector = GuideUtils.getGuideElementSelector(`repository-${repositoryId}`);\n const selectRepositoryButtonWrapperSelector = `${selectRepositoryRowSelector} ${GuideUtils.getGuideElementSelector('select-repository-button-wrapper')}`;\n const selectRepositoryButtonSelector = `${selectRepositoryButtonWrapperSelector} ${GuideUtils.getGuideElementSelector('select-repository-button')}`;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, SELECT_REPO_CONTENT),\n title: translate(this.translationBundle, REPOSITORIES_DEFAULT_TITLE),\n url: 'repository',\n elementSelector: selectRepositoryButtonWrapperSelector,\n class: 'repositories-select-repository',\n onNextClick: () => GuideUtils.clickOnElement(selectRepositoryButtonSelector)(),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_DEFAULT_TITLE]: 'Repositories',\n [SELECT_REPO_CONTENT]: 'Click the connect repository icon.'\n },\n fr: {\n [REPOSITORIES_DEFAULT_TITLE]: 'Dépôts',\n [SELECT_REPO_CONTENT]: 'Cliquez sur l’icône de connexion au dépôt.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIDE_PANEL_CONTENT = 'guide.step_plugin.class-hierarchy-close-rdf-instances-side-panel.content';\nconst RDF_INSTANCES_TITLE = 'guide.step_plugin.class-hierarchy-instances.title';\n\n/**\n * @name class-hierarchy-close-rdf-instances-side-panel\n * @memberof module:Interactive Guide\n *\n * @description This step guides the user to close the RDF instances side panel by clicking on the close (X) icon.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-close-rdf-instances-side-panel.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-close-rdf-instances-side-panel\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-close-rdf-instances-side-panel',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, RDF_INSTANCES_TITLE);\n const closeButtonSelector = GuideUtils.getGuideElementSelector('close-info-panel');\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, SIDE_PANEL_CONTENT),\n url: 'hierarchy',\n canBePaused: false,\n elementSelector: closeButtonSelector,\n class: 'class-hierarchy-close-rdf-instances-side-panel',\n placement: 'left',\n onNextClick: () => GuideUtils.waitFor(closeButtonSelector, 3)\n .then(() => GuideUtils.clickOnElement(closeButtonSelector)()),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SIDE_PANEL_CONTENT]: 'You can close the panel by clicking on the X icon.',\n [RDF_INSTANCES_TITLE]: 'Class hierarchy instances'\n },\n\n fr: {\n [SIDE_PANEL_CONTENT]: 'Vous pouvez fermer le panneau en cliquant sur l\\'icône X.',\n [RDF_INSTANCES_TITLE]: 'Instances de hiérarchie de classes'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\n\n/**\n * @name wait-for-element-to-hide\n * @memberof module:Interactive Guide\n *\n * @description\n * Waits for a specific element to become hidden and then immediately advances to the next step.\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.elementSelectorToHide - CSS selector of the element that must become hidden before advancing.\n * @property {number} [options.timeToWait=2] - Max seconds to wait before aborting the guide.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"wait-for-element-to-hide\",\n * \"options\": {\n * \"elementSelectorToHide\": \"#loading\",\n * \"timeToWait\": 5\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'wait-for-element-to-hide',\n getStep: (options, services) => {\n return {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n beforeShowPromise: (guide) => services.GuideUtils.waitUntilHidden(options.elementSelectorToHide, options.timeToWait || 2)\n .catch(() => {\n services.ShepherdService._abortGuide(guide);\n }),\n show: (guide) => () => {\n // Using a timeout because the library executes async logic\n setTimeout(() => guide.next());\n },\n ...options\n };\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst SKIP_INITIAL_INDEXING = 'guide.step_plugin.connectors-lucene-skip-initial-indexing-intro.content';\n\n/**\n * @name connectors-lucene-skip-initial-indexing-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"skipInitialIndexing\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"skipInitialIndexing\" parameter in controlling the initial indexing behavior.\n *\n * Lucene connector skipInitialIndexing introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-skip-initial-indexing-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-skip-initial-indexing-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-skip-initial-indexing-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, SKIP_INITIAL_INDEXING),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-skip-initial-indexing-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'skipInitialIndexing'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [SKIP_INITIAL_INDEXING]: 'The <b>skipInitialIndexing</b> parameter, when enabled, skips the initial indexing but allows incremental updates to be processed normally.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [SKIP_INITIAL_INDEXING]: 'Le paramètre <b>skipInitialIndexing</b>, lorsqu’il est activé, ignore l’indexation initiale mais permet aux mises à jour incrémentales d’être traitées normalement.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name sparql-search-method\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through enabling or disabling the SPARQL search query method in the TTYG interface.\n * It includes steps to provide information about the SPARQL search method, enable it if it's disabled, or disable it if it's enabled.\n * If enabling, it can also include an optional step to set the ontology source, either via a named graph or a SPARQL CONSTRUCT query.\n *\n * Disable SPARQL search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-disable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enable SPARQL info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-enabling-sparql-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enable SPARQL search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-enable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The `sparql-search-method-enable-ontology-graph` step is a configurable complex step. See [sparql-search-method-enable-ontology-graph](#.sparql-search-method-enable-ontology-graph) for more details.\n * The `sparql-search-method-enable-sparql-query` step is a configurable complex step, See [sparql-search-method-enable-sparql-query](#.sparql-search-method-enable-sparql-query) for more details.\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {boolean} [options.disable] - If true, the step will guide the user to disable the SPARQL search method. If false or not provided, it will guide to enable it.\n * @property {string} [options.ontologyGraph] - If provided and enabling the SPARQL search method, an additional step will be included to set the ontology source via a named graph with this value.\n * @property {string} [options.sparqlQuery] - If provided and enabling the SPARQL search method, an additional step will be included to set the ontology source via a SPARQL CONSTRUCT query with this value.\n *\n * Note: Only one of `ontologyGraph` or `sparqlQuery` should be provided. If both are provided, `ontologyGraph` will take precedence.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-search-method\",\n * \"options\": {\n * \"disable\": false,\n * \"ontologyGraph\": \"http://example.org/graph/ontology\"\n * }\n * }\n * ```\n *\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-search-method\",\n * \"options\": {\n * \"disable\": false,\n * \"sparqlQuery\": \"CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o } LIMIT 100\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-search-method',\n getSteps: (options, _services) => {\n options.mainAction = 'sparql-search-method';\n\n const shouldToggleOff = options.disable;\n\n if (shouldToggleOff) {\n return [{\n guideBlockName: 'ttyg-sparql-method-disable', options: {...options}\n }];\n }\n\n const steps = [\n {\n guideBlockName: 'ttyg-enabling-sparql-info-message', options: {...options}\n },\n {\n guideBlockName: 'ttyg-sparql-method-enable', options: {...options}\n }\n ];\n\n if (options.ontologyGraph) {\n steps.push({\n guideBlockName: 'sparql-search-method-enable-ontology-graph',\n options: {...options}\n });\n } else if (options.sparqlQuery) {\n steps.push({\n guideBlockName: 'sparql-search-method-enable-sparql-query',\n options: {...options}\n });\n }\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst EXPAND_RESULTS_CONTENT = 'guide.step_plugin.sparql-editor-expand-results-over-owl.content';\n\n/**\n * @name sparql-editor-expand-results-over-owl\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on the \"Expand results over owl:sameAs\" toggle in the SPARQL editor.<br>\n *\n * Expand results over owl:sameAs toggle<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-expand-results-over-owl.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-editor-expand-results-over-owl\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-editor-expand-results-over-owl',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n content: translate(this.translationBundle, EXPAND_RESULTS_CONTENT),\n url: 'sparql',\n elementSelector: '.yasqe_expandResultsButton',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [EXPAND_RESULTS_CONTENT]: '<b>Expand results over owl sameAs</b> includes equivalent resources connected with owl:sameAs in the query results. Clicking the toggle disables this behavior.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [EXPAND_RESULTS_CONTENT]: '<b>Étendre les résultats via owl sameAs</b> inclut les ressources équivalentes connectées avec owl:sameAs dans les résultats de la requête. Cliquer sur le bouton désactive ce comportement.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","import * as Utils from '../utils.js';\nimport {BASIC_STEP} from '../config.js';\n\n/**\n * @name read-only-element\n * @memberof module:Interactive Guide\n *\n * @description\n * The Read-Only Element step is used to guide users to see a specific element on the interface, but not interact with it.\n *\n * Read-only element example<br>\n * <img src=\"resources/guides/core/read-only-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {function} [options.beforeShowPromise] - A promise that has to resolve, before the step is shown. If not provided, the step will be shown immediately.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"read-only-element\",\n * \"options\": {\n * \"elementSelector\": \"#important-info\",\n * \"content\": \"Please take a look at this important information, but do not interact with it.\"\n * }\n * }\n * ```\n */\nconst step = {\n // An element which is expected to be focused, but interactions are disabled.\n guideBlockName: 'read-only-element',\n getStep: (options, services) => {\n const notOverridable = {\n type: 'readonly'\n };\n const stepDescription = {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n ...options,\n ...notOverridable\n };\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(services, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_TITLE = 'guide.step-action.resource-search-autocomplete-item';\nconst RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_CONTENT = 'guide.step-action.resource-search-autocomplete-item-content';\n\n/**\n * @name resource-search-autocomplete-item\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-search-autocomplete-item` step selects the autocomplete item for a discovered RDF resource in the search input.\n * This is a reusable step that can be used everywhere an autocomplete dropdown with RDF resources is present.\n *\n * <img src=\"resources/guides/resource/resource-search-autocomplete-item.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} [options.iri] - The IRI displayed in the autocomplete item.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-search-autocomplete-item\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-search-autocomplete-item',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_TITLE),\n content: translate(this.translationBundle, RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_CONTENT, {iri: options.iri}),\n elementSelector: GuideUtils.getGuideElementSelector(`autocomplete-${options.iri}`),\n onNextClick: (guide, step) => GuideUtils.waitFor(step.elementSelector, 3).then(() => $(step.elementSelector).trigger('click')),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_TITLE]: 'Resource search',\n [RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_CONTENT]: 'Click on <b>{{iri}}</b>.'\n },\n fr: {\n [RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_TITLE]: 'Recherche de ressource',\n [RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_CONTENT]: 'Cliquez sur <b>{{iri}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-intro.content';\n\n/**\n * @name class-relationships-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-intro` step displays a dialog that introduces the Class relationships view.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-intro',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'info-message',\n options: {\n url: 'relationships',\n class: 'clas-hierarchy-intro',\n placement: 'left',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Explore the class relationships',\n [CONTENT]: 'This view shows how data instances from different classes are connected based on real RDF statements.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Explorer les relations entre classes',\n [CONTENT]: 'Cette vue montre comment les instances de données de différentes classes sont connectées basées sur de vraies déclarations RDF.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name select-ttyg-agent\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * Complex step, which takes the user through the process of selecting a TTYG agent.\n * It includes steps to open the dropdown, select an agent, and handle missing repository scenarios.\n *\n * Select an agent info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Open the agent selection dropdown<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-dropdown-open.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select an agent from the dropdown<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-from-dropdown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Check for missing repository<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-check-for-missing-repository-cancel.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"select-ttyg-agent\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'select-ttyg-agent',\n getSteps: (options) => {\n options.mainAction = 'select-ttyg-agent';\n\n return [\n {\n guideBlockName: 'ttyg-select-agent-info-message',\n options: {...options}\n },\n {\n guideBlockName: 'ttyg-select-agent-dropdown-open',\n options: {...options}\n },\n {\n guideBlockName: 'ttyg-select-agent-from-dropdown',\n options: {...options}\n },\n {\n guideBlockName: 'ttyg-select-agent-check-for-missing-repository-cancel',\n options: {...options}\n }\n ];\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorContentSelector, getConnectorNameSelector, getConnectorParameterSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst REMAINING_FIELDS_INTRO = 'guide.step_plugin.connectors-parameter-fields-remaining-fields-intro.content';\n\n/**\n * @name connectors-parameter-fields-remaining-fields-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step showcases the remaining fields of a connector instance. We might have more than one field mapping for a connector instance.\n * In that case this step shows the remaining field mappings.\n *\n * Remaining fields<br>\n * <img src=\"resources/guides/connectors/connectors-parameter-fields-remaining-fields-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the parameter is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n * @property {string} parameterName - the specific creation parameters name for <code>instanceName</code>.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-parameter-fields-remaining-fields-intro\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\",\n * \"parameterName\": \"hosts\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-parameter-fields-remaining-fields-intro',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n * - <b>parameterName</b>: string (required) – the specific creation parameter name for <code>instanceName</code>.\n */\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const remainingFieldsSelector = GuideUtils.getGuideElementSelector('connector-remaining-fieldsets');\n const connectorNameSelector = getConnectorNameSelector(options, services);\n const connectorContentSelector = getConnectorContentSelector(options, services);\n const parameterSelector = getConnectorParameterSelector(options, services);\n\n return [{\n guideBlockName: 'read-only-element', options: {\n title: translate(step.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-remaining-fieldsets-intro',\n content: translate(step.translationBundle, REMAINING_FIELDS_INTRO),\n ...options,\n elementSelector: `${connectorNameSelector} ${connectorContentSelector} ${parameterSelector} ${remainingFieldsSelector}`,\n url: 'connectors'\n }\n }];\n }, translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [REMAINING_FIELDS_INTRO]: 'This connector configuration contains multiple field mappings.'\n }, fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [REMAINING_FIELDS_INTRO]: 'Cette configuration du connecteur Lucene contient plusieurs mappages de champs.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CREATE_SIMILARITY_INDEX_DEFAULT = 'guide.step-action.create-similarity-index';\nconst CREATE_INDEX = 'guide.step_plugin.create-similarity-index.create-index';\n\n/**\n * @name similarity-click-to-create\n * @memberof module:Interactive Guide\n *\n * @description\n * This step highlights the \"Create Similarity index\" button and prompts the user to click it.\n *\n * Click the button to create a new Similarity index<br>\n * <img src=\"resources/guides/similarity-index/similarity-click-to-create.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-click-to-create\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'similarity-click-to-create',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CREATE_INDEX),\n title: translate(this.translationBundle, CREATE_SIMILARITY_INDEX_DEFAULT),\n class: 'create-similarity-index',\n disablePreviousFlow: false,\n disableNextFlow: true,\n ...options,\n url: 'similarity/index/create',\n elementSelector: GuideUtils.getGuideElementSelector('create-similarity-index-btn')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Create Similarity index',\n [CREATE_INDEX]: 'Click the button to create the Similarity index.'\n },\n fr: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Créer un indice de similitude',\n [CREATE_INDEX]: 'Cliquez sur le bouton pour créer l\\'index de similarité.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SELECT_AGENT_DEFAULT_TITLE = 'guide.step-action.select-ttyg-agent';\nconst SELECT_AGENT = 'guide.step_plugin.select-ttyg-agent.select-agent';\n\n/**\n * @name ttyg-select-agent-from-dropdown\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to select an agent from a dropdown menu in the TTYG interface.\n * It highlights the dropdown element and provides instructions on how to proceed.\n *\n * Select an agent from the dropdown<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-from-dropdown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-select-agent-from-dropdown\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-select-agent-from-dropdown',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, SELECT_AGENT),\n title: translate(this.translationBundle, TTYG_SELECT_AGENT_DEFAULT_TITLE),\n disableNextFlow: true,\n class: 'select-your-agent',\n ...options,\n elementSelector: GuideUtils.getGuideElementSelector('select-agent-panel'),\n show: () => () => {\n const elementToObserve = document.querySelector(GuideUtils.getGuideElementSelector('select-agent-dropdown'));\n const dropdownToggleElement = document.querySelector(GuideUtils.getGuideElementSelector('select-agent-dropdown-toggle'));\n\n options.observer = new MutationObserver(attributesChangeCallback);\n options.observer.observe(elementToObserve, {attributes: true});\n\n function attributesChangeCallback(mutationList) {\n for (const mutation of mutationList) {\n if (mutation.type === 'attributes') {\n const isOpened = mutation.target.classList.contains('open');\n\n // The component we use for selecting the agent automatically closes\n // after the user clicks on the view, which is why we have to open it.\n if (!(isOpened)) {\n dropdownToggleElement.click();\n }\n }\n }\n }\n },\n hide: () => () => {\n options.observer.disconnect();\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Select an agent',\n [SELECT_AGENT]: 'Click on you agent from the dropdown to select it'\n },\n\n fr: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Sélectionner un agent',\n [SELECT_AGENT]: 'Cliquez sur votre agent dans le menu déroulant pour le sélectionner'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.autocomplete.default.title';\n\n/**\n * @name enable-autocomplete\n * @memberof module:Interactive Guide\n *\n * @description\n * The `enable-autocomplete` guide shows how to use the Autocomplete index view to enable the autocomplete index.\n *\n * The guide consists of the following steps:\n * 1. An introduction to the guide.<br>\n * <img src=\"resources/guides/autocomplete/autocomplete-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 2. A step that guides the user to click on the \"Setup\" main menu.<br>\n * <img src=\"resources/guides/main-menu/main-menu-setup.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 3. A step that guides the user to click on the \"Autocomplete\" sub-menu item.<br>\n * <img src=\"resources/guides/main-menu/main-menu-autocomplete.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 4. A step that shows the user how to enable the autocomplete index by clicking a checkbox.<br>\n * <img src=\"resources/guides/autocomplete/autocomplete-enable-checkbox.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 5. A step that explains the status of the autocomplete index after it has been enabled.<br>\n * <img src=\"resources/guides/autocomplete/autocomplete-focus-on-indexing-status.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This guide can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"enable-autocomplete\"\n * }\n */\nconst step = {\n guideBlockName: 'enable-autocomplete',\n getSteps: function(options, services) {\n options.mainAction = 'enable-autocomplete';\n const title = options.title ? options.title : services.translate(this.translationBundle, DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'autocomplete',\n title,\n showIntro: true,\n ...options\n }\n },\n {\n guideBlockName: 'autocomplete-enable-checkbox',\n options: {\n title,\n ...options\n }\n },\n {\n guideBlockName: 'autocomplete-focus-on-indexing-status',\n options: {\n title,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Enable autocomplete'\n },\n fr: {\n [DEFAULT_TITLE]: 'Activer la saisie semi-automatique'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst STORED_INTRO = 'guide.step_plugin.connectors-lucene-fields-stored-intro.content';\n\n/**\n * @name connectors-lucene-fields-stored-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Stored\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Stored\" option in determining whether a field's values are stored in Lucene.\n *\n * Lucene connector stored introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-stored-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-stored-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-stored-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, STORED_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-stored-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'stored'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [STORED_INTRO]: 'The <b>Stored</b> option determines whether the field’s values are stored in Lucene. By default, fields are stored (true).'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [STORED_INTRO]: 'L’option <b>Stocké</b> détermine si les valeurs du champ sont stockées dans Lucene. Par défaut, les champs sont stockés (true).'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SELECT_AGENT_DEFAULT_TITLE = 'guide.step-action.select-ttyg-agent';\nconst MISSING_REPOSITORY = 'guide.step_plugin.select-ttyg-agent.missing-repository';\n\n/**\n * @name ttyg-select-agent-check-for-missing-repository-cancel\n * @memberof module:Interactive Guide\n *\n * @description\n * This step displays, that a repository is missing for the selected agent\n *\n * Missing repository for selected agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-check-for-missing-repository-cancel.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-select-agent-check-for-missing-repository-cancel\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-select-agent-check-for-missing-repository-cancel',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n // If missing repository modal is visible go to next step, otherwise skip it\n guideBlockName: 'info-message',\n options: {\n beforeShowPromise: (guide, currentStep) => {\n return GuideUtils.getOrWaitFor(GuideUtils.getElementSelector('.confirm-dialog .cancel-btn'), 1)\n .then(() => {\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.next());\n })\n .catch(() => {\n const stepId = currentStep.id;\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.show(stepId + 2));\n });\n },\n ...options\n }\n },\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, MISSING_REPOSITORY),\n title: translate(this.translationBundle, TTYG_SELECT_AGENT_DEFAULT_TITLE),\n ...options,\n elementSelector: GuideUtils.getElementSelector('.confirm-dialog .cancel-btn'),\n showOn: () => GuideUtils.isVisible('.confirm-dialog .cancel-btn'),\n onNextClick: () => {\n // Close the modal by clicking on the cancel button\n GuideUtils.clickOnElement('.confirm-dialog .cancel-btn')();\n },\n show: (guide, currentStep) => () => {\n const currentStepId = currentStep.id;\n // Add a \"click\" listener to the element.\n // Upon clicking the element, the guide is set back 3 steps to \"open dropdown\" step\n $(currentStep.elementSelector).on('click', () => {\n guide.show(currentStepId - 3);\n });\n },\n hide: (guide, currentStep) => () => {\n // Remove the \"click\" listener of the element. It is important when the step is hidden.\n $(currentStep.elementSelector).off('click');\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Select an agent',\n [MISSING_REPOSITORY]: 'The agent you selected has no repository. Please select an agent configured with current repository.'\n },\n\n fr: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Sélectionner un agent',\n [MISSING_REPOSITORY]: 'L\\'agent que vous avez sélectionné n\\'a pas de référentiel. Veuillez sélectionner un agent configuré avec le référentiel actuel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const FTS_METHOD_DEFAULT_TITLE = 'guide.step-action.fts-search-method';\nconst FTS_SEARCH_CONTENT = 'guide.step_plugin.fts-search-method.content';\n\n/**\n * @name ttyg-fts-method-info\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides information about the FTS search query method in the TTYG interface.\n * It highlights an info message block and provides details about the FTS search functionality.\n *\n * FTS search query method<br>\n * <img src=\"resources/guides/ttyg/ttyg-fts-method-info.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-fts-method-info\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-fts-method-info',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, FTS_SEARCH_CONTENT),\n // If mainAction is set the title will be set automatically\n title: translate(this.translationBundle, FTS_METHOD_DEFAULT_TITLE),\n class: 'info-fts-search',\n ...options,\n url: 'ttyg'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [FTS_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [FTS_SEARCH_CONTENT]: 'Enabling FTS search allows the agent to answer questions by using full-text search in literals and IRIs. Performs well on open-ended questions but not so well on providing aggregations.'\n },\n fr: {\n [FTS_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [FTS_SEARCH_CONTENT]: 'L\\'activation de la recherche FTS permet à l\\'agent de répondre aux questions en utilisant la recherche plein texte dans les littéraux et les IRI. Les résultats sont bons pour les questions ouvertes, mais moins bons pour la fourniture d\\'agrégations..'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-digram-thickness-intro.content';\n\n/**\n * @name class-relationships-digram-thickness-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-digram-thickness-intro` step displays a dialog that explains how connection lines in the diagram\n * encode information through their thickness, color, and direction.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-digram-thickness-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-digram-thickness-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-digram-thickness-intro',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'focus-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('relationships-diagram'),\n placement: 'left',\n class: 'class-relationships-digram-thickness-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'Each connection line varies in <b>thickness</b> based on the number of links, <b>color</b> based on the class with more incoming links, and <b>direction</b> as links may go both ways (from class A to class B and vice versa).'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Chaque ligne de connexion varie en <b>épaisseur</b> basée sur le nombre de liens, en <b>couleur</b> basée sur la classe avec le plus de liens entrants, et en <b>direction</b> car les liens peuvent aller dans les deux sens (de la classe A vers la classe B et vice versa).'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst VIEW_SPARQL_DIALOG = 'guide.step_plugin.connectors-lucene-view-sparql-dialog-intro.content';\n\n/**\n * @name connectors-lucene-view-sparql-dialog-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"View SPARQL Query\" dialog of the Lucene connector in GraphDB.\n * It explains the purpose of the dialog and how users can utilize the SPARQL query displayed within it.\n *\n * Lucene connector View SPARQL Query dialog introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-view-sparql-dialog-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-view-sparql-dialog-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-view-sparql-dialog-intro',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-view-sparql-dialog-intro',\n options: {\n content: translate(this.translationBundle, VIEW_SPARQL_DIALOG),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-view-sparql-dialog-intro'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [VIEW_SPARQL_DIALOG]: 'The dialog displays the SPARQL query used to create the Lucene connector. You can copy it to execute manually or integrate it into automation scripts.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [VIEW_SPARQL_DIALOG]: 'La boîte de dialogue affiche la requête SPARQL utilisée pour créer le connecteur Lucene. Vous pouvez la copier pour l’exécuter manuellement ou l’intégrer dans des scripts d’automatisation.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\n\n/**\n * @name ttyg-sparql-copy-query-text\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to copy a provided SPARQL query into the SPARQL query input field in the TTYG interface.\n * It highlights the input field and provides instructions on how to proceed.\n *\n * Copy the following SPARQL query into the input field:<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-copy-query-text.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, the following specific option is available:\n *\n * @property {string} [options.sparqlQuery] - The SPARQL query to be copied into the input field.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-sparql-copy-query-text\",\n * \"options\": {\n * \"sparqlQuery\": \"CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o } LIMIT 100\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-copy-query-text',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'copy-text-element',\n options: {\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n elementSelector: GuideUtils.getGuideElementSelector('sparql-query-input'),\n text: options.sparqlQuery,\n ...options,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(GuideUtils.getGuideElementSelector('sparql-query-input'), options.sparqlQuery, false))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst DISABLE_TOGGLE = 'guide.step_plugin.iri-discovery-search.disable-toggle';\nconst ENABLE_TOGGLE = 'guide.step_plugin.iri-discovery-search.enable-toggle';\n\n/**\n * @name configure-iri-discovery-search\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable or disable the IRI discovery search feature in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable/disable IRI discovery search<br>\n * <img src=\"resources/guides/ttyg/configure-iri-discovery-search.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {boolean} options.disable - Set to true to guide the user to disable the IRI discovery search, or false to enable it.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-iri-discovery-search\",\n * \"options\": {\n * \"disable\": true // or false to enable\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-iri-discovery-search',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('iri-discovery-search-input');\n const shouldToggleOff = options.disable;\n const translate = pluginService.translate;\n\n let content;\n if (shouldToggleOff) {\n content = translate(this.translationBundle, DISABLE_TOGGLE);\n } else {\n content = translate(this.translationBundle, ENABLE_TOGGLE);\n }\n\n const elementSelector = GuideUtils.getGuideElementSelector('iri-discovery-search');\n return {\n guideBlockName: 'toggle-element',\n options: {\n content,\n class: 'toggle-iri-discovery-search',\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options,\n url: 'ttyg',\n elementSelector,\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => {\n const isEnabled = GuideUtils.isChecked(toggleSelector);\n return Promise.resolve(shouldToggleOff ? !isEnabled : isEnabled);\n },\n scrollToHandler: () => GuideUtils.scrollIntoView(elementSelector, {block: 'center'})\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [DISABLE_TOGGLE]: 'Click on the toggle to disable Full-text search in labels for IRI discovery.',\n [ENABLE_TOGGLE]: 'Click on the toggle to enable Full-text search in labels for IRI discovery. This method helps the model discover the IRIs for a particular incomplete query when it cannot answer general questions about the dataset on its own.'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [DISABLE_TOGGLE]: 'Cliquez sur le bouton pour désactiver la recherche textuelle complète dans les libellés pour la découverte d\\'IRI.',\n [ENABLE_TOGGLE]: 'Cliquez sur le bouton pour activer la recherche textuelle complète dans les libellés pour la découverte d\\'IRI. Cette méthode aide le modèle à découvrir les IRI pour une requête incomplète particulière lorsqu\\'il ne peut pas répondre aux questions générales sur le jeu de données par lui-même.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-diagram-intro.content';\n\n/**\n * @name class-relationships-diagram-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-diagram-intro` step displays a dialog that explains the class diagram in the Class Relationships view.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-diagram-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-diagram-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-diagram-intro',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('relationships-diagram'),\n placement: 'left',\n class: 'class-relationships-diagram-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Explore the class relationships',\n [CONTENT]: 'The diagram shows bundled connections between class pairs. Each connection represents multiple RDF links (subject–predicate–object) between instances of two classes.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Explorer les relations entre classes',\n [CONTENT]: 'Le diagramme montre les connexions groupées entre paires de classes. Chaque connexion représente plusieurs liens RDF (sujet–prédicat–objet) entre instances de deux classes.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorNameSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst CONNECTOR_TYPE_INTRO = 'guide.step_plugin.connectors-type-intro.content';\n\n\n/**\n * @name connectors-type-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step shows the type of connector.\n *\n * Connectors type introduction<br>\n * <img src=\"resources/guides/connectors/connectors-type-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} connectorName - the name of the connector for which the section is being defined.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-type-intro\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-type-intro',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n *\n * Must override content with connector specific content\n */\n getSteps: function(options, services) {\n const translate = services.translate;\n return [{\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-connectors-intro',\n content: translate(this.translationBundle, CONNECTOR_TYPE_INTRO),\n ...options,\n elementSelector: getConnectorNameSelector(options, services),\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [CONNECTOR_TYPE_INTRO]: 'Specific GraphDB Connectors provide different connection possibilities.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [CONNECTOR_TYPE_INTRO]: 'Les connecteurs GraphDB spécifiques offrent différentes possibilités de connexion.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TABLE_GRAPH_INTRO = 'guide.step-intro.table-graph';\nconst TABLE_GRAPH_OVERVIEW = 'guide.step_plugin.table-graph-overview';\nconst TABLE_GRAPH_LINK = 'guide.step_plugin.table-graph-link';\nconst TABLE_GRAPH_ROLE_SUBJECT_CONTENT = 'guide.step_plugin.table-graph-role.subject.content';\nconst TABLE_GRAPH_ROLE_PREDICATE_CONTENT = 'guide.step_plugin.table-graph-role.predicate.content';\nconst TABLE_GRAPH_ROLE_OBJECT_CONTENT = 'guide.step_plugin.table-graph-role.object.content';\nconst TABLE_GRAPH_ROLE_CONTEXT_CONTENT = 'guide.step_plugin.table-graph-role.context.content';\nconst TABLE_GRAPH_ROLE_ALL_CONTENT = 'guide.step_plugin.table-graph-role.all.content';\nconst TABLE_GRAPH_VISUAL = 'guide.step_plugin.table-graph-visual';\nconst TABLE_GRAPH_TITLE = 'guide.step_plugin.table-graph-title';\n\n/**\n * @name table-graph-explore\n * @memberof module:Interactive Guide\n *\n * @description\n * The `table-graph-explore` guide combines a sequence of steps to explore RDF data\n * in tabular form and optionally switch to the Visual Graph view.\n * It can show how to navigate to IRIs, change roles, and open the Visual Graph for the selected resource.\n *\n * <img src=\"resources/guides/resource/resource-explore-tabular.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * <img src=\"resources/guides/resource/resource-table-configure.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * <img src=\"resources/guides/resource/resource-click-any-iri.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * <img src=\"resources/guides/resource/resource-configure-object.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * <img src=\"resources/guides/resource/resource-explore-visual.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * Common guide options apply.\n * Additionally, the following options are used:\n * @property {string} [options.iri] - The IRI to explore.\n * @property {string} [options.iriLabel] - Display label for the IRI.\n *\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"table-graph-explore\",\n * \"options\": {\n * \"iri\": \"http://example.com/employees/Employee1\",\n * \"iriLabel\": \"Employee1\",\n * \"subSteps\": [\n * {\"type\": \"link\", \"iri\": \"http://example.com/employees/Employee1\", \"iriLabel\": \"empl:Employee1\"},\n * {\"type\": \"role\", \"role\": \"all\"},\n * {\"type\": \"visual\", \"extraContentVisualIntro\": \"<p>You can pan and zoom the graph.</p>\"}\n * ]\n * }\n * }\n * ```\n * */\nconst step = {\n guideBlockName: 'table-graph-explore',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const RoutingUtil = services.RoutingUtil;\n const translate = services.translate;\n options.mainAction = 'table-graph';\n\n options.title = options.title ?? translate(this.translationBundle, TABLE_GRAPH_TITLE);\n\n const steps = [\n {\n guideBlockName: 'sparql-results-click-on-iri',\n options: {\n content: translate(this.translationBundle, TABLE_GRAPH_INTRO, {iriLabel: options.iriLabel ?? options.iri}),\n initPreviousStep: (services, stepId) => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n if (currentStepId === stepId) {\n return Promise.resolve();\n }\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.options.id);\n },\n ...options\n }\n },\n {\n guideBlockName: 'resource-results-explain',\n options: {\n content: translate(this.translationBundle, TABLE_GRAPH_OVERVIEW, {iriLabel: options.iriLabel ?? options.iri}),\n skipUrl: true,\n beforeShowPromise: () => GuideUtils.waitFor(`.resource-info a.source-link[href=\"${options.iri}\"]`, 3)\n .then(() => GuideUtils.waitFor(GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_ROWS_SELECTOR, 3)),\n initPreviousStep: (services, stepId) => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n if (currentStepId === stepId) {\n return GuideUtils.defaultInitPreviousStep(services, stepId);\n }\n const url = `resource?uri=${options.iri}&role=subject`;\n if (url !== decodeURIComponent(RoutingUtil.getCurrentRoute())) {\n RoutingUtil.navigate(`resource?uri=${options.iri}&role=subject`);\n return GuideUtils.waitFor(`.resource-info a.source-link[href=\"${options.iri}\"]`, 3);\n }\n return Promise.resolve();\n },\n ...options\n }\n }\n ];\n\n if (Array.isArray(options.subSteps)) {\n options.subSteps.forEach((subStep) => {\n switch (subStep.type) {\n case 'link':\n steps.push({\n guideBlockName: 'resource-results-click-on-iri',\n options: {\n content: translate(this.translationBundle, TABLE_GRAPH_LINK, {iriLabel: subStep.iriLabel ?? subStep.iri}),\n skipUrl: true,\n initPreviousStep: (services, stepId) => {\n const linkUrl = `/resource?uri=${subStep.iri}&role=subject`;\n const tableGraphLinkUrl = `/resource?uri=${options.iri}&role=subject`;\n const url = decodeURIComponent(RoutingUtil.getCurrentRoute());\n\n const currentStepId = services.ShepherdService.getCurrentStepId();\n if (currentStepId === stepId && tableGraphLinkUrl === url) {\n // this case is first link in the sequence before click the link, so we have to resolve it.\n return Promise.resolve();\n }\n\n if (linkUrl === url) {\n // this case is first link in the sequence after click the link, so we have to call previous step.\n return GuideUtils.defaultInitPreviousStep(services, stepId);\n }\n\n RoutingUtil.navigate(linkUrl);\n return GuideUtils.waitFor(GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_ROWS_SELECTOR);\n },\n ...options,\n ...subStep\n }\n });\n break;\n case 'role':\n {const ROLE_KEY_BY_TYPE = {\n subject: TABLE_GRAPH_ROLE_SUBJECT_CONTENT,\n predicate: TABLE_GRAPH_ROLE_PREDICATE_CONTENT,\n object: TABLE_GRAPH_ROLE_OBJECT_CONTENT,\n context: TABLE_GRAPH_ROLE_CONTEXT_CONTENT,\n all: TABLE_GRAPH_ROLE_ALL_CONTENT\n };\n steps.push({\n guideBlockName: 'resource-click-on-role',\n options: {\n content: translate(this.translationBundle, ROLE_KEY_BY_TYPE[subStep.role]),\n skipUrl: true,\n showRole: subStep.role,\n initPreviousStep: (services, stepId) => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n if (currentStepId === stepId) {\n return Promise.resolve();\n }\n\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.options.id)\n .then(() => {\n let url = RoutingUtil.getCurrentRoute();\n url = url.substring(0, url.indexOf('role=') + 5);\n url += subStep.role;\n RoutingUtil.navigate(url);\n return GuideUtils.waitFor(GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_ROWS_SELECTOR);\n });\n },\n ...options,\n ...subStep\n }\n });\n break;}\n case 'visual':\n steps.push({\n guideBlockName: 'resource-click-on-visual-graph-button',\n options: {\n content: translate(this.translationBundle, TABLE_GRAPH_VISUAL),\n skipUrl: true,\n initPreviousStep: (services, stepId) => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n if (currentStepId === stepId) {\n return Promise.resolve();\n }\n\n return GuideUtils.defaultInitPreviousStep(services, stepId);\n },\n ...options,\n ...subStep\n }\n });\n steps.push({\n guideBlockName: 'visual-graph-intro',\n options: {\n extraContent: subStep.extraContentVisualIntro,\n forceReload: true,\n onNextClick: (guide) => {\n window.history.back();\n guide.next();\n },\n ...options,\n ...subStep\n }\n });\n break;\n case 'row':\n steps.push({\n guideBlockName: 'resource-results-row-explain',\n options: {\n content: translate(this.translationBundle, TABLE_GRAPH_LINK, {iriLabel: subStep.iriLabel ?? subStep.iri ?? options.iriLabel ?? options.iri}),\n skipUrl: true,\n ...options,\n ...subStep\n }\n });\n break;\n case 'table':\n steps.push({\n guideBlockName: 'resource-results-explain',\n options: {\n elementSelector: GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_ROWS_SELECTOR,\n class: 'visual_graph-table',\n skipUrl: true,\n placement: 'top',\n ...options,\n ...subStep\n }\n });\n break;\n }\n });\n }\n\n return steps;\n },\n translationBundle: {\n en: {\n [TABLE_GRAPH_INTRO]: 'The following steps show how to explore RDF data in tabular form without writing SPARQL queries. Click on the <b>{{iriLabel}}</b> IRI to explore it.',\n [TABLE_GRAPH_OVERVIEW]: 'The table shows RDF statements where the subject is the selected IRI, <b>{{iriLabel}}</b>. The view can be configured to show statements where the IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position.',\n [TABLE_GRAPH_LINK]: 'You can click on any IRI in the table to navigate to it. Click on <b>{{iriLabel}}</b>.',\n [TABLE_GRAPH_ROLE_SUBJECT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>subject</b> tab.',\n [TABLE_GRAPH_ROLE_PREDICATE_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>predicate</b> tab.',\n [TABLE_GRAPH_ROLE_OBJECT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>object</b> tab.',\n [TABLE_GRAPH_ROLE_CONTEXT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>context</b> tab.',\n [TABLE_GRAPH_ROLE_ALL_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>all</b> tab.',\n [TABLE_GRAPH_VISUAL]: 'You can always explore the same data using the <b>Visual graph</b> view. Click on the Visual graph button to try it now.',\n [TABLE_GRAPH_TITLE]: 'Explore RDF as a table'\n },\n fr: {\n [TABLE_GRAPH_INTRO]: 'Les étapes suivantes montrent comment explorer les données RDF sous forme de tableau sans écrire de requêtes SPARQL. Cliquez sur l\\'IRI <b>{{iriLabel}}</b> pour l\\'explorer.',\n [TABLE_GRAPH_OVERVIEW]: 'Le tableau affiche les déclarations RDF où le sujet est l\\'IRI sélectionné, <b>{{iriLabel}}</b>. La vue peut être configurée pour afficher les déclarations où l\\'IRI est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position.',\n [TABLE_GRAPH_LINK]: 'Vous pouvez cliquer sur n\\'importe quel IRI du tableau pour y accéder. Cliquez sur <b>{{iriLabel}}</b>.',\n [TABLE_GRAPH_ROLE_SUBJECT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>sujet</b>.',\n [TABLE_GRAPH_ROLE_PREDICATE_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>prédicat</b>.',\n [TABLE_GRAPH_ROLE_OBJECT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est l\\'<i>objet</i>, le <i>sujet</i>, le <i>prédicat</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>objet</b>.',\n [TABLE_GRAPH_ROLE_CONTEXT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>contexte</i>, le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>contexte</b>.',\n [TABLE_GRAPH_ROLE_ALL_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>tous</b>.',\n [TABLE_GRAPH_VISUAL]: 'Vous pouvez toujours explorer les mêmes données en utilisant la vue <b>Graphique visuel</b>. Cliquez sur le Graphique visuel pour l\\'essayer maintenant.',\n [TABLE_GRAPH_TITLE]: 'Explorer RDF sous forme de tableau'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name fts-search-method\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through enabling or disabling the FTS search query method in the TTYG interface.\n * It includes steps to provide information about the FTS search method, enable it if it's disabled, or disable it if it's enabled.\n * If enabling, it can also include an optional step to set the maximum number of triples per call.\n *\n * Disable FTS search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-fts-method-disable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enable FTS search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-fts-method-enable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Set max triples per call<br>\n * <img src=\"resources/guides/ttyg/set-max-triples-per-call.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following specific options:\n *\n * @property {boolean} [options.disable] - If true, the step will guide the user to disable the FTS search method. If false or not provided, it will guide to enable it.\n * @property {number} [options.maxTriplesPerCall] - If provided and enabling the FTS search method, an additional step will be included to set the maximum number of triples per call to this value.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"fts-search-method\",\n * \"options\": {\n * \"disable\": false,\n * \"maxTriplesPerCall\": 1000\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'fts-search-method',\n getSteps: (options) => {\n options.mainAction = 'fts-search-method';\n const shouldToggleOff = options.disable;\n\n if (shouldToggleOff) {\n return [{\n guideBlockName: 'ttyg-fts-method-disable', options: {...options}\n }];\n }\n\n const steps = [\n {\n guideBlockName: 'ttyg-fts-method-info', options: {...options}\n },\n {\n guideBlockName: 'ttyg-fts-method-enable', options: {...options}\n }\n ];\n\n if (options.maxTriplesPerCall) {\n steps.push({\n guideBlockName: 'set-max-triples-per-call',\n options: {...options}\n });\n }\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const WAIT_FOR_INDEX = 'guide.step_plugin.create-similarity-index.wait';\nconst CREATE_SIMILARITY_INDEX_DEFAULT = 'guide.step-action.create-similarity-index';\n\n/**\n * @name similarity-hold-and-wait-until-shown\n * @memberof module:Interactive Guide\n *\n * @description\n * This step instructs the user to wait until the new similarity index is created\n *\n * <img src=\"resources/guides/similarity-index/similarity-hold-and-wait-until-shown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-hold-and-wait-until-shown\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'similarity-hold-and-wait-until-shown',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'hold-and-wait-until-shown',\n options: {\n title: translate(this.translationBundle, CREATE_SIMILARITY_INDEX_DEFAULT),\n content: translate(this.translationBundle, WAIT_FOR_INDEX),\n class: 'wait-for-index',\n ...options,\n elementSelectorToWait: GuideUtils.getGuideElementSelector('similarity-indexes-table')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Create Similarity index',\n [WAIT_FOR_INDEX]: 'Wait for index to be created'\n },\n fr: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Créer un indice de similitude',\n [WAIT_FOR_INDEX]: 'Attendre la création de l\\'index'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst PROPERTY_CHAIN_INTRO_CONTENT = 'guide.step_plugin.connectors-lucene-fields-property-chain-intro.content';\n\n/**\n * @name connectors-lucene-fields-property-chain-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Property chain\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Property chain\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector property chain introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-property-chain-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-property-chain-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-property-chain-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, PROPERTY_CHAIN_INTRO_CONTENT),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-property-chain-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'propertyChain'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [PROPERTY_CHAIN_INTRO_CONTENT]: 'The <b>Property chain</b> defines the mapping on the GraphDB side. A property chain is a sequence of triples where the entity IRI is the subject of the first triple, its object is the subject of the next triple, and so on. A single-element property chain corresponds to a direct property. Property chains are specified as a list of IRIs, with at least one required.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [PROPERTY_CHAIN_INTRO_CONTENT]: 'La <b>chaîne de propriétés</b> définit le mappage du côté GraphDB. Une chaîne de propriétés est une séquence de triplets où l’IRI de l’entité est le sujet du premier triplet, son objet est le sujet du suivant, et ainsi de suite. Une chaîne à un seul élément correspond à une propriété directe. Les chaînes de propriétés sont spécifiées comme une liste d’IRI, avec au moins un requis.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst ENABLE_TOGGLE = 'guide.step_plugin.sparql-search-method.enable-toggle';\n\n/**\n * @name ttyg-sparql-method-enable\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is used to enable the SPARQL search method in the TTYG plugin.\n * It is a toggle step, which means that the user can enable the switch, but disabling will not be allowed.\n *\n * Enable SPARQL query search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-enable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * guideBlockName: 'ttyg-sparql-method-enable',\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-method-enable',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE);\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-sparql_search-input');\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n title,\n content: translate(this.translationBundle, ENABLE_TOGGLE),\n class: 'toggle-sparql-search',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-sparql_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [ENABLE_TOGGLE]: 'Click on the toggle to enable SPARQL search query method.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [ENABLE_TOGGLE]: 'Cliquez sur le bouton pour activer la méthode de recherche SPARQL.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst DOWNLOAD_RESOURCE_TITLE = 'guide.step_plugin.download-guide-resource.title';\nconst RESOURCE_CONTENT = 'guide.step_plugin.download-guide-resource.content';\n\n/**\n * @name download-guide-resource\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to download a resource file required for the guide.\n *\n * Download guide resource step<br>\n * <img src=\"resources/guides/download-guide-resource/download-guide-resource.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} options.resourcePath - The path to the resource file.\n * @property {string} options.resourceFile - The name of the resource file.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"download-guide-resource\",\n * \"options\": {\n * \"resourcePath\": \"movies\",\n * \"resourceFile\": \"movies.ttl\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'download-guide-resource',\n getSteps: function(options, services) {\n const translate = services.translate;\n const downloadButtonClass = options.repositoryId ? `guide-${options.repositoryId}-download-resource-link` : 'guide-download-resource-link';\n const downloadResourceListener = Utils.createDownloadClickHandler(options.resourcePath, options.resourceFile, services);\n let stepHTMLElement;\n return {\n guideBlockName: 'info-message',\n options: {\n title: translate(this.translationBundle, DOWNLOAD_RESOURCE_TITLE),\n content: translate(this.translationBundle, RESOURCE_CONTENT, {\n downloadButtonClass,\n resourceFile: options.resourceFile\n }),\n canBePaused: true,\n forceReload: true,\n downloadButtonClass,\n show: (guide) => () => {\n stepHTMLElement = guide.currentStep.el.querySelector(`.${downloadButtonClass}`);\n stepHTMLElement.addEventListener('click', downloadResourceListener);\n },\n hide: () => () => {\n if (stepHTMLElement) {\n stepHTMLElement.removeEventListener('click', downloadResourceListener);\n }\n },\n ...options\n }\n };\n },\n translationBundle: {\n en: {\n [DOWNLOAD_RESOURCE_TITLE]: 'Download guide resources',\n [RESOURCE_CONTENT]: 'This guide requires a file to be downloaded.<br>Please <a href=\"#\" class=\"{{downloadButtonClass}}\">download {{resourceFile}}</a>.'\n },\n fr: {\n [DOWNLOAD_RESOURCE_TITLE]: 'Télécharger les ressources du guide',\n [RESOURCE_CONTENT]: 'Ce guide nécessite le téléchargement d\\'un fichier.<br>Veuillez <a href=\"#\" class=\"{{downloadButtonClass}}\">télécharger {{resourceFile}}</a>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst CONFIGURE_AGENT_NAME = 'guide.step_plugin.configure-agent.name-input';\n\n/**\n * @name configure-agent-type-agent-name\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to input a name for the agent in the TTYG interface.\n * It highlights the input field and provides instructions on how to proceed.\n *\n * Type a name for the agent<br>\n * <img src=\"resources/guides/ttyg/configure-agent-type-agent-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options)\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-agent-type-agent-name\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-agent-type-agent-name',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, CONFIGURE_AGENT_NAME),\n class: 'input-agent-name',\n disablePreviousFlow: false,\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options,\n url: 'ttyg',\n beforeShowPromise: () => GuideUtils.waitFor(GuideUtils.getGuideElementSelector('agent-form'), 5)\n .catch((error) => {\n pluginService.toastr.error(pluginService.$translate.instant('guide.unexpected.error.message'));\n throw error;\n }),\n elementSelector: GuideUtils.getGuideElementSelector('agent-name'),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInputNotEmpty(GuideUtils.getGuideElementSelector('agent-name')))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [CONFIGURE_AGENT_NAME]: 'Type a name for the agent. You will refer to it later.'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [CONFIGURE_AGENT_NAME]: 'Saisissez un nom pour l\\'agent. Vous y ferez référence ultérieurement'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CONVERSATION_WITH_AGENT_DEFAULT_TITLE = 'guide.step-action.conversation-with-ttyg-agent';\nconst START_CONVERSATION = 'guide.step_plugin.conversation-with-ttyg-agent.start-conversation';\n\n/**\n * @name ttyg-click-to-create-new-chat\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to click on the \"Create Chat\" button in the Talk to Your Graph.\n * It highlights the button and provides instructions on how to start a new conversation with the agent.\n *\n * Create a new chat<br>\n * <img src=\"resources/guides/ttyg/ttyg-click-to-create-new-chat.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-click-to-create-new-chat\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-click-to-create-new-chat',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const createChatBtnSelector = GuideUtils.getGuideElementSelector('create-chat-btn');\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CONVERSATION_WITH_AGENT_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, START_CONVERSATION),\n class: 'start-conversation',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: createChatBtnSelector\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CONVERSATION_WITH_AGENT_DEFAULT_TITLE]: 'Conversation with the agent',\n [START_CONVERSATION]: 'Click the button to create a new chat'\n },\n fr: {\n [CONVERSATION_WITH_AGENT_DEFAULT_TITLE]: 'Conversation avec l\\'agent',\n [START_CONVERSATION]: 'Cliquez sur le bouton pour créer un nouveau chat'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name sparql-search-method-enable-ontology-graph\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through enabling the option to provide an ontology in a named graph for the SPARQL search method in the TTYG interface.\n * It includes steps to enable the option and type the name of the named graph that contains the ontology.\n *\n * Ontology select<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-ontology-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Type graph name<br>\n * <img src=\"resources/guides/ttyg/sparql-search-method-type-graph-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Add missing namespaces<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-click-add-namespaces.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n * @property {boolean} [options.addMissingNamespaces] - If true, an additional step will be included to click on the \"Add missing namespaces\" after typing the graph name.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-search-method-enable-ontology-graph\",\n * \"options\": {\n * \"addMissingNamespaces\": true\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-search-method-enable-ontology-graph',\n getSteps: (options, _services) => {\n const steps = [\n {\n guideBlockName: 'ttyg-sparql-method-ontology-select', options: {...options}\n },\n {\n guideBlockName: 'sparql-search-method-type-graph-name', options: {...options}\n }\n ];\n\n if (options.addMissingNamespaces) {\n steps.push({\n guideBlockName: 'ttyg-sparql-click-add-namespaces', options: {...options}\n });\n }\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst VIEW_SPARQL_DIALOG = 'guide.step_plugin.connectors-view-sparql-dialog-intro.content';\n\n/**\n * @name connectors-view-sparql-dialog-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"View SPARQL Query\" dialog of the connectors section of the GraphDB Workbench.\n * It explains the purpose of the dialog and how users can utilize the SPARQL query displayed within it.\n *\n * Connectors \"View SPARQL Query\" dialog introduction<br>\n * <img src=\"resources/guides/connectors/connectors-view-sparql-dialog-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-view-sparql-dialog-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-view-sparql-dialog-intro',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [{\n guideBlockName: 'scroll-only-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'left',\n class: 'connectors-view-sparql-dialog-intro',\n content: translate(this.translationBundle, VIEW_SPARQL_DIALOG),\n ...options,\n elementSelectorToWait: GuideUtils.getGuideElementSelector('view-query-body'),\n elementSelector: GuideUtils.getGuideElementSelector('view-query-body'),\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [VIEW_SPARQL_DIALOG]: 'The dialog displays the SPARQL query used to create the connector. You can copy it to execute manually or integrate it into automation scripts.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [VIEW_SPARQL_DIALOG]: 'La boîte de dialogue affiche la requête SPARQL utilisée pour créer le connecteur. Vous pouvez la copier pour l\\'exécuter manuellement ou l\\'intégrer dans des scripts d\\'automatisation.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst DOCUMENT_FILTER = 'guide.step_plugin.connectors-lucene-document-filter-intro.content';\n\n/**\n * @name connectors-lucene-document-filter-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Document filter\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Document filter\" in defining a top-level document filter for documents.\n *\n * Lucene connector document filter introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-document-filter-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-document-filter-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-document-filter-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, DOCUMENT_FILTER),\n ...(options.title ?? {title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE)}),\n ...options,\n class: 'connectors-lucene-document-filter-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'documentFilter'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [DOCUMENT_FILTER]: 'The <b>Document filter</b> is an optional string defining a top-level document filter for the document.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [DOCUMENT_FILTER]: 'Le <b>filtre de document</b> est une chaîne optionnelle définissant un filtre de document au niveau supérieur.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\nconst EXPLAIN_RDF_INSTANCE = 'guide.step_plugin.class-hierarchy-explain-rdf-instance.content';\n\n/**\n * @name class-hierarchy-explain-rdf-instance\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on explaining a specific RDF instance within the class hierarchy visualization.\n * It highlights the selected instance and provides detailed information about it.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-explain-rdf-instance.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} options.iri - The IRI of the class to which the instance belongs. This option is required.\n * @property {string} options.instance - The label of the RDF instance to be explained. This option is required.\n * @property {Object} [options.extraContent] - Bundle object with additional content to display.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-explain-rdf-instance\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\",\n * \"instance\": \"The Godfather\",\n * \"extraContent\": {\n * \"en\": \"My additional content in English\",\n * \"fr\": \"Mon contenu additionnel en français\"\n * }\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-explain-rdf-instance',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title,\n content: translate(this.translationBundle, EXPLAIN_RDF_INSTANCE, {\n iri: options.iri,\n focusInstance: options.instance\n }),\n url: 'hierarchy',\n canBePaused: false,\n elementSelector: GuideUtils.getGuideElementSelector('instance-' + options.instance),\n class: 'class-hierarchy-explain-rdf-instance',\n focusInstance: options.instance,\n extraContent: options.extraContent,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy',\n [EXPLAIN_RDF_INSTANCE]: '<b>{{focusInstance}}</b> is an instance of the class <b>{{iri}}</b>.'\n },\n\n fr: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe',\n [EXPLAIN_RDF_INSTANCE]: '<b>{{focusInstance}}</b> est une instance de la classe <b>{{iri}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.import-file';\nconst CONTENT = 'guide.step_plugin.import_rdf_file.confirm_duplicate_files_dialog.content';\n\n/**\n * @name import-confirm-duplicate-files\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `import-confirm-duplicate-files` step guides the user to confirm overwriting duplicate files in the import dialog of GraphDB.<br>\n * <img src=\"resources/guides/import/import-confirm-duplicate-files.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"import-confirm-duplicate-files\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'import-confirm-duplicate-files',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(step.translationBundle, CONTENT),\n title: translate(step.translationBundle, DEFAULT_TITLE),\n placement: 'bottom',\n class: 'import-file-button',\n ...options,\n url: 'import',\n elementSelector: GuideUtils.getElementSelector('.confirm-duplicate-files-dialog .confirm-overwrite-btn'),\n skipFromHistory: true,\n // Checks whether the confirm dialog is currently open.\n showOn: () => GuideUtils.isVisible(GuideUtils.getElementSelector('.confirm-duplicate-files-dialog')),\n onNextClick: () => GuideUtils.clickOnElement('.confirm-duplicate-files-dialog .confirm-overwrite-btn')(),\n onPreviousClick: () => {\n if (GuideUtils.isVisible(GuideUtils.getElementSelector('.confirm-duplicate-files-dialog'))) {\n return GuideUtils.clickOnElement('.confirm-duplicate-files-dialog .cancel-btn');\n }\n return Promise.resolve();\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Import file',\n [CONTENT]: 'Click on the <b>Yes</b> button to override the existing file.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Importer un fichier',\n [CONTENT]: 'Cliquez sur le bouton <b>Oui</b> pour remplacer le fichier existant.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name create-similarity-index\n * @memberof module:Interactive Guide\n *\n * @description\n * Complex step, which includes all steps needed to create a similarity index.\n *\n * Similarity click link<br>\n * <img src=\"resources/guides/similarity-index/similarity-click-link.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Similarity type index name<br>\n * <img src=\"resources/guides/similarity-index/similarity-type-index-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Similarity click to create<br>\n * <img src=\"resources/guides/similarity-index/similarity-click-to-create.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Similarity hold and wait until shown<br>\n * <img src=\"resources/guides/similarity-index/similarity-hold-and-wait-until-shown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"create-similarity-index\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'create-similarity-index',\n getSteps: (options, services) => {\n const GuideUtils = services.GuideUtils;\n options.mainAction = 'create-similarity-index';\n\n return [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'similarity',\n showIntro: true,\n ...options\n }\n },\n {\n guideBlockName: 'similarity-click-link', options: {...options}\n },\n {\n guideBlockName: 'similarity-type-index-name', options: {...options}\n },\n {\n guideBlockName: 'similarity-click-to-create', options: {...options}\n },\n {\n // check if error block is shown and go back 2 steps or proceed\n guideBlockName: 'info-message',\n options: {\n beforeShowPromise: (guide, currentStep) => GuideUtils.getOrWaitFor(GuideUtils.getGuideElementSelector('error'), 1)\n .then(() => {\n const stepId = currentStep.id;\n // Using a timeout\n // because the library executes logic\n // to show the step in a then clause\n // which causes current and next steps to show\n setTimeout(() => guide.show(stepId - 2));\n })\n .catch(() => {\n // Using a timeout\n // because the library executes logic\n // to show the step in a then clause\n // which causes current and next steps to show\n setTimeout(() => guide.next());\n }),\n ...options\n }\n },\n {\n guideBlockName: 'similarity-hold-and-wait-until-shown', options: {...options}\n }\n ];\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const RDF_RANK_TITLE = 'view.rdf.rank.title';\nconst CLICK_MAIN_MENU = 'guide.step-menu.click-menu';\nconst SKIP_SECTION = 'skip.section';\n\nconst MENU_SETUP_LABEL = 'menu.setup.label';\nconst MENU_IMPORT_LABEL = 'common.import';\nconst MENU_EXPLORE_LABEL = 'menu.explore.label';\nconst MENU_SPARQL_LABEL = 'menu.sparql.label';\nconst MENU_LAB_LABEL = 'menu.lab.label';\n\nconst SUBMENU_REPOSITORIES_LABEL = 'menu.repositories.label';\nconst SUBMENU_AUTOCOMPLETE_LABEL = 'menu.autocomplete.label';\nconst SUBMENU_CONNECTORS_LABEL = 'menu.connectors.label';\nconst SUBMENU_VISUAL_GRAPH_LABEL = 'visual.graph.label';\nconst SUBMENU_CLASS_HIERARCHY_LABEL = 'menu.class.hierarchy.label';\nconst SUBMENU_CLASS_RELATIONSHIPS_LABEL = 'menu.class.relationships.label';\nconst SUBMENU_TTYG_LABEL = 'menu.ttyg.label';\nconst SUBMENU_SIMILARITY_LABEL = 'menu.similarity.label';\n\nconst VIEW_AUTOCOMPLETE_TITLE = 'view.autocomplete.title';\nconst VIEW_CONNECTOR_MANAGEMENT_TITLE = 'view.connector.management.title';\nconst VIEW_SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst VIEW_CLASS_HIERARCHY_TITLE = 'view.class.hierarchy.title';\nconst VIEW_CLASS_RELATIONSHIPS_TITLE = 'view.class.relationships.title';\n\nconst HELP_INFO_REPOSITORIES = 'view.repositories.helpInfo';\nconst HELP_INFO_IMPORT = 'view.import.helpInfo';\nconst HELP_INFO_AUTOCOMPLETE = 'view.autocomplete.helpInfo';\nconst HELP_INFO_CONNECTOR_MANAGEMENT = 'view.connector.management.helpInfo';\nconst HELP_INFO_VISUAL_GRAPH = 'view.visual.graph.helpInfo';\nconst HELP_INFO_SPARQL_EDITOR = 'view.sparql-editor.helpInfo';\nconst HELP_INFO_CLASS_HIERARCHY = 'view.class.hierarchy.helpInfo';\nconst HELP_INFO_CLASS_RELATIONSHIPS = 'view.class.relationships.helpInfo';\nconst HELP_INFO_TTYG = 'ttyg.helpInfo';\nconst HELP_INFO_SIMILARITY = 'guide.step-help-info.create-similarity-index';\nconst HELP_INFO_RDF_RANK = 'view.rdf.rank.helpInfo';\n\nconst INTRO_CREATE_REPOSITORY = 'guide.step-intro.create-repository';\nconst INTRO_ENABLE_AUTOCOMPLETE = 'guide.step-intro.enable-autocomplete';\nconst INTRO_EXECUTE_SPARQL_QUERY = 'guide.step-intro.execute-sparql-query';\nconst INTRO_VISUAL_GRAPH = 'guide.step-intro.visual-graph';\nconst INTRO_IMPORT_FILE = 'guide.step-intro.import-file';\nconst INTRO_CLASS_HIERARCHY = 'guide.step-intro.class-hierarchy';\nconst INTRO_CREATE_TTYG_AGENT = 'guide.step-intro.create-ttyg-agent';\nconst INTRO_CREATE_SIMILARITY_INDEX = 'guide.step-intro.create-similarity-index';\nconst INTRO_CLASS_RELATIONSHIPS = 'guide.step-intro.class-relationships';\n\nconst ACTION_CREATE_REPOSITORY = 'guide.step-action.create-repository';\nconst ACTION_ENABLE_AUTOCOMPLETE = 'guide.step-action.enable-autocomplete';\nconst ACTION_EXECUTE_SPARQL_QUERY = 'guide.step-action.execute-sparql-query';\nconst ACTION_VISUAL_GRAPH = 'guide.step-action.visual-graph';\nconst ACTION_IMPORT_FILE = 'guide.step-action.import-file';\nconst ACTION_CREATE_TTYG_AGENT = 'guide.step-action.create-ttyg-agent';\nconst ACTION_CREATE_SIMILARITY_INDEX = 'guide.step-action.create-similarity-index';\nconst ACTION_CLASS_HIERARCHY = 'guide.step-action.class-hierarchy';\nconst ACTION_CLASS_RELATIONSHIPS = 'guide.step-action.class-relationships';\n\n/**\n * @name click-main-menu\n * @memberof module:Interactive Guide\n *\n * @description\n * This guide step is used to guide the user through the main menu.\n * The guide step is composed of two steps: An optional intro message and 1 or 2 clickable menu elements.\n * All are calculated dynamically based on the `options.menu` parameter.\n *\n * Intro message<br>\n * <img src=\"resources/guides/main-menu/click-main-menu-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click main menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-lab.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click submenu<br>\n * <img src=\"resources/guides/main-menu/main-menu-ttyg.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} options.menu - The menu for which to add intro and click-menu steps.\n * @property {string} [options.mainAction] - The action to be performed on the main menu. Used to display the correct intro message.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"click-main-menu\",\n * \"options\": {\n * \"menu\": \"repositories\",\n * \"mainAction\": \"create-repository\"\n * }\n * }\n */\nconst step = {\n guideBlockName: 'click-main-menu',\n getSteps: function(options, services) {\n const translate = services.translate;\n const steps = [];\n\n let menuSelector;\n let menuTitle;\n let submenuSelector;\n let submenuTitle;\n let viewName;\n let helpInfo;\n let dialogTitle;\n let menuDialogClass = '';\n let submenuDialogClass = '';\n\n switch (options.menu) {\n case 'repositories':\n menuSelector = 'menu-setup';\n menuTitle = MENU_SETUP_LABEL;\n menuDialogClass = 'menu-setup';\n submenuSelector = 'sub-menu-repositories';\n submenuTitle = SUBMENU_REPOSITORIES_LABEL;\n submenuDialogClass = 'sub-menu-repositories';\n viewName = SUBMENU_REPOSITORIES_LABEL;\n helpInfo = HELP_INFO_REPOSITORIES;\n dialogTitle = ACTION_CREATE_REPOSITORY;\n break;\n\n case 'import':\n menuSelector = 'menu-import';\n menuTitle = MENU_IMPORT_LABEL;\n menuDialogClass = 'menu-import';\n viewName = MENU_IMPORT_LABEL;\n helpInfo = HELP_INFO_IMPORT;\n dialogTitle = ACTION_IMPORT_FILE;\n break;\n\n case 'autocomplete':\n menuSelector = 'menu-setup';\n menuTitle = MENU_SETUP_LABEL;\n menuDialogClass = 'menu-setup';\n submenuSelector = 'sub-menu-autocomplete';\n submenuTitle = SUBMENU_AUTOCOMPLETE_LABEL;\n submenuDialogClass = 'sub-menu-autocomplete';\n viewName = VIEW_AUTOCOMPLETE_TITLE;\n helpInfo = HELP_INFO_AUTOCOMPLETE;\n dialogTitle = ACTION_ENABLE_AUTOCOMPLETE;\n break;\n\n case 'connectors':\n menuSelector = 'menu-setup';\n menuTitle = MENU_SETUP_LABEL;\n menuDialogClass = 'menu-setup-guide-dialog';\n submenuSelector = 'sub-menu-connectors';\n submenuTitle = SUBMENU_CONNECTORS_LABEL;\n submenuDialogClass = 'sub-menu-connectors-guide-dialog';\n viewName = VIEW_CONNECTOR_MANAGEMENT_TITLE;\n helpInfo = HELP_INFO_CONNECTOR_MANAGEMENT;\n break;\n\n case 'visual-graph':\n menuSelector = 'menu-explore';\n menuTitle = MENU_EXPLORE_LABEL;\n menuDialogClass = 'menu-explore';\n submenuSelector = 'sub-menu-visual-graph';\n submenuTitle = SUBMENU_VISUAL_GRAPH_LABEL;\n submenuDialogClass = 'sub-menu-visual-graph';\n viewName = SUBMENU_VISUAL_GRAPH_LABEL;\n helpInfo = HELP_INFO_VISUAL_GRAPH;\n dialogTitle = ACTION_VISUAL_GRAPH;\n break;\n\n case 'sparql':\n menuSelector = 'menu-sparql';\n menuTitle = MENU_SPARQL_LABEL;\n menuDialogClass = 'menu-sparql';\n viewName = VIEW_SPARQL_EDITOR_TITLE;\n helpInfo = HELP_INFO_SPARQL_EDITOR;\n dialogTitle = ACTION_EXECUTE_SPARQL_QUERY;\n break;\n\n case 'class-hierarchy':\n menuSelector = 'menu-explore';\n menuTitle = MENU_EXPLORE_LABEL;\n menuDialogClass = 'menu-explore';\n submenuSelector = 'menu-class-hierarchy';\n submenuTitle = SUBMENU_CLASS_HIERARCHY_LABEL;\n submenuDialogClass = 'sub-menu-class-hierarchy';\n viewName = VIEW_CLASS_HIERARCHY_TITLE;\n helpInfo = HELP_INFO_CLASS_HIERARCHY;\n dialogTitle = ACTION_CLASS_HIERARCHY;\n break;\n\n case 'class-relationships':\n menuSelector = 'menu-explore';\n menuTitle = MENU_EXPLORE_LABEL;\n menuDialogClass = 'menu-explore';\n submenuSelector = 'sub-menu-class-relationships';\n submenuTitle = SUBMENU_CLASS_RELATIONSHIPS_LABEL;\n submenuDialogClass = 'sub-menu-class-relationships';\n viewName = VIEW_CLASS_RELATIONSHIPS_TITLE;\n helpInfo = HELP_INFO_CLASS_RELATIONSHIPS;\n dialogTitle = ACTION_CLASS_RELATIONSHIPS;\n break;\n\n case 'ttyg':\n menuSelector = 'menu-lab';\n menuTitle = MENU_LAB_LABEL;\n menuDialogClass = 'menu-lab';\n submenuSelector = 'sub-menu-ttyg';\n submenuTitle = SUBMENU_TTYG_LABEL;\n submenuDialogClass = 'sub-menu-ttyg';\n viewName = SUBMENU_TTYG_LABEL;\n helpInfo = HELP_INFO_TTYG;\n dialogTitle = ACTION_CREATE_TTYG_AGENT;\n break;\n\n case 'similarity':\n menuSelector = 'menu-explore';\n menuTitle = MENU_EXPLORE_LABEL;\n menuDialogClass = 'menu-explore';\n submenuSelector = 'sub-menu-similarity';\n submenuTitle = SUBMENU_SIMILARITY_LABEL;\n submenuDialogClass = 'sub-menu-similarity';\n viewName = SUBMENU_SIMILARITY_LABEL;\n helpInfo = HELP_INFO_SIMILARITY;\n dialogTitle = ACTION_CREATE_SIMILARITY_INDEX;\n break;\n\n case 'rdf-rank':\n menuSelector = 'menu-setup';\n menuTitle = MENU_SETUP_LABEL;\n menuDialogClass = 'menu-setup';\n submenuSelector = 'sub-menu-rdf-rank';\n submenuTitle = RDF_RANK_TITLE;\n submenuDialogClass = 'sub-menu-rdf-rank';\n viewName = RDF_RANK_TITLE;\n helpInfo = HELP_INFO_RDF_RANK;\n break;\n }\n\n const mainMenuClickElementPostSelector = submenuSelector ? ' div' : ' a';\n options.viewName = viewName;\n\n if (!options.title && dialogTitle) {\n options.title = translate(this.translationBundle, dialogTitle);\n }\n\n viewName = translate(this.translationBundle, viewName);\n // View intro element\n if (options.showIntro && options.mainAction) {\n steps.push({\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, 'guide.step-intro.' + options.mainAction, {viewName}),\n extraContent: translate(this.translationBundle, helpInfo),\n extraContentClass: 'alert alert-help text-left',\n skipPoint: true,\n skipButtonLabel: translate(this.translationBundle, SKIP_SECTION),\n ...options\n }\n });\n }\n\n const menuLabel = translate(this.translationBundle, menuTitle);\n const elementSelector = services.GuideUtils.getGuideElementSelector(menuSelector);\n // Main menu element\n steps.push({\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CLICK_MAIN_MENU, {menuLabel}),\n class: menuDialogClass,\n elementSelector,\n beforeShowPromise: () => {\n if (!!submenuSelector && services.GuideUtils.isGuideElementVisible(submenuSelector)) {\n return new Promise((resolve) => {\n services.GuideUtils.clickOnGuideElement(menuSelector, mainMenuClickElementPostSelector)();\n // Needed to wait the layout to complete, before painting, thus avoiding ResizeObserver loop error\n setTimeout(resolve, 500);\n });\n }\n return Promise.resolve();\n },\n\n onNextClick: services.GuideUtils.clickOnGuideElement(menuSelector, mainMenuClickElementPostSelector),\n scrollToHandler: () => services.GuideUtils.scrollIntoView(elementSelector, {block: 'center'}),\n initPreviousStep: (services, stepId) => {\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n if (previousStep) {\n return previousStep.options.initPreviousStep(services, previousStep.options.id);\n }\n\n return Promise.resolve();\n },\n ...options\n }\n });\n\n if (submenuSelector) {\n const submenuLabel = translate(this.translationBundle, submenuTitle);\n const elementSubmenuSelector = services.GuideUtils.getGuideElementSelector(submenuSelector);\n steps.push({\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CLICK_MAIN_MENU, {menuLabel: submenuLabel}),\n class: submenuDialogClass,\n elementSelector: elementSubmenuSelector,\n placement: 'right',\n canBePaused: false,\n onNextClick: services.GuideUtils.clickOnGuideElement(submenuSelector, ' a'),\n scrollToHandler: () => services.GuideUtils.scrollIntoView(elementSubmenuSelector, {block: 'center'}),\n initPreviousStep: (services, stepId) => {\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n if (previousStep) {\n return previousStep.options.initPreviousStep(services, previousStep.options.id);\n }\n\n return Promise.resolve();\n },\n ...options,\n // We might want to click menu + submenu, without intro message. If we configure a skipPoint\n // then it will be added to both steps\n skipPoint: false\n }\n });\n }\n return steps;\n },\n translationBundle: {\n en: {\n [RDF_RANK_TITLE]: 'RDF Rank',\n [CLICK_MAIN_MENU]: 'Click on the <b>{{menuLabel}}</b> menu.',\n [SKIP_SECTION]: 'Skip section',\n [MENU_SETUP_LABEL]: 'Setup',\n [MENU_IMPORT_LABEL]: 'Import',\n [MENU_EXPLORE_LABEL]: 'Explore',\n [MENU_SPARQL_LABEL]: 'SPARQL',\n [MENU_LAB_LABEL]: 'Lab',\n [SUBMENU_REPOSITORIES_LABEL]: 'Repositories',\n [SUBMENU_AUTOCOMPLETE_LABEL]: 'Autocomplete',\n [SUBMENU_CONNECTORS_LABEL]: 'Connectors',\n [SUBMENU_VISUAL_GRAPH_LABEL]: 'Visual graph',\n [SUBMENU_CLASS_HIERARCHY_LABEL]: 'Class hierarchy',\n [SUBMENU_CLASS_RELATIONSHIPS_LABEL]: 'Class relationships',\n [SUBMENU_TTYG_LABEL]: 'Talk to Your Graph',\n [SUBMENU_SIMILARITY_LABEL]: 'Similarity',\n [VIEW_AUTOCOMPLETE_TITLE]: 'Autocomplete index',\n [VIEW_CONNECTOR_MANAGEMENT_TITLE]: 'Connector management',\n [VIEW_SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [VIEW_CLASS_HIERARCHY_TITLE]: 'Class hierarchy',\n [VIEW_CLASS_RELATIONSHIPS_TITLE]: 'Class relationships',\n [HELP_INFO_REPOSITORIES]: 'The Repositories view is used to create, modify and delete repositories and connections to remote GraphDB instances (also known as remote locations).',\n [HELP_INFO_IMPORT]: 'The Import view allows you to import RDF data into a GraphDB repository. Import data from local files, from files on the server where GraphDB is running, from a remote URL, or by pasting the RDF data as a text snippet. Each import method supports various RDF serialisation formats.',\n [HELP_INFO_AUTOCOMPLETE]: 'The Autocomplete index is used for automatic completion of IRIs in the SPARQL editor and the View resource page. Use this view to enable or disable the index and check its status.',\n [HELP_INFO_CONNECTOR_MANAGEMENT]: 'The Connector management view is used to create, manage and view GraphDB connector instances.',\n [HELP_INFO_VISUAL_GRAPH]: 'The Visual graph view provides a visual representation of parts of the RDF graph. The visualisation starts from a single resource and the resources connected to it or from a graph query result. Double-click on resources to expand the graph with their connections.',\n [HELP_INFO_SPARQL_EDITOR]: 'The SPARQL Query & Update view is a unified editor for queries and updates. Enter any SPARQL query or update and click Run to execute it. The view also allows you to save queries for future retrieval and execution in the SPARQL editor.',\n [HELP_INFO_CLASS_HIERARCHY]: 'The Class hierarchy view shows the hierarchy of RDF classes by the number of instances. The biggest circles are the parent classes, and the smaller nested ones are their subclasses. Hover over a given class to see its subclasses or zoom in a nested circle (RDF class) for further exploration.',\n [HELP_INFO_CLASS_RELATIONSHIPS]: 'The Class relationships view shows the relationships between RDF classes, where a relationship is represented by links between the individual instances of two classes. Each link is an RDF statement where the subject is an instance of one class, the object is an instance of another class, and the link is the predicate. Depending on the number of links between the instances of two classes, the bundle can be thicker or thinner, and it receives the colour of the class with more incoming links. The links can be in both directions.',\n [HELP_INFO_TTYG]: '<b>Talk to Your Graph</b> lets you interact with your database through a conversational interface. Ask natural language questions about the data and receive answers generated through the combined power of GraphDB and LLMs. It supports multiple agent configurations and persistent chats for ongoing, contextual conversations.',\n [HELP_INFO_SIMILARITY]: 'The similarity index is used for finding words which have been used in similar contexts to the one which you search for. For example, searching for \"ontology\" will return \"knowledge graph\", while a simple textual similarity could return \"oncology\". This is an alternative for full-text search.',\n [HELP_INFO_RDF_RANK]: 'RDF Rank is an algorithm that identifies the most important or popular entities in the repository by examining their interconnectedness. The popularity of the entities can be used to order the query results. Use this view to configure the RDF rank, recompute it or check the current state.',\n [INTRO_CREATE_REPOSITORY]: 'The following steps show how to use the <b>{{viewName}}</b> view to create a repository.',\n [INTRO_ENABLE_AUTOCOMPLETE]: 'The following steps show how to use the <b>{{viewName}}</b> view to enable the autocomplete index.',\n [INTRO_EXECUTE_SPARQL_QUERY]: 'The following steps show how to use the <b>{{viewName}}</b> view to execute queries.',\n [INTRO_VISUAL_GRAPH]: 'The following steps show how to use the <b>{{viewName}}</b> view to explore data in a visual manner.',\n [INTRO_IMPORT_FILE]: 'The following steps show how to use the <b>{{viewName}}</b> view to import data from a file.',\n [INTRO_CLASS_HIERARCHY]: 'The following steps show how to use the <b>{{viewName}}</b> view to inspect the class hierarchy and gain an insight on what the dataset contains.',\n [INTRO_CREATE_TTYG_AGENT]: 'The following steps show how to use the <b>{{viewName}}</b> view to create an agent.',\n [INTRO_CREATE_SIMILARITY_INDEX]: 'The following steps show how to create a Similarity index for your dataset.',\n [INTRO_CLASS_RELATIONSHIPS]: 'The following steps show how to use the <b>{{viewName}}</b> view to explore how classes are connected and understand the relationships between different types of data in your dataset.',\n [ACTION_CREATE_REPOSITORY]: 'Create repository',\n [ACTION_ENABLE_AUTOCOMPLETE]: 'Enable autocomplete',\n [ACTION_EXECUTE_SPARQL_QUERY]: 'Execute SPARQL query',\n [ACTION_VISUAL_GRAPH]: 'Visual graph explore',\n [ACTION_IMPORT_FILE]: 'Import file',\n [ACTION_CREATE_TTYG_AGENT]: 'Create an agent',\n [ACTION_CREATE_SIMILARITY_INDEX]: 'Create Similarity index',\n [ACTION_CLASS_HIERARCHY]: 'Explore the class hierarchy',\n [ACTION_CLASS_RELATIONSHIPS]: 'Explore the class relationships'\n },\n fr: {\n [RDF_RANK_TITLE]: 'Rang RDF',\n [CLICK_MAIN_MENU]: 'Cliquez sur le menu <b>{{menuLabel}}</b>.',\n [SKIP_SECTION]: 'Sauter la section',\n [MENU_SETUP_LABEL]: 'Configurer',\n [MENU_IMPORT_LABEL]: 'Importer',\n [MENU_EXPLORE_LABEL]: 'Explorez',\n [MENU_SPARQL_LABEL]: 'SPARQL',\n [MENU_LAB_LABEL]: 'Laboratoire',\n [SUBMENU_REPOSITORIES_LABEL]: 'Dépôts',\n [SUBMENU_AUTOCOMPLETE_LABEL]: 'Autocomplétion',\n [SUBMENU_CONNECTORS_LABEL]: 'Connecteurs',\n [SUBMENU_VISUAL_GRAPH_LABEL]: 'Graphique visuel',\n [SUBMENU_CLASS_HIERARCHY_LABEL]: 'Hiérarchie des classes',\n [SUBMENU_CLASS_RELATIONSHIPS_LABEL]: 'Relations entre les classes',\n [SUBMENU_TTYG_LABEL]: 'Parlez à votre graphe',\n [SUBMENU_SIMILARITY_LABEL]: 'Similarité',\n [VIEW_AUTOCOMPLETE_TITLE]: 'Index Autocomplete',\n [VIEW_CONNECTOR_MANAGEMENT_TITLE]: 'Gestion des connecteurs',\n [VIEW_SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [VIEW_CLASS_HIERARCHY_TITLE]: 'Hiérarchie de classe',\n [VIEW_CLASS_RELATIONSHIPS_TITLE]: 'Relations de classe',\n [HELP_INFO_REPOSITORIES]: 'La vue Dépôts est utilisée pour créer, modifier et supprimer des dépôts et des connexions à des instances GraphDB distantes (également appelées emplacements distants).',\n [HELP_INFO_IMPORT]: 'La vue Importation vous permet d\\'importer des données RDF dans un dépôt GraphDB. Importez des données à partir de fichiers locaux, de fichiers sur le serveur sur lequel GraphDB s\\'exécute, d\\'une URL distante, ou en collant les données RDF sous forme d\\'extrait de texte. Chaque méthode d\\'importation prend en charge différents formats de sérialisation.',\n [HELP_INFO_AUTOCOMPLETE]: 'L\\'index Autocomplete est utilisé pour la complétion automatique des IRIs dans l\\'éditeur SPARQL et la page de ressources View. Utilisez cette vue pour activer ou désactiver l\\'index et vérifier son état.',\n [HELP_INFO_CONNECTOR_MANAGEMENT]: 'La vue Gestion des connecteurs est utilisée pour créer, gérer et inspecter les instances de connecteurs GraphDB.',\n [HELP_INFO_VISUAL_GRAPH]: 'La vue Graphique visuel fournit un moyen de créer une représentation visuelle de parties du graphe RDF. La visualisation part d\\'une seule ressource et des ressources qui lui sont connectées ou du résultat d\\'une requête de graphique. Double-cliquez sur les ressources pour développer le graphique avec ses connexions.',\n [HELP_INFO_SPARQL_EDITOR]: 'La vue Requête et mise à jour SPARQL est un éditeur unifié pour les requêtes et les mises à jour. Entrez n\\'importe quelle requête ou mise à jour SPARQL et cliquez sur Exécuter pour l\\'exécuter. La vue vous permet également d\\'enregistrer des requêtes pour une récupération et une exécution futures dans l\\'éditeur SPARQL.',\n [HELP_INFO_CLASS_HIERARCHY]: 'La vue Hiérarchie de classe montre la hiérarchie des classes RDF par nombre d\\'instances. Les cercles les plus grands sont les classes parentes et les cercles plus petits imbriqués sont leurs sous-classes. Passez la souris sur une classe donnée pour voir ses sous-classes ou faites un zoom sur un cercle imbriqué (classe RDF) pour une exploration plus approfondie.',\n [HELP_INFO_CLASS_RELATIONSHIPS]: 'La vue Relations de classe montre les relations entre les classes RDF, où une relation est représentée par des liens entre les instances individuelles de deux classes. Chaque lien est une déclaration RDF où le sujet est une instance d\\'une classe, l\\'objet est une instance d\\'une autre classe et le lien est le prédicat. En fonction du nombre de liens entre les instances de deux classes, le faisceau peut être plus ou moins épais et il prend la couleur de la classe ayant le plus de liens entrants. Les liens peuvent être dans les deux sens.',\n [HELP_INFO_TTYG]: '<b>Parlez à votre graphe</b> vous permet d’interagir avec votre base de données via une interface conversationnelle. Posez des questions en langage naturel sur les données et recevez des réponses générées grâce à la puissance combinée de GraphDB et des LLM. Cette fonctionnalité prend en charge plusieurs configurations d’agents et des discussions persistantes pour des conversations continues et contextuelles.',\n [HELP_INFO_SIMILARITY]: 'L\\'indice de similarité est utilisé pour trouver des mots qui ont été utilisés dans des contextes similaires à celui que vous recherchez. Par exemple, la recherche de \"ontology\" renverra à \"knowledge graph\", tandis qu\\'une simple similarité textuelle renverra à \"oncology\". Il s\\'agit d\\'une alternative à la recherche en texte intégral.',\n [HELP_INFO_RDF_RANK]: 'RDF Rank est un algorithme qui identifie les entités les plus importantes ou les plus populaires dans le dépôt en examinant leur interconnexion. La popularité des entités peut alors être utilisée pour ordonner les résultats des requêtes. Utilisez cette vue pour configurer le RDF Rank, le recalculer ou vérifier l\\'état actuel.',\n [INTRO_CREATE_REPOSITORY]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour créer un dépôt.',\n [INTRO_ENABLE_AUTOCOMPLETE]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour activer l\\'index de saisie semi-automatique.',\n [INTRO_EXECUTE_SPARQL_QUERY]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour exécuter des requêtes.',\n [INTRO_VISUAL_GRAPH]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour explorer les données de manière visuelle.',\n [INTRO_IMPORT_FILE]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour importer des données depuis un fichier.',\n [INTRO_CLASS_HIERARCHY]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour inspecter la hiérarchie des classes et avoir un aperçu du contenu de l\\'ensemble de données .',\n [INTRO_CREATE_TTYG_AGENT]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour créer un agent.',\n [INTRO_CREATE_SIMILARITY_INDEX]: 'Les étapes suivantes montrent comment créer un index de similarité pour votre ensemble de données.',\n [INTRO_CLASS_RELATIONSHIPS]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour explorer comment les classes sont connectées et comprendre les relations entre différents types de données dans votre jeu de données.',\n [ACTION_CREATE_REPOSITORY]: 'Créer un dépôt',\n [ACTION_ENABLE_AUTOCOMPLETE]: 'Activer la saisie semi-automatique',\n [ACTION_EXECUTE_SPARQL_QUERY]: 'Exécuter une requête SPARQL',\n [ACTION_VISUAL_GRAPH]: 'Explorer le graphique visuel',\n [ACTION_IMPORT_FILE]: 'Importer un fichier',\n [ACTION_CREATE_TTYG_AGENT]: 'Créer un agent',\n [ACTION_CREATE_SIMILARITY_INDEX]: 'Créer un indice de similitude',\n [ACTION_CLASS_HIERARCHY]: 'Explorer la hiérarchie des classes',\n [ACTION_CLASS_RELATIONSHIPS]: 'Explorer les relations entre classes'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const FTS_METHOD_DEFAULT_TITLE = 'guide.step-action.fts-search-method';\nconst ENABLE_TOGGLE = 'guide.step_plugin.fts-search-method.enable-toggle';\n\n/**\n * @name ttyg-fts-method-enable\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable the FTS search query method in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable FTS search query method<br>\n * <img src=\"resources/guides/ttyg/ttyg-fts-method-enable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-fts-method-enable\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-fts-method-enable',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-fts_search-input');\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n content: translate(this.translationBundle, ENABLE_TOGGLE),\n title: translate(this.translationBundle, FTS_METHOD_DEFAULT_TITLE),\n class: 'toggle-fts-search',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-fts_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [FTS_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [ENABLE_TOGGLE]: 'Click on the toggle to enable FTS search query method.'\n },\n fr: {\n [FTS_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [ENABLE_TOGGLE]: 'Cliquez sur le bouton pour activer la méthode de recherche FTS.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorContentSelector, getConnectorNameSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst OPEN_VIEW_SPARQL_DIALOG = 'guide.step_plugin.connectors-open-view-sparql-query-dialog.content';\n\n/**\n * @name connectors-open-view-sparql-query-dialog\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to open the \"View SPARQL Query\" dialog.\n *\n * View SPARQL Query dialog example<br>\n * <img src=\"resources/guides/connectors/connectors-open-view-sparql-query-dialog.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the section is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-open-view-sparql-query-dialog\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-open-view-sparql-query-dialog',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n */\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const connectorNameSelector = getConnectorNameSelector(options, services);\n const connectorContentSelector = getConnectorContentSelector(options, services);\n const openViewSPARQLDialogSelector = GuideUtils.getGuideElementSelector('open-view-sparql-query-dialog');\n const elementSelector = `${connectorNameSelector} ${connectorContentSelector} ${openViewSPARQLDialogSelector}`;\n return [{\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'open-view-sparql-query-dialog',\n content: translate(this.translationBundle, OPEN_VIEW_SPARQL_DIALOG),\n ...options,\n elementSelector,\n url: 'connectors',\n onNextClick: () => {\n GuideUtils.clickOnElement(elementSelector)();\n }\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [OPEN_VIEW_SPARQL_DIALOG]: 'Click on <b>View SPARQL Query</b> to view the connector creation query.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [OPEN_VIEW_SPARQL_DIALOG]: 'Cliquez sur <b>Voir la requête SPARQL</b> pour afficher la requête de création du connecteur.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CREATE_SIMILARITY_INDEX_DEFAULT = 'guide.step-action.create-similarity-index';\nconst INPUT_INDEX_NAME = 'guide.step_plugin.create-similarity-index.input-index-name';\n\n/**\n * @name similarity-type-index-name\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to type a name for the similarity index.\n *\n * Type a name for the similarity index<br>\n * <img src=\"resources/guides/similarity-index/similarity-type-index-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-type-index-name\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'similarity-type-index-name',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, INPUT_INDEX_NAME),\n title: translate(this.translationBundle, CREATE_SIMILARITY_INDEX_DEFAULT),\n class: 'similarity-index-name-input',\n ...options,\n url: 'similarity/index/create',\n elementSelector: GuideUtils.getGuideElementSelector('similarity-index-name'),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInputNotEmpty(GuideUtils.getGuideElementSelector('similarity-index-name')))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Create Similarity index',\n [INPUT_INDEX_NAME]: 'Type a name for the index. You will refer to it later.'\n },\n fr: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Créer un indice de similitude',\n [INPUT_INDEX_NAME]: 'Saisissez un nom pour l\\'index. Vous y ferez référence ultérieurement.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-class-list-selection.content';\n\n/**\n * @name class-relationships-class-list-selection\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-class-list-selection` step displays a dialog that explains how users can add or remove classes from the diagram.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-class-list-selection.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-class-list-selection\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-class-list-selection',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'focus-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('class-list'),\n placement: 'right',\n class: 'class-relationships-class-list-selection',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'Use the <b>+ / –</b> icons next to each class name to add or remove it from the diagram display.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Utilisez les icônes <b>+ / –</b> à côté de chaque nom de classe pour l\\'ajouter ou la retirer de l\\'affichage du diagramme.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_EDIT_AGENT_DEFAULT_TITLE = 'guide.step-action.edit-ttyg-agent';\nconst EDIT_TTYG_AGENT = 'guide.step_plugin.edit-ttyg-agent.intro';\nconst SKIP_SECTION = 'btn.skip-section';\n\n/**\n * @name ttyg-edit-agent-intro-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an introductory message when editing a TTYG agent.\n * It informs the user that an agent's configuration can be reconfigured at any time.\n *\n * Edit agent intro message<br>\n * <img src=\"resources/guides/ttyg/ttyg-edit-agent-intro-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-edit-agent-intro-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-edit-agent-intro-message',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, EDIT_TTYG_AGENT),\n title: translate(this.translationBundle, TTYG_EDIT_AGENT_DEFAULT_TITLE),\n skipPoint: true,\n skipButtonLabel: translate(this.translationBundle, SKIP_SECTION),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Edit an agent',\n [EDIT_TTYG_AGENT]: 'An agent\\'s configuration such as the extraction methods can be reconfigured at any time',\n [SKIP_SECTION]: 'Skip section'\n },\n\n fr: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Modifier un agent',\n [EDIT_TTYG_AGENT]: 'La configuration d\\'un agent, comme les méthodes d\\'extraction, peut être reconfigurée à tout moment.',\n [SKIP_SECTION]: 'Sauter la section'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst FACET_INTRO = 'guide.step_plugin.connectors-lucene-fields-facet-intro.content';\n\n/**\n * @name connectors-lucene-fields-facet-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Facet\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Facet\" option in determining whether a field is available for faceted searches in Lucene.\n *\n * Lucene connector facet introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-facet-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-facet-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-facet-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, FACET_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-facet-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'facet'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [FACET_INTRO]: 'The <b>Facet</b> option specifies whether the field is available for faceted searches in Lucene. Managed by the facet option (boolean, true by default).'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [FACET_INTRO]: 'L’option <b>Facette</b> spécifie si le champ est disponible pour les recherches à facettes dans Lucene. Géré par l’option facet (booléen, true par défaut).'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name conversation-with-ttyg-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user through a conversation with a TTYG agent.\n * It includes an optional info message, steps to start a new conversation\n *\n * Conversation info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-conversation-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Create new chat<br>\n * <img src=\"resources/guides/ttyg/ttyg-click-to-create-new-chat.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @property {boolean} [startNewConversation] - Whether to include steps to start a new conversation.\n * @property {boolean} [showInfo] - Whether to show an informational message at the start of the conversation.\n * @property {Array} questions - An array of question objects to ask the TTYG agent. Each object should\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"conversation-with-ttyg-agent\",\n * \"options\": {\n * \"startNewConversation\": true,\n * \"showInfo\": true,\n * \"questions\": [{\n * \"question\": \"What is the capital of France?\"\n * }]\n * }\n * }\n * ```\n *\n */\nconst step = {\n guideBlockName: 'conversation-with-ttyg-agent',\n getSteps: (options, services) => {\n const GuideUtils = services.GuideUtils;\n options.mainAction = 'conversation-with-ttyg-agent';\n const startNewConversation = options.startNewConversation;\n const showInfo = options.showInfo;\n\n const steps = [];\n\n if (showInfo) {\n steps.push({\n guideBlockName: 'ttyg-conversation-info-message',\n options: {...options}\n });\n }\n\n if (startNewConversation) {\n const createChatBtnSelector = GuideUtils.getGuideElementSelector('create-chat-btn');\n const newConversationStartSteps = [\n {\n // If button is not visible for some reason, skip the whole step\n guideBlockName: 'info-message',\n options: {\n url: 'ttyg',\n beforeShowPromise: (guide, currentStep) => GuideUtils.waitFor(createChatBtnSelector, 1)\n .then(() => {\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.next());\n })\n .catch(() => {\n const stepId = currentStep.id;\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.show(stepId + 2));\n }),\n ...options\n }\n },\n {\n guideBlockName: 'ttyg-click-to-create-new-chat', options: {...options}\n }\n ];\n steps.push(...newConversationStartSteps);\n }\n\n const questionSteps = options.questions.map((questionWithOptions) => {\n return {\n guideBlockName: 'ask-ttyg-agent',\n options: questionWithOptions\n };\n });\n\n steps.push(...questionSteps);\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst QUERY_CONTENT = 'guide.step_plugin.class-hierarchy-instances-query.content';\nconst RESULTS_CONTENT = 'guide.step_plugin.class-hierarchy-instances-results.content';\nconst RESULTS_EXTRA_CONTENT = 'guide.step_plugin.class-hierarchy-instances-results.extraContent';\nconst RDF_INSTANCES_TITLE = 'guide.step_plugin.class-hierarchy-instances.title';\nconst SKIP_SECTION = 'skip.section';\n\n/**\n * @name class-hierarchy-instances\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is a complex step that includes several sub-steps to guide the user through viewing and understanding\n * RDF instances of a class in the class hierarchy.\n *\n * Open RDF instances side panel<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-open-rdf-instances-side-panel.png\" style=\"height:200px; border: solid;\"><br>\n *\n * Side panel introduction<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-intro.png\" style=\"height:200px; border: solid\"><br>\n *\n * Explain RDF instance<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-explain-rdf-instance.png\" style=\"height:200px; border: solid\"><br>\n *\n * Open all instances in SPARQL<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql.png\" style=\"height:200px; border: solid\"><br>\n *\n * SPARQL editor explanation<br>\n * <img src=\"resources/guides/class-hierarchy/sparql-explain-editor.png\" style=\"height:200px; border: solid\"><br>\n *\n * SPARQL results explanation<br>\n * <img src=\"resources/guides/class-hierarchy/sparql-results-explain.png\" style=\"height:200px; border: solid\"><br>\n *\n * Close RDF instances side panel<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-close-rdf-instances-side-panel.png\" style=\"height:200px; border: solid\"><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.iri`\n *\n * @property {string} options.iri - The IRI of the class whose instances are to be viewed. This option is required.\n * @property {Array.<string|Object>} [options.focusInstances] - An array of instances to focus on. Each entry can be a string (the instance IRI)\n * @property {boolean} [options.followCountLink] - Whether to follow the count link when the RDF instance count is clicked.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-instances\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\",\n * \"focusInstances\": [\n * \"imdb:title/Superman\",\n * \"imdb:title/Mulan\"\n * ],\n * \"followCountLink\": true\n * }\n * },\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-instances',\n /**\n *\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const RoutingUtil = pluginService.RoutingUtil;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, RDF_INSTANCES_TITLE);\n const closeButtonSelector = GuideUtils.getGuideElementSelector('close-info-panel');\n const clasInstanceSelector = GuideUtils.getGuideElementSelector('class-' + options.iri);\n const instanceCountSelector = GuideUtils.getGuideElementSelector('instances-count');\n const steps = [\n {\n guideBlockName: 'class-hierarchy-open-rdf-instances-side-panel',\n options: {\n title,\n initPreviousStep: () => {\n if (!GuideUtils.isVisible(closeButtonSelector)) {\n return Utils.reloadAndOpenInfoPanel({RoutingUtil, GuideUtils}, clasInstanceSelector);\n }\n\n return Promise.resolve();\n },\n ...options\n }\n },\n {\n guideBlockName: 'class-hierarchy-rdf-instances-side-panel-intro',\n options: {\n title,\n skipPoint: true,\n skipButtonLabel: translate(this.translationBundle, SKIP_SECTION),\n beforeShowPromise: GuideUtils.deferredShow(800),\n onPreviousClick: () => new Promise(function(resolve) {\n GuideUtils.waitFor(closeButtonSelector, 1)\n .then(() => document.querySelector(closeButtonSelector).click());\n resolve();\n }),\n ...options\n }\n }\n ];\n\n if (Array.isArray(options.focusInstances)) {\n options.focusInstances.forEach((focusInstance) => {\n if (!GuideUtils.isObject(focusInstance)) {\n focusInstance = {\n instance: focusInstance\n };\n }\n steps.push({\n guideBlockName: 'class-hierarchy-explain-rdf-instance',\n options: {\n title,\n instance: focusInstance.instance,\n extraContent: focusInstance.message,\n ...options\n }\n });\n });\n }\n\n let urlBeforeFollowCountLink = null;\n\n if (options.followCountLink) {\n steps.push({\n guideBlockName: 'class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql',\n options: {\n title,\n show: () => () => {\n urlBeforeFollowCountLink = window.location.href;\n },\n ...options\n }\n });\n\n steps.push({\n guideBlockName: 'sparql-explain-editor',\n options: {\n title,\n content: pluginService.translate(this.translationBundle, QUERY_CONTENT, {iri: options.iri}),\n ...options\n }\n });\n\n const extraContent = options.showExtraCommentSparql !== false ? pluginService.translate(this.translationBundle, RESULTS_EXTRA_CONTENT) : null;\n steps.push({\n guideBlockName: 'sparql-results-explain',\n options: {\n title,\n extraContent,\n content: pluginService.translate(this.translationBundle, RESULTS_CONTENT),\n onNextClick: (guide) => {\n RoutingUtil.navigate(urlBeforeFollowCountLink);\n guide.next();\n },\n initPreviousStep: () => Promise.resolve(),\n ...options\n }\n });\n }\n\n steps.push({\n guideBlockName: 'class-hierarchy-close-rdf-instances-side-panel',\n options: {\n title,\n // If we followed the count link we come back here from another view\n // and the side panel needs time to open\n beforeShowPromise: options.followCountLink ? GuideUtils.deferredShow(1500) : Promise.resolve(),\n initPreviousStep: (services, stepId) => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n // If method is called from same step just click count link\n if (currentStepId === stepId && options.followCountLink) {\n return GuideUtils.waitFor(instanceCountSelector, 3)\n .then(() => {\n document.querySelector(instanceCountSelector).click();\n return GuideUtils.waitFor(GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_SELECTOR, 3)\n .then(() => GuideUtils.deferredShow(50)());\n });\n }\n // If is called from other step we have to reload and open the info panel.\n return Utils.reloadAndOpenInfoPanel({RoutingUtil, GuideUtils}, clasInstanceSelector);\n },\n ...options\n }\n });\n\n return steps;\n },\n translationBundle: {\n en: {\n [QUERY_CONTENT]: 'This SPARQL query selects all instances of the class <b>{{iri}}</b>. The query was entered automatically when you clicked on the view instances link.',\n [RESULTS_CONTENT]: 'The table shows the results. Note that in this particular case, the query was executed automatically.',\n [RESULTS_EXTRA_CONTENT]: 'Do not worry &mdash; there will be a dedicated section on the SPARQL editor later in the guide.',\n [RDF_INSTANCES_TITLE]: 'Class hierarchy instances',\n [SKIP_SECTION]: 'Skip section'\n },\n\n fr: {\n [QUERY_CONTENT]: 'Cette requête SPARQL sélectionne toutes les instances de la classe <b>{{iri}}</b>. La requête a été saisie automatiquement lorsque vous avez cliqué sur la vue lien d\\'instances.',\n [RESULTS_CONTENT]: 'Le tableau montre les résultats. Notez que dans ce cas particulier, la requête a été exécutée automatiquement.',\n [RESULTS_EXTRA_CONTENT]: 'Ne vous inquiétez pas &mdash; il y aura une section dédiée à l\\'éditeur SPARQL plus tard dans le guide.',\n [RDF_INSTANCES_TITLE]: 'Instances de hiérarchie de classes',\n [SKIP_SECTION]: 'Sauter la section'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const RESOURCE_SEARCH_RDF_TITLE = 'guide.step-action.resource-search-rdf';\nconst RESOURCE_SEARCH_RDF_CONTENT = 'guide.step-action.resource-search-rdf-content';\n\n/**\n * @name resource-search-rdf\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-search-rdf` guide step prompts the user to enter node search term in the search field.\n * This is a reusable step that can be used everywhere a rdf-search input is present\n *\n * Resource search input example:<br>\n * <img src=\"resources/guides/resource/resource-search-rdf.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} [options.searchTerm] - The search term to be entered by the user.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-search-rdf\",\n * \"options\": {\n * \"searchTerm\": \"http://example.org/resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-search-rdf',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('search-resource-input');\n const searchTerm = options.searchTerm || '';\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, RESOURCE_SEARCH_RDF_CONTENT, {searchTerm}),\n title: translate(this.translationBundle, RESOURCE_SEARCH_RDF_TITLE),\n ...options,\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(elementSelector, searchTerm))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_SEARCH_RDF_TITLE]: 'Resource search',\n [RESOURCE_SEARCH_RDF_CONTENT]: 'Enter the following text: <b>{{searchTerm}}</b>'\n },\n fr: {\n [RESOURCE_SEARCH_RDF_TITLE]: 'Recherche de ressource',\n [RESOURCE_SEARCH_RDF_CONTENT]: 'Entrez le texte suivant : <b>{{searchTerm}}</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","/**\n * @name sparql-search-method-enable-sparql-query\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through enabling the option to provide a SPARQL CONSTRUCT query that fetches the ontology for the SPARQL search method in the TTYG interface.\n * It includes steps to enable the option, select the SPARQL query option, copy the example query text, and optionally add missing namespaces.\n *\n * SPARQL query select<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-sparql-query-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Copy query text<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-copy-query-text.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Add missing namespaces<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-click-add-namespaces.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n * @property {boolean} [options.addMissingNamespaces] - If true, an additional step will be included to click on the \"Add missing namespaces\" after copying the query text.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-search-method-enable-sparql-query\",\n * \"options\": {\n * \"addMissingNamespaces\": true\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-search-method-enable-sparql-query',\n getSteps: (options, _services) => {\n const steps = [\n {\n guideBlockName: 'ttyg-sparql-method-sparql-query-select', options: {...options}\n },\n {\n guideBlockName: 'ttyg-sparql-copy-query-text', options: {...options}\n }\n ];\n\n if (options.addMissingNamespaces) {\n steps.push({\n guideBlockName: 'ttyg-sparql-click-add-namespaces', options: {...options}\n });\n }\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.import-file';\nconst CONTENT = 'guide.step_plugin.import_rdf_file.content';\nconst UPLOAD_FILE_ERROR = 'guide.step_plugin.import_rdf_file.file-must-be-uploaded';\nconst UNEXPECTED_FILE = 'guide.step_plugin.import_rdf_file.unexpected-file';\n\n/**\n * @name import-upload-rdf-file\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `import-upload-rdf-file` step guides the user to click the button to upload an RDF file in GraphDB.<br>\n * <img src=\"resources/guides/import/import-upload-rdf-file.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following options:\n * @property {string} resourceFile - The name of the resource file that should be downloaded in the step.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"import-upload-rdf-file\",\n * \"options\": {\n * \"resourceFile\": \"example.rdf\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'import-upload-rdf-file',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const toastr = services.toastr;\n const $translate = services.$translate;\n const translate = services.translate;\n const $interpolate = services.$interpolate;\n const EventEmitterService = services.EventEmitterService;\n const importSettingsButtonSelector = GuideUtils.getGuideElementSelector('import-settings-import-button');\n let filesForUploadSelectedSubscription;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(step.translationBundle, CONTENT, {resourceFile: options.resourceFile}),\n class: 'upload-rdf-file-button',\n title: translate(step.translationBundle, DEFAULT_TITLE),\n ...options,\n url: 'import',\n elementSelector: GuideUtils.getGuideElementSelector('uploadRdfFileButton'),\n // Disable default behavior of service when element is clicked.\n advanceOn: undefined,\n show: (guide) => () => {\n // Subscribes to event \"filesForUploadSelected\", when the step is showing, this will give opportunity\n // to canceling uploading if user not choose correct file.\n filesForUploadSelectedSubscription = EventEmitterService.subscribe('filesForUploadSelected', ((eventData) => {\n const uploadedFiles = eventData.files || [];\n if (uploadedFiles.some((uploadedFile) => uploadedFile.name === options.resourceFile)) {\n // When tha correct file is selected, the guide can continue.\n\n // Check for duplicated name, if import button for guide rdf data exist.\n if (GuideUtils.isVisible(GuideUtils.getGuideElementSelector('import-file-' + options.resourceFile))) {\n GuideUtils.getOrWaitFor('.confirm-duplicate-files-dialog')\n .then(() => guide.next());\n } else {\n GuideUtils.getOrWaitFor(importSettingsButtonSelector)\n .then(() => guide.next());\n }\n } else {\n // Canceling the automatic uploading of files\n // because the guide rdf file is not selected.\n GuideUtils.noNextErrorToast(toastr, $translate, $interpolate, translate(this.translationBundle, UNEXPECTED_FILE, {resourceFile: options.resourceFile}), options);\n eventData.cancel = true;\n }\n }));\n },\n hide: () => () => {\n if (filesForUploadSelectedSubscription) {\n filesForUploadSelectedSubscription();\n }\n },\n onNextValidate: () => {\n return Promise.allSettled([GuideUtils.getOrWaitFor('.confirm-duplicate-files-dialog'), GuideUtils.getOrWaitFor(GuideUtils.getGuideElementSelector('import-file-' + options.resourceFile))])\n .then(([confirmDialogPromise, importButtonPromise]) => {\n // There are two ways to exit this step:\n // if the duplication dialog is opened\n // or if the import button for the guide file is displayed.\n // The first scenario indicates that the user is trying to upload the same file,\n // while the second scenario suggests\n // that the guide has been started more than once.\n if ('rejected' === confirmDialogPromise.status && 'rejected' === importButtonPromise.status) {\n const uploadFileError = translate(this.translationBundle, UPLOAD_FILE_ERROR, {resourceFile: options.resourceFile});\n // TODO should be reworked with GDB-13089\n GuideUtils.noNextErrorToast(toastr, $translate, $interpolate, uploadFileError, options);\n return false;\n }\n return true;\n });\n },\n onNextClick: (guide) => {\n GuideUtils.getOrWaitFor(GuideUtils.getGuideElementSelector('import-file-' + options.resourceFile))\n .then((element) => {\n // If we have file import button for the guide rdf file,\n // this indicates that we go through this step for the second time.\n // This can happen if the user starts the guide for the second time.\n element.click();\n })\n .finally(() => guide.next());\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Import file',\n [CONTENT]: 'Click on the <b>Upload RDF files</b> button and choose a file with the name <b>{{resourceFile}}</b>.',\n [UPLOAD_FILE_ERROR]: 'Upload the file <b>{{resourceFile}}</b> first',\n [UNEXPECTED_FILE]: 'The uploaded file does not match the expected resource. Please upload <b>{{resourceFile}}</b>.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Importer un fichier',\n [CONTENT]: 'Cliquez sur le bouton <b>Télécharger des fichiers RDF</b> et choisissez un fichier avec le nom <b>{{resourceFile}}</b>.',\n [UPLOAD_FILE_ERROR]: 'Téléchargez d\\'abord le fichier <b>{{resourceFile}}</b>',\n [UNEXPECTED_FILE]: 'Le fichier importé ne correspond pas à la ressource attendue. Veuillez importer <b>{{resourceFile}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.similarity-search-method';\nconst SIMILARITY_CONTENT = 'guide.step_plugin.similarity-search-method.content';\n\n/**\n * @name ttyg-similarity-info-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an informational message about the Similarity search query method in the TTYG interface.\n * It explains the benefits and use cases of enabling Similarity search.\n *\n * Similarity info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-similarity-info-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-similarity-info-message',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, SIMILARITY_CONTENT),\n class: 'info-similarity-search',\n title: translate(this.translationBundle, SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE),\n ...options,\n url: 'ttyg'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [SIMILARITY_CONTENT]: 'Enabling Similarity search allows the agent to answer questions by using Similarity search. Performs well on open-ended questions but not so well on providing aggregations.'\n },\n fr: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [SIMILARITY_CONTENT]: 'L\\'activation de la recherche par similarité permet à l\\'agent de répondre aux questions en utilisant la recherche par similarité. Les résultats sont bons pour les questions ouvertes, mais moins bons pour les agrégations.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_EDIT_AGENT_DEFAULT_TITLE = 'guide.step-action.edit-ttyg-agent';\nconst SAVE_AGENT = 'guide.step_plugin.edit-ttyg-agent.save-agent-settings';\n\n/**\n * @name ttyg-edit-agent-click-to-save\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click the save button after editing a TTYG agent.\n *\n * Click on save to save the edited agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-edit-agent-click-to-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-edit-agent-click-to-save\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-edit-agent-click-to-save',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, SAVE_AGENT),\n title: translate(this.translationBundle, TTYG_EDIT_AGENT_DEFAULT_TITLE),\n class: 'save-agent',\n disablePreviousFlow: false,\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('save-agent-settings')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Edit an agent',\n [SAVE_AGENT]: 'Click to save the agent settings.'\n },\n\n fr: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Modifier un agent',\n [SAVE_AGENT]: 'Cliquez sur pour enregistrer les paramètres de l\\'agent.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.autocomplete.default.title';\nconst CONTENT = 'guide.step_plugin.autocomplete-focus-on-indexing-status.content';\n\n/**\n * @name autocomplete-focus-on-indexing-status\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `autocomplete-focus-on-indexing-status` step produces a step that describes user that have to wait until indexing finished and shows\n * where they can see the status of autocomplete indexing process.<br>\n * <img src=\"resources/guides/autocomplete/autocomplete-focus-on-indexing-status.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * The autocomplete-focus-on-indexing-status step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"autocomplete-focus-on-indexing-status\"\n * }\n * ```\n *\n */\nconst step = {\n guideBlockName: 'autocomplete-focus-on-indexing-status',\n getSteps: function(options, services) {\n const translate = services.translate;\n\n return {\n guideBlockName: 'read-only-element',\n options: {\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options,\n url: 'autocomplete',\n elementSelector: services.GuideUtils.getGuideElementSelector('autocompleteStatus'),\n class: 'autocomplete-status-info',\n canBePaused: false\n }\n };\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Enable autocomplete',\n [CONTENT]: 'Wait until indexing finished.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Activer la saisie semi-automatique',\n [CONTENT]: 'Attendez que l\\'indexation soit terminée.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","// eslint-disable-next-line no-unused-vars\nimport {Options} from '../options.js';\n\n/**\n * @name welcome\n * @memberof module:Interactive Guide\n *\n * @description\n * The Welcome step produces two steps:\n *\n * - The first step onboards users on how to interact with the guide dialogs. It explains the basic concepts, provides hints,\n * and describes the overall purpose of the guide.<br>\n * <img src=\"resources/guides/welcome/welcome_1.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * - The second step shows the description for the specific guide being run. The content is passed through the option\n * `translatedGuideDescription`.<br>\n * <img src=\"resources/guides/welcome/welcome_2.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * The Welcome step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"welcome\"\n * }\n * ```\n *\n */\nconst step = {\n guideBlockName: 'welcome',\n /**\n *\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = translate(this.translationBundle, 'guide.step_plugin.welcome.title', {translatedGuideName: options.translatedGuideName});\n const infoIconHint = translate(this.translationBundle, 'guide.step_plugin.welcome.info-icon-hint');\n const mouseIconHint = translate(this.translationBundle, 'guide.step_plugin.welcome.mouse-icon-hint');\n const inputIconHint = translate(this.translationBundle, 'guide.step_plugin.welcome.input-icon-hint');\n\n return [\n {\n guideBlockName: 'info-message',\n options: {\n title,\n content: translate(this.translationBundle, 'guide.step_plugin.welcome.content', {\n infoIconHint,\n mouseIconHint,\n inputIconHint\n })\n }\n },\n {\n guideBlockName: 'info-message',\n options: {\n title,\n content: translate(this.translationBundle, 'guide.step_plugin.welcome-what.content', {translatedGuideDescription: options.translatedGuideDescription})\n }\n }\n ];\n },\n // TODO: The translations contains icon that belong to the client application, this should be handled differently via plugin service.\n translationBundle: {\n en: {\n 'guide.step_plugin.welcome.title': 'Welcome to {{translatedGuideName}}',\n 'guide.step_plugin.welcome.content': 'Throughout the guide you will see boxes like this one that will provide instructions on what to do.<p>The icon in the top left corner is a hint too:<ul><li>{{infoIconHint}}</li><li>{{mouseIconHint}}</li><li>{{inputIconHint}}</li></ul></p>',\n 'guide.step_plugin.welcome.info-icon-hint': '<span class=\"icon icon-1-5x icon-info\"></span> means the box provides information.',\n 'guide.step_plugin.welcome.mouse-icon-hint': '<span class=\"icon icon-1-5x icon-focus\"></span> asks you to do something with the mouse.',\n 'guide.step_plugin.welcome.input-icon-hint': '<span class=\"icon icon-1-5x icon-edit\"></span> tells you to type or paste something.',\n 'guide.step_plugin.welcome-what.content': '{{translatedGuideDescription}}<p>Let\\'s get started for real now!</p>'\n },\n fr: {\n 'guide.step_plugin.welcome.title': 'Bienvenue dans {{translatedGuideName}}',\n 'guide.step_plugin.welcome.content': 'Tout au long du guide, vous verrez des boîtes comme celle-ci qui fourniront des instructions sur ce qu\\'il faut faire.<p>L\\'icône dans le coin supérieur gauche est également un indice :<ul><li>{{infoIconHint}}</li><li>{{mouseIconHint}}</li><li>{{inputIconHint}}</li></ul></p>',\n 'guide.step_plugin.welcome.info-icon-hint': '<span class=\"icon icon-1-5x icon-info\"></span> signifie que la boîte fournit des informations.',\n 'guide.step_plugin.welcome.mouse-icon-hint': '<span class=\"icon icon-1-5x icon-focus\"></span> vous demande de faire quelque chose avec la souris.',\n 'guide.step_plugin.welcome.input-icon-hint': '<span class=\"icon icon-1-5x icon-edit\"></span> vous dit de taper ou de coller quelque chose.',\n 'guide.step_plugin.welcome-what.content': '{{translatedGuideDescription}}<p>Commençons pour de vrai maintenant !</p>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPAND_TITLE = 'guide.step_plugin.visual-graph-expand.title';\nconst VISUAL_GRAPH_EXPAND_CONTENT = 'guide.step_plugin.visual-graph-expand.content';\n\n/**\n * @name visual-graph-expand\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-expand` guide step that explains how to expand a node in the Visual Graph by double-clicking it.\n *\n * <img src=\"resources/guides/visual-graph/visual-graph-expand.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is available:\n *\n * Options:\n * @property {string} [options.iri] - The IRI used to build the element selector for the node and in the translations.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-expand\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\",\n * \"iriLabel\": \"my resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-expand',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const $rootScope = services.$rootScope;\n const $route = services.$route;\n const translate = services.translate;\n const elementSelector = `.node-wrapper[id^=\"${options.iri}\"] circle`;\n\n // Expands visual graph when a node is double-clicked.\n const dblClickFunction = (guide) => () => {\n GuideUtils.graphVizExpandNode(elementSelector);\n guide.getCurrentStep().hide();\n GuideUtils.awaitAlphaDropD3(null, $rootScope)()\n .then(() => {\n guide.next();\n });\n };\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPAND_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_EXPAND_CONTENT, {iriLabel: options.iriLabel}),\n url: 'graphs-visualizations',\n canBePaused: false,\n class: 'visual-graph-expand-node',\n elementSelector,\n // Disable default behavior of service when element is clicked.\n advanceOn: undefined,\n onNextClick: (guide) => {\n GuideUtils.graphVizExpandNode(elementSelector);\n guide.getCurrentStep().hide();\n GuideUtils.awaitAlphaDropD3(null, $rootScope)()\n .then(() => {\n guide.next();\n });\n },\n show: (guide) => () => {\n // Add \"dblclick\" listener to the element. Processing of double-click event is disabled for the visual graph when guide is started.\n // So we have expanded the graph manually when a selected node is double-clicked.\n $(elementSelector).on('dblclick.onNodeDbClicked', dblClickFunction(guide));\n },\n hide: () => () => {\n // Remove the \"dblclick\" listener of element. It is important when step is hided.\n $(elementSelector).off('dblclick.onNodeDbClicked');\n },\n beforeShowPromise: () => {\n $route.reload();\n // in some cases reloading starts after the defer and alpha drop. In such cases the step is shown, the page is\n // reloaded and shepherd detaches from the element. We do two deferred shows to ensure the reload has started and then wait for the d3 alpha to drop, so we ensure the correct order\n return GuideUtils.deferredShow()()\n .then(GuideUtils.deferredShow(50))\n .then(GuideUtils.awaitAlphaDropD3(elementSelector, $rootScope));\n },\n initPreviousStep: (services, stepId) => {\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.id)\n .then(() => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n // Skip expanding of node if last step is \"visual-graph-expand\"\n if (currentStepId === stepId) {\n return Promise.resolve;\n }\n\n GuideUtils.graphVizExpandNode(elementSelector);\n return GuideUtils.deferredShow(50)()\n .then(() => {\n return GuideUtils.awaitAlphaDropD3(null, $rootScope)();\n });\n });\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPAND_TITLE]: 'Visual graph: expand node',\n [VISUAL_GRAPH_EXPAND_CONTENT]: 'Double click on <b>{{iriLabel}}</b> to expand the graph.'\n },\n fr: {\n [VISUAL_GRAPH_EXPAND_TITLE]: 'Graphe visuel : développer un nœud',\n [VISUAL_GRAPH_EXPAND_CONTENT]: 'Double-cliquez sur <b>{{iriLabel}}</b> pour développer le graphique.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\n\n/**\n * @name create-repository\n * @memberof module:Interactive Guide\n *\n * @description\n * Complex step, guiding the user through the creation of a new repository.\n * The step consists of the following steps:\n *\n * Click on the \"Create repository\" button.<br>\n * <img src=\"resources/guides/repository/repositories-create-repository.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Create GraphDB repository.<br>\n * <img src=\"resources/guides/repository/repositories-create-graphdb.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enter a repository ID.<br>\n * <img src=\"resources/guides/repository/repositories-id-input.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * (Optional) Select a ruleset.<br>\n * <img src=\"resources/guides/repository/repositories-ruleset-dropdown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * (Optional) Enable full-text search.<br>\n * <img src=\"resources/guides/repository/repositories-enable-fts.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Save the repository.<br>\n * <img src=\"resources/guides/repository/repositories-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following options:\n * @property {string} [rulesetName] - If this option is present, a dropdown will be displayed to select a ruleset.\n * @property {boolean} [fts] - If this option is present, a checkbox will be displayed to enable full-text search.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"create-repository\",\n * \"options\": {\n * \"rulesetName\": \"my-ruleset\",\n * \"fts\": true\n * }\n * }\n */\nconst step = {\n guideBlockName: 'create-repository',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n options.mainAction = 'create-repository';\n options.title = options.title ?? translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE);\n\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'repositories',\n showIntro: true,\n ...options\n }\n },\n {guideBlockName: 'repositories-create-repository', options: {...options}},\n {guideBlockName: 'repositories-create-graphdb', options: {...options}},\n {guideBlockName: 'repositories-id-input', options: {...options}}\n ];\n\n if (options.rulesetName) {\n steps.push({guideBlockName: 'repositories-ruleset-dropdown', options: {...options}});\n }\n if (options.fts) {\n steps.push({guideBlockName: 'repositories-enable-fts', options: {...options}});\n }\n\n steps.push({guideBlockName: 'repositories-save', options: {...options}});\n\n return steps;\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_PROPERTIES_HINT = 'guide.step-action.visual-graph-config-hint';\n\n/**\n * @name visual-graph-config-hint\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-config-hint` guide step prompts the user to type a hint for their visual graph configuration.\n *\n * Configure graph hint<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-hint.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} [options.configHint] - The hint of the visual graph configuration to be entered by the user.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-config-hint\",\n * \"options\": {\n * \"configHint\": \"http://example.org/resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-hint',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-config-hint');\n const configHint = options.configHint || '';\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_PROPERTIES_HINT, {configHint}),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n ...options,\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(elementSelector, configHint))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_HINT]: 'Copy and use the following IRI as the starting point for the visual graph: <b>{{configHint}}</b>'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_HINT]: 'Copiez et utilisez l\\'IRI suivant comme point de départ pour le graphique visuel : <b>{{configHint}}</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst SAVE_BUTTON = 'guide.step_plugin.create_repository.save_button.content';\n\n/**\n * @name repositories-save\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to save the repository creation.\n *\n * Save repository step<br>\n * <img src=\"resources/guides/repository/repositories-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-save\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-save',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const repositoryIdInputSelector = GuideUtils.getGuideElementSelector('graphDBRepositoryIdInput');\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, SAVE_BUTTON),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'create-repository-button',\n ...options,\n url: 'repository/create/graphdb',\n elementSelector: GuideUtils.getGuideElementSelector('graphDBRepositoryCrateButton'),\n disablePreviousFlow: false,\n show: () => () => {\n GuideUtils.validateTextInput(repositoryIdInputSelector, options.repositoryId);\n },\n onNextClick: GuideUtils.clickOnGuideElement('graphDBRepositoryCrateButton')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [SAVE_BUTTON]: 'Click on the <b>Create</b> button.'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [SAVE_BUTTON]: 'Cliquez sur le bouton <b>Créer</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.import-file';\n\n/**\n * @name import-rdf-file\n * @memberof module:Interactive Guide\n *\n * @description\n * The `import-rdf-file` guide shows how to import an RDF file into GraphDB.\n *\n * The guide consists of the following steps:\n * 1. A step that guides the user to click on the \"Import\" main menu.<br>\n * <img src=\"resources/guides/main-menu/main-menu-import.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 2. A step that downloads a guide resource if specified.<br>\n * <img src=\"resources/guides/import/import-download-guide-resource.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 3. A step that guides the user to upload an RDF file.<br>\n * <img src=\"resources/guides/import/import-upload-rdf-file.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 4. (Optional) A step that shows an info dialog if the file is already uploaded.<br>\n * <img src=\"resources/guides/import/import-confirm-duplicate-files.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 5. A step that guides the user to click the import button.<br>\n * <img src=\"resources/guides/import/import-click-on-import-button.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 6. A step that shows the import progress.<br>\n * <img src=\"resources/guides/import/import-show-progress.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This guide can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following options:\n * @property {string} resourcesPath - The path to the resource that should be downloaded in the step.\n * @property {string} resourceFile - The name of the resource file that should be downloaded in the step.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"import-rdf-file\",\n * \"options\": {\n * \"resourcePath\": \"/path/to/example.rdf\",\n * \"resourceFile\": \"example.rdf\",\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'import-rdf-file',\n getSteps: function(options, services) {\n const translate = services.translate;\n options.mainAction = 'import-file';\n const title = options.title ? options.title : translate(step.translationBundle, DEFAULT_TITLE);\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'import',\n showIntro: true,\n title,\n ...options\n }\n }\n ];\n\n if (options.resourcePath) {\n steps.push(\n {\n guideBlockName: 'download-guide-resource',\n options: {\n title,\n ...options\n }\n }\n );\n }\n\n steps.push(...[\n {\n guideBlockName: 'import-upload-rdf-file', options: {\n disablePreviousFlow: false,\n title,\n ...options}\n },\n // This step is optional and will only appear if the file we want to upload has already been uploaded.\n // If the file is already uploaded, a confirmation dialog will be opened, and this step will display the confirm button of the dialog.\n {\n guideBlockName: 'import-confirm-duplicate-files', options: {title, ...options}\n },\n {\n guideBlockName: 'import-click-on-import-button', options: {title, ...options}\n },\n {\n guideBlockName: 'import-show-progress', options: {title, ...options}\n }\n ]);\n\n return steps;\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Import file'\n },\n fr: {\n [DEFAULT_TITLE]: 'Importer un fichier'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","export const BASIC_STEP = {\n title: '',\n content: '',\n elementSelector: undefined,\n placement: 'bottom',\n url: undefined,\n type: 'read-only-element',\n maxWaitTime: 3,\n canBePaused: true,\n onNextClick: undefined,\n disablePreviousFlow: true,\n onNextValidate: () => Promise.resolve(true),\n onPreviousClick: undefined,\n skipPoint: false,\n skipButtonLabel: {\n en: 'Skip',\n fr: 'Sauter'\n },\n class: ''\n};\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst FIELD_NAME_INTRO_CONTENT = 'guide.step_plugin.connectors-lucene-fields-field-name-intro.content';\n\n/**\n * @name connectors-lucene-fields-field-name-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Field name\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Field name\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector field name introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-field-name-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-field-name-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-field-name-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, FIELD_NAME_INTRO_CONTENT),\n ...(options.title ? {} : {title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE)}),\n ...options,\n class: 'connectors-lucene-fields-field-name-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'fieldName'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [FIELD_NAME_INTRO_CONTENT]: 'The <b>Field name</b> defines the mapping on the connector side and is specified as a string. It is also used at query time to reference the field.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [FIELD_NAME_INTRO_CONTENT]: 'Le <b>nom du champ</b> définit le mappage du côté du connecteur et est spécifié sous forme de chaîne. Il est également utilisé lors des requêtes pour référencer le champ.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const ZOOM_CLASS_CONTENT = 'guide.step_plugin.class-hierarchy-zoom-class.content';\nconst CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\n\n/**\n * @name class-hierarchy-zoom-class\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding users to zoom into a specific class within the class hierarchy visualization.\n * Scrolling will zoom into the class, visualizing subclasses\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-zoom-class.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} options.iri - The IRI of the class to be zoomed into. This option is required.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-zoom-class\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-zoom-class',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n const selector = GuideUtils.getGuideElementSelector('class-' + options.iri);\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n url: 'hierarchy',\n placement: 'left',\n elementSelector: selector,\n content: translate(this.translationBundle, ZOOM_CLASS_CONTENT, {iri: options.iri}),\n class: 'class-hierarchy-zoom-class',\n onNextClick: (guide, step) => {\n GuideUtils.classHierarchyZoom(step.elementSelector);\n guide.next();\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [ZOOM_CLASS_CONTENT]: 'The class <b>{{iri}}</b> is a parent class that has subclasses. Zoom inside to have a better view by scrolling up with the mouse inside the circle.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy'\n },\n\n fr: {\n [ZOOM_CLASS_CONTENT]: 'La classe <b>{{iri}}</b> est une classe parente qui a des sous-classes. Zoomez à l\\'intérieur pour avoir une meilleure vue en faisant défiler vers le haut avec la souris à l\\'intérieur du cercle.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SELECT_AGENT_DEFAULT_TITLE = 'guide.step-action.select-ttyg-agent';\nconst OPEN_AGENT_DROPDOWN = 'guide.step_plugin.select-ttyg-agent.open-agent-dropdown';\n\n/**\n * @name ttyg-select-agent-dropdown-open\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to open the agent selection dropdown in the TTYG interface.\n * It highlights the dropdown element and provides instructions on how to proceed.\n *\n * Click on the agents dropdown<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-dropdown-open.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-select-agent-dropdown-open\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-select-agent-dropdown-open',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, OPEN_AGENT_DROPDOWN),\n // If mainAction is set the title will be set automatically\n title: translate(this.translationBundle, TTYG_SELECT_AGENT_DEFAULT_TITLE),\n class: 'open-agent-dropdown',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('select-agent-dropdown')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Select an agent',\n [OPEN_AGENT_DROPDOWN]: 'Click on the agents dropdown to see available agents'\n },\n\n fr: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Sélectionner un agent',\n [OPEN_AGENT_DROPDOWN]: 'Cliquez sur le menu déroulant des agents pour voir les agents disponibles'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\n\n/**\n * @name info-message\n * @memberof module:Interactive Guide\n *\n * @description\n * Displays a read-only informational message to the user. Interaction is not required to proceed unless configured\n * via common options.\n *\n * Info message example<br>\n * <img src=\"resources/guides/core/info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br></br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"info-message\",\n * \"options\": {\n * \"title\": \"Heads up\",\n * \"content\": \"Please read this information.\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'info-message',\n getStep: (options, services) => {\n const notOverridable = {\n type: 'readonly'\n };\n return {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n ...options,\n ...notOverridable\n };\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst TYPE_ONTLOGY_GRAPH = 'guide.step_plugin.sparql-search-method.type-ontology-graph-name';\n\n/**\n * @name sparql-search-method-type-graph-name\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to type the name of the named graph that contains the ontology for the SPARQL search method in the TTYG interface.\n * It highlights the input element and provides instructions on how to proceed.\n *\n * Type the name of the named graph that contains the ontology<br>\n * <img src=\"resources/guides/ttyg/sparql-search-method-type-graph-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, the following specific option is available:\n *\n * @property {string} [options.ontologyGraph] - The name of the named graph that contains the ontology. Default is 'http://example.org/ontology'.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-search-method-type-graph-name\",\n * \"options\": {\n * \"ontologyGraph\": \"http://example.org/ontology\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-search-method-type-graph-name',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, TYPE_ONTLOGY_GRAPH, {ontologyGraph: options.ontologyGraph}),\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n class: 'input-ontology-graph-name',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('sparql-ontology-graph-input'),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(GuideUtils.getGuideElementSelector('sparql-ontology-graph-input'), options.ontologyGraph, false))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [TYPE_ONTLOGY_GRAPH]: 'Type <b>{{ontologyGraph}}</b> as the named graph which contains the ontology.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [TYPE_ONTLOGY_GRAPH]: 'Type <b>{{ontologyGraph}}</b> en tant que graphe nommé contenant l\\'ontologie.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CONVERSATION_WITH_AGENT_DEFAULT_TITLE = 'guide.step-action.conversation-with-ttyg-agent';\nconst CONVERSATION_WITH_AGENT_INFO = 'guide.step_plugin.conversation-with-ttyg-agent.info';\n\n/**\n * @name ttyg-conversation-info-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an informational message about the Talk To Your Graph (TTYG) feature.\n * It explains the purpose of the TTYG view and how users can interact with it using natural language queries.\n *\n * TTYG conversation info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-conversation-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-conversation-info-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-conversation-info-message',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(step.translationBundle, CONVERSATION_WITH_AGENT_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'info-message',\n options: {\n title,\n skipPoint: true,\n class: 'conversation-info',\n content: translate(step.translationBundle, CONVERSATION_WITH_AGENT_INFO),\n ...options,\n url: 'ttyg'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CONVERSATION_WITH_AGENT_DEFAULT_TITLE]: 'Conversation with the agent',\n [CONVERSATION_WITH_AGENT_INFO]: 'The Talk To Your Graph view provides a chat-like interface for querying your data. Natural language queries are written in the chatbox at the bottom of the screen. With the aid of LLM technology, they are translated into a machine-readable question and the RDF answer is narrated back to you.'\n },\n\n fr: {\n [CONVERSATION_WITH_AGENT_DEFAULT_TITLE]: 'Conversation avec l\\'agent',\n [CONVERSATION_WITH_AGENT_INFO]: 'La vue Talk To Your Graph (Parlez à votre graphique) offre une interface de type chat pour interroger vos données. Les requêtes en langage naturel sont écrites dans la boîte de dialogue en bas de l\\'écran. Grâce à la technologie LLM, elles sont traduites en une question lisible par une machine et la réponse RDF vous est racontée.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst EXPLAIN_CONTENT = 'guide.step_plugin.sparql-results-explain.content';\n\n/**\n * @name sparql-results-explain\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on the table that shows the results of a SPARQL query.\n *\n * Visualize results table<br>\n * <img src=\"resources/guides/sparql-editor/sparql-results-explain.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-results-explain\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-results-explain',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n content: translate(this.translationBundle, EXPLAIN_CONTENT),\n url: 'sparql',\n placement: 'top',\n elementSelector: services.GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_SELECTOR,\n class: 'yasgui-query-results',\n fileName: options.fileName,\n scrollToHandler: services.GuideUtils.scrollToTop,\n extraContent: options.resultExtraContent,\n canBePaused: false,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [EXPLAIN_CONTENT]: 'The table shows the results from executing the query.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [EXPLAIN_CONTENT]: 'Le tableau montre les résultats de l\\'exécution de la requête.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TOGGLE_PREFIXES_CONTENT = 'guide.step_plugin.class-hierarchy-toggle-prefixes.content';\nconst CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\n\n/**\n * @name class-hierarchy-toggle-prefixes\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on the button that toggles the display of prefixes in the class hierarchy view.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-toggle-prefixes.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-toggle-prefixes\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-toggle-prefixes',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, TOGGLE_PREFIXES_CONTENT),\n url: 'hierarchy',\n elementSelector: '.prefix-toggle-btn',\n class: 'class-hierarchy-toggle-prefixes',\n scrollToHandler: GuideUtils.scrollToTop,\n onNextClick: (_guide) => {\n GuideUtils.clickOnElement('.prefix-toggle-btn')();\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TOGGLE_PREFIXES_CONTENT]: 'Click on <b>Show prefixes/Hide prefixes</b> to toggle the display of the prefixes.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy'\n },\n\n fr: {\n [TOGGLE_PREFIXES_CONTENT]: 'Cliquez sur <b>Afficher les préfixes/Masquer les préfixes</b> pour afficher ou masquer les préfixes.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_CREATE_AGENT_DEFAULT_TITLE = 'guide.step-action.create-ttyg-agent';\nconst TTYG_INTRO_MESSAGE = 'guide.step_plugin.create-ttyg-agent.intro';\n\n/**\n * @name ttyg-create-agent-intro-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an introductory message about creating an agent in the Talk to Your Graph (TTYG) plugin.\n * It explains what an agent is and why it is necessary to configure one before using TTYG.\n *\n * Create an agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-intro-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-create-agent-intro-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-create-agent-intro-message',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_CREATE_AGENT_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'info-message',\n options: {\n title,\n content: translate(this.translationBundle, TTYG_INTRO_MESSAGE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Create an agent',\n [TTYG_INTRO_MESSAGE]: 'An agent is a helpful assistant that can answer your queries. You need to configure an agent in order to ask anything of Talk to Your Graph.'\n },\n\n fr: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Créer un agent',\n [TTYG_INTRO_MESSAGE]: 'Un agent est un assistant utile qui peut répondre à vos questions. Vous devez configurer un agent pour pouvoir demander quoi que ce soit à Talk to Your Graph.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_CREATE_AGENT_DEFAULT_TITLE = 'guide.step-action.create-ttyg-agent';\nconst CREATE_AGENT = 'guide.step_plugin.create-ttyg-agent.create-agent';\n\n/**\n * @name ttyg-create-agent-click\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to click on the \"Create Agent\" button in the Talk to Your Graph (TTYG) plugin.\n * It highlights the button and provides instructions on how to proceed with creating a new agent.\n *\n * Click on create agent button<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-create-agent-click\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-create-agent-click',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_CREATE_AGENT_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, CREATE_AGENT),\n class: 'create-agent-btn',\n maxWaitTime: 10,\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('create-agent-btn')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Create an agent',\n [CREATE_AGENT]: 'Click on the create agent button to create a new agent.'\n },\n\n fr: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Créer un agent',\n [CREATE_AGENT]: 'Cliquez sur le bouton Créer un agent pour créer un nouvel agent.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst RESOURCE_CLICK_ON_ROLE_TITLE = 'view.resource.title';\nconst GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_SUBJECT_CONTENT = 'guide.step_plugin.resource-click-on-role.subject.content';\nconst GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_PREDICATE_CONTENT = 'guide.step_plugin.resource-click-on-role.predicate.content';\nconst GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_OBJECT_CONTENT = 'guide.step_plugin.resource-click-on-role.object.content';\nconst GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_CONTEXT_CONTENT = 'guide.step_plugin.resource-click-on-role.context.content';\nconst GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_ALL_CONTENT = 'guide.step_plugin.resource-click-on-role.all.content';\n/**\n * @name resource-click-on-role\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-click-on-role`\n * guide step guides the user to click on a specific role tab\n * (such as subject, predicate, object, context, or all) in the resource view\n * to filter and display RDF statements based on the IRI's position.\n *\n * <img src=\"resources/guides/resource/resource-click-on-role.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific options are available:\n *\n * Options:\n * @property {string} options.role - The role used to select the appropriate translation content\n * (e.g., 'subject', 'predicate', 'object', 'context', 'all').\n * @property {string} options.showRole - The role used to build the element selector for the clickable tab.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-click-on-role\",\n * \"options\": {\n * \"role\": \"subject\",\n * \"showRole\": \"subject\",\n * \"skipUrl\": false\n * }\n * }\n * ```\n */\n\nconst step = {\n guideBlockName: 'resource-click-on-role',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, `guide.step_plugin.resource-click-on-role.${options.role}.content`),\n title: translate(this.translationBundle, RESOURCE_CLICK_ON_ROLE_TITLE),\n ...options,\n ...(options.skipUrl ? {} : {url: Utils.getResourceURL(options)}),\n elementSelector: GuideUtils.getGuideElementSelector('role-' + options.showRole),\n class: 'visual_graph-role',\n onNextClick: (guide, step) => {\n GuideUtils.waitFor(step.elementSelector, 3)\n .then(() => document.querySelector(step.elementSelector).click());\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_CLICK_ON_ROLE_TITLE]: 'Resource',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_SUBJECT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>subject</b> tab.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_PREDICATE_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>predicate</b> tab.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_OBJECT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>object</b> tab.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_CONTEXT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>context</b> tab.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_ALL_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>all</b> tab.'\n },\n fr: {\n [RESOURCE_CLICK_ON_ROLE_TITLE]: 'Ressource',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_SUBJECT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>sujet</b>.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_PREDICATE_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>prédicat</b>.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_OBJECT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>objet</b>.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_CONTEXT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>contexte</b>.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_ALL_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>tous</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst DEFAULT_VALUE_INTRO = 'guide.step_plugin.connectors-lucene-fields-default-value-intro.content';\n\n/**\n * @name connectors-lucene-fields-default-value-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Default value\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Default value\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector default value introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-default-value-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-default-value-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-default-value-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, DEFAULT_VALUE_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-default-value-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'defaultValue'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [DEFAULT_VALUE_INTRO]: 'The <b>Default value</b> specifies the value to use for the field when the property chain has no matching values in GraphDB. It can be a plain literal, a literal with a datatype (xsd: prefix supported), a literal with a language tag, or an IRI. If not set, there is no default value.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [DEFAULT_VALUE_INTRO]: 'La <b>valeur par défaut</b> définit la valeur à utiliser pour le champ lorsque la chaîne de propriétés n’a pas de valeurs correspondantes dans GraphDB. Elle peut être un littéral simple, un littéral avec datatype (préfixe xsd: pris en charge), un littéral avec balise de langue ou un IRI. Si elle n’est pas définie, il n’y a pas de valeur par défaut.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-digram-predicates-intro.content';\n\n/**\n * @name class-relationships-digram-predicates-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-digram-predicates-intro` step displays a dialog that explains how to explore the relationships between classes\n * by clicking on a connection line in the diagram to view the top predicates linking them.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-digram-predicates-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-digram-predicates-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-digram-predicates-intro',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'focus-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('relationships-diagram'),\n placement: 'left',\n class: 'class-relationships-digram-predicates-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'Click on any connection line in the diagram to see the top predicates used between those two classes. This helps to understand what kind of relationships link them.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Cliquez sur n\\'importe quelle ligne de connexion dans le diagramme pour voir les principaux prédicats utilisés entre ces deux classes. Cela aide à comprendre quel type de relations les lie.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_EDIT_TITLE = 'menu.ttyg.edit.label';\n\n/**\n * @name edit-ttyg-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * Complex guide step, which takes the user through the process of editing a TTYG agent.\n *\n * Click the Lab main menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-lab.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on TTYG in the sub-menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-ttyg.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * End guide if API key error is present<br>\n * <img src=\"resources/guides/ttyg/end-on-api-key-error.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Edit agent intro message<br>\n * <img src=\"resources/guides/ttyg/ttyg-edit-agent-intro-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on edit agent button<br>\n * <img src=\"resources/guides/ttyg/ttyg-click-to-edit-selected-agent.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on save to save the edited agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-edit-agent-click-to-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The `configure-agent` step is configurable complex step. See [configure-agent](#.configure-agent) for more details.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"edit-ttyg-agent\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'edit-ttyg-agent',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const RoutingUtil = services.RoutingUtil;\n options.mainAction = 'edit-ttyg-agent';\n options.title = options.title ?? translate(this.translationBundle, TTYG_EDIT_TITLE);\n\n return [\n {\n guideBlockName: 'click-main-menu',\n options: {\n ...options,\n menu: 'ttyg',\n showOn: () => 'ttyg' !== RoutingUtil.getCurrentRoute()\n }\n },\n {\n guideBlockName: 'end-on-api-key-error'\n },\n {\n guideBlockName: 'ttyg-edit-agent-intro-message',\n options: {...options}\n },\n {\n // Skip next step (which is actually 5 core steps) if there is a selected agent\n guideBlockName: 'info-message',\n options: {\n beforeShowPromise: (guide, currentStep) => {\n if (GuideUtils.isGuideElementVisible('selected-agent')) {\n setTimeout(() => {\n // Using a timeout because the library executes async logic\n guide.show(currentStep.id + 6);\n });\n } else {\n setTimeout(() => {\n // Using a timeout because the library executes async logic\n guide.next();\n });\n }\n },\n ...options\n }\n },\n {\n guideBlockName: 'select-ttyg-agent',\n options: {...options}\n },\n {\n guideBlockName: 'ttyg-click-to-edit-selected-agent',\n options: {...options}\n },\n {\n guideBlockName: 'configure-agent',\n options\n },\n {\n guideBlockName: 'ttyg-edit-agent-click-to-save',\n options: {...options}\n },\n {\n guideBlockName: 'wait-for-element-to-hide',\n options: {\n elementSelectorToHide: GuideUtils.getElementSelector('.agent-settings-modal'),\n timeToWait: 10\n },\n ...options\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_EDIT_TITLE]: 'Edit an agent'\n },\n fr: {\n [TTYG_EDIT_TITLE]: 'Modifier un agent'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\n\n/**\n * @name class-relationships\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `class-relationships` step shows how to reach the Class relationships view of GraphDB Workbench.\n *\n * The step consists of the following steps:\n * 1. An introduction to the Class relationships.<br>\n * <img src=\"resources/guides//class-relationships/class-relationships-view-introduction_1.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * 2. A step that guides the user to click on the \"Explore\" main menu.<br>\n * <img src=\"resources/guides/main-menu/main-menu-explore.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * 3. A step that guides the user to click on the \"Class relationships\" sub-menu item.<br>\n * <img src=\"resources/guides/main-menu/main-menu-class-relationships.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * 4. Optional step that will be shown only if property `introExtraContent` is passed through options<br>\n * <img src=\"resources/guides//class-relationships/class-relationships-view-introduction_2.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following options:\n *\n * @property {Object<string,string>} [introExtraContent] - If this option is present, an additional dialog will be displayed as the last step with the passed content, localized by language.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships\",\n * \"options\": {\n * \"introExtraContent\": {\n * \"en\": \"The Class relationships is a complicated diagram, which by default shows only the top relationships...\",\n * \"fr\": \"Les relations de classes constituent un diagramme complexe, qui affiche par défaut uniquement les relations principales..\"\n * }\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships',\n getSteps: function(options, pluginService) {\n options.mainAction = 'class-relationships';\n const title = options.title ? options.title : pluginService.translate(this.translationBundle, DEFAULT_TITLE);\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n title,\n menu: 'class-relationships',\n showIntro: true,\n ...options\n }\n }, {\n guideBlockName: 'class-relationships-intro',\n options: {\n title,\n ...options\n }\n }\n ];\n\n if (options.introExtraContent) {\n steps.push({\n guideBlockName: 'class-relationships-diagram-intro',\n options: {\n title,\n content: options.introExtraContent,\n ...options\n }\n });\n }\n\n return steps;\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Explore the class relationships'\n },\n fr: {\n [DEFAULT_TITLE]: 'Explorer les relations entre classes'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst DETECT_FIELDS = 'guide.step_plugin.connectors-lucene-detect-fields-intro.content';\n\n/**\n * @name connectors-lucene-detect-fields-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"detectFields\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"detectFields\" parameter in enabling automatic field detection.\n *\n * Lucene connector detect fields introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-detect-fields-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-detect-fields-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-detect-fields-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, DETECT_FIELDS),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-detect-fields-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'detectFields'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [DETECT_FIELDS]: 'The <b>detectFields</b> parameter enables automatic field detection. When true, each predicate becomes a field and specifying fields in JSON is optional. Types are optional; all types are indexed if omitted. Requires <b>importGraph</b> or <b>importFile</b>.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [DETECT_FIELDS]: 'Le paramètre <b>detectFields</b> active la détection automatique des champs. Quand il est à true, chaque prédicat devient un champ et la spécification des champs en JSON est facultative. Les types sont optionnels ; tous les types sont indexés s’ils sont omis. Nécessite <b>importGraph</b> ou <b>importFile</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst IMPORT_GRAPH = 'guide.step_plugin.connectors-lucene-import-graph-intro.content';\n\n/**\n * @name connectors-lucene-import-graph-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"importGraph\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"importGraph\" parameter in creating a connector from RDF data inserted into a special virtual graph.\n *\n * Lucene connector importGraph introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-import-graph-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-import-graph-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-import-graph-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, IMPORT_GRAPH),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-import-graph-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'importGraph'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [IMPORT_GRAPH]: 'The <b>importGraph</b> parameter creates the connector from RDF data inserted into a special virtual graph. Requires <b>readonly</b> mode, and insertion plus creation must occur in the same transaction.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [IMPORT_GRAPH]: 'Le paramètre <b>importGraph</b> crée le connecteur à partir de données RDF insérées dans un graphe virtuel spécial. Nécessite le mode <b>lecture seule</b>, et l’insertion plus la création doivent avoir lieu dans la même transaction.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst GRAPHDB_REPOSITORY_CONTENT = 'guide.step_plugin.create_repository.graph_db_repository.content';\n\n/**\n * @name repositories-create-graphdb\n * @memberof module:Interactive Guide\n *\n * @description\n * This step explains how to create a GraphDB repository.\n *\n * Create GraphDB repository step<br>\n * <img src=\"resources/guides/repository/repositories-create-graphdb.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-create-graphdb\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-create-graphdb',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, GRAPHDB_REPOSITORY_CONTENT),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'create-gdb-repository',\n ...options,\n url: 'repository/create',\n elementSelector: GuideUtils.getGuideElementSelector('createGraphDBRepository'),\n disablePreviousFlow: false,\n onNextClick: GuideUtils.clickOnGuideElement('createGraphDBRepository')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [GRAPHDB_REPOSITORY_CONTENT]: 'Click on the <b>GraphDB Repository</b> button.'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [GRAPHDB_REPOSITORY_CONTENT]: 'Cliquez sur le bouton <b>Dépôt GraphDB</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\n\n/**\n * @name visual-graph\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph` guide demonstrates how to use the Visual Graph features in GraphDB.\n *\n * The guide consists of the following steps:\n * 1. Click on the \"Visual graph\" main menu.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-click-explore-menu.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * <img src=\"resources/guides/visual-graph/visual-graph-click-main-menu.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 2. Use the RDF resources search input to enter an IRI.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-search-rdf-resources-input.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 3. Choose a resource from the autocomplete list.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-search-rdf-resources-input-autocomplete-item.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 4. Inspect and interact with the visual graph (expand nodes, view properties, focus links).<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This guide can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} [options.easyGraphInputText] - The text to enter into the Easy graph input.\n * @property {string} [options.iri] - The IRI used to target nodes in the visual graph.\n * @property {string} [options.iriLabel] - The label of the IRI link shown in the visualization.\n * @property {string} [options.fromIri] - Source IRI for link-focused steps.\n * @property {string} [options.toIri] - Target IRI for link-focused steps.\n * @property {string} [options.focusProperties] - Array describing focus properties displayed in properties steps.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\",\n * \"iriLabel\": \"hasRole\",\n * \"easyGraphInputText\": \"http://example.org/resource\",\n * \"focusProperties\": [\"ontl:roleStartDate\"]\n * }\n * }\n * ```\n */\n\nconst step = {\n guideBlockName: 'visual-graph',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const RoutingUtil = services.RoutingUtil;\n const translate = services.translate;\n options.mainAction = 'visual-graph';\n\n options.title = options.title ?? translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE);\n\n return [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'visual-graph',\n showIntro: true,\n ...options\n }\n }, {\n guideBlockName: 'visual-graph-search-rdf-resources-input',\n options: {...options}\n }, {\n guideBlockName: 'visual-graph-search-rdf-resources-input-autocomplete-item',\n options: {...options}\n }, {\n guideBlockName: 'visual-graph-intro',\n options: {\n onPreviousClick: () => {\n RoutingUtil.navigate('/graphs-visualizations');\n const searchInputSelector = GuideUtils.getGuideElementSelector('graphVisualisationSearchInputNotConfigured', ' input');\n return GuideUtils.waitFor(searchInputSelector, 3)\n .then(() => {\n GuideUtils.validateTextInput(searchInputSelector, options.easyGraphInputText);\n });\n },\n initPreviousStep: () => {\n const url = '/graphs-visualizations?uri=' + options.iri;\n if (url !== decodeURIComponent(RoutingUtil.getCurrentRoute())) {\n const URL = '/graphs-visualizations?uri=' + options.iri;\n RoutingUtil.navigate(URL);\n return GuideUtils.waitFor(`.node-wrapper[id^=\"${options.iri}\"] circle`, 3);\n }\n return Promise.resolve();\n },\n canBePaused: false,\n forceReload: true,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst RESOURCE_RESULTS_TITLE = 'view.resource.title';\nconst RESOURCE_RESULTS_EXPLAIN_CONTENT = 'guide.step_plugin.resource-results-explain.content';\n/**\n * @name resource-results-explain\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-results-explain` guide step that explains the resource results table,\n * providing an easy way to view triples in which a given IRI is the subject, predicate, or object.\n *\n * <img src=\"resources/guides/resource/resource-results-explain.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is available:\n *\n * Options:\n * @property {string} [options.iri] - The IRI of the resource, used to build the URL if not skipped.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-results-explain\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-results-explain',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'sparql-results-explain',\n options: {\n title: translate(this.translationBundle, RESOURCE_RESULTS_TITLE),\n content: translate(this.translationBundle, RESOURCE_RESULTS_EXPLAIN_CONTENT),\n ...options,\n ...(options.skipUrl ? {} : {url: Utils.getResourceURL(options)}),\n class: 'resource-results-explain'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_RESULTS_TITLE]: 'Resource',\n [RESOURCE_RESULTS_EXPLAIN_CONTENT]: 'The table provides an easy way to view triples in which a given IRI is the subject, predicate, or object.'\n },\n fr: {\n [RESOURCE_RESULTS_TITLE]: 'Ressource',\n [RESOURCE_RESULTS_EXPLAIN_CONTENT]: 'Le tableau permet de visualiser facilement les triplets dans lesquels un IRI donné est le sujet, le prédicat ou l’objet.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\nimport {BASIC_STEP} from '../config.js';\n\n/**\n * @name hold-and-wait-until-hidden\n * @memberof module:Interactive Guide\n *\n * @description\n * Holds the current step and waits until a specific element becomes hidden before allowing the user to proceed.\n * While waiting, scroll events are allowed on the targeted element.\n *\n * Hold and wait until hidden example<br>\n * <img src=\"resources/guides/core/hold-and-wait-until-hidden.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.elementSelectorToWait - CSS selector of the element whose visibility is being monitored to become hidden.\n * @property {string} [options.elementSelector] - CSS selector of the element on which scroll events are allowed while waiting.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"hold-and-wait-until-hidden\",\n * \"options\": {\n * \"elementSelectorToWait\": \"#loading\",\n * \"elementSelector\": \"#scrollable\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'hold-and-wait-until-hidden',\n getStep: (options, services) => {\n return {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n onNextValidate: () => Promise.resolve(!services.GuideUtils.isVisible(options.elementSelectorToWait)),\n show: () => Utils.allowEvents(Utils.SCROLL_EVENTS, options.elementSelector, services),\n hide: () => Utils.allowAll(options.elementSelector, services),\n ...options\n };\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst INCLUDE_INFERRED_CONTENT = 'guide.step_plugin.sparql-editor-include-inferred-data.content';\n\n/**\n * @name sparql-editor-include-inferred-data\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on the \"Include inferred data in results\" toggle in the SPARQL editor.<br>\n *\n * Include inferred data toggle<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-include-inferred-data.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-editor-include-inferred-data\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-editor-include-inferred-data',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n content: translate(this.translationBundle, INCLUDE_INFERRED_CONTENT),\n url: 'sparql',\n elementSelector: '.yasqe_inferStatementsButton',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [INCLUDE_INFERRED_CONTENT]: '<b>Include inferred data in results</b> includes inferred statements produced by reasoning in the query results. Clicking the toggle disables this behavior.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [INCLUDE_INFERRED_CONTENT]: '<b>Inclure les données inférées dans les résultats</b> inclut les déclarations inférées produites par le raisonnement dans les résultats de la requête. Cliquer sur le bouton désactive ce comportement.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst ENABLE_SPARQL_QUERY = 'guide.step_plugin.sparql-search-method.enable-sparql-query';\n\n/**\n * @name ttyg-sparql-method-sparql-query-select\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable providing a SPARQL CONSTRUCT query that fetches the ontology for the SPARQL search method in the TTYG interface.\n * It highlights the checkbox element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable providing a SPARQL CONSTRUCT query that fetches the ontology.<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-sparql-query-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-sparql-method-sparql-query-select\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-method-sparql-query-select',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, ENABLE_SPARQL_QUERY),\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n class: 'enable-sparql-query',\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('sparql-query-option'),\n clickableElementSelector: GuideUtils.getGuideElementSelector('sparql-query-option-input'),\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(GuideUtils.getGuideElementSelector('sparql-query-option-input'))),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [ENABLE_SPARQL_QUERY]: 'Click on the toggle to enable to providing a SPARQL CONSTRUCT query that fetches the ontology.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [ENABLE_SPARQL_QUERY]: 'Cliquez sur le bouton bascule pour activer la fourniture d\\'une requête SPARQL CONSTRUCT qui récupère l\\'ontologie.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst REMAINING_FIELDS_INTRO = 'guide.step_plugin.connectors-lucene-fields-remaining-fields-intro.content';\n\n/**\n * @name connectors-lucene-fields-remaining-fields-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step showcases the remaining fields of a Lucene connector instance.\n * We might have more than one field mapping for a Lucene connector instance.\n *\n * Lucene connector remaining fields<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-remaining-fields-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-remaining-fields-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-remaining-fields-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [{\n guideBlockName: 'connectors-parameter-fields-remaining-fields-intro',\n options: {\n content: translate(step.translationBundle, REMAINING_FIELDS_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-remaining-fields-intro',\n parameterName: 'fields',\n connectorName: LUCENE_CONNECTOR_NAME\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [REMAINING_FIELDS_INTRO]: 'This lucene connector configuration contains multiple field mappings. They determine which values are searchable, filterable, or retrievable during query execution.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [REMAINING_FIELDS_INTRO]: 'Cette configuration du connecteur Lucene contient plusieurs mappages de champs. Ils déterminent quelles valeurs sont recherchables, filtrables ou récupérables lors de l\\'exécution de la requête.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const EXPLORE_CLASS_HIERARCHY = 'guide.step-action.class-hierarchy';\n/**\n * @name class-hierarchy\n * @memberof module:Interactive Guide\n *\n * @description\n * The Class Hierarchy step is a complex step, which provides an interactive guide for users to explore and understand\n * the class hierarchy visualization within the application.\n *\n * Click on explore menu<br>\n * <img src=\"resources/guides/class-hierarchy/click-explore-menu.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * Click on class hierarchy submenu<br>\n * <img src=\"resources/guides/class-hierarchy/click-class-hierarchy.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Class hierarchy dataset intro<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Dataset intro<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-dataset-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Zoom on a class<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-zoom-class.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Explain a class<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-explain-class.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {Object} introExtraContent - bundle object, which, if provided, will show `class-hierarchy-dataset-intro`\n * @property {Object[]} zoomIris - array of objects, which should be zoomed in.\n * @property {string} zoomIris.iri - IRI of the class to zoom in\n * @property {Object} zoomIris.postExtraContent - bundle object, which, if provided, will show `class-hierarchy-explain-class`\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy\",\n * \"options\": {\n * \"introExtraContent\": {\n * \"en\": \"In this dataset, there is a single top-level class, <b>schema:Movie</b>, and two subclasses (the smaller circles inside). This tells us that the dataset has to do with movies.\"\n * },\n * \"zoomIris\": [\n * {\n * \"iri\": \"schema:Movie\",\n * \"postExtraContent\": {\n * \"en\": \"The two subclasses, <b>imdb:BlackandWhiteMovie</b> and <b>imdb:ColorMovie</b>, tell us that the movies are divided into black-and-white and color ones, and there are more color movies than black-and-white ones since the <b>imdb:ColorMovie</b> circle is larger.\"\n * }\n * }\n * ]\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy',\n\n /**\n *\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, EXPLORE_CLASS_HIERARCHY);\n options.mainAction = 'class-hierarchy';\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n title,\n menu: 'class-hierarchy',\n showIntro: true,\n ...options\n }\n }, {\n guideBlockName: 'class-hierarchy-intro',\n options: {\n title,\n ...options\n }\n }\n ];\n\n if (options.introExtraContent) {\n steps.push({\n guideBlockName: 'class-hierarchy-dataset-intro',\n options: {\n title,\n content: options.introExtraContent,\n ...options\n }\n });\n }\n\n if (Array.isArray(options.zoomIris)) {\n options.zoomIris.forEach((zoomIri) => {\n steps.push({\n guideBlockName: 'class-hierarchy-zoom-class',\n options: {\n title,\n iri: zoomIri.iri,\n ...options\n }\n });\n if (zoomIri.postExtraContent) {\n steps.push({\n guideBlockName: 'class-hierarchy-explain-class',\n options: {\n title,\n content: zoomIri.postExtraContent,\n beforeShowPromise: GuideUtils.deferredShow(800),\n iri: zoomIri.iri,\n ...options\n }\n });\n }\n });\n }\n\n return steps;\n },\n translationBundle: {\n en: {\n [EXPLORE_CLASS_HIERARCHY]: 'Explore the class hierarchy'\n },\n fr: {\n [EXPLORE_CLASS_HIERARCHY]: 'Explorer la hiérarchie des classes'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.similarity-search-method';\nconst DISABLE_TOGGLE = 'guide.step_plugin.similarity-search-method.disable-toggle';\n\n/**\n * @name ttyg-similarity-toggle-off\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to disable the Similarity search query method in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to disable Similarity search query method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-toggle-off.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-similarity-toggle-off\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-similarity-toggle-off',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-similarity_search-input');\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n content: translate(this.translationBundle, DISABLE_TOGGLE),\n class: 'toggle-similarity-search',\n title: translate(this.translationBundle, SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE),\n ...options,\n disable: true,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-similarity_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(!GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [DISABLE_TOGGLE]: 'Click on the toggle to disable Similarity search query method.'\n },\n fr: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [DISABLE_TOGGLE]: 'Cliquez sur le bouton pour désactiver la méthode de recherche par similarité.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst LUCENE_EXPAND_CONTENT = 'guide.step_plugin.connectors-lucene-expand.content';\n\n/**\n * @name connectors-expand-lucene\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to expand a specific Lucene connector instance in GraphDB to view its configuration.\n * It prompts the user to click on the connector's name to access its settings.\n *\n * Expand Lucene connector<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-expand-lucene.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.instanceName`.\n *\n * @property {string} options.instanceName - The specific instance name of the Lucene connector. This option is required.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-expand-lucene\",\n * \"options\": {\n * \"instanceName\": \"MyLuceneConnector\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-expand-lucene',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-expand-connector',\n options: {\n content: translate(this.translationBundle, LUCENE_EXPAND_CONTENT, {instanceName: options.instanceName}),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n connectorName: LUCENE_CONNECTOR_NAME,\n class: 'connectors-lucene-expand'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [LUCENE_EXPAND_CONTENT]: 'Click on <b>{{instanceName}}</b> to view its configuration.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [LUCENE_EXPAND_CONTENT]: 'Cliquez sur <b>{{instanceName}}</b> pour afficher sa configuration.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst INVALID_VALUES_INTRO = 'guide.step_plugin.connectors-lucene-fields-ignore-invalid-values-intro.content';\n\n/**\n * @name connectors-lucene-fields-ignore-invalid-values-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Ignore Invalid Values\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Ignore Invalid Values\" option in handling data type conversion issues.\n *\n * Lucene connector ignore invalid values introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-ignore-invalid-values-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-ignore-invalid-values-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-ignore-invalid-values-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, INVALID_VALUES_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-ignore-invalid-values-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'ignoreInvalidValues'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [INVALID_VALUES_INTRO]: 'The <b>Ignore invalid values</b> option controls behavior when a value cannot be converted to the expected type. False by default.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [INVALID_VALUES_INTRO]: 'L’option <b>Ignorer les valeurs invalides</b> contrôle le comportement lorsqu’une valeur ne peut pas être convertie vers le type attendu. False par défaut.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_SAMPLE_QUERY_CONTENT = 'guide.step-action.visual-graph-config-sample-query';\n\nconst TAB_NAME_TO_INDEX = {\n startingPoint: 1,\n graphExpansion: 2,\n nodeBasics: 3,\n edgeBasics: 4,\n nodeExtra: 5\n};\n\n/**\n * @name visual-graph-config-sample-query\n * @memberof module:Interactive Guide\n *\n * @description\n * This step highlights the sample queries section for a specific tab in the Visual Graph configuration page.<br>\n *\n * Sample queries step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-sample-query.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} options.tabName - The name of the tab whose sample queries to highlight. Must be one of `startingPoint`, `graphExpansion`, `nodeBasics`, `edgeBasics`, or `nodeExtra`.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-sample-query\",\n * \"options\": {\n * \"tabName\": \"startingPoint\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-sample-query',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const tabIndex = TAB_NAME_TO_INDEX[options.tabName];\n\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_SAMPLE_QUERY_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n elementSelector: GuideUtils.getGuideElementSelector(`sample-queries-${tabIndex}`),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_SAMPLE_QUERY_CONTENT]: 'These are sample queries that can be used as a reference when configuring this section.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_SAMPLE_QUERY_CONTENT]: 'Ce sont des exemples de requêtes qui peuvent être utilisés comme référence lors de la configuration de cette section.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\nconst OPEN_ALL_INSTANCES_IN_SPARQL = 'guide.step_plugin.class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql.content';\n\n/**\n * @name class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to open all RDF instances in SPARQL from the class hierarchy view.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql.png\" style=\"height:200px; border: solid\">\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.iri`\n *\n * @property {string} options.iri - The IRI of the class whose instances are to be viewed. This option is required.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, OPEN_ALL_INSTANCES_IN_SPARQL, {iri: options.iri}),\n url: 'hierarchy',\n canBePaused: false,\n elementSelector: GuideUtils.getGuideElementSelector('instances-count'),\n class: 'class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql',\n onNextClick: GuideUtils.clickOnGuideElement('instances-count'),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [OPEN_ALL_INSTANCES_IN_SPARQL]: 'This link shows the number of instances for the selected class, <b>{{iri}}</b>. Click on the link to open the SPARQL editor with a preloaded query that selects all instances.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy'\n },\n\n fr: {\n [OPEN_ALL_INSTANCES_IN_SPARQL]: 'Ce lien affiche le nombre d\\'instances pour la classe sélectionnée, <b>{{iri}}</b>. Cliquez sur le lien pour ouvrir l\\'éditeur SPARQL avec une requête préchargée qui sélectionne toutes les instances.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_SETTINGS_SAVE_CONTENT = 'guide.step-action.visual-graph-settings-save-content';\n\n/**\n * @name visual-graph-settings-save\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click the save button to save the graph settings.<br>\n *\n * Save graph settings step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-settings-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-settings-save\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-settings-save',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-settings-save-button');\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_SETTINGS_SAVE_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n elementSelector,\n onNextClick: GuideUtils.clickOnElement(elementSelector),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_SETTINGS_SAVE_CONTENT]: 'Click to save the graph settings.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_SETTINGS_SAVE_CONTENT]: 'Cliquez pour enregistrer les paramètres du graphique.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst CONFIGURE_TOP_P = 'guide.step_plugin.configure-top-p.info';\n\n/**\n * @name configure-top-p\n * @memberof module:Interactive Guide\n *\n * @description\n * This step sets the nucleus sampling parameter (top-p) for the TTYG agent.\n * It guides the user to adjust the top-p control to a specified value.\n *\n * Configure the nucleus sampling (top-p) parameter<br>\n * <img src=\"resources/guides/ttyg/configure-top-p.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {number} options.topP - The target value for the top-p parameter (between 0 and 1).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-top-p\",\n * \"options\": {\n * \"topP\": 0.9\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-top-p',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n const elementSelector = GuideUtils.getGuideElementSelector('top-p-control');\n const inputSelector = GuideUtils.getGuideElementSelector('top-p-control-input');\n\n return {\n guideBlockName: 'focus-element',\n options: {\n url: 'ttyg',\n elementSelector,\n placement: 'bottom',\n class: 'configure-top-p',\n content: translate(this.translationBundle, CONFIGURE_TOP_P, {topP: options.topP}),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(inputSelector, options.topP)),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [CONFIGURE_TOP_P]: 'Sets the nucleus sampling of the agent. Upon retrieving a set of candidate values, this controls how many of those values to consider using. Takes a value between 0 and 1.<br>Set slider to <b>{{topP}}</b>'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [CONFIGURE_TOP_P]: 'Définit l\\'échantillonnage du noyau de l\\'agent. Lors de la récupération d\\'un ensemble de valeurs candidates, cela contrôle combien de ces valeurs doivent être considérées pour utilisation. Prend une valeur entre 0 et 1.<br>Réglez le curseur sur <b>{{topP}}</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\nimport {BASIC_STEP} from '../config.js';\n\n/**\n * @name clickable-element\n * @memberof module:Interactive Guide\n *\n * @description\n * The Clickable Element step is used to guide users to click on a specific element on the interface. Clicking on the\n * element will automatically advance to the next step.\n *\n * Clickable element example<br>\n * <img src=\"resources/guides/core/clickable-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} [options.clickableElementSelector] - The CSS selector of the element to be clicked. If not provided, `options.elementSelector` will be used.\n * @property {string} [options.elementSelector] - The CSS selector of the element to be highlighted. If not provided, the first clickable element will be highlighted.\n * @property {function} [options.beforeShowPromise] - A promise that has to resolve, before the step is shown. If not provided, the step will be shown immediately.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"clickable-element\",\n * \"options\": {\n * \"clickableElementSelector\": \"#submit-button\",\n * \"content\": \"Please click the Submit button to proceed.\"\n * }\n * }\n * ```\n */\nconst step = {\n // An element which is expected to be clicked. If onNextClick is not defined, it will automatically click on the element on next button press\n guideBlockName: 'clickable-element',\n getStep: (options, services) => {\n const notOverridable = {\n type: 'clickable'\n };\n\n const stepDescription = {\n ...BASIC_STEP,\n advanceOn: {\n selector: options.clickableElementSelector || options.elementSelector,\n event: 'click'\n },\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n ...options,\n ...notOverridable\n };\n\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(services, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SELECT_AGENT_DEFAULT_TITLE = 'guide.step-action.select-ttyg-agent';\nconst SELECT_AGENT_INFO = 'guide.step_plugin.select-ttyg-agent.info.content';\nconst SKIP_SECTION = 'btn.skip-section';\n\n/**\n * @name ttyg-select-agent-info-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an informational message when selecting a TTYG agent.\n * It informs the user that they need to select an agent before interacting with their graph.\n *\n * Select an agent to edit<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-select-agent-info-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-select-agent-info-message',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, SELECT_AGENT_INFO),\n title: translate(this.translationBundle, TTYG_SELECT_AGENT_DEFAULT_TITLE),\n class: 'select-ttyg-agent',\n skipPoint: true,\n skipButtonLabel: translate(this.translationBundle, SKIP_SECTION),\n disablePreviousFlow: true,\n ...options,\n url: 'ttyg'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Select an agent',\n [SELECT_AGENT_INFO]: 'To talk to your graph, you need to select an agent first',\n [SKIP_SECTION]: 'Skip section'\n },\n\n fr: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Sélectionner un agent',\n [SELECT_AGENT_INFO]: 'Pour parler à votre graphique, vous devez d\\'abord choisir un agent',\n [SKIP_SECTION]: 'Sauter la section'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst STRIP_MARKUP = 'guide.step_plugin.connectors-lucene-strip-markup-intro.content';\n\n/**\n * @name connectors-lucene-strip-markup-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"stripMarkup\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"stripMarkup\" parameter in mapping data between GraphDB and Lucene.\n *\n * Lucene connector stripMarkup introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-strip-markup-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-strip-markup-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-strip-markup-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, STRIP_MARKUP),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-strip-markup-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'stripMarkup'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [STRIP_MARKUP]: 'The <b>stripMarkup</b> parameter specifies whether HTML or XML tags should be removed from literal values.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [STRIP_MARKUP]: 'Le paramètre <b>stripMarkup</b> spécifie si les balises HTML ou XML doivent être supprimées des valeurs littérales.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst CREATE_REPO_BUTTON = 'guide.step_plugin.create_repository.create_repository_button.content';\n\n/**\n * @name repositories-create-repository\n * @memberof module:Interactive Guide\n *\n * @description\n * This step explains how to create a repository.\n *\n * Create repository step<br>\n * <img src=\"resources/guides/repository/repositories-create-repository.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-create-repository\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-create-repository',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CREATE_REPO_BUTTON),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'create-repository',\n ...options,\n url: 'repository',\n elementSelector: GuideUtils.getGuideElementSelector('createRepository'),\n onNextClick: GuideUtils.clickOnGuideElement('createRepository')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [CREATE_REPO_BUTTON]: 'Click on the <b>Create new repository</b> button.'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [CREATE_REPO_BUTTON]: 'Cliquez sur le bouton <b>Créer un nouveau dépôt</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst DROPDOWN_CONTENT = 'guide.step_plugin.create_repository.ruleset_dropdown.content';\n\n/**\n * @name repositories-ruleset-dropdown\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to select a ruleset for a repository.\n *\n * Ruleset dropdown step<br>\n * <img src=\"resources/guides/repository/repositories-ruleset-dropdown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} rulesetName - The name of the ruleset to be selected.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-ruleset-dropdown\",\n * \"options\": {\n * \"rulesetName\": \"OWL2-RL\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-ruleset-dropdown',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const repositoryIdInputSelector = GuideUtils.getGuideElementSelector('graphDBRepositoryIdInput');\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, DROPDOWN_CONTENT, {rulesetName: options.rulesetName}),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'gdb-repository-ruleset-select',\n ...options,\n url: 'repository/create/graphdb',\n elementSelector: GuideUtils.getGuideElementSelector('graphDBRepositoryRulesetSelect'),\n disablePreviousFlow: false,\n show: () => () => {\n GuideUtils.validateTextInput(repositoryIdInputSelector, options.repositoryId);\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [DROPDOWN_CONTENT]: 'Choose ruleset: <b>{{rulesetName}}</b>.'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [DROPDOWN_CONTENT]: 'Choisissez l\\'ensemble de règles : <b>{{rulesetName}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.import-file';\nconst CONTENT = 'guide.step_plugin.import_rdf_file.import-settings.import.button.content';\nconst UNEXPECTED_ERROR = 'guide.unexpected.error.message';\n\n/**\n * @name import-click-on-import-button\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `import-click-on-import-button` step guides the user to click the import button in the import settings dialog of GraphDB.<br>\n * <img src=\"resources/guides/import/import-click-on-import-button.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"import-click-on-import-button\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'import-click-on-import-button',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n const importSettingsButtonSelector = GuideUtils.getGuideElementSelector('import-settings-import-button');\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(step.translationBundle, CONTENT),\n title: translate(step.translationBundle, DEFAULT_TITLE),\n placement: 'top',\n class: 'import-settings-import-file-button',\n ...options,\n elementSelector: importSettingsButtonSelector,\n onPreviousClick: () => new Promise(function(resolve) {\n GuideUtils.clickOnGuideElement('import-settings-cancel-button')()\n .then(() => resolve());\n }),\n beforeShowPromise: () => services.GuideUtils.deferredShow(300)()\n .then(() => GuideUtils.getOrWaitFor(importSettingsButtonSelector, 3)\n .catch((error) => {\n services.toastr.error(translate(step.translationBundle, UNEXPECTED_ERROR));\n return Promise.reject(error);\n })\n ),\n onNextClick: () => GuideUtils.clickOnGuideElement('import-settings-import-button')(),\n canBePaused: false\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Import file',\n [CONTENT]: 'Click on the <b>Import</b> button.',\n [UNEXPECTED_ERROR]: 'The guide was cancelled due to an unexpected error. Please run the guide again and if the problem persists contact the support.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Importer un fichier',\n [CONTENT]: 'Cliquez sur le bouton <b>Importer</b>.',\n [UNEXPECTED_ERROR]: 'Le guide a été annulé en raison d\\'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_ASK_DEFAULT_TITLE = 'guide.step-action.ask-ttyg-agent';\nconst EXPLORE_SPARQL = 'guide.step_plugin.ask-ttyg-agent.explore-sparql';\n\n/**\n * @name ttyg-ask-agent-explore-sparql\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to explore the SPARQL query generated by the TTYG agent.\n * It highlights the \"Open in SPARQL editor\" button and provides instructions on how to proceed.\n *\n * Click on explore SPARQL button<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-agent-explore-sparql.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-ask-agent-explore-sparql\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-ask-agent-explore-sparql',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const exploreSparqlBtnSelector = GuideUtils.getLastGuideElementSelector('open-in-sparql-editor-btn');\n const elementSelector = GuideUtils.getLastGuideElementSelector('chat-item', exploreSparqlBtnSelector);\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_ASK_DEFAULT_TITLE);\n\n return [\n {\n // If button is not visible for some reason, skip the whole step\n guideBlockName: 'info-message',\n options: {\n url: 'ttyg',\n beforeShowPromise: (guide, currentStep) => GuideUtils.waitFor(elementSelector, 1)\n .then(() => {\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.next());\n })\n .catch(() => {\n const stepId = currentStep.id;\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.show(stepId + 2));\n }),\n ...options\n }\n },\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, EXPLORE_SPARQL),\n class: 'explore-sparql',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Ask the agent',\n [EXPLORE_SPARQL]: 'You can open the query in the SPARQL editor by clicking on \\'Open in SPARQL editor\\' button. When you are ready, return to the page.'\n },\n\n fr: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Demander à l\\'agent',\n [EXPLORE_SPARQL]: 'Vous pouvez ouvrir la requête dans l\\'éditeur SPARQL en cliquant sur le bouton \\'Ouvrir dans l\\'éditeur SPARQL\\'. Lorsque vous êtes prêt, retournez à la page'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.visual-graph';\nconst CONTENT = 'guide.step_plugin.visual-graph-config-starting-point-intro.content';\n\n/**\n * @name visual-graph-config-starting-point-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-config-starting-point-intro` step displays a dialog that introduces the starting point section\n * of the Visual Graph configuration.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-starting-point-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-starting-point-intro',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'info-message',\n options: {\n url: 'graphs-visualizations/config/save',\n class: 'visual-graph-config-starting-point-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Visual graph explore',\n [CONTENT]: 'Starting point defines how the visual graph begins when it is opened. It determines the first resource or set of results that will appear in the graph and from which the visualization starts.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Explorer le graphique visuel',\n [CONTENT]: 'Le point de départ définit comment le graphique visuel commence lorsqu\\'il est ouvert. Il détermine la première ressource ou l\\'ensemble de résultats qui apparaîtra dans le graphique et à partir duquel la visualisation démarre.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-class-list-background-intro.content';\n\n/**\n * @name class-relationships-class-list-background-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-class-list-background-intro` step displays a dialog that explains which classes are highlighted\n * in the dependency table of the Class Relationships view.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-class-list-background-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-class-list-background-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-class-list-background-intro',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('class-list'),\n placement: 'right',\n class: 'class-relationships-class-list-background-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'A <b>green background</b> behind a class name in the list indicates that it is currently shown in the diagram.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Un <b>arrière-plan vert</b> derrière un nom de classe dans la liste indique qu\\'elle est actuellement affichée dans le diagramme.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_SHARE_CONTENT = 'guide.step-action.visual-graph-config-share-content';\n\n/**\n * @name visual-graph-config-share\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to check the share visual graph configuration checkbox to make the config available to other users\n *\n * Share visual graph config step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-share.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-share\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-share',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('share-graph-config');\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_SHARE_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(elementSelector)),\n scrollToHandler: () => GuideUtils.scrollIntoView(elementSelector, {block: 'center', behavior: 'smooth'}),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_SHARE_CONTENT]: 'Check the <b>Share visual graph with other users</b> box to make the visual graph configuration available to other users in the repository.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_SHARE_CONTENT]: 'Cochez la case <b>Partager le graphique visuel avec d\\'autres utilisateurs</b> pour rendre la configuration du graphique visuel accessible aux autres utilisateurs du dépôt.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","import * as Utils from '../utils.js';\n\nconst QUERY_NOT_SAME_ERROR = 'guide.step_plugin.execute-sparql-query.query-not-same.error';\nconst UNEXPECTED_ERROR = 'guide.unexpected.error.message';\nconst SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\n\n/**\n * @name execute-sparql-query\n * @memberof module:Interactive Guide\n *\n * @description\n * Composite step that executes a SPARQL query and displays the results.\n * Included steps are:\n *\n * Copy to editor<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click run button<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-run-button.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Explain results<br>\n * <img src=\"resources/guides/sparql-editor/sparql-results-explain.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {Array} queries - An array of objects containing the query and the additional content to display in the results.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"execute-sparql-query\",\n * \"options\": {\n * \"queries\": [\n * {\n * \"query\": \"SELECT ?s WHERE { ?s ?p ?o } LIMIT 10\",\n * \"queryExtraContent\": {\n * \"en\": \"This is the first query extra content.\"\n * },\n * \"resultExtraContent\": {\n * \"en\": \"This is the first result extra content.\"\n * }\n * },\n * {\n * \"query\": \"SELECT ?o WHERE { <http://example.org/subject> ?p ?o } LIMIT 5\",\n * \"queryExtraContent\": {\n * \"en\": \"This is the second query extra content.\"\n * },\n * \"resultExtraContent\": {\n * \"en\": \"This is the second result extra content.\"\n * }\n * }\n * ]\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'execute-sparql-query',\n getSteps: function(options, services) {\n const translate = services.translate;\n\n options.mainAction = 'execute-sparql-query';\n options.title = options.title ?? translate(this.translationBundle, SPARQL_EDITOR_TITLE);\n\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'sparql',\n showIntro: true,\n ...options\n }\n }\n ];\n\n const defaultQuery = 'select * where { \\n\\t?s ?p ?o .\\n} limit 100 \\n';\n const queries = {};\n queries[-1] = 'PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\\nselect * where { \\n\\t?s ?p ?o .\\n?o rdf:type \"\"\\n} limit 100 ';\n\n let overwriteQuery = false;\n (options.queries ?? []).forEach((queryDef, index) => {\n const query = queryDef.query;\n queries[index] = query;\n\n steps.push({\n guideBlockName: 'sparql-editor',\n options: {\n query,\n queryExtraContent: queryDef.queryExtraContent,\n beforeShowPromise: () => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then(() => services.GuideUtils.waitFor(services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR, 3))\n .then(() => services.GuideUtils.deferredShow(500)())\n .catch((error) => {\n services.toastr.error(translate(this.translationBundle, UNEXPECTED_ERROR));\n throw error;\n }),\n onNextValidate: () => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then((yasgui) => yasgui.getQuery().then((query) => ({yasgui, queryFromEditor: query})))\n .then(({yasgui, queryFromEditor}) => {\n const editorQuery = services.GuideUtils.removeWhiteSpaces(queryFromEditor);\n const stepQuery = services.GuideUtils.removeWhiteSpaces(query);\n if (editorQuery !== stepQuery) {\n if (editorQuery === 'select*where{?s?p?o.}limit100' || overwriteQuery) {\n // The query is the default query OR we previously overwrote it => we can overwrite it\n yasgui.setQuery(query);\n } else {\n services.GuideUtils.noNextErrorToast(services.toastr, services.$translate, services.$interpolate,\n QUERY_NOT_SAME_ERROR, options);\n return false;\n }\n }\n overwriteQuery = true;\n return true;\n }),\n initPreviousStep: () => {\n if (index === 0) {\n return services.YasguiComponentUtil.setQuery(Utils.SPARQL_DIRECTIVE_SELECTOR, defaultQuery);\n }\n\n const haveToReload = 'sparql' !== services.RoutingUtil.getCurrentRoute();\n\n if (haveToReload) {\n services.RoutingUtil.navigate('/sparql');\n }\n\n return services.GuideUtils.waitFor(services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR)\n .then(() => services.YasguiComponentUtil.executeSparqlQuery('#query-editor', query));\n },\n ...options\n }\n });\n steps.push({\n guideBlockName: 'sparql-editor-run-button',\n options: {\n initPreviousStep: (services, stepId) => {\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.options.id)\n .then(() => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n // Skip expanding of node if last step is \"visual-graph-expand\"\n if (currentStepId === stepId) {\n return Promise.resolve();\n }\n\n return services.YasguiComponentUtil.executeSparqlQuery('#query-editor', query);\n });\n },\n ...options\n }\n });\n steps.push({\n guideBlockName: 'sparql-results-explain',\n options: {\n extraContent: queryDef.resultExtraContent,\n initPreviousStep: (services, stepId) => {\n if ('sparql' !== services.RoutingUtil.getCurrentRoute()) {\n services.RoutingUtil.navigate('/sparql');\n return services.GuideUtils.waitFor(services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR)\n .then(() => services.GuideUtils.deferredShow(500)())\n .then(() => services.YasguiComponentUtil.executeSparqlQuery('#query-editor', query));\n }\n\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.options.id)\n .then(() => services.YasguiComponentUtil.setQuery(Utils.SPARQL_DIRECTIVE_SELECTOR, query));\n },\n ...options\n }\n });\n });\n\n return steps;\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'Execute SPARQL query',\n [UNEXPECTED_ERROR]: 'The guide was cancelled due to an unexpected error. Please run the guide again and if the problem persists contact the support.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Exécuter une requête SPARQL',\n [UNEXPECTED_ERROR]: 'Le guide a été annulé en raison d\\'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\nimport * as Utils from '../utils.js';\n\n/**\n * @name toggle-element\n * @memberof module:Interactive Guide\n *\n * @description\n * The Toggleable Element step is used to guide users to enable a specific toggleable element (like a switch or checkbox)\n * on the interface. The step ensures that a user cannot go back to this step and deselect the toggleable element.\n *\n * Toggleable element example<br>\n * <img src=\"resources/guides/core/toggle-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {boolean} options.disable - Set to true to guide the user to disable the element, or false(or missing) to enable it.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"toggle-element\",\n * \"options\": {\n * \"disable\": true, // or false to enable\n * }\n * }\n * ```\n */\nconst step = {\n // An element, which can be toggled via click\n guideBlockName: 'toggle-element',\n getStep: (options, pluginService) => {\n const notOverridable = {\n type: 'toggleable'\n };\n\n let stepHTMLElement;\n const selector = options.toggleableElementSelector || options.elementSelector;\n // By default, allow only enabling of the element, unless disable is explicitly set to true. In that case\n // only disabling will be allowed\n const shouldDisable = options.disable ?? false;\n\n const toggleListener = (event) => {\n if (event.target.checked === shouldDisable) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n const stepDescription = {\n ...BASIC_STEP,\n advanceOn: {\n selector,\n event: 'click'\n },\n\n initPreviousStep: pluginService.GuideUtils.defaultInitPreviousStep,\n ...options,\n show: () => () => {\n stepHTMLElement = document.querySelector(selector);\n stepHTMLElement.addEventListener('click', toggleListener, true);\n },\n hide: () => () => {\n if (stepHTMLElement) {\n stepHTMLElement.removeEventListener('click', toggleListener);\n }\n },\n ...notOverridable\n };\n\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(pluginService, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {\n getConnectorContentSelector,\n getConnectorNameSelector,\n getConnectorParameterSelector,\n getConnectorSubparameterSelector\n} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst SUBPARAMETER_INTRO = 'guide.step_plugin.connectors-array-subparameter-intro.content';\n\n/**\n * @name connectors-array-subparameter-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the creation of a subparameter within a parameter of a connector.\n * It explains the purpose and usage of subparameters in defining how a connector instance is created.\n *\n * Connectors subparameter introduction<br>\n * <img src=\"resources/guides/connectors/connectors-array-subparameter-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the subparameter is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n * @property {string} parameterName - the specific creation parameter name for <code>instanceName</code>.\n * @property {string} subparameterName - the specific creation subparameter name for <code>parameterName</code>.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-array-subparameter-intro\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\",\n * \"parameterName\": \"hosts\",\n * \"subparameterName\": \"host\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-array-subparameter-intro',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n * - <b>parameterName</b>: string (required) – the specific creation parameter name for <code>instanceName</code>.\n * - <b>subparameterName</b>: string (required) – the specific creation subparameter name for <code>parameterName</code>.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const GuideUtils = pluginService.GuideUtils;\n const connectorNameSelector = getConnectorNameSelector(options, pluginService);\n const connectorContentSelector = getConnectorContentSelector(options, pluginService);\n const parameterSelector = getConnectorParameterSelector(options, pluginService);\n const subparameterName = getConnectorSubparameterSelector(options, pluginService);\n const elementSelector = `${connectorNameSelector} ${connectorContentSelector} ${parameterSelector} ${subparameterName}`;\n\n return [{\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-connector-intro',\n content: translate(this.translationBundle, SUBPARAMETER_INTRO),\n ...options,\n elementSelector,\n scrollToHandler: () => GuideUtils.scrollIntoView(elementSelector, {block: 'center', behavior: 'smooth'}),\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [SUBPARAMETER_INTRO]: 'A parameter can define how an instance is created. Its value may be a simple type, a list, or an object, and it can be required or optional.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [SUBPARAMETER_INTRO]: 'Un paramètre peut définir comment une instance est créée. Sa valeur peut être un type simple, une liste ou un objet, et il peut être obligatoire ou optionnel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_SETTINGS_CLICK_CONTENT = 'guide.step-action.visual-graph-settings-click-content';\n\n/**\n * @name visual-graph-settings-click\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click on the graph settings button to open the visual graph settings.<br>\n *\n * Click on graph settings button step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-settings-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-settings-click\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-settings-click',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-settings-button');\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_SETTINGS_CLICK_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n elementSelector,\n onNextClick: GuideUtils.clickOnElement(elementSelector),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_SETTINGS_CLICK_CONTENT]: 'Click on <b>Graph settings</b>.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_SETTINGS_CLICK_CONTENT]: 'Cliquez sur <b>Paramètres du graphique</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const FTS_METHOD_DEFAULT_TITLE = 'guide.step-action.fts-search-method';\nconst SET_MAX_TRIPLES_PER_CALL = 'guide.step_plugin.fts-search-method.set-max-triples-per-call';\n\n/**\n * @name set-max-triples-per-call\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to set the maximum number of triples to retrieve per call in the FTS search method configuration.\n * It highlights the input field and provides instructions on how to proceed.\n *\n * Set maximum triples per call<br>\n * <img src=\"resources/guides/ttyg/set-max-triples-per-call.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {number} options.maxTriplesPerCall - The maximum number of triples to retrieve per call. This will be displayed in the instructions and used for validation.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"set-max-triples-per-call\",\n * \"options\": {\n * \"maxTriplesPerCall\": 100\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'set-max-triples-per-call',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, SET_MAX_TRIPLES_PER_CALL, {maxTriplesPerCall: options.maxTriplesPerCall}),\n title: translate(this.translationBundle, FTS_METHOD_DEFAULT_TITLE),\n class: 'toggle-fts-search',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('max-triples-per-call-input'),\n onNextValidate: () => {\n if (options.maxTriplesPerCall) {\n return Promise.resolve(GuideUtils.validateTextInput(GuideUtils.getGuideElementSelector('max-triples-per-call-input'), options.maxTriplesPerCall, false));\n }\n return Promise.resolve(true);\n }\n }\n };\n },\n translationBundle: {\n en: {\n [FTS_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [SET_MAX_TRIPLES_PER_CALL]: 'Type <b>{{maxTriplesPerCall}}</b> as the maximum number of triples to retrieve per call.'\n },\n fr: {\n [FTS_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [SET_MAX_TRIPLES_PER_CALL]: 'Saisissez <b>{{maxTriplesPerCall}}</b> comme nombre maximum de triplets à récupérer par appel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst DISABLE_TOGGLE = 'guide.step_plugin.autocomplete.iri-discovery.disable-toggle';\nconst ENABLE_TOGGLE = 'guide.step_plugin.autocomplete.iri-discovery.enable-toggle';\n\n/**\n * @name configure-autocomplete-iri-discovery\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable or disable the autocomplete IRI discovery feature in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable/disable autocomplete for IRI discovery<br>\n * <img src=\"resources/guides/ttyg/configure-autocomplete-iri-discovery.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {boolean} [options.disable] - Set to true to guide the user to disable the IRI discovery search, or false to enable it.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-autocomplete-iri-discovery\",\n * \"options\": {\n * \"disable\": true // or false to enable\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-autocomplete-iri-discovery',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('autocomplete-iri-discovery-input');\n const shouldToggleOff = options.disable;\n const translate = pluginService.translate;\n\n let content;\n if (shouldToggleOff) {\n content = translate(this.translationBundle, DISABLE_TOGGLE);\n } else {\n content = translate(this.translationBundle, ENABLE_TOGGLE);\n }\n\n return {\n guideBlockName: 'toggle-element',\n options: {\n content,\n class: 'toggle-autocomplete-iri-discovery',\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('autocomplete-iri-discovery'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => {\n const isEnabled = GuideUtils.isChecked(toggleSelector);\n return Promise.resolve(shouldToggleOff ? !isEnabled : isEnabled);\n }\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [DISABLE_TOGGLE]: 'Click on the toggle to disable <b>Autocomplete for IRI discovery</b>.',\n [ENABLE_TOGGLE]: 'Click on the toggle to enable <b>Autocomplete for IRI discovery</b>. This method helps the model discover relevant IRIs when a query contains incomplete names or references and cannot be resolved directly.'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [DISABLE_TOGGLE]: 'Cliquez sur le bouton pour désactiver l\\'<b>Autocomplétion pour la découverte d\\'IRI</b>.',\n [ENABLE_TOGGLE]: 'Cliquez sur le bouton pour activer l\\'<b>Autocomplétion pour la découverte d\\'IRI</b>. Cette méthode aide le modèle à découvrir les IRI pertinents lorsqu\\'une requête contient des noms ou des références incomplets et ne peut pas être résolue directement.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorNameSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst EXPAND_CONNECTOR_CONTENT = 'guide.step_plugin.connectors-expand-connector.content';\n\n/**\n * @name connectors-expand-connector\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to expand the connector details by clicking on its name.\n *\n * Connectors expand step<br>\n * <img src=\"resources/guides/connectors/connectors-expand-connector.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the section is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-expand-connector\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-expand-connector',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const GuideUtils = pluginService.GuideUtils;\n const connectorNameSelector = getConnectorNameSelector(options, pluginService);\n const connectorToggleButtonSelector = GuideUtils.getGuideElementSelector(`${options.instanceName}-connector-toggle-button`, 'a');\n return [{\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-expand-connector',\n content: translate(this.translationBundle, EXPAND_CONNECTOR_CONTENT),\n ...options,\n elementSelector: `${connectorNameSelector} ${connectorToggleButtonSelector}`,\n url: 'connectors',\n onNextClick: () => {\n GuideUtils.clickOnElement(`${connectorNameSelector} ${connectorToggleButtonSelector}`)();\n }\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [EXPAND_CONNECTOR_CONTENT]: 'To view the configuration of a connector, click on its name. This will expand the connector details.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [EXPAND_CONNECTOR_CONTENT]: 'Pour voir la configuration d\\'un connecteur, cliquez sur son nom. Cela développera les détails du connecteur.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\n\n/**\n * @name wait-for-element-to-show\n * @memberof module:Interactive Guide\n *\n * @description\n * Waits for a specific element to become visible and then immediately advances to the next step.\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.elementSelectorToShow - CSS selector of the element that must appear before advancing.\n * @property {number} [options.timeToWait=2] - Max seconds to wait before aborting the guide.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"wait-for-element-to-show\",\n * \"options\": {\n * \"elementSelectorToShow\": \"#loaded-panel\",\n * \"timeToWait\": 5\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'wait-for-element-to-show',\n getStep: (options, services) => {\n return {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n beforeShowPromise: (guide) => services.GuideUtils.getOrWaitFor(options.elementSelectorToShow, options.timeToWait || 2)\n .catch(() => {\n services.ShepherdService._abortGuide(guide);\n }),\n show: (guide) => () => {\n // Using a timeout because the library executes async logic\n setTimeout(() => guide.next());\n },\n ...options\n };\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst RESOURCE_RESULTS_CLICK_IRI_TITLE = 'view.resource.title';\nconst RESOURCE_RESULTS_CLICK_IRI_CONTENT = 'guide.step_plugin.resource-results-click-on-iri.content';\n\n/**\n * @name resource-results-click-on-iri\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-results-click-on-iri` guide step guides the user to click on an IRI in the resource results table\n * to explore the data using the Visual Graph view.\n *\n * <img src=\"resources/guides/resource/resource-results-click-on-iri.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific options are available:\n *\n * Options:\n * @property {string} options.iri - The IRI used to build the element selector for the clickable element.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-results-click-on-iri\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\",\n * \"skipUrl\": false\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-results-click-on-iri',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, RESOURCE_RESULTS_CLICK_IRI_TITLE),\n content: translate(this.translationBundle, RESOURCE_RESULTS_CLICK_IRI_CONTENT),\n ...options,\n elementSelector: GuideUtils.getSparqlResultsSelectorForIri(options.iri),\n ...(options.skipUrl ? {} : {url: Utils.getResourceURL(options)}),\n class: 'resource-results-click-on-iri',\n onNextClick: (guide, step) => {\n GuideUtils.waitFor(step.elementSelector, 3)\n .then(() => document.querySelector(step.elementSelector).click());\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_RESULTS_CLICK_IRI_TITLE]: 'Resource',\n [RESOURCE_RESULTS_CLICK_IRI_CONTENT]: 'You can always explore the same data using the <b>Visual graph</b> view. Click on the Visual graph button to try it now.'\n },\n fr: {\n [RESOURCE_RESULTS_CLICK_IRI_TITLE]: 'Ressource',\n [RESOURCE_RESULTS_CLICK_IRI_CONTENT]: 'Vous pouvez toujours explorer les mêmes données en utilisant la vue <b>Graphique visuel</b>. Cliquez sur le bouton Graphique visuel pour l’essayer dès maintenant.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_DEFAULT_TITLE = 'visual.graph.label';\nconst VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_CONTENT = 'guide.step_plugin.visual_graph_show_autocomplete.content';\n\n/**\n * @name visual-graph-search-rdf-resources-input-autocomplete-item\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-search-rdf-resources-input-autocomplete-item` step triggers the autocomplete item for a discovered RDF resource in the Visual Graph search input.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-search-rdf-resources-input-autocomplete-item.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is available:\n *\n * @property {string} [options.iri] - The IRI displayed in the autocomplete item.\n */\nconst step = {\n guideBlockName: 'visual-graph-search-rdf-resources-input-autocomplete-item',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n // TODO: Refactor this to use the generic resource-search-autocomplete-item.js or remove completely in favor of that step\n guideBlockName: 'clickable-element',\n options: {\n // Title comes from options.title when provided, otherwise use translated default\n title: translate(this.translationBundle, VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_DEFAULT_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_CONTENT, {iri: options.iri}),\n url: 'graphs-visualizations',\n elementSelector: GuideUtils.getGuideElementSelector(`autocomplete-${options.iri}`),\n class: 'visual-graph-show-autocomplete',\n onNextClick: (guide, step) => GuideUtils.waitFor(step.elementSelector, 3).then(() => $(step.elementSelector).trigger('click')),\n canBePaused: false,\n forceReload: true,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_DEFAULT_TITLE]: 'Visual graph',\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_CONTENT]: 'Click on the <b>{{iri}}</b> IRI to show the visual graph.'\n },\n fr: {\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_DEFAULT_TITLE]: 'Graphique visuel',\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_CONTENT]: 'Cliquez sur l\\'IRI <b>{{iri}}</b> pour afficher le graphique visuel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * Interface for plugin-related services that can be used across all steps.\n *\n * This service is provided by the plugin system and must be used by plugins to interact with the application.\n */\nexport class PluginServiceInterface {\n /**\n * Translates a key into the target locale using the translation functionality provided by the plugin client.\n * The returned string is based on the language selected in the client. Falls back to the key itself if no translation is found.\n *\n * @param {Object<string, Object<string, string>>} _translationBundle -\n * A translation bundle organized by locale. Each locale maps to an object of translation keys and their localized strings.\n * Example:\n * ```js\n * {\n * en: {\n * \"guide.step_plugin.welcome.title\": \"Welcome to {{translatedGuideName}}\",\n * \"guide.step_plugin.welcome.content\": \"Throughout the guide you will see boxes like this...\"\n * },\n * fr: {\n * \"guide.step_plugin.welcome.title\": \"Bienvenue dans {{translatedGuideName}}\",\n * \"guide.step_plugin.welcome.content\": \"Tout au long du guide, vous verrez des boîtes comme celle-ci...\"\n * }\n * }\n * ```\n * @param {string} _translationKey - The translation key to look up.\n * @param {Object<string, string>} _translationParameters - Optional parameters to interpolate into the translation string\n * (e.g., `{ username: \"John\" }`).\n * @returns {string} The translated string, or the key if no translation is available.\n */\n translate(_translationBundle = {}, _translationKey = '', _translationParameters = {}) {}\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst LUCENE_CONTENT = 'guide.step_plugin.connectors-lucene.content';\n\n/**\n * @name connectors-lucene\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an overview of a specific Lucene connector instance in GraphDB.\n * It highlights the connector's name and offers options to manage it, such as copying, restarting, or deleting.\n *\n * Lucene connector overview<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.instanceName`.\n *\n * @property {string} options.instanceName - The specific instance name of the Lucene connector. This option is required.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene\",\n * \"options\": {\n * \"instanceName\": \"MyLuceneConnector\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-connector-intro',\n options: {\n content: translate(this.translationBundle, LUCENE_CONTENT, {instanceName: options.instanceName}),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n connectorName: LUCENE_CONNECTOR_NAME,\n class: 'connectors-lucene'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [LUCENE_CONTENT]: 'This is the <b>Lucene connector</b> named <b>{{instanceName}}</b>. You can copy, restart, or delete it using the icons on the right.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [LUCENE_CONTENT]: 'Ceci est le <b>connecteur Lucene</b> nommé <b>{{instanceName}}</b>. Vous pouvez le copier, le redémarrer ou le supprimer à l’aide des icônes à droite.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst SET_MAX_IRIS_PER_CALL = 'guide.step_plugin.ttyg.set-max-iris-per-call';\n\n/**\n * @name set-max-iris-per-call\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to set the maximum number of IRIs to retrieve per call in the TTYG agent configuration.\n * It highlights the input field and provides instructions on how to proceed.\n *\n * Set maximum IRIs per call<br>\n * <img src=\"resources/guides/ttyg/set-max-iris-per-call.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {number} options.maxIrisPerCall - The maximum number of IRIs per call. This will be displayed in the instructions and used for validation.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"set-max-iris-per-call\",\n * \"options\": {\n * \"maxIrisPerCall\": 20\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'set-max-iris-per-call',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const maxIrisPerCall = options.maxIrisPerCall ?? 10;\n const maxIrisInputSelector = GuideUtils.getGuideElementSelector('autocomplete-max-iris-input');\n\n return {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, SET_MAX_IRIS_PER_CALL, {maxIrisPerCall}),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n class: 'set-max-iris-per-call',\n ...options,\n url: 'ttyg',\n elementSelector: maxIrisInputSelector,\n onNextValidate: () => {\n return Promise.resolve(GuideUtils.validateTextInput(maxIrisInputSelector, maxIrisPerCall, false));\n }\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [SET_MAX_IRIS_PER_CALL]: 'Set the <b>Max number of results (IRIs) per call</b> to <b>{{maxIrisPerCall}}</b>.<br>This setting limits how many candidate IRIs the agent retrieves in a single autocomplete call when trying to resolve partial names. Keeping this value at a reasonable level helps control the amount of data returned so that the agent sees a manageable set of possible matches without overwhelming the query context.'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [SET_MAX_IRIS_PER_CALL]: 'Réglez le <b>Nombre maximal de résultats (IRI) par appel</b> sur <b>{{maxIrisPerCall}}</b>.<br>Ce paramètre limite le nombre d\\'IRI candidates que l\\'agent récupère lors d\\'un seul appel d\\'autocomplétion lorsqu\\'il tente de résoudre des noms partiels. Maintenir cette valeur à un niveau raisonnable aide à contrôler la quantité de données renvoyées afin que l\\'agent voie un ensemble gérable de correspondances possibles sans submerger le contexte de la requête.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst CONNECTORS_INTRO_CONTENT = 'guide.step_plugin.connectors-connectors-intro.content';\n\n/**\n * @name connectors-connectors-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Connectors\" section of the GraphDB Workbench.\n *\n * Connectors introduction<br>\n * <img src=\"resources/guides/connectors/connectors-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-intro',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [{\n guideBlockName: 'info-message',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-connectors-intro',\n content: translate(this.translationBundle, CONNECTORS_INTRO_CONTENT),\n ...options,\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [CONNECTORS_INTRO_CONTENT]: 'GraphDB Connectors let you integrate external components and services with your repository data. They extend what your applications can do and stay automatically in sync with repository updates.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [CONNECTORS_INTRO_CONTENT]: 'Les connecteurs GraphDB vous permettent d\\'intégrer des composants et services externes avec les données de votre référentiel. Ils étendent les capacités de vos applications et restent automatiquement synchronisés avec les mises à jour du référentiel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\nconst RDF_INSTANCES_SIDE_PANEL_INTRO = 'guide.step_plugin.class-hierarchy-rdf-instances-side-panel-intro.content';\n\n/**\n * @name class-hierarchy-rdf-instances-side-panel-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on introducing the RDF instances side panel in the class hierarchy view.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-intro.png\" style=\"height:200px; border: solid\">\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.iri`\n *\n * @property {string} options.iri - The IRI of the class whose instances are to be viewed. This option is required.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-rdf-instances-side-panel-intro\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-rdf-instances-side-panel-intro',\n /**\n *\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title,\n content: translate(this.translationBundle, RDF_INSTANCES_SIDE_PANEL_INTRO, {iri: options.iri}),\n url: 'hierarchy',\n elementSelector: '.rdf-info-side-panel div',\n class: 'class-hierarchy-rdf-instances-side-panel-intro',\n canBePaused: false,\n placement: 'left',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy',\n [RDF_INSTANCES_SIDE_PANEL_INTRO]: 'The side panel shows the first 1,000 instances of the clicked class, <b>{{iri}}</b>.'\n },\n\n fr: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe',\n [RDF_INSTANCES_SIDE_PANEL_INTRO]: 'Le panneau latéral affiche les 1 000 premières instances de la classe cliquée, <b>{{iri}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.similarity-search-method';\nconst SELECT_INDEX = 'guide.step_plugin.similarity-search-method.select-index';\n\n/**\n * @name ttyg-similarity-select-index\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to select the index to use for Similarity search in the TTYG interface.\n * It highlights the dropdown element and provides instructions on how to proceed.\n *\n * Select the index to use for Similarity search<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-select-index.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-similarity-select-index\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-similarity-select-index',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'focus-element',\n options: {\n content: translate(this.translationBundle, SELECT_INDEX),\n class: 'select-similarity-index',\n title: translate(this.translationBundle, SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE),\n ...options,\n elementSelector: GuideUtils.getGuideElementSelector('similarity-connector-select')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [SELECT_INDEX]: 'Select the index to use for Similarity search.'\n },\n fr: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [SELECT_INDEX]: 'Sélectionner l\\'index à utiliser pour la recherche de similarité.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_PROPERTIES_DESCRIPTION = 'guide.step-action.visual-graph-config-description';\n\n/**\n * @name visual-graph-config-description\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-config-description` guide step prompts the user to type a description for their visual graph configuration.\n *\n * Configure graph description<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-description.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} [options.configDescription] - The description of the visual graph configuration to be entered by the user.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-config-description\",\n * \"options\": {\n * \"configDescription\": \"my-config-description\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-description',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-config-description');\n const configDescription = options.configDescription || '';\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_PROPERTIES_DESCRIPTION, {configDescription}),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n ...options,\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(elementSelector, configDescription))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_DESCRIPTION]: 'Enter a description: <b>{{configDescription}}</b>'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_DESCRIPTION]: 'Entrez une description : <b>{{configDescription}}</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst CONFIGURE_TEMPERATURE_INFO = 'guide.step_plugin.configure-temperature.info';\n\n/**\n * @name configure-temperature\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to configure the sampling temperature setting for the TTYG agent.\n * It highlights the sampling temperature control element and provides instructions on how to set it.\n *\n * Configure sampling temperature<br>\n * <img src=\"resources/guides/ttyg/configure-temperature.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {number} options.temperature - The temperature value to set, typically between 0 and 2.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-temperature\",\n * \"options\": {\n * \"temperature\": 0.7\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-temperature',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n const elementSelector = GuideUtils.getGuideElementSelector('temperature-control');\n const inputSelector = GuideUtils.getGuideElementSelector('temperature-control-input');\n\n return {\n guideBlockName: 'focus-element',\n options: {\n url: 'ttyg',\n elementSelector,\n placement: 'bottom',\n class: 'configure-temperature',\n content: translate(this.translationBundle, CONFIGURE_TEMPERATURE_INFO, {temperature: options.temperature}),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(inputSelector, options.temperature)),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [CONFIGURE_TEMPERATURE_INFO]: 'Sets the sampling temperature of the agent. Lower values result in more consistent, repetitive responses generated by the agent and higher values result in a wider variety of responses. This takes a value between 0 and 2, but values higher than 1 may result in unreliable and unpredictable answers and are not recommended.<br>Set slider to <b>{{temperature}}</b>'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [CONFIGURE_TEMPERATURE_INFO]: 'Définit la température d\\'échantillonnage de l\\'agent. Des valeurs plus faibles donnent des réponses plus cohérentes et répétitives générées par l\\'agent et des valeurs plus élevées donnent une plus grande variété de réponses. Cela prend une valeur entre 0 et 2, mais des valeurs supérieures à 1 peuvent donner des réponses peu fiables et imprévisibles et ne sont pas recommandées.<br>Réglez le curseur sur <b>{{temperature}}</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst CLOSE_VIEW_SPARQL_DIALOG = 'guide.step_plugin.connectors-close-view-sparql-query-dialog.content';\n\n/**\n * @name connectors-close-view-sparql-query-dialog\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to close the \"View SPARQL Query\" dialog.\n *\n * Close SPARQL Query dialog example<br>\n * <img src=\"resources/guides/connectors/connectors-close-view-sparql-query-dialog.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-close-view-sparql-query-dialog\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-close-view-sparql-query-dialog',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const GuideUtils = pluginService.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('close-view-query-dialog');\n return [{\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-close-view-sparql-query-dialog',\n content: translate(this.translationBundle, CLOSE_VIEW_SPARQL_DIALOG),\n ...options,\n elementSelector,\n url: 'connectors',\n onNextClick: () => {\n GuideUtils.clickOnElement(elementSelector)();\n }\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [CLOSE_VIEW_SPARQL_DIALOG]: 'Click on close button to close the dialog'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [CLOSE_VIEW_SPARQL_DIALOG]: 'Cliquez sur le bouton de fermeture pour fermer la boîte de dialogue.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_PROPERTIES_TITLE = 'guide.step_plugin.visual-graph-properties.title';\nconst VISUAL_GRAPH_PROPERTIES_CONTENT = 'guide.step_plugin.visual-graph-properties.content';\nconst VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_TITLE = 'guide.step_plugin.visual-graph-properties-side-panel.title';\nconst VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CONTENT = 'guide.step_plugin.visual-graph-properties-side-panel.content';\nconst VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE_TYPES = 'guide.step_plugin.visual-graph-properties-focus-types.title';\nconst VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT_TYPES = 'guide.step_plugin.visual-graph-properties-focus-types.content';\nconst VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE = 'guide.step_plugin.visual-graph-properties-focus-property.title';\nconst VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT = 'guide.step_plugin.visual-graph-properties-focus-property.content';\nconst VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_TITLE = 'guide.step_plugin.visual-graph-properties-side-panel-close.title';\nconst VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_CONTENT = 'guide.step_plugin.visual-graph-properties-side-panel-close.content';\n\n/**\n * @name visual-graph-properties\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-properties` guide demonstrates how to open and read node properties in the Visual Graph.\n *\n * The guide consists of the following steps:\n * 1. Click a node to open the properties side panel.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-click-to-show-properties.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 2. Read the properties in the side panel.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-side-panel-properties.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 3. Focus specific property sections (e.g. types or a particular property).<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-properties-in-panel.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 4. Close the side panel.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-x-to-close.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This guide can be configured using the common options defined in [Options](#.Options).\n *\n * Common / additional options used by the contained steps:\n * @property {string} [options.iri] - The IRI used to target nodes in the visual graph.\n * @property {string} [options.iriLabel] - The label of the IRI shown in the dialogs.\n * @property {Array} [options.focusProperties] - Array describing focus properties displayed in properties steps.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-properties\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\",\n * \"iriLabel\": \"Example resource\",\n * \"focusProperties\": [\"ontl:roleStartDate\"]\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-properties',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const $rootScope = services.$rootScope;\n const translate = services.translate;\n const elementSelector = `.node-wrapper[id^=\"${options.iri}\"] circle`;\n\n let mouseClickTimeStamp;\n let mouseEventTimer;\n\n // Expands Node info sidebar panel when a node is clicked.\n const onClick = (services, guide) => (event) => {\n if (mouseEventTimer) {\n // Cancels expansion of the sidebar panel if user double-clicked.\n if (event.timeStamp - mouseClickTimeStamp < 400) {\n clearTimeout(mouseEventTimer);\n mouseEventTimer = null;\n }\n } else {\n mouseClickTimeStamp = event.timeStamp;\n mouseEventTimer = setTimeout(function() {\n GuideUtils.graphVizShowNodeInfo(elementSelector);\n mouseEventTimer = null;\n guide.next();\n }, 500);\n }\n };\n\n const steps = [\n {\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_CONTENT, {iriLabel: options.iriLabel}),\n url: 'graphs-visualizations',\n class: 'visual-graph-show-properties-intro',\n elementSelector,\n canBePaused: false,\n // Disable default behavior of service when element is clicked.\n advanceOn: undefined,\n show: (guide) => () => {\n // Add \"click\" listener to the element. Processing of click event is disabled for the visual graph when guide is started.\n // So we have to open side panel info manually when a selected node is clicked.\n const element = document.querySelector(elementSelector);\n if (element) {\n element._onNodeClicked = onClick(services, guide);\n element.addEventListener('click', element._onNodeClicked);\n }\n },\n hide: () => () => {\n // Remove the \"click\" listener of element. It is important when step is hided.\n const element = document.querySelector(elementSelector);\n if (element && element._onNodeClicked) {\n element.removeEventListener('click', element._onNodeClicked);\n delete element._onNodeClicked;\n }\n },\n onNextClick: (guide, step) => {\n GuideUtils.graphVizShowNodeInfo(step.elementSelector);\n guide.next();\n },\n beforeShowPromise: GuideUtils.awaitAlphaDropD3(elementSelector, $rootScope),\n ...options\n }\n },\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CONTENT, {iriLabel: options.iriLabel}),\n url: 'graphs-visualizations',\n elementSelector: '.rdf-side-panel-content',\n class: 'visual-graph-side-panel-content',\n canBePaused: false,\n placement: 'left',\n beforeShowPromise: GuideUtils.deferredShow(500),\n onPreviousClick: () => new Promise(function(resolve) {\n GuideUtils.waitFor(closeButtonSelector, 3)\n .then(() => {\n document.querySelector(closeButtonSelector).click();\n resolve();\n }).catch(() => resolve());\n }),\n ...options\n }\n }\n ];\n\n if (Array.isArray(options.focusProperties)) {\n options.focusProperties.forEach((focusProperty) => {\n if (!GuideUtils.isObject(focusProperty)) {\n focusProperty = {\n property: focusProperty\n };\n }\n const translationIdSuffix = focusProperty.property === 'types' ? '-types' : '-property';\n const titleKey = 'guide.step_plugin.visual-graph-properties-focus' + translationIdSuffix + '.title';\n const contentKey = focusProperty.skipGenericMessage && focusProperty.message ?\n null : 'guide.step_plugin.visual-graph-properties-focus' + translationIdSuffix + '.content';\n\n const params = (focusProperty.property === 'types') ?\n {iriLabel: options.iriLabel} :\n {focusProperty: focusProperty.property};\n\n steps.push({\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, titleKey),\n content: contentKey ? translate(this.translationBundle, contentKey, params) : null,\n url: 'graphs-visualizations',\n class: 'visual-graph-properties-focus',\n canBePaused: false,\n placement: 'left',\n elementSelector: GuideUtils.getGuideElementSelector('graph-visualization-node-info-' + focusProperty.property),\n focusProperty: focusProperty.property,\n extraContent: focusProperty.message,\n ...options\n }\n });\n });\n }\n\n const closeButtonSelector = GuideUtils.getGuideElementSelector('close-info-panel');\n steps.push({\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_CONTENT),\n url: 'graphs-visualizations',\n canBePaused: false,\n placement: 'left',\n class: 'visual-graph-properties-side-panel-close',\n elementSelector: closeButtonSelector,\n advanceOn: {\n selector: closeButtonSelector,\n event: 'click'\n },\n beforeShowPromise: () => {\n // We have to be sure that node info sidebar is open. It is needed when this step is loaded when next step \"Previous\"\n // button is clicked.\n GuideUtils.graphVizShowNodeInfo(elementSelector);\n return GuideUtils.deferredShow(500)();\n },\n onNextClick: () => GuideUtils.waitFor(closeButtonSelector, 3).then(() => document.querySelector(closeButtonSelector).click()),\n ...options\n }\n });\n\n return steps;\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_PROPERTIES_TITLE]: 'Visual graph properties',\n [VISUAL_GRAPH_PROPERTIES_CONTENT]: 'Click on <b>{{iriLabel}}</b> to show its properties.',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_TITLE]: 'Visual graph properties',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CONTENT]: 'The side panel shows the properties of the clicked node, <b>{{iriLabel}}</b>.',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE_TYPES]: 'Visual graph properties',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT_TYPES]: '<b>Types</b> shows all the RDF types for <b>{{iriLabel}}</b>.',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE]: 'Visual graph properties',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT]: 'The values for generic properties like <b>{{focusProperty}}</b> are listed in dedicated sections.',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_TITLE]: 'Visual graph properties',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_CONTENT]: 'You can close the panel by clicking on the X icon.'\n },\n fr: {\n [VISUAL_GRAPH_PROPERTIES_TITLE]: 'Propriétés du graphe visuel',\n [VISUAL_GRAPH_PROPERTIES_CONTENT]: 'Cliquez sur <b>{{iriLabel}}</b> pour afficher ses propriétés.',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_TITLE]: 'Propriétés du graphique visuel',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CONTENT]: 'Le panneau latéral affiche les propriétés du nœud cliqué, <b>{{iriLabel}}</b>.',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE_TYPES]: 'Propriétés du graphique visuel',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT_TYPES]: '<b>Les types</b> affiche tous les types RDF pour <b>{{iriLabel}}</b>.',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE]: 'Propriétés du graphique visuel',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT]: 'Les valeurs des propriétés génériques telles que <b>{{focusProperty}}</b> sont répertoriées dans des sections dédiées.',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_TITLE]: 'Propriétés du graphique visuel',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_CONTENT]: 'Vous pouvez fermer le panneau en cliquant sur l\\'icône X.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_SET_MAXIMUM_LINKS_CONTENT = 'guide.step-action.visual-graph-set-maximum-links-content';\n\n/**\n * @name visual-graph-set-maximum-links\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-set-maximum-links` guide step prompts the user to enter the maximum number of links to show\n * in the visual graph settings.\n *\n * Set maximum links<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-set-maximum-links.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {number} [options.linkLimit] - The maximum number of links to show.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-set-maximum-links\",\n * \"options\": {\n * \"linkLimit\": 20\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-set-maximum-links',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-settings-links-limit');\n const linkLimit = options.linkLimit || '';\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_SET_MAXIMUM_LINKS_CONTENT, {linkLimit}),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n ...options,\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(elementSelector, linkLimit))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_SET_MAXIMUM_LINKS_CONTENT]: 'Enter <b>{{linkLimit}}</b> as the maximum number of links to show.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_SET_MAXIMUM_LINKS_CONTENT]: 'Entrez <b>{{linkLimit}}</b> comme nombre maximal de liens à afficher.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst SET_CONTEXT_WINDOW_SIZE = 'guide.step_plugin.set-context-window-size.info';\n\n/**\n * @name set-context-window-size\n * @memberof module:Interactive Guide\n *\n * @description\n * This step sets the context window size for the TTYG agent.\n * It guides the user to set the context size input to a specified value.\n *\n * Set context window size<br>\n * <img src=\"resources/guides/ttyg/set-context-window-size.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {number} options.contextSize - The target value for the context window size.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"set-context-window-size\",\n * \"options\": {\n * \"contextSize\": 4096\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'set-context-window-size',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n const inputSelector = GuideUtils.getGuideElementSelector('context-size-input');\n\n return {\n guideBlockName: 'focus-element',\n options: {\n url: 'ttyg',\n elementSelector: inputSelector,\n placement: 'bottom',\n class: 'set-context-window-size',\n content: translate(this.translationBundle, SET_CONTEXT_WINDOW_SIZE, {contextSize: options.contextSize}),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(inputSelector, options.contextSize)),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [SET_CONTEXT_WINDOW_SIZE]: 'Set Context Size to <b>{{contextSize}}</b> so the model can use the ontology and conversation history to answer correctly'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [SET_CONTEXT_WINDOW_SIZE]: 'Définissez la taille du contexte sur <b>{{contextSize}}</b> afin que le modèle puisse utiliser l\\'ontologie et l\\'historique de conversation pour répondre correctement'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst DATATYPE_INTRO = 'guide.step_plugin.connectors-lucene-fields-datatype-intro.content';\n\n/**\n * @name connectors-lucene-fields-datatype-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Datatype\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Datatype\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector datatype introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-datatype-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-datatype-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-datatype-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, DATATYPE_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-datatype-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'datatype'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [DATATYPE_INTRO]: 'The <b>Datatype</b> defines how literal values are mapped to Lucene types. By default, this is inferred from the datatype, but it can be overridden per field using the datatype parameter with any supported xsd: type.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [DATATYPE_INTRO]: 'Le <b>datatype</b> définit comment les valeurs littérales sont mappées aux types Lucene. Par défaut, cela est déduit du datatype, mais cela peut être remplacé par champ en utilisant le paramètre datatype avec tout type xsd: pris en charge.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","var map = {\n\t\"./guides/autocomplete/autocomplete-enable-checkbox.js\": 124,\n\t\"./guides/autocomplete/autocomplete-focus-on-indexing-status.js\": 3721,\n\t\"./guides/autocomplete/enable-autocomplete.js\": 1750,\n\t\"./guides/class-hierarchy/class-hierarchy-close-rdf-instances-side-panel.js\": 1222,\n\t\"./guides/class-hierarchy/class-hierarchy-dataset-intro.js\": 9094,\n\t\"./guides/class-hierarchy/class-hierarchy-explain-class.js\": 7895,\n\t\"./guides/class-hierarchy/class-hierarchy-explain-rdf-instance.js\": 3267,\n\t\"./guides/class-hierarchy/class-hierarchy-instances.js\": 3601,\n\t\"./guides/class-hierarchy/class-hierarchy-intro.js\": 8311,\n\t\"./guides/class-hierarchy/class-hierarchy-open-rdf-instances-side-panel.js\": 8810,\n\t\"./guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-intro.js\": 7490,\n\t\"./guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql.js\": 5919,\n\t\"./guides/class-hierarchy/class-hierarchy-toggle-prefixes.js\": 4730,\n\t\"./guides/class-hierarchy/class-hierarchy-zoom-class.js\": 4111,\n\t\"./guides/class-hierarchy/class-hierarchy.js\": 5604,\n\t\"./guides/class-relationships/class-relationships-class-list-background-intro.js\": 6360,\n\t\"./guides/class-relationships/class-relationships-class-list-intro.js\": 601,\n\t\"./guides/class-relationships/class-relationships-class-list-selection.js\": 3533,\n\t\"./guides/class-relationships/class-relationships-diagram-intro.js\": 2427,\n\t\"./guides/class-relationships/class-relationships-digram-predicates-intro.js\": 4927,\n\t\"./guides/class-relationships/class-relationships-digram-thickness-intro.js\": 2101,\n\t\"./guides/class-relationships/class-relationships-intro.js\": 1539,\n\t\"./guides/class-relationships/class-relationships-named-graph-selection.js\": 9282,\n\t\"./guides/class-relationships/class-relationships.js\": 5040,\n\t\"./guides/config.js\": 4097,\n\t\"./guides/connectors/connectors-array-subparameter-intro.js\": 6665,\n\t\"./guides/connectors/connectors-close-view-sparql-query-dialog.js\": 7655,\n\t\"./guides/connectors/connectors-connector-intro.js\": 1151,\n\t\"./guides/connectors/connectors-expand-connector.js\": 6929,\n\t\"./guides/connectors/connectors-intro.js\": 7377,\n\t\"./guides/connectors/connectors-open-view-sparql-query-dialog.js\": 3403,\n\t\"./guides/connectors/connectors-parameter-fields-remaining-fields-intro.js\": 1704,\n\t\"./guides/connectors/connectors-parameter-intro.js\": 267,\n\t\"./guides/connectors/connectors-type-intro.js\": 2476,\n\t\"./guides/connectors/connectors-view-sparql-dialog-intro.js\": 3148,\n\t\"./guides/connectors/lucene/connectors-expand-lucene.js\": 5651,\n\t\"./guides/connectors/lucene/connectors-lucene-analyzer-intro.js\": 8646,\n\t\"./guides/connectors/lucene/connectors-lucene-boost-properties-intro.js\": 643,\n\t\"./guides/connectors/lucene/connectors-lucene-detect-fields-intro.js\": 5183,\n\t\"./guides/connectors/lucene/connectors-lucene-document-filter-intro.js\": 3162,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-analyzed-intro.js\": 8332,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-datatype-intro.js\": 7756,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-default-value-intro.js\": 4901,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-facet-intro.js\": 3555,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-field-name-intro.js\": 4100,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-field-name-transform-intro.js\": 8421,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-ignore-invalid-values-intro.js\": 5825,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-indexed-intro.js\": 9273,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-intro.js\": 217,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-multivalued-intro.js\": 8302,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-property-chain-intro.js\": 2801,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-remaining-fields-intro.js\": 5502,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-stored-intro.js\": 1763,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-value-filter-intro.js\": 562,\n\t\"./guides/connectors/lucene/connectors-lucene-import-file-intro.js\": 402,\n\t\"./guides/connectors/lucene/connectors-lucene-import-graph-intro.js\": 5240,\n\t\"./guides/connectors/lucene/connectors-lucene-languages-intro.js\": 9191,\n\t\"./guides/connectors/lucene/connectors-lucene-open-view-sparql-query-dialog.js\": 9459,\n\t\"./guides/connectors/lucene/connectors-lucene-readonly-intro.js\": 330,\n\t\"./guides/connectors/lucene/connectors-lucene-skip-initial-indexing-intro.js\": 1289,\n\t\"./guides/connectors/lucene/connectors-lucene-strip-markup-intro.js\": 6013,\n\t\"./guides/connectors/lucene/connectors-lucene-type-intro.js\": 1028,\n\t\"./guides/connectors/lucene/connectors-lucene-types-intro.js\": 581,\n\t\"./guides/connectors/lucene/connectors-lucene-value-filter-intro.js\": 914,\n\t\"./guides/connectors/lucene/connectors-lucene-view-sparql-dialog-intro.js\": 2148,\n\t\"./guides/connectors/lucene/connectors-lucene.js\": 7298,\n\t\"./guides/core-steps/clickable-element.js\": 5996,\n\t\"./guides/core-steps/copy-text-element.js\": 195,\n\t\"./guides/core-steps/focus-element.js\": 8716,\n\t\"./guides/core-steps/guide-end.js\": 377,\n\t\"./guides/core-steps/hold-and-wait-until-hidden.js\": 5434,\n\t\"./guides/core-steps/hold-and-wait-until-shown.js\": 9465,\n\t\"./guides/core-steps/info-message.js\": 4127,\n\t\"./guides/core-steps/input-element.js\": 364,\n\t\"./guides/core-steps/read-only-element.js\": 1381,\n\t\"./guides/core-steps/scroll-only-element.js\": 8930,\n\t\"./guides/core-steps/show-documentation-link.js\": 8876,\n\t\"./guides/core-steps/toggle-element.js\": 6504,\n\t\"./guides/core-steps/wait-for-element-to-hide.js\": 1242,\n\t\"./guides/core-steps/wait-for-element-to-show.js\": 6959,\n\t\"./guides/download-guide-resource/download-guide-resource.js\": 2832,\n\t\"./guides/import/import-click-on-import-button.js\": 6198,\n\t\"./guides/import/import-confirm-duplicate-files.js\": 3315,\n\t\"./guides/import/import-rdf-file.js\": 4084,\n\t\"./guides/import/import-show-progress.js\": 8314,\n\t\"./guides/import/import-upload-rdf-file.js\": 3624,\n\t\"./guides/index.js\": 5355,\n\t\"./guides/main-menu/click-main-menu.js\": 3337,\n\t\"./guides/options.js\": 393,\n\t\"./guides/rdf-rank/rdf-rank-compute-fill.js\": 9260,\n\t\"./guides/repositories/repositories-select-repository.js\": 1212,\n\t\"./guides/repositories/select-repository-dropdown.js\": 133,\n\t\"./guides/repository/create-repository.js\": 3815,\n\t\"./guides/repository/repositories-create-graphdb.js\": 5276,\n\t\"./guides/repository/repositories-create-repository.js\": 6084,\n\t\"./guides/repository/repositories-enable-fts.js\": 8518,\n\t\"./guides/repository/repositories-id-input.js\": 659,\n\t\"./guides/repository/repositories-ruleset-dropdown.js\": 6123,\n\t\"./guides/repository/repositories-save.js\": 4030,\n\t\"./guides/resource/resource-click-on-role.js\": 4870,\n\t\"./guides/resource/resource-click-on-visual-graph-button.js\": 440,\n\t\"./guides/resource/resource-results-click-on-iri.js\": 7003,\n\t\"./guides/resource/resource-results-explain.js\": 5379,\n\t\"./guides/resource/resource-results-row-explain.js\": 9410,\n\t\"./guides/resource/resource-search-autocomplete-item.js\": 1514,\n\t\"./guides/resource/resource-search-rdf.js\": 3622,\n\t\"./guides/resource/table-graph-explore.js\": 2595,\n\t\"./guides/similarity-index/create-similarity-index.js\": 3323,\n\t\"./guides/similarity-index/similarity-click-link.js\": 211,\n\t\"./guides/similarity-index/similarity-click-to-create.js\": 1707,\n\t\"./guides/similarity-index/similarity-hold-and-wait-until-shown.js\": 2770,\n\t\"./guides/similarity-index/similarity-type-index-name.js\": 3465,\n\t\"./guides/similarity-index/similarity-view-created-index.js\": 9977,\n\t\"./guides/sparql-editor/execute-sparql-query.js\": 6423,\n\t\"./guides/sparql-editor/sparql-editor-expand-results-over-owl.js\": 1366,\n\t\"./guides/sparql-editor/sparql-editor-include-inferred-data.js\": 5478,\n\t\"./guides/sparql-editor/sparql-editor-run-button.js\": 1145,\n\t\"./guides/sparql-editor/sparql-editor.js\": 9092,\n\t\"./guides/sparql-editor/sparql-explain-editor.js\": 9658,\n\t\"./guides/sparql-editor/sparql-results-click-on-iri.js\": 7805,\n\t\"./guides/sparql-editor/sparql-results-explain.js\": 4381,\n\t\"./guides/sparql-editor/sparql-results-visual-button.js\": 9025,\n\t\"./guides/sparql-editor/visualise-sparql-query.js\": 8787,\n\t\"./guides/ttyg/ask-ttyg-agent.js\": 522,\n\t\"./guides/ttyg/configure-agent-additional-instructions.js\": 632,\n\t\"./guides/ttyg/configure-agent-type-agent-name.js\": 2869,\n\t\"./guides/ttyg/configure-agent-type-model-name.js\": 8001,\n\t\"./guides/ttyg/configure-agent.js\": 9136,\n\t\"./guides/ttyg/configure-autocomplete-iri-discovery.js\": 6853,\n\t\"./guides/ttyg/configure-iri-discovery-search.js\": 2421,\n\t\"./guides/ttyg/configure-temperature.js\": 7587,\n\t\"./guides/ttyg/configure-top-p.js\": 5955,\n\t\"./guides/ttyg/conversation-with-ttyg-agent.js\": 3587,\n\t\"./guides/ttyg/create-ttyg-agent.js\": 8395,\n\t\"./guides/ttyg/edit-ttyg-agent.js\": 5015,\n\t\"./guides/ttyg/end-on-api-key-error.js\": 9675,\n\t\"./guides/ttyg/fts-search-method.js\": 2728,\n\t\"./guides/ttyg/select-ttyg-agent.js\": 1627,\n\t\"./guides/ttyg/set-context-window-size.js\": 7737,\n\t\"./guides/ttyg/set-max-iris-per-call.js\": 7366,\n\t\"./guides/ttyg/set-max-triples-per-call.js\": 6782,\n\t\"./guides/ttyg/similarity-search-method.js\": 566,\n\t\"./guides/ttyg/sparql-search-method-enable-ontology-graph.js\": 3095,\n\t\"./guides/ttyg/sparql-search-method-enable-sparql-query.js\": 3623,\n\t\"./guides/ttyg/sparql-search-method-type-graph-name.js\": 4282,\n\t\"./guides/ttyg/sparql-search-method.js\": 1316,\n\t\"./guides/ttyg/ttyg-ask-agent-explore-sparql.js\": 6335,\n\t\"./guides/ttyg/ttyg-ask-explain-answer-more.js\": 8417,\n\t\"./guides/ttyg/ttyg-ask-question.js\": 9303,\n\t\"./guides/ttyg/ttyg-click-to-create-new-chat.js\": 2884,\n\t\"./guides/ttyg/ttyg-click-to-edit-selected-agent.js\": 58,\n\t\"./guides/ttyg/ttyg-conversation-info-message.js\": 4311,\n\t\"./guides/ttyg/ttyg-create-agent-click.js\": 4762,\n\t\"./guides/ttyg/ttyg-create-agent-intro-message.js\": 4746,\n\t\"./guides/ttyg/ttyg-create-agent-save.js\": 1053,\n\t\"./guides/ttyg/ttyg-edit-agent-click-to-save.js\": 3710,\n\t\"./guides/ttyg/ttyg-edit-agent-intro-message.js\": 3546,\n\t\"./guides/ttyg/ttyg-enabling-sparql-info-message.js\": 9540,\n\t\"./guides/ttyg/ttyg-explain-response.js\": 9674,\n\t\"./guides/ttyg/ttyg-fts-method-disable.js\": 1137,\n\t\"./guides/ttyg/ttyg-fts-method-enable.js\": 3390,\n\t\"./guides/ttyg/ttyg-fts-method-info.js\": 1857,\n\t\"./guides/ttyg/ttyg-select-agent-check-for-missing-repository-cancel.js\": 1789,\n\t\"./guides/ttyg/ttyg-select-agent-dropdown-open.js\": 4114,\n\t\"./guides/ttyg/ttyg-select-agent-from-dropdown.js\": 1724,\n\t\"./guides/ttyg/ttyg-select-agent-info-message.js\": 5998,\n\t\"./guides/ttyg/ttyg-similarity-info-message.js\": 3671,\n\t\"./guides/ttyg/ttyg-similarity-select-index.js\": 7500,\n\t\"./guides/ttyg/ttyg-similarity-toggle-off.js\": 5625,\n\t\"./guides/ttyg/ttyg-similarity-toggle-on.js\": 9211,\n\t\"./guides/ttyg/ttyg-sparql-click-add-namespaces.js\": 462,\n\t\"./guides/ttyg/ttyg-sparql-copy-query-text.js\": 2303,\n\t\"./guides/ttyg/ttyg-sparql-method-disable.js\": 411,\n\t\"./guides/ttyg/ttyg-sparql-method-enable.js\": 2804,\n\t\"./guides/ttyg/ttyg-sparql-method-ontology-select.js\": 91,\n\t\"./guides/ttyg/ttyg-sparql-method-sparql-query-select.js\": 5492,\n\t\"./guides/utils.js\": 8678,\n\t\"./guides/visual-graph/visual-graph-config-click-tab.js\": 404,\n\t\"./guides/visual-graph/visual-graph-config-create-click.js\": 8549,\n\t\"./guides/visual-graph/visual-graph-config-create.js\": 720,\n\t\"./guides/visual-graph/visual-graph-config-description.js\": 7572,\n\t\"./guides/visual-graph/visual-graph-config-hint.js\": 3941,\n\t\"./guides/visual-graph/visual-graph-config-name.js\": 8159,\n\t\"./guides/visual-graph/visual-graph-config-sample-query.js\": 5847,\n\t\"./guides/visual-graph/visual-graph-config-save.js\": 201,\n\t\"./guides/visual-graph/visual-graph-config-select.js\": 9336,\n\t\"./guides/visual-graph/visual-graph-config-share.js\": 6397,\n\t\"./guides/visual-graph/visual-graph-config-starting-point-intro.js\": 6336,\n\t\"./guides/visual-graph/visual-graph-config-starting-point.js\": 9015,\n\t\"./guides/visual-graph/visual-graph-expand.js\": 3801,\n\t\"./guides/visual-graph/visual-graph-intro.js\": 9987,\n\t\"./guides/visual-graph/visual-graph-link-focus.js\": 8088,\n\t\"./guides/visual-graph/visual-graph-node-focus.js\": 804,\n\t\"./guides/visual-graph/visual-graph-properties.js\": 7676,\n\t\"./guides/visual-graph/visual-graph-search-rdf-resources-input-autocomplete-item.js\": 7020,\n\t\"./guides/visual-graph/visual-graph-search-rdf-resources-input.js\": 861,\n\t\"./guides/visual-graph/visual-graph-set-maximum-links.js\": 7686,\n\t\"./guides/visual-graph/visual-graph-settings-click.js\": 6753,\n\t\"./guides/visual-graph/visual-graph-settings-save.js\": 5944,\n\t\"./guides/visual-graph/visual-graph-zoom.js\": 9754,\n\t\"./guides/visual-graph/visual-graph.js\": 5360,\n\t\"./guides/welcome/welcome.js\": 3788,\n\t\"./plugin-service-interface.js\": 7190\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 7785;","const SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst CLICK_ON_IRI = 'guide.step_plugin.sparql-results-click-on-iri.content';\n\n/**\n * @name sparql-results-click-on-iri\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to click on an IRI in the SPARQL results table to explore it.\n *\n * Clicking on the IRI<br>\n * <img src=\"resources/guides/sparql-editor/sparql-results-click-on-iri.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} iri - The IRI to click on.\n * @property {string} iriLabel - The label to display for the IRI.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-results-click-on-iri\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource/Item1\"\n * \"iriLabel\": \"Item1\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-results-click-on-iri',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CLICK_ON_IRI, {iriLabel: options.iriLabel}),\n placement: 'top',\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n ...options,\n scrollToHandler: services.GuideUtils.scrollToTop,\n elementSelector: services.GuideUtils.getSparqlResultsSelectorForIri(options.iri),\n class: 'table-graph-instance',\n url: 'sparql',\n onNextClick: (guide, step) => {\n services.GuideUtils.waitFor(step.elementSelector, 3)\n .then(() => document.querySelector(step.elementSelector).click());\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [CLICK_ON_IRI]: 'Click on the <b>{{iriLabel}}</b> IRI to explore it.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [CLICK_ON_IRI]: 'Cliquez sur l’IRI <b>{{iriLabel}}</b> pour l’explorer.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\n/**\n * @name class-hierarchy-explain-class\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on explaining a specific class within the class hierarchy visualization.\n * It highlights the selected class and provides detailed information about it\n *\n * * <img src=\"resources/guides/class-hierarchy/class-hierarchy-explain-class.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-explain-class\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-explain-class',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n const selector = GuideUtils.getGuideElementSelector('class-' + options.iri);\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title,\n url: 'hierarchy',\n placement: 'left',\n elementSelector: selector,\n class: 'class-hierarchy-explain-class',\n show: () => Utils.disableAllRDFClasses,\n hide: () => Utils.enableAllRDFClasses,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy'\n },\n\n fr: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst CONFIGURE_AGENT_MODEL = 'guide.step_plugin.configure-agent.model-input';\n\n/**\n * @name configure-agent-type-model-name\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to input the name of the OpenAI model to be used for the agent in the TTYG interface.\n * It highlights the input field and provides instructions on how to proceed.\n *\n * Type the name of the OpenAI model to be used<br>\n * <img src=\"resources/guides/ttyg/configure-agent-type-model-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {string} options.model - The name of the OpenAI model to be used (e.g., \"gpt-4o-mini\" ).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-agent-type-model-name\",\n * \"options\": {\n * \"model\": \"gpt-4o-mini\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-agent-type-model-name',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, CONFIGURE_AGENT_MODEL, {model: options.model}),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n class: 'input-model',\n disablePreviousFlow: false,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('model'),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(GuideUtils.getGuideElementSelector('model'), options.model, false))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [CONFIGURE_AGENT_MODEL]: 'Here you can type the name of the OpenAI model to be used.<br>Type: \"<b>{{model}}</b>\" to configure the agent to use this model'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [CONFIGURE_AGENT_MODEL]: 'Vous pouvez saisir ici le nom du modèle OpenAI à utiliser.<br>Type: \"<b>{{model}}</b>\" pour configurer l\\'agent afin qu\\'il utilise ce modèle.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {disableAllVisualGraphNodes, enableAllVisualGraphNodes} from '../utils.js';\n\nconst VISUAL_GRAPH_LINK_FOCUS_TITLE = 'guide.step_plugin.visual-graph-link-focus.title';\nconst VISUAL_GRAPH_LINK_FOCUS_CONTENT = 'guide.step_plugin.visual-graph-link-focus.content';\n\n/**\n * @name visual-graph-link-focus\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-link-focus` guide step explains the link between two nodes in the Visual Graph.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-link-focus.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific options are available:\n *\n * @property {string} [options.fromIri] - The source IRI.\n * @property {string} [options.toIri] - The target IRI.\n * @property {string} [options.iriLabel] - Label for predicate.\n * @property {string} [options.fromIriLabel] - Label for source node.\n * @property {string} [options.toIriLabel] - Label for target node.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-link-focus\",\n * \"options\": {\n * \"fromIri\": \"http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine#Wine\",\n * \"fromIriLabel\": \"Wine\",\n * \"toIri\": \"http://www.w3.org/TR/2003/PR-owl-guide-20031209/food#PotableLiquid\",\n * \"toIriLabel\": \"Potable Liquid\",\n * \"iriLabel\": \"type\"\n * }\n * }\n *\n */\nconst step = {\n guideBlockName: 'visual-graph-link-focus',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const $rootScope = services.$rootScope;\n const translate = services.translate;\n const elementSelector = `.link-wrapper[id^=\"${options.fromIri}>${options.toIri}\"]`;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_LINK_FOCUS_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_LINK_FOCUS_CONTENT, {\n fromIriLabel: options.fromIriLabel,\n iriLabel: options.iriLabel,\n toIriLabel: options.toIriLabel\n }),\n url: 'graphs-visualizations',\n canBePaused: false,\n class: 'visual-graph-link-focus',\n elementSelector,\n show: disableAllVisualGraphNodes,\n hide: enableAllVisualGraphNodes,\n beforeShowPromise: GuideUtils.awaitAlphaDropD3(elementSelector, $rootScope),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_LINK_FOCUS_TITLE]: 'Visual graph links',\n [VISUAL_GRAPH_LINK_FOCUS_CONTENT]: 'An arrow with a label represents one or more links between nodes. In this case, the arrow shows the relation <b>{{fromIriLabel}} &rarr; {{iriLabel}} &rarr; {{toIriLabel}}</b>.'\n },\n fr: {\n [VISUAL_GRAPH_LINK_FOCUS_TITLE]: 'Liens de graphique visuel',\n [VISUAL_GRAPH_LINK_FOCUS_CONTENT]: 'Une flèche avec une étiquette représente un ou plusieurs liens entre les nœuds. Dans ce cas, la flèche montre la relation <b>{{fromIriLabel}} &rarr; {{iriLabel}} &rarr; {{toIriLabel}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_PROPERTIES_NAME = 'guide.step-action.visual-graph-config-name';\n\n/**\n * @name visual-graph-config-name\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-config-name` guide step prompts the user to enter a name for their visual graph configuration.\n *\n * Configure graph name<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-config-name\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-name',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-config-name');\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_PROPERTIES_NAME),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n scrollToHandler: GuideUtils.scrollToTop,\n ...options,\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInputNotEmpty(elementSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_NAME]: 'Enter a name for your visual graph configuration.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_NAME]: 'Saisissez un nom pour votre configuration de graphique visuel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst MULTIVALUED_INTRO = 'guide.step_plugin.connectors-lucene-fields-multivalued-intro.content';\n\n/**\n * @name connectors-lucene-fields-multivalued-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Multivalued\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Multivalued\" option in determining whether multiple values for RDF properties are synchronized to Lucene.\n *\n * Lucene connector multivalued introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-multivalued-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-multivalued-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-multivalued-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, MULTIVALUED_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-multivalued-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'multivalued'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [MULTIVALUED_INTRO]: 'The <b>Multivalued</b> option specifies whether multiple values for RDF properties are synchronized to Lucene. True by default; if false, only a single value is synchronized.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [MULTIVALUED_INTRO]: 'L’option <b>Multi-valeur</b> spécifie si plusieurs valeurs pour les propriétés RDF sont synchronisées avec Lucene. True par défaut ; si false, une seule valeur est synchronisée.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const INTRO_CONTENT = 'guide.step_plugin.class-hierarchy-intro.content';\nconst CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\n\n/**\n * @name class-hierarchy-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The Class Hierarchy Intro step provides an introduction to the class hierarchy visualization,\n * explaining how to interpret the circles representing classes and their subclasses.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-intro',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title,\n content: pluginService.translate(this.translationBundle, INTRO_CONTENT),\n url: 'hierarchy',\n elementSelector: '#classChart',\n placement: 'left',\n class: 'clas-hierarchy-intro',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [INTRO_CONTENT]: 'The biggest circle shows all top-level classes. Every class may have subclasses shown as smaller circles within their parent class. The size of each circle indicates the proportion of RDF resources that belong to that class. Thus, bigger circles are classes that have more instances.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy'\n },\n\n fr: {\n [INTRO_CONTENT]: 'Le plus grand cercle montre toutes les classes de niveau supérieur. Chaque classe peut avoir des sous-classes représentées par des cercles plus petits dans leur classe parente. La taille de chaque cercle indique la proportion de ressources RDF qui lui appartiennent. Ainsi, les grands cercles sont des classes qui ont plus d\\'instances.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.import-file';\nconst CONTENT = 'guide.step_plugin.import_status_info.content';\n\n/**\n * @name import-show-progress\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `import-show-progress` step guides the user to monitor the progress of an import operation in the import dialog of GraphDB.<br>\n * <img src=\"resources/guides/import/import-show-progress.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following options:\n * @property {string} resourceFile - The name of the resource file that should be downloaded in the step.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"import-show-progress\",\n * \"options\": {\n * \"resourceFile\": \"example.rdf\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'import-show-progress',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n content: translate(step.translationBundle, CONTENT),\n title: translate(step.translationBundle, DEFAULT_TITLE),\n class: 'import-status-info',\n ...options,\n url: 'import',\n elementSelector: '.import-resource-message',\n beforeShowPromise: () => {\n if (GuideUtils.isVisible('.import-resource-message')) {\n return Promise.resolve();\n }\n return GuideUtils.waitFor('.import-resource-message', 10);\n },\n onPreviousClick: () => GuideUtils.getOrWaitFor(GuideUtils.getGuideElementSelector('import-file-' + options.resourceFile), 10)\n .then((element) => {\n element.click();\n })\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Import file',\n [CONTENT]: 'Wait until import finished.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Importer un fichier',\n [CONTENT]: 'Attendez la fin de l\\'importation.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst ANALYZED_INTRO_CONTENT = 'guide.step_plugin.connectors-lucene-fields-analyzed-intro.content';\n\n/**\n * @name connectors-lucene-fields-analyzed-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Analyzed\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Analyzed\" option in determining whether literal fields are processed by the analyzer when indexed.\n *\n * Lucene connector analyzed introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-analyzed-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-analyzed-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-analyzed-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, ANALYZED_INTRO_CONTENT),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-analyzed-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'analyzed'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [ANALYZED_INTRO_CONTENT]: 'The <b>Analyzed</b> option determines whether literal fields are processed by the analyzer when indexed. IRIs are never analyzed. By default, fields are analyzed (true).'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [ANALYZED_INTRO_CONTENT]: 'L’option <b>Analysé</b> détermine si les champs littéraux sont traités par l’analyseur lors de l’indexation. Les IRI ne sont jamais analysés. Par défaut, les champs sont analysés (true).'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_CREATE_TITLE = 'menu.ttyg.label';\n\n/**\n * @name create-ttyg-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user through the process of creating a new TTYG agent.\n * It includes steps to navigate to the TTYG section, open the agent creation modal,\n * fill in the necessary details, and save the new agent.\n *\n * Click the Lab main menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-lab.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on TTYG in the sub-menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-ttyg.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * End guide if API key error is present<br>\n * <img src=\"resources/guides/ttyg/end-on-api-key-error.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Create agent intro message<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-intro-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on \"Create new agent\" button<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on \"Save\" button to create the agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The `configure-agent` step is configurable complex step. See [configure-agent](#.configure-agent) for more details.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"create-ttyg-agent\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'create-ttyg-agent',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n options.mainAction = 'create-ttyg-agent';\n options.title = options.title ?? translate(this.translationBundle, TTYG_CREATE_TITLE);\n\n return [\n {\n guideBlockName: 'click-main-menu',\n options: {\n showIntro: true,\n ...options,\n menu: 'ttyg'\n }\n },\n {\n guideBlockName: 'end-on-api-key-error'\n },\n {\n guideBlockName: 'ttyg-create-agent-intro-message',\n options: {...options}\n },\n {\n guideBlockName: 'wait-for-element-to-hide',\n options: {\n ...options,\n elementSelectorToHide: GuideUtils.getElementSelector('.ttyg-page-loader'),\n timeToWait: 10\n }\n },\n {\n guideBlockName: 'ttyg-create-agent-click', options: {...options}\n },\n {\n guideBlockName: 'configure-agent',\n // Set name field as mandatory for creation\n options: {...options, editName: true}\n },\n {\n guideBlockName: 'ttyg-create-agent-save', options: {...options}\n },\n {\n guideBlockName: 'wait-for-element-to-hide',\n options: {\n ...options,\n elementSelectorToHide: GuideUtils.getElementSelector('.agent-settings-modal'),\n timeToWait: 10\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_CREATE_TITLE]: 'Create an agent'\n },\n fr: {\n [TTYG_CREATE_TITLE]: 'Créer un agent'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_ASK_DEFAULT_TITLE = 'guide.step-action.ask-ttyg-agent';\nconst EXPLAIN_ANSWER_MORE = 'guide.step_plugin.ask-ttyg-agent.explain-answer-more';\nconst WAIT_FOR_ANSWER = 'guide.step_plugin.ask-ttyg-agent.wait-for-answer';\n\n/**\n * @name ttyg-ask-explain-answer-more\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to ask for more explanation about the response received from the TTYG agent.\n *\n * Click on explain more button<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-explain-answer-more.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-ask-explain-answer-more\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-ask-explain-answer-more',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const explainMoreBtnSelector = GuideUtils.getLastGuideElementSelector('how-derive-answer-btn');\n const elementSelector = GuideUtils.getLastGuideElementSelector('chat-item', explainMoreBtnSelector);\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_ASK_DEFAULT_TITLE);\n\n return [\n {\n // If button is not visible for some reason, skip the whole step\n guideBlockName: 'info-message',\n options: {\n url: 'ttyg',\n beforeShowPromise: (guide, currentStep) => {\n return GuideUtils.waitFor(elementSelector, 1)\n .then(() => {\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.next());\n })\n .catch(() => {\n const stepId = currentStep.id;\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.show(stepId + 3));\n });\n },\n ...options\n }\n },\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, EXPLAIN_ANSWER_MORE),\n class: 'input-agent-name',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector,\n show: (guide) => () => {\n // Add \"click\" listener to the element. Upon clicking the element is hidden and this breaks the default flow of the guide.\n // Adding a handler to proceed to next step\n $(elementSelector).on('click', () => {\n guide.next();\n });\n },\n hide: () => () => {\n // Remove the \"click\" listener of element. It is important when step is hidden.\n $(elementSelector).off('click');\n }\n }\n },\n {\n guideBlockName: 'hold-and-wait-until-hidden',\n options: {\n title,\n content: translate(this.translationBundle, WAIT_FOR_ANSWER),\n class: 'wait-for-answer',\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('chat-details'),\n elementSelectorToWait: GuideUtils.getGuideElementSelector('question-loader'),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Ask the agent',\n [EXPLAIN_ANSWER_MORE]: 'You can ask the agent how it derived the answer by clicking on the button',\n [WAIT_FOR_ANSWER]: 'Wait for the answer to be returned and explore it. When ready proceed by clicking next.'\n },\n fr: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Demander à l\\'agent',\n [EXPLAIN_ANSWER_MORE]: 'Vous pouvez demander à l\\'agent comment il a obtenu la réponse en cliquant sur le bouton',\n [WAIT_FOR_ANSWER]: 'Attendez que la réponse vous soit renvoyée et explorez-la. Lorsque vous êtes prêt, cliquez sur suivant.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst TRANSFORM_INTRO_CONTENT = 'guide.step_plugin.connectors-lucene-fields-field-name-transform-intro.content';\n\n/**\n * @name connectors-lucene-fields-field-name-transform-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Field name transform\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Field name transform\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector field name transform introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-field-name-transform-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-field-name-transform-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-field-name-transform-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, TRANSFORM_INTRO_CONTENT),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-field-name-transform-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'fieldNameTransform'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [TRANSFORM_INTRO_CONTENT]: 'The <b>Field name transform</b> defines an optional transformation of the field name.<ul><li><b>none</b>: The field name is supplied via the fieldName option.</li><li><b>predicate</b>: The field name is equal to the full IRI of the last predicate of the chain. For example, if the last predicate was http://www.w3.org/2000/01/rdf-schema#label, the field name will also be http://www.w3.org/2000/01/rdf-schema#label.</li><li><b>predicate.localName</b>: The field name is derived from the local name of the IRI of the last predicate of the chain. For example, if the last predicate was http://www.w3.org/2000/01/rdf-schema#comment, the field name will be comment.</li></ul>'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [TRANSFORM_INTRO_CONTENT]: 'La <b>transformation du nom du champ</b> définit une transformation optionnelle du nom du champ.<ul><li><b>none</b> : le nom du champ est fourni via l’option fieldName.</li><li><b>predicate</b> : le nom du champ est égal à l’IRI complet du dernier prédicat de la chaîne. Par exemple, si le dernier prédicat est http://www.w3.org/2000/01/rdf-schema#label, le nom du champ sera également http://www.w3.org/2000/01/rdf-schema#label.</li><li><b>predicate.localName</b> : le nom du champ est dérivé du nom local de l’IRI du dernier prédicat de la chaîne. Par exemple, si le dernier prédicat est http://www.w3.org/2000/01/rdf-schema#comment, le nom du champ sera comment.</li></ul>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst ENABLE_FTS_CONTENT = 'guide.step_plugin.create_repository.enable-fts.content';\nconst EXTRA_CONTENT = 'guide.step_plugin.create_repository.enable-fts.extra-content';\n\n/**\n * @name repositories-enable-fts\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable full-text search (FTS) index for a repository.\n *\n * Enable full-text search step<br>\n * <img src=\"resources/guides/repository/repositories-enable-fts.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-enable-fts\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-enable-fts',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, ENABLE_FTS_CONTENT),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'gdb-repository-enable-fts',\n extraContent: translate(this.translationBundle, EXTRA_CONTENT),\n extraContentClass: 'alert alert-help text-left',\n ...options,\n url: 'repository/create/graphdb',\n elementSelector: GuideUtils.getGuideElementSelector('enable-fts-search'),\n disablePreviousFlow: false,\n onNextValidate: () =>\n Promise.resolve(\n GuideUtils.isChecked(\n GuideUtils.getGuideElementSelector('enable-fts-search', 'input')\n )\n )\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [ENABLE_FTS_CONTENT]: 'Enable full-text search (FTS) index',\n [EXTRA_CONTENT]: 'The full text search index is used for finding specific strings within the values associated with a given entity. For example, you can search for the word \"feature\" within a larger context. This is very helpful in cases where a lot of data is stored in literals.'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [ENABLE_FTS_CONTENT]: 'Activer l\\'index de recherche en texte intégral (FTS)',\n [EXTRA_CONTENT]: 'L\\'index de recherche plein texte est utilisé pour trouver des chaînes de caractères spécifiques dans les valeurs associées à une entité donnée. Par exemple, vous pouvez rechercher le mot « feature » dans un contexte plus large. Cette fonction est très utile dans les cas où de nombreuses données sont stockées sous forme de valeurs littérales.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_CREATE_CLICK_CONTENT = 'guide.step-action.visual-graph-config-create-click-content';\n\n/**\n * @name visual-graph-config-create-click\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click on the create graph config button in the Visual Graph explore page to create a graph config.<br>\n *\n * Click on the create graph config button step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-create-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-create-click\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-create-click',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_CREATE_CLICK_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations',\n elementSelector: GuideUtils.getGuideElementSelector('create-graph-config-btn'),\n placement: 'left',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_CREATE_CLICK_CONTENT]: 'Click on the create config button to Create graph config.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_CREATE_CLICK_CONTENT]: 'Cliquez sur le bouton de création de config pour créer une configuration de graphique.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst ANALYZER_INTRO = 'guide.step_plugin.connectors-lucene-analyzer-intro.content';\n\n/**\n * @name connectors-lucene-analyzer-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Analyzer\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Analyzer\" parameter in defining a custom Lucene Analyzer.\n *\n * Lucene connector analyzer introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-analyzer-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-analyzer-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-analyzer-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, ANALYZER_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-analyzer-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'analyzer'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [ANALYZER_INTRO]: 'The <b>analyzer</b> parameter specifies a custom Lucene Analyzer. The value must be the fully qualified name of a class extending org.apache.lucene.analysis.Analyzer with either a default constructor or a constructor accepting a org.apache.lucene.util.Version parameter.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [ANALYZER_INTRO]: 'Le paramètre <b>analyzer</b> spécifie un analyseur Lucene personnalisé. La valeur doit être le nom complet d’une classe étendant org.apache.lucene.analysis.Analyzer avec soit un constructeur par défaut, soit un constructeur acceptant un paramètre org.apache.lucene.util.Version.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * List of common DOM events to consider for interaction control.\n * @type {string[]}\n */\nconst COMMON_DOM_EVENTS = [\n 'click',\n 'dblclick',\n 'keydown',\n 'keypress',\n 'keyup',\n 'input',\n 'submit',\n 'scroll',\n 'wheel'\n];\nexport const SCROLL_EVENTS = ['scroll', 'wheel'];\n\n/**\n * This function will be called before show a step. Step will be shown after promise is resolve. It waits element of step to be visible on the page.\n * @param {*} services\n * @param {string} elementSelector\n * @param {number} maxWaitTime\n * @return {function(): *}\n */\nexport const beforeShowPromise = (services, elementSelector, maxWaitTime) => {\n return () => {\n return services.GuideUtils.waitFor(elementSelector, maxWaitTime)\n .catch((error) => {\n // error is caught just to show notification in generic way.\n services.toastr.error(services.$translate.instant('guide.unexpected.error.message'));\n // throw the error, otherwise guide will continue with the next step.\n throw error;\n });\n };\n};\n\nexport const createCopyToInputListener = (elementSelector, text) => {\n return (event) => {\n event.preventDefault();\n const inputElement = document.querySelector(elementSelector);\n inputElement.value = text;\n inputElement.dispatchEvent(new Event('input', {bubbles: true}));\n };\n};\n\n/**\n * Configures an element interactability, by consuming events and preventing them from propagating.\n * This allows to keep scrolling, while disallowing interaction with other elements\n * (such as clicking buttons).\n * @param {string[]} allowedEvents - List of event types to allow.\n * @param interactable - true to make the element interactable, false to make it non interactable\n * @param elementSelector - the elementSelector\n * @param services - The services object\n */\nconst _configureInteractions = (allowedEvents, interactable, elementSelector, services) => () => {\n if (!elementSelector) {\n return;\n }\n\n services.GuideUtils.getOrWaitFor(elementSelector)\n .then((element) => {\n const eventsToPrevent = COMMON_DOM_EVENTS.filter((event) => !allowedEvents.includes(event));\n if (interactable) {\n eventsToPrevent.forEach((event) => element.removeEventListener(event, preventDefault, true));\n } else {\n eventsToPrevent.forEach((event) => element.addEventListener(event, preventDefault, true));\n }\n });\n};\n\n/**\n * Enables all interactions on the specified element.\n *\n * @param {string} elementSelector - A CSS selector identifying the target element.\n * @param {Object} services - An object containing utility services, including GuideUtils.\n */\nexport const allowAll = (elementSelector, services) => _configureInteractions([], true, elementSelector, services);\n\n/**\n * Restricts the specified element to only process events listed in <code>allowedEvents</code>.\n *\n * @param {string[]} allowedEvents - An array of event types that should remain enabled.\n * @param {string} elementSelector - A CSS selector identifying the target element.\n * @param {Object} services - An object containing utility services, including GuideUtils.\n */\nexport const allowEvents = (allowedEvents, elementSelector, services) => _configureInteractions(allowedEvents, false, elementSelector, services);\n\n/**\n * Prevents the default action of an event and stops its propagation.\n * @param {Event} event - The event to prevent.\n */\nconst preventDefault = (event) => {\n event.preventDefault();\n event.stopPropagation();\n};\n\nexport const SPARQL_DIRECTIVE_SELECTOR = '#query-editor';\n\nexport const reloadAndOpenInfoPanel = (services, clasInstanceSelector) => {\n services.RoutingUtil.navigate('/hierarchy');\n return services.GuideUtils.waitFor(clasInstanceSelector, 3)\n .then(() => {\n services.GuideUtils.classHierarchyFocus(clasInstanceSelector);\n // Wait a little time animation to complete.\n return services.GuideUtils.deferredShow(500)();\n });\n};\n\nexport const disableAllRDFClasses = () => {\n document.querySelectorAll('.rdf-class')\n .forEach((el) => {\n el.classList.add('disable-rdf-class');\n });\n disableSidebarInteraction();\n};\n\nexport const enableAllRDFClasses = () => {\n document.querySelectorAll('.rdf-class')\n .forEach((el) => {\n el.classList.remove('disable-rdf-class');\n });\n enableSidebarInteraction();\n};\n\nexport const disableSidebarInteraction = () => {\n document.querySelector('.rdf-info-side-panel')\n .classList\n .add('pointer-events-none');\n};\n\nexport const enableSidebarInteraction = () => {\n document.querySelector('.rdf-info-side-panel')\n .classList\n .remove('pointer-events-none');\n};\n\nexport const createDownloadClickHandler = (resourcePath, resourceFile, services) => {\n return (event) => {\n event.preventDefault();\n services.GuidesService.downloadGuidesFile(resourcePath, resourceFile);\n };\n};\n\nexport const createCopyToEditorListener = (getYasguiComponentUtil, sparqlDirectiveSelector, query) => {\n return (event) => {\n event.preventDefault();\n getYasguiComponentUtil().setQuery(sparqlDirectiveSelector, query);\n };\n};\n\nexport const getResourceURL = (options) => {\n let url = 'resource?role=';\n url += options.role ? options.role : 'subject';\n if (options.iri) {\n url += `&uri=${encodeURIComponent(options.iri)}`;\n }\n return url;\n};\n\nexport const getRepositoryName = (services, options) => {\n return services.$repositories.getRepositories().find((repo) => repo.id === options.repositoryId) ? options.repositoryId : options.repositoryIdBase;\n};\n\nexport const getRepositoryElementSelector = (services, options) => {\n return services.GuideUtils.getGuideElementSelector(`repository-id-${getRepositoryName(services, options)}`);\n};\n\nexport const setRepositorySelectorAutoClose = (autoClose) => {\n const component = document.querySelector('.onto-repository-selector');\n if (component) {\n // Enable auto-close when the guide step is closed.\n component.autoClose = autoClose;\n }\n};\n\nexport const disableAllVisualGraphNodes = () => () => {\n $('.node-wrapper').addClass('disable-visual-graph-node');\n};\n\nexport const enableAllVisualGraphNodes = () => () => {\n $('.node-wrapper').removeClass('disable-visual-graph-node');\n};\n\nexport const getConnectorNameSelector = (options, services) => {\n return services.GuideUtils.getGuideElementSelector(`connector-name-${options.connectorName}`);\n};\n\nexport const getConnectorContentSelector = (options, services) => {\n return services.GuideUtils.getGuideElementSelector(`${options.instanceName}-connector-content`);\n};\n\nexport const getConnectorParameterSelector = (options, services) => {\n return services.GuideUtils.getGuideElementSelector(`${options.parameterName}-connector-parameter`);\n};\n\nexport const getConnectorSubparameterSelector = (options, services) => {\n return services.GuideUtils.getGuideElementSelector(`${options.subparameterName}-connector-subproperty`);\n};\n","import * as Utils from '../utils.js';\nimport {BASIC_STEP} from '../config.js';\n\n/**\n * @name focus-element\n * @memberof module:Interactive Guide\n *\n * @description\n * The Focus Element step is used to guide users to see a specific element on the interface.\n *\n * Focus element example<br>\n * <img src=\"resources/guides/core/focus-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {function} [options.beforeShowPromise] - A promise that has to resolve, before the step is shown. If not provided, the step will be shown immediately.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"focus-element\",\n * \"options\": {\n * \"elementSelector\": \"#important-info\",\n * \"content\": \"Please take a look at this important information.\"\n * }\n * }\n * ```\n */\nconst step = {\n // An element which is expected to be focused. It allows user interaction.\n guideBlockName: 'focus-element',\n getStep: (options, services) => {\n const stepDescription = {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n ...options\n };\n\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(services, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name visualise-sparql-query\n * @memberof module:Interactive Guide\n *\n * @description\n * Composite step that guides the user through visualizing the results of a SPARQL query.\n * Included steps are:\n *\n * Copy SPARQL query to the editor<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Run the query<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-run-button.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Press the \"Visual\" button to visualize the results<br>\n * <img src=\"resources/guides/sparql-editor/sparql-results-visual-button.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} query - The SPARQL query to be visualized.\n * @property {string | object} [queryExtraContent] - If this option is present, an additional dialog will be displayed as the last step with the passed content, localized by language.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visualise-sparql-query\",\n * \"options\": {\n * \"query\": \"SELECT ?s ?p ?o WHERE {?s ?p ?o} LIMIT 10\",\n * \"queryExtraContent\": {\n * \"en\": \"The query selects RDF statements whose <i>subject</i> is the movie <b>Pirates of the Caribbean At World's End</b> (identified by the IRI <b>imdb:title/PiratesoftheCaribbeanAtWorldsEnd</b>). Note that we need to escape the / in the shortened IRI.\"\n * }\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visualise-sparql-query',\n getSteps: (options) => {\n const steps = [];\n if (options.useMainMenuNavigation) {\n steps.push({\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'sparql',\n mainAction: 'execute-sparql-query',\n showIntro: true,\n ...options\n }\n });\n }\n\n steps.push({\n guideBlockName: 'sparql-editor',\n options: {\n query: options.query,\n queryExtraContent: options.queryExtraContent,\n ...options\n }\n }, {\n guideBlockName: 'sparql-editor-run-button',\n options: {...options}\n }, {\n guideBlockName: 'sparql-results-visual-button',\n options: {...options}\n });\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\nconst OPEN_RDF_INSTANCES_SIDE_PANEL = 'guide.step_plugin.class-hierarchy-open-rdf-instances-side-panel.content';\n\n/**\n * @name class-hierarchy-open-rdf-instances-side-panel\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to open the RDF instances side panel in the class hierarchy view.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-open-rdf-instances-side-panel.png\" style=\"height:200px; border: solid\">\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.iri`\n *\n * @property {string} options.iri - The IRI of the class whose instances are to be viewed. This option is required.\n *\n * * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-open-rdf-instances-side-panel\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-open-rdf-instances-side-panel',\n /**\n *\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n let element;\n const translate = pluginService.translate;\n const GuideUtils = pluginService.GuideUtils;\n const selector = GuideUtils.getGuideElementSelector('class-' + options.iri);\n const RoutingUtil = pluginService.RoutingUtil;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n const handleDoubleClick = () => (event) => {\n event.preventDefault();\n event.stopPropagation();\n // Ensure the side panel always appears\n return Utils.reloadAndOpenInfoPanel({RoutingUtil, GuideUtils}, selector);\n };\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, OPEN_RDF_INSTANCES_SIDE_PANEL, {iri: options.iri}),\n url: 'hierarchy',\n elementSelector: selector,\n class: 'class-hierarchy-open-rdf-instances-side-panel',\n placement: 'top',\n onNextClick: (guide) => {\n GuideUtils.classHierarchyFocus(selector);\n guide.next();\n },\n show: () => () => {\n // Add a \"dblclick\" listener to the element.\n // We have to open side panel info manually when a selected node is clicked.\n element = document.querySelector(selector);\n if (element) {\n element.addEventListener('dblclick', handleDoubleClick, true);\n }\n Utils.disableSidebarInteraction();\n },\n hide: () => () => {\n if (element) {\n element.removeEventListener('dblclick', handleDoubleClick, true);\n element = null;\n }\n Utils.enableSidebarInteraction();\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy',\n [OPEN_RDF_INSTANCES_SIDE_PANEL]: 'Click on <b>{{iri}}</b> to show its instances.'\n },\n\n fr: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe',\n [OPEN_RDF_INSTANCES_SIDE_PANEL]: 'Cliquez sur <b>{{iri}}</b> pour afficher ses instances.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SHOW_DOCUMENTATION_LINK = 'guide.step_plugin.show-documentation-link.content';\n\n/**\n * @name show-documentation-link\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides a link to the complete documentation of a certain subject. It accepts documentationPath as an option\n * and uses it to construct a general message, leading to that specific documentation page. Note that although not required,\n * it is highly recommended to provide the specific page url, where the step is used. For example, if the dialog is shown\n * in the connectors page, there should be options.url = 'connectors' provided. Otherwise, there might be unwanted navigation\n * or reloading of the page.\n *\n * Link to documentation<br>\n * <img src=\"resources/guides/core/show-documentation-link.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n * @property {string} options.documentationPath - The URL of the GraphDB documentation page for the documentation e.g. lucene-graphdb-connector.html\n *\n * @examples\n * ```JSON\n * {\n * \"guideBlockName\": \"show-documentation-link\",\n * \"options\": {\n * \"title\": \"Custom title\"\n * \"documentationPath\": \"lucene-graphdb-connector.html\",\n * \"url\": \"connectors\"\n * }\n * }\n *\n * {\n * \"guideBlockName\": \"show-documentation-link\",\n * \"options\": {\n * \"content\": \"Custom content with a link to the <a href=\"https://graphdb.ontotext.com/documentation/master/lucene-graphdb-connector.html\" target=\"_blank\">GraphDB documentation</a>\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'show-documentation-link',\n\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n // We might want to completely override the content, at which point we don't need to provide a documentation path\n const documentationLink = options.documentationPath ? pluginService.resolveDocumentationUrl(options.documentationPath) : '';\n return [{\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, SHOW_DOCUMENTATION_LINK, {documentationLink}),\n ...options,\n documentationLink\n }\n }];\n },\n translationBundle: {\n en: {\n [SHOW_DOCUMENTATION_LINK]: 'For more information please visit <a href=\"{{documentationLink}}\" target=\"_blank\">GraphDB documentation</a>'\n },\n fr: {\n [SHOW_DOCUMENTATION_LINK]: 'Pour plus d\\'informations, veuillez visiter la <a href=\"{{documentationLink}}\" target=\"_blank\">documentation GraphDB</a>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\nimport * as Utils from '../utils.js';\n\n/**\n * @name scroll-only-element\n * @memberof module:Interactive Guide\n *\n * @description\n * Focuses a specific element while allowing only scroll-related interactions on it. Other interactions are disabled\n * for the duration of the step. Useful when users need to scroll within a container to find content without clicking\n * or typing.\n *\n * Scroll only element example<br>\n * <img src=\"resources/guides/core/scroll-only-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br></br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.elementSelector - CSS selector of the scrollable element to focus.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"scroll-only-element\",\n * \"options\": {\n * \"elementSelector\": \"#results-pane\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'scroll-only-element',\n getStep: (options, services) => {\n const stepDescription = {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n show: () => Utils.allowEvents(Utils.SCROLL_EVENTS, options.elementSelector, services),\n hide: () => Utils.allowAll(options.elementSelector, services),\n ...options\n };\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(services, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_STARTING_POINT_SEARCH_CONTENT = 'guide.step-action.visual-graph-config-starting-point-search';\nconst VISUAL_GRAPH_CONFIG_STARTING_POINT_FIXED_CONTENT = 'guide.step-action.visual-graph-config-starting-point-fixed';\nconst VISUAL_GRAPH_CONFIG_STARTING_POINT_QUERY_CONTENT = 'guide.step-action.visual-graph-config-starting-point-query';\n\nconst STARTING_POINT_CONFIG = {\n search: {\n contentKey: VISUAL_GRAPH_CONFIG_STARTING_POINT_SEARCH_CONTENT,\n elementSelector: 'start-with-search-box'\n },\n fixed: {\n contentKey: VISUAL_GRAPH_CONFIG_STARTING_POINT_FIXED_CONTENT,\n elementSelector: 'start-with-a-fixed-node'\n },\n query: {\n contentKey: VISUAL_GRAPH_CONFIG_STARTING_POINT_QUERY_CONTENT,\n elementSelector: 'start-with-graph-query-result'\n }\n};\n\n/**\n * @name visual-graph-config-starting-point\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to select a starting point option in the Visual Graph config page.\n * The starting point type is determined by the `startingPoint` option, which can be one of:\n * - `search` - Start with a search box<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-search.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * - `fixed` - Start with a fixed node<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-fixed.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * - `query` - Start with graph query results<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-query.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} options.startingPoint - The type of starting point to select. Must be one of `search`, `fixed`, or `query`.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-starting-point\",\n * \"options\": {\n * \"startingPoint\": \"search\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-starting-point',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const config = STARTING_POINT_CONFIG[options.startingPoint];\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, config.contentKey),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n elementSelector: GuideUtils.getGuideElementSelector(config.elementSelector),\n onNextClick: GuideUtils.clickOnGuideElement(config.elementSelector),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_SEARCH_CONTENT]: 'Select <b>Start with a search box</b> to allow choosing the starting resource of the visual graph each time it is opened.',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_FIXED_CONTENT]: 'Select <b>Start with a fixed node</b> to always start the visual graph from a specific resource.',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_QUERY_CONTENT]: 'Select <b>Start with graph query results</b> to start the visual graph from the results returned by a graph query.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_SEARCH_CONTENT]: 'Sélectionnez <b>Commencer avec une boîte de recherche</b> pour permettre de choisir la ressource de départ du graphique visuel à chaque ouverture.',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_FIXED_CONTENT]: 'Sélectionnez <b>Commencer avec un nœud fixe</b> pour toujours démarrer le graphique visuel à partir d\\'une ressource spécifique.',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_QUERY_CONTENT]: 'Sélectionnez <b>Commencer avec les résultats d\\'une requête graphique</b> pour démarrer le graphique visuel à partir des résultats renvoyés par une requête graphique.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst SPARQL_RESULT_CONTENT = 'guide.step_plugin.execute-sparql-query.visual-sparql-results.content';\n\n/**\n * @name sparql-results-visual-button\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on the button that allows users to visualize the results of a SPARQL query.\n *\n * Clicking on the button<br>\n * <img src=\"resources/guides/sparql-editor/sparql-results-visual-button.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-results-visual-button\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-results-visual-button',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, SPARQL_RESULT_CONTENT),\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n url: 'sparql',\n elementSelector: services.GuideUtils.CSS_SELECTORS.SPARQL_VISUAL_BUTTON_SELECTOR,\n class: 'visual-sparql-results-button',\n scrollToHandler: services.GuideUtils.scrollToTop,\n onNextClick: () => services.GuideUtils.clickOnElement(services.GuideUtils.CSS_SELECTORS.SPARQL_VISUAL_BUTTON_SELECTOR)(),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [SPARQL_RESULT_CONTENT]: 'Click on the <b>Visual</b> button.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [SPARQL_RESULT_CONTENT]: 'Cliquez sur le bouton <b>Visualiser</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst COPY_TO_EDITOR = 'guide.step_plugin.execute-sparql-query.copy-to-editor.button';\nconst QUERY_EDITOR_CONTENT = 'guide.step_plugin.execute-sparql-query.query-editor.content';\nconst UNEXPECTED_ERROR = 'guide.unexpected.error.message';\n\n/**\n * @name sparql-editor\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to copy a SPARQL query to the SPARQL editor.\n *\n * Copy to editor<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} query - The SPARQL query to be copied to the editor.\n * @property {string | Object} queryExtraContent - Additional content to display in the editor.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-editor\",\n * \"options\": {\n * \"query\": \"SELECT ?s WHERE { ?s ?p ?o } LIMIT 10\",\n * \"queryExtraContent\": {\n * \"en\": \"The query selects RDF statements whose <i>subject</i> is the movie <b>Pirates of the Caribbean At World's End</b> (identified by the IRI <b>imdb:title/PiratesoftheCaribbeanAtWorldsEnd</b>). Note that we need to escape the / in the shortened IRI.\"\n * }\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-editor',\n getSteps: function(options, services) {\n const translate = services.translate;\n\n const code = document.createElement('code');\n const copy = document.createElement('button');\n const copyToEditorButtonClass = 'guide-copy-to-editor-query-button';\n copy.className = `btn btn-sm btn-secondary ${copyToEditorButtonClass}`;\n copy.innerText = translate(this.translationBundle, COPY_TO_EDITOR);\n const query = options.query;\n const copyToEditorListener = Utils.createCopyToEditorListener(() => services.YasguiComponentUtil, Utils.SPARQL_DIRECTIVE_SELECTOR, query);\n code.innerText = query;\n const queryAsHtmlCodeElement = '<div class=\"shepherd-code\">' + code.outerHTML + copy.outerHTML + '</div>';\n\n let stepHTMLElement;\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n content: translate(this.translationBundle, QUERY_EDITOR_CONTENT, {queryAsHtmlCodeElement}),\n url: 'sparql',\n elementSelector: services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR,\n class: 'yasgui-query-editor',\n beforeShowPromise: () => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then(() => services.GuideUtils.waitFor(services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR, 3))\n .then(() => services.GuideUtils.deferredShow(500)())\n .catch((error) => {\n services.toastr.error(translate(this.translationBundle, UNEXPECTED_ERROR));\n throw error;\n }),\n onNextValidate: () => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then((yasgui) => yasgui.getQuery().then((query) => ({yasgui, queryFromEditor: query})))\n .then(({yasgui, _queryFromEditor}) => {\n yasgui.setQuery(query);\n return true;\n }),\n scrollToHandler: services.GuideUtils.scrollToTop,\n extraContent: options.queryExtraContent,\n show: (_guide) => () => {\n stepHTMLElement = _guide.currentStep.el.querySelector(`.${copyToEditorButtonClass}`);\n stepHTMLElement.addEventListener('click', copyToEditorListener);\n },\n hide: () => () => {\n if (stepHTMLElement) {\n stepHTMLElement.removeEventListener('click', copyToEditorListener);\n }\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [COPY_TO_EDITOR]: 'Copy to editor',\n [QUERY_EDITOR_CONTENT]: 'Enter the following SPARQL query: {{queryAsHtmlCodeElement}}',\n [UNEXPECTED_ERROR]: 'The guide was cancelled due to an unexpected error. Please run the guide again and if the problem persists contact the support.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [COPY_TO_EDITOR]: 'Copier dans l\\'éditeur',\n [QUERY_EDITOR_CONTENT]: 'Entrez la requête SPARQL suivante: {{queryAsHtmlCodeElement}}',\n [UNEXPECTED_ERROR]: 'Le guide a été annulé en raison d\\'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const RDF_INSTANCES_TITLE = 'guide.step_plugin.class-hierarchy-instances.title';\n\n/**\n * @name class-hierarchy-dataset-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * Showcases a visualizes the top level of a class dataset and its subclasses.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-dataset-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-dataset-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-dataset-intro',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, RDF_INSTANCES_TITLE);\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title,\n url: 'hierarchy',\n elementSelector: '#classChart #main-group',\n placement: 'left',\n class: 'class-hierarchy-dataset-intro',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RDF_INSTANCES_TITLE]: 'Class hierarchy instances'\n },\n\n fr: {\n [RDF_INSTANCES_TITLE]: 'Instances de hiérarchie de classes'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name configure-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * Complex guide step, which takes the user through the process of configuring a TTYG agent.\n * It includes steps to edit the agent name, model, extraction methods, temperature, top-p,\n *\n * Configure agent name<br>\n * <img src=\"resources/guides/ttyg/configure-agent-type-agent-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure context size<br>\n * <img src=\"resources/guides/ttyg/set-context-window-size.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure temperature<br>\n * <img src=\"resources/guides/ttyg/configure-temperature.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure top-p<br>\n * <img src=\"resources/guides/ttyg/configure-top-p.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure model name<br>\n * <img src=\"resources/guides/ttyg/configure-agent-type-model-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure iri discovery search<br>\n * <img src=\"resources/guides/ttyg/configure-iri-discovery-search.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure additional instructions<br>\n * <img src=\"resources/guides/ttyg/configure-agent-additional-instructions.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @property {boolean} [editName] - Whether to include steps to edit the agent name.\n * @property {string} [model] - The model name to set for the agent. If provided, steps to configure the model will be included.\n * @property {Array} [methods] - An array of method objects to configure. Each object should contain a `guideBlockName` and optional `options`.\n * @property {number} [temperature] - The temperature value to set for the agent. If provided, steps to configure temperature will be included.\n * @property {number} [topP] - The top-p value to set for the agent. If provided, steps to configure top-p will be included.\n * @property {Object} [iriDiscoverySearch] - Configuration for IRI discovery search. If provided, steps to configure it will be included.\n * @property {boolean} [iriDiscoverySearch.disable] - Whether to disable IRI discovery search.\n * @property {string} [userInstructions] - Additional user instructions to set for the agent.\n * @property {number} [contextSize] - The context size to set for the agent. If provided, steps to configure the context size will be included.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-agent\",\n * \"options\": {\n * \"editName\": true,\n * \"model\": \"gpt-4o-mini\",\n * \"methods\": [\n * {\n * \"guideBlockName\": \"fts-search-method\",\n * \"options\": {\n * \"disable\": true\n * }\n * },\n * {\n * \"guideBlockName\": \"similarity-search-method\"\n * }\n * ],\n * \"temperature\": 0.7,\n * \"topP\": 0.9,\n * \"contextSize\": 1000,\n * \"iriDiscoverySearch\": {\n * \"disable\": false\n * },\n * \"userInstructions\": \"Please provide concise answers.\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-agent',\n getSteps: (options, services) => {\n const GuideUtils = services.GuideUtils;\n\n const configureExtractionMethods = (services, options) => {\n const methods = options.methods || [];\n\n return methods.map((method) => {\n return {\n guideBlockName: method.guideBlockName,\n options: {\n disablePreviousFlow: false,\n ...method.options\n }\n };\n });\n };\n\n const shouldEditName = options.editName;\n const hasModelName = options.model;\n const hasUserInstructions = options.userInstructions;\n const shouldConfigureExtractionMethods = !!options.methods?.length;\n const shouldConfigureContextSize = options.contextSize !== undefined;\n const shouldConfigureTopP = options.topP !== undefined;\n const shouldConfigureTemperature = options.temperature !== undefined;\n const shouldConfigureIriDiscoverySearch = !!options.iriDiscoverySearch;\n\n const steps = [\n {\n guideBlockName: 'wait-for-element-to-show',\n options: {\n elementSelectorToShow: GuideUtils.getElementSelector('.agent-settings-modal'),\n timeToWait: 10,\n ...options\n }\n }\n ];\n\n if (shouldEditName) {\n steps.push({\n guideBlockName: 'configure-agent-type-agent-name', options: {...options}\n });\n }\n\n if (hasModelName) {\n steps.push({\n guideBlockName: 'configure-agent-type-model-name', options: {...options}\n });\n }\n\n if (shouldConfigureContextSize) {\n steps.push({\n guideBlockName: 'set-context-window-size',\n options: {...options}\n });\n }\n\n if (shouldConfigureTemperature) {\n steps.push({\n guideBlockName: 'configure-temperature',\n options: {...options}\n });\n }\n\n if (shouldConfigureTopP) {\n steps.push({\n guideBlockName: 'configure-top-p',\n options: {...options}\n });\n }\n\n if (shouldConfigureExtractionMethods) {\n steps.push(...configureExtractionMethods(services, options));\n }\n\n if (shouldConfigureIriDiscoverySearch) {\n steps.push({\n guideBlockName: 'configure-iri-discovery-search',\n options: {\n disable: options.iriDiscoverySearch.disable,\n ...options\n }\n });\n }\n\n if (hasUserInstructions) {\n steps.push({\n guideBlockName: 'configure-agent-additional-instructions', options: {...options}\n });\n }\n // Removes the \"Previous\" button from the first method control step, because there is no previous step in the form.\n steps[1].options.disablePreviousFlow = true;\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst LANGUAGES_INTRO = 'guide.step_plugin.connectors-lucene-languages-intro.content';\n\n/**\n * @name connectors-lucene-languages-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Languages\" parameter within the Lucene connector configuration in GraphDB.\n * It explains the purpose and usage of the \"Languages\" option in mapping RDF literal languages to the connector.\n *\n * Lucene connector languages introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-languages-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-languages-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-languages-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, LANGUAGES_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-languages-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'languages'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [LANGUAGES_INTRO]: 'The <b>Languages</b> option defines which RDF literal languages are mapped to the connector. You can provide a list of language ranges to include specific languages, or an empty range to include literals without a language tag.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [LANGUAGES_INTRO]: 'L’option <b>Langues</b> définit quelles langues de littéraux RDF sont mappées vers le connecteur. Vous pouvez fournir une liste de plages de langues pour inclure des langues spécifiques, ou une plage vide pour inclure les littéraux sans balise de langue.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.similarity-search-method';\nconst ENABLE_TOGGLE = 'guide.step_plugin.similarity-search-method.enable-toggle';\n\n/**\n * @name ttyg-similarity-toggle-on\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable the Similarity search query method in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable Similarity search query method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-toggle-on.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-similarity-toggle-on\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-similarity-toggle-on',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-similarity_search-input');\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n content: translate(this.translationBundle, ENABLE_TOGGLE),\n class: 'toggle-similarity-search',\n title: translate(this.translationBundle, SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE),\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-similarity_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [ENABLE_TOGGLE]: 'Click on the toggle to enable Similarity search query method.'\n },\n fr: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [ENABLE_TOGGLE]: 'Cliquez sur la case à cocher pour activer la méthode de recherche par similarité.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const RDF_RANK_TITLE = 'view.rdf.rank.title';\nconst COMPUTE_FILL = 'guide.step_plugin.rdf-rank-compute-fill.content';\n\n/**\n * @name rdf-rank-compute-fill\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to click on the \"Compute Full\" button to start the RDF Rank computation.\n *\n * Click Compute Full<br>\n * <img src=\"resources/guides/rdf-rank/rdf-rank-compute-fill.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"rdf-rank-compute-fill\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'rdf-rank-compute-fill',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const computeRDFRankButtonSelector = GuideUtils.getGuideElementSelector('compute-rdf-rank-btn');\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n url: 'rdfrank',\n content: translate(this.translationBundle, COMPUTE_FILL),\n elementSelector: computeRDFRankButtonSelector,\n title: translate(this.translationBundle, RDF_RANK_TITLE),\n onNextClick: GuideUtils.clickOnElement( computeRDFRankButtonSelector),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RDF_RANK_TITLE]: 'RDF Rank',\n [COMPUTE_FILL]: 'Click on <b>Compute Full</b> to start the RDF Rank computation.'\n },\n fr: {\n [RDF_RANK_TITLE]: 'Rang RDF',\n [COMPUTE_FILL]: 'Cliquez sur <b>Calculer tout</b> pour lancer le calcul du RDF Rank.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst INDEXED_INTRO = 'guide.step_plugin.connectors-lucene-fields-indexed-intro.content';\n\n/**\n * @name connectors-lucene-fields-indexed-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Indexed\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Indexed\" option in determining whether a field is searchable with Lucene queries.\n *\n * Lucene connector indexed introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-indexed-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-indexed-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-indexed-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, INDEXED_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-indexed-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'indexed'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [INDEXED_INTRO]: 'The <b>Indexed</b> option determines whether the field is searchable with Lucene queries. By default, indexing is enabled.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [INDEXED_INTRO]: 'L’option <b>Indexé</b> détermine si le champ est interrogeable avec les requêtes Lucene. Par défaut, l’indexation est activée.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-named-graph-selection.content';\n\n/**\n * @name class-relationships-named-graph-selection\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-named-graph-selection` step displays a dialog that explains how to filter the Class Relationships view\n * by selecting a specific named graph from the All graphs dropdown.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-named-graph-selection.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-named-graph-selection\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-named-graph-selection',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-select-dropdown');\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n url: 'relationships',\n elementSelector,\n placement: 'left',\n class: 'class-relationships-named-graph-selection',\n content: translate(this.translationBundle, CONTENT),\n scrollToHandler: () => GuideUtils.scrollIntoView(elementSelector, {block: 'center'}),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'If the repository contains more than one named graph, you can filter the view by opening the <b>All graphs</b> dropdown (next to the toolbar) and selecting the graph to explore.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Si le référentiel contient plus d\\'un graphe nommé, vous pouvez filtrer la vue en ouvrant le menu déroulant <b>Tous les graphes</b> (à côté de la barre d\\'outils) et en sélectionnant le graphe à explorer.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CHAT_DETAILS_SELECTOR = 'chat-details';\nconst TTYG_ASK_DEFAULT_TITLE = 'guide.step-action.ask-ttyg-agent';\nconst INPUT_QUESTION = 'guide.step_plugin.ask-ttyg-agent.input-question';\nconst WAIT_FOR_ANSWER = 'guide.step_plugin.ask-ttyg-agent.wait-for-answer';\n\n/**\n * @name ttyg-ask-question\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to ask a question to the TTYG agent.\n * It highlights the input area where the user can type their question and provides instructions on how to proceed.\n *\n * Ask the agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-question.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @property {Object} [question] - The question to be asked to the TTYG agent. This will be displayed in the instructions.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-ask-question\",\n * \"options\": {\n * \"question\": \"Can you describe your purpose and dataset, please? What classes and instances are there?\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-ask-question',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_ASK_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'input-element',\n options: {\n title,\n content: translate(this.translationBundle, INPUT_QUESTION, {question: options.question}),\n class: 'input-question',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('question-input'),\n show: (guide) => () => {\n const elementSelector = GuideUtils.getGuideElementSelector('contenteditable');\n\n // Add \"keydown\" listener to the element.\n // The question-input directive listens for \"Enter\" keypress to trigger question asking.\n // When enter is pressed, proceed with next step.\n // Using 'keydown' to trigger before the directive 'keypress', which clears the value.\n $(elementSelector).on('keydown', (event) => {\n const value = $(elementSelector).text();\n\n if (value && event.key === 'Enter' && !event.shiftKey && !event.ctrlKey) {\n GuideUtils.waitFor(GuideUtils.getGuideElementSelector(CHAT_DETAILS_SELECTOR))\n .then(() => guide.next());\n }\n });\n },\n hide: () => () => {\n const elementSelector = GuideUtils.getGuideElementSelector('contenteditable');\n // Remove the \"keydown\" listener of the element. It is important when the step is hidden.\n $(elementSelector).off('keydown');\n }\n }\n },\n {\n guideBlockName: 'hold-and-wait-until-hidden',\n options: {\n title,\n content: translate(this.translationBundle, WAIT_FOR_ANSWER),\n class: 'wait-for-answer',\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('chat-details'),\n elementSelectorToWait: GuideUtils.getGuideElementSelector('question-loader'),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Ask the agent',\n [INPUT_QUESTION]: 'Type \"<b>{{question}}</b>\" in the input and press enter',\n [WAIT_FOR_ANSWER]: 'Wait for the answer to be returned and explore it. When ready proceed by clicking next.'\n },\n fr: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Demander à l\\'agent',\n [INPUT_QUESTION]: 'Tapez \"<b>{{question}}</b>\" dans le champ de saisie et appuyez sur la touche \\'Entrée\\'',\n [WAIT_FOR_ANSWER]: 'Attendez que la réponse vous soit renvoyée et explorez-la. Lorsque vous êtes prêt, cliquez sur suivant.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_SELECT_CONTENT = 'guide.step-action.visual-graph-config-select-content';\n\n/**\n * @name visual-graph-config-select\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to select a visual graph configuration from the list of available configurations to open and explore it.<br>\n *\n * Select visual graph config step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-select\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-select',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-config-table');\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_SELECT_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations',\n elementSelector,\n maxWaitTime: 10,\n disableNextFlow: true,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_SELECT_CONTENT]: 'Click the visual graph you just created to open and explore it.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_SELECT_CONTENT]: 'Cliquez sur le graphique visuel que vous venez de créer pour l\\'ouvrir et l\\'explorer.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","import * as Utils from '../utils.js';\n\nconst RESOURCE_RESULTS_ROW_EXPLAIN_TITLE = 'view.resource.title';\nconst RESOURCE_RESULTS_ROW_EXPLAIN_CONTENT = 'guide.step_plugin.resource-results-row-explain.content';\n\n/**\n * @name resource-results-row-explain\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-results-row-explain` guide step that explains a row in the resource results table,\n * highlighting that each row represents an RDF triple consisting of a subject, predicate, and object.\n *\n * <img src=\"resources/guides/resource/resource-results-row-explain.png\"\n * style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific options are available:\n *\n * Options:\n * @property {string|number} options.row - The row identifier used to build the element selector for the row to explain.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-results-row-explain\",\n * \"options\": {\n * \"row\": \"1\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-results-row-explain',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, RESOURCE_RESULTS_ROW_EXPLAIN_TITLE),\n content: translate(this.translationBundle, RESOURCE_RESULTS_ROW_EXPLAIN_CONTENT),\n ...options,\n ...(options.skipUrl ? {} : {url: Utils.getResourceURL(options)}),\n class: 'visual_graph-row',\n elementSelector: GuideUtils.getSparqlResultsSelectorForRow(options.row)\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_RESULTS_ROW_EXPLAIN_TITLE]: 'Resource',\n [RESOURCE_RESULTS_ROW_EXPLAIN_CONTENT]: 'Each row in this table represents an RDF triple, consisting of a subject, predicate, and object. These triples describe relationships between resources in the graph.'\n },\n fr: {\n [RESOURCE_RESULTS_ROW_EXPLAIN_TITLE]: 'Ressource',\n [RESOURCE_RESULTS_ROW_EXPLAIN_CONTENT]: 'Chaque ligne de ce tableau représente un triplet RDF, composé d’un sujet, d’un prédicat et d’un objet. Ces triplets décrivent les relations entre les ressources dans le graphe.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst OPEN_SPARQL = 'guide.step_plugin.connectors-lucene-open-view-sparql-query-dialog.content';\n\n/**\n * @name connectors-lucene-open-view-sparql-query-dialog\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to open the SPARQL query dialog for a specific Lucene connector instance in GraphDB.\n * It prompts the user to click on \"View SPARQL Query\" to see the query used to create the Lucene connector.\n *\n * Open Lucene connector SPARQL query dialog<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-open-view-sparql-query-dialog.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-open-view-sparql-query-dialog\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-open-view-sparql-query-dialog',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-open-view-sparql-query-dialog',\n options: {\n content: translate(this.translationBundle, OPEN_SPARQL),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-open-view-sparql-query-dialog',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'analyzer'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [OPEN_SPARQL]: 'Click on <b>View SPARQL Query</b> to view the Lucene connector creation query.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [OPEN_SPARQL]: 'Cliquez sur <b>Voir la requête SPARQL</b> pour afficher la requête de création du connecteur Lucene.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\n\n/**\n * @name hold-and-wait-until-shown\n * @memberof module:Interactive Guide\n *\n * @description\n * Holds the current step and waits until a specific element becomes visible before allowing the user to proceed.\n *\n * Hold and wait until shown example<br>\n * <img src=\"resources/guides/core/hold-and-wait-until-shown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br></br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.elementSelectorToWait - CSS selector of the element whose visibility is being monitored to become visible.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"hold-and-wait-until-shown\",\n * \"options\": {\n * \"elementSelectorToWait\": \"#loaded-panel\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'hold-and-wait-until-shown',\n getStep: (options, services) => {\n const notOverridable = {\n type: 'readonly'\n };\n return {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n onNextValidate: () => Promise.resolve(services.GuideUtils.isVisible(options.elementSelectorToWait)),\n ...options,\n ...notOverridable\n };\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst SEARCH_METHOD_CONTENT = 'guide.step_plugin.sparql-search-method.content';\n\n/**\n * @name ttyg-enabling-sparql-info-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an informational message about enabling the SPARQL search query method in the TTYG interface.\n * It explains the benefits of using SPARQL search for datasets with good ontologies and closed-ended questions.\n *\n * Enabling SPARQL in info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-enabling-sparql-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-enabling-sparql-info-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-enabling-sparql-info-message',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, SEARCH_METHOD_CONTENT),\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n class: 'info-sparql-search',\n ...options,\n url: 'ttyg'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [SEARCH_METHOD_CONTENT]: 'Enabling SPARQL search allows the agent to answers questions by performing a SPARQL query. This works well for datasets with good ontologies and performs well on closed-ended questions, including aggregations.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [SEARCH_METHOD_CONTENT]: 'L\\'activation de la recherche SPARQL permet à l\\'agent de répondre aux questions en effectuant une requête SPARQL. Cette méthode fonctionne bien pour les ensembles de données dotés d\\'une bonne ontologie et donne de bons résultats pour les questions fermées, y compris les agrégations.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst UNEXPECTED_ERROR = 'guide.unexpected.error.message';\n\n/**\n * @name sparql-explain-editor\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an additional explanation for the SPARQL query editor.\n *\n * Additional explanation<br>\n * <img src=\"resources/guides/sparql-editor/sparql-explain-editor.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} extraContent - The additional content to display in the editor.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-explain-editor\",\n * \"options\": {\n * \"extraContent\": \"This is an additional explanation for the SPARQL editor.\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-explain-editor',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'input-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n url: 'sparql',\n elementSelector: services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR,\n class: 'sparql-explain-editor',\n beforeShowPromise: () => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then(() => services.GuideUtils.waitFor(services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR, 3))\n .then(() => services.GuideUtils.deferredShow(500)())\n .catch((error) => {\n services.toastr.error(translate(this.translationBundle, UNEXPECTED_ERROR));\n throw error;\n }),\n scrollToHandler: services.GuideUtils.scrollToTop,\n extraContent: options.extraContent,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [UNEXPECTED_ERROR]: 'The guide was cancelled due to an unexpected error. Please run the guide again and if the problem persists contact the support.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [UNEXPECTED_ERROR]: 'Le guide a été annulé en raison d\\'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_ASK_DEFAULT_TITLE = 'guide.step-action.ask-ttyg-agent';\nconst EXPLAIN_ANSWER = 'guide.step_plugin.ask-ttyg-agent.explain-answer';\nconst WAIT_FOR_ANSWER = 'guide.step_plugin.ask-ttyg-agent.wait-for-answer';\n\n/**\n * @name ttyg-explain-response\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to explain the response received from the TTYG agent.\n *\n * Click on explain button<br>\n * <img src=\"resources/guides/ttyg/ttyg-explain-response.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-explain-response\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-explain-response',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const explainBtnSelector = GuideUtils.getLastGuideElementSelector('explain-response-btn');\n const elementSelector = GuideUtils.getLastGuideElementSelector('chat-item', explainBtnSelector);\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_ASK_DEFAULT_TITLE);\n return [\n {\n // If button is not visible for some reason, skip the whole step\n guideBlockName: 'info-message',\n options: {\n url: 'ttyg',\n beforeShowPromise: (guide, currentStep) => GuideUtils.waitFor(elementSelector, 1)\n .then(() => {\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.next());\n })\n .catch(() => {\n const stepId = currentStep.id;\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.show(stepId + 3));\n }),\n ...options\n }\n },\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, EXPLAIN_ANSWER),\n class: 'explain-answer',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector\n }\n },\n {\n guideBlockName: 'hold-and-wait-until-hidden',\n options: {\n title,\n content: translate(this.translationBundle, WAIT_FOR_ANSWER),\n class: 'wait-for-answer',\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('chat-details'),\n elementSelectorToWait: GuideUtils.getGuideElementSelector('question-loader'),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Ask the agent',\n [EXPLAIN_ANSWER]: 'Explain the answer by clicking on the \\'Explain response\\' button.',\n [WAIT_FOR_ANSWER]: 'Wait for the answer to be returned and explore it. When ready proceed by clicking next.'\n },\n fr: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Demander à l\\'agent',\n [EXPLAIN_ANSWER]: 'Expliquez la réponse en cliquant sur le bouton \\'Expliquer la réponse\\'',\n [WAIT_FOR_ANSWER]: 'Attendez que la réponse vous soit renvoyée et explorez-la. Lorsque vous êtes prêt, cliquez sur suivant.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const MISSING_KEY_TITLE = 'guide.step_plugin.ttyg.missing-key.title';\nconst MISSING_KEY_CONTENT = 'guide.step_plugin.ttyg.missing-key.content';\n\nconst GRAPHDB_API_KEY_PROPERTIES = [\n 'graphdb.llm.api-key',\n // deprecated\n 'graphdb.openai.api-key'\n];\n\nconst isApiKeyError = (text) => {\n return GRAPHDB_API_KEY_PROPERTIES.some((key) => text.includes(key));\n};\n\n/**\n * @name end-on-api-key-error\n * @memberof module:Interactive Guide\n *\n * @description\n * This step checks for an API key error message and ends the guide if the error is present.\n *\n * Missing OpenAI key error message<br>\n * <img src=\"resources/guides/ttyg/end-on-api-key-error.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"end-on-api-key-error\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'end-on-api-key-error',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n options.mainAction = 'end-on-api-key-error';\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'guide-end',\n options: {\n title: translate(this.translationBundle, MISSING_KEY_TITLE),\n content: translate(this.translationBundle, MISSING_KEY_CONTENT),\n url: 'ttyg',\n beforeShowPromise: (guide, currentStepDescription) => {\n // Check if error toast is visible waiting for 1 seconds\n return GuideUtils.waitFor('.toast-message', 1)\n .then((element) => {\n if (isApiKeyError(element.textContent)) {\n // Error toast is visible, show this step and complete on next click\n currentStepDescription.onNextClick = (guide) => {\n guide.complete();\n };\n } else {\n // Toast is not visible, but not the correct, so we go on\n setTimeout(() => {\n guide.next();\n });\n }\n })\n .catch(() => {\n // Error toast is not visible, skip this step and move to next one\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => {\n guide.next();\n });\n });\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [MISSING_KEY_TITLE]: 'Missing OpenAI key',\n [MISSING_KEY_CONTENT]: 'To use <b>Talk to Your Graph</b>, GraphDB must first be configured to work with LLM API. Please ensure that the necessary LLM API type, url and key are in place before starting. For detailed setup instructions, refer to the documentation or contact your administrator.'\n },\n fr: {\n [MISSING_KEY_TITLE]: 'Clé OpenAI manquante',\n [MISSING_KEY_CONTENT]: 'Pour utiliser <b>Parlez à votre graphique</b>, GraphDB doit d\\'abord être configuré pour fonctionner avec l\\'API LLM. Veuillez vous assurer que le type d\\'API LLM requis, l\\'URL et la clé sont bien en place avant de commencer. Pour des instructions de configuration détaillées, reportez-vous à la documentation ou contactez votre administrateur.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_ZOOM_CONTENT = 'guide.step-action.visual-graph-zoom-content';\n\n/**\n * @name visual-graph-zoom\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to zoom in and out of the visual graph using the mouse wheel or touchpad.<br>\n *\n * Visual graph zoom step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-zoom.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-zoom\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-zoom',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-visualization');\n return [{\n guideBlockName: 'scroll-only-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_ZOOM_CONTENT),\n url: 'graphs-visualizations',\n ...options,\n elementSelector,\n allowScroll: true\n }\n }];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_ZOOM_CONTENT]: 'Scrolling with the <b>mouse wheel</b> or <b>two fingers on the touchpad</b> zooms the visual graph in and out.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_ZOOM_CONTENT]: 'Faites défiler avec la <b>molette de la souris</b> ou <b>deux doigts sur le pavé tactile</b> pour zoomer et dézoomer le graphique visuel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const CREATE_SIMILARITY_INDEX_DEFAULT = 'guide.step-action.create-similarity-index';\nconst VIEW_CREATED_INDEX_DEFAULT = 'guide.step_plugin.similarity-view-index';\nconst VIEW_CREATED_INDEX_BY_NAME = 'guide.step_plugin.similarity-view-created-index';\n\n/**\n * @name similarity-view-created-index\n * @memberof module:Interactive Guide\n *\n * @description\n * This step highlights the newly created similarity index in the Existing Indexes table. The default index to highlight\n * is the first index, unless <code>options.rowIndex</code> is specified. If <code>options.indexName</code> is specified,\n * the step will highlight the index with the specified name.\n *\n * View the newly created similarity index<br>\n * <img src=\"resources/guides/similarity-index/similarity-view-created-index.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} [options.content] - The content of the dialog.\n * @property {string} [options.title] - The title of the dialog.\n * @property {number} [options.rowIndex] - The index of the row to focus on.\n * @property {string} [options.indexName] - The name of the index to focus on.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-view-created-index\",\n * \"options\": {\n * \"title\": {\n * \"en\": \"Explore Similarity index\"\n * },\n * \"content\": \"In the <b>Existing Indexes</b> table, you can now see the <b>SpellSimIndex</b> which is the similarity index we created with the previous query.\",\n * \"rowIndex\": 1\n * }\n * }\n */\nconst step = {\n guideBlockName: 'similarity-view-created-index',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const content = options.indexName ?\n translate(this.translationBundle, VIEW_CREATED_INDEX_BY_NAME, {indexName: options.indexName}) :\n translate(this.translationBundle, VIEW_CREATED_INDEX_DEFAULT);\n let elementSelector;\n if (options.indexName) {\n elementSelector = GuideUtils.getGuideElementSelector(`similarity-index-name-${options.indexName}`);\n } else {\n elementSelector = GuideUtils.getGuideElementSelector(`similarity-index-row-${options.rowIndex ?? 0}`, 'td:has(> .index-name)');\n }\n\n return [\n {\n guideBlockName: 'focus-element',\n options: {\n content,\n url: 'similarity',\n class: 'view-created-index',\n title: translate(this.translationBundle, CREATE_SIMILARITY_INDEX_DEFAULT),\n ...options,\n elementSelector\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Create Similarity index',\n [VIEW_CREATED_INDEX_BY_NAME]: 'In the <b>Existing Indexes</b> table, you can now see the <b>{{indexName}}</b> which is the similarity index we created with the previous query.',\n [VIEW_CREATED_INDEX_DEFAULT]: 'In the <b>Existing Indexes</b> table, you can now see the created index.'\n },\n fr: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Créer un indice de similitude',\n [VIEW_CREATED_INDEX_BY_NAME]: 'Dans le tableau <b>Index existants</b>, vous pouvez maintenant voir le <b>{{indexName}}</b> qui est l\\'index de similarité que nous avons créé avec la requête précédente.',\n [VIEW_CREATED_INDEX_DEFAULT]: 'Dans le tableau <b>Index existants</b>, vous pouvez désormais voir l\\'index créé.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_INTRO_DEFAULT_TITLE = 'visual.graph.label';\nconst VISUAL_GRAPH_INTRO_CONTENT = 'guide.step_plugin.visual_graph_intro.content';\n\n/**\n * @name visual-graph-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-intro`\n * guide step highlights the graph visualization and explains how the start node connects to other nodes.<br>\n *\n * <img src=\"resources/guides/visual-graph/visual-graph-intro.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is available:\n *\n * @property {string} [options.iri] - The label of the start IRI shown in the visualization.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-intro\",\n * \"options\": {\n * \"iri\": \"http://example.com/my-start-node\"\n * \"iriLabel\": \"My start node\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-intro',\n getSteps: function(options, services) {\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_INTRO_CONTENT, {iriLabel: options.iriLabel}),\n title: translate(this.translationBundle, VISUAL_GRAPH_INTRO_DEFAULT_TITLE),\n url: 'graphs-visualizations',\n elementSelector: '.graph-visualization',\n placement: 'left',\n canBePaused: false,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_INTRO_DEFAULT_TITLE]: 'Visual graph',\n [VISUAL_GRAPH_INTRO_CONTENT]: 'The graph shows connections between the start node, <b>{{iriLabel}}</b>, and other nodes. Each arrow represents one or more connections (RDF statements).'\n },\n fr: {\n [VISUAL_GRAPH_INTRO_DEFAULT_TITLE]: 'Graphique visuel',\n [VISUAL_GRAPH_INTRO_CONTENT]: 'Le graphique montre les connexions entre le nœud de départ, <b>{{iriLabel}}</b>, et les autres nœuds. Chaque flèche représente une ou plusieurs connexions (déclarations RDF).'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// Auto-discover and register all plugins without manual imports.\nconst ctx = import.meta.webpackContext('./', {\n recursive: true,\n // Exclude this file; include only \\*.js\n regExp: /^(?!.*\\/?plugins-bundle\\.js$).*\\.js$/,\n mode: 'sync'\n});\n\n// Resolve a usable register function from various export styles.\nfunction resolveRegister(mod) {\n if (typeof mod === 'function') {\n return mod;\n }\n if (mod && typeof mod.register === 'function') {\n return mod.register;\n }\n if (mod && typeof mod.default === 'function') {\n return mod.default;\n }\n if (mod && mod.default && typeof mod.default.register === 'function') {\n return mod.default.register;\n }\n return null;\n}\n\n// Gather all register functions in a stable order.\nconst registerFns = ctx.keys()\n .sort()\n .map((k) => resolveRegister(ctx(k)))\n .filter(Boolean);\n\n// Public API: register all discovered plugins.\nexport function register(registry) {\n for (const register of registerFns) {\n register(registry);\n }\n}\n\n"],"names":["TTYG_EDIT_AGENT_DEFAULT_TITLE","EDIT_TTYG_AGENT","step","guideBlockName","getSteps","options","pluginService","GuideUtils","translate","_objectSpread","content","this","translationBundle","title","class","disableNextFlow","url","elementSelector","getGuideElementSelector","en","_defineProperty","fr","register","registry","add","TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE","ENABLE_ONTOLOGY_FROM_GRAPH","clickableElementSelector","onNextValidate","Promise","resolve","isChecked","DEFAULT_TITLE","CONTENT","services","checkboxElement","autocompleteCheckboxClickEventHandler","advanceOn","undefined","beforeShowPromise","getOrWaitFor","show","guide","document","querySelector","deferredShow","then","isGuideElementChecked","next","addEventListener","onNextClick","click","hide","removeEventListener","REPOSITORIES_SELECT_REPOSITORY_DEFAULT_TITLE","CHOOSE_REPOSITORY","SELECT_REPOSITORY","SKIP_SECTION","UNEXPECTED_ERROR_MESSAGE","_options$title","repositorySelectorElement","mouseUpHandler","_this","mainAction","skipPoint","skipButtonLabel","clickOnElement","Utils","waitFor","element","error","toastr","currentStep","getCurrentStep","repositoryId","updateStepOptions","text","canBePaused","COPY_TEXT","COPY_TEXT_ELEMENT","code","createElement","innerText","dataset","test","stepHTMLElement","copy","copyToInputQueryButtonClass","className","concat","copyToInputListener","getElementSelector","textAsHtmlCodeElement","outerHTML","el","VISUAL_GRAPH_EXPLORE_TITLE","VISUAL_GRAPH_CONFIG_SAVE_CONTENT","pluginServices","CREATE_SIMILARITY_INDEX_DEFAULT","CREATE_INDEX","LUCENE_DEFAULT_TITLE","FIELD_INTRO_CONTENT","scrollOffset","SCROLL_OFFSET","CENTER","connectorName","parameterName","CONNECTORS_DEFAULT_TITLE","PARAMETER_INTRO","connectorNameSelector","getConnectorNameSelector","connectorContentSelector","getConnectorContentSelector","parameterSelector","getConnectorParameterSelector","placement","READONLY_INTRO","getStep","stepDescription","BASIC_STEP","initPreviousStep","defaultInitPreviousStep","type","maxWaitTime","GUIDE_END_TITLE","GUIDE_END_CONTENT","notOverridable","lastStep","Options","_createClass","_classCallCheck","IMPORT_FILE","VISUAL_GRAPH_CONFIG_CLICK_TAB_CONTENT","TAB_1","TAB_2","TAB_3","TAB_4","TAB_5","TAB_CONFIG","startingPoint","index","translationKey","graphExpansion","nodeBasics","edgeBasics","nodeExtra","tabConfig","tabName","tab","_document$querySelect","showOn","_element$classList","classList","contains","DISABLE_TOGGLE","toggleSelector","toggleableElementSelector","RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_TITLE","RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_CONTENT","skipUrl","ADD_MISSING_NAMESPACES","namespacesCheckbox","forceReload","explain","explainMore","exploreSparql","steps","push","VALUE_FILTER_INTRO","subparameterName","SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE","disable","TYPES_INTRO","TTYG_DEFAULT_TITLE","CONFIGURE_USER_INSTRUCTIONS","extraContent","disablePreviousFlow","userInstructions","validateTextInput","BOOST_PROPERTIES","REPOSITORIES_CREATE_DEFAULT_TITLE","REPOSITORY_ID_CONTENT","repositoryIdInputSelector","_options$tabConfig","_options$tabConfig2","menu","showIntro","configDescription","configHint","length","forEach","START","iri","searchTerm","query","includeInferredData","expandResultsOverOwl","sampleQueryContent","shareConfig","linkLimit","expandIri","VISUAL_GRAPH_NODE_FOCUS_DEFAULT_TITLE","VISUAL_GRAPH_NODE_FOCUS_CONTENT","$rootScope","iriLabel","disableAllVisualGraphNodes","enableAllVisualGraphNodes","awaitAlphaDropD3","stepId","isVisible","previousStep","ShepherdService","getPreviousStepFromHistory","id","VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_DEFAULT_TITLE","VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_CONTENT","easyGraphInputText","LUCENE_TYPE_INTRO","TTYG_CREATE_AGENT_DEFAULT_TITLE","SAVE_AGENT_SETTINGS","FTS_METHOD_DEFAULT_TITLE","SPARQL_EDITOR_TITLE","RUN_QUERY","CSS_SELECTORS","SPARQL_RUN_BUTTON_SELECTOR","YasguiComponentUtil","getOntotextYasguiElementAsync","yasgui","scrollToHandler","scrollToTop","CONNECTORS_INTRO_CONTENT","connectorCardSelector","instanceName","REPOSITORIES_DEFAULT_TITLE","SELECT_REPO_CONTENT","_options$repositoryId","repositoryIdToSelect","selectRepositoryRowSelector","selectRepositoryButtonWrapperSelector","selectRepositoryButtonSelector","SIDE_PANEL_CONTENT","RDF_INSTANCES_TITLE","closeButtonSelector","waitUntilHidden","elementSelectorToHide","timeToWait","_abortGuide","setTimeout","SKIP_INITIAL_INDEXING","_services","ontologyGraph","sparqlQuery","EXPAND_RESULTS_CONTENT","RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_TITLE","RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_CONTENT","$","trigger","REMAINING_FIELDS_INTRO","remainingFieldsSelector","TTYG_SELECT_AGENT_DEFAULT_TITLE","SELECT_AGENT","elementToObserve","dropdownToggleElement","observer","MutationObserver","mutationList","_step","_iterator","_createForOfIteratorHelper","s","n","done","mutation","value","target","err","e","f","observe","attributes","disconnect","STORED_INTRO","MISSING_REPOSITORY","currentStepId","on","off","FTS_SEARCH_CONTENT","VIEW_SPARQL_DIALOG","ENABLE_TOGGLE","shouldToggleOff","isEnabled","scrollIntoView","block","CONNECTOR_TYPE_INTRO","TABLE_GRAPH_INTRO","TABLE_GRAPH_OVERVIEW","TABLE_GRAPH_LINK","TABLE_GRAPH_ROLE_SUBJECT_CONTENT","TABLE_GRAPH_ROLE_PREDICATE_CONTENT","TABLE_GRAPH_ROLE_OBJECT_CONTENT","TABLE_GRAPH_ROLE_CONTEXT_CONTENT","TABLE_GRAPH_ROLE_ALL_CONTENT","TABLE_GRAPH_VISUAL","TABLE_GRAPH_TITLE","_options$iriLabel","_options$iriLabel2","RoutingUtil","getCurrentStepId","SPARQL_RESULTS_ROWS_SELECTOR","decodeURIComponent","getCurrentRoute","navigate","Array","isArray","subSteps","subStep","_subStep$iriLabel","_ref","_ref2","_subStep$iriLabel2","linkUrl","tableGraphLinkUrl","ROLE_KEY_BY_TYPE","subject","predicate","object","context","all","role","showRole","substring","indexOf","extraContentVisualIntro","window","history","back","maxTriplesPerCall","WAIT_FOR_INDEX","elementSelectorToWait","PROPERTY_CHAIN_INTRO_CONTENT","DOWNLOAD_RESOURCE_TITLE","RESOURCE_CONTENT","downloadButtonClass","downloadResourceListener","resourcePath","resourceFile","CONFIGURE_AGENT_NAME","$translate","instant","validateTextInputNotEmpty","CONVERSATION_WITH_AGENT_DEFAULT_TITLE","START_CONVERSATION","createChatBtnSelector","addMissingNamespaces","DOCUMENT_FILTER","CLASS_HIERARCHY_DEFAULT_TITLE","EXPLAIN_RDF_INSTANCE","focusInstance","instance","skipFromHistory","onPreviousClick","RDF_RANK_TITLE","CLICK_MAIN_MENU","MENU_SETUP_LABEL","MENU_IMPORT_LABEL","MENU_EXPLORE_LABEL","MENU_SPARQL_LABEL","MENU_LAB_LABEL","SUBMENU_REPOSITORIES_LABEL","SUBMENU_AUTOCOMPLETE_LABEL","SUBMENU_CONNECTORS_LABEL","SUBMENU_VISUAL_GRAPH_LABEL","SUBMENU_CLASS_HIERARCHY_LABEL","SUBMENU_CLASS_RELATIONSHIPS_LABEL","SUBMENU_TTYG_LABEL","SUBMENU_SIMILARITY_LABEL","VIEW_AUTOCOMPLETE_TITLE","VIEW_CONNECTOR_MANAGEMENT_TITLE","VIEW_SPARQL_EDITOR_TITLE","VIEW_CLASS_HIERARCHY_TITLE","VIEW_CLASS_RELATIONSHIPS_TITLE","HELP_INFO_REPOSITORIES","HELP_INFO_IMPORT","HELP_INFO_AUTOCOMPLETE","HELP_INFO_CONNECTOR_MANAGEMENT","HELP_INFO_VISUAL_GRAPH","HELP_INFO_SPARQL_EDITOR","HELP_INFO_CLASS_HIERARCHY","HELP_INFO_CLASS_RELATIONSHIPS","HELP_INFO_TTYG","HELP_INFO_SIMILARITY","HELP_INFO_RDF_RANK","INTRO_CREATE_REPOSITORY","INTRO_ENABLE_AUTOCOMPLETE","INTRO_EXECUTE_SPARQL_QUERY","INTRO_VISUAL_GRAPH","INTRO_IMPORT_FILE","INTRO_CLASS_HIERARCHY","INTRO_CREATE_TTYG_AGENT","INTRO_CREATE_SIMILARITY_INDEX","INTRO_CLASS_RELATIONSHIPS","ACTION_CREATE_REPOSITORY","ACTION_ENABLE_AUTOCOMPLETE","ACTION_EXECUTE_SPARQL_QUERY","ACTION_VISUAL_GRAPH","ACTION_IMPORT_FILE","ACTION_CREATE_TTYG_AGENT","ACTION_CREATE_SIMILARITY_INDEX","ACTION_CLASS_HIERARCHY","ACTION_CLASS_RELATIONSHIPS","menuSelector","menuTitle","submenuSelector","submenuTitle","viewName","helpInfo","dialogTitle","menuDialogClass","submenuDialogClass","mainMenuClickElementPostSelector","extraContentClass","menuLabel","isGuideElementVisible","clickOnGuideElement","submenuLabel","elementSubmenuSelector","_en","_fr","OPEN_VIEW_SPARQL_DIALOG","openViewSPARQLDialogSelector","INPUT_INDEX_NAME","FACET_INTRO","startNewConversation","showInfo","newConversationStartSteps","apply","questionSteps","questions","map","questionWithOptions","QUERY_CONTENT","RESULTS_CONTENT","RESULTS_EXTRA_CONTENT","clasInstanceSelector","instanceCountSelector","focusInstances","isObject","message","urlBeforeFollowCountLink","followCountLink","location","href","showExtraCommentSparql","SPARQL_RESULTS_SELECTOR","RESOURCE_SEARCH_RDF_TITLE","RESOURCE_SEARCH_RDF_CONTENT","UPLOAD_FILE_ERROR","UNEXPECTED_FILE","filesForUploadSelectedSubscription","$interpolate","EventEmitterService","importSettingsButtonSelector","subscribe","eventData","files","some","uploadedFile","name","noNextErrorToast","cancel","allSettled","confirmDialogPromise","importButtonPromise","status","uploadFileError","SIMILARITY_CONTENT","SAVE_AGENT","translatedGuideName","infoIconHint","mouseIconHint","inputIconHint","translatedGuideDescription","VISUAL_GRAPH_EXPAND_TITLE","VISUAL_GRAPH_EXPAND_CONTENT","$route","graphVizExpandNode","dblClickFunction","reload","rulesetName","fts","VISUAL_GRAPH_CONFIG_PROPERTIES_HINT","SAVE_BUTTON","FIELD_NAME_INTRO_CONTENT","ZOOM_CLASS_CONTENT","classHierarchyZoom","OPEN_AGENT_DROPDOWN","TYPE_ONTLOGY_GRAPH","CONVERSATION_WITH_AGENT_INFO","EXPLAIN_CONTENT","fileName","resultExtraContent","TOGGLE_PREFIXES_CONTENT","_guide","TTYG_INTRO_MESSAGE","CREATE_AGENT","RESOURCE_CLICK_ON_ROLE_TITLE","GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_SUBJECT_CONTENT","GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_PREDICATE_CONTENT","GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_OBJECT_CONTENT","GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_CONTEXT_CONTENT","GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_ALL_CONTENT","DEFAULT_VALUE_INTRO","TTYG_EDIT_TITLE","introExtraContent","DETECT_FIELDS","IMPORT_GRAPH","GRAPHDB_REPOSITORY_CONTENT","searchInputSelector","URL","RESOURCE_RESULTS_TITLE","RESOURCE_RESULTS_EXPLAIN_CONTENT","INCLUDE_INFERRED_CONTENT","ENABLE_SPARQL_QUERY","EXPLORE_CLASS_HIERARCHY","zoomIris","zoomIri","postExtraContent","LUCENE_EXPAND_CONTENT","INVALID_VALUES_INTRO","VISUAL_GRAPH_CONFIG_SAMPLE_QUERY_CONTENT","TAB_NAME_TO_INDEX","tabIndex","OPEN_ALL_INSTANCES_IN_SPARQL","VISUAL_GRAPH_SETTINGS_SAVE_CONTENT","CONFIGURE_TOP_P","inputSelector","topP","selector","event","SELECT_AGENT_INFO","STRIP_MARKUP","CREATE_REPO_BUTTON","DROPDOWN_CONTENT","UNEXPECTED_ERROR","reject","TTYG_ASK_DEFAULT_TITLE","EXPLORE_SPARQL","exploreSparqlBtnSelector","getLastGuideElementSelector","VISUAL_GRAPH_CONFIG_SHARE_CONTENT","behavior","_options$queries","queries","overwriteQuery","queryDef","queryExtraContent","SPARQL_EDITOR_SELECTOR","getQuery","queryFromEditor","editorQuery","removeWhiteSpaces","setQuery","executeSparqlQuery","_options$disable","shouldDisable","toggleListener","checked","preventDefault","stopPropagation","SUBPARAMETER_INTRO","getConnectorSubparameterSelector","VISUAL_GRAPH_SETTINGS_CLICK_CONTENT","SET_MAX_TRIPLES_PER_CALL","EXPAND_CONNECTOR_CONTENT","connectorToggleButtonSelector","elementSelectorToShow","RESOURCE_RESULTS_CLICK_IRI_TITLE","RESOURCE_RESULTS_CLICK_IRI_CONTENT","getSparqlResultsSelectorForIri","VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_DEFAULT_TITLE","VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_CONTENT","PluginServiceInterface","key","LUCENE_CONTENT","SET_MAX_IRIS_PER_CALL","_options$maxIrisPerCa","maxIrisPerCall","maxIrisInputSelector","RDF_INSTANCES_SIDE_PANEL_INTRO","SELECT_INDEX","VISUAL_GRAPH_CONFIG_PROPERTIES_DESCRIPTION","CONFIGURE_TEMPERATURE_INFO","temperature","CLOSE_VIEW_SPARQL_DIALOG","VISUAL_GRAPH_PROPERTIES_TITLE","VISUAL_GRAPH_PROPERTIES_CONTENT","VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_TITLE","VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CONTENT","VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE_TYPES","VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT_TYPES","VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE","VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT","VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_TITLE","VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_CONTENT","mouseClickTimeStamp","mouseEventTimer","_onNodeClicked","timeStamp","clearTimeout","graphVizShowNodeInfo","onClick","focusProperties","focusProperty","property","translationIdSuffix","titleKey","contentKey","skipGenericMessage","params","VISUAL_GRAPH_SET_MAXIMUM_LINKS_CONTENT","SET_CONTEXT_WINDOW_SIZE","contextSize","DATATYPE_INTRO","webpackContext","req","webpackContextResolve","__webpack_require__","o","Error","keys","Object","module","exports","CLICK_ON_IRI","CONFIGURE_AGENT_MODEL","model","VISUAL_GRAPH_LINK_FOCUS_TITLE","VISUAL_GRAPH_LINK_FOCUS_CONTENT","fromIri","toIri","fromIriLabel","toIriLabel","VISUAL_GRAPH_CONFIG_PROPERTIES_NAME","MULTIVALUED_INTRO","INTRO_CONTENT","ANALYZED_INTRO_CONTENT","TTYG_CREATE_TITLE","editName","EXPLAIN_ANSWER_MORE","WAIT_FOR_ANSWER","explainMoreBtnSelector","TRANSFORM_INTRO_CONTENT","ENABLE_FTS_CONTENT","EXTRA_CONTENT","VISUAL_GRAPH_CONFIG_CREATE_CLICK_CONTENT","ANALYZER_INTRO","COMMON_DOM_EVENTS","SCROLL_EVENTS","createCopyToInputListener","inputElement","dispatchEvent","Event","bubbles","_configureInteractions","allowedEvents","interactable","eventsToPrevent","filter","includes","allowAll","allowEvents","SPARQL_DIRECTIVE_SELECTOR","reloadAndOpenInfoPanel","classHierarchyFocus","disableAllRDFClasses","querySelectorAll","disableSidebarInteraction","enableAllRDFClasses","remove","enableSidebarInteraction","createDownloadClickHandler","GuidesService","downloadGuidesFile","createCopyToEditorListener","getYasguiComponentUtil","sparqlDirectiveSelector","getResourceURL","encodeURIComponent","getRepositoryName","$repositories","getRepositories","find","repo","repositoryIdBase","getRepositoryElementSelector","setRepositorySelectorAutoClose","autoClose","component","addClass","removeClass","useMainMenuNavigation","OPEN_RDF_INSTANCES_SIDE_PANEL","handleDoubleClick","SHOW_DOCUMENTATION_LINK","documentationLink","documentationPath","resolveDocumentationUrl","VISUAL_GRAPH_CONFIG_STARTING_POINT_SEARCH_CONTENT","VISUAL_GRAPH_CONFIG_STARTING_POINT_FIXED_CONTENT","VISUAL_GRAPH_CONFIG_STARTING_POINT_QUERY_CONTENT","STARTING_POINT_CONFIG","search","fixed","config","SPARQL_RESULT_CONTENT","SPARQL_VISUAL_BUTTON_SELECTOR","COPY_TO_EDITOR","QUERY_EDITOR_CONTENT","copyToEditorButtonClass","copyToEditorListener","queryAsHtmlCodeElement","_queryFromEditor","_options$methods","shouldEditName","hasModelName","hasUserInstructions","shouldConfigureExtractionMethods","methods","shouldConfigureContextSize","shouldConfigureTopP","shouldConfigureTemperature","shouldConfigureIriDiscoverySearch","iriDiscoverySearch","method","configureExtractionMethods","LANGUAGES_INTRO","COMPUTE_FILL","computeRDFRankButtonSelector","INDEXED_INTRO","INPUT_QUESTION","question","shiftKey","ctrlKey","VISUAL_GRAPH_CONFIG_SELECT_CONTENT","RESOURCE_RESULTS_ROW_EXPLAIN_TITLE","RESOURCE_RESULTS_ROW_EXPLAIN_CONTENT","getSparqlResultsSelectorForRow","row","OPEN_SPARQL","SEARCH_METHOD_CONTENT","EXPLAIN_ANSWER","explainBtnSelector","MISSING_KEY_TITLE","MISSING_KEY_CONTENT","GRAPHDB_API_KEY_PROPERTIES","currentStepDescription","textContent","complete","VISUAL_GRAPH_ZOOM_CONTENT","allowScroll","VIEW_CREATED_INDEX_DEFAULT","VIEW_CREATED_INDEX_BY_NAME","_options$rowIndex","indexName","rowIndex","VISUAL_GRAPH_INTRO_DEFAULT_TITLE","VISUAL_GRAPH_INTRO_CONTENT","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","d","definition","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","ctx","import","registerFns","sort","k","mod","Boolean"],"sourceRoot":""}
1
+ {"version":3,"file":"plugins-bundle.js","mappings":"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","sources":["webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-click-to-edit-selected-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-method-ontology-select.js","webpack://graphdb-workbench-plugins/./plugins/guides/autocomplete/autocomplete-enable-checkbox.js","webpack://graphdb-workbench-plugins/./plugins/guides/repositories/select-repository-dropdown.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/copy-text-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-save.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/similarity-click-link.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-parameter-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-readonly-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/input-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/guide-end.js","webpack://graphdb-workbench-plugins/./plugins/guides/options.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-import-file-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-click-tab.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-method-disable.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-click-on-visual-graph-button.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-click-add-namespaces.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ask-ttyg-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-value-filter-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/similarity-search-method.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-types-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-class-list-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-agent-additional-instructions.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-boost-properties-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-id-input.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-create.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-node-focus.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-search-rdf-resources-input.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-value-filter-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-type-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-create-agent-save.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-fts-method-disable.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-editor-run-button.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-connector-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/repositories/repositories-select-repository.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-close-rdf-instances-side-panel.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/wait-for-element-to-hide.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-skip-initial-indexing-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/sparql-search-method.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-editor-expand-results-over-owl.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/read-only-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-search-autocomplete-item.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/select-ttyg-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-parameter-fields-remaining-fields-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/similarity-click-to-create.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-select-agent-from-dropdown.js","webpack://graphdb-workbench-plugins/./plugins/guides/autocomplete/enable-autocomplete.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-stored-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-select-agent-check-for-missing-repository-cancel.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-fts-method-info.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-digram-thickness-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-view-sparql-dialog-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-copy-query-text.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-iri-discovery-search.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-diagram-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-type-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/table-graph-explore.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/fts-search-method.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/similarity-hold-and-wait-until-shown.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-property-chain-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-method-enable.js","webpack://graphdb-workbench-plugins/./plugins/guides/download-guide-resource/download-guide-resource.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-agent-type-agent-name.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-click-to-create-new-chat.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/sparql-search-method-enable-ontology-graph.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-view-sparql-dialog-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-document-filter-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-explain-rdf-instance.js","webpack://graphdb-workbench-plugins/./plugins/guides/import/import-confirm-duplicate-files.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/create-similarity-index.js","webpack://graphdb-workbench-plugins/./plugins/guides/main-menu/click-main-menu.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-fts-method-enable.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-open-view-sparql-query-dialog.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/similarity-type-index-name.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-class-list-selection.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-edit-agent-intro-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-facet-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/conversation-with-ttyg-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-instances.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-search-rdf.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/sparql-search-method-enable-sparql-query.js","webpack://graphdb-workbench-plugins/./plugins/guides/import/import-upload-rdf-file.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-similarity-info-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-edit-agent-click-to-save.js","webpack://graphdb-workbench-plugins/./plugins/guides/autocomplete/autocomplete-focus-on-indexing-status.js","webpack://graphdb-workbench-plugins/./plugins/guides/welcome/welcome.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-expand.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/create-repository.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-hint.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-save.js","webpack://graphdb-workbench-plugins/./plugins/guides/import/import-rdf-file.js","webpack://graphdb-workbench-plugins/./plugins/guides/config.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-field-name-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-zoom-class.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-select-agent-dropdown-open.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/info-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/sparql-search-method-type-graph-name.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-conversation-info-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-results-explain.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-toggle-prefixes.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-create-agent-intro-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-create-agent-click.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-click-on-role.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-default-value-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-digram-predicates-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/edit-ttyg-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-detect-fields-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-import-graph-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-create-graphdb.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-results-explain.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/hold-and-wait-until-hidden.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-editor-include-inferred-data.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-sparql-method-sparql-query-select.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-remaining-fields-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-similarity-toggle-off.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-expand-lucene.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-ignore-invalid-values-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-sample-query.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-settings-save.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-top-p.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/clickable-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-select-agent-info-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-strip-markup-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-create-repository.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-ruleset-dropdown.js","webpack://graphdb-workbench-plugins/./plugins/guides/import/import-click-on-import-button.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-ask-agent-explore-sparql.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-starting-point-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-class-list-background-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-share.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/execute-sparql-query.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/toggle-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-array-subparameter-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-settings-click.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/set-max-triples-per-call.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-autocomplete-iri-discovery.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-expand-connector.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/wait-for-element-to-show.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-results-click-on-iri.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-search-rdf-resources-input-autocomplete-item.js","webpack://graphdb-workbench-plugins/./plugins/plugin-service-interface.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/set-max-iris-per-call.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-similarity-select-index.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-description.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-temperature.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/connectors-close-view-sparql-query-dialog.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-properties.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-set-maximum-links.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/set-context-window-size.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-datatype-intro.js","webpack://graphdb-workbench-plugins/./plugins/ sync ^(","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-results-click-on-iri.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-explain-class.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-agent-type-model-name.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-link-focus.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-name.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-multivalued-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/import/import-show-progress.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-analyzed-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/create-ttyg-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-ask-explain-answer-more.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-field-name-transform-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/repository/repositories-enable-fts.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-create-click.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-analyzer-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/utils.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/focus-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/visualise-sparql-query.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-open-rdf-instances-side-panel.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/show-documentation-link.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/scroll-only-element.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-starting-point.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-results-visual-button.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-editor.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-hierarchy/class-hierarchy-dataset-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/configure-agent.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-languages-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-similarity-toggle-on.js","webpack://graphdb-workbench-plugins/./plugins/guides/rdf-rank/rdf-rank-compute-fill.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-fields-indexed-intro.js","webpack://graphdb-workbench-plugins/./plugins/guides/class-relationships/class-relationships-named-graph-selection.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-ask-question.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-config-select.js","webpack://graphdb-workbench-plugins/./plugins/guides/resource/resource-results-row-explain.js","webpack://graphdb-workbench-plugins/./plugins/guides/connectors/lucene/connectors-lucene-open-view-sparql-query-dialog.js","webpack://graphdb-workbench-plugins/./plugins/guides/core-steps/hold-and-wait-until-shown.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-enabling-sparql-info-message.js","webpack://graphdb-workbench-plugins/./plugins/guides/sparql-editor/sparql-explain-editor.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/ttyg-explain-response.js","webpack://graphdb-workbench-plugins/./plugins/guides/ttyg/end-on-api-key-error.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-zoom.js","webpack://graphdb-workbench-plugins/./plugins/guides/similarity-index/similarity-view-created-index.js","webpack://graphdb-workbench-plugins/./plugins/guides/visual-graph/visual-graph-intro.js","webpack://graphdb-workbench-plugins/webpack/bootstrap","webpack://graphdb-workbench-plugins/webpack/runtime/define property getters","webpack://graphdb-workbench-plugins/webpack/runtime/hasOwnProperty shorthand","webpack://graphdb-workbench-plugins/webpack/runtime/make namespace object","webpack://graphdb-workbench-plugins/./plugins/plugins-bundle.js"],"sourcesContent":["const TTYG_EDIT_AGENT_DEFAULT_TITLE = 'guide.step-action.edit-ttyg-agent';\nconst EDIT_TTYG_AGENT = 'guide.step_plugin.edit-ttyg-agent.edit-agent';\n\n/**\n * @name ttyg-click-to-edit-selected-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click on the edit button to modify the configuration of the selected TTYG agent.\n *\n * Click on edit agent button<br>\n * <img src=\"resources/guides/ttyg/ttyg-click-to-edit-selected-agent.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-click-to-edit-selected-agent\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-click-to-edit-selected-agent',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, EDIT_TTYG_AGENT),\n title: translate(this.translationBundle, TTYG_EDIT_AGENT_DEFAULT_TITLE),\n class: 'edit-agent-btn',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('edit-current-agent')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Edit an agent',\n [EDIT_TTYG_AGENT]: 'Click on the edit agent button to edit the configuration of the selected agent.'\n },\n\n fr: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Modifier un agent',\n [EDIT_TTYG_AGENT]: 'Cliquez sur le bouton « Modifier l\\'agent » pour modifier la configuration de l\\'agent sélectionné.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst ENABLE_ONTOLOGY_FROM_GRAPH = 'guide.step_plugin.sparql-search-method.enable-ontology-from-graph';\n\n/**\n * @name ttyg-sparql-method-ontology-select\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable providing an ontology in a named graph for the SPARQL search method in the TTYG interface.\n * It highlights the checkbox element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable providing an ontology in a named graph.<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-ontology-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-sparql-method-ontology-select\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-method-ontology-select',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, ENABLE_ONTOLOGY_FROM_GRAPH),\n class: 'enable-ontology-from-graph',\n // If mainAction is set the title will be set automatically\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('sparql-ontology-graph-option'),\n clickableElementSelector: GuideUtils.getGuideElementSelector('sparql-ontology-graph-option-input'),\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(GuideUtils.getGuideElementSelector('sparql-ontology-graph-option-input')))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [ENABLE_ONTOLOGY_FROM_GRAPH]: 'Click on the toggle to enable providing an ontology in a named graph.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [ENABLE_ONTOLOGY_FROM_GRAPH]: 'Cliquez sur la case à cocher pour activer la fourniture d\\'une ontologie dans un graphe nommé.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.autocomplete.default.title';\nconst CONTENT = 'guide.step_plugin.autocomplete-enable-checkbox.content';\n\n/**\n * @name autocomplete-enable-checkbox\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `autocomplete-enable-checkbox` step shows the user how to enable the autocomplete index in GraphDB.<br>\n * <img src=\"resources/guides/autocomplete/autocomplete-enable-checkbox.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"autocomplete-enable-checkbox\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'autocomplete-enable-checkbox',\n getSteps: function(options, services) {\n const translate = services.translate;\n let checkboxElement;\n let autocompleteCheckboxClickEventHandler;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n class: 'enable-autocomplete-checkbox',\n ...options,\n url: 'autocomplete',\n elementSelector: services.GuideUtils.getGuideElementSelector('autocompleteCheckbox'),\n // Disable default behavior of service when element is clicked.\n advanceOn: undefined,\n beforeShowPromise: () => services.GuideUtils.getOrWaitFor(services.GuideUtils.getGuideElementSelector('autocompleteCheckbox'), 5),\n show: (guide) => () => {\n checkboxElement = document.querySelector(services.GuideUtils.getGuideElementSelector('autocompleteCheckbox'));\n autocompleteCheckboxClickEventHandler = () => {\n // If autocomplete is enabled go to the next step.\n services.GuideUtils.deferredShow(200)()\n .then(() => {\n if (services.GuideUtils.isGuideElementChecked('autocompleteCheckbox', ' input')) {\n guide.next();\n }\n });\n };\n // Add a listener that will complete this step and continue with the guide if checkbox is checked\n checkboxElement.addEventListener('mouseup', autocompleteCheckboxClickEventHandler);\n },\n onNextClick: (guide) => {\n if (!services.GuideUtils.isGuideElementChecked('autocompleteCheckbox', ' input')) {\n checkboxElement.click();\n }\n guide.next();\n },\n hide: () => () => {\n // Remove the listener from element. It is important when step is hidden.\n checkboxElement.removeEventListener('mouseup', autocompleteCheckboxClickEventHandler);\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Enable autocomplete',\n [CONTENT]: 'Click on the checkbox to enable the index.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Activer la saisie semi-automatique',\n [CONTENT]: 'Cliquez sur la case à cocher pour activer l\\'indexation.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst REPOSITORIES_SELECT_REPOSITORY_DEFAULT_TITLE = 'guide.step-action.select-repository';\nconst CHOOSE_REPOSITORY = 'guide.step_plugin.choose-repository.content';\nconst SELECT_REPOSITORY = 'guide.step_plugin.select-repository.content';\nconst SKIP_SECTION = 'skip-section';\nconst UNEXPECTED_ERROR_MESSAGE = 'guide.unexpected.error.message';\n\n/**\n * @name select-repository-dropdown\n * @memberof module:Interactive Guide\n *\n * @description\n * Composite step, guiding the user to select a repository from the dropdown.\n * It prompts the user to click the dropdown button and select a repository from the list.\n *\n * Click on the dropdown button example<br>\n * <img src=\"resources/guides/repository/select-repository-dropdown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select a repository from the dropdown example<br>\n * <img src=\"resources/guides/repository/select-repository-dropdown-2.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"select-repository-dropdown\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'select-repository-dropdown',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n options.mainAction = 'select-repository';\n let repositorySelectorElement;\n let mouseUpHandler;\n\n options.title = options.title ?? translate(this.translationBundle, REPOSITORIES_SELECT_REPOSITORY_DEFAULT_TITLE);\n\n return [{\n guideBlockName: 'clickable-element',\n options: {\n skipPoint: true,\n skipButtonLabel: translate(this.translationBundle, SKIP_SECTION),\n content: translate(this.translationBundle, CHOOSE_REPOSITORY),\n elementSelector: '.onto-repository-selector',\n class: 'repositories-group-button',\n onNextClick: GuideUtils.clickOnElement('.onto-repository-selector .onto-dropdown-button'),\n ...options\n }\n }, {\n guideBlockName: 'clickable-element',\n options: {\n elementSelector: () => {\n return Utils.getRepositoryElementSelector(services, options);\n },\n class: 'repository-select-button',\n advanceOn: undefined,\n beforeShowPromise: () => services.GuideUtils.waitFor(Utils.getRepositoryElementSelector(services, options), 1)\n .then((element) => repositorySelectorElement = element)\n .catch((error) => {\n services.toastr.error(translate(this.translationBundle, UNEXPECTED_ERROR_MESSAGE));\n throw (error);\n }),\n show: (guide) => () => {\n Utils.setRepositorySelectorAutoClose(false);\n const currentStep = guide.getCurrentStep();\n if (currentStep) {\n // We don't know if the user has created a repo in the previous step, or not.\n // That's why we need to update the step at the time of showing it, to know if the incremented\n // repositoryId exists. If not we default to options.repositoryIdBase\n const repositoryId = Utils.getRepositoryName(services, options);\n currentStep.updateStepOptions({\n text: translate(this.translationBundle, SELECT_REPOSITORY, {repositoryId})\n });\n }\n // Added listener to the element.\n if (repositorySelectorElement) {\n mouseUpHandler = () => guide.next();\n repositorySelectorElement.addEventListener('click', mouseUpHandler);\n }\n },\n onNextClick: () => {\n repositorySelectorElement.click();\n },\n hide: () => () => {\n Utils.setRepositorySelectorAutoClose(true);\n if (repositorySelectorElement) {\n repositorySelectorElement.removeEventListener('click', mouseUpHandler);\n }\n },\n canBePaused: false,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_SELECT_REPOSITORY_DEFAULT_TITLE]: 'Connect to repository',\n [CHOOSE_REPOSITORY]: 'Click on the repository selection dropdown.',\n [SELECT_REPOSITORY]: 'Click on the <b>{{repositoryId}}</b> repository button.',\n [SKIP_SECTION]: 'Skip section',\n [UNEXPECTED_ERROR_MESSAGE]: 'The guide was cancelled due to an unexpected error. Please run the guide again and if the problem persists contact the support.'\n },\n fr: {\n [REPOSITORIES_SELECT_REPOSITORY_DEFAULT_TITLE]: 'Se connecter au dépôt',\n [CHOOSE_REPOSITORY]: 'Cliquez sur la liste déroulante de sélection du dépôt.',\n [SELECT_REPOSITORY]: 'Cliquez sur le bouton de dépôt <b>{{repositoryId}}</b>.',\n [SKIP_SECTION]: 'Sauter la section',\n [UNEXPECTED_ERROR_MESSAGE]: 'Le guide a été annulé en raison d\\'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst COPY_TEXT = 'guide.step_plugin.core-steps.copy-text-element.copy-to-input';\nconst COPY_TEXT_ELEMENT = 'guide.step_plugin.core-steps.copy-text-element.content';\n\n/**\n * @name copy-text-element\n * @memberof module:Interactive Guide\n *\n * @description\n * Step that shows an input-like step with a code block containing provided text and a button to copy that\n * text into a target input (specified by `options.elementSelector`). It internally uses `input-element` to render the\n * step and manages attaching/removing the copy click listener when the step is shown/hidden.\n *\n * Copy text element example<br>\n * <img src=\"resources/guides/core/copy-text-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.text - The text content to display and copy into the target input.\n * @property {string} options.elementSelector - CSS selector of the target input where text will be inserted on copy.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"copy-text-element\",\n * \"options\": {\n * \"elementSelector\": \"#query-input\",\n * \"text\": \"SELECT * WHERE { ?s ?p ?o }\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'copy-text-element',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const GuideUtils = pluginService.GuideUtils;\n\n const text = options.text;\n const code = document.createElement('code');\n code.innerText = text;\n code.dataset.test = 'code-to-copy-element';\n\n const copy = document.createElement('button');\n const copyToInputQueryButtonClass = 'guide-copy-to-input-query-button';\n copy.className = `btn btn-sm btn-secondary ${copyToInputQueryButtonClass}`;\n copy.innerText = translate(this.translationBundle, COPY_TEXT);\n\n let stepHTMLElement;\n const copyToInputListener = Utils.createCopyToInputListener(GuideUtils.getElementSelector(options.elementSelector), text);\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n ...options,\n content: translate(this.translationBundle, COPY_TEXT_ELEMENT, {textAsHtmlCodeElement: '<div class=\"shepherd-code\">' + code.outerHTML + copy.outerHTML + '</div>'}),\n show: (guide) => () => {\n stepHTMLElement = guide.currentStep.el.querySelector(`.${copyToInputQueryButtonClass}`);\n stepHTMLElement.addEventListener('click', copyToInputListener);\n },\n hide: () => () => {\n if (stepHTMLElement) {\n stepHTMLElement.removeEventListener('click', copyToInputListener);\n }\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [COPY_TEXT]: 'Copy to input',\n [COPY_TEXT_ELEMENT]: 'Enter the following in the input: {{textAsHtmlCodeElement}}'\n },\n fr: {\n [COPY_TEXT]: 'Copier dans la saisie',\n [COPY_TEXT_ELEMENT]: 'Entrez le texte suivant dans la saisie : {{textAsHtmlCodeElement}}'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_SAVE_CONTENT = 'guide.step-action.visual-graph-config-save-content';\n\n/**\n * @name visual-graph-config-save\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click the save button to save the visual graph configuration.\n *\n * Save visual graph config step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-save\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-save',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('save-graph-config');\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_SAVE_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n elementSelector,\n onNextClick: GuideUtils.clickOnElement(elementSelector),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_SAVE_CONTENT]: 'Click to save the visual graph configuration.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_SAVE_CONTENT]: 'Cliquez pour enregistrer la configuration du graphique visuel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const CREATE_SIMILARITY_INDEX_DEFAULT = 'guide.step-action.create-similarity-index';\nconst CREATE_INDEX = 'guide.step_plugin.create-similarity-index.create-similarity-index';\n\n/**\n * @name similarity-click-link\n * @memberof module:Interactive Guide\n *\n * @description\n * This step highlights the \"Create Similarity index\" link and prompts the user to click it.\n *\n * Click the link to start creating a new Similarity index<br>\n * <img src=\"resources/guides/similarity-index/similarity-click-link.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-click-link\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'similarity-click-link',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CREATE_INDEX),\n title: translate(this.translationBundle, CREATE_SIMILARITY_INDEX_DEFAULT),\n class: 'similarity-index',\n disableNextFlow: true,\n ...options,\n url: 'similarity',\n elementSelector: GuideUtils.getGuideElementSelector('create-similarity-index'),\n onNextClick: () => {\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Create Similarity index',\n [CREATE_INDEX]: 'Click the link to start creating a new Similarity index'\n },\n fr: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Créer un indice de similitude',\n [CREATE_INDEX]: 'Cliquez sur le lien pour commencer à créer un nouvel indice de similitude.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst FIELD_INTRO_CONTENT = 'guide.step_plugin.connectors-lucene-fields-intro.content';\n\n/**\n * @name connectors-lucene-fields-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the fields configuration of the Lucene connector in GraphDB.\n * It provides an overview of how fields define the synchronization units between GraphDB and Lucene.\n *\n * Lucene connector fields introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, FIELD_INTRO_CONTENT),\n scrollOffset: GuideUtils.SCROLL_OFFSET.CENTER,\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [FIELD_INTRO_CONTENT]: 'The fields define exactly what parts of each entity will be synchronized as well as the specific details on the connector side. The field is the smallest synchronization unit, and it maps a property chain from GraphDB to a field in Lucene. The fields are specified as a list of field objects. At least one field object is required.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [FIELD_INTRO_CONTENT]: 'Les champs définissent exactement quelles parties de chaque entité seront synchronisées ainsi que les détails spécifiques du côté du connecteur. Le champ est la plus petite unité de synchronisation et il mappe une chaîne de propriétés de GraphDB vers un champ dans Lucene. Les champs sont spécifiés sous forme de liste d’objets champ. Au moins un objet champ est requis.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorContentSelector, getConnectorNameSelector, getConnectorParameterSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst PARAMETER_INTRO = 'guide.step_plugin.connectors-parameter-intro.content';\n\n/**\n * @name connectors-parameter-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step showcases a parameter of a connector instance.\n *\n * Connectors parameter introduction<br>\n * <img src=\"resources/guides/connectors/connectors-parameter-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the parameter is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n * @property {string} parameterName - the specific creation parameters name for <code>instanceName</code>.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-parameter-intro\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\",\n * \"parameterName\": \"hosts\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-parameter-intro',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n * - <b>parameterName</b>: string (required) – the specific creation parameters name for <code>instanceName</code>.\n */\n getSteps: function(options, services) {\n const translate = services.translate;\n const connectorNameSelector = getConnectorNameSelector(options, services);\n const connectorContentSelector = getConnectorContentSelector(options, services);\n const parameterSelector = getConnectorParameterSelector(options, services);\n return [{\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-connector-intro',\n content: translate(this.translationBundle, PARAMETER_INTRO),\n ...options,\n elementSelector: `${connectorNameSelector} ${connectorContentSelector} ${parameterSelector}`,\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [PARAMETER_INTRO]: 'The creation parameters for luc:createConnector define how a connector instance is created. They are provided in a JSON object with parameter names as keys. Some parameters are required, others optional, and values can be simple types, lists, or objects.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [PARAMETER_INTRO]: 'Les paramètres de création pour luc:createConnector définissent comment une instance de connecteur est créée. Ils sont fournis dans un objet JSON avec les noms des paramètres comme clés. Certains paramètres sont obligatoires, d\\'autres optionnels, et les valeurs peuvent être des types simples, des listes ou des objets.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst READONLY_INTRO = 'guide.step_plugin.connectors-lucene-readonly-intro.content';\n\n/**\n * @name connectors-lucene-readonly-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Readonly\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Readonly\" option in setting the connector to read-only mode.\n *\n * Lucene connector readonly introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-readonly-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-readonly-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-readonly-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, READONLY_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-readonly-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'readonly'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [READONLY_INTRO]: 'The <b>Readonly</b> option puts the connector in read-only mode. In this mode, the connector indexes data only at creation time and does not respond to updates. Reindexing requires repair or recreation.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [READONLY_INTRO]: 'L’option <b>Lecture seule</b> met le connecteur en mode lecture seule. Dans ce mode, le connecteur indexe les données uniquement lors de la création et ne répond pas aux mises à jour. Le réindexage nécessite une réparation ou une recréation.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\nimport {BASIC_STEP} from '../config.js';\n\n/**\n * @name input-element\n * @memberof module:Interactive Guide\n *\n * @description\n * Focuses a specific input element and allows the user to type into it.\n *\n * Input element example<br>\n * <img src=\"resources/guides/core/input-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"input-element\",\n * \"options\": {\n * \"elementSelector\": \"#query-input\",\n * \"content\": \"Type your query here.\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'input-element',\n getStep: (options, services) => {\n const notOverridable = {\n type: 'input'\n };\n const stepDescription = {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n ...options,\n ...notOverridable\n };\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(services, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\n\nconst GUIDE_END_TITLE = 'guide.step_plugin.guide-ended.title';\nconst GUIDE_END_CONTENT = 'guide.step_plugin.guide-ended.content';\n/**\n * @name guide-end\n * @memberof module:Interactive Guide\n *\n * @description\n * Final step indicating the guide has ended.\n *\n * Final step example<br>\n * <img src=\"resources/guides/core/guide-end.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} [options.title] - A custom title for the final step.\n * @property {string} [options.content] - A custom content/message for the final step.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"guide-end\",\n * \"options\": {\n * \"title\": \"All done!\",\n * \"content\": \"You have completed the guide.\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'guide-end',\n getStep: function(options, pluginService) {\n const translate = pluginService.translate;\n const notOverridable = {\n type: 'readonly',\n title: options.title || translate(this.translationBundle, GUIDE_END_TITLE),\n content: options.content || translate(this.translationBundle, GUIDE_END_CONTENT),\n lastStep: true\n };\n return {\n ...BASIC_STEP,\n initPreviousStep: pluginService.GuideUtils.defaultInitPreviousStep,\n ...options,\n ...notOverridable\n };\n },\n translationBundle: {\n en: {\n [GUIDE_END_TITLE]: 'End of guide',\n [GUIDE_END_CONTENT]: 'This guide has ended.'\n },\n fr: {\n [GUIDE_END_TITLE]: 'Fin du guide',\n [GUIDE_END_CONTENT]: 'Ce guide est terminé.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name Options\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * Common options for configuring a guide step. These options control the behavior\n * and appearance of steps within a guide and applied to all steps.\n *\n * Individual steps can define additional options on top of these common ones as needed.\n *\n * The options object contains settings, parameters, and configurations passed from\n * the guide definition, and they are used by the step to determine its behavior,\n * content, and placement.\n *\n *\n * @property {string} translatedGuideName - The translated name of the interactive guide to which this step belongs.\n * Represents the localized name of the guide currently in progress.\n * @property {string} translatedGuideDescription - The translated description of the interactive guide to which this step belongs.\n * Represents the localized description of the guide currently in progress.\n * @property {string} title - A string that will be displayed as the step title in the dialog header.\n * @property {string} content - The main content displayed in the dialog body.\n * @property {string} extraContent - A string displayed as additional content below the main content in the dialog body.\n * @property {string} [elementSelector] - A CSS selector for the element that should be highlighted when this step is active.\n * @property {string} [placement='bottom'] - A string that defines where the step dialog should be placed\n * relative to the highlighted element:\n * - auto | auto-start | auto-end\n * - top | top-start | top-end\n * - bottom | bottom-start | bottom-end\n * - right | right-start | right-end\n * - left | left-start | left-end\n * @property {string} [url] - A string that defines the URL where the step should be active.\n * If the current URL does not match the step URL, the guide will navigate to the step URL\n * before activating the step.\n * @property {number} [maxWaitTime=3] - The maximum time (in seconds) to wait for the element to appear on the screen.\n * @property {boolean} [disablePreviousFlow=true] - A boolean that defines whether the user can go back to the previous step.\n * @property {boolean} [skipPoint=false] - A boolean that defines whether this step can be used as a skip point. When true, a \"Skip\" button will appear\n * in the dialog, allowing the user to skip the guide from this point. When clicked, the guide will continue at\n * the next step marked as a skip point. If no further skip points are defined, the guide will be finished.\n * @property {string} [className] - A string that defines additional CSS classes to be added to the step dialog.\n * @property {Object} [skipButtonLabel] - The bundle object, containing the label for the skip button in different languages.\n * ```javascript\n * skipButtonLabel = {\n * en: 'Skip',\n * fr: 'Sauter'\n * };\n * ```\n */\nexport class Options {\n translatedGuideName = '';\n translatedGuideDescription = '';\n title = '';\n content = '';\n extraContent = '';\n elementSelector = undefined;\n placement = 'bottom';\n url = undefined;\n maxWaitTime = 3;\n disablePreviousFlow = true;\n skipPoint = false;\n skipButtonLabel = {\n en: 'Skip',\n fr: 'Sauter'\n };\n class = '';\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst IMPORT_FILE = 'guide.step_plugin.connectors-lucene-import-file-intro.content';\n\n/**\n * @name connectors-lucene-import-file-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"importFile\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"importFile\" parameter, which allows creating a connector from an RDF file.\n *\n * Lucene connector importFile introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-import-file-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-import-file-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-import-file-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, IMPORT_FILE),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-import-file-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'importFile'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [IMPORT_FILE]: 'The <b>importFile</b> parameter creates the connector from an RDF file. Requires <b>readonly</b> mode; the value must be the full path to the RDF file.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [IMPORT_FILE]: 'Le paramètre <b>importFile</b> crée le connecteur à partir d’un fichier RDF. Nécessite le mode <b>lecture seule</b> ; la valeur doit être le chemin complet vers le fichier RDF.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_CLICK_TAB_CONTENT = 'guide.step-action.visual-graph-config-click-tab';\nconst TAB_1 = 'guide.step-visual-graph-config-tab.1';\nconst TAB_2 = 'guide.step-visual-graph-config-tab.2';\nconst TAB_3 = 'guide.step-visual-graph-config-tab.3';\nconst TAB_4 = 'guide.step-visual-graph-config-tab.4';\nconst TAB_5 = 'guide.step-visual-graph-config-tab.5';\n\nconst TAB_CONFIG = {\n startingPoint: {index: 1, translationKey: TAB_1},\n graphExpansion: {index: 2, translationKey: TAB_2},\n nodeBasics: {index: 3, translationKey: TAB_3},\n edgeBasics: {index: 4, translationKey: TAB_4},\n nodeExtra: {index: 5, translationKey: TAB_5}\n};\n\n/**\n * @name visual-graph-config-click-tab\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click on a specific tab in the Visual Graph configuration page.\n * The step will be skipped if the tab is already active.<br>\n *\n * Click on a config tab step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-click-tab.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} options.tabName - The name of the tab to click. Must be one of `startingPoint`, `graphExpansion`, `nodeBasics`, `edgeBasics`, or `nodeExtra`.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-click-tab\",\n * \"options\": {\n * \"tabName\": \"startingPoint\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-click-tab',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const tabConfig = TAB_CONFIG[options.tabName];\n const tab = translate(this.translationBundle, tabConfig.translationKey);\n const elementSelector = GuideUtils.getGuideElementSelector(`graph-config-tab-${tabConfig.index}`);\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_CLICK_TAB_CONTENT, {tab}),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n elementSelector: GuideUtils.getGuideElementSelector(`graph-config-tab-${tabConfig.index}`),\n ...options,\n onNextClick: () => {\n document.querySelector(elementSelector)?.click();\n },\n showOn: () => {\n const element = document.querySelector(elementSelector);\n return !element?.classList?.contains('active');\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_CLICK_TAB_CONTENT]: 'Click on the <b>{{tab}}</b> tab',\n [TAB_1]: 'Starting point',\n [TAB_2]: 'Graph expansion',\n [TAB_3]: 'Node basics',\n [TAB_4]: 'Edge basics',\n [TAB_5]: 'Node extra'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_CLICK_TAB_CONTENT]: 'Cliquez sur l\\'onglet <b>{{tab}}</b>',\n [TAB_1]: 'Point de départ',\n [TAB_2]: 'Expansion du graphique',\n [TAB_3]: 'Bases des nœuds',\n [TAB_4]: 'Bases des arêtes',\n [TAB_5]: 'Extra des nœuds'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst DISABLE_TOGGLE = 'guide.step_plugin.sparql-search-method.disable-toggle';\n\n/**\n * @name ttyg-sparql-method-disable\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is used to disable the SPARQL search method in the TTYG plugin.\n * It is a clickable step, which means that the user can disable the switch, but enabling will not be allowed.\n *\n * Disable SPARQL query search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-disable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * guideBlockName: 'ttyg-sparql-method-disable',\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-method-disable',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-sparql_search-input');\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n content: translate(this.translationBundle, DISABLE_TOGGLE),\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n class: 'toggle-sparql-search',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-sparql_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(!GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [DISABLE_TOGGLE]: 'Click on the toggle to disable SPARQL search query method.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [DISABLE_TOGGLE]: 'Cliquez sur le bouton pour désactiver la méthode de recherche SPARQL..'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_TITLE = 'view.resource.title';\nconst RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_CONTENT = 'guide.step_plugin.resource-click-on-visual-graph-button.content';\n/**\n * @name resource-click-on-visual-graph-button\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-click-on-visual-graph-button` guide step guides the user to click on the Visual Graph button\n * in the resource view.\n *\n * <img src=\"resources/guides/resource/resource-click-on-visual-graph-button.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-click-on-visual-graph-button\",\n * \"options\": {\n * \"skipUrl\": false\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-click-on-visual-graph-button',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_CONTENT),\n title: translate(this.translationBundle, RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_TITLE),\n ...options,\n ...(options.skipUrl ? {} : {url: Utils.getResourceURL(options)}),\n elementSelector: GuideUtils.getGuideElementSelector('explore-visual'),\n class: 'resource-click-on-visual-graph-button',\n onNextClick: (guide, step) => {\n GuideUtils.waitFor(step.elementSelector, 3)\n .then(() => document.querySelector(step.elementSelector).click());\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_TITLE]: 'Resource',\n [RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_CONTENT]: 'Click on the <b>Visual graph</b> button.'\n },\n fr: {\n [RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_TITLE]: 'Ressource',\n [RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_CONTENT]: 'Cliquez sur le bouton <b>Graphique visuel</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst ADD_MISSING_NAMESPACES = 'guide.step_plugin.sparql-search-method.add-missing-namespaces';\n/**\n * @name ttyg-sparql-click-add-namespaces\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is used to guide users to enable the \"Add missing namespaces\" option in the TTYG agent SPARQL query settings.\n * It is a toggle step, which means that the user can enable the switch, but disabling will not be allowed.\n *\n * TTYG SPARQL add missing namespaces option<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-click-add-namespaces.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * guideBlockName: 'ttyg-sparql-click-add-namespaces',\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-click-add-namespaces',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE);\n const namespacesCheckbox = GuideUtils.getGuideElementSelector('add-missing-namespaces-input');\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n title,\n content: translate(this.translationBundle, ADD_MISSING_NAMESPACES),\n class: 'enable-sparql-query',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('add-missing-namespaces-option'),\n toggleableElementSelector: namespacesCheckbox,\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(namespacesCheckbox))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [ADD_MISSING_NAMESPACES]: 'Check to automatically add missing namespaces.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [ADD_MISSING_NAMESPACES]: 'Cochez pour ajouter automatiquement les espaces de noms manquants.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name ask-ttyg-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that may show a sequence of steps to guide the user through asking a question to a TTYG agent,\n * explaining the response, exploring SPARQL queries, and asking for more explanations. The difference between this and\n * the `ttyg-ask-question` step is that this step may include explanation and exploring SPARQL queries\n *\n * Ask an individual question<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-question.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Wait for the response<br>\n * <img src=\"resources/guides/ttyg/ttyg-wait-for-response.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Explain the response<br>\n * <img src=\"resources/guides/ttyg/ttyg-explain-response.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Explore the SPARQL query<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-agent-explore-sparql.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Ask for more explanation<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-explain-answer-more.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} [options.question] - The question to be asked to the TTYG agent. This will be displayed in the instructions.\n * @property {boolean} [options.explain] - Whether to include the explanation step after asking the question.\n * @property {boolean} [options.explainMore] - Whether to include the step for asking more explanation after the explanation step.\n * @property {boolean} [options.exploreSparql] - Whether to include the step for exploring the SPARQL query after the explanation step.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ask-ttyg-agent\",\n * \"options\": {\n * \"question\": \"Count all the web pages published in 2020? Provide five sample names.\",\n * \"explain\": true,\n * \"explainMore\": true,\n * \"exploreSparql\": true\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ask-ttyg-agent',\n getSteps: (options) => {\n options.mainAction = 'ask-ttyg-agent';\n options.maxWaitTime = 10;\n options.forceReload = false;\n\n const explain = options.explain;\n const explainMore = options.explainMore;\n const exploreSparql = options.exploreSparql;\n\n const steps = [\n {\n guideBlockName: 'ttyg-ask-question', options: {...options, skipPoint: true}\n }\n ];\n\n if (explain) {\n steps.push(\n {\n guideBlockName: 'ttyg-explain-response', options: {...options}\n }\n );\n }\n\n if (explain && exploreSparql) {\n steps.push(\n {\n guideBlockName: 'ttyg-ask-agent-explore-sparql', options: {...options}\n }\n );\n }\n\n if (explain && explainMore) {\n steps.push(\n {\n guideBlockName: 'ttyg-ask-explain-answer-more', options: {...options}\n }\n );\n }\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst VALUE_FILTER_INTRO = 'guide.step_plugin.connectors-lucene-fields-value-filter-intro.content';\n\n/**\n * @name connectors-lucene-fields-value-filter-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Value Filter\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Value Filter\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector value filter introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-value-filter-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-value-filter-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-value-filter-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, VALUE_FILTER_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-value-filter-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'valueFilter'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [VALUE_FILTER_INTRO]: 'The <b>Value filter</b> specifies the filter applied to values for this field.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [VALUE_FILTER_INTRO]: 'Le <b>filtre de valeurs</b> spécifie le filtre appliqué aux valeurs de ce champ.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.similarity-search-method';\n\n/**\n * @name similarity-search-method\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through enabling or disabling the Similarity search query method in the TTYG interface.\n * It includes steps to provide information about the Similarity search method, enable it if it's disabled, or disable it if it's enabled.\n * If disabled, it will show only the step to disable it. If not disabled, it will show the steps to enable it and select the index to use.\n *\n * Disable Similarity search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-toggle-off.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Show information about Similarity search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enable Similarity search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-toggle-on.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select index for Similarity search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-select-index.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following specific options:\n *\n * @property {boolean} [options.disable] - If true, the step will guide the user to disable the Similarity search method. If false or not provided, it will guide to enable it.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-search-method\",\n * \"options\": {\n * \"disable\": false\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'similarity-search-method',\n getSteps: function(options, services) {\n options.mainAction = 'similarity-search-method';\n const translate = services.translate;\n options.title = options.title ?? translate(this.translationBundle, SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE);\n\n const shouldToggleOff = options.disable;\n\n if (shouldToggleOff) {\n return [{\n guideBlockName: 'ttyg-similarity-toggle-off', options: {...options}\n }];\n }\n\n return [\n {\n guideBlockName: 'ttyg-similarity-info-message', options: {...options}\n },\n {\n guideBlockName: 'ttyg-similarity-toggle-on', options: {...options}\n },\n {\n guideBlockName: 'ttyg-similarity-select-index', options: {...options}\n }\n ];\n },\n translationBundle: {\n en: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Similarity search query method'\n },\n fr: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche par similarité'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst TYPES_INTRO = 'guide.step_plugin.connectors-lucene-types-intro.content';\n\n/**\n * @name connectors-lucene-types-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Types\" parameter within the Lucene connector configuration in GraphDB.\n * It explains the purpose and usage of the \"Types\" option in specifying RDF types of entities to synchronize.\n *\n * Lucene connector types introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-types-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-types-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-types-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, TYPES_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-types-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'types'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [TYPES_INTRO]: 'The <b>Types</b> option specifies RDF types of entities to synchronize, given as a list of IRIs (at least one required).<ul>Special values: <li><b>$any</b>: sync entities with at least one RDF type.</li><li><b>$untyped</b>: sync entities even if they have no RDF type.</li></ul>'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [TYPES_INTRO]: 'L’option <b>Types</b> spécifie les types RDF des entités à synchroniser, sous forme de liste d’IRI (au moins un requis).<ul>Valeurs spéciales : <li><b>$any</b> : synchronise les entités ayant au moins un type RDF.</li><li><b>$untyped</b> : synchronise les entités même si elles n’ont pas de type RDF.</li></ul>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-class-list-intro.content';\n\n/**\n * @name class-relationships-class-list-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-class-list-intro` step displays a dialog that explains class dependency table in\n * the Class relationships view.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-class-list-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-class-list-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-class-list-intro',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('class-list-wrapper'),\n placement: 'right',\n class: 'class-relationships-class-list-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'The left panel shows all classes, sorted by number of links, displaying both incoming and outgoing connections.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Le panneau de gauche montre toutes les classes, triées par nombre de liens, affichant les connexions entrantes et sortantes.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst CONFIGURE_USER_INSTRUCTIONS = 'guide.step_plugin.configure-agent.user-instructions-input';\n\n/**\n * @name configure-agent-additional-instructions\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to add additional instructions for the TTYG agent.\n * It highlights the input area where the user can type their instructions and provides a text to copy\n *\n * * Add additional instructions<br>\n * <img src=\"resources/guides/ttyg/configure-agent-additional-instructions.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n * @property {string} [userInstructions] - The additional instructions to be passed to the agent. This will be displayed in the instructions.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-agent-additional-instructions\",\n * \"options\": {\n * \"userInstructions\": \"When writing SPARQL queries, please do not bind inside the query select clause. Also add all prefix definitions when writing the query\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-agent-additional-instructions',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'copy-text-element',\n options: {\n extraContent: translate(this.translationBundle, CONFIGURE_USER_INSTRUCTIONS),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n class: 'input-user-instructions',\n disablePreviousFlow: false,\n text: options.userInstructions,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('user-instructions'),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(GuideUtils.getGuideElementSelector('user-instructions'), options.userInstructions, false))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [CONFIGURE_USER_INSTRUCTIONS]: 'Those are additional instructions which will be passed to the agent.'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [CONFIGURE_USER_INSTRUCTIONS]: 'Ce sont des instructions supplémentaires qui seront transmises à l\\'agent.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst BOOST_PROPERTIES = 'guide.step_plugin.connectors-lucene-boost-properties-intro.content';\n\n/**\n * @name connectors-lucene-boost-properties-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"boostProperties\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"boostProperties\" in specifying document-specific boost properties.\n *\n * Lucene connector boost properties introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-boost-properties-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-boost-properties-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-boost-properties-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, BOOST_PROPERTIES),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-boost-properties-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'boostProperties'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [BOOST_PROPERTIES]: 'The <b>boostProperties</b> parameter specifies a comma-delimited list of properties whose values will be used for document-specific boost.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [BOOST_PROPERTIES]: 'Le paramètre <b>boostProperties</b> spécifie une liste de propriétés séparées par des virgules dont les valeurs seront utilisées pour un boost spécifique au document.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst REPOSITORY_ID_CONTENT = 'guide.step_plugin.create_repository.repository_id.content';\n\n/**\n * @name repositories-id-input\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enter a repository ID.\n *\n * Repository ID input step<br>\n * <img src=\"resources/guides/repository/repositories-id-input.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Takes repositoryId from\n * repositoryIdBase + index if needed\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-id-input\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-id-input',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const repositoryIdInputSelector = GuideUtils.getGuideElementSelector('graphDBRepositoryIdInput');\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, REPOSITORY_ID_CONTENT, {repositoryId: options.repositoryId}),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'gdb-repository-id-input',\n ...options,\n url: 'repository/create/graphdb',\n elementSelector: repositoryIdInputSelector,\n disablePreviousFlow: false,\n onNextValidate: () =>\n Promise.resolve(\n GuideUtils.validateTextInput(\n repositoryIdInputSelector,\n options.repositoryId\n )\n )\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [REPOSITORY_ID_CONTENT]: 'Enter repository ID: <b>{{repositoryId}}.</b>'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [REPOSITORY_ID_CONTENT]: 'Entrez l\\'ID du dépôt : <b>{{repositoryId}}.</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\n\n/**\n * @name visual-graph-config-create\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through the full process of creating a new visual graph configuration.\n * It includes navigating to the visual graph page, creating and naming the configuration, optionally adding a description\n * and hint, configuring tabs with starting points, SPARQL queries, or resource IRIs, and saving the configuration.\n *\n * The step sequence is dynamic and depends on the provided options. Some steps are always included, while others\n * appear only when certain options are provided.\n *\n * **Always included steps:**\n *\n * Navigate to the visual graph page via the Explore main menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-explore.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click the button to create a new configuration<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-create-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enter a name for the configuration<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Introduction to the starting point configuration<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * **Optional steps (based on options):**\n *\n * Enter a description for the configuration (when `options.configDescription` is provided)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-description.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enter a hint IRI for the configuration (when `options.configHint` is provided)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-hint.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * **Tab configuration steps (based on `options.tabConfig`):**\n *\n * If `options.tabConfig` is not provided or is empty, the step sequence ends after the starting point intro.\n * Otherwise, for each entry in the `tabConfig` array, the following steps are added:\n *\n * Click on a configuration tab (skipped if the tab is already active)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-click-tab.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select a starting point type (when `tabConfig.startingPoint` is provided)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-search.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-fixed.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-query.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Search for a resource IRI (when `tabConfig.iri` and `tabConfig.searchTerm` are provided).\n * **Cannot be combined with `tabConfig.query`** — only one of `iri`/`searchTerm` or `query` should be set per tab config entry.<br>\n * <img src=\"resources/guides/resource/resource-search-rdf.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select the resource from autocomplete results<br>\n * <img src=\"resources/guides/resource/resource-search-autocomplete-item.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enter a SPARQL query (when `tabConfig.query` is provided).\n * **Cannot be combined with `tabConfig.iri`/`tabConfig.searchTerm`** — only one of `query` or `iri`/`searchTerm` should be set per tab config entry.<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Toggle include inferred data (when `tabConfig.includeInferredData` is provided)<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-include-inferred-data.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Toggle expand results over owl:sameAs (when `tabConfig.expandResultsOverOwl` is provided)<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-expand-results-over-owl.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * View sample queries (when `tabConfig.sampleQueryContent` is provided)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-sample-query.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * **Post-configuration steps (only when `options.tabConfig` is provided):**\n *\n * Share the configuration with other users (when `options.shareConfig` is `true`)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-share.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Save the configuration<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select the newly created configuration<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Open graph settings<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-settings-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Set the maximum number of links<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-set-maximum-links.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Save the graph settings<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-settings-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Expand a node in the visual graph (when `options.expandIri` is provided)<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-expand.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Zoom the visual graph<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-zoom.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} [options.configDescription] - Optional. The description for the configuration. When provided, the description step is included.\n * @property {string} [options.configHint] - Optional. The hint IRI for the configuration. When provided, the hint step is included.\n * @property {boolean} [options.shareConfig] - Optional. When `true`, the share configuration step is included.\n * @property {Object[]} [options.tabConfig] - Optional. An array of tab configuration objects. When not provided or empty, the step ends early without saving.\n * @property {string} options.tabConfig[].tabName - The name of the tab to click. Must be one of `startingPoint`, `graphExpansion`, `nodeBasics`, `edgeBasics`, or `nodeExtra`.\n * @property {string} [options.tabConfig[].startingPoint] - Optional. The starting point type to select.\n * @property {string} [options.tabConfig[].iri] - Optional. The IRI of the resource to search for. Must be used together with `searchTerm`. Cannot be used together with `query`.\n * @property {string} [options.tabConfig[].searchTerm] - Optional. The search term used to find the resource. Must be used together with `iri`. Cannot be used together with `query`.\n * @property {string} [options.tabConfig[].query] - Optional. The SPARQL query to enter. Cannot be used together with `iri`/`searchTerm`.\n * @property {boolean} [options.tabConfig[].includeInferredData] - Optional. When provided, the include inferred data step is shown.\n * @property {boolean} [options.tabConfig[].expandResultsOverOwl] - Optional. When provided, the expand results over owl:sameAs step is shown.\n * @property {string} [options.tabConfig[].sampleQueryContent] - Optional. When provided, the sample query step is shown with this content.\n * @property {number} [options.linkLimit] - The maximum number of links to set in the graph settings.\n * @property {string} [options.expandIri] - Optional. The IRI of the node to expand in the visual graph. When provided, the expand step is included.\n * @property {string} [options.iriLabel] - Optional. The label to display for the node to expand. When provided, the expand step is included.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-create\",\n * \"options\": {\n * \"configDescription\": \"A visual graph for exploring RDF data.\",\n * \"configHint\": \"http://example.org/resource\",\n * \"shareConfig\": true,\n * \"expandIri\": \"https://swapi.co/resource/Human/6/\",\n * \"iriLabel\": \"Leia Organa\",\n * \"linkLimit\": 20,\n * \"tabConfig\": [\n * {\n * \"tabName\": \"startingPoint\",\n * \"startingPoint\": \"fixed\",\n * \"searchTerm\": \"luke\",\n * \"iri\": \"https://swapi.co/resource/human/1\"\n * },\n * {\n * \"tabName\": \"graphExpansion\",\n * \"query\": \"PREFIX wev: <http://weverify.eu/ontology/>\\nPREFIX schema: <http://schema.org/>\\nconstruct {\\n ?node ?p ?o .\\n ?s ?p ?node .\\n} where {\\n values ?p {\\n schema:hasPart\\n schema:appearance\\n schema:itemReviewed\\n schema:mentionedIn\\n schema:author\\n schema:publisher\\n }\\n { ?node ?p ?o . filter not exists {?o a wev:SupportingEvidence . } }\\n union\\n { ?s ?p ?node . }\\n}\",\n * \"queryExtraContent\": \"The graph expansion query defines what happens when a node is expanded in the visual graph. Expanding a node loads additional resources connected to it and adds them to the graph as new nodes and edges.\",\n * \"sampleQueryContent\": \"The <b>Sample queries</b> includes example graph expansion queries. <b>Unfiltered object properties</b> shows all object property connections of a node, while <b>Filtered object properties</b> shows only selected ones.\",\n * \"includeInferredData\": true,\n * \"expandResultsOverOwl\": true\n * },\n * {\n * \"tabName\": \"nodeBasics\",\n * \"query\": \"PREFIX skos: <http://www.w3.org/2004/02/skos/core#>\\nPREFIX : <http://data.europa.eu/949/>\\nselect * {\\n ?node :opType/skos:prefLabel ?type\\n filter (lang(?type)=\\\"en\\\")\\n ?node :opName ?name; :uopid ?id\\n bind(concat(?name,\\\"\\\\n\\\",?type,\\\": \\\",?id) as ?label)\\n}\",\n * \"queryExtraContent\": \"The <b>Node basics</b> query retrieves basic properties of a node and maps them to visual attributes such as label, type, description, and rank used when rendering the node in the graph.\",\n * \"sampleQueryContent\": \"The Sample queries includes ready examples of Node basics queries. Direct type only uses only the node’s type to determine its color. Direct type, label and rank also retrieves a label to display as the node name and a rank value that controls the node size.\"\n * },\n * {\n * \"tabName\": \"edgeBasics\",\n * \"query\": \"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\\nPREFIX skos: <http://www.w3.org/2004/02/skos/core#>\\n\\nSELECT ?label {\\n ?edge rdfs:label | skos:prefLabel ?label .\\n}\",\n * \"queryExtraContent\": \"This Edge Basics defines the text shown on the edges in the visual graph. It retrieves a label for each relationship so that the edge displays a clear name instead of the full predicate IRI.\",\n * \"sampleQueryContent\": \"The Sample queries provides example queries for retrieving labels for edges. RDFS or SKOS label displays the label stored in rdfs:label or skos:prefLabel. RDFS or SKOS label in English displays the label only when it is available in English.\"\n * },\n * {\n * \"tabName\": \"nodeExtra\",\n * \"query\": \"SELECT ?property ?value {\\n ?node ?property ?value .\\nFILTER(isLiteral(?value))\\n}\",\n * \"queryExtraContent\": \"This Node extra defines the text shown on the nodes in the visual graph. It retrieves a label for each relationship so that the edge displays a clear name instead of the full predicate IRI.\",\n * \"sampleQueryContent\": \"The Sample queries provides examples for retrieving node details. Datatype properties shows properties with literal values, while Image and datatype properties also includes an image URL.\"\n * }\n * ]\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-create',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n options.title = options.title ?? translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE);\n\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'visual-graph',\n showIntro: true,\n ...options\n }\n },\n {\n guideBlockName: 'visual-graph-config-create-click',\n options: {...options}\n },\n {\n guideBlockName: 'visual-graph-config-name',\n options: {...options}\n }\n ];\n\n const configDescription = options.configDescription;\n if (configDescription) {\n steps.push({\n guideBlockName: 'visual-graph-config-description',\n options: {...options}\n });\n }\n\n const configHint = options.configHint;\n if (configHint) {\n steps.push({\n guideBlockName: 'visual-graph-config-hint',\n options: {...options}\n });\n }\n\n steps.push({\n guideBlockName: 'visual-graph-config-starting-point-intro',\n options: {...options}\n });\n\n if (!options.tabConfig?.length) {\n // If we don't configure the graph, we can't proceed to save and view it\n return steps;\n }\n\n (options.tabConfig ?? []).forEach((tabConfig) => {\n // each tab config represents a tab click and the related steps to add in that specific tab\n steps.push({\n guideBlockName: 'visual-graph-config-click-tab',\n options: {\n scrollOffset: GuideUtils.SCROLL_OFFSET.START,\n ...options,\n ...tabConfig\n }\n });\n\n if (tabConfig.startingPoint) {\n steps.push({\n guideBlockName: 'visual-graph-config-starting-point',\n options: {...options, ...tabConfig}\n });\n }\n\n // we can't have iri and query at the same time. They are not simultaneously available in the view\n if (tabConfig.iri && tabConfig.searchTerm) {\n steps.push({\n guideBlockName: 'resource-search-rdf',\n options: {\n url: 'graphs-visualizations/config/save',\n ...options,\n ...tabConfig\n }\n });\n steps.push({\n guideBlockName: 'resource-search-autocomplete-item',\n options: {\n url: 'graphs-visualizations/config/save',\n ...options,\n ...tabConfig\n }\n });\n } else if (tabConfig.query) {\n steps.push({\n guideBlockName: 'sparql-editor',\n options: {\n url: 'graphs-visualizations/config/save',\n scrollOffset: GuideUtils.SCROLL_OFFSET.CENTER,\n ...options,\n ...tabConfig\n }\n });\n }\n\n if (tabConfig.includeInferredData) {\n steps.push({\n guideBlockName: 'sparql-editor-include-inferred-data',\n options: {\n url: 'graphs-visualizations/config/save',\n ...options,\n ...tabConfig\n }\n });\n }\n\n if (tabConfig.expandResultsOverOwl) {\n steps.push({\n guideBlockName: 'sparql-editor-expand-results-over-owl',\n options: {\n url: 'graphs-visualizations/config/save',\n ...options,\n ...tabConfig\n }\n });\n }\n\n if (tabConfig.sampleQueryContent) {\n steps.push({\n guideBlockName: 'visual-graph-config-sample-query',\n options: {\n ...options,\n ...tabConfig,\n content: tabConfig.sampleQueryContent\n }\n });\n }\n });\n\n if (options.shareConfig) {\n steps.push({\n guideBlockName: 'visual-graph-config-share',\n options: {...options}\n });\n }\n\n steps.push({\n guideBlockName: 'visual-graph-config-save',\n options: {...options}\n });\n\n steps.push({\n guideBlockName: 'visual-graph-config-select',\n options: {...options}\n });\n\n if (options.linkLimit) {\n steps.push({\n guideBlockName: 'visual-graph-set-maximum-links',\n options: {...options}\n });\n }\n\n if (options.expandIri) {\n steps.push({\n guideBlockName: 'visual-graph-expand',\n options: {\n ...options,\n iri: options.expandIri,\n url: undefined\n }\n });\n }\n\n steps.push({\n guideBlockName: 'visual-graph-zoom',\n options: {...options}\n });\n\n return steps;\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {disableAllVisualGraphNodes, enableAllVisualGraphNodes} from '../utils.js';\n\nconst VISUAL_GRAPH_NODE_FOCUS_DEFAULT_TITLE = 'guide.step_plugin.visual-graph-node-focus.title';\nconst VISUAL_GRAPH_NODE_FOCUS_CONTENT = 'guide.step_plugin.visual-graph-node-focus.content';\n\n/**\n * @name visual-graph-node-focus\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-node-focus` guide step explains RDF resources in the Visual Graph.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-node-focus.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is available:\n *\n * @property {string} [options.iri] - The IRI used in this step.\n * @property {string} [options.iriLabel] - Label for predicate.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-node-focus\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\",\n * \"iriLabel\": \"my resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-node-focus',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const $rootScope = services.$rootScope;\n const translate = services.translate;\n const elementSelector = `.node-wrapper[id^=\"${options.iri}\"] circle`;\n\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_NODE_FOCUS_DEFAULT_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_NODE_FOCUS_CONTENT, {iriLabel: options.iriLabel}),\n url: 'graphs-visualizations',\n canBePaused: false,\n elementSelector,\n class: 'visual-graph-node-focus',\n show: disableAllVisualGraphNodes,\n hide: enableAllVisualGraphNodes,\n beforeShowPromise: GuideUtils.awaitAlphaDropD3(elementSelector, $rootScope),\n initPreviousStep: (services, stepId) => {\n if (GuideUtils.isVisible(elementSelector)) {\n return Promise.resolve();\n }\n\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.id);\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_NODE_FOCUS_DEFAULT_TITLE]: 'Visual graph nodes',\n [VISUAL_GRAPH_NODE_FOCUS_CONTENT]: 'A circle represents an RDF resource. In this case, <b>{{iriLabel}}</b>.'\n },\n fr: {\n [VISUAL_GRAPH_NODE_FOCUS_DEFAULT_TITLE]: 'Nœuds de graphique visuel',\n [VISUAL_GRAPH_NODE_FOCUS_CONTENT]: 'Un cercle représente une ressource RDF. Dans ce cas, <b>{{iriLabel}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_DEFAULT_TITLE = 'visual.graph.label';\nconst VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_CONTENT = 'guide.step_plugin.visual_graph_input_IRI.content';\n\n/**\n * @name visual-graph-search-rdf-resources-input\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-search-rdf-resources-input` step guides the user to enter an IRI in the Easy graph search input<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-search-rdf-resources-input.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} [options.easyGraphInputText] - The text to be entered in the Easy graph text input.\n */\nconst step = {\n // TODO: Refactor this to use the generic resource-search-rdf.js or remove completely in favor of that step\n guideBlockName: 'visual-graph-search-rdf-resources-input',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n // Title comes from options.title when provided, otherwise use translated default\n title: translate(this.translationBundle, VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_DEFAULT_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_CONTENT, {easyGraphInputText: options.easyGraphInputText}),\n forceReload: true,\n url: 'graphs-visualizations',\n elementSelector: GuideUtils.getGuideElementSelector('graphVisualisationSearchInputNotConfigured', ' input'),\n class: 'visual-graph-input-iri',\n onNextValidate: (step) => Promise.resolve(GuideUtils.validateTextInput(step.elementSelector, step.easyGraphInputText)),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_DEFAULT_TITLE]: 'Visual graph',\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_CONTENT]: 'Enter <b>{{easyGraphInputText}}</b> in the <b>Easy graph</b> text input.'\n },\n fr: {\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_DEFAULT_TITLE]: 'Graphique visuel',\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_CONTENT]: 'Entrez <b>{{easyGraphInputText}}</b> dans la saisie de texte <b>Graphique facile</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst VALUE_FILTER_INTRO = 'guide.step_plugin.connectors-lucene-value-filter-intro.content';\n\n/**\n * @name connectors-lucene-value-filter-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Value filter\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Value filter\" in defining a top-level value filter for documents.\n *\n * Lucene connector value filter introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-value-filter-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-value-filter-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-value-filter-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, VALUE_FILTER_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-value-filter-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'valueFilter'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [VALUE_FILTER_INTRO]: 'The <b>Value filter</b> is an optional string defining a top-level value filter for the document.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [VALUE_FILTER_INTRO]: 'Le <b>filtre de valeurs</b> est une chaîne optionnelle définissant un filtre de valeurs au niveau du document.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst LUCENE_TYPE_INTRO = 'guide.step_plugin.connectors-lucene-type-intro.content';\n\n/**\n * @name connectors-lucene-type-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the Lucene connector in GraphDB.\n * It provides an overview of the connector's capabilities and its integration with the repository data.\n *\n * Lucene connector introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-type-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-type-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-type-intro',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-type-intro',\n options: {\n content: translate(this.translationBundle, LUCENE_TYPE_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n connectorName: LUCENE_CONNECTOR_NAME,\n class: 'connectors-lucene-type-intro'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [LUCENE_TYPE_INTRO]: 'The Lucene Connector in GraphDB enables extremely fast keyword and faceted (aggregation) searches. Unlike traditional setups where indexing is handled externally, this connector stays automatically synchronized with your repository data, ensuring accurate and up-to-date search results at all times.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [LUCENE_TYPE_INTRO]: 'Le connecteur Lucene dans GraphDB permet des recherches par mots-clés et par facettes (agrégation) extrêmement rapides. Contrairement aux configurations traditionnelles où l’indexation est gérée de manière externe, ce connecteur reste automatiquement synchronisé avec les données de votre référentiel, garantissant des résultats de recherche précis et à jour en permanence.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_CREATE_AGENT_DEFAULT_TITLE = 'guide.step-action.create-ttyg-agent';\nconst SAVE_AGENT_SETTINGS = 'guide.step_plugin.create-ttyg-agent.save-agent-settings';\n\n/**\n * @name ttyg-create-agent-save\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to click on the \"Save\" button after configuring an agent in the Talk to Your Graph (TTYG) plugin.\n * It highlights the button and provides instructions on how to save the agent settings.\n *\n * Click on save button<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-create-agent-save\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-create-agent-save',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_CREATE_AGENT_DEFAULT_TITLE);\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, SAVE_AGENT_SETTINGS),\n class: 'save-agent',\n disablePreviousFlow: false,\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('save-agent-settings')\n }\n }\n ];\n },\n\n translationBundle: {\n en: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Create an agent',\n [SAVE_AGENT_SETTINGS]: 'Click to save the agent settings.'\n },\n fr: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Créer un agent',\n [SAVE_AGENT_SETTINGS]: 'Cliquez sur pour enregistrer les paramètres de l\\'agent.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const FTS_METHOD_DEFAULT_TITLE = 'guide.step-action.fts-search-method';\nconst DISABLE_TOGGLE = 'guide.step_plugin.fts-search-method.disable-toggle';\n\n/**\n * @name ttyg-fts-method-disable\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to disable the FTS search query method in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to disable FTS search query method<br>\n * <img src=\"resources/guides/ttyg/ttyg-fts-method-disable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-fts-method-disable\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-fts-method-disable',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-fts_search-input');\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n content: translate(this.translationBundle, DISABLE_TOGGLE),\n title: translate(this.translationBundle, FTS_METHOD_DEFAULT_TITLE),\n class: 'toggle-fts-search',\n ...options,\n disable: true,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-fts_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(!GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [FTS_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [DISABLE_TOGGLE]: 'Click on the toggle to disable FTS search query method.'\n },\n fr: {\n [FTS_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [DISABLE_TOGGLE]: 'Cliquez sur le bouton pour désactiver la méthode de recherche FTS.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst RUN_QUERY = 'guide.step_plugin.execute-sparql-query.run-sparql-query.content';\n\n/**\n * @name sparql-editor-run-button\n * @memberof module:Interactive Guide\n *\n * @description\n * This prompts the user to click on the SPARQL run button to execute the query.\n *\n * Clicking on the button<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-run-button.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-editor-run-button\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-editor-run-button',\n getSteps: function(options, services) {\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n content: translate(this.translationBundle, RUN_QUERY),\n url: 'sparql',\n elementSelector: services.GuideUtils.CSS_SELECTORS.SPARQL_RUN_BUTTON_SELECTOR,\n class: 'yasgui-run-button',\n onNextClick: (guide) => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then((yasgui) => {\n yasgui.query();\n guide.next();\n }),\n scrollToHandler: services.GuideUtils.scrollToTop,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [RUN_QUERY]: 'Click on the <b>Run</b> button.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [RUN_QUERY]: 'Cliquez sur le bouton <b>Exécuter</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorNameSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst CONNECTORS_INTRO_CONTENT = 'guide.step_plugin.connectors-connector-intro.content';\n\n/**\n * @name connectors-connector-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the connectors section of the GraphDB Workbench.\n * It explains the purpose of an individual connector.\n *\n * Connectors section introduction<br>\n * <img src=\"resources/guides/connectors/connectors-connector-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the section is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-connector-intro\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-connector-intro',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n */\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const connectorNameSelector = getConnectorNameSelector(options, services);\n const connectorCardSelector = GuideUtils.getGuideElementSelector(`${options.instanceName}-connector-card`);\n return [{\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-connector-intro',\n content: translate(this.translationBundle, CONNECTORS_INTRO_CONTENT),\n ...options,\n elementSelector: `${connectorNameSelector} ${connectorCardSelector}`,\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [CONNECTORS_INTRO_CONTENT]: 'Each section represents a single connector instance. For every instance, you can use the buttons on the right to copy, repair, or delete it.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [CONNECTORS_INTRO_CONTENT]: 'Chaque section représente une seule instance de connecteur. Pour chaque instance, vous pouvez utiliser les boutons à droite pour la copier, la réparer ou la supprimer.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst REPOSITORIES_DEFAULT_TITLE = 'guide.step_plugin.repositories.default-title';\nconst SELECT_REPO_CONTENT = 'guide.step_plugin.repositories.select-repository.content';\n\n/**\n * @name repositories-select-repository\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to connect to a repository.\n *\n * Connect to a repository<br>\n * <img src=\"resources/guides/repository/repositories-select-repository.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n * @property {string} repositoryIdToSelect - The id of the repository to connect to.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-select-repository\",\n * \"options\": {\n * \"repositoryIdToSelect\": \"my-repo\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-select-repository',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const repositoryId = options.repositoryIdToSelect ?? Utils.getRepositoryName(services, options);\n const selectRepositoryRowSelector = GuideUtils.getGuideElementSelector(`repository-${repositoryId}`);\n const selectRepositoryButtonWrapperSelector = `${selectRepositoryRowSelector} ${GuideUtils.getGuideElementSelector('select-repository-button-wrapper')}`;\n const selectRepositoryButtonSelector = `${selectRepositoryButtonWrapperSelector} ${GuideUtils.getGuideElementSelector('select-repository-button')}`;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, SELECT_REPO_CONTENT),\n title: translate(this.translationBundle, REPOSITORIES_DEFAULT_TITLE),\n url: 'repository',\n elementSelector: selectRepositoryButtonWrapperSelector,\n class: 'repositories-select-repository',\n onNextClick: () => GuideUtils.clickOnElement(selectRepositoryButtonSelector)(),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_DEFAULT_TITLE]: 'Repositories',\n [SELECT_REPO_CONTENT]: 'Click the connect repository icon.'\n },\n fr: {\n [REPOSITORIES_DEFAULT_TITLE]: 'Dépôts',\n [SELECT_REPO_CONTENT]: 'Cliquez sur l’icône de connexion au dépôt.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIDE_PANEL_CONTENT = 'guide.step_plugin.class-hierarchy-close-rdf-instances-side-panel.content';\nconst RDF_INSTANCES_TITLE = 'guide.step_plugin.class-hierarchy-instances.title';\n\n/**\n * @name class-hierarchy-close-rdf-instances-side-panel\n * @memberof module:Interactive Guide\n *\n * @description This step guides the user to close the RDF instances side panel by clicking on the close (X) icon.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-close-rdf-instances-side-panel.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-close-rdf-instances-side-panel\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-close-rdf-instances-side-panel',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, RDF_INSTANCES_TITLE);\n const closeButtonSelector = GuideUtils.getGuideElementSelector('close-info-panel');\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, SIDE_PANEL_CONTENT),\n url: 'hierarchy',\n canBePaused: false,\n elementSelector: closeButtonSelector,\n class: 'class-hierarchy-close-rdf-instances-side-panel',\n placement: 'left',\n onNextClick: () => GuideUtils.waitFor(closeButtonSelector, 3)\n .then(() => GuideUtils.clickOnElement(closeButtonSelector)()),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SIDE_PANEL_CONTENT]: 'You can close the panel by clicking on the X icon.',\n [RDF_INSTANCES_TITLE]: 'Class hierarchy instances'\n },\n\n fr: {\n [SIDE_PANEL_CONTENT]: 'Vous pouvez fermer le panneau en cliquant sur l\\'icône X.',\n [RDF_INSTANCES_TITLE]: 'Instances de hiérarchie de classes'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\n\n/**\n * @name wait-for-element-to-hide\n * @memberof module:Interactive Guide\n *\n * @description\n * Waits for a specific element to become hidden and then immediately advances to the next step.\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.elementSelectorToHide - CSS selector of the element that must become hidden before advancing.\n * @property {number} [options.timeToWait=2] - Max seconds to wait before aborting the guide.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"wait-for-element-to-hide\",\n * \"options\": {\n * \"elementSelectorToHide\": \"#loading\",\n * \"timeToWait\": 5\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'wait-for-element-to-hide',\n getStep: (options, services) => {\n return {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n beforeShowPromise: (guide) => services.GuideUtils.waitUntilHidden(options.elementSelectorToHide, options.timeToWait || 2)\n .catch(() => {\n services.ShepherdService._abortGuide(guide);\n }),\n show: (guide) => () => {\n // Using a timeout because the library executes async logic\n setTimeout(() => guide.next());\n },\n ...options\n };\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst SKIP_INITIAL_INDEXING = 'guide.step_plugin.connectors-lucene-skip-initial-indexing-intro.content';\n\n/**\n * @name connectors-lucene-skip-initial-indexing-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"skipInitialIndexing\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"skipInitialIndexing\" parameter in controlling the initial indexing behavior.\n *\n * Lucene connector skipInitialIndexing introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-skip-initial-indexing-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-skip-initial-indexing-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-skip-initial-indexing-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, SKIP_INITIAL_INDEXING),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-skip-initial-indexing-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'skipInitialIndexing'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [SKIP_INITIAL_INDEXING]: 'The <b>skipInitialIndexing</b> parameter, when enabled, skips the initial indexing but allows incremental updates to be processed normally.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [SKIP_INITIAL_INDEXING]: 'Le paramètre <b>skipInitialIndexing</b>, lorsqu’il est activé, ignore l’indexation initiale mais permet aux mises à jour incrémentales d’être traitées normalement.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name sparql-search-method\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through enabling or disabling the SPARQL search query method in the TTYG interface.\n * It includes steps to provide information about the SPARQL search method, enable it if it's disabled, or disable it if it's enabled.\n * If enabling, it can also include an optional step to set the ontology source, either via a named graph or a SPARQL CONSTRUCT query.\n *\n * Disable SPARQL search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-disable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enable SPARQL info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-enabling-sparql-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enable SPARQL search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-enable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The `sparql-search-method-enable-ontology-graph` step is a configurable complex step. See [sparql-search-method-enable-ontology-graph](#.sparql-search-method-enable-ontology-graph) for more details.\n * The `sparql-search-method-enable-sparql-query` step is a configurable complex step, See [sparql-search-method-enable-sparql-query](#.sparql-search-method-enable-sparql-query) for more details.\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {boolean} [options.disable] - If true, the step will guide the user to disable the SPARQL search method. If false or not provided, it will guide to enable it.\n * @property {string} [options.ontologyGraph] - If provided and enabling the SPARQL search method, an additional step will be included to set the ontology source via a named graph with this value.\n * @property {string} [options.sparqlQuery] - If provided and enabling the SPARQL search method, an additional step will be included to set the ontology source via a SPARQL CONSTRUCT query with this value.\n *\n * Note: Only one of `ontologyGraph` or `sparqlQuery` should be provided. If both are provided, `ontologyGraph` will take precedence.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-search-method\",\n * \"options\": {\n * \"disable\": false,\n * \"ontologyGraph\": \"http://example.org/graph/ontology\"\n * }\n * }\n * ```\n *\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-search-method\",\n * \"options\": {\n * \"disable\": false,\n * \"sparqlQuery\": \"CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o } LIMIT 100\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-search-method',\n getSteps: (options, _services) => {\n options.mainAction = 'sparql-search-method';\n\n const shouldToggleOff = options.disable;\n\n if (shouldToggleOff) {\n return [{\n guideBlockName: 'ttyg-sparql-method-disable', options: {...options}\n }];\n }\n\n const steps = [\n {\n guideBlockName: 'ttyg-enabling-sparql-info-message', options: {...options}\n },\n {\n guideBlockName: 'ttyg-sparql-method-enable', options: {...options}\n }\n ];\n\n if (options.ontologyGraph) {\n steps.push({\n guideBlockName: 'sparql-search-method-enable-ontology-graph',\n options: {...options}\n });\n } else if (options.sparqlQuery) {\n steps.push({\n guideBlockName: 'sparql-search-method-enable-sparql-query',\n options: {...options}\n });\n }\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst EXPAND_RESULTS_CONTENT = 'guide.step_plugin.sparql-editor-expand-results-over-owl.content';\n\n/**\n * @name sparql-editor-expand-results-over-owl\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on the \"Expand results over owl:sameAs\" toggle in the SPARQL editor.<br>\n *\n * Expand results over owl:sameAs toggle<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-expand-results-over-owl.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-editor-expand-results-over-owl\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-editor-expand-results-over-owl',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n content: translate(this.translationBundle, EXPAND_RESULTS_CONTENT),\n url: 'sparql',\n elementSelector: '.yasqe_expandResultsButton',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [EXPAND_RESULTS_CONTENT]: '<b>Expand results over owl sameAs</b> includes equivalent resources connected with owl:sameAs in the query results. Clicking the toggle disables this behavior.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [EXPAND_RESULTS_CONTENT]: '<b>Étendre les résultats via owl sameAs</b> inclut les ressources équivalentes connectées avec owl:sameAs dans les résultats de la requête. Cliquer sur le bouton désactive ce comportement.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","import * as Utils from '../utils.js';\nimport {BASIC_STEP} from '../config.js';\n\n/**\n * @name read-only-element\n * @memberof module:Interactive Guide\n *\n * @description\n * The Read-Only Element step is used to guide users to see a specific element on the interface, but not interact with it.\n *\n * Read-only element example<br>\n * <img src=\"resources/guides/core/read-only-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {function} [options.beforeShowPromise] - A promise that has to resolve, before the step is shown. If not provided, the step will be shown immediately.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"read-only-element\",\n * \"options\": {\n * \"elementSelector\": \"#important-info\",\n * \"content\": \"Please take a look at this important information, but do not interact with it.\"\n * }\n * }\n * ```\n */\nconst step = {\n // An element which is expected to be focused, but interactions are disabled.\n guideBlockName: 'read-only-element',\n getStep: (options, services) => {\n const notOverridable = {\n type: 'readonly'\n };\n const stepDescription = {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n ...options,\n ...notOverridable\n };\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(services, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_TITLE = 'guide.step-action.resource-search-autocomplete-item';\nconst RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_CONTENT = 'guide.step-action.resource-search-autocomplete-item-content';\n\n/**\n * @name resource-search-autocomplete-item\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-search-autocomplete-item` step selects the autocomplete item for a discovered RDF resource in the search input.\n * This is a reusable step that can be used everywhere an autocomplete dropdown with RDF resources is present.\n *\n * <img src=\"resources/guides/resource/resource-search-autocomplete-item.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} [options.iri] - The IRI displayed in the autocomplete item.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-search-autocomplete-item\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-search-autocomplete-item',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_TITLE),\n content: translate(this.translationBundle, RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_CONTENT, {iri: options.iri}),\n elementSelector: GuideUtils.getGuideElementSelector(`autocomplete-${options.iri}`),\n onNextClick: (guide, step) => GuideUtils.waitFor(step.elementSelector, 3).then(() => $(step.elementSelector).trigger('click')),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_TITLE]: 'Resource search',\n [RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_CONTENT]: 'Click on <b>{{iri}}</b>.'\n },\n fr: {\n [RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_TITLE]: 'Recherche de ressource',\n [RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_CONTENT]: 'Cliquez sur <b>{{iri}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-intro.content';\n\n/**\n * @name class-relationships-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-intro` step displays a dialog that introduces the Class relationships view.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-intro',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'info-message',\n options: {\n url: 'relationships',\n class: 'clas-hierarchy-intro',\n placement: 'left',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Explore the class relationships',\n [CONTENT]: 'This view shows how data instances from different classes are connected based on real RDF statements.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Explorer les relations entre classes',\n [CONTENT]: 'Cette vue montre comment les instances de données de différentes classes sont connectées basées sur de vraies déclarations RDF.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name select-ttyg-agent\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * Complex step, which takes the user through the process of selecting a TTYG agent.\n * It includes steps to open the dropdown, select an agent, and handle missing repository scenarios.\n *\n * Select an agent info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Open the agent selection dropdown<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-dropdown-open.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Select an agent from the dropdown<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-from-dropdown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Check for missing repository<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-check-for-missing-repository-cancel.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"select-ttyg-agent\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'select-ttyg-agent',\n getSteps: (options) => {\n options.mainAction = 'select-ttyg-agent';\n\n return [\n {\n guideBlockName: 'ttyg-select-agent-info-message',\n options: {...options}\n },\n {\n guideBlockName: 'ttyg-select-agent-dropdown-open',\n options: {...options}\n },\n {\n guideBlockName: 'ttyg-select-agent-from-dropdown',\n options: {...options}\n },\n {\n guideBlockName: 'ttyg-select-agent-check-for-missing-repository-cancel',\n options: {...options}\n }\n ];\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorContentSelector, getConnectorNameSelector, getConnectorParameterSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst REMAINING_FIELDS_INTRO = 'guide.step_plugin.connectors-parameter-fields-remaining-fields-intro.content';\n\n/**\n * @name connectors-parameter-fields-remaining-fields-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step showcases the remaining fields of a connector instance. We might have more than one field mapping for a connector instance.\n * In that case this step shows the remaining field mappings.\n *\n * Remaining fields<br>\n * <img src=\"resources/guides/connectors/connectors-parameter-fields-remaining-fields-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the parameter is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n * @property {string} parameterName - the specific creation parameters name for <code>instanceName</code>.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-parameter-fields-remaining-fields-intro\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\",\n * \"parameterName\": \"hosts\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-parameter-fields-remaining-fields-intro',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n * - <b>parameterName</b>: string (required) – the specific creation parameter name for <code>instanceName</code>.\n */\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const remainingFieldsSelector = GuideUtils.getGuideElementSelector('connector-remaining-fieldsets');\n const connectorNameSelector = getConnectorNameSelector(options, services);\n const connectorContentSelector = getConnectorContentSelector(options, services);\n const parameterSelector = getConnectorParameterSelector(options, services);\n\n return [{\n guideBlockName: 'read-only-element', options: {\n title: translate(step.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-remaining-fieldsets-intro',\n content: translate(step.translationBundle, REMAINING_FIELDS_INTRO),\n ...options,\n elementSelector: `${connectorNameSelector} ${connectorContentSelector} ${parameterSelector} ${remainingFieldsSelector}`,\n url: 'connectors'\n }\n }];\n }, translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [REMAINING_FIELDS_INTRO]: 'This connector configuration contains multiple field mappings.'\n }, fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [REMAINING_FIELDS_INTRO]: 'Cette configuration du connecteur Lucene contient plusieurs mappages de champs.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CREATE_SIMILARITY_INDEX_DEFAULT = 'guide.step-action.create-similarity-index';\nconst CREATE_INDEX = 'guide.step_plugin.create-similarity-index.create-index';\n\n/**\n * @name similarity-click-to-create\n * @memberof module:Interactive Guide\n *\n * @description\n * This step highlights the \"Create Similarity index\" button and prompts the user to click it.\n *\n * Click the button to create a new Similarity index<br>\n * <img src=\"resources/guides/similarity-index/similarity-click-to-create.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-click-to-create\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'similarity-click-to-create',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CREATE_INDEX),\n title: translate(this.translationBundle, CREATE_SIMILARITY_INDEX_DEFAULT),\n class: 'create-similarity-index',\n disablePreviousFlow: false,\n disableNextFlow: true,\n ...options,\n url: 'similarity/index/create',\n elementSelector: GuideUtils.getGuideElementSelector('create-similarity-index-btn')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Create Similarity index',\n [CREATE_INDEX]: 'Click the button to create the Similarity index.'\n },\n fr: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Créer un indice de similitude',\n [CREATE_INDEX]: 'Cliquez sur le bouton pour créer l\\'index de similarité.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SELECT_AGENT_DEFAULT_TITLE = 'guide.step-action.select-ttyg-agent';\nconst SELECT_AGENT = 'guide.step_plugin.select-ttyg-agent.select-agent';\n\n/**\n * @name ttyg-select-agent-from-dropdown\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to select an agent from a dropdown menu in the TTYG interface.\n * It highlights the dropdown element and provides instructions on how to proceed.\n *\n * Select an agent from the dropdown<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-from-dropdown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-select-agent-from-dropdown\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-select-agent-from-dropdown',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, SELECT_AGENT),\n title: translate(this.translationBundle, TTYG_SELECT_AGENT_DEFAULT_TITLE),\n disableNextFlow: true,\n class: 'select-your-agent',\n ...options,\n elementSelector: GuideUtils.getGuideElementSelector('select-agent-panel'),\n show: () => () => {\n const elementToObserve = document.querySelector(GuideUtils.getGuideElementSelector('select-agent-dropdown'));\n const dropdownToggleElement = document.querySelector(GuideUtils.getGuideElementSelector('select-agent-dropdown-toggle'));\n\n options.observer = new MutationObserver(attributesChangeCallback);\n options.observer.observe(elementToObserve, {attributes: true});\n\n function attributesChangeCallback(mutationList) {\n for (const mutation of mutationList) {\n if (mutation.type === 'attributes') {\n const isOpened = mutation.target.classList.contains('open');\n\n // The component we use for selecting the agent automatically closes\n // after the user clicks on the view, which is why we have to open it.\n if (!(isOpened)) {\n dropdownToggleElement.click();\n }\n }\n }\n }\n },\n hide: () => () => {\n options.observer.disconnect();\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Select an agent',\n [SELECT_AGENT]: 'Click on you agent from the dropdown to select it'\n },\n\n fr: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Sélectionner un agent',\n [SELECT_AGENT]: 'Cliquez sur votre agent dans le menu déroulant pour le sélectionner'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.autocomplete.default.title';\n\n/**\n * @name enable-autocomplete\n * @memberof module:Interactive Guide\n *\n * @description\n * The `enable-autocomplete` guide shows how to use the Autocomplete index view to enable the autocomplete index.\n *\n * The guide consists of the following steps:\n * 1. An introduction to the guide.<br>\n * <img src=\"resources/guides/autocomplete/autocomplete-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 2. A step that guides the user to click on the \"Setup\" main menu.<br>\n * <img src=\"resources/guides/main-menu/main-menu-setup.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 3. A step that guides the user to click on the \"Autocomplete\" sub-menu item.<br>\n * <img src=\"resources/guides/main-menu/main-menu-autocomplete.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 4. A step that shows the user how to enable the autocomplete index by clicking a checkbox.<br>\n * <img src=\"resources/guides/autocomplete/autocomplete-enable-checkbox.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 5. A step that explains the status of the autocomplete index after it has been enabled.<br>\n * <img src=\"resources/guides/autocomplete/autocomplete-focus-on-indexing-status.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This guide can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"enable-autocomplete\"\n * }\n */\nconst step = {\n guideBlockName: 'enable-autocomplete',\n getSteps: function(options, services) {\n options.mainAction = 'enable-autocomplete';\n const title = options.title ? options.title : services.translate(this.translationBundle, DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'autocomplete',\n title,\n showIntro: true,\n ...options\n }\n },\n {\n guideBlockName: 'autocomplete-enable-checkbox',\n options: {\n title,\n ...options\n }\n },\n {\n guideBlockName: 'autocomplete-focus-on-indexing-status',\n options: {\n title,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Enable autocomplete'\n },\n fr: {\n [DEFAULT_TITLE]: 'Activer la saisie semi-automatique'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst STORED_INTRO = 'guide.step_plugin.connectors-lucene-fields-stored-intro.content';\n\n/**\n * @name connectors-lucene-fields-stored-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Stored\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Stored\" option in determining whether a field's values are stored in Lucene.\n *\n * Lucene connector stored introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-stored-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-stored-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-stored-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, STORED_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-stored-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'stored'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [STORED_INTRO]: 'The <b>Stored</b> option determines whether the field’s values are stored in Lucene. By default, fields are stored (true).'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [STORED_INTRO]: 'L’option <b>Stocké</b> détermine si les valeurs du champ sont stockées dans Lucene. Par défaut, les champs sont stockés (true).'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SELECT_AGENT_DEFAULT_TITLE = 'guide.step-action.select-ttyg-agent';\nconst MISSING_REPOSITORY = 'guide.step_plugin.select-ttyg-agent.missing-repository';\n\n/**\n * @name ttyg-select-agent-check-for-missing-repository-cancel\n * @memberof module:Interactive Guide\n *\n * @description\n * This step displays, that a repository is missing for the selected agent\n *\n * Missing repository for selected agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-check-for-missing-repository-cancel.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-select-agent-check-for-missing-repository-cancel\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-select-agent-check-for-missing-repository-cancel',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n // If missing repository modal is visible go to next step, otherwise skip it\n guideBlockName: 'info-message',\n options: {\n beforeShowPromise: (guide, currentStep) => {\n return GuideUtils.getOrWaitFor(GuideUtils.getElementSelector('.confirm-dialog .cancel-btn'), 1)\n .then(() => {\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.next());\n })\n .catch(() => {\n const stepId = currentStep.id;\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.show(stepId + 2));\n });\n },\n ...options\n }\n },\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, MISSING_REPOSITORY),\n title: translate(this.translationBundle, TTYG_SELECT_AGENT_DEFAULT_TITLE),\n ...options,\n elementSelector: GuideUtils.getElementSelector('.confirm-dialog .cancel-btn'),\n showOn: () => GuideUtils.isVisible('.confirm-dialog .cancel-btn'),\n onNextClick: () => {\n // Close the modal by clicking on the cancel button\n GuideUtils.clickOnElement('.confirm-dialog .cancel-btn')();\n },\n show: (guide, currentStep) => () => {\n const currentStepId = currentStep.id;\n // Add a \"click\" listener to the element.\n // Upon clicking the element, the guide is set back 3 steps to \"open dropdown\" step\n $(currentStep.elementSelector).on('click', () => {\n guide.show(currentStepId - 3);\n });\n },\n hide: (guide, currentStep) => () => {\n // Remove the \"click\" listener of the element. It is important when the step is hidden.\n $(currentStep.elementSelector).off('click');\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Select an agent',\n [MISSING_REPOSITORY]: 'The agent you selected has no repository. Please select an agent configured with current repository.'\n },\n\n fr: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Sélectionner un agent',\n [MISSING_REPOSITORY]: 'L\\'agent que vous avez sélectionné n\\'a pas de référentiel. Veuillez sélectionner un agent configuré avec le référentiel actuel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const FTS_METHOD_DEFAULT_TITLE = 'guide.step-action.fts-search-method';\nconst FTS_SEARCH_CONTENT = 'guide.step_plugin.fts-search-method.content';\n\n/**\n * @name ttyg-fts-method-info\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides information about the FTS search query method in the TTYG interface.\n * It highlights an info message block and provides details about the FTS search functionality.\n *\n * FTS search query method<br>\n * <img src=\"resources/guides/ttyg/ttyg-fts-method-info.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-fts-method-info\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-fts-method-info',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, FTS_SEARCH_CONTENT),\n // If mainAction is set the title will be set automatically\n title: translate(this.translationBundle, FTS_METHOD_DEFAULT_TITLE),\n class: 'info-fts-search',\n ...options,\n url: 'ttyg'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [FTS_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [FTS_SEARCH_CONTENT]: 'Enabling FTS search allows the agent to answer questions by using full-text search in literals and IRIs. Performs well on open-ended questions but not so well on providing aggregations.'\n },\n fr: {\n [FTS_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [FTS_SEARCH_CONTENT]: 'L\\'activation de la recherche FTS permet à l\\'agent de répondre aux questions en utilisant la recherche plein texte dans les littéraux et les IRI. Les résultats sont bons pour les questions ouvertes, mais moins bons pour la fourniture d\\'agrégations..'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-digram-thickness-intro.content';\n\n/**\n * @name class-relationships-digram-thickness-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-digram-thickness-intro` step displays a dialog that explains how connection lines in the diagram\n * encode information through their thickness, color, and direction.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-digram-thickness-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-digram-thickness-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-digram-thickness-intro',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'focus-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('relationships-diagram'),\n placement: 'left',\n class: 'class-relationships-digram-thickness-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'Each connection line varies in <b>thickness</b> based on the number of links, <b>color</b> based on the class with more incoming links, and <b>direction</b> as links may go both ways (from class A to class B and vice versa).'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Chaque ligne de connexion varie en <b>épaisseur</b> basée sur le nombre de liens, en <b>couleur</b> basée sur la classe avec le plus de liens entrants, et en <b>direction</b> car les liens peuvent aller dans les deux sens (de la classe A vers la classe B et vice versa).'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst VIEW_SPARQL_DIALOG = 'guide.step_plugin.connectors-lucene-view-sparql-dialog-intro.content';\n\n/**\n * @name connectors-lucene-view-sparql-dialog-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"View SPARQL Query\" dialog of the Lucene connector in GraphDB.\n * It explains the purpose of the dialog and how users can utilize the SPARQL query displayed within it.\n *\n * Lucene connector View SPARQL Query dialog introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-view-sparql-dialog-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-view-sparql-dialog-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-view-sparql-dialog-intro',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-view-sparql-dialog-intro',\n options: {\n content: translate(this.translationBundle, VIEW_SPARQL_DIALOG),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-view-sparql-dialog-intro'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [VIEW_SPARQL_DIALOG]: 'The dialog displays the SPARQL query used to create the Lucene connector. You can copy it to execute manually or integrate it into automation scripts.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [VIEW_SPARQL_DIALOG]: 'La boîte de dialogue affiche la requête SPARQL utilisée pour créer le connecteur Lucene. Vous pouvez la copier pour l’exécuter manuellement ou l’intégrer dans des scripts d’automatisation.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\n\n/**\n * @name ttyg-sparql-copy-query-text\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to copy a provided SPARQL query into the SPARQL query input field in the TTYG interface.\n * It highlights the input field and provides instructions on how to proceed.\n *\n * Copy the following SPARQL query into the input field:<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-copy-query-text.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, the following specific option is available:\n *\n * @property {string} [options.sparqlQuery] - The SPARQL query to be copied into the input field.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-sparql-copy-query-text\",\n * \"options\": {\n * \"sparqlQuery\": \"CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o } LIMIT 100\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-copy-query-text',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'copy-text-element',\n options: {\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n elementSelector: GuideUtils.getGuideElementSelector('sparql-query-input'),\n text: options.sparqlQuery,\n ...options,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(GuideUtils.getGuideElementSelector('sparql-query-input'), options.sparqlQuery, false))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst DISABLE_TOGGLE = 'guide.step_plugin.iri-discovery-search.disable-toggle';\nconst ENABLE_TOGGLE = 'guide.step_plugin.iri-discovery-search.enable-toggle';\n\n/**\n * @name configure-iri-discovery-search\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable or disable the IRI discovery search feature in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable/disable IRI discovery search<br>\n * <img src=\"resources/guides/ttyg/configure-iri-discovery-search.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {boolean} options.disable - Set to true to guide the user to disable the IRI discovery search, or false to enable it.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-iri-discovery-search\",\n * \"options\": {\n * \"disable\": true // or false to enable\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-iri-discovery-search',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('iri-discovery-search-input');\n const shouldToggleOff = options.disable;\n const translate = pluginService.translate;\n\n let content;\n if (shouldToggleOff) {\n content = translate(this.translationBundle, DISABLE_TOGGLE);\n } else {\n content = translate(this.translationBundle, ENABLE_TOGGLE);\n }\n\n const elementSelector = GuideUtils.getGuideElementSelector('iri-discovery-search');\n return {\n guideBlockName: 'toggle-element',\n options: {\n content,\n class: 'toggle-iri-discovery-search',\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options,\n url: 'ttyg',\n elementSelector,\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => {\n const isEnabled = GuideUtils.isChecked(toggleSelector);\n return Promise.resolve(shouldToggleOff ? !isEnabled : isEnabled);\n },\n scrollToHandler: () => GuideUtils.scrollIntoView(elementSelector, {block: 'center'})\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [DISABLE_TOGGLE]: 'Click on the toggle to disable Full-text search in labels for IRI discovery.',\n [ENABLE_TOGGLE]: 'Click on the toggle to enable Full-text search in labels for IRI discovery. This method helps the model discover the IRIs for a particular incomplete query when it cannot answer general questions about the dataset on its own.'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [DISABLE_TOGGLE]: 'Cliquez sur le bouton pour désactiver la recherche textuelle complète dans les libellés pour la découverte d\\'IRI.',\n [ENABLE_TOGGLE]: 'Cliquez sur le bouton pour activer la recherche textuelle complète dans les libellés pour la découverte d\\'IRI. Cette méthode aide le modèle à découvrir les IRI pour une requête incomplète particulière lorsqu\\'il ne peut pas répondre aux questions générales sur le jeu de données par lui-même.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-diagram-intro.content';\n\n/**\n * @name class-relationships-diagram-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-diagram-intro` step displays a dialog that explains the class diagram in the Class Relationships view.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-diagram-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-diagram-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-diagram-intro',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('relationships-diagram'),\n placement: 'left',\n class: 'class-relationships-diagram-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Explore the class relationships',\n [CONTENT]: 'The diagram shows bundled connections between class pairs. Each connection represents multiple RDF links (subject–predicate–object) between instances of two classes.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Explorer les relations entre classes',\n [CONTENT]: 'Le diagramme montre les connexions groupées entre paires de classes. Chaque connexion représente plusieurs liens RDF (sujet–prédicat–objet) entre instances de deux classes.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorNameSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst CONNECTOR_TYPE_INTRO = 'guide.step_plugin.connectors-type-intro.content';\n\n\n/**\n * @name connectors-type-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step shows the type of connector.\n *\n * Connectors type introduction<br>\n * <img src=\"resources/guides/connectors/connectors-type-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} connectorName - the name of the connector for which the section is being defined.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-type-intro\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-type-intro',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n *\n * Must override content with connector specific content\n */\n getSteps: function(options, services) {\n const translate = services.translate;\n return [{\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-connectors-intro',\n content: translate(this.translationBundle, CONNECTOR_TYPE_INTRO),\n ...options,\n elementSelector: getConnectorNameSelector(options, services),\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [CONNECTOR_TYPE_INTRO]: 'Specific GraphDB Connectors provide different connection possibilities.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [CONNECTOR_TYPE_INTRO]: 'Les connecteurs GraphDB spécifiques offrent différentes possibilités de connexion.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TABLE_GRAPH_INTRO = 'guide.step-intro.table-graph';\nconst TABLE_GRAPH_OVERVIEW = 'guide.step_plugin.table-graph-overview';\nconst TABLE_GRAPH_LINK = 'guide.step_plugin.table-graph-link';\nconst TABLE_GRAPH_ROLE_SUBJECT_CONTENT = 'guide.step_plugin.table-graph-role.subject.content';\nconst TABLE_GRAPH_ROLE_PREDICATE_CONTENT = 'guide.step_plugin.table-graph-role.predicate.content';\nconst TABLE_GRAPH_ROLE_OBJECT_CONTENT = 'guide.step_plugin.table-graph-role.object.content';\nconst TABLE_GRAPH_ROLE_CONTEXT_CONTENT = 'guide.step_plugin.table-graph-role.context.content';\nconst TABLE_GRAPH_ROLE_ALL_CONTENT = 'guide.step_plugin.table-graph-role.all.content';\nconst TABLE_GRAPH_VISUAL = 'guide.step_plugin.table-graph-visual';\nconst TABLE_GRAPH_TITLE = 'guide.step_plugin.table-graph-title';\n\n/**\n * @name table-graph-explore\n * @memberof module:Interactive Guide\n *\n * @description\n * The `table-graph-explore` guide combines a sequence of steps to explore RDF data\n * in tabular form and optionally switch to the Visual Graph view.\n * It can show how to navigate to IRIs, change roles, and open the Visual Graph for the selected resource.\n *\n * <img src=\"resources/guides/resource/resource-explore-tabular.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * <img src=\"resources/guides/resource/resource-table-configure.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * <img src=\"resources/guides/resource/resource-click-any-iri.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * <img src=\"resources/guides/resource/resource-configure-object.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * <img src=\"resources/guides/resource/resource-explore-visual.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * Common guide options apply.\n * Additionally, the following options are used:\n * @property {string} [options.iri] - The IRI to explore.\n * @property {string} [options.iriLabel] - Display label for the IRI.\n *\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"table-graph-explore\",\n * \"options\": {\n * \"iri\": \"http://example.com/employees/Employee1\",\n * \"iriLabel\": \"Employee1\",\n * \"subSteps\": [\n * {\"type\": \"link\", \"iri\": \"http://example.com/employees/Employee1\", \"iriLabel\": \"empl:Employee1\"},\n * {\"type\": \"role\", \"role\": \"all\"},\n * {\"type\": \"visual\", \"extraContentVisualIntro\": \"<p>You can pan and zoom the graph.</p>\"}\n * ]\n * }\n * }\n * ```\n * */\nconst step = {\n guideBlockName: 'table-graph-explore',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const RoutingUtil = services.RoutingUtil;\n const translate = services.translate;\n options.mainAction = 'table-graph';\n\n options.title = options.title ?? translate(this.translationBundle, TABLE_GRAPH_TITLE);\n\n const steps = [\n {\n guideBlockName: 'sparql-results-click-on-iri',\n options: {\n content: translate(this.translationBundle, TABLE_GRAPH_INTRO, {iriLabel: options.iriLabel ?? options.iri}),\n initPreviousStep: (services, stepId) => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n if (currentStepId === stepId) {\n return Promise.resolve();\n }\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.options.id);\n },\n ...options\n }\n },\n {\n guideBlockName: 'resource-results-explain',\n options: {\n content: translate(this.translationBundle, TABLE_GRAPH_OVERVIEW, {iriLabel: options.iriLabel ?? options.iri}),\n skipUrl: true,\n beforeShowPromise: () => GuideUtils.waitFor(`.resource-info a.source-link[href=\"${options.iri}\"]`, 3)\n .then(() => GuideUtils.waitFor(GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_ROWS_SELECTOR, 3)),\n initPreviousStep: (services, stepId) => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n if (currentStepId === stepId) {\n return GuideUtils.defaultInitPreviousStep(services, stepId);\n }\n const url = `resource?uri=${options.iri}&role=subject`;\n if (url !== decodeURIComponent(RoutingUtil.getCurrentRoute())) {\n RoutingUtil.navigate(`resource?uri=${options.iri}&role=subject`);\n return GuideUtils.waitFor(`.resource-info a.source-link[href=\"${options.iri}\"]`, 3);\n }\n return Promise.resolve();\n },\n ...options\n }\n }\n ];\n\n if (Array.isArray(options.subSteps)) {\n options.subSteps.forEach((subStep) => {\n switch (subStep.type) {\n case 'link':\n steps.push({\n guideBlockName: 'resource-results-click-on-iri',\n options: {\n content: translate(this.translationBundle, TABLE_GRAPH_LINK, {iriLabel: subStep.iriLabel ?? subStep.iri}),\n skipUrl: true,\n initPreviousStep: (services, stepId) => {\n const linkUrl = `/resource?uri=${subStep.iri}&role=subject`;\n const tableGraphLinkUrl = `/resource?uri=${options.iri}&role=subject`;\n const url = decodeURIComponent(RoutingUtil.getCurrentRoute());\n\n const currentStepId = services.ShepherdService.getCurrentStepId();\n if (currentStepId === stepId && tableGraphLinkUrl === url) {\n // this case is first link in the sequence before click the link, so we have to resolve it.\n return Promise.resolve();\n }\n\n if (linkUrl === url) {\n // this case is first link in the sequence after click the link, so we have to call previous step.\n return GuideUtils.defaultInitPreviousStep(services, stepId);\n }\n\n RoutingUtil.navigate(linkUrl);\n return GuideUtils.waitFor(GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_ROWS_SELECTOR);\n },\n ...options,\n ...subStep\n }\n });\n break;\n case 'role':\n {const ROLE_KEY_BY_TYPE = {\n subject: TABLE_GRAPH_ROLE_SUBJECT_CONTENT,\n predicate: TABLE_GRAPH_ROLE_PREDICATE_CONTENT,\n object: TABLE_GRAPH_ROLE_OBJECT_CONTENT,\n context: TABLE_GRAPH_ROLE_CONTEXT_CONTENT,\n all: TABLE_GRAPH_ROLE_ALL_CONTENT\n };\n steps.push({\n guideBlockName: 'resource-click-on-role',\n options: {\n content: translate(this.translationBundle, ROLE_KEY_BY_TYPE[subStep.role]),\n skipUrl: true,\n showRole: subStep.role,\n initPreviousStep: (services, stepId) => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n if (currentStepId === stepId) {\n return Promise.resolve();\n }\n\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.options.id)\n .then(() => {\n let url = RoutingUtil.getCurrentRoute();\n url = url.substring(0, url.indexOf('role=') + 5);\n url += subStep.role;\n RoutingUtil.navigate(url);\n return GuideUtils.waitFor(GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_ROWS_SELECTOR);\n });\n },\n ...options,\n ...subStep\n }\n });\n break;}\n case 'visual':\n steps.push({\n guideBlockName: 'resource-click-on-visual-graph-button',\n options: {\n content: translate(this.translationBundle, TABLE_GRAPH_VISUAL),\n skipUrl: true,\n initPreviousStep: (services, stepId) => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n if (currentStepId === stepId) {\n return Promise.resolve();\n }\n\n return GuideUtils.defaultInitPreviousStep(services, stepId);\n },\n ...options,\n ...subStep\n }\n });\n steps.push({\n guideBlockName: 'visual-graph-intro',\n options: {\n extraContent: subStep.extraContentVisualIntro,\n forceReload: true,\n onNextClick: (guide) => {\n window.history.back();\n guide.next();\n },\n ...options,\n ...subStep\n }\n });\n break;\n case 'row':\n steps.push({\n guideBlockName: 'resource-results-row-explain',\n options: {\n content: translate(this.translationBundle, TABLE_GRAPH_LINK, {iriLabel: subStep.iriLabel ?? subStep.iri ?? options.iriLabel ?? options.iri}),\n skipUrl: true,\n ...options,\n ...subStep\n }\n });\n break;\n case 'table':\n steps.push({\n guideBlockName: 'resource-results-explain',\n options: {\n elementSelector: GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_ROWS_SELECTOR,\n class: 'visual_graph-table',\n skipUrl: true,\n placement: 'top',\n ...options,\n ...subStep\n }\n });\n break;\n }\n });\n }\n\n return steps;\n },\n translationBundle: {\n en: {\n [TABLE_GRAPH_INTRO]: 'The following steps show how to explore RDF data in tabular form without writing SPARQL queries. Click on the <b>{{iriLabel}}</b> IRI to explore it.',\n [TABLE_GRAPH_OVERVIEW]: 'The table shows RDF statements where the subject is the selected IRI, <b>{{iriLabel}}</b>. The view can be configured to show statements where the IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position.',\n [TABLE_GRAPH_LINK]: 'You can click on any IRI in the table to navigate to it. Click on <b>{{iriLabel}}</b>.',\n [TABLE_GRAPH_ROLE_SUBJECT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>subject</b> tab.',\n [TABLE_GRAPH_ROLE_PREDICATE_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>predicate</b> tab.',\n [TABLE_GRAPH_ROLE_OBJECT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>object</b> tab.',\n [TABLE_GRAPH_ROLE_CONTEXT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>context</b> tab.',\n [TABLE_GRAPH_ROLE_ALL_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>all</b> tab.',\n [TABLE_GRAPH_VISUAL]: 'You can always explore the same data using the <b>Visual graph</b> view. Click on the Visual graph button to try it now.',\n [TABLE_GRAPH_TITLE]: 'Explore RDF as a table'\n },\n fr: {\n [TABLE_GRAPH_INTRO]: 'Les étapes suivantes montrent comment explorer les données RDF sous forme de tableau sans écrire de requêtes SPARQL. Cliquez sur l\\'IRI <b>{{iriLabel}}</b> pour l\\'explorer.',\n [TABLE_GRAPH_OVERVIEW]: 'Le tableau affiche les déclarations RDF où le sujet est l\\'IRI sélectionné, <b>{{iriLabel}}</b>. La vue peut être configurée pour afficher les déclarations où l\\'IRI est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position.',\n [TABLE_GRAPH_LINK]: 'Vous pouvez cliquer sur n\\'importe quel IRI du tableau pour y accéder. Cliquez sur <b>{{iriLabel}}</b>.',\n [TABLE_GRAPH_ROLE_SUBJECT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>sujet</b>.',\n [TABLE_GRAPH_ROLE_PREDICATE_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>prédicat</b>.',\n [TABLE_GRAPH_ROLE_OBJECT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est l\\'<i>objet</i>, le <i>sujet</i>, le <i>prédicat</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>objet</b>.',\n [TABLE_GRAPH_ROLE_CONTEXT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>contexte</i>, le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>contexte</b>.',\n [TABLE_GRAPH_ROLE_ALL_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>tous</b>.',\n [TABLE_GRAPH_VISUAL]: 'Vous pouvez toujours explorer les mêmes données en utilisant la vue <b>Graphique visuel</b>. Cliquez sur le Graphique visuel pour l\\'essayer maintenant.',\n [TABLE_GRAPH_TITLE]: 'Explorer RDF sous forme de tableau'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name fts-search-method\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through enabling or disabling the FTS search query method in the TTYG interface.\n * It includes steps to provide information about the FTS search method, enable it if it's disabled, or disable it if it's enabled.\n * If enabling, it can also include an optional step to set the maximum number of triples per call.\n *\n * Disable FTS search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-fts-method-disable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enable FTS search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-fts-method-enable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Set max triples per call<br>\n * <img src=\"resources/guides/ttyg/set-max-triples-per-call.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following specific options:\n *\n * @property {boolean} [options.disable] - If true, the step will guide the user to disable the FTS search method. If false or not provided, it will guide to enable it.\n * @property {number} [options.maxTriplesPerCall] - If provided and enabling the FTS search method, an additional step will be included to set the maximum number of triples per call to this value.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"fts-search-method\",\n * \"options\": {\n * \"disable\": false,\n * \"maxTriplesPerCall\": 1000\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'fts-search-method',\n getSteps: (options) => {\n options.mainAction = 'fts-search-method';\n const shouldToggleOff = options.disable;\n\n if (shouldToggleOff) {\n return [{\n guideBlockName: 'ttyg-fts-method-disable', options: {...options}\n }];\n }\n\n const steps = [\n {\n guideBlockName: 'ttyg-fts-method-info', options: {...options}\n },\n {\n guideBlockName: 'ttyg-fts-method-enable', options: {...options}\n }\n ];\n\n if (options.maxTriplesPerCall) {\n steps.push({\n guideBlockName: 'set-max-triples-per-call',\n options: {...options}\n });\n }\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const WAIT_FOR_INDEX = 'guide.step_plugin.create-similarity-index.wait';\nconst CREATE_SIMILARITY_INDEX_DEFAULT = 'guide.step-action.create-similarity-index';\n\n/**\n * @name similarity-hold-and-wait-until-shown\n * @memberof module:Interactive Guide\n *\n * @description\n * This step instructs the user to wait until the new similarity index is created\n *\n * <img src=\"resources/guides/similarity-index/similarity-hold-and-wait-until-shown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-hold-and-wait-until-shown\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'similarity-hold-and-wait-until-shown',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'hold-and-wait-until-shown',\n options: {\n title: translate(this.translationBundle, CREATE_SIMILARITY_INDEX_DEFAULT),\n content: translate(this.translationBundle, WAIT_FOR_INDEX),\n class: 'wait-for-index',\n ...options,\n elementSelectorToWait: GuideUtils.getGuideElementSelector('similarity-indexes-table')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Create Similarity index',\n [WAIT_FOR_INDEX]: 'Wait for index to be created'\n },\n fr: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Créer un indice de similitude',\n [WAIT_FOR_INDEX]: 'Attendre la création de l\\'index'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst PROPERTY_CHAIN_INTRO_CONTENT = 'guide.step_plugin.connectors-lucene-fields-property-chain-intro.content';\n\n/**\n * @name connectors-lucene-fields-property-chain-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Property chain\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Property chain\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector property chain introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-property-chain-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-property-chain-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-property-chain-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, PROPERTY_CHAIN_INTRO_CONTENT),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-property-chain-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'propertyChain'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [PROPERTY_CHAIN_INTRO_CONTENT]: 'The <b>Property chain</b> defines the mapping on the GraphDB side. A property chain is a sequence of triples where the entity IRI is the subject of the first triple, its object is the subject of the next triple, and so on. A single-element property chain corresponds to a direct property. Property chains are specified as a list of IRIs, with at least one required.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [PROPERTY_CHAIN_INTRO_CONTENT]: 'La <b>chaîne de propriétés</b> définit le mappage du côté GraphDB. Une chaîne de propriétés est une séquence de triplets où l’IRI de l’entité est le sujet du premier triplet, son objet est le sujet du suivant, et ainsi de suite. Une chaîne à un seul élément correspond à une propriété directe. Les chaînes de propriétés sont spécifiées comme une liste d’IRI, avec au moins un requis.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst ENABLE_TOGGLE = 'guide.step_plugin.sparql-search-method.enable-toggle';\n\n/**\n * @name ttyg-sparql-method-enable\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is used to enable the SPARQL search method in the TTYG plugin.\n * It is a toggle step, which means that the user can enable the switch, but disabling will not be allowed.\n *\n * Enable SPARQL query search method<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-enable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * guideBlockName: 'ttyg-sparql-method-enable',\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-method-enable',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE);\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-sparql_search-input');\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n title,\n content: translate(this.translationBundle, ENABLE_TOGGLE),\n class: 'toggle-sparql-search',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-sparql_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [ENABLE_TOGGLE]: 'Click on the toggle to enable SPARQL search query method.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [ENABLE_TOGGLE]: 'Cliquez sur le bouton pour activer la méthode de recherche SPARQL.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst DOWNLOAD_RESOURCE_TITLE = 'guide.step_plugin.download-guide-resource.title';\nconst RESOURCE_CONTENT = 'guide.step_plugin.download-guide-resource.content';\n\n/**\n * @name download-guide-resource\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to download a resource file required for the guide.\n *\n * Download guide resource step<br>\n * <img src=\"resources/guides/download-guide-resource/download-guide-resource.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} options.resourcePath - The path to the resource file.\n * @property {string} options.resourceFile - The name of the resource file.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"download-guide-resource\",\n * \"options\": {\n * \"resourcePath\": \"movies\",\n * \"resourceFile\": \"movies.ttl\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'download-guide-resource',\n getSteps: function(options, services) {\n const translate = services.translate;\n const downloadButtonClass = options.repositoryId ? `guide-${options.repositoryId}-download-resource-link` : 'guide-download-resource-link';\n const downloadResourceListener = Utils.createDownloadClickHandler(options.resourcePath, options.resourceFile, services);\n let stepHTMLElement;\n return {\n guideBlockName: 'info-message',\n options: {\n title: translate(this.translationBundle, DOWNLOAD_RESOURCE_TITLE),\n content: translate(this.translationBundle, RESOURCE_CONTENT, {\n downloadButtonClass,\n resourceFile: options.resourceFile\n }),\n canBePaused: true,\n forceReload: true,\n downloadButtonClass,\n show: (guide) => () => {\n stepHTMLElement = guide.currentStep.el.querySelector(`.${downloadButtonClass}`);\n stepHTMLElement.addEventListener('click', downloadResourceListener);\n },\n hide: () => () => {\n if (stepHTMLElement) {\n stepHTMLElement.removeEventListener('click', downloadResourceListener);\n }\n },\n ...options\n }\n };\n },\n translationBundle: {\n en: {\n [DOWNLOAD_RESOURCE_TITLE]: 'Download guide resources',\n [RESOURCE_CONTENT]: 'This guide requires a file to be downloaded.<br>Please <a href=\"#\" class=\"{{downloadButtonClass}}\">download {{resourceFile}}</a>.'\n },\n fr: {\n [DOWNLOAD_RESOURCE_TITLE]: 'Télécharger les ressources du guide',\n [RESOURCE_CONTENT]: 'Ce guide nécessite le téléchargement d\\'un fichier.<br>Veuillez <a href=\"#\" class=\"{{downloadButtonClass}}\">télécharger {{resourceFile}}</a>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst CONFIGURE_AGENT_NAME = 'guide.step_plugin.configure-agent.name-input';\n\n/**\n * @name configure-agent-type-agent-name\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to input a name for the agent in the TTYG interface.\n * It highlights the input field and provides instructions on how to proceed.\n *\n * Type a name for the agent<br>\n * <img src=\"resources/guides/ttyg/configure-agent-type-agent-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options)\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-agent-type-agent-name\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-agent-type-agent-name',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, CONFIGURE_AGENT_NAME),\n class: 'input-agent-name',\n disablePreviousFlow: false,\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options,\n url: 'ttyg',\n beforeShowPromise: () => GuideUtils.waitFor(GuideUtils.getGuideElementSelector('agent-form'), 5)\n .catch((error) => {\n pluginService.toastr.error(pluginService.$translate.instant('guide.unexpected.error.message'));\n throw error;\n }),\n elementSelector: GuideUtils.getGuideElementSelector('agent-name'),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInputNotEmpty(GuideUtils.getGuideElementSelector('agent-name')))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [CONFIGURE_AGENT_NAME]: 'Type a name for the agent. You will refer to it later.'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [CONFIGURE_AGENT_NAME]: 'Saisissez un nom pour l\\'agent. Vous y ferez référence ultérieurement'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CONVERSATION_WITH_AGENT_DEFAULT_TITLE = 'guide.step-action.conversation-with-ttyg-agent';\nconst START_CONVERSATION = 'guide.step_plugin.conversation-with-ttyg-agent.start-conversation';\n\n/**\n * @name ttyg-click-to-create-new-chat\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to click on the \"Create Chat\" button in the Talk to Your Graph.\n * It highlights the button and provides instructions on how to start a new conversation with the agent.\n *\n * Create a new chat<br>\n * <img src=\"resources/guides/ttyg/ttyg-click-to-create-new-chat.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-click-to-create-new-chat\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-click-to-create-new-chat',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const createChatBtnSelector = GuideUtils.getGuideElementSelector('create-chat-btn');\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CONVERSATION_WITH_AGENT_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, START_CONVERSATION),\n class: 'start-conversation',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: createChatBtnSelector\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CONVERSATION_WITH_AGENT_DEFAULT_TITLE]: 'Conversation with the agent',\n [START_CONVERSATION]: 'Click the button to create a new chat'\n },\n fr: {\n [CONVERSATION_WITH_AGENT_DEFAULT_TITLE]: 'Conversation avec l\\'agent',\n [START_CONVERSATION]: 'Cliquez sur le bouton pour créer un nouveau chat'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name sparql-search-method-enable-ontology-graph\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through enabling the option to provide an ontology in a named graph for the SPARQL search method in the TTYG interface.\n * It includes steps to enable the option and type the name of the named graph that contains the ontology.\n *\n * Ontology select<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-ontology-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Type graph name<br>\n * <img src=\"resources/guides/ttyg/sparql-search-method-type-graph-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Add missing namespaces<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-click-add-namespaces.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n * @property {boolean} [options.addMissingNamespaces] - If true, an additional step will be included to click on the \"Add missing namespaces\" after typing the graph name.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-search-method-enable-ontology-graph\",\n * \"options\": {\n * \"addMissingNamespaces\": true\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-search-method-enable-ontology-graph',\n getSteps: (options, _services) => {\n const steps = [\n {\n guideBlockName: 'ttyg-sparql-method-ontology-select', options: {...options}\n },\n {\n guideBlockName: 'sparql-search-method-type-graph-name', options: {...options}\n }\n ];\n\n if (options.addMissingNamespaces) {\n steps.push({\n guideBlockName: 'ttyg-sparql-click-add-namespaces', options: {...options}\n });\n }\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst VIEW_SPARQL_DIALOG = 'guide.step_plugin.connectors-view-sparql-dialog-intro.content';\n\n/**\n * @name connectors-view-sparql-dialog-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"View SPARQL Query\" dialog of the connectors section of the GraphDB Workbench.\n * It explains the purpose of the dialog and how users can utilize the SPARQL query displayed within it.\n *\n * Connectors \"View SPARQL Query\" dialog introduction<br>\n * <img src=\"resources/guides/connectors/connectors-view-sparql-dialog-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-view-sparql-dialog-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-view-sparql-dialog-intro',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [{\n guideBlockName: 'scroll-only-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'left',\n class: 'connectors-view-sparql-dialog-intro',\n content: translate(this.translationBundle, VIEW_SPARQL_DIALOG),\n ...options,\n elementSelectorToWait: GuideUtils.getGuideElementSelector('view-query-body'),\n elementSelector: GuideUtils.getGuideElementSelector('view-query-body'),\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [VIEW_SPARQL_DIALOG]: 'The dialog displays the SPARQL query used to create the connector. You can copy it to execute manually or integrate it into automation scripts.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [VIEW_SPARQL_DIALOG]: 'La boîte de dialogue affiche la requête SPARQL utilisée pour créer le connecteur. Vous pouvez la copier pour l\\'exécuter manuellement ou l\\'intégrer dans des scripts d\\'automatisation.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst DOCUMENT_FILTER = 'guide.step_plugin.connectors-lucene-document-filter-intro.content';\n\n/**\n * @name connectors-lucene-document-filter-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Document filter\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Document filter\" in defining a top-level document filter for documents.\n *\n * Lucene connector document filter introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-document-filter-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-document-filter-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-document-filter-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, DOCUMENT_FILTER),\n ...(options.title ?? {title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE)}),\n ...options,\n class: 'connectors-lucene-document-filter-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'documentFilter'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [DOCUMENT_FILTER]: 'The <b>Document filter</b> is an optional string defining a top-level document filter for the document.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [DOCUMENT_FILTER]: 'Le <b>filtre de document</b> est une chaîne optionnelle définissant un filtre de document au niveau supérieur.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\nconst EXPLAIN_RDF_INSTANCE = 'guide.step_plugin.class-hierarchy-explain-rdf-instance.content';\n\n/**\n * @name class-hierarchy-explain-rdf-instance\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on explaining a specific RDF instance within the class hierarchy visualization.\n * It highlights the selected instance and provides detailed information about it.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-explain-rdf-instance.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} options.iri - The IRI of the class to which the instance belongs. This option is required.\n * @property {string} options.instance - The label of the RDF instance to be explained. This option is required.\n * @property {Object} [options.extraContent] - Bundle object with additional content to display.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-explain-rdf-instance\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\",\n * \"instance\": \"The Godfather\",\n * \"extraContent\": {\n * \"en\": \"My additional content in English\",\n * \"fr\": \"Mon contenu additionnel en français\"\n * }\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-explain-rdf-instance',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title,\n content: translate(this.translationBundle, EXPLAIN_RDF_INSTANCE, {\n iri: options.iri,\n focusInstance: options.instance\n }),\n url: 'hierarchy',\n canBePaused: false,\n elementSelector: GuideUtils.getGuideElementSelector('instance-' + options.instance),\n class: 'class-hierarchy-explain-rdf-instance',\n focusInstance: options.instance,\n extraContent: options.extraContent,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy',\n [EXPLAIN_RDF_INSTANCE]: '<b>{{focusInstance}}</b> is an instance of the class <b>{{iri}}</b>.'\n },\n\n fr: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe',\n [EXPLAIN_RDF_INSTANCE]: '<b>{{focusInstance}}</b> est une instance de la classe <b>{{iri}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.import-file';\nconst CONTENT = 'guide.step_plugin.import_rdf_file.confirm_duplicate_files_dialog.content';\n\n/**\n * @name import-confirm-duplicate-files\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `import-confirm-duplicate-files` step guides the user to confirm overwriting duplicate files in the import dialog of GraphDB.<br>\n * <img src=\"resources/guides/import/import-confirm-duplicate-files.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"import-confirm-duplicate-files\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'import-confirm-duplicate-files',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(step.translationBundle, CONTENT),\n title: translate(step.translationBundle, DEFAULT_TITLE),\n placement: 'bottom',\n class: 'import-file-button',\n ...options,\n url: 'import',\n elementSelector: GuideUtils.getElementSelector('.confirm-duplicate-files-dialog .confirm-overwrite-btn'),\n skipFromHistory: true,\n // Checks whether the confirm dialog is currently open.\n showOn: () => GuideUtils.isVisible(GuideUtils.getElementSelector('.confirm-duplicate-files-dialog')),\n onNextClick: () => GuideUtils.clickOnElement('.confirm-duplicate-files-dialog .confirm-overwrite-btn')(),\n onPreviousClick: () => {\n if (GuideUtils.isVisible(GuideUtils.getElementSelector('.confirm-duplicate-files-dialog'))) {\n return GuideUtils.clickOnElement('.confirm-duplicate-files-dialog .cancel-btn');\n }\n return Promise.resolve();\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Import file',\n [CONTENT]: 'Click on the <b>Yes</b> button to override the existing file.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Importer un fichier',\n [CONTENT]: 'Cliquez sur le bouton <b>Oui</b> pour remplacer le fichier existant.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name create-similarity-index\n * @memberof module:Interactive Guide\n *\n * @description\n * Complex step, which includes all steps needed to create a similarity index.\n *\n * Similarity click link<br>\n * <img src=\"resources/guides/similarity-index/similarity-click-link.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Similarity type index name<br>\n * <img src=\"resources/guides/similarity-index/similarity-type-index-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Similarity click to create<br>\n * <img src=\"resources/guides/similarity-index/similarity-click-to-create.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Similarity hold and wait until shown<br>\n * <img src=\"resources/guides/similarity-index/similarity-hold-and-wait-until-shown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"create-similarity-index\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'create-similarity-index',\n getSteps: (options, services) => {\n const GuideUtils = services.GuideUtils;\n options.mainAction = 'create-similarity-index';\n\n return [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'similarity',\n showIntro: true,\n ...options\n }\n },\n {\n guideBlockName: 'similarity-click-link', options: {...options}\n },\n {\n guideBlockName: 'similarity-type-index-name', options: {...options}\n },\n {\n guideBlockName: 'similarity-click-to-create', options: {...options}\n },\n {\n // check if error block is shown and go back 2 steps or proceed\n guideBlockName: 'info-message',\n options: {\n beforeShowPromise: (guide, currentStep) => GuideUtils.getOrWaitFor(GuideUtils.getGuideElementSelector('error'), 1)\n .then(() => {\n const stepId = currentStep.id;\n // Using a timeout\n // because the library executes logic\n // to show the step in a then clause\n // which causes current and next steps to show\n setTimeout(() => guide.show(stepId - 2));\n })\n .catch(() => {\n // Using a timeout\n // because the library executes logic\n // to show the step in a then clause\n // which causes current and next steps to show\n setTimeout(() => guide.next());\n }),\n ...options\n }\n },\n {\n guideBlockName: 'similarity-hold-and-wait-until-shown', options: {...options}\n }\n ];\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const RDF_RANK_TITLE = 'view.rdf.rank.title';\nconst CLICK_MAIN_MENU = 'guide.step-menu.click-menu';\nconst SKIP_SECTION = 'skip.section';\n\nconst MENU_SETUP_LABEL = 'menu.setup.label';\nconst MENU_IMPORT_LABEL = 'common.import';\nconst MENU_EXPLORE_LABEL = 'menu.explore.label';\nconst MENU_SPARQL_LABEL = 'menu.sparql.label';\nconst MENU_LAB_LABEL = 'menu.lab.label';\nconst MENU_TTYG_LABEL = 'menu.ttyg.label';\n\nconst SUBMENU_REPOSITORIES_LABEL = 'menu.repositories.label';\nconst SUBMENU_AUTOCOMPLETE_LABEL = 'menu.autocomplete.label';\nconst SUBMENU_CONNECTORS_LABEL = 'menu.connectors.label';\nconst SUBMENU_VISUAL_GRAPH_LABEL = 'visual.graph.label';\nconst SUBMENU_CLASS_HIERARCHY_LABEL = 'menu.class.hierarchy.label';\nconst SUBMENU_CLASS_RELATIONSHIPS_LABEL = 'menu.class.relationships.label';\nconst SUBMENU_SIMILARITY_LABEL = 'menu.similarity.label';\n\nconst VIEW_AUTOCOMPLETE_TITLE = 'view.autocomplete.title';\nconst VIEW_CONNECTOR_MANAGEMENT_TITLE = 'view.connector.management.title';\nconst VIEW_SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst VIEW_CLASS_HIERARCHY_TITLE = 'view.class.hierarchy.title';\nconst VIEW_CLASS_RELATIONSHIPS_TITLE = 'view.class.relationships.title';\n\nconst HELP_INFO_REPOSITORIES = 'view.repositories.helpInfo';\nconst HELP_INFO_IMPORT = 'view.import.helpInfo';\nconst HELP_INFO_AUTOCOMPLETE = 'view.autocomplete.helpInfo';\nconst HELP_INFO_CONNECTOR_MANAGEMENT = 'view.connector.management.helpInfo';\nconst HELP_INFO_VISUAL_GRAPH = 'view.visual.graph.helpInfo';\nconst HELP_INFO_SPARQL_EDITOR = 'view.sparql-editor.helpInfo';\nconst HELP_INFO_CLASS_HIERARCHY = 'view.class.hierarchy.helpInfo';\nconst HELP_INFO_CLASS_RELATIONSHIPS = 'view.class.relationships.helpInfo';\nconst HELP_INFO_TTYG = 'ttyg.helpInfo';\nconst HELP_INFO_SIMILARITY = 'guide.step-help-info.create-similarity-index';\nconst HELP_INFO_RDF_RANK = 'view.rdf.rank.helpInfo';\n\nconst INTRO_CREATE_REPOSITORY = 'guide.step-intro.create-repository';\nconst INTRO_ENABLE_AUTOCOMPLETE = 'guide.step-intro.enable-autocomplete';\nconst INTRO_EXECUTE_SPARQL_QUERY = 'guide.step-intro.execute-sparql-query';\nconst INTRO_VISUAL_GRAPH = 'guide.step-intro.visual-graph';\nconst INTRO_IMPORT_FILE = 'guide.step-intro.import-file';\nconst INTRO_CLASS_HIERARCHY = 'guide.step-intro.class-hierarchy';\nconst INTRO_CREATE_TTYG_AGENT = 'guide.step-intro.create-ttyg-agent';\nconst INTRO_CREATE_SIMILARITY_INDEX = 'guide.step-intro.create-similarity-index';\nconst INTRO_CLASS_RELATIONSHIPS = 'guide.step-intro.class-relationships';\n\nconst ACTION_CREATE_REPOSITORY = 'guide.step-action.create-repository';\nconst ACTION_ENABLE_AUTOCOMPLETE = 'guide.step-action.enable-autocomplete';\nconst ACTION_EXECUTE_SPARQL_QUERY = 'guide.step-action.execute-sparql-query';\nconst ACTION_VISUAL_GRAPH = 'guide.step-action.visual-graph';\nconst ACTION_IMPORT_FILE = 'guide.step-action.import-file';\nconst ACTION_CREATE_TTYG_AGENT = 'guide.step-action.create-ttyg-agent';\nconst ACTION_CREATE_SIMILARITY_INDEX = 'guide.step-action.create-similarity-index';\nconst ACTION_CLASS_HIERARCHY = 'guide.step-action.class-hierarchy';\nconst ACTION_CLASS_RELATIONSHIPS = 'guide.step-action.class-relationships';\n\n/**\n * @name click-main-menu\n * @memberof module:Interactive Guide\n *\n * @description\n * This guide step is used to guide the user through the main menu.\n * The guide step is composed of two steps: An optional intro message and 1 or 2 clickable menu elements.\n * All are calculated dynamically based on the `options.menu` parameter.\n *\n * Intro message<br>\n * <img src=\"resources/guides/main-menu/click-main-menu-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click main menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-lab.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click submenu<br>\n * <img src=\"resources/guides/main-menu/main-menu-ttyg.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} options.menu - The menu for which to add intro and click-menu steps.\n * @property {string} [options.mainAction] - The action to be performed on the main menu. Used to display the correct intro message.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"click-main-menu\",\n * \"options\": {\n * \"menu\": \"repositories\",\n * \"mainAction\": \"create-repository\"\n * }\n * }\n */\nconst step = {\n guideBlockName: 'click-main-menu',\n getSteps: function(options, services) {\n const translate = services.translate;\n const steps = [];\n\n let menuSelector;\n let menuTitle;\n let submenuSelector;\n let submenuTitle;\n let viewName;\n let helpInfo;\n let dialogTitle;\n let menuDialogClass = '';\n let submenuDialogClass = '';\n\n switch (options.menu) {\n case 'repositories':\n menuSelector = 'menu-setup';\n menuTitle = MENU_SETUP_LABEL;\n menuDialogClass = 'menu-setup';\n submenuSelector = 'sub-menu-repositories';\n submenuTitle = SUBMENU_REPOSITORIES_LABEL;\n submenuDialogClass = 'sub-menu-repositories';\n viewName = SUBMENU_REPOSITORIES_LABEL;\n helpInfo = HELP_INFO_REPOSITORIES;\n dialogTitle = ACTION_CREATE_REPOSITORY;\n break;\n\n case 'import':\n menuSelector = 'menu-import';\n menuTitle = MENU_IMPORT_LABEL;\n menuDialogClass = 'menu-import';\n viewName = MENU_IMPORT_LABEL;\n helpInfo = HELP_INFO_IMPORT;\n dialogTitle = ACTION_IMPORT_FILE;\n break;\n\n case 'autocomplete':\n menuSelector = 'menu-setup';\n menuTitle = MENU_SETUP_LABEL;\n menuDialogClass = 'menu-setup';\n submenuSelector = 'sub-menu-autocomplete';\n submenuTitle = SUBMENU_AUTOCOMPLETE_LABEL;\n submenuDialogClass = 'sub-menu-autocomplete';\n viewName = VIEW_AUTOCOMPLETE_TITLE;\n helpInfo = HELP_INFO_AUTOCOMPLETE;\n dialogTitle = ACTION_ENABLE_AUTOCOMPLETE;\n break;\n\n case 'connectors':\n menuSelector = 'menu-setup';\n menuTitle = MENU_SETUP_LABEL;\n menuDialogClass = 'menu-setup-guide-dialog';\n submenuSelector = 'sub-menu-connectors';\n submenuTitle = SUBMENU_CONNECTORS_LABEL;\n submenuDialogClass = 'sub-menu-connectors-guide-dialog';\n viewName = VIEW_CONNECTOR_MANAGEMENT_TITLE;\n helpInfo = HELP_INFO_CONNECTOR_MANAGEMENT;\n break;\n\n case 'visual-graph':\n menuSelector = 'menu-explore';\n menuTitle = MENU_EXPLORE_LABEL;\n menuDialogClass = 'menu-explore';\n submenuSelector = 'sub-menu-visual-graph';\n submenuTitle = SUBMENU_VISUAL_GRAPH_LABEL;\n submenuDialogClass = 'sub-menu-visual-graph';\n viewName = SUBMENU_VISUAL_GRAPH_LABEL;\n helpInfo = HELP_INFO_VISUAL_GRAPH;\n dialogTitle = ACTION_VISUAL_GRAPH;\n break;\n\n case 'sparql':\n menuSelector = 'menu-sparql';\n menuTitle = MENU_SPARQL_LABEL;\n menuDialogClass = 'menu-sparql';\n viewName = VIEW_SPARQL_EDITOR_TITLE;\n helpInfo = HELP_INFO_SPARQL_EDITOR;\n dialogTitle = ACTION_EXECUTE_SPARQL_QUERY;\n break;\n\n case 'class-hierarchy':\n menuSelector = 'menu-explore';\n menuTitle = MENU_EXPLORE_LABEL;\n menuDialogClass = 'menu-explore';\n submenuSelector = 'menu-class-hierarchy';\n submenuTitle = SUBMENU_CLASS_HIERARCHY_LABEL;\n submenuDialogClass = 'sub-menu-class-hierarchy';\n viewName = VIEW_CLASS_HIERARCHY_TITLE;\n helpInfo = HELP_INFO_CLASS_HIERARCHY;\n dialogTitle = ACTION_CLASS_HIERARCHY;\n break;\n\n case 'class-relationships':\n menuSelector = 'menu-explore';\n menuTitle = MENU_EXPLORE_LABEL;\n menuDialogClass = 'menu-explore';\n submenuSelector = 'sub-menu-class-relationships';\n submenuTitle = SUBMENU_CLASS_RELATIONSHIPS_LABEL;\n submenuDialogClass = 'sub-menu-class-relationships';\n viewName = VIEW_CLASS_RELATIONSHIPS_TITLE;\n helpInfo = HELP_INFO_CLASS_RELATIONSHIPS;\n dialogTitle = ACTION_CLASS_RELATIONSHIPS;\n break;\n\n case 'ttyg':\n menuSelector = 'menu-ttyg';\n menuTitle = MENU_TTYG_LABEL;\n menuDialogClass = 'menu-ttyg';\n viewName = MENU_TTYG_LABEL;\n helpInfo = HELP_INFO_TTYG;\n dialogTitle = ACTION_CREATE_TTYG_AGENT;\n break;\n\n case 'similarity':\n menuSelector = 'menu-explore';\n menuTitle = MENU_EXPLORE_LABEL;\n menuDialogClass = 'menu-explore';\n submenuSelector = 'sub-menu-similarity';\n submenuTitle = SUBMENU_SIMILARITY_LABEL;\n submenuDialogClass = 'sub-menu-similarity';\n viewName = SUBMENU_SIMILARITY_LABEL;\n helpInfo = HELP_INFO_SIMILARITY;\n dialogTitle = ACTION_CREATE_SIMILARITY_INDEX;\n break;\n\n case 'rdf-rank':\n menuSelector = 'menu-setup';\n menuTitle = MENU_SETUP_LABEL;\n menuDialogClass = 'menu-setup';\n submenuSelector = 'sub-menu-rdf-rank';\n submenuTitle = RDF_RANK_TITLE;\n submenuDialogClass = 'sub-menu-rdf-rank';\n viewName = RDF_RANK_TITLE;\n helpInfo = HELP_INFO_RDF_RANK;\n break;\n }\n\n const mainMenuClickElementPostSelector = submenuSelector ? ' div' : ' a';\n options.viewName = viewName;\n\n if (!options.title && dialogTitle) {\n options.title = translate(this.translationBundle, dialogTitle);\n }\n\n viewName = translate(this.translationBundle, viewName);\n // View intro element\n if (options.showIntro && options.mainAction) {\n steps.push({\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, 'guide.step-intro.' + options.mainAction, {viewName}),\n extraContent: translate(this.translationBundle, helpInfo),\n extraContentClass: 'alert alert-help text-left',\n skipPoint: true,\n skipButtonLabel: translate(this.translationBundle, SKIP_SECTION),\n ...options\n }\n });\n }\n\n const menuLabel = translate(this.translationBundle, menuTitle);\n const elementSelector = services.GuideUtils.getGuideElementSelector(menuSelector);\n // Main menu element\n steps.push({\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CLICK_MAIN_MENU, {menuLabel}),\n class: menuDialogClass,\n elementSelector,\n beforeShowPromise: () => {\n if (!!submenuSelector && services.GuideUtils.isGuideElementVisible(submenuSelector)) {\n return new Promise((resolve) => {\n services.GuideUtils.clickOnGuideElement(menuSelector, mainMenuClickElementPostSelector)();\n // Needed to wait the layout to complete, before painting, thus avoiding ResizeObserver loop error\n setTimeout(resolve, 500);\n });\n }\n return Promise.resolve();\n },\n\n onNextClick: services.GuideUtils.clickOnGuideElement(menuSelector, mainMenuClickElementPostSelector),\n scrollToHandler: () => services.GuideUtils.scrollIntoView(elementSelector, {block: 'center'}),\n initPreviousStep: (services, stepId) => {\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n if (previousStep) {\n return previousStep.options.initPreviousStep(services, previousStep.options.id);\n }\n\n return Promise.resolve();\n },\n ...options\n }\n });\n\n if (submenuSelector) {\n const submenuLabel = translate(this.translationBundle, submenuTitle);\n const elementSubmenuSelector = services.GuideUtils.getGuideElementSelector(submenuSelector);\n steps.push({\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CLICK_MAIN_MENU, {menuLabel: submenuLabel}),\n class: submenuDialogClass,\n elementSelector: elementSubmenuSelector,\n placement: 'right',\n canBePaused: false,\n onNextClick: services.GuideUtils.clickOnGuideElement(submenuSelector, ' a'),\n scrollToHandler: () => services.GuideUtils.scrollIntoView(elementSubmenuSelector, {block: 'center'}),\n initPreviousStep: (services, stepId) => {\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n if (previousStep) {\n return previousStep.options.initPreviousStep(services, previousStep.options.id);\n }\n\n return Promise.resolve();\n },\n ...options,\n // We might want to click menu + submenu, without intro message. If we configure a skipPoint\n // then it will be added to both steps\n skipPoint: false\n }\n });\n }\n return steps;\n },\n translationBundle: {\n en: {\n [RDF_RANK_TITLE]: 'RDF Rank',\n [CLICK_MAIN_MENU]: 'Click on the <b>{{menuLabel}}</b> menu.',\n [SKIP_SECTION]: 'Skip section',\n [MENU_SETUP_LABEL]: 'Setup',\n [MENU_IMPORT_LABEL]: 'Import',\n [MENU_EXPLORE_LABEL]: 'Explore',\n [MENU_SPARQL_LABEL]: 'SPARQL',\n [MENU_LAB_LABEL]: 'Lab',\n [MENU_TTYG_LABEL]: 'Talk to Your Graph',\n [SUBMENU_REPOSITORIES_LABEL]: 'Repositories',\n [SUBMENU_AUTOCOMPLETE_LABEL]: 'Autocomplete',\n [SUBMENU_CONNECTORS_LABEL]: 'Connectors',\n [SUBMENU_VISUAL_GRAPH_LABEL]: 'Visual graph',\n [SUBMENU_CLASS_HIERARCHY_LABEL]: 'Class hierarchy',\n [SUBMENU_CLASS_RELATIONSHIPS_LABEL]: 'Class relationships',\n [SUBMENU_SIMILARITY_LABEL]: 'Similarity',\n [VIEW_AUTOCOMPLETE_TITLE]: 'Autocomplete index',\n [VIEW_CONNECTOR_MANAGEMENT_TITLE]: 'Connector management',\n [VIEW_SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [VIEW_CLASS_HIERARCHY_TITLE]: 'Class hierarchy',\n [VIEW_CLASS_RELATIONSHIPS_TITLE]: 'Class relationships',\n [HELP_INFO_REPOSITORIES]: 'The Repositories view is used to create, modify and delete repositories and connections to remote GraphDB instances (also known as remote locations).',\n [HELP_INFO_IMPORT]: 'The Import view allows you to import RDF data into a GraphDB repository. Import data from local files, from files on the server where GraphDB is running, from a remote URL, or by pasting the RDF data as a text snippet. Each import method supports various RDF serialisation formats.',\n [HELP_INFO_AUTOCOMPLETE]: 'The Autocomplete index is used for automatic completion of IRIs in the SPARQL editor and the View resource page. Use this view to enable or disable the index and check its status.',\n [HELP_INFO_CONNECTOR_MANAGEMENT]: 'The Connector management view is used to create, manage and view GraphDB connector instances.',\n [HELP_INFO_VISUAL_GRAPH]: 'The Visual graph view provides a visual representation of parts of the RDF graph. The visualisation starts from a single resource and the resources connected to it or from a graph query result. Double-click on resources to expand the graph with their connections.',\n [HELP_INFO_SPARQL_EDITOR]: 'The SPARQL Query & Update view is a unified editor for queries and updates. Enter any SPARQL query or update and click Run to execute it. The view also allows you to save queries for future retrieval and execution in the SPARQL editor.',\n [HELP_INFO_CLASS_HIERARCHY]: 'The Class hierarchy view shows the hierarchy of RDF classes by the number of instances. The biggest circles are the parent classes, and the smaller nested ones are their subclasses. Hover over a given class to see its subclasses or zoom in a nested circle (RDF class) for further exploration.',\n [HELP_INFO_CLASS_RELATIONSHIPS]: 'The Class relationships view shows the relationships between RDF classes, where a relationship is represented by links between the individual instances of two classes. Each link is an RDF statement where the subject is an instance of one class, the object is an instance of another class, and the link is the predicate. Depending on the number of links between the instances of two classes, the bundle can be thicker or thinner, and it receives the colour of the class with more incoming links. The links can be in both directions.',\n [HELP_INFO_TTYG]: '<b>Talk to Your Graph</b> lets you interact with your database through a conversational interface. Ask natural language questions about the data and receive answers generated through the combined power of GraphDB and LLMs. It supports multiple agent configurations and persistent chats for ongoing, contextual conversations.',\n [HELP_INFO_SIMILARITY]: 'The similarity index is used for finding words which have been used in similar contexts to the one which you search for. For example, searching for \"ontology\" will return \"knowledge graph\", while a simple textual similarity could return \"oncology\". This is an alternative for full-text search.',\n [HELP_INFO_RDF_RANK]: 'RDF Rank is an algorithm that identifies the most important or popular entities in the repository by examining their interconnectedness. The popularity of the entities can be used to order the query results. Use this view to configure the RDF rank, recompute it or check the current state.',\n [INTRO_CREATE_REPOSITORY]: 'The following steps show how to use the <b>{{viewName}}</b> view to create a repository.',\n [INTRO_ENABLE_AUTOCOMPLETE]: 'The following steps show how to use the <b>{{viewName}}</b> view to enable the autocomplete index.',\n [INTRO_EXECUTE_SPARQL_QUERY]: 'The following steps show how to use the <b>{{viewName}}</b> view to execute queries.',\n [INTRO_VISUAL_GRAPH]: 'The following steps show how to use the <b>{{viewName}}</b> view to explore data in a visual manner.',\n [INTRO_IMPORT_FILE]: 'The following steps show how to use the <b>{{viewName}}</b> view to import data from a file.',\n [INTRO_CLASS_HIERARCHY]: 'The following steps show how to use the <b>{{viewName}}</b> view to inspect the class hierarchy and gain an insight on what the dataset contains.',\n [INTRO_CREATE_TTYG_AGENT]: 'The following steps show how to use the <b>{{viewName}}</b> view to create an agent.',\n [INTRO_CREATE_SIMILARITY_INDEX]: 'The following steps show how to create a Similarity index for your dataset.',\n [INTRO_CLASS_RELATIONSHIPS]: 'The following steps show how to use the <b>{{viewName}}</b> view to explore how classes are connected and understand the relationships between different types of data in your dataset.',\n [ACTION_CREATE_REPOSITORY]: 'Create repository',\n [ACTION_ENABLE_AUTOCOMPLETE]: 'Enable autocomplete',\n [ACTION_EXECUTE_SPARQL_QUERY]: 'Execute SPARQL query',\n [ACTION_VISUAL_GRAPH]: 'Visual graph explore',\n [ACTION_IMPORT_FILE]: 'Import file',\n [ACTION_CREATE_TTYG_AGENT]: 'Create an agent',\n [ACTION_CREATE_SIMILARITY_INDEX]: 'Create Similarity index',\n [ACTION_CLASS_HIERARCHY]: 'Explore the class hierarchy',\n [ACTION_CLASS_RELATIONSHIPS]: 'Explore the class relationships'\n },\n fr: {\n [RDF_RANK_TITLE]: 'Rang RDF',\n [CLICK_MAIN_MENU]: 'Cliquez sur le menu <b>{{menuLabel}}</b>.',\n [SKIP_SECTION]: 'Sauter la section',\n [MENU_SETUP_LABEL]: 'Configurer',\n [MENU_IMPORT_LABEL]: 'Importer',\n [MENU_EXPLORE_LABEL]: 'Explorez',\n [MENU_SPARQL_LABEL]: 'SPARQL',\n [MENU_LAB_LABEL]: 'Laboratoire',\n [MENU_TTYG_LABEL]: 'Parlez à votre graphe',\n [SUBMENU_REPOSITORIES_LABEL]: 'Dépôts',\n [SUBMENU_AUTOCOMPLETE_LABEL]: 'Autocomplétion',\n [SUBMENU_CONNECTORS_LABEL]: 'Connecteurs',\n [SUBMENU_VISUAL_GRAPH_LABEL]: 'Graphique visuel',\n [SUBMENU_CLASS_HIERARCHY_LABEL]: 'Hiérarchie des classes',\n [SUBMENU_CLASS_RELATIONSHIPS_LABEL]: 'Relations entre les classes',\n [SUBMENU_SIMILARITY_LABEL]: 'Similarité',\n [VIEW_AUTOCOMPLETE_TITLE]: 'Index Autocomplete',\n [VIEW_CONNECTOR_MANAGEMENT_TITLE]: 'Gestion des connecteurs',\n [VIEW_SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [VIEW_CLASS_HIERARCHY_TITLE]: 'Hiérarchie de classe',\n [VIEW_CLASS_RELATIONSHIPS_TITLE]: 'Relations de classe',\n [HELP_INFO_REPOSITORIES]: 'La vue Dépôts est utilisée pour créer, modifier et supprimer des dépôts et des connexions à des instances GraphDB distantes (également appelées emplacements distants).',\n [HELP_INFO_IMPORT]: 'La vue Importation vous permet d\\'importer des données RDF dans un dépôt GraphDB. Importez des données à partir de fichiers locaux, de fichiers sur le serveur sur lequel GraphDB s\\'exécute, d\\'une URL distante, ou en collant les données RDF sous forme d\\'extrait de texte. Chaque méthode d\\'importation prend en charge différents formats de sérialisation.',\n [HELP_INFO_AUTOCOMPLETE]: 'L\\'index Autocomplete est utilisé pour la complétion automatique des IRIs dans l\\'éditeur SPARQL et la page de ressources View. Utilisez cette vue pour activer ou désactiver l\\'index et vérifier son état.',\n [HELP_INFO_CONNECTOR_MANAGEMENT]: 'La vue Gestion des connecteurs est utilisée pour créer, gérer et inspecter les instances de connecteurs GraphDB.',\n [HELP_INFO_VISUAL_GRAPH]: 'La vue Graphique visuel fournit un moyen de créer une représentation visuelle de parties du graphe RDF. La visualisation part d\\'une seule ressource et des ressources qui lui sont connectées ou du résultat d\\'une requête de graphique. Double-cliquez sur les ressources pour développer le graphique avec ses connexions.',\n [HELP_INFO_SPARQL_EDITOR]: 'La vue Requête et mise à jour SPARQL est un éditeur unifié pour les requêtes et les mises à jour. Entrez n\\'importe quelle requête ou mise à jour SPARQL et cliquez sur Exécuter pour l\\'exécuter. La vue vous permet également d\\'enregistrer des requêtes pour une récupération et une exécution futures dans l\\'éditeur SPARQL.',\n [HELP_INFO_CLASS_HIERARCHY]: 'La vue Hiérarchie de classe montre la hiérarchie des classes RDF par nombre d\\'instances. Les cercles les plus grands sont les classes parentes et les cercles plus petits imbriqués sont leurs sous-classes. Passez la souris sur une classe donnée pour voir ses sous-classes ou faites un zoom sur un cercle imbriqué (classe RDF) pour une exploration plus approfondie.',\n [HELP_INFO_CLASS_RELATIONSHIPS]: 'La vue Relations de classe montre les relations entre les classes RDF, où une relation est représentée par des liens entre les instances individuelles de deux classes. Chaque lien est une déclaration RDF où le sujet est une instance d\\'une classe, l\\'objet est une instance d\\'une autre classe et le lien est le prédicat. En fonction du nombre de liens entre les instances de deux classes, le faisceau peut être plus ou moins épais et il prend la couleur de la classe ayant le plus de liens entrants. Les liens peuvent être dans les deux sens.',\n [HELP_INFO_TTYG]: '<b>Parlez à votre graphe</b> vous permet d’interagir avec votre base de données via une interface conversationnelle. Posez des questions en langage naturel sur les données et recevez des réponses générées grâce à la puissance combinée de GraphDB et des LLM. Cette fonctionnalité prend en charge plusieurs configurations d’agents et des discussions persistantes pour des conversations continues et contextuelles.',\n [HELP_INFO_SIMILARITY]: 'L\\'indice de similarité est utilisé pour trouver des mots qui ont été utilisés dans des contextes similaires à celui que vous recherchez. Par exemple, la recherche de \"ontology\" renverra à \"knowledge graph\", tandis qu\\'une simple similarité textuelle renverra à \"oncology\". Il s\\'agit d\\'une alternative à la recherche en texte intégral.',\n [HELP_INFO_RDF_RANK]: 'RDF Rank est un algorithme qui identifie les entités les plus importantes ou les plus populaires dans le dépôt en examinant leur interconnexion. La popularité des entités peut alors être utilisée pour ordonner les résultats des requêtes. Utilisez cette vue pour configurer le RDF Rank, le recalculer ou vérifier l\\'état actuel.',\n [INTRO_CREATE_REPOSITORY]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour créer un dépôt.',\n [INTRO_ENABLE_AUTOCOMPLETE]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour activer l\\'index de saisie semi-automatique.',\n [INTRO_EXECUTE_SPARQL_QUERY]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour exécuter des requêtes.',\n [INTRO_VISUAL_GRAPH]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour explorer les données de manière visuelle.',\n [INTRO_IMPORT_FILE]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour importer des données depuis un fichier.',\n [INTRO_CLASS_HIERARCHY]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour inspecter la hiérarchie des classes et avoir un aperçu du contenu de l\\'ensemble de données .',\n [INTRO_CREATE_TTYG_AGENT]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour créer un agent.',\n [INTRO_CREATE_SIMILARITY_INDEX]: 'Les étapes suivantes montrent comment créer un index de similarité pour votre ensemble de données.',\n [INTRO_CLASS_RELATIONSHIPS]: 'Les étapes suivantes montrent comment utiliser la vue <b>{{viewName}}</b> pour explorer comment les classes sont connectées et comprendre les relations entre différents types de données dans votre jeu de données.',\n [ACTION_CREATE_REPOSITORY]: 'Créer un dépôt',\n [ACTION_ENABLE_AUTOCOMPLETE]: 'Activer la saisie semi-automatique',\n [ACTION_EXECUTE_SPARQL_QUERY]: 'Exécuter une requête SPARQL',\n [ACTION_VISUAL_GRAPH]: 'Explorer le graphique visuel',\n [ACTION_IMPORT_FILE]: 'Importer un fichier',\n [ACTION_CREATE_TTYG_AGENT]: 'Créer un agent',\n [ACTION_CREATE_SIMILARITY_INDEX]: 'Créer un indice de similitude',\n [ACTION_CLASS_HIERARCHY]: 'Explorer la hiérarchie des classes',\n [ACTION_CLASS_RELATIONSHIPS]: 'Explorer les relations entre classes'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const FTS_METHOD_DEFAULT_TITLE = 'guide.step-action.fts-search-method';\nconst ENABLE_TOGGLE = 'guide.step_plugin.fts-search-method.enable-toggle';\n\n/**\n * @name ttyg-fts-method-enable\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable the FTS search query method in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable FTS search query method<br>\n * <img src=\"resources/guides/ttyg/ttyg-fts-method-enable.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-fts-method-enable\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-fts-method-enable',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-fts_search-input');\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n content: translate(this.translationBundle, ENABLE_TOGGLE),\n title: translate(this.translationBundle, FTS_METHOD_DEFAULT_TITLE),\n class: 'toggle-fts-search',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-fts_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [FTS_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [ENABLE_TOGGLE]: 'Click on the toggle to enable FTS search query method.'\n },\n fr: {\n [FTS_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [ENABLE_TOGGLE]: 'Cliquez sur le bouton pour activer la méthode de recherche FTS.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorContentSelector, getConnectorNameSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst OPEN_VIEW_SPARQL_DIALOG = 'guide.step_plugin.connectors-open-view-sparql-query-dialog.content';\n\n/**\n * @name connectors-open-view-sparql-query-dialog\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to open the \"View SPARQL Query\" dialog.\n *\n * View SPARQL Query dialog example<br>\n * <img src=\"resources/guides/connectors/connectors-open-view-sparql-query-dialog.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the section is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-open-view-sparql-query-dialog\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-open-view-sparql-query-dialog',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n */\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const connectorNameSelector = getConnectorNameSelector(options, services);\n const connectorContentSelector = getConnectorContentSelector(options, services);\n const openViewSPARQLDialogSelector = GuideUtils.getGuideElementSelector('open-view-sparql-query-dialog');\n const elementSelector = `${connectorNameSelector} ${connectorContentSelector} ${openViewSPARQLDialogSelector}`;\n return [{\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'open-view-sparql-query-dialog',\n content: translate(this.translationBundle, OPEN_VIEW_SPARQL_DIALOG),\n ...options,\n elementSelector,\n url: 'connectors',\n onNextClick: () => {\n GuideUtils.clickOnElement(elementSelector)();\n }\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [OPEN_VIEW_SPARQL_DIALOG]: 'Click on <b>View SPARQL Query</b> to view the connector creation query.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [OPEN_VIEW_SPARQL_DIALOG]: 'Cliquez sur <b>Voir la requête SPARQL</b> pour afficher la requête de création du connecteur.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CREATE_SIMILARITY_INDEX_DEFAULT = 'guide.step-action.create-similarity-index';\nconst INPUT_INDEX_NAME = 'guide.step_plugin.create-similarity-index.input-index-name';\n\n/**\n * @name similarity-type-index-name\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to type a name for the similarity index.\n *\n * Type a name for the similarity index<br>\n * <img src=\"resources/guides/similarity-index/similarity-type-index-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-type-index-name\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'similarity-type-index-name',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, INPUT_INDEX_NAME),\n title: translate(this.translationBundle, CREATE_SIMILARITY_INDEX_DEFAULT),\n class: 'similarity-index-name-input',\n ...options,\n url: 'similarity/index/create',\n elementSelector: GuideUtils.getGuideElementSelector('similarity-index-name'),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInputNotEmpty(GuideUtils.getGuideElementSelector('similarity-index-name')))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Create Similarity index',\n [INPUT_INDEX_NAME]: 'Type a name for the index. You will refer to it later.'\n },\n fr: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Créer un indice de similitude',\n [INPUT_INDEX_NAME]: 'Saisissez un nom pour l\\'index. Vous y ferez référence ultérieurement.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-class-list-selection.content';\n\n/**\n * @name class-relationships-class-list-selection\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-class-list-selection` step displays a dialog that explains how users can add or remove classes from the diagram.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-class-list-selection.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-class-list-selection\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-class-list-selection',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'focus-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('class-list'),\n placement: 'right',\n class: 'class-relationships-class-list-selection',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'Use the <b>+ / –</b> icons next to each class name to add or remove it from the diagram display.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Utilisez les icônes <b>+ / –</b> à côté de chaque nom de classe pour l\\'ajouter ou la retirer de l\\'affichage du diagramme.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_EDIT_AGENT_DEFAULT_TITLE = 'guide.step-action.edit-ttyg-agent';\nconst EDIT_TTYG_AGENT = 'guide.step_plugin.edit-ttyg-agent.intro';\nconst SKIP_SECTION = 'btn.skip-section';\n\n/**\n * @name ttyg-edit-agent-intro-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an introductory message when editing a TTYG agent.\n * It informs the user that an agent's configuration can be reconfigured at any time.\n *\n * Edit agent intro message<br>\n * <img src=\"resources/guides/ttyg/ttyg-edit-agent-intro-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-edit-agent-intro-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-edit-agent-intro-message',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, EDIT_TTYG_AGENT),\n title: translate(this.translationBundle, TTYG_EDIT_AGENT_DEFAULT_TITLE),\n skipPoint: true,\n skipButtonLabel: translate(this.translationBundle, SKIP_SECTION),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Edit an agent',\n [EDIT_TTYG_AGENT]: 'An agent\\'s configuration such as the extraction methods can be reconfigured at any time',\n [SKIP_SECTION]: 'Skip section'\n },\n\n fr: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Modifier un agent',\n [EDIT_TTYG_AGENT]: 'La configuration d\\'un agent, comme les méthodes d\\'extraction, peut être reconfigurée à tout moment.',\n [SKIP_SECTION]: 'Sauter la section'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst FACET_INTRO = 'guide.step_plugin.connectors-lucene-fields-facet-intro.content';\n\n/**\n * @name connectors-lucene-fields-facet-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Facet\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Facet\" option in determining whether a field is available for faceted searches in Lucene.\n *\n * Lucene connector facet introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-facet-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-facet-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-facet-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, FACET_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-facet-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'facet'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [FACET_INTRO]: 'The <b>Facet</b> option specifies whether the field is available for faceted searches in Lucene. Managed by the facet option (boolean, true by default).'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [FACET_INTRO]: 'L’option <b>Facette</b> spécifie si le champ est disponible pour les recherches à facettes dans Lucene. Géré par l’option facet (booléen, true par défaut).'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name conversation-with-ttyg-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user through a conversation with a TTYG agent.\n * It includes an optional info message, steps to start a new conversation\n *\n * Conversation info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-conversation-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Create new chat<br>\n * <img src=\"resources/guides/ttyg/ttyg-click-to-create-new-chat.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @property {boolean} [startNewConversation] - Whether to include steps to start a new conversation.\n * @property {boolean} [showInfo] - Whether to show an informational message at the start of the conversation.\n * @property {Array} questions - An array of question objects to ask the TTYG agent. Each object should\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"conversation-with-ttyg-agent\",\n * \"options\": {\n * \"startNewConversation\": true,\n * \"showInfo\": true,\n * \"questions\": [{\n * \"question\": \"What is the capital of France?\"\n * }]\n * }\n * }\n * ```\n *\n */\nconst step = {\n guideBlockName: 'conversation-with-ttyg-agent',\n getSteps: (options, services) => {\n const GuideUtils = services.GuideUtils;\n options.mainAction = 'conversation-with-ttyg-agent';\n const startNewConversation = options.startNewConversation;\n const showInfo = options.showInfo;\n\n const steps = [];\n\n if (showInfo) {\n steps.push({\n guideBlockName: 'ttyg-conversation-info-message',\n options: {...options}\n });\n }\n\n if (startNewConversation) {\n const createChatBtnSelector = GuideUtils.getGuideElementSelector('create-chat-btn');\n const newConversationStartSteps = [\n {\n // If button is not visible for some reason, skip the whole step\n guideBlockName: 'info-message',\n options: {\n url: 'ttyg',\n beforeShowPromise: (guide, currentStep) => GuideUtils.waitFor(createChatBtnSelector, 1)\n .then(() => {\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.next());\n })\n .catch(() => {\n const stepId = currentStep.id;\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.show(stepId + 2));\n }),\n ...options\n }\n },\n {\n guideBlockName: 'ttyg-click-to-create-new-chat', options: {...options}\n }\n ];\n steps.push(...newConversationStartSteps);\n }\n\n const questionSteps = options.questions.map((questionWithOptions) => {\n return {\n guideBlockName: 'ask-ttyg-agent',\n options: questionWithOptions\n };\n });\n\n steps.push(...questionSteps);\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst QUERY_CONTENT = 'guide.step_plugin.class-hierarchy-instances-query.content';\nconst RESULTS_CONTENT = 'guide.step_plugin.class-hierarchy-instances-results.content';\nconst RESULTS_EXTRA_CONTENT = 'guide.step_plugin.class-hierarchy-instances-results.extraContent';\nconst RDF_INSTANCES_TITLE = 'guide.step_plugin.class-hierarchy-instances.title';\nconst SKIP_SECTION = 'skip.section';\n\n/**\n * @name class-hierarchy-instances\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is a complex step that includes several sub-steps to guide the user through viewing and understanding\n * RDF instances of a class in the class hierarchy.\n *\n * Open RDF instances side panel<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-open-rdf-instances-side-panel.png\" style=\"height:200px; border: solid;\"><br>\n *\n * Side panel introduction<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-intro.png\" style=\"height:200px; border: solid\"><br>\n *\n * Explain RDF instance<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-explain-rdf-instance.png\" style=\"height:200px; border: solid\"><br>\n *\n * Open all instances in SPARQL<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql.png\" style=\"height:200px; border: solid\"><br>\n *\n * SPARQL editor explanation<br>\n * <img src=\"resources/guides/class-hierarchy/sparql-explain-editor.png\" style=\"height:200px; border: solid\"><br>\n *\n * SPARQL results explanation<br>\n * <img src=\"resources/guides/class-hierarchy/sparql-results-explain.png\" style=\"height:200px; border: solid\"><br>\n *\n * Close RDF instances side panel<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-close-rdf-instances-side-panel.png\" style=\"height:200px; border: solid\"><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.iri`\n *\n * @property {string} options.iri - The IRI of the class whose instances are to be viewed. This option is required.\n * @property {Array.<string|Object>} [options.focusInstances] - An array of instances to focus on. Each entry can be a string (the instance IRI)\n * @property {boolean} [options.followCountLink] - Whether to follow the count link when the RDF instance count is clicked.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-instances\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\",\n * \"focusInstances\": [\n * \"imdb:title/Superman\",\n * \"imdb:title/Mulan\"\n * ],\n * \"followCountLink\": true\n * }\n * },\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-instances',\n /**\n *\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const RoutingUtil = pluginService.RoutingUtil;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, RDF_INSTANCES_TITLE);\n const closeButtonSelector = GuideUtils.getGuideElementSelector('close-info-panel');\n const clasInstanceSelector = GuideUtils.getGuideElementSelector('class-' + options.iri);\n const instanceCountSelector = GuideUtils.getGuideElementSelector('instances-count');\n const steps = [\n {\n guideBlockName: 'class-hierarchy-open-rdf-instances-side-panel',\n options: {\n title,\n initPreviousStep: () => {\n if (!GuideUtils.isVisible(closeButtonSelector)) {\n return Utils.reloadAndOpenInfoPanel({RoutingUtil, GuideUtils}, clasInstanceSelector);\n }\n\n return Promise.resolve();\n },\n ...options\n }\n },\n {\n guideBlockName: 'class-hierarchy-rdf-instances-side-panel-intro',\n options: {\n title,\n skipPoint: true,\n skipButtonLabel: translate(this.translationBundle, SKIP_SECTION),\n beforeShowPromise: GuideUtils.deferredShow(800),\n onPreviousClick: () => new Promise(function(resolve) {\n GuideUtils.waitFor(closeButtonSelector, 1)\n .then(() => document.querySelector(closeButtonSelector).click());\n resolve();\n }),\n ...options\n }\n }\n ];\n\n if (Array.isArray(options.focusInstances)) {\n options.focusInstances.forEach((focusInstance) => {\n if (!GuideUtils.isObject(focusInstance)) {\n focusInstance = {\n instance: focusInstance\n };\n }\n steps.push({\n guideBlockName: 'class-hierarchy-explain-rdf-instance',\n options: {\n title,\n instance: focusInstance.instance,\n extraContent: focusInstance.message,\n ...options\n }\n });\n });\n }\n\n let urlBeforeFollowCountLink = null;\n\n if (options.followCountLink) {\n steps.push({\n guideBlockName: 'class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql',\n options: {\n title,\n show: () => () => {\n urlBeforeFollowCountLink = window.location.href;\n },\n ...options\n }\n });\n\n steps.push({\n guideBlockName: 'sparql-explain-editor',\n options: {\n title,\n content: pluginService.translate(this.translationBundle, QUERY_CONTENT, {iri: options.iri}),\n ...options\n }\n });\n\n const extraContent = options.showExtraCommentSparql !== false ? pluginService.translate(this.translationBundle, RESULTS_EXTRA_CONTENT) : null;\n steps.push({\n guideBlockName: 'sparql-results-explain',\n options: {\n title,\n extraContent,\n content: pluginService.translate(this.translationBundle, RESULTS_CONTENT),\n onNextClick: (guide) => {\n RoutingUtil.navigate(urlBeforeFollowCountLink);\n guide.next();\n },\n initPreviousStep: () => Promise.resolve(),\n ...options\n }\n });\n }\n\n steps.push({\n guideBlockName: 'class-hierarchy-close-rdf-instances-side-panel',\n options: {\n title,\n // If we followed the count link we come back here from another view\n // and the side panel needs time to open\n beforeShowPromise: options.followCountLink ? GuideUtils.deferredShow(1500) : Promise.resolve(),\n initPreviousStep: (services, stepId) => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n // If method is called from same step just click count link\n if (currentStepId === stepId && options.followCountLink) {\n return GuideUtils.waitFor(instanceCountSelector, 3)\n .then(() => {\n document.querySelector(instanceCountSelector).click();\n return GuideUtils.waitFor(GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_SELECTOR, 3)\n .then(() => GuideUtils.deferredShow(50)());\n });\n }\n // If is called from other step we have to reload and open the info panel.\n return Utils.reloadAndOpenInfoPanel({RoutingUtil, GuideUtils}, clasInstanceSelector);\n },\n ...options\n }\n });\n\n return steps;\n },\n translationBundle: {\n en: {\n [QUERY_CONTENT]: 'This SPARQL query selects all instances of the class <b>{{iri}}</b>. The query was entered automatically when you clicked on the view instances link.',\n [RESULTS_CONTENT]: 'The table shows the results. Note that in this particular case, the query was executed automatically.',\n [RESULTS_EXTRA_CONTENT]: 'Do not worry &mdash; there will be a dedicated section on the SPARQL editor later in the guide.',\n [RDF_INSTANCES_TITLE]: 'Class hierarchy instances',\n [SKIP_SECTION]: 'Skip section'\n },\n\n fr: {\n [QUERY_CONTENT]: 'Cette requête SPARQL sélectionne toutes les instances de la classe <b>{{iri}}</b>. La requête a été saisie automatiquement lorsque vous avez cliqué sur la vue lien d\\'instances.',\n [RESULTS_CONTENT]: 'Le tableau montre les résultats. Notez que dans ce cas particulier, la requête a été exécutée automatiquement.',\n [RESULTS_EXTRA_CONTENT]: 'Ne vous inquiétez pas &mdash; il y aura une section dédiée à l\\'éditeur SPARQL plus tard dans le guide.',\n [RDF_INSTANCES_TITLE]: 'Instances de hiérarchie de classes',\n [SKIP_SECTION]: 'Sauter la section'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const RESOURCE_SEARCH_RDF_TITLE = 'guide.step-action.resource-search-rdf';\nconst RESOURCE_SEARCH_RDF_CONTENT = 'guide.step-action.resource-search-rdf-content';\n\n/**\n * @name resource-search-rdf\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-search-rdf` guide step prompts the user to enter node search term in the search field.\n * This is a reusable step that can be used everywhere a rdf-search input is present\n *\n * Resource search input example:<br>\n * <img src=\"resources/guides/resource/resource-search-rdf.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} [options.searchTerm] - The search term to be entered by the user.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-search-rdf\",\n * \"options\": {\n * \"searchTerm\": \"http://example.org/resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-search-rdf',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('search-resource-input');\n const searchTerm = options.searchTerm || '';\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, RESOURCE_SEARCH_RDF_CONTENT, {searchTerm}),\n title: translate(this.translationBundle, RESOURCE_SEARCH_RDF_TITLE),\n ...options,\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(elementSelector, searchTerm))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_SEARCH_RDF_TITLE]: 'Resource search',\n [RESOURCE_SEARCH_RDF_CONTENT]: 'Enter the following text: <b>{{searchTerm}}</b>'\n },\n fr: {\n [RESOURCE_SEARCH_RDF_TITLE]: 'Recherche de ressource',\n [RESOURCE_SEARCH_RDF_CONTENT]: 'Entrez le texte suivant : <b>{{searchTerm}}</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","/**\n * @name sparql-search-method-enable-sparql-query\n * @memberof module:Interactive Guide\n *\n * @description\n * This is a complex step that guides the user through enabling the option to provide a SPARQL CONSTRUCT query that fetches the ontology for the SPARQL search method in the TTYG interface.\n * It includes steps to enable the option, select the SPARQL query option, copy the example query text, and optionally add missing namespaces.\n *\n * SPARQL query select<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-sparql-query-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Copy query text<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-copy-query-text.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Add missing namespaces<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-click-add-namespaces.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n * @property {boolean} [options.addMissingNamespaces] - If true, an additional step will be included to click on the \"Add missing namespaces\" after copying the query text.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-search-method-enable-sparql-query\",\n * \"options\": {\n * \"addMissingNamespaces\": true\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-search-method-enable-sparql-query',\n getSteps: (options, _services) => {\n const steps = [\n {\n guideBlockName: 'ttyg-sparql-method-sparql-query-select', options: {...options}\n },\n {\n guideBlockName: 'ttyg-sparql-copy-query-text', options: {...options}\n }\n ];\n\n if (options.addMissingNamespaces) {\n steps.push({\n guideBlockName: 'ttyg-sparql-click-add-namespaces', options: {...options}\n });\n }\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.import-file';\nconst CONTENT = 'guide.step_plugin.import_rdf_file.content';\nconst UPLOAD_FILE_ERROR = 'guide.step_plugin.import_rdf_file.file-must-be-uploaded';\nconst UNEXPECTED_FILE = 'guide.step_plugin.import_rdf_file.unexpected-file';\n\n/**\n * @name import-upload-rdf-file\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `import-upload-rdf-file` step guides the user to click the button to upload an RDF file in GraphDB.<br>\n * <img src=\"resources/guides/import/import-upload-rdf-file.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following options:\n * @property {string} resourceFile - The name of the resource file that should be downloaded in the step.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"import-upload-rdf-file\",\n * \"options\": {\n * \"resourceFile\": \"example.rdf\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'import-upload-rdf-file',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const toastr = services.toastr;\n const $translate = services.$translate;\n const translate = services.translate;\n const $interpolate = services.$interpolate;\n const EventEmitterService = services.EventEmitterService;\n const importSettingsButtonSelector = GuideUtils.getGuideElementSelector('import-settings-import-button');\n let filesForUploadSelectedSubscription;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(step.translationBundle, CONTENT, {resourceFile: options.resourceFile}),\n class: 'upload-rdf-file-button',\n title: translate(step.translationBundle, DEFAULT_TITLE),\n ...options,\n url: 'import',\n elementSelector: GuideUtils.getGuideElementSelector('uploadRdfFileButton'),\n // Disable default behavior of service when element is clicked.\n advanceOn: undefined,\n show: (guide) => () => {\n // Subscribes to event \"filesForUploadSelected\", when the step is showing, this will give opportunity\n // to canceling uploading if user not choose correct file.\n filesForUploadSelectedSubscription = EventEmitterService.subscribe('filesForUploadSelected', ((eventData) => {\n const uploadedFiles = eventData.files || [];\n if (uploadedFiles.some((uploadedFile) => uploadedFile.name === options.resourceFile)) {\n // When tha correct file is selected, the guide can continue.\n\n // Check for duplicated name, if import button for guide rdf data exist.\n if (GuideUtils.isVisible(GuideUtils.getGuideElementSelector('import-file-' + options.resourceFile))) {\n GuideUtils.getOrWaitFor('.confirm-duplicate-files-dialog')\n .then(() => guide.next());\n } else {\n GuideUtils.getOrWaitFor(importSettingsButtonSelector)\n .then(() => guide.next());\n }\n } else {\n // Canceling the automatic uploading of files\n // because the guide rdf file is not selected.\n GuideUtils.noNextErrorToast(toastr, $translate, $interpolate, translate(this.translationBundle, UNEXPECTED_FILE, {resourceFile: options.resourceFile}), options);\n eventData.cancel = true;\n }\n }));\n },\n hide: () => () => {\n if (filesForUploadSelectedSubscription) {\n filesForUploadSelectedSubscription();\n }\n },\n onNextValidate: () => {\n return Promise.allSettled([GuideUtils.getOrWaitFor('.confirm-duplicate-files-dialog'), GuideUtils.getOrWaitFor(GuideUtils.getGuideElementSelector('import-file-' + options.resourceFile))])\n .then(([confirmDialogPromise, importButtonPromise]) => {\n // There are two ways to exit this step:\n // if the duplication dialog is opened\n // or if the import button for the guide file is displayed.\n // The first scenario indicates that the user is trying to upload the same file,\n // while the second scenario suggests\n // that the guide has been started more than once.\n if ('rejected' === confirmDialogPromise.status && 'rejected' === importButtonPromise.status) {\n const uploadFileError = translate(this.translationBundle, UPLOAD_FILE_ERROR, {resourceFile: options.resourceFile});\n // TODO should be reworked with GDB-13089\n GuideUtils.noNextErrorToast(toastr, $translate, $interpolate, uploadFileError, options);\n return false;\n }\n return true;\n });\n },\n onNextClick: (guide) => {\n GuideUtils.getOrWaitFor(GuideUtils.getGuideElementSelector('import-file-' + options.resourceFile))\n .then((element) => {\n // If we have file import button for the guide rdf file,\n // this indicates that we go through this step for the second time.\n // This can happen if the user starts the guide for the second time.\n element.click();\n })\n .finally(() => guide.next());\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Import file',\n [CONTENT]: 'Click on the <b>Upload RDF files</b> button and choose a file with the name <b>{{resourceFile}}</b>.',\n [UPLOAD_FILE_ERROR]: 'Upload the file <b>{{resourceFile}}</b> first',\n [UNEXPECTED_FILE]: 'The uploaded file does not match the expected resource. Please upload <b>{{resourceFile}}</b>.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Importer un fichier',\n [CONTENT]: 'Cliquez sur le bouton <b>Télécharger des fichiers RDF</b> et choisissez un fichier avec le nom <b>{{resourceFile}}</b>.',\n [UPLOAD_FILE_ERROR]: 'Téléchargez d\\'abord le fichier <b>{{resourceFile}}</b>',\n [UNEXPECTED_FILE]: 'Le fichier importé ne correspond pas à la ressource attendue. Veuillez importer <b>{{resourceFile}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.similarity-search-method';\nconst SIMILARITY_CONTENT = 'guide.step_plugin.similarity-search-method.content';\n\n/**\n * @name ttyg-similarity-info-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an informational message about the Similarity search query method in the TTYG interface.\n * It explains the benefits and use cases of enabling Similarity search.\n *\n * Similarity info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-similarity-info-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-similarity-info-message',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, SIMILARITY_CONTENT),\n class: 'info-similarity-search',\n title: translate(this.translationBundle, SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE),\n ...options,\n url: 'ttyg'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [SIMILARITY_CONTENT]: 'Enabling Similarity search allows the agent to answer questions by using Similarity search. Performs well on open-ended questions but not so well on providing aggregations.'\n },\n fr: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [SIMILARITY_CONTENT]: 'L\\'activation de la recherche par similarité permet à l\\'agent de répondre aux questions en utilisant la recherche par similarité. Les résultats sont bons pour les questions ouvertes, mais moins bons pour les agrégations.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_EDIT_AGENT_DEFAULT_TITLE = 'guide.step-action.edit-ttyg-agent';\nconst SAVE_AGENT = 'guide.step_plugin.edit-ttyg-agent.save-agent-settings';\n\n/**\n * @name ttyg-edit-agent-click-to-save\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click the save button after editing a TTYG agent.\n *\n * Click on save to save the edited agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-edit-agent-click-to-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-edit-agent-click-to-save\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-edit-agent-click-to-save',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, SAVE_AGENT),\n title: translate(this.translationBundle, TTYG_EDIT_AGENT_DEFAULT_TITLE),\n class: 'save-agent',\n disablePreviousFlow: false,\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('save-agent-settings')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Edit an agent',\n [SAVE_AGENT]: 'Click to save the agent settings.'\n },\n\n fr: {\n [TTYG_EDIT_AGENT_DEFAULT_TITLE]: 'Modifier un agent',\n [SAVE_AGENT]: 'Cliquez sur pour enregistrer les paramètres de l\\'agent.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.autocomplete.default.title';\nconst CONTENT = 'guide.step_plugin.autocomplete-focus-on-indexing-status.content';\n\n/**\n * @name autocomplete-focus-on-indexing-status\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `autocomplete-focus-on-indexing-status` step produces a step that describes user that have to wait until indexing finished and shows\n * where they can see the status of autocomplete indexing process.<br>\n * <img src=\"resources/guides/autocomplete/autocomplete-focus-on-indexing-status.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * The autocomplete-focus-on-indexing-status step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"autocomplete-focus-on-indexing-status\"\n * }\n * ```\n *\n */\nconst step = {\n guideBlockName: 'autocomplete-focus-on-indexing-status',\n getSteps: function(options, services) {\n const translate = services.translate;\n\n return {\n guideBlockName: 'read-only-element',\n options: {\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options,\n url: 'autocomplete',\n elementSelector: services.GuideUtils.getGuideElementSelector('autocompleteStatus'),\n class: 'autocomplete-status-info',\n canBePaused: false\n }\n };\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Enable autocomplete',\n [CONTENT]: 'Wait until indexing finished.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Activer la saisie semi-automatique',\n [CONTENT]: 'Attendez que l\\'indexation soit terminée.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","// eslint-disable-next-line no-unused-vars\nimport {Options} from '../options.js';\n\n/**\n * @name welcome\n * @memberof module:Interactive Guide\n *\n * @description\n * The Welcome step produces two steps:\n *\n * - The first step onboards users on how to interact with the guide dialogs. It explains the basic concepts, provides hints,\n * and describes the overall purpose of the guide.<br>\n * <img src=\"resources/guides/welcome/welcome_1.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * - The second step shows the description for the specific guide being run. The content is passed through the option\n * `translatedGuideDescription`.<br>\n * <img src=\"resources/guides/welcome/welcome_2.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * The Welcome step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"welcome\"\n * }\n * ```\n *\n */\nconst step = {\n guideBlockName: 'welcome',\n /**\n *\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = translate(this.translationBundle, 'guide.step_plugin.welcome.title', {translatedGuideName: options.translatedGuideName});\n const infoIconHint = translate(this.translationBundle, 'guide.step_plugin.welcome.info-icon-hint');\n const mouseIconHint = translate(this.translationBundle, 'guide.step_plugin.welcome.mouse-icon-hint');\n const inputIconHint = translate(this.translationBundle, 'guide.step_plugin.welcome.input-icon-hint');\n\n return [\n {\n guideBlockName: 'info-message',\n options: {\n title,\n content: translate(this.translationBundle, 'guide.step_plugin.welcome.content', {\n infoIconHint,\n mouseIconHint,\n inputIconHint\n })\n }\n },\n {\n guideBlockName: 'info-message',\n options: {\n title,\n content: translate(this.translationBundle, 'guide.step_plugin.welcome-what.content', {translatedGuideDescription: options.translatedGuideDescription})\n }\n }\n ];\n },\n // TODO: The translations contains icon that belong to the client application, this should be handled differently via plugin service.\n translationBundle: {\n en: {\n 'guide.step_plugin.welcome.title': 'Welcome to {{translatedGuideName}}',\n 'guide.step_plugin.welcome.content': 'Throughout the guide you will see boxes like this one that will provide instructions on what to do.<p>The icon in the top left corner is a hint too:<ul><li>{{infoIconHint}}</li><li>{{mouseIconHint}}</li><li>{{inputIconHint}}</li></ul></p>',\n 'guide.step_plugin.welcome.info-icon-hint': '<span class=\"icon icon-1-5x icon-info\"></span> means the box provides information.',\n 'guide.step_plugin.welcome.mouse-icon-hint': '<span class=\"icon icon-1-5x icon-focus\"></span> asks you to do something with the mouse.',\n 'guide.step_plugin.welcome.input-icon-hint': '<span class=\"icon icon-1-5x icon-edit\"></span> tells you to type or paste something.',\n 'guide.step_plugin.welcome-what.content': '{{translatedGuideDescription}}<p>Let\\'s get started for real now!</p>'\n },\n fr: {\n 'guide.step_plugin.welcome.title': 'Bienvenue dans {{translatedGuideName}}',\n 'guide.step_plugin.welcome.content': 'Tout au long du guide, vous verrez des boîtes comme celle-ci qui fourniront des instructions sur ce qu\\'il faut faire.<p>L\\'icône dans le coin supérieur gauche est également un indice :<ul><li>{{infoIconHint}}</li><li>{{mouseIconHint}}</li><li>{{inputIconHint}}</li></ul></p>',\n 'guide.step_plugin.welcome.info-icon-hint': '<span class=\"icon icon-1-5x icon-info\"></span> signifie que la boîte fournit des informations.',\n 'guide.step_plugin.welcome.mouse-icon-hint': '<span class=\"icon icon-1-5x icon-focus\"></span> vous demande de faire quelque chose avec la souris.',\n 'guide.step_plugin.welcome.input-icon-hint': '<span class=\"icon icon-1-5x icon-edit\"></span> vous dit de taper ou de coller quelque chose.',\n 'guide.step_plugin.welcome-what.content': '{{translatedGuideDescription}}<p>Commençons pour de vrai maintenant !</p>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPAND_TITLE = 'guide.step_plugin.visual-graph-expand.title';\nconst VISUAL_GRAPH_EXPAND_CONTENT = 'guide.step_plugin.visual-graph-expand.content';\n\n/**\n * @name visual-graph-expand\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-expand` guide step that explains how to expand a node in the Visual Graph by double-clicking it.\n *\n * <img src=\"resources/guides/visual-graph/visual-graph-expand.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is available:\n *\n * Options:\n * @property {string} [options.iri] - The IRI used to build the element selector for the node and in the translations.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-expand\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\",\n * \"iriLabel\": \"my resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-expand',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const $rootScope = services.$rootScope;\n const $route = services.$route;\n const translate = services.translate;\n const elementSelector = `.node-wrapper[id^=\"${options.iri}\"] circle`;\n\n // Expands visual graph when a node is double-clicked.\n const dblClickFunction = (guide) => () => {\n GuideUtils.graphVizExpandNode(elementSelector);\n guide.getCurrentStep().hide();\n GuideUtils.awaitAlphaDropD3(null, $rootScope)()\n .then(() => {\n guide.next();\n });\n };\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPAND_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_EXPAND_CONTENT, {iriLabel: options.iriLabel}),\n url: 'graphs-visualizations',\n canBePaused: false,\n class: 'visual-graph-expand-node',\n elementSelector,\n // Disable default behavior of service when element is clicked.\n advanceOn: undefined,\n onNextClick: (guide) => {\n GuideUtils.graphVizExpandNode(elementSelector);\n guide.getCurrentStep().hide();\n GuideUtils.awaitAlphaDropD3(null, $rootScope)()\n .then(() => {\n guide.next();\n });\n },\n show: (guide) => () => {\n // Add \"dblclick\" listener to the element. Processing of double-click event is disabled for the visual graph when guide is started.\n // So we have expanded the graph manually when a selected node is double-clicked.\n $(elementSelector).on('dblclick.onNodeDbClicked', dblClickFunction(guide));\n },\n hide: () => () => {\n // Remove the \"dblclick\" listener of element. It is important when step is hided.\n $(elementSelector).off('dblclick.onNodeDbClicked');\n },\n beforeShowPromise: () => {\n $route.reload();\n // in some cases reloading starts after the defer and alpha drop. In such cases the step is shown, the page is\n // reloaded and shepherd detaches from the element. We do two deferred shows to ensure the reload has started and then wait for the d3 alpha to drop, so we ensure the correct order\n return GuideUtils.deferredShow()()\n .then(GuideUtils.deferredShow(50))\n .then(GuideUtils.awaitAlphaDropD3(elementSelector, $rootScope));\n },\n initPreviousStep: (services, stepId) => {\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.id)\n .then(() => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n // Skip expanding of node if last step is \"visual-graph-expand\"\n if (currentStepId === stepId) {\n return Promise.resolve;\n }\n\n GuideUtils.graphVizExpandNode(elementSelector);\n return GuideUtils.deferredShow(50)()\n .then(() => {\n return GuideUtils.awaitAlphaDropD3(null, $rootScope)();\n });\n });\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPAND_TITLE]: 'Visual graph: expand node',\n [VISUAL_GRAPH_EXPAND_CONTENT]: 'Double click on <b>{{iriLabel}}</b> to expand the graph.'\n },\n fr: {\n [VISUAL_GRAPH_EXPAND_TITLE]: 'Graphe visuel : développer un nœud',\n [VISUAL_GRAPH_EXPAND_CONTENT]: 'Double-cliquez sur <b>{{iriLabel}}</b> pour développer le graphique.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\n\n/**\n * @name create-repository\n * @memberof module:Interactive Guide\n *\n * @description\n * Complex step, guiding the user through the creation of a new repository.\n * The step consists of the following steps:\n *\n * Click on the \"Create repository\" button.<br>\n * <img src=\"resources/guides/repository/repositories-create-repository.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Create GraphDB repository.<br>\n * <img src=\"resources/guides/repository/repositories-create-graphdb.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Enter a repository ID.<br>\n * <img src=\"resources/guides/repository/repositories-id-input.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * (Optional) Select a ruleset.<br>\n * <img src=\"resources/guides/repository/repositories-ruleset-dropdown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * (Optional) Enable full-text search.<br>\n * <img src=\"resources/guides/repository/repositories-enable-fts.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Save the repository.<br>\n * <img src=\"resources/guides/repository/repositories-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following options:\n * @property {string} [rulesetName] - If this option is present, a dropdown will be displayed to select a ruleset.\n * @property {boolean} [fts] - If this option is present, a checkbox will be displayed to enable full-text search.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"create-repository\",\n * \"options\": {\n * \"rulesetName\": \"my-ruleset\",\n * \"fts\": true\n * }\n * }\n */\nconst step = {\n guideBlockName: 'create-repository',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n options.mainAction = 'create-repository';\n options.title = options.title ?? translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE);\n\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'repositories',\n showIntro: true,\n ...options\n }\n },\n {guideBlockName: 'repositories-create-repository', options: {...options}},\n {guideBlockName: 'repositories-create-graphdb', options: {...options}},\n {guideBlockName: 'repositories-id-input', options: {...options}}\n ];\n\n if (options.rulesetName) {\n steps.push({guideBlockName: 'repositories-ruleset-dropdown', options: {...options}});\n }\n if (options.fts) {\n steps.push({guideBlockName: 'repositories-enable-fts', options: {...options}});\n }\n\n steps.push({guideBlockName: 'repositories-save', options: {...options}});\n\n return steps;\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_PROPERTIES_HINT = 'guide.step-action.visual-graph-config-hint';\n\n/**\n * @name visual-graph-config-hint\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-config-hint` guide step prompts the user to type a hint for their visual graph configuration.\n *\n * Configure graph hint<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-hint.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} [options.configHint] - The hint of the visual graph configuration to be entered by the user.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-config-hint\",\n * \"options\": {\n * \"configHint\": \"http://example.org/resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-hint',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-config-hint');\n const configHint = options.configHint || '';\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_PROPERTIES_HINT, {configHint}),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n ...options,\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(elementSelector, configHint))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_HINT]: 'Copy and use the following IRI as the starting point for the visual graph: <b>{{configHint}}</b>'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_HINT]: 'Copiez et utilisez l\\'IRI suivant comme point de départ pour le graphique visuel : <b>{{configHint}}</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst SAVE_BUTTON = 'guide.step_plugin.create_repository.save_button.content';\n\n/**\n * @name repositories-save\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to save the repository creation.\n *\n * Save repository step<br>\n * <img src=\"resources/guides/repository/repositories-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-save\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-save',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const repositoryIdInputSelector = GuideUtils.getGuideElementSelector('graphDBRepositoryIdInput');\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, SAVE_BUTTON),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'create-repository-button',\n ...options,\n url: 'repository/create/graphdb',\n elementSelector: GuideUtils.getGuideElementSelector('graphDBRepositoryCrateButton'),\n disablePreviousFlow: false,\n show: () => () => {\n GuideUtils.validateTextInput(repositoryIdInputSelector, options.repositoryId);\n },\n onNextClick: GuideUtils.clickOnGuideElement('graphDBRepositoryCrateButton')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [SAVE_BUTTON]: 'Click on the <b>Create</b> button.'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [SAVE_BUTTON]: 'Cliquez sur le bouton <b>Créer</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.import-file';\n\n/**\n * @name import-rdf-file\n * @memberof module:Interactive Guide\n *\n * @description\n * The `import-rdf-file` guide shows how to import an RDF file into GraphDB.\n *\n * The guide consists of the following steps:\n * 1. A step that guides the user to click on the \"Import\" main menu.<br>\n * <img src=\"resources/guides/main-menu/main-menu-import.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 2. A step that downloads a guide resource if specified.<br>\n * <img src=\"resources/guides/import/import-download-guide-resource.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 3. A step that guides the user to upload an RDF file.<br>\n * <img src=\"resources/guides/import/import-upload-rdf-file.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 4. (Optional) A step that shows an info dialog if the file is already uploaded.<br>\n * <img src=\"resources/guides/import/import-confirm-duplicate-files.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 5. A step that guides the user to click the import button.<br>\n * <img src=\"resources/guides/import/import-click-on-import-button.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 6. A step that shows the import progress.<br>\n * <img src=\"resources/guides/import/import-show-progress.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This guide can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following options:\n * @property {string} resourcesPath - The path to the resource that should be downloaded in the step.\n * @property {string} resourceFile - The name of the resource file that should be downloaded in the step.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"import-rdf-file\",\n * \"options\": {\n * \"resourcePath\": \"/path/to/example.rdf\",\n * \"resourceFile\": \"example.rdf\",\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'import-rdf-file',\n getSteps: function(options, services) {\n const translate = services.translate;\n options.mainAction = 'import-file';\n const title = options.title ? options.title : translate(step.translationBundle, DEFAULT_TITLE);\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'import',\n showIntro: true,\n title,\n ...options\n }\n }\n ];\n\n if (options.resourcePath) {\n steps.push(\n {\n guideBlockName: 'download-guide-resource',\n options: {\n title,\n ...options\n }\n }\n );\n }\n\n steps.push(...[\n {\n guideBlockName: 'import-upload-rdf-file', options: {\n disablePreviousFlow: false,\n title,\n ...options}\n },\n // This step is optional and will only appear if the file we want to upload has already been uploaded.\n // If the file is already uploaded, a confirmation dialog will be opened, and this step will display the confirm button of the dialog.\n {\n guideBlockName: 'import-confirm-duplicate-files', options: {title, ...options}\n },\n {\n guideBlockName: 'import-click-on-import-button', options: {title, ...options}\n },\n {\n guideBlockName: 'import-show-progress', options: {title, ...options}\n }\n ]);\n\n return steps;\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Import file'\n },\n fr: {\n [DEFAULT_TITLE]: 'Importer un fichier'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","export const BASIC_STEP = {\n title: '',\n content: '',\n elementSelector: undefined,\n placement: 'bottom',\n url: undefined,\n type: 'read-only-element',\n maxWaitTime: 3,\n canBePaused: true,\n onNextClick: undefined,\n disablePreviousFlow: true,\n onNextValidate: () => Promise.resolve(true),\n onPreviousClick: undefined,\n skipPoint: false,\n skipButtonLabel: {\n en: 'Skip',\n fr: 'Sauter'\n },\n class: ''\n};\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst FIELD_NAME_INTRO_CONTENT = 'guide.step_plugin.connectors-lucene-fields-field-name-intro.content';\n\n/**\n * @name connectors-lucene-fields-field-name-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Field name\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Field name\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector field name introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-field-name-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-field-name-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-field-name-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, FIELD_NAME_INTRO_CONTENT),\n ...(options.title ? {} : {title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE)}),\n ...options,\n class: 'connectors-lucene-fields-field-name-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'fieldName'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [FIELD_NAME_INTRO_CONTENT]: 'The <b>Field name</b> defines the mapping on the connector side and is specified as a string. It is also used at query time to reference the field.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [FIELD_NAME_INTRO_CONTENT]: 'Le <b>nom du champ</b> définit le mappage du côté du connecteur et est spécifié sous forme de chaîne. Il est également utilisé lors des requêtes pour référencer le champ.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const ZOOM_CLASS_CONTENT = 'guide.step_plugin.class-hierarchy-zoom-class.content';\nconst CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\n\n/**\n * @name class-hierarchy-zoom-class\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding users to zoom into a specific class within the class hierarchy visualization.\n * Scrolling will zoom into the class, visualizing subclasses\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-zoom-class.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} options.iri - The IRI of the class to be zoomed into. This option is required.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-zoom-class\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-zoom-class',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n const selector = GuideUtils.getGuideElementSelector('class-' + options.iri);\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n url: 'hierarchy',\n placement: 'left',\n elementSelector: selector,\n content: translate(this.translationBundle, ZOOM_CLASS_CONTENT, {iri: options.iri}),\n class: 'class-hierarchy-zoom-class',\n onNextClick: (guide, step) => {\n GuideUtils.classHierarchyZoom(step.elementSelector);\n guide.next();\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [ZOOM_CLASS_CONTENT]: 'The class <b>{{iri}}</b> is a parent class that has subclasses. Zoom inside to have a better view by scrolling up with the mouse inside the circle.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy'\n },\n\n fr: {\n [ZOOM_CLASS_CONTENT]: 'La classe <b>{{iri}}</b> est une classe parente qui a des sous-classes. Zoomez à l\\'intérieur pour avoir une meilleure vue en faisant défiler vers le haut avec la souris à l\\'intérieur du cercle.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SELECT_AGENT_DEFAULT_TITLE = 'guide.step-action.select-ttyg-agent';\nconst OPEN_AGENT_DROPDOWN = 'guide.step_plugin.select-ttyg-agent.open-agent-dropdown';\n\n/**\n * @name ttyg-select-agent-dropdown-open\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to open the agent selection dropdown in the TTYG interface.\n * It highlights the dropdown element and provides instructions on how to proceed.\n *\n * Click on the agents dropdown<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-dropdown-open.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-select-agent-dropdown-open\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-select-agent-dropdown-open',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, OPEN_AGENT_DROPDOWN),\n // If mainAction is set the title will be set automatically\n title: translate(this.translationBundle, TTYG_SELECT_AGENT_DEFAULT_TITLE),\n class: 'open-agent-dropdown',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('select-agent-dropdown')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Select an agent',\n [OPEN_AGENT_DROPDOWN]: 'Click on the agents dropdown to see available agents'\n },\n\n fr: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Sélectionner un agent',\n [OPEN_AGENT_DROPDOWN]: 'Cliquez sur le menu déroulant des agents pour voir les agents disponibles'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\n\n/**\n * @name info-message\n * @memberof module:Interactive Guide\n *\n * @description\n * Displays a read-only informational message to the user. Interaction is not required to proceed unless configured\n * via common options.\n *\n * Info message example<br>\n * <img src=\"resources/guides/core/info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br></br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"info-message\",\n * \"options\": {\n * \"title\": \"Heads up\",\n * \"content\": \"Please read this information.\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'info-message',\n getStep: (options, services) => {\n const notOverridable = {\n type: 'readonly'\n };\n return {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n ...options,\n ...notOverridable\n };\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst TYPE_ONTLOGY_GRAPH = 'guide.step_plugin.sparql-search-method.type-ontology-graph-name';\n\n/**\n * @name sparql-search-method-type-graph-name\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to type the name of the named graph that contains the ontology for the SPARQL search method in the TTYG interface.\n * It highlights the input element and provides instructions on how to proceed.\n *\n * Type the name of the named graph that contains the ontology<br>\n * <img src=\"resources/guides/ttyg/sparql-search-method-type-graph-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, the following specific option is available:\n *\n * @property {string} [options.ontologyGraph] - The name of the named graph that contains the ontology. Default is 'http://example.org/ontology'.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-search-method-type-graph-name\",\n * \"options\": {\n * \"ontologyGraph\": \"http://example.org/ontology\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-search-method-type-graph-name',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, TYPE_ONTLOGY_GRAPH, {ontologyGraph: options.ontologyGraph}),\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n class: 'input-ontology-graph-name',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('sparql-ontology-graph-input'),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(GuideUtils.getGuideElementSelector('sparql-ontology-graph-input'), options.ontologyGraph, false))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [TYPE_ONTLOGY_GRAPH]: 'Type <b>{{ontologyGraph}}</b> as the named graph which contains the ontology.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [TYPE_ONTLOGY_GRAPH]: 'Type <b>{{ontologyGraph}}</b> en tant que graphe nommé contenant l\\'ontologie.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CONVERSATION_WITH_AGENT_DEFAULT_TITLE = 'guide.step-action.conversation-with-ttyg-agent';\nconst CONVERSATION_WITH_AGENT_INFO = 'guide.step_plugin.conversation-with-ttyg-agent.info';\n\n/**\n * @name ttyg-conversation-info-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an informational message about the Talk To Your Graph (TTYG) feature.\n * It explains the purpose of the TTYG view and how users can interact with it using natural language queries.\n *\n * TTYG conversation info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-conversation-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-conversation-info-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-conversation-info-message',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(step.translationBundle, CONVERSATION_WITH_AGENT_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'info-message',\n options: {\n title,\n skipPoint: true,\n class: 'conversation-info',\n content: translate(step.translationBundle, CONVERSATION_WITH_AGENT_INFO),\n ...options,\n url: 'ttyg'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CONVERSATION_WITH_AGENT_DEFAULT_TITLE]: 'Conversation with the agent',\n [CONVERSATION_WITH_AGENT_INFO]: 'The Talk To Your Graph view provides a chat-like interface for querying your data. Natural language queries are written in the chatbox at the bottom of the screen. With the aid of LLM technology, they are translated into a machine-readable question and the RDF answer is narrated back to you.'\n },\n\n fr: {\n [CONVERSATION_WITH_AGENT_DEFAULT_TITLE]: 'Conversation avec l\\'agent',\n [CONVERSATION_WITH_AGENT_INFO]: 'La vue Talk To Your Graph (Parlez à votre graphique) offre une interface de type chat pour interroger vos données. Les requêtes en langage naturel sont écrites dans la boîte de dialogue en bas de l\\'écran. Grâce à la technologie LLM, elles sont traduites en une question lisible par une machine et la réponse RDF vous est racontée.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst EXPLAIN_CONTENT = 'guide.step_plugin.sparql-results-explain.content';\n\n/**\n * @name sparql-results-explain\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on the table that shows the results of a SPARQL query.\n *\n * Visualize results table<br>\n * <img src=\"resources/guides/sparql-editor/sparql-results-explain.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-results-explain\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-results-explain',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n content: translate(this.translationBundle, EXPLAIN_CONTENT),\n url: 'sparql',\n placement: 'top',\n elementSelector: services.GuideUtils.CSS_SELECTORS.SPARQL_RESULTS_SELECTOR,\n class: 'yasgui-query-results',\n fileName: options.fileName,\n scrollToHandler: services.GuideUtils.scrollToTop,\n extraContent: options.resultExtraContent,\n canBePaused: false,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [EXPLAIN_CONTENT]: 'The table shows the results from executing the query.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [EXPLAIN_CONTENT]: 'Le tableau montre les résultats de l\\'exécution de la requête.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TOGGLE_PREFIXES_CONTENT = 'guide.step_plugin.class-hierarchy-toggle-prefixes.content';\nconst CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\n\n/**\n * @name class-hierarchy-toggle-prefixes\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on the button that toggles the display of prefixes in the class hierarchy view.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-toggle-prefixes.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-toggle-prefixes\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-toggle-prefixes',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, TOGGLE_PREFIXES_CONTENT),\n url: 'hierarchy',\n elementSelector: '.prefix-toggle-btn',\n class: 'class-hierarchy-toggle-prefixes',\n scrollToHandler: GuideUtils.scrollToTop,\n onNextClick: (_guide) => {\n GuideUtils.clickOnElement('.prefix-toggle-btn')();\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TOGGLE_PREFIXES_CONTENT]: 'Click on <b>Show prefixes/Hide prefixes</b> to toggle the display of the prefixes.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy'\n },\n\n fr: {\n [TOGGLE_PREFIXES_CONTENT]: 'Cliquez sur <b>Afficher les préfixes/Masquer les préfixes</b> pour afficher ou masquer les préfixes.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_CREATE_AGENT_DEFAULT_TITLE = 'guide.step-action.create-ttyg-agent';\nconst TTYG_INTRO_MESSAGE = 'guide.step_plugin.create-ttyg-agent.intro';\n\n/**\n * @name ttyg-create-agent-intro-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an introductory message about creating an agent in the Talk to Your Graph (TTYG) plugin.\n * It explains what an agent is and why it is necessary to configure one before using TTYG.\n *\n * Create an agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-intro-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-create-agent-intro-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-create-agent-intro-message',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_CREATE_AGENT_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'info-message',\n options: {\n title,\n content: translate(this.translationBundle, TTYG_INTRO_MESSAGE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Create an agent',\n [TTYG_INTRO_MESSAGE]: 'An agent is a helpful assistant that can answer your queries. You need to configure an agent in order to ask anything of Talk to Your Graph.'\n },\n\n fr: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Créer un agent',\n [TTYG_INTRO_MESSAGE]: 'Un agent est un assistant utile qui peut répondre à vos questions. Vous devez configurer un agent pour pouvoir demander quoi que ce soit à Talk to Your Graph.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_CREATE_AGENT_DEFAULT_TITLE = 'guide.step-action.create-ttyg-agent';\nconst CREATE_AGENT = 'guide.step_plugin.create-ttyg-agent.create-agent';\n\n/**\n * @name ttyg-create-agent-click\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to click on the \"Create Agent\" button in the Talk to Your Graph (TTYG) plugin.\n * It highlights the button and provides instructions on how to proceed with creating a new agent.\n *\n * Click on create agent button<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-create-agent-click\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-create-agent-click',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_CREATE_AGENT_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, CREATE_AGENT),\n class: 'create-agent-btn',\n maxWaitTime: 10,\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('create-agent-btn')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Create an agent',\n [CREATE_AGENT]: 'Click on the create agent button to create a new agent.'\n },\n\n fr: {\n [TTYG_CREATE_AGENT_DEFAULT_TITLE]: 'Créer un agent',\n [CREATE_AGENT]: 'Cliquez sur le bouton Créer un agent pour créer un nouvel agent.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst RESOURCE_CLICK_ON_ROLE_TITLE = 'view.resource.title';\nconst GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_SUBJECT_CONTENT = 'guide.step_plugin.resource-click-on-role.subject.content';\nconst GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_PREDICATE_CONTENT = 'guide.step_plugin.resource-click-on-role.predicate.content';\nconst GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_OBJECT_CONTENT = 'guide.step_plugin.resource-click-on-role.object.content';\nconst GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_CONTEXT_CONTENT = 'guide.step_plugin.resource-click-on-role.context.content';\nconst GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_ALL_CONTENT = 'guide.step_plugin.resource-click-on-role.all.content';\n/**\n * @name resource-click-on-role\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-click-on-role`\n * guide step guides the user to click on a specific role tab\n * (such as subject, predicate, object, context, or all) in the resource view\n * to filter and display RDF statements based on the IRI's position.\n *\n * <img src=\"resources/guides/resource/resource-click-on-role.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific options are available:\n *\n * Options:\n * @property {string} options.role - The role used to select the appropriate translation content\n * (e.g., 'subject', 'predicate', 'object', 'context', 'all').\n * @property {string} options.showRole - The role used to build the element selector for the clickable tab.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-click-on-role\",\n * \"options\": {\n * \"role\": \"subject\",\n * \"showRole\": \"subject\",\n * \"skipUrl\": false\n * }\n * }\n * ```\n */\n\nconst step = {\n guideBlockName: 'resource-click-on-role',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, `guide.step_plugin.resource-click-on-role.${options.role}.content`),\n title: translate(this.translationBundle, RESOURCE_CLICK_ON_ROLE_TITLE),\n ...options,\n ...(options.skipUrl ? {} : {url: Utils.getResourceURL(options)}),\n elementSelector: GuideUtils.getGuideElementSelector('role-' + options.showRole),\n class: 'visual_graph-role',\n onNextClick: (guide, step) => {\n GuideUtils.waitFor(step.elementSelector, 3)\n .then(() => document.querySelector(step.elementSelector).click());\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_CLICK_ON_ROLE_TITLE]: 'Resource',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_SUBJECT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>subject</b> tab.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_PREDICATE_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>predicate</b> tab.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_OBJECT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>object</b> tab.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_CONTEXT_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>context</b> tab.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_ALL_CONTENT]: 'You can configure the view to show RDF statements where the current IRI is the <i>subject</i>, <i>predicate</i>, <i>object</i>, <i>context</i> or in any position. Click on the <b>all</b> tab.'\n },\n fr: {\n [RESOURCE_CLICK_ON_ROLE_TITLE]: 'Ressource',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_SUBJECT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>sujet</b>.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_PREDICATE_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>prédicat</b>.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_OBJECT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>objet</b>.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_CONTEXT_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>contexte</b>.',\n [GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_ALL_CONTENT]: 'Vous pouvez configurer la vue pour afficher les déclarations RDF où l\\'IRI actuel est le <i>sujet</i>, le <i>prédicat</i>, l\\'<i>objet</i>, le <i>contexte</i> ou dans n\\'importe quelle position. Cliquez sur l\\'onglet <b>tous</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst DEFAULT_VALUE_INTRO = 'guide.step_plugin.connectors-lucene-fields-default-value-intro.content';\n\n/**\n * @name connectors-lucene-fields-default-value-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Default value\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Default value\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector default value introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-default-value-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-default-value-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-default-value-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, DEFAULT_VALUE_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-default-value-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'defaultValue'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [DEFAULT_VALUE_INTRO]: 'The <b>Default value</b> specifies the value to use for the field when the property chain has no matching values in GraphDB. It can be a plain literal, a literal with a datatype (xsd: prefix supported), a literal with a language tag, or an IRI. If not set, there is no default value.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [DEFAULT_VALUE_INTRO]: 'La <b>valeur par défaut</b> définit la valeur à utiliser pour le champ lorsque la chaîne de propriétés n’a pas de valeurs correspondantes dans GraphDB. Elle peut être un littéral simple, un littéral avec datatype (préfixe xsd: pris en charge), un littéral avec balise de langue ou un IRI. Si elle n’est pas définie, il n’y a pas de valeur par défaut.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-digram-predicates-intro.content';\n\n/**\n * @name class-relationships-digram-predicates-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-digram-predicates-intro` step displays a dialog that explains how to explore the relationships between classes\n * by clicking on a connection line in the diagram to view the top predicates linking them.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-digram-predicates-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-digram-predicates-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-digram-predicates-intro',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'focus-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('relationships-diagram'),\n placement: 'left',\n class: 'class-relationships-digram-predicates-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'Click on any connection line in the diagram to see the top predicates used between those two classes. This helps to understand what kind of relationships link them.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Cliquez sur n\\'importe quelle ligne de connexion dans le diagramme pour voir les principaux prédicats utilisés entre ces deux classes. Cela aide à comprendre quel type de relations les lie.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_EDIT_TITLE = 'menu.ttyg.edit.label';\n\n/**\n * @name edit-ttyg-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * Complex guide step, which takes the user through the process of editing a TTYG agent.\n *\n * Click the Lab main menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-lab.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on TTYG in the sub-menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-ttyg.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * End guide if API key error is present<br>\n * <img src=\"resources/guides/ttyg/end-on-api-key-error.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Edit agent intro message<br>\n * <img src=\"resources/guides/ttyg/ttyg-edit-agent-intro-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on edit agent button<br>\n * <img src=\"resources/guides/ttyg/ttyg-click-to-edit-selected-agent.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on save to save the edited agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-edit-agent-click-to-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The `configure-agent` step is configurable complex step. See [configure-agent](#.configure-agent) for more details.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"edit-ttyg-agent\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'edit-ttyg-agent',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const RoutingUtil = services.RoutingUtil;\n options.mainAction = 'edit-ttyg-agent';\n options.title = options.title ?? translate(this.translationBundle, TTYG_EDIT_TITLE);\n\n return [\n {\n guideBlockName: 'click-main-menu',\n options: {\n ...options,\n menu: 'ttyg',\n showOn: () => 'ttyg' !== RoutingUtil.getCurrentRoute()\n }\n },\n {\n guideBlockName: 'end-on-api-key-error'\n },\n {\n guideBlockName: 'ttyg-edit-agent-intro-message',\n options: {...options}\n },\n {\n // Skip next step (which is actually 5 core steps) if there is a selected agent\n guideBlockName: 'info-message',\n options: {\n beforeShowPromise: (guide, currentStep) => {\n if (GuideUtils.isGuideElementVisible('selected-agent')) {\n setTimeout(() => {\n // Using a timeout because the library executes async logic\n guide.show(currentStep.id + 6);\n });\n } else {\n setTimeout(() => {\n // Using a timeout because the library executes async logic\n guide.next();\n });\n }\n },\n ...options\n }\n },\n {\n guideBlockName: 'select-ttyg-agent',\n options: {...options}\n },\n {\n guideBlockName: 'ttyg-click-to-edit-selected-agent',\n options: {...options}\n },\n {\n guideBlockName: 'configure-agent',\n options\n },\n {\n guideBlockName: 'ttyg-edit-agent-click-to-save',\n options: {...options}\n },\n {\n guideBlockName: 'wait-for-element-to-hide',\n options: {\n elementSelectorToHide: GuideUtils.getElementSelector('.agent-settings-modal'),\n timeToWait: 10\n },\n ...options\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_EDIT_TITLE]: 'Edit an agent'\n },\n fr: {\n [TTYG_EDIT_TITLE]: 'Modifier un agent'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\n\n/**\n * @name class-relationships\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `class-relationships` step shows how to reach the Class relationships view of GraphDB Workbench.\n *\n * The step consists of the following steps:\n * 1. An introduction to the Class relationships.<br>\n * <img src=\"resources/guides//class-relationships/class-relationships-view-introduction_1.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * 2. A step that guides the user to click on the \"Explore\" main menu.<br>\n * <img src=\"resources/guides/main-menu/main-menu-explore.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * 3. A step that guides the user to click on the \"Class relationships\" sub-menu item.<br>\n * <img src=\"resources/guides/main-menu/main-menu-class-relationships.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * 4. Optional step that will be shown only if property `introExtraContent` is passed through options<br>\n * <img src=\"resources/guides//class-relationships/class-relationships-view-introduction_2.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following options:\n *\n * @property {Object<string,string>} [introExtraContent] - If this option is present, an additional dialog will be displayed as the last step with the passed content, localized by language.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships\",\n * \"options\": {\n * \"introExtraContent\": {\n * \"en\": \"The Class relationships is a complicated diagram, which by default shows only the top relationships...\",\n * \"fr\": \"Les relations de classes constituent un diagramme complexe, qui affiche par défaut uniquement les relations principales..\"\n * }\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships',\n getSteps: function(options, pluginService) {\n options.mainAction = 'class-relationships';\n const title = options.title ? options.title : pluginService.translate(this.translationBundle, DEFAULT_TITLE);\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n title,\n menu: 'class-relationships',\n showIntro: true,\n ...options\n }\n }, {\n guideBlockName: 'class-relationships-intro',\n options: {\n title,\n ...options\n }\n }\n ];\n\n if (options.introExtraContent) {\n steps.push({\n guideBlockName: 'class-relationships-diagram-intro',\n options: {\n title,\n content: options.introExtraContent,\n ...options\n }\n });\n }\n\n return steps;\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Explore the class relationships'\n },\n fr: {\n [DEFAULT_TITLE]: 'Explorer les relations entre classes'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst DETECT_FIELDS = 'guide.step_plugin.connectors-lucene-detect-fields-intro.content';\n\n/**\n * @name connectors-lucene-detect-fields-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"detectFields\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"detectFields\" parameter in enabling automatic field detection.\n *\n * Lucene connector detect fields introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-detect-fields-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-detect-fields-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-detect-fields-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, DETECT_FIELDS),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-detect-fields-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'detectFields'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [DETECT_FIELDS]: 'The <b>detectFields</b> parameter enables automatic field detection. When true, each predicate becomes a field and specifying fields in JSON is optional. Types are optional; all types are indexed if omitted. Requires <b>importGraph</b> or <b>importFile</b>.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [DETECT_FIELDS]: 'Le paramètre <b>detectFields</b> active la détection automatique des champs. Quand il est à true, chaque prédicat devient un champ et la spécification des champs en JSON est facultative. Les types sont optionnels ; tous les types sont indexés s’ils sont omis. Nécessite <b>importGraph</b> ou <b>importFile</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst IMPORT_GRAPH = 'guide.step_plugin.connectors-lucene-import-graph-intro.content';\n\n/**\n * @name connectors-lucene-import-graph-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"importGraph\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"importGraph\" parameter in creating a connector from RDF data inserted into a special virtual graph.\n *\n * Lucene connector importGraph introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-import-graph-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-import-graph-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-import-graph-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, IMPORT_GRAPH),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-import-graph-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'importGraph'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [IMPORT_GRAPH]: 'The <b>importGraph</b> parameter creates the connector from RDF data inserted into a special virtual graph. Requires <b>readonly</b> mode, and insertion plus creation must occur in the same transaction.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [IMPORT_GRAPH]: 'Le paramètre <b>importGraph</b> crée le connecteur à partir de données RDF insérées dans un graphe virtuel spécial. Nécessite le mode <b>lecture seule</b>, et l’insertion plus la création doivent avoir lieu dans la même transaction.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst GRAPHDB_REPOSITORY_CONTENT = 'guide.step_plugin.create_repository.graph_db_repository.content';\n\n/**\n * @name repositories-create-graphdb\n * @memberof module:Interactive Guide\n *\n * @description\n * This step explains how to create a GraphDB repository.\n *\n * Create GraphDB repository step<br>\n * <img src=\"resources/guides/repository/repositories-create-graphdb.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-create-graphdb\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-create-graphdb',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, GRAPHDB_REPOSITORY_CONTENT),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'create-gdb-repository',\n ...options,\n url: 'repository/create',\n elementSelector: GuideUtils.getGuideElementSelector('createGraphDBRepository'),\n disablePreviousFlow: false,\n onNextClick: GuideUtils.clickOnGuideElement('createGraphDBRepository')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [GRAPHDB_REPOSITORY_CONTENT]: 'Click on the <b>GraphDB Repository</b> button.'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [GRAPHDB_REPOSITORY_CONTENT]: 'Cliquez sur le bouton <b>Dépôt GraphDB</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\n\n/**\n * @name visual-graph\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph` guide demonstrates how to use the Visual Graph features in GraphDB.\n *\n * The guide consists of the following steps:\n * 1. Click on the \"Visual graph\" main menu.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-click-explore-menu.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * <img src=\"resources/guides/visual-graph/visual-graph-click-main-menu.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 2. Use the RDF resources search input to enter an IRI.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-search-rdf-resources-input.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 3. Choose a resource from the autocomplete list.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-search-rdf-resources-input-autocomplete-item.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 4. Inspect and interact with the visual graph (expand nodes, view properties, focus links).<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This guide can be configured using the common options defined in [Options](#.Options).\n *\n * @property {string} [options.easyGraphInputText] - The text to enter into the Easy graph input.\n * @property {string} [options.iri] - The IRI used to target nodes in the visual graph.\n * @property {string} [options.iriLabel] - The label of the IRI link shown in the visualization.\n * @property {string} [options.fromIri] - Source IRI for link-focused steps.\n * @property {string} [options.toIri] - Target IRI for link-focused steps.\n * @property {string} [options.focusProperties] - Array describing focus properties displayed in properties steps.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\",\n * \"iriLabel\": \"hasRole\",\n * \"easyGraphInputText\": \"http://example.org/resource\",\n * \"focusProperties\": [\"ontl:roleStartDate\"]\n * }\n * }\n * ```\n */\n\nconst step = {\n guideBlockName: 'visual-graph',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const RoutingUtil = services.RoutingUtil;\n const translate = services.translate;\n options.mainAction = 'visual-graph';\n\n options.title = options.title ?? translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE);\n\n return [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'visual-graph',\n showIntro: true,\n ...options\n }\n }, {\n guideBlockName: 'visual-graph-search-rdf-resources-input',\n options: {...options}\n }, {\n guideBlockName: 'visual-graph-search-rdf-resources-input-autocomplete-item',\n options: {...options}\n }, {\n guideBlockName: 'visual-graph-intro',\n options: {\n onPreviousClick: () => {\n RoutingUtil.navigate('/graphs-visualizations');\n const searchInputSelector = GuideUtils.getGuideElementSelector('graphVisualisationSearchInputNotConfigured', ' input');\n return GuideUtils.waitFor(searchInputSelector, 3)\n .then(() => {\n GuideUtils.validateTextInput(searchInputSelector, options.easyGraphInputText);\n });\n },\n initPreviousStep: () => {\n const url = '/graphs-visualizations?uri=' + options.iri;\n if (url !== decodeURIComponent(RoutingUtil.getCurrentRoute())) {\n const URL = '/graphs-visualizations?uri=' + options.iri;\n RoutingUtil.navigate(URL);\n return GuideUtils.waitFor(`.node-wrapper[id^=\"${options.iri}\"] circle`, 3);\n }\n return Promise.resolve();\n },\n canBePaused: false,\n forceReload: true,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst RESOURCE_RESULTS_TITLE = 'view.resource.title';\nconst RESOURCE_RESULTS_EXPLAIN_CONTENT = 'guide.step_plugin.resource-results-explain.content';\n/**\n * @name resource-results-explain\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-results-explain` guide step that explains the resource results table,\n * providing an easy way to view triples in which a given IRI is the subject, predicate, or object.\n *\n * <img src=\"resources/guides/resource/resource-results-explain.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is available:\n *\n * Options:\n * @property {string} [options.iri] - The IRI of the resource, used to build the URL if not skipped.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-results-explain\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-results-explain',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'sparql-results-explain',\n options: {\n title: translate(this.translationBundle, RESOURCE_RESULTS_TITLE),\n content: translate(this.translationBundle, RESOURCE_RESULTS_EXPLAIN_CONTENT),\n ...options,\n ...(options.skipUrl ? {} : {url: Utils.getResourceURL(options)}),\n class: 'resource-results-explain'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_RESULTS_TITLE]: 'Resource',\n [RESOURCE_RESULTS_EXPLAIN_CONTENT]: 'The table provides an easy way to view triples in which a given IRI is the subject, predicate, or object.'\n },\n fr: {\n [RESOURCE_RESULTS_TITLE]: 'Ressource',\n [RESOURCE_RESULTS_EXPLAIN_CONTENT]: 'Le tableau permet de visualiser facilement les triplets dans lesquels un IRI donné est le sujet, le prédicat ou l’objet.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\nimport {BASIC_STEP} from '../config.js';\n\n/**\n * @name hold-and-wait-until-hidden\n * @memberof module:Interactive Guide\n *\n * @description\n * Holds the current step and waits until a specific element becomes hidden before allowing the user to proceed.\n * While waiting, scroll events are allowed on the targeted element.\n *\n * Hold and wait until hidden example<br>\n * <img src=\"resources/guides/core/hold-and-wait-until-hidden.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.elementSelectorToWait - CSS selector of the element whose visibility is being monitored to become hidden.\n * @property {string} [options.elementSelector] - CSS selector of the element on which scroll events are allowed while waiting.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"hold-and-wait-until-hidden\",\n * \"options\": {\n * \"elementSelectorToWait\": \"#loading\",\n * \"elementSelector\": \"#scrollable\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'hold-and-wait-until-hidden',\n getStep: (options, services) => {\n return {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n onNextValidate: () => Promise.resolve(!services.GuideUtils.isVisible(options.elementSelectorToWait)),\n show: () => Utils.allowEvents(Utils.SCROLL_EVENTS, options.elementSelector, services),\n hide: () => Utils.allowAll(options.elementSelector, services),\n ...options\n };\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst INCLUDE_INFERRED_CONTENT = 'guide.step_plugin.sparql-editor-include-inferred-data.content';\n\n/**\n * @name sparql-editor-include-inferred-data\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on the \"Include inferred data in results\" toggle in the SPARQL editor.<br>\n *\n * Include inferred data toggle<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-include-inferred-data.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-editor-include-inferred-data\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-editor-include-inferred-data',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n content: translate(this.translationBundle, INCLUDE_INFERRED_CONTENT),\n url: 'sparql',\n elementSelector: '.yasqe_inferStatementsButton',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [INCLUDE_INFERRED_CONTENT]: '<b>Include inferred data in results</b> includes inferred statements produced by reasoning in the query results. Clicking the toggle disables this behavior.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [INCLUDE_INFERRED_CONTENT]: '<b>Inclure les données inférées dans les résultats</b> inclut les déclarations inférées produites par le raisonnement dans les résultats de la requête. Cliquer sur le bouton désactive ce comportement.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst ENABLE_SPARQL_QUERY = 'guide.step_plugin.sparql-search-method.enable-sparql-query';\n\n/**\n * @name ttyg-sparql-method-sparql-query-select\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable providing a SPARQL CONSTRUCT query that fetches the ontology for the SPARQL search method in the TTYG interface.\n * It highlights the checkbox element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable providing a SPARQL CONSTRUCT query that fetches the ontology.<br>\n * <img src=\"resources/guides/ttyg/ttyg-sparql-method-sparql-query-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-sparql-method-sparql-query-select\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-sparql-method-sparql-query-select',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, ENABLE_SPARQL_QUERY),\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n class: 'enable-sparql-query',\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('sparql-query-option'),\n clickableElementSelector: GuideUtils.getGuideElementSelector('sparql-query-option-input'),\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(GuideUtils.getGuideElementSelector('sparql-query-option-input'))),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [ENABLE_SPARQL_QUERY]: 'Click on the toggle to enable to providing a SPARQL CONSTRUCT query that fetches the ontology.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [ENABLE_SPARQL_QUERY]: 'Cliquez sur le bouton bascule pour activer la fourniture d\\'une requête SPARQL CONSTRUCT qui récupère l\\'ontologie.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst REMAINING_FIELDS_INTRO = 'guide.step_plugin.connectors-lucene-fields-remaining-fields-intro.content';\n\n/**\n * @name connectors-lucene-fields-remaining-fields-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step showcases the remaining fields of a Lucene connector instance.\n * We might have more than one field mapping for a Lucene connector instance.\n *\n * Lucene connector remaining fields<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-remaining-fields-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-remaining-fields-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-remaining-fields-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [{\n guideBlockName: 'connectors-parameter-fields-remaining-fields-intro',\n options: {\n content: translate(step.translationBundle, REMAINING_FIELDS_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-remaining-fields-intro',\n parameterName: 'fields',\n connectorName: LUCENE_CONNECTOR_NAME\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [REMAINING_FIELDS_INTRO]: 'This lucene connector configuration contains multiple field mappings. They determine which values are searchable, filterable, or retrievable during query execution.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [REMAINING_FIELDS_INTRO]: 'Cette configuration du connecteur Lucene contient plusieurs mappages de champs. Ils déterminent quelles valeurs sont recherchables, filtrables ou récupérables lors de l\\'exécution de la requête.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const EXPLORE_CLASS_HIERARCHY = 'guide.step-action.class-hierarchy';\n/**\n * @name class-hierarchy\n * @memberof module:Interactive Guide\n *\n * @description\n * The Class Hierarchy step is a complex step, which provides an interactive guide for users to explore and understand\n * the class hierarchy visualization within the application.\n *\n * Click on explore menu<br>\n * <img src=\"resources/guides/class-hierarchy/click-explore-menu.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * Click on class hierarchy submenu<br>\n * <img src=\"resources/guides/class-hierarchy/click-class-hierarchy.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Class hierarchy dataset intro<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Dataset intro<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-dataset-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Zoom on a class<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-zoom-class.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Explain a class<br>\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-explain-class.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The step can be configured using the common options defined in [Options](#.Options).\n *\n * @property {Object} introExtraContent - bundle object, which, if provided, will show `class-hierarchy-dataset-intro`\n * @property {Object[]} zoomIris - array of objects, which should be zoomed in.\n * @property {string} zoomIris.iri - IRI of the class to zoom in\n * @property {Object} zoomIris.postExtraContent - bundle object, which, if provided, will show `class-hierarchy-explain-class`\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy\",\n * \"options\": {\n * \"introExtraContent\": {\n * \"en\": \"In this dataset, there is a single top-level class, <b>schema:Movie</b>, and two subclasses (the smaller circles inside). This tells us that the dataset has to do with movies.\"\n * },\n * \"zoomIris\": [\n * {\n * \"iri\": \"schema:Movie\",\n * \"postExtraContent\": {\n * \"en\": \"The two subclasses, <b>imdb:BlackandWhiteMovie</b> and <b>imdb:ColorMovie</b>, tell us that the movies are divided into black-and-white and color ones, and there are more color movies than black-and-white ones since the <b>imdb:ColorMovie</b> circle is larger.\"\n * }\n * }\n * ]\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy',\n\n /**\n *\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, EXPLORE_CLASS_HIERARCHY);\n options.mainAction = 'class-hierarchy';\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n title,\n menu: 'class-hierarchy',\n showIntro: true,\n ...options\n }\n }, {\n guideBlockName: 'class-hierarchy-intro',\n options: {\n title,\n ...options\n }\n }\n ];\n\n if (options.introExtraContent) {\n steps.push({\n guideBlockName: 'class-hierarchy-dataset-intro',\n options: {\n title,\n content: options.introExtraContent,\n ...options\n }\n });\n }\n\n if (Array.isArray(options.zoomIris)) {\n options.zoomIris.forEach((zoomIri) => {\n steps.push({\n guideBlockName: 'class-hierarchy-zoom-class',\n options: {\n title,\n iri: zoomIri.iri,\n ...options\n }\n });\n if (zoomIri.postExtraContent) {\n steps.push({\n guideBlockName: 'class-hierarchy-explain-class',\n options: {\n title,\n content: zoomIri.postExtraContent,\n beforeShowPromise: GuideUtils.deferredShow(800),\n iri: zoomIri.iri,\n ...options\n }\n });\n }\n });\n }\n\n return steps;\n },\n translationBundle: {\n en: {\n [EXPLORE_CLASS_HIERARCHY]: 'Explore the class hierarchy'\n },\n fr: {\n [EXPLORE_CLASS_HIERARCHY]: 'Explorer la hiérarchie des classes'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.similarity-search-method';\nconst DISABLE_TOGGLE = 'guide.step_plugin.similarity-search-method.disable-toggle';\n\n/**\n * @name ttyg-similarity-toggle-off\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to disable the Similarity search query method in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to disable Similarity search query method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-toggle-off.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-similarity-toggle-off\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-similarity-toggle-off',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-similarity_search-input');\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n content: translate(this.translationBundle, DISABLE_TOGGLE),\n class: 'toggle-similarity-search',\n title: translate(this.translationBundle, SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE),\n ...options,\n disable: true,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-similarity_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(!GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [DISABLE_TOGGLE]: 'Click on the toggle to disable Similarity search query method.'\n },\n fr: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [DISABLE_TOGGLE]: 'Cliquez sur le bouton pour désactiver la méthode de recherche par similarité.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst LUCENE_EXPAND_CONTENT = 'guide.step_plugin.connectors-lucene-expand.content';\n\n/**\n * @name connectors-expand-lucene\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to expand a specific Lucene connector instance in GraphDB to view its configuration.\n * It prompts the user to click on the connector's name to access its settings.\n *\n * Expand Lucene connector<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-expand-lucene.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.instanceName`.\n *\n * @property {string} options.instanceName - The specific instance name of the Lucene connector. This option is required.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-expand-lucene\",\n * \"options\": {\n * \"instanceName\": \"MyLuceneConnector\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-expand-lucene',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-expand-connector',\n options: {\n content: translate(this.translationBundle, LUCENE_EXPAND_CONTENT, {instanceName: options.instanceName}),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n connectorName: LUCENE_CONNECTOR_NAME,\n class: 'connectors-lucene-expand'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [LUCENE_EXPAND_CONTENT]: 'Click on <b>{{instanceName}}</b> to view its configuration.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [LUCENE_EXPAND_CONTENT]: 'Cliquez sur <b>{{instanceName}}</b> pour afficher sa configuration.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst INVALID_VALUES_INTRO = 'guide.step_plugin.connectors-lucene-fields-ignore-invalid-values-intro.content';\n\n/**\n * @name connectors-lucene-fields-ignore-invalid-values-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Ignore Invalid Values\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Ignore Invalid Values\" option in handling data type conversion issues.\n *\n * Lucene connector ignore invalid values introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-ignore-invalid-values-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-ignore-invalid-values-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-ignore-invalid-values-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, INVALID_VALUES_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-ignore-invalid-values-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'ignoreInvalidValues'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [INVALID_VALUES_INTRO]: 'The <b>Ignore invalid values</b> option controls behavior when a value cannot be converted to the expected type. False by default.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [INVALID_VALUES_INTRO]: 'L’option <b>Ignorer les valeurs invalides</b> contrôle le comportement lorsqu’une valeur ne peut pas être convertie vers le type attendu. False par défaut.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_SAMPLE_QUERY_CONTENT = 'guide.step-action.visual-graph-config-sample-query';\n\nconst TAB_NAME_TO_INDEX = {\n startingPoint: 1,\n graphExpansion: 2,\n nodeBasics: 3,\n edgeBasics: 4,\n nodeExtra: 5\n};\n\n/**\n * @name visual-graph-config-sample-query\n * @memberof module:Interactive Guide\n *\n * @description\n * This step highlights the sample queries section for a specific tab in the Visual Graph configuration page.<br>\n *\n * Sample queries step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-sample-query.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} options.tabName - The name of the tab whose sample queries to highlight. Must be one of `startingPoint`, `graphExpansion`, `nodeBasics`, `edgeBasics`, or `nodeExtra`.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-sample-query\",\n * \"options\": {\n * \"tabName\": \"startingPoint\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-sample-query',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const tabIndex = TAB_NAME_TO_INDEX[options.tabName];\n\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_SAMPLE_QUERY_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n elementSelector: GuideUtils.getGuideElementSelector(`sample-queries-${tabIndex}`),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_SAMPLE_QUERY_CONTENT]: 'These are sample queries that can be used as a reference when configuring this section.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_SAMPLE_QUERY_CONTENT]: 'Ce sont des exemples de requêtes qui peuvent être utilisés comme référence lors de la configuration de cette section.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\nconst OPEN_ALL_INSTANCES_IN_SPARQL = 'guide.step_plugin.class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql.content';\n\n/**\n * @name class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to open all RDF instances in SPARQL from the class hierarchy view.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql.png\" style=\"height:200px; border: solid\">\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.iri`\n *\n * @property {string} options.iri - The IRI of the class whose instances are to be viewed. This option is required.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, OPEN_ALL_INSTANCES_IN_SPARQL, {iri: options.iri}),\n url: 'hierarchy',\n canBePaused: false,\n elementSelector: GuideUtils.getGuideElementSelector('instances-count'),\n class: 'class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql',\n onNextClick: GuideUtils.clickOnGuideElement('instances-count'),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [OPEN_ALL_INSTANCES_IN_SPARQL]: 'This link shows the number of instances for the selected class, <b>{{iri}}</b>. Click on the link to open the SPARQL editor with a preloaded query that selects all instances.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy'\n },\n\n fr: {\n [OPEN_ALL_INSTANCES_IN_SPARQL]: 'Ce lien affiche le nombre d\\'instances pour la classe sélectionnée, <b>{{iri}}</b>. Cliquez sur le lien pour ouvrir l\\'éditeur SPARQL avec une requête préchargée qui sélectionne toutes les instances.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_SETTINGS_SAVE_CONTENT = 'guide.step-action.visual-graph-settings-save-content';\n\n/**\n * @name visual-graph-settings-save\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click the save button to save the graph settings.<br>\n *\n * Save graph settings step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-settings-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-settings-save\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-settings-save',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-settings-save-button');\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_SETTINGS_SAVE_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n elementSelector,\n onNextClick: GuideUtils.clickOnElement(elementSelector),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_SETTINGS_SAVE_CONTENT]: 'Click to save the graph settings.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_SETTINGS_SAVE_CONTENT]: 'Cliquez pour enregistrer les paramètres du graphique.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst CONFIGURE_TOP_P = 'guide.step_plugin.configure-top-p.info';\n\n/**\n * @name configure-top-p\n * @memberof module:Interactive Guide\n *\n * @description\n * This step sets the nucleus sampling parameter (top-p) for the TTYG agent.\n * It guides the user to adjust the top-p control to a specified value.\n *\n * Configure the nucleus sampling (top-p) parameter<br>\n * <img src=\"resources/guides/ttyg/configure-top-p.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {number} options.topP - The target value for the top-p parameter (between 0 and 1).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-top-p\",\n * \"options\": {\n * \"topP\": 0.9\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-top-p',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n const elementSelector = GuideUtils.getGuideElementSelector('top-p-control');\n const inputSelector = GuideUtils.getGuideElementSelector('top-p-control-input');\n\n return {\n guideBlockName: 'focus-element',\n options: {\n url: 'ttyg',\n elementSelector,\n placement: 'bottom',\n class: 'configure-top-p',\n content: translate(this.translationBundle, CONFIGURE_TOP_P, {topP: options.topP}),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(inputSelector, options.topP)),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [CONFIGURE_TOP_P]: 'Sets the nucleus sampling of the agent. Upon retrieving a set of candidate values, this controls how many of those values to consider using. Takes a value between 0 and 1.<br>Set slider to <b>{{topP}}</b>'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [CONFIGURE_TOP_P]: 'Définit l\\'échantillonnage du noyau de l\\'agent. Lors de la récupération d\\'un ensemble de valeurs candidates, cela contrôle combien de ces valeurs doivent être considérées pour utilisation. Prend une valeur entre 0 et 1.<br>Réglez le curseur sur <b>{{topP}}</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\nimport {BASIC_STEP} from '../config.js';\n\n/**\n * @name clickable-element\n * @memberof module:Interactive Guide\n *\n * @description\n * The Clickable Element step is used to guide users to click on a specific element on the interface. Clicking on the\n * element will automatically advance to the next step.\n *\n * Clickable element example<br>\n * <img src=\"resources/guides/core/clickable-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} [options.clickableElementSelector] - The CSS selector of the element to be clicked. If not provided, `options.elementSelector` will be used.\n * @property {string} [options.elementSelector] - The CSS selector of the element to be highlighted. If not provided, the first clickable element will be highlighted.\n * @property {function} [options.beforeShowPromise] - A promise that has to resolve, before the step is shown. If not provided, the step will be shown immediately.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"clickable-element\",\n * \"options\": {\n * \"clickableElementSelector\": \"#submit-button\",\n * \"content\": \"Please click the Submit button to proceed.\"\n * }\n * }\n * ```\n */\nconst step = {\n // An element which is expected to be clicked. If onNextClick is not defined, it will automatically click on the element on next button press\n guideBlockName: 'clickable-element',\n getStep: (options, services) => {\n const notOverridable = {\n type: 'clickable'\n };\n\n const stepDescription = {\n ...BASIC_STEP,\n advanceOn: {\n selector: options.clickableElementSelector || options.elementSelector,\n event: 'click'\n },\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n ...options,\n ...notOverridable\n };\n\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(services, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SELECT_AGENT_DEFAULT_TITLE = 'guide.step-action.select-ttyg-agent';\nconst SELECT_AGENT_INFO = 'guide.step_plugin.select-ttyg-agent.info.content';\nconst SKIP_SECTION = 'btn.skip-section';\n\n/**\n * @name ttyg-select-agent-info-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an informational message when selecting a TTYG agent.\n * It informs the user that they need to select an agent before interacting with their graph.\n *\n * Select an agent to edit<br>\n * <img src=\"resources/guides/ttyg/ttyg-select-agent-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-select-agent-info-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-select-agent-info-message',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, SELECT_AGENT_INFO),\n title: translate(this.translationBundle, TTYG_SELECT_AGENT_DEFAULT_TITLE),\n class: 'select-ttyg-agent',\n skipPoint: true,\n skipButtonLabel: translate(this.translationBundle, SKIP_SECTION),\n disablePreviousFlow: true,\n ...options,\n url: 'ttyg'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Select an agent',\n [SELECT_AGENT_INFO]: 'To talk to your graph, you need to select an agent first',\n [SKIP_SECTION]: 'Skip section'\n },\n\n fr: {\n [TTYG_SELECT_AGENT_DEFAULT_TITLE]: 'Sélectionner un agent',\n [SELECT_AGENT_INFO]: 'Pour parler à votre graphique, vous devez d\\'abord choisir un agent',\n [SKIP_SECTION]: 'Sauter la section'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst STRIP_MARKUP = 'guide.step_plugin.connectors-lucene-strip-markup-intro.content';\n\n/**\n * @name connectors-lucene-strip-markup-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"stripMarkup\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"stripMarkup\" parameter in mapping data between GraphDB and Lucene.\n *\n * Lucene connector stripMarkup introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-strip-markup-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-strip-markup-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-strip-markup-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, STRIP_MARKUP),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-strip-markup-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'stripMarkup'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [STRIP_MARKUP]: 'The <b>stripMarkup</b> parameter specifies whether HTML or XML tags should be removed from literal values.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [STRIP_MARKUP]: 'Le paramètre <b>stripMarkup</b> spécifie si les balises HTML ou XML doivent être supprimées des valeurs littérales.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst CREATE_REPO_BUTTON = 'guide.step_plugin.create_repository.create_repository_button.content';\n\n/**\n * @name repositories-create-repository\n * @memberof module:Interactive Guide\n *\n * @description\n * This step explains how to create a repository.\n *\n * Create repository step<br>\n * <img src=\"resources/guides/repository/repositories-create-repository.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-create-repository\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-create-repository',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CREATE_REPO_BUTTON),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'create-repository',\n ...options,\n url: 'repository',\n elementSelector: GuideUtils.getGuideElementSelector('createRepository'),\n onNextClick: GuideUtils.clickOnGuideElement('createRepository')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [CREATE_REPO_BUTTON]: 'Click on the <b>Create new repository</b> button.'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [CREATE_REPO_BUTTON]: 'Cliquez sur le bouton <b>Créer un nouveau dépôt</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst DROPDOWN_CONTENT = 'guide.step_plugin.create_repository.ruleset_dropdown.content';\n\n/**\n * @name repositories-ruleset-dropdown\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to select a ruleset for a repository.\n *\n * Ruleset dropdown step<br>\n * <img src=\"resources/guides/repository/repositories-ruleset-dropdown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} rulesetName - The name of the ruleset to be selected.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-ruleset-dropdown\",\n * \"options\": {\n * \"rulesetName\": \"OWL2-RL\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-ruleset-dropdown',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const repositoryIdInputSelector = GuideUtils.getGuideElementSelector('graphDBRepositoryIdInput');\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, DROPDOWN_CONTENT, {rulesetName: options.rulesetName}),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'gdb-repository-ruleset-select',\n ...options,\n url: 'repository/create/graphdb',\n elementSelector: GuideUtils.getGuideElementSelector('graphDBRepositoryRulesetSelect'),\n disablePreviousFlow: false,\n show: () => () => {\n GuideUtils.validateTextInput(repositoryIdInputSelector, options.repositoryId);\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [DROPDOWN_CONTENT]: 'Choose ruleset: <b>{{rulesetName}}</b>.'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [DROPDOWN_CONTENT]: 'Choisissez l\\'ensemble de règles : <b>{{rulesetName}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.import-file';\nconst CONTENT = 'guide.step_plugin.import_rdf_file.import-settings.import.button.content';\nconst UNEXPECTED_ERROR = 'guide.unexpected.error.message';\n\n/**\n * @name import-click-on-import-button\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `import-click-on-import-button` step guides the user to click the import button in the import settings dialog of GraphDB.<br>\n * <img src=\"resources/guides/import/import-click-on-import-button.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"import-click-on-import-button\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'import-click-on-import-button',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n const importSettingsButtonSelector = GuideUtils.getGuideElementSelector('import-settings-import-button');\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(step.translationBundle, CONTENT),\n title: translate(step.translationBundle, DEFAULT_TITLE),\n placement: 'top',\n class: 'import-settings-import-file-button',\n ...options,\n elementSelector: importSettingsButtonSelector,\n onPreviousClick: () => new Promise(function(resolve) {\n GuideUtils.clickOnGuideElement('import-settings-cancel-button')()\n .then(() => resolve());\n }),\n beforeShowPromise: () => services.GuideUtils.deferredShow(300)()\n .then(() => GuideUtils.getOrWaitFor(importSettingsButtonSelector, 3)\n .catch((error) => {\n services.toastr.error(translate(step.translationBundle, UNEXPECTED_ERROR));\n return Promise.reject(error);\n })\n ),\n onNextClick: () => GuideUtils.clickOnGuideElement('import-settings-import-button')(),\n canBePaused: false\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Import file',\n [CONTENT]: 'Click on the <b>Import</b> button.',\n [UNEXPECTED_ERROR]: 'The guide was cancelled due to an unexpected error. Please run the guide again and if the problem persists contact the support.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Importer un fichier',\n [CONTENT]: 'Cliquez sur le bouton <b>Importer</b>.',\n [UNEXPECTED_ERROR]: 'Le guide a été annulé en raison d\\'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_ASK_DEFAULT_TITLE = 'guide.step-action.ask-ttyg-agent';\nconst EXPLORE_SPARQL = 'guide.step_plugin.ask-ttyg-agent.explore-sparql';\n\n/**\n * @name ttyg-ask-agent-explore-sparql\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to explore the SPARQL query generated by the TTYG agent.\n * It highlights the \"Open in SPARQL editor\" button and provides instructions on how to proceed.\n *\n * Click on explore SPARQL button<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-agent-explore-sparql.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-ask-agent-explore-sparql\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-ask-agent-explore-sparql',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const exploreSparqlBtnSelector = GuideUtils.getLastGuideElementSelector('open-in-sparql-editor-btn');\n const elementSelector = GuideUtils.getLastGuideElementSelector('chat-item', exploreSparqlBtnSelector);\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_ASK_DEFAULT_TITLE);\n\n return [\n {\n // If button is not visible for some reason, skip the whole step\n guideBlockName: 'info-message',\n options: {\n url: 'ttyg',\n beforeShowPromise: (guide, currentStep) => GuideUtils.waitFor(elementSelector, 1)\n .then(() => {\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.next());\n })\n .catch(() => {\n const stepId = currentStep.id;\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.show(stepId + 2));\n }),\n ...options\n }\n },\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, EXPLORE_SPARQL),\n class: 'explore-sparql',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Ask the agent',\n [EXPLORE_SPARQL]: 'You can open the query in the SPARQL editor by clicking on \\'Open in SPARQL editor\\' button. When you are ready, return to the page.'\n },\n\n fr: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Demander à l\\'agent',\n [EXPLORE_SPARQL]: 'Vous pouvez ouvrir la requête dans l\\'éditeur SPARQL en cliquant sur le bouton \\'Ouvrir dans l\\'éditeur SPARQL\\'. Lorsque vous êtes prêt, retournez à la page'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.visual-graph';\nconst CONTENT = 'guide.step_plugin.visual-graph-config-starting-point-intro.content';\n\n/**\n * @name visual-graph-config-starting-point-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-config-starting-point-intro` step displays a dialog that introduces the starting point section\n * of the Visual Graph configuration.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-starting-point-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-starting-point-intro',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'info-message',\n options: {\n url: 'graphs-visualizations/config/save',\n class: 'visual-graph-config-starting-point-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Visual graph explore',\n [CONTENT]: 'Starting point defines how the visual graph begins when it is opened. It determines the first resource or set of results that will appear in the graph and from which the visualization starts.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Explorer le graphique visuel',\n [CONTENT]: 'Le point de départ définit comment le graphique visuel commence lorsqu\\'il est ouvert. Il détermine la première ressource ou l\\'ensemble de résultats qui apparaîtra dans le graphique et à partir duquel la visualisation démarre.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-class-list-background-intro.content';\n\n/**\n * @name class-relationships-class-list-background-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-class-list-background-intro` step displays a dialog that explains which classes are highlighted\n * in the dependency table of the Class Relationships view.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-class-list-background-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-class-list-background-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-class-list-background-intro',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n url: 'relationships',\n elementSelector: GuideUtils.getGuideElementSelector('class-list'),\n placement: 'right',\n class: 'class-relationships-class-list-background-intro',\n content: translate(this.translationBundle, CONTENT),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'A <b>green background</b> behind a class name in the list indicates that it is currently shown in the diagram.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Un <b>arrière-plan vert</b> derrière un nom de classe dans la liste indique qu\\'elle est actuellement affichée dans le diagramme.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_SHARE_CONTENT = 'guide.step-action.visual-graph-config-share-content';\n\n/**\n * @name visual-graph-config-share\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to check the share visual graph configuration checkbox to make the config available to other users\n *\n * Share visual graph config step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-share.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-share\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-share',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('share-graph-config');\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_SHARE_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(elementSelector)),\n scrollToHandler: () => GuideUtils.scrollIntoView(elementSelector, {block: 'center', behavior: 'smooth'}),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_SHARE_CONTENT]: 'Check the <b>Share visual graph with other users</b> box to make the visual graph configuration available to other users in the repository.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_SHARE_CONTENT]: 'Cochez la case <b>Partager le graphique visuel avec d\\'autres utilisateurs</b> pour rendre la configuration du graphique visuel accessible aux autres utilisateurs du dépôt.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","import * as Utils from '../utils.js';\n\nconst QUERY_NOT_SAME_ERROR = 'guide.step_plugin.execute-sparql-query.query-not-same.error';\nconst UNEXPECTED_ERROR = 'guide.unexpected.error.message';\nconst SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\n\n/**\n * @name execute-sparql-query\n * @memberof module:Interactive Guide\n *\n * @description\n * Composite step that executes a SPARQL query and displays the results.\n * Included steps are:\n *\n * Copy to editor<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click run button<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-run-button.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Explain results<br>\n * <img src=\"resources/guides/sparql-editor/sparql-results-explain.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {Array} queries - An array of objects containing the query and the additional content to display in the results.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"execute-sparql-query\",\n * \"options\": {\n * \"queries\": [\n * {\n * \"query\": \"SELECT ?s WHERE { ?s ?p ?o } LIMIT 10\",\n * \"queryExtraContent\": {\n * \"en\": \"This is the first query extra content.\"\n * },\n * \"resultExtraContent\": {\n * \"en\": \"This is the first result extra content.\"\n * }\n * },\n * {\n * \"query\": \"SELECT ?o WHERE { <http://example.org/subject> ?p ?o } LIMIT 5\",\n * \"queryExtraContent\": {\n * \"en\": \"This is the second query extra content.\"\n * },\n * \"resultExtraContent\": {\n * \"en\": \"This is the second result extra content.\"\n * }\n * }\n * ]\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'execute-sparql-query',\n getSteps: function(options, services) {\n const translate = services.translate;\n\n options.mainAction = 'execute-sparql-query';\n options.title = options.title ?? translate(this.translationBundle, SPARQL_EDITOR_TITLE);\n\n const steps = [\n {\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'sparql',\n showIntro: true,\n ...options\n }\n }\n ];\n\n const defaultQuery = 'select * where { \\n\\t?s ?p ?o .\\n} limit 100 \\n';\n const queries = {};\n queries[-1] = 'PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\\nselect * where { \\n\\t?s ?p ?o .\\n?o rdf:type \"\"\\n} limit 100 ';\n\n let overwriteQuery = false;\n (options.queries ?? []).forEach((queryDef, index) => {\n const query = queryDef.query;\n queries[index] = query;\n\n steps.push({\n guideBlockName: 'sparql-editor',\n options: {\n query,\n queryExtraContent: queryDef.queryExtraContent,\n beforeShowPromise: () => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then(() => services.GuideUtils.waitFor(services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR, 3))\n .then(() => services.GuideUtils.deferredShow(500)())\n .catch((error) => {\n services.toastr.error(translate(this.translationBundle, UNEXPECTED_ERROR));\n throw error;\n }),\n onNextValidate: () => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then((yasgui) => yasgui.getQuery().then((query) => ({yasgui, queryFromEditor: query})))\n .then(({yasgui, queryFromEditor}) => {\n const editorQuery = services.GuideUtils.removeWhiteSpaces(queryFromEditor);\n const stepQuery = services.GuideUtils.removeWhiteSpaces(query);\n if (editorQuery !== stepQuery) {\n if (editorQuery === 'select*where{?s?p?o.}limit100' || overwriteQuery) {\n // The query is the default query OR we previously overwrote it => we can overwrite it\n yasgui.setQuery(query);\n } else {\n services.GuideUtils.noNextErrorToast(services.toastr, services.$translate, services.$interpolate,\n QUERY_NOT_SAME_ERROR, options);\n return false;\n }\n }\n overwriteQuery = true;\n return true;\n }),\n initPreviousStep: () => {\n if (index === 0) {\n return services.YasguiComponentUtil.setQuery(Utils.SPARQL_DIRECTIVE_SELECTOR, defaultQuery);\n }\n\n const haveToReload = 'sparql' !== services.RoutingUtil.getCurrentRoute();\n\n if (haveToReload) {\n services.RoutingUtil.navigate('/sparql');\n }\n\n return services.GuideUtils.waitFor(services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR)\n .then(() => services.YasguiComponentUtil.executeSparqlQuery('#query-editor', query));\n },\n ...options\n }\n });\n steps.push({\n guideBlockName: 'sparql-editor-run-button',\n options: {\n initPreviousStep: (services, stepId) => {\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.options.id)\n .then(() => {\n const currentStepId = services.ShepherdService.getCurrentStepId();\n // Skip expanding of node if last step is \"visual-graph-expand\"\n if (currentStepId === stepId) {\n return Promise.resolve();\n }\n\n return services.YasguiComponentUtil.executeSparqlQuery('#query-editor', query);\n });\n },\n ...options\n }\n });\n steps.push({\n guideBlockName: 'sparql-results-explain',\n options: {\n extraContent: queryDef.resultExtraContent,\n initPreviousStep: (services, stepId) => {\n if ('sparql' !== services.RoutingUtil.getCurrentRoute()) {\n services.RoutingUtil.navigate('/sparql');\n return services.GuideUtils.waitFor(services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR)\n .then(() => services.GuideUtils.deferredShow(500)())\n .then(() => services.YasguiComponentUtil.executeSparqlQuery('#query-editor', query));\n }\n\n const previousStep = services.ShepherdService.getPreviousStepFromHistory(stepId);\n return previousStep.options.initPreviousStep(services, previousStep.options.id)\n .then(() => services.YasguiComponentUtil.setQuery(Utils.SPARQL_DIRECTIVE_SELECTOR, query));\n },\n ...options\n }\n });\n });\n\n return steps;\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'Execute SPARQL query',\n [UNEXPECTED_ERROR]: 'The guide was cancelled due to an unexpected error. Please run the guide again and if the problem persists contact the support.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Exécuter une requête SPARQL',\n [UNEXPECTED_ERROR]: 'Le guide a été annulé en raison d\\'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\nimport * as Utils from '../utils.js';\n\n/**\n * @name toggle-element\n * @memberof module:Interactive Guide\n *\n * @description\n * The Toggleable Element step is used to guide users to enable a specific toggleable element (like a switch or checkbox)\n * on the interface. The step ensures that a user cannot go back to this step and deselect the toggleable element.\n *\n * Toggleable element example<br>\n * <img src=\"resources/guides/core/toggle-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {boolean} options.disable - Set to true to guide the user to disable the element, or false(or missing) to enable it.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"toggle-element\",\n * \"options\": {\n * \"disable\": true, // or false to enable\n * }\n * }\n * ```\n */\nconst step = {\n // An element, which can be toggled via click\n guideBlockName: 'toggle-element',\n getStep: (options, pluginService) => {\n const notOverridable = {\n type: 'toggleable'\n };\n\n let stepHTMLElement;\n const selector = options.toggleableElementSelector || options.elementSelector;\n // By default, allow only enabling of the element, unless disable is explicitly set to true. In that case\n // only disabling will be allowed\n const shouldDisable = options.disable ?? false;\n\n const toggleListener = (event) => {\n if (event.target.checked === shouldDisable) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n const stepDescription = {\n ...BASIC_STEP,\n advanceOn: {\n selector,\n event: 'click'\n },\n\n initPreviousStep: pluginService.GuideUtils.defaultInitPreviousStep,\n ...options,\n show: () => () => {\n stepHTMLElement = document.querySelector(selector);\n stepHTMLElement.addEventListener('click', toggleListener, true);\n },\n hide: () => () => {\n if (stepHTMLElement) {\n stepHTMLElement.removeEventListener('click', toggleListener);\n }\n },\n ...notOverridable\n };\n\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(pluginService, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {\n getConnectorContentSelector,\n getConnectorNameSelector,\n getConnectorParameterSelector,\n getConnectorSubparameterSelector\n} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst SUBPARAMETER_INTRO = 'guide.step_plugin.connectors-array-subparameter-intro.content';\n\n/**\n * @name connectors-array-subparameter-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the creation of a subparameter within a parameter of a connector.\n * It explains the purpose and usage of subparameters in defining how a connector instance is created.\n *\n * Connectors subparameter introduction<br>\n * <img src=\"resources/guides/connectors/connectors-array-subparameter-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the subparameter is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n * @property {string} parameterName - the specific creation parameter name for <code>instanceName</code>.\n * @property {string} subparameterName - the specific creation subparameter name for <code>parameterName</code>.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-array-subparameter-intro\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\",\n * \"parameterName\": \"hosts\",\n * \"subparameterName\": \"host\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-array-subparameter-intro',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n * - <b>parameterName</b>: string (required) – the specific creation parameter name for <code>instanceName</code>.\n * - <b>subparameterName</b>: string (required) – the specific creation subparameter name for <code>parameterName</code>.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const GuideUtils = pluginService.GuideUtils;\n const connectorNameSelector = getConnectorNameSelector(options, pluginService);\n const connectorContentSelector = getConnectorContentSelector(options, pluginService);\n const parameterSelector = getConnectorParameterSelector(options, pluginService);\n const subparameterName = getConnectorSubparameterSelector(options, pluginService);\n const elementSelector = `${connectorNameSelector} ${connectorContentSelector} ${parameterSelector} ${subparameterName}`;\n\n return [{\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-connector-intro',\n content: translate(this.translationBundle, SUBPARAMETER_INTRO),\n ...options,\n elementSelector,\n scrollToHandler: () => GuideUtils.scrollIntoView(elementSelector, {block: 'center', behavior: 'smooth'}),\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [SUBPARAMETER_INTRO]: 'A parameter can define how an instance is created. Its value may be a simple type, a list, or an object, and it can be required or optional.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [SUBPARAMETER_INTRO]: 'Un paramètre peut définir comment une instance est créée. Sa valeur peut être un type simple, une liste ou un objet, et il peut être obligatoire ou optionnel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_SETTINGS_CLICK_CONTENT = 'guide.step-action.visual-graph-settings-click-content';\n\n/**\n * @name visual-graph-settings-click\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click on the graph settings button to open the visual graph settings.<br>\n *\n * Click on graph settings button step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-settings-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-settings-click\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-settings-click',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-settings-button');\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_SETTINGS_CLICK_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n elementSelector,\n onNextClick: GuideUtils.clickOnElement(elementSelector),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_SETTINGS_CLICK_CONTENT]: 'Click on <b>Graph settings</b>.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_SETTINGS_CLICK_CONTENT]: 'Cliquez sur <b>Paramètres du graphique</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const FTS_METHOD_DEFAULT_TITLE = 'guide.step-action.fts-search-method';\nconst SET_MAX_TRIPLES_PER_CALL = 'guide.step_plugin.fts-search-method.set-max-triples-per-call';\n\n/**\n * @name set-max-triples-per-call\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to set the maximum number of triples to retrieve per call in the FTS search method configuration.\n * It highlights the input field and provides instructions on how to proceed.\n *\n * Set maximum triples per call<br>\n * <img src=\"resources/guides/ttyg/set-max-triples-per-call.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {number} options.maxTriplesPerCall - The maximum number of triples to retrieve per call. This will be displayed in the instructions and used for validation.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"set-max-triples-per-call\",\n * \"options\": {\n * \"maxTriplesPerCall\": 100\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'set-max-triples-per-call',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, SET_MAX_TRIPLES_PER_CALL, {maxTriplesPerCall: options.maxTriplesPerCall}),\n title: translate(this.translationBundle, FTS_METHOD_DEFAULT_TITLE),\n class: 'toggle-fts-search',\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('max-triples-per-call-input'),\n onNextValidate: () => {\n if (options.maxTriplesPerCall) {\n return Promise.resolve(GuideUtils.validateTextInput(GuideUtils.getGuideElementSelector('max-triples-per-call-input'), options.maxTriplesPerCall, false));\n }\n return Promise.resolve(true);\n }\n }\n };\n },\n translationBundle: {\n en: {\n [FTS_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [SET_MAX_TRIPLES_PER_CALL]: 'Type <b>{{maxTriplesPerCall}}</b> as the maximum number of triples to retrieve per call.'\n },\n fr: {\n [FTS_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [SET_MAX_TRIPLES_PER_CALL]: 'Saisissez <b>{{maxTriplesPerCall}}</b> comme nombre maximum de triplets à récupérer par appel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst DISABLE_TOGGLE = 'guide.step_plugin.autocomplete.iri-discovery.disable-toggle';\nconst ENABLE_TOGGLE = 'guide.step_plugin.autocomplete.iri-discovery.enable-toggle';\n\n/**\n * @name configure-autocomplete-iri-discovery\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable or disable the autocomplete IRI discovery feature in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable/disable autocomplete for IRI discovery<br>\n * <img src=\"resources/guides/ttyg/configure-autocomplete-iri-discovery.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {boolean} [options.disable] - Set to true to guide the user to disable the IRI discovery search, or false to enable it.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-autocomplete-iri-discovery\",\n * \"options\": {\n * \"disable\": true // or false to enable\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-autocomplete-iri-discovery',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('autocomplete-iri-discovery-input');\n const shouldToggleOff = options.disable;\n const translate = pluginService.translate;\n\n let content;\n if (shouldToggleOff) {\n content = translate(this.translationBundle, DISABLE_TOGGLE);\n } else {\n content = translate(this.translationBundle, ENABLE_TOGGLE);\n }\n\n return {\n guideBlockName: 'toggle-element',\n options: {\n content,\n class: 'toggle-autocomplete-iri-discovery',\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('autocomplete-iri-discovery'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => {\n const isEnabled = GuideUtils.isChecked(toggleSelector);\n return Promise.resolve(shouldToggleOff ? !isEnabled : isEnabled);\n }\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [DISABLE_TOGGLE]: 'Click on the toggle to disable <b>Autocomplete for IRI discovery</b>.',\n [ENABLE_TOGGLE]: 'Click on the toggle to enable <b>Autocomplete for IRI discovery</b>. This method helps the model discover relevant IRIs when a query contains incomplete names or references and cannot be resolved directly.'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [DISABLE_TOGGLE]: 'Cliquez sur le bouton pour désactiver l\\'<b>Autocomplétion pour la découverte d\\'IRI</b>.',\n [ENABLE_TOGGLE]: 'Cliquez sur le bouton pour activer l\\'<b>Autocomplétion pour la découverte d\\'IRI</b>. Cette méthode aide le modèle à découvrir les IRI pertinents lorsqu\\'une requête contient des noms ou des références incomplets et ne peut pas être résolue directement.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {getConnectorNameSelector} from '../utils.js';\n\nconst CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst EXPAND_CONNECTOR_CONTENT = 'guide.step_plugin.connectors-expand-connector.content';\n\n/**\n * @name connectors-expand-connector\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to expand the connector details by clicking on its name.\n *\n * Connectors expand step<br>\n * <img src=\"resources/guides/connectors/connectors-expand-connector.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {string} connectorName - the name of the connector for which the section is being defined.\n * @property {string} instanceName - the specific instance name of the connector.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-expand-connector\",\n * \"options\": {\n * \"connectorName\": \"Elasticsearch\",\n * \"instanceName\": \"MyElasticsearchConnector\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-expand-connector',\n /**\n * Options:\n * - <b>connectorName</b>: string (required).\n * <ol>Possible values:\n * <li>Elasticsearch</li>\n * <li>OpenSearch</li>\n * <li>Solr</li>\n * <li>Lucene</li>\n * <li>Kafka</li>\n * <li>ChatGPT-Retrieval</li>\n * </ol>\n * - <b>instanceName</b>: string (required) – the specific connector instance name for <code>connectorName</code>.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const GuideUtils = pluginService.GuideUtils;\n const connectorNameSelector = getConnectorNameSelector(options, pluginService);\n const connectorToggleButtonSelector = GuideUtils.getGuideElementSelector(`${options.instanceName}-connector-toggle-button`, 'a');\n return [{\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-expand-connector',\n content: translate(this.translationBundle, EXPAND_CONNECTOR_CONTENT),\n ...options,\n elementSelector: `${connectorNameSelector} ${connectorToggleButtonSelector}`,\n url: 'connectors',\n onNextClick: () => {\n GuideUtils.clickOnElement(`${connectorNameSelector} ${connectorToggleButtonSelector}`)();\n }\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [EXPAND_CONNECTOR_CONTENT]: 'To view the configuration of a connector, click on its name. This will expand the connector details.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [EXPAND_CONNECTOR_CONTENT]: 'Pour voir la configuration d\\'un connecteur, cliquez sur son nom. Cela développera les détails du connecteur.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\n\n/**\n * @name wait-for-element-to-show\n * @memberof module:Interactive Guide\n *\n * @description\n * Waits for a specific element to become visible and then immediately advances to the next step.\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.elementSelectorToShow - CSS selector of the element that must appear before advancing.\n * @property {number} [options.timeToWait=2] - Max seconds to wait before aborting the guide.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"wait-for-element-to-show\",\n * \"options\": {\n * \"elementSelectorToShow\": \"#loaded-panel\",\n * \"timeToWait\": 5\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'wait-for-element-to-show',\n getStep: (options, services) => {\n return {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n beforeShowPromise: (guide) => services.GuideUtils.getOrWaitFor(options.elementSelectorToShow, options.timeToWait || 2)\n .catch(() => {\n services.ShepherdService._abortGuide(guide);\n }),\n show: (guide) => () => {\n // Using a timeout because the library executes async logic\n setTimeout(() => guide.next());\n },\n ...options\n };\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst RESOURCE_RESULTS_CLICK_IRI_TITLE = 'view.resource.title';\nconst RESOURCE_RESULTS_CLICK_IRI_CONTENT = 'guide.step_plugin.resource-results-click-on-iri.content';\n\n/**\n * @name resource-results-click-on-iri\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-results-click-on-iri` guide step guides the user to click on an IRI in the resource results table\n * to explore the data using the Visual Graph view.\n *\n * <img src=\"resources/guides/resource/resource-results-click-on-iri.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific options are available:\n *\n * Options:\n * @property {string} options.iri - The IRI used to build the element selector for the clickable element.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-results-click-on-iri\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\",\n * \"skipUrl\": false\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-results-click-on-iri',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, RESOURCE_RESULTS_CLICK_IRI_TITLE),\n content: translate(this.translationBundle, RESOURCE_RESULTS_CLICK_IRI_CONTENT),\n ...options,\n elementSelector: GuideUtils.getSparqlResultsSelectorForIri(options.iri),\n ...(options.skipUrl ? {} : {url: Utils.getResourceURL(options)}),\n class: 'resource-results-click-on-iri',\n onNextClick: (guide, step) => {\n GuideUtils.waitFor(step.elementSelector, 3)\n .then(() => document.querySelector(step.elementSelector).click());\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_RESULTS_CLICK_IRI_TITLE]: 'Resource',\n [RESOURCE_RESULTS_CLICK_IRI_CONTENT]: 'You can always explore the same data using the <b>Visual graph</b> view. Click on the Visual graph button to try it now.'\n },\n fr: {\n [RESOURCE_RESULTS_CLICK_IRI_TITLE]: 'Ressource',\n [RESOURCE_RESULTS_CLICK_IRI_CONTENT]: 'Vous pouvez toujours explorer les mêmes données en utilisant la vue <b>Graphique visuel</b>. Cliquez sur le bouton Graphique visuel pour l’essayer dès maintenant.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_DEFAULT_TITLE = 'visual.graph.label';\nconst VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_CONTENT = 'guide.step_plugin.visual_graph_show_autocomplete.content';\n\n/**\n * @name visual-graph-search-rdf-resources-input-autocomplete-item\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-search-rdf-resources-input-autocomplete-item` step triggers the autocomplete item for a discovered RDF resource in the Visual Graph search input.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-search-rdf-resources-input-autocomplete-item.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is available:\n *\n * @property {string} [options.iri] - The IRI displayed in the autocomplete item.\n */\nconst step = {\n guideBlockName: 'visual-graph-search-rdf-resources-input-autocomplete-item',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n\n return [\n {\n // TODO: Refactor this to use the generic resource-search-autocomplete-item.js or remove completely in favor of that step\n guideBlockName: 'clickable-element',\n options: {\n // Title comes from options.title when provided, otherwise use translated default\n title: translate(this.translationBundle, VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_DEFAULT_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_CONTENT, {iri: options.iri}),\n url: 'graphs-visualizations',\n elementSelector: GuideUtils.getGuideElementSelector(`autocomplete-${options.iri}`),\n class: 'visual-graph-show-autocomplete',\n onNextClick: (guide, step) => GuideUtils.waitFor(step.elementSelector, 3).then(() => $(step.elementSelector).trigger('click')),\n canBePaused: false,\n forceReload: true,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_DEFAULT_TITLE]: 'Visual graph',\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_CONTENT]: 'Click on the <b>{{iri}}</b> IRI to show the visual graph.'\n },\n fr: {\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_DEFAULT_TITLE]: 'Graphique visuel',\n [VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_CONTENT]: 'Cliquez sur l\\'IRI <b>{{iri}}</b> pour afficher le graphique visuel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * Interface for plugin-related services that can be used across all steps.\n *\n * This service is provided by the plugin system and must be used by plugins to interact with the application.\n */\nexport class PluginServiceInterface {\n /**\n * Translates a key into the target locale using the translation functionality provided by the plugin client.\n * The returned string is based on the language selected in the client. Falls back to the key itself if no translation is found.\n *\n * @param {Object<string, Object<string, string>>} _translationBundle -\n * A translation bundle organized by locale. Each locale maps to an object of translation keys and their localized strings.\n * Example:\n * ```js\n * {\n * en: {\n * \"guide.step_plugin.welcome.title\": \"Welcome to {{translatedGuideName}}\",\n * \"guide.step_plugin.welcome.content\": \"Throughout the guide you will see boxes like this...\"\n * },\n * fr: {\n * \"guide.step_plugin.welcome.title\": \"Bienvenue dans {{translatedGuideName}}\",\n * \"guide.step_plugin.welcome.content\": \"Tout au long du guide, vous verrez des boîtes comme celle-ci...\"\n * }\n * }\n * ```\n * @param {string} _translationKey - The translation key to look up.\n * @param {Object<string, string>} _translationParameters - Optional parameters to interpolate into the translation string\n * (e.g., `{ username: \"John\" }`).\n * @returns {string} The translated string, or the key if no translation is available.\n */\n translate(_translationBundle = {}, _translationKey = '', _translationParameters = {}) {}\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst LUCENE_CONTENT = 'guide.step_plugin.connectors-lucene.content';\n\n/**\n * @name connectors-lucene\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an overview of a specific Lucene connector instance in GraphDB.\n * It highlights the connector's name and offers options to manage it, such as copying, restarting, or deleting.\n *\n * Lucene connector overview<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.instanceName`.\n *\n * @property {string} options.instanceName - The specific instance name of the Lucene connector. This option is required.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene\",\n * \"options\": {\n * \"instanceName\": \"MyLuceneConnector\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-connector-intro',\n options: {\n content: translate(this.translationBundle, LUCENE_CONTENT, {instanceName: options.instanceName}),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n connectorName: LUCENE_CONNECTOR_NAME,\n class: 'connectors-lucene'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [LUCENE_CONTENT]: 'This is the <b>Lucene connector</b> named <b>{{instanceName}}</b>. You can copy, restart, or delete it using the icons on the right.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [LUCENE_CONTENT]: 'Ceci est le <b>connecteur Lucene</b> nommé <b>{{instanceName}}</b>. Vous pouvez le copier, le redémarrer ou le supprimer à l’aide des icônes à droite.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst SET_MAX_IRIS_PER_CALL = 'guide.step_plugin.ttyg.set-max-iris-per-call';\n\n/**\n * @name set-max-iris-per-call\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to set the maximum number of IRIs to retrieve per call in the TTYG agent configuration.\n * It highlights the input field and provides instructions on how to proceed.\n *\n * Set maximum IRIs per call<br>\n * <img src=\"resources/guides/ttyg/set-max-iris-per-call.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {number} options.maxIrisPerCall - The maximum number of IRIs per call. This will be displayed in the instructions and used for validation.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"set-max-iris-per-call\",\n * \"options\": {\n * \"maxIrisPerCall\": 20\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'set-max-iris-per-call',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const maxIrisPerCall = options.maxIrisPerCall ?? 10;\n const maxIrisInputSelector = GuideUtils.getGuideElementSelector('autocomplete-max-iris-input');\n\n return {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, SET_MAX_IRIS_PER_CALL, {maxIrisPerCall}),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n class: 'set-max-iris-per-call',\n ...options,\n url: 'ttyg',\n elementSelector: maxIrisInputSelector,\n onNextValidate: () => {\n return Promise.resolve(GuideUtils.validateTextInput(maxIrisInputSelector, maxIrisPerCall, false));\n }\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [SET_MAX_IRIS_PER_CALL]: 'Set the <b>Max number of results (IRIs) per call</b> to <b>{{maxIrisPerCall}}</b>.<br>This setting limits how many candidate IRIs the agent retrieves in a single autocomplete call when trying to resolve partial names. Keeping this value at a reasonable level helps control the amount of data returned so that the agent sees a manageable set of possible matches without overwhelming the query context.'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [SET_MAX_IRIS_PER_CALL]: 'Réglez le <b>Nombre maximal de résultats (IRI) par appel</b> sur <b>{{maxIrisPerCall}}</b>.<br>Ce paramètre limite le nombre d\\'IRI candidates que l\\'agent récupère lors d\\'un seul appel d\\'autocomplétion lorsqu\\'il tente de résoudre des noms partiels. Maintenir cette valeur à un niveau raisonnable aide à contrôler la quantité de données renvoyées afin que l\\'agent voie un ensemble gérable de correspondances possibles sans submerger le contexte de la requête.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst CONNECTORS_INTRO_CONTENT = 'guide.step_plugin.connectors-connectors-intro.content';\n\n/**\n * @name connectors-connectors-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Connectors\" section of the GraphDB Workbench.\n *\n * Connectors introduction<br>\n * <img src=\"resources/guides/connectors/connectors-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-intro',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n return [{\n guideBlockName: 'info-message',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-connectors-intro',\n content: translate(this.translationBundle, CONNECTORS_INTRO_CONTENT),\n ...options,\n url: 'connectors'\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [CONNECTORS_INTRO_CONTENT]: 'GraphDB Connectors let you integrate external components and services with your repository data. They extend what your applications can do and stay automatically in sync with repository updates.'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [CONNECTORS_INTRO_CONTENT]: 'Les connecteurs GraphDB vous permettent d\\'intégrer des composants et services externes avec les données de votre référentiel. Ils étendent les capacités de vos applications et restent automatiquement synchronisés avec les mises à jour du référentiel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\nconst RDF_INSTANCES_SIDE_PANEL_INTRO = 'guide.step_plugin.class-hierarchy-rdf-instances-side-panel-intro.content';\n\n/**\n * @name class-hierarchy-rdf-instances-side-panel-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on introducing the RDF instances side panel in the class hierarchy view.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-intro.png\" style=\"height:200px; border: solid\">\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.iri`\n *\n * @property {string} options.iri - The IRI of the class whose instances are to be viewed. This option is required.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-rdf-instances-side-panel-intro\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-rdf-instances-side-panel-intro',\n /**\n *\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title,\n content: translate(this.translationBundle, RDF_INSTANCES_SIDE_PANEL_INTRO, {iri: options.iri}),\n url: 'hierarchy',\n elementSelector: '.rdf-info-side-panel div',\n class: 'class-hierarchy-rdf-instances-side-panel-intro',\n canBePaused: false,\n placement: 'left',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy',\n [RDF_INSTANCES_SIDE_PANEL_INTRO]: 'The side panel shows the first 1,000 instances of the clicked class, <b>{{iri}}</b>.'\n },\n\n fr: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe',\n [RDF_INSTANCES_SIDE_PANEL_INTRO]: 'Le panneau latéral affiche les 1 000 premières instances de la classe cliquée, <b>{{iri}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.similarity-search-method';\nconst SELECT_INDEX = 'guide.step_plugin.similarity-search-method.select-index';\n\n/**\n * @name ttyg-similarity-select-index\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to select the index to use for Similarity search in the TTYG interface.\n * It highlights the dropdown element and provides instructions on how to proceed.\n *\n * Select the index to use for Similarity search<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-select-index.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-similarity-select-index\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-similarity-select-index',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'focus-element',\n options: {\n content: translate(this.translationBundle, SELECT_INDEX),\n class: 'select-similarity-index',\n title: translate(this.translationBundle, SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE),\n ...options,\n elementSelector: GuideUtils.getGuideElementSelector('similarity-connector-select')\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [SELECT_INDEX]: 'Select the index to use for Similarity search.'\n },\n fr: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [SELECT_INDEX]: 'Sélectionner l\\'index à utiliser pour la recherche de similarité.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_PROPERTIES_DESCRIPTION = 'guide.step-action.visual-graph-config-description';\n\n/**\n * @name visual-graph-config-description\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-config-description` guide step prompts the user to type a description for their visual graph configuration.\n *\n * Configure graph description<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-description.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} [options.configDescription] - The description of the visual graph configuration to be entered by the user.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-config-description\",\n * \"options\": {\n * \"configDescription\": \"my-config-description\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-description',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-config-description');\n const configDescription = options.configDescription || '';\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_PROPERTIES_DESCRIPTION, {configDescription}),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n ...options,\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(elementSelector, configDescription))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_DESCRIPTION]: 'Enter a description: <b>{{configDescription}}</b>'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_DESCRIPTION]: 'Entrez une description : <b>{{configDescription}}</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst CONFIGURE_TEMPERATURE_INFO = 'guide.step_plugin.configure-temperature.info';\n\n/**\n * @name configure-temperature\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to configure the sampling temperature setting for the TTYG agent.\n * It highlights the sampling temperature control element and provides instructions on how to set it.\n *\n * Configure sampling temperature<br>\n * <img src=\"resources/guides/ttyg/configure-temperature.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {number} options.temperature - The temperature value to set, typically between 0 and 2.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-temperature\",\n * \"options\": {\n * \"temperature\": 0.7\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-temperature',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n const elementSelector = GuideUtils.getGuideElementSelector('temperature-control');\n const inputSelector = GuideUtils.getGuideElementSelector('temperature-control-input');\n\n return {\n guideBlockName: 'focus-element',\n options: {\n url: 'ttyg',\n elementSelector,\n placement: 'bottom',\n class: 'configure-temperature',\n content: translate(this.translationBundle, CONFIGURE_TEMPERATURE_INFO, {temperature: options.temperature}),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(inputSelector, options.temperature)),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [CONFIGURE_TEMPERATURE_INFO]: 'Sets the sampling temperature of the agent. Lower values result in more consistent, repetitive responses generated by the agent and higher values result in a wider variety of responses. This takes a value between 0 and 2, but values higher than 1 may result in unreliable and unpredictable answers and are not recommended.<br>Set slider to <b>{{temperature}}</b>'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [CONFIGURE_TEMPERATURE_INFO]: 'Définit la température d\\'échantillonnage de l\\'agent. Des valeurs plus faibles donnent des réponses plus cohérentes et répétitives générées par l\\'agent et des valeurs plus élevées donnent une plus grande variété de réponses. Cela prend une valeur entre 0 et 2, mais des valeurs supérieures à 1 peuvent donner des réponses peu fiables et imprévisibles et ne sont pas recommandées.<br>Réglez le curseur sur <b>{{temperature}}</b>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CONNECTORS_DEFAULT_TITLE = 'menu.connectors.label';\nconst CLOSE_VIEW_SPARQL_DIALOG = 'guide.step_plugin.connectors-close-view-sparql-query-dialog.content';\n\n/**\n * @name connectors-close-view-sparql-query-dialog\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to close the \"View SPARQL Query\" dialog.\n *\n * Close SPARQL Query dialog example<br>\n * <img src=\"resources/guides/connectors/connectors-close-view-sparql-query-dialog.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-close-view-sparql-query-dialog\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-close-view-sparql-query-dialog',\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const GuideUtils = pluginService.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('close-view-query-dialog');\n return [{\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, CONNECTORS_DEFAULT_TITLE),\n placement: 'top',\n class: 'connectors-close-view-sparql-query-dialog',\n content: translate(this.translationBundle, CLOSE_VIEW_SPARQL_DIALOG),\n ...options,\n elementSelector,\n url: 'connectors',\n onNextClick: () => {\n GuideUtils.clickOnElement(elementSelector)();\n }\n }\n }];\n },\n translationBundle: {\n en: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connectors',\n [CLOSE_VIEW_SPARQL_DIALOG]: 'Click on close button to close the dialog'\n },\n fr: {\n [CONNECTORS_DEFAULT_TITLE]: 'Connecteurs',\n [CLOSE_VIEW_SPARQL_DIALOG]: 'Cliquez sur le bouton de fermeture pour fermer la boîte de dialogue.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_PROPERTIES_TITLE = 'guide.step_plugin.visual-graph-properties.title';\nconst VISUAL_GRAPH_PROPERTIES_CONTENT = 'guide.step_plugin.visual-graph-properties.content';\nconst VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_TITLE = 'guide.step_plugin.visual-graph-properties-side-panel.title';\nconst VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CONTENT = 'guide.step_plugin.visual-graph-properties-side-panel.content';\nconst VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE_TYPES = 'guide.step_plugin.visual-graph-properties-focus-types.title';\nconst VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT_TYPES = 'guide.step_plugin.visual-graph-properties-focus-types.content';\nconst VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE = 'guide.step_plugin.visual-graph-properties-focus-property.title';\nconst VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT = 'guide.step_plugin.visual-graph-properties-focus-property.content';\nconst VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_TITLE = 'guide.step_plugin.visual-graph-properties-side-panel-close.title';\nconst VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_CONTENT = 'guide.step_plugin.visual-graph-properties-side-panel-close.content';\n\n/**\n * @name visual-graph-properties\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-properties` guide demonstrates how to open and read node properties in the Visual Graph.\n *\n * The guide consists of the following steps:\n * 1. Click a node to open the properties side panel.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-click-to-show-properties.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 2. Read the properties in the side panel.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-side-panel-properties.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 3. Focus specific property sections (e.g. types or a particular property).<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-properties-in-panel.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n * 4. Close the side panel.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-x-to-close.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This guide can be configured using the common options defined in [Options](#.Options).\n *\n * Common / additional options used by the contained steps:\n * @property {string} [options.iri] - The IRI used to target nodes in the visual graph.\n * @property {string} [options.iriLabel] - The label of the IRI shown in the dialogs.\n * @property {Array} [options.focusProperties] - Array describing focus properties displayed in properties steps.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-properties\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource\",\n * \"iriLabel\": \"Example resource\",\n * \"focusProperties\": [\"ontl:roleStartDate\"]\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-properties',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const $rootScope = services.$rootScope;\n const translate = services.translate;\n const elementSelector = `.node-wrapper[id^=\"${options.iri}\"] circle`;\n\n let mouseClickTimeStamp;\n let mouseEventTimer;\n\n // Expands Node info sidebar panel when a node is clicked.\n const onClick = (services, guide) => (event) => {\n if (mouseEventTimer) {\n // Cancels expansion of the sidebar panel if user double-clicked.\n if (event.timeStamp - mouseClickTimeStamp < 400) {\n clearTimeout(mouseEventTimer);\n mouseEventTimer = null;\n }\n } else {\n mouseClickTimeStamp = event.timeStamp;\n mouseEventTimer = setTimeout(function() {\n GuideUtils.graphVizShowNodeInfo(elementSelector);\n mouseEventTimer = null;\n guide.next();\n }, 500);\n }\n };\n\n const steps = [\n {\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_CONTENT, {iriLabel: options.iriLabel}),\n url: 'graphs-visualizations',\n class: 'visual-graph-show-properties-intro',\n elementSelector,\n canBePaused: false,\n // Disable default behavior of service when element is clicked.\n advanceOn: undefined,\n show: (guide) => () => {\n // Add \"click\" listener to the element. Processing of click event is disabled for the visual graph when guide is started.\n // So we have to open side panel info manually when a selected node is clicked.\n const element = document.querySelector(elementSelector);\n if (element) {\n element._onNodeClicked = onClick(services, guide);\n element.addEventListener('click', element._onNodeClicked);\n }\n },\n hide: () => () => {\n // Remove the \"click\" listener of element. It is important when step is hided.\n const element = document.querySelector(elementSelector);\n if (element && element._onNodeClicked) {\n element.removeEventListener('click', element._onNodeClicked);\n delete element._onNodeClicked;\n }\n },\n onNextClick: (guide, step) => {\n GuideUtils.graphVizShowNodeInfo(step.elementSelector);\n guide.next();\n },\n beforeShowPromise: GuideUtils.awaitAlphaDropD3(elementSelector, $rootScope),\n ...options\n }\n },\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CONTENT, {iriLabel: options.iriLabel}),\n url: 'graphs-visualizations',\n elementSelector: '.rdf-side-panel-content',\n class: 'visual-graph-side-panel-content',\n canBePaused: false,\n placement: 'left',\n beforeShowPromise: GuideUtils.deferredShow(500),\n onPreviousClick: () => new Promise(function(resolve) {\n GuideUtils.waitFor(closeButtonSelector, 3)\n .then(() => {\n document.querySelector(closeButtonSelector).click();\n resolve();\n }).catch(() => resolve());\n }),\n ...options\n }\n }\n ];\n\n if (Array.isArray(options.focusProperties)) {\n options.focusProperties.forEach((focusProperty) => {\n if (!GuideUtils.isObject(focusProperty)) {\n focusProperty = {\n property: focusProperty\n };\n }\n const translationIdSuffix = focusProperty.property === 'types' ? '-types' : '-property';\n const titleKey = 'guide.step_plugin.visual-graph-properties-focus' + translationIdSuffix + '.title';\n const contentKey = focusProperty.skipGenericMessage && focusProperty.message ?\n null : 'guide.step_plugin.visual-graph-properties-focus' + translationIdSuffix + '.content';\n\n const params = (focusProperty.property === 'types') ?\n {iriLabel: options.iriLabel} :\n {focusProperty: focusProperty.property};\n\n steps.push({\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, titleKey),\n content: contentKey ? translate(this.translationBundle, contentKey, params) : null,\n url: 'graphs-visualizations',\n class: 'visual-graph-properties-focus',\n canBePaused: false,\n placement: 'left',\n elementSelector: GuideUtils.getGuideElementSelector('graph-visualization-node-info-' + focusProperty.property),\n focusProperty: focusProperty.property,\n extraContent: focusProperty.message,\n ...options\n }\n });\n });\n }\n\n const closeButtonSelector = GuideUtils.getGuideElementSelector('close-info-panel');\n steps.push({\n guideBlockName: 'clickable-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_CONTENT),\n url: 'graphs-visualizations',\n canBePaused: false,\n placement: 'left',\n class: 'visual-graph-properties-side-panel-close',\n elementSelector: closeButtonSelector,\n advanceOn: {\n selector: closeButtonSelector,\n event: 'click'\n },\n beforeShowPromise: () => {\n // We have to be sure that node info sidebar is open. It is needed when this step is loaded when next step \"Previous\"\n // button is clicked.\n GuideUtils.graphVizShowNodeInfo(elementSelector);\n return GuideUtils.deferredShow(500)();\n },\n onNextClick: () => GuideUtils.waitFor(closeButtonSelector, 3).then(() => document.querySelector(closeButtonSelector).click()),\n ...options\n }\n });\n\n return steps;\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_PROPERTIES_TITLE]: 'Visual graph properties',\n [VISUAL_GRAPH_PROPERTIES_CONTENT]: 'Click on <b>{{iriLabel}}</b> to show its properties.',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_TITLE]: 'Visual graph properties',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CONTENT]: 'The side panel shows the properties of the clicked node, <b>{{iriLabel}}</b>.',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE_TYPES]: 'Visual graph properties',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT_TYPES]: '<b>Types</b> shows all the RDF types for <b>{{iriLabel}}</b>.',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE]: 'Visual graph properties',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT]: 'The values for generic properties like <b>{{focusProperty}}</b> are listed in dedicated sections.',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_TITLE]: 'Visual graph properties',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_CONTENT]: 'You can close the panel by clicking on the X icon.'\n },\n fr: {\n [VISUAL_GRAPH_PROPERTIES_TITLE]: 'Propriétés du graphe visuel',\n [VISUAL_GRAPH_PROPERTIES_CONTENT]: 'Cliquez sur <b>{{iriLabel}}</b> pour afficher ses propriétés.',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_TITLE]: 'Propriétés du graphique visuel',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CONTENT]: 'Le panneau latéral affiche les propriétés du nœud cliqué, <b>{{iriLabel}}</b>.',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE_TYPES]: 'Propriétés du graphique visuel',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT_TYPES]: '<b>Les types</b> affiche tous les types RDF pour <b>{{iriLabel}}</b>.',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE]: 'Propriétés du graphique visuel',\n [VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT]: 'Les valeurs des propriétés génériques telles que <b>{{focusProperty}}</b> sont répertoriées dans des sections dédiées.',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_TITLE]: 'Propriétés du graphique visuel',\n [VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_CONTENT]: 'Vous pouvez fermer le panneau en cliquant sur l\\'icône X.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_SET_MAXIMUM_LINKS_CONTENT = 'guide.step-action.visual-graph-set-maximum-links-content';\n\n/**\n * @name visual-graph-set-maximum-links\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-set-maximum-links` guide step prompts the user to enter the maximum number of links to show\n * in the visual graph settings.\n *\n * Set maximum links<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-set-maximum-links.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {number} [options.linkLimit] - The maximum number of links to show.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-set-maximum-links\",\n * \"options\": {\n * \"linkLimit\": 20\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-set-maximum-links',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-settings-links-limit');\n const linkLimit = options.linkLimit || '';\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_SET_MAXIMUM_LINKS_CONTENT, {linkLimit}),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n ...options,\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(elementSelector, linkLimit))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_SET_MAXIMUM_LINKS_CONTENT]: 'Enter <b>{{linkLimit}}</b> as the maximum number of links to show.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_SET_MAXIMUM_LINKS_CONTENT]: 'Entrez <b>{{linkLimit}}</b> comme nombre maximal de liens à afficher.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst SET_CONTEXT_WINDOW_SIZE = 'guide.step_plugin.set-context-window-size.info';\n\n/**\n * @name set-context-window-size\n * @memberof module:Interactive Guide\n *\n * @description\n * This step sets the context window size for the TTYG agent.\n * It guides the user to set the context size input to a specified value.\n *\n * Set context window size<br>\n * <img src=\"resources/guides/ttyg/set-context-window-size.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n *\n * @property {number} options.contextSize - The target value for the context window size.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"set-context-window-size\",\n * \"options\": {\n * \"contextSize\": 4096\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'set-context-window-size',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n const inputSelector = GuideUtils.getGuideElementSelector('context-size-input');\n\n return {\n guideBlockName: 'focus-element',\n options: {\n url: 'ttyg',\n elementSelector: inputSelector,\n placement: 'bottom',\n class: 'set-context-window-size',\n content: translate(this.translationBundle, SET_CONTEXT_WINDOW_SIZE, {contextSize: options.contextSize}),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(inputSelector, options.contextSize)),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n ...options\n }\n };\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [SET_CONTEXT_WINDOW_SIZE]: 'Set Context Size to <b>{{contextSize}}</b> so the model can use the ontology and conversation history to answer correctly'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [SET_CONTEXT_WINDOW_SIZE]: 'Définissez la taille du contexte sur <b>{{contextSize}}</b> afin que le modèle puisse utiliser l\\'ontologie et l\\'historique de conversation pour répondre correctement'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst DATATYPE_INTRO = 'guide.step_plugin.connectors-lucene-fields-datatype-intro.content';\n\n/**\n * @name connectors-lucene-fields-datatype-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Datatype\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Datatype\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector datatype introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-datatype-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-datatype-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-datatype-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, DATATYPE_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-datatype-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'datatype'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [DATATYPE_INTRO]: 'The <b>Datatype</b> defines how literal values are mapped to Lucene types. By default, this is inferred from the datatype, but it can be overridden per field using the datatype parameter with any supported xsd: type.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [DATATYPE_INTRO]: 'Le <b>datatype</b> définit comment les valeurs littérales sont mappées aux types Lucene. Par défaut, cela est déduit du datatype, mais cela peut être remplacé par champ en utilisant le paramètre datatype avec tout type xsd: pris en charge.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","var map = {\n\t\"./guides/autocomplete/autocomplete-enable-checkbox.js\": 124,\n\t\"./guides/autocomplete/autocomplete-focus-on-indexing-status.js\": 3721,\n\t\"./guides/autocomplete/enable-autocomplete.js\": 1750,\n\t\"./guides/class-hierarchy/class-hierarchy-close-rdf-instances-side-panel.js\": 1222,\n\t\"./guides/class-hierarchy/class-hierarchy-dataset-intro.js\": 9094,\n\t\"./guides/class-hierarchy/class-hierarchy-explain-class.js\": 7895,\n\t\"./guides/class-hierarchy/class-hierarchy-explain-rdf-instance.js\": 3267,\n\t\"./guides/class-hierarchy/class-hierarchy-instances.js\": 3601,\n\t\"./guides/class-hierarchy/class-hierarchy-intro.js\": 8311,\n\t\"./guides/class-hierarchy/class-hierarchy-open-rdf-instances-side-panel.js\": 8810,\n\t\"./guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-intro.js\": 7490,\n\t\"./guides/class-hierarchy/class-hierarchy-rdf-instances-side-panel-open-all-instances-in-sparql.js\": 5919,\n\t\"./guides/class-hierarchy/class-hierarchy-toggle-prefixes.js\": 4730,\n\t\"./guides/class-hierarchy/class-hierarchy-zoom-class.js\": 4111,\n\t\"./guides/class-hierarchy/class-hierarchy.js\": 5604,\n\t\"./guides/class-relationships/class-relationships-class-list-background-intro.js\": 6360,\n\t\"./guides/class-relationships/class-relationships-class-list-intro.js\": 601,\n\t\"./guides/class-relationships/class-relationships-class-list-selection.js\": 3533,\n\t\"./guides/class-relationships/class-relationships-diagram-intro.js\": 2427,\n\t\"./guides/class-relationships/class-relationships-digram-predicates-intro.js\": 4927,\n\t\"./guides/class-relationships/class-relationships-digram-thickness-intro.js\": 2101,\n\t\"./guides/class-relationships/class-relationships-intro.js\": 1539,\n\t\"./guides/class-relationships/class-relationships-named-graph-selection.js\": 9282,\n\t\"./guides/class-relationships/class-relationships.js\": 5040,\n\t\"./guides/config.js\": 4097,\n\t\"./guides/connectors/connectors-array-subparameter-intro.js\": 6665,\n\t\"./guides/connectors/connectors-close-view-sparql-query-dialog.js\": 7655,\n\t\"./guides/connectors/connectors-connector-intro.js\": 1151,\n\t\"./guides/connectors/connectors-expand-connector.js\": 6929,\n\t\"./guides/connectors/connectors-intro.js\": 7377,\n\t\"./guides/connectors/connectors-open-view-sparql-query-dialog.js\": 3403,\n\t\"./guides/connectors/connectors-parameter-fields-remaining-fields-intro.js\": 1704,\n\t\"./guides/connectors/connectors-parameter-intro.js\": 267,\n\t\"./guides/connectors/connectors-type-intro.js\": 2476,\n\t\"./guides/connectors/connectors-view-sparql-dialog-intro.js\": 3148,\n\t\"./guides/connectors/lucene/connectors-expand-lucene.js\": 5651,\n\t\"./guides/connectors/lucene/connectors-lucene-analyzer-intro.js\": 8646,\n\t\"./guides/connectors/lucene/connectors-lucene-boost-properties-intro.js\": 643,\n\t\"./guides/connectors/lucene/connectors-lucene-detect-fields-intro.js\": 5183,\n\t\"./guides/connectors/lucene/connectors-lucene-document-filter-intro.js\": 3162,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-analyzed-intro.js\": 8332,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-datatype-intro.js\": 7756,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-default-value-intro.js\": 4901,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-facet-intro.js\": 3555,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-field-name-intro.js\": 4100,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-field-name-transform-intro.js\": 8421,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-ignore-invalid-values-intro.js\": 5825,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-indexed-intro.js\": 9273,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-intro.js\": 217,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-multivalued-intro.js\": 8302,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-property-chain-intro.js\": 2801,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-remaining-fields-intro.js\": 5502,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-stored-intro.js\": 1763,\n\t\"./guides/connectors/lucene/connectors-lucene-fields-value-filter-intro.js\": 562,\n\t\"./guides/connectors/lucene/connectors-lucene-import-file-intro.js\": 402,\n\t\"./guides/connectors/lucene/connectors-lucene-import-graph-intro.js\": 5240,\n\t\"./guides/connectors/lucene/connectors-lucene-languages-intro.js\": 9191,\n\t\"./guides/connectors/lucene/connectors-lucene-open-view-sparql-query-dialog.js\": 9459,\n\t\"./guides/connectors/lucene/connectors-lucene-readonly-intro.js\": 330,\n\t\"./guides/connectors/lucene/connectors-lucene-skip-initial-indexing-intro.js\": 1289,\n\t\"./guides/connectors/lucene/connectors-lucene-strip-markup-intro.js\": 6013,\n\t\"./guides/connectors/lucene/connectors-lucene-type-intro.js\": 1028,\n\t\"./guides/connectors/lucene/connectors-lucene-types-intro.js\": 581,\n\t\"./guides/connectors/lucene/connectors-lucene-value-filter-intro.js\": 914,\n\t\"./guides/connectors/lucene/connectors-lucene-view-sparql-dialog-intro.js\": 2148,\n\t\"./guides/connectors/lucene/connectors-lucene.js\": 7298,\n\t\"./guides/core-steps/clickable-element.js\": 5996,\n\t\"./guides/core-steps/copy-text-element.js\": 195,\n\t\"./guides/core-steps/focus-element.js\": 8716,\n\t\"./guides/core-steps/guide-end.js\": 377,\n\t\"./guides/core-steps/hold-and-wait-until-hidden.js\": 5434,\n\t\"./guides/core-steps/hold-and-wait-until-shown.js\": 9465,\n\t\"./guides/core-steps/info-message.js\": 4127,\n\t\"./guides/core-steps/input-element.js\": 364,\n\t\"./guides/core-steps/read-only-element.js\": 1381,\n\t\"./guides/core-steps/scroll-only-element.js\": 8930,\n\t\"./guides/core-steps/show-documentation-link.js\": 8876,\n\t\"./guides/core-steps/toggle-element.js\": 6504,\n\t\"./guides/core-steps/wait-for-element-to-hide.js\": 1242,\n\t\"./guides/core-steps/wait-for-element-to-show.js\": 6959,\n\t\"./guides/download-guide-resource/download-guide-resource.js\": 2832,\n\t\"./guides/import/import-click-on-import-button.js\": 6198,\n\t\"./guides/import/import-confirm-duplicate-files.js\": 3315,\n\t\"./guides/import/import-rdf-file.js\": 4084,\n\t\"./guides/import/import-show-progress.js\": 8314,\n\t\"./guides/import/import-upload-rdf-file.js\": 3624,\n\t\"./guides/index.js\": 5355,\n\t\"./guides/main-menu/click-main-menu.js\": 3337,\n\t\"./guides/options.js\": 393,\n\t\"./guides/rdf-rank/rdf-rank-compute-fill.js\": 9260,\n\t\"./guides/repositories/repositories-select-repository.js\": 1212,\n\t\"./guides/repositories/select-repository-dropdown.js\": 133,\n\t\"./guides/repository/create-repository.js\": 3815,\n\t\"./guides/repository/repositories-create-graphdb.js\": 5276,\n\t\"./guides/repository/repositories-create-repository.js\": 6084,\n\t\"./guides/repository/repositories-enable-fts.js\": 8518,\n\t\"./guides/repository/repositories-id-input.js\": 659,\n\t\"./guides/repository/repositories-ruleset-dropdown.js\": 6123,\n\t\"./guides/repository/repositories-save.js\": 4030,\n\t\"./guides/resource/resource-click-on-role.js\": 4870,\n\t\"./guides/resource/resource-click-on-visual-graph-button.js\": 440,\n\t\"./guides/resource/resource-results-click-on-iri.js\": 7003,\n\t\"./guides/resource/resource-results-explain.js\": 5379,\n\t\"./guides/resource/resource-results-row-explain.js\": 9410,\n\t\"./guides/resource/resource-search-autocomplete-item.js\": 1514,\n\t\"./guides/resource/resource-search-rdf.js\": 3622,\n\t\"./guides/resource/table-graph-explore.js\": 2595,\n\t\"./guides/similarity-index/create-similarity-index.js\": 3323,\n\t\"./guides/similarity-index/similarity-click-link.js\": 211,\n\t\"./guides/similarity-index/similarity-click-to-create.js\": 1707,\n\t\"./guides/similarity-index/similarity-hold-and-wait-until-shown.js\": 2770,\n\t\"./guides/similarity-index/similarity-type-index-name.js\": 3465,\n\t\"./guides/similarity-index/similarity-view-created-index.js\": 9977,\n\t\"./guides/sparql-editor/execute-sparql-query.js\": 6423,\n\t\"./guides/sparql-editor/sparql-editor-expand-results-over-owl.js\": 1366,\n\t\"./guides/sparql-editor/sparql-editor-include-inferred-data.js\": 5478,\n\t\"./guides/sparql-editor/sparql-editor-run-button.js\": 1145,\n\t\"./guides/sparql-editor/sparql-editor.js\": 9092,\n\t\"./guides/sparql-editor/sparql-explain-editor.js\": 9658,\n\t\"./guides/sparql-editor/sparql-results-click-on-iri.js\": 7805,\n\t\"./guides/sparql-editor/sparql-results-explain.js\": 4381,\n\t\"./guides/sparql-editor/sparql-results-visual-button.js\": 9025,\n\t\"./guides/sparql-editor/visualise-sparql-query.js\": 8787,\n\t\"./guides/ttyg/ask-ttyg-agent.js\": 522,\n\t\"./guides/ttyg/configure-agent-additional-instructions.js\": 632,\n\t\"./guides/ttyg/configure-agent-type-agent-name.js\": 2869,\n\t\"./guides/ttyg/configure-agent-type-model-name.js\": 8001,\n\t\"./guides/ttyg/configure-agent.js\": 9136,\n\t\"./guides/ttyg/configure-autocomplete-iri-discovery.js\": 6853,\n\t\"./guides/ttyg/configure-iri-discovery-search.js\": 2421,\n\t\"./guides/ttyg/configure-temperature.js\": 7587,\n\t\"./guides/ttyg/configure-top-p.js\": 5955,\n\t\"./guides/ttyg/conversation-with-ttyg-agent.js\": 3587,\n\t\"./guides/ttyg/create-ttyg-agent.js\": 8395,\n\t\"./guides/ttyg/edit-ttyg-agent.js\": 5015,\n\t\"./guides/ttyg/end-on-api-key-error.js\": 9675,\n\t\"./guides/ttyg/fts-search-method.js\": 2728,\n\t\"./guides/ttyg/select-ttyg-agent.js\": 1627,\n\t\"./guides/ttyg/set-context-window-size.js\": 7737,\n\t\"./guides/ttyg/set-max-iris-per-call.js\": 7366,\n\t\"./guides/ttyg/set-max-triples-per-call.js\": 6782,\n\t\"./guides/ttyg/similarity-search-method.js\": 566,\n\t\"./guides/ttyg/sparql-search-method-enable-ontology-graph.js\": 3095,\n\t\"./guides/ttyg/sparql-search-method-enable-sparql-query.js\": 3623,\n\t\"./guides/ttyg/sparql-search-method-type-graph-name.js\": 4282,\n\t\"./guides/ttyg/sparql-search-method.js\": 1316,\n\t\"./guides/ttyg/ttyg-ask-agent-explore-sparql.js\": 6335,\n\t\"./guides/ttyg/ttyg-ask-explain-answer-more.js\": 8417,\n\t\"./guides/ttyg/ttyg-ask-question.js\": 9303,\n\t\"./guides/ttyg/ttyg-click-to-create-new-chat.js\": 2884,\n\t\"./guides/ttyg/ttyg-click-to-edit-selected-agent.js\": 58,\n\t\"./guides/ttyg/ttyg-conversation-info-message.js\": 4311,\n\t\"./guides/ttyg/ttyg-create-agent-click.js\": 4762,\n\t\"./guides/ttyg/ttyg-create-agent-intro-message.js\": 4746,\n\t\"./guides/ttyg/ttyg-create-agent-save.js\": 1053,\n\t\"./guides/ttyg/ttyg-edit-agent-click-to-save.js\": 3710,\n\t\"./guides/ttyg/ttyg-edit-agent-intro-message.js\": 3546,\n\t\"./guides/ttyg/ttyg-enabling-sparql-info-message.js\": 9540,\n\t\"./guides/ttyg/ttyg-explain-response.js\": 9674,\n\t\"./guides/ttyg/ttyg-fts-method-disable.js\": 1137,\n\t\"./guides/ttyg/ttyg-fts-method-enable.js\": 3390,\n\t\"./guides/ttyg/ttyg-fts-method-info.js\": 1857,\n\t\"./guides/ttyg/ttyg-select-agent-check-for-missing-repository-cancel.js\": 1789,\n\t\"./guides/ttyg/ttyg-select-agent-dropdown-open.js\": 4114,\n\t\"./guides/ttyg/ttyg-select-agent-from-dropdown.js\": 1724,\n\t\"./guides/ttyg/ttyg-select-agent-info-message.js\": 5998,\n\t\"./guides/ttyg/ttyg-similarity-info-message.js\": 3671,\n\t\"./guides/ttyg/ttyg-similarity-select-index.js\": 7500,\n\t\"./guides/ttyg/ttyg-similarity-toggle-off.js\": 5625,\n\t\"./guides/ttyg/ttyg-similarity-toggle-on.js\": 9211,\n\t\"./guides/ttyg/ttyg-sparql-click-add-namespaces.js\": 462,\n\t\"./guides/ttyg/ttyg-sparql-copy-query-text.js\": 2303,\n\t\"./guides/ttyg/ttyg-sparql-method-disable.js\": 411,\n\t\"./guides/ttyg/ttyg-sparql-method-enable.js\": 2804,\n\t\"./guides/ttyg/ttyg-sparql-method-ontology-select.js\": 91,\n\t\"./guides/ttyg/ttyg-sparql-method-sparql-query-select.js\": 5492,\n\t\"./guides/utils.js\": 8678,\n\t\"./guides/visual-graph/visual-graph-config-click-tab.js\": 404,\n\t\"./guides/visual-graph/visual-graph-config-create-click.js\": 8549,\n\t\"./guides/visual-graph/visual-graph-config-create.js\": 720,\n\t\"./guides/visual-graph/visual-graph-config-description.js\": 7572,\n\t\"./guides/visual-graph/visual-graph-config-hint.js\": 3941,\n\t\"./guides/visual-graph/visual-graph-config-name.js\": 8159,\n\t\"./guides/visual-graph/visual-graph-config-sample-query.js\": 5847,\n\t\"./guides/visual-graph/visual-graph-config-save.js\": 201,\n\t\"./guides/visual-graph/visual-graph-config-select.js\": 9336,\n\t\"./guides/visual-graph/visual-graph-config-share.js\": 6397,\n\t\"./guides/visual-graph/visual-graph-config-starting-point-intro.js\": 6336,\n\t\"./guides/visual-graph/visual-graph-config-starting-point.js\": 9015,\n\t\"./guides/visual-graph/visual-graph-expand.js\": 3801,\n\t\"./guides/visual-graph/visual-graph-intro.js\": 9987,\n\t\"./guides/visual-graph/visual-graph-link-focus.js\": 8088,\n\t\"./guides/visual-graph/visual-graph-node-focus.js\": 804,\n\t\"./guides/visual-graph/visual-graph-properties.js\": 7676,\n\t\"./guides/visual-graph/visual-graph-search-rdf-resources-input-autocomplete-item.js\": 7020,\n\t\"./guides/visual-graph/visual-graph-search-rdf-resources-input.js\": 861,\n\t\"./guides/visual-graph/visual-graph-set-maximum-links.js\": 7686,\n\t\"./guides/visual-graph/visual-graph-settings-click.js\": 6753,\n\t\"./guides/visual-graph/visual-graph-settings-save.js\": 5944,\n\t\"./guides/visual-graph/visual-graph-zoom.js\": 9754,\n\t\"./guides/visual-graph/visual-graph.js\": 5360,\n\t\"./guides/welcome/welcome.js\": 3788,\n\t\"./plugin-service-interface.js\": 7190\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 7785;","const SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst CLICK_ON_IRI = 'guide.step_plugin.sparql-results-click-on-iri.content';\n\n/**\n * @name sparql-results-click-on-iri\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to click on an IRI in the SPARQL results table to explore it.\n *\n * Clicking on the IRI<br>\n * <img src=\"resources/guides/sparql-editor/sparql-results-click-on-iri.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} iri - The IRI to click on.\n * @property {string} iriLabel - The label to display for the IRI.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-results-click-on-iri\",\n * \"options\": {\n * \"iri\": \"http://example.org/resource/Item1\"\n * \"iriLabel\": \"Item1\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-results-click-on-iri',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, CLICK_ON_IRI, {iriLabel: options.iriLabel}),\n placement: 'top',\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n ...options,\n scrollToHandler: services.GuideUtils.scrollToTop,\n elementSelector: services.GuideUtils.getSparqlResultsSelectorForIri(options.iri),\n class: 'table-graph-instance',\n url: 'sparql',\n onNextClick: (guide, step) => {\n services.GuideUtils.waitFor(step.elementSelector, 3)\n .then(() => document.querySelector(step.elementSelector).click());\n }\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [CLICK_ON_IRI]: 'Click on the <b>{{iriLabel}}</b> IRI to explore it.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [CLICK_ON_IRI]: 'Cliquez sur l’IRI <b>{{iriLabel}}</b> pour l’explorer.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\n/**\n * @name class-hierarchy-explain-class\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on explaining a specific class within the class hierarchy visualization.\n * It highlights the selected class and provides detailed information about it\n *\n * * <img src=\"resources/guides/class-hierarchy/class-hierarchy-explain-class.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-explain-class\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-explain-class',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n const selector = GuideUtils.getGuideElementSelector('class-' + options.iri);\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title,\n url: 'hierarchy',\n placement: 'left',\n elementSelector: selector,\n class: 'class-hierarchy-explain-class',\n show: () => Utils.disableAllRDFClasses,\n hide: () => Utils.enableAllRDFClasses,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy'\n },\n\n fr: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_DEFAULT_TITLE = 'menu.ttyg.label';\nconst CONFIGURE_AGENT_MODEL = 'guide.step_plugin.configure-agent.model-input';\n\n/**\n * @name configure-agent-type-model-name\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to input the name of the OpenAI model to be used for the agent in the TTYG interface.\n * It highlights the input field and provides instructions on how to proceed.\n *\n * Type the name of the OpenAI model to be used<br>\n * <img src=\"resources/guides/ttyg/configure-agent-type-model-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally it supports:\n *\n * @property {string} options.model - The name of the OpenAI model to be used (e.g., \"gpt-4o-mini\" ).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-agent-type-model-name\",\n * \"options\": {\n * \"model\": \"gpt-4o-mini\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-agent-type-model-name',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, CONFIGURE_AGENT_MODEL, {model: options.model}),\n title: translate(this.translationBundle, TTYG_DEFAULT_TITLE),\n class: 'input-model',\n disablePreviousFlow: false,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('model'),\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInput(GuideUtils.getGuideElementSelector('model'), options.model, false))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_DEFAULT_TITLE]: 'Talk to Your Graph',\n [CONFIGURE_AGENT_MODEL]: 'Here you can type the name of the OpenAI model to be used.<br>Type: \"<b>{{model}}</b>\" to configure the agent to use this model'\n },\n fr: {\n [TTYG_DEFAULT_TITLE]: 'Parlez à votre graphe',\n [CONFIGURE_AGENT_MODEL]: 'Vous pouvez saisir ici le nom du modèle OpenAI à utiliser.<br>Type: \"<b>{{model}}</b>\" pour configurer l\\'agent afin qu\\'il utilise ce modèle.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {disableAllVisualGraphNodes, enableAllVisualGraphNodes} from '../utils.js';\n\nconst VISUAL_GRAPH_LINK_FOCUS_TITLE = 'guide.step_plugin.visual-graph-link-focus.title';\nconst VISUAL_GRAPH_LINK_FOCUS_CONTENT = 'guide.step_plugin.visual-graph-link-focus.content';\n\n/**\n * @name visual-graph-link-focus\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-link-focus` guide step explains the link between two nodes in the Visual Graph.<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-link-focus.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific options are available:\n *\n * @property {string} [options.fromIri] - The source IRI.\n * @property {string} [options.toIri] - The target IRI.\n * @property {string} [options.iriLabel] - Label for predicate.\n * @property {string} [options.fromIriLabel] - Label for source node.\n * @property {string} [options.toIriLabel] - Label for target node.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-link-focus\",\n * \"options\": {\n * \"fromIri\": \"http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine#Wine\",\n * \"fromIriLabel\": \"Wine\",\n * \"toIri\": \"http://www.w3.org/TR/2003/PR-owl-guide-20031209/food#PotableLiquid\",\n * \"toIriLabel\": \"Potable Liquid\",\n * \"iriLabel\": \"type\"\n * }\n * }\n *\n */\nconst step = {\n guideBlockName: 'visual-graph-link-focus',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const $rootScope = services.$rootScope;\n const translate = services.translate;\n const elementSelector = `.link-wrapper[id^=\"${options.fromIri}>${options.toIri}\"]`;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_LINK_FOCUS_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_LINK_FOCUS_CONTENT, {\n fromIriLabel: options.fromIriLabel,\n iriLabel: options.iriLabel,\n toIriLabel: options.toIriLabel\n }),\n url: 'graphs-visualizations',\n canBePaused: false,\n class: 'visual-graph-link-focus',\n elementSelector,\n show: disableAllVisualGraphNodes,\n hide: enableAllVisualGraphNodes,\n beforeShowPromise: GuideUtils.awaitAlphaDropD3(elementSelector, $rootScope),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_LINK_FOCUS_TITLE]: 'Visual graph links',\n [VISUAL_GRAPH_LINK_FOCUS_CONTENT]: 'An arrow with a label represents one or more links between nodes. In this case, the arrow shows the relation <b>{{fromIriLabel}} &rarr; {{iriLabel}} &rarr; {{toIriLabel}}</b>.'\n },\n fr: {\n [VISUAL_GRAPH_LINK_FOCUS_TITLE]: 'Liens de graphique visuel',\n [VISUAL_GRAPH_LINK_FOCUS_CONTENT]: 'Une flèche avec une étiquette représente un ou plusieurs liens entre les nœuds. Dans ce cas, la flèche montre la relation <b>{{fromIriLabel}} &rarr; {{iriLabel}} &rarr; {{toIriLabel}}</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_PROPERTIES_NAME = 'guide.step-action.visual-graph-config-name';\n\n/**\n * @name visual-graph-config-name\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-config-name` guide step prompts the user to enter a name for their visual graph configuration.\n *\n * Configure graph name<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"visual-graph-config-name\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-name',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-config-name');\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_PROPERTIES_NAME),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n scrollToHandler: GuideUtils.scrollToTop,\n ...options,\n elementSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.validateTextInputNotEmpty(elementSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_NAME]: 'Enter a name for your visual graph configuration.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_PROPERTIES_NAME]: 'Saisissez un nom pour votre configuration de graphique visuel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst MULTIVALUED_INTRO = 'guide.step_plugin.connectors-lucene-fields-multivalued-intro.content';\n\n/**\n * @name connectors-lucene-fields-multivalued-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Multivalued\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Multivalued\" option in determining whether multiple values for RDF properties are synchronized to Lucene.\n *\n * Lucene connector multivalued introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-multivalued-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-multivalued-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-multivalued-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, MULTIVALUED_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-multivalued-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'multivalued'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [MULTIVALUED_INTRO]: 'The <b>Multivalued</b> option specifies whether multiple values for RDF properties are synchronized to Lucene. True by default; if false, only a single value is synchronized.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [MULTIVALUED_INTRO]: 'L’option <b>Multi-valeur</b> spécifie si plusieurs valeurs pour les propriétés RDF sont synchronisées avec Lucene. True par défaut ; si false, une seule valeur est synchronisée.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const INTRO_CONTENT = 'guide.step_plugin.class-hierarchy-intro.content';\nconst CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\n\n/**\n * @name class-hierarchy-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The Class Hierarchy Intro step provides an introduction to the class hierarchy visualization,\n * explaining how to interpret the circles representing classes and their subclasses.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-intro',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title,\n content: pluginService.translate(this.translationBundle, INTRO_CONTENT),\n url: 'hierarchy',\n elementSelector: '#classChart',\n placement: 'left',\n class: 'clas-hierarchy-intro',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [INTRO_CONTENT]: 'The biggest circle shows all top-level classes. Every class may have subclasses shown as smaller circles within their parent class. The size of each circle indicates the proportion of RDF resources that belong to that class. Thus, bigger circles are classes that have more instances.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy'\n },\n\n fr: {\n [INTRO_CONTENT]: 'Le plus grand cercle montre toutes les classes de niveau supérieur. Chaque classe peut avoir des sous-classes représentées par des cercles plus petits dans leur classe parente. La taille de chaque cercle indique la proportion de ressources RDF qui lui appartiennent. Ainsi, les grands cercles sont des classes qui ont plus d\\'instances.',\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step-action.import-file';\nconst CONTENT = 'guide.step_plugin.import_status_info.content';\n\n/**\n * @name import-show-progress\n * @memberof module:Interactive Guide\n *\n * @description\n *\n * The `import-show-progress` step guides the user to monitor the progress of an import operation in the import dialog of GraphDB.<br>\n * <img src=\"resources/guides/import/import-show-progress.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports the following options:\n * @property {string} resourceFile - The name of the resource file that should be downloaded in the step.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"import-show-progress\",\n * \"options\": {\n * \"resourceFile\": \"example.rdf\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'import-show-progress',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n content: translate(step.translationBundle, CONTENT),\n title: translate(step.translationBundle, DEFAULT_TITLE),\n class: 'import-status-info',\n ...options,\n url: 'import',\n elementSelector: '.import-resource-message',\n beforeShowPromise: () => {\n if (GuideUtils.isVisible('.import-resource-message')) {\n return Promise.resolve();\n }\n return GuideUtils.waitFor('.import-resource-message', 10);\n },\n onPreviousClick: () => GuideUtils.getOrWaitFor(GuideUtils.getGuideElementSelector('import-file-' + options.resourceFile), 10)\n .then((element) => {\n element.click();\n })\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Import file',\n [CONTENT]: 'Wait until import finished.'\n },\n fr: {\n [DEFAULT_TITLE]: 'Importer un fichier',\n [CONTENT]: 'Attendez la fin de l\\'importation.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst ANALYZED_INTRO_CONTENT = 'guide.step_plugin.connectors-lucene-fields-analyzed-intro.content';\n\n/**\n * @name connectors-lucene-fields-analyzed-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Analyzed\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Analyzed\" option in determining whether literal fields are processed by the analyzer when indexed.\n *\n * Lucene connector analyzed introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-analyzed-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-analyzed-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-analyzed-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, ANALYZED_INTRO_CONTENT),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-analyzed-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'analyzed'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [ANALYZED_INTRO_CONTENT]: 'The <b>Analyzed</b> option determines whether literal fields are processed by the analyzer when indexed. IRIs are never analyzed. By default, fields are analyzed (true).'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [ANALYZED_INTRO_CONTENT]: 'L’option <b>Analysé</b> détermine si les champs littéraux sont traités par l’analyseur lors de l’indexation. Les IRI ne sont jamais analysés. Par défaut, les champs sont analysés (true).'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_CREATE_TITLE = 'menu.ttyg.label';\n\n/**\n * @name create-ttyg-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user through the process of creating a new TTYG agent.\n * It includes steps to navigate to the TTYG section, open the agent creation modal,\n * fill in the necessary details, and save the new agent.\n *\n * Click the Lab main menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-lab.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on TTYG in the sub-menu<br>\n * <img src=\"resources/guides/main-menu/main-menu-ttyg.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * End guide if API key error is present<br>\n * <img src=\"resources/guides/ttyg/end-on-api-key-error.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Create agent intro message<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-intro-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on \"Create new agent\" button<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Click on \"Save\" button to create the agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-create-agent-save.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * The `configure-agent` step is configurable complex step. See [configure-agent](#.configure-agent) for more details.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"create-ttyg-agent\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'create-ttyg-agent',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n options.mainAction = 'create-ttyg-agent';\n options.title = options.title ?? translate(this.translationBundle, TTYG_CREATE_TITLE);\n\n return [\n {\n guideBlockName: 'click-main-menu',\n options: {\n showIntro: true,\n ...options,\n menu: 'ttyg'\n }\n },\n {\n guideBlockName: 'end-on-api-key-error'\n },\n {\n guideBlockName: 'ttyg-create-agent-intro-message',\n options: {...options}\n },\n {\n guideBlockName: 'wait-for-element-to-hide',\n options: {\n ...options,\n elementSelectorToHide: GuideUtils.getElementSelector('.ttyg-page-loader'),\n timeToWait: 10\n }\n },\n {\n guideBlockName: 'ttyg-create-agent-click', options: {...options}\n },\n {\n guideBlockName: 'configure-agent',\n // Set name field as mandatory for creation\n options: {...options, editName: true}\n },\n {\n guideBlockName: 'ttyg-create-agent-save', options: {...options}\n },\n {\n guideBlockName: 'wait-for-element-to-hide',\n options: {\n ...options,\n elementSelectorToHide: GuideUtils.getElementSelector('.agent-settings-modal'),\n timeToWait: 10\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_CREATE_TITLE]: 'Create an agent'\n },\n fr: {\n [TTYG_CREATE_TITLE]: 'Créer un agent'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_ASK_DEFAULT_TITLE = 'guide.step-action.ask-ttyg-agent';\nconst EXPLAIN_ANSWER_MORE = 'guide.step_plugin.ask-ttyg-agent.explain-answer-more';\nconst WAIT_FOR_ANSWER = 'guide.step_plugin.ask-ttyg-agent.wait-for-answer';\n\n/**\n * @name ttyg-ask-explain-answer-more\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to ask for more explanation about the response received from the TTYG agent.\n *\n * Click on explain more button<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-explain-answer-more.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-ask-explain-answer-more\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-ask-explain-answer-more',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const explainMoreBtnSelector = GuideUtils.getLastGuideElementSelector('how-derive-answer-btn');\n const elementSelector = GuideUtils.getLastGuideElementSelector('chat-item', explainMoreBtnSelector);\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_ASK_DEFAULT_TITLE);\n\n return [\n {\n // If button is not visible for some reason, skip the whole step\n guideBlockName: 'info-message',\n options: {\n url: 'ttyg',\n beforeShowPromise: (guide, currentStep) => {\n return GuideUtils.waitFor(elementSelector, 1)\n .then(() => {\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.next());\n })\n .catch(() => {\n const stepId = currentStep.id;\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.show(stepId + 3));\n });\n },\n ...options\n }\n },\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, EXPLAIN_ANSWER_MORE),\n class: 'input-agent-name',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector,\n show: (guide) => () => {\n // Add \"click\" listener to the element. Upon clicking the element is hidden and this breaks the default flow of the guide.\n // Adding a handler to proceed to next step\n $(elementSelector).on('click', () => {\n guide.next();\n });\n },\n hide: () => () => {\n // Remove the \"click\" listener of element. It is important when step is hidden.\n $(elementSelector).off('click');\n }\n }\n },\n {\n guideBlockName: 'hold-and-wait-until-hidden',\n options: {\n title,\n content: translate(this.translationBundle, WAIT_FOR_ANSWER),\n class: 'wait-for-answer',\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('chat-details'),\n elementSelectorToWait: GuideUtils.getGuideElementSelector('question-loader'),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Ask the agent',\n [EXPLAIN_ANSWER_MORE]: 'You can ask the agent how it derived the answer by clicking on the button',\n [WAIT_FOR_ANSWER]: 'Wait for the answer to be returned and explore it. When ready proceed by clicking next.'\n },\n fr: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Demander à l\\'agent',\n [EXPLAIN_ANSWER_MORE]: 'Vous pouvez demander à l\\'agent comment il a obtenu la réponse en cliquant sur le bouton',\n [WAIT_FOR_ANSWER]: 'Attendez que la réponse vous soit renvoyée et explorez-la. Lorsque vous êtes prêt, cliquez sur suivant.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst TRANSFORM_INTRO_CONTENT = 'guide.step_plugin.connectors-lucene-fields-field-name-transform-intro.content';\n\n/**\n * @name connectors-lucene-fields-field-name-transform-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Field name transform\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Field name transform\" in mapping data between GraphDB and Lucene.\n *\n * Lucene connector field name transform introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-field-name-transform-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-field-name-transform-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-field-name-transform-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, TRANSFORM_INTRO_CONTENT),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-field-name-transform-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'fieldNameTransform'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [TRANSFORM_INTRO_CONTENT]: 'The <b>Field name transform</b> defines an optional transformation of the field name.<ul><li><b>none</b>: The field name is supplied via the fieldName option.</li><li><b>predicate</b>: The field name is equal to the full IRI of the last predicate of the chain. For example, if the last predicate was http://www.w3.org/2000/01/rdf-schema#label, the field name will also be http://www.w3.org/2000/01/rdf-schema#label.</li><li><b>predicate.localName</b>: The field name is derived from the local name of the IRI of the last predicate of the chain. For example, if the last predicate was http://www.w3.org/2000/01/rdf-schema#comment, the field name will be comment.</li></ul>'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [TRANSFORM_INTRO_CONTENT]: 'La <b>transformation du nom du champ</b> définit une transformation optionnelle du nom du champ.<ul><li><b>none</b> : le nom du champ est fourni via l’option fieldName.</li><li><b>predicate</b> : le nom du champ est égal à l’IRI complet du dernier prédicat de la chaîne. Par exemple, si le dernier prédicat est http://www.w3.org/2000/01/rdf-schema#label, le nom du champ sera également http://www.w3.org/2000/01/rdf-schema#label.</li><li><b>predicate.localName</b> : le nom du champ est dérivé du nom local de l’IRI du dernier prédicat de la chaîne. Par exemple, si le dernier prédicat est http://www.w3.org/2000/01/rdf-schema#comment, le nom du champ sera comment.</li></ul>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const REPOSITORIES_CREATE_DEFAULT_TITLE = 'guide.step-action.create-repository';\nconst ENABLE_FTS_CONTENT = 'guide.step_plugin.create_repository.enable-fts.content';\nconst EXTRA_CONTENT = 'guide.step_plugin.create_repository.enable-fts.extra-content';\n\n/**\n * @name repositories-enable-fts\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable full-text search (FTS) index for a repository.\n *\n * Enable full-text search step<br>\n * <img src=\"resources/guides/repository/repositories-enable-fts.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"repositories-enable-fts\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'repositories-enable-fts',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, ENABLE_FTS_CONTENT),\n title: translate(this.translationBundle, REPOSITORIES_CREATE_DEFAULT_TITLE),\n class: 'gdb-repository-enable-fts',\n extraContent: translate(this.translationBundle, EXTRA_CONTENT),\n extraContentClass: 'alert alert-help text-left',\n ...options,\n url: 'repository/create/graphdb',\n elementSelector: GuideUtils.getGuideElementSelector('enable-fts-search'),\n disablePreviousFlow: false,\n onNextValidate: () =>\n Promise.resolve(\n GuideUtils.isChecked(\n GuideUtils.getGuideElementSelector('enable-fts-search', 'input')\n )\n )\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Create repository',\n [ENABLE_FTS_CONTENT]: 'Enable full-text search (FTS) index',\n [EXTRA_CONTENT]: 'The full text search index is used for finding specific strings within the values associated with a given entity. For example, you can search for the word \"feature\" within a larger context. This is very helpful in cases where a lot of data is stored in literals.'\n },\n fr: {\n [REPOSITORIES_CREATE_DEFAULT_TITLE]: 'Créer un dépôt',\n [ENABLE_FTS_CONTENT]: 'Activer l\\'index de recherche en texte intégral (FTS)',\n [EXTRA_CONTENT]: 'L\\'index de recherche plein texte est utilisé pour trouver des chaînes de caractères spécifiques dans les valeurs associées à une entité donnée. Par exemple, vous pouvez rechercher le mot « feature » dans un contexte plus large. Cette fonction est très utile dans les cas où de nombreuses données sont stockées sous forme de valeurs littérales.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_CREATE_CLICK_CONTENT = 'guide.step-action.visual-graph-config-create-click-content';\n\n/**\n * @name visual-graph-config-create-click\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to click on the create graph config button in the Visual Graph explore page to create a graph config.<br>\n *\n * Click on the create graph config button step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-create-click.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-create-click\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-create-click',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_CREATE_CLICK_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations',\n elementSelector: GuideUtils.getGuideElementSelector('create-graph-config-btn'),\n placement: 'left',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_CREATE_CLICK_CONTENT]: 'Click on the create config button to Create graph config.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_CREATE_CLICK_CONTENT]: 'Cliquez sur le bouton de création de config pour créer une configuration de graphique.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst ANALYZER_INTRO = 'guide.step_plugin.connectors-lucene-analyzer-intro.content';\n\n/**\n * @name connectors-lucene-analyzer-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Analyzer\" parameter of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Analyzer\" parameter in defining a custom Lucene Analyzer.\n *\n * Lucene connector analyzer introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-analyzer-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-analyzer-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-analyzer-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, ANALYZER_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-analyzer-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'analyzer'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [ANALYZER_INTRO]: 'The <b>analyzer</b> parameter specifies a custom Lucene Analyzer. The value must be the fully qualified name of a class extending org.apache.lucene.analysis.Analyzer with either a default constructor or a constructor accepting a org.apache.lucene.util.Version parameter.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [ANALYZER_INTRO]: 'Le paramètre <b>analyzer</b> spécifie un analyseur Lucene personnalisé. La valeur doit être le nom complet d’une classe étendant org.apache.lucene.analysis.Analyzer avec soit un constructeur par défaut, soit un constructeur acceptant un paramètre org.apache.lucene.util.Version.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * List of common DOM events to consider for interaction control.\n * @type {string[]}\n */\nconst COMMON_DOM_EVENTS = [\n 'click',\n 'dblclick',\n 'keydown',\n 'keypress',\n 'keyup',\n 'input',\n 'submit',\n 'scroll',\n 'wheel'\n];\nexport const SCROLL_EVENTS = ['scroll', 'wheel'];\n\n/**\n * This function will be called before show a step. Step will be shown after promise is resolve. It waits element of step to be visible on the page.\n * @param {*} services\n * @param {string} elementSelector\n * @param {number} maxWaitTime\n * @return {function(): *}\n */\nexport const beforeShowPromise = (services, elementSelector, maxWaitTime) => {\n return () => {\n return services.GuideUtils.waitFor(elementSelector, maxWaitTime)\n .catch((error) => {\n // error is caught just to show notification in generic way.\n services.toastr.error(services.$translate.instant('guide.unexpected.error.message'));\n // throw the error, otherwise guide will continue with the next step.\n throw error;\n });\n };\n};\n\nexport const createCopyToInputListener = (elementSelector, text) => {\n return (event) => {\n event.preventDefault();\n const inputElement = document.querySelector(elementSelector);\n inputElement.value = text;\n inputElement.dispatchEvent(new Event('input', {bubbles: true}));\n };\n};\n\n/**\n * Configures an element interactability, by consuming events and preventing them from propagating.\n * This allows to keep scrolling, while disallowing interaction with other elements\n * (such as clicking buttons).\n * @param {string[]} allowedEvents - List of event types to allow.\n * @param interactable - true to make the element interactable, false to make it non interactable\n * @param elementSelector - the elementSelector\n * @param services - The services object\n */\nconst _configureInteractions = (allowedEvents, interactable, elementSelector, services) => () => {\n if (!elementSelector) {\n return;\n }\n\n services.GuideUtils.getOrWaitFor(elementSelector)\n .then((element) => {\n const eventsToPrevent = COMMON_DOM_EVENTS.filter((event) => !allowedEvents.includes(event));\n if (interactable) {\n eventsToPrevent.forEach((event) => element.removeEventListener(event, preventDefault, true));\n } else {\n eventsToPrevent.forEach((event) => element.addEventListener(event, preventDefault, true));\n }\n });\n};\n\n/**\n * Enables all interactions on the specified element.\n *\n * @param {string} elementSelector - A CSS selector identifying the target element.\n * @param {Object} services - An object containing utility services, including GuideUtils.\n */\nexport const allowAll = (elementSelector, services) => _configureInteractions([], true, elementSelector, services);\n\n/**\n * Restricts the specified element to only process events listed in <code>allowedEvents</code>.\n *\n * @param {string[]} allowedEvents - An array of event types that should remain enabled.\n * @param {string} elementSelector - A CSS selector identifying the target element.\n * @param {Object} services - An object containing utility services, including GuideUtils.\n */\nexport const allowEvents = (allowedEvents, elementSelector, services) => _configureInteractions(allowedEvents, false, elementSelector, services);\n\n/**\n * Prevents the default action of an event and stops its propagation.\n * @param {Event} event - The event to prevent.\n */\nconst preventDefault = (event) => {\n event.preventDefault();\n event.stopPropagation();\n};\n\nexport const SPARQL_DIRECTIVE_SELECTOR = '#query-editor';\n\nexport const reloadAndOpenInfoPanel = (services, clasInstanceSelector) => {\n services.RoutingUtil.navigate('/hierarchy');\n return services.GuideUtils.waitFor(clasInstanceSelector, 3)\n .then(() => {\n services.GuideUtils.classHierarchyFocus(clasInstanceSelector);\n // Wait a little time animation to complete.\n return services.GuideUtils.deferredShow(500)();\n });\n};\n\nexport const disableAllRDFClasses = () => {\n document.querySelectorAll('.rdf-class')\n .forEach((el) => {\n el.classList.add('disable-rdf-class');\n });\n disableSidebarInteraction();\n};\n\nexport const enableAllRDFClasses = () => {\n document.querySelectorAll('.rdf-class')\n .forEach((el) => {\n el.classList.remove('disable-rdf-class');\n });\n enableSidebarInteraction();\n};\n\nexport const disableSidebarInteraction = () => {\n document.querySelector('.rdf-info-side-panel')\n .classList\n .add('pointer-events-none');\n};\n\nexport const enableSidebarInteraction = () => {\n document.querySelector('.rdf-info-side-panel')\n .classList\n .remove('pointer-events-none');\n};\n\nexport const createDownloadClickHandler = (resourcePath, resourceFile, services) => {\n return (event) => {\n event.preventDefault();\n services.GuidesService.downloadGuidesFile(resourcePath, resourceFile);\n };\n};\n\nexport const createCopyToEditorListener = (getYasguiComponentUtil, sparqlDirectiveSelector, query) => {\n return (event) => {\n event.preventDefault();\n getYasguiComponentUtil().setQuery(sparqlDirectiveSelector, query);\n };\n};\n\nexport const getResourceURL = (options) => {\n let url = 'resource?role=';\n url += options.role ? options.role : 'subject';\n if (options.iri) {\n url += `&uri=${encodeURIComponent(options.iri)}`;\n }\n return url;\n};\n\nexport const getRepositoryName = (services, options) => {\n return services.$repositories.getRepositories().find((repo) => repo.id === options.repositoryId) ? options.repositoryId : options.repositoryIdBase;\n};\n\nexport const getRepositoryElementSelector = (services, options) => {\n return services.GuideUtils.getGuideElementSelector(`repository-id-${getRepositoryName(services, options)}`);\n};\n\nexport const setRepositorySelectorAutoClose = (autoClose) => {\n const component = document.querySelector('.onto-repository-selector');\n if (component) {\n // Enable auto-close when the guide step is closed.\n component.autoClose = autoClose;\n }\n};\n\nexport const disableAllVisualGraphNodes = () => () => {\n $('.node-wrapper').addClass('disable-visual-graph-node');\n};\n\nexport const enableAllVisualGraphNodes = () => () => {\n $('.node-wrapper').removeClass('disable-visual-graph-node');\n};\n\nexport const getConnectorNameSelector = (options, services) => {\n return services.GuideUtils.getGuideElementSelector(`connector-name-${options.connectorName}`);\n};\n\nexport const getConnectorContentSelector = (options, services) => {\n return services.GuideUtils.getGuideElementSelector(`${options.instanceName}-connector-content`);\n};\n\nexport const getConnectorParameterSelector = (options, services) => {\n return services.GuideUtils.getGuideElementSelector(`${options.parameterName}-connector-parameter`);\n};\n\nexport const getConnectorSubparameterSelector = (options, services) => {\n return services.GuideUtils.getGuideElementSelector(`${options.subparameterName}-connector-subproperty`);\n};\n","import * as Utils from '../utils.js';\nimport {BASIC_STEP} from '../config.js';\n\n/**\n * @name focus-element\n * @memberof module:Interactive Guide\n *\n * @description\n * The Focus Element step is used to guide users to see a specific element on the interface.\n *\n * Focus element example<br>\n * <img src=\"resources/guides/core/focus-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {function} [options.beforeShowPromise] - A promise that has to resolve, before the step is shown. If not provided, the step will be shown immediately.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"focus-element\",\n * \"options\": {\n * \"elementSelector\": \"#important-info\",\n * \"content\": \"Please take a look at this important information.\"\n * }\n * }\n * ```\n */\nconst step = {\n // An element which is expected to be focused. It allows user interaction.\n guideBlockName: 'focus-element',\n getStep: (options, services) => {\n const stepDescription = {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n ...options\n };\n\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(services, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name visualise-sparql-query\n * @memberof module:Interactive Guide\n *\n * @description\n * Composite step that guides the user through visualizing the results of a SPARQL query.\n * Included steps are:\n *\n * Copy SPARQL query to the editor<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Run the query<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor-run-button.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Press the \"Visual\" button to visualize the results<br>\n * <img src=\"resources/guides/sparql-editor/sparql-results-visual-button.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} query - The SPARQL query to be visualized.\n * @property {string | object} [queryExtraContent] - If this option is present, an additional dialog will be displayed as the last step with the passed content, localized by language.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visualise-sparql-query\",\n * \"options\": {\n * \"query\": \"SELECT ?s ?p ?o WHERE {?s ?p ?o} LIMIT 10\",\n * \"queryExtraContent\": {\n * \"en\": \"The query selects RDF statements whose <i>subject</i> is the movie <b>Pirates of the Caribbean At World's End</b> (identified by the IRI <b>imdb:title/PiratesoftheCaribbeanAtWorldsEnd</b>). Note that we need to escape the / in the shortened IRI.\"\n * }\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visualise-sparql-query',\n getSteps: (options) => {\n const steps = [];\n if (options.useMainMenuNavigation) {\n steps.push({\n guideBlockName: 'click-main-menu',\n options: {\n menu: 'sparql',\n mainAction: 'execute-sparql-query',\n showIntro: true,\n ...options\n }\n });\n }\n\n steps.push({\n guideBlockName: 'sparql-editor',\n options: {\n query: options.query,\n queryExtraContent: options.queryExtraContent,\n ...options\n }\n }, {\n guideBlockName: 'sparql-editor-run-button',\n options: {...options}\n }, {\n guideBlockName: 'sparql-results-visual-button',\n options: {...options}\n });\n\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst CLASS_HIERARCHY_DEFAULT_TITLE = 'view.class.hierarchy.title';\nconst OPEN_RDF_INSTANCES_SIDE_PANEL = 'guide.step_plugin.class-hierarchy-open-rdf-instances-side-panel.content';\n\n/**\n * @name class-hierarchy-open-rdf-instances-side-panel\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to open the RDF instances side panel in the class hierarchy view.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-open-rdf-instances-side-panel.png\" style=\"height:200px; border: solid\">\n *\n * This step can be configured using the common options defined in [Options](#.Options). It requires `options.iri`\n *\n * @property {string} options.iri - The IRI of the class whose instances are to be viewed. This option is required.\n *\n * * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-open-rdf-instances-side-panel\",\n * \"options\": {\n * \"iri\": \"imdb:ColorMovie\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-open-rdf-instances-side-panel',\n /**\n *\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n let element;\n const translate = pluginService.translate;\n const GuideUtils = pluginService.GuideUtils;\n const selector = GuideUtils.getGuideElementSelector('class-' + options.iri);\n const RoutingUtil = pluginService.RoutingUtil;\n const title = options.title ? options.title : translate(this.translationBundle, CLASS_HIERARCHY_DEFAULT_TITLE);\n const handleDoubleClick = () => (event) => {\n event.preventDefault();\n event.stopPropagation();\n // Ensure the side panel always appears\n return Utils.reloadAndOpenInfoPanel({RoutingUtil, GuideUtils}, selector);\n };\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, OPEN_RDF_INSTANCES_SIDE_PANEL, {iri: options.iri}),\n url: 'hierarchy',\n elementSelector: selector,\n class: 'class-hierarchy-open-rdf-instances-side-panel',\n placement: 'top',\n onNextClick: (guide) => {\n GuideUtils.classHierarchyFocus(selector);\n guide.next();\n },\n show: () => () => {\n // Add a \"dblclick\" listener to the element.\n // We have to open side panel info manually when a selected node is clicked.\n element = document.querySelector(selector);\n if (element) {\n element.addEventListener('dblclick', handleDoubleClick, true);\n }\n Utils.disableSidebarInteraction();\n },\n hide: () => () => {\n if (element) {\n element.removeEventListener('dblclick', handleDoubleClick, true);\n element = null;\n }\n Utils.enableSidebarInteraction();\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Class hierarchy',\n [OPEN_RDF_INSTANCES_SIDE_PANEL]: 'Click on <b>{{iri}}</b> to show its instances.'\n },\n\n fr: {\n [CLASS_HIERARCHY_DEFAULT_TITLE]: 'Hiérarchie de classe',\n [OPEN_RDF_INSTANCES_SIDE_PANEL]: 'Cliquez sur <b>{{iri}}</b> pour afficher ses instances.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SHOW_DOCUMENTATION_LINK = 'guide.step_plugin.show-documentation-link.content';\n\n/**\n * @name show-documentation-link\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides a link to the complete documentation of a certain subject. It accepts documentationPath as an option\n * and uses it to construct a general message, leading to that specific documentation page. Note that although not required,\n * it is highly recommended to provide the specific page url, where the step is used. For example, if the dialog is shown\n * in the connectors page, there should be options.url = 'connectors' provided. Otherwise, there might be unwanted navigation\n * or reloading of the page.\n *\n * Link to documentation<br>\n * <img src=\"resources/guides/core/show-documentation-link.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n * @property {string} options.documentationPath - The URL of the GraphDB documentation page for the documentation e.g. lucene-graphdb-connector.html\n *\n * @examples\n * ```JSON\n * {\n * \"guideBlockName\": \"show-documentation-link\",\n * \"options\": {\n * \"title\": \"Custom title\"\n * \"documentationPath\": \"lucene-graphdb-connector.html\",\n * \"url\": \"connectors\"\n * }\n * }\n *\n * {\n * \"guideBlockName\": \"show-documentation-link\",\n * \"options\": {\n * \"content\": \"Custom content with a link to the <a href=\"https://graphdb.ontotext.com/documentation/master/lucene-graphdb-connector.html\" target=\"_blank\">GraphDB documentation</a>\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'show-documentation-link',\n\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n // We might want to completely override the content, at which point we don't need to provide a documentation path\n const documentationLink = options.documentationPath ? pluginService.resolveDocumentationUrl(options.documentationPath) : '';\n return [{\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, SHOW_DOCUMENTATION_LINK, {documentationLink}),\n ...options,\n documentationLink\n }\n }];\n },\n translationBundle: {\n en: {\n [SHOW_DOCUMENTATION_LINK]: 'For more information please visit <a href=\"{{documentationLink}}\" target=\"_blank\">GraphDB documentation</a>'\n },\n fr: {\n [SHOW_DOCUMENTATION_LINK]: 'Pour plus d\\'informations, veuillez visiter la <a href=\"{{documentationLink}}\" target=\"_blank\">documentation GraphDB</a>'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\nimport * as Utils from '../utils.js';\n\n/**\n * @name scroll-only-element\n * @memberof module:Interactive Guide\n *\n * @description\n * Focuses a specific element while allowing only scroll-related interactions on it. Other interactions are disabled\n * for the duration of the step. Useful when users need to scroll within a container to find content without clicking\n * or typing.\n *\n * Scroll only element example<br>\n * <img src=\"resources/guides/core/scroll-only-element.png\" style=\"height:200px; border: solid; border-width:1px\"/><br></br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.elementSelector - CSS selector of the scrollable element to focus.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"scroll-only-element\",\n * \"options\": {\n * \"elementSelector\": \"#results-pane\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'scroll-only-element',\n getStep: (options, services) => {\n const stepDescription = {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n show: () => Utils.allowEvents(Utils.SCROLL_EVENTS, options.elementSelector, services),\n hide: () => Utils.allowAll(options.elementSelector, services),\n ...options\n };\n if (!stepDescription.beforeShowPromise) {\n stepDescription.beforeShowPromise = Utils.beforeShowPromise(services, stepDescription.elementSelector, stepDescription.maxWaitTime);\n }\n return stepDescription;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_STARTING_POINT_SEARCH_CONTENT = 'guide.step-action.visual-graph-config-starting-point-search';\nconst VISUAL_GRAPH_CONFIG_STARTING_POINT_FIXED_CONTENT = 'guide.step-action.visual-graph-config-starting-point-fixed';\nconst VISUAL_GRAPH_CONFIG_STARTING_POINT_QUERY_CONTENT = 'guide.step-action.visual-graph-config-starting-point-query';\n\nconst STARTING_POINT_CONFIG = {\n search: {\n contentKey: VISUAL_GRAPH_CONFIG_STARTING_POINT_SEARCH_CONTENT,\n elementSelector: 'start-with-search-box'\n },\n fixed: {\n contentKey: VISUAL_GRAPH_CONFIG_STARTING_POINT_FIXED_CONTENT,\n elementSelector: 'start-with-a-fixed-node'\n },\n query: {\n contentKey: VISUAL_GRAPH_CONFIG_STARTING_POINT_QUERY_CONTENT,\n elementSelector: 'start-with-graph-query-result'\n }\n};\n\n/**\n * @name visual-graph-config-starting-point\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to select a starting point option in the Visual Graph config page.\n * The starting point type is determined by the `startingPoint` option, which can be one of:\n * - `search` - Start with a search box<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-search.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * - `fixed` - Start with a fixed node<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-fixed.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n * - `query` - Start with graph query results<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-starting-point-query.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is required:\n *\n * @property {string} options.startingPoint - The type of starting point to select. Must be one of `search`, `fixed`, or `query`.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-starting-point\",\n * \"options\": {\n * \"startingPoint\": \"search\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-starting-point',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const config = STARTING_POINT_CONFIG[options.startingPoint];\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, config.contentKey),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations/config/save',\n elementSelector: GuideUtils.getGuideElementSelector(config.elementSelector),\n onNextClick: GuideUtils.clickOnGuideElement(config.elementSelector),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_SEARCH_CONTENT]: 'Select <b>Start with a search box</b> to allow choosing the starting resource of the visual graph each time it is opened.',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_FIXED_CONTENT]: 'Select <b>Start with a fixed node</b> to always start the visual graph from a specific resource.',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_QUERY_CONTENT]: 'Select <b>Start with graph query results</b> to start the visual graph from the results returned by a graph query.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_SEARCH_CONTENT]: 'Sélectionnez <b>Commencer avec une boîte de recherche</b> pour permettre de choisir la ressource de départ du graphique visuel à chaque ouverture.',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_FIXED_CONTENT]: 'Sélectionnez <b>Commencer avec un nœud fixe</b> pour toujours démarrer le graphique visuel à partir d\\'une ressource spécifique.',\n [VISUAL_GRAPH_CONFIG_STARTING_POINT_QUERY_CONTENT]: 'Sélectionnez <b>Commencer avec les résultats d\\'une requête graphique</b> pour démarrer le graphique visuel à partir des résultats renvoyés par une requête graphique.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst SPARQL_RESULT_CONTENT = 'guide.step_plugin.execute-sparql-query.visual-sparql-results.content';\n\n/**\n * @name sparql-results-visual-button\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on the button that allows users to visualize the results of a SPARQL query.\n *\n * Clicking on the button<br>\n * <img src=\"resources/guides/sparql-editor/sparql-results-visual-button.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-results-visual-button\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-results-visual-button',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, SPARQL_RESULT_CONTENT),\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n url: 'sparql',\n elementSelector: services.GuideUtils.CSS_SELECTORS.SPARQL_VISUAL_BUTTON_SELECTOR,\n class: 'visual-sparql-results-button',\n scrollToHandler: services.GuideUtils.scrollToTop,\n onNextClick: () => services.GuideUtils.clickOnElement(services.GuideUtils.CSS_SELECTORS.SPARQL_VISUAL_BUTTON_SELECTOR)(),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [SPARQL_RESULT_CONTENT]: 'Click on the <b>Visual</b> button.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [SPARQL_RESULT_CONTENT]: 'Cliquez sur le bouton <b>Visualiser</b>.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst COPY_TO_EDITOR = 'guide.step_plugin.execute-sparql-query.copy-to-editor.button';\nconst QUERY_EDITOR_CONTENT = 'guide.step_plugin.execute-sparql-query.query-editor.content';\nconst UNEXPECTED_ERROR = 'guide.unexpected.error.message';\n\n/**\n * @name sparql-editor\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to copy a SPARQL query to the SPARQL editor.\n *\n * Copy to editor<br>\n * <img src=\"resources/guides/sparql-editor/sparql-editor.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} query - The SPARQL query to be copied to the editor.\n * @property {string | Object} queryExtraContent - Additional content to display in the editor.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-editor\",\n * \"options\": {\n * \"query\": \"SELECT ?s WHERE { ?s ?p ?o } LIMIT 10\",\n * \"queryExtraContent\": {\n * \"en\": \"The query selects RDF statements whose <i>subject</i> is the movie <b>Pirates of the Caribbean At World's End</b> (identified by the IRI <b>imdb:title/PiratesoftheCaribbeanAtWorldsEnd</b>). Note that we need to escape the / in the shortened IRI.\"\n * }\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-editor',\n getSteps: function(options, services) {\n const translate = services.translate;\n\n const code = document.createElement('code');\n const copy = document.createElement('button');\n const copyToEditorButtonClass = 'guide-copy-to-editor-query-button';\n copy.className = `btn btn-sm btn-secondary ${copyToEditorButtonClass}`;\n copy.innerText = translate(this.translationBundle, COPY_TO_EDITOR);\n const query = options.query;\n const copyToEditorListener = Utils.createCopyToEditorListener(() => services.YasguiComponentUtil, Utils.SPARQL_DIRECTIVE_SELECTOR, query);\n code.innerText = query;\n const queryAsHtmlCodeElement = '<div class=\"shepherd-code\">' + code.outerHTML + copy.outerHTML + '</div>';\n\n let stepHTMLElement;\n\n return [\n {\n guideBlockName: 'input-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n content: translate(this.translationBundle, QUERY_EDITOR_CONTENT, {queryAsHtmlCodeElement}),\n url: 'sparql',\n elementSelector: services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR,\n class: 'yasgui-query-editor',\n beforeShowPromise: () => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then(() => services.GuideUtils.waitFor(services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR, 3))\n .then(() => services.GuideUtils.deferredShow(500)())\n .catch((error) => {\n services.toastr.error(translate(this.translationBundle, UNEXPECTED_ERROR));\n throw error;\n }),\n onNextValidate: () => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then((yasgui) => yasgui.getQuery().then((query) => ({yasgui, queryFromEditor: query})))\n .then(({yasgui, _queryFromEditor}) => {\n yasgui.setQuery(query);\n return true;\n }),\n scrollToHandler: services.GuideUtils.scrollToTop,\n extraContent: options.queryExtraContent,\n show: (_guide) => () => {\n stepHTMLElement = _guide.currentStep.el.querySelector(`.${copyToEditorButtonClass}`);\n stepHTMLElement.addEventListener('click', copyToEditorListener);\n },\n hide: () => () => {\n if (stepHTMLElement) {\n stepHTMLElement.removeEventListener('click', copyToEditorListener);\n }\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [COPY_TO_EDITOR]: 'Copy to editor',\n [QUERY_EDITOR_CONTENT]: 'Enter the following SPARQL query: {{queryAsHtmlCodeElement}}',\n [UNEXPECTED_ERROR]: 'The guide was cancelled due to an unexpected error. Please run the guide again and if the problem persists contact the support.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [COPY_TO_EDITOR]: 'Copier dans l\\'éditeur',\n [QUERY_EDITOR_CONTENT]: 'Entrez la requête SPARQL suivante: {{queryAsHtmlCodeElement}}',\n [UNEXPECTED_ERROR]: 'Le guide a été annulé en raison d\\'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const RDF_INSTANCES_TITLE = 'guide.step_plugin.class-hierarchy-instances.title';\n\n/**\n * @name class-hierarchy-dataset-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * Showcases a visualizes the top level of a class dataset and its subclasses.\n *\n * <img src=\"resources/guides/class-hierarchy/class-hierarchy-dataset-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-hierarchy-dataset-intro\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-hierarchy-dataset-intro',\n /**\n * @param {Options} options - Options object containing settings and parameters for the step.\n * @param {PluginServiceInterface} pluginService - The plugin service used to interact with the application (e.g., translations).\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, RDF_INSTANCES_TITLE);\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title,\n url: 'hierarchy',\n elementSelector: '#classChart #main-group',\n placement: 'left',\n class: 'class-hierarchy-dataset-intro',\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RDF_INSTANCES_TITLE]: 'Class hierarchy instances'\n },\n\n fr: {\n [RDF_INSTANCES_TITLE]: 'Instances de hiérarchie de classes'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","/**\n * @name configure-agent\n * @memberof module:Interactive Guide\n *\n * @description\n * Complex guide step, which takes the user through the process of configuring a TTYG agent.\n * It includes steps to edit the agent name, model, extraction methods, temperature, top-p,\n *\n * Configure agent name<br>\n * <img src=\"resources/guides/ttyg/configure-agent-type-agent-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure context size<br>\n * <img src=\"resources/guides/ttyg/set-context-window-size.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure temperature<br>\n * <img src=\"resources/guides/ttyg/configure-temperature.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure top-p<br>\n * <img src=\"resources/guides/ttyg/configure-top-p.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure model name<br>\n * <img src=\"resources/guides/ttyg/configure-agent-type-model-name.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure iri discovery search<br>\n * <img src=\"resources/guides/ttyg/configure-iri-discovery-search.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * Configure additional instructions<br>\n * <img src=\"resources/guides/ttyg/configure-agent-additional-instructions.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @property {boolean} [editName] - Whether to include steps to edit the agent name.\n * @property {string} [model] - The model name to set for the agent. If provided, steps to configure the model will be included.\n * @property {Array} [methods] - An array of method objects to configure. Each object should contain a `guideBlockName` and optional `options`.\n * @property {number} [temperature] - The temperature value to set for the agent. If provided, steps to configure temperature will be included.\n * @property {number} [topP] - The top-p value to set for the agent. If provided, steps to configure top-p will be included.\n * @property {Object} [iriDiscoverySearch] - Configuration for IRI discovery search. If provided, steps to configure it will be included.\n * @property {boolean} [iriDiscoverySearch.disable] - Whether to disable IRI discovery search.\n * @property {string} [userInstructions] - Additional user instructions to set for the agent.\n * @property {number} [contextSize] - The context size to set for the agent. If provided, steps to configure the context size will be included.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"configure-agent\",\n * \"options\": {\n * \"editName\": true,\n * \"model\": \"gpt-4o-mini\",\n * \"methods\": [\n * {\n * \"guideBlockName\": \"fts-search-method\",\n * \"options\": {\n * \"disable\": true\n * }\n * },\n * {\n * \"guideBlockName\": \"similarity-search-method\"\n * }\n * ],\n * \"temperature\": 0.7,\n * \"topP\": 0.9,\n * \"contextSize\": 1000,\n * \"iriDiscoverySearch\": {\n * \"disable\": false\n * },\n * \"userInstructions\": \"Please provide concise answers.\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'configure-agent',\n getSteps: (options, services) => {\n const GuideUtils = services.GuideUtils;\n\n const configureExtractionMethods = (services, options) => {\n const methods = options.methods || [];\n\n return methods.map((method) => {\n return {\n guideBlockName: method.guideBlockName,\n options: {\n disablePreviousFlow: false,\n ...method.options\n }\n };\n });\n };\n\n const shouldEditName = options.editName;\n const hasModelName = options.model;\n const hasUserInstructions = options.userInstructions;\n const shouldConfigureExtractionMethods = !!options.methods?.length;\n const shouldConfigureContextSize = options.contextSize !== undefined;\n const shouldConfigureTopP = options.topP !== undefined;\n const shouldConfigureTemperature = options.temperature !== undefined;\n const shouldConfigureIriDiscoverySearch = !!options.iriDiscoverySearch;\n\n const steps = [\n {\n guideBlockName: 'wait-for-element-to-show',\n options: {\n elementSelectorToShow: GuideUtils.getElementSelector('.agent-settings-modal'),\n timeToWait: 10,\n ...options\n }\n }\n ];\n\n if (shouldEditName) {\n steps.push({\n guideBlockName: 'configure-agent-type-agent-name', options: {...options}\n });\n }\n\n if (hasModelName) {\n steps.push({\n guideBlockName: 'configure-agent-type-model-name', options: {...options}\n });\n }\n\n if (shouldConfigureContextSize) {\n steps.push({\n guideBlockName: 'set-context-window-size',\n options: {...options}\n });\n }\n\n if (shouldConfigureTemperature) {\n steps.push({\n guideBlockName: 'configure-temperature',\n options: {...options}\n });\n }\n\n if (shouldConfigureTopP) {\n steps.push({\n guideBlockName: 'configure-top-p',\n options: {...options}\n });\n }\n\n if (shouldConfigureExtractionMethods) {\n steps.push(...configureExtractionMethods(services, options));\n }\n\n if (shouldConfigureIriDiscoverySearch) {\n steps.push({\n guideBlockName: 'configure-iri-discovery-search',\n options: {\n disable: options.iriDiscoverySearch.disable,\n ...options\n }\n });\n }\n\n if (hasUserInstructions) {\n steps.push({\n guideBlockName: 'configure-agent-additional-instructions', options: {...options}\n });\n }\n // Removes the \"Previous\" button from the first method control step, because there is no previous step in the form.\n steps[1].options.disablePreviousFlow = true;\n return steps;\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst LANGUAGES_INTRO = 'guide.step_plugin.connectors-lucene-languages-intro.content';\n\n/**\n * @name connectors-lucene-languages-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Languages\" parameter within the Lucene connector configuration in GraphDB.\n * It explains the purpose and usage of the \"Languages\" option in mapping RDF literal languages to the connector.\n *\n * Lucene connector languages introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-languages-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-languages-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-languages-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-parameter-intro',\n options: {\n content: translate(this.translationBundle, LANGUAGES_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-languages-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'languages'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [LANGUAGES_INTRO]: 'The <b>Languages</b> option defines which RDF literal languages are mapped to the connector. You can provide a list of language ranges to include specific languages, or an empty range to include literals without a language tag.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [LANGUAGES_INTRO]: 'L’option <b>Langues</b> définit quelles langues de littéraux RDF sont mappées vers le connecteur. Vous pouvez fournir une liste de plages de langues pour inclure des langues spécifiques, ou une plage vide pour inclure les littéraux sans balise de langue.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.similarity-search-method';\nconst ENABLE_TOGGLE = 'guide.step_plugin.similarity-search-method.enable-toggle';\n\n/**\n * @name ttyg-similarity-toggle-on\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to enable the Similarity search query method in the TTYG interface.\n * It highlights the toggle element and provides instructions on how to proceed.\n *\n * Click on the toggle to enable Similarity search query method<br>\n * <img src=\"resources/guides/ttyg/ttyg-similarity-toggle-on.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-similarity-toggle-on\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-similarity-toggle-on',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const toggleSelector = GuideUtils.getGuideElementSelector('query-method-similarity_search-input');\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'toggle-element',\n options: {\n content: translate(this.translationBundle, ENABLE_TOGGLE),\n class: 'toggle-similarity-search',\n title: translate(this.translationBundle, SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE),\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('query-method-similarity_search'),\n toggleableElementSelector: toggleSelector,\n onNextValidate: () => Promise.resolve(GuideUtils.isChecked(toggleSelector))\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'FTS search query method',\n [ENABLE_TOGGLE]: 'Click on the toggle to enable Similarity search query method.'\n },\n fr: {\n [SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche FTS',\n [ENABLE_TOGGLE]: 'Cliquez sur la case à cocher pour activer la méthode de recherche par similarité.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const RDF_RANK_TITLE = 'view.rdf.rank.title';\nconst COMPUTE_FILL = 'guide.step_plugin.rdf-rank-compute-fill.content';\n\n/**\n * @name rdf-rank-compute-fill\n * @memberof module:Interactive Guide\n *\n * @description\n * This step prompts the user to click on the \"Compute Full\" button to start the RDF Rank computation.\n *\n * Click Compute Full<br>\n * <img src=\"resources/guides/rdf-rank/rdf-rank-compute-fill.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"rdf-rank-compute-fill\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'rdf-rank-compute-fill',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const computeRDFRankButtonSelector = GuideUtils.getGuideElementSelector('compute-rdf-rank-btn');\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n url: 'rdfrank',\n content: translate(this.translationBundle, COMPUTE_FILL),\n elementSelector: computeRDFRankButtonSelector,\n title: translate(this.translationBundle, RDF_RANK_TITLE),\n onNextClick: GuideUtils.clickOnElement( computeRDFRankButtonSelector),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RDF_RANK_TITLE]: 'RDF Rank',\n [COMPUTE_FILL]: 'Click on <b>Compute Full</b> to start the RDF Rank computation.'\n },\n fr: {\n [RDF_RANK_TITLE]: 'Rang RDF',\n [COMPUTE_FILL]: 'Cliquez sur <b>Calculer tout</b> pour lancer le calcul du RDF Rank.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst INDEXED_INTRO = 'guide.step_plugin.connectors-lucene-fields-indexed-intro.content';\n\n/**\n * @name connectors-lucene-fields-indexed-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * This step is an introductory step for the \"Indexed\" sub-parameter within the fields configuration of the Lucene connector in GraphDB.\n * It explains the purpose and usage of the \"Indexed\" option in determining whether a field is searchable with Lucene queries.\n *\n * Lucene connector indexed introduction<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-fields-indexed-intro.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-fields-indexed-intro\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-fields-indexed-intro',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-array-subparameter-intro',\n options: {\n content: translate(this.translationBundle, INDEXED_INTRO),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-fields-indexed-intro',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'fields',\n subparameterName: 'indexed'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [INDEXED_INTRO]: 'The <b>Indexed</b> option determines whether the field is searchable with Lucene queries. By default, indexing is enabled.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [INDEXED_INTRO]: 'L’option <b>Indexé</b> détermine si le champ est interrogeable avec les requêtes Lucene. Par défaut, l’indexation est activée.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const DEFAULT_TITLE = 'guide.step_plugin.class-relationships.default.title';\nconst CONTENT = 'guide.step_plugin.class-relationships-named-graph-selection.content';\n\n/**\n * @name class-relationships-named-graph-selection\n * @memberof module:Interactive Guide\n *\n * @description\n * The `class-relationships-named-graph-selection` step displays a dialog that explains how to filter the Class Relationships view\n * by selecting a specific named graph from the All graphs dropdown.<br>\n * <img src=\"resources/guides/class-relationships/class-relationships-named-graph-selection.png\" style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"class-relationships-named-graph-selection\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'class-relationships-named-graph-selection',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-select-dropdown');\n const translate = pluginService.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n url: 'relationships',\n elementSelector,\n placement: 'left',\n class: 'class-relationships-named-graph-selection',\n content: translate(this.translationBundle, CONTENT),\n scrollToHandler: () => GuideUtils.scrollIntoView(elementSelector, {block: 'center'}),\n title: translate(this.translationBundle, DEFAULT_TITLE),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [DEFAULT_TITLE]: 'Class relationships',\n [CONTENT]: 'If the repository contains more than one named graph, you can filter the view by opening the <b>All graphs</b> dropdown (next to the toolbar) and selecting the graph to explore.'\n\n },\n fr: {\n [DEFAULT_TITLE]: 'Relations de classe',\n [CONTENT]: 'Si le référentiel contient plus d\\'un graphe nommé, vous pouvez filtrer la vue en ouvrant le menu déroulant <b>Tous les graphes</b> (à côté de la barre d\\'outils) et en sélectionnant le graphe à explorer.'\n\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const CHAT_DETAILS_SELECTOR = 'chat-details';\nconst TTYG_ASK_DEFAULT_TITLE = 'guide.step-action.ask-ttyg-agent';\nconst INPUT_QUESTION = 'guide.step_plugin.ask-ttyg-agent.input-question';\nconst WAIT_FOR_ANSWER = 'guide.step_plugin.ask-ttyg-agent.wait-for-answer';\n\n/**\n * @name ttyg-ask-question\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to ask a question to the TTYG agent.\n * It highlights the input area where the user can type their question and provides instructions on how to proceed.\n *\n * Ask the agent<br>\n * <img src=\"resources/guides/ttyg/ttyg-ask-question.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @property {Object} [question] - The question to be asked to the TTYG agent. This will be displayed in the instructions.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-ask-question\",\n * \"options\": {\n * \"question\": \"Can you describe your purpose and dataset, please? What classes and instances are there?\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-ask-question',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_ASK_DEFAULT_TITLE);\n return [\n {\n guideBlockName: 'input-element',\n options: {\n title,\n content: translate(this.translationBundle, INPUT_QUESTION, {question: options.question}),\n class: 'input-question',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('question-input'),\n show: (guide) => () => {\n const elementSelector = GuideUtils.getGuideElementSelector('contenteditable');\n\n // Add \"keydown\" listener to the element.\n // The question-input directive listens for \"Enter\" keypress to trigger question asking.\n // When enter is pressed, proceed with next step.\n // Using 'keydown' to trigger before the directive 'keypress', which clears the value.\n $(elementSelector).on('keydown', (event) => {\n const value = $(elementSelector).text();\n\n if (value && event.key === 'Enter' && !event.shiftKey && !event.ctrlKey) {\n GuideUtils.waitFor(GuideUtils.getGuideElementSelector(CHAT_DETAILS_SELECTOR))\n .then(() => guide.next());\n }\n });\n },\n hide: () => () => {\n const elementSelector = GuideUtils.getGuideElementSelector('contenteditable');\n // Remove the \"keydown\" listener of the element. It is important when the step is hidden.\n $(elementSelector).off('keydown');\n }\n }\n },\n {\n guideBlockName: 'hold-and-wait-until-hidden',\n options: {\n title,\n content: translate(this.translationBundle, WAIT_FOR_ANSWER),\n class: 'wait-for-answer',\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('chat-details'),\n elementSelectorToWait: GuideUtils.getGuideElementSelector('question-loader'),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Ask the agent',\n [INPUT_QUESTION]: 'Type \"<b>{{question}}</b>\" in the input and press enter',\n [WAIT_FOR_ANSWER]: 'Wait for the answer to be returned and explore it. When ready proceed by clicking next.'\n },\n fr: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Demander à l\\'agent',\n [INPUT_QUESTION]: 'Tapez \"<b>{{question}}</b>\" dans le champ de saisie et appuyez sur la touche \\'Entrée\\'',\n [WAIT_FOR_ANSWER]: 'Attendez que la réponse vous soit renvoyée et explorez-la. Lorsque vous êtes prêt, cliquez sur suivant.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_CONFIG_SELECT_CONTENT = 'guide.step-action.visual-graph-config-select-content';\n\n/**\n * @name visual-graph-config-select\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to select a visual graph configuration from the list of available configurations to open and explore it.<br>\n *\n * Select visual graph config step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-config-select.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-config-select\"\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-config-select',\n getSteps: function(options, pluginServices) {\n const translate = pluginServices.translate;\n const GuideUtils = pluginServices.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-config-table');\n\n return [\n {\n guideBlockName: 'clickable-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_CONFIG_SELECT_CONTENT),\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n url: 'graphs-visualizations',\n elementSelector,\n maxWaitTime: 10,\n disableNextFlow: true,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_CONFIG_SELECT_CONTENT]: 'Click the visual graph you just created to open and explore it.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_CONFIG_SELECT_CONTENT]: 'Cliquez sur le graphique visuel que vous venez de créer pour l\\'ouvrir et l\\'explorer.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","import * as Utils from '../utils.js';\n\nconst RESOURCE_RESULTS_ROW_EXPLAIN_TITLE = 'view.resource.title';\nconst RESOURCE_RESULTS_ROW_EXPLAIN_CONTENT = 'guide.step_plugin.resource-results-row-explain.content';\n\n/**\n * @name resource-results-row-explain\n * @memberof module:Interactive Guide\n *\n * @description\n * The `resource-results-row-explain` guide step that explains a row in the resource results table,\n * highlighting that each row represents an RDF triple consisting of a subject, predicate, and object.\n *\n * <img src=\"resources/guides/resource/resource-results-row-explain.png\"\n * style=\"height:200px; border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific options are available:\n *\n * Options:\n * @property {string|number} options.row - The row identifier used to build the element selector for the row to explain.\n *\n * @example\n * ```json\n * {\n * \"guideBlockName\": \"resource-results-row-explain\",\n * \"options\": {\n * \"row\": \"1\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'resource-results-row-explain',\n getSteps: function(options, services) {\n const GuideUtils = services.GuideUtils;\n const translate = services.translate;\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n title: translate(this.translationBundle, RESOURCE_RESULTS_ROW_EXPLAIN_TITLE),\n content: translate(this.translationBundle, RESOURCE_RESULTS_ROW_EXPLAIN_CONTENT),\n ...options,\n ...(options.skipUrl ? {} : {url: Utils.getResourceURL(options)}),\n class: 'visual_graph-row',\n elementSelector: GuideUtils.getSparqlResultsSelectorForRow(options.row)\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [RESOURCE_RESULTS_ROW_EXPLAIN_TITLE]: 'Resource',\n [RESOURCE_RESULTS_ROW_EXPLAIN_CONTENT]: 'Each row in this table represents an RDF triple, consisting of a subject, predicate, and object. These triples describe relationships between resources in the graph.'\n },\n fr: {\n [RESOURCE_RESULTS_ROW_EXPLAIN_TITLE]: 'Ressource',\n [RESOURCE_RESULTS_ROW_EXPLAIN_CONTENT]: 'Chaque ligne de ce tableau représente un triplet RDF, composé d’un sujet, d’un prédicat et d’un objet. Ces triplets décrivent les relations entre les ressources dans le graphe.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const LUCENE_CONNECTOR_NAME = 'Lucene';\nconst LUCENE_DEFAULT_TITLE = 'guide.step_plugin.connectors-lucene.title';\nconst OPEN_SPARQL = 'guide.step_plugin.connectors-lucene-open-view-sparql-query-dialog.content';\n\n/**\n * @name connectors-lucene-open-view-sparql-query-dialog\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to open the SPARQL query dialog for a specific Lucene connector instance in GraphDB.\n * It prompts the user to click on \"View SPARQL Query\" to see the query used to create the Lucene connector.\n *\n * Open Lucene connector SPARQL query dialog<br>\n * <img src=\"resources/guides/connectors/lucene/connectors-lucene-open-view-sparql-query-dialog.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"connectors-lucene-open-view-sparql-query-dialog\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'connectors-lucene-open-view-sparql-query-dialog',\n /**\n * Options:\n * - <b>instanceName</b>: string (required) – the specific instance name of the Lucene connector.\n */\n getSteps: function(options, pluginService) {\n const translate = pluginService.translate;\n\n return [{\n guideBlockName: 'connectors-open-view-sparql-query-dialog',\n options: {\n content: translate(this.translationBundle, OPEN_SPARQL),\n title: translate(this.translationBundle, LUCENE_DEFAULT_TITLE),\n ...options,\n class: 'connectors-lucene-open-view-sparql-query-dialog',\n connectorName: LUCENE_CONNECTOR_NAME,\n parameterName: 'analyzer'\n }\n }];\n },\n translationBundle: {\n en: {\n [LUCENE_DEFAULT_TITLE]: 'Lucene connector',\n [OPEN_SPARQL]: 'Click on <b>View SPARQL Query</b> to view the Lucene connector creation query.'\n },\n fr: {\n [LUCENE_DEFAULT_TITLE]: 'Connecteur Lucene',\n [OPEN_SPARQL]: 'Cliquez sur <b>Voir la requête SPARQL</b> pour afficher la requête de création du connecteur Lucene.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import {BASIC_STEP} from '../config.js';\n\n/**\n * @name hold-and-wait-until-shown\n * @memberof module:Interactive Guide\n *\n * @description\n * Holds the current step and waits until a specific element becomes visible before allowing the user to proceed.\n *\n * Hold and wait until shown example<br>\n * <img src=\"resources/guides/core/hold-and-wait-until-shown.png\" style=\"height:200px; border: solid; border-width:1px\"/><br></br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} options.elementSelectorToWait - CSS selector of the element whose visibility is being monitored to become visible.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"hold-and-wait-until-shown\",\n * \"options\": {\n * \"elementSelectorToWait\": \"#loaded-panel\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'hold-and-wait-until-shown',\n getStep: (options, services) => {\n const notOverridable = {\n type: 'readonly'\n };\n return {\n ...BASIC_STEP,\n initPreviousStep: services.GuideUtils.defaultInitPreviousStep,\n onNextValidate: () => Promise.resolve(services.GuideUtils.isVisible(options.elementSelectorToWait)),\n ...options,\n ...notOverridable\n };\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE = 'guide.step-action.sparql-search-method';\nconst SEARCH_METHOD_CONTENT = 'guide.step_plugin.sparql-search-method.content';\n\n/**\n * @name ttyg-enabling-sparql-info-message\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an informational message about enabling the SPARQL search query method in the TTYG interface.\n * It explains the benefits of using SPARQL search for datasets with good ontologies and closed-ended questions.\n *\n * Enabling SPARQL in info message<br>\n * <img src=\"resources/guides/ttyg/ttyg-enabling-sparql-info-message.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-enabling-sparql-info-message\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-enabling-sparql-info-message',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'info-message',\n options: {\n content: translate(this.translationBundle, SEARCH_METHOD_CONTENT),\n title: translate(this.translationBundle, TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE),\n class: 'info-sparql-search',\n ...options,\n url: 'ttyg'\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'SPARQL search query method',\n [SEARCH_METHOD_CONTENT]: 'Enabling SPARQL search allows the agent to answers questions by performing a SPARQL query. This works well for datasets with good ontologies and performs well on closed-ended questions, including aggregations.'\n },\n fr: {\n [TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE]: 'Méthode de recherche SPARQL',\n [SEARCH_METHOD_CONTENT]: 'L\\'activation de la recherche SPARQL permet à l\\'agent de répondre aux questions en effectuant une requête SPARQL. Cette méthode fonctionne bien pour les ensembles de données dotés d\\'une bonne ontologie et donne de bons résultats pour les questions fermées, y compris les agrégations.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","import * as Utils from '../utils.js';\n\nconst SPARQL_EDITOR_TITLE = 'view.sparql-editor.title';\nconst UNEXPECTED_ERROR = 'guide.unexpected.error.message';\n\n/**\n * @name sparql-explain-editor\n * @memberof module:Interactive Guide\n *\n * @description\n * This step provides an additional explanation for the SPARQL query editor.\n *\n * Additional explanation<br>\n * <img src=\"resources/guides/sparql-editor/sparql-explain-editor.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it requires:\n * @property {string} extraContent - The additional content to display in the editor.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"sparql-explain-editor\",\n * \"options\": {\n * \"extraContent\": \"This is an additional explanation for the SPARQL editor.\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'sparql-explain-editor',\n getSteps: function(options, services) {\n const translate = services.translate;\n return [\n {\n guideBlockName: 'input-element',\n options: {\n title: translate(this.translationBundle, SPARQL_EDITOR_TITLE),\n url: 'sparql',\n elementSelector: services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR,\n class: 'sparql-explain-editor',\n beforeShowPromise: () => services.YasguiComponentUtil.getOntotextYasguiElementAsync(Utils.SPARQL_DIRECTIVE_SELECTOR)\n .then(() => services.GuideUtils.waitFor(services.GuideUtils.CSS_SELECTORS.SPARQL_EDITOR_SELECTOR, 3))\n .then(() => services.GuideUtils.deferredShow(500)())\n .catch((error) => {\n services.toastr.error(translate(this.translationBundle, UNEXPECTED_ERROR));\n throw error;\n }),\n scrollToHandler: services.GuideUtils.scrollToTop,\n extraContent: options.extraContent,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [SPARQL_EDITOR_TITLE]: 'SPARQL Query & Update',\n [UNEXPECTED_ERROR]: 'The guide was cancelled due to an unexpected error. Please run the guide again and if the problem persists contact the support.'\n },\n fr: {\n [SPARQL_EDITOR_TITLE]: 'Requête et mise à jour SPARQL',\n [UNEXPECTED_ERROR]: 'Le guide a été annulé en raison d\\'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const TTYG_ASK_DEFAULT_TITLE = 'guide.step-action.ask-ttyg-agent';\nconst EXPLAIN_ANSWER = 'guide.step_plugin.ask-ttyg-agent.explain-answer';\nconst WAIT_FOR_ANSWER = 'guide.step_plugin.ask-ttyg-agent.wait-for-answer';\n\n/**\n * @name ttyg-explain-response\n * @memberof module:Interactive Guide\n *\n * @description\n * This step focuses on guiding the user to explain the response received from the TTYG agent.\n *\n * Click on explain button<br>\n * <img src=\"resources/guides/ttyg/ttyg-explain-response.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"ttyg-explain-response\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'ttyg-explain-response',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n const explainBtnSelector = GuideUtils.getLastGuideElementSelector('explain-response-btn');\n const elementSelector = GuideUtils.getLastGuideElementSelector('chat-item', explainBtnSelector);\n const translate = pluginService.translate;\n const title = options.title ? options.title : translate(this.translationBundle, TTYG_ASK_DEFAULT_TITLE);\n return [\n {\n // If button is not visible for some reason, skip the whole step\n guideBlockName: 'info-message',\n options: {\n url: 'ttyg',\n beforeShowPromise: (guide, currentStep) => GuideUtils.waitFor(elementSelector, 1)\n .then(() => {\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.next());\n })\n .catch(() => {\n const stepId = currentStep.id;\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => guide.show(stepId + 3));\n }),\n ...options\n }\n },\n {\n guideBlockName: 'clickable-element',\n options: {\n title,\n content: translate(this.translationBundle, EXPLAIN_ANSWER),\n class: 'explain-answer',\n disableNextFlow: true,\n ...options,\n url: 'ttyg',\n elementSelector\n }\n },\n {\n guideBlockName: 'hold-and-wait-until-hidden',\n options: {\n title,\n content: translate(this.translationBundle, WAIT_FOR_ANSWER),\n class: 'wait-for-answer',\n url: 'ttyg',\n elementSelector: GuideUtils.getGuideElementSelector('chat-details'),\n elementSelectorToWait: GuideUtils.getGuideElementSelector('question-loader'),\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Ask the agent',\n [EXPLAIN_ANSWER]: 'Explain the answer by clicking on the \\'Explain response\\' button.',\n [WAIT_FOR_ANSWER]: 'Wait for the answer to be returned and explore it. When ready proceed by clicking next.'\n },\n fr: {\n [TTYG_ASK_DEFAULT_TITLE]: 'Demander à l\\'agent',\n [EXPLAIN_ANSWER]: 'Expliquez la réponse en cliquant sur le bouton \\'Expliquer la réponse\\'',\n [WAIT_FOR_ANSWER]: 'Attendez que la réponse vous soit renvoyée et explorez-la. Lorsque vous êtes prêt, cliquez sur suivant.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const MISSING_KEY_TITLE = 'guide.step_plugin.ttyg.missing-key.title';\nconst MISSING_KEY_CONTENT = 'guide.step_plugin.ttyg.missing-key.content';\n\nconst GRAPHDB_API_KEY_PROPERTIES = [\n 'graphdb.llm.api-key',\n // deprecated\n 'graphdb.openai.api-key'\n];\n\nconst isApiKeyError = (text) => {\n return GRAPHDB_API_KEY_PROPERTIES.some((key) => text.includes(key));\n};\n\n/**\n * @name end-on-api-key-error\n * @memberof module:Interactive Guide\n *\n * @description\n * This step checks for an API key error message and ends the guide if the error is present.\n *\n * Missing OpenAI key error message<br>\n * <img src=\"resources/guides/ttyg/end-on-api-key-error.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"end-on-api-key-error\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'end-on-api-key-error',\n getSteps: function(options, pluginService) {\n const GuideUtils = pluginService.GuideUtils;\n options.mainAction = 'end-on-api-key-error';\n const translate = pluginService.translate;\n\n return [\n {\n guideBlockName: 'guide-end',\n options: {\n title: translate(this.translationBundle, MISSING_KEY_TITLE),\n content: translate(this.translationBundle, MISSING_KEY_CONTENT),\n url: 'ttyg',\n beforeShowPromise: (guide, currentStepDescription) => {\n // Check if error toast is visible waiting for 1 seconds\n return GuideUtils.waitFor('.toast-message', 1)\n .then((element) => {\n if (isApiKeyError(element.textContent)) {\n // Error toast is visible, show this step and complete on next click\n currentStepDescription.onNextClick = (guide) => {\n guide.complete();\n };\n } else {\n // Toast is not visible, but not the correct, so we go on\n setTimeout(() => {\n guide.next();\n });\n }\n })\n .catch(() => {\n // Error toast is not visible, skip this step and move to next one\n // Using a timeout because the library executes logic to show the step in a then clause which causes current and next steps to show\n setTimeout(() => {\n guide.next();\n });\n });\n },\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [MISSING_KEY_TITLE]: 'Missing OpenAI key',\n [MISSING_KEY_CONTENT]: 'To use <b>Talk to Your Graph</b>, GraphDB must first be configured to work with LLM API. Please ensure that the necessary LLM API type, url and key are in place before starting. For detailed setup instructions, refer to the documentation or contact your administrator.'\n },\n fr: {\n [MISSING_KEY_TITLE]: 'Clé OpenAI manquante',\n [MISSING_KEY_CONTENT]: 'Pour utiliser <b>Parlez à votre graphique</b>, GraphDB doit d\\'abord être configuré pour fonctionner avec l\\'API LLM. Veuillez vous assurer que le type d\\'API LLM requis, l\\'URL et la clé sont bien en place avant de commencer. Pour des instructions de configuration détaillées, reportez-vous à la documentation ou contactez votre administrateur.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_EXPLORE_TITLE = 'guide.step-action.visual-graph';\nconst VISUAL_GRAPH_ZOOM_CONTENT = 'guide.step-action.visual-graph-zoom-content';\n\n/**\n * @name visual-graph-zoom\n * @memberof module:Interactive Guide\n *\n * @description\n * This step guides the user to zoom in and out of the visual graph using the mouse wheel or touchpad.<br>\n *\n * Visual graph zoom step<br>\n * <img src=\"resources/guides/visual-graph/visual-graph-zoom.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-zoom\",\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-zoom',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const elementSelector = GuideUtils.getGuideElementSelector('graph-visualization');\n return [{\n guideBlockName: 'scroll-only-element',\n options: {\n title: translate(this.translationBundle, VISUAL_GRAPH_EXPLORE_TITLE),\n content: translate(this.translationBundle, VISUAL_GRAPH_ZOOM_CONTENT),\n url: 'graphs-visualizations',\n ...options,\n elementSelector,\n allowScroll: true\n }\n }];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Visual graph explore',\n [VISUAL_GRAPH_ZOOM_CONTENT]: 'Scrolling with the <b>mouse wheel</b> or <b>two fingers on the touchpad</b> zooms the visual graph in and out.'\n },\n fr: {\n [VISUAL_GRAPH_EXPLORE_TITLE]: 'Explorer le graphique visuel',\n [VISUAL_GRAPH_ZOOM_CONTENT]: 'Faites défiler avec la <b>molette de la souris</b> ou <b>deux doigts sur le pavé tactile</b> pour zoomer et dézoomer le graphique visuel.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n\n","const CREATE_SIMILARITY_INDEX_DEFAULT = 'guide.step-action.create-similarity-index';\nconst VIEW_CREATED_INDEX_DEFAULT = 'guide.step_plugin.similarity-view-index';\nconst VIEW_CREATED_INDEX_BY_NAME = 'guide.step_plugin.similarity-view-created-index';\n\n/**\n * @name similarity-view-created-index\n * @memberof module:Interactive Guide\n *\n * @description\n * This step highlights the newly created similarity index in the Existing Indexes table. The default index to highlight\n * is the first index, unless <code>options.rowIndex</code> is specified. If <code>options.indexName</code> is specified,\n * the step will highlight the index with the specified name.\n *\n * View the newly created similarity index<br>\n * <img src=\"resources/guides/similarity-index/similarity-view-created-index.png\" style=\"height:200px; border: solid; border-width:1px\"/><br>\n *\n * This step can be configured using the common options defined in [Options](#.Options). Additionally, it supports:\n *\n * @property {string} [options.content] - The content of the dialog.\n * @property {string} [options.title] - The title of the dialog.\n * @property {number} [options.rowIndex] - The index of the row to focus on.\n * @property {string} [options.indexName] - The name of the index to focus on.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"similarity-view-created-index\",\n * \"options\": {\n * \"title\": {\n * \"en\": \"Explore Similarity index\"\n * },\n * \"content\": \"In the <b>Existing Indexes</b> table, you can now see the <b>SpellSimIndex</b> which is the similarity index we created with the previous query.\",\n * \"rowIndex\": 1\n * }\n * }\n */\nconst step = {\n guideBlockName: 'similarity-view-created-index',\n getSteps: function(options, services) {\n const translate = services.translate;\n const GuideUtils = services.GuideUtils;\n const content = options.indexName ?\n translate(this.translationBundle, VIEW_CREATED_INDEX_BY_NAME, {indexName: options.indexName}) :\n translate(this.translationBundle, VIEW_CREATED_INDEX_DEFAULT);\n let elementSelector;\n if (options.indexName) {\n elementSelector = GuideUtils.getGuideElementSelector(`similarity-index-name-${options.indexName}`);\n } else {\n elementSelector = GuideUtils.getGuideElementSelector(`similarity-index-row-${options.rowIndex ?? 0}`, 'td:has(> .index-name)');\n }\n\n return [\n {\n guideBlockName: 'focus-element',\n options: {\n content,\n url: 'similarity',\n class: 'view-created-index',\n title: translate(this.translationBundle, CREATE_SIMILARITY_INDEX_DEFAULT),\n ...options,\n elementSelector\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Create Similarity index',\n [VIEW_CREATED_INDEX_BY_NAME]: 'In the <b>Existing Indexes</b> table, you can now see the <b>{{indexName}}</b> which is the similarity index we created with the previous query.',\n [VIEW_CREATED_INDEX_DEFAULT]: 'In the <b>Existing Indexes</b> table, you can now see the created index.'\n },\n fr: {\n [CREATE_SIMILARITY_INDEX_DEFAULT]: 'Créer un indice de similitude',\n [VIEW_CREATED_INDEX_BY_NAME]: 'Dans le tableau <b>Index existants</b>, vous pouvez maintenant voir le <b>{{indexName}}</b> qui est l\\'index de similarité que nous avons créé avec la requête précédente.',\n [VIEW_CREATED_INDEX_DEFAULT]: 'Dans le tableau <b>Index existants</b>, vous pouvez désormais voir l\\'index créé.'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","const VISUAL_GRAPH_INTRO_DEFAULT_TITLE = 'visual.graph.label';\nconst VISUAL_GRAPH_INTRO_CONTENT = 'guide.step_plugin.visual_graph_intro.content';\n\n/**\n * @name visual-graph-intro\n * @memberof module:Interactive Guide\n *\n * @description\n * The `visual-graph-intro`\n * guide step highlights the graph visualization and explains how the start node connects to other nodes.<br>\n *\n * <img src=\"resources/guides/visual-graph/visual-graph-intro.png\" style=\"height:200px;\n * border: solid; border-width:1px\"/>\n *\n * This step can be configured using the common options defined in [Options](#.Options).\n * Additionally, the following specific option is available:\n *\n * @property {string} [options.iri] - The label of the start IRI shown in the visualization.\n *\n * @example\n * ```JSON\n * {\n * \"guideBlockName\": \"visual-graph-intro\",\n * \"options\": {\n * \"iri\": \"http://example.com/my-start-node\"\n * \"iriLabel\": \"My start node\"\n * }\n * }\n * ```\n */\nconst step = {\n guideBlockName: 'visual-graph-intro',\n getSteps: function(options, services) {\n const translate = services.translate;\n\n return [\n {\n guideBlockName: 'read-only-element',\n options: {\n content: translate(this.translationBundle, VISUAL_GRAPH_INTRO_CONTENT, {iriLabel: options.iriLabel}),\n title: translate(this.translationBundle, VISUAL_GRAPH_INTRO_DEFAULT_TITLE),\n url: 'graphs-visualizations',\n elementSelector: '.graph-visualization',\n placement: 'left',\n canBePaused: false,\n ...options\n }\n }\n ];\n },\n translationBundle: {\n en: {\n [VISUAL_GRAPH_INTRO_DEFAULT_TITLE]: 'Visual graph',\n [VISUAL_GRAPH_INTRO_CONTENT]: 'The graph shows connections between the start node, <b>{{iriLabel}}</b>, and other nodes. Each arrow represents one or more connections (RDF statements).'\n },\n fr: {\n [VISUAL_GRAPH_INTRO_DEFAULT_TITLE]: 'Graphique visuel',\n [VISUAL_GRAPH_INTRO_CONTENT]: 'Le graphique montre les connexions entre le nœud de départ, <b>{{iriLabel}}</b>, et les autres nœuds. Chaque flèche représente une ou plusieurs connexions (déclarations RDF).'\n }\n }\n};\n\nexport function register(registry) {\n registry.add('guide.step', step);\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// Auto-discover and register all plugins without manual imports.\nconst ctx = import.meta.webpackContext('./', {\n recursive: true,\n // Exclude this file; include only \\*.js\n regExp: /^(?!.*\\/?plugins-bundle\\.js$).*\\.js$/,\n mode: 'sync'\n});\n\n// Resolve a usable register function from various export styles.\nfunction resolveRegister(mod) {\n if (typeof mod === 'function') {\n return mod;\n }\n if (mod && typeof mod.register === 'function') {\n return mod.register;\n }\n if (mod && typeof mod.default === 'function') {\n return mod.default;\n }\n if (mod && mod.default && typeof mod.default.register === 'function') {\n return mod.default.register;\n }\n return null;\n}\n\n// Gather all register functions in a stable order.\nconst registerFns = ctx.keys()\n .sort()\n .map((k) => resolveRegister(ctx(k)))\n .filter(Boolean);\n\n// Public API: register all discovered plugins.\nexport function register(registry) {\n for (const register of registerFns) {\n register(registry);\n }\n}\n\n"],"names":["TTYG_EDIT_AGENT_DEFAULT_TITLE","EDIT_TTYG_AGENT","step","guideBlockName","getSteps","options","pluginService","GuideUtils","translate","_objectSpread","content","this","translationBundle","title","class","disableNextFlow","url","elementSelector","getGuideElementSelector","en","_defineProperty","fr","register","registry","add","TTYG_SPARQL_SEARCH_METHOD_DEFAULT_TITLE","ENABLE_ONTOLOGY_FROM_GRAPH","clickableElementSelector","onNextValidate","Promise","resolve","isChecked","DEFAULT_TITLE","CONTENT","services","checkboxElement","autocompleteCheckboxClickEventHandler","advanceOn","undefined","beforeShowPromise","getOrWaitFor","show","guide","document","querySelector","deferredShow","then","isGuideElementChecked","next","addEventListener","onNextClick","click","hide","removeEventListener","REPOSITORIES_SELECT_REPOSITORY_DEFAULT_TITLE","CHOOSE_REPOSITORY","SELECT_REPOSITORY","SKIP_SECTION","UNEXPECTED_ERROR_MESSAGE","_options$title","repositorySelectorElement","mouseUpHandler","_this","mainAction","skipPoint","skipButtonLabel","clickOnElement","Utils","waitFor","element","error","toastr","currentStep","getCurrentStep","repositoryId","updateStepOptions","text","canBePaused","COPY_TEXT","COPY_TEXT_ELEMENT","code","createElement","innerText","dataset","test","stepHTMLElement","copy","copyToInputQueryButtonClass","className","concat","copyToInputListener","getElementSelector","textAsHtmlCodeElement","outerHTML","el","VISUAL_GRAPH_EXPLORE_TITLE","VISUAL_GRAPH_CONFIG_SAVE_CONTENT","pluginServices","CREATE_SIMILARITY_INDEX_DEFAULT","CREATE_INDEX","LUCENE_DEFAULT_TITLE","FIELD_INTRO_CONTENT","scrollOffset","SCROLL_OFFSET","CENTER","connectorName","parameterName","CONNECTORS_DEFAULT_TITLE","PARAMETER_INTRO","connectorNameSelector","getConnectorNameSelector","connectorContentSelector","getConnectorContentSelector","parameterSelector","getConnectorParameterSelector","placement","READONLY_INTRO","getStep","stepDescription","BASIC_STEP","initPreviousStep","defaultInitPreviousStep","type","maxWaitTime","GUIDE_END_TITLE","GUIDE_END_CONTENT","notOverridable","lastStep","Options","_createClass","_classCallCheck","IMPORT_FILE","VISUAL_GRAPH_CONFIG_CLICK_TAB_CONTENT","TAB_1","TAB_2","TAB_3","TAB_4","TAB_5","TAB_CONFIG","startingPoint","index","translationKey","graphExpansion","nodeBasics","edgeBasics","nodeExtra","tabConfig","tabName","tab","_document$querySelect","showOn","_element$classList","classList","contains","DISABLE_TOGGLE","toggleSelector","toggleableElementSelector","RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_TITLE","RESOURCE_CLICK_ON_VISUAL_GRAPH_BUTTON_CONTENT","skipUrl","ADD_MISSING_NAMESPACES","namespacesCheckbox","forceReload","explain","explainMore","exploreSparql","steps","push","VALUE_FILTER_INTRO","subparameterName","SIMILARITY_SEARCH_METHOD_DEFAULT_TITLE","disable","TYPES_INTRO","TTYG_DEFAULT_TITLE","CONFIGURE_USER_INSTRUCTIONS","extraContent","disablePreviousFlow","userInstructions","validateTextInput","BOOST_PROPERTIES","REPOSITORIES_CREATE_DEFAULT_TITLE","REPOSITORY_ID_CONTENT","repositoryIdInputSelector","_options$tabConfig","_options$tabConfig2","menu","showIntro","configDescription","configHint","length","forEach","START","iri","searchTerm","query","includeInferredData","expandResultsOverOwl","sampleQueryContent","shareConfig","linkLimit","expandIri","VISUAL_GRAPH_NODE_FOCUS_DEFAULT_TITLE","VISUAL_GRAPH_NODE_FOCUS_CONTENT","$rootScope","iriLabel","disableAllVisualGraphNodes","enableAllVisualGraphNodes","awaitAlphaDropD3","stepId","isVisible","previousStep","ShepherdService","getPreviousStepFromHistory","id","VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_DEFAULT_TITLE","VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_CONTENT","easyGraphInputText","LUCENE_TYPE_INTRO","TTYG_CREATE_AGENT_DEFAULT_TITLE","SAVE_AGENT_SETTINGS","FTS_METHOD_DEFAULT_TITLE","SPARQL_EDITOR_TITLE","RUN_QUERY","CSS_SELECTORS","SPARQL_RUN_BUTTON_SELECTOR","YasguiComponentUtil","getOntotextYasguiElementAsync","yasgui","scrollToHandler","scrollToTop","CONNECTORS_INTRO_CONTENT","connectorCardSelector","instanceName","REPOSITORIES_DEFAULT_TITLE","SELECT_REPO_CONTENT","_options$repositoryId","repositoryIdToSelect","selectRepositoryRowSelector","selectRepositoryButtonWrapperSelector","selectRepositoryButtonSelector","SIDE_PANEL_CONTENT","RDF_INSTANCES_TITLE","closeButtonSelector","waitUntilHidden","elementSelectorToHide","timeToWait","_abortGuide","setTimeout","SKIP_INITIAL_INDEXING","_services","ontologyGraph","sparqlQuery","EXPAND_RESULTS_CONTENT","RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_TITLE","RESOURCE_SEARCH_AUTOCOMPLETE_ITEM_CONTENT","$","trigger","REMAINING_FIELDS_INTRO","remainingFieldsSelector","TTYG_SELECT_AGENT_DEFAULT_TITLE","SELECT_AGENT","elementToObserve","dropdownToggleElement","observer","MutationObserver","mutationList","_step","_iterator","_createForOfIteratorHelper","s","n","done","mutation","value","target","err","e","f","observe","attributes","disconnect","STORED_INTRO","MISSING_REPOSITORY","currentStepId","on","off","FTS_SEARCH_CONTENT","VIEW_SPARQL_DIALOG","ENABLE_TOGGLE","shouldToggleOff","isEnabled","scrollIntoView","block","CONNECTOR_TYPE_INTRO","TABLE_GRAPH_INTRO","TABLE_GRAPH_OVERVIEW","TABLE_GRAPH_LINK","TABLE_GRAPH_ROLE_SUBJECT_CONTENT","TABLE_GRAPH_ROLE_PREDICATE_CONTENT","TABLE_GRAPH_ROLE_OBJECT_CONTENT","TABLE_GRAPH_ROLE_CONTEXT_CONTENT","TABLE_GRAPH_ROLE_ALL_CONTENT","TABLE_GRAPH_VISUAL","TABLE_GRAPH_TITLE","_options$iriLabel","_options$iriLabel2","RoutingUtil","getCurrentStepId","SPARQL_RESULTS_ROWS_SELECTOR","decodeURIComponent","getCurrentRoute","navigate","Array","isArray","subSteps","subStep","_subStep$iriLabel","_ref","_ref2","_subStep$iriLabel2","linkUrl","tableGraphLinkUrl","ROLE_KEY_BY_TYPE","subject","predicate","object","context","all","role","showRole","substring","indexOf","extraContentVisualIntro","window","history","back","maxTriplesPerCall","WAIT_FOR_INDEX","elementSelectorToWait","PROPERTY_CHAIN_INTRO_CONTENT","DOWNLOAD_RESOURCE_TITLE","RESOURCE_CONTENT","downloadButtonClass","downloadResourceListener","resourcePath","resourceFile","CONFIGURE_AGENT_NAME","$translate","instant","validateTextInputNotEmpty","CONVERSATION_WITH_AGENT_DEFAULT_TITLE","START_CONVERSATION","createChatBtnSelector","addMissingNamespaces","DOCUMENT_FILTER","CLASS_HIERARCHY_DEFAULT_TITLE","EXPLAIN_RDF_INSTANCE","focusInstance","instance","skipFromHistory","onPreviousClick","RDF_RANK_TITLE","CLICK_MAIN_MENU","MENU_SETUP_LABEL","MENU_IMPORT_LABEL","MENU_EXPLORE_LABEL","MENU_SPARQL_LABEL","MENU_LAB_LABEL","MENU_TTYG_LABEL","SUBMENU_REPOSITORIES_LABEL","SUBMENU_AUTOCOMPLETE_LABEL","SUBMENU_CONNECTORS_LABEL","SUBMENU_VISUAL_GRAPH_LABEL","SUBMENU_CLASS_HIERARCHY_LABEL","SUBMENU_CLASS_RELATIONSHIPS_LABEL","SUBMENU_SIMILARITY_LABEL","VIEW_AUTOCOMPLETE_TITLE","VIEW_CONNECTOR_MANAGEMENT_TITLE","VIEW_SPARQL_EDITOR_TITLE","VIEW_CLASS_HIERARCHY_TITLE","VIEW_CLASS_RELATIONSHIPS_TITLE","HELP_INFO_REPOSITORIES","HELP_INFO_IMPORT","HELP_INFO_AUTOCOMPLETE","HELP_INFO_CONNECTOR_MANAGEMENT","HELP_INFO_VISUAL_GRAPH","HELP_INFO_SPARQL_EDITOR","HELP_INFO_CLASS_HIERARCHY","HELP_INFO_CLASS_RELATIONSHIPS","HELP_INFO_TTYG","HELP_INFO_SIMILARITY","HELP_INFO_RDF_RANK","INTRO_CREATE_REPOSITORY","INTRO_ENABLE_AUTOCOMPLETE","INTRO_EXECUTE_SPARQL_QUERY","INTRO_VISUAL_GRAPH","INTRO_IMPORT_FILE","INTRO_CLASS_HIERARCHY","INTRO_CREATE_TTYG_AGENT","INTRO_CREATE_SIMILARITY_INDEX","INTRO_CLASS_RELATIONSHIPS","ACTION_CREATE_REPOSITORY","ACTION_ENABLE_AUTOCOMPLETE","ACTION_EXECUTE_SPARQL_QUERY","ACTION_VISUAL_GRAPH","ACTION_IMPORT_FILE","ACTION_CREATE_TTYG_AGENT","ACTION_CREATE_SIMILARITY_INDEX","ACTION_CLASS_HIERARCHY","ACTION_CLASS_RELATIONSHIPS","menuSelector","menuTitle","submenuSelector","submenuTitle","viewName","helpInfo","dialogTitle","menuDialogClass","submenuDialogClass","mainMenuClickElementPostSelector","extraContentClass","menuLabel","isGuideElementVisible","clickOnGuideElement","submenuLabel","elementSubmenuSelector","_en","_fr","OPEN_VIEW_SPARQL_DIALOG","openViewSPARQLDialogSelector","INPUT_INDEX_NAME","FACET_INTRO","startNewConversation","showInfo","newConversationStartSteps","apply","questionSteps","questions","map","questionWithOptions","QUERY_CONTENT","RESULTS_CONTENT","RESULTS_EXTRA_CONTENT","clasInstanceSelector","instanceCountSelector","focusInstances","isObject","message","urlBeforeFollowCountLink","followCountLink","location","href","showExtraCommentSparql","SPARQL_RESULTS_SELECTOR","RESOURCE_SEARCH_RDF_TITLE","RESOURCE_SEARCH_RDF_CONTENT","UPLOAD_FILE_ERROR","UNEXPECTED_FILE","filesForUploadSelectedSubscription","$interpolate","EventEmitterService","importSettingsButtonSelector","subscribe","eventData","files","some","uploadedFile","name","noNextErrorToast","cancel","allSettled","confirmDialogPromise","importButtonPromise","status","uploadFileError","SIMILARITY_CONTENT","SAVE_AGENT","translatedGuideName","infoIconHint","mouseIconHint","inputIconHint","translatedGuideDescription","VISUAL_GRAPH_EXPAND_TITLE","VISUAL_GRAPH_EXPAND_CONTENT","$route","graphVizExpandNode","dblClickFunction","reload","rulesetName","fts","VISUAL_GRAPH_CONFIG_PROPERTIES_HINT","SAVE_BUTTON","FIELD_NAME_INTRO_CONTENT","ZOOM_CLASS_CONTENT","classHierarchyZoom","OPEN_AGENT_DROPDOWN","TYPE_ONTLOGY_GRAPH","CONVERSATION_WITH_AGENT_INFO","EXPLAIN_CONTENT","fileName","resultExtraContent","TOGGLE_PREFIXES_CONTENT","_guide","TTYG_INTRO_MESSAGE","CREATE_AGENT","RESOURCE_CLICK_ON_ROLE_TITLE","GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_SUBJECT_CONTENT","GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_PREDICATE_CONTENT","GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_OBJECT_CONTENT","GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_CONTEXT_CONTENT","GUIDE_STEP_PLUGIN_RESOURCE_CLICK_ON_ROLE_ALL_CONTENT","DEFAULT_VALUE_INTRO","TTYG_EDIT_TITLE","introExtraContent","DETECT_FIELDS","IMPORT_GRAPH","GRAPHDB_REPOSITORY_CONTENT","searchInputSelector","URL","RESOURCE_RESULTS_TITLE","RESOURCE_RESULTS_EXPLAIN_CONTENT","INCLUDE_INFERRED_CONTENT","ENABLE_SPARQL_QUERY","EXPLORE_CLASS_HIERARCHY","zoomIris","zoomIri","postExtraContent","LUCENE_EXPAND_CONTENT","INVALID_VALUES_INTRO","VISUAL_GRAPH_CONFIG_SAMPLE_QUERY_CONTENT","TAB_NAME_TO_INDEX","tabIndex","OPEN_ALL_INSTANCES_IN_SPARQL","VISUAL_GRAPH_SETTINGS_SAVE_CONTENT","CONFIGURE_TOP_P","inputSelector","topP","selector","event","SELECT_AGENT_INFO","STRIP_MARKUP","CREATE_REPO_BUTTON","DROPDOWN_CONTENT","UNEXPECTED_ERROR","reject","TTYG_ASK_DEFAULT_TITLE","EXPLORE_SPARQL","exploreSparqlBtnSelector","getLastGuideElementSelector","VISUAL_GRAPH_CONFIG_SHARE_CONTENT","behavior","_options$queries","queries","overwriteQuery","queryDef","queryExtraContent","SPARQL_EDITOR_SELECTOR","getQuery","queryFromEditor","editorQuery","removeWhiteSpaces","setQuery","executeSparqlQuery","_options$disable","shouldDisable","toggleListener","checked","preventDefault","stopPropagation","SUBPARAMETER_INTRO","getConnectorSubparameterSelector","VISUAL_GRAPH_SETTINGS_CLICK_CONTENT","SET_MAX_TRIPLES_PER_CALL","EXPAND_CONNECTOR_CONTENT","connectorToggleButtonSelector","elementSelectorToShow","RESOURCE_RESULTS_CLICK_IRI_TITLE","RESOURCE_RESULTS_CLICK_IRI_CONTENT","getSparqlResultsSelectorForIri","VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_DEFAULT_TITLE","VISUAL_GRAPH_SEARCH_RDF_RESOURCES_INPUT_AUTOCOMPLETE_ITEM_CONTENT","PluginServiceInterface","key","LUCENE_CONTENT","SET_MAX_IRIS_PER_CALL","_options$maxIrisPerCa","maxIrisPerCall","maxIrisInputSelector","RDF_INSTANCES_SIDE_PANEL_INTRO","SELECT_INDEX","VISUAL_GRAPH_CONFIG_PROPERTIES_DESCRIPTION","CONFIGURE_TEMPERATURE_INFO","temperature","CLOSE_VIEW_SPARQL_DIALOG","VISUAL_GRAPH_PROPERTIES_TITLE","VISUAL_GRAPH_PROPERTIES_CONTENT","VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_TITLE","VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CONTENT","VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE_TYPES","VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT_TYPES","VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_TITLE","VISUAL_GRAPH_PROPERTIES_FOCUS_PROPERTY_CONTENT","VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_TITLE","VISUAL_GRAPH_PROPERTIES_SIDE_PANEL_CLOSE_CONTENT","mouseClickTimeStamp","mouseEventTimer","_onNodeClicked","timeStamp","clearTimeout","graphVizShowNodeInfo","onClick","focusProperties","focusProperty","property","translationIdSuffix","titleKey","contentKey","skipGenericMessage","params","VISUAL_GRAPH_SET_MAXIMUM_LINKS_CONTENT","SET_CONTEXT_WINDOW_SIZE","contextSize","DATATYPE_INTRO","webpackContext","req","webpackContextResolve","__webpack_require__","o","Error","keys","Object","module","exports","CLICK_ON_IRI","CONFIGURE_AGENT_MODEL","model","VISUAL_GRAPH_LINK_FOCUS_TITLE","VISUAL_GRAPH_LINK_FOCUS_CONTENT","fromIri","toIri","fromIriLabel","toIriLabel","VISUAL_GRAPH_CONFIG_PROPERTIES_NAME","MULTIVALUED_INTRO","INTRO_CONTENT","ANALYZED_INTRO_CONTENT","TTYG_CREATE_TITLE","editName","EXPLAIN_ANSWER_MORE","WAIT_FOR_ANSWER","explainMoreBtnSelector","TRANSFORM_INTRO_CONTENT","ENABLE_FTS_CONTENT","EXTRA_CONTENT","VISUAL_GRAPH_CONFIG_CREATE_CLICK_CONTENT","ANALYZER_INTRO","COMMON_DOM_EVENTS","SCROLL_EVENTS","createCopyToInputListener","inputElement","dispatchEvent","Event","bubbles","_configureInteractions","allowedEvents","interactable","eventsToPrevent","filter","includes","allowAll","allowEvents","SPARQL_DIRECTIVE_SELECTOR","reloadAndOpenInfoPanel","classHierarchyFocus","disableAllRDFClasses","querySelectorAll","disableSidebarInteraction","enableAllRDFClasses","remove","enableSidebarInteraction","createDownloadClickHandler","GuidesService","downloadGuidesFile","createCopyToEditorListener","getYasguiComponentUtil","sparqlDirectiveSelector","getResourceURL","encodeURIComponent","getRepositoryName","$repositories","getRepositories","find","repo","repositoryIdBase","getRepositoryElementSelector","setRepositorySelectorAutoClose","autoClose","component","addClass","removeClass","useMainMenuNavigation","OPEN_RDF_INSTANCES_SIDE_PANEL","handleDoubleClick","SHOW_DOCUMENTATION_LINK","documentationLink","documentationPath","resolveDocumentationUrl","VISUAL_GRAPH_CONFIG_STARTING_POINT_SEARCH_CONTENT","VISUAL_GRAPH_CONFIG_STARTING_POINT_FIXED_CONTENT","VISUAL_GRAPH_CONFIG_STARTING_POINT_QUERY_CONTENT","STARTING_POINT_CONFIG","search","fixed","config","SPARQL_RESULT_CONTENT","SPARQL_VISUAL_BUTTON_SELECTOR","COPY_TO_EDITOR","QUERY_EDITOR_CONTENT","copyToEditorButtonClass","copyToEditorListener","queryAsHtmlCodeElement","_queryFromEditor","_options$methods","shouldEditName","hasModelName","hasUserInstructions","shouldConfigureExtractionMethods","methods","shouldConfigureContextSize","shouldConfigureTopP","shouldConfigureTemperature","shouldConfigureIriDiscoverySearch","iriDiscoverySearch","method","configureExtractionMethods","LANGUAGES_INTRO","COMPUTE_FILL","computeRDFRankButtonSelector","INDEXED_INTRO","INPUT_QUESTION","question","shiftKey","ctrlKey","VISUAL_GRAPH_CONFIG_SELECT_CONTENT","RESOURCE_RESULTS_ROW_EXPLAIN_TITLE","RESOURCE_RESULTS_ROW_EXPLAIN_CONTENT","getSparqlResultsSelectorForRow","row","OPEN_SPARQL","SEARCH_METHOD_CONTENT","EXPLAIN_ANSWER","explainBtnSelector","MISSING_KEY_TITLE","MISSING_KEY_CONTENT","GRAPHDB_API_KEY_PROPERTIES","currentStepDescription","textContent","complete","VISUAL_GRAPH_ZOOM_CONTENT","allowScroll","VIEW_CREATED_INDEX_DEFAULT","VIEW_CREATED_INDEX_BY_NAME","_options$rowIndex","indexName","rowIndex","VISUAL_GRAPH_INTRO_DEFAULT_TITLE","VISUAL_GRAPH_INTRO_CONTENT","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","d","definition","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","ctx","import","registerFns","sort","k","mod","Boolean"],"sourceRoot":""}