@digi-frontend/dgate-api-documentation 1.0.47 → 1.0.52

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 (158) hide show
  1. package/dist/_virtual/core.js +2 -0
  2. package/dist/_virtual/core.js.map +1 -0
  3. package/dist/_virtual/core2.js +2 -0
  4. package/dist/_virtual/core2.js.map +1 -0
  5. package/dist/_virtual/format.js +2 -0
  6. package/dist/_virtual/format.js.map +1 -0
  7. package/dist/_virtual/index3.js +1 -1
  8. package/dist/_virtual/index4.js +1 -1
  9. package/dist/_virtual/index5.js +1 -1
  10. package/dist/_virtual/index6.js +1 -1
  11. package/dist/f4452c3ebcf0d5da.svg +4 -0
  12. package/dist/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +2 -0
  13. package/dist/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js.map +1 -0
  14. package/dist/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +2 -0
  15. package/dist/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js.map +1 -0
  16. package/dist/node_modules/@babel/runtime/helpers/esm/defineProperty.js +2 -0
  17. package/dist/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +1 -0
  18. package/dist/node_modules/@babel/runtime/helpers/esm/extends.js +2 -0
  19. package/dist/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -0
  20. package/dist/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +2 -0
  21. package/dist/node_modules/@babel/runtime/helpers/esm/iterableToArray.js.map +1 -0
  22. package/dist/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +2 -0
  23. package/dist/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js.map +1 -0
  24. package/dist/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +2 -0
  25. package/dist/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js.map +1 -0
  26. package/dist/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +2 -0
  27. package/dist/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -0
  28. package/dist/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +2 -0
  29. package/dist/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js.map +1 -0
  30. package/dist/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +2 -0
  31. package/dist/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +1 -0
  32. package/dist/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +2 -0
  33. package/dist/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +1 -0
  34. package/dist/node_modules/@babel/runtime/helpers/esm/typeof.js +2 -0
  35. package/dist/node_modules/@babel/runtime/helpers/esm/typeof.js.map +1 -0
  36. package/dist/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +2 -0
  37. package/dist/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js.map +1 -0
  38. package/dist/node_modules/fault/index.js +2 -0
  39. package/dist/node_modules/fault/index.js.map +1 -0
  40. package/dist/node_modules/format/format.js +2 -0
  41. package/dist/node_modules/format/format.js.map +1 -0
  42. package/dist/node_modules/highlight.js/lib/core.js +2 -0
  43. package/dist/node_modules/highlight.js/lib/core.js.map +1 -0
  44. package/dist/node_modules/lowlight/lib/core.js +2 -0
  45. package/dist/node_modules/lowlight/lib/core.js.map +1 -0
  46. package/dist/node_modules/nanoid/index.js +2 -0
  47. package/dist/node_modules/nanoid/index.js.map +1 -0
  48. package/dist/node_modules/nanoid/url-alphabet/index.js +2 -0
  49. package/dist/node_modules/nanoid/url-alphabet/index.js.map +1 -0
  50. package/dist/node_modules/react-syntax-highlighter/dist/esm/checkForListedLanguage.js +2 -0
  51. package/dist/node_modules/react-syntax-highlighter/dist/esm/checkForListedLanguage.js.map +1 -0
  52. package/dist/node_modules/react-syntax-highlighter/dist/esm/create-element.js +2 -0
  53. package/dist/node_modules/react-syntax-highlighter/dist/esm/create-element.js.map +1 -0
  54. package/dist/node_modules/react-syntax-highlighter/dist/esm/highlight.js +2 -0
  55. package/dist/node_modules/react-syntax-highlighter/dist/esm/highlight.js.map +1 -0
  56. package/dist/node_modules/react-syntax-highlighter/dist/esm/light.js +2 -0
  57. package/dist/node_modules/react-syntax-highlighter/dist/esm/light.js.map +1 -0
  58. package/dist/node_modules/react-syntax-highlighter/dist/esm/styles/hljs/stackoverflow-dark.js +2 -0
  59. package/dist/node_modules/react-syntax-highlighter/dist/esm/styles/hljs/stackoverflow-dark.js.map +1 -0
  60. package/dist/node_modules/react-syntax-highlighter/dist/esm/styles/hljs/stackoverflow-light.js +2 -0
  61. package/dist/node_modules/react-syntax-highlighter/dist/esm/styles/hljs/stackoverflow-light.js.map +1 -0
  62. package/dist/node_modules/toposort/index.js +1 -1
  63. package/dist/node_modules/yup/index.esm.js +1 -1
  64. package/dist/src/assets/icons/UpArrow.svg.js +2 -0
  65. package/dist/src/assets/icons/UpArrow.svg.js.map +1 -0
  66. package/dist/src/assets/icons/copy.svg.js +2 -0
  67. package/dist/src/assets/icons/copy.svg.js.map +1 -0
  68. package/dist/src/components/MethodAccordion/MethodAccordion.js +1 -1
  69. package/dist/src/components/MethodAccordion/MethodAccordion.js.map +1 -1
  70. package/dist/src/components/dialog/index.js +1 -1
  71. package/dist/src/components/dialog/index.js.map +1 -1
  72. package/dist/src/components/table/table.js +1 -1
  73. package/dist/src/components/table/table.js.map +1 -1
  74. package/dist/src/constants/methods.constant.js +1 -1
  75. package/dist/src/constants/methods.constant.js.map +1 -1
  76. package/dist/src/helpers/docs.helper.js +2 -0
  77. package/dist/src/helpers/docs.helper.js.map +1 -0
  78. package/dist/src/helpers/layout.helper.js +1 -1
  79. package/dist/src/helpers/layout.helper.js.map +1 -1
  80. package/dist/src/layout/docsComponents/Codebox/Codebox.js +2 -0
  81. package/dist/src/layout/docsComponents/Codebox/Codebox.js.map +1 -0
  82. package/dist/src/layout/docsComponents/Codebox/style.module.scss.js +2 -0
  83. package/dist/src/layout/docsComponents/Codebox/style.module.scss.js.map +1 -0
  84. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js +1 -1
  85. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js.map +1 -1
  86. package/dist/src/layout/docsComponents/DocsAside/style.module.scss.js +2 -0
  87. package/dist/src/layout/docsComponents/DocsAside/style.module.scss.js.map +1 -0
  88. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js +1 -1
  89. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js.map +1 -1
  90. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js +1 -1
  91. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js.map +1 -1
  92. package/dist/src/layout/docsComponents/DocsContent/TagPage/index.js +2 -0
  93. package/dist/src/layout/docsComponents/DocsContent/TagPage/index.js.map +1 -0
  94. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js +1 -1
  95. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js.map +1 -1
  96. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js +1 -1
  97. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js.map +1 -1
  98. package/dist/src/layout/docsLayout.js +1 -1
  99. package/dist/src/layout/docsLayout.js.map +1 -1
  100. package/dist/src/layout/layout.js +1 -1
  101. package/dist/src/layout/layout.js.map +1 -1
  102. package/dist/src/layout/layout.module.css.js +1 -1
  103. package/dist/src/utils/index.js +2 -0
  104. package/dist/src/utils/index.js.map +1 -0
  105. package/dist/src/validator/form.scheme.js +1 -1
  106. package/dist/src/validator/form.scheme.js.map +1 -1
  107. package/dist/styles.css +1164 -892
  108. package/dist/types/assets/icons/index.d.ts +1 -0
  109. package/dist/types/components/dialog/dialog.d.ts +1 -0
  110. package/dist/types/components/dialog/index.d.ts +1 -1
  111. package/dist/types/helpers/docs.helper.d.ts +2 -2
  112. package/dist/types/layout/docsComponents/Codebox/Codebox.d.ts +4 -0
  113. package/dist/types/layout/docsComponents/DocsAside/DocsAside.d.ts +4 -2
  114. package/dist/types/layout/docsComponents/DocsContent/DocsContent.d.ts +5 -1
  115. package/dist/types/layout/docsComponents/DocsContent/EndpointPage/index.d.ts +3 -1
  116. package/dist/types/layout/docsComponents/DocsContent/TagPage/index.d.ts +6 -1
  117. package/dist/types/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.d.ts +12 -5
  118. package/dist/types/layout/docsLayout.d.ts +5 -4
  119. package/dist/types/layout/layout.d.ts +1 -1
  120. package/dist/types/types/index.d.ts +27 -0
  121. package/dist/types/types/layout.type.d.ts +1 -0
  122. package/dist/types/types/openApi.d.ts +1 -0
  123. package/dist/types/utils/index.d.ts +1 -0
  124. package/dist/types/validator/form.scheme.d.ts +1 -0
  125. package/package.json +3 -3
  126. package/rollup.config.js +2 -0
  127. package/src/assets/icons/copy.svg +4 -0
  128. package/src/assets/icons/index.ts +1 -0
  129. package/src/components/MethodAccordion/MethodAccordion.module.scss +20 -11
  130. package/src/components/MethodAccordion/MethodAccordion.tsx +393 -17
  131. package/src/components/dialog/dialog.ts +1 -0
  132. package/src/components/dialog/index.tsx +27 -24
  133. package/src/components/table/table.tsx +5 -1
  134. package/src/constants/methods.constant.ts +1 -1
  135. package/src/helpers/docs.helper.ts +17 -4
  136. package/src/helpers/layout.helper.ts +19 -2
  137. package/src/layout/docsComponents/Codebox/Codebox.tsx +61 -0
  138. package/src/layout/docsComponents/Codebox/style.module.scss +43 -0
  139. package/src/layout/docsComponents/DocsAside/DocsAside.tsx +89 -4
  140. package/src/layout/docsComponents/DocsAside/style.module.scss +113 -0
  141. package/src/layout/docsComponents/DocsContent/DocsContent.tsx +25 -3
  142. package/src/layout/docsComponents/DocsContent/EndpointPage/index.tsx +134 -122
  143. package/src/layout/docsComponents/DocsContent/EndpointPage/style.scss +45 -0
  144. package/src/layout/docsComponents/DocsContent/TagPage/index.tsx +77 -74
  145. package/src/layout/docsComponents/DocsContent/TagPage/style.scss +42 -5
  146. package/src/layout/docsComponents/DocsHeader/DocsHeader.module.scss +78 -5
  147. package/src/layout/docsComponents/DocsHeader/DocsHeader.tsx +85 -15
  148. package/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.tsx +119 -87
  149. package/src/layout/docsComponents/index.scss +3 -1
  150. package/src/layout/docsLayout.tsx +47 -18
  151. package/src/layout/layout.module.css +8 -5
  152. package/src/layout/layout.tsx +39 -21
  153. package/src/types/index.ts +28 -0
  154. package/src/types/layout.type.ts +1 -0
  155. package/src/types/openApi.ts +1 -0
  156. package/src/utils/index.ts +7 -0
  157. package/src/validator/form.scheme.ts +9 -1
  158. package/src/layout/docsComponents/DocsAside/style.scss +0 -3
@@ -64,18 +64,22 @@ const MethodsAccordion = ({
64
64
  const [isFormOpen, setIsFormOpen] = useState<'Req' | 'Res'>(undefined)
65
65
  const [tooltipRefs, setTooltipRefs] = useState<{ [key: number]: any }>({})
66
66
  const [tableData, setTableData] = useState([])
67
+ const [tableResponseData, setTableResponseData] = useState([])
67
68
  const [openDeleteDialog, setOpenDeleteDialog] = useState(false)
69
+ const [openHeaderDeleteDialog, setOpenHeaderDeleteDialog] = useState(false)
68
70
  const [selectedParamIndex, setSelectedParamIndex] = useState<number | null>(null)
71
+ const [selectedHeaderIndex, setSelectedHeaderIndex] = useState<number | null>(null)
69
72
  const [selectedParamName, setSelectedParamName] = useState<string | null>(null)
70
73
  const [tableRecords, setTableRecords] = useState()
71
- const [tableResponseRecords, setTableResponseRecords] = useState()
74
+ const [tableResponseRecords, setTableResponseRecords] = useState([])
72
75
  const [selectionTags, setSelectionTags] = useState([])
73
76
  const [selectedStatusCode, setSelectedStatusCode] = useState(httpStatusCodeOptions[4])
74
77
  const [enumFields, setEnumFields] = useState([])
75
78
  const [tooltipEnumRef, setTooltipEnumRef] = useState(null)
79
+ const [currentResponseIndex, setCurrentResponseIndex] = useState<number>(-1)
76
80
  const currentResponse =
77
81
  method.responses.find((res) => Number(res.code) === selectedStatusCode.value) || '{}'
78
-
82
+ const indexRef = useRef(-1)
79
83
  const onTableChange = (key, value, index) => {
80
84
  const newTableData = tableData.map((item, tIndex) => {
81
85
  if (tIndex === index) {
@@ -88,6 +92,275 @@ const MethodsAccordion = ({
88
92
  setTableData(newTableData)
89
93
  }
90
94
 
95
+ const generateResponseTableData = (headersObj: any, responseIndex: number) => {
96
+ const headersByName = Object.keys(headersObj)
97
+ return headersByName.map((item, index) => {
98
+ const data = headersObj[item]
99
+ return {
100
+ id: `header_${index}`,
101
+ paramName: item,
102
+ paramType: capitalize('header'),
103
+ schemaType: capitalize(data?.schema?.type) || '',
104
+ required: (
105
+ <>
106
+ {readOnly ? (
107
+ data.required ? (
108
+ 'True'
109
+ ) : (
110
+ 'False'
111
+ )
112
+ ) : (
113
+ <Switch
114
+ checked={data.required}
115
+ onClick={() => {
116
+ if (readOnly) {
117
+ return null
118
+ }
119
+ setFieldValue(
120
+ `responses[${responseIndex}].headers[${item}].required`,
121
+ !data.required
122
+ )
123
+ }}
124
+ />
125
+ )}
126
+ </>
127
+ ),
128
+ description: (
129
+ <div className={styles.paramDescContainer}>
130
+ <Tooltip
131
+ key={`${index}-description`}
132
+ allowHTML
133
+ disabled={method.responses[responseIndex].headers[item].description?.length <= 12}
134
+ content={
135
+ <div style={{ padding: '0.625rem' }}>
136
+ {method.responses[responseIndex].headers[item].description}
137
+ </div>
138
+ }
139
+ arrowWithBorder
140
+ placement="bottom-end"
141
+ type="function"
142
+ delay={[0, 0]}
143
+ onShow={() => tooltipRefs[index]?.hide()}
144
+ >
145
+ <p style={{ alignSelf: 'center' }}>
146
+ {method.responses[responseIndex].headers[item].description
147
+ ? method.responses[responseIndex].headers[item].description.substring(0, 12)
148
+ : readOnly && '-'}
149
+ {method.responses[responseIndex].headers[item].description &&
150
+ method.responses[responseIndex].headers[item].description.length > 12
151
+ ? '...'
152
+ : ''}
153
+ </p>
154
+ </Tooltip>
155
+ {!readOnly && (
156
+ <Tooltip
157
+ key={`${index}-add-edit-description`}
158
+ allowHTML
159
+ arrowWithBorder
160
+ placement="bottom-end"
161
+ type="function"
162
+ trigger="click"
163
+ delay={[0, 0]}
164
+ onCreate={(instance) =>
165
+ setTooltipRefs((prev) => ({
166
+ ...prev,
167
+ [index]: instance,
168
+ }))
169
+ }
170
+ content={
171
+ <div className={styles.editDescTooltipContent}>
172
+ <p className={styles.editDescTooltipContent_header}>Description</p>
173
+ <TextArea
174
+ placeholder="Describe parameter..."
175
+ value={data.description}
176
+ disabled={readOnly}
177
+ maxLength={120}
178
+ onChange={(value) => {
179
+ if (value === '' || regex.ASCII.test(value)) {
180
+ // onResponseTableChange('description', value, item, indexRef.current)
181
+ setFieldValue(
182
+ `responses[${indexRef.current}].headers[${item}].description`,
183
+ value
184
+ )
185
+ }
186
+ }}
187
+ />
188
+ {!readOnly && (
189
+ <Button
190
+ className={styles.editDescTooltipContent_btn}
191
+ variant="outlined"
192
+ size="small"
193
+ onClick={() => {
194
+ setFieldValue(
195
+ `responses[${responseIndex}].headers[${item}].description`,
196
+ data.description?.trim()
197
+ )
198
+ tooltipRefs[index]?.hide()
199
+ }}
200
+ disabled={!data.description?.trim()}
201
+ >
202
+ Apply
203
+ </Button>
204
+ )}
205
+ </div>
206
+ }
207
+ >
208
+ {readOnly ||
209
+ method.responses[responseIndex].headers[item].description?.length > 0 ? (
210
+ <Button
211
+ className={styles.editDescBtn}
212
+ variant="link"
213
+ color="action"
214
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
215
+ ></Button>
216
+ ) : (
217
+ <Button
218
+ className={styles.editDescBtn}
219
+ variant="link"
220
+ color="action"
221
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
222
+ >
223
+ {readOnly ? 'View ' : 'Add '} Description
224
+ </Button>
225
+ )}
226
+ </Tooltip>
227
+ )}
228
+
229
+ {!readOnly && <div className={styles.paramDescContainer_separator}></div>}
230
+
231
+ {!readOnly && (
232
+ <Button
233
+ className={styles.deleteParamBtn}
234
+ variant="link"
235
+ color="error"
236
+ endIcon={<SVGLoader src={DeleteIcon} width="1.125rem" height="1.125rem" />}
237
+ onClick={() => handleDeleteResponseHeader(index, item)}
238
+ ></Button>
239
+ )}
240
+ </div>
241
+ ),
242
+ enum: (
243
+ <>
244
+ {readOnly ? (
245
+ <span className="enumText">{data?.schema?.enum?.join('/\u200B')}</span>
246
+ ) : (
247
+ <div data-id="TEXT_DESCRIPTION" className="tableData">
248
+ {method.responses[responseIndex]?.headers[index]?.schema &&
249
+ method.responses[responseIndex]?.headers[index]?.schema?.type?.toLowerCase() !=
250
+ 'array' &&
251
+ method.responses[responseIndex]?.headers[index]?.schema?.type?.toLowerCase() !=
252
+ 'object' ? (
253
+ <Tooltip
254
+ disabled={
255
+ method.responses[responseIndex]?.headers[
256
+ index
257
+ ]?.schema?.type?.toLowerCase() == 'array' ||
258
+ method.responses[responseIndex]?.headers[
259
+ index
260
+ ]?.schema?.type?.toLowerCase() == 'object'
261
+ }
262
+ arrowWithBorder
263
+ placement="bottom-end"
264
+ type="function"
265
+ trigger="click"
266
+ delay={[0, 0]}
267
+ onCreate={(instance) => setTooltipEnumRef(instance)}
268
+ content={
269
+ <div className={styles.editDescTooltipContent}>
270
+ <p className={styles.editDescTooltipContent_header}>Enum</p>
271
+ {!!method.responses[responseIndex]?.headers[index]?.schema?.enum &&
272
+ !!method.responses[responseIndex]?.headers[index]?.schema?.enum.length &&
273
+ method.responses[responseIndex]?.headers[index]?.schema?.enum?.map(
274
+ (item, _index) => (
275
+ <Input
276
+ key={index}
277
+ className={'methodDescForEnum'}
278
+ required
279
+ clearable={false}
280
+ placeholder="Enter Enum value..."
281
+ value={item}
282
+ onChange={(value) => {
283
+ setFieldValue(
284
+ `responses[${currentResponse}].headers[${index}].schema.enum[${_index}]`,
285
+ value.toString()
286
+ )
287
+ }}
288
+ />
289
+ )
290
+ )}
291
+ <p
292
+ className={'addEnumButton'}
293
+ onClick={() => {
294
+ setFieldValue(
295
+ `responses[${currentResponse}].headers[${index}].schema.enum`,
296
+ [...method.responses[responseIndex]?.headers[index]?.schema?.enum, '']
297
+ )
298
+ }}
299
+ >
300
+ <SVGLoader src={PlusSquare} />
301
+ Add New Enum
302
+ </p>
303
+ {!readOnly && (
304
+ <Button
305
+ className={styles.editDescTooltipContent_btn}
306
+ variant="outlined"
307
+ size="small"
308
+ type="button"
309
+ onClick={() => {
310
+ setFieldValue(
311
+ `responses[${currentResponse}].headers[${index}].schema.enum`,
312
+ [...method.parameters[index].schema.enum]
313
+ )
314
+ setEnumFields([])
315
+ tooltipEnumRef?.hide()
316
+ }}
317
+ disabled={
318
+ (enumFields.length > 0 &&
319
+ enumFields?.filter((item) => !item).length) ||
320
+ (method?.parameters[index]?.schema?.enum &&
321
+ method?.parameters[index]?.schema?.enum?.length > 0 &&
322
+ method?.parameters[index]?.schema?.enum?.filter((item) => !item)
323
+ .length)
324
+ }
325
+ >
326
+ Apply
327
+ </Button>
328
+ )}
329
+ </div>
330
+ }
331
+ >
332
+ {method.responses[responseIndex]?.headers[index]?.schema?.enum &&
333
+ method.responses[responseIndex]?.headers[index]?.schema?.enum?.length > 0 ? (
334
+ <span className={'enumText'}>
335
+ {method.responses[responseIndex]?.headers[index]?.schema?.enum?.join(
336
+ '/\u200B'
337
+ )}
338
+ </span>
339
+ ) : (
340
+ <Button
341
+ className={styles.editDescBtn}
342
+ id="EnumButton"
343
+ variant="link"
344
+ color="action"
345
+ endIcon={
346
+ <SVGLoader id="enumIcon" src={PlusIcon} width="1.5rem" height="1.5rem" />
347
+ }
348
+ >
349
+ Add
350
+ </Button>
351
+ )}
352
+ </Tooltip>
353
+ ) : (
354
+ '-'
355
+ )}{' '}
356
+ </div>
357
+ )}
358
+ </>
359
+ ),
360
+ }
361
+ })
362
+ }
363
+
91
364
  const generateTableData = (items, isForRequest?: boolean) => {
92
365
  const data = isForRequest
93
366
  ? items.filter((item) => item.in && item.in.toLowerCase() != 'header')
@@ -229,7 +502,7 @@ const MethodsAccordion = ({
229
502
  enum: (
230
503
  <>
231
504
  {readOnly ? (
232
- item?.schema?.enum?.join(' / ')
505
+ <span className="enumText">{item?.schema?.enum?.join('/\u200B')}</span>
233
506
  ) : (
234
507
  <div data-id="TEXT_DESCRIPTION" className="tableData">
235
508
  {method.parameters[index]?.schema &&
@@ -294,7 +567,8 @@ const MethodsAccordion = ({
294
567
  enumFields?.filter((item) => !item).length) ||
295
568
  (method?.parameters[index]?.schema?.enum &&
296
569
  method?.parameters[index]?.schema?.enum?.length > 0 &&
297
- method?.parameters[index]?.schema?.enum?.filter((item) => !item).length)
570
+ method?.parameters[index]?.schema?.enum?.filter((item) => !item)
571
+ .length)
298
572
  }
299
573
  >
300
574
  Apply
@@ -303,17 +577,24 @@ const MethodsAccordion = ({
303
577
  </div>
304
578
  }
305
579
  >
306
- <Button
307
- className={styles.editDescBtn}
308
- id="EnumButton"
309
- variant="link"
310
- color="action"
311
- endIcon={
312
- <SVGLoader id="enumIcon" src={PlusIcon} width="1.5rem" height="1.5rem" />
313
- }
314
- >
315
- Add
316
- </Button>
580
+ {method.parameters[index]?.schema?.enum &&
581
+ method.parameters[index]?.schema?.enum?.length > 0 ? (
582
+ <span className={'enumText'}>
583
+ {method.parameters[index]?.schema?.enum?.join('/\u200B')}
584
+ </span>
585
+ ) : (
586
+ <Button
587
+ className={styles.editDescBtn}
588
+ id="EnumButton"
589
+ variant="link"
590
+ color="action"
591
+ endIcon={
592
+ <SVGLoader id="enumIcon" src={PlusIcon} width="1.5rem" height="1.5rem" />
593
+ }
594
+ >
595
+ Add
596
+ </Button>
597
+ )}
317
598
  </Tooltip>
318
599
  ) : (
319
600
  '-'
@@ -338,6 +619,19 @@ const MethodsAccordion = ({
338
619
  setSelectedParamIndex(null)
339
620
  }
340
621
 
622
+ const confirmDeleteHeader = () => {
623
+ if (setSelectedHeaderIndex !== null) {
624
+ let headers = Object.fromEntries(
625
+ Object.entries(method.responses[indexRef.current].headers).filter(
626
+ ([key]) => key != selectedParamName
627
+ )
628
+ )
629
+ setFieldValue(`responses[${indexRef.current}].headers`, headers)
630
+ }
631
+ setOpenHeaderDeleteDialog(false)
632
+ setSelectedHeaderIndex(null)
633
+ }
634
+
341
635
  const handleDeleteClick = (id: number, name: string) => {
342
636
  setSelectedParamIndex(id)
343
637
  setSelectedParamName(name)
@@ -345,14 +639,25 @@ const MethodsAccordion = ({
345
639
  setOpenDeleteDialog(true)
346
640
  }
347
641
 
642
+ const handleDeleteResponseHeader = (index, name) => {
643
+ setSelectedHeaderIndex(index)
644
+ setSelectedParamName(name)
645
+
646
+ setOpenHeaderDeleteDialog(true)
647
+ }
648
+
348
649
  const saveNewRow = (values) => {
349
650
  setTableData([...tableData, values])
350
651
  setFieldValue(`parameters`, [...method.parameters, values])
351
652
  }
352
653
 
654
+ const saveNewResponseRow = (value) => {
655
+ // setTableResponseData([...tableResponseData, values])
656
+ setFieldValue(`responses[${indexRef.current}].headers[${value.name}]`, value)
657
+ }
658
+
353
659
  useEffect(() => {
354
660
  setTableRecords(generateTableData(tableData, true))
355
- setTableResponseRecords(generateTableData(tableData, false))
356
661
  }, [tableData])
357
662
 
358
663
  useEffect(() => {
@@ -361,6 +666,42 @@ const MethodsAccordion = ({
361
666
  }
362
667
  }, [method, path])
363
668
 
669
+ useEffect(() => {
670
+ if (selectedStatusCode && method.responses) {
671
+ let responseIndex = method.responses.findIndex(
672
+ (_r) => _r.code.toString() == selectedStatusCode.value.toString()
673
+ )
674
+ if (responseIndex < 0) {
675
+ const clonedResponses = structuredClone(method.responses)
676
+
677
+ clonedResponses.push({
678
+ code: selectedStatusCode.value.toString(),
679
+ content: {
680
+ contentType: 'application/json',
681
+ schema: {},
682
+ },
683
+ headers: {},
684
+ })
685
+
686
+ setFieldValue('responses', clonedResponses)
687
+ responseIndex = 0
688
+ }
689
+ setCurrentResponseIndex(responseIndex)
690
+ indexRef.current = responseIndex
691
+ setTableResponseRecords(
692
+ generateResponseTableData(method.responses[responseIndex].headers, responseIndex)
693
+ )
694
+ }
695
+ }, [selectedStatusCode, method.responses])
696
+
697
+ useEffect(() => {
698
+ if (indexRef.current && indexRef.current > -1) {
699
+ setTableResponseRecords(
700
+ generateResponseTableData(method.responses[indexRef.current].headers, indexRef.current)
701
+ )
702
+ }
703
+ }, [method.responses, indexRef.current])
704
+
364
705
  useEffect(() => {
365
706
  // prepare tags selection list
366
707
  if (method?.tags.length || tags?.length) {
@@ -557,7 +898,7 @@ const MethodsAccordion = ({
557
898
  headCells={paramsTableHeaders}
558
899
  isFormOpen={isFormOpen && isFormOpen == 'Res'}
559
900
  setIsFormOpen={setIsFormOpen}
560
- saveNewRow={saveNewRow}
901
+ saveNewRow={saveNewResponseRow}
561
902
  readOnly={readOnly}
562
903
  isRequest={false}
563
904
  />
@@ -663,6 +1004,41 @@ const MethodsAccordion = ({
663
1004
  open={openDeleteDialog}
664
1005
  icon={<SVGLoader src={DeleteOutlinedIcon} width="4.0625rem" height="4.0625rem" />}
665
1006
  />
1007
+ <CommonDialog
1008
+ status="error"
1009
+ content={
1010
+ <p
1011
+ style={{
1012
+ textAlign: 'center',
1013
+ fontWeight: 400,
1014
+ fontSize: '1rem',
1015
+ lineHeight: '1.4375rem',
1016
+ }}
1017
+ className="delete-msg-container"
1018
+ >
1019
+ Are you sure you want to delete
1020
+ <span className="plan-name">
1021
+ {' '}
1022
+ Header <strong>{selectedParamName}</strong>
1023
+ </span>
1024
+ ?
1025
+ </p>
1026
+ }
1027
+ onSubmit={{
1028
+ onClick: confirmDeleteHeader,
1029
+ text: 'Delete',
1030
+ color: 'error',
1031
+ fullWidth: true,
1032
+ }}
1033
+ onCancel={{
1034
+ text: 'Cancel',
1035
+ color: 'normal',
1036
+ fullWidth: true,
1037
+ }}
1038
+ onClose={() => setOpenHeaderDeleteDialog(false)}
1039
+ open={openHeaderDeleteDialog}
1040
+ icon={<SVGLoader src={DeleteOutlinedIcon} width="4.0625rem" height="4.0625rem" />}
1041
+ />
666
1042
  </div>
667
1043
  )
668
1044
  }
@@ -54,4 +54,5 @@ export interface CommonDialogProps {
54
54
  isSubmitDisabled?: boolean
55
55
  submitBtnComponent?: JSX.Element | null
56
56
  withClose?: boolean
57
+ noActions?: boolean
57
58
  }
@@ -19,6 +19,7 @@ const CommonDialog = ({
19
19
  <SVGLoader src={InfoIcon} width="4.0625rem" height="4.0625rem" />
20
20
  </>
21
21
  ),
22
+ noActions = false,
22
23
  }: CommonDialogProps) => {
23
24
  const handleClose = () => {
24
25
  onClose() // Always close the dialog first
@@ -44,30 +45,32 @@ const CommonDialog = ({
44
45
  />
45
46
 
46
47
  {content}
47
- <div
48
- className="confirmation-dialog-footer"
49
- style={{ marginBottom: onCancel || onSubmit ? '1.5rem' : '1rem' }}
50
- >
51
- {onCancel && (
52
- <Button
53
- {...onCancel}
54
- onClick={handleClose}
55
- variant={onCancel.variant || 'outlined'}
56
- color={onCancel.color || 'normal'}
57
- >
58
- {onCancel.text}
59
- </Button>
60
- )}
61
- {onSubmit && (
62
- <Button
63
- {...onSubmit}
64
- variant={onSubmit.variant || 'contained'}
65
- color={onSubmit.color || 'secondary'}
66
- >
67
- {onSubmit.text}
68
- </Button>
69
- )}
70
- </div>
48
+ {!!noActions ? null : (
49
+ <div
50
+ className="confirmation-dialog-footer"
51
+ style={{ marginBottom: onCancel || onSubmit ? '1.5rem' : '1rem' }}
52
+ >
53
+ {onCancel && (
54
+ <Button
55
+ {...onCancel}
56
+ onClick={handleClose}
57
+ variant={onCancel.variant || 'outlined'}
58
+ color={onCancel.color || 'normal'}
59
+ >
60
+ {onCancel.text}
61
+ </Button>
62
+ )}
63
+ {onSubmit && (
64
+ <Button
65
+ {...onSubmit}
66
+ variant={onSubmit.variant || 'contained'}
67
+ color={onSubmit.color || 'secondary'}
68
+ >
69
+ {onSubmit.text}
70
+ </Button>
71
+ )}
72
+ </div>
73
+ )}
71
74
  </div>
72
75
  )
73
76
 
@@ -51,7 +51,11 @@ const ParamterTable = ({
51
51
  type: yup.string().optional(),
52
52
  }),
53
53
  }),
54
- required: yup.boolean().optional(),
54
+ required: yup.boolean().when('in', {
55
+ is: 'path',
56
+ then: (schema) => schema.oneOf([true], 'Path parameters must be required.'),
57
+ otherwise: (schema) => schema.optional(),
58
+ }),
55
59
  description: yup.string().default('').trim().optional(),
56
60
  }),
57
61
  onSubmit: (values) => {
@@ -9,7 +9,7 @@ export const METHOD_OPTIONS: MethodOption[] = [
9
9
  { label: 'GET', value: 'GET', color: '#3b82f6' },
10
10
  { label: 'Delete', value: 'DELETE', color: '#ef4444' },
11
11
  { label: 'Put', value: 'PUT', color: '#f59e0b' },
12
- { label: 'PATCH', value: 'PATCH', color: '#8b5cf6' },
12
+ { label: 'PATCH', value: 'PATCH', color: '#C0F4E8' },
13
13
  { label: 'OPTIONS', value: 'OPTIONS', color: '#6b7280' },
14
14
  { label: 'HEAD', value: 'HEAD', color: '#8b5cf6' },
15
15
  { label: 'TRACE', value: 'TRACE', color: '#ec4899' },
@@ -1,12 +1,17 @@
1
+ import { ApiSpecModel } from '@entities/index'
1
2
  import { HTTPMethod, OpenAPIFile } from '@entities/openApi'
2
3
  import { nanoid } from 'nanoid'
3
4
  import { OverviewData, TagData } from 'src/layout/docsLayout'
4
5
 
5
- export const transformOpenApiToDocs = (openApiJson: OpenAPIFile): OverviewData => {
6
+ export const transformOpenApiToDocs = (api: ApiSpecModel): OverviewData => {
7
+ const parsedOpenApi: OpenAPIFile =
8
+ typeof api.metaData.openApiJson === 'string'
9
+ ? JSON.parse(api.metaData.openApiJson)
10
+ : api.metaData.openApiJson
6
11
  const groupedPathsByTags: Record<string, TagData[]> = { default: [] }
7
- const validTags = new Set(openApiJson.tags.map(({ name }) => name))
12
+ const validTags = new Set(parsedOpenApi.tags.map(({ name }) => name))
8
13
 
9
- for (const [path, methods] of Object.entries(openApiJson.paths)) {
14
+ for (const [path, methods] of Object.entries(parsedOpenApi.paths)) {
10
15
  for (const [method, methodData] of Object.entries(methods)) {
11
16
  const entry = { ...methodData, method: method as HTTPMethod, path }
12
17
  const resourceTags = methodData.tags ?? []
@@ -24,5 +29,13 @@ export const transformOpenApiToDocs = (openApiJson: OpenAPIFile): OverviewData =
24
29
  }
25
30
  }
26
31
 
27
- return { ...openApiJson.info, id: nanoid(8), tags: groupedPathsByTags }
32
+ return {
33
+ ...parsedOpenApi.info,
34
+ apiSpecId: api.apiSpecId,
35
+ contextPath: api.contextPath,
36
+ associatedProduct: api.associatedProduct,
37
+ apiVersions: api.apiVersions,
38
+ tags: groupedPathsByTags,
39
+ servers: parsedOpenApi.servers,
40
+ }
28
41
  }