graphdb-workbench 3.2.0-TR4 → 3.2.0-TR5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/12358.d1b5130917702cb0dd25.bundle.js +3 -0
  2. package/dist/12358.d1b5130917702cb0dd25.bundle.js.map +1 -0
  3. package/dist/{12396.a1b7856e86d52282f34c.bundle.js → 12396.bb3eab12cf754ea62ada.bundle.js} +2 -2
  4. package/dist/{12396.a1b7856e86d52282f34c.bundle.js.map → 12396.bb3eab12cf754ea62ada.bundle.js.map} +1 -1
  5. package/dist/{15535.c58319cba275ee5baa90.bundle.js → 15535.18ede9f56483a38d1305.bundle.js} +2 -2
  6. package/dist/{15535.c58319cba275ee5baa90.bundle.js.map → 15535.18ede9f56483a38d1305.bundle.js.map} +1 -1
  7. package/dist/{16162.2dc986d04777c8ae9489.bundle.js → 16162.68c4cc2feee685642217.bundle.js} +2 -2
  8. package/dist/{16162.2dc986d04777c8ae9489.bundle.js.map → 16162.68c4cc2feee685642217.bundle.js.map} +1 -1
  9. package/dist/19402.151ce1287c14531436c3.bundle.js +2 -0
  10. package/dist/19402.151ce1287c14531436c3.bundle.js.map +1 -0
  11. package/dist/{20287.7cfc312df157f5bdea97.bundle.js → 20287.a67ba9468f3f83219558.bundle.js} +2 -2
  12. package/dist/{20287.7cfc312df157f5bdea97.bundle.js.map → 20287.a67ba9468f3f83219558.bundle.js.map} +1 -1
  13. package/dist/{21136.67a9bcf4bb0c201d3fd1.bundle.js → 21136.514ac00d21a54514a7b6.bundle.js} +2 -2
  14. package/dist/{21136.67a9bcf4bb0c201d3fd1.bundle.js.map → 21136.514ac00d21a54514a7b6.bundle.js.map} +1 -1
  15. package/dist/{21142.7f8327c28d939fa26009.bundle.js → 21142.5e08154738dc30c2aa36.bundle.js} +2 -2
  16. package/dist/{21142.7f8327c28d939fa26009.bundle.js.map → 21142.5e08154738dc30c2aa36.bundle.js.map} +1 -1
  17. package/dist/{21170.cecdf25699f68d4cf749.bundle.js → 21170.1122ab4c938b88301ba7.bundle.js} +2 -2
  18. package/dist/{21170.cecdf25699f68d4cf749.bundle.js.map → 21170.1122ab4c938b88301ba7.bundle.js.map} +1 -1
  19. package/dist/{21195.e2c1fc69631041b97f8e.bundle.js → 21195.4067ec470e04250ed006.bundle.js} +2 -2
  20. package/dist/{21195.e2c1fc69631041b97f8e.bundle.js.map → 21195.4067ec470e04250ed006.bundle.js.map} +1 -1
  21. package/dist/{25747.c3dc5503ad696af5d5a3.bundle.js → 25747.c6c83a72c5ff93451064.bundle.js} +2 -2
  22. package/dist/{25747.c3dc5503ad696af5d5a3.bundle.js.map → 25747.c6c83a72c5ff93451064.bundle.js.map} +1 -1
  23. package/dist/{27580.d038d43102a3e9eec97d.bundle.js → 27580.0219349c709de4b5a0f4.bundle.js} +2 -2
  24. package/dist/{27580.d038d43102a3e9eec97d.bundle.js.map → 27580.0219349c709de4b5a0f4.bundle.js.map} +1 -1
  25. package/dist/{31636.fc6eba63d6d985d31673.bundle.js → 31636.191bd3c9ed0e3fb62007.bundle.js} +2 -2
  26. package/dist/{31636.fc6eba63d6d985d31673.bundle.js.map → 31636.191bd3c9ed0e3fb62007.bundle.js.map} +1 -1
  27. package/dist/{32489.e9af1ec463e2d4136732.bundle.js → 32489.468bcab006cd04c016c7.bundle.js} +2 -2
  28. package/dist/{32489.e9af1ec463e2d4136732.bundle.js.map → 32489.468bcab006cd04c016c7.bundle.js.map} +1 -1
  29. package/dist/{34495.06c9997d58d0b0ba7152.bundle.js → 34495.9b2a1410b1782a381a1e.bundle.js} +2 -2
  30. package/dist/{34495.06c9997d58d0b0ba7152.bundle.js.map → 34495.9b2a1410b1782a381a1e.bundle.js.map} +1 -1
  31. package/dist/36665.6bc77ded61aedb454c6e.bundle.js +2 -0
  32. package/dist/36665.6bc77ded61aedb454c6e.bundle.js.map +1 -0
  33. package/dist/{38360.ca92a04a1afcf9cfea7f.bundle.js → 38360.3714f16105c232cbf498.bundle.js} +2 -2
  34. package/dist/{38360.ca92a04a1afcf9cfea7f.bundle.js.map → 38360.3714f16105c232cbf498.bundle.js.map} +1 -1
  35. package/dist/{38644.29dbfb38e4089efa6697.bundle.js → 38644.f34d9227543727bec695.bundle.js} +2 -2
  36. package/dist/{38644.29dbfb38e4089efa6697.bundle.js.map → 38644.f34d9227543727bec695.bundle.js.map} +1 -1
  37. package/dist/{38843.4b11f56e93f60fbe4e0a.bundle.js → 38843.1ed4c0d2657b5fb9ed8a.bundle.js} +2 -2
  38. package/dist/{38843.4b11f56e93f60fbe4e0a.bundle.js.map → 38843.1ed4c0d2657b5fb9ed8a.bundle.js.map} +1 -1
  39. package/dist/{39518.c577d83ed591fada064c.bundle.js → 39518.52135a04a886f95c5801.bundle.js} +2 -2
  40. package/dist/{39518.c577d83ed591fada064c.bundle.js.map → 39518.52135a04a886f95c5801.bundle.js.map} +1 -1
  41. package/dist/{39539.463ec29e136b100c0abe.bundle.js → 39539.351f1fe10b21f949a885.bundle.js} +2 -2
  42. package/dist/{39539.463ec29e136b100c0abe.bundle.js.map → 39539.351f1fe10b21f949a885.bundle.js.map} +1 -1
  43. package/dist/40516.7db0da5332b68a1cb0a4.bundle.js +2 -0
  44. package/dist/40516.7db0da5332b68a1cb0a4.bundle.js.map +1 -0
  45. package/dist/{41453.241761ce8ff75036e5e0.bundle.js → 41453.c082b58753e157b39bf9.bundle.js} +2 -2
  46. package/dist/{41453.241761ce8ff75036e5e0.bundle.js.map → 41453.c082b58753e157b39bf9.bundle.js.map} +1 -1
  47. package/dist/{42129.f67dc6029cdab567bf54.bundle.js → 42129.6877bc3354f3413916f2.bundle.js} +2 -2
  48. package/dist/{42129.f67dc6029cdab567bf54.bundle.js.map → 42129.6877bc3354f3413916f2.bundle.js.map} +1 -1
  49. package/dist/{44444.a1b29c2329c7d4a39cc5.bundle.js → 44444.2b282777f2e1424a03b1.bundle.js} +2 -2
  50. package/dist/{44444.a1b29c2329c7d4a39cc5.bundle.js.map → 44444.2b282777f2e1424a03b1.bundle.js.map} +1 -1
  51. package/dist/{55862.1c3f1e807c8a05b1b6ed.bundle.js → 55862.f591817372ceb94a4cd2.bundle.js} +2 -2
  52. package/dist/{55862.1c3f1e807c8a05b1b6ed.bundle.js.map → 55862.f591817372ceb94a4cd2.bundle.js.map} +1 -1
  53. package/dist/{58306.a45182d200e3f8793644.bundle.js → 58306.b82da84fcad5ac12087a.bundle.js} +2 -2
  54. package/dist/{58306.a45182d200e3f8793644.bundle.js.map → 58306.b82da84fcad5ac12087a.bundle.js.map} +1 -1
  55. package/dist/64118.b15383c12c5bdf6d907f.bundle.js +2 -0
  56. package/dist/64118.b15383c12c5bdf6d907f.bundle.js.map +1 -0
  57. package/dist/{67888.e21c0e4c70be6214fcd7.bundle.js → 67888.927a2d7905f79d2f5bb4.bundle.js} +2 -2
  58. package/dist/{67888.e21c0e4c70be6214fcd7.bundle.js.map → 67888.927a2d7905f79d2f5bb4.bundle.js.map} +1 -1
  59. package/dist/{72379.cb41e26c33271a25816e.bundle.js → 72379.d21e40131b7e44c75eba.bundle.js} +2 -2
  60. package/dist/{72379.cb41e26c33271a25816e.bundle.js.map → 72379.d21e40131b7e44c75eba.bundle.js.map} +1 -1
  61. package/dist/{73667.ad957853dba08fd3be30.bundle.js → 73667.0921baf2ddc28806feca.bundle.js} +2 -2
  62. package/dist/{73667.ad957853dba08fd3be30.bundle.js.map → 73667.0921baf2ddc28806feca.bundle.js.map} +1 -1
  63. package/dist/{73793.79a311b387e5db776506.bundle.js → 73793.f61f6800eea64549ae30.bundle.js} +2 -2
  64. package/dist/{73793.79a311b387e5db776506.bundle.js.map → 73793.f61f6800eea64549ae30.bundle.js.map} +1 -1
  65. package/dist/{75282.8be5dde957dc6452c86a.bundle.js → 75282.06a7373dccbf2b056731.bundle.js} +2 -2
  66. package/dist/{75282.8be5dde957dc6452c86a.bundle.js.map → 75282.06a7373dccbf2b056731.bundle.js.map} +1 -1
  67. package/dist/{75849.0f6bab8b5749be998286.bundle.js → 75849.6ae9e20cdb3fbe4018a4.bundle.js} +2 -2
  68. package/dist/{75849.0f6bab8b5749be998286.bundle.js.map → 75849.6ae9e20cdb3fbe4018a4.bundle.js.map} +1 -1
  69. package/dist/{78250.dd9bdc3db3ca0c84b25a.bundle.js → 78250.41373d9ae256b6730c8e.bundle.js} +2 -2
  70. package/dist/{78250.dd9bdc3db3ca0c84b25a.bundle.js.map → 78250.41373d9ae256b6730c8e.bundle.js.map} +1 -1
  71. package/dist/{79329.24a5e42cccee5055311a.bundle.js → 79329.936a7b8d31824b46a180.bundle.js} +2 -2
  72. package/dist/{79329.24a5e42cccee5055311a.bundle.js.map → 79329.936a7b8d31824b46a180.bundle.js.map} +1 -1
  73. package/dist/{82926.02f08566fe1f948d9e1f.bundle.js → 82926.3236f3a40da860eebf37.bundle.js} +2 -2
  74. package/dist/{82926.02f08566fe1f948d9e1f.bundle.js.map → 82926.3236f3a40da860eebf37.bundle.js.map} +1 -1
  75. package/dist/85609.4e7aa94beab1fc123db2.bundle.js +2 -0
  76. package/dist/85609.4e7aa94beab1fc123db2.bundle.js.map +1 -0
  77. package/dist/{9062.e1ad16e157f04b8c9dd8.bundle.js → 9062.ff0f38917b9553efad03.bundle.js} +2 -2
  78. package/dist/{9062.e1ad16e157f04b8c9dd8.bundle.js.map → 9062.ff0f38917b9553efad03.bundle.js.map} +1 -1
  79. package/dist/{99448.93e01a6a24e4a1cb0546.bundle.js → 99448.10fc24b7ebab10d3c7ce.bundle.js} +2 -2
  80. package/dist/{99448.93e01a6a24e4a1cb0546.bundle.js.map → 99448.10fc24b7ebab10d3c7ce.bundle.js.map} +1 -1
  81. package/dist/index.html +8 -8
  82. package/dist/js/angular/clustermanagement/templates/cluster-nodes-configuration.html +1 -1
  83. package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +1 -1
  84. package/dist/js/angular/core/directives/dynamic-form/templates/dynamic-form.html +1 -1
  85. package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +1 -1
  86. package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
  87. package/dist/js/angular/core/directives/shuttle-multiselect/templates/shuttle-multiselect.html +1 -1
  88. package/dist/js/angular/core/directives/yasgui-component/templates/yasgui-component.html +1 -1
  89. package/dist/js/angular/core/templates/cookie-policy/cookie-consent.html +1 -1
  90. package/dist/js/angular/core/templates/cookie-policy/cookie-policy.html +1 -1
  91. package/dist/js/angular/core/templates/editable-content/editable-content.html +1 -1
  92. package/dist/js/angular/core/templates/markdown-content/markdown-content.html +1 -1
  93. package/dist/js/angular/core/templates/search-resource-input.html +1 -1
  94. package/dist/js/angular/graphql/templates/create-graphql-endpoint.html +2 -2
  95. package/dist/js/angular/graphql/templates/graphql-endpoint-management.html +1 -1
  96. package/dist/js/angular/graphql/templates/graphql-playground.html +1 -1
  97. package/dist/js/angular/graphql/templates/modal/endpoint-configuration-modal.html +1 -1
  98. package/dist/js/angular/graphql/templates/modal/endpoint-generation-failure-result-modal.html +1 -1
  99. package/dist/js/angular/graphql/templates/modal/import-endpoint-definition-modal.html +1 -1
  100. package/dist/js/angular/security/templates/user.html +2 -2
  101. package/dist/js/angular/ttyg/templates/agent-list.html +1 -1
  102. package/dist/js/angular/ttyg/templates/agent-select-menu.html +1 -1
  103. package/dist/js/angular/ttyg/templates/chat-item-detail.html +1 -1
  104. package/dist/js/angular/ttyg/templates/chat-list.html +1 -1
  105. package/dist/js/angular/ttyg/templates/chat-panel.html +1 -1
  106. package/dist/js/angular/ttyg/templates/modal/agent-instructions-explain-modal.html +1 -1
  107. package/dist/js/angular/ttyg/templates/modal/agent-settings-modal.html +2 -2
  108. package/dist/js/angular/ttyg/templates/modal/external-integration-configuration-modal.html +1 -1
  109. package/dist/js/angular/ttyg/templates/no-agents-view.html +1 -1
  110. package/dist/js/angular/ttyg/templates/ttyg.html +1 -1
  111. package/dist/{legacyWorkbench.ecf6300fd72cfffbcdb6.js → legacyWorkbench.1e8b6faf7df3096cdb57.js} +3 -3
  112. package/dist/{legacyWorkbench.ecf6300fd72cfffbcdb6.js.map → legacyWorkbench.1e8b6faf7df3096cdb57.js.map} +1 -1
  113. package/dist/pages/aclmanagement.html +2 -2
  114. package/dist/pages/autocomplete.html +1 -1
  115. package/dist/pages/choose-repository-type.html +1 -1
  116. package/dist/pages/cluster-management/clusterInfo.html +3 -3
  117. package/dist/pages/create-index.html +1 -1
  118. package/dist/pages/dependencies.html +1 -1
  119. package/dist/pages/domainRangeInfo.html +2 -2
  120. package/dist/pages/edit.html +1 -1
  121. package/dist/pages/explore.html +1 -1
  122. package/dist/pages/export.html +1 -1
  123. package/dist/pages/find.html +1 -1
  124. package/dist/pages/graph-config/saveGraphConfig.html +8 -8
  125. package/dist/pages/graphs-visualizations.html +7 -7
  126. package/dist/pages/guides.html +1 -1
  127. package/dist/pages/import.html +2 -2
  128. package/dist/pages/jdbc-create.html +1 -1
  129. package/dist/pages/login.html +1 -1
  130. package/dist/pages/monitor/backup-and-restore.html +1 -1
  131. package/dist/pages/monitor/queries.html +1 -1
  132. package/dist/pages/monitor/resources.html +1 -1
  133. package/dist/pages/namespaces.html +2 -2
  134. package/dist/pages/not_found.html +1 -1
  135. package/dist/pages/plugins.html +1 -1
  136. package/dist/pages/rdfClassHierarchyInfo.html +7 -7
  137. package/dist/pages/rdfrank.html +2 -2
  138. package/dist/pages/repositories.html +1 -1
  139. package/dist/pages/repository.html +1 -1
  140. package/dist/pages/similarity-indexes.html +1 -1
  141. package/dist/pages/sparql-editor.html +1 -1
  142. package/dist/pages/sparql-template-create.html +1 -1
  143. package/dist/pages/ux-test1.html +2 -2
  144. package/dist/pages/webapi.html +2 -2
  145. package/dist/res/swagger5/index.html +11 -11
  146. package/package.json +1 -1
  147. package/dist/12358.4be185f89eebea9c35bf.bundle.js +0 -3
  148. package/dist/12358.4be185f89eebea9c35bf.bundle.js.map +0 -1
  149. package/dist/19402.7f6ea977348338acc824.bundle.js +0 -2
  150. package/dist/19402.7f6ea977348338acc824.bundle.js.map +0 -1
  151. package/dist/36665.69d43b057bcfc55df3b5.bundle.js +0 -2
  152. package/dist/36665.69d43b057bcfc55df3b5.bundle.js.map +0 -1
  153. package/dist/40516.3cfaf1ff4704c038f944.bundle.js +0 -2
  154. package/dist/40516.3cfaf1ff4704c038f944.bundle.js.map +0 -1
  155. package/dist/64118.edc8ed6671017d09ff4e.bundle.js +0 -2
  156. package/dist/64118.edc8ed6671017d09ff4e.bundle.js.map +0 -1
  157. package/dist/85609.68438b4955212d5fcb84.bundle.js +0 -2
  158. package/dist/85609.68438b4955212d5fcb84.bundle.js.map +0 -1
  159. /package/dist/{12358.4be185f89eebea9c35bf.bundle.js.LICENSE.txt → 12358.d1b5130917702cb0dd25.bundle.js.LICENSE.txt} +0 -0
  160. /package/dist/{legacyWorkbench.ecf6300fd72cfffbcdb6.js.LICENSE.txt → legacyWorkbench.1e8b6faf7df3096cdb57.js.LICENSE.txt} +0 -0
@@ -0,0 +1,3 @@
1
+ /*! For license information please see 12358.d1b5130917702cb0dd25.bundle.js.LICENSE.txt */
2
+ export const __webpack_id__=12358;export const __webpack_ids__=[3909,12358,42618,43319,62062,78508,81801,87054];export const __webpack_modules__={3909:()=>{function e(){return{restrict:"E",require:"ngModel",scope:{ngModel:"=",ngDisabled:"=",placeholder:"@"},templateUrl:"js/angular/core/templates/editable-content/editable-content.html",link:function(e,t,n,a){const o=t.find("div"),i=()=>{e.ngDisabled||e.$apply(()=>{o.html().length&&!o.text().trim().length&&o.empty(),a.$setViewValue(o[0].innerText)})};a.$render=()=>{o.html(a.$viewValue||"")};const r=e=>{e.preventDefault();const t=(e.originalEvent||e).clipboardData.getData("text/plain"),n=window.getSelection();if(!n.rangeCount)return;n.deleteFromDocument();const a=n.getRangeAt(0),o=document.createDocumentFragment(),i=t.split("\n");i.forEach((e,t)=>{o.appendChild(document.createTextNode(e)),t<i.length-1&&o.appendChild(document.createElement("br"))}),a.insertNode(o),n.collapseToEnd()};e.$on("$destroy",()=>{o.off("blur keyup change input",i),o.off("paste",r)}),o.on("blur keyup change input",i),o.on("paste",r)}}}angular.module("graphdb.framework.core.directives.editable-content",[]).directive("editableContent",e),e.$inject=[]},7928:(e,t,n)=>{n.r(t);var a=n(71920),o=n(76076);function i(e,t){return{restrict:"E",templateUrl:"js/angular/ttyg/templates/no-agents-view.html",scope:{},link:n=>{n.canModifyAgent=!1,n.talkToGraphDocumentationLink=o.DocumentationUrlResolver.getDocumentationUrl(t.productShortVersion,"talk-to-graph.html"),n.onCreateAgent=()=>{e.emit(a.TTYGEventName.OPEN_AGENT_SETTINGS)};const i=[];i.push(e.onCanUpdateAgentUpdated(e=>{n.canModifyAgent=e})),n.$on("$destroy",()=>{i.forEach(e=>e())})}}}angular.module("graphdb.framework.ttyg.directives.no-agents-view",[]).directive("noAgentsView",i),i.$inject=["TTYGContextService","productInfo"]},12358:(e,t,n)=>{n.r(t),n(60039),n(13815),n(29350),n(44874),n(7928),n(62062),n(78508),n(95953),n(36665);var a=n(71920),o=(n(87054),n(70826)),i=n(28319),r=n(19402),s=n(51490),c=n(38940),l=n(11695),d=n(76752),g=n(43319),h=n(69937),m=n(81801),T=n(45458),p=n(36633),u=n(57154);function E(e,t,n,E,v,C,A,f,_,N,y,b,S,G,I){const R=[],w={filter_all:A.instant("ttyg.agent.btn.filter.all")};let O;E.helpTemplateUrl="js/angular/ttyg/templates/chatInfo.html",E.isHelpVisible=!1,E.showChats=!0,E.showAgents=!1,E.chats=void 0,E.loadingChats=!1,E.loadingChat=!1,E.initialized=!1,E.agents=void 0,E.selectedAgent=void 0,E.loadingAgents=!1,E.reloadingAgents=!1,E.connectorID=void 0,E.canModifyAgent=!1,E.agentListFilterModel=[],E.activeRepositoryList=[],E.onopen=E.onclose=()=>angular.noop(),E.startNewChat=()=>{G.getChats().containsNewChats()||G.deselectChat()},E.toggleChatsListSidebar=()=>{E.showChats=!E.showChats},E.toggleAgentsListSidebar=()=>{E.showAgents=!E.showAgents},E.onToggleHelp=()=>{E.isHelpVisible=!E.isHelpVisible},E.onExportSelectedChat=()=>{$(G.getSelectedChat())};const L=()=>{const e=G.getDefaultAgent();return e?Promise.resolve(e):S.getDefaultAgent().then(e=>(G.setDefaultAgent(e),e))};E.onOpenNewAgentSettings=()=>{L().then(e=>{const t=(0,l.repositoryInfoMapper)(_.getActiveRepositoryObject());e.repositoryId=t.id;const n=(0,s.agentFormModelMapper)(new i.AgentModel({}),e,o.AGENT_OPERATION.CREATE);return{templateUrl:"js/angular/ttyg/templates/modal/agent-settings-modal.html",controller:"AgentSettingsModalController",windowClass:"agent-settings-modal",backdrop:"static",resolve:{dialogModel:function(){return new g.AgentSettingsModal(t,E.activeRepositoryList,n,o.AGENT_OPERATION.CREATE)}},size:"lg"}}).then(e=>{f.open(e).result.then(Y)}).catch(e=>{N.error(getError(e,0,o.TTYG_ERROR_MSG_LENGTH))})},E.onOpenAgentSettings=e=>{let t=e;t||(t=G.getSelectedAgent()),L().then(e=>{const n=(0,s.agentFormModelMapper)(t,e,o.AGENT_OPERATION.EDIT),a=(0,l.repositoryInfoMapper)(_.getActiveRepositoryObject());return{templateUrl:"js/angular/ttyg/templates/modal/agent-settings-modal.html",controller:"AgentSettingsModalController",windowClass:"agent-settings-modal",backdrop:"static",resolve:{dialogModel:function(){return new g.AgentSettingsModal(a,E.activeRepositoryList,n,o.AGENT_OPERATION.EDIT)}},size:"lg"}}).then(e=>{f.open(e).result.then(e=>{const t=G.getSelectedAgent();t&&e.id===t.id&&G.selectAgent(e),Y()})}).catch(e=>{N.error(getError(e,0,o.TTYG_ERROR_MSG_LENGTH))})},E.onOpenCloneAgentSettings=e=>{L().then(t=>{const n=(0,s.agentFormModelMapper)(e,t,o.AGENT_OPERATION.CLONE);n.name=`clone-${n.name}`;const a=(0,l.repositoryInfoMapper)(_.getActiveRepositoryObject());return{templateUrl:"js/angular/ttyg/templates/modal/agent-settings-modal.html",controller:"AgentSettingsModalController",windowClass:"agent-settings-modal",backdrop:"static",resolve:{dialogModel:function(){return new g.AgentSettingsModal(a,E.activeRepositoryList,n,o.AGENT_OPERATION.CLONE)}},size:"lg"}}).then(e=>{f.open(e).result.then(e=>{const t=G.getSelectedAgent();t&&e.id===t.id&&G.selectAgent(e),Y()})}).catch(e=>{N.error(getError(e,0,o.TTYG_ERROR_MSG_LENGTH))})};const M=()=>(E.loadingChats=!0,S.getConversations().then(e=>G.updateChats(e)).catch(e=>{N.error(getError(e,0,o.TTYG_ERROR_MSG_LENGTH)),U(new r.ChatsListModel)}).finally(()=>{E.loadingChats=!1})),Y=()=>(E.reloadingAgents=!0,S.getAgents().then(e=>G.updateAgents(e)).catch(e=>{N.error(getError(e,0,o.TTYG_ERROR_MSG_LENGTH))}).finally(()=>{E.reloadingAgents=!1})),D=()=>{G.setCanModifyAgent(e.isRepoManager())},k=(e,t,n)=>{if(e.timestamp=n.timestamp,t.answers=t.answers||[],t.answers.push(...n.messages),G.updateSelectedChat(e),n.continueRunId)G.emit(a.TTYGEventName.CONTINUE_CHAT_RUN,new T.ContinueChatRun(t,n.continueRunId));else{const t=G.getChats();t.updateChatTimestamp(e.id,n.timestamp),t.updateChatName(e.id,n.chatName),e.name=n.name,G.updateChats(t),G.emit(a.TTYGEventName.LAST_MESSAGE_RECEIVED,e)}},U=e=>{e.isEmpty()?E.showChats=!1:(E.showChats=!0,G.getSelectedChat()||I.getChatId()||G.selectChat(E.chats.getFirstChat()))},$=e=>{S.exportConversation(e.id).then(function({data:t,filename:n}){(0,d.saveAs)(t,n),G.emit(a.TTYGEventName.CHAT_EXPORT_SUCCESSFUL,e)}).catch(()=>{G.emit(a.TTYGEventName.CHAT_EXPORT_FAILURE),N.error(A.instant("ttyg.chat.messages.export_failure"))})},F=()=>{const e=_.getActiveRepository(),t=_.getLocalReadableGraphdbRepositories().map(t=>new i.AgentListFilterModel(t.id,t.id,t.id===e));E.agentListFilterModel=[new i.AgentListFilterModel(o.AGENTS_FILTER_ALL_KEY,w.filter_all),...t]},H=(e,t,n)=>{if(e!==_.getActiveRepository()){const a=_.getRepository(e);a&&y.openConfirmationModal({title:A.instant("common.confirm"),message:(0,h.Gz)(A.instant(t,{repositoryId:a.id})),confirmButtonKey:"ttyg.chat_panel.btn.proceed.label"},()=>{_.setRepository(a),x(n)})}else x(n)},x=e=>{t.open(e,"_blank")},P=e=>{t.open(`/sparql?query=${encodeURIComponent(e)}&execute=true`,"_blank")},j=()=>{const e=I.getChatId(),t=G.getChats();e&&t.getChat(e)&&G.selectChat(G.getChats().getChat(e))};R.push(E.$watch(E.getActiveRepositoryObject,e=>{const t=(0,u.service)(u.AuthenticationService);e&&!t.hasGqlRights(e)&&(E.activeRepositoryList=_.getLocalReadableGraphdbRepositories().map(e=>new c.SelectMenuOptionsModel({value:e.id,label:e.id,data:{repository:e}})),((e=!0)=>(E.loadingAgents=e,S.getAgents().then(e=>G.updateAgents(e)).catch(e=>{N.error(getError(e,0,o.TTYG_ERROR_MSG_LENGTH))}).finally(()=>{E.loadingAgents=!1})))().then(()=>(E.initialized=!0,F(),M())).then(j),D())}),G.onSelectedChatChanged(e=>{O=void 0,e&&!e.isNew()?S.getConversation(e.id).then(t=>{G.updateSelectedChat(t),I.saveChat(e)}).catch(t=>{t.status===m.status.NOT_FOUND&&((e=>{y.openModalAlert({title:A.instant("ttyg.chat.dialog.chat_is_missing.title"),message:A.instant("ttyg.chat.dialog.chat_is_missing.body")}).result.then(function(){G.deleteChat(e)})})(e),G.emit(a.TTYGEventName.LOAD_CHAT_FAILURE,e))}):e&&G.updateSelectedChat(e)}),G.onChatsListChanged(e=>{E.chats=e,U(e)}),G.onCanUpdateAgentUpdated(e=>{E.canModifyAgent=e}),G.subscribe(G.onAgentsListChanged(e=>{E.agents=e})),G.subscribe(a.TTYGEventName.CREATE_CHAT,e=>{S.createChat(e).then(t=>{const n=r.ChatModel.getNewChat();n.name="New chat",n.id=t,G.createChat(n),I.saveChat(n),e.chatId=t,G.emit(a.TTYGEventName.ASK_QUESTION,e)}).catch(e=>{G.emit(a.TTYGEventName.CREATE_CHAT_FAILURE),N.error(getError(e,0,o.TTYG_ERROR_MSG_LENGTH))})}),G.subscribe(a.TTYGEventName.RENAME_CHAT,e=>{S.renameConversation(e).then(()=>{G.emit(a.TTYGEventName.RENAME_CHAT_SUCCESSFUL),G.emit(a.TTYGEventName.LOAD_CHATS)}).catch(()=>{G.emit(a.TTYGEventName.RENAME_CHAT_FAILURE),N.error(A.instant("ttyg.chat.messages.rename_failure"))})}),G.subscribe(a.TTYGEventName.DELETE_CHAT,e=>{G.emit(a.TTYGEventName.DELETING_CHAT,{chatId:e.id,inProgress:!0}),S.deleteConversation(e.id).then(()=>{G.emit(a.TTYGEventName.DELETE_CHAT_SUCCESSFUL,e);const t=G.getChats();t.deleteChat(e),G.updateChats(t)}).catch(()=>{G.emit(a.TTYGEventName.DELETE_CHAT_FAILURE),N.error(A.instant("ttyg.chat.messages.delete_failure"))}).finally(()=>G.emit(a.TTYGEventName.DELETING_CHAT,{chatId:e.id,inProgress:!1}))}),G.subscribe(a.TTYGEventName.CANCEL_PENDING_QUESTION,e=>{const t=e.chatId||G.getSelectedChat().id;O=S.cancelPendingQuestion(t).then(e=>(G.emit(a.TTYGEventName.PENDING_QUESTION_CANCELED_SUCCESSFUL),e)).catch(e=>(G.emit(a.TTYGEventName.CANCEL_PENDING_QUESTION_FAILURE),e))}),G.subscribe(a.TTYGEventName.CHAT_EXPORT,$),G.subscribe(a.TTYGEventName.ASK_QUESTION,e=>{G.emit(a.TTYGEventName.ASK_QUESTION_STARTING),O=void 0,S.askQuestion(e).then(t=>{const n=G.getSelectedChat();if(n&&n.id===e.chatId){if(n.isNew()){n.new=!1;const e=G.getChats();e.setChatAsOld(n.id),G.updateChats(e)}((e,t,n)=>{O?O.then(a=>{const o=G.getSelectedChat();o&&o.id!==t.chatId||(new p.ChatMessageModel({message:a.data.message,status:a.data.runStatus,isTerminalState:!0,tokenUsageInfo:n.tokenUsageInfo}).addToChatAnswer(n),e.chatHistory.appendItem(t),k(e,t,n))}):(e.chatHistory.appendItem(t),k(e,t,n))})(n,e,t)}}).catch(e=>{G.emit(a.TTYGEventName.ASK_QUESTION_FAILURE),N.error(getError(e,0,o.TTYG_ERROR_MSG_LENGTH))})}),G.subscribe(a.TTYGEventName.CONTINUE_CHAT_RUN,e=>{S.continueChatRun(e).then(t=>{const n=e.chatId,a=G.getSelectedChat();if(a&&a.id===n){const e=a.chatHistory.items,n=e[e.length-1];k(a,n,t)}}).catch(e=>{G.emit(a.TTYGEventName.ASK_QUESTION_FAILURE),N.error(getError(e,0,o.TTYG_ERROR_MSG_LENGTH))})}),G.subscribe(a.TTYGEventName.LOAD_CHATS,M),G.subscribe(a.TTYGEventName.OPEN_AGENT_SETTINGS,E.onOpenNewAgentSettings),G.subscribe(a.TTYGEventName.EDIT_AGENT,E.onOpenAgentSettings),G.subscribe(a.TTYGEventName.CLONE_AGENT,E.onOpenCloneAgentSettings),G.subscribe(a.TTYGEventName.DELETE_AGENT,e=>{G.emit(a.TTYGEventName.DELETING_AGENT,{agentId:e.id,inProgress:!0}),S.deleteAgent(e.id).then(()=>Y()).then(()=>{G.emit(a.TTYGEventName.AGENT_DELETED,e),E.selectedAgent&&E.selectedAgent.id===e.id&&(E.selectedAgent=void 0)}).catch(e=>{N.error(getError(e,0,o.TTYG_ERROR_MSG_LENGTH))}).finally(()=>{G.emit(a.TTYGEventName.DELETING_AGENT,{agentId:e.id,inProgress:!1})})}),G.subscribe(a.TTYGEventName.AGENT_SELECTED,e=>{E.selectedAgent=e}),G.subscribe(a.TTYGEventName.GO_TO_CREATE_SIMILARITY_VIEW,e=>{H(e.repositoryId,"ttyg.agent.create_agent_modal.dialog.confirm_repository_change_before_open_similarity.body","similarity/index/create")}),G.subscribe(a.TTYGEventName.GO_TO_AUTOCOMPLETE_INDEX_VIEW,e=>{H(e.repositoryId,"ttyg.agent.create_agent_modal.dialog.confirm_repository_change_before_open_autocomplete_index.body","autocomplete")}),G.subscribe(a.TTYGEventName.GO_TO_CONNECTORS_VIEW,e=>{H(e.repositoryId,"ttyg.agent.create_agent_modal.dialog.confirm_repository_change_before_open_connectors.body","connectors")}),G.subscribe(a.TTYGEventName.GO_TO_SPARQL_EDITOR,e=>{if(e.repositoryId!==_.getActiveRepository()){const t=_.getRepository(e.repositoryId);t&&y.openConfirmation(A.instant("common.confirm"),(0,h.Gz)(A.instant("ttyg.chat_panel.dialog.confirm_repository_change.body",{repositoryId:e.repositoryId})),()=>{_.setRepository(t),P(e.query)})}else P(e.query)}),n.$on("$translateChangeSuccess",()=>{w.filter_all=A.instant("ttyg.agent.btn.filter.all"),F()}),n.$on("securityInit",D)),E.$on("$destroy",function(){R.forEach(e=>e()),G.resetContext()})}angular.module("graphdb.framework.ttyg.controllers.ttyg-view",["toastr","graphdb.framework.utils.localstorageadapter","graphdb.framework.core.services.ttyg-service","graphdb.framework.ttyg.services.ttygcontext","graphdb.framework.ttyg.services.ttygstorage","graphdb.framework.ttyg.directives.chat-list","graphdb.framework.ttyg.directives.chat-panel","graphdb.framework.ttyg.directives.agent-list","graphdb.framework.ttyg.directives.agent-select-menu","graphdb.framework.ttyg.directives.no-agents-view","graphdb.framework.ttyg.directives.show-tooltip-on-overflow","graphdb.framework.ttyg.controllers.agent-settings-modal","graphdb.framework.core.directives.help-info-popover"]).controller("TTYGViewCtrl",E),E.$inject=["$jwtAuth","$window","$rootScope","$scope","$http","$timeout","$translate","$uibModal","$repositories","toastr","ModalService","LocalStorageAdapter","TTYGService","TTYGContextService","TTYGStorageService"]},13815:(e,t,n)=>{n.r(t),n(64118),n(3909);var a=n(71920),o=n(36633),i=n(63415),r=n(98980),s=n(69937);function c(e,t,n){return{restrict:"E",templateUrl:"js/angular/ttyg/templates/chat-panel.html",link:(e,c,l)=>{e.chat=void 0,e.selectedAgent=void 0,e.chatItem=void 0,e.askingChatItem=void 0,e.waitingForLastMessage=!1,e.loadingChat=!0,e.showCancelButton=!1,e.ask=()=>{e.chatItem.question.timestamp=Date.now(),e.askingChatItem=(0,r.cloneDeep)(e.chatItem),e.chatItem.chatId?g(e.chatItem):d(),e.chatItem=T(),u(),p()},e.cancelPendingQuestion=()=>{e.showCancelButton=!1,n.emit(a.TTYGEventName.CANCEL_PENDING_QUESTION,e.chatItem)},e.regenerateQuestion=t=>{const n=T();n.setQuestionMessage(t.getQuestionMessage()),n.question.timestamp=Date.now(),e.askingChatItem=n,g(n),u()},e.onKeypressOnInput=t=>{e.askingChatItem||"Enter"!==t.key||t.shiftKey||t.ctrlKey||e.ask()},e.onAskHowDeliveredAnswer=()=>{const n=T();n.setQuestionMessage(t.instant("ttyg.chat_panel.btn.derive_answer.label")),n.question.timestamp=Date.now(),e.askingChatItem=(0,r.cloneDeep)(n),g(n),u()},e.getAgentName=e=>{const a=n.getAgent(e);return a?a.name:(0,s.Gz)(t.instant("ttyg.chat_panel.deleted_agent"))};const d=()=>{n.emit(a.TTYGEventName.CREATE_CHAT,e.chatItem)},g=e=>{n.emit(a.TTYGEventName.ASK_QUESTION,e)},h=t=>{e.waitingForLastMessage=t,e.showCancelButton=t},m=()=>{e.chatItem=(0,r.cloneDeep)(e.askingChatItem),e.askingChatItem=void 0,h(!1)},T=()=>{const t=new i.ChatItemModel;return t.question=new o.ChatMessageModel({role:o.CHAT_MESSAGE_ROLE.USER}),e.chat&&(t.chatId=e.chat.id),e.selectedAgent&&(t.agentId=e.selectedAgent.id),t},p=()=>{setTimeout(()=>{const e=document.querySelector(".question-input");e&&e.focus()})},u=()=>{setTimeout(()=>{const e=c.find(".chat-details")[0];e&&(e.scrollTop=e.scrollHeight)})},E=()=>{e.chat=void 0,e.loadingChat=!1,e.chatItem=T(),e.askingChatItem=void 0,h(!1),p()},v=[e.$watchCollection("chat.chatHistory.items",u),n.onSelectedChatUpdated(t=>{if(e.chat=t,!e.chat||e.chat.isNew())return;e.loadingChat=!1;const a=e.chatItem.question.message;if(e.chatItem=T(),e.chatItem.question.message=a,e.askingChatItem=void 0,e.chat){const t=e.chat.chatHistory.getLast();t&&t.agentId&&n.selectAgent(n.getAgent(t.agentId))}p()}),n.onLastMessageReceived(()=>{h(!1)}),n.onSelectedAgentChanged(t=>{e.selectedAgent=t,e.selectedAgent&&e.chatItem&&(e.chatItem.agentId=e.selectedAgent.id),p()}),n.onSelectedChatChanged(t=>{t?(e.loadingChat=!t.isNew(),e.chatItem=T(),h(!1),p()):E()}),n.subscribe(a.TTYGEventName.LOAD_CHAT_FAILURE,()=>{e.loadingChat=!1,e.chatItem=T(),p()}),n.subscribe(a.TTYGEventName.ASK_QUESTION_FAILURE,m),n.subscribe(a.TTYGEventName.CREATE_CHAT_FAILURE,m),n.subscribe(a.TTYGEventName.DELETE_CHAT_SUCCESSFUL,t=>{e.chat&&t.id===e.chat.id&&E()}),n.subscribe(a.TTYGEventName.ASK_QUESTION_STARTING,()=>{h(!0)})];e.$on("$destroy",()=>{v.forEach(e=>e())}),e.chatItem=T(),p()}}}angular.module("graphdb.framework.ttyg.directives.chat-panel",["graphdb.framework.ttyg.directives.chat-item-detail","graphdb.framework.core.directives.editable-content"]).directive("chatPanel",c),c.$inject=["toastr","$translate","TTYGContextService"]},29350:(e,t,n)=>{n.r(t);var a=n(69937),o=n(71920);function i(e,t,n,i,r){return{restrict:"E",templateUrl:"js/angular/ttyg/templates/agent-list.html",scope:{agentList:"=",agentListFilterModel:"="},link:(i,s,c)=>{i.selectedAgent=void 0,i.selectedAgentsFilter=void 0,i.deletingAgent=void 0,i.onEditAgent=t=>{e.emit(o.TTYGEventName.EDIT_AGENT,t)},i.onExternalIntegration=e=>{r.open(e)},i.onCloneAgent=t=>{e.emit(o.TTYGEventName.CLONE_AGENT,t)},i.onDeleteAgent=i=>{const r=n.instant("ttyg.agent.delete_agent_modal.title"),s=(0,a.Gz)(n.instant("ttyg.agent.delete_agent_modal.body",{agentName:i.name}));t.openConfirmation(r,s,()=>e.emit(o.TTYGEventName.DELETE_AGENT,i))},i.onAgentsFilterChange=e=>{i.selectedAgentsFilter=e,i.selectedAgentsFilter&&i.agentList.filterByRepository(i.selectedAgentsFilter.key)};const l=()=>{const e=i.agentListFilterModel.find(e=>e.selected);i.selectedAgentsFilter=e||i.agentListFilterModel[0],i.onAgentsFilterChange(i.selectedAgentsFilter)},d=[];d.push(i.$watch("agentListFilterModel",l)),d.push(e.subscribe(o.TTYGEventName.DELETING_AGENT,e=>{i.deletingAgent=e})),d.push(e.onSelectedAgentChanged(e=>{i.selectedAgent=e})),i.$on("$destroy",()=>{d.forEach(e=>e())}),l()}}}n(84430),angular.module("graphdb.framework.ttyg.directives.agent-list",["graphdb.framework.ttyg.services.externalIntegrationModal"]).directive("agentList",i),i.$inject=["TTYGContextService","ModalService","$translate","$uibModal","ExternalIntegrationModalService"]},42618:()=>{function e(e){return{restrict:"E",scope:{fieldName:"@",source:"=",onSave:"&",onCancel:"&",onClick:"&",onDblclick:"&",isEditing:"="},templateUrl:"js/angular/core/directives/inline-editable-text/templates/inline-editable-text.template.html",link:function(t,n){t.editableModel={};const a=[];let o;t.onKeydown=e=>{"Enter"===e.key?(r(),t.editableModel.text!==t.text&&t.onSave({newText:t.editableModel.text,source:t.source})):"Escape"===e.key&&i()},t.onCancelEditing=()=>{i()},t.onSelect=()=>{o?(r(),t.onDblclick({source:t.source})):o=e(function(){t.onClick({source:t.source}),r()},250)};const i=()=>{r(),t.onCancel()},r=()=>{e.cancel(o),o=void 0};a.push(t.$watch("isEditing",a=>{a&&(t.editableModel.text=t.source[t.fieldName],e(()=>{const e=n.find("input")[0];e.focus(),e.select()},0))})),t.$on("$destroy",()=>{a.forEach(e=>e()),r()})}}}angular.module("graphdb.framework.core.directives.inline-editable-text",[]).directive("inlineEditableText",e),e.$inject=["$timeout"]},43319:(e,t,n)=>{n.r(t),n.d(t,{AgentSettingsModal:()=>a});class a{constructor(e,t,n,a){this.activeRepositoryInfo=e,this.activeRepositoryList=t,this.agentFormModel=n,this.operation=a}}},44874:(e,t,n)=>{n.r(t);var a=n(38940),o=n(71920);function i(e,t,n,i,r){return{restrict:"E",templateUrl:"js/angular/ttyg/templates/agent-select-menu.html",scope:{},link:n=>{n.agentOptionsList=[],n.selectedAgent=void 0,n.onAgentSelected=(a,c)=>{if(!c.isCompatible)return a.stopPropagation(),void a.preventDefault();if(s(c),r.saveAgent(c),n.selectedAgent=c,e.selectAgent(c),c.isRepositoryDeleted){const n=t.instant("ttyg.agent.agent_select_menu.configure_agent_modal.title"),a=t.instant("ttyg.agent.agent_select_menu.configure_agent_modal.body");i.openConfirmation(n,a,()=>e.emit(o.TTYGEventName.EDIT_AGENT,c))}};const s=e=>{n.agentOptionsList.forEach(t=>{t.selected=t.data.agent===e})},c=e=>{s(e),n.selectedAgent=e},l=[];l.push(e.onAgentsListChanged(t=>{var o;o=t,n.agentOptionsList=o.agents.map(e=>new a.SelectMenuOptionsModel({value:e.id,label:e.name,data:{agent:e}})),(()=>{let t;const a=r.getAgentId();a&&n.agentOptionsList.forEach(e=>{e.data.agent.id===a&&(t=e.data.agent)}),!t&&n.agentOptionsList[0]&&(t=n.agentOptionsList[0].data.agent),c(t),e.selectAgent(t)})()})),l.push(e.subscribe(o.TTYGEventName.AGENT_DELETED,t=>{n.selectedAgent&&n.selectedAgent.id===t.id&&(n.selectedAgent.isDeleted=!0,e.selectAgent(n.selectedAgent))})),l.push(e.onSelectedAgentChanged(c)),n.$on("$destroy",()=>{l.forEach(e=>e())})}}}angular.module("graphdb.framework.ttyg.directives.agent-select-menu",[]).directive("agentSelectMenu",i),i.$inject=["TTYGContextService","$translate","$sce","ModalService","TTYGStorageService"]},60039:(e,t,n)=>{n.r(t),n(42618);var a=n(71920),o=n(65820),i=n(69937);function r(e,t,n,r){return{restrict:"E",templateUrl:"js/angular/ttyg/templates/chat-list.html",link:s=>{s.selectedChat=void 0,s.renamedChat=void 0,s.deletingChat=void 0,s.onSelectChatForRenaming=e=>{s.renamedChat=e},s.onSelectChat=t=>{if(!s.selectedChat||s.selectedChat.id!==t.id){const n=e.getChats().getNonPersistedChat();n&&e.deleteChat(n),e.selectChat(t),s.renamedChat=void 0}},s.onDeleteChat=o=>{const r=n.instant("ttyg.dialog.delete.title"),s=(0,i.Gz)(n.instant("ttyg.dialog.delete.body",{chatName:o.name}));t.openConfirmation(r,s,()=>e.emit(a.TTYGEventName.DELETE_CHAT,o))},s.onRenameChat=(t,n)=>{n.name=t,s.renamedChat=void 0,e.emit(a.TTYGEventName.RENAME_CHAT,n)},s.onExportChat=t=>{e.emit(a.TTYGEventName.CHAT_EXPORT,t)},s.onCancelChatRenaming=()=>{s.renamedChat=void 0},s.getHumanReadableChatGroupTimestamp=e=>(0,o.getHumanReadableTimestamp)(n,r,e);const c=e=>{s.selectedChat=e},l=[];l.push(e.onSelectedChatChanged(c)),l.push(e.onSelectedChatUpdated(c)),l.push(e.onChatsListChanged(e=>{s.chatList=e})),l.push(e.subscribe(a.TTYGEventName.DELETING_CHAT,e=>{s.deletingChat=e})),s.$on("$destroy",()=>{l.forEach(e=>e())})}}}angular.module("graphdb.framework.ttyg.directives.chat-list",["graphdb.framework.core.directives.inline-editable-text"]).directive("chatList",r),r.$inject=["TTYGContextService","ModalService","$translate","$filter"]},62062:()=>{angular.module("graphdb.framework.ttyg.directives.show-tooltip-on-overflow",[]).directive("showTooltipOnOverflow",function(){return{link:function(e,t){setTimeout(function(){const n=t[0].querySelector(".editable-text-element");n&&(n.scrollWidth>n.clientWidth?t.attr("title",e.chat.name):t.removeAttr("title"))},0)}}})},76752:function(e,t,n){var a,o=o||function(e){if("undefined"==typeof navigator||!/MSIE [1-9]\./.test(navigator.userAgent)){var t=e.document,n=function(){return e.URL||e.webkitURL||e},a=t.createElementNS("http://www.w3.org/1999/xhtml","a"),o=e.webkitRequestFileSystem,i=e.requestFileSystem||o||e.mozRequestFileSystem,r=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},s="application/octet-stream",c=0,l=function(t){var a=function(){"string"==typeof t?n().revokeObjectURL(t):t.remove()};e.chrome?a():setTimeout(a,500)},d=function(e,t,n){for(var a=(t=[].concat(t)).length;a--;){var o=e["on"+t[a]];if("function"==typeof o)try{o.call(e,n||e)}catch(e){r(e)}}},g=function(e){return/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob(["\ufeff",e],{type:e.type}):e},h=function(t,r){t=g(t);var h,m,T,p=this,u=t.type,E=!1,v=function(){d(p,"writestart progress write writeend".split(" "))},C=function(){!E&&h||(h=n().createObjectURL(t)),m?m.location.href=h:null==e.open(h,"_blank")&&"undefined"!=typeof safari&&(e.location.href=h),p.readyState=p.DONE,v(),l(h)},A=function(e){return function(){if(p.readyState!==p.DONE)return e.apply(this,arguments)}},f={create:!0,exclusive:!1};if(p.readyState=p.INIT,r||(r="download"),a)return h=n().createObjectURL(t),a.href=h,a.download=r,void setTimeout(function(){var e,t;e=a,t=new MouseEvent("click"),e.dispatchEvent(t),v(),l(h),p.readyState=p.DONE});e.chrome&&u&&u!==s&&(T=t.slice||t.webkitSlice,t=T.call(t,0,t.size,s),E=!0),o&&"download"!==r&&(r+=".download"),(u===s||o)&&(m=e),i?(c+=t.size,i(e.TEMPORARY,c,A(function(e){e.root.getDirectory("saved",f,A(function(e){var n=function(){e.getFile(r,f,A(function(e){e.createWriter(A(function(n){n.onwriteend=function(t){m.location.href=e.toURL(),p.readyState=p.DONE,d(p,"writeend",t),l(e)},n.onerror=function(){var e=n.error;e.code!==e.ABORT_ERR&&C()},"writestart progress write abort".split(" ").forEach(function(e){n["on"+e]=p["on"+e]}),n.write(t),p.abort=function(){n.abort(),p.readyState=p.DONE},p.readyState=p.WRITING}),C)}),C)};e.getFile(r,{create:!1},A(function(e){e.remove(),n()}),A(function(e){e.code===e.NOT_FOUND_ERR?n():C()}))}),C)}),C)):C()},m=h.prototype;return"undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob?function(e,t){return navigator.msSaveOrOpenBlob(g(e),t)}:(m.abort=function(){var e=this;e.readyState=e.DONE,d(e,"abort")},m.readyState=m.INIT=0,m.WRITING=1,m.DONE=2,m.error=m.onwritestart=m.onprogress=m.onwrite=m.onabort=m.onerror=m.onwriteend=null,function(e,t){return new h(e,t)})}}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this.content);e.exports?e.exports.saveAs=o:null!==n.amdD&&null!=n.amdO&&(void 0===(a=function(){return o}.apply(t,[]))||(e.exports=a))},78508:()=>{angular.module("graphdb.framework.core.directives.help-info-popover",[]).directive("helpInfoPopover",function(){return{restrict:"E",scope:{helpInfo:"="},templateUrl:"js/angular/ttyg/templates/modal/helpInfoPopoverTemplate.html",link:function(e,t){e.isPopoverOpen=!1;const n=()=>{e.$apply(()=>{e.isPopoverOpen=!0})},a=()=>{e.$apply(()=>{e.isPopoverOpen=!1})};t.on("mouseenter",n),t.on("mouseleave",a),e.$on("$destroy",function(){t.off("mouseenter",n),t.off("mouseleave",a)})}}})},81801:(e,t,n)=>{n.r(t),n.d(t,{status:()=>a});const a={BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,CONFLICT:409,INTERNAL_SERVER_ERROR:500,SERVICE_UNAVAILABLE:503}},87054:()=>{function e(e,t){const n={agent:{id:void 0},chat:{id:void 0}},a=()=>{let a=e.get(t.TTYG);return a||(a=n),a.agent||(a.agent={}),a.chat||(a.chat={}),a};return{saveAgent:function(n){const o=a();o.agent.id=n?n.id:void 0,e.set(t.TTYG,o)},getAgentId:function(){const e=a();if(e.agent)return e.agent.id},saveChat:function(n){const o=a();o.chat.id=n?n.id:void 0,e.set(t.TTYG,o)},getChatId:function(){const e=a();if(e.chat)return e.chat.id}}}angular.module("graphdb.framework.ttyg.services.ttygstorage",[]).factory("TTYGStorageService",e),e.$inject=["LocalStorageAdapter","LSKeys"]}};
3
+ //# sourceMappingURL=12358.d1b5130917702cb0dd25.bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"12358.d1b5130917702cb0dd25.bundle.js","mappings":"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","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/core/directives/editable-content/editable-content.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/directives/no-agents-view.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/controllers/ttyg-view.controller.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/directives/chat-panel.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/directives/agent-list.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/core/directives/inline-editable-text/inline-editable-text.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/model/agent-settings-modal.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/directives/agent-select-menu.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/directives/chat-list.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/directives/show-tooltip-on-overflow.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/lib/FileSaver-patch.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/directives/help-info-popover.directive.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/models/http-status.js","webpack://root-config/./packages/legacy-workbench/src/js/angular/ttyg/services/ttyg-storage.service.js"],"sourcesContent":["/**\n * @ngdoc directive\n * @name editableContent\n * @module graphdb.framework.core.directives.editable-content\n * @restrict E\n * @description\n * A reusable contenteditable directive bound to an ngModel. It allows editable plain-text input and supports disabling and placeholder text.\n *\n * @param {string} ngModel - The model to bind contenteditable input to.\n * @param {boolean=} ngDisabled - Disables the contenteditable field when true.\n * @param {string=} placeholder - Placeholder text to show when input is empty.\n */\nconst modules = [];\n\nangular\n .module('graphdb.framework.core.directives.editable-content', modules)\n .directive('editableContent', editableContent);\n\neditableContent.$inject = [];\n\nfunction editableContent() {\n return {\n restrict: 'E',\n require: 'ngModel',\n scope: {\n ngModel: '=',\n ngDisabled: '=',\n placeholder: '@'\n },\n templateUrl: 'js/angular/core/templates/editable-content/editable-content.html',\n link: function(scope, element, attrs, ngModelCtrl) {\n\n // =========================\n // Private variables\n // =========================\n\n const editableDiv = element.find('div');\n\n // =========================\n // Private functions\n // =========================\n\n /**\n * Updates the bound ngModel with the current contenteditable value.\n * Also clears invalid HTML when only whitespace remains.\n */\n const updateModelValue = () => {\n if (!scope.ngDisabled) {\n scope.$apply(() => {\n if (editableDiv.html().length && !editableDiv.text().trim().length) {\n // Fixes a problem with the placeholder when type some word and delete it.\n editableDiv.empty();\n }\n ngModelCtrl.$setViewValue(editableDiv[0].innerText);\n });\n }\n };\n\n /**\n * Renders the model value into the contenteditable element.\n */\n ngModelCtrl.$render = () => {\n editableDiv.html(ngModelCtrl.$viewValue || '');\n };\n\n /**\n * Handles paste events in the contenteditable element by inserting plain text only.\n * Prevents the default paste behavior and manually inserts the clipboard text as plain text,\n * preserving line breaks by converting them to <br> elements.\n *\n * @param {Event} event - The paste event object containing clipboard data.\n */\n const pasteHandler = (event) => {\n event.preventDefault();\n\n const text = (event.originalEvent || event).clipboardData.getData('text/plain');\n const selection = window.getSelection();\n\n if (!selection.rangeCount) return;\n\n selection.deleteFromDocument();\n const range = selection.getRangeAt(0);\n const fragment = document.createDocumentFragment();\n const lines = text.split('\\n');\n\n lines.forEach((line, index) => {\n fragment.appendChild(document.createTextNode(line));\n if (index < lines.length - 1) {\n fragment.appendChild(document.createElement('br'));\n }\n });\n\n range.insertNode(fragment);\n selection.collapseToEnd();\n }\n\n // =========================\n // Subscriptions\n // =========================\n\n /**\n * Unsubscribes from all watchers and event listeners to prevent memory leaks.\n */\n const removeAllSubscribers = () => {\n editableDiv.off('blur keyup change input', updateModelValue);\n editableDiv.off('paste', pasteHandler);\n };\n\n scope.$on('$destroy', removeAllSubscribers);\n editableDiv.on('blur keyup change input', updateModelValue);\n editableDiv.on('paste', pasteHandler)\n }\n };\n}\n","import {TTYGEventName} from \"../services/ttyg-context.service\";\nimport {DocumentationUrlResolver} from \"../../utils/documentation-url-resolver\";\n\nangular\n .module('graphdb.framework.ttyg.directives.no-agents-view', [])\n .directive('noAgentsView', NoAgentsView);\n\nNoAgentsView.$inject = ['TTYGContextService', 'productInfo'];\n\nfunction NoAgentsView(TTYGContextService, productInfo) {\n return {\n restrict: 'E',\n templateUrl: 'js/angular/ttyg/templates/no-agents-view.html',\n scope: {\n },\n link: ($scope) => {\n\n // =========================\n // Public variables\n // =========================\n\n $scope.canModifyAgent = false;\n $scope.talkToGraphDocumentationLink = DocumentationUrlResolver.getDocumentationUrl(productInfo.productShortVersion, 'talk-to-graph.html');\n\n // =========================\n // Public functions\n // =========================\n\n $scope.onCreateAgent = () => {\n TTYGContextService.emit(TTYGEventName.OPEN_AGENT_SETTINGS);\n };\n\n // =========================\n // Private functions\n // =========================\n\n const onCanUpdateAgentUpdated = (canModifyAgent) => {\n $scope.canModifyAgent = canModifyAgent;\n };\n\n // =========================\n // Subscriptions\n // =========================\n const subscriptions = [];\n\n const onDestroy = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n subscriptions.push(TTYGContextService.onCanUpdateAgentUpdated(onCanUpdateAgentUpdated));\n $scope.$on('$destroy', onDestroy);\n }\n };\n}\n","import 'angular/ttyg/directives/chat-list.directive';\nimport 'angular/ttyg/directives/chat-panel.directive';\nimport 'angular/ttyg/directives/agent-list.directive';\nimport 'angular/ttyg/directives/agent-select-menu.directive';\nimport 'angular/ttyg/directives/no-agents-view.directive';\nimport 'angular/ttyg/directives/show-tooltip-on-overflow.directive';\nimport 'angular/ttyg/directives/help-info-popover.directive';\nimport 'angular/ttyg/controllers/agent-settings-modal.controller';\nimport 'angular/core/services/ttyg.service';\nimport 'angular/ttyg/services/ttyg-context.service';\nimport 'angular/ttyg/services/ttyg-storage.service';\nimport {TTYGEventName} from '../services/ttyg-context.service';\nimport {AGENT_OPERATION, AGENTS_FILTER_ALL_KEY, TTYG_ERROR_MSG_LENGTH} from '../services/constants';\nimport {AgentListFilterModel, AgentModel} from '../../models/ttyg/agents';\nimport {ChatModel, ChatsListModel} from '../../models/ttyg/chats';\nimport {agentFormModelMapper} from '../services/agents.mapper';\nimport {SelectMenuOptionsModel} from '../../models/form-fields';\nimport {repositoryInfoMapper} from '../../rest/mappers/repositories-mapper';\nimport {saveAs} from 'lib/FileSaver-patch';\nimport {AgentSettingsModal} from \"../model/agent-settings-modal\";\nimport {decodeHTML} from \"../../../../app\";\nimport {status as httpStatus} from \"../../models/http-status\";\nimport {ContinueChatRun} from \"../../models/ttyg/chat-answer\";\nimport {ChatMessageModel} from \"../../models/ttyg/chat-message\";\nimport {service, AuthenticationService} from \"@ontotext/workbench-api\";\n\nconst modules = [\n 'toastr',\n 'graphdb.framework.utils.localstorageadapter',\n 'graphdb.framework.core.services.ttyg-service',\n 'graphdb.framework.ttyg.services.ttygcontext',\n 'graphdb.framework.ttyg.services.ttygstorage',\n 'graphdb.framework.ttyg.directives.chat-list',\n 'graphdb.framework.ttyg.directives.chat-panel',\n 'graphdb.framework.ttyg.directives.agent-list',\n 'graphdb.framework.ttyg.directives.agent-select-menu',\n 'graphdb.framework.ttyg.directives.no-agents-view',\n 'graphdb.framework.ttyg.directives.show-tooltip-on-overflow',\n 'graphdb.framework.ttyg.controllers.agent-settings-modal',\n 'graphdb.framework.core.directives.help-info-popover',\n];\n\nangular\n .module('graphdb.framework.ttyg.controllers.ttyg-view', modules)\n .controller('TTYGViewCtrl', TTYGViewCtrl);\n\nTTYGViewCtrl.$inject = [\n '$jwtAuth',\n '$window',\n '$rootScope',\n '$scope',\n '$http',\n '$timeout',\n '$translate',\n '$uibModal',\n '$repositories',\n 'toastr',\n 'ModalService',\n 'LocalStorageAdapter',\n 'TTYGService',\n 'TTYGContextService',\n 'TTYGStorageService'];\n\nfunction TTYGViewCtrl(\n $jwtAuth,\n $window,\n $rootScope,\n $scope,\n $http,\n $timeout,\n $translate,\n $uibModal,\n $repositories,\n toastr,\n ModalService,\n LocalStorageAdapter,\n TTYGService,\n TTYGContextService,\n TTYGStorageService) {\n // =========================\n // Private variables\n // =========================\n\n const subscriptions = [];\n\n const labels = {\n filter_all: $translate.instant('ttyg.agent.btn.filter.all'),\n };\n\n /**\n * A promise that resolves when the active question cancellation completes,\n * or rejects if the cancellation fails.\n */\n let pendingQuestionCancelingPromise;\n\n /**\n * This is not translated, because the back-end sends it like this.\n * When the page is refreshed, any unnamed chat will be called \"New chat\",\n * regardless of the user selected language.\n * @type {string}\n */\n const newChatDefaultName = 'New chat';\n\n // =========================\n // Public variables\n // =========================\n\n $scope.helpTemplateUrl = \"js/angular/ttyg/templates/chatInfo.html\";\n\n /**\n * Controls the visibility of the help panel.\n * @type {boolean}\n */\n $scope.isHelpVisible = false;\n\n /**\n * Controls the visibility of the chats list sidebar. By default, it is visible unless there are no chats.\n * @type {boolean}\n */\n $scope.showChats = true;\n\n /**\n * Controls the visibility of the agents list sidebar.\n * @type {boolean}\n */\n $scope.showAgents = false;\n\n /**\n * Chats list.\n * @type {ChatsListModel|undefined}\n */\n $scope.chats = undefined;\n\n /**\n * Flag to control the visibility of the loader when loading chat list.\n * @type {boolean}\n */\n $scope.loadingChats = false;\n\n $scope.loadingChat = false;\n\n /**\n * Flag controls when component is initialized.\n * @type {boolean}\n */\n $scope.initialized = false;\n\n /**\n * Agents list model.\n * @type {AgentListModel|undefined}\n */\n $scope.agents = undefined;\n\n /**\n * The model of the selected agent.\n * @type {AgentModel|undefined}\n */\n $scope.selectedAgent = undefined;\n\n /**\n * Flag to control the visibility of the loader when loading agent list on initial page load.\n * @type {boolean}\n */\n $scope.loadingAgents = false;\n\n /**\n * Flag to control the visibility of the loader when reloading agent list.\n * @type {boolean}\n */\n $scope.reloadingAgents = false;\n\n $scope.connectorID = undefined;\n\n /**\n * A flag that determines whether buttons that modify an agent should be disabled.\n * @type {boolean}\n */\n $scope.canModifyAgent = false;\n\n /**\n * A list of available repository IDs as a model for the agent list filter.\n * @type {AgentListFilterModel[]}\n */\n $scope.agentListFilterModel = [];\n\n /**\n * A list with the active repositories that is used in child components.\n * @type {string[]}\n */\n $scope.activeRepositoryList = [];\n\n // =========================\n // Public functions\n // =========================\n\n // Needed by the slidepanel directive\n $scope.onopen = $scope.onclose = () => angular.noop();\n\n /**\n * Creates a new chat and selects it.\n */\n $scope.startNewChat = () => {\n if (!TTYGContextService.getChats().containsNewChats()) {\n TTYGContextService.deselectChat();\n }\n };\n\n /**\n * Toggles the visibility of the chats list sidebar.\n */\n $scope.toggleChatsListSidebar = () => {\n $scope.showChats = !$scope.showChats;\n };\n\n /**\n * Toggles the visibility of the agents list sidebar.\n */\n $scope.toggleAgentsListSidebar = () => {\n $scope.showAgents = !$scope.showAgents;\n };\n\n /**\n * Handles the help message toggle event.\n */\n $scope.onToggleHelp = () => {\n $scope.isHelpVisible = !$scope.isHelpVisible;\n };\n\n /**\n * Handles the export of a chat by calling the service and updating the chats list.\n */\n $scope.onExportSelectedChat = () => {\n onExportChat(TTYGContextService.getSelectedChat());\n };\n\n /**\n * Gets the default agent from the TTYGContextService or fetches it from the server if not available.\n *\n * @return {Promise<AgentModel>} A promise that resolves to the default agent.\n */\n const getDefaultAgent = () => {\n const defaultAgent = TTYGContextService.getDefaultAgent();\n if (defaultAgent) {\n return Promise.resolve(defaultAgent);\n } else {\n return TTYGService.getDefaultAgent()\n .then((response) => {\n TTYGContextService.setDefaultAgent(response);\n return response;\n });\n }\n };\n\n /**\n * Configures and opens the modal for creating a new agent.\n */\n $scope.onOpenNewAgentSettings = () => {\n getDefaultAgent()\n .then((agentDefaultValues) => {\n const activeRepositoryInfo = repositoryInfoMapper($repositories.getActiveRepositoryObject());\n agentDefaultValues.repositoryId = activeRepositoryInfo.id;\n const agentFormModel = agentFormModelMapper(new AgentModel({}), agentDefaultValues, AGENT_OPERATION.CREATE);\n return {\n templateUrl: 'js/angular/ttyg/templates/modal/agent-settings-modal.html',\n controller: 'AgentSettingsModalController',\n windowClass: 'agent-settings-modal',\n backdrop: 'static',\n resolve: {\n dialogModel: function() {\n return new AgentSettingsModal(\n activeRepositoryInfo,\n $scope.activeRepositoryList,\n agentFormModel,\n AGENT_OPERATION.CREATE,\n );\n },\n },\n size: 'lg',\n };\n })\n .then((options) => {\n $uibModal.open(options).result.then(reloadAgents);\n })\n .catch((error) => {\n toastr.error(getError(error, 0, TTYG_ERROR_MSG_LENGTH));\n });\n };\n\n /**\n * Handles the agent edit operation. If the agent is not provided it is assumed that we need to edit the selected\n * agent which can be obtained from the context service.\n * @param {AgentModel|undefined} agent\n */\n $scope.onOpenAgentSettings = (agent) => {\n let agentToEdit = agent;\n if (!agentToEdit) {\n agentToEdit = TTYGContextService.getSelectedAgent();\n }\n getDefaultAgent()\n .then((agentDefaultValues) => {\n const agentFormModel = agentFormModelMapper(agentToEdit, agentDefaultValues, AGENT_OPERATION.EDIT);\n const activeRepositoryInfo = repositoryInfoMapper($repositories.getActiveRepositoryObject());\n return {\n templateUrl: 'js/angular/ttyg/templates/modal/agent-settings-modal.html',\n controller: 'AgentSettingsModalController',\n windowClass: 'agent-settings-modal',\n backdrop: 'static',\n resolve: {\n dialogModel: function() {\n return new AgentSettingsModal(\n activeRepositoryInfo,\n $scope.activeRepositoryList,\n agentFormModel,\n AGENT_OPERATION.EDIT,\n );\n },\n },\n size: 'lg',\n };\n })\n .then((options) => {\n $uibModal.open(options).result.then(\n (updatedAgent) => {\n const hasSelectedAgent = TTYGContextService.getSelectedAgent();\n if (hasSelectedAgent && updatedAgent.id === hasSelectedAgent.id) {\n TTYGContextService.selectAgent(updatedAgent);\n }\n reloadAgents();\n });\n })\n .catch((error) => {\n toastr.error(getError(error, 0, TTYG_ERROR_MSG_LENGTH));\n });\n };\n\n /**\n * Opens the agent settings modal with the agent to clone.\n * @param {AgentModel} agentToClone\n */\n $scope.onOpenCloneAgentSettings = (agentToClone) => {\n getDefaultAgent()\n .then((agentDefaultValues) => {\n const agentFormModel = agentFormModelMapper(agentToClone, agentDefaultValues, AGENT_OPERATION.CLONE);\n agentFormModel.name = `clone-${agentFormModel.name}`;\n const activeRepositoryInfo = repositoryInfoMapper($repositories.getActiveRepositoryObject());\n return {\n templateUrl: 'js/angular/ttyg/templates/modal/agent-settings-modal.html',\n controller: 'AgentSettingsModalController',\n windowClass: 'agent-settings-modal',\n backdrop: 'static',\n resolve: {\n dialogModel: function() {\n return new AgentSettingsModal(\n activeRepositoryInfo,\n $scope.activeRepositoryList,\n agentFormModel,\n AGENT_OPERATION.CLONE,\n );\n },\n },\n size: 'lg',\n };\n }).then((options) => {\n $uibModal.open(options).result.then(\n (updatedAgent) => {\n const hasSelectedAgent = TTYGContextService.getSelectedAgent();\n if (hasSelectedAgent && updatedAgent.id === hasSelectedAgent.id) {\n TTYGContextService.selectAgent(updatedAgent);\n }\n reloadAgents();\n });\n }).catch((error) => {\n toastr.error(getError(error, 0, TTYG_ERROR_MSG_LENGTH));\n });\n };\n\n // =========================\n // Private functions\n // =========================\n\n const loadChats = () => {\n $scope.loadingChats = true;\n return TTYGService.getConversations()\n .then((chats) => {\n return TTYGContextService.updateChats(chats);\n })\n .catch((error) => {\n toastr.error(getError(error, 0, TTYG_ERROR_MSG_LENGTH));\n setupChatListPanel(new ChatsListModel());\n })\n .finally(() => {\n $scope.loadingChats = false;\n });\n };\n\n /**\n * Loads the agents list from the server and updates the context service.\n * @param {boolean} showLoader\n * @return {Promise<void>}\n */\n const loadAgents = (showLoader = true) => {\n $scope.loadingAgents = showLoader;\n return TTYGService.getAgents()\n .then((agents) => {\n return TTYGContextService.updateAgents(agents);\n })\n .catch((error) => {\n toastr.error(getError(error, 0, TTYG_ERROR_MSG_LENGTH));\n })\n .finally(() => {\n $scope.loadingAgents = false;\n });\n };\n\n /**\n * Reloads the agents list. Basically the same as loadAgents but this sets the reloadingAgents flag that cause only\n * the agents list panel to be masked by the loader.\n * @return {Promise<void>}\n */\n const reloadAgents = () => {\n $scope.reloadingAgents = true;\n return TTYGService.getAgents()\n .then((agents) => {\n return TTYGContextService.updateAgents(agents);\n })\n .catch((error) => {\n toastr.error(getError(error, 0, TTYG_ERROR_MSG_LENGTH));\n })\n .finally(() => {\n $scope.reloadingAgents = false;\n });\n };\n\n const updateCanModifyAgent = () => {\n TTYGContextService.setCanModifyAgent($jwtAuth.isRepoManager());\n };\n\n const getActiveRepositoryObjectHandler = (activeRepo) => {\n const authService = service(AuthenticationService);\n if (activeRepo && !authService.hasGqlRights(activeRepo)) {\n onInit();\n }\n };\n\n /**\n * @param {ChatItemModel} chatItem\n */\n const onCreateNewChat = (chatItem) => {\n TTYGService.createChat(chatItem).then((conversationId) => {\n const newChat = ChatModel.getNewChat();\n newChat.name = newChatDefaultName;\n newChat.id = conversationId;\n TTYGContextService.createChat(newChat);\n TTYGStorageService.saveChat(newChat);\n\n chatItem.chatId = conversationId;\n TTYGContextService.emit(TTYGEventName.ASK_QUESTION, chatItem);\n }).catch((error) => {\n TTYGContextService.emit(TTYGEventName.CREATE_CHAT_FAILURE);\n toastr.error(getError(error, 0, TTYG_ERROR_MSG_LENGTH));\n });\n };\n\n /**\n * @param {ChatItemModel} chatItem\n */\n const onAskQuestion = (chatItem) => {\n TTYGContextService.emit(TTYGEventName.ASK_QUESTION_STARTING);\n // Reset the pending question cancellation promise to avoid interfering with the next question.\n // Currently, we can only ask a question for the selected chat, so it's safe to reset the promise here.\n pendingQuestionCancelingPromise = undefined;\n TTYGService.askQuestion(chatItem)\n .then((chatAnswer) => {\n const selectedChat = TTYGContextService.getSelectedChat();\n // If still the same chat selected\n if (selectedChat && selectedChat.id === chatItem.chatId) {\n if (selectedChat.isNew()) {\n selectedChat.new = false;\n const chats = TTYGContextService.getChats();\n chats.setChatAsOld(selectedChat.id);\n TTYGContextService.updateChats(chats);\n }\n // just process the messages\n updateChatAnswersFirstResponse(selectedChat, chatItem, chatAnswer);\n }\n })\n .catch((error) => {\n TTYGContextService.emit(TTYGEventName.ASK_QUESTION_FAILURE);\n toastr.error(getError(error, 0, TTYG_ERROR_MSG_LENGTH));\n });\n };\n\n const onContinueChatRun = (continueData) => {\n TTYGService.continueChatRun(continueData)\n .then((chatAnswer) => {\n const chatId = continueData.chatId;\n const selectedChat = TTYGContextService.getSelectedChat();\n // If still the same chat selected\n if (selectedChat && selectedChat.id === chatId) {\n // just process the additional answers (with a recovered ChatItemModel)\n const items = selectedChat.chatHistory.items;\n const lastItem = items[items.length - 1];\n updateChatAnswers(selectedChat, lastItem, chatAnswer);\n }\n })\n .catch((error) => {\n // TODO failure event\n TTYGContextService.emit(TTYGEventName.ASK_QUESTION_FAILURE);\n toastr.error(getError(error, 0, TTYG_ERROR_MSG_LENGTH));\n });\n };\n\n const updateChatAnswers = (selectedChat, chatItem, chatAnswer) => {\n selectedChat.timestamp = chatAnswer.timestamp;\n chatItem.answers = chatItem.answers || [];\n chatItem.answers.push(...chatAnswer.messages);\n TTYGContextService.updateSelectedChat(selectedChat);\n\n if (chatAnswer.continueRunId) {\n TTYGContextService.emit(TTYGEventName.CONTINUE_CHAT_RUN,\n new ContinueChatRun(chatItem, chatAnswer.continueRunId));\n } else {\n // Last message - update the timestamp and the name of the chat in the chat list\n const chats = TTYGContextService.getChats();\n // Updating the timestamp in the list gets the chat moved to the top.\n chats.updateChatTimestamp(selectedChat.id, chatAnswer.timestamp);\n // Strictly speaking the chat name update is needed only for new chats,\n // but it doesn't hurt for every chat.\n chats.updateChatName(selectedChat.id, chatAnswer.chatName);\n // and also in the chat - doesn't seem to matter atm\n selectedChat.name = chatAnswer.name;\n TTYGContextService.updateChats(chats);\n TTYGContextService.emit(TTYGEventName.LAST_MESSAGE_RECEIVED, selectedChat);\n }\n };\n\n const updateChatAnswersFirstResponse = (selectedChat, chatItem, chatAnswer) => {\n if (pendingQuestionCancelingPromise) {\n // If the answer is canceled, we need to wait for the cancellation to complete\n // and prepare a proper answer message that describes the reason for the cancellation.\n pendingQuestionCancelingPromise.then((cancelingResponse) => {\n const currentSelectedChat = TTYGContextService.getSelectedChat();\n // If selected chat is changed while waiting for the canceling response,\n // Skip the response processing.\n if (currentSelectedChat && currentSelectedChat.id !== chatItem.chatId) {\n return;\n }\n const message = new ChatMessageModel({\n message: cancelingResponse.data.message,\n status: cancelingResponse.data.runStatus,\n isTerminalState: true,\n tokenUsageInfo: chatAnswer.tokenUsageInfo,\n });\n\n message.addToChatAnswer(chatAnswer);\n selectedChat.chatHistory.appendItem(chatItem);\n updateChatAnswers(selectedChat, chatItem, chatAnswer);\n });\n } else {\n // If the answer is not canceled, we can process it immediately.\n selectedChat.chatHistory.appendItem(chatItem);\n updateChatAnswers(selectedChat, chatItem, chatAnswer);\n }\n };\n\n /**\n * Handles the renaming of a chat by calling the service and updating the chats list.\n * Events are fired for success and failure cases.\n * @param {ChatModel} chat - the chat to be renamed.\n */\n const onRenameChat = (chat) => {\n TTYGService.renameConversation(chat)\n .then(() => {\n TTYGContextService.emit(TTYGEventName.RENAME_CHAT_SUCCESSFUL);\n TTYGContextService.emit(TTYGEventName.LOAD_CHATS);\n })\n .catch(() => {\n TTYGContextService.emit(TTYGEventName.RENAME_CHAT_FAILURE);\n toastr.error($translate.instant('ttyg.chat.messages.rename_failure'));\n });\n };\n\n /**\n * Handles the change of the chats list.\n * When the list is empty, the chats list should be hidden.\n * When the list is not empty, the first chat should be selected\n * @param {ChatsListModel} chats - the new chats list.\n */\n const onChatsChanged = (chats) => {\n $scope.chats = chats;\n setupChatListPanel(chats);\n };\n\n const onCanUpdateAgentUpdated = (canModifyAgent) => {\n $scope.canModifyAgent = canModifyAgent;\n };\n\n /**\n * @param {ChatsListModel} chats - the new chats list.\n */\n const setupChatListPanel = (chats) => {\n if (chats.isEmpty()) {\n $scope.showChats = false;\n } else {\n $scope.showChats = true;\n if (!TTYGContextService.getSelectedChat() && !TTYGStorageService.getChatId()) {\n TTYGContextService.selectChat($scope.chats.getFirstChat());\n }\n }\n };\n\n /**\n * Handles the deletion of a chat by calling the service and updating the chats list.\n * Events are fired for success and failure cases.\n * @param {ChatModel} chat - the chat to be deleted.\n */\n const onDeleteChat = (chat) => {\n TTYGContextService.emit(TTYGEventName.DELETING_CHAT, {chatId: chat.id, inProgress: true});\n TTYGService.deleteConversation(chat.id)\n .then(() => {\n TTYGContextService.emit(TTYGEventName.DELETE_CHAT_SUCCESSFUL, chat);\n const chats = TTYGContextService.getChats();\n chats.deleteChat(chat);\n TTYGContextService.updateChats(chats);\n })\n .catch(() => {\n TTYGContextService.emit(TTYGEventName.DELETE_CHAT_FAILURE);\n toastr.error($translate.instant('ttyg.chat.messages.delete_failure'));\n })\n .finally(() => TTYGContextService.emit(TTYGEventName.DELETING_CHAT, {chatId: chat.id, inProgress: false}));\n };\n\n const onCancelPendingQuestion = (chatItem) => {\n const selectedChatId = chatItem.chatId || TTYGContextService.getSelectedChat().id;\n pendingQuestionCancelingPromise = TTYGService.cancelPendingQuestion(selectedChatId)\n .then((answer) => {\n TTYGContextService.emit(TTYGEventName.PENDING_QUESTION_CANCELED_SUCCESSFUL);\n return answer;\n })\n .catch((error) => {\n TTYGContextService.emit(TTYGEventName.CANCEL_PENDING_QUESTION_FAILURE);\n return error;\n });\n };\n\n /**\n * Handles the export of a chat by calling the service and updating the chats list.\n * @param {ChatModel} chat - the chat to be exported.\n */\n const onExportChat = (chat) => {\n TTYGService.exportConversation(chat.id)\n .then(function({data, filename}) {\n saveAs(data, filename);\n TTYGContextService.emit(TTYGEventName.CHAT_EXPORT_SUCCESSFUL, chat);\n })\n .catch(() => {\n TTYGContextService.emit(TTYGEventName.CHAT_EXPORT_FAILURE);\n toastr.error($translate.instant('ttyg.chat.messages.export_failure'));\n });\n };\n\n /**\n * Handles the change of the agents list.\n * @param {AgentListModel} agents - the new agents list.\n */\n const onAgentListChanged = (agents) => {\n $scope.agents = agents;\n };\n\n /**\n * Handles the deletion of an agent by calling the service and reloading the agents list.\n * @param {AgentModel} agent - the agent to be deleted.\n */\n const onDeleteAgent = (agent) => {\n TTYGContextService.emit(TTYGEventName.DELETING_AGENT, {agentId: agent.id, inProgress: true});\n TTYGService.deleteAgent(agent.id)\n .then(() => {\n return reloadAgents();\n })\n .then(() => {\n TTYGContextService.emit(TTYGEventName.AGENT_DELETED, agent);\n if ($scope.selectedAgent && $scope.selectedAgent.id === agent.id) {\n $scope.selectedAgent = undefined;\n }\n })\n .catch((error) => {\n toastr.error(getError(error, 0, TTYG_ERROR_MSG_LENGTH));\n })\n .finally(() => {\n TTYGContextService.emit(TTYGEventName.DELETING_AGENT, {agentId: agent.id, inProgress: false});\n });\n };\n\n /**\n * Creates a filter model for the agents list.\n */\n const buildAgentsFilterModel = () => {\n const currentRepository = $repositories.getActiveRepository();\n // TODO: this should be refreshed automatically when the repositories change\n const repositoryObjects = $repositories.getLocalReadableGraphdbRepositories()\n .map((repo) => (\n new AgentListFilterModel(repo.id, repo.id, repo.id === currentRepository)\n ));\n $scope.agentListFilterModel = [\n new AgentListFilterModel(AGENTS_FILTER_ALL_KEY, labels.filter_all),\n ...repositoryObjects,\n ];\n };\n\n const onSelectedChatChanged = (selectedChat) => {\n // Reset the pending question cancellation promise because the chat has changed,\n // and any previous promise is no longer relevant.\n pendingQuestionCancelingPromise = undefined;\n // If the selected chat is a chat and does not need to be loaded from the server.\n if (selectedChat && !selectedChat.isNew()) {\n TTYGService.getConversation(selectedChat.id)\n .then((chat) => {\n TTYGContextService.updateSelectedChat(chat);\n TTYGStorageService.saveChat(selectedChat);\n })\n .catch((error) => {\n // If the chat is not found and the server returns 404, then we notify the user\n // and remove the chat from the chat list. It's expected that the backend would\n // also remove it and next time the list is loaded the chat will no longer be there.\n if (error.status === httpStatus.NOT_FOUND) {\n notifyForMissingChat(selectedChat);\n TTYGContextService.emit(TTYGEventName.LOAD_CHAT_FAILURE, selectedChat);\n }\n });\n } else if (selectedChat) {\n TTYGContextService.updateSelectedChat(selectedChat);\n }\n };\n\n const notifyForMissingChat = (selectedChat) => {\n ModalService.openModalAlert({\n title: $translate.instant('ttyg.chat.dialog.chat_is_missing.title'),\n message: $translate.instant('ttyg.chat.dialog.chat_is_missing.body'),\n }).result\n .then(function() {\n TTYGContextService.deleteChat(selectedChat);\n });\n };\n\n /**\n * Handles the selection of an agent.\n * @param {AgentModel} agent\n */\n const onAgentSelected = (agent) => {\n $scope.selectedAgent = agent;\n };\n\n /**\n * Opens the create similarity view. It checks if the passed repository ID matches the one selected by the workbench.\n * If they do not match, a confirmation dialog is shown to inform the user that the selected repository\n * will be automatically changed upon confirmation.\n *\n * @param {{repositoryId: string}} payload - The payload containing the repository ID.\n */\n const onGoToCreateSimilarityView = (payload) => {\n goToView(payload.repositoryId, 'ttyg.agent.create_agent_modal.dialog.confirm_repository_change_before_open_similarity.body', 'similarity/index/create');\n };\n\n /**\n * Opens the \"Autocomplete index\" view. It checks if the passed repository ID matches the one selected by the workbench.\n * If they do not match, a confirmation dialog is shown to inform the user that the selected repository\n * will be automatically changed upon confirmation.\n *\n * @param {{repositoryId: string}} payload - The payload containing the repository ID.\n */\n const goToAutocompleteIndexView = (payload) => {\n goToView(payload.repositoryId, 'ttyg.agent.create_agent_modal.dialog.confirm_repository_change_before_open_autocomplete_index.body', 'autocomplete');\n };\n\n /**\n * Opens the connectors view. It checks if the passed repository ID matches the one selected by the workbench.\n * If they do not match, a confirmation dialog is shown to inform the user that the selected repository\n * will be automatically changed upon confirmation.\n *\n * @param {{repositoryId: string}} payload - The payload containing the repository ID.\n */\n const onGoToConnectorsView = (payload) => {\n goToView(payload.repositoryId, 'ttyg.agent.create_agent_modal.dialog.confirm_repository_change_before_open_connectors.body', 'connectors');\n };\n\n /**\n * Navigates to a specified view URL, potentially after switching the active repository.\n * If the target repository is different from the currently active one, a confirmation modal is shown.\n * Upon user confirmation, the repository is switched and the view is opened in a new browser tab.\n *\n * @param {string} repositoryId - The ID of the target repository to switch to.\n * @param {string} confirmMessageLabelKey - The translation key for the confirmation message to be shown in the modal.\n * @param {string} viewURL - The URL of the view to be opened in a new browser tab.\n */\n const goToView = (repositoryId, confirmMessageLabelKey, viewURL) => {\n if (repositoryId !== $repositories.getActiveRepository()) {\n const repository = $repositories.getRepository(repositoryId);\n if (repository) {\n ModalService.openConfirmationModal({\n title: $translate.instant('common.confirm'),\n message: decodeHTML($translate.instant(confirmMessageLabelKey, {repositoryId: repository.id})),\n confirmButtonKey: 'ttyg.chat_panel.btn.proceed.label',\n },\n () => {\n $repositories.setRepository(repository);\n openView(viewURL);\n });\n }\n } else {\n openView(viewURL);\n }\n };\n\n /**\n * Opens the specified URL in a new browser tab.\n *\n * @param {string} viewURL - The URL to open.\n */\n const openView = (viewURL) => {\n $window.open(viewURL, '_blank');\n };\n\n /**\n * Opens SPARQL editor view with passed query.\n * @param {{query: string, repositoryId: string}} payload\n */\n const onGoToSparqlEditorView = (payload) => {\n if (payload.repositoryId !== $repositories.getActiveRepository()) {\n const repository = $repositories.getRepository(payload.repositoryId);\n if (repository) {\n ModalService.openConfirmation(\n $translate.instant('common.confirm'),\n decodeHTML($translate.instant('ttyg.chat_panel.dialog.confirm_repository_change.body', {repositoryId: payload.repositoryId})),\n () => {\n $repositories.setRepository(repository);\n openInSparqlEditorInNewTab(payload.query);\n });\n }\n } else {\n openInSparqlEditorInNewTab(payload.query);\n }\n };\n\n const openInSparqlEditorInNewTab = (query) => {\n $window.open(`/sparql?query=${encodeURIComponent(query)}&execute=true`, '_blank');\n };\n\n /**\n * Loads a chat using the chat ID stored in the local storage and selects it.\n */\n const setCurrentChat = () => {\n const chatId = TTYGStorageService.getChatId();\n const chats = TTYGContextService.getChats();\n // If the chat ID is not stored in the local storage, there is no need to load it.\n // Also, if a chat id is found in the storage but is not present in the chat list, then it probably was deleted,\n // and it will be replaced with a new one on next selection.\n if (!chatId || !chats.getChat(chatId)) {\n return;\n }\n TTYGContextService.selectChat(TTYGContextService.getChats().getChat(chatId));\n };\n\n const updateLabels = () => {\n labels.filter_all = $translate.instant('ttyg.agent.btn.filter.all');\n // recreate the repository list to trigger the update in the view\n buildAgentsFilterModel();\n };\n\n const buildRepositoryList = () => {\n $scope.activeRepositoryList = $repositories.getLocalReadableGraphdbRepositories()\n .map((repo) => (\n new SelectMenuOptionsModel({\n value: repo.id,\n label: repo.id,\n data: {\n repository: repo,\n },\n })),\n );\n };\n\n\n // =========================\n // Subscriptions\n // =========================\n\n function cleanUp() {\n subscriptions.forEach((subscription) => subscription());\n TTYGContextService.resetContext();\n }\n\n subscriptions.push(\n $scope.$watch($scope.getActiveRepositoryObject, getActiveRepositoryObjectHandler),\n TTYGContextService.onSelectedChatChanged(onSelectedChatChanged),\n TTYGContextService.onChatsListChanged(onChatsChanged),\n TTYGContextService.onCanUpdateAgentUpdated(onCanUpdateAgentUpdated),\n TTYGContextService.subscribe(TTYGContextService.onAgentsListChanged(onAgentListChanged)),\n TTYGContextService.subscribe(TTYGEventName.CREATE_CHAT, onCreateNewChat),\n TTYGContextService.subscribe(TTYGEventName.RENAME_CHAT, onRenameChat),\n TTYGContextService.subscribe(TTYGEventName.DELETE_CHAT, onDeleteChat),\n TTYGContextService.subscribe(TTYGEventName.CANCEL_PENDING_QUESTION, onCancelPendingQuestion),\n TTYGContextService.subscribe(TTYGEventName.CHAT_EXPORT, onExportChat),\n TTYGContextService.subscribe(TTYGEventName.ASK_QUESTION, onAskQuestion),\n TTYGContextService.subscribe(TTYGEventName.CONTINUE_CHAT_RUN, onContinueChatRun),\n TTYGContextService.subscribe(TTYGEventName.LOAD_CHATS, loadChats),\n TTYGContextService.subscribe(TTYGEventName.OPEN_AGENT_SETTINGS, $scope.onOpenNewAgentSettings),\n TTYGContextService.subscribe(TTYGEventName.EDIT_AGENT, $scope.onOpenAgentSettings),\n TTYGContextService.subscribe(TTYGEventName.CLONE_AGENT, $scope.onOpenCloneAgentSettings),\n TTYGContextService.subscribe(TTYGEventName.DELETE_AGENT, onDeleteAgent),\n TTYGContextService.subscribe(TTYGEventName.AGENT_SELECTED, onAgentSelected),\n TTYGContextService.subscribe(TTYGEventName.GO_TO_CREATE_SIMILARITY_VIEW, onGoToCreateSimilarityView),\n TTYGContextService.subscribe(TTYGEventName.GO_TO_AUTOCOMPLETE_INDEX_VIEW, goToAutocompleteIndexView),\n TTYGContextService.subscribe(TTYGEventName.GO_TO_CONNECTORS_VIEW, onGoToConnectorsView),\n TTYGContextService.subscribe(TTYGEventName.GO_TO_SPARQL_EDITOR, onGoToSparqlEditorView),\n $rootScope.$on('$translateChangeSuccess', updateLabels),\n $rootScope.$on('securityInit', updateCanModifyAgent),\n );\n $scope.$on('$destroy', cleanUp);\n\n // =========================\n // Initialization\n // =========================\n\n function onInit() {\n buildRepositoryList();\n loadAgents()\n .then(() => {\n $scope.initialized = true;\n buildAgentsFilterModel();\n return loadChats();\n })\n .then(setCurrentChat);\n updateCanModifyAgent();\n }\n}\n","import './chat-item-detail.directive';\nimport 'angular/core/directives/editable-content/editable-content';\nimport {TTYGEventName} from \"../services/ttyg-context.service\";\nimport {CHAT_MESSAGE_ROLE, ChatMessageModel} from \"../../models/ttyg/chat-message\";\nimport {ChatItemModel} from \"../../models/ttyg/chat-item\";\nimport {cloneDeep} from \"lodash\";\nimport {decodeHTML} from \"../../../../app\";\n\nconst modules = [\n 'graphdb.framework.ttyg.directives.chat-item-detail',\n 'graphdb.framework.core.directives.editable-content',\n];\n\nangular\n .module('graphdb.framework.ttyg.directives.chat-panel', modules)\n .directive('chatPanel', ChatPanelComponent);\n\nChatPanelComponent.$inject = ['toastr', '$translate', 'TTYGContextService'];\n\n/**\n * @ngdoc directive\n * @name graphdb.framework.ttyg.directives.chat-panel:chatPanel\n * @restrict E\n * @description\n *\n * This directive represents a chat panel component that allows users to interact with a chat. It provides functionality for asking questions,\n * regenerating chat content, and other interactive features.\n *\n * It encapsulates the logic and presentation for displaying and managing chat-related interactions.\n *\n * @example\n * <chat-panel></chat-panel>\n */\nfunction ChatPanelComponent(toastr, $translate, TTYGContextService) {\n return {\n restrict: 'E',\n templateUrl: 'js/angular/ttyg/templates/chat-panel.html',\n link: ($scope, element, attrs) => {\n // =========================\n // Public variables\n // =========================\n\n /**\n * @type {ChatModel}\n */\n $scope.chat = undefined;\n\n /**\n * @type {AgentModel}\n */\n $scope.selectedAgent = undefined;\n\n /**\n * @type {ChatItemModel}\n */\n $scope.chatItem = undefined;\n\n /**\n * @type {ChatItemModel}\n */\n $scope.askingChatItem = undefined;\n\n /**\n * True while a question is being handled. It may involve multiple requests until it turns back to false.\n * @type {boolean}\n */\n $scope.waitingForLastMessage = false;\n\n /**\n * Flag that indicates that the chat is about to be changed.\n * @type {boolean}\n */\n $scope.loadingChat = true;\n\n $scope.showCancelButton = false;\n\n // =========================\n // Private variables\n // =========================\n\n // =========================\n // Public functions\n // =========================\n\n /**\n * Handles the ask question action.\n */\n $scope.ask = () => {\n $scope.chatItem.question.timestamp = Date.now();\n $scope.askingChatItem = cloneDeep($scope.chatItem);\n if (!$scope.chatItem.chatId) {\n createNewChat();\n } else {\n askQuestion($scope.chatItem);\n }\n $scope.chatItem = getEmptyChatItem();\n scrollToBottom();\n focusQuestionInput();\n };\n\n\n /**\n * Cancels a pending question tied to the current scope.\n * Hides cancel button.\n */\n $scope.cancelPendingQuestion = () => {\n $scope.showCancelButton = false;\n TTYGContextService.emit(TTYGEventName.CANCEL_PENDING_QUESTION, $scope.chatItem);\n };\n\n /**\n * Regenerates the answer for the provided chat item.\n *\n * @param {ChatItemModel} chatItem - The chat item that contains the question to be regenerated.\n */\n $scope.regenerateQuestion = (chatItem) => {\n const regenerateChatItem = getEmptyChatItem();\n regenerateChatItem.setQuestionMessage(chatItem.getQuestionMessage());\n regenerateChatItem.question.timestamp = Date.now();\n $scope.askingChatItem = regenerateChatItem;\n askQuestion(regenerateChatItem);\n scrollToBottom();\n };\n\n /**\n * Handles pressing the Enter key in the question input.\n * Will not trigger if `Shift` or `Ctrl` keys are pressed, or if Ask button is disabled.\n *\n * @param {KeyboardEvent} $event - The keyboard event triggered by the user interaction.\n */\n $scope.onKeypressOnInput = ($event) => {\n if (!$scope.askingChatItem && $event.key === 'Enter' && !$event.shiftKey && !$event.ctrlKey) {\n $scope.ask();\n }\n };\n\n $scope.onAskHowDeliveredAnswer = () => {\n const askHowDerivedAnswerChatItem = getEmptyChatItem();\n askHowDerivedAnswerChatItem.setQuestionMessage($translate.instant('ttyg.chat_panel.btn.derive_answer.label'));\n askHowDerivedAnswerChatItem.question.timestamp = Date.now();\n $scope.askingChatItem = cloneDeep(askHowDerivedAnswerChatItem);\n askQuestion(askHowDerivedAnswerChatItem);\n scrollToBottom();\n };\n\n /**\n * Finds out if agent with such id exists and returns its name or a default message for deleted agent.\n * @param {string} agentId\n * @return {string}\n */\n $scope.getAgentName = (agentId) => {\n const agent = TTYGContextService.getAgent(agentId);\n return agent ? agent.name : decodeHTML($translate.instant('ttyg.chat_panel.deleted_agent'));\n };\n\n // =========================\n // Private functions\n // =========================\n\n const createNewChat = () => {\n TTYGContextService.emit(TTYGEventName.CREATE_CHAT, $scope.chatItem);\n };\n\n const askQuestion = (chatItem) => {\n TTYGContextService.emit(TTYGEventName.ASK_QUESTION, chatItem);\n };\n\n const setAskingState = (isAsking) => {\n $scope.waitingForLastMessage = isAsking;\n $scope.showCancelButton = isAsking;\n };\n\n const onAskQuestionStarted = () => {\n setAskingState(true);\n };\n\n /**\n * Handles the update of the selected chat.\n * @param {ChatModel} chat - the new selected chat.\n */\n const onSelectedChatUpdated = (chat) => {\n $scope.chat = chat;\n if (!$scope.chat || $scope.chat.isNew()) {\n // Do nothing if the chat is new and a question is currently being asked.\n return;\n }\n $scope.loadingChat = false;\n const message = $scope.chatItem.question.message;\n $scope.chatItem = getEmptyChatItem();\n $scope.chatItem.question.message = message;\n $scope.askingChatItem = undefined;\n if ($scope.chat) {\n // TODO: Why on earth this is here? The chat changed handler is in the ttyg.view. Why doesn't it handle this\n // but we need to go through 2 more events to achieve the same result?\n const lastChatItem = $scope.chat.chatHistory.getLast();\n if (lastChatItem && lastChatItem.agentId) {\n TTYGContextService.selectAgent(TTYGContextService.getAgent(lastChatItem.agentId));\n }\n }\n focusQuestionInput();\n };\n\n const onLastMessageReceived = () => {\n setAskingState(false);\n };\n\n /**\n * Handles the failure of loading the chat and the server returns 404. This might happen if the chat does\n * not exist anymore because it was deleted by another user for example.\n */\n const onLoadChatFailure = () => {\n $scope.loadingChat = false;\n $scope.chatItem = getEmptyChatItem();\n focusQuestionInput();\n };\n\n const onSelectedChatChanged = (chat) => {\n if (chat) {\n // Skip the loading indication if it is a new chat that hasn't received an answer yet.\n $scope.loadingChat = !chat.isNew();\n $scope.chatItem = getEmptyChatItem();\n setAskingState(false);\n focusQuestionInput();\n } else {\n reset();\n }\n };\n\n const onQuestionFailure = () => {\n $scope.chatItem = cloneDeep($scope.askingChatItem);\n $scope.askingChatItem = undefined;\n setAskingState(false);\n };\n\n /**\n * Handles the change of the selected agent.\n * @param {AgentModel} agent - the new selected agent.\n */\n const onSelectedAgentChanged = (agent) => {\n $scope.selectedAgent = agent;\n if ($scope.selectedAgent && $scope.chatItem) {\n $scope.chatItem.agentId = $scope.selectedAgent.id;\n }\n focusQuestionInput();\n };\n\n const onChatDeleted = (deletedChat) => {\n if ($scope.chat && deletedChat.id === $scope.chat.id) {\n reset();\n }\n };\n\n const getEmptyChatItem = () => {\n const chatItem = new ChatItemModel();\n chatItem.question = new ChatMessageModel({role: CHAT_MESSAGE_ROLE.USER});\n\n if ($scope.chat) {\n chatItem.chatId = $scope.chat.id;\n }\n\n if ($scope.selectedAgent) {\n chatItem.agentId = $scope.selectedAgent.id;\n }\n\n return chatItem;\n };\n\n const focusQuestionInput = () => {\n // Moving focus to the end of the JS call stack with a timeout, because on first Agent select,\n // the dropdown .agent-option steals the focus, or the browser assigns it to the document <body>.\n setTimeout(() => {\n const inputElement = document.querySelector('.question-input');\n if (inputElement) {\n inputElement.focus();\n }\n });\n };\n\n const scrollToBottom = () => {\n // Call it in a timeout to ensure that Angular's digest cycle is finished and all elements are displayed.\n setTimeout(() => {\n const chatDetailsElement = element.find(\".chat-details\")[0];\n if (chatDetailsElement) {\n chatDetailsElement.scrollTop = chatDetailsElement.scrollHeight;\n }\n });\n };\n\n const reset = () => {\n $scope.chat = undefined;\n $scope.loadingChat = false;\n $scope.chatItem = getEmptyChatItem();\n $scope.askingChatItem = undefined;\n setAskingState(false);\n focusQuestionInput();\n };\n\n const init = () => {\n $scope.chatItem = getEmptyChatItem();\n focusQuestionInput();\n };\n\n // =========================\n // Subscriptions\n // =========================\n const subscriptions = [\n $scope.$watchCollection('chat.chatHistory.items', scrollToBottom),\n TTYGContextService.onSelectedChatUpdated(onSelectedChatUpdated),\n TTYGContextService.onLastMessageReceived(onLastMessageReceived),\n TTYGContextService.onSelectedAgentChanged(onSelectedAgentChanged),\n TTYGContextService.onSelectedChatChanged(onSelectedChatChanged),\n TTYGContextService.subscribe(TTYGEventName.LOAD_CHAT_FAILURE, onLoadChatFailure),\n TTYGContextService.subscribe(TTYGEventName.ASK_QUESTION_FAILURE, onQuestionFailure),\n TTYGContextService.subscribe(TTYGEventName.CREATE_CHAT_FAILURE, onQuestionFailure),\n TTYGContextService.subscribe(TTYGEventName.DELETE_CHAT_SUCCESSFUL, onChatDeleted),\n TTYGContextService.subscribe(TTYGEventName.ASK_QUESTION_STARTING, onAskQuestionStarted),\n ];\n\n const removeAllSubscribers = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n // Deregister the watcher when the scope/directive is destroyed\n $scope.$on('$destroy', removeAllSubscribers);\n\n // =========================\n // Initialization\n // =========================\n init();\n },\n };\n}\n","import {decodeHTML} from \"../../../../app\";\nimport {TTYGEventName} from \"../services/ttyg-context.service\";\nimport 'angular/ttyg/services/externalIntegrationModal.service';\n\nconst modules = [\n 'graphdb.framework.ttyg.services.externalIntegrationModal'\n];\n\nangular\n .module('graphdb.framework.ttyg.directives.agent-list', modules)\n .directive('agentList', AgentListComponent);\n\nAgentListComponent.$inject = ['TTYGContextService', 'ModalService', '$translate', '$uibModal', 'ExternalIntegrationModalService'];\n\nfunction AgentListComponent(TTYGContextService, ModalService, $translate, $uibModal, ExternalIntegrationModalService) {\n return {\n restrict: 'E',\n templateUrl: 'js/angular/ttyg/templates/agent-list.html',\n scope: {\n agentList: '=',\n agentListFilterModel: '='\n },\n link: ($scope, element, attrs) => {\n\n // =========================\n // Public variables\n // =========================\n\n /**\n * Selected agent.\n * @type {AgentModel|undefined}\n */\n $scope.selectedAgent = undefined;\n\n /**\n * The selected agents filter.\n * @type {{key: string, label: string}|undefined}\n */\n $scope.selectedAgentsFilter = undefined;\n\n /**\n * An event instance holding the agent to be deleted and if the progress is ongoing.\n * @type {agentId: string, inProgress: boolean}\n */\n $scope.deletingAgent = undefined;\n\n // =========================\n // Private variables\n // =========================\n\n // =========================\n // Public functions\n // =========================\n\n /**\n * Triggers the agent edit process.\n * @param {AgentModel} agent\n */\n $scope.onEditAgent = (agent) => {\n TTYGContextService.emit(TTYGEventName.EDIT_AGENT, agent);\n };\n\n /**\n * Opens a modal to copy the external integration for a given agent.\n *\n * Used when the agent is already provided.\n *\n * @function\n * @param {AgentModel} agent - The agent for which to configure the integration.\n */\n $scope.onExternalIntegration = (agent) => {\n ExternalIntegrationModalService.open(agent);\n };\n\n /**\n * Triggers the agent clone process.\n * @param {AgentModel} agent\n */\n $scope.onCloneAgent = (agent) => {\n TTYGContextService.emit(TTYGEventName.CLONE_AGENT, agent);\n };\n\n /**\n * Triggers the agent delete process.\n * @param {AgentModel} agent\n */\n $scope.onDeleteAgent = (agent) => {\n const title = $translate.instant('ttyg.agent.delete_agent_modal.title');\n const confirmDeleteMessage = decodeHTML($translate.instant('ttyg.agent.delete_agent_modal.body', {agentName: agent.name}));\n ModalService.openConfirmation(title, confirmDeleteMessage, () => TTYGContextService.emit(TTYGEventName.DELETE_AGENT, agent));\n };\n\n /**\n * Filters the agents based on the selected repository.\n * @param {AgentListFilterModel} selectedFilter\n */\n $scope.onAgentsFilterChange = (selectedFilter) => {\n $scope.selectedAgentsFilter = selectedFilter;\n if ($scope.selectedAgentsFilter) {\n $scope.agentList.filterByRepository($scope.selectedAgentsFilter.key);\n }\n };\n\n // =========================\n // Private functions\n // =========================\n\n const updateSelectedAgentsFilter = () => {\n const selectedFilter = $scope.agentListFilterModel.find((filter) => filter.selected);\n $scope.selectedAgentsFilter = selectedFilter || $scope.agentListFilterModel[0];\n $scope.onAgentsFilterChange($scope.selectedAgentsFilter);\n };\n\n /**\n * Handles the progress of deletion of an agent.\n * @param {{agentId: string, inProgress: boolean}} event\n */\n const onDeletingAgent = (event) => {\n $scope.deletingAgent = event;\n };\n\n /**\n * Handles the selection of an agent.\n * @param {AgentModel} agent\n */\n const onSelectedAgentChanged = (agent) => {\n $scope.selectedAgent = agent;\n };\n\n // =========================\n // Subscriptions\n // =========================\n\n const subscriptions = [];\n\n const removeAllSubscribers = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n subscriptions.push($scope.$watch('agentListFilterModel', updateSelectedAgentsFilter));\n subscriptions.push(TTYGContextService.subscribe(TTYGEventName.DELETING_AGENT, onDeletingAgent));\n subscriptions.push(TTYGContextService.onSelectedAgentChanged(onSelectedAgentChanged));\n\n // Deregister the watcher when the scope/directive is destroyed\n $scope.$on('$destroy', removeAllSubscribers);\n\n // =========================\n // Initialization\n // =========================\n\n function initialize() {\n updateSelectedAgentsFilter();\n }\n initialize();\n }\n };\n}\n","/**\n * @ngdoc directive\n * @name graphdb.framework.core.directives:inlineEditableText\n * @restrict E\n * @description\n * A directive for inline editing of text fields. It provides a simple interface to display text,\n * switch to an editable input field on double-click, and save or cancel changes.\n *\n * The directive allows for customizable save, cancel, click, and double-click actions.\n *\n * @param {string} fieldName - The name of the field in the source object to be edited.\n * @param {Object} source - The object containing the field to be edited.\n * @param {function} onSave - The function to be called when saving the edited text.\n * It passes an object with the new text and the source object.\n * @param {function} onCancel - The function to be called when editing is canceled.\n * @param {function} onClick - The function to be called on single-click.\n * @param {function} onDblclick - The function to be called on double-click.\n * @param {boolean} isEditing - A flag indicating whether the text is currently being edited.\n *\n * @example\n * <inline-editable-text\n * field-name=\"name\"\n * source=\"item\"\n * on-save=\"saveFunction(newText, source)\"\n * on-cancel=\"cancelFunction()\"\n * on-click=\"clickFunction(source)\"\n * on-dblclick=\"dblClickFunction(source)\"\n * is-editing=\"item.isEditing\">\n * </inline-editable-text>\n *\n * @requires $timeout\n */\nangular\n .module('graphdb.framework.core.directives.inline-editable-text', [])\n .directive('inlineEditableText', InlineEditableText);\n\nInlineEditableText.$inject = ['$timeout'];\n\nfunction InlineEditableText($timeout) {\n return {\n restrict: 'E',\n scope: {\n /**\n * {@type {text}}\n */\n fieldName: '@',\n source: '=',\n onSave: '&',\n onCancel: '&',\n onClick: '&',\n onDblclick: '&',\n isEditing: '='\n },\n templateUrl: 'js/angular/core/directives/inline-editable-text/templates/inline-editable-text.template.html',\n link: function (scope, element) {\n\n // =========================\n // Public variables\n // =========================\n scope.editableModel = {};\n\n // =========================\n // Private variables\n // =========================\n const subscriptions = [];\n let clickTimeout;\n\n // =========================\n // Public functions\n // =========================\n scope.onKeydown = (event) => {\n if (event.key === 'Enter') {\n cancelClickTimeout();\n if (scope.editableModel.text !== scope.text) {\n scope.onSave({newText:scope.editableModel.text, source: scope.source});\n }\n } else if (event.key === 'Escape') {\n cancelEditing();\n }\n };\n\n scope.onCancelEditing = () => {\n cancelEditing();\n };\n\n scope.onSelect = () => {\n if (clickTimeout) {\n cancelClickTimeout();\n scope.onDblclick({source: scope.source});\n } else {\n clickTimeout = $timeout(function () {\n scope.onClick({source: scope.source});\n cancelClickTimeout();\n }, 250);\n }\n };\n\n // =========================\n // Private functions\n // =========================\n const cancelEditing = () => {\n cancelClickTimeout();\n scope.onCancel();\n };\n\n const cancelClickTimeout = () => {\n $timeout.cancel(clickTimeout);\n clickTimeout = undefined;\n };\n\n const focusEditElement = () => {\n // Focus and select the text in the input field\n $timeout(() => {\n const inputElement = element.find('input')[0];\n inputElement.focus();\n inputElement.select();\n }, 0);\n };\n\n // =========================\n // Subscription handlers\n // =========================\n const onIsEditChanged = (newVal) => {\n if (newVal) {\n scope.editableModel.text = scope.source[scope.fieldName];\n focusEditElement();\n }\n };\n\n // =========================\n // Subscriptions\n // =========================\n subscriptions.push(scope.$watch('isEditing', onIsEditChanged));\n\n const removeAllSubscribers = () => {\n subscriptions.forEach((subscription) => subscription());\n cancelClickTimeout();\n };\n\n // Deregister the watcher when the scope/directive is destroyed\n scope.$on('$destroy', removeAllSubscribers);\n }\n };\n}\n","/**\n * A model for the agent settings modal configuration.\n */\nexport class AgentSettingsModal {\n /**\n * Constructor.\n * @param {RepositoryInfoModel} activeRepositoryInfo\n * @param {string[]} activeRepositoryList\n * @param {AgentFormModel} agentFormModel\n * @param {'create'|'edit'|'clone'} operation\n */\n constructor(\n activeRepositoryInfo,\n activeRepositoryList,\n agentFormModel,\n operation\n ) {\n this.activeRepositoryInfo = activeRepositoryInfo;\n this.activeRepositoryList = activeRepositoryList;\n this.agentFormModel = agentFormModel;\n this.operation = operation;\n }\n}\n","import {SelectMenuOptionsModel} from \"../../models/form-fields\";\nimport {TTYGEventName} from \"../services/ttyg-context.service\";\n\nconst modules = [\n];\n\nangular\n .module('graphdb.framework.ttyg.directives.agent-select-menu', modules)\n .directive('agentSelectMenu', AgentSelectMenuComponent);\n\nAgentSelectMenuComponent.$inject = ['TTYGContextService', '$translate', '$sce', 'ModalService', 'TTYGStorageService'];\n\nfunction AgentSelectMenuComponent(TTYGContextService, $translate, $sce, ModalService, TTYGStorageService) {\n return {\n restrict: 'E',\n templateUrl: 'js/angular/ttyg/templates/agent-select-menu.html',\n scope: {\n },\n link: ($scope) => {\n\n // =========================\n // Public variables\n // =========================\n\n $scope.agentOptionsList = [];\n\n /**\n * Selected agent ID.\n * @type {AgentModel|undefined}\n */\n $scope.selectedAgent = undefined;\n\n // =========================\n // Private variables\n // =========================\n\n // =========================\n // Public functions\n // =========================\n\n /**\n * Handles the agent selection.\n * @param {Event} $event - The DOM event triggered by the selection.\n * @param {AgentModel} agent - The selected agent instance.\n */\n $scope.onAgentSelected = ($event, agent) => {\n if (!agent.isCompatible) {\n // Prevents the dropdown from closing if the selected agent is not compatible\n // by stopping event propagation and preventing the default action.\n $event.stopPropagation();\n $event.preventDefault();\n return;\n }\n markAsSelected(agent);\n TTYGStorageService.saveAgent(agent);\n $scope.selectedAgent = agent;\n TTYGContextService.selectAgent(agent);\n if (agent.isRepositoryDeleted) {\n const title = $translate.instant('ttyg.agent.agent_select_menu.configure_agent_modal.title');\n const confirmMessage = $translate.instant('ttyg.agent.agent_select_menu.configure_agent_modal.body');\n ModalService.openConfirmation(title, confirmMessage,\n () => TTYGContextService.emit(TTYGEventName.EDIT_AGENT, agent)\n );\n }\n };\n\n // =========================\n // Private functions\n // =========================\n\n /**\n * Marks the given agent as selected and deselects the rest.\n * @param {AgentModel} agent\n */\n const markAsSelected = (agent) => {\n $scope.agentOptionsList.forEach((agentOption) => {\n agentOption.selected = agentOption.data.agent === agent;\n });\n };\n\n /**\n * Handles the agent list change event.\n * @param {AgentListModel} agents\n */\n const onAgentListChanged = (agents) => {\n buildAgentOptionsModel(agents);\n selectLastUsedOrDefaultAgent();\n };\n\n /**\n * Function to select the most recently used agent (according to local store) or selects the first in the list\n * if no recent agent is available.\n *\n * @function\n */\n const selectLastUsedOrDefaultAgent = () => {\n let selectedAgent;\n const storedAgentId = TTYGStorageService.getAgentId();\n\n if (storedAgentId) {\n // If saved in the LocalStore, the user has selected it, so select it here\n $scope.agentOptionsList.forEach((agent) => {\n if (agent.data.agent.id === storedAgentId) {\n selectedAgent = agent.data.agent\n }\n });\n }\n\n // Otherwise, select the first in the option list\n if (!selectedAgent && $scope.agentOptionsList[0]) {\n selectedAgent = $scope.agentOptionsList[0].data.agent;\n }\n onSelectedAgentChanged(selectedAgent);\n TTYGContextService.selectAgent(selectedAgent);\n }\n\n /**\n * Handles the agent deleted event.\n * @param {AgentModel} deletedAgent - the deleted agent\n */\n const onAgentDeleted = (deletedAgent) => {\n if ($scope.selectedAgent && $scope.selectedAgent.id === deletedAgent.id) {\n $scope.selectedAgent.isDeleted = true;\n TTYGContextService.selectAgent($scope.selectedAgent);\n }\n };\n\n /**\n * Handles the selection of an agent. When an agent is selected by the user from this menu, the agent is then\n * saved in the local storage. When the TTYG view is initialized, the selected agent is retrieved from the\n * local and its details loaded through the API. Then this component is updated to reflect the selected agent.\n * @param {AgentModel} agent\n */\n const onSelectedAgentChanged = (agent) => {\n markAsSelected(agent);\n $scope.selectedAgent = agent;\n };\n\n /**\n * Builds the agent options model which is used to display the agents in the select menu.\n * @param {AgentListModel} agentsListModel\n */\n const buildAgentOptionsModel = (agentsListModel) => {\n $scope.agentOptionsList = agentsListModel.agents.map((agent) => {\n return new SelectMenuOptionsModel({\n value: agent.id,\n label: agent.name,\n data: {\n agent: agent\n }\n });\n });\n };\n\n // =========================\n // Subscriptions\n // =========================\n\n const subscriptions = [];\n\n const removeAllSubscribers = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n subscriptions.push(TTYGContextService.onAgentsListChanged(onAgentListChanged));\n subscriptions.push(TTYGContextService.subscribe(TTYGEventName.AGENT_DELETED, onAgentDeleted));\n subscriptions.push(TTYGContextService.onSelectedAgentChanged(onSelectedAgentChanged));\n // Deregister the watcher when the scope/directive is destroyed\n $scope.$on('$destroy', removeAllSubscribers);\n\n // =========================\n // Initialization\n // =========================\n\n function initialize() {\n // buildAgentOptionsModel();\n }\n initialize();\n }\n };\n}\n","import 'angular/core/directives/inline-editable-text/inline-editable-text.directive';\nimport {TTYGEventName} from \"../services/ttyg-context.service\";\nimport {getHumanReadableTimestamp} from \"../services/ttyg.utils\";\nimport {decodeHTML} from \"../../../../app\";\n\nconst modules = [\n 'graphdb.framework.core.directives.inline-editable-text'\n];\n\nangular\n .module('graphdb.framework.ttyg.directives.chat-list', modules)\n .directive('chatList', ChatListComponent);\n\nChatListComponent.$inject = ['TTYGContextService', 'ModalService', '$translate', '$filter'];\n\nfunction ChatListComponent(TTYGContextService, ModalService, $translate, $filter) {\n return {\n restrict: 'E',\n templateUrl: 'js/angular/ttyg/templates/chat-list.html',\n link: ($scope) => {\n\n // =========================\n // Public variables\n // =========================\n\n $scope.selectedChat = undefined;\n $scope.renamedChat = undefined;\n $scope.deletingChat = undefined;\n\n // =========================\n // Private variables\n // =========================\n\n // =========================\n // Public functions\n // =========================\n\n /**\n * Handles the selection of a chat for renaming.\n * @param {ChatModel} chat\n */\n $scope.onSelectChatForRenaming = (chat) => {\n $scope.renamedChat = chat;\n };\n\n /**\n * Handles the selection of a chat.\n * @param {ChatModel} chat\n */\n $scope.onSelectChat = (chat) => {\n if (!$scope.selectedChat || $scope.selectedChat.id !== chat.id) {\n const nonPersistedChat = TTYGContextService.getChats().getNonPersistedChat();\n if (nonPersistedChat) {\n TTYGContextService.deleteChat(nonPersistedChat);\n }\n TTYGContextService.selectChat(chat);\n $scope.renamedChat = undefined;\n }\n };\n\n /**\n * Handles the deletion of a chat.\n * @param {ChatModel} chat\n */\n $scope.onDeleteChat = (chat) => {\n const title = $translate.instant('ttyg.dialog.delete.title');\n const confirmDeleteMessage = decodeHTML($translate.instant('ttyg.dialog.delete.body', {chatName: chat.name}));\n ModalService.openConfirmation(title, confirmDeleteMessage, () => TTYGContextService.emit(TTYGEventName.DELETE_CHAT, chat));\n };\n\n /**\n * Handles the renaming of a chat.\n * @param {string} newName - the new name of the chat\n * @param {ChatModel} chat\n */\n $scope.onRenameChat = (newName, chat) => {\n chat.name = newName;\n $scope.renamedChat = undefined;\n TTYGContextService.emit(TTYGEventName.RENAME_CHAT, chat);\n };\n\n /**\n * Handles the export of a chat.\n * @param {ChatModel} chat\n */\n $scope.onExportChat = (chat) => {\n TTYGContextService.emit(TTYGEventName.CHAT_EXPORT, chat);\n };\n\n /**\n * Handles the cancelation of the chat renaming.\n */\n $scope.onCancelChatRenaming = () => {\n $scope.renamedChat = undefined;\n };\n\n $scope.getHumanReadableChatGroupTimestamp = (timestamp) => {\n return getHumanReadableTimestamp($translate, $filter, timestamp);\n };\n\n // =========================\n // Private functions\n // =========================\n\n /**\n * Handles the change of the selected chat.\n * @param {ChatModel} chat\n */\n const onSelectedChatChanged = (chat) => {\n $scope.selectedChat = chat;\n };\n\n /**\n * Handles the change of the chats list.\n * @param {ChatsListModel} chatList\n */\n const onChatsListChanged = (chatList) => {\n $scope.chatList = chatList;\n };\n\n /**\n * Handles the progress of deletion of a chat.\n * @param {{chatId: string, inProgress: boolean}} event\n */\n const onDeletingChat = (event) => {\n $scope.deletingChat = event;\n };\n\n // =========================\n // Subscriptions\n // =========================\n const subscriptions = [];\n\n const removeAllSubscribers = () => {\n subscriptions.forEach((subscription) => subscription());\n };\n\n subscriptions.push(TTYGContextService.onSelectedChatChanged(onSelectedChatChanged));\n subscriptions.push(TTYGContextService.onSelectedChatUpdated(onSelectedChatChanged));\n subscriptions.push(TTYGContextService.onChatsListChanged(onChatsListChanged));\n subscriptions.push(TTYGContextService.subscribe(TTYGEventName.DELETING_CHAT, onDeletingChat));\n\n // Deregister the watcher when the scope/directive is destroyed\n $scope.$on('$destroy', removeAllSubscribers);\n\n // =========================\n // Initialization\n // =========================\n\n function initialize() {\n }\n initialize();\n }\n };\n}\n","const modules = [];\n\nangular\n .module('graphdb.framework.ttyg.directives.show-tooltip-on-overflow', modules)\n .directive('showTooltipOnOverflow', ShowTooltipOnOverflow);\n\nfunction ShowTooltipOnOverflow() {\n return {\n link: function(scope, element) {\n function updateTooltip() {\n const innerTextElement = element[0].querySelector('.editable-text-element');\n if (!innerTextElement) return;\n\n if (innerTextElement.scrollWidth > innerTextElement.clientWidth) {\n element.attr('title', scope.chat.name);\n } else {\n element.removeAttr('title');\n }\n }\n\n // Needed in order to have values for scrollWidth and clientWidth\n setTimeout(updateTooltip, 0);\n }\n };\n}\n","/* FileSaver.js\n * A saveAs() FileSaver implementation.\n * 2015-05-07.2\n *\n * By Eli Grey, http://eligrey.com\n * License: X11/MIT\n * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md\n */\n\n/*global self */\n/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */\n\n/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */\n\nvar saveAs = saveAs || (function(view) {\n\t\"use strict\";\n\t// IE <10 is explicitly unsupported\n\tif (typeof navigator !== \"undefined\" && /MSIE [1-9]\\./.test(navigator.userAgent)) {\n\t\treturn;\n\t}\n\tvar\n\t\t doc = view.document\n\t\t // only get URL when necessary in case Blob.js hasn't overridden it yet\n\t\t, get_URL = function() {\n\t\t\treturn view.URL || view.webkitURL || view;\n\t\t}\n\t\t, save_link = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"a\")\n\t\t, can_use_save_link = \"download\" in save_link\n\t\t, click = function(node) {\n\t\t\tvar event = new MouseEvent(\"click\");\n\t\t\tnode.dispatchEvent(event);\n\t\t}\n\t\t, webkit_req_fs = view.webkitRequestFileSystem\n\t\t, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem\n\t\t, throw_outside = function(ex) {\n\t\t\t(view.setImmediate || view.setTimeout)(function() {\n\t\t\t\tthrow ex;\n\t\t\t}, 0);\n\t\t}\n\t\t, force_saveable_type = \"application/octet-stream\"\n\t\t, fs_min_size = 0\n\t\t// See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and\n\t\t// https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047\n\t\t// for the reasoning behind the timeout and revocation flow\n\t\t, arbitrary_revoke_timeout = 500 // in ms\n\t\t, revoke = function(file) {\n\t\t\tvar revoker = function() {\n\t\t\t\tif (typeof file === \"string\") { // file is an object URL\n\t\t\t\t\tget_URL().revokeObjectURL(file);\n\t\t\t\t} else { // file is a File\n\t\t\t\t\tfile.remove();\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (view.chrome) {\n\t\t\t\trevoker();\n\t\t\t} else {\n\t\t\t\tsetTimeout(revoker, arbitrary_revoke_timeout);\n\t\t\t}\n\t\t}\n\t\t, dispatch = function(filesaver, event_types, event) {\n\t\t\tevent_types = [].concat(event_types);\n\t\t\tvar i = event_types.length;\n\t\t\twhile (i--) {\n\t\t\t\tvar listener = filesaver[\"on\" + event_types[i]];\n\t\t\t\tif (typeof listener === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlistener.call(filesaver, event || filesaver);\n\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\tthrow_outside(ex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t, auto_bom = function(blob) {\n\t\t\t// prepend BOM for UTF-8 XML and text/* types (including HTML)\n\t\t\tif (/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n\t\t\t\treturn new Blob([\"\\ufeff\", blob], {type: blob.type});\n\t\t\t}\n\t\t\treturn blob;\n\t\t}\n\t\t, FileSaver = function(blob, name) {\n\t\t\tblob = auto_bom(blob);\n\t\t\t// First try a.download, then web filesystem, then object URLs\n\t\t\tvar\n\t\t\t\t filesaver = this\n\t\t\t\t, type = blob.type\n\t\t\t\t, blob_changed = false\n\t\t\t\t, object_url\n\t\t\t\t, target_view\n\t\t\t\t, dispatch_all = function() {\n\t\t\t\t\tdispatch(filesaver, \"writestart progress write writeend\".split(\" \"));\n\t\t\t\t}\n\t\t\t\t// on any filesys errors revert to saving with object URLs\n\t\t\t\t, fs_error = function() {\n\t\t\t\t\t// don't create more object URLs than needed\n\t\t\t\t\tif (blob_changed || !object_url) {\n\t\t\t\t\t\tobject_url = get_URL().createObjectURL(blob);\n\t\t\t\t\t}\n\t\t\t\t\tif (target_view) {\n\t\t\t\t\t\ttarget_view.location.href = object_url;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar new_tab = view.open(object_url, \"_blank\");\n\t\t\t\t\t\tif (new_tab == undefined && typeof safari !== \"undefined\") {\n\t\t\t\t\t\t\t//Apple do not allow window.open, see http://bit.ly/1kZffRI\n\t\t\t\t\t\t\tview.location.href = object_url\n\t\t\t\t\t\t} \n\t\t\t\t\t}\n\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\tdispatch_all();\n\t\t\t\t\trevoke(object_url);\n\t\t\t\t}\n\t\t\t\t, abortable = function(func) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif (filesaver.readyState !== filesaver.DONE) {\n\t\t\t\t\t\t\treturn func.apply(this, arguments);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t, create_if_not_found = {create: true, exclusive: false}\n\t\t\t\t, slice\n\t\t\t;\n\t\t\tfilesaver.readyState = filesaver.INIT;\n\t\t\tif (!name) {\n\t\t\t\tname = \"download\";\n\t\t\t}\n\t\t\tif (save_link) {\n\t\t\t\tobject_url = get_URL().createObjectURL(blob);\n\t\t\t\t//window.open('data:attachment/csv;charset=utf-8,' + object_url);\n\t\t\t\tsave_link.href = object_url;\n\t\t\t\tsave_link.download = name;\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tclick(save_link);\n\t\t\t\t\tdispatch_all();\n\t\t\t\t\trevoke(object_url);\n\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Object and web filesystem URLs have a problem saving in Google Chrome when\n\t\t\t// viewed in a tab, so I force save with application/octet-stream\n\t\t\t// http://code.google.com/p/chromium/issues/detail?id=91158\n\t\t\t// Update: Google errantly closed 91158, I submitted it again:\n\t\t\t// https://code.google.com/p/chromium/issues/detail?id=389642\n\t\t\tif (view.chrome && type && type !== force_saveable_type) {\n\t\t\t\tslice = blob.slice || blob.webkitSlice;\n\t\t\t\tblob = slice.call(blob, 0, blob.size, force_saveable_type);\n\t\t\t\tblob_changed = true;\n\t\t\t}\n\t\t\t// Since I can't be sure that the guessed media type will trigger a download\n\t\t\t// in WebKit, I append .download to the filename.\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=65440\n\t\t\tif (webkit_req_fs && name !== \"download\") {\n\t\t\t\tname += \".download\";\n\t\t\t}\n\t\t\tif (type === force_saveable_type || webkit_req_fs) {\n\t\t\t\ttarget_view = view;\n\t\t\t}\n\t\t\tif (!req_fs) {\n\t\t\t\tfs_error();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfs_min_size += blob.size;\n\t\t\treq_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {\n\t\t\t\tfs.root.getDirectory(\"saved\", create_if_not_found, abortable(function(dir) {\n\t\t\t\t\tvar save = function() {\n\t\t\t\t\t\tdir.getFile(name, create_if_not_found, abortable(function(file) {\n\t\t\t\t\t\t\tfile.createWriter(abortable(function(writer) {\n\t\t\t\t\t\t\t\twriter.onwriteend = function(event) {\n\t\t\t\t\t\t\t\t\ttarget_view.location.href = file.toURL();\n\t\t\t\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t\t\t\t\tdispatch(filesaver, \"writeend\", event);\n\t\t\t\t\t\t\t\t\trevoke(file);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\twriter.onerror = function() {\n\t\t\t\t\t\t\t\t\tvar error = writer.error;\n\t\t\t\t\t\t\t\t\tif (error.code !== error.ABORT_ERR) {\n\t\t\t\t\t\t\t\t\t\tfs_error();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\"writestart progress write abort\".split(\" \").forEach(function(event) {\n\t\t\t\t\t\t\t\t\twriter[\"on\" + event] = filesaver[\"on\" + event];\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\twriter.write(blob);\n\t\t\t\t\t\t\t\tfilesaver.abort = function() {\n\t\t\t\t\t\t\t\t\twriter.abort();\n\t\t\t\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tfilesaver.readyState = filesaver.WRITING;\n\t\t\t\t\t\t\t}), fs_error);\n\t\t\t\t\t\t}), fs_error);\n\t\t\t\t\t};\n\t\t\t\t\tdir.getFile(name, {create: false}, abortable(function(file) {\n\t\t\t\t\t\t// delete file if it already exists\n\t\t\t\t\t\tfile.remove();\n\t\t\t\t\t\tsave();\n\t\t\t\t\t}), abortable(function(ex) {\n\t\t\t\t\t\tif (ex.code === ex.NOT_FOUND_ERR) {\n\t\t\t\t\t\t\tsave();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfs_error();\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}), fs_error);\n\t\t\t}), fs_error);\n\t\t}\n\t\t, FS_proto = FileSaver.prototype\n\t\t, saveAs = function(blob, name) {\n\t\t\treturn new FileSaver(blob, name);\n\t\t}\n\t;\n\t// IE 10+ (native saveAs)\n\tif (typeof navigator !== \"undefined\" && navigator.msSaveOrOpenBlob) {\n\t\treturn function(blob, name) {\n\t\t\treturn navigator.msSaveOrOpenBlob(auto_bom(blob), name);\n\t\t};\n\t}\n\n\tFS_proto.abort = function() {\n\t\tvar filesaver = this;\n\t\tfilesaver.readyState = filesaver.DONE;\n\t\tdispatch(filesaver, \"abort\");\n\t};\n\tFS_proto.readyState = FS_proto.INIT = 0;\n\tFS_proto.WRITING = 1;\n\tFS_proto.DONE = 2;\n\n\tFS_proto.error =\n\tFS_proto.onwritestart =\n\tFS_proto.onprogress =\n\tFS_proto.onwrite =\n\tFS_proto.onabort =\n\tFS_proto.onerror =\n\tFS_proto.onwriteend =\n\t\tnull;\n\n\treturn saveAs;\n}(\n\t typeof self !== \"undefined\" && self\n\t|| typeof window !== \"undefined\" && window\n\t|| this.content\n));\n// `self` is undefined in Firefox for Android content script context\n// while `this` is nsIContentFrameMessageManager\n// with an attribute `content` that corresponds to the window\n\nif (typeof module !== \"undefined\" && module.exports) {\n module.exports.saveAs = saveAs;\n} else if ((typeof define !== \"undefined\" && define !== null) && (define.amd != null)) {\n define([], function() {\n return saveAs;\n });\n}","/**\n * @name helpInfoPopover\n * @restrict E\n * @scope\n *\n * @description\n * Custom element directive for showing a help info popover on hover. The content is\n * passed in through the `helpInfo` attribute and rendered using an external template.\n *\n * @param {Object} helpInfo - The help information to be displayed in the popover.\n *\n * @example\n * <help-info-popover help-info=\"myHelpData\"></help-info-popover>\n *\n * @returns {Object} Directive definition object\n */\nangular.module('graphdb.framework.core.directives.help-info-popover', [])\n .directive('helpInfoPopover', function() {\n return {\n restrict: 'E',\n scope: {\n helpInfo: '=',\n },\n templateUrl: 'js/angular/ttyg/templates/modal/helpInfoPopoverTemplate.html',\n link: function($scope, element) {\n // Track whether the popover is open\n $scope.isPopoverOpen = false;\n\n const mouseEnterHandler = () => {\n $scope.$apply(() => {\n $scope.isPopoverOpen = true;\n });\n };\n\n const mouseLeaveHandler = () => {\n $scope.$apply(() => {\n $scope.isPopoverOpen = false;\n });\n };\n\n // =========================\n // Events\n // =========================\n element.on('mouseenter', mouseEnterHandler);\n element.on('mouseleave', mouseLeaveHandler);\n\n // Clean up the event listeners on scope destroy\n $scope.$on('$destroy', function() {\n element.off('mouseenter', mouseEnterHandler);\n element.off('mouseleave', mouseLeaveHandler);\n });\n }\n };\n });\n","export const status = {\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n CONFLICT: 409,\n INTERNAL_SERVER_ERROR: 500,\n SERVICE_UNAVAILABLE: 503\n};\n","angular\n .module('graphdb.framework.ttyg.services.ttygstorage', [])\n .factory('TTYGStorageService', TTYGStorageService);\n\nTTYGStorageService.$inject = ['LocalStorageAdapter', 'LSKeys'];\n\nfunction TTYGStorageService(localStorageAdapter, LSKeys) {\n\n const defaultSettings = {\n agent: {\n id: undefined\n },\n chat: {\n id: undefined\n }\n };\n\n /**\n * Gets the TTYG settings from the local storage or returns the default settings if there are none.\n * @return {{agent: {id: undefined}, chat: {id: undefined}}}\n */\n const getTtygSettings = () => {\n let settings = localStorageAdapter.get(LSKeys.TTYG);\n if (!settings) {\n settings = defaultSettings;\n }\n if (!settings.agent) {\n settings.agent = {};\n }\n if (!settings.chat) {\n settings.chat = {};\n }\n return settings;\n };\n\n /**\n * Saves the agent in the local storage.\n * @param {AgentModel} agent\n */\n function saveAgent(agent) {\n const settings = getTtygSettings();\n // If the agent is not provided, we will persist undefined to clear any previously saved ID, if one exists.\n settings.agent.id = agent ? agent.id : undefined;\n localStorageAdapter.set(LSKeys.TTYG, settings);\n }\n\n /**\n * Gets the agent id from the local storage.\n * @return {string|undefined}\n */\n function getAgentId() {\n const settings = getTtygSettings();\n if (settings.agent) {\n return settings.agent.id;\n }\n }\n\n /**\n * Saves the chat in the local storage.\n * @param {ChatModel} chat\n */\n function saveChat(chat) {\n const settings = getTtygSettings();\n // If the chat is not provided, we will persist undefined to clear any previously saved ID, if one exists.\n settings.chat.id = chat ? chat.id : undefined;\n localStorageAdapter.set(LSKeys.TTYG, settings);\n }\n\n /**\n * Gets the chat id from the local storage.\n * @return {string|undefined}\n */\n function getChatId() {\n const settings = getTtygSettings();\n if (settings.chat) {\n return settings.chat.id;\n }\n }\n\n return {\n saveAgent,\n getAgentId,\n saveChat,\n getChatId\n };\n}\n"],"names":["editableContent","restrict","require","scope","ngModel","ngDisabled","placeholder","templateUrl","link","element","attrs","ngModelCtrl","editableDiv","find","updateModelValue","$apply","html","length","text","trim","empty","$setViewValue","innerText","$render","$viewValue","pasteHandler","event","preventDefault","originalEvent","clipboardData","getData","selection","window","getSelection","rangeCount","deleteFromDocument","range","getRangeAt","fragment","document","createDocumentFragment","lines","split","forEach","line","index","appendChild","createTextNode","createElement","insertNode","collapseToEnd","$on","removeAllSubscribers","off","on","angular","module","directive","$inject","NoAgentsView","TTYGContextService","productInfo","$scope","canModifyAgent","talkToGraphDocumentationLink","DocumentationUrlResolver","getDocumentationUrl","productShortVersion","onCreateAgent","emit","TTYGEventName","OPEN_AGENT_SETTINGS","subscriptions","push","onCanUpdateAgentUpdated","onDestroy","subscription","TTYGViewCtrl","$jwtAuth","$window","$rootScope","$http","$timeout","$translate","$uibModal","$repositories","toastr","ModalService","LocalStorageAdapter","TTYGService","TTYGStorageService","labels","filter_all","instant","pendingQuestionCancelingPromise","helpTemplateUrl","isHelpVisible","showChats","showAgents","chats","undefined","loadingChats","loadingChat","initialized","agents","selectedAgent","loadingAgents","reloadingAgents","connectorID","agentListFilterModel","activeRepositoryList","onopen","onclose","noop","startNewChat","getChats","containsNewChats","deselectChat","toggleChatsListSidebar","toggleAgentsListSidebar","onToggleHelp","onExportSelectedChat","onExportChat","getSelectedChat","getDefaultAgent","defaultAgent","Promise","resolve","then","response","setDefaultAgent","onOpenNewAgentSettings","agentDefaultValues","activeRepositoryInfo","repositoryInfoMapper","getActiveRepositoryObject","repositoryId","id","agentFormModel","agentFormModelMapper","AgentModel","AGENT_OPERATION","CREATE","controller","windowClass","backdrop","dialogModel","AgentSettingsModal","size","options","open","result","reloadAgents","catch","error","getError","TTYG_ERROR_MSG_LENGTH","onOpenAgentSettings","agent","agentToEdit","getSelectedAgent","EDIT","updatedAgent","hasSelectedAgent","selectAgent","onOpenCloneAgentSettings","agentToClone","CLONE","name","loadChats","getConversations","updateChats","setupChatListPanel","ChatsListModel","finally","getAgents","updateAgents","updateCanModifyAgent","setCanModifyAgent","isRepoManager","updateChatAnswers","selectedChat","chatItem","chatAnswer","timestamp","answers","messages","updateSelectedChat","continueRunId","CONTINUE_CHAT_RUN","ContinueChatRun","updateChatTimestamp","updateChatName","chatName","LAST_MESSAGE_RECEIVED","isEmpty","getChatId","selectChat","getFirstChat","chat","exportConversation","data","filename","saveAs","CHAT_EXPORT_SUCCESSFUL","CHAT_EXPORT_FAILURE","buildAgentsFilterModel","currentRepository","getActiveRepository","repositoryObjects","getLocalReadableGraphdbRepositories","map","repo","AgentListFilterModel","AGENTS_FILTER_ALL_KEY","goToView","confirmMessageLabelKey","viewURL","repository","getRepository","openConfirmationModal","title","message","decodeHTML","confirmButtonKey","setRepository","openView","openInSparqlEditorInNewTab","query","encodeURIComponent","setCurrentChat","chatId","getChat","$watch","activeRepo","authService","service","AuthenticationService","hasGqlRights","SelectMenuOptionsModel","value","label","loadAgents","showLoader","onSelectedChatChanged","isNew","getConversation","saveChat","status","httpStatus","NOT_FOUND","openModalAlert","deleteChat","notifyForMissingChat","LOAD_CHAT_FAILURE","onChatsListChanged","subscribe","onAgentsListChanged","CREATE_CHAT","createChat","conversationId","newChat","ChatModel","getNewChat","ASK_QUESTION","CREATE_CHAT_FAILURE","RENAME_CHAT","renameConversation","RENAME_CHAT_SUCCESSFUL","LOAD_CHATS","RENAME_CHAT_FAILURE","DELETE_CHAT","DELETING_CHAT","inProgress","deleteConversation","DELETE_CHAT_SUCCESSFUL","DELETE_CHAT_FAILURE","CANCEL_PENDING_QUESTION","selectedChatId","cancelPendingQuestion","answer","PENDING_QUESTION_CANCELED_SUCCESSFUL","CANCEL_PENDING_QUESTION_FAILURE","CHAT_EXPORT","ASK_QUESTION_STARTING","askQuestion","new","setChatAsOld","updateChatAnswersFirstResponse","cancelingResponse","currentSelectedChat","ChatMessageModel","runStatus","isTerminalState","tokenUsageInfo","addToChatAnswer","chatHistory","appendItem","ASK_QUESTION_FAILURE","continueData","continueChatRun","items","lastItem","EDIT_AGENT","CLONE_AGENT","DELETE_AGENT","DELETING_AGENT","agentId","deleteAgent","AGENT_DELETED","AGENT_SELECTED","GO_TO_CREATE_SIMILARITY_VIEW","payload","GO_TO_AUTOCOMPLETE_INDEX_VIEW","GO_TO_CONNECTORS_VIEW","GO_TO_SPARQL_EDITOR","openConfirmation","updateLabels","resetContext","ChatPanelComponent","askingChatItem","waitingForLastMessage","showCancelButton","ask","question","Date","now","cloneDeep","createNewChat","getEmptyChatItem","scrollToBottom","focusQuestionInput","regenerateQuestion","regenerateChatItem","setQuestionMessage","getQuestionMessage","onKeypressOnInput","$event","key","shiftKey","ctrlKey","onAskHowDeliveredAnswer","askHowDerivedAnswerChatItem","getAgentName","getAgent","setAskingState","isAsking","onQuestionFailure","ChatItemModel","role","CHAT_MESSAGE_ROLE","USER","setTimeout","inputElement","querySelector","focus","chatDetailsElement","scrollTop","scrollHeight","reset","$watchCollection","onSelectedChatUpdated","lastChatItem","getLast","onLastMessageReceived","onSelectedAgentChanged","onLoadChatFailure","deletedChat","onAskQuestionStarted","AgentListComponent","ExternalIntegrationModalService","agentList","selectedAgentsFilter","deletingAgent","onEditAgent","onExternalIntegration","onCloneAgent","onDeleteAgent","confirmDeleteMessage","agentName","onAgentsFilterChange","selectedFilter","filterByRepository","updateSelectedAgentsFilter","filter","selected","InlineEditableText","fieldName","source","onSave","onCancel","onClick","onDblclick","isEditing","editableModel","clickTimeout","onKeydown","cancelClickTimeout","newText","cancelEditing","onCancelEditing","onSelect","cancel","newVal","select","constructor","operation","this","AgentSelectMenuComponent","$sce","agentOptionsList","onAgentSelected","isCompatible","stopPropagation","markAsSelected","saveAgent","isRepositoryDeleted","confirmMessage","agentOption","agentsListModel","selectLastUsedOrDefaultAgent","storedAgentId","getAgentId","deletedAgent","isDeleted","ChatListComponent","$filter","renamedChat","deletingChat","onSelectChatForRenaming","onSelectChat","nonPersistedChat","getNonPersistedChat","onDeleteChat","onRenameChat","newName","onCancelChatRenaming","getHumanReadableChatGroupTimestamp","getHumanReadableTimestamp","chatList","innerTextElement","scrollWidth","clientWidth","attr","removeAttr","view","navigator","test","userAgent","doc","get_URL","URL","webkitURL","save_link","createElementNS","webkit_req_fs","webkitRequestFileSystem","req_fs","requestFileSystem","mozRequestFileSystem","throw_outside","ex","setImmediate","force_saveable_type","fs_min_size","revoke","file","revoker","revokeObjectURL","remove","chrome","dispatch","filesaver","event_types","i","concat","listener","call","auto_bom","blob","type","Blob","FileSaver","object_url","target_view","slice","blob_changed","dispatch_all","fs_error","createObjectURL","location","href","safari","readyState","DONE","abortable","func","apply","arguments","create_if_not_found","create","exclusive","INIT","download","node","MouseEvent","dispatchEvent","webkitSlice","TEMPORARY","fs","root","getDirectory","dir","save","getFile","createWriter","writer","onwriteend","toURL","onerror","code","ABORT_ERR","write","abort","WRITING","NOT_FOUND_ERR","FS_proto","prototype","msSaveOrOpenBlob","onwritestart","onprogress","onwrite","onabort","self","content","exports","define","helpInfo","isPopoverOpen","mouseEnterHandler","mouseLeaveHandler","BAD_REQUEST","UNAUTHORIZED","FORBIDDEN","CONFLICT","INTERNAL_SERVER_ERROR","SERVICE_UNAVAILABLE","localStorageAdapter","LSKeys","defaultSettings","getTtygSettings","settings","get","TTYG","set","factory"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- export const __webpack_id__=12396;export const __webpack_ids__=[12396];export const __webpack_modules__={12396:(n,o,i)=>{i.r(o),i.d(o,{default:()=>l});const l='<link href="css/graphql/graphql-playground.css?v=3.2.0-TR4" rel="stylesheet"/> <div class="graphql-playground-view"> <h1 id="title-container"> <span id="graphql-playground-title-label">{{title}}</span> <page-info-tooltip></page-info-tooltip> <div ng-if="!loadingEndpoints && graphqlEndpoints.length" class="toolbar pull-right"> <select ng-model="selectedGraphqlEndpoint" ng-options="endpoint as endpoint.label for endpoint in graphqlEndpoints" ng-change="onGraphqlEndpointChange(selectedGraphqlEndpoint)" class="form-control graphql-endpoint-selector" gdb-tooltip="{{\'graphql.playground.endpoint_selector.tooltip\' | translate}}" tooltip-placement="top"> </select> </div> </h1> <div core-errors></div> <div onto-loader-new ng-show="loadingEndpoints" class="graphql-playground-page-loader" size="100"> </div> <div class="content" ng-if="initialized"> <div class="no-endpoints-view" ng-show="!loadingEndpoints && configuration === undefined && !graphqlEndpoints.length"> <div class="alert alert-warning"> <div ng-bind-html="\'graphql.playground.message.no_schemas_in_repository\' | translate | trustAsHtml"></div> </div> </div> <div class="graphql-playground-container" ng-if="!loadingEndpoints && configuration && getActiveRepositoryNoError()"> <graphql-playground id="graphql-playground" configuration="configuration"></graphql-playground> </div> </div> </div> '}};
2
- //# sourceMappingURL=12396.a1b7856e86d52282f34c.bundle.js.map
1
+ export const __webpack_id__=12396;export const __webpack_ids__=[12396];export const __webpack_modules__={12396:(n,o,i)=>{i.r(o),i.d(o,{default:()=>l});const l='<link href="css/graphql/graphql-playground.css?v=3.2.0-TR5" rel="stylesheet"/> <div class="graphql-playground-view"> <h1 id="title-container"> <span id="graphql-playground-title-label">{{title}}</span> <page-info-tooltip></page-info-tooltip> <div ng-if="!loadingEndpoints && graphqlEndpoints.length" class="toolbar pull-right"> <select ng-model="selectedGraphqlEndpoint" ng-options="endpoint as endpoint.label for endpoint in graphqlEndpoints" ng-change="onGraphqlEndpointChange(selectedGraphqlEndpoint)" class="form-control graphql-endpoint-selector" gdb-tooltip="{{\'graphql.playground.endpoint_selector.tooltip\' | translate}}" tooltip-placement="top"> </select> </div> </h1> <div core-errors></div> <div onto-loader-new ng-show="loadingEndpoints" class="graphql-playground-page-loader" size="100"> </div> <div class="content" ng-if="initialized"> <div class="no-endpoints-view" ng-show="!loadingEndpoints && configuration === undefined && !graphqlEndpoints.length"> <div class="alert alert-warning"> <div ng-bind-html="\'graphql.playground.message.no_schemas_in_repository\' | translate | trustAsHtml"></div> </div> </div> <div class="graphql-playground-container" ng-if="!loadingEndpoints && configuration && getActiveRepositoryNoError()"> <graphql-playground id="graphql-playground" configuration="configuration"></graphql-playground> </div> </div> </div> '}};
2
+ //# sourceMappingURL=12396.bb3eab12cf754ea62ada.bundle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"12396.a1b7856e86d52282f34c.bundle.js","mappings":"uJAGA,QAFW,o1C","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/graphql/templates/graphql-playground.html"],"sourcesContent":["// Module\nvar code = `<link href=\"css/graphql/graphql-playground.css?v=3.2.0-TR4\" rel=\"stylesheet\"/> <div class=\"graphql-playground-view\"> <h1 id=\"title-container\"> <span id=\"graphql-playground-title-label\">{{title}}</span> <page-info-tooltip></page-info-tooltip> <div ng-if=\"!loadingEndpoints && graphqlEndpoints.length\" class=\"toolbar pull-right\"> <select ng-model=\"selectedGraphqlEndpoint\" ng-options=\"endpoint as endpoint.label for endpoint in graphqlEndpoints\" ng-change=\"onGraphqlEndpointChange(selectedGraphqlEndpoint)\" class=\"form-control graphql-endpoint-selector\" gdb-tooltip=\"{{'graphql.playground.endpoint_selector.tooltip' | translate}}\" tooltip-placement=\"top\"> </select> </div> </h1> <div core-errors></div> <div onto-loader-new ng-show=\"loadingEndpoints\" class=\"graphql-playground-page-loader\" size=\"100\"> </div> <div class=\"content\" ng-if=\"initialized\"> <div class=\"no-endpoints-view\" ng-show=\"!loadingEndpoints && configuration === undefined && !graphqlEndpoints.length\"> <div class=\"alert alert-warning\"> <div ng-bind-html=\"'graphql.playground.message.no_schemas_in_repository' | translate | trustAsHtml\"></div> </div> </div> <div class=\"graphql-playground-container\" ng-if=\"!loadingEndpoints && configuration && getActiveRepositoryNoError()\"> <graphql-playground id=\"graphql-playground\" configuration=\"configuration\"></graphql-playground> </div> </div> </div> `;\n// Exports\nexport default code;"],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"12396.bb3eab12cf754ea62ada.bundle.js","mappings":"uJAGA,QAFW,o1C","sources":["webpack://root-config/./packages/legacy-workbench/src/js/angular/graphql/templates/graphql-playground.html"],"sourcesContent":["// Module\nvar code = `<link href=\"css/graphql/graphql-playground.css?v=3.2.0-TR5\" rel=\"stylesheet\"/> <div class=\"graphql-playground-view\"> <h1 id=\"title-container\"> <span id=\"graphql-playground-title-label\">{{title}}</span> <page-info-tooltip></page-info-tooltip> <div ng-if=\"!loadingEndpoints && graphqlEndpoints.length\" class=\"toolbar pull-right\"> <select ng-model=\"selectedGraphqlEndpoint\" ng-options=\"endpoint as endpoint.label for endpoint in graphqlEndpoints\" ng-change=\"onGraphqlEndpointChange(selectedGraphqlEndpoint)\" class=\"form-control graphql-endpoint-selector\" gdb-tooltip=\"{{'graphql.playground.endpoint_selector.tooltip' | translate}}\" tooltip-placement=\"top\"> </select> </div> </h1> <div core-errors></div> <div onto-loader-new ng-show=\"loadingEndpoints\" class=\"graphql-playground-page-loader\" size=\"100\"> </div> <div class=\"content\" ng-if=\"initialized\"> <div class=\"no-endpoints-view\" ng-show=\"!loadingEndpoints && configuration === undefined && !graphqlEndpoints.length\"> <div class=\"alert alert-warning\"> <div ng-bind-html=\"'graphql.playground.message.no_schemas_in_repository' | translate | trustAsHtml\"></div> </div> </div> <div class=\"graphql-playground-container\" ng-if=\"!loadingEndpoints && configuration && getActiveRepositoryNoError()\"> <graphql-playground id=\"graphql-playground\" configuration=\"configuration\"></graphql-playground> </div> </div> </div> `;\n// Exports\nexport default code;"],"names":[],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- export const __webpack_id__=15535;export const __webpack_ids__=[15535];export const __webpack_modules__={15535:(e,t,s)=>{s.r(t),s.d(t,{default:()=>a});const a='<script type="text/ng-template" id="popover-content-user.html"> <h5>{{\'security.user.may\' | translate}}</h5>\n\t<ul>\n <li>{{\'security.use.gdb\' | translate}}</li>\n\t <li>{{\'security.grant.read.access\' | translate}}</li>\n\t\t<li>{{\'security.grant.read.write.access\' | translate}}</li>\n </ul> <\/script> <script type="text/ng-template" id="popover-content-repo-manager.html"> <h5>{{\'security.repo.manager.may\' | translate}}</h5>\n\t<ul>\n\t\t<li>{{\'security.use.gdb\' | translate}}</li>\n\t\t<li>{{\'security.read.write.all.repos\' | translate}}</li>\n\t\t<li>{{\'security.create.edit.delete.repos\' | translate}}</li>\n\t\t<li>{{\'security.access.monitoring\' | translate}}</li>\n\t</ul> <\/script> <script type="text/ng-template" id="popover-content-admin.html"> <h5>{{\'security.admin.may\' | translate}}</h5>\n\t<ul>\n\t\t<li>{{\'security.use.gdb\' | translate}}</li>\n\t\t<li>{{\'security.read.write.all.repos\' | translate}}</li>\n\t\t<li>{{\'security.create.edit.delete.repos\' | translate}}</li>\n\t\t<li>{{\'security.access.monitoring\' | translate}}</li>\n\t\t<li>{{\'security.attach.remote.locations\' | translate}}</li>\n\t\t<li>{{\'security.manage.users.access\' | translate}}</li>\n\t\t<li>{{\'security.manage.cluster\' | translate}}</li>\n\t\t<li>{{\'security.view.sys.info\' | translate}}</li>\n\t</ul> <\/script> <link href="css/lib/ng-tags-input/ng-tags-input.min.css?v=3.2.0-TR4" rel="stylesheet"/> <link href="css/user.css?v=3.2.0-TR4" rel="stylesheet"/> <h1> {{pageTitle}} <page-info-tooltip></page-info-tooltip> </h1> <div id="wb-user" class="wb-user" ng-hide="loader"> <form name="form" class="form newUserForm userForm editUserContainer" ng-submit="submit()" novalidate> <div class="row"> <div class="col-md-6 us-left-col"> <div class="card login-credentials" ng-hide="isOverrideAuth() || !isLocalAuthentication()"> <div class="card-block"> <h3>{{\'view.login.title\' | translate}}</h3> <div class="form-group" ng-class="{\'has-danger\': usernameError}"> <div class="input-group"> <span class="input-group-addon" gdb-tooltip="{{\'security.table.username\' | translate}}"><i class="fa-solid fa-user text-muted"></i></span> <input id="wb-user-username" placeholder="{{\'security.table.username\' | translate}}" name="username" class="form-control form-control-lg" type="text" ng-model="user.username" ng-readonly="mode !== \'add\'"> </div> <div ng-show="usernameError" class="form-control-feedback">{{usernameError}}</div> </div> <div class="form-group" ng-class="{\'has-danger\': passwordError}"> <div class="input-group"> <span class="input-group-addon" gdb-tooltip="{{\'security.password.placeholder\' | translate}}"><em class="icon-lock icon-2x text-muted"></em></span> <input id="wb-user-password" placeholder="{{passwordPlaceholder | translate}}" name="password" class="form-control form-control-lg" type="password" ng-model="user.password" ng-hide="user.external || hasExternalAuthUser()" ng-readonly="noPassword"> <span ng-show="user.external || hasExternalAuthUser()">{{\'security.auth.from.external.module\' | translate}}</span> </div> <div ng-show="passwordError" class="form-control-feedback">{{passwordError}}</div> </div> <div class="form-group" ng-class="{\'has-danger\': confirmPasswordError}" ng-hide="user.external || hasExternalAuthUser()"> <div class="input-group"> <span class="input-group-addon" gdb-tooltip="{{\'security.password.confirm\' | translate}}"><em class="icon-lock icon-2x text-muted"></em></span> <input id="wb-user-confirmpassword" placeholder="{{\'security.password.confirm\' | translate}}" name="password_confirm" class="form-control form-control-lg" type="password" ng-model="user.confirmpassword" ng-readonly="noPassword"> </div> <div ng-show="confirmPasswordError" class="form-control-feedback">{{confirmPasswordError}}</div> </div> <div> <label class="d-block"> <input type="checkbox" id="noPassword" ng-model="noPassword" ng-change="setNoPassword()"> <span ng-show="mode === \'add\'">{{\'security.dont.set.password\' | translate}} </span> <span ng-show="mode !== \'add\'">{{\'security.unset.password\' | translate}} </span> </label> </div> </div> </div> <div class="card sparql-editor-settings" id="user-settings"> <div class="card-block"> <h3>{{\'security.user.settings\' | translate}}</h3> <div id="sameas-on" class="mb-1"> <span class="sameas-label"> {{\'security.expand.sameAs.is\' | translate}} <span class="tag {{user.appSettings.DEFAULT_SAMEAS ? \'tag-primary\' : \'tag-default\'}}"> {{user.appSettings.DEFAULT_SAMEAS ? \'common.on.btn\' : \'common.off.btn\' | translate}} </span> </span> <span gdb-tooltip="{{shouldDisableSameAs() ? \'core.require.inferred\' : \'security.tooltip.click.me\' | translate}}" tooltip-placement="top" ng-click="user.appSettings.DEFAULT_SAMEAS = !user.appSettings.DEFAULT_SAMEAS" class="switch mr-0"> <input id="sameAsCheck" type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_SAMEAS" ng-disabled="shouldDisableSameAs()"/> <label for="sameas-on"></label> </span> {{\'security.default.editor.graph\' | translate}} </div> <div id="inference-on" class="mb-1"> <span class="inference-label"> {{\'security.inference.is\' | translate}} <span class="tag {{user.appSettings.DEFAULT_INFERENCE ? \'tag-primary\' : \'tag-default\'}}"> {{user.appSettings.DEFAULT_INFERENCE ? \'common.on.btn\' : \'common.off.btn\' | translate}} </span> </span> <span gdb-tooltip="{{\'security.tooltip.click.me\' | translate}}" tooltip-placement="top" ng-click="user.appSettings.DEFAULT_INFERENCE = !user.appSettings.DEFAULT_INFERENCE" class="switch mr-0"> <input type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_INFERENCE"/> <label for="inference-on"></label> </span> {{\'security.default.editor.graph\' | translate}} </div> <div id="schema-on" class="mb-1"> <span class="schema-label"> {{\'security.show.schema\' | translate}} <span class="tag {{user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA ? \'tag-primary\' : \'tag-default\'}}"> {{user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA ? \'common.on.btn\' : \'common.off.btn\' | translate}} </span> <span gdb-tooltip="{{\'security.tooltip.click.me\' | translate}}" tooltip-placement="top" ng-click="user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA = !user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA" class="switch mr-0"> <input type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA"/> <label for="schema-on"></label> </span> {{\'security.default.visual.graph\' | translate}} </span> </div> <label class="d-block"> <input type="checkbox" ng-model="user.appSettings.EXECUTE_COUNT" id="defaultCount" checked="appSettings.EXECUTE_COUNT"> {{\'security.count.total.results\' | translate}} </label> <label class="d-block"> <input type="checkbox" ng-model="user.appSettings.IGNORE_SHARED_QUERIES" id="ignore-shared" checked="appSettings.IGNORE_SHARED_QUERIES"> {{\'security.ignore.shared.queries\' | translate}} </label> <label class="d-block" ng-if="showCookiePolicyLink"> <button class="btn btn-secondary show-cookie-policy-btn" ng-click="showCookiePolicy($event)">{{\'cookie.cookie_policy_url_label\' | translate}}</button> </label> </div> </div> <div class="card" id="workbench-settings" ng-if="showWorkbenchSettings"> <div class="card-block"> <h3>{{\'security.workbench.settings.title\' | translate}} <em class="icon-info text-tertiary small" gdb-tooltip="{{\'security.workbench.settings.theme.tooltip\' | translate}}"></em></h3> <div> <div class="form-group"> <label class="col-lg-2">{{\'security.workbench.settings.theme.label\' | translate}}</label> <div class="btn-group theme-selector-dropdown" uib-dropdown> <button type="button" class="btn btn-sm btn-secondary dropdown-toggle theme-selector-dropdown-btn" uib-dropdown-toggle> {{selectedTheme.label}} </button> <ul class="dropdown-menu" role="menu"> <li ng-repeat="theme in themes"> <a ng-click="setTheme(theme)" class="dropdown-item">{{theme.label}}</a> </li> </ul> </div> </div> <div class="form-group"> <label class="col-lg-2">{{\'security.workbench.settings.theme.mode.label\' | translate}}</label> <div class="radio"> <label class="px-1"> <input type="radio" value="light" ng-model="workbenchSettings.mode" ng-change="setThemeMode()"/> {{\'security.workbench.settings.theme.mode.light\' | translate}} </label> <label class="px-1"> <input type="radio" value="dark" ng-model="workbenchSettings.mode" ng-change="setThemeMode()"/> {{\'security.workbench.settings.theme.mode.dark\' | translate}} </label> </div> </div> </div> </div> </div> </div> <div class="col-md-6 us-right-col" ng-hide="!isLocalAuthentication()"> <div class="card user-role" id="user-roles"> <div class="card-block"> <h3>{{\'security.user.role\' | translate}}</h3> <label class="mr-1" uib-popover-template="\'popover-content-user.html\'" popover-trigger="mouseenter" popover-placement="bottom"> <input type="radio" ng-model="userType" id="roleUser" value="user" ng-disabled="hasEditRestrictions()"> {{\'security.user.label\' | translate}} </label> <label class="mr-1" uib-popover-template="\'popover-content-repo-manager.html\'" popover-trigger="mouseenter" popover-placement="bottom"> <input type="radio" ng-model="userType" id="roleRepoAdmin" value="repoManager" ng-disabled="hasEditRestrictions()"> {{\'security.repo.manager.label\' | translate}} </label> <label uib-popover-template="\'popover-content-admin.html\'" popover-trigger="mouseenter" popover-placement="bottom"> <input type="radio" ng-model="userType" id="roleAdmin" value="admin" ng-disabled="hasEditRestrictions()"> {{\'security.admin.label\' | translate}} </label> </div> </div> <div class="card user-custom-roles" id="user-custom-roles"> <div class="card-block"> <h3>{{\'security.user.custom_role\' | translate}}</h3> <div class="input-group"> <tags-input name="customRoleTag" class="wb-tags-input" ng-model="customRoles" min-length="1" ng-disabled="!isUser() || mode === \'settings\'" use-strings="true" add-on-space="true" add-on-comma="true" add-on-paste="true" replace-spaces-with-dashes="false" paste-split-pattern="[\\s+]" on-tag-adding="isCustomRoleValid($tag)" on-tag-added="addCustomRole($tag)" ng-keydown="checkUserInput($event)" ng-cut="removeErrorOnCut()" placeholder="{{\'security.user.add.custom_role.msg\' | translate}}" custom-prefix-tags-input></tags-input> <div class="small" ng-hide="isRoleValid"> <small>{{\'security.user.role.too.short\' | translate}}</small> </div> <div class="small prefix-warning" ng-if="form.customRoleTag.$warning"> <small>{{\'acl_management.rulestable.custom_prefix_warning.text\' | translate}}</small> </div> </div> </div> </div> <div id="user-repos" class="card user-repositories"> <div class="card-block"> <h3>{{\'security.repo.rights\' | translate}}</h3> <div class="has-danger"> <p ng-show="repositoryCheckError" class="form-control-feedback"> {{\'security.user.rights\' | translate}} </p> </div> <div class="scrollable-table"> <table class="table table-hover table-sm table-fixed bordered-table" aria-describedby="User rights table"> <thead> <tr> <th id="repositoryIdColumn" class="repository-column auth-column">{{\'security.repository.title\' | translate}}</th> <th id="readRightsColumn" class="text-xs-center read-column auth-column"><span class="auth-column-label">{{\'security.label.read\' | translate}}</span><em class="icon-eye icon-lg" gdb-tooltip="{{\'security.tooltip.read\' | translate}}"></em></th> <th id="writeRightColumn" class="text-xs-center write-column auth-column"><span class="auth-column-label">{{\'security.label.write\' | translate}}</span><em class="icon-edit icon-lg" gdb-tooltip="{{\'security.tooltip.write\' | translate}}"></em></th> <th id="graphql" class="text-xs-center auth-column graphql-column"><span class="auth-column-label">{{\'security.label.graphql\' | translate}}</span></th> </tr> <tr> <th>{{\'security.any.data.repo\' | translate}} <em class="icon-info text-tertiary" gdb-tooltip="{{\'security.data.repos\' | translate}}"></em> </th> <th class="text-xs-center"> <span ng-click="setGrantedAuthorities()"> <input class="read" type="checkbox" ng-model="grantedAuthorities.READ_REPO[\'*\']" ng-checked="hasReadPermission(\'*\')" ng-disabled="readCheckDisabled(\'*\')"> </span> </th> <th class="text-xs-center write-any"> <span ng-click="setGrantedAuthorities()"> <input class="write" type="checkbox" ng-model="grantedAuthorities.WRITE_REPO[\'*\']" ng-checked="hasWritePermission(\'*\')" ng-disabled="writeCheckDisabled(\'*\')"> </span> </th> <th class="text-xs-center"> <span ng-click="setGrantedAuthorities()"> <input class="graphql" type="checkbox" ng-model="grantedAuthorities.GRAPHQL[\'*\']" ng-checked="hasGraphqlPermission(\'*\')" ng-disabled="graphqlCheckDisabled(\'*\')"> </span> </th> </tr> </thead> <tbody> <div> <tr ng-repeat="repository in getReadableRepositories() | orderBy: [\'location\', \'id\']"> <td class="repository-name">{{repository.id}}<small><em ng-if="(hasGraphqlPermission(repository) || hasGraphqlPermission(\'*\')) && (hasReadPermission(repository) || hasReadPermission(\'*\') || hasWritePermission(repository) || hasWritePermission(\'*\'))" class="fa-kit fa-gdb-graphql graphql-icon text-info" gdb-tooltip="{{\'security.tooltip.graphql\' | translate}}"></em> &middot; {{repository.location ? repository.location : \'repo.local\' | translate}}</small></td> <td class="text-xs-center read-rights"> <span ng-click="setGrantedAuthorities()"> <input class="read" type="checkbox" ng-model="grantedAuthorities.READ_REPO[createUniqueKey(repository)]" ng-checked="hasReadPermission(repository)" ng-disabled="readCheckDisabled(repository)"> </span> </td> <td class="text-xs-center write-rights"> <span ng-click="setGrantedAuthorities()"> <input class="write" type="checkbox" ng-model="grantedAuthorities.WRITE_REPO[createUniqueKey(repository)]" ng-checked="hasWritePermission(repository)" ng-disabled="writeCheckDisabled(repository)"> </span> </td> <td class="text-xs-center graphql-rights"> <span ng-click="setGrantedAuthorities()"> <input class="graphql" type="checkbox" ng-model="grantedAuthorities.GRAPHQL[createUniqueKey(repository)]" ng-checked="hasGraphqlPermission(repository)" ng-disabled="graphqlCheckDisabled(repository)"> </span> </td> </tr> </div> </tbody> </table> </div> </div> </div> </div> </div> <div class="text-right"> <button id="wb-user-goBack" class="btn btn-secondary" type="button" ng-click="goBack()">{{\'common.cancel.btn\' | translate}}</button> <button id="wb-user-submit" class="btn btn-primary" type="submit" ng-disabled="!isRoleValid">{{saveButtonText}}</button> </div> </form> </div> <div class="ot-loader ot-main-loader" onto-loader size="50" ng-show="loader"></div> '}};
2
- //# sourceMappingURL=15535.c58319cba275ee5baa90.bundle.js.map
1
+ export const __webpack_id__=15535;export const __webpack_ids__=[15535];export const __webpack_modules__={15535:(e,t,s)=>{s.r(t),s.d(t,{default:()=>a});const a='<script type="text/ng-template" id="popover-content-user.html"> <h5>{{\'security.user.may\' | translate}}</h5>\n\t<ul>\n <li>{{\'security.use.gdb\' | translate}}</li>\n\t <li>{{\'security.grant.read.access\' | translate}}</li>\n\t\t<li>{{\'security.grant.read.write.access\' | translate}}</li>\n </ul> <\/script> <script type="text/ng-template" id="popover-content-repo-manager.html"> <h5>{{\'security.repo.manager.may\' | translate}}</h5>\n\t<ul>\n\t\t<li>{{\'security.use.gdb\' | translate}}</li>\n\t\t<li>{{\'security.read.write.all.repos\' | translate}}</li>\n\t\t<li>{{\'security.create.edit.delete.repos\' | translate}}</li>\n\t\t<li>{{\'security.access.monitoring\' | translate}}</li>\n\t</ul> <\/script> <script type="text/ng-template" id="popover-content-admin.html"> <h5>{{\'security.admin.may\' | translate}}</h5>\n\t<ul>\n\t\t<li>{{\'security.use.gdb\' | translate}}</li>\n\t\t<li>{{\'security.read.write.all.repos\' | translate}}</li>\n\t\t<li>{{\'security.create.edit.delete.repos\' | translate}}</li>\n\t\t<li>{{\'security.access.monitoring\' | translate}}</li>\n\t\t<li>{{\'security.attach.remote.locations\' | translate}}</li>\n\t\t<li>{{\'security.manage.users.access\' | translate}}</li>\n\t\t<li>{{\'security.manage.cluster\' | translate}}</li>\n\t\t<li>{{\'security.view.sys.info\' | translate}}</li>\n\t</ul> <\/script> <link href="css/lib/ng-tags-input/ng-tags-input.min.css?v=3.2.0-TR5" rel="stylesheet"/> <link href="css/user.css?v=3.2.0-TR5" rel="stylesheet"/> <h1> {{pageTitle}} <page-info-tooltip></page-info-tooltip> </h1> <div id="wb-user" class="wb-user" ng-hide="loader"> <form name="form" class="form newUserForm userForm editUserContainer" ng-submit="submit()" novalidate> <div class="row"> <div class="col-md-6 us-left-col"> <div class="card login-credentials" ng-hide="isOverrideAuth() || !isLocalAuthentication()"> <div class="card-block"> <h3>{{\'view.login.title\' | translate}}</h3> <div class="form-group" ng-class="{\'has-danger\': usernameError}"> <div class="input-group"> <span class="input-group-addon" gdb-tooltip="{{\'security.table.username\' | translate}}"><i class="fa-solid fa-user text-muted"></i></span> <input id="wb-user-username" placeholder="{{\'security.table.username\' | translate}}" name="username" class="form-control form-control-lg" type="text" ng-model="user.username" ng-readonly="mode !== \'add\'"> </div> <div ng-show="usernameError" class="form-control-feedback">{{usernameError}}</div> </div> <div class="form-group" ng-class="{\'has-danger\': passwordError}"> <div class="input-group"> <span class="input-group-addon" gdb-tooltip="{{\'security.password.placeholder\' | translate}}"><em class="icon-lock icon-2x text-muted"></em></span> <input id="wb-user-password" placeholder="{{passwordPlaceholder | translate}}" name="password" class="form-control form-control-lg" type="password" ng-model="user.password" ng-hide="user.external || hasExternalAuthUser()" ng-readonly="noPassword"> <span ng-show="user.external || hasExternalAuthUser()">{{\'security.auth.from.external.module\' | translate}}</span> </div> <div ng-show="passwordError" class="form-control-feedback">{{passwordError}}</div> </div> <div class="form-group" ng-class="{\'has-danger\': confirmPasswordError}" ng-hide="user.external || hasExternalAuthUser()"> <div class="input-group"> <span class="input-group-addon" gdb-tooltip="{{\'security.password.confirm\' | translate}}"><em class="icon-lock icon-2x text-muted"></em></span> <input id="wb-user-confirmpassword" placeholder="{{\'security.password.confirm\' | translate}}" name="password_confirm" class="form-control form-control-lg" type="password" ng-model="user.confirmpassword" ng-readonly="noPassword"> </div> <div ng-show="confirmPasswordError" class="form-control-feedback">{{confirmPasswordError}}</div> </div> <div> <label class="d-block"> <input type="checkbox" id="noPassword" ng-model="noPassword" ng-change="setNoPassword()"> <span ng-show="mode === \'add\'">{{\'security.dont.set.password\' | translate}} </span> <span ng-show="mode !== \'add\'">{{\'security.unset.password\' | translate}} </span> </label> </div> </div> </div> <div class="card sparql-editor-settings" id="user-settings"> <div class="card-block"> <h3>{{\'security.user.settings\' | translate}}</h3> <div id="sameas-on" class="mb-1"> <span class="sameas-label"> {{\'security.expand.sameAs.is\' | translate}} <span class="tag {{user.appSettings.DEFAULT_SAMEAS ? \'tag-primary\' : \'tag-default\'}}"> {{user.appSettings.DEFAULT_SAMEAS ? \'common.on.btn\' : \'common.off.btn\' | translate}} </span> </span> <span gdb-tooltip="{{shouldDisableSameAs() ? \'core.require.inferred\' : \'security.tooltip.click.me\' | translate}}" tooltip-placement="top" ng-click="user.appSettings.DEFAULT_SAMEAS = !user.appSettings.DEFAULT_SAMEAS" class="switch mr-0"> <input id="sameAsCheck" type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_SAMEAS" ng-disabled="shouldDisableSameAs()"/> <label for="sameas-on"></label> </span> {{\'security.default.editor.graph\' | translate}} </div> <div id="inference-on" class="mb-1"> <span class="inference-label"> {{\'security.inference.is\' | translate}} <span class="tag {{user.appSettings.DEFAULT_INFERENCE ? \'tag-primary\' : \'tag-default\'}}"> {{user.appSettings.DEFAULT_INFERENCE ? \'common.on.btn\' : \'common.off.btn\' | translate}} </span> </span> <span gdb-tooltip="{{\'security.tooltip.click.me\' | translate}}" tooltip-placement="top" ng-click="user.appSettings.DEFAULT_INFERENCE = !user.appSettings.DEFAULT_INFERENCE" class="switch mr-0"> <input type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_INFERENCE"/> <label for="inference-on"></label> </span> {{\'security.default.editor.graph\' | translate}} </div> <div id="schema-on" class="mb-1"> <span class="schema-label"> {{\'security.show.schema\' | translate}} <span class="tag {{user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA ? \'tag-primary\' : \'tag-default\'}}"> {{user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA ? \'common.on.btn\' : \'common.off.btn\' | translate}} </span> <span gdb-tooltip="{{\'security.tooltip.click.me\' | translate}}" tooltip-placement="top" ng-click="user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA = !user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA" class="switch mr-0"> <input type="checkbox" class="switch" ng-checked="user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA"/> <label for="schema-on"></label> </span> {{\'security.default.visual.graph\' | translate}} </span> </div> <label class="d-block"> <input type="checkbox" ng-model="user.appSettings.EXECUTE_COUNT" id="defaultCount" checked="appSettings.EXECUTE_COUNT"> {{\'security.count.total.results\' | translate}} </label> <label class="d-block"> <input type="checkbox" ng-model="user.appSettings.IGNORE_SHARED_QUERIES" id="ignore-shared" checked="appSettings.IGNORE_SHARED_QUERIES"> {{\'security.ignore.shared.queries\' | translate}} </label> <label class="d-block" ng-if="showCookiePolicyLink"> <button class="btn btn-secondary show-cookie-policy-btn" ng-click="showCookiePolicy($event)">{{\'cookie.cookie_policy_url_label\' | translate}}</button> </label> </div> </div> <div class="card" id="workbench-settings" ng-if="showWorkbenchSettings"> <div class="card-block"> <h3>{{\'security.workbench.settings.title\' | translate}} <em class="icon-info text-tertiary small" gdb-tooltip="{{\'security.workbench.settings.theme.tooltip\' | translate}}"></em></h3> <div> <div class="form-group"> <label class="col-lg-2">{{\'security.workbench.settings.theme.label\' | translate}}</label> <div class="btn-group theme-selector-dropdown" uib-dropdown> <button type="button" class="btn btn-sm btn-secondary dropdown-toggle theme-selector-dropdown-btn" uib-dropdown-toggle> {{selectedTheme.label}} </button> <ul class="dropdown-menu" role="menu"> <li ng-repeat="theme in themes"> <a ng-click="setTheme(theme)" class="dropdown-item">{{theme.label}}</a> </li> </ul> </div> </div> <div class="form-group"> <label class="col-lg-2">{{\'security.workbench.settings.theme.mode.label\' | translate}}</label> <div class="radio"> <label class="px-1"> <input type="radio" value="light" ng-model="workbenchSettings.mode" ng-change="setThemeMode()"/> {{\'security.workbench.settings.theme.mode.light\' | translate}} </label> <label class="px-1"> <input type="radio" value="dark" ng-model="workbenchSettings.mode" ng-change="setThemeMode()"/> {{\'security.workbench.settings.theme.mode.dark\' | translate}} </label> </div> </div> </div> </div> </div> </div> <div class="col-md-6 us-right-col" ng-hide="!isLocalAuthentication()"> <div class="card user-role" id="user-roles"> <div class="card-block"> <h3>{{\'security.user.role\' | translate}}</h3> <label class="mr-1" uib-popover-template="\'popover-content-user.html\'" popover-trigger="mouseenter" popover-placement="bottom"> <input type="radio" ng-model="userType" id="roleUser" value="user" ng-disabled="hasEditRestrictions()"> {{\'security.user.label\' | translate}} </label> <label class="mr-1" uib-popover-template="\'popover-content-repo-manager.html\'" popover-trigger="mouseenter" popover-placement="bottom"> <input type="radio" ng-model="userType" id="roleRepoAdmin" value="repoManager" ng-disabled="hasEditRestrictions()"> {{\'security.repo.manager.label\' | translate}} </label> <label uib-popover-template="\'popover-content-admin.html\'" popover-trigger="mouseenter" popover-placement="bottom"> <input type="radio" ng-model="userType" id="roleAdmin" value="admin" ng-disabled="hasEditRestrictions()"> {{\'security.admin.label\' | translate}} </label> </div> </div> <div class="card user-custom-roles" id="user-custom-roles"> <div class="card-block"> <h3>{{\'security.user.custom_role\' | translate}}</h3> <div class="input-group"> <tags-input name="customRoleTag" class="wb-tags-input" ng-model="customRoles" min-length="1" ng-disabled="!isUser() || mode === \'settings\'" use-strings="true" add-on-space="true" add-on-comma="true" add-on-paste="true" replace-spaces-with-dashes="false" paste-split-pattern="[\\s+]" on-tag-adding="isCustomRoleValid($tag)" on-tag-added="addCustomRole($tag)" ng-keydown="checkUserInput($event)" ng-cut="removeErrorOnCut()" placeholder="{{\'security.user.add.custom_role.msg\' | translate}}" custom-prefix-tags-input></tags-input> <div class="small" ng-hide="isRoleValid"> <small>{{\'security.user.role.too.short\' | translate}}</small> </div> <div class="small prefix-warning" ng-if="form.customRoleTag.$warning"> <small>{{\'acl_management.rulestable.custom_prefix_warning.text\' | translate}}</small> </div> </div> </div> </div> <div id="user-repos" class="card user-repositories"> <div class="card-block"> <h3>{{\'security.repo.rights\' | translate}}</h3> <div class="has-danger"> <p ng-show="repositoryCheckError" class="form-control-feedback"> {{\'security.user.rights\' | translate}} </p> </div> <div class="scrollable-table"> <table class="table table-hover table-sm table-fixed bordered-table" aria-describedby="User rights table"> <thead> <tr> <th id="repositoryIdColumn" class="repository-column auth-column">{{\'security.repository.title\' | translate}}</th> <th id="readRightsColumn" class="text-xs-center read-column auth-column"><span class="auth-column-label">{{\'security.label.read\' | translate}}</span><em class="icon-eye icon-lg" gdb-tooltip="{{\'security.tooltip.read\' | translate}}"></em></th> <th id="writeRightColumn" class="text-xs-center write-column auth-column"><span class="auth-column-label">{{\'security.label.write\' | translate}}</span><em class="icon-edit icon-lg" gdb-tooltip="{{\'security.tooltip.write\' | translate}}"></em></th> <th id="graphql" class="text-xs-center auth-column graphql-column"><span class="auth-column-label">{{\'security.label.graphql\' | translate}}</span></th> </tr> <tr> <th>{{\'security.any.data.repo\' | translate}} <em class="icon-info text-tertiary" gdb-tooltip="{{\'security.data.repos\' | translate}}"></em> </th> <th class="text-xs-center"> <span ng-click="setGrantedAuthorities()"> <input class="read" type="checkbox" ng-model="grantedAuthorities.READ_REPO[\'*\']" ng-checked="hasReadPermission(\'*\')" ng-disabled="readCheckDisabled(\'*\')"> </span> </th> <th class="text-xs-center write-any"> <span ng-click="setGrantedAuthorities()"> <input class="write" type="checkbox" ng-model="grantedAuthorities.WRITE_REPO[\'*\']" ng-checked="hasWritePermission(\'*\')" ng-disabled="writeCheckDisabled(\'*\')"> </span> </th> <th class="text-xs-center"> <span ng-click="setGrantedAuthorities()"> <input class="graphql" type="checkbox" ng-model="grantedAuthorities.GRAPHQL[\'*\']" ng-checked="hasGraphqlPermission(\'*\')" ng-disabled="graphqlCheckDisabled(\'*\')"> </span> </th> </tr> </thead> <tbody> <div> <tr ng-repeat="repository in getReadableRepositories() | orderBy: [\'location\', \'id\']"> <td class="repository-name">{{repository.id}}<small><em ng-if="(hasGraphqlPermission(repository) || hasGraphqlPermission(\'*\')) && (hasReadPermission(repository) || hasReadPermission(\'*\') || hasWritePermission(repository) || hasWritePermission(\'*\'))" class="fa-kit fa-gdb-graphql graphql-icon text-info" gdb-tooltip="{{\'security.tooltip.graphql\' | translate}}"></em> &middot; {{repository.location ? repository.location : \'repo.local\' | translate}}</small></td> <td class="text-xs-center read-rights"> <span ng-click="setGrantedAuthorities()"> <input class="read" type="checkbox" ng-model="grantedAuthorities.READ_REPO[createUniqueKey(repository)]" ng-checked="hasReadPermission(repository)" ng-disabled="readCheckDisabled(repository)"> </span> </td> <td class="text-xs-center write-rights"> <span ng-click="setGrantedAuthorities()"> <input class="write" type="checkbox" ng-model="grantedAuthorities.WRITE_REPO[createUniqueKey(repository)]" ng-checked="hasWritePermission(repository)" ng-disabled="writeCheckDisabled(repository)"> </span> </td> <td class="text-xs-center graphql-rights"> <span ng-click="setGrantedAuthorities()"> <input class="graphql" type="checkbox" ng-model="grantedAuthorities.GRAPHQL[createUniqueKey(repository)]" ng-checked="hasGraphqlPermission(repository)" ng-disabled="graphqlCheckDisabled(repository)"> </span> </td> </tr> </div> </tbody> </table> </div> </div> </div> </div> </div> <div class="text-right"> <button id="wb-user-goBack" class="btn btn-secondary" type="button" ng-click="goBack()">{{\'common.cancel.btn\' | translate}}</button> <button id="wb-user-submit" class="btn btn-primary" type="submit" ng-disabled="!isRoleValid">{{saveButtonText}}</button> </div> </form> </div> <div class="ot-loader ot-main-loader" onto-loader size="50" ng-show="loader"></div> '}};
2
+ //# sourceMappingURL=15535.18ede9f56483a38d1305.bundle.js.map