1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-07-12 13:48:35 +02:00

feat: use modal for managing link templates (#9955)

Editing with modals is more focused.
This commit is contained in:
Tymoteusz Czech 2025-05-12 11:52:48 +02:00 committed by GitHub
parent 5614cb56d3
commit 1ccd201a25
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 74 additions and 47 deletions

View File

@ -0,0 +1,41 @@
import { Dialog, DialogContent, DialogTitle } from '@mui/material';
import type { ProjectLinkTemplateSchema } from 'openapi';
import ProjectLinkTemplateEditor from './ProjectLinkTemplateEditor';
interface IProjectLinkTemplateDialogProps {
template?: ProjectLinkTemplateSchema;
open: boolean;
onSave: (template: ProjectLinkTemplateSchema) => void;
onCancel: () => void;
isAdding: boolean;
}
const ProjectLinkTemplateDialog = ({
template,
open,
onSave,
onCancel,
isAdding,
}: IProjectLinkTemplateDialogProps) => (
<Dialog
open={open}
onClose={onCancel}
maxWidth='sm'
fullWidth
aria-labelledby='dialog-link-template'
>
<DialogTitle id='dialog-link-template'>
{isAdding ? 'Add new link template' : 'Edit link template'}
</DialogTitle>
<DialogContent>
<ProjectLinkTemplateEditor
template={template}
onSave={onSave}
onCancel={onCancel}
isAdding={isAdding}
/>
</DialogContent>
</Dialog>
);
export default ProjectLinkTemplateDialog;

View File

@ -1,5 +1,5 @@
import { useState } from 'react'; import { useState } from 'react';
import { Button, styled, TextField, Typography } from '@mui/material'; import { Button, styled, TextField } from '@mui/material';
import type { ProjectLinkTemplateSchema } from 'openapi'; import type { ProjectLinkTemplateSchema } from 'openapi';
interface IProjectLinkTemplateEditorProps { interface IProjectLinkTemplateEditorProps {
@ -13,7 +13,7 @@ const StyledContainer = styled('div')(({ theme }) => ({
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
gap: theme.spacing(2), gap: theme.spacing(2),
padding: theme.spacing(3), marginTop: theme.spacing(1),
})); }));
const StyledDialogActions = styled('div')(({ theme }) => ({ const StyledDialogActions = styled('div')(({ theme }) => ({
@ -57,12 +57,6 @@ const ProjectLinkTemplateEditor = ({
return ( return (
<StyledContainer> <StyledContainer>
<Typography
variant='h5'
sx={(theme) => ({ fontSize: theme.typography.body1.fontSize })}
>
{isAdding ? 'Add new link template' : 'Edit link template'}
</Typography>
<TextField <TextField
label='Title (optional)' label='Title (optional)'
fullWidth fullWidth

View File

@ -15,7 +15,7 @@ import DeleteIcon from '@mui/icons-material/Delete';
import EditIcon from '@mui/icons-material/Edit'; import EditIcon from '@mui/icons-material/Edit';
import HelpOutlineIcon from '@mui/icons-material/HelpOutline'; import HelpOutlineIcon from '@mui/icons-material/HelpOutline';
import type { ProjectLinkTemplateSchema } from 'openapi'; import type { ProjectLinkTemplateSchema } from 'openapi';
import ProjectLinkTemplateEditor from './ProjectLinkTemplateEditor'; import ProjectLinkTemplateDialog from './ProjectLinkTemplateDialog';
import { Truncator } from 'component/common/Truncator/Truncator'; import { Truncator } from 'component/common/Truncator/Truncator';
interface IProjectLinkTemplatesProps { interface IProjectLinkTemplatesProps {
@ -59,13 +59,16 @@ const ProjectLinkTemplates = ({
linkTemplates = [], linkTemplates = [],
setLinkTemplates, setLinkTemplates,
}: IProjectLinkTemplatesProps) => { }: IProjectLinkTemplatesProps) => {
const [isAddingTemplate, setIsAddingTemplate] = useState(false); const [dialogOpen, setDialogOpen] = useState(false);
const [isAdding, setIsAdding] = useState(false);
const [editingTemplateIndex, setEditingTemplateIndex] = useState< const [editingTemplateIndex, setEditingTemplateIndex] = useState<
number | null number | null
>(null); >(null);
const handleEditTemplate = (index: number) => { const handleEditTemplate = (index: number) => {
setEditingTemplateIndex(index); setEditingTemplateIndex(index);
setIsAdding(false);
setDialogOpen(true);
}; };
const handleSaveTemplate = (template: ProjectLinkTemplateSchema) => { const handleSaveTemplate = (template: ProjectLinkTemplateSchema) => {
@ -73,16 +76,16 @@ const ProjectLinkTemplates = ({
const updatedTemplates = [...linkTemplates]; const updatedTemplates = [...linkTemplates];
updatedTemplates[editingTemplateIndex] = template; updatedTemplates[editingTemplateIndex] = template;
setLinkTemplates?.(updatedTemplates); setLinkTemplates?.(updatedTemplates);
setEditingTemplateIndex(null);
} else { } else {
setLinkTemplates?.([...linkTemplates, template]); setLinkTemplates?.([...linkTemplates, template]);
setIsAddingTemplate(false);
} }
handleCancelEdit();
}; };
const handleCancelEdit = () => { const handleCancelEdit = () => {
setEditingTemplateIndex(null); setEditingTemplateIndex(null);
setIsAddingTemplate(false); setIsAdding(false);
setDialogOpen(false);
}; };
const handleDeleteTemplate = (index: number) => { const handleDeleteTemplate = (index: number) => {
@ -127,22 +130,6 @@ const ProjectLinkTemplates = ({
{linkTemplates.length > 0 ? ( {linkTemplates.length > 0 ? (
<StyledLinkTemplatesList> <StyledLinkTemplatesList>
{linkTemplates.map((template, index) => { {linkTemplates.map((template, index) => {
if (editingTemplateIndex === index) {
return (
<StyledLinkTemplateItem
key={index}
style={{ listStyleType: 'none' }}
>
<ProjectLinkTemplateEditor
template={template}
onSave={handleSaveTemplate}
onCancel={handleCancelEdit}
isAdding={false}
/>
</StyledLinkTemplateItem>
);
}
return ( return (
<StyledLinkTemplateItem key={index}> <StyledLinkTemplateItem key={index}>
<ListItemText <ListItemText
@ -192,25 +179,30 @@ const ProjectLinkTemplates = ({
</StyledLinkTemplatesList> </StyledLinkTemplatesList>
) : null} ) : null}
{isAddingTemplate && ( <ProjectLinkTemplateDialog
<ProjectLinkTemplateEditor open={dialogOpen}
onSave={handleSaveTemplate} onSave={handleSaveTemplate}
onCancel={handleCancelEdit} onCancel={handleCancelEdit}
isAdding={true} isAdding={isAdding}
/> template={
)} editingTemplateIndex !== null
? linkTemplates[editingTemplateIndex]
: undefined
}
/>
{!isAddingTemplate && editingTemplateIndex === null && ( <Box display='flex' justifyContent='flex-start'>
<Box display='flex' justifyContent='flex-start'> <Button
<Button startIcon={<AddIcon />}
startIcon={<AddIcon />} variant='outlined'
variant='outlined' onClick={() => {
onClick={() => setIsAddingTemplate(true)} setIsAdding(true);
> setDialogOpen(true);
Add link template }}
</Button> >
</Box> Add link template
)} </Button>
</Box>
</StyledLinkTemplatesContainer> </StyledLinkTemplatesContainer>
); );
}; };