From 928c1c23d33fc4aeaddbb1a8397d78372ae5bf7d Mon Sep 17 00:00:00 2001 From: Vardan Bansal Date: Wed, 27 Sep 2023 16:11:31 -0700 Subject: [PATCH 01/10] initial commit --- web/src/components/MultiList/MultiList.tsx | 79 ++++ .../MultiList/MultiList.tsx.module.scss | 3 + .../MultiList/MultiList.tsx.module.scss.d.ts | 19 + .../PluginsPanel/PluginsPanel.module.scss | 4 + .../PluginsPanel.module.scss.d.ts | 1 + .../components/PluginsPanel/PluginsPanel.tsx | 379 ++++++++++-------- 6 files changed, 323 insertions(+), 162 deletions(-) create mode 100644 web/src/components/MultiList/MultiList.tsx create mode 100644 web/src/components/MultiList/MultiList.tsx.module.scss create mode 100644 web/src/components/MultiList/MultiList.tsx.module.scss.d.ts diff --git a/web/src/components/MultiList/MultiList.tsx b/web/src/components/MultiList/MultiList.tsx new file mode 100644 index 000000000..55ab76615 --- /dev/null +++ b/web/src/components/MultiList/MultiList.tsx @@ -0,0 +1,79 @@ +import React, { useCallback, useEffect, useState } from 'react' +import { get } from 'lodash' +import { FormikContextType, connect } from 'formik' +import { Layout, Text, FormInput, Button, ButtonVariation, ButtonSize } from '@harnessio/uicore' +import { FontVariation } from '@harnessio/design-system' +import { useStrings } from 'framework/strings' + +import css from './MultiList.tsx.module.scss' + +interface MultiListConnectedProps extends MultiListProps { + formik?: FormikContextType +} + +interface MultiListProps { + name: string + label: string + readOnly?: boolean +} + +export const MultiList = ({ name, label, readOnly, formik }: MultiListConnectedProps): JSX.Element => { + const { getString } = useStrings() + const [rowCount, setRowCount] = useState(0) + + useEffect(() => { + formik?.setFieldValue(name, getListValues()) + }, [rowCount]) + + const getListValues = useCallback((): string[] => { + const existingValues = [] + for (let fieldIdx = 0; fieldIdx < rowCount; fieldIdx++) { + const fieldName = getFieldName(fieldIdx) + const fieldValue = get(formik?.values, fieldName) + if (fieldValue) { + existingValues.push(get(formik?.values, getFieldName(fieldIdx))) + } + } + return existingValues + }, [rowCount]) + + const getFieldName = useCallback( + (index: number): string => { + return `${name}-${index}` + }, + [name] + ) + + const handleAdd = (): void => { + setRowCount((existingCount: number) => existingCount + 1) + } + + const renderRow = useCallback((rowIndex: number): React.ReactElement => { + return + }, []) + + const renderRows = useCallback((numOfRows: number): React.ReactElement => { + const rows: React.ReactElement[] = [] + for (let idx = 0; idx < numOfRows; idx++) { + rows.push(renderRow(idx)) + } + return {rows} + }, []) + + return ( + + {label} + {renderRows(rowCount)} +