@digi-frontend/dgate-api-documentation 1.0.31 → 1.0.32

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 (104) hide show
  1. package/.editorconfig +12 -12
  2. package/.prettierignore +7 -7
  3. package/.prettierrc +15 -15
  4. package/dist/{2e10bbdb265df50e.svg → 43595976d1fdccbf.svg} +4 -4
  5. package/dist/{8789eb84283ea95b.svg → 56dc416b683db280.svg} +5 -5
  6. package/dist/{bb8b87cace25e052.svg → 64efc2716808c4a4.svg} +3 -3
  7. package/dist/{d32ce84bbd78babd.svg → 72db3b05a96dd600.svg} +3 -3
  8. package/dist/{d501922060662842.svg → 844eba3f2e42a9eb.svg} +3 -3
  9. package/dist/_virtual/index3.js +1 -1
  10. package/dist/_virtual/index4.js +1 -1
  11. package/dist/_virtual/index5.js +1 -1
  12. package/dist/_virtual/index6.js +1 -1
  13. package/dist/{070dc6ecd197bc80.svg → a7568b270e175038.svg} +8 -8
  14. package/dist/{9bdff13f8d8fa48a.svg → af16a554be8c4d69.svg} +3 -3
  15. package/dist/{7f54eeb0bb2d1150.svg → b82c7612e73342f3.svg} +3 -3
  16. package/dist/node_modules/toposort/index.js +1 -1
  17. package/dist/node_modules/yup/index.esm.js +1 -1
  18. package/dist/src/assets/icons/AddRow.svg.js +1 -1
  19. package/dist/src/assets/icons/AddRow.svg.js.map +1 -1
  20. package/dist/src/assets/icons/CheckMarkSquare.svg.js +1 -1
  21. package/dist/src/assets/icons/CheckMarkSquare.svg.js.map +1 -1
  22. package/dist/src/assets/icons/CloseIcon.svg.js +1 -1
  23. package/dist/src/assets/icons/CloseIcon.svg.js.map +1 -1
  24. package/dist/src/assets/icons/DeleteIcon.svg.js +1 -1
  25. package/dist/src/assets/icons/DeleteIcon.svg.js.map +1 -1
  26. package/dist/src/assets/icons/DownArrow.svg.js +1 -1
  27. package/dist/src/assets/icons/DownArrow.svg.js.map +1 -1
  28. package/dist/src/assets/icons/EditIcon.svg.js +1 -1
  29. package/dist/src/assets/icons/EditIcon.svg.js.map +1 -1
  30. package/dist/src/assets/icons/UpArrow.svg.js +1 -1
  31. package/dist/src/assets/icons/UpArrow.svg.js.map +1 -1
  32. package/dist/src/assets/icons/deleteOutlinedIcon.svg.js +1 -1
  33. package/dist/src/assets/icons/deleteOutlinedIcon.svg.js.map +1 -1
  34. package/dist/src/components/Chips/Chips.js.map +1 -1
  35. package/dist/src/components/InfoForm/InfoForm.js +1 -1
  36. package/dist/src/components/InfoForm/InfoForm.js.map +1 -1
  37. package/dist/src/components/JsonInput/JsonInput.js.map +1 -1
  38. package/dist/src/components/LivePreview/LivePreview.js.map +1 -1
  39. package/dist/src/components/MethodAccordion/MethodAccordion.js.map +1 -1
  40. package/dist/src/components/SVGLoader/SVGLoader.js.map +1 -1
  41. package/dist/src/components/SectionHead/SectionHead.js.map +1 -1
  42. package/dist/src/components/SimpleLabelValue/SimpleLabelValue.js.map +1 -1
  43. package/dist/src/components/Tooltip/Tooltip.js.map +1 -1
  44. package/dist/src/components/dialog/index.js.map +1 -1
  45. package/dist/src/components/table/table.js.map +1 -1
  46. package/dist/src/components/table/tags-table.js +1 -1
  47. package/dist/src/components/table/tags-table.js.map +1 -1
  48. package/dist/src/constants/index.js.map +1 -1
  49. package/dist/src/constants/regex.js +1 -1
  50. package/dist/src/constants/regex.js.map +1 -1
  51. package/dist/src/helpers/layout.helper.js.map +1 -1
  52. package/dist/src/helpers/methodAccordion.helper.js.map +1 -1
  53. package/dist/src/layout/layout.js.map +1 -1
  54. package/dist/src/validator/form.scheme.js.map +1 -1
  55. package/dist/styles.css +335 -335
  56. package/package.json +43 -43
  57. package/rollup.config.js +35 -35
  58. package/src/assets/icons/AddRow.svg +3 -3
  59. package/src/assets/icons/CheckMarkSquare.svg +5 -5
  60. package/src/assets/icons/CloseIcon.svg +4 -4
  61. package/src/assets/icons/DeleteIcon.svg +3 -3
  62. package/src/assets/icons/DownArrow.svg +3 -3
  63. package/src/assets/icons/EditIcon.svg +3 -3
  64. package/src/assets/icons/UpArrow.svg +3 -3
  65. package/src/assets/icons/deleteOutlinedIcon.svg +8 -8
  66. package/src/assets/icons/index.ts +8 -8
  67. package/src/components/Chips/Chips.tsx +87 -87
  68. package/src/components/Chips/style.scss +147 -147
  69. package/src/components/InfoForm/InfoForm.module.scss +165 -165
  70. package/src/components/InfoForm/InfoForm.tsx +424 -426
  71. package/src/components/JsonInput/JsonInput.tsx +149 -149
  72. package/src/components/JsonInput/style.module.scss +133 -133
  73. package/src/components/LivePreview/LivePreview.module.scss +24 -24
  74. package/src/components/LivePreview/LivePreview.tsx +184 -184
  75. package/src/components/MethodAccordion/MethodAccordion.module.scss +338 -338
  76. package/src/components/MethodAccordion/MethodAccordion.tsx +515 -515
  77. package/src/components/SVGLoader/SVGLoader.tsx +94 -94
  78. package/src/components/SectionHead/SectionHead.scss +29 -29
  79. package/src/components/SectionHead/SectionHead.tsx +22 -22
  80. package/src/components/SimpleLabelValue/SimpleLabelValue.tsx +31 -31
  81. package/src/components/SimpleLabelValue/index.ts +1 -1
  82. package/src/components/SimpleLabelValue/style.scss +30 -30
  83. package/src/components/Tooltip/Tooltip.scss +133 -133
  84. package/src/components/Tooltip/Tooltip.tsx +85 -85
  85. package/src/components/_global.scss +337 -337
  86. package/src/components/dialog/dialog.ts +54 -54
  87. package/src/components/dialog/index.tsx +85 -85
  88. package/src/components/dialog/style.scss +104 -104
  89. package/src/components/table/style.scss +190 -190
  90. package/src/components/table/table.tsx +327 -327
  91. package/src/components/table/tags-table.tsx +348 -348
  92. package/src/constants/index.ts +93 -93
  93. package/src/constants/regex.ts +7 -7
  94. package/src/global.d.ts +13 -13
  95. package/src/helpers/layout.helper.ts +162 -162
  96. package/src/helpers/methodAccordion.helper.ts +19 -19
  97. package/src/index.ts +1 -1
  98. package/src/layout/layout.module.css +61 -61
  99. package/src/layout/layout.tsx +150 -150
  100. package/src/types/layout.type.ts +30 -30
  101. package/src/types/openApi.ts +108 -108
  102. package/src/types/transformedOpenApi.ts +52 -52
  103. package/src/validator/form.scheme.ts +70 -70
  104. package/tsconfig.json +33 -33
@@ -1,426 +1,424 @@
1
- import { useEffect, useState } from 'react'
2
- // @ts-ignore
3
- import { useFormikContext } from 'formik'
4
- import { Button, Input, TextArea } from 'digitinary-ui'
5
- import styles from './InfoForm.module.scss'
6
- import regex from '../../constants/regex'
7
- import { TransformedOpenApi } from '../../types/transformedOpenApi'
8
- import Tooltip from '../../components/Tooltip/Tooltip'
9
- import { DeleteIcon, deleteOutlinedIcon, EditIcon } from '../../assets/icons'
10
- import SVGLoader from '../../components/SVGLoader/SVGLoader'
11
- import CommonDialog from '../../components/dialog'
12
- import { tagsTableHeaders } from '../../constants/index'
13
- import TagsTable from '../../components/table/tags-table'
14
-
15
- const InfoForm = ({ readOnly }: { readOnly?: boolean }) => {
16
- const [tableData, setTableData] = useState([])
17
- const [tableRecords, setTableRecords] = useState()
18
- const [authType, setAuthType] = useState('')
19
- const [description, setDescription] = useState('')
20
- const [url, setURL] = useState('')
21
- const { values, setFieldValue, errors } = useFormikContext<TransformedOpenApi>()
22
- const [externalTooltipRefs, setExternalTooltipRefs] = useState<{ [key: number]: any }>({})
23
- const [tooltipRefs, setTooltipRefs] = useState<{ [key: number]: any }>({})
24
- const [selectedTagIndex, setSelectedTagIndex] = useState<number | null>(null)
25
- const [selectedTagName, setSelectedTagName] = useState<string | null>(null)
26
- const [openDeleteDialog, setOpenDeleteDialog] = useState(false)
27
- const [isFormOpen, setIsFormOpen] = useState(false)
28
-
29
- useEffect(() => {
30
- if (values && values.components && values.components.securitySchemes) {
31
- const authenticatorKeys = Object.keys(values.components.securitySchemes)
32
- if (authenticatorKeys.length) {
33
- setAuthType(
34
- values.components.securitySchemes[authenticatorKeys[0]].scheme ||
35
- values.components.securitySchemes[authenticatorKeys[0]].type
36
- )
37
- }
38
- }
39
- }, [])
40
-
41
- useEffect(() => {
42
- setTableRecords(generateTableRecords(tableData))
43
- }, [tableData])
44
-
45
- useEffect(() => {
46
- if (values.tags && values.tags.length) {
47
- setTableData(values.tags)
48
- }
49
- }, [values.tags])
50
-
51
- const confirmDeleteTag = () => {
52
- if (selectedTagIndex !== null) {
53
- setTableData((prev) => prev.filter((_, i) => i !== selectedTagIndex))
54
- setFieldValue(
55
- `tags`,
56
- values.tags?.filter((_, i) => i !== selectedTagIndex)
57
- )
58
- }
59
- setOpenDeleteDialog(false)
60
- setSelectedTagIndex(null)
61
- }
62
-
63
- const capitalize = (str) => {
64
- if (!str) return ''
65
- return str.charAt(0).toUpperCase() + str.slice(1)
66
- }
67
-
68
- const onTableChange = (key, value, index) => {
69
- const newTableData = tableData.map((item, tIndex) => {
70
- if (tIndex === index) {
71
- return { ...item, [key]: value }
72
- } else {
73
- return item
74
- }
75
- })
76
-
77
- setTableData(newTableData)
78
- }
79
-
80
- const saveNewRow = (tag) => {
81
- setTableData([...tableData, tag])
82
- const oldTags = values.tags || []
83
- setFieldValue(`tags`, [...oldTags, tag])
84
- }
85
-
86
- const handleDeleteClick = (id: number, name: string) => {
87
- setSelectedTagIndex(id)
88
- setSelectedTagName(name)
89
-
90
- setOpenDeleteDialog(true)
91
- }
92
-
93
- const generateTableRecords = (items) => {
94
- return items.map((item, index) => ({
95
- id: index,
96
- tagName: item.name,
97
- description: (
98
- <div className={styles.paramDescContainer}>
99
- <Tooltip
100
- key={`${index}-description`}
101
- allowHTML
102
- disabled={values.tags[index].description?.length <= 12}
103
- content={<div style={{ padding: '0.625rem' }}>{values.tags[index].description}</div>}
104
- arrowWithBorder
105
- placement="bottom-end"
106
- type="function"
107
- delay={[0, 0]}
108
- onShow={() => tooltipRefs[index]?.hide()}
109
- >
110
- <p style={{ alignSelf: 'center', fontWeight: 600, fontSize: '1rem' }}>
111
- {values.tags[index].description
112
- ? values.tags[index].description.substring(0, 12)
113
- : readOnly && '-'}
114
- {values.tags[index].description && values.tags[index].description.length > 12
115
- ? '...'
116
- : ''}
117
- </p>
118
- </Tooltip>
119
- <Tooltip
120
- arrowWithBorder
121
- placement="bottom-end"
122
- type="function"
123
- trigger="click"
124
- delay={[0, 0]}
125
- onCreate={(instance) =>
126
- setTooltipRefs((prev) => ({
127
- ...prev,
128
- [index]: instance,
129
- }))
130
- }
131
- content={
132
- <div className={styles.editDescTooltipContent}>
133
- <p className={styles.editDescTooltipContent_header}>Description</p>
134
- <TextArea
135
- placeholder="Describe tag..."
136
- value={item.description}
137
- disabled={readOnly}
138
- onChange={(value) => {
139
- if (value === '' || regex.ASCII.test(value))
140
- onTableChange('description', value, index)
141
- }}
142
- maxLength={25}
143
- />
144
- {!readOnly && (
145
- <Button
146
- className={styles.editDescTooltipContent_btn}
147
- variant="outlined"
148
- size="small"
149
- onClick={() => {
150
- setFieldValue(`tags[${index}].description`, item.description?.trim())
151
- tooltipRefs[index]?.hide()
152
- }}
153
- disabled={!item.description?.trim()}
154
- >
155
- Apply
156
- </Button>
157
- )}
158
- </div>
159
- }
160
- >
161
- {readOnly || values.tags[index].description ? (
162
- <Button
163
- className={styles.editDescBtn}
164
- variant="link"
165
- color="action"
166
- endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
167
- ></Button>
168
- ) : (
169
- <Button
170
- className={styles.editDescBtn}
171
- variant="link"
172
- color="action"
173
- endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
174
- >
175
- {readOnly || values.tags[index].description
176
- ? 'View Description'
177
- : 'Add Description'}
178
- </Button>
179
- )}
180
- </Tooltip>
181
- </div>
182
- ),
183
- externalDocs: (
184
- <div className={styles.paramDescContainer}>
185
- {values.tags[index].externalDocs?.description && values.tags[index].externalDocs?.url && (
186
- <a
187
- className={styles.externalDocsLink}
188
- href={values.tags[index].externalDocs?.url}
189
- target="_blank"
190
- style={
191
- !values.tags[index].externalDocs?.description
192
- ? { textDecoration: 'none', pointerEvents: 'none' }
193
- : {}
194
- }
195
- >
196
- {values.tags[index].externalDocs?.description
197
- ? values.tags[index].externalDocs?.description?.substring(0, 12)
198
- : readOnly && '-'}
199
- {values.tags[index].externalDocs?.description &&
200
- values.tags[index].externalDocs?.description?.length > 12
201
- ? '...'
202
- : ''}
203
- </a>
204
- )}
205
-
206
- <Tooltip
207
- arrowWithBorder
208
- placement="bottom-end"
209
- type="function"
210
- trigger="click"
211
- delay={[0, 0]}
212
- onCreate={(instance) =>
213
- setExternalTooltipRefs((prev) => ({
214
- ...prev,
215
- [index]: instance,
216
- }))
217
- }
218
- content={
219
- <div className={styles.editDescTooltipContent}>
220
- <p className={styles.editDescTooltipContent_header}>External Docs Description</p>
221
- <TextArea
222
- placeholder="Describe External Doc..."
223
- value={item.externalDocs?.description}
224
- disabled={readOnly}
225
- maxLength={25}
226
- onChange={(value) => {
227
- if (value === '' || regex.ASCII.test(value)) {
228
- onTableChange(
229
- 'externalDocs',
230
- { ...item.externalDocs, description: value },
231
- index
232
- )
233
- setDescription(value)
234
- }
235
- }}
236
- />
237
- <p className={styles.editDescTooltipContent_header}>External Docs Link</p>
238
- <TextArea
239
- placeholder="External Docs Link..."
240
- value={item.externalDocs?.url}
241
- disabled={readOnly}
242
- maxLength={200}
243
- onChange={(value) => {
244
- if (value === '' || regex.ASCII.test(value)) {
245
- onTableChange('externalDocs', { ...item.externalDocs, url: value }, index)
246
- setURL(value)
247
- }
248
- }}
249
- />
250
- {!readOnly && (
251
- <Button
252
- className={styles.editDescTooltipContent_btn}
253
- variant="outlined"
254
- size="small"
255
- onClick={() => {
256
- setFieldValue(`tags[${index}].externalDocs`, {
257
- description: description?.trim(),
258
- url: url?.trim(),
259
- })
260
- setDescription('')
261
- setURL('')
262
- externalTooltipRefs[index]?.hide()
263
- }}
264
- disabled={
265
- !(
266
- (values.tags[index].externalDocs?.description &&
267
- values.tags[index].externalDocs?.url &&
268
- !description?.trim() &&
269
- !url?.trim()) ||
270
- (description?.trim() && url?.trim() && regex.urlRegex.test(url))
271
- )
272
- }
273
- >
274
- Apply
275
- </Button>
276
- )}
277
- </div>
278
- }
279
- >
280
- {readOnly || values.tags[index].externalDocs?.description ? (
281
- <div className={styles.editExternalDocs}>
282
- <SVGLoader
283
- src={EditIcon}
284
- width="1.5rem"
285
- height="1.5rem"
286
- onClick={(e) => {
287
- e?.stopPropagation()
288
- setDescription(item.externalDocs?.description)
289
- setURL(item.externalDocs?.url)
290
- }}
291
- />
292
- </div>
293
- ) : (
294
- <Button
295
- className={styles.editDescBtn}
296
- variant="link"
297
- color="action"
298
- endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
299
- onClick={() => {
300
- setDescription(item.externalDocs?.description)
301
- setURL(item.externalDocs?.url)
302
- }}
303
- >
304
- {readOnly ||
305
- (values.tags[index]?.externalDocs &&
306
- (values.tags[index]?.externalDocs?.url ||
307
- values.tags[index].externalDocs?.description))
308
- ? 'View '
309
- : 'Add '}{' '}
310
- External Docs Link
311
- </Button>
312
- )}
313
- </Tooltip>
314
-
315
- {!readOnly && <div className={styles.paramDescContainer_separator}></div>}
316
-
317
- {!readOnly && (
318
- <Button
319
- className={styles.deleteParamBtn}
320
- variant="link"
321
- color="error"
322
- endIcon={<SVGLoader src={DeleteIcon} width="1.125rem" height="1.125rem" />}
323
- onClick={() => handleDeleteClick(index, item.name)}
324
- ></Button>
325
- )}
326
- </div>
327
- ),
328
- }))
329
- }
330
-
331
- return (
332
- <form className={styles.apiInfoForm} onSubmit={(e) => e.preventDefault()}>
333
- <Input
334
- size="large"
335
- placeholder="e.g. Payments"
336
- label="API Name"
337
- required
338
- value={values?.info?.title}
339
- maxLength={35}
340
- onChange={(value) => {
341
- setFieldValue('info.title', value)
342
- }}
343
- onClear={() => {
344
- setFieldValue('info.title', '')
345
- }}
346
- errorMsg={errors?.info?.title}
347
- restrictedCharactersRegex={regex.basic}
348
- />
349
- <div className={styles.apiDocRow}>
350
- <Input
351
- size="large"
352
- label="API Authentication Type"
353
- required
354
- value={capitalize(authType)}
355
- disabled
356
- />
357
- <Input size="large" label="Version" required value={values?.info?.version} disabled />
358
- </div>
359
- <TextArea
360
- size="large"
361
- placeholder="Enter a description of the API's functionality..."
362
- label="Description"
363
- value={values?.info?.description}
364
- maxLength={120}
365
- required
366
- onChange={(value: string) => {
367
- if (value === '' || regex.ASCII.test(value)) {
368
- setFieldValue('info.description', value)
369
- }
370
- }}
371
- onClear={() => {
372
- setFieldValue('info.description', '')
373
- }}
374
- errorMsg={errors?.info?.description}
375
- />
376
- <div className={styles.paramsTable}>
377
- <TagsTable
378
- id="paramter-table"
379
- data={tableRecords}
380
- headCells={tagsTableHeaders}
381
- isFormOpen={isFormOpen}
382
- setIsFormOpen={setIsFormOpen}
383
- saveNewRow={saveNewRow}
384
- readOnly={readOnly}
385
- />
386
- </div>
387
- <CommonDialog
388
- status="error"
389
- content={
390
- <p
391
- style={{
392
- textAlign: 'center',
393
- fontWeight: 400,
394
- fontSize: '1rem',
395
- lineHeight: '1.4375rem',
396
- }}
397
- className="delete-msg-container"
398
- >
399
- Are you sure you want to delete
400
- <span className="plan-name">
401
- {' '}
402
- Tag <strong>{selectedTagName}</strong>
403
- </span>
404
- ?
405
- </p>
406
- }
407
- onSubmit={{
408
- onClick: confirmDeleteTag,
409
- text: 'Delete',
410
- color: 'error',
411
- fullWidth: true,
412
- }}
413
- onCancel={{
414
- text: 'Cancel',
415
- color: 'normal',
416
- fullWidth: true,
417
- }}
418
- onClose={() => setOpenDeleteDialog(false)}
419
- open={openDeleteDialog}
420
- icon={<SVGLoader src={deleteOutlinedIcon} width="4.0625rem" height="4.0625rem" />}
421
- />
422
- </form>
423
- )
424
- }
425
-
426
- export default InfoForm
1
+ import { useEffect, useState } from 'react'
2
+ // @ts-ignore
3
+ import { useFormikContext } from 'formik'
4
+ import { Button, Input, TextArea } from 'digitinary-ui'
5
+ import styles from './InfoForm.module.scss'
6
+ import regex from '../../constants/regex'
7
+ import { TransformedOpenApi } from '../../types/transformedOpenApi'
8
+ import Tooltip from '../../components/Tooltip/Tooltip'
9
+ import { DeleteIcon, deleteOutlinedIcon, EditIcon } from '../../assets/icons'
10
+ import SVGLoader from '../../components/SVGLoader/SVGLoader'
11
+ import CommonDialog from '../../components/dialog'
12
+ import { tagsTableHeaders } from '../../constants/index'
13
+ import TagsTable from '../../components/table/tags-table'
14
+
15
+ const InfoForm = ({ readOnly }: { readOnly?: boolean }) => {
16
+ const [tableData, setTableData] = useState([])
17
+ const [tableRecords, setTableRecords] = useState()
18
+ const [authType, setAuthType] = useState('')
19
+ const [description, setDescription] = useState('')
20
+ const [url, setURL] = useState('')
21
+ const { values, setFieldValue, errors } = useFormikContext<TransformedOpenApi>()
22
+ const [externalTooltipRefs, setExternalTooltipRefs] = useState<{ [key: number]: any }>({})
23
+ const [tooltipRefs, setTooltipRefs] = useState<{ [key: number]: any }>({})
24
+ const [selectedTagIndex, setSelectedTagIndex] = useState<number | null>(null)
25
+ const [selectedTagName, setSelectedTagName] = useState<string | null>(null)
26
+ const [openDeleteDialog, setOpenDeleteDialog] = useState(false)
27
+ const [isFormOpen, setIsFormOpen] = useState(false)
28
+
29
+ useEffect(() => {
30
+ if (values && values.components && values.components.securitySchemes) {
31
+ const authenticatorKeys = Object.keys(values.components.securitySchemes)
32
+ if (authenticatorKeys.length) {
33
+ setAuthType(
34
+ values.components.securitySchemes[authenticatorKeys[0]].scheme ||
35
+ values.components.securitySchemes[authenticatorKeys[0]].type
36
+ )
37
+ }
38
+ }
39
+ }, [])
40
+
41
+ useEffect(() => {
42
+ setTableRecords(generateTableRecords(tableData))
43
+ }, [tableData])
44
+
45
+ useEffect(() => {
46
+ if (values.tags && values.tags.length) {
47
+ setTableData(values.tags)
48
+ }
49
+ }, [values.tags])
50
+
51
+ const confirmDeleteTag = () => {
52
+ if (selectedTagIndex !== null) {
53
+ setTableData((prev) => prev.filter((_, i) => i !== selectedTagIndex))
54
+ setFieldValue(
55
+ `tags`,
56
+ values.tags?.filter((_, i) => i !== selectedTagIndex)
57
+ )
58
+ }
59
+ setOpenDeleteDialog(false)
60
+ setSelectedTagIndex(null)
61
+ }
62
+
63
+ const capitalize = (str) => {
64
+ if (!str) return ''
65
+ return str.charAt(0).toUpperCase() + str.slice(1)
66
+ }
67
+
68
+ const onTableChange = (key, value, index) => {
69
+ const newTableData = tableData.map((item, tIndex) => {
70
+ if (tIndex === index) {
71
+ return { ...item, [key]: value }
72
+ } else {
73
+ return item
74
+ }
75
+ })
76
+
77
+ setTableData(newTableData)
78
+ }
79
+
80
+ const saveNewRow = (tag) => {
81
+ setTableData([...tableData, tag])
82
+ const oldTags = values.tags || []
83
+ setFieldValue(`tags`, [...oldTags, tag])
84
+ }
85
+
86
+ const handleDeleteClick = (id: number, name: string) => {
87
+ setSelectedTagIndex(id)
88
+ setSelectedTagName(name)
89
+
90
+ setOpenDeleteDialog(true)
91
+ }
92
+
93
+ const generateTableRecords = (items) => {
94
+ return items.map((item, index) => ({
95
+ id: index,
96
+ tagName: item.name,
97
+ description: (
98
+ <div className={styles.paramDescContainer}>
99
+ <Tooltip
100
+ key={`${index}-description`}
101
+ allowHTML
102
+ disabled={values.tags[index].description?.length <= 12}
103
+ content={<div style={{ padding: '0.625rem' }}>{values.tags[index].description}</div>}
104
+ arrowWithBorder
105
+ placement="bottom-end"
106
+ type="function"
107
+ delay={[0, 0]}
108
+ onShow={() => tooltipRefs[index]?.hide()}
109
+ >
110
+ <p style={{ alignSelf: 'center', fontWeight: 600, fontSize: '1rem' }}>
111
+ {values.tags[index].description
112
+ ? values.tags[index].description.substring(0, 12)
113
+ : readOnly && '-'}
114
+ {values.tags[index].description && values.tags[index].description.length > 12
115
+ ? '...'
116
+ : ''}
117
+ </p>
118
+ </Tooltip>
119
+ <Tooltip
120
+ arrowWithBorder
121
+ placement="bottom-end"
122
+ type="function"
123
+ trigger="click"
124
+ delay={[0, 0]}
125
+ onCreate={(instance) =>
126
+ setTooltipRefs((prev) => ({
127
+ ...prev,
128
+ [index]: instance,
129
+ }))
130
+ }
131
+ content={
132
+ <div className={styles.editDescTooltipContent}>
133
+ <p className={styles.editDescTooltipContent_header}>Description</p>
134
+ <TextArea
135
+ placeholder="Describe tag..."
136
+ value={item.description}
137
+ disabled={readOnly}
138
+ onChange={(value) => {
139
+ if (value === '' || regex.ASCII.test(value))
140
+ onTableChange('description', value, index)
141
+ }}
142
+ maxLength={25}
143
+ />
144
+ {!readOnly && (
145
+ <Button
146
+ className={styles.editDescTooltipContent_btn}
147
+ variant="outlined"
148
+ size="small"
149
+ onClick={() => {
150
+ setFieldValue(`tags[${index}].description`, item.description?.trim())
151
+ tooltipRefs[index]?.hide()
152
+ }}
153
+ disabled={!item.description?.trim()}
154
+ >
155
+ Apply
156
+ </Button>
157
+ )}
158
+ </div>
159
+ }
160
+ >
161
+ {readOnly || values.tags[index].description ? (
162
+ <Button
163
+ className={styles.editDescBtn}
164
+ variant="link"
165
+ color="action"
166
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
167
+ ></Button>
168
+ ) : (
169
+ <Button
170
+ className={styles.editDescBtn}
171
+ variant="link"
172
+ color="action"
173
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
174
+ >
175
+ {readOnly || values.tags[index].description
176
+ ? 'View Description'
177
+ : 'Add Description'}
178
+ </Button>
179
+ )}
180
+ </Tooltip>
181
+ </div>
182
+ ),
183
+ externalDocs: (
184
+ <div className={styles.paramDescContainer}>
185
+ {values.tags[index].externalDocs?.description && values.tags[index].externalDocs?.url && (
186
+ <a
187
+ className={styles.externalDocsLink}
188
+ href={values.tags[index].externalDocs?.url}
189
+ target="_blank"
190
+ style={
191
+ !values.tags[index].externalDocs?.description
192
+ ? { textDecoration: 'none', pointerEvents: 'none' }
193
+ : {}
194
+ }
195
+ >
196
+ {values.tags[index].externalDocs?.description
197
+ ? values.tags[index].externalDocs?.description?.substring(0, 12)
198
+ : readOnly && '-'}
199
+ {values.tags[index].externalDocs?.description &&
200
+ values.tags[index].externalDocs?.description?.length > 12
201
+ ? '...'
202
+ : ''}
203
+ </a>
204
+ )}
205
+
206
+ <Tooltip
207
+ arrowWithBorder
208
+ placement="bottom-end"
209
+ type="function"
210
+ trigger="click"
211
+ delay={[0, 0]}
212
+ onCreate={(instance) =>
213
+ setExternalTooltipRefs((prev) => ({
214
+ ...prev,
215
+ [index]: instance,
216
+ }))
217
+ }
218
+ content={
219
+ <div className={styles.editDescTooltipContent}>
220
+ <p className={styles.editDescTooltipContent_header}>External Docs Description</p>
221
+ <TextArea
222
+ placeholder="Describe External Doc..."
223
+ value={item.externalDocs?.description}
224
+ disabled={readOnly}
225
+ maxLength={25}
226
+ onChange={(value) => {
227
+ if (value === '' || regex.ASCII.test(value)) {
228
+ onTableChange(
229
+ 'externalDocs',
230
+ { ...item.externalDocs, description: value },
231
+ index
232
+ )
233
+ setDescription(value)
234
+ }
235
+ }}
236
+ />
237
+ <p className={styles.editDescTooltipContent_header}>External Docs Link</p>
238
+ <TextArea
239
+ placeholder="External Docs Link..."
240
+ value={item.externalDocs?.url}
241
+ disabled={readOnly}
242
+ maxLength={200}
243
+ restrictedCharsRegex={regex.urlRegex}
244
+ onChange={(value) => {
245
+ if (value === '' || regex.ASCII.test(value)) {
246
+ onTableChange('externalDocs', { ...item.externalDocs, url: value }, index)
247
+ setURL(value)
248
+ }
249
+ }}
250
+ />
251
+ {!readOnly && (
252
+ <Button
253
+ className={styles.editDescTooltipContent_btn}
254
+ variant="outlined"
255
+ size="small"
256
+ onClick={() => {
257
+ setFieldValue(`tags[${index}].externalDocs`, {
258
+ description: description?.trim(),
259
+ url: url?.trim(),
260
+ })
261
+ setDescription('')
262
+ setURL('')
263
+ externalTooltipRefs[index]?.hide()
264
+ }}
265
+ disabled={
266
+ !(
267
+ (values.tags[index].externalDocs?.url && !url?.trim()) ||
268
+ (url?.trim() && regex.urlRegex.test(url))
269
+ )
270
+ }
271
+ >
272
+ Apply
273
+ </Button>
274
+ )}
275
+ </div>
276
+ }
277
+ >
278
+ {readOnly || values.tags[index].externalDocs?.description ? (
279
+ <div className={styles.editExternalDocs}>
280
+ <SVGLoader
281
+ src={EditIcon}
282
+ width="1.5rem"
283
+ height="1.5rem"
284
+ onClick={(e) => {
285
+ e?.stopPropagation()
286
+ setDescription(item.externalDocs?.description)
287
+ setURL(item.externalDocs?.url)
288
+ }}
289
+ />
290
+ </div>
291
+ ) : (
292
+ <Button
293
+ className={styles.editDescBtn}
294
+ variant="link"
295
+ color="action"
296
+ endIcon={<SVGLoader src={EditIcon} width="1.5rem" height="1.5rem" />}
297
+ onClick={() => {
298
+ setDescription(item.externalDocs?.description)
299
+ setURL(item.externalDocs?.url)
300
+ }}
301
+ >
302
+ {readOnly ||
303
+ (values.tags[index]?.externalDocs &&
304
+ (values.tags[index]?.externalDocs?.url ||
305
+ values.tags[index].externalDocs?.description))
306
+ ? 'View '
307
+ : 'Add '}{' '}
308
+ External Docs Link
309
+ </Button>
310
+ )}
311
+ </Tooltip>
312
+
313
+ {!readOnly && <div className={styles.paramDescContainer_separator}></div>}
314
+
315
+ {!readOnly && (
316
+ <Button
317
+ className={styles.deleteParamBtn}
318
+ variant="link"
319
+ color="error"
320
+ endIcon={<SVGLoader src={DeleteIcon} width="1.125rem" height="1.125rem" />}
321
+ onClick={() => handleDeleteClick(index, item.name)}
322
+ ></Button>
323
+ )}
324
+ </div>
325
+ ),
326
+ }))
327
+ }
328
+
329
+ return (
330
+ <form className={styles.apiInfoForm} onSubmit={(e) => e.preventDefault()}>
331
+ <Input
332
+ size="large"
333
+ placeholder="e.g. Payments"
334
+ label="API Name"
335
+ required
336
+ value={values?.info?.title}
337
+ maxLength={35}
338
+ onChange={(value) => {
339
+ setFieldValue('info.title', value)
340
+ }}
341
+ onClear={() => {
342
+ setFieldValue('info.title', '')
343
+ }}
344
+ errorMsg={errors?.info?.title}
345
+ restrictedCharactersRegex={regex.basic}
346
+ />
347
+ <div className={styles.apiDocRow}>
348
+ <Input
349
+ size="large"
350
+ label="API Authentication Type"
351
+ required
352
+ value={capitalize(authType)}
353
+ disabled
354
+ />
355
+ <Input size="large" label="Version" required value={values?.info?.version} disabled />
356
+ </div>
357
+ <TextArea
358
+ size="large"
359
+ placeholder="Enter a description of the API's functionality..."
360
+ label="Description"
361
+ value={values?.info?.description}
362
+ maxLength={120}
363
+ required
364
+ onChange={(value: string) => {
365
+ if (value === '' || regex.ASCII.test(value)) {
366
+ setFieldValue('info.description', value)
367
+ }
368
+ }}
369
+ onClear={() => {
370
+ setFieldValue('info.description', '')
371
+ }}
372
+ errorMsg={errors?.info?.description}
373
+ />
374
+ <div className={styles.paramsTable}>
375
+ <TagsTable
376
+ id="paramter-table"
377
+ data={tableRecords}
378
+ headCells={tagsTableHeaders}
379
+ isFormOpen={isFormOpen}
380
+ setIsFormOpen={setIsFormOpen}
381
+ saveNewRow={saveNewRow}
382
+ readOnly={readOnly}
383
+ />
384
+ </div>
385
+ <CommonDialog
386
+ status="error"
387
+ content={
388
+ <p
389
+ style={{
390
+ textAlign: 'center',
391
+ fontWeight: 400,
392
+ fontSize: '1rem',
393
+ lineHeight: '1.4375rem',
394
+ }}
395
+ className="delete-msg-container"
396
+ >
397
+ Are you sure you want to delete
398
+ <span className="plan-name">
399
+ {' '}
400
+ Tag <strong>{selectedTagName}</strong>
401
+ </span>
402
+ ?
403
+ </p>
404
+ }
405
+ onSubmit={{
406
+ onClick: confirmDeleteTag,
407
+ text: 'Delete',
408
+ color: 'error',
409
+ fullWidth: true,
410
+ }}
411
+ onCancel={{
412
+ text: 'Cancel',
413
+ color: 'normal',
414
+ fullWidth: true,
415
+ }}
416
+ onClose={() => setOpenDeleteDialog(false)}
417
+ open={openDeleteDialog}
418
+ icon={<SVGLoader src={deleteOutlinedIcon} width="4.0625rem" height="4.0625rem" />}
419
+ />
420
+ </form>
421
+ )
422
+ }
423
+
424
+ export default InfoForm