diff --git a/services/frontend/src/components/FormModal.tsx b/services/frontend/src/components/FormModal.tsx index 906cfc2..0c8ac0d 100644 --- a/services/frontend/src/components/FormModal.tsx +++ b/services/frontend/src/components/FormModal.tsx @@ -1,6 +1,7 @@ import { Fragment, FunctionComponent, + ReactNode, useCallback, useMemo, useState @@ -13,6 +14,7 @@ import { ScrollView } from "./ScrollView"; import Modal from "./Modal"; import Tabs from "./Tabs"; import Tab from "./Tab"; +import ResourceList from "./ResourceList"; export interface ITab { value: string; @@ -23,12 +25,15 @@ export interface ITab { export interface IFormModalProps { title: string; tabs: ITab[]; + items: string[]; onHide: () => void; getFinalValues: (values: any, selectedNode?: any) => any; getInitialValues: (selectedNode?: any) => any; + getText: (item: string) => ReactNode; validationSchema: any; onCreate: (finalValues: any, values: any, formik: any) => void; selectedNode?: any; + resourceType: string; } const StyledScrollView = styled(ScrollView)` @@ -40,6 +45,16 @@ const StyledScrollView = styled(ScrollView)` flex: 1 1 auto; `; +const Container = styled("div")` + display: flex; + flex-direction: row; +`; + +const FormContainer = styled("div")` + display: flex; + flex-direction: column; +`; + const Actions = styled("div")` display: flex; padding-top: 0.75rem; @@ -58,12 +73,15 @@ const FormModal = (props: IFormModalProps) => { const { title, tabs, + items, + validationSchema, getInitialValues, getFinalValues, - validationSchema, + getText, onHide, onCreate, - selectedNode + selectedNode, + resourceType } = props; const [openTab, setOpenTab] = useState(() => tabs[0].value); @@ -89,32 +107,52 @@ const FormModal = (props: IFormModalProps) => { ); }; + const handleNew = () => null; + const handleRemove = () => null; + const handleEdit = () => null; + const selectedItem = undefined as any; + return ( - - {(formik) => ( - <> - - {tabs.map((tab) => ( - - ))} - - - - {tabs.map(renderTab)} - - - - - - + + {items.length > 0 && ( + )} - + + + {(formik) => ( + <> + + {tabs.map((tab) => ( + + ))} + + + + {tabs.map(renderTab)} + + + + + + + )} + + + ); }; diff --git a/services/frontend/src/components/modals/docker-compose/network/NetworkList.tsx b/services/frontend/src/components/ResourceList.tsx similarity index 64% rename from services/frontend/src/components/modals/docker-compose/network/NetworkList.tsx rename to services/frontend/src/components/ResourceList.tsx index bf20b46..f6a4c8e 100644 --- a/services/frontend/src/components/modals/docker-compose/network/NetworkList.tsx +++ b/services/frontend/src/components/ResourceList.tsx @@ -1,15 +1,16 @@ import { MinusSmIcon, PlusIcon } from "@heroicons/react/outline"; import { Button, styled } from "@mui/joy"; import IconButton from "@mui/joy/IconButton"; -import { FunctionComponent, ReactElement } from "react"; -import { truncateStr } from "../../../../utils"; +import { FunctionComponent, ReactElement, ReactNode } from "react"; -export interface INetworkListProps { - networks: Record; - selectedUuid: string; - onEdit: (networkUuid: string) => void; +export interface IResourceListProps { + items: string[]; + selectedItem: string; + newActionText: string; + getText: (uuid: string) => ReactNode; + onEdit: (item: string) => void; onNew: () => void; - onRemove: (networkUuid: string) => void; + onRemove: (item: string) => void; } interface IListItemProps { @@ -58,35 +59,41 @@ const RemoveButton = styled(IconButton)` max-height: 16px; `; -const NetworkList: FunctionComponent = ( - props: INetworkListProps +const ResourceList: FunctionComponent = ( + props: IResourceListProps ): ReactElement => { - const { onNew, onRemove, onEdit, networks, selectedUuid } = props; + const { + onNew, + onRemove, + onEdit, + getText, + items, + selectedItem, + newActionText + } = props; const handleEdit = (networkUuid: string) => () => onEdit(networkUuid); - const handleRemove = (e: any, networkUuid: string) => { - e.stopPropagation(); + const handleRemove = (networkUuid: string) => (event: any) => { + event.stopPropagation(); onRemove(networkUuid); }; return ( - {Object.keys(networks).map((networkUuid: string) => ( + {items.map((item: string) => ( - - {truncateStr(networks[networkUuid].canvasConfig.node_name, 10)} - + {getText(item)} handleRemove(e, networkUuid)} + onClick={handleRemove(item)} > @@ -97,11 +104,11 @@ const NetworkList: FunctionComponent = ( ); }; -export default NetworkList; +export default ResourceList; diff --git a/services/frontend/src/components/modals/docker-compose/network/index.tsx b/services/frontend/src/components/modals/docker-compose/network/index.tsx index 43d1ef4..2ac0462 100644 --- a/services/frontend/src/components/modals/docker-compose/network/index.tsx +++ b/services/frontend/src/components/modals/docker-compose/network/index.tsx @@ -2,10 +2,10 @@ import { useCallback, useState } from "react"; import CreateNetworkModal from "./CreateNetworkModal"; import { CallbackFunction, IEditNetworkForm } from "../../../../types"; import EditNetworkModal from "./EditNetworkModal"; -import { attachUUID, toaster } from "../../../../utils"; +import { attachUUID, toaster, truncateStr } from "../../../../utils"; import { getFinalValues } from "./form-utils"; import EmptyNetworks from "./EmptyNetworks"; -import NetworkList from "./NetworkList"; +import ResourceList from "../../../ResourceList"; import { styled } from "@mui/joy"; import Modal from "../../../Modal"; @@ -95,12 +95,16 @@ const ModalNetwork = (props: IModalNetworkProps) => { {(networkKeys.length > 0 || showCreate) && ( {networkKeys.length > 0 && ( - + truncateStr(networks[uuid].canvasConfig.node_name, 10) + } onNew={handleNew} onRemove={handleRemove} onEdit={handleEdit} - selectedUuid={selectedNetwork?.key} + selectedItem={selectedNetwork?.key} /> )} diff --git a/services/frontend/src/components/modals/docker-compose/service/Create.tsx b/services/frontend/src/components/modals/docker-compose/service/Create.tsx index 7e528c8..82868bd 100644 --- a/services/frontend/src/components/modals/docker-compose/service/Create.tsx +++ b/services/frontend/src/components/modals/docker-compose/service/Create.tsx @@ -35,10 +35,13 @@ const CreateServiceModal = (props: IModalServiceProps) => { return ( "test"} validationSchema={validationSchema} onHide={onHide} onCreate={handleCreate} diff --git a/services/frontend/src/components/modals/docker-compose/service/Edit.tsx b/services/frontend/src/components/modals/docker-compose/service/Edit.tsx index b72d5ab..7e9caa7 100644 --- a/services/frontend/src/components/modals/docker-compose/service/Edit.tsx +++ b/services/frontend/src/components/modals/docker-compose/service/Edit.tsx @@ -40,10 +40,13 @@ const ModalServiceEdit = (props: IModalServiceProps) => { return ( "test"} validationSchema={validationSchema} onHide={onHide} onCreate={handleUpdate} diff --git a/services/frontend/src/components/modals/docker-compose/volume/CreateVolumeModal.tsx b/services/frontend/src/components/modals/docker-compose/volume/CreateVolumeModal.tsx index f3dde86..8e609d2 100644 --- a/services/frontend/src/components/modals/docker-compose/volume/CreateVolumeModal.tsx +++ b/services/frontend/src/components/modals/docker-compose/volume/CreateVolumeModal.tsx @@ -32,10 +32,13 @@ const CreateVolumeModal = (props: ICreateVolumeModalProps) => { return ( "test"} validationSchema={validationSchema} onHide={onHide} onCreate={handleCreate} diff --git a/services/frontend/src/components/modals/docker-compose/volume/EditVolumeModal.tsx b/services/frontend/src/components/modals/docker-compose/volume/EditVolumeModal.tsx index 608a9fa..7caa2c8 100644 --- a/services/frontend/src/components/modals/docker-compose/volume/EditVolumeModal.tsx +++ b/services/frontend/src/components/modals/docker-compose/volume/EditVolumeModal.tsx @@ -39,10 +39,13 @@ const EditVolumeModal = (props: IEditVolumeModal) => { return ( "test"} selectedNode={selectedNode} validationSchema={validationSchema} onHide={onHide}