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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/.editorconfig +13 -0
  2. package/.prettierignore +8 -0
  3. package/.prettierrc +15 -0
  4. package/dist/_virtual/index4.js +1 -1
  5. package/dist/_virtual/index5.js +1 -1
  6. package/dist/_virtual/index6.js +1 -1
  7. package/dist/_virtual/index7.js +1 -1
  8. package/dist/node_modules/@popperjs/core/lib/createPopper.js +1 -1
  9. package/dist/node_modules/@popperjs/core/lib/createPopper.js.map +1 -1
  10. package/dist/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js +1 -1
  11. package/dist/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js.map +1 -1
  12. package/dist/node_modules/@popperjs/core/lib/enums.js +1 -1
  13. package/dist/node_modules/@popperjs/core/lib/enums.js.map +1 -1
  14. package/dist/node_modules/@popperjs/core/lib/modifiers/applyStyles.js +1 -1
  15. package/dist/node_modules/@popperjs/core/lib/modifiers/applyStyles.js.map +1 -1
  16. package/dist/node_modules/@popperjs/core/lib/modifiers/eventListeners.js +1 -1
  17. package/dist/node_modules/@popperjs/core/lib/modifiers/eventListeners.js.map +1 -1
  18. package/dist/node_modules/@popperjs/core/lib/modifiers/flip.js +1 -1
  19. package/dist/node_modules/@popperjs/core/lib/modifiers/flip.js.map +1 -1
  20. package/dist/node_modules/@popperjs/core/lib/modifiers/hide.js +1 -1
  21. package/dist/node_modules/@popperjs/core/lib/modifiers/hide.js.map +1 -1
  22. package/dist/node_modules/@popperjs/core/lib/modifiers/offset.js +1 -1
  23. package/dist/node_modules/@popperjs/core/lib/modifiers/offset.js.map +1 -1
  24. package/dist/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js +1 -1
  25. package/dist/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js.map +1 -1
  26. package/dist/node_modules/@popperjs/core/lib/utils/debounce.js +1 -1
  27. package/dist/node_modules/@popperjs/core/lib/utils/debounce.js.map +1 -1
  28. package/dist/node_modules/@popperjs/core/lib/utils/detectOverflow.js +1 -1
  29. package/dist/node_modules/@popperjs/core/lib/utils/detectOverflow.js.map +1 -1
  30. package/dist/node_modules/@popperjs/core/lib/utils/expandToHashMap.js +1 -1
  31. package/dist/node_modules/@popperjs/core/lib/utils/expandToHashMap.js.map +1 -1
  32. package/dist/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js +1 -1
  33. package/dist/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js.map +1 -1
  34. package/dist/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js +1 -1
  35. package/dist/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js.map +1 -1
  36. package/dist/node_modules/@popperjs/core/lib/utils/mergeByName.js +1 -1
  37. package/dist/node_modules/@popperjs/core/lib/utils/mergeByName.js.map +1 -1
  38. package/dist/node_modules/@popperjs/core/lib/utils/orderModifiers.js +1 -1
  39. package/dist/node_modules/@popperjs/core/lib/utils/orderModifiers.js.map +1 -1
  40. package/dist/node_modules/@popperjs/core/lib/utils/userAgent.js +1 -1
  41. package/dist/node_modules/@popperjs/core/lib/utils/userAgent.js.map +1 -1
  42. package/dist/node_modules/@tippyjs/react/dist/tippy-react.esm.js +1 -1
  43. package/dist/node_modules/@tippyjs/react/dist/tippy-react.esm.js.map +1 -1
  44. package/dist/node_modules/digitinary-ui/dist/index.js +1 -1
  45. package/dist/node_modules/digitinary-ui/dist/index.js.map +1 -1
  46. package/dist/node_modules/dom-serializer/lib/foreignNames.js +1 -1
  47. package/dist/node_modules/dom-serializer/lib/foreignNames.js.map +1 -1
  48. package/dist/node_modules/dom-serializer/lib/index.js +1 -1
  49. package/dist/node_modules/dom-serializer/lib/index.js.map +1 -1
  50. package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode.js +1 -1
  51. package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode.js.map +1 -1
  52. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-html.js +1 -1
  53. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-html.js.map +1 -1
  54. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-xml.js +1 -1
  55. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-xml.js.map +1 -1
  56. package/dist/node_modules/domhandler/lib/node.js +1 -1
  57. package/dist/node_modules/domhandler/lib/node.js.map +1 -1
  58. package/dist/node_modules/domutils/lib/feeds.js +1 -1
  59. package/dist/node_modules/domutils/lib/feeds.js.map +1 -1
  60. package/dist/node_modules/domutils/lib/helpers.js +1 -1
  61. package/dist/node_modules/domutils/lib/helpers.js.map +1 -1
  62. package/dist/node_modules/domutils/lib/legacy.js +1 -1
  63. package/dist/node_modules/domutils/lib/legacy.js.map +1 -1
  64. package/dist/node_modules/domutils/lib/querying.js +1 -1
  65. package/dist/node_modules/domutils/lib/querying.js.map +1 -1
  66. package/dist/node_modules/domutils/lib/stringify.js +1 -1
  67. package/dist/node_modules/domutils/lib/stringify.js.map +1 -1
  68. package/dist/node_modules/entities/dist/commonjs/decode.js +1 -1
  69. package/dist/node_modules/entities/dist/commonjs/decode.js.map +1 -1
  70. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-html.js +1 -1
  71. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map +1 -1
  72. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +1 -1
  73. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map +1 -1
  74. package/dist/node_modules/formik/dist/formik.esm.js +1 -1
  75. package/dist/node_modules/formik/dist/formik.esm.js.map +1 -1
  76. package/dist/node_modules/formik/node_modules/deepmerge/dist/es.js +1 -1
  77. package/dist/node_modules/formik/node_modules/deepmerge/dist/es.js.map +1 -1
  78. package/dist/node_modules/highlight.js/lib/core.js +1 -1
  79. package/dist/node_modules/highlight.js/lib/core.js.map +1 -1
  80. package/dist/node_modules/highlight.js/lib/languages/json.js +1 -1
  81. package/dist/node_modules/highlight.js/lib/languages/json.js.map +1 -1
  82. package/dist/node_modules/html-react-parser/lib/utilities.js.map +1 -1
  83. package/dist/node_modules/htmlparser2/dist/commonjs/Tokenizer.js +1 -1
  84. package/dist/node_modules/htmlparser2/dist/commonjs/Tokenizer.js.map +1 -1
  85. package/dist/node_modules/htmlparser2/dist/commonjs/index.js +1 -1
  86. package/dist/node_modules/htmlparser2/dist/commonjs/index.js.map +1 -1
  87. package/dist/node_modules/js-yaml/dist/js-yaml.mjs.js +1 -1
  88. package/dist/node_modules/js-yaml/dist/js-yaml.mjs.js.map +1 -1
  89. package/dist/node_modules/lodash-es/_baseClone.js +1 -1
  90. package/dist/node_modules/lodash-es/_baseClone.js.map +1 -1
  91. package/dist/node_modules/lodash-es/_getSymbols.js +1 -1
  92. package/dist/node_modules/lodash-es/_getSymbols.js.map +1 -1
  93. package/dist/node_modules/lodash-es/_memoizeCapped.js +1 -1
  94. package/dist/node_modules/lodash-es/_memoizeCapped.js.map +1 -1
  95. package/dist/node_modules/lodash-es/_stringToPath.js +1 -1
  96. package/dist/node_modules/lodash-es/_stringToPath.js.map +1 -1
  97. package/dist/node_modules/property-expr/index.js +1 -1
  98. package/dist/node_modules/property-expr/index.js.map +1 -1
  99. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +1 -1
  100. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -1
  101. package/dist/node_modules/react-property/lib/index.js +1 -1
  102. package/dist/node_modules/react-property/lib/index.js.map +1 -1
  103. package/dist/node_modules/react-syntax-highlighter/dist/esm/create-element.js +1 -1
  104. package/dist/node_modules/react-syntax-highlighter/dist/esm/create-element.js.map +1 -1
  105. package/dist/node_modules/react-syntax-highlighter/dist/esm/highlight.js +1 -1
  106. package/dist/node_modules/react-syntax-highlighter/dist/esm/highlight.js.map +1 -1
  107. package/dist/node_modules/react-toastify/dist/index.mjs.js +1 -1
  108. package/dist/node_modules/react-toastify/dist/index.mjs.js.map +1 -1
  109. package/dist/node_modules/style-to-js/cjs/index.js +1 -1
  110. package/dist/node_modules/style-to-js/cjs/index.js.map +1 -1
  111. package/dist/node_modules/style-to-object/cjs/index.js +1 -1
  112. package/dist/node_modules/style-to-object/cjs/index.js.map +1 -1
  113. package/dist/node_modules/tiny-case/index.js +1 -1
  114. package/dist/node_modules/tiny-case/index.js.map +1 -1
  115. package/dist/node_modules/tippy.js/dist/tippy.esm.js +1 -1
  116. package/dist/node_modules/tippy.js/dist/tippy.esm.js.map +1 -1
  117. package/dist/node_modules/toposort/index.js +1 -1
  118. package/dist/node_modules/toposort/index.js.map +1 -1
  119. package/dist/node_modules/tslib/tslib.es6.js +1 -1
  120. package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
  121. package/dist/node_modules/yup/index.esm.js +1 -1
  122. package/dist/node_modules/yup/index.esm.js.map +1 -1
  123. package/dist/src/components/InfoForm/InfoForm.js +1 -1
  124. package/dist/src/components/InfoForm/InfoForm.js.map +1 -1
  125. package/dist/src/components/JsonInput/JsonInput.js +1 -1
  126. package/dist/src/components/JsonInput/JsonInput.js.map +1 -1
  127. package/dist/src/components/LivePreview/LivePreview.js +1 -1
  128. package/dist/src/components/LivePreview/LivePreview.js.map +1 -1
  129. package/dist/src/components/MethodAccordion/MethodAccordion.js +1 -1
  130. package/dist/src/components/MethodAccordion/MethodAccordion.js.map +1 -1
  131. package/dist/src/components/SVGLoader/SVGLoader.js +1 -1
  132. package/dist/src/components/SVGLoader/SVGLoader.js.map +1 -1
  133. package/dist/src/components/Tooltip/Tooltip.js +1 -1
  134. package/dist/src/components/Tooltip/Tooltip.js.map +1 -1
  135. package/dist/src/components/table/table.js +1 -1
  136. package/dist/src/components/table/table.js.map +1 -1
  137. package/dist/src/components/table/tags-table.js +1 -1
  138. package/dist/src/components/table/tags-table.js.map +1 -1
  139. package/dist/src/constants/methods.constant.js +1 -1
  140. package/dist/src/constants/methods.constant.js.map +1 -1
  141. package/dist/src/context/SectionToggleContext.js +1 -1
  142. package/dist/src/context/SectionToggleContext.js.map +1 -1
  143. package/dist/src/helpers/docs.helper.js +1 -1
  144. package/dist/src/helpers/docs.helper.js.map +1 -1
  145. package/dist/src/helpers/layout.helper.js +1 -1
  146. package/dist/src/helpers/layout.helper.js.map +1 -1
  147. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js +1 -1
  148. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js.map +1 -1
  149. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js +1 -1
  150. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js.map +1 -1
  151. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js +1 -1
  152. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js.map +1 -1
  153. package/dist/src/layout/docsComponents/DocsContent/OverviewPage/index.js +1 -1
  154. package/dist/src/layout/docsComponents/DocsContent/OverviewPage/index.js.map +1 -1
  155. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js +1 -1
  156. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js.map +1 -1
  157. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js +1 -1
  158. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js.map +1 -1
  159. package/dist/src/layout/docsLayout.js +1 -1
  160. package/dist/src/layout/docsLayout.js.map +1 -1
  161. package/dist/src/layout/layout.js +1 -1
  162. package/dist/src/layout/layout.js.map +1 -1
  163. package/dist/src/utils/index.js +1 -1
  164. package/dist/src/utils/index.js.map +1 -1
  165. package/dist/src/validator/form.scheme.js +1 -1
  166. package/dist/src/validator/form.scheme.js.map +1 -1
  167. package/dist/styles.css +773 -773
  168. package/index.ts +2 -0
  169. package/package.json +4 -9
  170. package/rollup.config.js +37 -0
  171. package/src/assets/icons/AddRow.svg +3 -0
  172. package/src/assets/icons/ApiIcon.svg +12 -0
  173. package/src/assets/icons/ArrowBack.svg +3 -0
  174. package/src/assets/icons/BookIcon.svg +6 -0
  175. package/src/assets/icons/CheckMarkSquare.svg +5 -0
  176. package/src/assets/icons/CloseIcon.svg +4 -0
  177. package/src/assets/icons/CopySticker.svg +6 -0
  178. package/src/assets/icons/DeleteIcon.svg +3 -0
  179. package/src/assets/icons/DownArrow.svg +3 -0
  180. package/src/assets/icons/EditIcon.svg +3 -0
  181. package/src/assets/icons/FilterIcon.svg +4 -0
  182. package/src/assets/icons/Plus.svg +5 -0
  183. package/src/assets/icons/PlusSquare.svg +3 -0
  184. package/src/assets/icons/RequestOption.svg +5 -0
  185. package/src/assets/icons/UpArrow.svg +3 -0
  186. package/src/assets/icons/arrow-down.svg +3 -0
  187. package/src/assets/icons/arrow-up.svg +10 -0
  188. package/src/assets/icons/arrowDownGray.svg +3 -0
  189. package/src/assets/icons/arrowRightGray.svg +3 -0
  190. package/src/assets/icons/close-circle.svg +5 -0
  191. package/src/assets/icons/copy.svg +4 -0
  192. package/src/assets/icons/deleteOutlinedIcon.svg +8 -0
  193. package/src/assets/icons/document.svg +6 -0
  194. package/src/assets/icons/eye.svg +4 -0
  195. package/src/assets/icons/index.ts +27 -0
  196. package/src/assets/icons/infoIcon.svg +5 -0
  197. package/src/assets/icons/newCopyIcon.svg +4 -0
  198. package/src/assets/icons/searchIcon.svg +4 -0
  199. package/src/components/Chips/Chips.tsx +87 -0
  200. package/src/components/InfoForm/InfoForm.tsx +432 -0
  201. package/src/components/JsonInput/JsonInput.tsx +149 -0
  202. package/src/components/LivePreview/LivePreview.tsx +224 -0
  203. package/src/components/MethodAccordion/MethodAccordion.tsx +1070 -0
  204. package/src/components/SVGLoader/SVGLoader.tsx +96 -0
  205. package/src/components/SectionHead/SectionHead.tsx +22 -0
  206. package/src/components/SimpleLabelValue/SimpleLabelValue.tsx +31 -0
  207. package/src/components/SimpleLabelValue/index.ts +1 -0
  208. package/src/components/Tooltip/Tooltip.tsx +85 -0
  209. package/src/components/dialog/dialog.ts +61 -0
  210. package/src/components/dialog/index.tsx +88 -0
  211. package/src/components/table/table.tsx +508 -0
  212. package/src/components/table/tags-table.tsx +348 -0
  213. package/src/constants/index.ts +95 -0
  214. package/src/constants/methods.constant.ts +26 -0
  215. package/src/constants/regex.ts +7 -0
  216. package/src/context/SectionToggleContext.tsx +121 -0
  217. package/src/global.d.ts +13 -0
  218. package/src/helpers/docs.helper.ts +42 -0
  219. package/src/helpers/layout.helper.ts +290 -0
  220. package/src/helpers/methodAccordion.helper.ts +20 -0
  221. package/src/index.ts +2 -0
  222. package/src/layout/docsComponents/Codebox/Codebox.tsx +61 -0
  223. package/src/layout/docsComponents/DocsAside/DocsAside.tsx +112 -0
  224. package/src/layout/docsComponents/DocsContent/DocsContent.tsx +51 -0
  225. package/src/layout/docsComponents/DocsContent/EndpointPage/index.tsx +307 -0
  226. package/src/layout/docsComponents/DocsContent/OverviewPage/index.tsx +223 -0
  227. package/src/layout/docsComponents/DocsHeader/DocsHeader.tsx +188 -0
  228. package/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.tsx +229 -0
  229. package/src/layout/docsComponents/index.tsx +28 -0
  230. package/src/layout/docsLayout.tsx +123 -0
  231. package/src/layout/layout.module.css +65 -0
  232. package/src/layout/layout.tsx +177 -0
  233. package/src/types/docsLayout.type.ts +7 -0
  234. package/src/types/index.ts +28 -0
  235. package/src/types/layout.type.ts +32 -0
  236. package/src/types/openApi.ts +109 -0
  237. package/src/types/transformedOpenApi.ts +52 -0
  238. package/src/utils/index.ts +15 -0
  239. package/src/validator/form.scheme.ts +96 -0
  240. package/tsconfig.json +33 -0
@@ -0,0 +1,348 @@
1
+ import { useEffect, useState } from 'react'
2
+ import './style.scss'
3
+ import _styles from '../InfoForm/InfoForm.module.scss'
4
+ import { Button, Input, TextArea } from 'digitinary-ui'
5
+ import Tooltip from '../Tooltip/Tooltip'
6
+ import SVGLoader from '../SVGLoader/SVGLoader'
7
+ import { AddRow, EditIcon, DeleteIcon } from '../../assets/icons'
8
+ import styles from '../MethodAccordion/MethodAccordion.module.scss'
9
+ import { useFormik } from 'formik'
10
+ import * as yup from 'yup'
11
+ import regex from '../../constants/regex'
12
+
13
+ const TagsTable = ({ id, headCells, data, isFormOpen, setIsFormOpen, saveNewRow, readOnly }) => {
14
+ const [text, setText] = useState('')
15
+ const [externalDesc, setExternalDesc] = useState('')
16
+ const [externalUrl, setExternalUrl] = useState('')
17
+ const [tooltipRef, setTooltipRef] = useState(null)
18
+ const [externalTooltipRefs, setExternalTooltipRefs] = useState(null)
19
+ const { values, errors, setFieldValue, isValid, submitForm, resetForm,dirty } = useFormik({
20
+ validateOnMount: true,
21
+ initialValues: {
22
+ name: '',
23
+ description: '',
24
+ externalDocs: {
25
+ url: '',
26
+ description: '',
27
+ },
28
+ },
29
+ validationSchema: yup.object().shape({
30
+ name: yup.string().trim().required('Tag name is required'),
31
+ description: yup.string().optional(),
32
+ externalDocs: yup
33
+ .object()
34
+ .shape({
35
+ url: yup
36
+ .string()
37
+ .trim()
38
+ .matches(regex.urlRegex, 'Invalid URL')
39
+ .when('description', (description, schema) => {
40
+ return description?.at(0)
41
+ ? schema.required('URL is required when description is provided')
42
+ : schema.optional()
43
+ }),
44
+ description: yup.string().trim().optional(),
45
+ })
46
+ .optional(),
47
+ }),
48
+ onSubmit: (values) => {
49
+ saveNewRow(values)
50
+ setText('')
51
+ resetForm()
52
+ setIsFormOpen(false)
53
+ },
54
+ validateOnChange: true,
55
+ })
56
+
57
+ return (
58
+ <div className="tableSectionContainer">
59
+ <div className="tableContainer">
60
+ <table id={id || ''} className={`table borderRadiusTop borderRadiusBottom`}>
61
+ <thead className="tableHead">
62
+ <tr>
63
+ {headCells?.map((headCell) => (
64
+ <th
65
+ key={headCell.id}
66
+ className={`tableHeadCell ${headCell.classes || ''}`}
67
+ style={{ width: headCell.width, minWidth: headCell.minWidth }}
68
+ >
69
+ <div
70
+ className="headContainer"
71
+ data-id={`${
72
+ typeof headCell.label === 'string'
73
+ ? headCell.label.toUpperCase().replace(/[^a-zA-Z0-9]+/g, '_')
74
+ : 'UNKNOWN_LABEL'
75
+ }_COLUMN`}
76
+ >
77
+ {headCell.label}
78
+ </div>
79
+ </th>
80
+ ))}
81
+ </tr>
82
+ </thead>
83
+ <tbody className="tableBody" data-id="TABLE_BODY">
84
+ {data?.map((row, rowIndex) => {
85
+ return (
86
+ <tr key={rowIndex} data-i={rowIndex} className={`row`}>
87
+ {headCells?.map((headCell) => {
88
+ const cellContent = row[headCell.id] !== '_' && (
89
+ <div
90
+ data-id="TEXT_DESCRIPTION"
91
+ className="tableData"
92
+ style={{
93
+ width: headCell.width,
94
+ minWidth: headCell.minWidth,
95
+ }}
96
+ >
97
+ {row[headCell.id]}
98
+ </div>
99
+ )
100
+
101
+ return (
102
+ <td
103
+ key={headCell.id}
104
+ style={{
105
+ width: headCell.width,
106
+ minWidth: headCell.minWidth,
107
+ }}
108
+ >
109
+ {cellContent}
110
+ </td>
111
+ )
112
+ })}
113
+ </tr>
114
+ )
115
+ })}
116
+ {isFormOpen ? (
117
+ <tr key={''} data-i={''} className={`row`}>
118
+ <td key={'tag name'}>
119
+ <div data-id="TEXT_DESCRIPTION" className="tableData">
120
+ <Input
121
+ placeholder="Tag name"
122
+ size="large"
123
+ type="text"
124
+ maxLength={25}
125
+ onChange={(value) => {
126
+ !regex.basic.test(value) && setFieldValue('name', value)
127
+ }} // Pass the value directly
128
+ value={values.name} // Bind value to the state
129
+ disabled={readOnly}
130
+ />
131
+ </div>
132
+ </td>
133
+
134
+ <td key={'tagDescRequired'}>
135
+ <div data-id="TEXT_DESCRIPTION" className="tableData">
136
+ <div className={styles.paramDescContainer}>
137
+ <Tooltip
138
+ arrowWithBorder
139
+ placement="bottom-end"
140
+ type="function"
141
+ trigger="click"
142
+ delay={[0, 0]}
143
+ onCreate={(instance) => setTooltipRef(instance)}
144
+ onShow={() => {
145
+ setText(values.description || '') // Reset to current value when shown
146
+ }}
147
+ onHidden={() => {
148
+ setText(values.description || '') // Reset on close
149
+ }}
150
+ content={
151
+ <div className={_styles.editDescTooltipContent}>
152
+ <p className={_styles.editDescTooltipContent_header}>Description</p>
153
+ <TextArea
154
+ value={text || values.description}
155
+ disabled={readOnly}
156
+ maxLength={25}
157
+ placeholder="Describe Tag..."
158
+ onChange={(value) => {
159
+ if (value === '' || regex.ASCII.test(value)) setText(value)
160
+ }}
161
+ />
162
+ {!readOnly && (
163
+ <Button
164
+ className={_styles.editDescTooltipContent_btn}
165
+ variant="outlined"
166
+ size="small"
167
+ onClick={() => {
168
+ setFieldValue('description', text?.trim())
169
+ tooltipRef?.hide()
170
+ }}
171
+ disabled={!(text || values.description)?.trim()}
172
+ >
173
+ Apply
174
+ </Button>
175
+ )}
176
+ </div>
177
+ }
178
+ >
179
+ <Button
180
+ className={_styles.editDescBtn}
181
+ style={{ paddingLeft: 0 }}
182
+ variant="link"
183
+ color="action"
184
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
185
+ >
186
+ {readOnly ? 'View ' : 'Add '} Description
187
+ </Button>
188
+ </Tooltip>
189
+ </div>{' '}
190
+ </div>
191
+ </td>
192
+ <td key={'tagExternal'}>
193
+ <div className="tableData">
194
+ <div className={_styles.paramDescContainer}>
195
+ <Tooltip
196
+ arrowWithBorder
197
+ placement="bottom-end"
198
+ type="function"
199
+ trigger="click"
200
+ delay={[0, 0]}
201
+ onCreate={(instance) => setExternalTooltipRefs(instance)}
202
+ onShow={() => {
203
+ setExternalDesc(values.externalDocs.description || '')
204
+ setExternalUrl(values.externalDocs.url || '')
205
+ }}
206
+ onHidden={() => {
207
+ setExternalDesc(values.externalDocs.description || '')
208
+ setExternalUrl(values.externalDocs.url || '')
209
+ }}
210
+ content={
211
+ <div className={_styles.editDescTooltipContent}>
212
+ <p className={_styles.editDescTooltipContent_header}>
213
+ External Docs Description
214
+ </p>
215
+ <TextArea
216
+ placeholder="Describe External Doc..."
217
+ value={externalDesc || values.externalDocs.description}
218
+ disabled={readOnly}
219
+ maxLength={25}
220
+ onChange={(value) => {
221
+ if (value === '' || regex.ASCII.test(value)) setExternalDesc(value)
222
+ }}
223
+ />
224
+ <p className={_styles.editDescTooltipContent_header}>
225
+ External Docs Link
226
+ </p>
227
+ <TextArea
228
+ placeholder="External Docs Link..."
229
+ restrictedCharsRegex={regex.urlRegex}
230
+ value={externalUrl || values.externalDocs.url}
231
+ disabled={readOnly}
232
+ maxLength={200}
233
+ onChange={(value) => {
234
+ if (value === '' || regex.ASCII.test(value)) setExternalUrl(value)
235
+ }}
236
+ />
237
+ {!readOnly && (
238
+ <Button
239
+ className={_styles.editDescTooltipContent_btn}
240
+ variant="outlined"
241
+ size="small"
242
+ onClick={() => {
243
+ setFieldValue(`externalDocs`, {
244
+ description: externalDesc,
245
+ url: externalUrl,
246
+ })
247
+
248
+ externalTooltipRefs?.hide()
249
+ }}
250
+ disabled={
251
+ !(externalUrl || values.externalDocs.url)?.trim() ||
252
+ !regex.urlRegex.test(externalUrl || values.externalDocs.url)
253
+ }
254
+ >
255
+ Apply
256
+ </Button>
257
+ )}
258
+ </div>
259
+ }
260
+ >
261
+ {readOnly ? (
262
+ <a
263
+ className={_styles.editDescBtn}
264
+ variant="link"
265
+ color="action"
266
+ href={values.externalDocs?.url}
267
+ target="_blank"
268
+ >
269
+ {values?.externalDocs?.description
270
+ ? values?.externalDocs?.description?.substring(0, 12)
271
+ : '-'}
272
+ {values?.externalDocs?.description &&
273
+ values?.externalDocs?.description?.length > 12
274
+ ? '...'
275
+ : ''}
276
+ </a>
277
+ ) : (
278
+ <Button
279
+ className={_styles.editDescBtn}
280
+ variant="link"
281
+ color="action"
282
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
283
+ >
284
+ {readOnly ? 'View ' : 'Add '} External Docs Link
285
+ </Button>
286
+ )}
287
+ </Tooltip>
288
+ <div className={_styles.paramDescContainer_separator}></div>
289
+ {!readOnly && (
290
+ <Button
291
+ className={_styles.deleteParamBtn}
292
+ variant="link"
293
+ color="error"
294
+ endIcon={
295
+ <SVGLoader src={DeleteIcon} width="1.125rem" height="1.125rem" />
296
+ }
297
+ onClick={() => {
298
+ resetForm()
299
+ setText('')
300
+ setIsFormOpen(false)
301
+ }} // Correctly delete the new row
302
+ />
303
+ )}
304
+
305
+ {!readOnly && (
306
+ <Button
307
+ className={_styles.deleteParamBtn}
308
+ variant="link"
309
+ color="success"
310
+ disabled={!isValid || !dirty}
311
+ endIcon={<SVGLoader src={AddRow} width="0.125rem" height="0.125rem" />}
312
+ onClick={() => {
313
+ setText('')
314
+ submitForm()
315
+ }} // Save the new row when clicked
316
+ />
317
+ )}
318
+ </div>
319
+ </div>
320
+ </td>
321
+ </tr>
322
+ ) : (
323
+ <>
324
+ {!readOnly && (
325
+ <tr key={'addNew'} data-i={'addNew'} className={`row`}>
326
+ <td colSpan={5}>
327
+ <Button
328
+ variant="link"
329
+ color="primary"
330
+ onClick={() => {
331
+ setIsFormOpen((prev) => !prev)
332
+ }}
333
+ >
334
+ + Add Tag
335
+ </Button>
336
+ </td>
337
+ </tr>
338
+ )}
339
+ </>
340
+ )}
341
+ </tbody>
342
+ </table>
343
+ </div>
344
+ </div>
345
+ )
346
+ }
347
+
348
+ export default TagsTable
@@ -0,0 +1,95 @@
1
+ export const methodColorMapping = {
2
+ get: {
3
+ label: 'Get',
4
+ color: '#3A6CD1',
5
+ order: 1,
6
+ },
7
+ post: {
8
+ label: 'Post',
9
+ color: '#3AAA35',
10
+ order: 2,
11
+ },
12
+ put: {
13
+ label: 'Put',
14
+ color: '#FAAD14',
15
+ order: 3,
16
+ },
17
+ delete: {
18
+ label: 'Delete',
19
+ color: '#DA3F3F',
20
+ order: 4,
21
+ },
22
+ patch: {
23
+ label: 'Patch',
24
+ color: '#58E2C2',
25
+ order: 5,
26
+ },
27
+ options: {
28
+ label: 'Options',
29
+ color: '#495D97',
30
+ order: 6,
31
+ },
32
+ trace: {
33
+ label: 'Trace',
34
+ color: '#FFA28F',
35
+ order: 7,
36
+ },
37
+ head: {
38
+ label: 'Head',
39
+ color: '#9461C9',
40
+ order: 8,
41
+ },
42
+ }
43
+
44
+ export const tagsTableHeaders = [
45
+ {
46
+ id: 'tagName',
47
+ label: 'Tag Name',
48
+ sortable: false,
49
+ classes: 'requiredParam',
50
+ },
51
+ {
52
+ id: 'description',
53
+ label: 'Description',
54
+ sortable: false,
55
+ },
56
+ {
57
+ id: 'externalDocs',
58
+ label: 'External Docs',
59
+ sortable: false,
60
+ },
61
+ ]
62
+
63
+ export const paramsTableHeaders = [
64
+ {
65
+ id: 'paramName',
66
+ label: 'Parameter Name',
67
+ sortable: false,
68
+ required: true,
69
+ classes: 'requiredParam',
70
+ },
71
+ { id: 'paramType', label: 'In', sortable: false, classes: 'requiredParam' },
72
+ { id: 'schemaType', label: 'Schema-Type', sortable: false, classes: 'requiredParam' },
73
+ // { id: 'arraySchemaType', label: 'Array Schema Type', sortable: false },
74
+ { id: 'enum', label: 'Enum', sortable: false },
75
+ { id: 'required', label: 'Required', sortable: false, classes: 'requiredParam' },
76
+ { id: 'description', label: 'Description', sortable: false },
77
+ ]
78
+
79
+ export const httpStatusCodes = [
80
+ // 1xx: Informational responses
81
+ 100, 101, 102, 103,
82
+
83
+ // 2xx: Success
84
+ 200, 201, 202, 203, 204, 205, 206, 207, 208, 226,
85
+
86
+ // 3xx: Redirection
87
+ 300, 301, 302, 303, 304, 305, 306, 307, 308,
88
+
89
+ // 4xx: Client errors
90
+ 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418,
91
+ 421, 422, 423, 424, 425, 426, 428, 429, 431, 451,
92
+
93
+ // 5xx: Server errors
94
+ 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511,
95
+ ]
@@ -0,0 +1,26 @@
1
+ export type MethodOption = {
2
+ label: string
3
+ value: string
4
+ color: string
5
+ }
6
+
7
+ export const METHOD_OPTIONS: MethodOption[] = [
8
+ { label: 'Post', value: 'POST', color: '#10b981' },
9
+ { label: 'GET', value: 'GET', color: '#3b82f6' },
10
+ { label: 'Delete', value: 'DELETE', color: '#ef4444' },
11
+ { label: 'Put', value: 'PUT', color: '#f59e0b' },
12
+ { label: 'PATCH', value: 'PATCH', color: '#C0F4E8' },
13
+ { label: 'OPTIONS', value: 'OPTIONS', color: '#6b7280' },
14
+ { label: 'HEAD', value: 'HEAD', color: '#8b5cf6' },
15
+ { label: 'TRACE', value: 'TRACE', color: '#ec4899' },
16
+ ]
17
+
18
+ export const METHOD_OPTIONS_CONFIG = [
19
+ {
20
+ list: METHOD_OPTIONS.map((method) => ({
21
+ labelConfig: { color: method.color, text: method.label },
22
+ value: method.value,
23
+ data: method,
24
+ })),
25
+ },
26
+ ]
@@ -0,0 +1,7 @@
1
+ const regex = {
2
+ basic: /[^a-zA-Z0-9-_ ]/, // not (alphanumeric + underscore + dash + space)
3
+ restrictNone: /^$/, // restrict nothing
4
+ ASCII: /^[\x00-\x7F]+$/,
5
+ urlRegex: /^(https?:\/\/|www\.)[a-zA-Z0-9-]+(\.[a-zA-Z]{2,})+(\/[^\s]*)?$/,
6
+ }
7
+ export default regex
@@ -0,0 +1,121 @@
1
+ import React, { createContext, useContext, useState, ReactNode, useMemo, useCallback } from 'react'
2
+
3
+ export enum SectionEnum {
4
+ OVERVIEW = 'overview',
5
+ RESOURCE = 'resource',
6
+ API_SECTION = 'apiSection',
7
+ TAG_SECTION = 'tagSection',
8
+ ENDPOINTS_SECTION = 'endpointsSection',
9
+ }
10
+
11
+ type SectionKey =
12
+ | `api_${string}_${SectionEnum}`
13
+ | `api_${string}_${SectionEnum}_${string | number}`
14
+ | `api_${string}_${SectionEnum}_${string | number}_${string | number}`
15
+ type ExpandedSections = Record<SectionKey, boolean>
16
+
17
+ interface SectionToggleContextType {
18
+ expandedSections: ExpandedSections
19
+ toggleSection: (
20
+ apiId: string,
21
+ sections: ToggleSectionDescriptor[],
22
+ options?: ToggleOptions
23
+ ) => void
24
+ generateSectionKey: ({ apiId, type, index, id }: GenerateSectionKeyParams) => SectionKey
25
+ }
26
+
27
+ interface SectionToggleProviderProps {
28
+ children: ReactNode
29
+ }
30
+
31
+ export interface ToggleSectionDescriptor {
32
+ type: SectionEnum
33
+ index?: string | number
34
+ setTo?: boolean
35
+ id?: string
36
+ }
37
+
38
+ export interface ToggleOptions {
39
+ resetOthers?: boolean
40
+ filterKeys?: SectionEnum[]
41
+ }
42
+
43
+ interface GenerateSectionKeyParams {
44
+ apiId: string
45
+ type: SectionEnum
46
+ index?: string | number
47
+ id?: string | number
48
+ }
49
+
50
+ const SectionToggleContext = createContext<SectionToggleContextType | null>(null)
51
+
52
+ export const useSectionToggle = () => {
53
+ const context = useContext(SectionToggleContext)
54
+ if (!context) {
55
+ throw new Error('useSectionToggle must be used within SectionToggleProvider')
56
+ }
57
+ return context
58
+ }
59
+
60
+ export const SectionToggleProvider = ({ children }: SectionToggleProviderProps) => {
61
+ const [expandedSections, setExpandedSections] = useState<ExpandedSections>({})
62
+
63
+ const generateSectionKey = ({ apiId, type, index, id }: GenerateSectionKeyParams): SectionKey => {
64
+ let key = `api_${apiId}_${type}`
65
+
66
+ if (index !== undefined) key += `_${index}`
67
+ if (id !== undefined) key += `_${id}`
68
+
69
+ return key as SectionKey
70
+ }
71
+
72
+ const toggleSection = useCallback(
73
+ (apiId: string, sections: ToggleSectionDescriptor[], options: ToggleOptions = {}) => {
74
+ const { resetOthers = false, filterKeys = [] } = options
75
+
76
+ const sectionIds = sections.map(({ type, index, id }) =>
77
+ generateSectionKey({ apiId, type, index, id })
78
+ )
79
+
80
+ const sectionToggles = Object.fromEntries(
81
+ sections.map(({ type, index, setTo, id }) => {
82
+ const sectionId = generateSectionKey({ apiId, type, index, id })
83
+ const currentValue = expandedSections[sectionId]
84
+
85
+ return [sectionId, setTo !== undefined ? setTo : !currentValue]
86
+ })
87
+ )
88
+
89
+ if (resetOthers && filterKeys.length > 0) {
90
+ const filtered = Object.fromEntries(
91
+ Object.entries(expandedSections).filter(([key]) => {
92
+ const shouldKeep = key.includes(apiId) && !filterKeys.some((k) => key.includes(k))
93
+ return shouldKeep || sectionIds.includes(key as SectionKey)
94
+ })
95
+ )
96
+ const newState = { ...filtered, ...sectionToggles }
97
+ setExpandedSections(newState)
98
+ } else {
99
+ setExpandedSections((prev) => {
100
+ const next = { ...prev, ...sectionToggles }
101
+
102
+ return next
103
+ })
104
+ }
105
+ },
106
+ [expandedSections]
107
+ )
108
+
109
+ const contextValue = useMemo(
110
+ () => ({
111
+ expandedSections,
112
+ toggleSection,
113
+ generateSectionKey,
114
+ }),
115
+ [expandedSections, toggleSection]
116
+ )
117
+
118
+ return (
119
+ <SectionToggleContext.Provider value={contextValue}>{children}</SectionToggleContext.Provider>
120
+ )
121
+ }
@@ -0,0 +1,13 @@
1
+ declare module '*.module.css' {
2
+ const classes: { [key: string]: string }
3
+ export default classes
4
+ }
5
+ declare module '*.module.scss' {
6
+ const classes: { [key: string]: string }
7
+ export default classes
8
+ }
9
+
10
+ declare module '*.svg' {
11
+ const src: string
12
+ export default src
13
+ }
@@ -0,0 +1,42 @@
1
+ import { ApiSpecModel } from '@entities/index'
2
+ import { HTTPMethod, OpenAPIFile } from '@entities/openApi'
3
+ import { nanoid } from 'nanoid'
4
+ import { OverviewData, TagData } from 'src/layout/docsLayout'
5
+
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
11
+
12
+ const groupedPathsByTags: Record<string, TagData[]> = { default: [] }
13
+ const validTags = new Set(parsedOpenApi?.tags?.map(({ name }) => name) || [])
14
+
15
+ for (const [path, methods] of Object.entries(parsedOpenApi.paths)) {
16
+ for (const [method, methodData] of Object.entries(methods)) {
17
+ const entry = { ...methodData, method: method as HTTPMethod, path }
18
+ const resourceTags = methodData.tags ?? []
19
+
20
+ const matchedTags = resourceTags.filter((tag) => validTags.has(tag))
21
+
22
+ if (matchedTags.length > 0) {
23
+ matchedTags.forEach((tag) => {
24
+ if (!groupedPathsByTags[tag]) groupedPathsByTags[tag] = []
25
+ groupedPathsByTags[tag].push({ ...entry, id: nanoid(8) } as TagData)
26
+ })
27
+ } else {
28
+ groupedPathsByTags.default.push({ ...entry, id: nanoid(8) } as TagData)
29
+ }
30
+ }
31
+ }
32
+
33
+ return {
34
+ ...parsedOpenApi.info,
35
+ apiSpecId: api.apiSpecId,
36
+ contextPath: api.contextPath,
37
+ associatedProduct: api.associatedProduct,
38
+ apiVersions: api.apiVersions,
39
+ tags: groupedPathsByTags,
40
+ servers: parsedOpenApi.servers,
41
+ }
42
+ }