@digi-frontend/dgate-api-documentation 1.0.84 → 1.0.85
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.
- package/dist/_virtual/index5.js +1 -1
- package/dist/_virtual/index6.js +1 -1
- package/dist/_virtual/index7.js +1 -1
- package/dist/node_modules/toposort/index.js +1 -1
- package/dist/node_modules/yup/index.esm.js +1 -1
- package/dist/src/components/MethodAccordion/MethodAccordion.js +1 -1
- package/dist/src/components/MethodAccordion/MethodAccordion.js.map +1 -1
- package/dist/src/components/table/table.js +1 -1
- package/dist/src/components/table/table.js.map +1 -1
- package/dist/src/helpers/layout.helper.js +1 -1
- package/dist/src/helpers/layout.helper.js.map +1 -1
- package/dist/src/layout/layout.js +1 -1
- package/dist/src/layout/layout.js.map +1 -1
- package/dist/styles.css +125 -119
- package/dist/types/helpers/layout.helper.d.ts +1 -1
- package/package.json +1 -1
- package/src/components/MethodAccordion/MethodAccordion.tsx +8 -1
- package/src/components/table/table.tsx +2 -2
- package/src/helpers/layout.helper.ts +71 -9
- package/src/layout/docsComponents/DocsHeader/DocsHeader.module.scss +13 -1
- package/src/layout/layout.tsx +1 -5
- package/variables.txt +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.helper.js","sources":["../../../src/helpers/layout.helper.ts"],"sourcesContent":["import { TransformedPathsArray } from '@entities/layout.type'\nimport { OpenAPIFile, SecurityScheme } from '@entities/openApi'\nimport { TransformedOpenApi } from '@entities/transformedOpenApi'\n\nexport const transformOpenApiObject = (openApiJson: OpenAPIFile): TransformedOpenApi => {\n if (openApiJson.components && openApiJson.components.securitySchemes) {\n const authKey = Object.keys(openApiJson.components.securitySchemes)?.at(0)\n if (authKey) {\n openApiJson.components.securitySchemes[authKey].type = openApiJson?.components\n ?.securitySchemes?.[authKey]?.type as SecurityScheme['type']\n }\n } else {\n openApiJson.components = {\n securitySchemes: {\n Public: {\n type: 'http',\n scheme: 'public',\n },\n },\n }\n }\n\n if (!openApiJson.tags) {\n openApiJson.tags = []\n }\n\n return {\n ...openApiJson,\n paths: transformPathsToArray(openApiJson.paths),\n } as TransformedOpenApi\n}\n\nexport const transformOpenApiObjectToOrigin = (values: TransformedOpenApi): OpenAPIFile => {\n const object = {\n ...values,\n paths: transformPathsArrayToOrigin(values.paths),\n }\n if (object.components && object.components.securitySchemes) {\n const authKey = Object.keys(object.components.securitySchemes)?.at(0)\n if (authKey) {\n if (object.components.securitySchemes[authKey].type.toLowerCase() == 'APIKEY'.toLowerCase()) {\n object.components.securitySchemes[authKey].in = object.components.securitySchemes[authKey]\n .in as SecurityScheme['in']\n }\n object.components.securitySchemes[authKey].type = object?.components?.securitySchemes?.[\n authKey\n ]?.type as SecurityScheme['type']\n }\n }\n return object\n}\n\nexport const transformPathsToArray = (paths: OpenAPIFile['paths']): TransformedPathsArray | any => {\n const transformedPaths = Object.entries(paths).map(([path, methods]) => ({\n path,\n methods: Object.entries(methods).map(([method, methodProps]) => {\n const obj: any = {\n ...methodProps,\n type: method,\n tags: methodProps.tags || [],\n summary: methodProps.summary || '',\n responses: Object.entries(methodProps.responses).map(([code, codeProps]) => {\n const contentType = Object.keys(codeProps.content || {})[0]\n const headers = !codeProps?.headers ? {} : codeProps.headers\n return {\n code,\n headers,\n content: {\n contentType,\n schema: {\n ...codeProps.content?.[contentType]?.schema,\n properties: JSON.stringify(codeProps.content?.[contentType]?.schema?.properties),\n },\n },\n }\n }),\n }\n // Add parameters if it does not exist in the original JSON\n if (!methodProps?.parameters) {\n obj.parameters = []\n }\n\n // load response headers parameters\n\n if (method.toLowerCase() != 'get') {\n const contentType = Object.keys(methodProps?.requestBody?.content || {})[0]\n const reqSchema = methodProps?.requestBody?.content?.schema\n const requestBodyData = methodProps?.requestBody?.content?.schema?.properties\n ? {\n content: {\n contentType,\n schema: {\n ...reqSchema,\n properties: reqSchema?.properties ? JSON.stringify(reqSchema?.properties) : '{}',\n },\n },\n }\n : {\n content: {\n contentType: 'application/json',\n schema: {\n properties: '{}',\n type: 'object',\n },\n },\n }\n\n obj['requestBody'] = requestBodyData\n }\n return obj\n }),\n }))\n\n return transformedPaths\n}\n\nconst validateBodyForResponse = (content, method) => {\n if (!(content?.schema as any) || !(content?.schema as any)?.properties) {\n return {}\n }\n let _content = JSON.parse((content?.schema as any)?.properties as string)\n\n return _content\n}\n\nexport const transformPathsArrayToOrigin = (paths: TransformedPathsArray): OpenAPIFile['paths'] => {\n return paths.reduce((acc, { path, methods }) => {\n acc[path] = methods.reduce(\n (methodAcc, { type, tags, responses, summary, requestBody, ...rest }) => {\n // Initialize the method object\n methodAcc[type] = {\n ...rest,\n tags,\n summary,\n responses: responses.reduce((respAcc, { code, content, headers }) => {\n const formattedHeaders: Record<string, any> = {}\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n formattedHeaders[key] = {\n description: value.description || '',\n required: value.required || false,\n schema: value.schema || {},\n }\n }\n }\n respAcc[code] = {\n description: 'Success', // Assuming this is static from the original data\n content: content.contentType\n ? {\n [content.contentType]: {\n schema: {\n ...(content.schema as object),\n properties: validateBodyForResponse(content, type),\n },\n },\n }\n : {},\n headers: formattedHeaders,\n }\n return respAcc\n }, {} as Record<string, any>),\n }\n\n const parsedRequestBodyProps =\n type !== 'get' ? JSON.parse(requestBody.content.schema.properties) : {}\n // Add requestBody for non-GET methods\n if (type !== 'get') {\n methodAcc[type].requestBody = {\n content: {\n [requestBody.content.contentType]: {\n schema: {\n ...requestBody.content.schema,\n properties: parsedRequestBodyProps,\n },\n },\n },\n }\n }\n\n return methodAcc\n },\n {} as Record<string, any>\n )\n\n return acc\n }, {} as OpenAPIFile['paths'])\n}\n"],"names":["transformOpenApiObject","openApiJson","components","securitySchemes","authKey","_a","Object","keys","at","type","_d","_c","_b","Public","scheme","tags","assign","paths","transformPathsToArray","transformOpenApiObjectToOrigin","values","object","transformPathsArrayToOrigin","toLowerCase","in","entries","map","path","methods","method","methodProps","obj","summary","responses","code","codeProps","contentType","content","headers","schema","properties","JSON","stringify","_e","parameters","requestBody","reqSchema","requestBodyData","validateBodyForResponse","parse","reduce","acc","methodAcc","rest","__rest","respAcc","formattedHeaders","key","value","description","required","parsedRequestBodyProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layout.helper.js","sources":["../../../src/helpers/layout.helper.ts"],"sourcesContent":["import { TransformedPathsArray } from '@entities/layout.type'\nimport { OpenAPIFile, SecurityScheme } from '@entities/openApi'\nimport { TransformedOpenApi } from '@entities/transformedOpenApi'\n\nconst resolveRef = (ref: string, openApiJson: OpenAPIFile): Object => {\n const parts = ref.replace(/^#\\//, '').split('/')\n return parts.reduce((obj, key) => obj?.[key], openApiJson)\n}\n\nexport const transformOpenApiObject = (openApiJson: OpenAPIFile): TransformedOpenApi => {\n if (openApiJson.components && openApiJson.components.securitySchemes) {\n const authKey = Object.keys(openApiJson.components.securitySchemes)?.at(0)\n if (authKey) {\n openApiJson.components.securitySchemes[authKey].type = openApiJson?.components\n ?.securitySchemes?.[authKey]?.type as SecurityScheme['type']\n }\n } else {\n openApiJson.components = {\n securitySchemes: {\n Public: {\n type: 'http',\n scheme: 'public',\n },\n },\n ...(openApiJson.components || {}),\n }\n }\n\n if (!openApiJson.tags) {\n openApiJson.tags = []\n }\n\n return {\n ...openApiJson,\n paths: transformPathsToArray(openApiJson),\n } as TransformedOpenApi\n}\n\nexport const transformOpenApiObjectToOrigin = (values: TransformedOpenApi): OpenAPIFile => {\n const object = {\n ...values,\n paths: transformPathsArrayToOrigin(values.paths),\n }\n if (object.components && object.components.securitySchemes) {\n const authKey = Object.keys(object.components.securitySchemes)?.at(0)\n if (authKey) {\n if (object.components.securitySchemes[authKey].type.toLowerCase() == 'APIKEY'.toLowerCase()) {\n object.components.securitySchemes[authKey].in = object.components.securitySchemes[authKey]\n .in as SecurityScheme['in']\n }\n object.components.securitySchemes[authKey].type = object?.components?.securitySchemes?.[\n authKey\n ]?.type as SecurityScheme['type']\n }\n }\n return object\n}\n\nexport const transformPathsToArray = (openApiJson: OpenAPIFile): TransformedPathsArray | any => {\n const paths: OpenAPIFile['paths'] = openApiJson.paths\n const transformedPaths = Object.entries(paths).map(([path, methods]) => ({\n path,\n methods: Object.entries(methods).map(([method, methodProps]) => {\n const obj: any = {\n ...methodProps,\n type: method,\n tags: methodProps.tags || [],\n summary: methodProps.summary || '',\n responses: Object.entries(methodProps.responses).map(([code, codeProps]) => {\n const contentType = Object.keys(codeProps.content || {})[0]\n let headers = codeProps?.headers ?? {}\n\n // ? Fix headers with items property\n Object.keys(headers).map((header: string) => {\n let headerObj = headers[header]\n if (\n headerObj?.schema &&\n headerObj?.schema?.type &&\n headerObj?.schema?.type != 'array'\n ) {\n delete headers[header]?.schema?.items\n }\n })\n\n let schema = codeProps.content?.[contentType]?.schema\n if (schema?.$ref) {\n schema = resolveRef(schema?.$ref, openApiJson)\n } else if (schema?.type == 'array' && schema?.items?.$ref) {\n const resolvedItemSchema = resolveRef(schema.items.$ref, openApiJson)\n schema = {\n ...schema,\n items: resolvedItemSchema,\n }\n }\n\n return {\n code,\n headers,\n content: {\n contentType,\n schema: {\n ...schema,\n properties: JSON.stringify(schema?.properties || schema?.items?.properties),\n },\n },\n }\n }),\n }\n\n if (!obj.responses.find((item) => item.code == '200')) {\n obj.responses.push({\n code: '200',\n content: {\n contentType: 'application/json',\n schema: {},\n },\n headers: {},\n })\n }\n // Add parameters if it does not exist in the original JSON\n if (!methodProps?.parameters) {\n obj.parameters = []\n }\n\n // load response headers parameters\n\n if (method.toLowerCase() != 'get') {\n const contentType = Object.keys(methodProps?.requestBody?.content || {})[0]\n let reqSchema = methodProps?.requestBody?.content?.[contentType]?.schema\n\n if (reqSchema?.$ref) {\n reqSchema = resolveRef(reqSchema.$ref, openApiJson)\n } else if (reqSchema?.type === 'array' && reqSchema.items?.$ref) {\n reqSchema = {\n ...reqSchema,\n items: resolveRef(reqSchema.items.$ref, openApiJson),\n }\n }\n\n const requestBodyData = reqSchema\n ? {\n content: {\n contentType,\n schema: {\n ...reqSchema,\n properties: JSON.stringify(reqSchema?.properties || reqSchema?.items?.properties),\n },\n },\n }\n : {\n content: {\n contentType: 'application/json',\n schema: {\n properties: '{}',\n type: 'object',\n },\n },\n }\n\n obj['requestBody'] = requestBodyData\n }\n return obj\n }),\n }))\n\n return transformedPaths\n}\n\nconst validateBodyForResponse = (content, method) => {\n if (!(content?.schema as any) || !(content?.schema as any)?.properties) {\n return {}\n }\n let _content = JSON.parse((content?.schema as any)?.properties as string)\n\n return _content\n}\n\nexport const transformPathsArrayToOrigin = (paths: TransformedPathsArray): OpenAPIFile['paths'] => {\n return paths.reduce((acc, { path, methods }) => {\n acc[path] = methods.reduce(\n (methodAcc, { type, tags, responses, summary, requestBody, ...rest }) => {\n // Initialize the method object\n // ? Validate (rest) [parameters]\n let copiedRest = structuredClone(rest || {})\n if (copiedRest && copiedRest.parameters) {\n copiedRest.parameters.map((param) => {\n if (param && param?.schema?.items && param?.schema?.items?.type == 'array') {\n param.schema.items.items = {}\n }\n return param\n })\n }\n methodAcc[type] = {\n ...copiedRest,\n tags,\n summary,\n responses: responses.reduce((respAcc, { code, content, headers }) => {\n const formattedHeaders: Record<string, any> = {}\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n formattedHeaders[key] = {\n description: value.description || '',\n required: value.required || false,\n schema: value.schema || {},\n }\n }\n }\n respAcc[code] = {\n description: 'Success', // Assuming this is static from the original data\n content: content.contentType\n ? {\n [content.contentType]: {\n schema: {\n ...(content.schema as object),\n properties: validateBodyForResponse(content, type),\n },\n },\n }\n : {},\n headers: formattedHeaders,\n }\n return respAcc\n }, {} as Record<string, any>),\n }\n\n const parsedRequestBodyProps =\n type !== 'get' ? JSON.parse(requestBody.content.schema.properties) : {}\n // Add requestBody for non-GET methods\n if (type !== 'get') {\n methodAcc[type].requestBody = {\n content: {\n [requestBody.content.contentType]: {\n schema: {\n ...requestBody.content.schema,\n properties: parsedRequestBodyProps,\n },\n },\n },\n }\n }\n\n return methodAcc\n },\n {} as Record<string, any>\n )\n\n return acc\n }, {} as OpenAPIFile['paths'])\n}\n"],"names":["resolveRef","ref","openApiJson","replace","split","reduce","obj","key","transformOpenApiObject","components","securitySchemes","authKey","_a","Object","keys","at","type","_d","_c","_b","assign","Public","scheme","tags","paths","transformPathsToArray","transformOpenApiObjectToOrigin","values","object","transformPathsArrayToOrigin","toLowerCase","in","entries","map","path","methods","method","methodProps","summary","responses","code","codeProps","contentType","content","headers","header","headerObj","schema","items","$ref","resolvedItemSchema","properties","JSON","stringify","_e","find","item","push","parameters","requestBody","reqSchema","requestBodyData","_f","validateBodyForResponse","parse","acc","methodAcc","rest","__rest","copiedRest","structuredClone","param","respAcc","formattedHeaders","value","description","required","parsedRequestBodyProps"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"../../_virtual/jsx-runtime.js";import{useState as t,useEffect as o}from"react";import{d as i}from"../../_virtual/index.js";import r from"../components/MethodAccordion/MethodAccordion.js";import s from"./layout.module.css.js";import n from"../components/InfoForm/InfoForm.js";import a from"../components/SectionHead/SectionHead.js";import{transformOpenApiObject as l,transformOpenApiObjectToOrigin as d}from"../helpers/layout.helper.js";import m from"../components/LivePreview/LivePreview.js";import{useFormik as c,FormikProvider as u}from"../../node_modules/formik/dist/formik.esm.js";import{schemaValidation as h}from"../validator/form.scheme.js";import{methodColorMapping as p}from"../constants/index.js";import v from"../components/dialog/index.js";const j=({openApiJson:j,handleSave:x,setIsFormDirty:f,openApiErrors:g})=>{const S=structuredClone(j),y=l(S),A=c({initialValues:structuredClone(y),validationSchema:h,validateOnMount:!0,onSubmit:(e,{validateForm:t,resetForm:o,setSubmitting:i})=>{try{const i=d(e);x(i),o({values:e}),t(e)}catch(e){i(!1)}}}),{dirty:b,isValid:F,isSubmitting:C,values:N,setFieldValue:w,handleSubmit:H,errors:P}=A,[$,_]=t(!1),[D,I]=t(null);return o((()=>{f&&f(b)}),[b]),
|
|
1
|
+
import{j as e}from"../../_virtual/jsx-runtime.js";import{useState as t,useEffect as o}from"react";import{d as i}from"../../_virtual/index.js";import r from"../components/MethodAccordion/MethodAccordion.js";import s from"./layout.module.css.js";import n from"../components/InfoForm/InfoForm.js";import a from"../components/SectionHead/SectionHead.js";import{transformOpenApiObject as l,transformOpenApiObjectToOrigin as d}from"../helpers/layout.helper.js";import m from"../components/LivePreview/LivePreview.js";import{useFormik as c,FormikProvider as u}from"../../node_modules/formik/dist/formik.esm.js";import{schemaValidation as h}from"../validator/form.scheme.js";import{methodColorMapping as p}from"../constants/index.js";import v from"../components/dialog/index.js";const j=({openApiJson:j,handleSave:x,setIsFormDirty:f,openApiErrors:g})=>{const S=structuredClone(j),y=l(S),A=c({initialValues:structuredClone(y),validationSchema:h,validateOnMount:!0,onSubmit:(e,{validateForm:t,resetForm:o,setSubmitting:i})=>{try{const i=d(e);x(i),o({values:e}),t(e)}catch(e){i(!1)}}}),{dirty:b,isValid:F,isSubmitting:C,values:N,setFieldValue:w,handleSubmit:H,errors:P}=A,[$,_]=t(!1),[D,I]=t(null);return o((()=>{f&&f(b)}),[b]),e.jsxs("div",{className:s.docsLayout,children:[b&&e.jsx(i.Alert,{className:s.apiDocAlert,color:"warning",severity:"warning",children:"There are changes you made may not be saved"}),e.jsxs("div",{className:s.layoutContainer,children:[e.jsxs("div",{className:`${s.editorSide} ${s.docSide}`,children:[e.jsx(a,{className:s.editorSectionHead_title,text:e.jsxs("div",{className:s.editorSectionHead_content,children:["API Documentation",e.jsx(i.Button,{className:s.methodForm_submitBtn,size:"medium",fullWidth:!1,type:"submit",variant:"contained",color:"primary",onClick:()=>_(!0),disabled:!F||C||!b,children:"Save"})]})}),e.jsx(u,{value:A,children:e.jsx(n,{})}),e.jsx(a,{className:s.editorSectionHead,text:"Endpoints"}),e.jsx(u,{value:A,children:N.paths.map(((t,o)=>e.jsx(e.Fragment,{children:t.methods.sort(((e,t)=>p[e.type].order-p[t.type].order)).map(((i,s)=>{var n,a,l;return e.jsx(r,{tags:N.tags,method:i,path:t.path,setFieldValue:(e,t)=>{w(`paths[${o}].methods[${s}].${e}`,t)},isOpen:D===s,setIsOpen:e=>I(e?s:null),errors:null===(l=null===(a=null===(n=A.errors.paths)||void 0===n?void 0:n[o])||void 0===a?void 0:a.methods)||void 0===l?void 0:l[s]})}))})))})]}),e.jsx("div",{className:`${s.livePreviewSide} ${s.docSide}`,children:y&&e.jsx(u,{value:A,children:e.jsx(m,{transformedData:y,openApiErrors:g})})})]}),e.jsx(v,{status:"warning",content:e.jsxs(e.Fragment,{children:[e.jsx("h5",{style:{fontWeight:600,fontSize:"1.5rem",lineHeight:"1.875rem",color:"#FAAD14",textAlign:"center",margin:0},children:"Publish Changes"}),e.jsx("p",{style:{textAlign:"center",fontWeight:400,fontSize:"1rem",lineHeight:"1.4375rem"},children:"Are you sure to Publish the changes?"})]}),onSubmit:{onClick:()=>{H(),_(!1)},text:"Publish",color:"warning",fullWidth:!0},onCancel:{text:"Cancel",color:"action",fullWidth:!0,variant:"outlined"},onClose:()=>_(!1),open:$})]})};export{j as default};
|
|
2
2
|
//# sourceMappingURL=layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sources":["../../../src/layout/layout.tsx"],"sourcesContent":["import { JSX, useEffect, useState } from 'react'\nimport { Alert, Button } from 'digitinary-ui'\nimport MethodsAccordion from '../components/MethodAccordion/MethodAccordion'\nimport styles from './layout.module.css'\nimport InfoForm from '../components/InfoForm/InfoForm'\nimport SectionHead from '../components/SectionHead/SectionHead'\nimport { transformOpenApiObject, transformOpenApiObjectToOrigin } from '../helpers/layout.helper'\nimport { OpenAPIFile } from '../types/openApi'\nimport LivePreview from '../components/LivePreview/LivePreview'\nimport { FormikProvider, useFormik } from 'formik'\nimport { schemaValidation } from '../validator/form.scheme'\nimport { TransformedOpenApi } from '@entities/transformedOpenApi'\nimport { methodColorMapping } from '../constants/index'\nimport CommonDialog from '../components/dialog'\n\ninterface ILayoutProps {\n openApiJson?: OpenAPIFile\n handleSave?: (values: unknown) => unknown\n setIsFormDirty?: any\n openApiErrors?: any\n}\n\nconst Layout = ({\n openApiJson,\n handleSave,\n setIsFormDirty,\n openApiErrors,\n}: ILayoutProps): JSX.Element => {\n const clonedOpenApiJson = structuredClone(openApiJson)\n const transformedOpenApi = transformOpenApiObject(clonedOpenApiJson)\n const formik = useFormik<TransformedOpenApi>({\n initialValues: structuredClone(transformedOpenApi),\n validationSchema: schemaValidation,\n validateOnMount: true,\n onSubmit: (values, { validateForm, resetForm, setSubmitting }) => {\n // Handle save logic\n try {\n const originalOpenApiForm = transformOpenApiObjectToOrigin(values)\n handleSave(originalOpenApiForm)\n resetForm({\n values: values, // You can reset it to the same values if you want\n })\n\n validateForm(values)\n } catch (err) {\n setSubmitting(false)\n }\n },\n })\n const { dirty, isValid, isSubmitting, values, setFieldValue, handleSubmit, errors } = formik\n const [isPublishDialogOpen, setIsPublishDialogOpen] = useState(false)\n const [openMethodIndex, setOpenMethodIndex] = useState<number | null>(null)\n\n useEffect(() => {\n if (setIsFormDirty) {\n setIsFormDirty(dirty)\n }\n }, [dirty])\n\n // TODO: keep it here until production\n useEffect(() => {\n console.log({ values, errors })\n }, [values])\n\n return (\n <div className={styles.docsLayout}>\n {dirty && (\n <Alert className={styles.apiDocAlert} color=\"warning\" severity=\"warning\">\n There are changes you made may not be saved\n </Alert>\n )}\n <div className={styles.layoutContainer}>\n <div className={`${styles.editorSide} ${styles.docSide}`}>\n <SectionHead\n className={styles.editorSectionHead_title}\n text={\n <div className={styles.editorSectionHead_content}>\n API Documentation\n <Button\n className={styles.methodForm_submitBtn}\n size=\"medium\"\n fullWidth={false}\n type=\"submit\"\n variant=\"contained\"\n color=\"primary\"\n onClick={() => setIsPublishDialogOpen(true)}\n disabled={!isValid || isSubmitting || !dirty}\n >\n Save\n </Button>\n </div>\n }\n />\n <FormikProvider value={formik}>\n <InfoForm />\n </FormikProvider>\n <SectionHead className={styles.editorSectionHead} text=\"Endpoints\" />\n <FormikProvider value={formik}>\n {values.paths.map((path, pathIndex) => (\n <>\n {path.methods\n .sort(\n (a, b) => methodColorMapping[a.type].order - methodColorMapping[b.type].order\n )\n .map((method, methodIndex) => (\n <MethodsAccordion\n tags={values.tags}\n method={method}\n path={path.path}\n setFieldValue={(key, value) => {\n const h = `paths[${pathIndex}].methods[${methodIndex}].${key}`\n setFieldValue(h, value)\n }}\n isOpen={openMethodIndex === methodIndex}\n setIsOpen={(open) => setOpenMethodIndex(open ? methodIndex : null)}\n errors={(formik.errors.paths?.[pathIndex] as any)?.methods?.[methodIndex]}\n />\n ))}\n </>\n ))}\n </FormikProvider>\n </div>\n <div className={`${styles.livePreviewSide} ${styles.docSide}`}>\n {transformedOpenApi && (\n <FormikProvider value={formik}>\n <LivePreview transformedData={transformedOpenApi} openApiErrors={openApiErrors} />\n </FormikProvider>\n )}\n </div>\n </div>\n <CommonDialog\n status=\"warning\"\n content={\n <>\n <h5\n style={{\n fontWeight: 600,\n fontSize: '1.5rem',\n lineHeight: '1.875rem',\n color: '#FAAD14',\n textAlign: 'center',\n margin: 0,\n }}\n >\n Publish Changes\n </h5>\n <p\n style={{\n textAlign: 'center',\n fontWeight: 400,\n fontSize: '1rem',\n lineHeight: '1.4375rem',\n }}\n >\n Are you sure to Publish the changes?\n </p>\n </>\n }\n onSubmit={{\n onClick: () => {\n handleSubmit()\n setIsPublishDialogOpen(false)\n },\n text: 'Publish',\n color: 'warning',\n fullWidth: true,\n }}\n onCancel={{\n text: 'Cancel',\n color: 'action',\n fullWidth: true,\n variant: 'outlined',\n }}\n onClose={() => setIsPublishDialogOpen(false)}\n open={isPublishDialogOpen}\n />\n </div>\n )\n}\n\nexport default Layout\n"],"names":["Layout","openApiJson","handleSave","setIsFormDirty","openApiErrors","clonedOpenApiJson","structuredClone","transformedOpenApi","transformOpenApiObject","formik","useFormik","initialValues","validationSchema","schemaValidation","validateOnMount","onSubmit","values","validateForm","resetForm","setSubmitting","originalOpenApiForm","transformOpenApiObjectToOrigin","err","dirty","isValid","isSubmitting","setFieldValue","handleSubmit","errors","isPublishDialogOpen","setIsPublishDialogOpen","useState","openMethodIndex","setOpenMethodIndex","useEffect","console","log","_jsxs","jsxs","className","styles","docsLayout","children","_jsx","Alert","apiDocAlert","color","severity","layoutContainer","editorSide","docSide","SectionHead","editorSectionHead_title","text","editorSectionHead_content","Button","methodForm_submitBtn","size","fullWidth","type","variant","onClick","disabled","FormikProvider","value","InfoForm","jsx","editorSectionHead","paths","map","path","pathIndex","_Fragment","methods","sort","a","b","methodColorMapping","order","method","methodIndex","MethodsAccordion","tags","key","isOpen","setIsOpen","open","_b","_a","livePreviewSide","LivePreview","transformedData","CommonDialog","status","content","style","fontWeight","fontSize","lineHeight","textAlign","margin","onCancel","onClose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layout.js","sources":["../../../src/layout/layout.tsx"],"sourcesContent":["import { JSX, useEffect, useState } from 'react'\nimport { Alert, Button } from 'digitinary-ui'\nimport MethodsAccordion from '../components/MethodAccordion/MethodAccordion'\nimport styles from './layout.module.css'\nimport InfoForm from '../components/InfoForm/InfoForm'\nimport SectionHead from '../components/SectionHead/SectionHead'\nimport { transformOpenApiObject, transformOpenApiObjectToOrigin } from '../helpers/layout.helper'\nimport { OpenAPIFile } from '../types/openApi'\nimport LivePreview from '../components/LivePreview/LivePreview'\nimport { FormikProvider, useFormik } from 'formik'\nimport { schemaValidation } from '../validator/form.scheme'\nimport { TransformedOpenApi } from '@entities/transformedOpenApi'\nimport { methodColorMapping } from '../constants/index'\nimport CommonDialog from '../components/dialog'\n\ninterface ILayoutProps {\n openApiJson?: OpenAPIFile\n handleSave?: (values: unknown) => unknown\n setIsFormDirty?: any\n openApiErrors?: any\n}\n\nconst Layout = ({\n openApiJson,\n handleSave,\n setIsFormDirty,\n openApiErrors,\n}: ILayoutProps): JSX.Element => {\n const clonedOpenApiJson = structuredClone(openApiJson)\n const transformedOpenApi = transformOpenApiObject(clonedOpenApiJson)\n const formik = useFormik<TransformedOpenApi>({\n initialValues: structuredClone(transformedOpenApi),\n validationSchema: schemaValidation,\n validateOnMount: true,\n onSubmit: (values, { validateForm, resetForm, setSubmitting }) => {\n // Handle save logic\n try {\n const originalOpenApiForm = transformOpenApiObjectToOrigin(values)\n handleSave(originalOpenApiForm)\n resetForm({\n values: values, // You can reset it to the same values if you want\n })\n\n validateForm(values)\n } catch (err) {\n setSubmitting(false)\n }\n },\n })\n const { dirty, isValid, isSubmitting, values, setFieldValue, handleSubmit, errors } = formik\n const [isPublishDialogOpen, setIsPublishDialogOpen] = useState(false)\n\n const [openMethodIndex, setOpenMethodIndex] = useState<number | null>(null)\n\n useEffect(() => {\n if (setIsFormDirty) {\n setIsFormDirty(dirty)\n }\n }, [dirty])\n\n return (\n <div className={styles.docsLayout}>\n {dirty && (\n <Alert className={styles.apiDocAlert} color=\"warning\" severity=\"warning\">\n There are changes you made may not be saved\n </Alert>\n )}\n <div className={styles.layoutContainer}>\n <div className={`${styles.editorSide} ${styles.docSide}`}>\n <SectionHead\n className={styles.editorSectionHead_title}\n text={\n <div className={styles.editorSectionHead_content}>\n API Documentation\n <Button\n className={styles.methodForm_submitBtn}\n size=\"medium\"\n fullWidth={false}\n type=\"submit\"\n variant=\"contained\"\n color=\"primary\"\n onClick={() => setIsPublishDialogOpen(true)}\n disabled={!isValid || isSubmitting || !dirty}\n >\n Save\n </Button>\n </div>\n }\n />\n <FormikProvider value={formik}>\n <InfoForm />\n </FormikProvider>\n <SectionHead className={styles.editorSectionHead} text=\"Endpoints\" />\n <FormikProvider value={formik}>\n {values.paths.map((path, pathIndex) => (\n <>\n {path.methods\n .sort(\n (a, b) => methodColorMapping[a.type].order - methodColorMapping[b.type].order\n )\n .map((method, methodIndex) => (\n <MethodsAccordion\n tags={values.tags}\n method={method}\n path={path.path}\n setFieldValue={(key, value) => {\n const h = `paths[${pathIndex}].methods[${methodIndex}].${key}`\n setFieldValue(h, value)\n }}\n isOpen={openMethodIndex === methodIndex}\n setIsOpen={(open) => setOpenMethodIndex(open ? methodIndex : null)}\n errors={(formik.errors.paths?.[pathIndex] as any)?.methods?.[methodIndex]}\n />\n ))}\n </>\n ))}\n </FormikProvider>\n </div>\n <div className={`${styles.livePreviewSide} ${styles.docSide}`}>\n {transformedOpenApi && (\n <FormikProvider value={formik}>\n <LivePreview transformedData={transformedOpenApi} openApiErrors={openApiErrors} />\n </FormikProvider>\n )}\n </div>\n </div>\n <CommonDialog\n status=\"warning\"\n content={\n <>\n <h5\n style={{\n fontWeight: 600,\n fontSize: '1.5rem',\n lineHeight: '1.875rem',\n color: '#FAAD14',\n textAlign: 'center',\n margin: 0,\n }}\n >\n Publish Changes\n </h5>\n <p\n style={{\n textAlign: 'center',\n fontWeight: 400,\n fontSize: '1rem',\n lineHeight: '1.4375rem',\n }}\n >\n Are you sure to Publish the changes?\n </p>\n </>\n }\n onSubmit={{\n onClick: () => {\n handleSubmit()\n setIsPublishDialogOpen(false)\n },\n text: 'Publish',\n color: 'warning',\n fullWidth: true,\n }}\n onCancel={{\n text: 'Cancel',\n color: 'action',\n fullWidth: true,\n variant: 'outlined',\n }}\n onClose={() => setIsPublishDialogOpen(false)}\n open={isPublishDialogOpen}\n />\n </div>\n )\n}\n\nexport default Layout\n"],"names":["Layout","openApiJson","handleSave","setIsFormDirty","openApiErrors","clonedOpenApiJson","structuredClone","transformedOpenApi","transformOpenApiObject","formik","useFormik","initialValues","validationSchema","schemaValidation","validateOnMount","onSubmit","values","validateForm","resetForm","setSubmitting","originalOpenApiForm","transformOpenApiObjectToOrigin","err","dirty","isValid","isSubmitting","setFieldValue","handleSubmit","errors","isPublishDialogOpen","setIsPublishDialogOpen","useState","openMethodIndex","setOpenMethodIndex","useEffect","_jsxs","jsxs","className","styles","docsLayout","children","_jsx","Alert","apiDocAlert","color","severity","layoutContainer","editorSide","docSide","SectionHead","editorSectionHead_title","text","editorSectionHead_content","Button","methodForm_submitBtn","size","fullWidth","type","variant","onClick","disabled","FormikProvider","value","InfoForm","jsx","editorSectionHead","paths","map","path","pathIndex","_Fragment","methods","sort","a","b","methodColorMapping","order","method","methodIndex","MethodsAccordion","tags","key","isOpen","setIsOpen","open","_b","_a","livePreviewSide","LivePreview","transformedData","CommonDialog","status","content","style","fontWeight","fontSize","lineHeight","textAlign","margin","onCancel","onClose"],"mappings":"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"}
|
package/dist/styles.css
CHANGED
|
@@ -62,6 +62,124 @@
|
|
|
62
62
|
}
|
|
63
63
|
.containerTitleDrawer .closeIcon {
|
|
64
64
|
cursor: pointer;
|
|
65
|
+
}.apiInfoForm {
|
|
66
|
+
display: grid;
|
|
67
|
+
padding: 1.25rem 1.875rem;
|
|
68
|
+
gap: 1.25rem;
|
|
69
|
+
}
|
|
70
|
+
.apiInfoForm .paramsTable .paramDescContainer {
|
|
71
|
+
display: flex;
|
|
72
|
+
}
|
|
73
|
+
.apiInfoForm .paramsTable .paramDescContainer .paramDescContainer_separator {
|
|
74
|
+
height: inherit;
|
|
75
|
+
width: 1px;
|
|
76
|
+
background-color: #d8dae5;
|
|
77
|
+
}
|
|
78
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn) svg path {
|
|
79
|
+
stroke-width: 0.1;
|
|
80
|
+
}
|
|
81
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).editDescBtn {
|
|
82
|
+
padding: 0;
|
|
83
|
+
margin-right: 1.25rem;
|
|
84
|
+
}
|
|
85
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).editDescBtn :global(.btnContentWrapper) {
|
|
86
|
+
display: flex;
|
|
87
|
+
align-items: center;
|
|
88
|
+
padding: 0;
|
|
89
|
+
font-size: 0.875rem;
|
|
90
|
+
}
|
|
91
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).editDescBtn :global(.btnContentWrapper) :global(.endBtnIcon) {
|
|
92
|
+
margin-block: auto;
|
|
93
|
+
}
|
|
94
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).editDescBtn :global(.btnContentWrapper) :global(.endBtnIcon) svg path {
|
|
95
|
+
fill: #12131a;
|
|
96
|
+
}
|
|
97
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).deleteParamBtn {
|
|
98
|
+
padding: 0;
|
|
99
|
+
border-width: 0 !important;
|
|
100
|
+
}
|
|
101
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).deleteParamBtn :global(.btnContentWrapper) :global(.endBtnIcon) {
|
|
102
|
+
margin-block: auto;
|
|
103
|
+
}
|
|
104
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).deleteParamBtn :global(.btnContentWrapper) :global(.endBtnIcon) svg {
|
|
105
|
+
width: 1.125rem;
|
|
106
|
+
}
|
|
107
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn):not(:global(.disabled)):global(.success) :global(.endBtnIcon) {
|
|
108
|
+
margin-block: auto;
|
|
109
|
+
}
|
|
110
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn):not(:global(.disabled)):global(.success) :global(.endBtnIcon) svg {
|
|
111
|
+
width: 1.125rem;
|
|
112
|
+
}
|
|
113
|
+
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn):not(:global(.disabled)):global(.success) :global(.endBtnIcon) svg path {
|
|
114
|
+
fill: #3aaa35;
|
|
115
|
+
}
|
|
116
|
+
.apiInfoForm .paramsTable .externalDocsLink {
|
|
117
|
+
font-size: 0.875rem;
|
|
118
|
+
line-height: 1.25rem;
|
|
119
|
+
cursor: pointer;
|
|
120
|
+
align-self: center;
|
|
121
|
+
margin-right: 2rem;
|
|
122
|
+
}
|
|
123
|
+
.apiInfoForm .paramsTable .editExternalDocs {
|
|
124
|
+
display: flex;
|
|
125
|
+
align-items: center;
|
|
126
|
+
padding-right: 0.625rem;
|
|
127
|
+
}
|
|
128
|
+
.apiInfoForm .paramsTable .editExternalDocs svg {
|
|
129
|
+
cursor: pointer;
|
|
130
|
+
}
|
|
131
|
+
.apiInfoForm .paramsTable .editExternalDocs svg path {
|
|
132
|
+
fill: #12131a;
|
|
133
|
+
}
|
|
134
|
+
.apiInfoForm .paramsTable .editDescTooltipContent {
|
|
135
|
+
display: flex;
|
|
136
|
+
flex-direction: column;
|
|
137
|
+
gap: 0.625rem;
|
|
138
|
+
padding-bottom: 0.625rem;
|
|
139
|
+
}
|
|
140
|
+
.apiInfoForm .paramsTable .editDescTooltipContent > *:not(.editDescTooltipContent_header) {
|
|
141
|
+
margin-inline: 0.625rem;
|
|
142
|
+
}
|
|
143
|
+
.apiInfoForm .paramsTable .editDescTooltipContent .editDescTooltipContent_header {
|
|
144
|
+
font-weight: 600;
|
|
145
|
+
font-size: 0.875rem;
|
|
146
|
+
line-height: 1.25rem;
|
|
147
|
+
padding: 0.75rem 1.25rem;
|
|
148
|
+
border-bottom: 1px solid #d8dae5;
|
|
149
|
+
}
|
|
150
|
+
.apiInfoForm .paramsTable :global(.requiredParam) :global(.headContainer)::after {
|
|
151
|
+
content: "*";
|
|
152
|
+
color: red;
|
|
153
|
+
transform: translateX(0.125rem);
|
|
154
|
+
}
|
|
155
|
+
.apiInfoForm .apiDocRow {
|
|
156
|
+
display: grid;
|
|
157
|
+
grid-template-columns: 1fr 1fr;
|
|
158
|
+
gap: 1.25rem;
|
|
159
|
+
}
|
|
160
|
+
.apiInfoForm .apiInfoForm_tagsChips {
|
|
161
|
+
margin-top: -1.25rem;
|
|
162
|
+
}
|
|
163
|
+
.apiInfoForm .editDescTooltipContent {
|
|
164
|
+
display: flex;
|
|
165
|
+
flex-direction: column;
|
|
166
|
+
gap: 0.625rem;
|
|
167
|
+
padding-bottom: 0.625rem;
|
|
168
|
+
}
|
|
169
|
+
.apiInfoForm .editDescTooltipContent > *:not(.editDescTooltipContent_header) {
|
|
170
|
+
margin-inline: 0.625rem;
|
|
171
|
+
}
|
|
172
|
+
.apiInfoForm .editDescTooltipContent .editDescTooltipContent_header {
|
|
173
|
+
font-weight: 600;
|
|
174
|
+
font-size: 0.875rem;
|
|
175
|
+
line-height: 1.25rem;
|
|
176
|
+
padding: 0.75rem 1.25rem;
|
|
177
|
+
border-bottom: 1px solid #d8dae5;
|
|
178
|
+
}
|
|
179
|
+
.apiInfoForm :global(.requiredParam) :global(.headContainer)::after {
|
|
180
|
+
content: "*";
|
|
181
|
+
color: red;
|
|
182
|
+
transform: translateX(0.125rem);
|
|
65
183
|
}.methodAccordion {
|
|
66
184
|
border: none !important;
|
|
67
185
|
box-shadow: none !important;
|
|
@@ -393,124 +511,6 @@
|
|
|
393
511
|
}
|
|
394
512
|
.methodAccordion.readOnly .methodSummaryContainer .methodExpandArrowContainer {
|
|
395
513
|
background-color: #ebecf2;
|
|
396
|
-
}.apiInfoForm {
|
|
397
|
-
display: grid;
|
|
398
|
-
padding: 1.25rem 1.875rem;
|
|
399
|
-
gap: 1.25rem;
|
|
400
|
-
}
|
|
401
|
-
.apiInfoForm .paramsTable .paramDescContainer {
|
|
402
|
-
display: flex;
|
|
403
|
-
}
|
|
404
|
-
.apiInfoForm .paramsTable .paramDescContainer .paramDescContainer_separator {
|
|
405
|
-
height: inherit;
|
|
406
|
-
width: 1px;
|
|
407
|
-
background-color: #d8dae5;
|
|
408
|
-
}
|
|
409
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn) svg path {
|
|
410
|
-
stroke-width: 0.1;
|
|
411
|
-
}
|
|
412
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).editDescBtn {
|
|
413
|
-
padding: 0;
|
|
414
|
-
margin-right: 1.25rem;
|
|
415
|
-
}
|
|
416
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).editDescBtn :global(.btnContentWrapper) {
|
|
417
|
-
display: flex;
|
|
418
|
-
align-items: center;
|
|
419
|
-
padding: 0;
|
|
420
|
-
font-size: 0.875rem;
|
|
421
|
-
}
|
|
422
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).editDescBtn :global(.btnContentWrapper) :global(.endBtnIcon) {
|
|
423
|
-
margin-block: auto;
|
|
424
|
-
}
|
|
425
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).editDescBtn :global(.btnContentWrapper) :global(.endBtnIcon) svg path {
|
|
426
|
-
fill: #12131a;
|
|
427
|
-
}
|
|
428
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).deleteParamBtn {
|
|
429
|
-
padding: 0;
|
|
430
|
-
border-width: 0 !important;
|
|
431
|
-
}
|
|
432
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).deleteParamBtn :global(.btnContentWrapper) :global(.endBtnIcon) {
|
|
433
|
-
margin-block: auto;
|
|
434
|
-
}
|
|
435
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn).deleteParamBtn :global(.btnContentWrapper) :global(.endBtnIcon) svg {
|
|
436
|
-
width: 1.125rem;
|
|
437
|
-
}
|
|
438
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn):not(:global(.disabled)):global(.success) :global(.endBtnIcon) {
|
|
439
|
-
margin-block: auto;
|
|
440
|
-
}
|
|
441
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn):not(:global(.disabled)):global(.success) :global(.endBtnIcon) svg {
|
|
442
|
-
width: 1.125rem;
|
|
443
|
-
}
|
|
444
|
-
.apiInfoForm .paramsTable .paramDescContainer :global(.customBtn):not(:global(.disabled)):global(.success) :global(.endBtnIcon) svg path {
|
|
445
|
-
fill: #3aaa35;
|
|
446
|
-
}
|
|
447
|
-
.apiInfoForm .paramsTable .externalDocsLink {
|
|
448
|
-
font-size: 0.875rem;
|
|
449
|
-
line-height: 1.25rem;
|
|
450
|
-
cursor: pointer;
|
|
451
|
-
align-self: center;
|
|
452
|
-
margin-right: 2rem;
|
|
453
|
-
}
|
|
454
|
-
.apiInfoForm .paramsTable .editExternalDocs {
|
|
455
|
-
display: flex;
|
|
456
|
-
align-items: center;
|
|
457
|
-
padding-right: 0.625rem;
|
|
458
|
-
}
|
|
459
|
-
.apiInfoForm .paramsTable .editExternalDocs svg {
|
|
460
|
-
cursor: pointer;
|
|
461
|
-
}
|
|
462
|
-
.apiInfoForm .paramsTable .editExternalDocs svg path {
|
|
463
|
-
fill: #12131a;
|
|
464
|
-
}
|
|
465
|
-
.apiInfoForm .paramsTable .editDescTooltipContent {
|
|
466
|
-
display: flex;
|
|
467
|
-
flex-direction: column;
|
|
468
|
-
gap: 0.625rem;
|
|
469
|
-
padding-bottom: 0.625rem;
|
|
470
|
-
}
|
|
471
|
-
.apiInfoForm .paramsTable .editDescTooltipContent > *:not(.editDescTooltipContent_header) {
|
|
472
|
-
margin-inline: 0.625rem;
|
|
473
|
-
}
|
|
474
|
-
.apiInfoForm .paramsTable .editDescTooltipContent .editDescTooltipContent_header {
|
|
475
|
-
font-weight: 600;
|
|
476
|
-
font-size: 0.875rem;
|
|
477
|
-
line-height: 1.25rem;
|
|
478
|
-
padding: 0.75rem 1.25rem;
|
|
479
|
-
border-bottom: 1px solid #d8dae5;
|
|
480
|
-
}
|
|
481
|
-
.apiInfoForm .paramsTable :global(.requiredParam) :global(.headContainer)::after {
|
|
482
|
-
content: "*";
|
|
483
|
-
color: red;
|
|
484
|
-
transform: translateX(0.125rem);
|
|
485
|
-
}
|
|
486
|
-
.apiInfoForm .apiDocRow {
|
|
487
|
-
display: grid;
|
|
488
|
-
grid-template-columns: 1fr 1fr;
|
|
489
|
-
gap: 1.25rem;
|
|
490
|
-
}
|
|
491
|
-
.apiInfoForm .apiInfoForm_tagsChips {
|
|
492
|
-
margin-top: -1.25rem;
|
|
493
|
-
}
|
|
494
|
-
.apiInfoForm .editDescTooltipContent {
|
|
495
|
-
display: flex;
|
|
496
|
-
flex-direction: column;
|
|
497
|
-
gap: 0.625rem;
|
|
498
|
-
padding-bottom: 0.625rem;
|
|
499
|
-
}
|
|
500
|
-
.apiInfoForm .editDescTooltipContent > *:not(.editDescTooltipContent_header) {
|
|
501
|
-
margin-inline: 0.625rem;
|
|
502
|
-
}
|
|
503
|
-
.apiInfoForm .editDescTooltipContent .editDescTooltipContent_header {
|
|
504
|
-
font-weight: 600;
|
|
505
|
-
font-size: 0.875rem;
|
|
506
|
-
line-height: 1.25rem;
|
|
507
|
-
padding: 0.75rem 1.25rem;
|
|
508
|
-
border-bottom: 1px solid #d8dae5;
|
|
509
|
-
}
|
|
510
|
-
.apiInfoForm :global(.requiredParam) :global(.headContainer)::after {
|
|
511
|
-
content: "*";
|
|
512
|
-
color: red;
|
|
513
|
-
transform: translateX(0.125rem);
|
|
514
514
|
}.tooltip-custom-wrapper {
|
|
515
515
|
display: flex;
|
|
516
516
|
}
|
|
@@ -1583,11 +1583,14 @@ div.endBtnIcon {
|
|
|
1583
1583
|
font-size: 1rem;
|
|
1584
1584
|
line-height: 1.25rem;
|
|
1585
1585
|
}
|
|
1586
|
+
.api_docs_header .search_filter_btn .btnContentWrapper .btnContent {
|
|
1587
|
+
font-size: 0.918rem !important;
|
|
1588
|
+
}
|
|
1586
1589
|
.api_docs_header .search_filter_btn:hover:not(:disabled) {
|
|
1587
1590
|
color: #000000 !important;
|
|
1588
1591
|
}
|
|
1589
1592
|
.api_docs_header .search_filter_btn:hover {
|
|
1590
|
-
color: #000;
|
|
1593
|
+
color: #000 !important;
|
|
1591
1594
|
}
|
|
1592
1595
|
.api_docs_header .search_filter_btn svg {
|
|
1593
1596
|
margin-left: 0.5rem;
|
|
@@ -1623,6 +1626,9 @@ div.endBtnIcon {
|
|
|
1623
1626
|
line-height: 1.234rem;
|
|
1624
1627
|
height: 2.25rem;
|
|
1625
1628
|
}
|
|
1629
|
+
.api_docs_header .api_btn .btnContentWrapper .btnContent {
|
|
1630
|
+
font-size: 0.918rem !important;
|
|
1631
|
+
}
|
|
1626
1632
|
.api_docs_header .api_btn:hover:not(:disabled) {
|
|
1627
1633
|
color: #000000 !important;
|
|
1628
1634
|
}
|
|
@@ -3,5 +3,5 @@ import { OpenAPIFile } from '@entities/openApi';
|
|
|
3
3
|
import { TransformedOpenApi } from '@entities/transformedOpenApi';
|
|
4
4
|
export declare const transformOpenApiObject: (openApiJson: OpenAPIFile) => TransformedOpenApi;
|
|
5
5
|
export declare const transformOpenApiObjectToOrigin: (values: TransformedOpenApi) => OpenAPIFile;
|
|
6
|
-
export declare const transformPathsToArray: (
|
|
6
|
+
export declare const transformPathsToArray: (openApiJson: OpenAPIFile) => TransformedPathsArray | any;
|
|
7
7
|
export declare const transformPathsArrayToOrigin: (paths: TransformedPathsArray) => OpenAPIFile["paths"];
|
package/package.json
CHANGED
|
@@ -76,6 +76,7 @@ const MethodsAccordion = ({
|
|
|
76
76
|
const [enumFields, setEnumFields] = useState([])
|
|
77
77
|
const [tooltipEnumRef, setTooltipEnumRef] = useState(null)
|
|
78
78
|
const [currentResponseIndex, setCurrentResponseIndex] = useState<number>(-1)
|
|
79
|
+
const activeAccordionRef = useRef<HTMLDivElement | null>(null)
|
|
79
80
|
const currentResponse =
|
|
80
81
|
method.responses.find((res) => Number(res.code) === selectedStatusCode.value) || '{}'
|
|
81
82
|
const indexRef = useRef(-1)
|
|
@@ -91,6 +92,12 @@ const MethodsAccordion = ({
|
|
|
91
92
|
setTableData(newTableData)
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
if (isOpen && activeAccordionRef.current) {
|
|
97
|
+
activeAccordionRef.current.scrollIntoView({ behavior: 'smooth', block: 'start' })
|
|
98
|
+
}
|
|
99
|
+
}, [isOpen])
|
|
100
|
+
|
|
94
101
|
const generateResponseTableData = (headersObj: any, responseIndex: number) => {
|
|
95
102
|
const headersByName = Object.keys(headersObj)
|
|
96
103
|
return headersByName.map((item, index) => {
|
|
@@ -721,7 +728,7 @@ const MethodsAccordion = ({
|
|
|
721
728
|
}, [tags, method])
|
|
722
729
|
|
|
723
730
|
return (
|
|
724
|
-
<div>
|
|
731
|
+
<div ref={activeAccordionRef}>
|
|
725
732
|
<Accordion
|
|
726
733
|
expanded={isOpen}
|
|
727
734
|
onChange={() => setIsOpen(!isOpen)}
|
|
@@ -224,9 +224,9 @@ const ParamterTable = ({
|
|
|
224
224
|
value: values.schema?.items?.type,
|
|
225
225
|
}}
|
|
226
226
|
errorMsg={!!errors?.schema?.items?.type && errors?.schema?.items?.type}
|
|
227
|
-
onChange={(item) =>
|
|
227
|
+
onChange={(item) => {
|
|
228
228
|
setFieldValue('schema.items.type', item?.value?.toLowerCase())
|
|
229
|
-
} // Updates state on selection
|
|
229
|
+
}} // Updates state on selection
|
|
230
230
|
options={[
|
|
231
231
|
{
|
|
232
232
|
list: [
|
|
@@ -2,6 +2,11 @@ import { TransformedPathsArray } from '@entities/layout.type'
|
|
|
2
2
|
import { OpenAPIFile, SecurityScheme } from '@entities/openApi'
|
|
3
3
|
import { TransformedOpenApi } from '@entities/transformedOpenApi'
|
|
4
4
|
|
|
5
|
+
const resolveRef = (ref: string, openApiJson: OpenAPIFile): Object => {
|
|
6
|
+
const parts = ref.replace(/^#\//, '').split('/')
|
|
7
|
+
return parts.reduce((obj, key) => obj?.[key], openApiJson)
|
|
8
|
+
}
|
|
9
|
+
|
|
5
10
|
export const transformOpenApiObject = (openApiJson: OpenAPIFile): TransformedOpenApi => {
|
|
6
11
|
if (openApiJson.components && openApiJson.components.securitySchemes) {
|
|
7
12
|
const authKey = Object.keys(openApiJson.components.securitySchemes)?.at(0)
|
|
@@ -17,6 +22,7 @@ export const transformOpenApiObject = (openApiJson: OpenAPIFile): TransformedOpe
|
|
|
17
22
|
scheme: 'public',
|
|
18
23
|
},
|
|
19
24
|
},
|
|
25
|
+
...(openApiJson.components || {}),
|
|
20
26
|
}
|
|
21
27
|
}
|
|
22
28
|
|
|
@@ -26,7 +32,7 @@ export const transformOpenApiObject = (openApiJson: OpenAPIFile): TransformedOpe
|
|
|
26
32
|
|
|
27
33
|
return {
|
|
28
34
|
...openApiJson,
|
|
29
|
-
paths: transformPathsToArray(openApiJson
|
|
35
|
+
paths: transformPathsToArray(openApiJson),
|
|
30
36
|
} as TransformedOpenApi
|
|
31
37
|
}
|
|
32
38
|
|
|
@@ -50,7 +56,8 @@ export const transformOpenApiObjectToOrigin = (values: TransformedOpenApi): Open
|
|
|
50
56
|
return object
|
|
51
57
|
}
|
|
52
58
|
|
|
53
|
-
export const transformPathsToArray = (
|
|
59
|
+
export const transformPathsToArray = (openApiJson: OpenAPIFile): TransformedPathsArray | any => {
|
|
60
|
+
const paths: OpenAPIFile['paths'] = openApiJson.paths
|
|
54
61
|
const transformedPaths = Object.entries(paths).map(([path, methods]) => ({
|
|
55
62
|
path,
|
|
56
63
|
methods: Object.entries(methods).map(([method, methodProps]) => {
|
|
@@ -61,20 +68,55 @@ export const transformPathsToArray = (paths: OpenAPIFile['paths']): TransformedP
|
|
|
61
68
|
summary: methodProps.summary || '',
|
|
62
69
|
responses: Object.entries(methodProps.responses).map(([code, codeProps]) => {
|
|
63
70
|
const contentType = Object.keys(codeProps.content || {})[0]
|
|
64
|
-
|
|
71
|
+
let headers = codeProps?.headers ?? {}
|
|
72
|
+
|
|
73
|
+
// ? Fix headers with items property
|
|
74
|
+
Object.keys(headers).map((header: string) => {
|
|
75
|
+
let headerObj = headers[header]
|
|
76
|
+
if (
|
|
77
|
+
headerObj?.schema &&
|
|
78
|
+
headerObj?.schema?.type &&
|
|
79
|
+
headerObj?.schema?.type != 'array'
|
|
80
|
+
) {
|
|
81
|
+
delete headers[header]?.schema?.items
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
let schema = codeProps.content?.[contentType]?.schema
|
|
86
|
+
if (schema?.$ref) {
|
|
87
|
+
schema = resolveRef(schema?.$ref, openApiJson)
|
|
88
|
+
} else if (schema?.type == 'array' && schema?.items?.$ref) {
|
|
89
|
+
const resolvedItemSchema = resolveRef(schema.items.$ref, openApiJson)
|
|
90
|
+
schema = {
|
|
91
|
+
...schema,
|
|
92
|
+
items: resolvedItemSchema,
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
65
96
|
return {
|
|
66
97
|
code,
|
|
67
98
|
headers,
|
|
68
99
|
content: {
|
|
69
100
|
contentType,
|
|
70
101
|
schema: {
|
|
71
|
-
...
|
|
72
|
-
properties: JSON.stringify(
|
|
102
|
+
...schema,
|
|
103
|
+
properties: JSON.stringify(schema?.properties || schema?.items?.properties),
|
|
73
104
|
},
|
|
74
105
|
},
|
|
75
106
|
}
|
|
76
107
|
}),
|
|
77
108
|
}
|
|
109
|
+
|
|
110
|
+
if (!obj.responses.find((item) => item.code == '200')) {
|
|
111
|
+
obj.responses.push({
|
|
112
|
+
code: '200',
|
|
113
|
+
content: {
|
|
114
|
+
contentType: 'application/json',
|
|
115
|
+
schema: {},
|
|
116
|
+
},
|
|
117
|
+
headers: {},
|
|
118
|
+
})
|
|
119
|
+
}
|
|
78
120
|
// Add parameters if it does not exist in the original JSON
|
|
79
121
|
if (!methodProps?.parameters) {
|
|
80
122
|
obj.parameters = []
|
|
@@ -84,14 +126,24 @@ export const transformPathsToArray = (paths: OpenAPIFile['paths']): TransformedP
|
|
|
84
126
|
|
|
85
127
|
if (method.toLowerCase() != 'get') {
|
|
86
128
|
const contentType = Object.keys(methodProps?.requestBody?.content || {})[0]
|
|
87
|
-
|
|
88
|
-
|
|
129
|
+
let reqSchema = methodProps?.requestBody?.content?.[contentType]?.schema
|
|
130
|
+
|
|
131
|
+
if (reqSchema?.$ref) {
|
|
132
|
+
reqSchema = resolveRef(reqSchema.$ref, openApiJson)
|
|
133
|
+
} else if (reqSchema?.type === 'array' && reqSchema.items?.$ref) {
|
|
134
|
+
reqSchema = {
|
|
135
|
+
...reqSchema,
|
|
136
|
+
items: resolveRef(reqSchema.items.$ref, openApiJson),
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const requestBodyData = reqSchema
|
|
89
141
|
? {
|
|
90
142
|
content: {
|
|
91
143
|
contentType,
|
|
92
144
|
schema: {
|
|
93
145
|
...reqSchema,
|
|
94
|
-
properties: reqSchema?.properties
|
|
146
|
+
properties: JSON.stringify(reqSchema?.properties || reqSchema?.items?.properties),
|
|
95
147
|
},
|
|
96
148
|
},
|
|
97
149
|
}
|
|
@@ -128,8 +180,18 @@ export const transformPathsArrayToOrigin = (paths: TransformedPathsArray): OpenA
|
|
|
128
180
|
acc[path] = methods.reduce(
|
|
129
181
|
(methodAcc, { type, tags, responses, summary, requestBody, ...rest }) => {
|
|
130
182
|
// Initialize the method object
|
|
183
|
+
// ? Validate (rest) [parameters]
|
|
184
|
+
let copiedRest = structuredClone(rest || {})
|
|
185
|
+
if (copiedRest && copiedRest.parameters) {
|
|
186
|
+
copiedRest.parameters.map((param) => {
|
|
187
|
+
if (param && param?.schema?.items && param?.schema?.items?.type == 'array') {
|
|
188
|
+
param.schema.items.items = {}
|
|
189
|
+
}
|
|
190
|
+
return param
|
|
191
|
+
})
|
|
192
|
+
}
|
|
131
193
|
methodAcc[type] = {
|
|
132
|
-
...
|
|
194
|
+
...copiedRest,
|
|
133
195
|
tags,
|
|
134
196
|
summary,
|
|
135
197
|
responses: responses.reduce((respAcc, { code, content, headers }) => {
|
|
@@ -27,12 +27,18 @@
|
|
|
27
27
|
font-size: 1rem;
|
|
28
28
|
line-height: 1.25rem;
|
|
29
29
|
|
|
30
|
+
.btnContentWrapper {
|
|
31
|
+
.btnContent{
|
|
32
|
+
font-size: 0.918rem !important;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
30
36
|
&:hover:not(:disabled) {
|
|
31
37
|
color: #000000 !important;
|
|
32
38
|
}
|
|
33
39
|
|
|
34
40
|
&:hover {
|
|
35
|
-
color: #000;
|
|
41
|
+
color: #000 !important;
|
|
36
42
|
}
|
|
37
43
|
|
|
38
44
|
svg {
|
|
@@ -74,6 +80,12 @@
|
|
|
74
80
|
line-height: 1.234rem;
|
|
75
81
|
height: 2.25rem;
|
|
76
82
|
|
|
83
|
+
.btnContentWrapper {
|
|
84
|
+
.btnContent{
|
|
85
|
+
font-size: 0.918rem !important;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
77
89
|
&:hover:not(:disabled) {
|
|
78
90
|
color: #000000 !important;
|
|
79
91
|
}
|