@api-client/ui 0.0.5 → 0.0.8

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 (326) hide show
  1. package/demo/elements/http/http-assertions.html +3 -0
  2. package/demo/elements/http/http-assertions.ts +1 -1
  3. package/demo/elements/http/http-flows.html +23 -0
  4. package/demo/elements/http/http-flows.ts +92 -0
  5. package/demo/elements/http/index.html +3 -0
  6. package/demo/pages/http-project/main.ts +5 -6
  7. package/dist/bindings/base/StoreBindings.js +4 -4
  8. package/dist/bindings/base/StoreBindings.js.map +1 -1
  9. package/dist/define/dialog/delete-cookie-action-dialog.d.ts +10 -0
  10. package/dist/define/dialog/delete-cookie-action-dialog.d.ts.map +1 -0
  11. package/dist/define/dialog/delete-cookie-action-dialog.js +14 -0
  12. package/dist/define/dialog/delete-cookie-action-dialog.js.map +1 -0
  13. package/dist/define/dialog/set-cookie-action-dialog.d.ts +10 -0
  14. package/dist/define/dialog/set-cookie-action-dialog.d.ts.map +1 -0
  15. package/dist/define/dialog/set-cookie-action-dialog.js +14 -0
  16. package/dist/define/dialog/set-cookie-action-dialog.js.map +1 -0
  17. package/dist/define/http/http-assertions.d.ts +1 -1
  18. package/dist/define/http/http-assertions.d.ts.map +1 -1
  19. package/dist/define/http/http-assertions.js +3 -3
  20. package/dist/define/http/http-assertions.js.map +1 -1
  21. package/dist/define/http/http-flows.d.ts +10 -0
  22. package/dist/define/http/http-flows.d.ts.map +1 -0
  23. package/dist/define/http/http-flows.js +13 -0
  24. package/dist/define/http/http-flows.js.map +1 -0
  25. package/dist/define/ui/ui-divider.d.ts +4 -1
  26. package/dist/define/ui/ui-divider.d.ts.map +1 -1
  27. package/dist/define/ui/ui-divider.js +11 -2
  28. package/dist/define/ui/ui-divider.js.map +1 -1
  29. package/dist/elements/ApiElement.d.ts +4 -0
  30. package/dist/elements/ApiElement.d.ts.map +1 -1
  31. package/dist/elements/ApiElement.js +6 -0
  32. package/dist/elements/ApiElement.js.map +1 -1
  33. package/dist/elements/amf/ApiAuthorizationEditor.element.js +1 -1
  34. package/dist/elements/amf/ApiAuthorizationEditor.element.js.map +1 -1
  35. package/dist/elements/amf/ApiOperationDocument.element.d.ts.map +1 -1
  36. package/dist/elements/amf/ApiOperationDocument.element.js +2 -1
  37. package/dist/elements/amf/ApiOperationDocument.element.js.map +1 -1
  38. package/dist/elements/amf/ApiRequest.element.js +1 -1
  39. package/dist/elements/amf/ApiRequest.element.js.map +1 -1
  40. package/dist/elements/amf/ApiRequestEditor.element.d.ts +0 -1
  41. package/dist/elements/amf/ApiRequestEditor.element.d.ts.map +1 -1
  42. package/dist/elements/amf/ApiRequestEditor.element.js +0 -3
  43. package/dist/elements/amf/ApiRequestEditor.element.js.map +1 -1
  44. package/dist/elements/authorization/ui/Authorization.d.ts +2 -1
  45. package/dist/elements/authorization/ui/Authorization.d.ts.map +1 -1
  46. package/dist/elements/authorization/ui/Authorization.js +0 -3
  47. package/dist/elements/authorization/ui/Authorization.js.map +1 -1
  48. package/dist/elements/dialog/DeleteCookieAction.element.d.ts +20 -0
  49. package/dist/elements/dialog/DeleteCookieAction.element.d.ts.map +1 -0
  50. package/dist/elements/dialog/DeleteCookieAction.element.js +93 -0
  51. package/dist/elements/dialog/DeleteCookieAction.element.js.map +1 -0
  52. package/dist/elements/dialog/DeleteCookieAction.styles.d.ts +3 -0
  53. package/dist/elements/dialog/DeleteCookieAction.styles.d.ts.map +1 -0
  54. package/dist/elements/dialog/DeleteCookieAction.styles.js +13 -0
  55. package/dist/elements/dialog/DeleteCookieAction.styles.js.map +1 -0
  56. package/dist/elements/dialog/Rename.d.ts +7 -6
  57. package/dist/elements/dialog/Rename.d.ts.map +1 -1
  58. package/dist/elements/dialog/Rename.js +7 -6
  59. package/dist/elements/dialog/Rename.js.map +1 -1
  60. package/dist/elements/dialog/SetCookieAction.element.d.ts +22 -0
  61. package/dist/elements/dialog/SetCookieAction.element.d.ts.map +1 -0
  62. package/dist/elements/dialog/SetCookieAction.element.js +173 -0
  63. package/dist/elements/dialog/SetCookieAction.element.js.map +1 -0
  64. package/dist/elements/environment/EnvironmentEditor.d.ts +24 -3
  65. package/dist/elements/environment/EnvironmentEditor.d.ts.map +1 -1
  66. package/dist/elements/environment/EnvironmentEditor.js +69 -23
  67. package/dist/elements/environment/EnvironmentEditor.js.map +1 -1
  68. package/dist/elements/environment/EnvironmentEditor.styles.d.ts.map +1 -1
  69. package/dist/elements/environment/EnvironmentEditor.styles.js +5 -0
  70. package/dist/elements/environment/EnvironmentEditor.styles.js.map +1 -1
  71. package/dist/elements/environment/ServerEditor.d.ts +3 -3
  72. package/dist/elements/environment/ServerEditor.d.ts.map +1 -1
  73. package/dist/elements/environment/ServerEditor.js +3 -6
  74. package/dist/elements/environment/ServerEditor.js.map +1 -1
  75. package/dist/elements/environment/VariablesEditor.d.ts +0 -1
  76. package/dist/elements/environment/VariablesEditor.d.ts.map +1 -1
  77. package/dist/elements/environment/VariablesEditor.js +3 -6
  78. package/dist/elements/environment/VariablesEditor.js.map +1 -1
  79. package/dist/elements/highlight/Prism.styles.d.ts.map +1 -1
  80. package/dist/elements/highlight/Prism.styles.js +12 -5
  81. package/dist/elements/highlight/Prism.styles.js.map +1 -1
  82. package/dist/elements/http/BodyEditor.d.ts +0 -4
  83. package/dist/elements/http/BodyEditor.d.ts.map +1 -1
  84. package/dist/elements/http/BodyEditor.js +10 -16
  85. package/dist/elements/http/BodyEditor.js.map +1 -1
  86. package/dist/elements/http/BodyMultipartEditor.d.ts +3 -16
  87. package/dist/elements/http/BodyMultipartEditor.d.ts.map +1 -1
  88. package/dist/elements/http/BodyMultipartEditor.js +3 -19
  89. package/dist/elements/http/BodyMultipartEditor.js.map +1 -1
  90. package/dist/elements/http/BodyTextEditor.d.ts +0 -1
  91. package/dist/elements/http/BodyTextEditor.d.ts.map +1 -1
  92. package/dist/elements/http/BodyTextEditor.js +0 -3
  93. package/dist/elements/http/BodyTextEditor.js.map +1 -1
  94. package/dist/elements/http/BodyUrlEncodedEditor.d.ts +3 -3
  95. package/dist/elements/http/BodyUrlEncodedEditor.d.ts.map +1 -1
  96. package/dist/elements/http/BodyUrlEncodedEditor.js +3 -5
  97. package/dist/elements/http/BodyUrlEncodedEditor.js.map +1 -1
  98. package/dist/elements/http/HeadersForm.d.ts +0 -4
  99. package/dist/elements/http/HeadersForm.d.ts.map +1 -1
  100. package/dist/elements/http/HeadersForm.js +0 -6
  101. package/dist/elements/http/HeadersForm.js.map +1 -1
  102. package/dist/elements/http/HttpAssertions.element.d.ts +55 -0
  103. package/dist/elements/http/HttpAssertions.element.d.ts.map +1 -0
  104. package/dist/elements/http/HttpAssertions.element.js +264 -0
  105. package/dist/elements/http/HttpAssertions.element.js.map +1 -0
  106. package/dist/elements/http/HttpAssertions.styles.d.ts.map +1 -1
  107. package/dist/elements/http/HttpAssertions.styles.js +7 -156
  108. package/dist/elements/http/HttpAssertions.styles.js.map +1 -1
  109. package/dist/elements/http/HttpFlows.common.d.ts +3 -0
  110. package/dist/elements/http/HttpFlows.common.d.ts.map +1 -0
  111. package/dist/elements/http/HttpFlows.common.js +181 -0
  112. package/dist/elements/http/HttpFlows.common.js.map +1 -0
  113. package/dist/elements/http/HttpFlows.element.d.ts +97 -0
  114. package/dist/elements/http/HttpFlows.element.d.ts.map +1 -0
  115. package/dist/elements/http/HttpFlows.element.js +684 -0
  116. package/dist/elements/http/HttpFlows.element.js.map +1 -0
  117. package/dist/elements/http/HttpFlows.styles.d.ts +3 -0
  118. package/dist/elements/http/HttpFlows.styles.d.ts.map +1 -0
  119. package/dist/elements/http/HttpFlows.styles.js +28 -0
  120. package/dist/elements/http/HttpFlows.styles.js.map +1 -0
  121. package/dist/elements/http/HttpFlowsUi.d.ts +172 -0
  122. package/dist/elements/http/HttpFlowsUi.d.ts.map +1 -0
  123. package/dist/elements/http/HttpFlowsUi.js +1256 -0
  124. package/dist/elements/http/HttpFlowsUi.js.map +1 -0
  125. package/dist/elements/http/RequestConfigElement.d.ts +0 -1
  126. package/dist/elements/http/RequestConfigElement.d.ts.map +1 -1
  127. package/dist/elements/http/RequestConfigElement.js +8 -11
  128. package/dist/elements/http/RequestConfigElement.js.map +1 -1
  129. package/dist/elements/http/RequestEditor.d.ts +10 -10
  130. package/dist/elements/http/RequestEditor.d.ts.map +1 -1
  131. package/dist/elements/http/RequestEditor.js +62 -23
  132. package/dist/elements/http/RequestEditor.js.map +1 -1
  133. package/dist/elements/http/UrlInput.d.ts +3 -3
  134. package/dist/elements/http/UrlInput.d.ts.map +1 -1
  135. package/dist/elements/http/UrlInput.js +2 -2
  136. package/dist/elements/http/UrlInput.js.map +1 -1
  137. package/dist/elements/http/UrlParamsForm.d.ts +0 -1
  138. package/dist/elements/http/UrlParamsForm.d.ts.map +1 -1
  139. package/dist/elements/http/UrlParamsForm.js +0 -3
  140. package/dist/elements/http/UrlParamsForm.js.map +1 -1
  141. package/dist/elements/layout/SplitView.styles.d.ts.map +1 -1
  142. package/dist/elements/layout/SplitView.styles.js +1 -0
  143. package/dist/elements/layout/SplitView.styles.js.map +1 -1
  144. package/dist/elements/navigation/AppNavigationItem.styles.d.ts.map +1 -1
  145. package/dist/elements/navigation/AppNavigationItem.styles.js +2 -0
  146. package/dist/elements/navigation/AppNavigationItem.styles.js.map +1 -1
  147. package/dist/elements/project/HttpProjectRequest.d.ts +2 -1
  148. package/dist/elements/project/HttpProjectRequest.d.ts.map +1 -1
  149. package/dist/elements/project/HttpProjectRequest.js +14 -5
  150. package/dist/elements/project/HttpProjectRequest.js.map +1 -1
  151. package/dist/elements/project/ProjectRunner.d.ts +0 -1
  152. package/dist/elements/project/ProjectRunner.d.ts.map +1 -1
  153. package/dist/elements/project/ProjectRunner.js +1 -4
  154. package/dist/elements/project/ProjectRunner.js.map +1 -1
  155. package/dist/elements/schema-design/AssociationFormElement.d.ts +0 -1
  156. package/dist/elements/schema-design/AssociationFormElement.d.ts.map +1 -1
  157. package/dist/elements/schema-design/AssociationFormElement.js +2 -5
  158. package/dist/elements/schema-design/AssociationFormElement.js.map +1 -1
  159. package/dist/elements/schema-design/DataEntityEditorElement.d.ts +2 -2
  160. package/dist/elements/schema-design/DataEntityEditorElement.d.ts.map +1 -1
  161. package/dist/elements/schema-design/DataEntityEditorElement.js +5 -5
  162. package/dist/elements/schema-design/DataEntityEditorElement.js.map +1 -1
  163. package/dist/elements/schema-design/DataSchemaDocument.d.ts +0 -1
  164. package/dist/elements/schema-design/DataSchemaDocument.d.ts.map +1 -1
  165. package/dist/elements/schema-design/DataSchemaDocument.js +4 -7
  166. package/dist/elements/schema-design/DataSchemaDocument.js.map +1 -1
  167. package/dist/elements/schema-design/EntityFormElement.d.ts +0 -1
  168. package/dist/elements/schema-design/EntityFormElement.d.ts.map +1 -1
  169. package/dist/elements/schema-design/EntityFormElement.js +4 -7
  170. package/dist/elements/schema-design/EntityFormElement.js.map +1 -1
  171. package/dist/elements/schema-design/PropertyFormElement.d.ts +1 -2
  172. package/dist/elements/schema-design/PropertyFormElement.d.ts.map +1 -1
  173. package/dist/elements/schema-design/PropertyFormElement.js +8 -11
  174. package/dist/elements/schema-design/PropertyFormElement.js.map +1 -1
  175. package/dist/pages/ApplicationScreen.d.ts +1 -1
  176. package/dist/pages/ApplicationScreen.d.ts.map +1 -1
  177. package/dist/pages/ApplicationScreen.js +1 -1
  178. package/dist/pages/ApplicationScreen.js.map +1 -1
  179. package/dist/pages/api-client/ApiClient.styles.d.ts.map +1 -1
  180. package/dist/pages/api-client/ApiClient.styles.js +22 -3
  181. package/dist/pages/api-client/ApiClient.styles.js.map +1 -1
  182. package/dist/pages/api-client/Authenticate.screen.d.ts +2 -0
  183. package/dist/pages/api-client/Authenticate.screen.d.ts.map +1 -1
  184. package/dist/pages/api-client/Authenticate.screen.js +19 -3
  185. package/dist/pages/api-client/Authenticate.screen.js.map +1 -1
  186. package/dist/pages/api-client/StoreConfig.screen.d.ts.map +1 -1
  187. package/dist/pages/api-client/StoreConfig.screen.js +4 -2
  188. package/dist/pages/api-client/StoreConfig.screen.js.map +1 -1
  189. package/dist/pages/api-client/StoreConfig.styles.d.ts.map +1 -1
  190. package/dist/pages/api-client/StoreConfig.styles.js +5 -0
  191. package/dist/pages/api-client/StoreConfig.styles.js.map +1 -1
  192. package/dist/pages/api-client/pages/Files.page.d.ts +1 -0
  193. package/dist/pages/api-client/pages/Files.page.d.ts.map +1 -1
  194. package/dist/pages/api-client/pages/Files.page.js +2 -1
  195. package/dist/pages/api-client/pages/Files.page.js.map +1 -1
  196. package/dist/pages/http-project/HttpProject.screen.d.ts +0 -8
  197. package/dist/pages/http-project/HttpProject.screen.d.ts.map +1 -1
  198. package/dist/pages/http-project/HttpProject.screen.js +14 -15
  199. package/dist/pages/http-project/HttpProject.screen.js.map +1 -1
  200. package/dist/pages/http-project/types.d.ts +8 -6
  201. package/dist/pages/http-project/types.d.ts.map +1 -1
  202. package/dist/pages/http-project/types.js.map +1 -1
  203. package/dist/styles/m3/surface.module.d.ts.map +1 -1
  204. package/dist/styles/m3/surface.module.js +11 -27
  205. package/dist/styles/m3/surface.module.js.map +1 -1
  206. package/dist/ui/UiElement.d.ts +4 -0
  207. package/dist/ui/UiElement.d.ts.map +1 -1
  208. package/dist/ui/UiElement.js +6 -0
  209. package/dist/ui/UiElement.js.map +1 -1
  210. package/dist/ui/button/SegmentedButton.styles.d.ts.map +1 -1
  211. package/dist/ui/button/SegmentedButton.styles.js +3 -1
  212. package/dist/ui/button/SegmentedButton.styles.js.map +1 -1
  213. package/dist/ui/dialog/UiDialog.d.ts +3 -0
  214. package/dist/ui/dialog/UiDialog.d.ts.map +1 -1
  215. package/dist/ui/dialog/UiDialog.js +3 -0
  216. package/dist/ui/dialog/UiDialog.js.map +1 -1
  217. package/dist/ui/effects/ripple.d.ts.map +1 -1
  218. package/dist/ui/effects/ripple.js +5 -1
  219. package/dist/ui/effects/ripple.js.map +1 -1
  220. package/dist/ui/icons/Icons.d.ts +3 -2
  221. package/dist/ui/icons/Icons.d.ts.map +1 -1
  222. package/dist/ui/icons/Icons.js +2 -1
  223. package/dist/ui/icons/Icons.js.map +1 -1
  224. package/dist/ui/input/CheckedElement.d.ts +1 -1
  225. package/dist/ui/input/CheckedElement.d.ts.map +1 -1
  226. package/dist/ui/input/CheckedElement.js +3 -3
  227. package/dist/ui/input/CheckedElement.js.map +1 -1
  228. package/dist/ui/input/Input.js +1 -1
  229. package/dist/ui/input/Input.js.map +1 -1
  230. package/dist/ui/list/{DividerElement.d.ts → UiDivider.element.d.ts} +6 -6
  231. package/dist/ui/list/UiDivider.element.d.ts.map +1 -0
  232. package/dist/ui/list/UiDivider.element.js +39 -0
  233. package/dist/ui/list/UiDivider.element.js.map +1 -0
  234. package/dist/ui/list/UiDivider.styles.d.ts +3 -0
  235. package/dist/ui/list/UiDivider.styles.d.ts.map +1 -0
  236. package/dist/ui/list/UiDivider.styles.js +49 -0
  237. package/dist/ui/list/UiDivider.styles.js.map +1 -0
  238. package/dist/ui/tabs/UiTabs.d.ts +13 -1
  239. package/dist/ui/tabs/UiTabs.d.ts.map +1 -1
  240. package/dist/ui/tabs/UiTabs.js +42 -13
  241. package/dist/ui/tabs/UiTabs.js.map +1 -1
  242. package/package.json +1 -1
  243. package/src/bindings/base/StoreBindings.ts +4 -4
  244. package/src/define/dialog/delete-cookie-action-dialog.ts +16 -0
  245. package/src/define/dialog/set-cookie-action-dialog.ts +16 -0
  246. package/src/define/http/http-assertions.ts +3 -3
  247. package/src/define/http/http-flows.ts +15 -0
  248. package/src/define/ui/ui-divider.ts +7 -2
  249. package/src/elements/ApiElement.ts +7 -0
  250. package/src/elements/amf/ApiAuthorizationEditor.element.ts +1 -1
  251. package/src/elements/amf/ApiOperationDocument.element.ts +2 -1
  252. package/src/elements/amf/ApiRequest.element.ts +1 -1
  253. package/src/elements/amf/ApiRequestEditor.element.ts +0 -4
  254. package/src/elements/authorization/ui/Authorization.ts +3 -5
  255. package/src/elements/dialog/DeleteCookieAction.element.ts +100 -0
  256. package/src/elements/dialog/DeleteCookieAction.styles.ts +14 -0
  257. package/src/elements/dialog/Rename.ts +8 -7
  258. package/src/elements/dialog/SetCookieAction.element.ts +183 -0
  259. package/src/elements/environment/EnvironmentEditor.styles.ts +5 -0
  260. package/src/elements/environment/EnvironmentEditor.ts +81 -22
  261. package/src/elements/environment/ServerEditor.ts +4 -8
  262. package/src/elements/environment/VariablesEditor.ts +3 -7
  263. package/src/elements/highlight/Prism.styles.ts +12 -5
  264. package/src/elements/http/BodyEditor.ts +10 -17
  265. package/src/elements/http/BodyMultipartEditor.ts +3 -20
  266. package/src/elements/http/BodyTextEditor.ts +0 -4
  267. package/src/elements/http/BodyUrlEncodedEditor.ts +5 -8
  268. package/src/elements/http/HeadersForm.ts +2 -9
  269. package/src/elements/http/HttpAssertions.element.ts +286 -0
  270. package/src/elements/http/HttpAssertions.styles.ts +7 -156
  271. package/src/elements/http/HttpFlows.common.ts +181 -0
  272. package/src/elements/http/HttpFlows.element.ts +722 -0
  273. package/src/elements/http/HttpFlows.styles.ts +29 -0
  274. package/src/elements/http/HttpFlowsUi.ts +1327 -0
  275. package/src/elements/http/RequestConfigElement.ts +10 -14
  276. package/src/elements/http/RequestEditor.ts +77 -35
  277. package/src/elements/http/UrlInput.ts +6 -6
  278. package/src/elements/http/UrlParamsForm.ts +2 -6
  279. package/src/elements/layout/SplitView.styles.ts +1 -0
  280. package/src/elements/navigation/AppNavigationItem.styles.ts +2 -0
  281. package/src/elements/project/HttpProjectRequest.ts +16 -5
  282. package/src/elements/project/ProjectRunner.ts +3 -7
  283. package/src/elements/schema-design/AssociationFormElement.ts +4 -8
  284. package/src/elements/schema-design/DataEntityEditorElement.ts +8 -8
  285. package/src/elements/schema-design/DataSchemaDocument.ts +5 -9
  286. package/src/elements/schema-design/EntityFormElement.ts +6 -10
  287. package/src/elements/schema-design/PropertyFormElement.ts +11 -15
  288. package/src/pages/ApplicationScreen.ts +1 -1
  289. package/src/pages/api-client/ApiClient.styles.ts +22 -3
  290. package/src/pages/api-client/Authenticate.screen.ts +19 -3
  291. package/src/pages/api-client/StoreConfig.screen.ts +4 -2
  292. package/src/pages/api-client/StoreConfig.styles.ts +5 -0
  293. package/src/pages/api-client/pages/Files.page.ts +2 -1
  294. package/src/pages/http-project/HttpProject.screen.ts +14 -26
  295. package/src/pages/http-project/types.ts +8 -6
  296. package/src/styles/m3/surface.module.ts +11 -27
  297. package/src/styles/m3/theme.css +36 -0
  298. package/src/styles/m3/tokens.css +11 -0
  299. package/src/ui/UiElement.ts +7 -0
  300. package/src/ui/button/SegmentedButton.styles.ts +3 -1
  301. package/src/ui/dialog/UiDialog.ts +3 -0
  302. package/src/ui/effects/ripple.ts +6 -1
  303. package/src/ui/icons/Icons.ts +3 -2
  304. package/src/ui/input/CheckedElement.ts +3 -3
  305. package/src/ui/input/Input.ts +1 -1
  306. package/src/ui/list/UiDivider.element.ts +41 -0
  307. package/src/ui/list/UiDivider.styles.ts +49 -0
  308. package/src/ui/tabs/UiTabs.ts +55 -13
  309. package/test/amf/authorization/OAuth2Method.test.ts +1 -1
  310. package/test/elements/http/HttpAssertions.test.ts +5 -6
  311. package/test/elements/http/HttpFlows.test.ts +485 -0
  312. package/dist/elements/http/HttpAssertions.d.ts +0 -114
  313. package/dist/elements/http/HttpAssertions.d.ts.map +0 -1
  314. package/dist/elements/http/HttpAssertions.js +0 -1146
  315. package/dist/elements/http/HttpAssertions.js.map +0 -1
  316. package/dist/elements/http/internals.d.ts +0 -150
  317. package/dist/elements/http/internals.d.ts.map +0 -1
  318. package/dist/elements/http/internals.js +0 -150
  319. package/dist/elements/http/internals.js.map +0 -1
  320. package/dist/ui/list/DividerElement.d.ts.map +0 -1
  321. package/dist/ui/list/DividerElement.js +0 -82
  322. package/dist/ui/list/DividerElement.js.map +0 -1
  323. package/src/elements/http/HttpAssertions.ts +0 -1187
  324. package/src/elements/http/internals.ts +0 -151
  325. package/src/http-client/docs/Files.md +0 -28
  326. package/src/ui/list/DividerElement.ts +0 -84
@@ -0,0 +1,722 @@
1
+ import {
2
+ IHttpFlow, IHttpAction, IHttpStep,
3
+ } from "@api-client/core/build/browser.js";
4
+ import { html, nothing, PropertyValues, TemplateResult } from "lit";
5
+ import { property, query } from "lit/decorators.js";
6
+ import type { UiDropdownListSelection } from "../../ui/list/UiDropdownList.js";
7
+ import { SnackNotifications } from "../../ui/notification/SnackNotifications.js";
8
+ import type Input from "../../ui/input/Input.js";
9
+ import type UiDialog from "../../ui/dialog/UiDialog.js";
10
+ import type { UiDialogClosingReason } from "../../ui/dialog/UiDialog.js";
11
+ import { HttpFlowsUi, StepsTarget } from "./HttpFlowsUi.js";
12
+ import '../../define/ui/ui-list.js';
13
+ import '../../define/ui/ui-list-item.js';
14
+ import '../../define/ui/ui-dropdown-list.js';
15
+ import '../../define/ui/ui-button.js';
16
+ import '../../define/ui/ui-divider.js';
17
+ import '../../define/ui/ui-dialog.js';
18
+ import '../../define/dialog/rename-dialog.js';
19
+
20
+ type FlowTrigger = 'request' | 'response';
21
+
22
+ export default class HttpFlows extends HttpFlowsUi {
23
+ /**
24
+ * The list of HTTP flows.
25
+ * This is a live list. All changes are propagated in the model.
26
+ */
27
+ @property({ type: Array }) model: IHttpFlow[] = [];
28
+
29
+ /**
30
+ * The setting that renders flows for the given trigger (request or response).
31
+ */
32
+ @property({ type: String }) trigger: FlowTrigger = 'response';
33
+
34
+ /**
35
+ * The index of the currently selected flow. This is the index on the `model` property.
36
+ * @attribute
37
+ */
38
+ @property({ type: Number }) selectedFlow?: number;
39
+
40
+ @query('#createFlowDialog') readonly flowAddDialog?: UiDialog | null;
41
+
42
+ /**
43
+ * The currently selected flow definition.
44
+ *
45
+ * If there's no selection it returns the first flow.
46
+ */
47
+ get currentFlow(): IHttpFlow | undefined {
48
+ const { model = [], selectedFlow, trigger = 'response' } = this;
49
+ if (selectedFlow === undefined) {
50
+ return undefined;
51
+ }
52
+ const item = model[selectedFlow];
53
+ if (!item || item.trigger !== trigger) {
54
+ return undefined;
55
+ }
56
+ return item;
57
+ }
58
+
59
+ override connectedCallback(): void {
60
+ super.connectedCallback();
61
+ this.preSelectFlow();
62
+ }
63
+
64
+ protected override willUpdate(cp: PropertyValues<this>): void {
65
+ if (cp.has('trigger')) {
66
+ this.selectedFlow = undefined;
67
+ this.preSelectFlow();
68
+ }
69
+ super.willUpdate(cp);
70
+ }
71
+
72
+ preSelectFlow(): void {
73
+ const { model = [], trigger = 'response', selectedFlow } = this;
74
+ if (Number.isInteger(selectedFlow)) {
75
+ return;
76
+ }
77
+ const index = model.findIndex(i => i.trigger === trigger);
78
+ if (index >= 0) {
79
+ this.selectedFlow = index;
80
+ }
81
+ }
82
+
83
+ addFlow(description?: string): void {
84
+ const flow: IHttpFlow = {
85
+ trigger: this.trigger,
86
+ actions: [],
87
+ };
88
+ if (description) {
89
+ flow.description = description;
90
+ }
91
+ const len = this.model.push(flow);
92
+ this.selectedFlow = len - 1;
93
+ this.notifyChange();
94
+ this.requestUpdate();
95
+ }
96
+
97
+ removeFlow(index: number): void {
98
+ const { model } = this;
99
+ if (index >= model.length || index < 0) {
100
+ throw RangeError(`Invalid index: ${index}. Expected an index in range from 0 to ${model.length - 1}`);
101
+ }
102
+ const removed = model[index];
103
+ model.splice(index, 1);
104
+ this.requestUpdate();
105
+ this.notifyChange();
106
+ if (!model[index]) {
107
+ this.selectedFlow = 0;
108
+ }
109
+ SnackNotifications.notify(`Flow was deleted.`, {
110
+ actionLabel: 'Redo',
111
+
112
+ actionCallback: () => {
113
+ model.splice(index, 0, removed);
114
+ this.selectedFlow = index;
115
+ this.requestUpdate();
116
+ this.notifyChange();
117
+ },
118
+
119
+ cancellable: true,
120
+ });
121
+ }
122
+
123
+ removeFlowAction(actionIndex: number): void {
124
+ const { currentFlow } = this;
125
+ if (!currentFlow) {
126
+ return;
127
+ }
128
+ currentFlow.actions.splice(actionIndex, 1);
129
+ this.notifyChange();
130
+ this.requestUpdate();
131
+ }
132
+
133
+ renameFlowAction(actionIndex: number): void {
134
+ const { currentFlow } = this;
135
+ if (!currentFlow) {
136
+ return;
137
+ }
138
+ const action = currentFlow.actions[actionIndex];
139
+ if (!action) {
140
+ return;
141
+ }
142
+ const dialog = document.createElement('rename-dialog');
143
+ dialog.name = action.description;
144
+ dialog.modal = true;
145
+ document.body.appendChild(dialog);
146
+ dialog.open = true;
147
+ dialog.addEventListener('close', (ev: Event) => {
148
+ document.parentElement?.removeChild(dialog);
149
+ const event = ev as CustomEvent<UiDialogClosingReason>;
150
+ const { cancelled, value } = event.detail;
151
+ if (!cancelled && value) {
152
+ action.description = value as string;
153
+ this.notifyChange();
154
+ this.requestUpdate();
155
+ }
156
+ });
157
+ }
158
+
159
+ protected handleAdd(): void {
160
+ const { flowAddDialog } = this;
161
+ if (!flowAddDialog) {
162
+ return;
163
+ }
164
+ flowAddDialog.open = true;
165
+ }
166
+
167
+ protected handleTriggerSelect(e: CustomEvent<UiDropdownListSelection>): void {
168
+ const target = e.detail.item as HTMLElement | undefined;
169
+ if (!target) {
170
+ return;
171
+ }
172
+ const { trigger } = target.dataset;
173
+ if (!trigger) {
174
+ return;
175
+ }
176
+ this.trigger = trigger as FlowTrigger;
177
+ }
178
+
179
+ protected handleFlowSelect(e: CustomEvent<UiDropdownListSelection>): void {
180
+ const target = e.detail.item as HTMLElement | undefined;
181
+ if (!target) {
182
+ return;
183
+ }
184
+ const { trigger = 'response', model = [] } = this;
185
+ const option = target.dataset.option as string | undefined;
186
+ if (option === 'create') {
187
+ this.handleAdd();
188
+ } else if (option === 'delete') {
189
+ const { currentFlow } = this;
190
+ if (!currentFlow) {
191
+ return;
192
+ }
193
+ const index = model.indexOf(currentFlow);
194
+ if (index >= 0) {
195
+ this.removeFlow(index);
196
+ }
197
+ } else if (option === 'select') {
198
+ const index = Number(target.dataset.index);
199
+ if (Number.isNaN(index)) {
200
+ return;
201
+ }
202
+ let current = -1;
203
+ for (let i = 0, len = model.length; i < len; i++) {
204
+ const item = model[i]
205
+ if (item.trigger !== trigger) {
206
+ continue;
207
+ }
208
+ current += 1;
209
+ if (current === index) {
210
+ this.selectedFlow = i;
211
+ break;
212
+ }
213
+ }
214
+ }
215
+ }
216
+
217
+ protected handleFlowCreateDialogResult(e: CustomEvent<UiDialogClosingReason>): void {
218
+ if (e.detail.cancelled) {
219
+ return;
220
+ }
221
+ const dialog = e.target as UiDialog;
222
+ const input = dialog.querySelector('ui-text-field');
223
+ if (!input) {
224
+ return;
225
+ }
226
+ const { value } = input;
227
+ input.value = '';
228
+ this.addFlow(value);
229
+ }
230
+
231
+ /**
232
+ * On the editor element we only allow "flow blocks" items (conditions and actions).
233
+ * Only one condition can be added so once a condition is set we do not allow to add another condition.
234
+ */
235
+ protected handleEditorDragOver(e: DragEvent): void {
236
+ const { dataTransfer } = e;
237
+ if (e.defaultPrevented || !dataTransfer || !this.isValidDropTarget(dataTransfer)) {
238
+ return;
239
+ }
240
+ e.preventDefault();
241
+ dataTransfer.dropEffect = 'copy';
242
+ const target = e.currentTarget as HTMLElement;
243
+ target.classList.add('dragover');
244
+ }
245
+
246
+ protected handleEditorDragLeave(e: DragEvent): void {
247
+ if (e.defaultPrevented || !this.isValidDropTarget(e.dataTransfer)) {
248
+ return;
249
+ }
250
+ const target = e.currentTarget as HTMLElement;
251
+ target.classList.remove('dragover');
252
+ }
253
+
254
+ protected handleEditorDrop(e: DragEvent): void {
255
+ const { dataTransfer } = e;
256
+ if (!dataTransfer || e.defaultPrevented || !this.isValidDropTarget(dataTransfer)) {
257
+ return;
258
+ }
259
+ e.preventDefault();
260
+ this.resetDragIndices();
261
+ const group = dataTransfer.getData('flow/group');
262
+ if (group !== 'flow-block') {
263
+ SnackNotifications.notify('Only blocks from the "Flow blocks" group can be dropped here.', 2000);
264
+ return;
265
+ }
266
+ const kind = dataTransfer.getData('flow/kind');
267
+ if (kind === 'Core#Condition') {
268
+ this.setCondition();
269
+ } else if (kind === 'Core#Action') {
270
+ this.addAction();
271
+ }
272
+ }
273
+
274
+ /**
275
+ * Adds a condition to the current flow.
276
+ * Note, when the condition already exists this does nothing.
277
+ */
278
+ setCondition(): void {
279
+ const { currentFlow } = this;
280
+ if (!currentFlow) {
281
+ SnackNotifications.notify('Select a flow first.', 2000);
282
+ return;
283
+ }
284
+ if (currentFlow.condition) {
285
+ SnackNotifications.notify('This flow already have a condition.', 2000);
286
+ return;
287
+ }
288
+ currentFlow.condition = {
289
+ steps: [],
290
+ };
291
+ this.requestUpdate();
292
+ this.notifyChange();
293
+ }
294
+
295
+ addAction(): void {
296
+ const { currentFlow } = this;
297
+ if (!currentFlow) {
298
+ SnackNotifications.notify('Select a flow first.', 2000);
299
+ return;
300
+ }
301
+ if (!Array.isArray(currentFlow.actions)) {
302
+ currentFlow.actions = [];
303
+ }
304
+ currentFlow.actions.push({
305
+ steps: [],
306
+ });
307
+ this.requestUpdate();
308
+ this.notifyChange();
309
+ }
310
+
311
+ protected stepFromChangeEvent(e: Event): IHttpStep | undefined {
312
+ const input = e.target as Input;
313
+ input.checkValidity();
314
+ const { actionIndex: aci, assertionIndex: asi } = input.dataset;
315
+ const actionIndex = Number(aci || asi);
316
+ const action = this.getStepsTarget(actionIndex);
317
+ if (!action) {
318
+ return undefined;
319
+ }
320
+ const stepIndex = Number(input.dataset.stepIndex);
321
+ if (Number.isNaN(stepIndex)) {
322
+ return undefined;
323
+ }
324
+ return action.steps[stepIndex];
325
+ }
326
+
327
+ protected getStepsTarget(assertionOrActionIndex: number): StepsTarget | undefined {
328
+ if (Number.isNaN(assertionOrActionIndex)) {
329
+ return undefined;
330
+ }
331
+ const { currentFlow } = this;
332
+ if (!currentFlow) {
333
+ return undefined;
334
+ }
335
+ if (assertionOrActionIndex === -1) {
336
+ return currentFlow.condition;
337
+ }
338
+ return currentFlow.actions[assertionOrActionIndex];
339
+ }
340
+
341
+ protected handleConditionOption(e: CustomEvent<UiDropdownListSelection>): void {
342
+ const { currentFlow } = this;
343
+ if (!currentFlow) {
344
+ return;
345
+ }
346
+ const { item } = e.detail;
347
+ const { option } = item.dataset;
348
+ if (option === 'delete') {
349
+ delete currentFlow.condition;
350
+ this.notifyChange();
351
+ this.requestUpdate();
352
+ }
353
+ }
354
+
355
+ protected handleActionOption(e: CustomEvent<UiDropdownListSelection>): void {
356
+ const list = e.target as HTMLElement;
357
+ const actionIndex = Number(list.dataset.actionIndex);
358
+ if (Number.isNaN(actionIndex)) {
359
+ return;
360
+ }
361
+ const { item } = e.detail;
362
+ const { option } = item.dataset;
363
+ switch (option) {
364
+ case 'delete': this.removeFlowAction(actionIndex); break;
365
+ case 'rename': this.renameFlowAction(actionIndex); break;
366
+ default:
367
+ }
368
+ }
369
+
370
+ protected isConditionTarget(e: Event): boolean {
371
+ const path = e.composedPath();
372
+ return path.some(i => {
373
+ const element = i as Element;
374
+ return !!element.classList && element.classList.contains('condition-row');
375
+ });
376
+ }
377
+
378
+ /**
379
+ * We override this method tpo handle conditions which can only accept certain
380
+ * blocks and have index of `-1`
381
+ */
382
+ protected override handleTargetDragOver(e: DragEvent): void {
383
+ if (e.defaultPrevented) {
384
+ return;
385
+ }
386
+ const dt = e.dataTransfer as DataTransfer;
387
+ if (!this.isConditionTarget(e)) {
388
+ if (dt.types.includes('flow/assertion')) {
389
+ // we do not allow assertions in actions.
390
+ e.preventDefault();
391
+ return;
392
+ }
393
+ super.handleTargetDragOver(e);
394
+ return;
395
+ }
396
+ if (dt.types.includes('flow/action')) {
397
+ e.preventDefault();
398
+ dt.dropEffect = 'none';
399
+ return;
400
+ }
401
+ super.handleTargetDragOver(e);
402
+ }
403
+
404
+ /**
405
+ * Overrides the method to support conditions.
406
+ */
407
+ protected override handleDrop(e: DragEvent): void {
408
+ if (e.defaultPrevented) {
409
+ return;
410
+ }
411
+ const dt = e.dataTransfer as DataTransfer;
412
+ if (!this.isConditionTarget(e)) {
413
+ if (dt.types.includes('flow/assertion')) {
414
+ // we do not allow assertions in actions.
415
+ e.preventDefault();
416
+ SnackNotifications.notify(`Assertions cannot be a part of a flow action.`, 3000);
417
+ return;
418
+ }
419
+ super.handleDrop(e);
420
+ return;
421
+ }
422
+ if (dt.types.includes('flow/action')) {
423
+ e.preventDefault();
424
+ SnackNotifications.notify(`Flow actions cannot be a part of a condition.`, 3000);
425
+ return;
426
+ }
427
+ super.handleDrop(e);
428
+ }
429
+
430
+ protected override render(): TemplateResult {
431
+ return html`
432
+ ${this.renderActionButtons()}
433
+ <div class="container">
434
+ ${this.renderEditor()}
435
+ <ui-divider vertical></ui-divider>
436
+ ${this.renderBuildingBlocks()}
437
+ </div>
438
+ ${this.renderCreateFlowDialog()}
439
+ `;
440
+ }
441
+
442
+ protected renderActionButtons(): TemplateResult {
443
+ return html`
444
+ <div class="editor-actions">
445
+ ${this.renderTriggerSelector()}
446
+ ${this.renderFlowSelector()}
447
+ </div>
448
+ `;
449
+ }
450
+
451
+ protected renderTriggerSelector(): TemplateResult {
452
+ const { trigger = 'response' } = this;
453
+ const label = trigger === 'request' ? 'Pre-request' : 'Post-request';
454
+ return html`
455
+ <ui-dropdown-list
456
+ @select="${this.handleTriggerSelect}"
457
+ horizontalAlign="right"
458
+ closeOnOutsideClick
459
+ >
460
+ <ui-button type="outlined" class="new-button">
461
+ <ui-icon icon="arrowDropDown" slot="icon"></ui-icon>
462
+ ${label}
463
+ </ui-button>
464
+ <ui-list slot="dropdown" role="menu">
465
+ <ui-list-item data-trigger="request" role="menuitem" title="Select pre-request flows">Pre-request</ui-list-item>
466
+ <ui-list-item data-trigger="response" role="menuitem" title="Select post-request flows">Post-request</ui-list-item>
467
+ </ui-list>
468
+ </ui-dropdown-list>
469
+ `;
470
+ }
471
+
472
+ protected renderFlowSelector(): TemplateResult {
473
+ const { trigger = 'response', currentFlow, model } = this;
474
+ const label = currentFlow ? currentFlow.description || 'Unnamed flow' : 'Select a flow';
475
+ const items = model.filter(i => i.trigger === trigger);
476
+ const hasItems = !!items.length;
477
+ return html`
478
+ <ui-dropdown-list
479
+ @select="${this.handleFlowSelect}"
480
+ horizontalAlign="right"
481
+ closeOnOutsideClick
482
+ >
483
+ <ui-button type="outlined" class="new-button">
484
+ <ui-icon icon="arrowDropDown" slot="icon"></ui-icon>
485
+ ${label}
486
+ </ui-button>
487
+ <ui-list slot="dropdown" role="menu">
488
+ ${hasItems ? html`
489
+ ${items.map((item, index) => html`<ui-list-item data-option="select" data-index="${index}" role="menuitem" title="Select this flow">${item.description || `Flow # ${index}`}</ui-list-item>`)}
490
+ <ui-divider></ui-divider>
491
+ ` : nothing}
492
+
493
+ ${currentFlow ? html`
494
+ <ui-list-item image="icon" data-option="delete" role="menuitem" title="Deletes the current flow">
495
+ <ui-icon icon="deleteOutline" slot="start"></ui-icon>
496
+ Delete
497
+ </ui-list-item>` : nothing}
498
+ <ui-list-item image="icon" data-option="create" role="menuitem" title="Adds a new flow">
499
+ <ui-icon icon="add" slot="start"></ui-icon>
500
+ Create
501
+ </ui-list-item>
502
+ </ui-list>
503
+ </ui-dropdown-list>
504
+ `;
505
+ }
506
+
507
+ protected renderCreateFlowDialog(): TemplateResult {
508
+ return html`
509
+ <ui-dialog modal id="createFlowDialog" class="add-dialog" @close="${this.handleFlowCreateDialogResult}" dismissLabel="Cancel" confirmLabel="Add">
510
+ <span slot="title">New Flow</span>
511
+
512
+ <ui-text-field class="input" label="Flow name" name="name" required invalidText="Flow name is required"></ui-text-field>
513
+ </ui-dialog>
514
+ `;
515
+ }
516
+
517
+ protected renderEditor(): TemplateResult {
518
+ const { currentFlow, model = [], trigger } = this;
519
+ const content: TemplateResult[] = [];
520
+ if (!currentFlow && !model.filter(i => i.trigger === trigger).length) {
521
+ content.push(this.renderEmptyFlowMessage());
522
+ } else if (!currentFlow) {
523
+ content.push(this.renderSelectFlowMessage());
524
+ } else {
525
+ const { condition, actions } = currentFlow;
526
+ if (!condition && (!actions || !actions.length)) {
527
+ content.push(this.renderEmptyActionsMessage());
528
+ } else {
529
+ if (condition) {
530
+ content.push(this.renderCondition(condition));
531
+ }
532
+ if (actions && actions.length) {
533
+ content.push(this.renderList(currentFlow.actions));
534
+ }
535
+ }
536
+ }
537
+ return html`
538
+ <section
539
+ aria-label="Flows editor"
540
+ class="editor surface1"
541
+ @dragover="${this.handleEditorDragOver}"
542
+ @dragleave="${this.handleEditorDragLeave}"
543
+ @drop="${this.handleEditorDrop}"
544
+ >${content}</section>
545
+ `;
546
+ }
547
+
548
+ protected renderEmptyFlowMessage(): TemplateResult {
549
+ return html`
550
+ <div class="empty-message">
551
+ Create a flow to get started.
552
+ </div>
553
+ <div class="empty-message">
554
+ <ui-button type="outlined" @click="${this.handleAdd}">Create</ui-button>
555
+ </div>
556
+ `;
557
+ }
558
+
559
+ protected renderSelectFlowMessage(): TemplateResult {
560
+ return html`
561
+ <div class="empty-message">Select a flow to get started.</div>
562
+ `;
563
+ }
564
+
565
+ protected renderEmptyActionsMessage(): TemplateResult {
566
+ return html`
567
+ <div class="empty-message">Drop a condition or an action here</div>
568
+ `;
569
+ }
570
+
571
+ protected renderCondition(condition: IHttpAction): TemplateResult {
572
+ return html`
573
+ <div class="step-row condition">
574
+ <div class="action-tab">
575
+ <span class="body-small">Condition</span>
576
+ ${this.renderConditionTabActions()}
577
+ </div>
578
+ <div class="param-row condition-row">
579
+ ${this.renderSteps(condition, -1)}
580
+ </div>
581
+ </div>
582
+ `;
583
+ }
584
+
585
+ protected renderList(model: IHttpAction[]): TemplateResult {
586
+ return html`
587
+ ${model.map((item, index) => this.renderAction(item, index))}
588
+ `;
589
+ }
590
+
591
+ protected renderAction(item: IHttpAction, index: number): TemplateResult {
592
+ const { description } = item;
593
+ const label = description || `Action ${index + 1}`;
594
+ return html`
595
+ <div class="step-row action">
596
+ <div class="action-tab">
597
+ <span class="body-small">${label}</span>
598
+ ${this.renderStepTabActions(index)}
599
+ </div>
600
+ <div class="param-row action-row">
601
+ ${this.renderSteps(item, index)}
602
+ </div>
603
+ </div>
604
+ `;
605
+ }
606
+
607
+ protected renderBuildingBlocks(): TemplateResult {
608
+ const { currentFlow } = this;
609
+ return html`
610
+ <section aria-label="Flow building block" class="options">
611
+ ${this.renderFlowBlocksOptions(currentFlow)}
612
+ ${this.renderDataSourceOptions(currentFlow)}
613
+ ${this.renderTransformationOptions(currentFlow)}
614
+ ${this.renderActions(currentFlow)}
615
+ ${this.renderAssertionOptions(currentFlow)}
616
+ </section>
617
+ `;
618
+ }
619
+
620
+ protected renderFlowBlocksOptions(currentFlow?: IHttpFlow): TemplateResult {
621
+ const allDisabled = !currentFlow;
622
+ const conditionDisabled = allDisabled || (!!currentFlow && !!currentFlow.condition);
623
+ return html`
624
+ <details class="action-group" open>
625
+ <summary>Flow Blocks</summary>
626
+ <div class="group-content">
627
+ ${this.renderBlockChip('Condition', 'flow-block', 'Core#Condition', {
628
+ disabled: conditionDisabled,
629
+ title: 'Adds a condition that is checked before the flow is executed. Only one condition per flow.',
630
+ })}
631
+ ${this.renderBlockChip('Action', 'flow-block', 'Core#Action', {
632
+ disabled: allDisabled,
633
+ title: 'Adds an action to this flow.',
634
+ })}
635
+ </div>
636
+ </details>
637
+ `;
638
+ }
639
+
640
+ protected renderDataSourceOptions(currentFlow?: IHttpFlow): TemplateResult {
641
+ let allDisabled = !currentFlow;
642
+ if (currentFlow) {
643
+ const { condition, actions=[] } = currentFlow;
644
+ if (!condition && !actions.length) {
645
+ allDisabled = true;
646
+ }
647
+ }
648
+ const { trigger = 'response' } = this;
649
+ if (trigger === 'request') {
650
+ return this.renderRequestDataSourceSuggestions(allDisabled);
651
+ }
652
+ return this.renderResponseDataSourceSuggestions(allDisabled);
653
+ }
654
+
655
+ protected renderTransformationOptions(currentFlow?: IHttpFlow): TemplateResult {
656
+ let allDisabled = !currentFlow;
657
+ if (currentFlow) {
658
+ const { condition, actions = [] } = currentFlow;
659
+ if (!condition && !actions.length) {
660
+ allDisabled = true;
661
+ }
662
+ }
663
+ return this.renderTransformationSuggestions(allDisabled);
664
+ }
665
+
666
+ protected renderActions(currentFlow?: IHttpFlow): TemplateResult {
667
+ let allDisabled = !currentFlow;
668
+ if (currentFlow) {
669
+ const { condition, actions = [] } = currentFlow;
670
+ if (!condition && !actions.length) {
671
+ allDisabled = true;
672
+ }
673
+ }
674
+ return this.renderActionSuggestions(allDisabled);
675
+ }
676
+
677
+ protected renderAssertionOptions(currentFlow?: IHttpFlow): TemplateResult {
678
+ let allDisabled = !currentFlow;
679
+ if (currentFlow) {
680
+ const { condition, actions = [] } = currentFlow;
681
+ if (!condition && !actions.length) {
682
+ allDisabled = true;
683
+ }
684
+ }
685
+ return this.renderAssertionSuggestions(allDisabled);
686
+ }
687
+
688
+ protected renderConditionTabActions(): TemplateResult {
689
+ return html`
690
+ <ui-dropdown-list
691
+ @select="${this.handleConditionOption}"
692
+ closeOnOutsideClick
693
+ >
694
+ <ui-icon-button class="condition-options-trigger">
695
+ <ui-icon icon="moreVert"></ui-icon>
696
+ </ui-icon-button>
697
+ <ui-list slot="dropdown" role="menu">
698
+ <ui-list-item data-option="delete" role="menuitem">Remove</ui-list-item>
699
+ </ui-list>
700
+ </ui-dropdown-list>
701
+ `;
702
+ }
703
+
704
+ protected renderStepTabActions(actionIndex: number): TemplateResult {
705
+ return html`
706
+ <ui-dropdown-list
707
+ @select="${this.handleActionOption}"
708
+ closeOnOutsideClick
709
+ data-action-index="${actionIndex}"
710
+ >
711
+ <ui-icon-button class="action-options-trigger">
712
+ <ui-icon icon="moreVert"></ui-icon>
713
+ </ui-icon-button>
714
+ <ui-list slot="dropdown" role="menu">
715
+ <ui-list-item data-option="rename" role="menuitem">Rename</ui-list-item>
716
+ <ui-divider></ui-divider>
717
+ <ui-list-item data-option="delete" role="menuitem">Remove</ui-list-item>
718
+ </ui-list>
719
+ </ui-dropdown-list>
720
+ `;
721
+ }
722
+ }