@mui/material#Dialog TypeScript Examples
The following examples show how to use
@mui/material#Dialog.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: ChangelogDialog.tsx From airmessage-web with Apache License 2.0 | 6 votes |
/**
* A dialog that shows the app version and latest changelog
*/
export default function ChangelogDialog(props: {isOpen: boolean, onDismiss: () => void}) {
//Generating the build details
const buildDate = getFormattedBuildDate();
const buildVersion = `AirMessage for web ${appVersion}`;
const detailedBuildVersion = buildVersion + ` (${releaseHash ?? "unlinked"})`;
const buildTitle = buildVersion + (buildDate ? (`, ${WPEnv.ENVIRONMENT === "production" ? "released" : "built"} ${buildDate}`) : "");
return (
<Dialog
open={props.isOpen}
onClose={props.onDismiss}
fullWidth>
<DialogTitle>Release notes</DialogTitle>
<DialogContent dividers>
<Typography variant="overline" color="textSecondary" gutterBottom title={detailedBuildVersion}>{buildTitle}</Typography>
<Markdown markdown={changelog} />
</DialogContent>
</Dialog>
);
}
Example #2
Source File: Files.tsx From NekoMaid with MIT License | 6 votes |
CompressDialog: React.FC<{ file: string | null, dirs: Record<string, boolean>, onClose: () => void, plugin: Plugin, path: string, refresh: () => void }> =
({ dirs, file, onClose, plugin, path, refresh }) => {
const [value, setValue] = useState('')
const [ext, setExt] = useState('zip')
useEffect(() => {
setValue(file || 'server')
}, [file])
let error: string | undefined
if (!validFilename(value)) error = lang.files.wrongName
else if (((path || '/') + value + '.' + ext) in dirs) error = lang.files.exists
return <Dialog open={file != null} onClose={onClose}>
<DialogTitle>{lang.files.compress}</DialogTitle>
<DialogContent>
<DialogContentText>{lang.files.compressName}</DialogContentText>
<TextField value={value} variant='standard' error={!!error} helperText={error} onChange={e => setValue(e.target.value)} />
<Select variant='standard' value={ext} onChange={e => setExt(e.target.value)}>
{compressFileExt.map(it => <MenuItem key={it} value={it}>.{it}</MenuItem>)}
</Select>
</DialogContent>
<DialogActions>
<Button onClick={onClose}>{minecraft['gui.cancel']}</Button>
<Button disabled={!!error} onClick={() => {
onClose()
plugin.emit('files:compress', (res: boolean) => {
action(res)
refresh()
}, file, value, ext)
}}>{minecraft['gui.ok']}</Button>
</DialogActions>
</Dialog>
}
Example #3
Source File: Home.tsx From mui-toolpad with MIT License | 6 votes |
function AppDeleteDialog({ app, onClose }: AppDeleteDialogProps) {
const latestApp = useLatest(app);
const deleteAppMutation = client.useMutation('deleteApp');
const handleDeleteClick = React.useCallback(async () => {
if (app) {
await deleteAppMutation.mutateAsync([app.id]);
}
await client.refetchQueries('getApps');
onClose();
}, [app, deleteAppMutation, onClose]);
return (
<Dialog open={!!app} onClose={onClose}>
<DialogForm>
<DialogTitle>Confirm delete</DialogTitle>
<DialogContent>
Are you sure you want to delete application "{latestApp?.name}"
</DialogContent>
<DialogActions>
<Button color="inherit" variant="text" onClick={onClose}>
Cancel
</Button>
<LoadingButton
type="submit"
loading={deleteAppMutation.isLoading}
onClick={handleDeleteClick}
color="error"
>
Delete
</LoadingButton>
</DialogActions>
</DialogForm>
</Dialog>
);
}
Example #4
Source File: cookies-dialog.tsx From master-frontend-lemoncode with MIT License | 6 votes |
CookiesDialog: React.FunctionComponent<Props> = (props) => {
const { onAgreeClick } = props;
const [open, setOpen] = React.useState(false);
const handleAgreeClick = () => {
setOpen(false);
onAgreeClick();
};
return (
<>
<Button variant="outlined" onClick={() => setOpen(true)}>
Learn more about our cookies
</Button>
<Dialog open={open} onClose={() => setOpen(false)}>
<DialogTitle>About cookies</DialogTitle>
<DialogContent>
<DialogContentText>
Any information that you voluntarily provide to us, including your
name and email address, will be used for the sole purpose for which
the information was provided to us. In addition, communication
exchanges on this website are public (not private) communications.
Therefore, any message that you post on this website will be
considered and treated as available for public use and distribution.
</DialogContentText>
</DialogContent>
<DialogActions>
<Button color="primary" onClick={handleAgreeClick}>
Agree
</Button>
</DialogActions>
</Dialog>
</>
);
}
Example #5
Source File: DeleteSelectedModal.tsx From frontend with MIT License | 6 votes |
function DeleteSelectedModal({
isOpen,
handleDeleteModalClose,
handleDelete,
}: {
isOpen: boolean
handleDeleteModalClose: () => void
handleDelete: () => void
}) {
return (
<Modal open={isOpen} onClose={handleDeleteModalClose}>
<Dialog open={isOpen} onClose={handleDeleteModalClose}>
<DialogTitle>Искате ли да изтриете избраните кампании?</DialogTitle>
<DialogActions>
<Button onClick={handleDelete} autoFocus>
Да
</Button>
<Button onClick={handleDeleteModalClose}>Не</Button>
</DialogActions>
</Dialog>
</Modal>
)
}
Example #6
Source File: AddToQueue.tsx From multi-downloader-nx with MIT License | 6 votes |
AddToQueue: React.FC = () => {
const [isOpen, setOpen] = React.useState(false);
return <Box>
<EpisodeListing />
<Dialog open={isOpen} onClose={() => setOpen(false)} maxWidth='md'>
<Box sx={{ border: '2px solid white', p: 2 }}>
<SearchBox />
<Divider variant='middle' className="divider-width" light sx={{ color: 'text.primary', fontSize: '1.2rem' }}>Options</Divider>
<DownloadSelector onFinish={() => setOpen(false)} />
</Box>
</Dialog>
<Button variant='contained' onClick={() => setOpen(true)}>
<Add />
</Button>
</Box>
}
Example #7
Source File: UTXODetail.tsx From sapio-studio with Mozilla Public License 2.0 | 6 votes |
function ContinuationOption(props: { v: Continuation }) {
const [is_open, setOpen] = React.useState(false);
const name = props.v.path.substr(props.v.path.lastIndexOf('/') + 1);
const dispatch = useDispatch();
return (
<div>
<Button onClick={() => setOpen(true)} variant="contained">
{name}
</Button>
<Dialog open={is_open} onClose={() => setOpen(false)}>
<DialogTitle>
<Typography variant="h5">{name}</Typography>
<ASM
className="txhex"
value={props.v.path}
label="Full Path"
/>
</DialogTitle>
<DialogContent>
<MemoizeContForm {...props} />
</DialogContent>
<DialogActions>
<Button onClick={() => dispatch(recreate_contract())}>
Recompile
</Button>
<Button onClick={() => setOpen(false)}>Close</Button>
</DialogActions>
</Dialog>
</div>
);
}
Example #8
Source File: SignOutDialog.tsx From airmessage-web with Apache License 2.0 | 6 votes |
/**
* A dialog that prompts the user to sign out
*/
export default function SignOutDialog(props: {isOpen: boolean, onDismiss: VoidFunction}) {
const onDismiss = props.onDismiss;
const signOut = useContext(LoginContext).signOut;
const onConfirm = useCallback(() => {
//Dismissing the dialog
onDismiss();
//Signing out
signOut();
}, [onDismiss, signOut]);
return (
<Dialog
open={props.isOpen}
onClose={props.onDismiss}>
<DialogTitle>Sign out of AirMessage?</DialogTitle>
<DialogContent>
<DialogContentText>
You won't be able to send or receive any messages from this computer
</DialogContentText>
</DialogContent>
<DialogActions>
<Button onClick={props.onDismiss} color="primary">
Cancel
</Button>
<Button onClick={onConfirm} color="primary" autoFocus>
Sign out
</Button>
</DialogActions>
</Dialog>
);
}
Example #9
Source File: Home.tsx From mui-toolpad with MIT License | 6 votes |
function CreateAppDialog({ onClose, ...props }: CreateAppDialogProps) {
const [name, setName] = React.useState('');
const createAppMutation = client.useMutation('createApp');
return (
<Dialog {...props} onClose={onClose}>
<DialogForm
onSubmit={async (event) => {
event.preventDefault();
const app = await createAppMutation.mutateAsync([name]);
window.location.href = `/_toolpad/app/${app.id}/editor`;
}}
>
<DialogTitle>Create a new MUI Toolpad App</DialogTitle>
<DialogContent>
<TextField
sx={{ my: 1 }}
autoFocus
fullWidth
label="name"
value={name}
onChange={(event) => setName(event.target.value)}
/>
</DialogContent>
<DialogActions>
<Button color="inherit" variant="text" onClick={onClose}>
Cancel
</Button>
<LoadingButton type="submit" loading={createAppMutation.isLoading} disabled={!name}>
Create
</LoadingButton>
</DialogActions>
</DialogForm>
</Dialog>
);
}
Example #10
Source File: GroupDeleteModal.tsx From abrechnung with GNU Affero General Public License v3.0 | 6 votes |
export default function GroupDeleteModal({ show, onClose, groupToDelete }) {
const confirmDeleteGroup = () => {
deleteGroup({ groupID: groupToDelete.id })
.then((res) => {
onClose();
})
.catch((err) => {
toast.error(err);
});
};
return (
<Dialog open={show} onClose={onClose}>
<DialogTitle>Delete Group</DialogTitle>
<DialogContent>
<DialogContentText>
{groupToDelete ? <span>Are you sure you want to delete group {groupToDelete.name}</span> : null}
</DialogContentText>
</DialogContent>
<DialogActions>
<Button color="primary" onClick={onClose}>
No
</Button>
<Button color="error" onClick={confirmDeleteGroup}>
Yes pls
</Button>
</DialogActions>
</Dialog>
);
}
Example #11
Source File: UpdateRequiredDialog.tsx From airmessage-web with Apache License 2.0 | 6 votes |
/**
* A dialog that warns the user to check their server for updates
*/
export default function UpdateRequiredDialog(props: {isOpen: boolean, onDismiss: () => void}) {
return (
<Dialog
open={props.isOpen}
onClose={props.onDismiss}
fullWidth>
<DialogTitle>Your server needs to be updated</DialogTitle>
<DialogContent>
<DialogContentText>
<Typography paragraph>
You're running an unsupported version of AirMessage Server.
</Typography>
<Typography paragraph>
Unsupported versions of AirMessage Server may contain security or stability issues,
and will start refusing connections late January.
</Typography>
<Typography paragraph>
Please install the latest version of AirMessage Server from <Link href="https://airmessage.org" target="_blank">airmessage.org</Link> on your Mac.
</Typography>
</DialogContentText>
</DialogContent>
</Dialog>
);
}
Example #12
Source File: UrlQueryEditor.tsx From mui-toolpad with MIT License | 5 votes |
export default function UrlQueryEditor({ pageNodeId }: UrlQueryEditorProps) {
const dom = useDom();
const domApi = useDomApi();
const page = appDom.getNode(dom, pageNodeId, 'page');
const [dialogOpen, setDialogOpen] = React.useState(false);
const [input, setInput] = React.useState(page.attributes.urlQuery.value || {});
React.useEffect(
() => setInput(page.attributes.urlQuery.value || {}),
[page.attributes.urlQuery.value],
);
const handleSave = React.useCallback(() => {
domApi.setNodeNamespacedProp(page, 'attributes', 'urlQuery', appDom.createConst(input));
}, [domApi, page, input]);
return (
<React.Fragment>
<Button color="inherit" startIcon={<AddIcon />} onClick={() => setDialogOpen(true)}>
URL query
</Button>
<Dialog fullWidth open={dialogOpen} onClose={() => setDialogOpen(false)}>
<DialogTitle>Edit URL query</DialogTitle>
<DialogContent>
<StringRecordEditor
sx={{ my: 1 }}
fieldLabel="Parameter"
valueLabel="Default value"
value={input}
onChange={setInput}
autoFocus
/>
</DialogContent>
<DialogActions>
<Button color="inherit" variant="text" onClick={() => setDialogOpen(false)}>
Close
</Button>
<Button disabled={page.attributes.urlQuery.value === input} onClick={handleSave}>
Save
</Button>
</DialogActions>
</Dialog>
</React.Fragment>
);
}
Example #13
Source File: FeedbackDialog.tsx From airmessage-web with Apache License 2.0 | 5 votes |
/**
* A dialog that presents help and feedback options
*/
export default function FeedbackDialog(props: {isOpen: boolean, onDismiss: () => void}) {
const propsOnDismiss = props.onDismiss;
const onClickEmail = useCallback(async () => {
const body =
`\n\n---------- DEVICE INFORMATION ----------` +
Object.entries(await getPlatformUtils().getExtraEmailDetails())
.map(([key, value]) => `\n${key}: ${value}`)
.join("") +
`\nUser agent: ${navigator.userAgent}` +
`\nClient version: ${appVersion}` +
`\nCommunications version: ${getActiveCommVer()?.join(".")} (target ${targetCommVerString})` +
`\nProxy type: ${getActiveProxyType()}` +
`\nServer system version: ${getServerSystemVersion()}` +
`\nServer software version: ${getServerSoftwareVersion()}`;
const url = `mailto:${supportEmail}?subject=${encodeURIComponent("AirMessage feedback")}&body=${encodeURIComponent(body)}`;
window.open(url, "_blank");
propsOnDismiss();
}, [propsOnDismiss]);
const onClickCommunity = useCallback(() => {
window.open(communityPage, "_blank");
propsOnDismiss();
}, [propsOnDismiss]);
return (
<Dialog
open={props.isOpen}
onClose={props.onDismiss}>
<DialogTitle>Help and feedback</DialogTitle>
<DialogContent>
<DialogContentText>
Have a bug to report, a feature to suggest, or anything else to say? Contact us or discuss with others using the links below.
</DialogContentText>
</DialogContent>
<DialogActions>
<Button onClick={onClickEmail} color="primary">
Send E-Mail
</Button>
<Button onClick={onClickCommunity} color="primary" autoFocus>
Open community subreddit
</Button>
</DialogActions>
</Dialog>
);
}
Example #14
Source File: ServerSwitch.tsx From NekoMaid with MIT License | 5 votes |
ServerSwitch: React.FC<DialogProps> = props => {
const [value, setValue] = useState<string>('')
let error = false
// eslint-disable-next-line no-new
try { if (value) new URL(value.startsWith('http://') ? value : 'http://' + value) } catch { error = true }
return <Dialog fullWidth maxWidth='xs' {...props}>
<DialogTitle>{lang.serverSwitch.title}</DialogTitle>
<DialogContent sx={{ overflow: 'hidden' }}>
<Autocomplete
freeSolo
inputValue={value}
clearOnBlur={false}
onInputChange={(_: any, v: string) => setValue(v)}
noOptionsText={lang.serverSwitch.noServer}
style={{ width: '100%', maxWidth: 500, marginTop: 10 }}
options={JSON.parse(localStorage.getItem('NekoMaid:servers') || '[]')}
getOptionLabel={(option: any) => option.address}
renderInput={(props: any) => <TextField
{...props}
error={error}
label={minecraft['addServer.enterIp']}
helperText={error ? lang.serverSwitch.wrongHostname : undefined}
/>}
/>
<DialogContentText>{lang.serverSwitch.content}</DialogContentText>
</DialogContent>
<DialogActions>
<Button
color='primary'
disabled={error}
onClick={() => (location.search = '?' + encodeURIComponent(value))}
>{lang.serverSwitch.connect}</Button>
</DialogActions>
</Dialog>
}
Example #15
Source File: QueryStateEditor.tsx From mui-toolpad with MIT License | 5 votes |
export default function QueryStateEditor() {
const dom = useDom();
const state = usePageEditorState();
const domApi = useDomApi();
const [editedState, setEditedState] = React.useState<NodeId | null>(null);
const editedStateNode = editedState ? appDom.getNode(dom, editedState, 'queryState') : null;
const handleEditStateDialogClose = React.useCallback(() => setEditedState(null), []);
const page = appDom.getNode(dom, state.nodeId, 'page');
const { queryStates = [] } = appDom.getChildNodes(dom, page) ?? [];
// To keep dialog content around during closing animation
const lastEditedStateNode = useLatest(editedStateNode);
const handleRemove = React.useCallback(() => {
if (editedStateNode) {
domApi.removeNode(editedStateNode.id);
}
handleEditStateDialogClose();
}, [editedStateNode, handleEditStateDialogClose, domApi]);
return queryStates.length > 0 ? (
<Stack spacing={1} alignItems="start">
<List>
{queryStates.map((stateNode) => {
return (
<ListItem key={stateNode.id} button onClick={() => setEditedState(stateNode.id)}>
{stateNode.name}
</ListItem>
);
})}
</List>
{lastEditedStateNode ? (
<Dialog
fullWidth
maxWidth="lg"
open={!!editedStateNode}
onClose={handleEditStateDialogClose}
scroll="body"
>
<DialogTitle>Edit Query State ({lastEditedStateNode.id})</DialogTitle>
<DialogContent>
<QueryStateNodeEditor node={lastEditedStateNode} />
</DialogContent>
<DialogActions>
<Button color="inherit" variant="text" onClick={handleEditStateDialogClose}>
Close
</Button>
<Button onClick={handleRemove}>Remove</Button>
</DialogActions>
</Dialog>
) : null}
</Stack>
) : null;
}
Example #16
Source File: PictureDialog.tsx From aws_serverless_photo_gallery with MIT License | 5 votes |
export default function PictureDialog({
onClose,
file,
}: {
onClose: Function
file?: DixieFile
}) {
const [comments, setComments] = useState<Comment[]>()
const [loading, setLoading] = useState(false)
const [error, setError] = useState<unknown>()
const [counter, setCounter] = useState(0)
const [password] = useQueryParam('password', StringParam)
const classes = useStyles()
const handleClose = () => {
setLoading(false)
setError(undefined)
onClose()
}
useEffect(() => {
;(async () => {
try {
if (file) {
const result = await myfetchjson(
API_ENDPOINT + `/getDixieComments?filename=${file?.filename}`,
)
setComments(result)
}
} catch (e) {
setError(e)
}
})()
}, [file, counter])
return (
<Dialog onClose={handleClose} open={Boolean(file)} maxWidth="lg">
<DialogTitle>{file ? file.filename : ''}</DialogTitle>
<DialogContent>
{file ? (
<Media file={file} style={{ width: '80%', maxHeight: '70%' }}>
{getCaption(file)}
</Media>
) : null}
{error ? (
<div className={classes.error}>{`${error}`}</div>
) : loading ? (
'Loading...'
) : comments ? (
<div className={classes.posts}>
{comments
.sort((a, b) => a.timestamp - b.timestamp)
.map(comment => {
const { user, timestamp, message } = comment
return (
<div
key={JSON.stringify(comment)}
className={classes.post}
style={{ background: '#ddd' }}
>
<div>
{user ? user + ' - ' : ''}
{new Date(timestamp).toLocaleString()}
</div>
<div>{message}</div>
</div>
)
})}
</div>
) : null}
{file && password ? (
<CommentForm
filename={file.filename}
forceRefresh={() => setCounter(counter + 1)}
/>
) : null}
</DialogContent>
</Dialog>
)
}
Example #17
Source File: QueryEditor.tsx From mui-toolpad with MIT License | 5 votes |
function ConnectionSelectorDialog<Q>({ open, onCreated, onClose }: DataSourceSelectorProps<Q>) {
const dom = useDom();
const [input, setInput] = React.useState<NodeId | null>(null);
const handleClick = React.useCallback(() => {
const connectionId = input;
const connection = connectionId && appDom.getMaybeNode(dom, connectionId, 'connection');
if (!connection) {
throw new Error(`Invariant: Selected non-existing connection "${connectionId}"`);
}
const dataSourceId = connection.attributes.dataSource.value;
const dataSource = dataSources[dataSourceId];
if (!dataSource) {
throw new Error(`Invariant: Selected non-existing dataSource "${dataSourceId}"`);
}
const queryNode = appDom.createNode(dom, 'query', {
attributes: {
query: appDom.createConst(dataSource.getInitialQueryValue()),
connectionId: appDom.createConst(connectionId),
dataSource: appDom.createConst(dataSourceId),
},
});
onCreated(queryNode);
}, [dom, input, onCreated]);
return (
<Dialog open={open} onClose={onClose} scroll="body">
<DialogTitle>Create Query</DialogTitle>
<DialogContent>
<ConnectionSelect value={input} onChange={setInput} />
</DialogContent>
<DialogActions>
<Button color="inherit" variant="text" onClick={onClose}>
Cancel
</Button>
<Button disabled={!input} onClick={handleClick}>
Create query
</Button>
</DialogActions>
</Dialog>
);
}
Example #18
Source File: ConfirmationDialog.tsx From console with GNU Affero General Public License v3.0 | 5 votes |
ConfirmationDialog = ({
classes,
open,
cancelLabel,
okLabel,
onClose,
cancelOnClick,
okOnClick,
title,
description,
}: IConfirmationDialog) => {
const [isSending, setIsSending] = useState<boolean>(false);
const onClick = () => {
setIsSending(true);
if (okOnClick !== null) {
okOnClick();
}
setIsSending(false);
};
if (!open) return null;
return (
<Dialog
open={open}
onClose={onClose}
aria-labelledby="alert-dialog-title"
aria-describedby="alert-dialog-description"
>
<DialogTitle id="alert-dialog-title">{title}</DialogTitle>
<DialogContent>
{isSending && <LinearProgress />}
<DialogContentText id="alert-dialog-description">
{description}
</DialogContentText>
</DialogContent>
<DialogActions>
<Button onClick={cancelOnClick} color="primary" disabled={isSending}>
{cancelLabel || "Cancel"}
</Button>
<Button onClick={onClick} color="secondary" autoFocus>
{okLabel || "Ok"}
</Button>
</DialogActions>
</Dialog>
);
}
Example #19
Source File: CreateConnectionNodeDialog.tsx From mui-toolpad with MIT License | 5 votes |
export default function CreateConnectionDialog({
appId,
onClose,
...props
}: CreateConnectionDialogProps) {
const dom = useDom();
const domApi = useDomApi();
const [dataSourceType, setDataSourceType] = React.useState('');
const navigate = useNavigate();
return (
<Dialog {...props} onClose={onClose}>
<DialogForm
autoComplete="off"
onSubmit={(e) => {
e.preventDefault();
const dataSource = dataSources[dataSourceType];
if (!dataSource) {
throw new Error(`Can't find a datasource for "${dataSourceType}"`);
}
const newNode = appDom.createNode(dom, 'connection', {
attributes: {
dataSource: appDom.createConst(dataSourceType),
params: appDom.createSecret(null),
status: appDom.createConst(null),
},
});
const appNode = appDom.getApp(dom);
domApi.addNode(newNode, appNode, 'connections');
onClose();
navigate(`/app/${appId}/editor/connections/${newNode.id}`);
}}
>
<DialogTitle>Create a new MUI Toolpad Connection</DialogTitle>
<DialogContent>
<TextField
select
sx={{ my: 1 }}
fullWidth
value={dataSourceType}
label="Type"
onChange={(event) => setDataSourceType(event.target.value)}
>
{(Object.entries(dataSources) as ExactEntriesOf<typeof dataSources>).map(
([type, dataSourceDef]) =>
dataSourceDef && (
<MenuItem key={type} value={type}>
{dataSourceDef.displayName}
</MenuItem>
),
)}
</TextField>
</DialogContent>
<DialogActions>
<Button color="inherit" variant="text" onClick={onClose}>
Cancel
</Button>
<Button type="submit" disabled={!dataSourceType}>
Create
</Button>
</DialogActions>
</DialogForm>
</Dialog>
);
}
Example #20
Source File: WalletDialog.tsx From wallet-adapter with Apache License 2.0 | 5 votes |
RootDialog = styled(Dialog)(({ theme }: { theme: Theme }) => ({
'& .MuiDialog-paper': {
width: theme.spacing(40),
margin: 0,
},
'& .MuiDialogTitle-root': {
backgroundColor: theme.palette.primary.main,
display: 'flex',
justifyContent: 'space-between',
lineHeight: theme.spacing(5),
'& .MuiIconButton-root': {
flexShrink: 1,
padding: theme.spacing(),
marginRight: theme.spacing(-1),
color: theme.palette.grey[500],
},
},
'& .MuiDialogContent-root': {
padding: 0,
'& .MuiCollapse-root': {
'& .MuiList-root': {
background: theme.palette.grey[900],
},
},
'& .MuiList-root': {
background: theme.palette.grey[900],
padding: 0,
},
'& .MuiListItem-root': {
boxShadow: 'inset 0 1px 0 0 ' + 'rgba(255, 255, 255, 0.1)',
'&:hover': {
boxShadow:
'inset 0 1px 0 0 ' + 'rgba(255, 255, 255, 0.1)' + ', 0 1px 0 0 ' + 'rgba(255, 255, 255, 0.05)',
},
padding: 0,
'& .MuiButton-endIcon': {
margin: 0,
},
'& .MuiButton-root': {
color: theme.palette.text.primary,
flexGrow: 1,
justifyContent: 'space-between',
padding: theme.spacing(1, 3),
borderRadius: undefined,
fontSize: '1rem',
fontWeight: 400,
},
'& .MuiSvgIcon-root': {
color: theme.palette.grey[500],
},
},
},
}))
Example #21
Source File: StatsDialog.tsx From GTAV-NativeDB with MIT License | 5 votes |
export default function StatsDialog({ open, onClose }: Props) {
const stats = useStats()
return (
<Dialog open={open} onClose={onClose} fullWidth maxWidth="xs">
<DialogTitle>
Stats
</DialogTitle>
<List dense>
<ListItem sx={{ px: 3 }} >
<ListItemText
primary="Namespaces"
secondary={stats.namespaces}
/>
</ListItem>
<ListItem sx={{ px: 3 }} >
<ListItemText
primary="Natives"
secondary={stats.natives}
/>
</ListItem>
<ListItem sx={{ px: 3 }} >
<ListItemText
primary="Comments"
secondary={stats.comments}
/>
</ListItem>
<ListItem sx={{ px: 3 }} >
<ListItemText
primary="Known names"
secondary={`${stats.knownNames.confirmed} (${stats.knownNames.total})`}
/>
</ListItem>
</List>
<DialogActions>
<Button onClick={onClose}>Close</Button>
</DialogActions>
</Dialog>
)
}
Example #22
Source File: DepositWithdrawDialog.tsx From wrap.scrt.network with MIT License | 5 votes |
export default function DepositWithdrawDialog({
token,
secretjs,
secretAddress,
balances,
isOpen,
setIsOpen,
}: {
token: Token;
secretjs: SecretNetworkClient | null;
secretAddress: string;
balances: Map<string, string>;
isOpen: boolean;
setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
}) {
const [selectedTab, setSelectedTab] = useState<string>("deposit");
const closeDialog = () => {
setIsOpen(false);
setSelectedTab("deposit");
};
return (
<Dialog open={isOpen} fullWidth={true} onClose={closeDialog}>
<TabContext value={selectedTab}>
<Box sx={{ borderBottom: 1, borderColor: "divider" }}>
<Tabs
value={selectedTab}
variant="fullWidth"
onChange={(_event: React.SyntheticEvent, newSelectedTab: string) =>
setSelectedTab(newSelectedTab)
}
>
<Tab label="IBC Deposit" value={"deposit"} />
<Tab label="IBC Withdraw" value={"withdraw"} />
</Tabs>
</Box>
<TabPanel value={"deposit"}>
<Deposit
token={token}
secretAddress={secretAddress}
onSuccess={(txhash) => {
closeDialog();
console.log("success", txhash);
}}
onFailure={(error) => console.error(error)}
/>
</TabPanel>
<TabPanel value={"withdraw"}>
<Withdraw
token={token}
secretjs={secretjs}
secretAddress={secretAddress}
balances={balances}
onSuccess={(txhash) => {
closeDialog();
console.log("success", txhash);
}}
onFailure={(error) => console.error(error)}
/>
</TabPanel>
</TabContext>
</Dialog>
);
}
Example #23
Source File: dialog.tsx From NekoMaid with MIT License | 5 votes |
DialogWrapper: React.FC = () => {
const [canClick, setCanClick] = useState(false)
const [open, setOpen] = useState(false)
const [text, setText] = useState('')
const [data, setDate] = useState<DialogOptionsWithPromise | undefined>()
useEffect(() => {
openFn = it => {
setDate(it)
setOpen(true)
}
}, [])
if (!data) return <></>
const input = (data as any).input
const cancel = () => {
setOpen(false)
setDate(undefined)
setText('')
data.resolve(input ? null : false)
}
let inputElm: React.ReactNode
if (input) {
const props: any = {
key: input.label || input,
autoFocus: true,
fullWidth: true,
margin: 'dense',
variant: 'standard',
value: text,
onStatusChange: setCanClick,
onChange (it: any) { setText(it.target.value) }
}
if (typeof input === 'string') props.label = input
else if (typeof input === 'object') Object.assign(props, input)
inputElm = React.createElement(ValidInput, props)
}
return <Dialog open={!!open} onClose={cancel}>
<DialogTitle>{data.title || lang.tip}</DialogTitle>
<DialogContent>
<DialogContentText>{data.content}</DialogContentText>
{inputElm}
</DialogContent>
<DialogActions>
{data.cancelButton !== false && <Button onClick={cancel}>{minecraft['gui.cancel']}</Button>}
<Button {...data.okButton} disabled={canClick} onClick={() => {
setOpen(false)
setDate(undefined)
setText('')
data.resolve((data as any).input ? text : true)
}}>{minecraft['gui.ok']}</Button>
</DialogActions>
</Dialog>
}
Example #24
Source File: DeleteModal.tsx From frontend with MIT License | 5 votes |
export default function DeleteModal({ id, onClose, onDelete }: Props) {
const queryClient = useQueryClient()
const router = useRouter()
const { t } = useTranslation()
const mutationFn = useDeleteCampaignById(id)
const deleteMutation = useMutation<AxiosResponse<null>, AxiosError<ApiErrors>, string>({
mutationFn,
onError: () => AlertStore.show(t('campaigns:alerts:error'), 'error'),
onSuccess: () => {
AlertStore.show(t('Кампанията беше преместена в кошчето.'), 'warning')
queryClient.removeQueries(endpoints.campaign.viewCampaignById(id).url)
onDelete()
router.push(routes.admin.campaigns.index)
},
})
function deleteHandler() {
deleteMutation.mutate(id)
}
return (
<Dialog open onClose={onClose} sx={{ top: '-35%' }}>
<DialogTitle>{t('campaigns:deleteTitle')}</DialogTitle>
<Card>
<CardContent>
<Typography variant="body1" sx={{ marginBottom: '16px', textAlign: 'center' }}>
{t('campaigns:deleteContent')}
</Typography>
<Box sx={{ display: 'flex', justifyContent: 'center' }}>
<Button color="error" onClick={deleteHandler}>
{t('campaigns:cta:delete')}
</Button>
<Button onClick={onClose}>{t('campaigns:cta:cancel')}</Button>
</Box>
</CardContent>
</Card>
</Dialog>
)
}
Example #25
Source File: UpdateDialog.tsx From GTAV-NativeDB with MIT License | 5 votes |
function UpdateDialog() {
const [closedChangelog, setClosedChangelog] = useLocalStorageState('UpdateDialog.Closed', '')
const handleClose = useCallback(() => {
setClosedChangelog(buildDate)
}, [setClosedChangelog])
return (
<Dialog
open={false && closedChangelog !== buildDate}
onClose={handleClose}
maxWidth="sm"
scroll="paper"
fullWidth
>
<DialogTitle>
Changelog
</DialogTitle>
<DialogContent>
<Header type="new">
New Features
</Header>
<Typography variant="body2">
<UnorderedList>
<ListItem>
<b>Capturing links</b><br />
When you click on a native db link it should now open as a PWA, provided you have it installed as one. This feature requires the "enable-desktop-pwas-link-capturing" flag to be enabled.
</ListItem>
</UnorderedList>
</Typography>
{/* <Header type="fix">
Fixes and Changes
</Header>
<Typography variant="body2">
<UnorderedList>
<ListItem>
<b>Old names from Alloc8or ndb</b><br />
Old names are now taken from Alloc8or's native data instead of my "extra data" repo.
</ListItem>
<ListItem>
<b>Switching to dark mode</b><br />
Switching to dark mode is no longer broken if your system is set to light mode.
</ListItem>
<ListItem>
<b>Search results are no longer cleared</b><br />
Selecting a native would clear your search results, this is now fixed.
</ListItem>
</UnorderedList>
</Typography> */}
</DialogContent>
<DialogActions>
<Button onClick={handleClose}>
Close
</Button>
</DialogActions>
</Dialog>
)
}
Example #26
Source File: PersonDialog.tsx From frontend with MIT License | 5 votes |
export default function PersonDialog({ label, type, onSubmit }: Props) {
const { t } = useTranslation()
const [open, setOpen] = useState(false)
const handleClickOpen = () => setOpen(true)
const handleClose = () => setOpen(false)
return (
<>
<Button fullWidth variant="contained" color="info" onClick={handleClickOpen}>
{label}
</Button>
<Dialog
open={open}
onClose={(e, reason) => {
if (reason === 'backdropClick') return
handleClose()
}}
onBackdropClick={() => false}>
<DialogTitle>
{label}
<IconButton
aria-label="close"
onClick={handleClose}
sx={{
position: 'absolute',
right: 8,
top: 8,
color: (theme) => theme.palette.grey[500],
}}>
<Close />
</IconButton>
</DialogTitle>
<DialogContent>
<Box sx={{ mb: 2 }}>
{type === 'beneficiary' ? (
<Alert severity="info">
<AlertTitle>{t('campaigns:campaign.beneficiary.name')}</AlertTitle>
Лице, в чиято полза се организира кампанията. От юридическа гледна точка,
бенефициентът <strong>НЕ влиза</strong> във взаимоотношения с оператора при набиране
на средства в негова полза. Всички договори, изисквания, банкова сметка на
кампанията са на името на организатора. Възможно е бенефициентът по една кампания да
е и неговият организатор.
</Alert>
) : (
<Alert severity="warning">
<AlertTitle>{t('campaigns:campaign.coordinator.name')}</AlertTitle>
Организаторът е физическото или юридическо лице, с което се сключва договор за
набиране на средства, след като негова заявка за кампания е одобрена. Набраните
средства се прехвърлят в неговата банкова сметка, от него се изискват отчети за
разходените средства. Когато дадено лице иска да стане организатор на кампании,
преминава през процес на верификация, за да се избегнат измамите. Организаторът също
може да е и бенефициент по дадена кампания.
</Alert>
)}
</Box>
<PersonForm
{...type}
onSubmit={(...args) => {
onSubmit(...args)
handleClose()
}}
/>
</DialogContent>
</Dialog>
</>
)
}
Example #27
Source File: NewNickname.tsx From sapio-studio with Mozilla Public License 2.0 | 5 votes |
export function NewNickname(props: { show: boolean; hide: () => void }) {
const [value, set_value] = React.useState<null | string>(null);
const [key_value, set_key_value] = React.useState<null | string>(null);
return (
<Dialog onClose={props.hide} open={props.show}>
<DialogTitle>Create a new User</DialogTitle>
<DialogContent>
<DialogContentText>
The key and nickname for the new person. Keys must be
unique.
</DialogContentText>
<TextField
onChange={(ev) => set_value(ev.currentTarget.value)}
value={value}
autoFocus
margin="dense"
label="Name"
name="name"
type="text"
fullWidth
variant="standard"
/>
<TextField
onChange={(ev) => set_key_value(ev.currentTarget.value)}
value={key_value}
autoFocus
margin="dense"
label="Key Hash"
name="keyhash"
type="text"
fullWidth
variant="standard"
/>
</DialogContent>
<DialogActions>
<Button onClick={props.hide}>Cancel</Button>
<Button
color="success"
onClick={async (ev) => {
if (value !== null && key_value) {
await window.electron.chat.add_user(
value,
key_value
);
}
props.hide();
}}
>
Create
</Button>
</DialogActions>
</Dialog>
);
}
Example #28
Source File: ViewInjectorDialog.tsx From react-flight-tracker with MIT License | 4 votes |
ViewInjectorDialog: React.FC<Props> = (props) => {
// States
const [selectedNavigationElement, setSelectedNavigationElement] = useState<INavigationElementProps>(props.navigationElement);
// Effects
useEffect(() => {
const navigationElement = Object.entries(ViewNavigationElements).find(([key, navigationElement]) => navigationElement.key === props.navigationElement.key);
if (navigationElement)
setSelectedNavigationElement(navigationElement[1]);
}, [props.navigationElement]);
const renderHeader = () => {
return (
<Box
sx={{
backgroundColor: (theme) => theme.palette.primary.main,
color: (theme) => theme.palette.primary.contrastText
}}>
<Box
sx={{
margin: (theme) => theme.spacing(1),
display: 'flex',
flexDirection: 'row',
alignContent: 'center',
alignItems: 'center'
}}>
<Typography
variant={'h5'}>
{selectedNavigationElement.display.value}
</Typography>
<Box style={{ flex: 'auto' }} />
<IconButton
color={'inherit'}
aria-label="Close"
onClick={(e) => props.onClose()}>
<CloseIcon />
</IconButton>
</Box>
</Box>
)
};
return (
<Dialog
sx={{
'& .MuiDialog-paper': {
height: '70%',
backgroundColor: (theme) => theme.palette.background.default,
color: (theme) => theme.palette.text.secondary
},
}}
fullWidth={true}
maxWidth='sm'
open={props.isVisible}
onClose={(e, reason) => props.onClose()}>
{renderHeader()}
<Box
sx={{
margin: (theme) => theme.spacing(1),
height: '100%',
display: 'flex',
flexDirection: 'column',
overflow: 'hidden'
}}>
<ViewInjector
navigationElement={selectedNavigationElement}
onImportView={navigationElement => React.lazy(() => import(`./../${navigationElement.importPath}`))} />
</Box>
</Dialog>
)
}
Example #29
Source File: index.tsx From mui-toolpad with MIT License | 4 votes |
export default function HierarchyExplorer({ appId, className }: HierarchyExplorerProps) {
const dom = useDom();
const domApi = useDomApi();
const app = appDom.getApp(dom);
const {
apis = [],
codeComponents = [],
pages = [],
connections = [],
} = appDom.getChildNodes(dom, app);
const [expanded, setExpanded] = useLocalStorageState<string[]>(
`editor/${app.id}/hierarchy-expansion`,
[':connections', ':pages', ':codeComponents'],
);
const location = useLocation();
const match =
matchRoutes(
[
{ path: `/app/:appId/editor/pages/:activeNodeId` },
{ path: `/app/:appId/editor/apis/:activeNodeId` },
{ path: `/app/:appId/editor/codeComponents/:activeNodeId` },
{ path: `/app/:appId/editor/connections/:activeNodeId` },
],
location,
) || [];
const selected: NodeId[] = match.map((route) => route.params.activeNodeId as NodeId);
const handleToggle = (event: React.SyntheticEvent, nodeIds: string[]) => {
setExpanded(nodeIds as NodeId[]);
};
const navigate = useNavigate();
const handleSelect = (event: React.SyntheticEvent, nodeIds: string[]) => {
if (nodeIds.length <= 0) {
return;
}
const rawNodeId = nodeIds[0];
if (rawNodeId.startsWith(':')) {
return;
}
const selectedNodeId: NodeId = rawNodeId as NodeId;
const node = appDom.getNode(dom, selectedNodeId);
if (appDom.isElement(node)) {
// TODO: sort out in-page selection
const page = appDom.getPageAncestor(dom, node);
if (page) {
navigate(`/app/${appId}/editor/pages/${page.id}`);
}
}
if (appDom.isPage(node)) {
navigate(`/app/${appId}/editor/pages/${node.id}`);
}
if (appDom.isApi(node)) {
navigate(`/app/${appId}/editor/apis/${node.id}`);
}
if (appDom.isCodeComponent(node)) {
navigate(`/app/${appId}/editor/codeComponents/${node.id}`);
}
if (appDom.isConnection(node)) {
navigate(`/app/${appId}/editor/connections/${node.id}`);
}
};
const [createConnectionDialogOpen, setCreateConnectionDialogOpen] = React.useState(0);
const handleCreateConnectionDialogOpen = React.useCallback((event: React.MouseEvent) => {
event.stopPropagation();
setCreateConnectionDialogOpen(Math.random());
}, []);
const handleCreateConnectionDialogClose = React.useCallback(
() => setCreateConnectionDialogOpen(0),
[],
);
const [createPageDialogOpen, setCreatePageDialogOpen] = React.useState(0);
const handleCreatePageDialogOpen = React.useCallback((event: React.MouseEvent) => {
event.stopPropagation();
setCreatePageDialogOpen(Math.random());
}, []);
const handleCreatepageDialogClose = React.useCallback(() => setCreatePageDialogOpen(0), []);
const [createCodeComponentDialogOpen, setCreateCodeComponentDialogOpen] = React.useState(0);
const handleCreateCodeComponentDialogOpen = React.useCallback((event: React.MouseEvent) => {
event.stopPropagation();
setCreateCodeComponentDialogOpen(Math.random());
}, []);
const handleCreateCodeComponentDialogClose = React.useCallback(
() => setCreateCodeComponentDialogOpen(0),
[],
);
const [deletedNodeId, setDeletedNodeId] = React.useState<NodeId | null>(null);
const handleDeleteNodeDialogOpen = React.useCallback(
(nodeId: NodeId) => (event: React.MouseEvent) => {
event.stopPropagation();
setDeletedNodeId(nodeId);
},
[],
);
const handledeleteNodeDialogClose = React.useCallback(() => setDeletedNodeId(null), []);
const handleDeleteNode = React.useCallback(() => {
if (deletedNodeId) {
domApi.removeNode(deletedNodeId);
navigate(`/app/${appId}/editor/`);
handledeleteNodeDialogClose();
}
}, [deletedNodeId, domApi, navigate, appId, handledeleteNodeDialogClose]);
const deletedNode = deletedNodeId && appDom.getMaybeNode(dom, deletedNodeId);
const latestDeletedNode = useLatest(deletedNode);
return (
<HierarchyExplorerRoot className={className}>
<TreeView
aria-label="hierarchy explorer"
selected={selected}
onNodeSelect={handleSelect}
expanded={expanded}
onNodeToggle={handleToggle}
multiSelect
defaultCollapseIcon={<ExpandMoreIcon />}
defaultExpandIcon={<ChevronRightIcon />}
>
<HierarchyTreeItem
nodeId=":connections"
labelText="Connections"
onCreate={handleCreateConnectionDialogOpen}
>
{connections.map((connectionNode) => (
<HierarchyTreeItem
key={connectionNode.id}
nodeId={connectionNode.id}
labelText={connectionNode.name}
onDelete={handleDeleteNodeDialogOpen(connectionNode.id)}
/>
))}
</HierarchyTreeItem>
{apis.length > 0 ? (
<HierarchyTreeItem nodeId=":apis" labelText="Apis">
{apis.map((apiNode) => (
<HierarchyTreeItem
key={apiNode.id}
nodeId={apiNode.id}
labelText={apiNode.name}
onDelete={handleDeleteNodeDialogOpen(apiNode.id)}
/>
))}
</HierarchyTreeItem>
) : null}
<HierarchyTreeItem
nodeId=":codeComponents"
labelText="Components"
onCreate={handleCreateCodeComponentDialogOpen}
>
{codeComponents.map((codeComponent) => (
<HierarchyTreeItem
key={codeComponent.id}
nodeId={codeComponent.id}
labelText={codeComponent.name}
onDelete={handleDeleteNodeDialogOpen(codeComponent.id)}
/>
))}
</HierarchyTreeItem>
<HierarchyTreeItem nodeId=":pages" labelText="Pages" onCreate={handleCreatePageDialogOpen}>
{pages.map((page) => (
<HierarchyTreeItem
key={page.id}
nodeId={page.id}
labelText={page.name}
onDelete={handleDeleteNodeDialogOpen(page.id)}
/>
))}
</HierarchyTreeItem>
</TreeView>
<CreateConnectionNodeDialog
key={createConnectionDialogOpen || undefined}
appId={appId}
open={!!createConnectionDialogOpen}
onClose={handleCreateConnectionDialogClose}
/>
<CreatePageNodeDialog
key={createPageDialogOpen || undefined}
appId={appId}
open={!!createPageDialogOpen}
onClose={handleCreatepageDialogClose}
/>
<CreateCodeComponentNodeDialog
key={createCodeComponentDialogOpen || undefined}
appId={appId}
open={!!createCodeComponentDialogOpen}
onClose={handleCreateCodeComponentDialogClose}
/>
<Dialog open={!!deletedNode} onClose={handledeleteNodeDialogClose}>
<DialogTitle>
Delete {latestDeletedNode?.type} "{latestDeletedNode?.name}"?
</DialogTitle>
<DialogActions>
<Button
type="submit"
color="inherit"
variant="text"
onClick={handledeleteNodeDialogClose}
>
Cancel
</Button>
<Button type="submit" onClick={handleDeleteNode}>
Delete
</Button>
</DialogActions>
</Dialog>
</HierarchyExplorerRoot>
);
}