@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,188 @@
1
+ import React, { useState, useRef } from 'react'
2
+ import { Button, Size, Input } from 'digitinary-ui'
3
+ import SVGLoader from '../../../components/SVGLoader/SVGLoader'
4
+ import {
5
+ FilterIcon,
6
+ BookIcon,
7
+ ApiIcon,
8
+ SearchIcon,
9
+ UpArrowIcon,
10
+ DownArrowIcon,
11
+ } from '../../../assets/icons'
12
+ import Tooltip from '../../../components/Tooltip/Tooltip'
13
+ import CommonDialog from '../../../components/dialog/index'
14
+ import { METHOD_OPTIONS } from '../../../constants/methods.constant'
15
+ import styles from './DocsHeader.module.scss'
16
+ import { OverviewData } from '../../../../src/layout/docsLayout'
17
+
18
+ const DocsHeader = ({
19
+ transformedOpenApis,
20
+ updateFilteredData,
21
+ }: {
22
+ transformedOpenApis: OverviewData[]
23
+ updateFilteredData: (filteredItems: OverviewData[], isReset?: boolean) => void
24
+ }) => {
25
+ const [showSearchFilter, setShowSearchFilter] = useState<boolean>(false)
26
+ const [apiName, setApiName] = useState<string>('')
27
+ const [selectedMethods, setSelectedMethods] = useState<any[]>([])
28
+ const [isMethodDropdownOpen, setIsMethodDropdownOpen] = useState<boolean>(false)
29
+
30
+ const handleOpenSearchFilter = (): void => {
31
+ setShowSearchFilter(true)
32
+ }
33
+
34
+ const handleCloseSearchFilter = (): void => {
35
+ setShowSearchFilter(false)
36
+ setIsMethodDropdownOpen(false)
37
+ }
38
+
39
+ const handleApplyFilters = (): void => {
40
+ // Reset: no filters applied
41
+ if (!apiName?.trim() && (!selectedMethods || selectedMethods.length === 0)) {
42
+ updateFilteredData(transformedOpenApis, true)
43
+ setShowSearchFilter(false)
44
+ return
45
+ }
46
+
47
+ let filteredItems = [...transformedOpenApis]
48
+
49
+ // Filter by API name
50
+ if (apiName?.trim()) {
51
+ const lowerApiName = apiName.toLowerCase()
52
+ filteredItems = filteredItems.filter((api) => api.title.toLowerCase().includes(lowerApiName))
53
+ }
54
+
55
+ // Filter by selected HTTP methods
56
+ if (selectedMethods?.length) {
57
+ filteredItems = filteredItems.filter((api) => {
58
+ const allMethods = Object.values(api.tags || {})
59
+ .flat()
60
+ .map((endpoint: any) => endpoint.method?.toLowerCase())
61
+
62
+ return selectedMethods.some((method) => allMethods.includes(method.toLowerCase()))
63
+ })
64
+ }
65
+
66
+ updateFilteredData(filteredItems)
67
+ setShowSearchFilter(false)
68
+ }
69
+
70
+ const handleCheckMethod = (e, method: (typeof METHOD_OPTIONS)[0]) => {
71
+ const {
72
+ target: { checked },
73
+ } = e
74
+ if (checked) {
75
+ setSelectedMethods((prev) => [...prev, method.value])
76
+ } else {
77
+ if (selectedMethods.includes(method.value)) {
78
+ setSelectedMethods((prev) => prev.filter((_m) => _m != method.value))
79
+ }
80
+ }
81
+ }
82
+
83
+ return (
84
+ <>
85
+ <header className={styles.api_docs_header}>
86
+ <div className={styles.header_content}>
87
+ <Button
88
+ variant="outlined"
89
+ size="small"
90
+ className={styles.search_filter_btn}
91
+ onClick={handleOpenSearchFilter}
92
+ >
93
+ Search & Filter
94
+ <SVGLoader src={FilterIcon} />
95
+ </Button>
96
+ <div className={styles.nav_buttons}>
97
+ <Tooltip
98
+ placement="bottom"
99
+ offset={[10, 5]}
100
+ delay={[0, 0]}
101
+ className="guide-tooltip"
102
+ content={<div>Coming Soon</div>}
103
+ >
104
+ <Button variant="outlined" size="small" className="guide-btn" disabled={true}>
105
+ <SVGLoader src={BookIcon} />
106
+ GUIDES
107
+ </Button>
108
+ </Tooltip>
109
+ <Button variant="outlined" size="small" className={styles.api_btn}>
110
+ <SVGLoader src={ApiIcon} /> &nbsp; API reference
111
+ </Button>
112
+ </div>
113
+ </div>
114
+ </header>
115
+ <CommonDialog
116
+ size="sm"
117
+ open={showSearchFilter}
118
+ onClose={handleCloseSearchFilter}
119
+ icon={false}
120
+ withClose={false}
121
+ noActions
122
+ content={
123
+ <div className={`search-filter-form ${isMethodDropdownOpen ? 'expanded' : ''}`}>
124
+ <div className="search-filter-form__header">
125
+ <p className="search-filter-form__header__title">Search & Filter</p>
126
+ </div>
127
+ <Input
128
+ className="name-input"
129
+ placeholder="Search by API name"
130
+ value={apiName}
131
+ onChange={(value) => setApiName(value as string)}
132
+ size={Size.Medium}
133
+ clearable
134
+ endAdornment={<SVGLoader src={SearchIcon} />}
135
+ />
136
+ <div className="method-container">
137
+ <label>Method</label>
138
+ {/* <SelectGroup
139
+ isMultiple={true}
140
+ size={Size.Medium}
141
+ placeholder="Select Method"
142
+ value={selectedMethods}
143
+ onChange={(value) => setSelectedMethods(value || [])}
144
+ options={[
145
+
146
+ ]}
147
+ withSearch={false}
148
+ className="method-select custom-select-border"
149
+ /> */}
150
+ <div className="typeDdl" onClick={() => setIsMethodDropdownOpen((prev) => !prev)}>
151
+ <span>Select Method</span>
152
+ <SVGLoader src={!isMethodDropdownOpen ? DownArrowIcon : UpArrowIcon} />
153
+ </div>
154
+ {isMethodDropdownOpen && (
155
+ <div className="methodList">
156
+ {METHOD_OPTIONS.map((_m) => (
157
+ <div className="method-item">
158
+ <input
159
+ type="checkbox"
160
+ className="agreement-checkbox"
161
+ checked={selectedMethods.includes(_m.value)}
162
+ onChange={(e) => handleCheckMethod(e, _m)}
163
+ />
164
+ <span style={{ color: _m.color }}>{_m.label}</span>
165
+ </div>
166
+ ))}
167
+ </div>
168
+ )}
169
+ </div>
170
+ <div className="button-container">
171
+ <Button
172
+ variant="contained"
173
+ color="primary"
174
+ size="large"
175
+ onClick={handleApplyFilters}
176
+ className="dialog-submit-btn"
177
+ >
178
+ Apply
179
+ </Button>
180
+ </div>
181
+ </div>
182
+ }
183
+ />
184
+ </>
185
+ )
186
+ }
187
+
188
+ export default DocsHeader
@@ -0,0 +1,229 @@
1
+ import './style.scss'
2
+ import React, { useEffect, useRef } from 'react'
3
+ import SVGLoader from '../../../components/SVGLoader/SVGLoader'
4
+ import { arrowDownGray, arrowRightGray, document, eye } from '../../../assets/icons'
5
+ import { EndpointData, OverviewData } from 'src/layout/docsLayout'
6
+ import { SectionEnum, useSectionToggle } from '../../../../src/context/SectionToggleContext'
7
+
8
+ const DocsSideMenuTree = ({
9
+ apis,
10
+ setActiveItemData,
11
+ isFirstApiExpanded,
12
+ setIsFirstApiExpanded,
13
+ setActiveType,
14
+ canSelectFirstApi,
15
+ canFocusSection,
16
+ setCanFocusSection,
17
+ activeApiId,
18
+ setCanSelectFirstApi,
19
+ }: {
20
+ apis: OverviewData[]
21
+ setActiveItemData: React.Dispatch<React.SetStateAction<OverviewData | EndpointData>>
22
+ activeItemData: OverviewData | EndpointData
23
+ isFirstApiExpanded: boolean
24
+ setIsFirstApiExpanded: React.Dispatch<React.SetStateAction<boolean>>
25
+ setActiveType: React.Dispatch<React.SetStateAction<'OVERVIEW' | 'ENDPOINT'>>
26
+ activeType: 'OVERVIEW' | 'ENDPOINT'
27
+ canSelectFirstApi?: boolean
28
+ canFocusSection: boolean
29
+ setCanFocusSection: React.Dispatch<React.SetStateAction<boolean>>
30
+ activeApiId: string
31
+ setCanSelectFirstApi: React.Dispatch<React.SetStateAction<boolean>>
32
+ }) => {
33
+ const { expandedSections, toggleSection, generateSectionKey } = useSectionToggle()
34
+ const sectionRefs = useRef<Record<string, HTMLDivElement | null>>({})
35
+
36
+ // Auto-expand first API only once
37
+ useEffect(() => {
38
+ if (canSelectFirstApi || !apis?.length || !isFirstApiExpanded) return
39
+
40
+ const firstApi = apis[0]
41
+ toggleSection(firstApi?.apiSpecId, [
42
+ { type: SectionEnum.API_SECTION, setTo: true },
43
+ { type: SectionEnum.OVERVIEW, setTo: true },
44
+ ])
45
+
46
+ setActiveItemData(firstApi)
47
+ setActiveType('OVERVIEW')
48
+ setIsFirstApiExpanded(false)
49
+ }, [apis, isFirstApiExpanded])
50
+
51
+ useEffect(() => {
52
+ const activeApi = apis?.find((api) => api.apiSpecId === activeApiId)
53
+ if (activeApiId && apis.length > 0 && !!activeApi) {
54
+ toggleSection(activeApi.apiSpecId, [
55
+ { type: SectionEnum.API_SECTION, setTo: true },
56
+ { type: SectionEnum.OVERVIEW, setTo: true },
57
+ ])
58
+
59
+ setActiveItemData(activeApi)
60
+ setActiveType('OVERVIEW')
61
+ setIsFirstApiExpanded(false)
62
+ setCanSelectFirstApi(true)
63
+ setCanFocusSection(true)
64
+ }
65
+ }, [activeApiId, apis])
66
+
67
+ const renderEndpoints = (endpoints: EndpointData[], api: OverviewData) =>
68
+ endpoints.map((endpoint, index) => {
69
+ const key = generateSectionKey({
70
+ apiId: api.apiSpecId,
71
+ type: SectionEnum.RESOURCE,
72
+ id: endpoint.id,
73
+ })
74
+ const isExpanded = expandedSections[key]
75
+
76
+ return (
77
+ <div
78
+ key={index}
79
+ className={`api-docs-api-tree__endpoint api-docs-api-tree__endpoint--${endpoint.method.toLowerCase()}`}
80
+ onClick={() => {
81
+ if (!isExpanded) {
82
+ setActiveItemData({
83
+ ...endpoint,
84
+ api,
85
+ })
86
+ setActiveType('ENDPOINT')
87
+ toggleSection(api.apiSpecId, [{ type: SectionEnum.RESOURCE, id: endpoint.id }], {
88
+ resetOthers: true,
89
+ filterKeys: [SectionEnum.RESOURCE, SectionEnum.OVERVIEW],
90
+ })
91
+ }
92
+ }}
93
+ data-active={isExpanded}
94
+ >
95
+ <span className="api-docs-api-tree__endpoint-method">{endpoint.method}</span>
96
+ <span className="api-docs-api-tree__endpoint-name">{endpoint.path}</span>
97
+ </div>
98
+ )
99
+ })
100
+
101
+ const renderSubSection = (
102
+ tagName: string,
103
+ data: EndpointData[],
104
+ api: OverviewData,
105
+ sectionIndex: number
106
+ ) => {
107
+ const sectionKey = generateSectionKey({
108
+ apiId: api.apiSpecId,
109
+ type: SectionEnum.TAG_SECTION,
110
+ index: sectionIndex,
111
+ })
112
+ const isSectionExpanded = expandedSections[sectionKey]
113
+
114
+ return (
115
+ <div key={sectionKey} className="api-docs-api-tree__subsection">
116
+ <div
117
+ className="api-docs-api-tree__subsection-header"
118
+ onClick={() =>
119
+ toggleSection(api.apiSpecId, [{ type: SectionEnum.TAG_SECTION, index: sectionIndex }])
120
+ }
121
+ >
122
+ {isSectionExpanded ? (
123
+ <SVGLoader src={arrowDownGray} />
124
+ ) : (
125
+ <SVGLoader src={arrowRightGray} />
126
+ )}
127
+ <span className="api-docs-api-tree__subsection-title">{tagName}</span>
128
+ </div>
129
+
130
+ {isSectionExpanded && (
131
+ <div className="api-docs-api-tree__endpoints">{renderEndpoints(data, api)}</div>
132
+ )}
133
+ </div>
134
+ )
135
+ }
136
+
137
+ const renderApiSection = (api: OverviewData) => {
138
+ const sectionKey = generateSectionKey({ apiId: api.apiSpecId, type: SectionEnum.API_SECTION })
139
+ const endpointsKey = generateSectionKey({
140
+ apiId: api.apiSpecId,
141
+ type: SectionEnum.ENDPOINTS_SECTION,
142
+ })
143
+ const overviewKey = generateSectionKey({ apiId: api.apiSpecId, type: SectionEnum.OVERVIEW })
144
+
145
+ const isApiExpanded = expandedSections[sectionKey]
146
+ const isEndpointActive = expandedSections[endpointsKey]
147
+ const isOverviewExpanded = expandedSections[overviewKey]
148
+ // Scroll to the section if it's expanded
149
+ if (canFocusSection) {
150
+ const sectionEl = sectionRefs.current[api.apiSpecId]
151
+ sectionEl?.scrollIntoView({ behavior: 'smooth', block: 'start' })
152
+ setCanFocusSection(false)
153
+ }
154
+
155
+ return (
156
+ <div
157
+ key={api.apiSpecId}
158
+ className="api-docs-api-tree__section"
159
+ data-active={isEndpointActive || isOverviewExpanded}
160
+ ref={(el) => {
161
+ sectionRefs.current[api.apiSpecId] = el
162
+ }}
163
+ >
164
+ <div
165
+ className="api-docs-api-tree__section-header"
166
+ onClick={() => toggleSection(api.apiSpecId, [{ type: SectionEnum.API_SECTION }])}
167
+ >
168
+ {isApiExpanded ? <SVGLoader src={arrowDownGray} /> : <SVGLoader src={arrowRightGray} />}
169
+ <SVGLoader src={document} />
170
+ <span className="api-docs-api-tree__section-title">{api.title}</span>
171
+ </div>
172
+
173
+ {isApiExpanded && (
174
+ <>
175
+ <div
176
+ className="api-docs-api-tree__section__overview"
177
+ onClick={() => {
178
+ if (!isOverviewExpanded) {
179
+ toggleSection(api.apiSpecId, [{ type: SectionEnum.OVERVIEW }], {
180
+ resetOthers: true,
181
+ filterKeys: [SectionEnum.RESOURCE],
182
+ })
183
+ setActiveItemData(api)
184
+ setActiveType('OVERVIEW')
185
+ }
186
+ }}
187
+ data-active={isOverviewExpanded}
188
+ >
189
+ <SVGLoader src={eye} />
190
+ <span>Overview</span>
191
+ </div>
192
+
193
+ <div
194
+ className="api-docs-api-tree__section__endpoints"
195
+ onClick={() =>
196
+ toggleSection(api.apiSpecId, [{ type: SectionEnum.ENDPOINTS_SECTION }])
197
+ }
198
+ data-active={isEndpointActive && !isOverviewExpanded}
199
+ >
200
+ {expandedSections[endpointsKey] ? (
201
+ <SVGLoader src={arrowDownGray} />
202
+ ) : (
203
+ <SVGLoader src={arrowRightGray} />
204
+ )}
205
+ <span>Endpoints</span>
206
+ </div>
207
+
208
+ {expandedSections[endpointsKey] && (
209
+ <div className="api-docs-api-tree__subsections">
210
+ {Object.entries(api.tags)
211
+ .filter(([, endpoints]) => endpoints.length > 0)
212
+ .sort(([a], [b]) =>
213
+ a === 'default' ? 1 : b === 'default' ? -1 : a.localeCompare(b)
214
+ )
215
+ .map(([tagName, data], i) =>
216
+ renderSubSection(tagName, data as EndpointData[], api, i)
217
+ )}
218
+ </div>
219
+ )}
220
+ </>
221
+ )}
222
+ </div>
223
+ )
224
+ }
225
+
226
+ return <aside className="api-docs-api-tree">{apis.map((api) => renderApiSection(api))}</aside>
227
+ }
228
+
229
+ export default DocsSideMenuTree
@@ -0,0 +1,28 @@
1
+ import React from 'react'
2
+ import DocsHeader from './DocsHeader/DocsHeader'
3
+ import DocsSideMenuTree from './DocsSideMenuTree/DocsSideMenuTree'
4
+ import DocsContent from './DocsContent/DocsContent'
5
+ import DocsAside from './DocsAside/DocsAside'
6
+ import './index.scss'
7
+
8
+ type LayoutProps = {
9
+ children: React.ReactNode
10
+ }
11
+
12
+ type CompoundLayout = React.FC<LayoutProps> & {
13
+ DocsHeader: typeof DocsHeader
14
+ DocsSideMenuTree: typeof DocsSideMenuTree
15
+ DocsContent: typeof DocsContent
16
+ DocsAside: typeof DocsAside
17
+ }
18
+
19
+ const Layout = (({ children }: LayoutProps) => {
20
+ return <div className="api-docs-layout">{children}</div>
21
+ }) as CompoundLayout
22
+
23
+ Layout.DocsHeader = DocsHeader
24
+ Layout.DocsSideMenuTree = DocsSideMenuTree
25
+ Layout.DocsContent = DocsContent
26
+ Layout.DocsAside = DocsAside
27
+
28
+ export default Layout
@@ -0,0 +1,123 @@
1
+ import React, { JSX, useEffect, useRef, useState } from 'react'
2
+ import Layout from './docsComponents'
3
+ import { HTTPMethod, OpenAPIFile, Parameter, RequestBody, Responses } from '@entities/openApi'
4
+ import { transformOpenApiToDocs } from '../helpers/docs.helper'
5
+ import { ApiSpecModel } from '@entities/index'
6
+ import stableStringify from 'fast-json-stable-stringify'
7
+ import { SectionToggleProvider } from '../../src/context/SectionToggleContext'
8
+ import { ToastContainer } from 'react-toastify'
9
+
10
+ interface ILayoutProps {
11
+ apis?: ApiSpecModel[]
12
+ activeApiId?: string
13
+ onProductNavigate?: (productId: number) => void
14
+ }
15
+
16
+ export interface TagData {
17
+ id: string
18
+ method: HTTPMethod
19
+ path: string
20
+ tags: string[]
21
+ responses: Responses
22
+ summary?: string
23
+ description: string
24
+ parameters?: Parameter[]
25
+ requestBody?: RequestBody
26
+ }
27
+
28
+ export interface EndpointData extends TagData {
29
+ api: OverviewData
30
+ }
31
+
32
+ export interface OverviewData extends Omit<ApiSpecModel, 'metaData'> {
33
+ description: string
34
+ title: string
35
+ version: string
36
+ tags: Record<string, TagData[]>
37
+ servers: OpenAPIFile['servers']
38
+ }
39
+
40
+ function areEqual(prev: ILayoutProps, next: ILayoutProps): boolean {
41
+ return (
42
+ stableStringify(prev.apis ?? []) === stableStringify(next.apis ?? []) &&
43
+ prev.activeApiId === next.activeApiId
44
+ )
45
+ }
46
+
47
+ const DocsLayout = ({ apis, activeApiId, onProductNavigate }: ILayoutProps): JSX.Element => {
48
+ const [transformedOpenApis, setTransformedOpenApis] = useState<OverviewData[]>([])
49
+ const [isFirstApiExpanded, setIsFirstApiExpanded] = useState(true)
50
+ const [activeItemData, setActiveItemData] = useState<
51
+ OverviewData | EndpointData | Record<string, never>
52
+ >({})
53
+ const [activeType, setActiveType] = useState<'OVERVIEW' | 'ENDPOINT'>('OVERVIEW')
54
+ const allData = useRef([])
55
+ const [pending, setPending] = useState(true)
56
+ const [canSelectFirstApi, setCanSelectFirstApi] = useState(false)
57
+ const [canFocusSection, setCanFocusSection] = useState(false)
58
+
59
+ useEffect(() => {
60
+ if (transformedOpenApis.length === 0) {
61
+ setCanSelectFirstApi(!!activeApiId)
62
+ const t = structuredClone(apis)
63
+ ?.map((o3) => transformOpenApiToDocs(o3))
64
+ .sort((a, b) => a.title.toLowerCase().localeCompare(b.title.toLowerCase()))
65
+ setTransformedOpenApis(t)
66
+ allData.current = t
67
+ if (t.length > 0) {
68
+ setPending(false)
69
+ }
70
+ }
71
+ }, [apis])
72
+
73
+ const updateFilteredData = (filteredItems: OverviewData[], isReset = false) => {
74
+ if (isReset) {
75
+ setTransformedOpenApis(allData.current)
76
+ return
77
+ }
78
+ setTransformedOpenApis(filteredItems)
79
+ }
80
+
81
+ return (
82
+ <Layout>
83
+ <SectionToggleProvider>
84
+ <Layout.DocsHeader
85
+ transformedOpenApis={transformedOpenApis}
86
+ updateFilteredData={updateFilteredData}
87
+ />
88
+ {!pending && (
89
+ <Layout.DocsSideMenuTree
90
+ apis={transformedOpenApis}
91
+ setActiveItemData={setActiveItemData}
92
+ activeItemData={activeItemData as OverviewData | EndpointData}
93
+ isFirstApiExpanded={isFirstApiExpanded}
94
+ activeType={activeType}
95
+ setIsFirstApiExpanded={setIsFirstApiExpanded}
96
+ setActiveType={setActiveType}
97
+ canSelectFirstApi={canSelectFirstApi}
98
+ canFocusSection={canFocusSection}
99
+ setCanFocusSection={setCanFocusSection}
100
+ activeApiId={activeApiId}
101
+ setCanSelectFirstApi={setCanSelectFirstApi}
102
+ />
103
+ )}
104
+
105
+ {!pending && Object.keys(activeItemData).length > 0 && (
106
+ <Layout.DocsContent
107
+ data={activeItemData as OverviewData | EndpointData}
108
+ activeType={activeType}
109
+ setActiveItemData={setActiveItemData}
110
+ setActiveType={setActiveType}
111
+ onProductNavigate={onProductNavigate}
112
+ apis={transformedOpenApis}
113
+ />
114
+ )}
115
+ {activeType === 'ENDPOINT' && <Layout.DocsAside data={activeItemData as EndpointData} />}
116
+ </SectionToggleProvider>
117
+
118
+ <ToastContainer />
119
+ </Layout>
120
+ )
121
+ }
122
+
123
+ export default React.memo(DocsLayout, areEqual)
@@ -0,0 +1,65 @@
1
+ .docsLayout {
2
+ display: flex;
3
+ flex-direction: column;
4
+ overflow: hidden;
5
+ height: 100vh;
6
+ max-height: 100%;
7
+
8
+ .apiDocAlert {
9
+ border-radius: 0;
10
+ z-index: 3;
11
+ }
12
+
13
+ .layoutContainer {
14
+ display: grid;
15
+ grid-template-columns: 60% 40%;
16
+ width: 100%;
17
+ height: 100%;
18
+ max-width: 100%;
19
+ max-height: 100%;
20
+ overflow: hidden;
21
+
22
+ .editorSide {
23
+ background-color: #fff;
24
+ padding-bottom: 1.25rem;
25
+ .editorSectionHead_title {
26
+ position: sticky;
27
+ top: 0;
28
+ z-index: 1399 !important;
29
+ }
30
+ .editorSectionHead,
31
+ .editorSectionHead_title {
32
+ span {
33
+ width: 100%;
34
+ }
35
+
36
+ .editorSectionHead_content {
37
+ display: flex;
38
+ justify-content: space-between;
39
+ align-items: center;
40
+
41
+ button {
42
+ width: 6.25rem;
43
+ }
44
+ }
45
+ }
46
+ }
47
+
48
+ .livePreviewSide {
49
+ background-color: #f8f9fb;
50
+ padding: 1.25rem 1.875rem;
51
+ }
52
+
53
+ .docSide {
54
+ max-height: 100%;
55
+ overflow-y: overlay;
56
+ overflow-x: clip;
57
+ scroll-behavior: smooth;
58
+ }
59
+ }
60
+
61
+ :global(.textArea .inputField),
62
+ :global(.inputContainer .inputWrapper .innerInputContainer .input) {
63
+ padding-inline-end: 2.5rem;
64
+ }
65
+ }