Advertisement
Guest User

Select Issue

a guest
Nov 22nd, 2022
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import {
  2.   MDBBtn,
  3.   MDBCol,
  4.   MDBModal,
  5.   MDBModalBody,
  6.   MDBModalContent,
  7.   MDBModalDialog,
  8.   MDBModalFooter,
  9.   MDBModalHeader,
  10.   MDBModalTitle,
  11.   MDBRow,
  12.   MDBSelect,
  13.   SelectData,
  14. } from "mdb-react-ui-kit";
  15. import { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from "react";
  16. import {
  17.   getUpdatedUserDTO,
  18.   UpdateUserDTO,
  19.   UserDTO,
  20. } from "../../../../../Contracts/Authentication/Identity/User/UserDTO";
  21. import { useForm, SubmitHandler } from "react-hook-form";
  22. import { useAlert } from "../../../../modules/Alerts/AlertContext";
  23. import { useDarkMode } from "../../../../modules/Themes/ThemeContext";
  24. import { useUserControllerContext } from "../../../../../Services/Authentication/Identity/User/UsersController";
  25. import { useRoleControllerContext } from "../../../../../Services/Authentication/Identity/Role/RolesController";
  26. import { RoleDTO } from "../../../../../Contracts/Authentication/Identity/Role/RoleDTO";
  27. type Inputs = {
  28.   email: string;
  29.   password: string;
  30.   password_repeat: string;
  31. };
  32.  
  33. interface Props {
  34.   userDTO: UserDTO;
  35.   handleRefresh: () => void;
  36.   allRoles: RoleDTO[]
  37. }
  38.  
  39. export interface EditComponentShowModal {
  40.   toggleShow: () => void;
  41. }
  42.  
  43. export const Edit = forwardRef<EditComponentShowModal, Props>(
  44.   (props: Props, ref) => {
  45.     const usersController = useUserControllerContext();
  46.     const { setAlert } = useAlert();
  47.     const { textTheme } = useDarkMode();
  48.     const { bodyTheme } = useDarkMode();
  49.  
  50.     //START MODAL
  51.     const [staticModal, setStaticModal] = useState(true);
  52.     const [updateUserDTO, setUpdateUserDTO] = useState(
  53.       getUpdatedUserDTO(props.userDTO)
  54.     );
  55.  
  56.     const [allRoles, setAllRoles] = useState<RoleDTO[]>(props.allRoles);
  57.  
  58.     //ROLE MULTISELECT START
  59.     const [selectedRoles, setSelectedRoles] = useState<string[]>([]);
  60.     let selectData = useMemo(() =>
  61.     allRoles.map((value: RoleDTO, index: number) =>{ return { text: value.name as string, value: index };}), [selectedRoles])
  62.     //ROLE MULTISELECT END
  63.  
  64.     //This exposes toggle show to parent. Without this parent cannot call toggle show with reference
  65.     useImperativeHandle(ref, () => ({
  66.       toggleShow() {
  67.         alert(JSON.stringify(selectData));
  68.         setStaticModal((value) => !value);
  69.       },
  70.     }));
  71.     function tShow() {
  72.       setStaticModal((value) => !value);
  73.     }
  74.     const onHideModal = () => {
  75.       setUpdateUserDTO(getUpdatedUserDTO(props.userDTO));
  76.  
  77.       reset({
  78.         email: props.userDTO.email,
  79.         password: "",
  80.         password_repeat: "",
  81.       });
  82.     };
  83.     //END MODAL
  84.  
  85.  
  86.  
  87.  
  88.     const {
  89.       register,
  90.       handleSubmit,
  91.       getValues,
  92.       watch,
  93.       reset,
  94.       formState: { errors },
  95.       //Default values for form
  96.     } = useForm<Inputs>({
  97.       defaultValues: {
  98.         email: props.userDTO.email,
  99.         password: "",
  100.         password_repeat: "",
  101.       },
  102.     });
  103.  
  104.     //FORM EVENTS
  105.  
  106.     const onSubmit: SubmitHandler<Inputs> = (e: any) => {
  107.       e.preventDefault();
  108.  
  109.       alert("selected roles are " + JSON.stringify(selectedRoles));
  110.       setUpdateUserDTO({
  111.         id: props.userDTO.id,
  112.         oldEmail: props.userDTO.email,
  113.         newEmail: getValues().email,
  114.  
  115.         roles: ["test"],
  116.       });
  117.  
  118.       const response = usersController
  119.         .updateUser(updateUserDTO)
  120.         .then(
  121.           (response: {
  122.             ok: any;
  123.             statusText: string | undefined;
  124.             json: () => any;
  125.           }) => {
  126.             if (!response.ok) throw new Error(response.statusText);
  127.  
  128.             setAlert("Updated user", "success");
  129.  
  130.             setStaticModal(false);
  131.             props.handleRefresh();
  132.           }
  133.         )
  134.         .catch((error: string) => {
  135.           console.log("Error updating user: " + error);
  136.           setAlert("Unable to update user", "danger");
  137.           setStaticModal(false);
  138.         });
  139.     };
  140.  
  141.     return (
  142.       <>
  143.         <MDBModal
  144.           staticBackdrop
  145.           tabIndex="-1"
  146.           show={staticModal}
  147.           setShow={setStaticModal}
  148.           onHide={onHideModal}
  149.         >
  150.           <MDBModalDialog>
  151.             <MDBModalContent className={bodyTheme}>
  152.               <MDBModalHeader>
  153.                 <MDBModalTitle>Edit User {props.userDTO.email}</MDBModalTitle>
  154.               </MDBModalHeader>
  155.  
  156.               <MDBModalBody className="text-center">
  157.                 {/* //handleSubmit" will validate your inputs before invoking "onSubmit" */}
  158.                 <form id="editUserForm" onSubmit={handleSubmit(onSubmit)}>
  159.                   <MDBRow>
  160.                     <MDBCol md="12">
  161.                       <label className={`${textTheme} form-label`}>
  162.                         Email address
  163.                       </label>
  164.                     </MDBCol>
  165.                   </MDBRow>
  166.                   <MDBRow className="mb-4">
  167.                     <MDBCol md="12">
  168.                       <input
  169.                         ///START EMAIL INPUT
  170.                         {...register("email", {
  171.                           required: true,
  172.                           minLength: 5,
  173.  
  174.                           pattern: {
  175.                             value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
  176.                             message: "invalid email address",
  177.                           },
  178.                         })}
  179.                         id="email"
  180.                         type="email"
  181.                         placeholder="yourEmail@email.com"
  182.                       />
  183.                       {errors?.email?.type === "required" && (
  184.                         <p className="text-danger">This field is required</p>
  185.                       )}
  186.                       {errors?.email && (
  187.                         <p className="text-danger">{errors.email.message}</p>
  188.                       )}
  189.                       {errors?.email?.type === "pattern" && (
  190.                         <p className="text-danger">Invalid email address</p>
  191.                       )}
  192.                     </MDBCol>
  193.                     {/* END EMAIL INPUT */}
  194.                   </MDBRow>
  195.                   <MDBRow>
  196.                     <MDBCol md="12">
  197.                       <label className={`${textTheme} form-label`}>
  198.                         Password
  199.                       </label>
  200.                     </MDBCol>
  201.                   </MDBRow>
  202.  
  203.                   <MDBRow>
  204.                     <MDBCol md="12" className="text-center">
  205.                       <MDBBtn type="submit">Submit</MDBBtn>
  206.                     </MDBCol>
  207.                   </MDBRow>
  208.                 </form>
  209.                 <MDBRow>
  210.                   <MDBCol md="12">
  211.                     <MDBSelect
  212.                       data={selectData}
  213.                       multiple
  214.                       label="Roles"
  215.                       onValueChange={(e) => {
  216.                         if (e instanceof Array){
  217.                           setSelectedRoles(e.map((r) => r.text!));
  218.                         }
  219.                         console.log(JSON.stringify(selectedRoles));
  220.                       }}
  221.                     />
  222.                   </MDBCol>
  223.                 </MDBRow>
  224.               </MDBModalBody>
  225.  
  226.               <MDBModalFooter>
  227.                 <MDBBtn color="secondary" onClick={() => tShow()}>
  228.                   Close
  229.                 </MDBBtn>
  230.               </MDBModalFooter>
  231.             </MDBModalContent>
  232.           </MDBModalDialog>
  233.         </MDBModal>
  234.       </>
  235.     );
  236.   }
  237. );
  238.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement