pull/109/merge
Samuel Rowe 3 years ago committed by GitHub
commit d255f0e744
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,6 +1,7 @@
import { import {
Fragment, Fragment,
FunctionComponent, FunctionComponent,
ReactNode,
useCallback, useCallback,
useMemo, useMemo,
useState useState
@ -13,6 +14,7 @@ import { ScrollView } from "./ScrollView";
import Modal from "./Modal"; import Modal from "./Modal";
import Tabs from "./Tabs"; import Tabs from "./Tabs";
import Tab from "./Tab"; import Tab from "./Tab";
import ResourceList from "./ResourceList";
export interface ITab { export interface ITab {
value: string; value: string;
@ -23,12 +25,15 @@ export interface ITab {
export interface IFormModalProps { export interface IFormModalProps {
title: string; title: string;
tabs: ITab[]; tabs: ITab[];
items: string[];
onHide: () => void; onHide: () => void;
getFinalValues: (values: any, selectedNode?: any) => any; getFinalValues: (values: any, selectedNode?: any) => any;
getInitialValues: (selectedNode?: any) => any; getInitialValues: (selectedNode?: any) => any;
getText: (item: string) => ReactNode;
validationSchema: any; validationSchema: any;
onCreate: (finalValues: any, values: any, formik: any) => void; onCreate: (finalValues: any, values: any, formik: any) => void;
selectedNode?: any; selectedNode?: any;
resourceType: string;
} }
const StyledScrollView = styled(ScrollView)` const StyledScrollView = styled(ScrollView)`
@ -40,6 +45,16 @@ const StyledScrollView = styled(ScrollView)`
flex: 1 1 auto; 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")` const Actions = styled("div")`
display: flex; display: flex;
padding-top: 0.75rem; padding-top: 0.75rem;
@ -58,12 +73,15 @@ const FormModal = (props: IFormModalProps) => {
const { const {
title, title,
tabs, tabs,
items,
validationSchema,
getInitialValues, getInitialValues,
getFinalValues, getFinalValues,
validationSchema, getText,
onHide, onHide,
onCreate, onCreate,
selectedNode selectedNode,
resourceType
} = props; } = props;
const [openTab, setOpenTab] = useState(() => tabs[0].value); 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 ( return (
<Modal onHide={onHide} title={title}> <Modal onHide={onHide} title={title}>
<Formik <Container>
initialValues={initialValues} {items.length > 0 && (
enableReinitialize={true} <ResourceList
onSubmit={handleCreate} items={items}
validationSchema={validationSchema} newActionText={`New ${resourceType}`}
> getText={getText}
{(formik) => ( onNew={handleNew}
<> onRemove={handleRemove}
<Tabs value={openTab} onChange={setOpenTab}> onEdit={handleEdit}
{tabs.map((tab) => ( selectedItem={selectedItem?.key}
<Tab key={tab.value} value={tab.value} title={tab.title} /> />
))}
</Tabs>
<StyledScrollView height="500px">
{tabs.map(renderTab)}
</StyledScrollView>
<Actions>
<Button onClick={reportErrorsAndSubmit(formik)}>Save</Button>
</Actions>
</>
)} )}
</Formik> <FormContainer>
<Formik
initialValues={initialValues}
enableReinitialize={true}
onSubmit={handleCreate}
validationSchema={validationSchema}
>
{(formik) => (
<>
<Tabs value={openTab} onChange={setOpenTab}>
{tabs.map((tab) => (
<Tab key={tab.value} value={tab.value} title={tab.title} />
))}
</Tabs>
<StyledScrollView height="500px">
{tabs.map(renderTab)}
</StyledScrollView>
<Actions>
<Button onClick={reportErrorsAndSubmit(formik)}>Save</Button>
</Actions>
</>
)}
</Formik>
</FormContainer>
</Container>
</Modal> </Modal>
); );
}; };

@ -1,15 +1,16 @@
import { MinusSmIcon, PlusIcon } from "@heroicons/react/outline"; import { MinusSmIcon, PlusIcon } from "@heroicons/react/outline";
import { Button, styled } from "@mui/joy"; import { Button, styled } from "@mui/joy";
import IconButton from "@mui/joy/IconButton"; import IconButton from "@mui/joy/IconButton";
import { FunctionComponent, ReactElement } from "react"; import { FunctionComponent, ReactElement, ReactNode } from "react";
import { truncateStr } from "../../../../utils";
export interface INetworkListProps { export interface IResourceListProps {
networks: Record<string, any>; items: string[];
selectedUuid: string; selectedItem: string;
onEdit: (networkUuid: string) => void; newActionText: string;
getText: (uuid: string) => ReactNode;
onEdit: (item: string) => void;
onNew: () => void; onNew: () => void;
onRemove: (networkUuid: string) => void; onRemove: (item: string) => void;
} }
interface IListItemProps { interface IListItemProps {
@ -58,35 +59,41 @@ const RemoveButton = styled(IconButton)`
max-height: 16px; max-height: 16px;
`; `;
const NetworkList: FunctionComponent<INetworkListProps> = ( const ResourceList: FunctionComponent<IResourceListProps> = (
props: INetworkListProps props: IResourceListProps
): ReactElement => { ): ReactElement => {
const { onNew, onRemove, onEdit, networks, selectedUuid } = props; const {
onNew,
onRemove,
onEdit,
getText,
items,
selectedItem,
newActionText
} = props;
const handleEdit = (networkUuid: string) => () => onEdit(networkUuid); const handleEdit = (networkUuid: string) => () => onEdit(networkUuid);
const handleRemove = (e: any, networkUuid: string) => { const handleRemove = (networkUuid: string) => (event: any) => {
e.stopPropagation(); event.stopPropagation();
onRemove(networkUuid); onRemove(networkUuid);
}; };
return ( return (
<Root> <Root>
<Top> <Top>
{Object.keys(networks).map((networkUuid: string) => ( {items.map((item: string) => (
<ListItem <ListItem
key={networkUuid} key={item}
onClick={handleEdit(networkUuid)} onClick={handleEdit(item)}
selected={networkUuid === selectedUuid} selected={item === selectedItem}
> >
<ListItemText> <ListItemText>{getText(item)}</ListItemText>
{truncateStr(networks[networkUuid].canvasConfig.node_name, 10)}
</ListItemText>
<RemoveButton <RemoveButton
variant="soft" variant="soft"
size="sm" size="sm"
color="danger" color="danger"
onClick={(e) => handleRemove(e, networkUuid)} onClick={handleRemove(item)}
> >
<MinusSmIcon className="h-4 w-4" /> <MinusSmIcon className="h-4 w-4" />
</RemoveButton> </RemoveButton>
@ -97,11 +104,11 @@ const NetworkList: FunctionComponent<INetworkListProps> = (
<Bottom> <Bottom>
<Button variant="plain" size="sm" onClick={onNew}> <Button variant="plain" size="sm" onClick={onNew}>
<PlusIcon className="h-4 w-4 mr-2" /> <PlusIcon className="h-4 w-4 mr-2" />
New network {newActionText}
</Button> </Button>
</Bottom> </Bottom>
</Root> </Root>
); );
}; };
export default NetworkList; export default ResourceList;

@ -2,10 +2,10 @@ import { useCallback, useState } from "react";
import CreateNetworkModal from "./CreateNetworkModal"; import CreateNetworkModal from "./CreateNetworkModal";
import { CallbackFunction, IEditNetworkForm } from "../../../../types"; import { CallbackFunction, IEditNetworkForm } from "../../../../types";
import EditNetworkModal from "./EditNetworkModal"; import EditNetworkModal from "./EditNetworkModal";
import { attachUUID, toaster } from "../../../../utils"; import { attachUUID, toaster, truncateStr } from "../../../../utils";
import { getFinalValues } from "./form-utils"; import { getFinalValues } from "./form-utils";
import EmptyNetworks from "./EmptyNetworks"; import EmptyNetworks from "./EmptyNetworks";
import NetworkList from "./NetworkList"; import ResourceList from "../../../ResourceList";
import { styled } from "@mui/joy"; import { styled } from "@mui/joy";
import Modal from "../../../Modal"; import Modal from "../../../Modal";
@ -95,12 +95,16 @@ const ModalNetwork = (props: IModalNetworkProps) => {
{(networkKeys.length > 0 || showCreate) && ( {(networkKeys.length > 0 || showCreate) && (
<Container> <Container>
{networkKeys.length > 0 && ( {networkKeys.length > 0 && (
<NetworkList <ResourceList
networks={networks} items={networkKeys}
newActionText="New network"
getText={(uuid: string) =>
truncateStr(networks[uuid].canvasConfig.node_name, 10)
}
onNew={handleNew} onNew={handleNew}
onRemove={handleRemove} onRemove={handleRemove}
onEdit={handleEdit} onEdit={handleEdit}
selectedUuid={selectedNetwork?.key} selectedItem={selectedNetwork?.key}
/> />
)} )}

@ -35,10 +35,13 @@ const CreateServiceModal = (props: IModalServiceProps) => {
return ( return (
<FormModal <FormModal
title="Create service" title="Services > New"
resourceType="service"
tabs={tabs} tabs={tabs}
items={["test"]}
getInitialValues={getInitialValues} getInitialValues={getInitialValues}
getFinalValues={getFinalValues} getFinalValues={getFinalValues}
getText={() => "test"}
validationSchema={validationSchema} validationSchema={validationSchema}
onHide={onHide} onHide={onHide}
onCreate={handleCreate} onCreate={handleCreate}

@ -40,10 +40,13 @@ const ModalServiceEdit = (props: IModalServiceProps) => {
return ( return (
<FormModal <FormModal
title="Edit service" title="Services > Edit"
resourceType="service"
tabs={tabs} tabs={tabs}
items={["test"]}
getInitialValues={getInitialValues} getInitialValues={getInitialValues}
getFinalValues={getFinalValues} getFinalValues={getFinalValues}
getText={() => "test"}
validationSchema={validationSchema} validationSchema={validationSchema}
onHide={onHide} onHide={onHide}
onCreate={handleUpdate} onCreate={handleUpdate}

@ -32,10 +32,13 @@ const CreateVolumeModal = (props: ICreateVolumeModalProps) => {
return ( return (
<FormModal <FormModal
title="Add volume" title="Volumes > New"
resourceType="volume"
tabs={tabs} tabs={tabs}
items={["test"]}
getInitialValues={getInitialValues} getInitialValues={getInitialValues}
getFinalValues={getFinalValues} getFinalValues={getFinalValues}
getText={() => "test"}
validationSchema={validationSchema} validationSchema={validationSchema}
onHide={onHide} onHide={onHide}
onCreate={handleCreate} onCreate={handleCreate}

@ -39,10 +39,13 @@ const EditVolumeModal = (props: IEditVolumeModal) => {
return ( return (
<FormModal <FormModal
title="Edit volume" title="Volumes > Edit"
resourceType="volume"
tabs={tabs} tabs={tabs}
getInitialValues={getInitialValues} getInitialValues={getInitialValues}
getFinalValues={getFinalValues} getFinalValues={getFinalValues}
items={["test"]}
getText={() => "test"}
selectedNode={selectedNode} selectedNode={selectedNode}
validationSchema={validationSchema} validationSchema={validationSchema}
onHide={onHide} onHide={onHide}

Loading…
Cancel
Save