1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-05-22 01:16:07 +02:00

Merge pull request #628 from Unleash/update/create-screens-submit-buttons

fix: update buttons order in new screens
This commit is contained in:
Youssef Khedher 2022-01-25 13:14:39 +01:00 committed by GitHub
commit bbde9f00ec
26 changed files with 83 additions and 62 deletions

View File

@ -29,7 +29,7 @@ export const useStyles = makeStyles(theme => ({
justifyContent: 'flex-end', justifyContent: 'flex-end',
}, },
cancelButton: { cancelButton: {
marginRight: '1.5rem', marginLeft: '1.5rem',
}, },
inputDescription: { inputDescription: {
marginBottom: '0.5rem', marginBottom: '0.5rem',

View File

@ -122,10 +122,10 @@ const ApiTokenForm: React.FC<IApiTokenFormProps> = ({
/> />
</div> </div>
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>
{children}
<Button onClick={handleCancel} className={styles.cancelButton}> <Button onClick={handleCancel} className={styles.cancelButton}>
Cancel Cancel
</Button> </Button>
{children}
</div> </div>
</form> </form>
); );

View File

@ -97,7 +97,6 @@ const CreateApiToken = () => {
clearErrors={clearErrors} clearErrors={clearErrors}
> >
<PermissionButton <PermissionButton
onClick={handleSubmit}
permission={ADMIN} permission={ADMIN}
type="submit" type="submit"
> >

View File

@ -5,6 +5,8 @@ import ProjectRoleForm from '../ProjectRoleForm/ProjectRoleForm';
import useProjectRoleForm from '../hooks/useProjectRoleForm'; import useProjectRoleForm from '../hooks/useProjectRoleForm';
import useUiConfig from '../../../../hooks/api/getters/useUiConfig/useUiConfig'; import useUiConfig from '../../../../hooks/api/getters/useUiConfig/useUiConfig';
import useToast from '../../../../hooks/useToast'; import useToast from '../../../../hooks/useToast';
import PermissionButton from '../../../common/PermissionButton/PermissionButton';
import { ADMIN } from '../../../providers/AccessProvider/permissions';
const CreateProjectRole = () => { const CreateProjectRole = () => {
/* @ts-ignore */ /* @ts-ignore */
@ -89,11 +91,15 @@ const CreateProjectRole = () => {
handlePermissionChange={handlePermissionChange} handlePermissionChange={handlePermissionChange}
checkAllProjectPermissions={checkAllProjectPermissions} checkAllProjectPermissions={checkAllProjectPermissions}
checkAllEnvironmentPermissions={checkAllEnvironmentPermissions} checkAllEnvironmentPermissions={checkAllEnvironmentPermissions}
submitButtonText="Create" mode="Create"
clearErrors={clearErrors} clearErrors={clearErrors}
validateNameUniqueness={validateNameUniqueness} validateNameUniqueness={validateNameUniqueness}
getRoleKey={getRoleKey} getRoleKey={getRoleKey}
/> >
<PermissionButton permission={ADMIN} type="submit">
Create role
</PermissionButton>
</ProjectRoleForm>
</FormTemplate> </FormTemplate>
); );
}; };

View File

@ -11,6 +11,8 @@ import useProjectRole from '../../../../hooks/api/getters/useProjectRole/useProj
import { IPermission } from '../../../../interfaces/project'; import { IPermission } from '../../../../interfaces/project';
import useUiConfig from '../../../../hooks/api/getters/useUiConfig/useUiConfig'; import useUiConfig from '../../../../hooks/api/getters/useUiConfig/useUiConfig';
import useToast from '../../../../hooks/useToast'; import useToast from '../../../../hooks/useToast';
import PermissionButton from '../../../common/PermissionButton/PermissionButton';
import { ADMIN } from '../../../providers/AccessProvider/permissions';
const EditProjectRole = () => { const EditProjectRole = () => {
const { uiConfig } = useUiConfig(); const { uiConfig } = useUiConfig();
@ -117,11 +119,15 @@ to resources within a project"
handlePermissionChange={handlePermissionChange} handlePermissionChange={handlePermissionChange}
checkAllProjectPermissions={checkAllProjectPermissions} checkAllProjectPermissions={checkAllProjectPermissions}
checkAllEnvironmentPermissions={checkAllEnvironmentPermissions} checkAllEnvironmentPermissions={checkAllEnvironmentPermissions}
submitButtonText="Edit" mode="Edit"
errors={errors} errors={errors}
clearErrors={clearErrors} clearErrors={clearErrors}
getRoleKey={getRoleKey} getRoleKey={getRoleKey}
/> >
<PermissionButton permission={ADMIN} type="submit">
Edit role
</PermissionButton>
</ProjectRoleForm>
</FormTemplate> </FormTemplate>
); );
}; };

View File

@ -17,7 +17,7 @@ export const useStyles = makeStyles(theme => ({
justifyContent: 'flex-end', justifyContent: 'flex-end',
}, },
cancelButton: { cancelButton: {
marginRight: '1.5rem', marginLeft: '1.5rem',
}, },
inputDescription: { inputDescription: {
marginBottom: '0.5rem', marginBottom: '0.5rem',

View File

@ -1,5 +1,3 @@
import PermissionButton from '../../../common/PermissionButton/PermissionButton';
import { ADMIN } from '../../../providers/AccessProvider/permissions';
import Input from '../../../common/Input/Input'; import Input from '../../../common/Input/Input';
import EnvironmentPermissionAccordion from './EnvironmentPermissionAccordion/EnvironmentPermissionAccordion'; import EnvironmentPermissionAccordion from './EnvironmentPermissionAccordion/EnvironmentPermissionAccordion';
import { import {
@ -31,13 +29,14 @@ interface IProjectRoleForm {
handleSubmit: (e: any) => void; handleSubmit: (e: any) => void;
handleCancel: () => void; handleCancel: () => void;
errors: { [key: string]: string }; errors: { [key: string]: string };
submitButtonText: string; mode?: string;
clearErrors: () => void; clearErrors: () => void;
validateNameUniqueness?: () => void; validateNameUniqueness?: () => void;
getRoleKey: (permission: { id: number; environment?: string }) => string; getRoleKey: (permission: { id: number; environment?: string }) => string;
} }
const ProjectRoleForm = ({ const ProjectRoleForm: React.FC<IProjectRoleForm> = ({
children,
handleSubmit, handleSubmit,
handleCancel, handleCancel,
roleName, roleName,
@ -49,7 +48,7 @@ const ProjectRoleForm = ({
checkAllProjectPermissions, checkAllProjectPermissions,
checkAllEnvironmentPermissions, checkAllEnvironmentPermissions,
errors, errors,
submitButtonText, mode,
validateNameUniqueness, validateNameUniqueness,
clearErrors, clearErrors,
getRoleKey, getRoleKey,
@ -173,16 +172,10 @@ const ProjectRoleForm = ({
<h3 className={styles.header}>Environment permissions</h3> <h3 className={styles.header}>Environment permissions</h3>
<div>{renderEnvironmentPermissions()}</div> <div>{renderEnvironmentPermissions()}</div>
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>
{children}
<Button onClick={handleCancel} className={styles.cancelButton}> <Button onClick={handleCancel} className={styles.cancelButton}>
Cancel Cancel
</Button> </Button>
<PermissionButton
onClick={handleSubmit}
permission={ADMIN}
type="submit"
>
{submitButtonText} role
</PermissionButton>
</div> </div>
</form> </form>
); );

View File

@ -99,7 +99,6 @@ const CreateUser = () => {
clearErrors={clearErrors} clearErrors={clearErrors}
> >
<PermissionButton <PermissionButton
onClick={handleSubmit}
permission={ADMIN} permission={ADMIN}
type="submit" type="submit"
> >

View File

@ -100,7 +100,6 @@ const EditUser = () => {
mode={EDIT} mode={EDIT}
> >
<PermissionButton <PermissionButton
onClick={handleSubmit}
permission={ADMIN} permission={ADMIN}
type="submit" type="submit"
> >

View File

@ -22,7 +22,7 @@ export const useStyles = makeStyles(theme => ({
justifyContent: 'flex-end', justifyContent: 'flex-end',
}, },
cancelButton: { cancelButton: {
marginRight: '1.5rem', marginLeft: '1.5rem',
}, },
inputDescription: { inputDescription: {
marginBottom: '0.5rem', marginBottom: '0.5rem',

View File

@ -149,10 +149,10 @@ const UserForm: React.FC<IUserForm> = ({
/> />
</div> </div>
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>
{children}
<Button onClick={handleCancel} className={styles.cancelButton}> <Button onClick={handleCancel} className={styles.cancelButton}>
Cancel Cancel
</Button> </Button>
{children}
</div> </div>
</form> </form>
); );

View File

@ -38,7 +38,7 @@ export const useStyles = makeStyles(theme => ({
justifyContent: 'flex-end', justifyContent: 'flex-end',
}, },
cancelButton: { cancelButton: {
marginRight: '1.5rem', marginLeft: '1.5rem',
}, },
inputDescription: { inputDescription: {
marginBottom: '0.5rem', marginBottom: '0.5rem',

View File

@ -185,10 +185,10 @@ const ContextForm: React.FC<IContextForm> = ({
</div> </div>
</div> </div>
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>
{children}
<Button onClick={handleCancel} className={styles.cancelButton}> <Button onClick={handleCancel} className={styles.cancelButton}>
Cancel Cancel
</Button> </Button>
{children}
</div> </div>
</form> </form>
); );

View File

@ -102,7 +102,6 @@ const CreateEnvironment = () => {
clearErrors={clearErrors} clearErrors={clearErrors}
> >
<PermissionButton <PermissionButton
onClick={handleSubmit}
permission={ADMIN} permission={ADMIN}
type="submit" type="submit"
> >

View File

@ -86,7 +86,6 @@ const EditEnvironment = () => {
clearErrors={clearErrors} clearErrors={clearErrors}
> >
<PermissionButton <PermissionButton
onClick={handleSubmit}
permission={ADMIN} permission={ADMIN}
type="submit" type="submit"
> >

View File

@ -22,7 +22,7 @@ export const useStyles = makeStyles(theme => ({
justifyContent: 'flex-end', justifyContent: 'flex-end',
}, },
cancelButton: { cancelButton: {
marginRight: '1.5rem', marginLeft: '1.5rem',
}, },
inputDescription: { inputDescription: {
marginBottom: '0.5rem', marginBottom: '0.5rem',

View File

@ -62,10 +62,10 @@ const EnvironmentForm: React.FC<IEnvironmentForm> = ({
/> />
</div> </div>
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>
{children}
<Button onClick={handleCancel} className={styles.cancelButton}> <Button onClick={handleCancel} className={styles.cancelButton}>
Cancel Cancel
</Button> </Button>
{children}
</div> </div>
</form> </form>
); );

View File

@ -6,6 +6,8 @@ import useProjectForm from '../hooks/useProjectForm';
import useUiConfig from '../../../../hooks/api/getters/useUiConfig/useUiConfig'; import useUiConfig from '../../../../hooks/api/getters/useUiConfig/useUiConfig';
import useToast from '../../../../hooks/useToast'; import useToast from '../../../../hooks/useToast';
import useUser from '../../../../hooks/api/getters/useUser/useUser'; import useUser from '../../../../hooks/api/getters/useUser/useUser';
import PermissionButton from '../../../common/PermissionButton/PermissionButton';
import { CREATE_PROJECT } from '../../../providers/AccessProvider/permissions';
const CreateProject = () => { const CreateProject = () => {
/* @ts-ignore */ /* @ts-ignore */
@ -34,6 +36,7 @@ const CreateProject = () => {
clearErrors(); clearErrors();
const validName = validateName(); const validName = validateName();
const validId = await validateIdUniqueness(); const validId = await validateIdUniqueness();
if (validName && validId) { if (validName && validId) {
const payload = getProjectPayload(); const payload = getProjectPayload();
try { try {
@ -62,7 +65,7 @@ const CreateProject = () => {
}; };
const handleCancel = () => { const handleCancel = () => {
history.push('/projects'); history.goBack();
}; };
return ( return (
@ -83,10 +86,14 @@ const CreateProject = () => {
setProjectName={setProjectName} setProjectName={setProjectName}
projectDesc={projectDesc} projectDesc={projectDesc}
setProjectDesc={setProjectDesc} setProjectDesc={setProjectDesc}
submitButtonText="Create" mode="Create"
clearErrors={clearErrors} clearErrors={clearErrors}
validateIdUniqueness={validateIdUniqueness} validateIdUniqueness={validateIdUniqueness}
/> >
<PermissionButton permission={CREATE_PROJECT} type="submit">
Create project
</PermissionButton>
</ProjectForm>
</FormTemplate> </FormTemplate>
); );
}; };

View File

@ -6,6 +6,8 @@ import useProjectForm from '../hooks/useProjectForm';
import useProject from '../../../../hooks/api/getters/useProject/useProject'; import useProject from '../../../../hooks/api/getters/useProject/useProject';
import useUiConfig from '../../../../hooks/api/getters/useUiConfig/useUiConfig'; import useUiConfig from '../../../../hooks/api/getters/useUiConfig/useUiConfig';
import useToast from '../../../../hooks/useToast'; import useToast from '../../../../hooks/useToast';
import PermissionButton from '../../../common/PermissionButton/PermissionButton';
import { UPDATE_PROJECT } from '../../../../store/project/actions';
const EditProject = () => { const EditProject = () => {
const { uiConfig } = useUiConfig(); const { uiConfig } = useUiConfig();
@ -24,6 +26,7 @@ const EditProject = () => {
clearErrors, clearErrors,
validateIdUniqueness, validateIdUniqueness,
validateName, validateName,
validateProjectId,
errors, errors,
} = useProjectForm(id, project.name, project.description); } = useProjectForm(id, project.name, project.description);
@ -44,8 +47,9 @@ const EditProject = () => {
const payload = getProjectPayload(); const payload = getProjectPayload();
const validName = validateName(); const validName = validateName();
const validId = validateProjectId();
if (validName) { if (validName && validId) {
try { try {
await editProject(id, payload); await editProject(id, payload);
refetch(); refetch();
@ -82,10 +86,17 @@ const EditProject = () => {
setProjectName={setProjectName} setProjectName={setProjectName}
projectDesc={projectDesc} projectDesc={projectDesc}
setProjectDesc={setProjectDesc} setProjectDesc={setProjectDesc}
submitButtonText="Edit" mode="Edit"
clearErrors={clearErrors} clearErrors={clearErrors}
validateIdUniqueness={validateIdUniqueness} validateIdUniqueness={validateIdUniqueness}
/> >
<PermissionButton
permission={UPDATE_PROJECT}
type="submit"
>
Edit project
</PermissionButton>
</ProjectForm>
</FormTemplate> </FormTemplate>
); );
}; };

View File

@ -22,7 +22,7 @@ export const useStyles = makeStyles(theme => ({
justifyContent: 'flex-end', justifyContent: 'flex-end',
}, },
cancelButton: { cancelButton: {
marginRight: '1.5rem', marginLeft: '1.5rem',
}, },
inputDescription: { inputDescription: {
marginBottom: '0.5rem', marginBottom: '0.5rem',

View File

@ -1,5 +1,3 @@
import PermissionButton from '../../../common/PermissionButton/PermissionButton';
import { CREATE_PROJECT } from '../../../providers/AccessProvider/permissions';
import Input from '../../../common/Input/Input'; import Input from '../../../common/Input/Input';
import { TextField, Button } from '@material-ui/core'; import { TextField, Button } from '@material-ui/core';
import { useStyles } from './ProjectForm.style'; import { useStyles } from './ProjectForm.style';
@ -16,12 +14,13 @@ interface IProjectForm {
handleSubmit: (e: any) => void; handleSubmit: (e: any) => void;
handleCancel: () => void; handleCancel: () => void;
errors: { [key: string]: string }; errors: { [key: string]: string };
submitButtonText: string; mode: string;
clearErrors: () => void; clearErrors: () => void;
validateIdUniqueness: () => void; validateIdUniqueness: () => void;
} }
const ProjectForm = ({ const ProjectForm: React.FC<IProjectForm> = ({
children,
handleSubmit, handleSubmit,
handleCancel, handleCancel,
projectId, projectId,
@ -31,10 +30,10 @@ const ProjectForm = ({
setProjectName, setProjectName,
setProjectDesc, setProjectDesc,
errors, errors,
submitButtonText, mode,
validateIdUniqueness, validateIdUniqueness,
clearErrors, clearErrors,
}: IProjectForm) => { }) => {
const styles = useStyles(); const styles = useStyles();
return ( return (
@ -54,7 +53,7 @@ const ProjectForm = ({
errorText={errors.id} errorText={errors.id}
onFocus={() => clearErrors()} onFocus={() => clearErrors()}
onBlur={validateIdUniqueness} onBlur={validateIdUniqueness}
disabled={submitButtonText === 'Edit'} disabled={mode === 'Edit'}
/> />
<p className={styles.inputDescription}> <p className={styles.inputDescription}>
@ -85,16 +84,10 @@ const ProjectForm = ({
</div> </div>
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>
{children}
<Button onClick={handleCancel} className={styles.cancelButton}> <Button onClick={handleCancel} className={styles.cancelButton}>
Cancel Cancel
</Button> </Button>
<PermissionButton
onClick={handleSubmit}
permission={CREATE_PROJECT}
type="submit"
>
{submitButtonText} project
</PermissionButton>
</div> </div>
</form> </form>
); );

View File

@ -39,6 +39,10 @@ const useProjectForm = (
const NAME_EXISTS_ERROR = 'Error: A project with this id already exists.'; const NAME_EXISTS_ERROR = 'Error: A project with this id already exists.';
const validateIdUniqueness = async () => { const validateIdUniqueness = async () => {
if (projectId.length === 0) {
setErrors(prev => ({ ...prev, id: 'Id can not be empty.' }));
return false;
}
try { try {
await validateId(getProjectPayload()); await validateId(getProjectPayload());
return true; return true;
@ -52,12 +56,20 @@ const useProjectForm = (
return false; return false;
} }
}; };
const validateProjectId = () => {
if (projectId.length === 0) {
setErrors(prev => ({ ...prev, id: 'id can not be empty.' }));
return false;
}
return true;
};
const validateName = () => { const validateName = () => {
if (projectName.length === 0) { if (projectName.length === 0) {
setErrors(prev => ({ ...prev, name: 'Name can not be empty.' })); setErrors(prev => ({ ...prev, name: 'Name can not be empty.' }));
return false; return false;
} }
return true; return true;
}; };
@ -74,6 +86,7 @@ const useProjectForm = (
setProjectDesc, setProjectDesc,
getProjectPayload, getProjectPayload,
validateName, validateName,
validateProjectId,
validateIdUniqueness, validateIdUniqueness,
clearErrors, clearErrors,
errors, errors,

View File

@ -75,12 +75,9 @@ const CreateTagType = () => {
setTagDesc={setTagDesc} setTagDesc={setTagDesc}
mode="Create" mode="Create"
clearErrors={clearErrors} clearErrors={clearErrors}
validateNameUniqueness={validateNameUniqueness}
> >
<PermissionButton <PermissionButton permission={UPDATE_TAG_TYPE} type="submit">
onClick={handleSubmit}
permission={UPDATE_TAG_TYPE}
type="submit"
>
Create type Create type
</PermissionButton> </PermissionButton>
</TagTypeForm> </TagTypeForm>

View File

@ -75,7 +75,6 @@ const EditTagType = () => {
clearErrors={clearErrors} clearErrors={clearErrors}
> >
<PermissionButton <PermissionButton
onClick={handleSubmit}
permission={UPDATE_TAG_TYPE} permission={UPDATE_TAG_TYPE}
type="submit" type="submit"
> >

View File

@ -22,7 +22,7 @@ export const useStyles = makeStyles(theme => ({
justifyContent: 'flex-end', justifyContent: 'flex-end',
}, },
cancelButton: { cancelButton: {
marginRight: '1.5rem', marginLeft: '1.5rem',
}, },
inputDescription: { inputDescription: {
marginBottom: '0.5rem', marginBottom: '0.5rem',

View File

@ -16,6 +16,7 @@ interface ITagTypeForm {
errors: { [key: string]: string }; errors: { [key: string]: string };
mode: string; mode: string;
clearErrors: () => void; clearErrors: () => void;
validateNameUniqueness?: () => void;
} }
const TagTypeForm: React.FC<ITagTypeForm> = ({ const TagTypeForm: React.FC<ITagTypeForm> = ({
@ -28,6 +29,7 @@ const TagTypeForm: React.FC<ITagTypeForm> = ({
setTagDesc, setTagDesc,
errors, errors,
mode, mode,
validateNameUniqueness,
clearErrors, clearErrors,
}) => { }) => {
const styles = useStyles(); const styles = useStyles();
@ -49,11 +51,10 @@ const TagTypeForm: React.FC<ITagTypeForm> = ({
errorText={errors.name} errorText={errors.name}
onFocus={() => clearErrors()} onFocus={() => clearErrors()}
disabled={mode === EDIT} disabled={mode === EDIT}
onBlur={validateNameUniqueness}
/> />
<p className={styles.inputDescription}> <p className={styles.inputDescription}>What is this tag for?</p>
What is this role for?
</p>
<TextField <TextField
className={styles.input} className={styles.input}
label="Tag description" label="Tag description"
@ -65,10 +66,10 @@ const TagTypeForm: React.FC<ITagTypeForm> = ({
/> />
</div> </div>
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>
{children}
<Button onClick={handleCancel} className={styles.cancelButton}> <Button onClick={handleCancel} className={styles.cancelButton}>
Cancel Cancel
</Button> </Button>
{children}
</div> </div>
</form> </form>
); );