@devtron-labs/devtron-fe-common-lib 0.0.60-beta-1 → 0.0.60-beta-3

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 (384) hide show
  1. package/.eslintignore +96 -0
  2. package/.eslintrc.js +109 -0
  3. package/.github/pull_request_template.md +25 -0
  4. package/.github/workflows/ci.yml +31 -0
  5. package/.github/workflows/release-package.yml +48 -0
  6. package/.husky/pre-commit +5 -0
  7. package/.lintstagedrc +3 -0
  8. package/.nvmrc +1 -0
  9. package/.prettierrc.js +7 -0
  10. package/dist/Common/AddCDButton/AddCDButton.d.ts +3 -3
  11. package/dist/Common/AddCDButton/index.d.ts +2 -2
  12. package/dist/Common/AddCDButton/types.d.ts +26 -26
  13. package/dist/Common/AddCDButton/utils.d.ts +2 -2
  14. package/dist/Common/Api.d.ts +5 -5
  15. package/dist/Common/AppStatus/AppStatus.d.ts +3 -3
  16. package/dist/Common/AppStatus/constants.d.ts +51 -51
  17. package/dist/Common/AppStatus/index.d.ts +1 -1
  18. package/dist/Common/AppStatus/types.d.ts +12 -12
  19. package/dist/Common/AppStatus/utils.d.ts +1 -1
  20. package/dist/Common/BreadCrumb/BreadCrumb.d.ts +5 -5
  21. package/dist/Common/BreadCrumb/BreadcrumbStore.d.ts +17 -17
  22. package/dist/Common/BreadCrumb/Types.d.ts +28 -28
  23. package/dist/Common/CIPipeline.Types.d.ts +265 -265
  24. package/dist/Common/ChartVersionAndTypeSelector.d.ts +4 -3
  25. package/dist/Common/Checkbox.d.ts +5 -5
  26. package/dist/Common/ClipboardButton/ClipboardButton.d.ts +10 -10
  27. package/dist/Common/ClipboardButton/types.d.ts +8 -8
  28. package/dist/Common/Common.service.d.ts +20 -20
  29. package/dist/Common/Constants.d.ts +75 -81
  30. package/dist/Common/CustomInput/CustomInput.d.ts +3 -2
  31. package/dist/Common/CustomInput/Types.d.ts +31 -31
  32. package/dist/Common/CustomInput/index.d.ts +2 -2
  33. package/dist/Common/CustomTagSelector/PropagateTagInfo.d.ts +4 -4
  34. package/dist/Common/CustomTagSelector/ResizableTagTextArea.d.ts +3 -2
  35. package/dist/Common/CustomTagSelector/TagDetails.d.ts +3 -2
  36. package/dist/Common/CustomTagSelector/TagLabelSelect.d.ts +3 -2
  37. package/dist/Common/CustomTagSelector/TagLabelValueSelector.d.ts +3 -2
  38. package/dist/Common/CustomTagSelector/TagSelector.utils.d.ts +12 -12
  39. package/dist/Common/CustomTagSelector/Types.d.ts +68 -68
  40. package/dist/Common/CustomTagSelector/ValidationRules.d.ts +10 -10
  41. package/dist/Common/CustomTagSelector/index.d.ts +6 -6
  42. package/dist/Common/DebouncedSearch/DebouncedSearch.d.ts +17 -17
  43. package/dist/Common/DebouncedSearch/Types.d.ts +14 -14
  44. package/dist/Common/DebouncedSearch/Utils.d.ts +1 -1
  45. package/dist/Common/DeleteComponentModal/DeleteComponent.d.ts +4 -3
  46. package/dist/Common/DeleteComponentModal/types.d.ts +15 -15
  47. package/dist/Common/DevtronProgressing/DevtronProgressing.d.ts +3 -2
  48. package/dist/Common/DevtronProgressing/index.d.ts +1 -1
  49. package/dist/Common/DevtronProgressing/types.d.ts +4 -4
  50. package/dist/Common/Dialogs/ConfirmationDialog.d.ts +9 -8
  51. package/dist/Common/Dialogs/DeleteDialog.d.ts +5 -5
  52. package/dist/Common/Dialogs/DialogForm.d.ts +14 -14
  53. package/dist/Common/Dialogs/ForceDeleteDialog.d.ts +3 -3
  54. package/dist/Common/Dialogs/Types.d.ts +45 -45
  55. package/dist/Common/Dialogs/index.d.ts +4 -4
  56. package/dist/Common/DraggableWrapper/DraggableButton.d.ts +3 -3
  57. package/dist/Common/DraggableWrapper/DraggableWrapper.d.ts +9 -9
  58. package/dist/Common/DraggableWrapper/index.d.ts +3 -3
  59. package/dist/Common/DraggableWrapper/types.d.ts +23 -23
  60. package/dist/Common/Drawer/Drawer.d.ts +16 -14
  61. package/dist/Common/EmptyState/EmptyState.d.ts +25 -0
  62. package/dist/Common/EmptyState/GenericEmptyState.d.ts +5 -3
  63. package/dist/Common/Error.d.ts +17 -17
  64. package/dist/Common/ErrorScreenNotFound.d.ts +3 -2
  65. package/dist/Common/Grid/Grid.d.ts +3 -3
  66. package/dist/Common/Grid/types.d.ts +10 -10
  67. package/dist/Common/Helper.d.ts +67 -68
  68. package/dist/Common/Hooks/UseClickOutside/UseClickOutside.d.ts +1 -1
  69. package/dist/Common/Hooks/UseSuperAdmin/UseSuperAdmin.d.ts +6 -6
  70. package/dist/Common/Hooks/UseSuperAdmin/types.d.ts +3 -3
  71. package/dist/Common/Hooks/UseWindowSize/UseWindowSize.d.ts +4 -4
  72. package/dist/Common/Hooks/index.d.ts +3 -3
  73. package/dist/Common/ImageTags.Types.d.ts +40 -40
  74. package/dist/Common/ImageTags.d.ts +4 -3
  75. package/dist/Common/InfoColorBar/InfoColourbar.d.ts +5 -3
  76. package/dist/Common/Modals/Modal.d.ts +3 -3
  77. package/dist/Common/Modals/OpaqueModal.d.ts +12 -12
  78. package/dist/Common/Modals/VisibleModal.d.ts +15 -15
  79. package/dist/Common/Modals/VisibleModal2.d.ts +12 -12
  80. package/dist/Common/MultiSelectCustomization.d.ts +37 -37
  81. package/dist/Common/Pagination/PageSizeSelector.d.ts +4 -3
  82. package/dist/Common/Pagination/Pagination.d.ts +5 -3
  83. package/dist/Common/Pagination/constants.d.ts +5 -5
  84. package/dist/Common/Pagination/index.d.ts +1 -1
  85. package/dist/Common/Pagination/types.d.ts +51 -51
  86. package/dist/Common/Pagination/utils.d.ts +6 -6
  87. package/dist/Common/Policy.Types.d.ts +56 -56
  88. package/dist/Common/PopupMenu.d.ts +8 -7
  89. package/dist/Common/Progressing.d.ts +4 -3
  90. package/dist/Common/RJSF/Form.d.ts +4 -2
  91. package/dist/Common/RJSF/common/FieldRow.d.ts +6 -5
  92. package/dist/Common/RJSF/common/types.d.ts +8 -8
  93. package/dist/Common/RJSF/config.d.ts +4 -4
  94. package/dist/Common/RJSF/constants.d.ts +7 -7
  95. package/dist/Common/RJSF/index.d.ts +3 -3
  96. package/dist/Common/RJSF/templates/ArrayFieldItemTemplate.d.ts +3 -2
  97. package/dist/Common/RJSF/templates/ArrayFieldTemplate.d.ts +3 -2
  98. package/dist/Common/RJSF/templates/BaseInput.d.ts +3 -2
  99. package/dist/Common/RJSF/templates/ButtonTemplates/AddButton.d.ts +3 -2
  100. package/dist/Common/RJSF/templates/ButtonTemplates/RemoveButton.d.ts +3 -2
  101. package/dist/Common/RJSF/templates/ButtonTemplates/SubmitButton.d.ts +3 -2
  102. package/dist/Common/RJSF/templates/ButtonTemplates/index.d.ts +3 -3
  103. package/dist/Common/RJSF/templates/Description.d.ts +3 -2
  104. package/dist/Common/RJSF/templates/Field.d.ts +3 -2
  105. package/dist/Common/RJSF/templates/FieldErrorTemplate.d.ts +3 -2
  106. package/dist/Common/RJSF/templates/ObjectFieldTemplate.d.ts +3 -2
  107. package/dist/Common/RJSF/templates/TitleField.d.ts +3 -2
  108. package/dist/Common/RJSF/templates/WrapIfAdditionalTemplate.d.ts +3 -2
  109. package/dist/Common/RJSF/templates/index.d.ts +10 -10
  110. package/dist/Common/RJSF/types.d.ts +3 -3
  111. package/dist/Common/RJSF/utils.d.ts +26 -25
  112. package/dist/Common/RJSF/widgets/Checkbox.d.ts +3 -2
  113. package/dist/Common/RJSF/widgets/Select.d.ts +3 -2
  114. package/dist/Common/RJSF/widgets/index.d.ts +2 -2
  115. package/dist/Common/RadioGroup/RadioGroup.d.ts +17 -16
  116. package/dist/Common/RadioGroup.d.ts +8 -8
  117. package/dist/Common/Reload.d.ts +3 -3
  118. package/dist/Common/ResizableTextarea.d.ts +3 -3
  119. package/dist/Common/SearchBar/SearchBar.component.d.ts +39 -37
  120. package/dist/Common/SearchBar/index.d.ts +2 -2
  121. package/dist/Common/SearchBar/types.d.ts +35 -35
  122. package/dist/Common/Security/ScanVulnerabilitiesTable.d.ts +4 -3
  123. package/dist/Common/ServerError.d.ts +15 -15
  124. package/dist/Common/TippyCustomized.d.ts +4 -2
  125. package/dist/Common/ToastBody.d.ts +23 -23
  126. package/dist/Common/Toggle/Toggle.d.ts +14 -12
  127. package/dist/Common/Types.d.ts +692 -691
  128. package/dist/Common/index.d.ts +50 -50
  129. package/dist/index.d.ts +1 -7
  130. package/dist/index.js +28900 -162
  131. package/package.json +23 -34
  132. package/rollup.config.js +31 -0
  133. package/src/Assets/Icon/ic-add.svg +3 -0
  134. package/src/Assets/Icon/ic-appstatus-cancelled.svg +6 -0
  135. package/src/Assets/Icon/ic-arrow-counter-clockwise.svg +5 -0
  136. package/src/Assets/Icon/ic-check.svg +5 -0
  137. package/src/Assets/Icon/ic-chevron-down.svg +5 -0
  138. package/src/Assets/Icon/ic-copy.svg +3 -0
  139. package/src/Assets/Icon/ic-cross.svg +3 -0
  140. package/src/Assets/Icon/ic-drag.svg +8 -0
  141. package/src/Assets/Icon/ic-enter.svg +3 -0
  142. package/src/Assets/Icon/ic-error-cross.svg +8 -0
  143. package/src/Assets/Icon/ic-error-exclamation.svg +6 -0
  144. package/src/Assets/Icon/ic-error-medium.svg +6 -0
  145. package/src/Assets/Icon/ic-help-outline.svg +3 -0
  146. package/src/Assets/Icon/ic-help.svg +3 -0
  147. package/src/Assets/Icon/ic-info-filled.svg +7 -0
  148. package/src/Assets/Icon/ic-info-outlined.svg +13 -0
  149. package/src/Assets/Icon/ic-minus.svg +3 -0
  150. package/src/Assets/Icon/ic-pencil.svg +3 -0
  151. package/src/Assets/Icon/ic-progressing.svg +6 -0
  152. package/src/Assets/Icon/ic-rotate-devtron.svg +103 -0
  153. package/src/Assets/Icon/ic-search.svg +6 -0
  154. package/src/Assets/Icon/ic-warning.svg +7 -0
  155. package/src/Assets/Icon/inject-tag.svg +5 -0
  156. package/src/Assets/Img/app-not-deployed.png +0 -0
  157. package/src/Assets/Img/delete-medium.svg +15 -0
  158. package/src/Assets/Img/ic-empty-error@2x.png +0 -0
  159. package/src/Assets/Img/ic-loading-failure.png +0 -0
  160. package/src/Assets/Img/ic-not-authorized.svg +62 -0
  161. package/src/Common/AddCDButton/AddCDButton.tsx +68 -0
  162. package/src/Common/AddCDButton/index.ts +2 -0
  163. package/src/Common/AddCDButton/types.ts +38 -0
  164. package/src/Common/AddCDButton/utils.tsx +35 -0
  165. package/src/Common/Api.ts +230 -0
  166. package/src/Common/AppStatus/AppStatus.tsx +64 -0
  167. package/src/Common/AppStatus/constants.ts +53 -0
  168. package/src/Common/AppStatus/index.ts +1 -0
  169. package/src/Common/AppStatus/types.ts +12 -0
  170. package/src/Common/AppStatus/utils.ts +14 -0
  171. package/src/Common/BreadCrumb/BreadCrumb.tsx +105 -0
  172. package/src/Common/BreadCrumb/BreadcrumbStore.tsx +25 -0
  173. package/src/Common/BreadCrumb/Types.ts +30 -0
  174. package/src/Common/CIPipeline.Types.ts +277 -0
  175. package/src/Common/ChartVersionAndTypeSelector.tsx +78 -0
  176. package/src/Common/Checkbox.tsx +36 -0
  177. package/src/Common/ClipboardButton/ClipboardButton.tsx +61 -0
  178. package/src/Common/ClipboardButton/__tests__/ClipboardButton.test.tsx +43 -0
  179. package/src/Common/ClipboardButton/types.ts +7 -0
  180. package/src/Common/Common.service.ts +315 -0
  181. package/src/Common/Constants.ts +254 -0
  182. package/src/Common/CustomInput/CustomInput.tsx +134 -0
  183. package/src/Common/CustomInput/Types.ts +32 -0
  184. package/src/Common/CustomInput/index.ts +2 -0
  185. package/src/Common/CustomTagSelector/PropagateTagInfo.tsx +46 -0
  186. package/src/Common/CustomTagSelector/ResizableTagTextArea.tsx +84 -0
  187. package/src/Common/CustomTagSelector/TagDetails.tsx +76 -0
  188. package/src/Common/CustomTagSelector/TagLabelSelect.tsx +61 -0
  189. package/src/Common/CustomTagSelector/TagLabelValueSelector.tsx +198 -0
  190. package/src/Common/CustomTagSelector/TagSelector.utils.ts +71 -0
  191. package/src/Common/CustomTagSelector/Types.ts +72 -0
  192. package/src/Common/CustomTagSelector/ValidationRules.ts +58 -0
  193. package/src/Common/CustomTagSelector/index.ts +6 -0
  194. package/src/Common/DebouncedSearch/DebouncedSearch.tsx +78 -0
  195. package/src/Common/DebouncedSearch/Types.ts +13 -0
  196. package/src/Common/DebouncedSearch/Utils.ts +19 -0
  197. package/src/Common/DebouncedSearch/__tests__/DebouncedSearch.test.tsx +61 -0
  198. package/src/Common/DeleteComponentModal/DeleteComponent.tsx +95 -0
  199. package/src/Common/DeleteComponentModal/types.ts +15 -0
  200. package/src/Common/DevtronProgressing/DevtronProgressing.tsx +11 -0
  201. package/src/Common/DevtronProgressing/index.ts +1 -0
  202. package/src/Common/DevtronProgressing/types.ts +4 -0
  203. package/src/Common/Dialogs/ConfirmationDialog.tsx +34 -0
  204. package/src/Common/Dialogs/DeleteDialog.tsx +69 -0
  205. package/src/Common/Dialogs/DialogForm.tsx +86 -0
  206. package/src/Common/Dialogs/ForceDeleteDialog.tsx +19 -0
  207. package/src/Common/Dialogs/Types.ts +47 -0
  208. package/src/Common/Dialogs/index.ts +4 -0
  209. package/src/Common/DraggableWrapper/DraggableButton.tsx +14 -0
  210. package/src/Common/DraggableWrapper/DraggableWrapper.tsx +116 -0
  211. package/src/Common/DraggableWrapper/index.ts +3 -0
  212. package/src/Common/DraggableWrapper/types.ts +27 -0
  213. package/src/Common/Drawer/Drawer.scss +40 -0
  214. package/src/Common/Drawer/Drawer.tsx +49 -0
  215. package/src/Common/EmptyState/EmptyState.tsx +42 -0
  216. package/src/Common/EmptyState/GenericEmptyState.tsx +81 -0
  217. package/src/Common/EmptyState/emptyState.scss +74 -0
  218. package/src/Common/Error.tsx +61 -0
  219. package/src/Common/ErrorScreenNotFound.tsx +31 -0
  220. package/src/Common/Grid/Grid.tsx +44 -0
  221. package/src/Common/Grid/types.ts +11 -0
  222. package/src/Common/Helper.tsx +590 -0
  223. package/src/Common/Hooks/UseClickOutside/UseClickOutside.tsx +15 -0
  224. package/src/Common/Hooks/UseSuperAdmin/UseSuperAdmin.tsx +24 -0
  225. package/src/Common/Hooks/UseSuperAdmin/types.ts +3 -0
  226. package/src/Common/Hooks/UseWindowSize/UseWindowSize.tsx +31 -0
  227. package/src/Common/Hooks/index.ts +3 -0
  228. package/src/Common/ImageTags.Types.ts +44 -0
  229. package/src/Common/ImageTags.tsx +586 -0
  230. package/src/Common/InfoColorBar/InfoColourbar.tsx +80 -0
  231. package/src/Common/InfoColorBar/infoColourBar.scss +28 -0
  232. package/src/Common/Modals/Modal.tsx +68 -0
  233. package/src/Common/Modals/OpaqueModal.tsx +36 -0
  234. package/src/Common/Modals/VisibleModal.tsx +55 -0
  235. package/src/Common/Modals/VisibleModal2.tsx +35 -0
  236. package/src/Common/MultiSelectCustomization.tsx +148 -0
  237. package/src/Common/Pagination/PageSizeSelector.tsx +78 -0
  238. package/src/Common/Pagination/Pagination.tsx +127 -0
  239. package/src/Common/Pagination/constants.ts +6 -0
  240. package/src/Common/Pagination/index.tsx +3 -0
  241. package/src/Common/Pagination/pagination.scss +123 -0
  242. package/src/Common/Pagination/types.ts +55 -0
  243. package/src/Common/Pagination/utils.tsx +24 -0
  244. package/src/Common/Policy.Types.ts +63 -0
  245. package/src/Common/PopupMenu.tsx +199 -0
  246. package/src/Common/Progressing.tsx +53 -0
  247. package/src/Common/RJSF/Form.tsx +29 -0
  248. package/src/Common/RJSF/common/FieldRow.tsx +35 -0
  249. package/src/Common/RJSF/common/types.ts +9 -0
  250. package/src/Common/RJSF/config.ts +37 -0
  251. package/src/Common/RJSF/constants.ts +10 -0
  252. package/src/Common/RJSF/index.ts +3 -0
  253. package/src/Common/RJSF/rjsfForm.scss +18 -0
  254. package/src/Common/RJSF/templates/ArrayFieldItemTemplate.tsx +31 -0
  255. package/src/Common/RJSF/templates/ArrayFieldTemplate.tsx +78 -0
  256. package/src/Common/RJSF/templates/BaseInput.tsx +16 -0
  257. package/src/Common/RJSF/templates/ButtonTemplates/AddButton.tsx +18 -0
  258. package/src/Common/RJSF/templates/ButtonTemplates/RemoveButton.tsx +10 -0
  259. package/src/Common/RJSF/templates/ButtonTemplates/SubmitButton.tsx +18 -0
  260. package/src/Common/RJSF/templates/ButtonTemplates/index.ts +3 -0
  261. package/src/Common/RJSF/templates/Description.tsx +12 -0
  262. package/src/Common/RJSF/templates/Field.tsx +30 -0
  263. package/src/Common/RJSF/templates/FieldErrorTemplate.tsx +25 -0
  264. package/src/Common/RJSF/templates/ObjectFieldTemplate.tsx +105 -0
  265. package/src/Common/RJSF/templates/TitleField.tsx +9 -0
  266. package/src/Common/RJSF/templates/WrapIfAdditionalTemplate.tsx +51 -0
  267. package/src/Common/RJSF/templates/index.ts +10 -0
  268. package/src/Common/RJSF/types.ts +4 -0
  269. package/src/Common/RJSF/utils.ts +123 -0
  270. package/src/Common/RJSF/widgets/Checkbox.tsx +44 -0
  271. package/src/Common/RJSF/widgets/Select.tsx +77 -0
  272. package/src/Common/RJSF/widgets/index.ts +2 -0
  273. package/src/Common/RadioGroup/RadioGroup.tsx +105 -0
  274. package/src/Common/RadioGroup/radioGroup.scss +46 -0
  275. package/src/Common/RadioGroup.tsx +53 -0
  276. package/src/Common/Reload.tsx +23 -0
  277. package/src/Common/ResizableTextarea.tsx +73 -0
  278. package/src/Common/SearchBar/SearchBar.component.tsx +119 -0
  279. package/src/Common/SearchBar/index.ts +2 -0
  280. package/src/Common/SearchBar/searchBar.scss +31 -0
  281. package/src/Common/SearchBar/types.ts +34 -0
  282. package/src/Common/Security/ScanVulnerabilitiesTable.tsx +55 -0
  283. package/src/Common/Security/scanVulnerabilities.css +69 -0
  284. package/src/Common/ServerError.ts +31 -0
  285. package/src/Common/TippyCustomized.tsx +172 -0
  286. package/src/Common/ToastBody.tsx +62 -0
  287. package/src/Common/Toggle/Toggle.scss +78 -0
  288. package/src/Common/Toggle/Toggle.tsx +50 -0
  289. package/src/Common/Types.ts +765 -0
  290. package/src/Common/index.ts +50 -0
  291. package/src/custom.d.ts +13 -0
  292. package/src/index.ts +1 -0
  293. package/tsconfig.json +40 -0
  294. package/dist/Common/CodeEditor/CodeEditor.d.ts +0 -47
  295. package/dist/Common/Select/Select.d.ts +0 -4
  296. package/dist/Common/Select/types.d.ts +0 -29
  297. package/dist/abap-9f67f57a.js +0 -1314
  298. package/dist/apex-ff62e532.js +0 -315
  299. package/dist/assets/editor.worker-d26000ef.js +0 -9
  300. package/dist/assets/index.css +0 -1
  301. package/dist/assets/json.worker-f23a4654.js +0 -40
  302. package/dist/assets/yaml.worker-35ea3f9a.js +0 -467
  303. package/dist/azcli-31e64a7f.js +0 -74
  304. package/dist/bat-0ffe897e.js +0 -95
  305. package/dist/bicep-3414a2b1.js +0 -108
  306. package/dist/cameligo-df1f3f25.js +0 -168
  307. package/dist/clojure-65b0f010.js +0 -754
  308. package/dist/coffee-437f0fba.js +0 -228
  309. package/dist/cpp-66843dd5.js +0 -390
  310. package/dist/csharp-621d9a49.js +0 -320
  311. package/dist/csp-de0d5244.js +0 -57
  312. package/dist/css-7cd5ed4c.js +0 -186
  313. package/dist/cssMode-6b75f943.js +0 -1446
  314. package/dist/cypher-70ad96fe.js +0 -262
  315. package/dist/dart-33ae3739.js +0 -270
  316. package/dist/dockerfile-f2274a50.js +0 -132
  317. package/dist/ecl-3b8294a3.js +0 -454
  318. package/dist/elixir-b9dcc73a.js +0 -489
  319. package/dist/flow9-bdde8316.js +0 -141
  320. package/dist/freemarker2-af9f92ac.js +0 -643
  321. package/dist/fsharp-eac2e449.js +0 -210
  322. package/dist/go-d12ed8d4.js +0 -208
  323. package/dist/graphql-c7356b69.js +0 -141
  324. package/dist/handlebars-cc9800dd.js +0 -391
  325. package/dist/hcl-e883a0d4.js +0 -177
  326. package/dist/html-edc1e4c2.js +0 -281
  327. package/dist/htmlMode-17cc8a79.js +0 -1456
  328. package/dist/index-32e797ab.js +0 -126102
  329. package/dist/ini-425ab711.js +0 -68
  330. package/dist/java-2bc0fd68.js +0 -221
  331. package/dist/javascript-5e615a9b.js +0 -75
  332. package/dist/jsonMode-742c1a1b.js +0 -1867
  333. package/dist/julia-1c932615.js +0 -496
  334. package/dist/kotlin-1ab839c8.js +0 -245
  335. package/dist/less-6fe856f5.js +0 -168
  336. package/dist/lexon-4955ac52.js +0 -151
  337. package/dist/liquid-843d0e9e.js +0 -238
  338. package/dist/lua-3cca0047.js +0 -157
  339. package/dist/m3-132e9cb6.js +0 -210
  340. package/dist/markdown-ea59a0c1.js +0 -202
  341. package/dist/mips-19811f4b.js +0 -194
  342. package/dist/msdax-69954a10.js +0 -377
  343. package/dist/mysql-82088e5d.js +0 -876
  344. package/dist/objective-c-1976eccc.js +0 -188
  345. package/dist/pascal-8ef177cb.js +0 -245
  346. package/dist/pascaligo-bc517b9e.js +0 -158
  347. package/dist/perl-8b93582c.js +0 -599
  348. package/dist/pgsql-00c11a6d.js +0 -847
  349. package/dist/php-4c8c276f.js +0 -471
  350. package/dist/pla-e9b4ffb1.js +0 -131
  351. package/dist/postiats-2071af8c.js +0 -544
  352. package/dist/powerquery-8e388ceb.js +0 -890
  353. package/dist/powershell-e35db398.js +0 -233
  354. package/dist/protobuf-a24b9176.js +0 -422
  355. package/dist/pug-2c94d9b8.js +0 -393
  356. package/dist/python-67e4059c.js +0 -259
  357. package/dist/qsharp-d730d7fe.js +0 -282
  358. package/dist/r-be193556.js +0 -245
  359. package/dist/razor-8e9d6aa5.js +0 -512
  360. package/dist/redis-9690c6ac.js +0 -298
  361. package/dist/redshift-6bdcdeaa.js +0 -806
  362. package/dist/restructuredtext-a08c1d20.js +0 -162
  363. package/dist/ruby-2247692b.js +0 -444
  364. package/dist/rust-1dffb4d5.js +0 -337
  365. package/dist/sb-136598e9.js +0 -110
  366. package/dist/scala-b1100fed.js +0 -353
  367. package/dist/scheme-038c8094.js +0 -114
  368. package/dist/scss-700d1b52.js +0 -244
  369. package/dist/shell-86c16e0f.js +0 -224
  370. package/dist/solidity-c05fdf3c.js +0 -1351
  371. package/dist/sophia-cd645d71.js +0 -190
  372. package/dist/sparql-01d9ec9c.js +0 -193
  373. package/dist/sql-4c33df41.js +0 -818
  374. package/dist/st-52cf1408.js +0 -414
  375. package/dist/swift-13c792ba.js +0 -315
  376. package/dist/systemverilog-0bd8b730.js +0 -556
  377. package/dist/tcl-463d7c75.js +0 -232
  378. package/dist/tsMode-d5db18bc.js +0 -811
  379. package/dist/twig-0d98f5ec.js +0 -323
  380. package/dist/typescript-302557e6.js +0 -328
  381. package/dist/vb-3a2b0a51.js +0 -364
  382. package/dist/wgsl-b2ddb3e4.js +0 -420
  383. package/dist/xml-47f08bc4.js +0 -95
  384. package/dist/yaml-49f075d9.js +0 -184
@@ -0,0 +1,44 @@
1
+ export interface ReleaseTag {
2
+ id: number
3
+ tagName: string
4
+ appId: number
5
+ deleted: boolean
6
+ artifactId: number
7
+ duplicateTag: boolean
8
+ }
9
+
10
+ export interface ImageComment {
11
+ id: number
12
+ comment: string
13
+ artifactId: number
14
+ }
15
+
16
+
17
+ export interface ImageTaggingContainerType {
18
+ ciPipelineId?: number
19
+ artifactId?: number
20
+ imageComment?: ImageComment
21
+ imageReleaseTags?: ReleaseTag[]
22
+ updateCurrentAppMaterial? : (matId:number, releaseTags?:ReleaseTag[], imageComment?:ImageComment) => void
23
+ appReleaseTagNames?: string[]
24
+ tagsEditable?: boolean
25
+ forceReInit?: boolean
26
+ setAppReleaseTagNames?: (appReleaseTags: string[]) => void
27
+ setTagsEditable?: (tagsEditable: boolean) => void
28
+ toggleCardMode?: (id: number) => void
29
+ hideHardDelete?: boolean
30
+ isSuperAdmin?: boolean
31
+ }
32
+
33
+ export interface ImageButtonType {
34
+ text: string
35
+ isSoftDeleted: boolean
36
+ isEditing: boolean
37
+ onSoftDeleteClick?: any
38
+ onHardDeleteClick?: any
39
+ tagId: number
40
+ softDeleteTags: any
41
+ isSuperAdmin: any
42
+ duplicateTag?: boolean
43
+ hideHardDelete?: boolean
44
+ }
@@ -0,0 +1,586 @@
1
+ import React, { useEffect, useMemo, useRef, useState } from 'react'
2
+ import { ReactComponent as Add } from '../Assets/Icon/ic-add.svg'
3
+ import { ReactComponent as Close } from '../Assets/Icon/ic-cross.svg'
4
+ import { ReactComponent as QuestionFilled } from '../Assets/Icon/ic-help.svg'
5
+ import { ReactComponent as Question } from '../Assets/Icon/ic-help-outline.svg'
6
+
7
+ import { ReactComponent as EditIcon } from '../Assets/Icon/ic-pencil.svg'
8
+ import { ReactComponent as Redo } from '../Assets/Icon/ic-arrow-counter-clockwise.svg'
9
+ import { ReactComponent as Minus } from '../Assets/Icon/ic-minus.svg'
10
+ import { toast } from 'react-toastify'
11
+ import { ReactComponent as Info } from '../Assets/Icon/ic-info-filled.svg'
12
+ import { ReactComponent as Error } from '../Assets/Icon/ic-warning.svg'
13
+ import { ReactComponent as Warning } from '../Assets/Icon/ic-error-exclamation.svg'
14
+ import { ReactComponent as Enter } from '../Assets/Icon/ic-enter.svg'
15
+ import { TippyTheme } from './Types'
16
+ import { ImageButtonType, ImageTaggingContainerType, ReleaseTag } from './ImageTags.Types'
17
+ import { showError, stopPropagation } from './Helper'
18
+ import { TippyCustomized } from './TippyCustomized'
19
+ import { setImageTags } from './Common.service'
20
+ import Tippy from '@tippyjs/react'
21
+ import { Progressing } from './Progressing'
22
+
23
+ export const ImageTagsContainer = ({
24
+ // Setting it to zero in case of external pipeline
25
+ ciPipelineId,
26
+ artifactId,
27
+ imageComment,
28
+ imageReleaseTags,
29
+ updateCurrentAppMaterial,
30
+ appReleaseTagNames,
31
+ setAppReleaseTagNames,
32
+ tagsEditable,
33
+ setTagsEditable,
34
+ toggleCardMode,
35
+ hideHardDelete,
36
+ forceReInit,
37
+ isSuperAdmin
38
+ }: ImageTaggingContainerType) => {
39
+ const [initialTags, setInitialTags] = useState<ReleaseTag[]>(imageReleaseTags ? imageReleaseTags : [])
40
+ const [initialDescription, setInitialDescription] = useState(imageComment ? imageComment.comment : '')
41
+ const [existingTags, setExistingTags] = useState(appReleaseTagNames ? appReleaseTagNames : [])
42
+ const [newDescription, setNewDescription] = useState(imageComment ? imageComment.comment : '')
43
+ const [isEditing, setIsEditing] = useState(false)
44
+ const [showTagsWarning, setShowTagsWarning] = useState(false)
45
+ const [displayedTags, setDisplayedTags] = useState<ReleaseTag[]>(imageReleaseTags ? imageReleaseTags : [])
46
+ const [tagErrorMessage, setTagErrorMessage] = useState('')
47
+ const [createTags, setCreateTags] = useState<ReleaseTag[]>([])
48
+ const [softDeleteTags, setSoftDeleteTags] = useState<ReleaseTag[]>([])
49
+ const [hardDeleteTags, setHardDeleteTags] = useState<ReleaseTag[]>([])
50
+ const [descriptionValidationMessage, setDescriptionValidationMessage] = useState<string>('')
51
+ const [textInput, setTextInput] = useState<string>('')
52
+ const [loading, setLoading] = useState<boolean>(false)
53
+
54
+
55
+ useEffect(() => {
56
+ reInitState()
57
+ }, [imageReleaseTags, imageComment, tagsEditable])
58
+
59
+ useEffect(() => {
60
+ setExistingTags(appReleaseTagNames ? appReleaseTagNames : [])
61
+ }, [appReleaseTagNames])
62
+
63
+
64
+ const reInitState = () => {
65
+ if (forceReInit || !isEditing) {
66
+ setInitialTags(imageReleaseTags ? imageReleaseTags : [])
67
+ setInitialDescription(imageComment ? imageComment.comment : '')
68
+ setNewDescription(imageComment ? imageComment.comment : '')
69
+ setDisplayedTags(imageReleaseTags ? imageReleaseTags : [])
70
+ setIsEditing(false)
71
+ }
72
+ }
73
+
74
+ const handleEditClick = () => {
75
+ setIsEditing(!isEditing)
76
+ if (typeof toggleCardMode === 'function') {
77
+ toggleCardMode(artifactId)
78
+ }
79
+ }
80
+
81
+ const handleDescriptionChange = (e) => {
82
+ const description = e.target.value
83
+ description?.length > 500
84
+ ? setDescriptionValidationMessage('comment length cannot exceed 500 characters')
85
+ : setDescriptionValidationMessage('')
86
+ setNewDescription(description)
87
+ }
88
+
89
+ const handleCancel = () => {
90
+ setDisplayedTags(initialTags)
91
+ setNewDescription(initialDescription)
92
+ setCreateTags([])
93
+ setSoftDeleteTags([])
94
+ setHardDeleteTags([])
95
+ handleEditClick()
96
+ setShowTagsWarning(false)
97
+ setTagErrorMessage('')
98
+ }
99
+
100
+ const validateTag = (lowercaseValue) : boolean => {
101
+ if (
102
+ lowercaseValue.length == 0 ||
103
+ lowercaseValue.length >= 128 ||
104
+ lowercaseValue[0] == '.' ||
105
+ lowercaseValue[0] == '-'
106
+ ) {
107
+ setTagErrorMessage('Tag name cannot be empty or exceed 128 characters or cannot start with . or -')
108
+ return false
109
+ }
110
+ setTagErrorMessage('')
111
+ const isTagExistsInExistingTags = existingTags.includes(lowercaseValue)
112
+ let isTagExistsInDisplayedTags = false
113
+ for (let i = 0; i < displayedTags?.length; i++) {
114
+ if (displayedTags[i].tagName.toLowerCase() === lowercaseValue) isTagExistsInDisplayedTags = true
115
+ }
116
+ if (isTagExistsInExistingTags || isTagExistsInDisplayedTags || lowercaseValue === 'latest') {
117
+ setTagErrorMessage('This tag is already being used in this application')
118
+ return false
119
+ }
120
+ return true
121
+ }
122
+
123
+ const handleTagCreate = (newValue) : ReleaseTag[] => {
124
+ const lowercaseValue = newValue.toLowerCase().trim()
125
+ if(validateTag(lowercaseValue)) {
126
+ const newTag: ReleaseTag = {
127
+ id: 0,
128
+ tagName: lowercaseValue,
129
+ appId: 0,
130
+ deleted: false,
131
+ artifactId: 0,
132
+ duplicateTag: false,
133
+ }
134
+ const newCreateTags = [...createTags, newTag]
135
+ setCreateTags(newCreateTags)
136
+ setDisplayedTags([...displayedTags, newTag])
137
+ setShowTagsWarning(true)
138
+ setTextInput('')
139
+ return newCreateTags
140
+ }
141
+ return createTags
142
+ }
143
+
144
+ const handleTagSoftDelete = (index) => {
145
+ const updatedTags = [...displayedTags]
146
+ updatedTags[index] = {
147
+ ...updatedTags[index],
148
+ deleted: !updatedTags[index].deleted,
149
+ }
150
+ const updatedTag = updatedTags[index]
151
+ let updatedSoftDeleteTags = [...softDeleteTags]
152
+ const tagIndex = updatedSoftDeleteTags.findIndex((tag) => tag.tagName === updatedTag.tagName)
153
+ if (tagIndex !== -1) {
154
+ // Tag already exists in softDeleteTags array, remove it
155
+ updatedSoftDeleteTags.splice(tagIndex, 1)
156
+ } else {
157
+ // Tag doesn't exist in softDeleteTags array, add it
158
+ updatedSoftDeleteTags.push(updatedTag)
159
+ }
160
+ setDisplayedTags(updatedTags)
161
+ setSoftDeleteTags(updatedSoftDeleteTags)
162
+ }
163
+
164
+ const handleTagHardDelete = (index) => {
165
+ const deletedTag = displayedTags[index]
166
+ const updatedCreateTags = createTags.filter((tag) => tag.tagName !== deletedTag.tagName)
167
+ setCreateTags(updatedCreateTags)
168
+ const updatedDisplayedTags = [...displayedTags]
169
+ updatedDisplayedTags.splice(index, 1)
170
+ setDisplayedTags(updatedDisplayedTags)
171
+ const updatedExistingTags = existingTags.filter((tag) => tag.toLowerCase() !== deletedTag.tagName.toLowerCase())
172
+ setExistingTags(updatedExistingTags)
173
+ if (deletedTag.id !== 0) {
174
+ const updatedHardDeleteTags = [...hardDeleteTags, deletedTag]
175
+ setHardDeleteTags(updatedHardDeleteTags)
176
+ }
177
+ }
178
+
179
+ const errorStateHandling = (err) => {
180
+ err.forEach(({ userMessage }) => {
181
+ const tagList = createTags.map((tags) => {
182
+ if (userMessage?.appReleaseTags?.includes(tags.tagName)) {
183
+ return {
184
+ ...tags,
185
+ duplicateTag: true,
186
+ }
187
+ }
188
+ return tags
189
+ })
190
+ setCreateTags(tagList)
191
+
192
+ const displayList = displayedTags.map((obj) => {
193
+ const matchingTag = tagList.find((tag) => tag.tagName === obj.tagName)
194
+ if (matchingTag) {
195
+ return { ...obj, duplicateTag: matchingTag.duplicateTag }
196
+ }
197
+ return obj
198
+ })
199
+
200
+ setDisplayedTags(displayList)
201
+ })
202
+ }
203
+
204
+ const handleSave = async (tagsToBeCreated: ReleaseTag[]) => {
205
+ if (tagErrorMessage) return
206
+
207
+ const payload = {
208
+ createTags: tagsToBeCreated,
209
+ softDeleteTags: softDeleteTags,
210
+ imageComment: {
211
+ id: 0,
212
+ comment: newDescription.trim(),
213
+ artifactId: 0,
214
+ },
215
+ hardDeleteTags: hardDeleteTags,
216
+ }
217
+
218
+ // set loading state true
219
+ setLoading(true)
220
+ setImageTags(payload, ciPipelineId ?? 0, artifactId)
221
+ .then((res) => {
222
+ const tags = res.result?.imageReleaseTags?.map((tag) => ({
223
+ id: tag.id,
224
+ tagName: tag.tagName,
225
+ deleted: tag.deleted,
226
+ appId: 0,
227
+ artifactId: 0,
228
+ }))
229
+ if (setAppReleaseTagNames) {
230
+ setAppReleaseTagNames(res.result?.appReleaseTags)
231
+ }
232
+ if (setTagsEditable) {
233
+ setTagsEditable(res.result?.tagsEditable)
234
+ }
235
+ setInitialTags(tags)
236
+ setInitialDescription(res.result?.imageComment?.comment)
237
+ setDisplayedTags(tags)
238
+ setNewDescription(res.result?.imageComment?.comment)
239
+ setCreateTags([])
240
+ setSoftDeleteTags([])
241
+ setHardDeleteTags([])
242
+ handleEditClick()
243
+ setShowTagsWarning(false)
244
+ setTagErrorMessage('')
245
+ if(updateCurrentAppMaterial)updateCurrentAppMaterial(artifactId,tags,res.result?.imageComment)
246
+ })
247
+ .catch((err) => {
248
+ // Fix toast message
249
+ if (err.errors?.[0]?.userMessage?.appReleaseTags?.length) {
250
+ toast.error(err.errors?.[0]?.internalMessage)
251
+ errorStateHandling(err.errors)
252
+ } else {
253
+ showError(err)
254
+ }
255
+ })
256
+ .finally(()=>{
257
+ setLoading(false)
258
+ })
259
+ }
260
+
261
+ const renderInfoCard = (): JSX.Element => {
262
+ return (
263
+ <TippyCustomized
264
+ theme={TippyTheme.white}
265
+ className="w-300 fcv-5"
266
+ placement="right"
267
+ Icon={QuestionFilled}
268
+ heading="Release tags"
269
+ showCloseButton={true}
270
+ trigger="click"
271
+ interactive={true}
272
+ additionalContent={getBuildContextAdditionalContent()}
273
+ >
274
+ <div className="flex">
275
+ <Question className="fcn-5 ml-8 cursor icon-dim-16"/>
276
+ </div>
277
+ </TippyCustomized>
278
+ )
279
+ }
280
+
281
+ const getBuildContextAdditionalContent = () => {
282
+ return (
283
+ <div className="h-250 fs-13 dc__overflow-scroll p-12">
284
+ <div>Release tags allow you to tag container images with readable and relatable tags eg. v1.0.</div>
285
+ <ul className="pl-20 mt-8">
286
+ <li>
287
+ A release tag can only be added if a workflow has CD pipelines deploying to Production
288
+ environments.
289
+ </li>
290
+ <li>Multiple tags can be added to an image.</li>
291
+ <li>Multiple images in an application cannot have the same tag.</li>
292
+ <li>
293
+ Tags cannot be deleted once saved. Although, you can soft delete a tag if an unwanted tag has
294
+ been added.
295
+ </li>
296
+ </ul>
297
+ </div>
298
+ )
299
+ }
300
+
301
+ const creatableRef = useRef(null)
302
+
303
+ if (newDescription === '' && displayedTags.length === 0 && !isEditing) {
304
+ return tagsEditable ? (
305
+ <div className="bcn-0 mt-8 add-image-button">
306
+ <AddImageButton handleEditClick={handleEditClick} />
307
+ </div>
308
+ ) : (
309
+ <div></div>
310
+ )
311
+ }
312
+
313
+ const handleKeydown = (event) => {
314
+ if (event.key === 'Enter' && event.target.value.trim()) {
315
+ handleTagCreate(event.target.value.trim())
316
+ }
317
+ }
318
+
319
+ const setInputValue = (e) => {
320
+ e.target.value && validateTag(e.target.value)
321
+ setTextInput(e.target.value)
322
+ }
323
+
324
+ const enterTagCreate = (e) => {
325
+ stopPropagation(e)
326
+ if (textInput.trim()) {
327
+ handleTagCreate(textInput.trim())
328
+ }
329
+ }
330
+
331
+ const onClickSave = () => {
332
+ let tagsToBeCreated = createTags
333
+ if (textInput.trim()) {
334
+ tagsToBeCreated = handleTagCreate(textInput)
335
+ }
336
+ handleSave(tagsToBeCreated)
337
+ }
338
+
339
+ return (
340
+ <div className="mt-8">
341
+ {isEditing && tagsEditable ? (
342
+ <div className="bcn-0 dc__border-top-n1 ">
343
+ <div className="cn-7 mt-12 flex left">
344
+ <div>Release tags (eg. v1.0)</div>
345
+ {renderInfoCard()}
346
+ </div>
347
+ <div className="mt-6 dc__position-rel-imp" data-testid="add-tag-text-area">
348
+ <input
349
+ className="form__input fs-13"
350
+ value={textInput}
351
+ onChange={setInputValue}
352
+ placeholder="Type a tag and press enter"
353
+ onKeyDown={handleKeydown}
354
+ onBlur={setInputValue}
355
+ ref={creatableRef}
356
+ />
357
+ {textInput.length > 0 && (
358
+ <div
359
+ onClick={enterTagCreate}
360
+ className="dc__position-abs bcn-0 flex cursor pt-2 pb-2 pr-4 pl-4 br-2 cn-7 dc__border dc__border-bottom-2"
361
+ style={{
362
+ top: '50%',
363
+ fontFamily: 'monospace',
364
+ right: '8px',
365
+ transform: 'translateY(-50%)',
366
+ }}
367
+ >
368
+ <Enter className="icon-dim-16 mr-4" />
369
+ Enter
370
+ </div>
371
+ )}
372
+ </div>
373
+
374
+ {tagErrorMessage && (
375
+ <div className="flex left">
376
+ <Error className="form__icon form__icon--error" />
377
+ <div className="form__error">{tagErrorMessage}</div>
378
+ </div>
379
+ )}
380
+ <div className="flex-wrap mt-8 flex left">
381
+ {displayedTags?.map((tag, index) => (
382
+ <ImageTagButton
383
+ key={tag.id}
384
+ text={tag?.tagName}
385
+ isSoftDeleted={tag?.deleted}
386
+ isEditing={isEditing}
387
+ onSoftDeleteClick={(e) => {
388
+ stopPropagation(e)
389
+ handleTagSoftDelete(index)
390
+ }}
391
+ onHardDeleteClick={(e) => {
392
+ stopPropagation(e)
393
+ handleTagHardDelete(index)
394
+ }}
395
+ tagId={tag.id}
396
+ softDeleteTags={softDeleteTags}
397
+ isSuperAdmin={isSuperAdmin}
398
+ duplicateTag={tag?.duplicateTag}
399
+ hideHardDelete={hideHardDelete}
400
+ />
401
+ ))}
402
+ </div>
403
+ {showTagsWarning && (
404
+ <div className="cn-7 mb-8 flex left">
405
+ <Info className="form__icon--info icon-dim-16 mr-2" />
406
+ Tags cannot be edited/removed later
407
+ </div>
408
+ )}
409
+ <div className="cn-7 mt-12">Comment</div>
410
+ <div
411
+ className="flex left flex-wrap dc__gap-8 w-100 mt-6 mb-12"
412
+ data-testid="add-image-comment-text-area"
413
+ >
414
+ <textarea
415
+ value={newDescription}
416
+ onChange={handleDescriptionChange}
417
+ className="flex left flex-wrap dc__gap-8 dc__description-textarea fs-13"
418
+ style={{ height: '90px !important' }}
419
+ />
420
+ </div>
421
+ {descriptionValidationMessage !== '' && (
422
+ <div className="flex left">
423
+ <Error className="form__icon form__icon--error" />
424
+ <div className="form__error">{descriptionValidationMessage}</div>
425
+ </div>
426
+ )}
427
+ <div className="w-100 flex right mt-12">
428
+ <button
429
+ className="cta flex cancel h-32 lh-32-imp"
430
+ type="button"
431
+ onClick={(e) => {
432
+ stopPropagation(e)
433
+ handleCancel()
434
+ }}
435
+ disabled={loading}
436
+ >
437
+ Cancel
438
+ </button>
439
+ <button
440
+ className="cta flex h-32 lh-32-imp ml-12"
441
+ data-testid="save-tags-button"
442
+ type="button"
443
+ onClick={(e) => {
444
+ stopPropagation(e)
445
+ onClickSave()
446
+ }}
447
+ disabled={loading}
448
+ >
449
+ {loading ? <Progressing /> : 'Save'}
450
+ </button>
451
+ </div>
452
+ </div>
453
+ ) : (
454
+ <div className="top br-4 bcn-0 image-tags-container flexbox">
455
+ <div
456
+ className="flex left image-tag-left-border w-100 mt-8 mb-8 pr-10 pl-10"
457
+ data-testid="image-tags-container-hover"
458
+ >
459
+ <div className='w-100'>
460
+ {initialDescription && <div className="mb-6 fs-13 lh-20 dc__word-break-all">{initialDescription}</div>}
461
+ <div className="flex-wrap flex left">
462
+ {initialTags?.map((tag, index) => (
463
+ <ImageTagButton
464
+ key={tag?.id}
465
+ text={tag?.tagName}
466
+ isSoftDeleted={tag?.deleted}
467
+ isEditing={isEditing}
468
+ onSoftDeleteClick={(e) => {
469
+ stopPropagation(e)
470
+ handleTagSoftDelete(index)
471
+ }}
472
+ onHardDeleteClick={(e) => {
473
+ stopPropagation(e)
474
+ handleTagHardDelete(index)
475
+ }}
476
+ tagId={tag.id}
477
+ softDeleteTags={softDeleteTags}
478
+ isSuperAdmin={isSuperAdmin}
479
+ duplicateTag={tag?.duplicateTag}
480
+ hideHardDelete={hideHardDelete}
481
+ />
482
+ ))}
483
+ </div>
484
+ </div>
485
+ </div>
486
+ <div className="mt-8 mr-10 icon-dim-16">
487
+ {tagsEditable && (
488
+ <EditIcon
489
+ className="icon-dim-16 image-tags-container-edit__icon cursor"
490
+ data-testid="edit-tags-icon"
491
+ onClick={(e) => {
492
+ stopPropagation(e)
493
+ handleEditClick()
494
+ }}
495
+ />
496
+ )}
497
+ </div>
498
+ </div>
499
+ )}
500
+ </div>
501
+ )
502
+ }
503
+
504
+ export const ImageTagButton = ({
505
+ text,
506
+ isSoftDeleted,
507
+ isEditing,
508
+ onSoftDeleteClick,
509
+ onHardDeleteClick,
510
+ tagId,
511
+ softDeleteTags,
512
+ isSuperAdmin,
513
+ duplicateTag,
514
+ hideHardDelete,
515
+ }: ImageButtonType) => {
516
+ const IconComponent = isSoftDeleted ? Redo : Minus
517
+ const isInSoftDeleteTags = isSoftDeleted && softDeleteTags.some((tag) => tag.tagName === text)
518
+ const canTagBeHardDelete = tagId === 0 || (isSuperAdmin && !hideHardDelete)
519
+
520
+ const tabColor = () => {
521
+ if (duplicateTag) {
522
+ return 'cr-5 bcr-1 er-2'
523
+ } else if (isSoftDeleted) {
524
+ return 'cy-7 bcy-1 dc__strike-through ey-2'
525
+ } else {
526
+ return 'cn-9'
527
+ }
528
+ }
529
+
530
+ return (
531
+ <div
532
+ className={`br-4 en-2 bw-1 mr-8 bcn-0 mb-4 pt-2 pr-8 pb-2 pl-8 tag-class dc__word-break-all flex ${
533
+ isEditing ? 'icon-hover' : ''
534
+ } ${tabColor()}`}
535
+ >
536
+ {duplicateTag ? (
537
+ <Warning className="icon-dim-12 mr-4" />
538
+ ) : (
539
+ <Tippy
540
+ className="default-tt"
541
+ arrow={true}
542
+ placement="top"
543
+ content={isInSoftDeleteTags ? 'Restore tag' : 'Soft delete tag'}
544
+ >
545
+ <div
546
+ className={`action-icon mr-4 lh-16 pt-3 ${
547
+ isInSoftDeleteTags || (tagId !== 0 && !isSoftDeleted) ? 'show-icon' : ''
548
+ }`}
549
+ >
550
+ <IconComponent
551
+ className={`icon-dim-12 cursor ${isSoftDeleted ? 'scn-6' : 'fcn-6'} `}
552
+ data-testid={`${text}-tag-soft-delete`}
553
+ onClick={onSoftDeleteClick}
554
+ />
555
+ </div>
556
+ </Tippy>
557
+ )}
558
+ {text}
559
+ <Tippy className="default-tt" arrow={true} placement="top" content="Remove tag">
560
+ <div className={`action-icon ml-4 lh-16 pt-3 ${canTagBeHardDelete ? 'show-icon' : ''}`}>
561
+ <Close
562
+ className="icon-dim-12 fcn-6 cursor"
563
+ data-testid={`${text}-tag-hard-delete`}
564
+ onClick={onHardDeleteClick}
565
+ />
566
+ </div>
567
+ </Tippy>
568
+ </div>
569
+ )
570
+ }
571
+
572
+ const AddImageButton = ({ handleEditClick }) => {
573
+ const handleClick = (e) => {
574
+ stopPropagation(e)
575
+ handleEditClick()
576
+ }
577
+
578
+ return (
579
+ <div className="add-tag-button flex pt-12 pr-12" data-testid="add-tags-button" onClick={handleClick}>
580
+ <div className="lh-16 flex">
581
+ <Add className="icon-dim-16 cn-6" />
582
+ <span className="cn-7">Add tags/comment</span>
583
+ </div>
584
+ </div>
585
+ )
586
+ }