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}