@digi-frontend/dgate-api-documentation 1.1.12 → 1.3.0

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 (240) hide show
  1. package/.editorconfig +13 -0
  2. package/.prettierignore +8 -0
  3. package/.prettierrc +15 -0
  4. package/dist/_virtual/index4.js +1 -1
  5. package/dist/_virtual/index5.js +1 -1
  6. package/dist/_virtual/index6.js +1 -1
  7. package/dist/_virtual/index7.js +1 -1
  8. package/dist/node_modules/@popperjs/core/lib/createPopper.js +1 -1
  9. package/dist/node_modules/@popperjs/core/lib/createPopper.js.map +1 -1
  10. package/dist/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js +1 -1
  11. package/dist/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js.map +1 -1
  12. package/dist/node_modules/@popperjs/core/lib/enums.js +1 -1
  13. package/dist/node_modules/@popperjs/core/lib/enums.js.map +1 -1
  14. package/dist/node_modules/@popperjs/core/lib/modifiers/applyStyles.js +1 -1
  15. package/dist/node_modules/@popperjs/core/lib/modifiers/applyStyles.js.map +1 -1
  16. package/dist/node_modules/@popperjs/core/lib/modifiers/eventListeners.js +1 -1
  17. package/dist/node_modules/@popperjs/core/lib/modifiers/eventListeners.js.map +1 -1
  18. package/dist/node_modules/@popperjs/core/lib/modifiers/flip.js +1 -1
  19. package/dist/node_modules/@popperjs/core/lib/modifiers/flip.js.map +1 -1
  20. package/dist/node_modules/@popperjs/core/lib/modifiers/hide.js +1 -1
  21. package/dist/node_modules/@popperjs/core/lib/modifiers/hide.js.map +1 -1
  22. package/dist/node_modules/@popperjs/core/lib/modifiers/offset.js +1 -1
  23. package/dist/node_modules/@popperjs/core/lib/modifiers/offset.js.map +1 -1
  24. package/dist/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js +1 -1
  25. package/dist/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js.map +1 -1
  26. package/dist/node_modules/@popperjs/core/lib/utils/debounce.js +1 -1
  27. package/dist/node_modules/@popperjs/core/lib/utils/debounce.js.map +1 -1
  28. package/dist/node_modules/@popperjs/core/lib/utils/detectOverflow.js +1 -1
  29. package/dist/node_modules/@popperjs/core/lib/utils/detectOverflow.js.map +1 -1
  30. package/dist/node_modules/@popperjs/core/lib/utils/expandToHashMap.js +1 -1
  31. package/dist/node_modules/@popperjs/core/lib/utils/expandToHashMap.js.map +1 -1
  32. package/dist/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js +1 -1
  33. package/dist/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js.map +1 -1
  34. package/dist/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js +1 -1
  35. package/dist/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js.map +1 -1
  36. package/dist/node_modules/@popperjs/core/lib/utils/mergeByName.js +1 -1
  37. package/dist/node_modules/@popperjs/core/lib/utils/mergeByName.js.map +1 -1
  38. package/dist/node_modules/@popperjs/core/lib/utils/orderModifiers.js +1 -1
  39. package/dist/node_modules/@popperjs/core/lib/utils/orderModifiers.js.map +1 -1
  40. package/dist/node_modules/@popperjs/core/lib/utils/userAgent.js +1 -1
  41. package/dist/node_modules/@popperjs/core/lib/utils/userAgent.js.map +1 -1
  42. package/dist/node_modules/@tippyjs/react/dist/tippy-react.esm.js +1 -1
  43. package/dist/node_modules/@tippyjs/react/dist/tippy-react.esm.js.map +1 -1
  44. package/dist/node_modules/digitinary-ui/dist/index.js +1 -1
  45. package/dist/node_modules/digitinary-ui/dist/index.js.map +1 -1
  46. package/dist/node_modules/dom-serializer/lib/foreignNames.js +1 -1
  47. package/dist/node_modules/dom-serializer/lib/foreignNames.js.map +1 -1
  48. package/dist/node_modules/dom-serializer/lib/index.js +1 -1
  49. package/dist/node_modules/dom-serializer/lib/index.js.map +1 -1
  50. package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode.js +1 -1
  51. package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode.js.map +1 -1
  52. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-html.js +1 -1
  53. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-html.js.map +1 -1
  54. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-xml.js +1 -1
  55. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-xml.js.map +1 -1
  56. package/dist/node_modules/domhandler/lib/node.js +1 -1
  57. package/dist/node_modules/domhandler/lib/node.js.map +1 -1
  58. package/dist/node_modules/domutils/lib/feeds.js +1 -1
  59. package/dist/node_modules/domutils/lib/feeds.js.map +1 -1
  60. package/dist/node_modules/domutils/lib/helpers.js +1 -1
  61. package/dist/node_modules/domutils/lib/helpers.js.map +1 -1
  62. package/dist/node_modules/domutils/lib/legacy.js +1 -1
  63. package/dist/node_modules/domutils/lib/legacy.js.map +1 -1
  64. package/dist/node_modules/domutils/lib/querying.js +1 -1
  65. package/dist/node_modules/domutils/lib/querying.js.map +1 -1
  66. package/dist/node_modules/domutils/lib/stringify.js +1 -1
  67. package/dist/node_modules/domutils/lib/stringify.js.map +1 -1
  68. package/dist/node_modules/entities/dist/commonjs/decode.js +1 -1
  69. package/dist/node_modules/entities/dist/commonjs/decode.js.map +1 -1
  70. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-html.js +1 -1
  71. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map +1 -1
  72. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +1 -1
  73. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map +1 -1
  74. package/dist/node_modules/formik/dist/formik.esm.js +1 -1
  75. package/dist/node_modules/formik/dist/formik.esm.js.map +1 -1
  76. package/dist/node_modules/formik/node_modules/deepmerge/dist/es.js +1 -1
  77. package/dist/node_modules/formik/node_modules/deepmerge/dist/es.js.map +1 -1
  78. package/dist/node_modules/highlight.js/lib/core.js +1 -1
  79. package/dist/node_modules/highlight.js/lib/core.js.map +1 -1
  80. package/dist/node_modules/highlight.js/lib/languages/json.js +1 -1
  81. package/dist/node_modules/highlight.js/lib/languages/json.js.map +1 -1
  82. package/dist/node_modules/html-react-parser/lib/utilities.js.map +1 -1
  83. package/dist/node_modules/htmlparser2/dist/commonjs/Tokenizer.js +1 -1
  84. package/dist/node_modules/htmlparser2/dist/commonjs/Tokenizer.js.map +1 -1
  85. package/dist/node_modules/htmlparser2/dist/commonjs/index.js +1 -1
  86. package/dist/node_modules/htmlparser2/dist/commonjs/index.js.map +1 -1
  87. package/dist/node_modules/js-yaml/dist/js-yaml.mjs.js +1 -1
  88. package/dist/node_modules/js-yaml/dist/js-yaml.mjs.js.map +1 -1
  89. package/dist/node_modules/lodash-es/_baseClone.js +1 -1
  90. package/dist/node_modules/lodash-es/_baseClone.js.map +1 -1
  91. package/dist/node_modules/lodash-es/_getSymbols.js +1 -1
  92. package/dist/node_modules/lodash-es/_getSymbols.js.map +1 -1
  93. package/dist/node_modules/lodash-es/_memoizeCapped.js +1 -1
  94. package/dist/node_modules/lodash-es/_memoizeCapped.js.map +1 -1
  95. package/dist/node_modules/lodash-es/_stringToPath.js +1 -1
  96. package/dist/node_modules/lodash-es/_stringToPath.js.map +1 -1
  97. package/dist/node_modules/property-expr/index.js +1 -1
  98. package/dist/node_modules/property-expr/index.js.map +1 -1
  99. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +1 -1
  100. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -1
  101. package/dist/node_modules/react-property/lib/index.js +1 -1
  102. package/dist/node_modules/react-property/lib/index.js.map +1 -1
  103. package/dist/node_modules/react-syntax-highlighter/dist/esm/create-element.js +1 -1
  104. package/dist/node_modules/react-syntax-highlighter/dist/esm/create-element.js.map +1 -1
  105. package/dist/node_modules/react-syntax-highlighter/dist/esm/highlight.js +1 -1
  106. package/dist/node_modules/react-syntax-highlighter/dist/esm/highlight.js.map +1 -1
  107. package/dist/node_modules/react-toastify/dist/index.mjs.js +1 -1
  108. package/dist/node_modules/react-toastify/dist/index.mjs.js.map +1 -1
  109. package/dist/node_modules/style-to-js/cjs/index.js +1 -1
  110. package/dist/node_modules/style-to-js/cjs/index.js.map +1 -1
  111. package/dist/node_modules/style-to-object/cjs/index.js +1 -1
  112. package/dist/node_modules/style-to-object/cjs/index.js.map +1 -1
  113. package/dist/node_modules/tiny-case/index.js +1 -1
  114. package/dist/node_modules/tiny-case/index.js.map +1 -1
  115. package/dist/node_modules/tippy.js/dist/tippy.esm.js +1 -1
  116. package/dist/node_modules/tippy.js/dist/tippy.esm.js.map +1 -1
  117. package/dist/node_modules/toposort/index.js +1 -1
  118. package/dist/node_modules/toposort/index.js.map +1 -1
  119. package/dist/node_modules/tslib/tslib.es6.js +1 -1
  120. package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
  121. package/dist/node_modules/yup/index.esm.js +1 -1
  122. package/dist/node_modules/yup/index.esm.js.map +1 -1
  123. package/dist/src/components/InfoForm/InfoForm.js +1 -1
  124. package/dist/src/components/InfoForm/InfoForm.js.map +1 -1
  125. package/dist/src/components/JsonInput/JsonInput.js +1 -1
  126. package/dist/src/components/JsonInput/JsonInput.js.map +1 -1
  127. package/dist/src/components/LivePreview/LivePreview.js +1 -1
  128. package/dist/src/components/LivePreview/LivePreview.js.map +1 -1
  129. package/dist/src/components/MethodAccordion/MethodAccordion.js +1 -1
  130. package/dist/src/components/MethodAccordion/MethodAccordion.js.map +1 -1
  131. package/dist/src/components/SVGLoader/SVGLoader.js +1 -1
  132. package/dist/src/components/SVGLoader/SVGLoader.js.map +1 -1
  133. package/dist/src/components/Tooltip/Tooltip.js +1 -1
  134. package/dist/src/components/Tooltip/Tooltip.js.map +1 -1
  135. package/dist/src/components/table/table.js +1 -1
  136. package/dist/src/components/table/table.js.map +1 -1
  137. package/dist/src/components/table/tags-table.js +1 -1
  138. package/dist/src/components/table/tags-table.js.map +1 -1
  139. package/dist/src/constants/methods.constant.js +1 -1
  140. package/dist/src/constants/methods.constant.js.map +1 -1
  141. package/dist/src/context/SectionToggleContext.js +1 -1
  142. package/dist/src/context/SectionToggleContext.js.map +1 -1
  143. package/dist/src/helpers/docs.helper.js +1 -1
  144. package/dist/src/helpers/docs.helper.js.map +1 -1
  145. package/dist/src/helpers/layout.helper.js +1 -1
  146. package/dist/src/helpers/layout.helper.js.map +1 -1
  147. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js +1 -1
  148. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js.map +1 -1
  149. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js +1 -1
  150. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js.map +1 -1
  151. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js +1 -1
  152. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js.map +1 -1
  153. package/dist/src/layout/docsComponents/DocsContent/OverviewPage/index.js +1 -1
  154. package/dist/src/layout/docsComponents/DocsContent/OverviewPage/index.js.map +1 -1
  155. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js +1 -1
  156. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js.map +1 -1
  157. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js +1 -1
  158. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js.map +1 -1
  159. package/dist/src/layout/docsLayout.js +1 -1
  160. package/dist/src/layout/docsLayout.js.map +1 -1
  161. package/dist/src/layout/layout.js +1 -1
  162. package/dist/src/layout/layout.js.map +1 -1
  163. package/dist/src/utils/index.js +1 -1
  164. package/dist/src/utils/index.js.map +1 -1
  165. package/dist/src/validator/form.scheme.js +1 -1
  166. package/dist/src/validator/form.scheme.js.map +1 -1
  167. package/dist/styles.css +773 -773
  168. package/index.ts +2 -0
  169. package/package.json +4 -9
  170. package/rollup.config.js +37 -0
  171. package/src/assets/icons/AddRow.svg +3 -0
  172. package/src/assets/icons/ApiIcon.svg +12 -0
  173. package/src/assets/icons/ArrowBack.svg +3 -0
  174. package/src/assets/icons/BookIcon.svg +6 -0
  175. package/src/assets/icons/CheckMarkSquare.svg +5 -0
  176. package/src/assets/icons/CloseIcon.svg +4 -0
  177. package/src/assets/icons/CopySticker.svg +6 -0
  178. package/src/assets/icons/DeleteIcon.svg +3 -0
  179. package/src/assets/icons/DownArrow.svg +3 -0
  180. package/src/assets/icons/EditIcon.svg +3 -0
  181. package/src/assets/icons/FilterIcon.svg +4 -0
  182. package/src/assets/icons/Plus.svg +5 -0
  183. package/src/assets/icons/PlusSquare.svg +3 -0
  184. package/src/assets/icons/RequestOption.svg +5 -0
  185. package/src/assets/icons/UpArrow.svg +3 -0
  186. package/src/assets/icons/arrow-down.svg +3 -0
  187. package/src/assets/icons/arrow-up.svg +10 -0
  188. package/src/assets/icons/arrowDownGray.svg +3 -0
  189. package/src/assets/icons/arrowRightGray.svg +3 -0
  190. package/src/assets/icons/close-circle.svg +5 -0
  191. package/src/assets/icons/copy.svg +4 -0
  192. package/src/assets/icons/deleteOutlinedIcon.svg +8 -0
  193. package/src/assets/icons/document.svg +6 -0
  194. package/src/assets/icons/eye.svg +4 -0
  195. package/src/assets/icons/index.ts +27 -0
  196. package/src/assets/icons/infoIcon.svg +5 -0
  197. package/src/assets/icons/newCopyIcon.svg +4 -0
  198. package/src/assets/icons/searchIcon.svg +4 -0
  199. package/src/components/Chips/Chips.tsx +87 -0
  200. package/src/components/InfoForm/InfoForm.tsx +432 -0
  201. package/src/components/JsonInput/JsonInput.tsx +149 -0
  202. package/src/components/LivePreview/LivePreview.tsx +224 -0
  203. package/src/components/MethodAccordion/MethodAccordion.tsx +1070 -0
  204. package/src/components/SVGLoader/SVGLoader.tsx +96 -0
  205. package/src/components/SectionHead/SectionHead.tsx +22 -0
  206. package/src/components/SimpleLabelValue/SimpleLabelValue.tsx +31 -0
  207. package/src/components/SimpleLabelValue/index.ts +1 -0
  208. package/src/components/Tooltip/Tooltip.tsx +85 -0
  209. package/src/components/dialog/dialog.ts +61 -0
  210. package/src/components/dialog/index.tsx +88 -0
  211. package/src/components/table/table.tsx +508 -0
  212. package/src/components/table/tags-table.tsx +348 -0
  213. package/src/constants/index.ts +95 -0
  214. package/src/constants/methods.constant.ts +26 -0
  215. package/src/constants/regex.ts +7 -0
  216. package/src/context/SectionToggleContext.tsx +121 -0
  217. package/src/global.d.ts +13 -0
  218. package/src/helpers/docs.helper.ts +42 -0
  219. package/src/helpers/layout.helper.ts +290 -0
  220. package/src/helpers/methodAccordion.helper.ts +20 -0
  221. package/src/index.ts +2 -0
  222. package/src/layout/docsComponents/Codebox/Codebox.tsx +61 -0
  223. package/src/layout/docsComponents/DocsAside/DocsAside.tsx +112 -0
  224. package/src/layout/docsComponents/DocsContent/DocsContent.tsx +51 -0
  225. package/src/layout/docsComponents/DocsContent/EndpointPage/index.tsx +307 -0
  226. package/src/layout/docsComponents/DocsContent/OverviewPage/index.tsx +223 -0
  227. package/src/layout/docsComponents/DocsHeader/DocsHeader.tsx +188 -0
  228. package/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.tsx +229 -0
  229. package/src/layout/docsComponents/index.tsx +28 -0
  230. package/src/layout/docsLayout.tsx +123 -0
  231. package/src/layout/layout.module.css +65 -0
  232. package/src/layout/layout.tsx +177 -0
  233. package/src/types/docsLayout.type.ts +7 -0
  234. package/src/types/index.ts +28 -0
  235. package/src/types/layout.type.ts +32 -0
  236. package/src/types/openApi.ts +109 -0
  237. package/src/types/transformedOpenApi.ts +52 -0
  238. package/src/utils/index.ts +15 -0
  239. package/src/validator/form.scheme.ts +96 -0
  240. package/tsconfig.json +33 -0
@@ -0,0 +1,1070 @@
1
+ import { useEffect, useRef, useState } from 'react'
2
+ import { Accordion, Button, Input, SelectGroup, Switch, TextArea } from 'digitinary-ui'
3
+ import SVGLoader from '../../components/SVGLoader/SVGLoader'
4
+ import {
5
+ DeleteIcon,
6
+ DownArrowIcon,
7
+ EditIcon,
8
+ DeleteOutlinedIcon,
9
+ CloseIcon,
10
+ } from '../../assets/icons'
11
+ import PlusIcon from '../../assets/icons/Plus.svg'
12
+ import PlusSquare from '../../assets/icons/PlusSquare.svg'
13
+ import { httpStatusCodes, methodColorMapping, paramsTableHeaders } from '../../constants/index'
14
+ import Tooltip from '../../components/Tooltip/Tooltip'
15
+ import { TransformedMethod } from '../../types/layout.type'
16
+ import SimpleLabelValue from '../../components/SimpleLabelValue'
17
+ import { capitalize, handleStatusColor } from '../../helpers/methodAccordion.helper'
18
+ import ParamterTable from '../table/table'
19
+ import CommonDialog from '../../components/dialog'
20
+ import JsonInput from '../../components/JsonInput/JsonInput'
21
+ import styles from './MethodAccordion.module.scss'
22
+ import { Tags } from '@entities/openApi'
23
+ import regex from '../../constants/regex'
24
+
25
+ const httpStatusCodeOptions = httpStatusCodes.map((code) => ({
26
+ label: (
27
+ <div className={styles.statusCodeOptionContainer}>
28
+ <div
29
+ className={styles.statusCodeOptionCircle}
30
+ style={{ backgroundColor: handleStatusColor(code) }}
31
+ ></div>
32
+ <span>{code}</span>
33
+ </div>
34
+ ),
35
+ value: code,
36
+ }))
37
+
38
+ const MethodsAccordion = ({
39
+ method,
40
+ path,
41
+ setFieldValue,
42
+ readOnly,
43
+ tags,
44
+ isOpen,
45
+ setIsOpen,
46
+ errors,
47
+ }: {
48
+ method: TransformedMethod
49
+ path: string
50
+ setFieldValue?: (key: string, value: string | string[]) => void
51
+ readOnly?: boolean
52
+ tags: Tags[]
53
+ isOpen: boolean
54
+ setIsOpen: (open: boolean) => void
55
+ errors?: string
56
+ }) => {
57
+ const [isExpanded, setIsExpanded] = useState({
58
+ request: false,
59
+ response: false,
60
+ method: false,
61
+ })
62
+ const [isFormOpen, setIsFormOpen] = useState<boolean>(false)
63
+ const [isHeaderFormOpen, setIsHeaderFormOpen] = useState<boolean>(false)
64
+ const [tooltipRefs, setTooltipRefs] = useState<{ [key: number]: any }>({})
65
+ const [tableData, setTableData] = useState([])
66
+ const [tableResponseData, setTableResponseData] = useState([])
67
+ const [openDeleteDialog, setOpenDeleteDialog] = useState(false)
68
+ const [openHeaderDeleteDialog, setOpenHeaderDeleteDialog] = useState(false)
69
+ const [selectedParamIndex, setSelectedParamIndex] = useState<number | null>(null)
70
+ const [selectedHeaderIndex, setSelectedHeaderIndex] = useState<number | null>(null)
71
+ const [selectedParamName, setSelectedParamName] = useState<string | null>(null)
72
+ const [tableRecords, setTableRecords] = useState()
73
+ const [tableResponseRecords, setTableResponseRecords] = useState([])
74
+ const [selectionTags, setSelectionTags] = useState([])
75
+ const [selectedStatusCode, setSelectedStatusCode] = useState(httpStatusCodeOptions[4])
76
+ const [enumFields, setEnumFields] = useState([])
77
+ const [tooltipEnumRef, setTooltipEnumRef] = useState(null)
78
+ const [currentResponseIndex, setCurrentResponseIndex] = useState<number>(-1)
79
+ const activeAccordionRef = useRef<HTMLDivElement | null>(null)
80
+ const currentResponse =
81
+ method.responses.find((res) => Number(res.code) === selectedStatusCode.value) || '{}'
82
+ const indexRef = useRef(-1)
83
+ const onTableChange = (key, value, index) => {
84
+ const newTableData = tableData.map((item, tIndex) => {
85
+ if (tIndex === index) {
86
+ return { ...item, [key]: value }
87
+ } else {
88
+ return item
89
+ }
90
+ })
91
+
92
+ setTableData(newTableData)
93
+ }
94
+
95
+ useEffect(() => {
96
+ if (isOpen && activeAccordionRef.current) {
97
+ activeAccordionRef.current.scrollIntoView({ behavior: 'smooth', block: 'start' })
98
+ }
99
+ }, [isOpen])
100
+
101
+ const generateResponseTableData = (headersObj: any, responseIndex: number) => {
102
+ const headersByName = Object.keys(headersObj)
103
+ return headersByName.map((item, index) => {
104
+ const data = headersObj[item]
105
+ return {
106
+ id: `header_${index}`,
107
+ paramName: item,
108
+ paramType: capitalize('header'),
109
+ schemaType: `${capitalize(data?.schema?.type) || ''} ${
110
+ data?.schema?.type?.toLowerCase() == 'array' &&
111
+ data?.schema?.items &&
112
+ data?.schema?.items?.type
113
+ ? ` _ ${capitalize(data?.schema?.items?.type)}`
114
+ : ''
115
+ }`,
116
+ required: (
117
+ <>
118
+ {readOnly ? (
119
+ data.required ? (
120
+ 'True'
121
+ ) : (
122
+ 'False'
123
+ )
124
+ ) : (
125
+ <Switch
126
+ checked={data.required}
127
+ onClick={() => {
128
+ if (readOnly) {
129
+ return null
130
+ }
131
+ setFieldValue(
132
+ `responses[${responseIndex}].headers[${item}].required`,
133
+ !data.required
134
+ )
135
+ }}
136
+ />
137
+ )}
138
+ </>
139
+ ),
140
+ description: (
141
+ <div className={styles.paramDescContainer}>
142
+ <Tooltip
143
+ key={`${index}-description`}
144
+ allowHTML
145
+ disabled={method.responses[responseIndex].headers[item].description?.length <= 12}
146
+ content={
147
+ <div style={{ padding: '0.625rem' }}>
148
+ {method.responses[responseIndex].headers[item].description}
149
+ </div>
150
+ }
151
+ arrowWithBorder
152
+ placement="bottom-end"
153
+ type="function"
154
+ delay={[0, 0]}
155
+ onShow={() => tooltipRefs[index]?.hide()}
156
+ >
157
+ <p style={{ alignSelf: 'center' }}>
158
+ {method.responses[responseIndex].headers[item].description
159
+ ? method.responses[responseIndex].headers[item].description.substring(0, 12)
160
+ : readOnly && '-'}
161
+ {method.responses[responseIndex].headers[item].description &&
162
+ method.responses[responseIndex].headers[item].description.length > 12
163
+ ? '...'
164
+ : ''}
165
+ </p>
166
+ </Tooltip>
167
+ {!readOnly && (
168
+ <Tooltip
169
+ key={`${index}-add-edit-description`}
170
+ allowHTML
171
+ arrowWithBorder
172
+ placement="bottom-end"
173
+ type="function"
174
+ trigger="click"
175
+ delay={[0, 0]}
176
+ onCreate={(instance) =>
177
+ setTooltipRefs((prev) => ({
178
+ ...prev,
179
+ [index]: instance,
180
+ }))
181
+ }
182
+ content={
183
+ <div className={styles.editDescTooltipContent}>
184
+ <p className={styles.editDescTooltipContent_header}>Description</p>
185
+ <TextArea
186
+ placeholder="Describe parameter..."
187
+ value={data.description}
188
+ disabled={readOnly}
189
+ maxLength={120}
190
+ onChange={(value) => {
191
+ if (value === '' || regex.ASCII.test(value)) {
192
+ setFieldValue(
193
+ `responses[${indexRef.current}].headers[${item}].description`,
194
+ value
195
+ )
196
+ }
197
+ }}
198
+ />
199
+ {!readOnly && (
200
+ <Button
201
+ className={styles.editDescTooltipContent_btn}
202
+ variant="outlined"
203
+ size="small"
204
+ onClick={() => {
205
+ setFieldValue(
206
+ `responses[${responseIndex}].headers[${item}].description`,
207
+ data.description?.trim()
208
+ )
209
+ tooltipRefs[index]?.hide()
210
+ }}
211
+ disabled={!data.description?.trim()}
212
+ >
213
+ Apply
214
+ </Button>
215
+ )}
216
+ </div>
217
+ }
218
+ >
219
+ {readOnly ||
220
+ method.responses[responseIndex].headers[item].description?.length > 0 ? (
221
+ <Button
222
+ className={styles.editDescBtn}
223
+ variant="link"
224
+ color="action"
225
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
226
+ ></Button>
227
+ ) : (
228
+ <Button
229
+ className={styles.editDescBtn}
230
+ variant="link"
231
+ color="action"
232
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
233
+ >
234
+ {readOnly ? 'View ' : 'Add '} Description
235
+ </Button>
236
+ )}
237
+ </Tooltip>
238
+ )}
239
+
240
+ {!readOnly && <div className={styles.paramDescContainer_separator}></div>}
241
+
242
+ {!readOnly && (
243
+ <Button
244
+ className={styles.deleteParamBtn}
245
+ variant="link"
246
+ color="error"
247
+ endIcon={<SVGLoader src={DeleteIcon} width="1.125rem" height="1.125rem" />}
248
+ onClick={() => handleDeleteResponseHeader(index, item)}
249
+ ></Button>
250
+ )}
251
+ </div>
252
+ ),
253
+ enum: (
254
+ <>
255
+ {readOnly ? (
256
+ <span className="enumText">{data?.schema?.enum?.join('/\u200B')}</span>
257
+ ) : (
258
+ <div data-id="TEXT_DESCRIPTION" className="tableData">
259
+ {(() => {
260
+ const schema = method?.responses[currentResponseIndex]?.headers[item]?.schema
261
+ const schemaType = schema?.type?.toLowerCase()
262
+ const isComplex = schemaType === 'array' || schemaType === 'object'
263
+ const enumList = schema?.enum || []
264
+
265
+ if (!schema || isComplex) return '-'
266
+
267
+ return (
268
+ <Tooltip
269
+ disabled={isComplex}
270
+ arrowWithBorder
271
+ placement="bottom-end"
272
+ type="function"
273
+ trigger="click"
274
+ delay={[0, 0]}
275
+ onCreate={(instance) => setTooltipEnumRef(instance)}
276
+ content={
277
+ <div className={styles.editDescTooltipContent}>
278
+ <p className={styles.editDescTooltipContent_header}>Enum</p>
279
+
280
+ {enumList.map((enumVal, enumIndex) => (
281
+ <Input
282
+ key={enumIndex}
283
+ className="methodDescForEnum"
284
+ required
285
+ clearable={false}
286
+ placeholder="Enter Enum value..."
287
+ value={enumVal}
288
+ onChange={(value) => {
289
+ setFieldValue(
290
+ `responses[${currentResponseIndex}].headers["${item}"].schema.enum[${enumIndex}]`,
291
+ value
292
+ )
293
+ }}
294
+ />
295
+ ))}
296
+
297
+ <p
298
+ className="addEnumButton"
299
+ onClick={() => {
300
+ setFieldValue(
301
+ `responses[${currentResponseIndex}].headers["${item}"].schema.enum`,
302
+ [...enumList, '']
303
+ )
304
+ }}
305
+ >
306
+ <SVGLoader src={PlusSquare} />
307
+ Add New Enum
308
+ </p>
309
+
310
+ {!readOnly && (
311
+ <Button
312
+ className={styles.editDescTooltipContent_btn}
313
+ variant="outlined"
314
+ size="small"
315
+ type="button"
316
+ onClick={() => {
317
+ setFieldValue(
318
+ `responses[${currentResponseIndex}].headers["${item}"].schema.enum`,
319
+ [...enumList]
320
+ )
321
+ setEnumFields([])
322
+ tooltipEnumRef?.hide()
323
+ }}
324
+ disabled={enumList.length === 0 || enumList.some((val) => !val)}
325
+ >
326
+ Apply
327
+ </Button>
328
+ )}
329
+ </div>
330
+ }
331
+ >
332
+ {enumList.length > 0 ? (
333
+ <span className="enumText">{enumList.join('/\u200B')}</span>
334
+ ) : (
335
+ <Button
336
+ className={styles.editDescBtn}
337
+ id="EnumButton"
338
+ variant="link"
339
+ color="action"
340
+ endIcon={
341
+ <SVGLoader
342
+ id="enumIcon"
343
+ src={PlusIcon}
344
+ width="1.5rem"
345
+ height="1.5rem"
346
+ />
347
+ }
348
+ >
349
+ Add
350
+ </Button>
351
+ )}
352
+ </Tooltip>
353
+ )
354
+ })()}
355
+ </div>
356
+ )}
357
+ </>
358
+ ),
359
+ }
360
+ })
361
+ }
362
+
363
+ const generateTableData = (items, isForRequest?: boolean) => {
364
+ return items?.map((item, index) => {
365
+ return {
366
+ id: index,
367
+ paramName: item.name,
368
+ paramType: capitalize(item.in),
369
+ schemaType: `${capitalize(item?.schema?.type) || ''} ${
370
+ item?.schema?.type?.toLowerCase() == 'array' &&
371
+ item?.schema?.items &&
372
+ item?.schema?.items?.type
373
+ ? ` _ ${capitalize(item?.schema?.items?.type)}`
374
+ : ''
375
+ }`,
376
+ required: (
377
+ <>
378
+ {readOnly ? (
379
+ item.required ? (
380
+ 'True'
381
+ ) : (
382
+ 'False'
383
+ )
384
+ ) : (
385
+ <Switch
386
+ checked={item.required}
387
+ onClick={() => {
388
+ if (readOnly) {
389
+ return null
390
+ }
391
+ onTableChange('required', !item.required, index)
392
+ setFieldValue(`parameters[${index}][required]`, !item.required)
393
+ }}
394
+ />
395
+ )}
396
+ </>
397
+ ),
398
+ description: (
399
+ <div className={styles.paramDescContainer}>
400
+ <Tooltip
401
+ key={`${index}-description`}
402
+ allowHTML
403
+ disabled={method.parameters[index].description?.length <= 12}
404
+ content={
405
+ <div style={{ padding: '0.625rem' }}>{method.parameters[index].description}</div>
406
+ }
407
+ arrowWithBorder
408
+ placement="bottom-end"
409
+ type="function"
410
+ delay={[0, 0]}
411
+ onShow={() => tooltipRefs[index]?.hide()}
412
+ >
413
+ <p style={{ alignSelf: 'center' }}>
414
+ {method.parameters[index].description
415
+ ? method.parameters[index].description.substring(0, 12)
416
+ : readOnly && '-'}
417
+ {method.parameters[index].description &&
418
+ method.parameters[index].description.length > 12
419
+ ? '...'
420
+ : ''}
421
+ </p>
422
+ </Tooltip>
423
+ {!readOnly && (
424
+ <Tooltip
425
+ key={`${index}-add-edit-description`}
426
+ allowHTML
427
+ arrowWithBorder
428
+ placement="bottom-end"
429
+ type="function"
430
+ trigger="click"
431
+ delay={[0, 0]}
432
+ onCreate={(instance) =>
433
+ setTooltipRefs((prev) => ({
434
+ ...prev,
435
+ [index]: instance,
436
+ }))
437
+ }
438
+ content={
439
+ <div className={styles.editDescTooltipContent}>
440
+ <p className={styles.editDescTooltipContent_header}>Description</p>
441
+ <TextArea
442
+ placeholder="Describe parameter..."
443
+ value={item.description}
444
+ disabled={readOnly}
445
+ maxLength={120}
446
+ onChange={(value) => {
447
+ if (value === '' || regex.ASCII.test(value))
448
+ onTableChange('description', value, index)
449
+ }}
450
+ />
451
+ {!readOnly && (
452
+ <Button
453
+ className={styles.editDescTooltipContent_btn}
454
+ variant="outlined"
455
+ size="small"
456
+ onClick={() => {
457
+ setFieldValue(
458
+ `parameters[${index}].description`,
459
+ item.description?.trim()
460
+ )
461
+ tooltipRefs[index]?.hide()
462
+ }}
463
+ disabled={!item.description?.trim()}
464
+ >
465
+ Apply
466
+ </Button>
467
+ )}
468
+ </div>
469
+ }
470
+ >
471
+ {readOnly || method.parameters[index].description?.length > 0 ? (
472
+ <Button
473
+ className={styles.editDescBtn}
474
+ variant="link"
475
+ color="action"
476
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
477
+ ></Button>
478
+ ) : (
479
+ <Button
480
+ className={styles.editDescBtn}
481
+ variant="link"
482
+ color="action"
483
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
484
+ >
485
+ {readOnly ? 'View ' : 'Add '} Description
486
+ </Button>
487
+ )}
488
+ </Tooltip>
489
+ )}
490
+
491
+ {!readOnly && <div className={styles.paramDescContainer_separator}></div>}
492
+
493
+ {!readOnly && (
494
+ <Button
495
+ className={styles.deleteParamBtn}
496
+ variant="link"
497
+ color="error"
498
+ endIcon={<SVGLoader src={DeleteIcon} width="1.125rem" height="1.125rem" />}
499
+ onClick={() => handleDeleteClick(index, item.name)}
500
+ ></Button>
501
+ )}
502
+ </div>
503
+ ),
504
+ enum: (
505
+ <>
506
+ {readOnly ? (
507
+ <span className="enumText">{item?.schema?.enum?.join('/\u200B')}</span>
508
+ ) : (
509
+ <div data-id="TEXT_DESCRIPTION" className="tableData">
510
+ {method.parameters[index]?.schema &&
511
+ method.parameters[index]?.schema?.type?.toLowerCase() != 'array' &&
512
+ method.parameters[index]?.schema?.type?.toLowerCase() != 'object' ? (
513
+ <Tooltip
514
+ disabled={
515
+ method.parameters[index]?.schema?.type?.toLowerCase() == 'array' ||
516
+ method.parameters[index]?.schema?.type?.toLowerCase() == 'object'
517
+ }
518
+ arrowWithBorder
519
+ placement="bottom-end"
520
+ type="function"
521
+ trigger="click"
522
+ delay={[0, 0]}
523
+ onCreate={(instance) => setTooltipEnumRef(instance)}
524
+ content={
525
+ <div className={styles.editDescTooltipContent}>
526
+ <p className={styles.editDescTooltipContent_header}>Enum</p>
527
+ {!!method.parameters[index]?.schema?.enum &&
528
+ !!method.parameters[index]?.schema?.enum.length &&
529
+ method.parameters[index]?.schema?.enum?.map((item, _index) => (
530
+ <Input
531
+ key={index}
532
+ className={'methodDescForEnum'}
533
+ required
534
+ clearable={false}
535
+ placeholder="Enter Enum value..."
536
+ value={item}
537
+ onChange={(value) => {
538
+ setFieldValue(`parameters[${index}].schema.enum[${_index}]`, value)
539
+ }}
540
+ />
541
+ ))}
542
+ <p
543
+ className={'addEnumButton'}
544
+ onClick={() => {
545
+ setFieldValue(`parameters[${index}].schema.enum`, [
546
+ ...method.parameters[index]?.schema?.enum,
547
+ '',
548
+ ])
549
+ }}
550
+ >
551
+ <SVGLoader src={PlusSquare} />
552
+ Add New Enum
553
+ </p>
554
+ {!readOnly && (
555
+ <Button
556
+ className={styles.editDescTooltipContent_btn}
557
+ variant="outlined"
558
+ size="small"
559
+ type="button"
560
+ onClick={() => {
561
+ setFieldValue(`parameters[${index}].schema.enum`, [
562
+ ...method.parameters[index].schema.enum,
563
+ ])
564
+ setEnumFields([])
565
+ tooltipEnumRef?.hide()
566
+ }}
567
+ disabled={
568
+ (enumFields.length > 0 &&
569
+ enumFields?.filter((item) => !item).length) ||
570
+ (method?.parameters[index]?.schema?.enum &&
571
+ method?.parameters[index]?.schema?.enum?.length > 0 &&
572
+ method?.parameters[index]?.schema?.enum?.filter((item) => !item)
573
+ .length)
574
+ }
575
+ >
576
+ Apply
577
+ </Button>
578
+ )}
579
+ </div>
580
+ }
581
+ >
582
+ {method.parameters[index]?.schema?.enum &&
583
+ method.parameters[index]?.schema?.enum?.length > 0 ? (
584
+ <span className={'enumText'}>
585
+ {method.parameters[index]?.schema?.enum?.join('/\u200B')}
586
+ </span>
587
+ ) : (
588
+ <Button
589
+ className={styles.editDescBtn}
590
+ id="EnumButton"
591
+ variant="link"
592
+ color="action"
593
+ endIcon={
594
+ <SVGLoader id="enumIcon" src={PlusIcon} width="1.5rem" height="1.5rem" />
595
+ }
596
+ >
597
+ Add
598
+ </Button>
599
+ )}
600
+ </Tooltip>
601
+ ) : (
602
+ '-'
603
+ )}{' '}
604
+ </div>
605
+ )}
606
+ </>
607
+ ),
608
+ }
609
+ })
610
+ }
611
+
612
+ const confirmDeleteParameter = () => {
613
+ if (selectedParamIndex !== null) {
614
+ setTableData((prev) => prev.filter((_, i) => i !== selectedParamIndex))
615
+ setFieldValue(
616
+ `parameters`,
617
+ method?.parameters?.filter((_, i) => i !== selectedParamIndex)
618
+ )
619
+ }
620
+ setOpenDeleteDialog(false)
621
+ setSelectedParamIndex(null)
622
+ }
623
+
624
+ const confirmDeleteHeader = () => {
625
+ if (setSelectedHeaderIndex !== null) {
626
+ let headers = Object.fromEntries(
627
+ Object.entries(method.responses[indexRef.current].headers).filter(
628
+ ([key]) => key != selectedParamName
629
+ )
630
+ )
631
+ setFieldValue(`responses[${indexRef.current}].headers`, headers)
632
+ }
633
+ setOpenHeaderDeleteDialog(false)
634
+ setSelectedHeaderIndex(null)
635
+ }
636
+
637
+ const handleDeleteClick = (id: number, name: string) => {
638
+ setSelectedParamIndex(id)
639
+ setSelectedParamName(name)
640
+
641
+ setOpenDeleteDialog(true)
642
+ }
643
+
644
+ const handleDeleteResponseHeader = (index, name) => {
645
+ setSelectedHeaderIndex(index)
646
+ setSelectedParamName(name)
647
+
648
+ setOpenHeaderDeleteDialog(true)
649
+ }
650
+
651
+ const saveNewRow = (values) => {
652
+ setTableData([...tableData, values])
653
+ setFieldValue(`parameters`, [...method.parameters, values])
654
+ }
655
+
656
+ const saveNewResponseRow = (value) => {
657
+ setFieldValue(`responses[${indexRef.current}].headers[${value.name}]`, value)
658
+ }
659
+
660
+ useEffect(() => {
661
+ setTableRecords(generateTableData(tableData, true))
662
+ }, [tableData])
663
+
664
+ useEffect(() => {
665
+ if (method?.parameters) {
666
+ setTableData(method.parameters)
667
+ }
668
+ }, [method, path])
669
+
670
+ useEffect(() => {
671
+ if (selectedStatusCode && method.responses) {
672
+ let responseIndex = method.responses.findIndex(
673
+ (_r) => _r.code.toString() == selectedStatusCode.value.toString()
674
+ )
675
+ if (responseIndex < 0) {
676
+ const clonedResponses = structuredClone(method.responses)
677
+
678
+ clonedResponses.push({
679
+ code: selectedStatusCode.value.toString(),
680
+ content: {
681
+ contentType: 'application/json',
682
+ schema: {},
683
+ },
684
+ headers: {},
685
+ })
686
+
687
+ if (setFieldValue) {
688
+ setFieldValue('responses', clonedResponses)
689
+ responseIndex = 0
690
+ }
691
+ }
692
+ setCurrentResponseIndex(responseIndex)
693
+ indexRef.current = responseIndex
694
+ if (responseIndex >= 0) {
695
+ setTableResponseRecords(
696
+ generateResponseTableData(method.responses[responseIndex].headers, responseIndex)
697
+ )
698
+ }
699
+ }
700
+ }, [selectedStatusCode, method.responses, setFieldValue])
701
+
702
+ useEffect(() => {
703
+ if (indexRef.current && indexRef.current > -1) {
704
+ setTableResponseRecords(
705
+ generateResponseTableData(method.responses[indexRef.current].headers, indexRef.current)
706
+ )
707
+ }
708
+ }, [method.responses, indexRef.current])
709
+
710
+ useEffect(() => {
711
+ // prepare tags selection list
712
+ if (method?.tags.length || tags?.length) {
713
+ const convertedStringArray = (method?.tags || [])?.map((item) => ({
714
+ label: capitalize(item),
715
+ value: item,
716
+ }))
717
+ const mergedArray = [
718
+ ...convertedStringArray,
719
+ ...(tags || []).map((item) => ({ label: capitalize(item.name), value: item.name })),
720
+ ]
721
+
722
+ const filteredArray = mergedArray.filter(
723
+ (value, index, self) => index === self.findIndex((t) => t.value === value.value)
724
+ )
725
+
726
+ setSelectionTags(filteredArray)
727
+ }
728
+ }, [tags, method])
729
+
730
+ return (
731
+ <div ref={activeAccordionRef}>
732
+ <Accordion
733
+ expanded={isOpen}
734
+ onChange={() => setIsOpen(!isOpen)}
735
+ className={`${styles.methodAccordion} ${readOnly ? styles.readOnly : ''}`}
736
+ summary={
737
+ <div className={styles.methodSummaryContainer}>
738
+ <div className={styles.methodSummary}>
739
+ <span
740
+ style={{
741
+ backgroundColor: methodColorMapping?.[method?.type]?.color || '#3A6CD1',
742
+ }}
743
+ className={styles.methodLabel}
744
+ >
745
+ {methodColorMapping?.[method?.type]?.label || method?.type}
746
+ </span>
747
+ <span className={styles.methodPath}>{path}</span>
748
+ </div>
749
+ <div
750
+ className={`${styles.methodExpandArrowContainer} ${isOpen ? styles.expanded : ''}`}
751
+ >
752
+ <SVGLoader src={DownArrowIcon} width="2rem" height="2rem" />
753
+ </div>
754
+ </div>
755
+ }
756
+ children={
757
+ <div className={styles.methodAccordionContent}>
758
+ {!readOnly ? (
759
+ <Input
760
+ className={styles.methodDesc}
761
+ label="Endpoint Name"
762
+ required
763
+ placeholder="Endpoint name..."
764
+ value={method?.summary}
765
+ onChange={(value) => {
766
+ value = value || ''
767
+ if (value === '' || regex.ASCII.test(value)) {
768
+ setFieldValue('summary', value)
769
+ }
770
+ }}
771
+ onClear={() => {
772
+ setFieldValue('summary', '')
773
+ }}
774
+ errorMsg={errors?.summary}
775
+ />
776
+ ) : (
777
+ <SimpleLabelValue
778
+ key={'summary'}
779
+ label={'Endpoint Name: '}
780
+ value={method?.summary || '-'}
781
+ />
782
+ )}
783
+ <SelectGroup
784
+ className={styles.methodDesc}
785
+ disabled={readOnly}
786
+ placeholder="Select Tags"
787
+ label="Tags"
788
+ value={method.tags?.map((t) => ({
789
+ label: capitalize(t),
790
+ value: t,
791
+ }))}
792
+ onChange={(item) => {
793
+ setFieldValue(
794
+ 'tags',
795
+ item.map((i) => i.value)
796
+ )
797
+ }}
798
+ options={[
799
+ {
800
+ list: selectionTags,
801
+ },
802
+ ]}
803
+ isMultiple={true}
804
+ withSearch={false}
805
+ clearable={false}
806
+ />
807
+ {!readOnly ? (
808
+ <TextArea
809
+ className={styles.methodDesc}
810
+ label="Description"
811
+ placeholder="Describe the method's purpose and functionality..."
812
+ maxLength={120}
813
+ value={method?.description}
814
+ onChange={(value) => {
815
+ if (value === '' || regex.ASCII.test(value)) setFieldValue('description', value)
816
+ }}
817
+ />
818
+ ) : (
819
+ <SimpleLabelValue
820
+ key={'description'}
821
+ label={'Description: '}
822
+ value={method?.description || '-'}
823
+ className={styles.multiLineText}
824
+ />
825
+ )}
826
+ <div className={styles.paramsTable}>
827
+ <h4 className={styles.paramsTableBodyHead}>Request Details</h4>
828
+ <ParamterTable
829
+ id="paramter-request-table"
830
+ data={tableRecords}
831
+ headCells={paramsTableHeaders}
832
+ isFormOpen={isFormOpen}
833
+ setIsFormOpen={setIsFormOpen}
834
+ saveNewRow={saveNewRow}
835
+ readOnly={readOnly}
836
+ isRequest={true}
837
+ />
838
+ {method?.type !== 'get' && method?.type !== 'delete' && (
839
+ <Accordion
840
+ expanded={isExpanded.request}
841
+ onChange={() => null}
842
+ className={styles.requestAccordion}
843
+ summary={
844
+ <span className={styles.requestAccordionSummary}>
845
+ <div
846
+ className={styles.requestAccordionSummary_title}
847
+ onClick={() =>
848
+ setIsExpanded((prev) => ({
849
+ ...prev,
850
+ request: !prev.request,
851
+ }))
852
+ }
853
+ >
854
+ <SVGLoader
855
+ className={isExpanded.request ? styles.expanded : ''}
856
+ src={DownArrowIcon}
857
+ width="2rem"
858
+ height="2rem"
859
+ />
860
+ Request
861
+ {method?.type !== 'delete' && <span style={{ color: 'red' }}>*</span>}
862
+ </div>
863
+ </span>
864
+ }
865
+ children={
866
+ <JsonInput
867
+ acceptType="JSON"
868
+ withFooter={!readOnly}
869
+ className={'jsonField'}
870
+ placeholder="Enter your request body as a JSON object...."
871
+ fieldIsDisabled={readOnly}
872
+ value={method?.requestBody?.content?.schema?.properties || '{}'}
873
+ onChange={(value: string) => {
874
+ setFieldValue('requestBody.content.schema.properties', value)
875
+ }}
876
+ onValidation={() => null}
877
+ />
878
+ }
879
+ />
880
+ )}
881
+ </div>
882
+ <div className={styles.paramsTable}>
883
+ <div className={styles.responseHeader}>
884
+ <h4 className={styles.paramsTableBodyHead}>Response Details</h4>
885
+ <SelectGroup
886
+ withSearch={false}
887
+ isMultiple={false}
888
+ clearable={false}
889
+ placeholder="200"
890
+ options={[
891
+ {
892
+ list: httpStatusCodeOptions,
893
+ },
894
+ ]}
895
+ value={selectedStatusCode}
896
+ onChange={(value) => {
897
+ setSelectedStatusCode(value)
898
+ }}
899
+ />
900
+ </div>
901
+ <ParamterTable
902
+ id="paramter-response-table"
903
+ data={tableResponseRecords}
904
+ headCells={paramsTableHeaders}
905
+ isFormOpen={isHeaderFormOpen}
906
+ setIsFormOpen={setIsHeaderFormOpen}
907
+ saveNewRow={saveNewResponseRow}
908
+ readOnly={readOnly}
909
+ isRequest={false}
910
+ />
911
+ <Accordion
912
+ expanded={isExpanded.response}
913
+ onChange={() => null}
914
+ className={styles.responseAccordion}
915
+ summary={
916
+ <span className={styles.responseAccordionSummary}>
917
+ <div
918
+ className={styles.responseAccordionSummary_title}
919
+ onClick={() =>
920
+ setIsExpanded((prev) => ({
921
+ ...prev,
922
+ response: !prev.response,
923
+ }))
924
+ }
925
+ >
926
+ <SVGLoader
927
+ className={isExpanded.response ? styles.expanded : ''}
928
+ src={DownArrowIcon}
929
+ width="2rem"
930
+ height="2rem"
931
+ />
932
+ Response<span style={{ color: 'red' }}>*</span>
933
+ </div>
934
+ </span>
935
+ }
936
+ children={
937
+ <JsonInput
938
+ acceptType="JSON"
939
+ withFooter={!readOnly}
940
+ className={'jsonField'}
941
+ placeholder="Enter your response as a JSON object..."
942
+ fieldIsDisabled={readOnly}
943
+ value={currentResponse?.content?.schema?.properties || '{}'}
944
+ onChange={(value) => {
945
+ const currentResIndex = method.responses.findIndex(
946
+ (res) => res.code === currentResponse.code
947
+ )
948
+ if (currentResIndex !== -1) {
949
+ setFieldValue(
950
+ `responses[${currentResIndex}].content.schema.properties`,
951
+ value
952
+ )
953
+ } else {
954
+ const clonedResponses = structuredClone(method.responses)
955
+
956
+ clonedResponses.push({
957
+ code: selectedStatusCode.value.toString(),
958
+ content: {
959
+ contentType: 'application/json',
960
+ schema: {
961
+ type: 'object',
962
+ properties: value,
963
+ },
964
+ },
965
+ })
966
+
967
+ setFieldValue('responses', clonedResponses)
968
+ }
969
+ }}
970
+ onValidation={(valid) => null}
971
+ />
972
+ }
973
+ />
974
+ </div>
975
+ </div>
976
+ }
977
+ />
978
+ <CommonDialog
979
+ status="error"
980
+ content={
981
+ <p
982
+ style={{
983
+ textAlign: 'center',
984
+ fontWeight: 400,
985
+ fontSize: '1rem',
986
+ lineHeight: '1.4375rem',
987
+ }}
988
+ className="delete-msg-container"
989
+ >
990
+ Are you sure you want to delete
991
+ <span className="plan-name">
992
+ {' '}
993
+ Parameter <strong>{selectedParamName}</strong>
994
+ </span>
995
+ ?
996
+ </p>
997
+ }
998
+ onSubmit={{
999
+ onClick: confirmDeleteParameter,
1000
+ text: 'Delete',
1001
+ color: 'error',
1002
+ fullWidth: true,
1003
+ }}
1004
+ onCancel={{
1005
+ text: 'Cancel',
1006
+ color: 'action',
1007
+ fullWidth: true,
1008
+ variant: 'outlined',
1009
+ }}
1010
+ onClose={() => setOpenDeleteDialog(false)}
1011
+ open={openDeleteDialog}
1012
+ icon={<SVGLoader src={DeleteOutlinedIcon} width="4.0625rem" height="4.0625rem" />}
1013
+ closeIcon={
1014
+ <SVGLoader
1015
+ src={CloseIcon}
1016
+ width="1.5rem"
1017
+ height="1.5rem"
1018
+ onClick={() => setOpenDeleteDialog(false)}
1019
+ />
1020
+ }
1021
+ />
1022
+ <CommonDialog
1023
+ status="error"
1024
+ content={
1025
+ <p
1026
+ style={{
1027
+ textAlign: 'center',
1028
+ fontWeight: 400,
1029
+ fontSize: '1rem',
1030
+ lineHeight: '1.4375rem',
1031
+ }}
1032
+ className="delete-msg-container"
1033
+ >
1034
+ Are you sure you want to delete
1035
+ <span className="plan-name">
1036
+ {' '}
1037
+ Header <strong>{selectedParamName}</strong>
1038
+ </span>
1039
+ ?
1040
+ </p>
1041
+ }
1042
+ onSubmit={{
1043
+ onClick: confirmDeleteHeader,
1044
+ text: 'Delete',
1045
+ color: 'error',
1046
+ fullWidth: true,
1047
+ }}
1048
+ onCancel={{
1049
+ text: 'Cancel',
1050
+ color: 'action',
1051
+ fullWidth: true,
1052
+ variant: 'outlined',
1053
+ }}
1054
+ onClose={() => setOpenHeaderDeleteDialog(false)}
1055
+ open={openHeaderDeleteDialog}
1056
+ icon={<SVGLoader src={DeleteOutlinedIcon} width="4.0625rem" height="4.0625rem" />}
1057
+ closeIcon={
1058
+ <SVGLoader
1059
+ src={CloseIcon}
1060
+ width="1.5rem"
1061
+ height="1.5rem"
1062
+ onClick={() => setOpenDeleteDialog(false)}
1063
+ />
1064
+ }
1065
+ />
1066
+ </div>
1067
+ )
1068
+ }
1069
+
1070
+ export default MethodsAccordion