1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from 'react';
6 import { Field, InjectedFormProps } from "redux-form";
7 import { TextField } from "~/components/text-field/text-field";
8 import { NativeSelectField } from "~/components/select-field/select-field";
19 } from '@material-ui/core';
20 import { ArvadosTheme } from '~/common/custom-theme';
21 import { User } from "~/models/user";
22 import { require } from "~/validators/require";
24 type CssRules = 'root' | 'gridItem' | 'label' | 'title' | 'actions';
26 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
39 marginBottom: theme.spacing.unit * 3,
40 color: theme.palette.grey["600"]
44 justifyContent: 'flex-end'
48 export interface MyAccountPanelRootActionProps {}
50 export interface MyAccountPanelRootDataProps {
56 export const MY_ACCOUNT_FORM = 'myAccountForm';
58 const FILES_FIELD_VALIDATION = [require];
60 type MyAccountPanelRootProps = InjectedFormProps<MyAccountPanelRootActionProps> & MyAccountPanelRootDataProps & WithStyles<CssRules>;
62 export const MyAccountPanelRoot = withStyles(styles)(
63 ({ classes, isValid, handleSubmit, reset, isPristine, invalid, submitting }: MyAccountPanelRootProps) => {
64 return <Card className={classes.root}>
66 <Typography variant="title" className={classes.title}>User profile</Typography>
67 <form onSubmit={handleSubmit}>
68 <Grid container direction="row" spacing={24}>
70 <Grid item className={classes.gridItem}>
78 <Grid item className={classes.gridItem}>
86 <Grid item className={classes.gridItem}>
94 <Grid item className={classes.gridItem}>
97 name="prefs.profile.organization"
99 validate={FILES_FIELD_VALIDATION}
102 <Grid item className={classes.gridItem}>
105 name="prefs.profile.website_url"
106 component={TextField}
109 <Grid item className={classes.gridItem}>
110 <InputLabel className={classes.label} htmlFor="prefs.profile.role">Organization</InputLabel>
112 id="prefs.profile.role"
113 name="prefs.profile.role"
114 component={NativeSelectField}
116 {key: 'Bio-informatician', value: 'Bio-informatician'},
117 {key: 'Data Scientist', value: 'Data Scientist'},
118 {key: 'Analyst', value: 'Analyst'},
119 {key: 'Researcher', value: 'Researcher'},
120 {key: 'Software Developer', value: 'Software Developer'},
121 {key: 'System Administrator', value: 'System Administrator'},
122 {key: 'Other', value: 'Other'}
128 <Grid item className={classes.gridItem} />
129 <Grid item className={classes.gridItem}>
133 component={TextField}
137 <Grid item className={classes.gridItem} />
138 <Grid item className={classes.gridItem}>
140 label="*E-mail at Organization"
141 name="prefs.profile.organization_email"
142 component={TextField}
143 validate={FILES_FIELD_VALIDATION}
147 <Grid item xs={12} className={classes.actions}>
148 <Button color="primary" onClick={reset} disabled={isPristine}>Discard changes</Button>
149 <Button color="primary" variant="contained" type="submit" disabled={isPristine || invalid || submitting}>Save changes</Button>