EditUser.jsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import React, { useEffect, useState } from 'react';
  2. import { addActiveElement, removeFocusedElement } from "../../../actions/MainNavigation/mainNavigationActions";
  3. import Password from '../../../components/ControlPanel/AddItemLayout/Form/Password/Password';
  4. import SelectInput from '../../ControlPanel/AddItemLayout/Form/SelectInput/SelectInput';
  5. import NameServers from '../../ControlPanel/AddItemLayout/Form/NameServers/NameServers';
  6. import TextInput from '../../ControlPanel/AddItemLayout/Form/TextInput/TextInput';
  7. import { updateUser, getUserInfo } from '../../../ControlPanelService/Users';
  8. import AddItemLayout from '../../ControlPanel/AddItemLayout/AddItemLayout';
  9. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  10. import Spinner from '../../../components/Spinner/Spinner';
  11. import Toolbar from '../../MainNav/Toolbar/Toolbar';
  12. import { useHistory } from 'react-router-dom';
  13. import { useDispatch, useSelector } from 'react-redux';
  14. import QS from 'qs';
  15. import './EditUser.scss';
  16. import { Helmet } from 'react-helmet';
  17. import { checkAuthHandler } from 'src/actions/Session/sessionActions';
  18. import { refreshCounters } from 'src/actions/MenuCounters/menuCounterActions';
  19. import HtmlParser from 'react-html-parser';
  20. const EditUser = props => {
  21. const token = localStorage.getItem("token");
  22. const { i18n } = useSelector(state => state.session);
  23. const history = useHistory();
  24. const dispatch = useDispatch();
  25. const [state, setState] = useState({
  26. data: {},
  27. loading: false,
  28. username: '',
  29. errorMessage: '',
  30. okMessage: ''
  31. });
  32. useEffect(() => {
  33. let queryParams = QS.parse(history.location.search, { ignoreQueryPrefix: true });
  34. const { user } = queryParams;
  35. dispatch(addActiveElement('/list/user/'));
  36. dispatch(removeFocusedElement());
  37. if (user) {
  38. setState({ ...state, loading: true });
  39. getUserInfo(user)
  40. .then(response => {
  41. setState({
  42. ...state,
  43. username: user,
  44. data: response.data, errorMessage: response.data['error_msg'], okMessage: response.data['ok_msg'],
  45. loading: false
  46. });
  47. })
  48. .catch(err => console.error(err));
  49. }
  50. }, []);
  51. const submitFormHandler = event => {
  52. event.preventDefault();
  53. let updatedUser = {};
  54. for (var [name, value] of (new FormData(event.target)).entries()) {
  55. updatedUser[name] = value;
  56. }
  57. updatedUser['v_username'] = state.username;
  58. if (Object.keys(updatedUser).length !== 0 && updatedUser.constructor === Object) {
  59. setState({ ...state, loading: true });
  60. updateUser(updatedUser, state.username)
  61. .then(result => {
  62. if (result.status === 200) {
  63. const { error_msg: errorMessage, ok_msg: okMessage } = result.data;
  64. if (errorMessage) {
  65. setState({ ...state, errorMessage, okMessage, loading: false });
  66. } else {
  67. dispatch(refreshCounters()).then(() => {
  68. setState({ ...state, okMessage, errorMessage: '', loading: false });
  69. });
  70. }
  71. }
  72. })
  73. .catch(err => console.error(err));
  74. }
  75. }
  76. const convertObjectOfObjectsToArrayOfObjects = object => {
  77. let result = [];
  78. for (let i in object) {
  79. result.push(i);
  80. }
  81. return result;
  82. }
  83. return (
  84. <div className="edit-template edit-user">
  85. <Helmet>
  86. <title>{`Vesta - ${i18n.USER}`}</title>
  87. </Helmet>
  88. <Toolbar mobile={false}>
  89. <div></div>
  90. <div className="search-toolbar-name">{i18n['Editing User']}</div>
  91. <div className="error"><span className="error-message">{state.data.errorMessage ? <FontAwesomeIcon icon="long-arrow-alt-right" /> : ''} {state.errorMessage}</span></div>
  92. <div className="success">
  93. <span className="ok-message">{state.okMessage ? <FontAwesomeIcon icon="long-arrow-alt-right" /> : ''} <span>{HtmlParser(state.okMessage)}</span> </span>
  94. </div>
  95. </Toolbar>
  96. <AddItemLayout date={state.data.date} time={state.data.time} status={state.data.status}>
  97. {state.loading ? <Spinner /> :
  98. <form onSubmit={event => submitFormHandler(event)} id="add-user">
  99. <input type="hidden" name="save" value="save" />
  100. <input type="hidden" name="token" value={token} />
  101. <TextInput id="username" name="v_user" title={i18n['Username']} value={state.username} disabled />
  102. <Password name='v_password' />
  103. <TextInput id="email" name="v_email" title={i18n['Email']} value={state.data.email} />
  104. <SelectInput
  105. options={convertObjectOfObjectsToArrayOfObjects(state.data.packages)}
  106. selected={state.data.package}
  107. name="v_package"
  108. id="packages"
  109. title={i18n['Package']} />
  110. <SelectInput
  111. options={state.data.languages}
  112. selected={state.data.language}
  113. name="v_language"
  114. id="languages"
  115. title={i18n['Language']} />
  116. <TextInput id="first-name" name="v_fname" title={i18n['First Name']} value={state.data.fname} />
  117. <TextInput id="last-name" name="v_lname" title={i18n['Last Name']} value={state.data.lname} />
  118. <SelectInput
  119. options={state.data.shells}
  120. selected={state.data.shell}
  121. name="v_shell"
  122. id="shell"
  123. title={i18n['SSH Access']} />
  124. <NameServers usersNS={state.data.nameservers} />
  125. <div className="buttons-wrapper">
  126. <button type="submit" className="add">{i18n.Save}</button>
  127. <button type="button" className="back" onClick={() => history.push('/list/user/')}>{i18n.Back}</button>
  128. </div>
  129. </form>
  130. }
  131. </AddItemLayout>
  132. </div>
  133. );
  134. }
  135. export default EditUser;