@digi-frontend/dgate-api-documentation 1.0.50 → 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 (60) hide show
  1. package/dist/_virtual/index3.js +1 -1
  2. package/dist/_virtual/index4.js +1 -1
  3. package/dist/_virtual/index5.js +1 -1
  4. package/dist/_virtual/index6.js +1 -1
  5. package/dist/node_modules/toposort/index.js +1 -1
  6. package/dist/node_modules/yup/index.esm.js +1 -1
  7. package/dist/src/components/MethodAccordion/MethodAccordion.js +1 -1
  8. package/dist/src/components/MethodAccordion/MethodAccordion.js.map +1 -1
  9. package/dist/src/helpers/docs.helper.js +1 -1
  10. package/dist/src/helpers/docs.helper.js.map +1 -1
  11. package/dist/src/helpers/layout.helper.js +1 -1
  12. package/dist/src/helpers/layout.helper.js.map +1 -1
  13. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js +1 -1
  14. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js.map +1 -1
  15. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js +1 -1
  16. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js.map +1 -1
  17. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js +1 -1
  18. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js.map +1 -1
  19. package/dist/src/layout/docsComponents/DocsContent/TagPage/index.js +1 -1
  20. package/dist/src/layout/docsComponents/DocsContent/TagPage/index.js.map +1 -1
  21. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js +1 -1
  22. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js.map +1 -1
  23. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js +1 -1
  24. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js.map +1 -1
  25. package/dist/src/layout/docsLayout.js +1 -1
  26. package/dist/src/layout/docsLayout.js.map +1 -1
  27. package/dist/src/layout/layout.js +1 -1
  28. package/dist/src/layout/layout.js.map +1 -1
  29. package/dist/src/layout/layout.module.css.js +1 -1
  30. package/dist/src/validator/form.scheme.js +1 -1
  31. package/dist/src/validator/form.scheme.js.map +1 -1
  32. package/dist/styles.css +638 -596
  33. package/dist/types/helpers/docs.helper.d.ts +2 -2
  34. package/dist/types/layout/docsComponents/DocsContent/DocsContent.d.ts +2 -1
  35. package/dist/types/layout/docsComponents/DocsContent/TagPage/index.d.ts +4 -1
  36. package/dist/types/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.d.ts +12 -6
  37. package/dist/types/layout/docsLayout.d.ts +5 -4
  38. package/dist/types/layout/layout.d.ts +1 -1
  39. package/dist/types/types/index.d.ts +27 -0
  40. package/dist/types/types/layout.type.d.ts +1 -0
  41. package/dist/types/types/openApi.d.ts +1 -0
  42. package/dist/types/validator/form.scheme.d.ts +1 -0
  43. package/package.json +1 -2
  44. package/src/components/MethodAccordion/MethodAccordion.tsx +372 -4
  45. package/src/helpers/docs.helper.ts +17 -4
  46. package/src/helpers/layout.helper.ts +19 -2
  47. package/src/layout/docsComponents/DocsAside/DocsAside.tsx +6 -7
  48. package/src/layout/docsComponents/DocsContent/DocsContent.tsx +24 -3
  49. package/src/layout/docsComponents/DocsContent/EndpointPage/index.tsx +132 -121
  50. package/src/layout/docsComponents/DocsContent/EndpointPage/style.scss +45 -0
  51. package/src/layout/docsComponents/DocsContent/TagPage/index.tsx +49 -17
  52. package/src/layout/docsComponents/DocsHeader/DocsHeader.tsx +34 -1
  53. package/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.tsx +106 -79
  54. package/src/layout/docsLayout.tsx +43 -17
  55. package/src/layout/layout.module.css +1 -1
  56. package/src/layout/layout.tsx +36 -18
  57. package/src/types/index.ts +28 -0
  58. package/src/types/layout.type.ts +1 -0
  59. package/src/types/openApi.ts +1 -0
  60. package/src/validator/form.scheme.ts +9 -1
@@ -1,3 +1,3 @@
1
- import { OpenAPIFile } from '@entities/openApi';
1
+ import { ApiSpecModel } from '@entities/index';
2
2
  import { OverviewData } from 'src/layout/docsLayout';
3
- export declare const transformOpenApiToDocs: (openApiJson: OpenAPIFile) => OverviewData;
3
+ export declare const transformOpenApiToDocs: (api: ApiSpecModel) => OverviewData;
@@ -1,6 +1,7 @@
1
1
  import './style.scss';
2
2
  import { EndpointData, OverviewData } from 'src/layout/docsLayout';
3
- declare const DocsContent: ({ data }: {
3
+ declare const DocsContent: ({ data, activeType, setActiveItemData, setActiveType, setExpandedSections, }: {
4
4
  data: OverviewData | EndpointData;
5
+ activeType: "OVERVIEW" | "ENDPOINT";
5
6
  }) => import("react/jsx-runtime").JSX.Element;
6
7
  export default DocsContent;
@@ -1,4 +1,7 @@
1
1
  import './style.scss';
2
- export declare const TagPage: ({ data }: {
2
+ export declare const TagPage: ({ data, setActiveItemData, setActiveType, setExpandedSections }: {
3
3
  data: any;
4
+ setActiveItemData: any;
5
+ setActiveType: any;
6
+ setExpandedSections: any;
4
7
  }) => import("react/jsx-runtime").JSX.Element;
@@ -1,9 +1,15 @@
1
1
  import './style.scss';
2
- declare const DocsSideMenuTree: ({ apis, setActiveItemData, isFirstApiExpanded, setIsFirstApiExpanded, setActiveType, }: {
3
- apis: any;
4
- setActiveItemData: any;
5
- isFirstApiExpanded: any;
6
- setIsFirstApiExpanded: any;
7
- setActiveType: any;
2
+ import React from 'react';
3
+ import { EndpointData, OverviewData } from 'src/layout/docsLayout';
4
+ declare const DocsSideMenuTree: ({ apis, setActiveItemData, activeItemData, activeType, expandedSections, setExpandedSections, isFirstApiExpanded, setIsFirstApiExpanded, setActiveType, }: {
5
+ apis: OverviewData[];
6
+ setActiveItemData: React.Dispatch<React.SetStateAction<OverviewData | EndpointData>>;
7
+ activeItemData: OverviewData | EndpointData;
8
+ expandedSections: Record<string, boolean>;
9
+ setExpandedSections: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;
10
+ isFirstApiExpanded: boolean;
11
+ setIsFirstApiExpanded: React.Dispatch<React.SetStateAction<boolean>>;
12
+ setActiveType: React.Dispatch<React.SetStateAction<"OVERVIEW" | "ENDPOINT">>;
13
+ activeType: "OVERVIEW" | "ENDPOINT";
8
14
  }) => import("react/jsx-runtime").JSX.Element;
9
15
  export default DocsSideMenuTree;
@@ -1,7 +1,8 @@
1
1
  import { JSX } from 'react';
2
2
  import { HTTPMethod, OpenAPIFile, Parameter, RequestBody, Responses } from '@entities/openApi';
3
+ import { ApiSpecModel } from '@entities/index';
3
4
  interface ILayoutProps {
4
- openApiJson?: OpenAPIFile[];
5
+ apis?: ApiSpecModel[];
5
6
  }
6
7
  export interface TagData {
7
8
  id: string;
@@ -22,12 +23,12 @@ export interface EndpointData extends TagData {
22
23
  version: string;
23
24
  };
24
25
  }
25
- export interface OverviewData {
26
- id: string;
26
+ export interface OverviewData extends Omit<ApiSpecModel, 'metaData'> {
27
27
  description: string;
28
28
  title: string;
29
29
  version: string;
30
30
  tags: Record<string, TagData[]>;
31
+ servers: OpenAPIFile['servers'];
31
32
  }
32
- declare const DocsLayout: ({ openApiJson }: ILayoutProps) => JSX.Element;
33
+ declare const DocsLayout: ({ apis }: ILayoutProps) => JSX.Element;
33
34
  export default DocsLayout;
@@ -6,5 +6,5 @@ interface ILayoutProps {
6
6
  setIsFormDirty?: any;
7
7
  openApiErrors?: any;
8
8
  }
9
- declare const Layout: ({ openApiJson, handleSave, setIsFormDirty, openApiErrors }: ILayoutProps) => JSX.Element;
9
+ declare const Layout: ({ openApiJson, handleSave, setIsFormDirty, openApiErrors, }: ILayoutProps) => JSX.Element;
10
10
  export default Layout;
@@ -0,0 +1,27 @@
1
+ import { OpenAPIFile } from './openApi';
2
+ export interface ApiSpecModel {
3
+ apiSpecId: string;
4
+ contextPath: string;
5
+ apiVersions: {
6
+ addVersionToContextPath: boolean;
7
+ apiSpecId: string;
8
+ name: string;
9
+ metaData: {
10
+ version: string;
11
+ };
12
+ }[];
13
+ associatedProduct: {
14
+ availableOnDevPortal: boolean;
15
+ name: string;
16
+ premium: boolean;
17
+ productId: number;
18
+ };
19
+ metaData: {
20
+ version: string;
21
+ apiVersionOf: string;
22
+ openApiJson: OpenAPIFile;
23
+ tags: string[];
24
+ createdDateTime: string;
25
+ lastUpdatedDateTime: string;
26
+ };
27
+ }
@@ -19,6 +19,7 @@ export type TransformedMethod = {
19
19
  contentType?: string;
20
20
  schema?: unknown;
21
21
  };
22
+ headers: any;
22
23
  }[];
23
24
  };
24
25
  export type TransformedPath = {
@@ -66,6 +66,7 @@ export interface RequestBody {
66
66
  export interface Responses {
67
67
  [statusCode: string]: {
68
68
  description: string;
69
+ headers?: any;
69
70
  content?: {
70
71
  [contentType: string]: {
71
72
  schema: Schema;
@@ -17,6 +17,7 @@ export declare const schemaValidation: yup.ObjectSchema<{
17
17
  type?: string;
18
18
  description?: string;
19
19
  tags?: string[];
20
+ requestBody?: {};
20
21
  }[];
21
22
  }[];
22
23
  components: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digi-frontend/dgate-api-documentation",
3
- "version": "1.0.50",
3
+ "version": "1.0.52",
4
4
  "main": "dist/src/index.js",
5
5
  "module": "dist/src/index.js",
6
6
  "types": "dist/types/index.d.ts",
@@ -29,7 +29,6 @@
29
29
  },
30
30
  "devDependencies": {
31
31
  "@rollup/plugin-commonjs": "^28.0.2",
32
- "@rollup/plugin-json": "^6.1.0",
33
32
  "@rollup/plugin-node-resolve": "^16.0.0",
34
33
  "@rollup/plugin-typescript": "^12.1.2",
35
34
  "@rollup/plugin-url": "^8.0.2",
@@ -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')
@@ -346,6 +619,19 @@ const MethodsAccordion = ({
346
619
  setSelectedParamIndex(null)
347
620
  }
348
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
+
349
635
  const handleDeleteClick = (id: number, name: string) => {
350
636
  setSelectedParamIndex(id)
351
637
  setSelectedParamName(name)
@@ -353,14 +639,25 @@ const MethodsAccordion = ({
353
639
  setOpenDeleteDialog(true)
354
640
  }
355
641
 
642
+ const handleDeleteResponseHeader = (index, name) => {
643
+ setSelectedHeaderIndex(index)
644
+ setSelectedParamName(name)
645
+
646
+ setOpenHeaderDeleteDialog(true)
647
+ }
648
+
356
649
  const saveNewRow = (values) => {
357
650
  setTableData([...tableData, values])
358
651
  setFieldValue(`parameters`, [...method.parameters, values])
359
652
  }
360
653
 
654
+ const saveNewResponseRow = (value) => {
655
+ // setTableResponseData([...tableResponseData, values])
656
+ setFieldValue(`responses[${indexRef.current}].headers[${value.name}]`, value)
657
+ }
658
+
361
659
  useEffect(() => {
362
660
  setTableRecords(generateTableData(tableData, true))
363
- setTableResponseRecords(generateTableData(tableData, false))
364
661
  }, [tableData])
365
662
 
366
663
  useEffect(() => {
@@ -369,6 +666,42 @@ const MethodsAccordion = ({
369
666
  }
370
667
  }, [method, path])
371
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
+
372
705
  useEffect(() => {
373
706
  // prepare tags selection list
374
707
  if (method?.tags.length || tags?.length) {
@@ -565,7 +898,7 @@ const MethodsAccordion = ({
565
898
  headCells={paramsTableHeaders}
566
899
  isFormOpen={isFormOpen && isFormOpen == 'Res'}
567
900
  setIsFormOpen={setIsFormOpen}
568
- saveNewRow={saveNewRow}
901
+ saveNewRow={saveNewResponseRow}
569
902
  readOnly={readOnly}
570
903
  isRequest={false}
571
904
  />
@@ -671,6 +1004,41 @@ const MethodsAccordion = ({
671
1004
  open={openDeleteDialog}
672
1005
  icon={<SVGLoader src={DeleteOutlinedIcon} width="4.0625rem" height="4.0625rem" />}
673
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
+ />
674
1042
  </div>
675
1043
  )
676
1044
  }
@@ -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
  }