2020-04-23 15:43:08 +00:00
|
|
|
import DialogContentText from "@material-ui/core/DialogContentText";
|
2019-06-19 14:40:52 +00:00
|
|
|
import ActionDialog from "@saleor/components/ActionDialog";
|
2020-04-23 15:43:08 +00:00
|
|
|
import NotFoundPage from "@saleor/components/NotFoundPage";
|
2019-06-19 14:40:52 +00:00
|
|
|
import { WindowTitle } from "@saleor/components/WindowTitle";
|
2020-04-23 15:43:08 +00:00
|
|
|
import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
|
2019-06-19 14:40:52 +00:00
|
|
|
import useNavigator from "@saleor/hooks/useNavigator";
|
|
|
|
import useNotifier from "@saleor/hooks/useNotifier";
|
|
|
|
import useUser from "@saleor/hooks/useUser";
|
2019-08-26 21:43:29 +00:00
|
|
|
import { commonMessages } from "@saleor/intl";
|
2020-05-14 09:30:32 +00:00
|
|
|
import { getStringOrPlaceholder, maybe } from "@saleor/misc";
|
2020-04-23 15:43:08 +00:00
|
|
|
import usePermissionGroupSearch from "@saleor/searches/usePermissionGroupSearch";
|
2020-05-14 09:30:32 +00:00
|
|
|
import React from "react";
|
|
|
|
import { FormattedMessage, useIntl } from "react-intl";
|
2020-04-23 15:43:08 +00:00
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
import StaffDetailsPage from "../components/StaffDetailsPage/StaffDetailsPage";
|
2020-04-23 15:43:08 +00:00
|
|
|
import StaffPasswordResetDialog from "../components/StaffPasswordResetDialog";
|
2019-06-19 14:40:52 +00:00
|
|
|
import {
|
|
|
|
TypedStaffAvatarDeleteMutation,
|
|
|
|
TypedStaffAvatarUpdateMutation,
|
|
|
|
TypedStaffMemberDeleteMutation,
|
2019-12-03 16:39:27 +00:00
|
|
|
TypedStaffMemberUpdateMutation,
|
|
|
|
useChangeStaffPassword
|
2019-06-19 14:40:52 +00:00
|
|
|
} from "../mutations";
|
|
|
|
import { TypedStaffMemberDetailsQuery } from "../queries";
|
2020-04-23 15:43:08 +00:00
|
|
|
import { ChangeStaffPassword } from "../types/ChangeStaffPassword";
|
2019-06-19 14:40:52 +00:00
|
|
|
import { StaffAvatarDelete } from "../types/StaffAvatarDelete";
|
|
|
|
import { StaffAvatarUpdate } from "../types/StaffAvatarUpdate";
|
|
|
|
import { StaffMemberDelete } from "../types/StaffMemberDelete";
|
|
|
|
import { StaffMemberUpdate } from "../types/StaffMemberUpdate";
|
|
|
|
import {
|
|
|
|
staffListUrl,
|
|
|
|
staffMemberDetailsUrl,
|
|
|
|
StaffMemberDetailsUrlQueryParams
|
|
|
|
} from "../urls";
|
2020-04-23 15:43:08 +00:00
|
|
|
import { groupsDiff } from "../utils";
|
2019-06-19 14:40:52 +00:00
|
|
|
|
|
|
|
interface OrderListProps {
|
|
|
|
id: string;
|
|
|
|
params: StaffMemberDetailsUrlQueryParams;
|
|
|
|
}
|
|
|
|
|
2019-11-07 11:34:54 +00:00
|
|
|
export const StaffDetails: React.FC<OrderListProps> = ({ id, params }) => {
|
2019-06-19 14:40:52 +00:00
|
|
|
const navigate = useNavigator();
|
|
|
|
const notify = useNotifier();
|
|
|
|
const user = useUser();
|
2019-08-26 21:43:29 +00:00
|
|
|
const intl = useIntl();
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2019-12-03 16:30:37 +00:00
|
|
|
const closeModal = () =>
|
|
|
|
navigate(
|
|
|
|
staffMemberDetailsUrl(id, {
|
|
|
|
...params,
|
|
|
|
action: undefined
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
2019-12-03 16:39:27 +00:00
|
|
|
const handleChangePassword = (data: ChangeStaffPassword) => {
|
|
|
|
if (data.passwordChange.errors.length === 0) {
|
|
|
|
notify({
|
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
|
|
|
});
|
|
|
|
closeModal();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const [changePassword, changePasswordOpts] = useChangeStaffPassword({
|
|
|
|
onCompleted: handleChangePassword
|
|
|
|
});
|
|
|
|
|
2020-02-20 14:18:22 +00:00
|
|
|
const handleBack = () => navigate(staffListUrl());
|
|
|
|
|
2020-04-23 15:43:08 +00:00
|
|
|
const {
|
|
|
|
loadMore: loadMorePermissionGroups,
|
|
|
|
search: searchPermissionGroups,
|
|
|
|
result: searchPermissionGroupsOpts
|
|
|
|
} = usePermissionGroupSearch({
|
|
|
|
variables: DEFAULT_INITIAL_SEARCH_DATA
|
|
|
|
});
|
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
return (
|
2020-02-20 14:18:22 +00:00
|
|
|
<TypedStaffMemberDetailsQuery displayLoader variables={{ id }}>
|
2019-06-19 14:40:52 +00:00
|
|
|
{({ data, loading }) => {
|
2020-02-20 14:18:22 +00:00
|
|
|
const staffMember = data?.user;
|
|
|
|
|
|
|
|
if (staffMember === null) {
|
|
|
|
return <NotFoundPage onBack={handleBack} />;
|
|
|
|
}
|
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
const handleStaffMemberUpdate = (data: StaffMemberUpdate) => {
|
|
|
|
if (!maybe(() => data.staffUpdate.errors.length !== 0)) {
|
|
|
|
notify({
|
2019-08-26 21:43:29 +00:00
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
2019-06-19 14:40:52 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const handleStaffMemberDelete = (data: StaffMemberDelete) => {
|
|
|
|
if (!maybe(() => data.staffDelete.errors.length !== 0)) {
|
|
|
|
notify({
|
2019-08-26 21:43:29 +00:00
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
2019-06-19 14:40:52 +00:00
|
|
|
});
|
|
|
|
navigate(staffListUrl());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const handleStaffMemberAvatarUpdate = (data: StaffAvatarUpdate) => {
|
|
|
|
if (!maybe(() => data.userAvatarUpdate.errors.length !== 0)) {
|
|
|
|
notify({
|
2019-08-26 21:43:29 +00:00
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
2019-06-19 14:40:52 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const handleStaffMemberAvatarDelete = (data: StaffAvatarDelete) => {
|
|
|
|
if (!maybe(() => data.userAvatarDelete.errors.length !== 0)) {
|
|
|
|
notify({
|
2019-08-26 21:43:29 +00:00
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
2019-06-19 14:40:52 +00:00
|
|
|
});
|
|
|
|
navigate(staffMemberDetailsUrl(id));
|
|
|
|
}
|
|
|
|
};
|
2020-02-20 14:18:22 +00:00
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
return (
|
|
|
|
<TypedStaffMemberUpdateMutation onCompleted={handleStaffMemberUpdate}>
|
|
|
|
{(updateStaffMember, updateResult) => (
|
|
|
|
<TypedStaffMemberDeleteMutation
|
|
|
|
variables={{ id }}
|
|
|
|
onCompleted={handleStaffMemberDelete}
|
|
|
|
>
|
|
|
|
{(deleteStaffMember, deleteResult) => (
|
|
|
|
<TypedStaffAvatarUpdateMutation
|
|
|
|
onCompleted={handleStaffMemberAvatarUpdate}
|
|
|
|
>
|
|
|
|
{updateStaffAvatar => (
|
|
|
|
<TypedStaffAvatarDeleteMutation
|
|
|
|
onCompleted={handleStaffMemberAvatarDelete}
|
|
|
|
>
|
|
|
|
{(deleteStaffAvatar, deleteAvatarResult) => {
|
2020-04-23 15:43:08 +00:00
|
|
|
const isUserSameAsViewer =
|
|
|
|
user.user?.id === data?.user?.id;
|
2019-06-19 14:40:52 +00:00
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<WindowTitle
|
2020-04-23 15:43:08 +00:00
|
|
|
title={getStringOrPlaceholder(
|
|
|
|
staffMember?.email
|
|
|
|
)}
|
2019-06-19 14:40:52 +00:00
|
|
|
/>
|
|
|
|
<StaffDetailsPage
|
2020-04-23 15:43:08 +00:00
|
|
|
errors={
|
|
|
|
updateResult?.data?.staffUpdate?.errors || []
|
|
|
|
}
|
2019-06-19 14:40:52 +00:00
|
|
|
canEditAvatar={isUserSameAsViewer}
|
2019-10-16 15:18:29 +00:00
|
|
|
canEditPreferences={isUserSameAsViewer}
|
2019-06-19 14:40:52 +00:00
|
|
|
canEditStatus={!isUserSameAsViewer}
|
|
|
|
canRemove={!isUserSameAsViewer}
|
|
|
|
disabled={loading}
|
2020-02-20 14:18:22 +00:00
|
|
|
onBack={handleBack}
|
2020-04-23 15:43:08 +00:00
|
|
|
initialSearch=""
|
2019-12-03 16:14:30 +00:00
|
|
|
onChangePassword={() =>
|
|
|
|
navigate(
|
|
|
|
staffMemberDetailsUrl(id, {
|
|
|
|
action: "change-password"
|
|
|
|
})
|
|
|
|
)
|
|
|
|
}
|
2019-06-19 14:40:52 +00:00
|
|
|
onDelete={() =>
|
|
|
|
navigate(
|
|
|
|
staffMemberDetailsUrl(id, {
|
|
|
|
action: "remove"
|
|
|
|
})
|
|
|
|
)
|
|
|
|
}
|
2020-04-23 15:43:08 +00:00
|
|
|
onSubmit={variables => {
|
2019-06-19 14:40:52 +00:00
|
|
|
updateStaffMember({
|
|
|
|
variables: {
|
|
|
|
id,
|
|
|
|
input: {
|
|
|
|
email: variables.email,
|
|
|
|
firstName: variables.firstName,
|
|
|
|
isActive: variables.isActive,
|
2020-04-23 15:43:08 +00:00
|
|
|
lastName: variables.lastName,
|
|
|
|
...groupsDiff(data?.user, variables)
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
|
|
|
}
|
2020-04-23 15:43:08 +00:00
|
|
|
});
|
|
|
|
}}
|
2019-06-19 14:40:52 +00:00
|
|
|
onImageUpload={file =>
|
|
|
|
updateStaffAvatar({
|
|
|
|
variables: {
|
|
|
|
image: file
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
onImageDelete={() =>
|
|
|
|
navigate(
|
|
|
|
staffMemberDetailsUrl(id, {
|
|
|
|
action: "remove-avatar"
|
|
|
|
})
|
|
|
|
)
|
|
|
|
}
|
2020-04-23 15:43:08 +00:00
|
|
|
availablePermissionGroups={searchPermissionGroupsOpts.data?.search.edges.map(
|
|
|
|
edge => edge.node
|
|
|
|
)}
|
2020-02-20 14:18:22 +00:00
|
|
|
staffMember={staffMember}
|
2019-12-06 17:17:44 +00:00
|
|
|
saveButtonBarState={updateResult.status}
|
2020-04-23 15:43:08 +00:00
|
|
|
fetchMorePermissionGroups={{
|
|
|
|
hasMore:
|
|
|
|
searchPermissionGroupsOpts.data?.search
|
|
|
|
.pageInfo.hasNextPage,
|
|
|
|
loading: searchPermissionGroupsOpts.loading,
|
|
|
|
onFetchMore: loadMorePermissionGroups
|
|
|
|
}}
|
|
|
|
onSearchChange={searchPermissionGroups}
|
2019-06-19 14:40:52 +00:00
|
|
|
/>
|
|
|
|
<ActionDialog
|
|
|
|
open={params.action === "remove"}
|
2019-08-26 21:43:29 +00:00
|
|
|
title={intl.formatMessage({
|
2019-09-05 10:44:10 +00:00
|
|
|
defaultMessage: "delete Staff User",
|
2019-08-26 21:43:29 +00:00
|
|
|
description: "dialog header"
|
|
|
|
})}
|
2019-12-06 17:17:44 +00:00
|
|
|
confirmButtonState={deleteResult.status}
|
2019-06-19 14:40:52 +00:00
|
|
|
variant="delete"
|
2019-12-03 16:30:37 +00:00
|
|
|
onClose={closeModal}
|
2019-06-19 14:40:52 +00:00
|
|
|
onConfirm={deleteStaffMember}
|
|
|
|
>
|
2019-08-26 21:43:29 +00:00
|
|
|
<DialogContentText>
|
|
|
|
<FormattedMessage
|
2019-09-05 10:44:10 +00:00
|
|
|
defaultMessage="Are you sure you want to delete {email} from staff members?"
|
2019-08-26 21:43:29 +00:00
|
|
|
values={{
|
2020-04-23 15:43:08 +00:00
|
|
|
email: getStringOrPlaceholder(
|
|
|
|
data?.user?.email
|
|
|
|
)
|
2019-08-26 21:43:29 +00:00
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</DialogContentText>
|
2019-06-19 14:40:52 +00:00
|
|
|
</ActionDialog>
|
|
|
|
<ActionDialog
|
|
|
|
open={params.action === "remove-avatar"}
|
2019-08-26 21:43:29 +00:00
|
|
|
title={intl.formatMessage({
|
|
|
|
defaultMessage: "Delete Staff User Avatar",
|
|
|
|
description: "dialog header"
|
|
|
|
})}
|
2019-12-06 17:17:44 +00:00
|
|
|
confirmButtonState={deleteAvatarResult.status}
|
2019-06-19 14:40:52 +00:00
|
|
|
variant="delete"
|
2019-12-03 16:30:37 +00:00
|
|
|
onClose={closeModal}
|
2019-06-19 14:40:52 +00:00
|
|
|
onConfirm={deleteStaffAvatar}
|
|
|
|
>
|
2019-08-26 21:43:29 +00:00
|
|
|
<DialogContentText>
|
|
|
|
<FormattedMessage
|
|
|
|
defaultMessage="Are you sure you want to remove {email} avatar?"
|
|
|
|
values={{
|
|
|
|
email: (
|
|
|
|
<strong>
|
2020-04-23 15:43:08 +00:00
|
|
|
{getStringOrPlaceholder(
|
|
|
|
data?.user?.email
|
|
|
|
)}
|
2019-08-26 21:43:29 +00:00
|
|
|
</strong>
|
|
|
|
)
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</DialogContentText>
|
2019-06-19 14:40:52 +00:00
|
|
|
</ActionDialog>
|
2019-12-03 16:30:37 +00:00
|
|
|
<StaffPasswordResetDialog
|
2019-12-06 17:17:44 +00:00
|
|
|
confirmButtonState={changePasswordOpts.status}
|
2020-04-23 15:43:08 +00:00
|
|
|
errors={
|
|
|
|
changePasswordOpts?.data?.passwordChange
|
|
|
|
?.errors || []
|
|
|
|
}
|
2019-12-03 16:30:37 +00:00
|
|
|
open={params.action === "change-password"}
|
|
|
|
onClose={closeModal}
|
2019-12-03 16:39:27 +00:00
|
|
|
onSubmit={data =>
|
|
|
|
changePassword({
|
2019-12-03 16:42:27 +00:00
|
|
|
variables: data
|
2019-12-03 16:39:27 +00:00
|
|
|
})
|
|
|
|
}
|
2019-12-03 16:30:37 +00:00
|
|
|
/>
|
2019-06-19 14:40:52 +00:00
|
|
|
</>
|
|
|
|
);
|
|
|
|
}}
|
|
|
|
</TypedStaffAvatarDeleteMutation>
|
|
|
|
)}
|
|
|
|
</TypedStaffAvatarUpdateMutation>
|
|
|
|
)}
|
|
|
|
</TypedStaffMemberDeleteMutation>
|
|
|
|
)}
|
|
|
|
</TypedStaffMemberUpdateMutation>
|
|
|
|
);
|
|
|
|
}}
|
|
|
|
</TypedStaffMemberDetailsQuery>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default StaffDetails;
|