AddWebDomain.jsx 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import React, { useEffect, useState } from 'react';
  2. import { addActiveElement, removeFocusedElement } from "../../../actions/MainNavigation/mainNavigationActions";
  3. import AddItemLayout from '../../ControlPanel/AddItemLayout/AddItemLayout';
  4. import { addWeb, getWebStats } from '../../../ControlPanelService/Web';
  5. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  6. import AdvancedOptions from './AdvancedOptions/AdvancedOptions';
  7. import { getIpList } from '../../../ControlPanelService/Ip';
  8. import Toolbar from '../../MainNav/Toolbar/Toolbar';
  9. import { useHistory } from 'react-router-dom';
  10. import Spinner from '../../Spinner/Spinner';
  11. import { useDispatch, useSelector } from 'react-redux';
  12. import './AddWebDomain.scss';
  13. import { Helmet } from 'react-helmet';
  14. import { refreshCounters } from 'src/actions/MenuCounters/menuCounterActions';
  15. import HtmlParser from 'react-html-parser';
  16. const AddWebDomain = props => {
  17. const { i18n } = useSelector(state => state.session);
  18. const dispatch = useDispatch();
  19. const token = localStorage.getItem("token");
  20. const history = useHistory();
  21. const [state, setState] = useState({
  22. loading: false,
  23. dnsSupport: true,
  24. mailSupport: true,
  25. showAdvancedOptions: false,
  26. okMessage: '',
  27. domain: '',
  28. errorMessage: '',
  29. webStats: [],
  30. prefixI18N: '',
  31. internetProtocols: []
  32. });
  33. useEffect(() => {
  34. dispatch(addActiveElement('/list/web/'));
  35. dispatch(removeFocusedElement());
  36. setState({ ...state, loading: true });
  37. Promise.all([getWebStats(), getIpList()])
  38. .then(result => {
  39. const [webStats, internetProtocols] = result;
  40. let internetProtocolNames = getInternetProtocolNames(internetProtocols.data.data);
  41. setState({
  42. ...state,
  43. webStats: webStats.data.data,
  44. internetProtocols: internetProtocolNames,
  45. prefixI18N: webStats.data.prefixI18N,
  46. loading: false
  47. });
  48. });
  49. }, []);
  50. const getInternetProtocolNames = internetProtocols => {
  51. let result = [];
  52. for (let i in internetProtocols) {
  53. result.push(i);
  54. }
  55. return result;
  56. }
  57. const renderInternetProtocolsOptions = () => {
  58. return state.internetProtocols.map(ip => <option value={ip}>{ip}</option>);
  59. }
  60. const showAdvancedOption = () => {
  61. setState({ ...state, showAdvancedOptions: !state.showAdvancedOptions });
  62. }
  63. const renderAdvancedOptions = () => {
  64. if (state.showAdvancedOptions) {
  65. return <AdvancedOptions prefixI18N={state.prefixI18N} domain={state.domain} webStats={state.webStats} />;
  66. }
  67. }
  68. const onBlurChangeAliases = value => {
  69. setState({ ...state, domain: value });
  70. }
  71. const submitFormHandler = event => {
  72. event.preventDefault();
  73. let newWebDomain = {};
  74. for (var [name, value] of (new FormData(event.target)).entries()) {
  75. newWebDomain[name] = value;
  76. }
  77. if (Object.keys(newWebDomain).length !== 0 && newWebDomain.constructor === Object) {
  78. setState({ loading: true });
  79. addWeb(newWebDomain)
  80. .then(result => {
  81. if (result.status === 200) {
  82. const { error_msg: errorMessage, ok_msg: okMessage } = result.data;
  83. if (errorMessage) {
  84. setState({ ...state, errorMessage, okMessage, loading: false });
  85. } else {
  86. dispatch(refreshCounters()).then(() => {
  87. setState({ ...state, okMessage, errorMessage: '', loading: false });
  88. });
  89. }
  90. }
  91. })
  92. .catch(err => console.error(err));
  93. }
  94. }
  95. return (
  96. <div className="edit-template add-web">
  97. <Helmet>
  98. <title>{`Vesta - ${i18n.WEB}`}</title>
  99. </Helmet>
  100. <Toolbar mobile={false}>
  101. <div></div>
  102. <div className="search-toolbar-name">{i18n['Adding Domain']}</div>
  103. <div className="error">
  104. <span className="error-message">
  105. {state.errorMessage ? <FontAwesomeIcon icon="long-arrow-alt-right" /> : ''}
  106. {state.errorMessage}</span>
  107. </div>
  108. <div className="success">
  109. <span className="ok-message">
  110. {state.okMessage ? <FontAwesomeIcon icon="long-arrow-alt-right" /> : ''}
  111. <span>{HtmlParser(state.okMessage)}</span>
  112. </span>
  113. </div>
  114. </Toolbar>
  115. <AddItemLayout>
  116. {state.loading ? <Spinner /> : (
  117. <form onSubmit={event => submitFormHandler(event)}>
  118. <input type="hidden" name="ok" value="add" />
  119. <input type="hidden" name="token" value={token} />
  120. <div className="form-group">
  121. <label htmlFor="domain">{i18n.Domain}</label>
  122. <input
  123. type="text"
  124. className="form-control"
  125. id="domain"
  126. required
  127. name="v_domain"
  128. onBlur={event => onBlurChangeAliases(event.target.value)} />
  129. </div>
  130. <div class="form-group">
  131. <label htmlFor="package">{i18n['IP Address']}</label>
  132. <select class="form-control" id="ip" name="v_ip">
  133. {renderInternetProtocolsOptions()}
  134. </select>
  135. </div>
  136. <div className="form-group">
  137. <div className="checkbox-wrapper">
  138. <input type="checkbox" name="v_dns" id="dns-support" checked={state.dnsSupport} />
  139. <label htmlFor="dns-support">{i18n['DNS Support']}</label>
  140. </div>
  141. </div>
  142. <div className="form-group">
  143. <div className="checkbox-wrapper">
  144. <input type="checkbox" name="v_mail" id="mail-support" checked={state.mailSupport} />
  145. <label htmlFor="mail-support">{i18n['Mail Support']}</label>
  146. </div>
  147. </div>
  148. <div className="form-group advanced-options-button">
  149. <button type="button" onClick={() => showAdvancedOption()}>
  150. {i18n['Advanced options']}
  151. {state.showAdvancedOptions ? <FontAwesomeIcon icon="caret-down" /> : <FontAwesomeIcon icon="caret-up" />}
  152. </button>
  153. </div>
  154. {renderAdvancedOptions()}
  155. <div className="buttons-wrapper">
  156. <button type="submit" className="add">{i18n.Add}</button>
  157. <button type="button" className="back" onClick={() => history.push('/list/web/')}>{i18n.Back}</button>
  158. </div>
  159. </form>
  160. )}
  161. </AddItemLayout>
  162. </div>
  163. );
  164. }
  165. export default AddWebDomain;