Skip to content

Commit

Permalink
Add two different dialogs for one button and two button actions
Browse files Browse the repository at this point in the history
  • Loading branch information
guergana committed Oct 19, 2024
1 parent 582a78c commit 57d3100
Show file tree
Hide file tree
Showing 15 changed files with 177 additions and 41 deletions.
2 changes: 1 addition & 1 deletion client/components/Application/Dialogs/AdjustFile.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as React from 'react'
import Box from '@mui/material/Box'
import DisplaySettingsIcon from '@mui/icons-material/DisplaySettings'
import ConfirmDialog from '../../Parts/Dialogs/Confirm'
import ConfirmDialog from '../../Parts/Dialogs/OneButton'
import SelectField from '../../Parts/Fields/Select'
import InputField from '../../Parts/Fields/Input'
import * as store from '@client/store'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import DangerousIcon from '@mui/icons-material/Dangerous'
import ConfirmDialog from '../../Parts/Dialogs/Confirm'
import ConfirmDialog from '../../Parts/Dialogs/OneButton'
import * as store from '@client/store'

export default function CloseWithUnsavedChangesDialog() {
Expand Down
2 changes: 1 addition & 1 deletion client/components/Application/Dialogs/Config.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as React from 'react'
import Box from '@mui/material/Box'
import SaveIcon from '@mui/icons-material/Save'
import ConfirmDialog from '../../Parts/Dialogs/Confirm'
import ConfirmDialog from '../../Parts/Dialogs/OneButton'
import ConfigEditor from '../../Editors/Config'
import * as store from '@client/store'

Expand Down
2 changes: 1 addition & 1 deletion client/components/Application/Dialogs/Create.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as React from 'react'
import Box from '@mui/material/Box'
import LinearProgress from '@mui/material/LinearProgress'
import ConfirmDialog from '../../Parts/Dialogs/Confirm'
import ConfirmDialog from '../../Parts/Dialogs/OneButton'
import MultilineField from '../../Parts/Fields/Multiline'
import InputField from '../../Parts/Fields/Input'
import Columns from '../../Parts/Grids/Columns'
Expand Down
6 changes: 3 additions & 3 deletions client/components/Application/Dialogs/DeleteFilesFolders.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import ConfirmDialog from '../../Parts/Dialogs/Confirm'
import TwoButtonDialog from '../../Parts/Dialogs/TwoButton'
import * as store from '@client/store'

export default function DeleteFilesFoldersDialog() {
Expand All @@ -22,15 +22,15 @@ export default function DeleteFilesFoldersDialog() {
if (!path) return null

return (
<ConfirmDialog
<TwoButtonDialog
open={true}
title="Delete File"
description={
selectedMultiplePaths
? 'Are you sure you want to delete these elements?'
: `Are you sure you want to delete this ${isFolder ? 'folder' : 'file'}?`
}
label="Yes"
label="Delete"
cancelLabel="No"
onCancel={store.closeDialog}
onConfirm={async () => {
Expand Down
2 changes: 1 addition & 1 deletion client/components/Application/Dialogs/IndexFiles.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as React from 'react'
import DeleteIcon from '@mui/icons-material/Delete'
import ConfirmDialog from '../../Parts/Dialogs/Confirm'
import ConfirmDialog from '../../Parts/Dialogs/OneButton'
import LinearSensor from '../../Parts/Sensors/Linear'
import * as store from '@client/store'
import { client } from '@client/client'
Expand Down
2 changes: 1 addition & 1 deletion client/components/Application/Dialogs/Publish.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Box from '@mui/material/Box'
import Link from '@mui/material/Link'
import LinearProgress from '@mui/material/LinearProgress'
import CheckIcon from '@mui/icons-material/Check'
import ConfirmDialog from '../../Parts/Dialogs/Confirm'
import ConfirmDialog from '../../Parts/Dialogs/OneButton'
import PortalEditor from '../../Editors/Portal'
import * as helpers from '../../../helpers'
import * as types from '../../../types'
Expand Down
4 changes: 2 additions & 2 deletions client/components/Application/Dialogs/UnsavedChanges.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import DangerousIcon from '@mui/icons-material/Dangerous'
import ConfirmDialog from '../../Parts/Dialogs/Confirm'
import TwoButtonDialog from '../../Parts/Dialogs/TwoButton'
import * as store from '@client/store'

export default function UnsavedChangesDialog() {
Expand All @@ -14,7 +14,7 @@ export default function UnsavedChangesDialog() {
}

return (
<ConfirmDialog
<TwoButtonDialog
open={true}
title="Unsaved Changes"
cancelLabel="Discard"
Expand Down
10 changes: 5 additions & 5 deletions client/components/Parts/Buttons/SimpleButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@ interface SimpleButtonProps extends ButtonProps {
}

export default function SimpleButton(props: SimpleButtonProps) {
const { label, small, ...others } = props
const { label, ...others } = props

const buttonTextColor = props.color === 'OKFNWhite' ? 'gray': 'white'
return (
<Button
fullWidth={!props.small}
color={props.color}
{...others}
>
{small ? (
<Typography sx={{ fontWeight: 300, textTransform: 'capitalize' }}>
{(
<Typography sx={{ textTransform: 'capitalize', fontWeight: 600, color: buttonTextColor }}>
{label}
</Typography>
) : (
label
)}
</Button>
)
Expand Down
23 changes: 16 additions & 7 deletions client/components/Parts/Dialogs/Input.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as React from 'react'
import InputAdornment from '@mui/material/InputAdornment'
import TextField from '@mui/material/TextField'
import ConfirmDialog, { ConfirmDialogProps } from './Confirm'
import OneButtonDialog, { ConfirmDialogProps } from './OneButton'

export interface InputDialogProps extends Omit<ConfirmDialogProps, 'onConfirm'> {
value?: string
Expand All @@ -19,11 +19,7 @@ export default function InputDialog(props: InputDialogProps) {

const handleConfirm = () => onConfirm && onConfirm(value)
return (
<ConfirmDialog
{...rest}
onConfirm={handleConfirm}
disabled={props.disabled || !value}
>
<OneButtonDialog {...rest} onConfirm={handleConfirm} disabled={!value}>
<TextField
error={!!errorMessage}
helperText={errorMessage || ' '}
Expand All @@ -42,8 +38,21 @@ export default function InputDialog(props: InputDialogProps) {
<InputAdornment position="start">{prefix}</InputAdornment>
) : undefined,
}}
sx={{ marginBottom: 1,
'& .MuiOutlinedInput-root': {
'& fieldset': {
borderColor: 'gray',
},
'&:hover fieldset': {
borderColor: '#00D1FF',
},
'&.Mui-focused fieldset': {
borderColor: '#00D1FF',
},
},
}}
/>
{props.children}
</ConfirmDialog>
</OneButtonDialog>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import SimpleButton from '../Buttons/SimpleButton'
import Columns from '../Grids/Columns'
import IconButton from '@mui/material/IconButton'
import CloseIcon from '@mui/icons-material/Close'

Expand Down Expand Up @@ -66,7 +65,7 @@ export default function ConfirmDialog(props: ConfirmDialogProps) {
paddingBottom: 1,
marginBottom: 2,
borderBottom: 'solid 1px #ddd',
backgroundColor: '#fafafa',
backgroundColor: (theme) => theme.palette.OKFNGray100.main,
}}
>
{props.title || 'Dialog'}
Expand All @@ -83,18 +82,17 @@ export default function ConfirmDialog(props: ConfirmDialogProps) {
</Box>
)}
</DialogContent>
<Box sx={{ paddingX: 3, paddingY: 1 }}>
<Columns spacing={2}>
<SimpleButton
fullWidth
label={props.label || 'Confirm'}
sx={{ my: 0.5 }}
onClick={handleConfirm}
aria-label="accept"
variant="contained"
disabled={props.disabled || props.loading}
/>
</Columns>
<Box sx={{ paddingX: 3, paddingY: 2, display: 'flex', justifyContent: 'flex-end' }}>
<SimpleButton
fullWidth
label={props.label || 'Confirm'}
sx={{ my: 0.5 }}
onClick={handleConfirm}
aria-label="accept"
variant="contained"
color={ props.label === 'Delete' ? 'OKFNRed500' : 'OKFNBlack' }
disabled={props.disabled || props.loading}
/>
</Box>
</Dialog>
)
Expand Down
2 changes: 1 addition & 1 deletion client/components/Parts/Dialogs/Pick.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import ListItemText from '@mui/material/ListItemText'
import ListItemIcon from '@mui/material/ListItemIcon'
import Checkbox from '@mui/material/Checkbox'
import Divider from '@mui/material/Divider'
import ConfirmDialog, { ConfirmDialogProps } from './Confirm'
import ConfirmDialog, { ConfirmDialogProps } from './OneButton'

interface PickDialogProps extends Omit<ConfirmDialogProps, 'onConfirm'> {
items: string[]
Expand Down
113 changes: 113 additions & 0 deletions client/components/Parts/Dialogs/TwoButton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import * as React from 'react'
import LinearProgress from '@mui/material/LinearProgress'
import Box from '@mui/material/Box'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import SimpleButton from '../Buttons/SimpleButton'
import IconButton from '@mui/material/IconButton'
import CloseIcon from '@mui/icons-material/Close'

export interface ConfirmDialogProps {
open?: boolean
title?: string
description?: string
Icon?: React.ElementType
label?: string
cancelLabel?: string
loading?: boolean
disabled?: boolean
maxWidth?: 'md' | 'xl'
onCancel?: () => void
onConfirm?: () => void
ctrlEnter?: boolean
children?: React.ReactNode
disableClosing?: boolean
}

export default function ConfirmDialog(props: ConfirmDialogProps) {
const handleCancel = () => props.onCancel && props.onCancel()
const handleConfirm = () => props.onConfirm && props.onConfirm()

const handleClose = () => {
if (props.loading) return
if (props.disableClosing) return
handleCancel()
}

return (
<Dialog
fullWidth
maxWidth={props.maxWidth}
open={!!props.open}
onClose={handleClose}
aria-labelledby="dialog-title"
aria-describedby="dialog-description"
onKeyDown={(event) => {
if ((!props.ctrlEnter || event.ctrlKey) && event.key === 'Enter') handleConfirm()
}}
>
<IconButton
aria-label="close"
onClick={handleClose}
sx={{
position: 'absolute',
right: 8,
top: 8,
color: (theme) => theme.palette.grey[500],
}}
>
<CloseIcon />
</IconButton>
<DialogTitle
id="dialog-title"
sx={{
paddingBottom: 1,
marginBottom: 2,
borderBottom: 'solid 1px #ddd',
backgroundColor: (theme) => theme.palette.OKFNGray100.main,
}}
>
{props.title || 'Dialog'}
</DialogTitle>
<DialogContent sx={{ paddingTop: 0, paddingBottom: 0 }}>
{props.description && (
<Box sx={{ marginBottom: 1, opacity: 0.6 }}>{props.description}</Box>
)}
{props.children}
{props.loading && (
<Box sx={{ paddingY: 1, marginY: 1 }}>
Loading
<LinearProgress />
</Box>
)}
</DialogContent>
<Box sx={{ paddingX: 3, paddingY: 2, display: 'flex', justifyContent: 'flex-end' }}>
{ props.cancelLabel ? (
<Box sx={{ paddingRight: '12px' }}>
<SimpleButton
small
label={'Cancel'}
sx={{ my: 0.5 }}
onClick={handleCancel}
aria-label="cancel"
variant="contained"
disabled={props.disabled || props.loading}
color="OKFNWhite"
/>
</Box>
) : null }
<SimpleButton
small
label={props.label || 'Confirm'}
sx={{ my: 0.5 }}
onClick={handleConfirm}
aria-label="accept"
variant="contained"
color={ props.label === 'Delete' ? 'OKFNRed500' : 'OKFNBlack' }
disabled={props.disabled || props.loading}
/>
</Box>
</Dialog>
)
}
10 changes: 8 additions & 2 deletions client/components/Parts/Grids/Columns.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,23 @@ interface ColumnsProps {

export default function Columns(props: React.PropsWithChildren<ColumnsProps>) {
const columns = props.columns || 12

// In conditional rendering props.children still returns an array that includes the
// null value. This ensures that the null value is removed from the array
const childrenNoNull = React.Children.toArray(props.children).filter( (element: React.ReactNode) => element)

const defaultWidth = Math.round(
columns / React.Children.count(props.children)
columns / React.Children.count(childrenNoNull)
) as GridSize

return (
<Grid
container
columns={columns}
columnSpacing={props.spacing}
sx={{ height: props.height }}
>
{React.Children.map(props.children, (child, index) => (
{React.Children.map(childrenNoNull, (child, index) => (
<Grid item key={index} md={props.layout ? props.layout[index] : defaultWidth}>
{child}
</Grid>
Expand Down
12 changes: 11 additions & 1 deletion client/themes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ declare module '@mui/material/styles' {
OKFNRed400: SimplePaletteColorOptions
OKFNRed500: SimplePaletteColorOptions
OKFNGreenBlue: SimplePaletteColorOptions
OKFNBlack: SimplePaletteColorOptions
OKFNWhite: SimplePaletteColorOptions
}
interface Palette extends CustomPalette {}
interface PaletteOptions extends CustomPalette {}
Expand All @@ -25,6 +27,8 @@ declare module '@mui/material/Button' {
OKFNRed400: true
OKFNRed500: true
OKFNGreenBlue: true
OKFNBlack: true
OKFNWhite: true
}
}

Expand Down Expand Up @@ -62,7 +66,7 @@ export const DEFAULT = createTheme({
main: '#4C5564',
},
OKFNGray100: {
main: '#F4F4F$',
main: '#F4F4F4',
},
OKFNGray500: {
main: '#717879',
Expand All @@ -83,5 +87,11 @@ export const DEFAULT = createTheme({
OKFNGreenBlue: {
main: '#56C4A3',
},
OKFNBlack: {
main: '#000000',
},
OKFNWhite: {
main: '#FFFFFF',
},
},
})

0 comments on commit 57d3100

Please sign in to comment.