client/app/pages/users/components/UserInfoForm.jsx (83 lines of code) (raw):

import { get, map } from "lodash"; import React, { useMemo, useCallback } from "react"; import PropTypes from "prop-types"; import { UserProfile } from "@/components/proptypes"; import DynamicComponent from "@/components/DynamicComponent"; import DynamicForm from "@/components/dynamic-form/DynamicForm"; import User from "@/services/user"; import { currentUser } from "@/services/auth"; import useImmutableCallback from "@/lib/hooks/useImmutableCallback"; import UserGroups from "./UserGroups"; import useUserGroups from "../hooks/useUserGroups"; export default function UserInfoForm(props) { const { user, onChange } = props; const { groups, allGroups, isLoading: isLoadingGroups } = useUserGroups(user); const handleChange = useImmutableCallback(onChange); const saveUser = useCallback( (values, successCallback, errorCallback) => { const data = { ...values, id: user.id, }; User.save(data) .then(user => { successCallback("Saved."); handleChange(User.convertUserInfo(user)); }) .catch(error => { errorCallback(get(error, "response.data.message", "Failed saving.")); }); }, [user, handleChange] ); const formFields = useMemo( () => map( [ { name: "name", title: "Name", type: "text", initialValue: user.name, }, { name: "email", title: "Email", type: "email", initialValue: user.email, }, !user.isDisabled && currentUser.id !== user.id ? { name: "group_ids", title: "Groups", type: "select", mode: "multiple", options: map(allGroups, group => ({ name: group.name, value: group.id })), initialValue: map(groups, group => group.id), loading: isLoadingGroups, placeholder: isLoadingGroups ? "Loading..." : "", } : { name: "group_ids", title: "Groups", type: "content", content: isLoadingGroups ? "Loading..." : <UserGroups data-test="Groups" groups={groups} />, }, ], field => ({ readOnly: user.isDisabled, required: true, ...field }) ), [user, groups, allGroups, isLoadingGroups] ); return ( <DynamicComponent name="UserProfile.UserInfoForm" {...props}> <DynamicForm fields={formFields} onSubmit={saveUser} hideSubmitButton={user.isDisabled} /> </DynamicComponent> ); } UserInfoForm.propTypes = { user: UserProfile.isRequired, onChange: PropTypes.func, }; UserInfoForm.defaultProps = { onChange: () => {}, };