@digi-frontend/dgate-api-documentation 1.0.50 → 1.0.53

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 (64) hide show
  1. package/dist/_virtual/index3.js +1 -1
  2. package/dist/_virtual/index6.js +1 -1
  3. package/dist/node_modules/yup/index.esm.js +1 -1
  4. package/dist/src/components/MethodAccordion/MethodAccordion.js +1 -1
  5. package/dist/src/components/MethodAccordion/MethodAccordion.js.map +1 -1
  6. package/dist/src/components/table/table.js +1 -1
  7. package/dist/src/components/table/table.js.map +1 -1
  8. package/dist/src/constants/index.js +1 -1
  9. package/dist/src/constants/index.js.map +1 -1
  10. package/dist/src/helpers/docs.helper.js +1 -1
  11. package/dist/src/helpers/docs.helper.js.map +1 -1
  12. package/dist/src/helpers/layout.helper.js +1 -1
  13. package/dist/src/helpers/layout.helper.js.map +1 -1
  14. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js +1 -1
  15. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js.map +1 -1
  16. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js +1 -1
  17. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js.map +1 -1
  18. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js +1 -1
  19. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js.map +1 -1
  20. package/dist/src/layout/docsComponents/DocsContent/TagPage/index.js +1 -1
  21. package/dist/src/layout/docsComponents/DocsContent/TagPage/index.js.map +1 -1
  22. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js +1 -1
  23. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js.map +1 -1
  24. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js +1 -1
  25. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js.map +1 -1
  26. package/dist/src/layout/docsLayout.js +1 -1
  27. package/dist/src/layout/docsLayout.js.map +1 -1
  28. package/dist/src/layout/layout.js +1 -1
  29. package/dist/src/layout/layout.js.map +1 -1
  30. package/dist/src/layout/layout.module.css.js +1 -1
  31. package/dist/src/validator/form.scheme.js +1 -1
  32. package/dist/src/validator/form.scheme.js.map +1 -1
  33. package/dist/styles.css +262 -214
  34. package/dist/types/helpers/docs.helper.d.ts +2 -2
  35. package/dist/types/layout/docsComponents/DocsContent/DocsContent.d.ts +2 -1
  36. package/dist/types/layout/docsComponents/DocsContent/TagPage/index.d.ts +4 -1
  37. package/dist/types/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.d.ts +12 -6
  38. package/dist/types/layout/docsLayout.d.ts +5 -4
  39. package/dist/types/layout/layout.d.ts +1 -1
  40. package/dist/types/types/index.d.ts +27 -0
  41. package/dist/types/types/layout.type.d.ts +1 -0
  42. package/dist/types/types/openApi.d.ts +1 -0
  43. package/dist/types/validator/form.scheme.d.ts +1 -0
  44. package/package.json +1 -2
  45. package/src/components/MethodAccordion/MethodAccordion.tsx +384 -9
  46. package/src/components/table/style.scss +6 -0
  47. package/src/components/table/table.tsx +33 -35
  48. package/src/constants/index.ts +1 -1
  49. package/src/helpers/docs.helper.ts +17 -4
  50. package/src/helpers/layout.helper.ts +20 -9
  51. package/src/layout/docsComponents/DocsAside/DocsAside.tsx +6 -7
  52. package/src/layout/docsComponents/DocsContent/DocsContent.tsx +24 -3
  53. package/src/layout/docsComponents/DocsContent/EndpointPage/index.tsx +132 -121
  54. package/src/layout/docsComponents/DocsContent/EndpointPage/style.scss +45 -0
  55. package/src/layout/docsComponents/DocsContent/TagPage/index.tsx +49 -17
  56. package/src/layout/docsComponents/DocsHeader/DocsHeader.tsx +34 -1
  57. package/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.tsx +106 -79
  58. package/src/layout/docsLayout.tsx +42 -17
  59. package/src/layout/layout.module.css +1 -1
  60. package/src/layout/layout.tsx +36 -18
  61. package/src/types/index.ts +28 -0
  62. package/src/types/layout.type.ts +1 -0
  63. package/src/types/openApi.ts +1 -0
  64. package/src/validator/form.scheme.ts +9 -1
@@ -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,16 +92,293 @@ 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
+ data?.schema?.type?.toLowerCase() == 'array' &&
105
+ data?.schema?.items &&
106
+ data?.schema?.items?.type
107
+ ? ` _ ${capitalize(data?.schema?.items?.type)}`
108
+ : ''
109
+ }`,
110
+ required: (
111
+ <>
112
+ {readOnly ? (
113
+ data.required ? (
114
+ 'True'
115
+ ) : (
116
+ 'False'
117
+ )
118
+ ) : (
119
+ <Switch
120
+ checked={data.required}
121
+ onClick={() => {
122
+ if (readOnly) {
123
+ return null
124
+ }
125
+ setFieldValue(
126
+ `responses[${responseIndex}].headers[${item}].required`,
127
+ !data.required
128
+ )
129
+ }}
130
+ />
131
+ )}
132
+ </>
133
+ ),
134
+ description: (
135
+ <div className={styles.paramDescContainer}>
136
+ <Tooltip
137
+ key={`${index}-description`}
138
+ allowHTML
139
+ disabled={method.responses[responseIndex].headers[item].description?.length <= 12}
140
+ content={
141
+ <div style={{ padding: '0.625rem' }}>
142
+ {method.responses[responseIndex].headers[item].description}
143
+ </div>
144
+ }
145
+ arrowWithBorder
146
+ placement="bottom-end"
147
+ type="function"
148
+ delay={[0, 0]}
149
+ onShow={() => tooltipRefs[index]?.hide()}
150
+ >
151
+ <p style={{ alignSelf: 'center' }}>
152
+ {method.responses[responseIndex].headers[item].description
153
+ ? method.responses[responseIndex].headers[item].description.substring(0, 12)
154
+ : readOnly && '-'}
155
+ {method.responses[responseIndex].headers[item].description &&
156
+ method.responses[responseIndex].headers[item].description.length > 12
157
+ ? '...'
158
+ : ''}
159
+ </p>
160
+ </Tooltip>
161
+ {!readOnly && (
162
+ <Tooltip
163
+ key={`${index}-add-edit-description`}
164
+ allowHTML
165
+ arrowWithBorder
166
+ placement="bottom-end"
167
+ type="function"
168
+ trigger="click"
169
+ delay={[0, 0]}
170
+ onCreate={(instance) =>
171
+ setTooltipRefs((prev) => ({
172
+ ...prev,
173
+ [index]: instance,
174
+ }))
175
+ }
176
+ content={
177
+ <div className={styles.editDescTooltipContent}>
178
+ <p className={styles.editDescTooltipContent_header}>Description</p>
179
+ <TextArea
180
+ placeholder="Describe parameter..."
181
+ value={data.description}
182
+ disabled={readOnly}
183
+ maxLength={120}
184
+ onChange={(value) => {
185
+ if (value === '' || regex.ASCII.test(value)) {
186
+ setFieldValue(
187
+ `responses[${indexRef.current}].headers[${item}].description`,
188
+ value
189
+ )
190
+ }
191
+ }}
192
+ />
193
+ {!readOnly && (
194
+ <Button
195
+ className={styles.editDescTooltipContent_btn}
196
+ variant="outlined"
197
+ size="small"
198
+ onClick={() => {
199
+ setFieldValue(
200
+ `responses[${responseIndex}].headers[${item}].description`,
201
+ data.description?.trim()
202
+ )
203
+ tooltipRefs[index]?.hide()
204
+ }}
205
+ disabled={!data.description?.trim()}
206
+ >
207
+ Apply
208
+ </Button>
209
+ )}
210
+ </div>
211
+ }
212
+ >
213
+ {readOnly ||
214
+ method.responses[responseIndex].headers[item].description?.length > 0 ? (
215
+ <Button
216
+ className={styles.editDescBtn}
217
+ variant="link"
218
+ color="action"
219
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
220
+ ></Button>
221
+ ) : (
222
+ <Button
223
+ className={styles.editDescBtn}
224
+ variant="link"
225
+ color="action"
226
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
227
+ >
228
+ {readOnly ? 'View ' : 'Add '} Description
229
+ </Button>
230
+ )}
231
+ </Tooltip>
232
+ )}
233
+
234
+ {!readOnly && <div className={styles.paramDescContainer_separator}></div>}
235
+
236
+ {!readOnly && (
237
+ <Button
238
+ className={styles.deleteParamBtn}
239
+ variant="link"
240
+ color="error"
241
+ endIcon={<SVGLoader src={DeleteIcon} width="1.125rem" height="1.125rem" />}
242
+ onClick={() => handleDeleteResponseHeader(index, item)}
243
+ ></Button>
244
+ )}
245
+ </div>
246
+ ),
247
+ enum: (
248
+ <>
249
+ {readOnly ? (
250
+ <span className="enumText">{data?.schema?.enum?.join('/\u200B')}</span>
251
+ ) : (
252
+ <div data-id="TEXT_DESCRIPTION" className="tableData">
253
+ {method.responses[responseIndex]?.headers[index]?.schema &&
254
+ method.responses[responseIndex]?.headers[index]?.schema?.type?.toLowerCase() !=
255
+ 'array' &&
256
+ method.responses[responseIndex]?.headers[index]?.schema?.type?.toLowerCase() !=
257
+ 'object' ? (
258
+ <Tooltip
259
+ disabled={
260
+ method.responses[responseIndex]?.headers[
261
+ index
262
+ ]?.schema?.type?.toLowerCase() == 'array' ||
263
+ method.responses[responseIndex]?.headers[
264
+ index
265
+ ]?.schema?.type?.toLowerCase() == 'object'
266
+ }
267
+ arrowWithBorder
268
+ placement="bottom-end"
269
+ type="function"
270
+ trigger="click"
271
+ delay={[0, 0]}
272
+ onCreate={(instance) => setTooltipEnumRef(instance)}
273
+ content={
274
+ <div className={styles.editDescTooltipContent}>
275
+ <p className={styles.editDescTooltipContent_header}>Enum</p>
276
+ {!!method.responses[responseIndex]?.headers[index]?.schema?.enum &&
277
+ !!method.responses[responseIndex]?.headers[index]?.schema?.enum.length &&
278
+ method.responses[responseIndex]?.headers[index]?.schema?.enum?.map(
279
+ (item, _index) => (
280
+ <Input
281
+ key={index}
282
+ className={'methodDescForEnum'}
283
+ required
284
+ clearable={false}
285
+ placeholder="Enter Enum value..."
286
+ value={item}
287
+ onChange={(value) => {
288
+ setFieldValue(
289
+ `responses[${currentResponse}].headers[${index}].schema.enum[${_index}]`,
290
+ value.toString()
291
+ )
292
+ }}
293
+ />
294
+ )
295
+ )}
296
+ <p
297
+ className={'addEnumButton'}
298
+ onClick={() => {
299
+ setFieldValue(
300
+ `responses[${currentResponse}].headers[${index}].schema.enum`,
301
+ [...method.responses[responseIndex]?.headers[index]?.schema?.enum, '']
302
+ )
303
+ }}
304
+ >
305
+ <SVGLoader src={PlusSquare} />
306
+ Add New Enum
307
+ </p>
308
+ {!readOnly && (
309
+ <Button
310
+ className={styles.editDescTooltipContent_btn}
311
+ variant="outlined"
312
+ size="small"
313
+ type="button"
314
+ onClick={() => {
315
+ setFieldValue(
316
+ `responses[${currentResponse}].headers[${index}].schema.enum`,
317
+ [...method.parameters[index].schema.enum]
318
+ )
319
+ setEnumFields([])
320
+ tooltipEnumRef?.hide()
321
+ }}
322
+ disabled={
323
+ (enumFields.length > 0 &&
324
+ enumFields?.filter((item) => !item).length) ||
325
+ (method?.parameters[index]?.schema?.enum &&
326
+ method?.parameters[index]?.schema?.enum?.length > 0 &&
327
+ method?.parameters[index]?.schema?.enum?.filter((item) => !item)
328
+ .length)
329
+ }
330
+ >
331
+ Apply
332
+ </Button>
333
+ )}
334
+ </div>
335
+ }
336
+ >
337
+ {method.responses[responseIndex]?.headers[index]?.schema?.enum &&
338
+ method.responses[responseIndex]?.headers[index]?.schema?.enum?.length > 0 ? (
339
+ <span className={'enumText'}>
340
+ {method.responses[responseIndex]?.headers[index]?.schema?.enum?.join(
341
+ '/\u200B'
342
+ )}
343
+ </span>
344
+ ) : (
345
+ <Button
346
+ className={styles.editDescBtn}
347
+ id="EnumButton"
348
+ variant="link"
349
+ color="action"
350
+ endIcon={
351
+ <SVGLoader id="enumIcon" src={PlusIcon} width="1.5rem" height="1.5rem" />
352
+ }
353
+ >
354
+ Add
355
+ </Button>
356
+ )}
357
+ </Tooltip>
358
+ ) : (
359
+ '-'
360
+ )}{' '}
361
+ </div>
362
+ )}
363
+ </>
364
+ ),
365
+ }
366
+ })
367
+ }
368
+
91
369
  const generateTableData = (items, isForRequest?: boolean) => {
92
- const data = isForRequest
93
- ? items.filter((item) => item.in && item.in.toLowerCase() != 'header')
94
- : items.filter((item) => item.in && item.in.toLowerCase() == 'header')
95
- return data.map((item, index) => {
370
+ return items?.map((item, index) => {
96
371
  return {
97
372
  id: index,
98
373
  paramName: item.name,
99
374
  paramType: capitalize(item.in),
100
- schemaType: capitalize(item.schema?.type) || '',
375
+ schemaType: `${capitalize(item?.schema?.type) || ''} ${
376
+ item?.schema?.type?.toLowerCase() == 'array' &&
377
+ item?.schema?.items &&
378
+ item?.schema?.items?.type
379
+ ? ` _ ${capitalize(item?.schema?.items?.type)}`
380
+ : ''
381
+ }`,
101
382
  required: (
102
383
  <>
103
384
  {readOnly ? (
@@ -346,6 +627,19 @@ const MethodsAccordion = ({
346
627
  setSelectedParamIndex(null)
347
628
  }
348
629
 
630
+ const confirmDeleteHeader = () => {
631
+ if (setSelectedHeaderIndex !== null) {
632
+ let headers = Object.fromEntries(
633
+ Object.entries(method.responses[indexRef.current].headers).filter(
634
+ ([key]) => key != selectedParamName
635
+ )
636
+ )
637
+ setFieldValue(`responses[${indexRef.current}].headers`, headers)
638
+ }
639
+ setOpenHeaderDeleteDialog(false)
640
+ setSelectedHeaderIndex(null)
641
+ }
642
+
349
643
  const handleDeleteClick = (id: number, name: string) => {
350
644
  setSelectedParamIndex(id)
351
645
  setSelectedParamName(name)
@@ -353,14 +647,24 @@ const MethodsAccordion = ({
353
647
  setOpenDeleteDialog(true)
354
648
  }
355
649
 
650
+ const handleDeleteResponseHeader = (index, name) => {
651
+ setSelectedHeaderIndex(index)
652
+ setSelectedParamName(name)
653
+
654
+ setOpenHeaderDeleteDialog(true)
655
+ }
656
+
356
657
  const saveNewRow = (values) => {
357
658
  setTableData([...tableData, values])
358
659
  setFieldValue(`parameters`, [...method.parameters, values])
359
660
  }
360
661
 
662
+ const saveNewResponseRow = (value) => {
663
+ setFieldValue(`responses[${indexRef.current}].headers[${value.name}]`, value)
664
+ }
665
+
361
666
  useEffect(() => {
362
667
  setTableRecords(generateTableData(tableData, true))
363
- setTableResponseRecords(generateTableData(tableData, false))
364
668
  }, [tableData])
365
669
 
366
670
  useEffect(() => {
@@ -369,6 +673,42 @@ const MethodsAccordion = ({
369
673
  }
370
674
  }, [method, path])
371
675
 
676
+ useEffect(() => {
677
+ if (selectedStatusCode && method.responses) {
678
+ let responseIndex = method.responses.findIndex(
679
+ (_r) => _r.code.toString() == selectedStatusCode.value.toString()
680
+ )
681
+ if (responseIndex < 0) {
682
+ const clonedResponses = structuredClone(method.responses)
683
+
684
+ clonedResponses.push({
685
+ code: selectedStatusCode.value.toString(),
686
+ content: {
687
+ contentType: 'application/json',
688
+ schema: {},
689
+ },
690
+ headers: {},
691
+ })
692
+
693
+ setFieldValue('responses', clonedResponses)
694
+ responseIndex = 0
695
+ }
696
+ setCurrentResponseIndex(responseIndex)
697
+ indexRef.current = responseIndex
698
+ setTableResponseRecords(
699
+ generateResponseTableData(method.responses[responseIndex].headers, responseIndex)
700
+ )
701
+ }
702
+ }, [selectedStatusCode, method.responses])
703
+
704
+ useEffect(() => {
705
+ if (indexRef.current && indexRef.current > -1) {
706
+ setTableResponseRecords(
707
+ generateResponseTableData(method.responses[indexRef.current].headers, indexRef.current)
708
+ )
709
+ }
710
+ }, [method.responses, indexRef.current])
711
+
372
712
  useEffect(() => {
373
713
  // prepare tags selection list
374
714
  if (method?.tags.length || tags?.length) {
@@ -565,7 +905,7 @@ const MethodsAccordion = ({
565
905
  headCells={paramsTableHeaders}
566
906
  isFormOpen={isFormOpen && isFormOpen == 'Res'}
567
907
  setIsFormOpen={setIsFormOpen}
568
- saveNewRow={saveNewRow}
908
+ saveNewRow={saveNewResponseRow}
569
909
  readOnly={readOnly}
570
910
  isRequest={false}
571
911
  />
@@ -671,6 +1011,41 @@ const MethodsAccordion = ({
671
1011
  open={openDeleteDialog}
672
1012
  icon={<SVGLoader src={DeleteOutlinedIcon} width="4.0625rem" height="4.0625rem" />}
673
1013
  />
1014
+ <CommonDialog
1015
+ status="error"
1016
+ content={
1017
+ <p
1018
+ style={{
1019
+ textAlign: 'center',
1020
+ fontWeight: 400,
1021
+ fontSize: '1rem',
1022
+ lineHeight: '1.4375rem',
1023
+ }}
1024
+ className="delete-msg-container"
1025
+ >
1026
+ Are you sure you want to delete
1027
+ <span className="plan-name">
1028
+ {' '}
1029
+ Header <strong>{selectedParamName}</strong>
1030
+ </span>
1031
+ ?
1032
+ </p>
1033
+ }
1034
+ onSubmit={{
1035
+ onClick: confirmDeleteHeader,
1036
+ text: 'Delete',
1037
+ color: 'error',
1038
+ fullWidth: true,
1039
+ }}
1040
+ onCancel={{
1041
+ text: 'Cancel',
1042
+ color: 'normal',
1043
+ fullWidth: true,
1044
+ }}
1045
+ onClose={() => setOpenHeaderDeleteDialog(false)}
1046
+ open={openHeaderDeleteDialog}
1047
+ icon={<SVGLoader src={DeleteOutlinedIcon} width="4.0625rem" height="4.0625rem" />}
1048
+ />
674
1049
  </div>
675
1050
  )
676
1051
  }
@@ -15,6 +15,12 @@ div.endBtnIcon {
15
15
  width: 16.875rem !important;
16
16
  }
17
17
 
18
+ .select-inputs {
19
+ display: flex;
20
+ flex-direction: row;
21
+ gap: .625rem;
22
+ }
23
+
18
24
  .addEnumButton {
19
25
  color: #4d75d8 !important;
20
26
  display: flex;
@@ -186,7 +186,10 @@ const ParamterTable = ({
186
186
  </td>
187
187
 
188
188
  <td key={'parameter schema type'}>
189
- <div data-id="TEXT_DESCRIPTION" className="tableData">
189
+ <div
190
+ data-id="TEXT_DESCRIPTION"
191
+ className="tableData select-inputs"
192
+ >
190
193
  <SelectGroupV2
191
194
  disabled={readOnly}
192
195
  clearable={false}
@@ -211,41 +214,36 @@ const ParamterTable = ({
211
214
  isMultiple={false}
212
215
  withSearch={false}
213
216
  />{' '}
214
- </div>
215
- </td>
216
-
217
- <td key={'parameter array schema type'}>
218
- <div data-id="TEXT_DESCRIPTION" className="tableData">
219
- {values.schema && values.schema?.type?.toLowerCase() == 'array' ? (
220
- <SelectGroupV2
221
- disabled={readOnly}
222
- clearable={false}
223
- value={{
224
- label: capitalize(values?.schema?.items?.type),
225
- value: values.schema?.items?.type,
226
- }}
227
- errorMsg={!!errors?.schema?.items?.type && errors?.schema?.items?.type}
228
- onChange={(item) =>
229
- setFieldValue('schema.items.type', item?.value?.toLowerCase())
230
- } // Updates state on selection
231
- options={[
232
- {
233
- list: [
234
- { label: 'String', value: 'string' },
235
- { label: 'Integer', value: 'integer' },
236
- { label: 'Boolean', value: 'boolean' },
237
- { label: 'Object', value: 'object' },
238
- { label: 'Array', value: 'array' },
239
- { label: 'Number', value: 'number' },
240
- ],
241
- },
242
- ]}
243
- isMultiple={false}
244
- withSearch={false}
245
- />
217
+ {!!values?.schema?.type && values?.schema?.type.toLowerCase() === 'array' ? (
218
+ <SelectGroupV2
219
+ disabled={readOnly}
220
+ clearable={false}
221
+ value={{
222
+ label: capitalize(values?.schema?.items?.type),
223
+ value: values.schema?.items?.type,
224
+ }}
225
+ errorMsg={!!errors?.schema?.items?.type && errors?.schema?.items?.type}
226
+ onChange={(item) =>
227
+ setFieldValue('schema.items.type', item?.value?.toLowerCase())
228
+ } // Updates state on selection
229
+ options={[
230
+ {
231
+ list: [
232
+ { label: 'String', value: 'string' },
233
+ { label: 'Integer', value: 'integer' },
234
+ { label: 'Boolean', value: 'boolean' },
235
+ { label: 'Object', value: 'object' },
236
+ { label: 'Array', value: 'array' },
237
+ { label: 'Number', value: 'number' },
238
+ ],
239
+ },
240
+ ]}
241
+ isMultiple={false}
242
+ withSearch={false}
243
+ />
246
244
  ) : (
247
- '-'
248
- )}{' '}
245
+ ''
246
+ )}
249
247
  </div>
250
248
  </td>
251
249
 
@@ -70,7 +70,7 @@ export const paramsTableHeaders = [
70
70
  },
71
71
  { id: 'paramType', label: 'In', sortable: false, classes: 'requiredParam' },
72
72
  { id: 'schemaType', label: 'Schema-Type', sortable: false, classes: 'requiredParam' },
73
- { id: 'arraySchemaType', label: 'Array Schema Type', sortable: false },
73
+ // { id: 'arraySchemaType', label: 'Array Schema Type', sortable: false },
74
74
  { id: 'enum', label: 'Enum', sortable: false },
75
75
  { id: 'required', label: 'Required', sortable: false, classes: 'requiredParam' },
76
76
  { id: 'description', label: 'Description', sortable: false },
@@ -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
  }
@@ -61,8 +61,10 @@ export const transformPathsToArray = (paths: OpenAPIFile['paths']): TransformedP
61
61
  summary: methodProps.summary || '',
62
62
  responses: Object.entries(methodProps.responses).map(([code, codeProps]) => {
63
63
  const contentType = Object.keys(codeProps.content || {})[0]
64
+ const headers = !codeProps?.headers ? {} : codeProps.headers
64
65
  return {
65
66
  code,
67
+ headers,
66
68
  content: {
67
69
  contentType,
68
70
  schema: {
@@ -78,6 +80,8 @@ export const transformPathsToArray = (paths: OpenAPIFile['paths']): TransformedP
78
80
  obj.parameters = []
79
81
  }
80
82
 
83
+ // load response headers parameters
84
+
81
85
  if (method.toLowerCase() != 'get') {
82
86
  const contentType = Object.keys(methodProps?.requestBody?.content || {})[0]
83
87
  const reqSchema = methodProps?.requestBody?.content?.schema
@@ -103,7 +107,6 @@ export const transformPathsToArray = (paths: OpenAPIFile['paths']): TransformedP
103
107
 
104
108
  obj['requestBody'] = requestBodyData
105
109
  }
106
-
107
110
  return obj
108
111
  }),
109
112
  }))
@@ -112,14 +115,11 @@ export const transformPathsToArray = (paths: OpenAPIFile['paths']): TransformedP
112
115
  }
113
116
 
114
117
  const validateBodyForResponse = (content, method) => {
118
+ if (!(content?.schema as any) || !(content?.schema as any)?.properties) {
119
+ return {}
120
+ }
115
121
  let _content = JSON.parse((content?.schema as any)?.properties as string)
116
- // if (method == 'get') {
117
- // if (!_content?.body) {
118
- // _content = {
119
- // body: _content,
120
- // }
121
- // }
122
- // }
122
+
123
123
  return _content
124
124
  }
125
125
 
@@ -132,7 +132,17 @@ export const transformPathsArrayToOrigin = (paths: TransformedPathsArray): OpenA
132
132
  ...rest,
133
133
  tags,
134
134
  summary,
135
- responses: responses.reduce((respAcc, { code, content }) => {
135
+ responses: responses.reduce((respAcc, { code, content, headers }) => {
136
+ const formattedHeaders: Record<string, any> = {}
137
+ if (headers) {
138
+ for (const [key, value] of Object.entries(headers)) {
139
+ formattedHeaders[key] = {
140
+ description: value.description || '',
141
+ required: value.required || false,
142
+ schema: value.schema || {},
143
+ }
144
+ }
145
+ }
136
146
  respAcc[code] = {
137
147
  description: 'Success', // Assuming this is static from the original data
138
148
  content: content.contentType
@@ -145,6 +155,7 @@ export const transformPathsArrayToOrigin = (paths: TransformedPathsArray): OpenA
145
155
  },
146
156
  }
147
157
  : {},
158
+ headers: formattedHeaders,
148
159
  }
149
160
  return respAcc
150
161
  }, {} as Record<string, any>),