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

144 lines
4.5 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";
2019-10-16 15:18:29 +00:00
import useLocale from "@saleor/hooks/useLocale";
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-10-16 15:18:29 +00:00
import StaffPreferences from "../StaffPreferences";
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;
2019-10-16 15:18:29 +00:00
canEditPreferences: boolean;
2019-06-19 14:40:52 +00:00
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.FC<StaffDetailsPageProps> = ({
2019-06-19 14:40:52 +00:00
canEditAvatar,
2019-10-16 15:18:29 +00:00
canEditPreferences,
2019-06-19 14:40:52 +00:00
canEditStatus,
canRemove,
disabled,
permissions,
saveButtonBarState,
staffMember,
onBack,
onDelete,
onImageDelete,
onImageUpload,
onSubmit
}: StaffDetailsPageProps) => {
const intl = useIntl();
2019-10-16 15:18:29 +00:00
const { locale, setLocale } = useLocale();
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)
};
2019-10-16 15:18:29 +00:00
2019-06-19 14:40:52 +00:00
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>
2019-10-16 15:18:29 +00:00
<div>
{canEditPreferences && (
<StaffPreferences locale={locale} onLocaleChange={setLocale} />
)}
{canEditStatus && (
<>
<AccountPermissions
data={data}
disabled={disabled}
permissions={permissions}
onChange={change}
/>
<CardSpacer />
<AccountStatus
data={data}
disabled={disabled}
label={intl.formatMessage({
defaultMessage: "User is active",
description: "checkbox label"
})}
onChange={change}
/>
</>
)}
</div>
2019-06-19 14:40:52 +00:00
</Grid>
<SaveButtonBar
disabled={disabled || !hasChanged}
state={saveButtonBarState}
onCancel={onBack}
onSave={submit}
onDelete={canRemove ? onDelete : undefined}
/>
</Container>
)}
</Form>
);
};
StaffDetailsPage.displayName = "StaffDetailsPage";
export default StaffDetailsPage;