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

210 lines
7.2 KiB
TypeScript
Raw Normal View History

// @ts-strict-ignore
import AccountPermissionGroups from "@dashboard/components/AccountPermissionGroups";
import { TopNav } from "@dashboard/components/AppLayout/TopNav";
import CardSpacer from "@dashboard/components/CardSpacer";
import CardTitle from "@dashboard/components/CardTitle";
import { ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton";
import Form from "@dashboard/components/Form";
2023-02-28 09:33:16 +00:00
import { DetailPageLayout } from "@dashboard/components/Layouts";
import { MultiAutocompleteChoiceType } from "@dashboard/components/MultiAutocompleteSelectField";
import Savebar from "@dashboard/components/Savebar";
Use graphql-codegen (#1874) * Use generated hooks in apps * Remove unused files * Use proper types in apps * Use generated hooks in attributes * Use generated hooks in auth module * Use generated hooks in categories * Use generated hooks in channels * Use generated types in collections * Remove legacy types from background tasks * Use generated hooks in customers * Use generated hooks in discounts * Use generated hook in file upload * Use generated types in gift cards * Use generated types in home * Use generated hooks in navigation * Use generated hooks in orders * Use generated hooks in pages * Use generated hooks in page types * Use generated hooks in permission groups * Use generated hooks in plugins * Use generated hooks in products * Use fragment to mark product variants * Improve code a bit * Use generated hooks in page types * Use generated types in searches * Use generated hooks in shipping * Use generated hooks in site settings * Use generated hooks in staff members * Use generated hooks in taxes * Place all gql generated files in one directory * Use generated hooks in translations * Use global types from new generated module * Use generated hooks in warehouses * Use generated hooks in webhooks * Use generated fragment types * Unclutter types * Remove hoc components * Split hooks and types * Fetch introspection file * Delete obsolete schema file * Fix rebase artifacts * Fix autoreplace * Fix auth provider tests * Fix urls * Remove leftover types * Fix rebase artifacts
2022-03-09 08:56:55 +00:00
import {
SearchPermissionGroupsQuery,
StaffErrorFragment,
StaffMemberDetailsFragment,
UserFragment,
} from "@dashboard/graphql";
import { SubmitPromise } from "@dashboard/hooks/useForm";
import useLocale from "@dashboard/hooks/useLocale";
import useNavigator from "@dashboard/hooks/useNavigator";
import useStateFromProps from "@dashboard/hooks/useStateFromProps";
import { getUserName } from "@dashboard/misc";
import UserStatus from "@dashboard/staff/components/UserStatus";
import { staffListUrl } from "@dashboard/staff/urls";
import {
getMemberPermissionGroups,
isMemberActive,
} from "@dashboard/staff/utils";
import { FetchMoreProps, RelayToFlat, SearchPageProps } from "@dashboard/types";
import createMultiAutocompleteSelectHandler from "@dashboard/utils/handlers/multiAutocompleteSelectChangeHandler";
import { Card, CardContent, Typography } from "@material-ui/core";
import React from "react";
import { useIntl } from "react-intl";
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";
import { staffDetailsPageMessages as messages } from "./messages";
2019-06-19 14:40:52 +00:00
export interface StaffDetailsFormData {
email: string;
2019-06-19 14:40:52 +00:00
firstName: string;
isActive: boolean;
2019-06-19 14:40:52 +00:00
lastName: string;
permissionGroups: string[];
2019-06-19 14:40:52 +00:00
}
export interface StaffDetailsPageProps extends SearchPageProps {
Use graphql-codegen (#1874) * Use generated hooks in apps * Remove unused files * Use proper types in apps * Use generated hooks in attributes * Use generated hooks in auth module * Use generated hooks in categories * Use generated hooks in channels * Use generated types in collections * Remove legacy types from background tasks * Use generated hooks in customers * Use generated hooks in discounts * Use generated hook in file upload * Use generated types in gift cards * Use generated types in home * Use generated hooks in navigation * Use generated hooks in orders * Use generated hooks in pages * Use generated hooks in page types * Use generated hooks in permission groups * Use generated hooks in plugins * Use generated hooks in products * Use fragment to mark product variants * Improve code a bit * Use generated hooks in page types * Use generated types in searches * Use generated hooks in shipping * Use generated hooks in site settings * Use generated hooks in staff members * Use generated hooks in taxes * Place all gql generated files in one directory * Use generated hooks in translations * Use global types from new generated module * Use generated hooks in warehouses * Use generated hooks in webhooks * Use generated fragment types * Unclutter types * Remove hoc components * Split hooks and types * Fetch introspection file * Delete obsolete schema file * Fix rebase artifacts * Fix autoreplace * Fix auth provider tests * Fix urls * Remove leftover types * Fix rebase artifacts
2022-03-09 08:56:55 +00:00
availablePermissionGroups: RelayToFlat<SearchPermissionGroupsQuery["search"]>;
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;
fetchMorePermissionGroups: FetchMoreProps;
2019-06-19 14:40:52 +00:00
saveButtonBarState: ConfirmButtonTransitionState;
staffMember: StaffMemberDetailsFragment | UserFragment;
errors: StaffErrorFragment[];
2019-12-03 16:14:30 +00:00
onChangePassword: () => void;
2019-06-19 14:40:52 +00:00
onDelete: () => void;
onImageDelete: () => void;
onSubmit: (data: StaffDetailsFormData) => SubmitPromise;
onImageUpload: (file: File) => any;
2019-06-19 14:40:52 +00:00
}
const StaffDetailsPage: React.FC<StaffDetailsPageProps> = ({
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,
errors,
fetchMorePermissionGroups,
initialSearch,
2019-12-03 16:14:30 +00:00
onChangePassword,
2019-06-19 14:40:52 +00:00
onDelete,
onImageDelete,
onImageUpload,
onSearchChange,
onSubmit,
saveButtonBarState,
staffMember,
2019-06-19 14:40:52 +00:00
}: StaffDetailsPageProps) => {
const intl = useIntl();
const navigate = useNavigator();
2019-10-16 15:18:29 +00:00
const { locale, setLocale } = useLocale();
const isActive = isMemberActive(staffMember);
const permissionGroups = getMemberPermissionGroups(staffMember);
const [permissionGroupsDisplayValues, setPermissionGroupsDisplayValues] =
useStateFromProps<MultiAutocompleteChoiceType[]>(
permissionGroups.map(group => ({
disabled: !group.userCanManage,
label: group.name,
value: group.id,
})) || [],
);
const initialForm: StaffDetailsFormData = {
email: staffMember?.email || "",
firstName: staffMember?.firstName || "",
isActive,
lastName: staffMember?.lastName || "",
permissionGroups: 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
confirmLeave
initial={initialForm}
onSubmit={onSubmit}
disabled={disabled}
>
{({ data: formData, change, isSaveDisabled, submit, toggleValue }) => {
const permissionGroupsChange = createMultiAutocompleteSelectHandler(
toggleValue,
setPermissionGroupsDisplayValues,
permissionGroupsDisplayValues,
availablePermissionGroups?.map(group => ({
label: group.name,
value: group.id,
})) || [],
);
return (
2023-02-28 09:33:16 +00:00
<DetailPageLayout>
<TopNav href={staffListUrl()} title={getUserName(staffMember)} />
2023-02-28 09:33:16 +00:00
<DetailPageLayout.Content>
<StaffProperties
errors={errors}
data={formData}
disabled={disabled}
canEditAvatar={canEditAvatar}
staffMember={staffMember}
onChange={change}
onImageUpload={onImageUpload}
onImageDelete={onImageDelete}
/>
{canEditPreferences && (
<>
<CardSpacer />
<StaffPassword onChangePassword={onChangePassword} />
</>
)}
2023-02-28 09:33:16 +00:00
</DetailPageLayout.Content>
2023-02-28 09:33:16 +00:00
<DetailPageLayout.RightSidebar>
{canEditPreferences && (
<StaffPreferences locale={locale} onLocaleChange={setLocale} />
)}
{canEditStatus && (
<>
<UserStatus
data={formData}
disabled={disabled}
label={intl.formatMessage(messages.userStatusActive)}
onChange={change}
2019-10-16 15:18:29 +00:00
/>
<CardSpacer />
<Card>
<CardTitle
title={intl.formatMessage({
id: "Fbr4Vp",
defaultMessage: "Permissions",
description: "dialog header",
})}
/>
<CardContent>
<Typography>
{intl.formatMessage({
id: "P+kVxW",
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>
</>
)}
2023-02-28 09:33:16 +00:00
</DetailPageLayout.RightSidebar>
Use MacawUI (#1229) * Replace withStyleswith useStyles (#1100) * Replace withStyleswith useStyles * Update messages * Use rem as a spacing unit (#1101) * Use rems as spacing units * Fix visual bugs * Update stories * Use macaw-ui as theme provider (#1108) * Use macaw ui as a theme provider * Add react-dom to aliases * Fix jest module resolution * Update useTheme hook usage * Fix test wrapper * Use macaw from git repo * Fix CI * Update stories * Fix aliasing * Extract savebar to macaw ui (#1146) * wip * Use savebar from macaw * Use confirm button from macaw * Improve file structure * Use sidebar context from macaw * Update macaw * Update macaw version * Remove savebar from storybook * Update stories * Use alerts and notifications from macaw (#1166) * Use alerts from macaw * Add notifications from macaw * Update stories * Pin macaw version * Encapsulate limit reached in one component * Remove unused imports * Use backlinks from macaw (#1183) * Use backlink from macaw * Update macaw version * Use macaw sidebar (#1148) * Use sidebar from macaw * Use shipped logo * Use lowercase * Update stories * Use user chip from macaw (#1191) * Use user chip from macaw * Use dedicated components for menu items * Simplify code * Bump version and fix types (#1210) * Rename onBack to onClick * Rename UserChip to UserChipMenu * Rename IMenuItem to SidebarMenuItem * Update macaw version * Fix tables after changes in macaw (#1220) * Update macaw version * Update changelog * Update stories * Fix after rebase * Update to macaw 0.2.0 * Lint files * Update macaw to 0.2.2
2021-07-21 08:59:52 +00:00
<Savebar
disabled={isSaveDisabled}
state={saveButtonBarState}
onCancel={() => navigate(staffListUrl())}
Use MacawUI (#1229) * Replace withStyleswith useStyles (#1100) * Replace withStyleswith useStyles * Update messages * Use rem as a spacing unit (#1101) * Use rems as spacing units * Fix visual bugs * Update stories * Use macaw-ui as theme provider (#1108) * Use macaw ui as a theme provider * Add react-dom to aliases * Fix jest module resolution * Update useTheme hook usage * Fix test wrapper * Use macaw from git repo * Fix CI * Update stories * Fix aliasing * Extract savebar to macaw ui (#1146) * wip * Use savebar from macaw * Use confirm button from macaw * Improve file structure * Use sidebar context from macaw * Update macaw * Update macaw version * Remove savebar from storybook * Update stories * Use alerts and notifications from macaw (#1166) * Use alerts from macaw * Add notifications from macaw * Update stories * Pin macaw version * Encapsulate limit reached in one component * Remove unused imports * Use backlinks from macaw (#1183) * Use backlink from macaw * Update macaw version * Use macaw sidebar (#1148) * Use sidebar from macaw * Use shipped logo * Use lowercase * Update stories * Use user chip from macaw (#1191) * Use user chip from macaw * Use dedicated components for menu items * Simplify code * Bump version and fix types (#1210) * Rename onBack to onClick * Rename UserChip to UserChipMenu * Rename IMenuItem to SidebarMenuItem * Update macaw version * Fix tables after changes in macaw (#1220) * Update macaw version * Update changelog * Update stories * Fix after rebase * Update to macaw 0.2.0 * Lint files * Update macaw to 0.2.2
2021-07-21 08:59:52 +00:00
onSubmit={submit}
onDelete={canRemove ? onDelete : undefined}
/>
2023-02-28 09:33:16 +00:00
</DetailPageLayout>
);
}}
2019-06-19 14:40:52 +00:00
</Form>
);
};
StaffDetailsPage.displayName = "StaffDetailsPage";
export default StaffDetailsPage;