saleor-dashboard/src/staff/components/StaffDetailsPage/StaffDetailsPage.tsx

133 lines
4.2 KiB
TypeScript
Raw Normal View History

2019-08-09 10:26:22 +00:00
import React from "react";
import { useIntl } from "react-intl";
2019-06-19 14:40:52 +00:00
import AccountPermissions from "@saleor/components/AccountPermissions";
2019-09-26 13:25:26 +00:00
import AccountStatus from "@saleor/components/AccountStatus";
2019-06-19 14:40:52 +00:00
import AppHeader from "@saleor/components/AppHeader";
import CardSpacer from "@saleor/components/CardSpacer";
import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton";
import Container from "@saleor/components/Container";
import Form from "@saleor/components/Form";
import Grid from "@saleor/components/Grid";
import PageHeader from "@saleor/components/PageHeader";
import SaveButtonBar from "@saleor/components/SaveButtonBar";
import { ShopInfo_shop_permissions } from "@saleor/components/Shop/types/ShopInfo";
import { sectionNames } from "@saleor/intl";
2019-06-19 14:40:52 +00:00
import { getUserName, maybe } from "../../../misc";
import { PermissionEnum } from "../../../types/globalTypes";
import { StaffMemberDetails_user } from "../../types/StaffMemberDetails";
2019-06-19 14:40:52 +00:00
import StaffProperties from "../StaffProperties/StaffProperties";
interface FormData {
hasFullAccess: boolean;
isActive: boolean;
permissions: PermissionEnum[];
firstName: string;
lastName: string;
email: string;
}
export interface StaffDetailsPageProps {
canEditAvatar: boolean;
canEditStatus: boolean;
canRemove: boolean;
disabled: boolean;
permissions: ShopInfo_shop_permissions[];
2019-06-19 14:40:52 +00:00
saveButtonBarState: ConfirmButtonTransitionState;
staffMember: StaffMemberDetails_user;
onBack: () => void;
onDelete: () => void;
onImageDelete: () => void;
onSubmit: (data: FormData) => void;
onImageUpload(file: File);
}
const StaffDetailsPage: React.StatelessComponent<StaffDetailsPageProps> = ({
canEditAvatar,
canEditStatus,
canRemove,
disabled,
permissions,
saveButtonBarState,
staffMember,
onBack,
onDelete,
onImageDelete,
onImageUpload,
onSubmit
}: StaffDetailsPageProps) => {
const intl = useIntl();
2019-06-19 14:40:52 +00:00
const initialForm: FormData = {
2019-08-09 11:14:35 +00:00
email: maybe(() => staffMember.email, ""),
firstName: maybe(() => staffMember.firstName, ""),
2019-06-19 14:40:52 +00:00
hasFullAccess: maybe(
() =>
permissions.filter(
perm =>
maybe(() => staffMember.permissions, []).filter(
userPerm => userPerm.code === perm.code
).length === 0
).length === 0,
false
),
isActive: maybe(() => staffMember.isActive, false),
2019-08-09 11:14:35 +00:00
lastName: maybe(() => staffMember.lastName, ""),
2019-06-19 14:40:52 +00:00
permissions: maybe(() => staffMember.permissions, []).map(perm => perm.code)
};
return (
<Form initial={initialForm} onSubmit={onSubmit} confirmLeave>
{({ data, change, hasChanged, submit }) => (
<Container>
<AppHeader onBack={onBack}>
{intl.formatMessage(sectionNames.staff)}
</AppHeader>
2019-06-19 14:40:52 +00:00
<PageHeader title={getUserName(staffMember)} />
<Grid>
<div>
<StaffProperties
data={data}
disabled={disabled}
canEditAvatar={canEditAvatar}
staffMember={staffMember}
onChange={change}
onImageUpload={onImageUpload}
onImageDelete={onImageDelete}
/>
</div>
{canEditStatus && (
<div>
<AccountPermissions
2019-06-19 14:40:52 +00:00
data={data}
disabled={disabled}
permissions={permissions}
onChange={change}
/>
<CardSpacer />
2019-09-26 13:25:26 +00:00
<AccountStatus
2019-06-19 14:40:52 +00:00
data={data}
disabled={disabled}
2019-10-04 10:57:40 +00:00
label={intl.formatMessage({
defaultMessage: "User is active",
description: "checkbox label"
})}
2019-06-19 14:40:52 +00:00
onChange={change}
/>
</div>
)}
</Grid>
<SaveButtonBar
disabled={disabled || !hasChanged}
state={saveButtonBarState}
onCancel={onBack}
onSave={submit}
onDelete={canRemove ? onDelete : undefined}
/>
</Container>
)}
</Form>
);
};
StaffDetailsPage.displayName = "StaffDetailsPage";
export default StaffDetailsPage;