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

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 (103) hide show
  1. package/.editorconfig +12 -12
  2. package/.prettierignore +7 -7
  3. package/.prettierrc +15 -15
  4. package/dist/{a7568b270e175038.svg → 070dc6ecd197bc80.svg} +8 -8
  5. package/dist/{43595976d1fdccbf.svg → 2e10bbdb265df50e.svg} +4 -4
  6. package/dist/{b82c7612e73342f3.svg → 7f54eeb0bb2d1150.svg} +3 -3
  7. package/dist/{56dc416b683db280.svg → 8789eb84283ea95b.svg} +5 -5
  8. package/dist/{af16a554be8c4d69.svg → 9bdff13f8d8fa48a.svg} +3 -3
  9. package/dist/_virtual/index4.js +1 -1
  10. package/dist/_virtual/index5.js +1 -1
  11. package/dist/_virtual/index6.js +1 -1
  12. package/dist/{64efc2716808c4a4.svg → bb8b87cace25e052.svg} +3 -3
  13. package/dist/{72db3b05a96dd600.svg → d32ce84bbd78babd.svg} +3 -3
  14. package/dist/{844eba3f2e42a9eb.svg → d501922060662842.svg} +3 -3
  15. package/dist/node_modules/toposort/index.js +1 -1
  16. package/dist/node_modules/yup/index.esm.js +1 -1
  17. package/dist/src/assets/icons/AddRow.svg.js +1 -1
  18. package/dist/src/assets/icons/AddRow.svg.js.map +1 -1
  19. package/dist/src/assets/icons/CheckMarkSquare.svg.js +1 -1
  20. package/dist/src/assets/icons/CheckMarkSquare.svg.js.map +1 -1
  21. package/dist/src/assets/icons/CloseIcon.svg.js +1 -1
  22. package/dist/src/assets/icons/CloseIcon.svg.js.map +1 -1
  23. package/dist/src/assets/icons/DeleteIcon.svg.js +1 -1
  24. package/dist/src/assets/icons/DeleteIcon.svg.js.map +1 -1
  25. package/dist/src/assets/icons/DownArrow.svg.js +1 -1
  26. package/dist/src/assets/icons/DownArrow.svg.js.map +1 -1
  27. package/dist/src/assets/icons/EditIcon.svg.js +1 -1
  28. package/dist/src/assets/icons/EditIcon.svg.js.map +1 -1
  29. package/dist/src/assets/icons/UpArrow.svg.js +1 -1
  30. package/dist/src/assets/icons/UpArrow.svg.js.map +1 -1
  31. package/dist/src/assets/icons/deleteOutlinedIcon.svg.js +1 -1
  32. package/dist/src/assets/icons/deleteOutlinedIcon.svg.js.map +1 -1
  33. package/dist/src/components/Chips/Chips.js.map +1 -1
  34. package/dist/src/components/InfoForm/InfoForm.js.map +1 -1
  35. package/dist/src/components/JsonInput/JsonInput.js.map +1 -1
  36. package/dist/src/components/LivePreview/LivePreview.js.map +1 -1
  37. package/dist/src/components/MethodAccordion/MethodAccordion.js +1 -1
  38. package/dist/src/components/MethodAccordion/MethodAccordion.js.map +1 -1
  39. package/dist/src/components/SVGLoader/SVGLoader.js.map +1 -1
  40. package/dist/src/components/SectionHead/SectionHead.js.map +1 -1
  41. package/dist/src/components/SimpleLabelValue/SimpleLabelValue.js.map +1 -1
  42. package/dist/src/components/Tooltip/Tooltip.js.map +1 -1
  43. package/dist/src/components/dialog/index.js.map +1 -1
  44. package/dist/src/components/table/table.js +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.map +1 -1
  50. package/dist/src/helpers/layout.helper.js.map +1 -1
  51. package/dist/src/helpers/methodAccordion.helper.js.map +1 -1
  52. package/dist/src/layout/layout.js.map +1 -1
  53. package/dist/src/validator/form.scheme.js.map +1 -1
  54. package/dist/styles.css +212 -212
  55. package/package.json +43 -43
  56. package/rollup.config.js +35 -35
  57. package/src/assets/icons/AddRow.svg +3 -3
  58. package/src/assets/icons/CheckMarkSquare.svg +5 -5
  59. package/src/assets/icons/CloseIcon.svg +4 -4
  60. package/src/assets/icons/DeleteIcon.svg +3 -3
  61. package/src/assets/icons/DownArrow.svg +3 -3
  62. package/src/assets/icons/EditIcon.svg +3 -3
  63. package/src/assets/icons/UpArrow.svg +3 -3
  64. package/src/assets/icons/deleteOutlinedIcon.svg +8 -8
  65. package/src/assets/icons/index.ts +8 -8
  66. package/src/components/Chips/Chips.tsx +87 -87
  67. package/src/components/Chips/style.scss +147 -147
  68. package/src/components/InfoForm/InfoForm.module.scss +165 -165
  69. package/src/components/InfoForm/InfoForm.tsx +426 -426
  70. package/src/components/JsonInput/JsonInput.tsx +149 -149
  71. package/src/components/JsonInput/style.module.scss +133 -133
  72. package/src/components/LivePreview/LivePreview.module.scss +24 -24
  73. package/src/components/LivePreview/LivePreview.tsx +184 -184
  74. package/src/components/MethodAccordion/MethodAccordion.module.scss +338 -338
  75. package/src/components/MethodAccordion/MethodAccordion.tsx +515 -514
  76. package/src/components/SVGLoader/SVGLoader.tsx +94 -94
  77. package/src/components/SectionHead/SectionHead.scss +29 -29
  78. package/src/components/SectionHead/SectionHead.tsx +22 -22
  79. package/src/components/SimpleLabelValue/SimpleLabelValue.tsx +31 -31
  80. package/src/components/SimpleLabelValue/index.ts +1 -1
  81. package/src/components/SimpleLabelValue/style.scss +30 -30
  82. package/src/components/Tooltip/Tooltip.scss +133 -133
  83. package/src/components/Tooltip/Tooltip.tsx +85 -85
  84. package/src/components/_global.scss +337 -337
  85. package/src/components/dialog/dialog.ts +54 -54
  86. package/src/components/dialog/index.tsx +85 -85
  87. package/src/components/dialog/style.scss +104 -104
  88. package/src/components/table/style.scss +190 -190
  89. package/src/components/table/table.tsx +327 -322
  90. package/src/components/table/tags-table.tsx +348 -341
  91. package/src/constants/index.ts +93 -93
  92. package/src/constants/regex.ts +7 -7
  93. package/src/global.d.ts +13 -13
  94. package/src/helpers/layout.helper.ts +162 -162
  95. package/src/helpers/methodAccordion.helper.ts +19 -19
  96. package/src/index.ts +1 -1
  97. package/src/layout/layout.module.css +61 -61
  98. package/src/layout/layout.tsx +150 -150
  99. package/src/types/layout.type.ts +30 -30
  100. package/src/types/openApi.ts +108 -108
  101. package/src/types/transformedOpenApi.ts +52 -52
  102. package/src/validator/form.scheme.ts +70 -70
  103. package/tsconfig.json +33 -33
@@ -1,426 +1,426 @@
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
+ 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