2020-04-23 15:43:08 +00:00
|
|
|
import { Card, CardContent, Typography } from "@material-ui/core";
|
|
|
|
import AccountPermissionGroups from "@saleor/components/AccountPermissionGroups";
|
2020-07-22 10:54:15 +00:00
|
|
|
import AccountStatus from "@saleor/components/AppStatus";
|
2019-06-19 14:40:52 +00:00
|
|
|
import CardSpacer from "@saleor/components/CardSpacer";
|
2020-04-23 15:43:08 +00:00
|
|
|
import CardTitle from "@saleor/components/CardTitle";
|
2019-06-19 14:40:52 +00:00
|
|
|
import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton";
|
|
|
|
import Container from "@saleor/components/Container";
|
|
|
|
import Form from "@saleor/components/Form";
|
|
|
|
import Grid from "@saleor/components/Grid";
|
2020-04-23 15:43:08 +00:00
|
|
|
import { MultiAutocompleteChoiceType } from "@saleor/components/MultiAutocompleteSelectField";
|
2019-06-19 14:40:52 +00:00
|
|
|
import PageHeader from "@saleor/components/PageHeader";
|
2021-07-21 08:59:52 +00:00
|
|
|
import Savebar from "@saleor/components/Savebar";
|
2020-07-07 10:14:12 +00:00
|
|
|
import { StaffErrorFragment } from "@saleor/fragments/types/StaffErrorFragment";
|
2020-11-02 13:26:02 +00:00
|
|
|
import { SubmitPromise } from "@saleor/hooks/useForm";
|
2019-10-16 15:18:29 +00:00
|
|
|
import useLocale from "@saleor/hooks/useLocale";
|
2020-04-23 15:43:08 +00:00
|
|
|
import useStateFromProps from "@saleor/hooks/useStateFromProps";
|
2019-08-26 21:43:29 +00:00
|
|
|
import { sectionNames } from "@saleor/intl";
|
2021-07-21 08:59:52 +00:00
|
|
|
import { Backlink } from "@saleor/macaw-ui";
|
2020-04-23 15:43:08 +00:00
|
|
|
import { getUserName } from "@saleor/misc";
|
|
|
|
import { SearchPermissionGroups_search_edges_node } from "@saleor/searches/types/SearchPermissionGroups";
|
|
|
|
import { FetchMoreProps, SearchPageProps } from "@saleor/types";
|
|
|
|
import createMultiAutocompleteSelectHandler from "@saleor/utils/handlers/multiAutocompleteSelectChangeHandler";
|
2020-05-14 09:30:32 +00:00
|
|
|
import React from "react";
|
|
|
|
import { useIntl } from "react-intl";
|
|
|
|
|
2019-09-26 13:16:36 +00:00
|
|
|
import { StaffMemberDetails_user } from "../../types/StaffMemberDetails";
|
2020-04-23 15:43:08 +00:00
|
|
|
import StaffPassword from "../StaffPassword/StaffPassword";
|
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";
|
|
|
|
|
2020-04-23 15:43:08 +00:00
|
|
|
export interface StaffDetailsFormData {
|
|
|
|
email: string;
|
2019-06-19 14:40:52 +00:00
|
|
|
firstName: string;
|
2020-04-23 15:43:08 +00:00
|
|
|
isActive: boolean;
|
2019-06-19 14:40:52 +00:00
|
|
|
lastName: string;
|
2020-04-23 15:43:08 +00:00
|
|
|
permissionGroups: string[];
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
|
|
|
|
2020-04-23 15:43:08 +00:00
|
|
|
export interface StaffDetailsPageProps extends SearchPageProps {
|
|
|
|
availablePermissionGroups: SearchPermissionGroups_search_edges_node[];
|
2019-06-19 14:40:52 +00:00
|
|
|
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;
|
2020-04-23 15:43:08 +00:00
|
|
|
fetchMorePermissionGroups: FetchMoreProps;
|
2019-06-19 14:40:52 +00:00
|
|
|
saveButtonBarState: ConfirmButtonTransitionState;
|
|
|
|
staffMember: StaffMemberDetails_user;
|
2020-04-23 15:43:08 +00:00
|
|
|
errors: StaffErrorFragment[];
|
2019-06-19 14:40:52 +00:00
|
|
|
onBack: () => void;
|
2019-12-03 16:14:30 +00:00
|
|
|
onChangePassword: () => void;
|
2019-06-19 14:40:52 +00:00
|
|
|
onDelete: () => void;
|
|
|
|
onImageDelete: () => void;
|
2020-11-02 13:26:02 +00:00
|
|
|
onSubmit: (data: StaffDetailsFormData) => SubmitPromise;
|
2019-06-19 14:40:52 +00:00
|
|
|
onImageUpload(file: File);
|
|
|
|
}
|
|
|
|
|
2019-11-07 11:34:54 +00:00
|
|
|
const StaffDetailsPage: React.FC<StaffDetailsPageProps> = ({
|
2020-04-23 15:43:08 +00:00
|
|
|
availablePermissionGroups,
|
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,
|
2020-04-23 15:43:08 +00:00
|
|
|
errors,
|
|
|
|
fetchMorePermissionGroups,
|
|
|
|
initialSearch,
|
2019-06-19 14:40:52 +00:00
|
|
|
onBack,
|
2019-12-03 16:14:30 +00:00
|
|
|
onChangePassword,
|
2019-06-19 14:40:52 +00:00
|
|
|
onDelete,
|
|
|
|
onImageDelete,
|
|
|
|
onImageUpload,
|
2020-04-23 15:43:08 +00:00
|
|
|
onSearchChange,
|
|
|
|
onSubmit,
|
|
|
|
saveButtonBarState,
|
|
|
|
staffMember
|
2019-06-19 14:40:52 +00:00
|
|
|
}: StaffDetailsPageProps) => {
|
2019-08-26 21:43:29 +00:00
|
|
|
const intl = useIntl();
|
2019-10-16 15:18:29 +00:00
|
|
|
const { locale, setLocale } = useLocale();
|
2020-04-23 15:43:08 +00:00
|
|
|
const [
|
|
|
|
permissionGroupsDisplayValues,
|
|
|
|
setPermissionGroupsDisplayValues
|
|
|
|
] = useStateFromProps<MultiAutocompleteChoiceType[]>(
|
|
|
|
(staffMember?.permissionGroups || []).map(group => ({
|
|
|
|
disabled: !group.userCanManage,
|
|
|
|
label: group.name,
|
|
|
|
value: group.id
|
|
|
|
})) || []
|
|
|
|
);
|
2019-08-26 21:43:29 +00:00
|
|
|
|
2020-04-23 15:43:08 +00:00
|
|
|
const initialForm: StaffDetailsFormData = {
|
|
|
|
email: staffMember?.email || "",
|
|
|
|
firstName: staffMember?.firstName || "",
|
|
|
|
isActive: !!staffMember?.isActive,
|
|
|
|
lastName: staffMember?.lastName || "",
|
|
|
|
permissionGroups: staffMember?.permissionGroups.map(pg => pg.id) || []
|
2019-06-19 14:40:52 +00:00
|
|
|
};
|
2019-10-16 15:18:29 +00:00
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
return (
|
|
|
|
<Form initial={initialForm} onSubmit={onSubmit} confirmLeave>
|
2020-04-23 15:43:08 +00:00
|
|
|
{({ data: formData, change, hasChanged, submit, toggleValue }) => {
|
|
|
|
const permissionGroupsChange = createMultiAutocompleteSelectHandler(
|
|
|
|
toggleValue,
|
|
|
|
setPermissionGroupsDisplayValues,
|
|
|
|
permissionGroupsDisplayValues,
|
|
|
|
availablePermissionGroups?.map(group => ({
|
|
|
|
label: group.name,
|
|
|
|
value: group.id
|
|
|
|
})) || []
|
|
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Container>
|
2021-07-21 08:59:52 +00:00
|
|
|
<Backlink onClick={onBack}>
|
2020-04-23 15:43:08 +00:00
|
|
|
{intl.formatMessage(sectionNames.staff)}
|
2021-07-21 08:59:52 +00:00
|
|
|
</Backlink>
|
2020-04-23 15:43:08 +00:00
|
|
|
<PageHeader title={getUserName(staffMember)} />
|
|
|
|
<Grid>
|
|
|
|
<div>
|
|
|
|
<StaffProperties
|
|
|
|
errors={errors}
|
|
|
|
data={formData}
|
|
|
|
disabled={disabled}
|
|
|
|
canEditAvatar={canEditAvatar}
|
|
|
|
staffMember={staffMember}
|
|
|
|
onChange={change}
|
|
|
|
onImageUpload={onImageUpload}
|
|
|
|
onImageDelete={onImageDelete}
|
|
|
|
/>
|
|
|
|
{canEditPreferences && (
|
|
|
|
<>
|
|
|
|
<CardSpacer />
|
|
|
|
<StaffPassword onChangePassword={onChangePassword} />
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
{canEditPreferences && (
|
|
|
|
<StaffPreferences
|
|
|
|
locale={locale}
|
|
|
|
onLocaleChange={setLocale}
|
2019-10-16 15:18:29 +00:00
|
|
|
/>
|
2020-04-23 15:43:08 +00:00
|
|
|
)}
|
|
|
|
{canEditStatus && (
|
|
|
|
<>
|
|
|
|
<Card>
|
|
|
|
<CardTitle
|
|
|
|
title={intl.formatMessage({
|
|
|
|
defaultMessage: "Permissions",
|
|
|
|
description: "dialog header"
|
|
|
|
})}
|
|
|
|
/>
|
|
|
|
<CardContent>
|
|
|
|
<Typography>
|
|
|
|
{intl.formatMessage({
|
|
|
|
defaultMessage: "User is assigned to:",
|
|
|
|
description: "card description"
|
|
|
|
})}
|
|
|
|
</Typography>
|
|
|
|
|
|
|
|
<AccountPermissionGroups
|
|
|
|
formData={formData}
|
|
|
|
disabled={disabled}
|
|
|
|
errors={errors}
|
|
|
|
initialSearch={initialSearch}
|
|
|
|
availablePermissionGroups={availablePermissionGroups}
|
|
|
|
onChange={permissionGroupsChange}
|
|
|
|
onSearchChange={onSearchChange}
|
|
|
|
displayValues={permissionGroupsDisplayValues}
|
|
|
|
{...fetchMorePermissionGroups}
|
|
|
|
/>
|
|
|
|
</CardContent>
|
|
|
|
</Card>
|
|
|
|
<CardSpacer />
|
|
|
|
<AccountStatus
|
|
|
|
data={formData}
|
|
|
|
disabled={disabled}
|
|
|
|
label={intl.formatMessage({
|
|
|
|
defaultMessage: "User is active",
|
|
|
|
description: "checkbox label"
|
|
|
|
})}
|
|
|
|
onChange={change}
|
|
|
|
/>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
</Grid>
|
2021-07-21 08:59:52 +00:00
|
|
|
<Savebar
|
2020-04-23 15:43:08 +00:00
|
|
|
disabled={disabled || !hasChanged}
|
|
|
|
state={saveButtonBarState}
|
|
|
|
onCancel={onBack}
|
2021-07-21 08:59:52 +00:00
|
|
|
onSubmit={submit}
|
2020-04-23 15:43:08 +00:00
|
|
|
onDelete={canRemove ? onDelete : undefined}
|
|
|
|
/>
|
|
|
|
</Container>
|
|
|
|
);
|
|
|
|
}}
|
2019-06-19 14:40:52 +00:00
|
|
|
</Form>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
StaffDetailsPage.displayName = "StaffDetailsPage";
|
|
|
|
export default StaffDetailsPage;
|