Bind9.jsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import React, { useEffect, useState } from 'react';
  2. import { addActiveElement, removeFocusedElement } from "../../../../actions/MainNavigation/mainNavigationActions";
  3. import Checkbox from '../../../ControlPanel/AddItemLayout/Form/Checkbox/Checkbox';
  4. import TextArea from '../../../ControlPanel/AddItemLayout/Form/TextArea/TextArea';
  5. import AddItemLayout from '../../../ControlPanel/AddItemLayout/AddItemLayout';
  6. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  7. import { getServiceInfo, updateService } from 'src/ControlPanelService/Server';
  8. import Spinner from '../../../../components/Spinner/Spinner';
  9. import Toolbar from '../../../MainNav/Toolbar/Toolbar';
  10. import { useHistory } from 'react-router-dom';
  11. import { useDispatch, useSelector } from 'react-redux';
  12. import './Bind9.scss';
  13. import { Helmet } from 'react-helmet';
  14. import HtmlParser from 'react-html-parser';
  15. const Bind9 = () => {
  16. const token = localStorage.getItem("token");
  17. const { i18n } = useSelector(state => state.session);
  18. const history = useHistory();
  19. const dispatch = useDispatch();
  20. const [state, setState] = useState({
  21. data: {},
  22. loading: false,
  23. errorMessage: '',
  24. okMessage: ''
  25. });
  26. useEffect(() => {
  27. dispatch(addActiveElement('/list/server/'));
  28. dispatch(removeFocusedElement());
  29. setState({ ...state, loading: true });
  30. getServiceInfo('bind9')
  31. .then(response => {
  32. if (response.data.config.includes('Error')) {
  33. history.push('/list/server');
  34. }
  35. setState({
  36. ...state,
  37. data: response.data,
  38. errorMessage: response.data['error_msg'],
  39. okMessage: response.data['ok_msg'],
  40. loading: false
  41. });
  42. })
  43. .catch(err => console.error(err));
  44. }, []);
  45. const submitFormHandler = event => {
  46. event.preventDefault();
  47. let updatedService = {};
  48. for (var [name, value] of (new FormData(event.target)).entries()) {
  49. updatedService[name] = value;
  50. }
  51. if (Object.keys(updatedService).length !== 0 && updatedService.constructor === Object) {
  52. setState({ ...state, loading: true });
  53. updateService(updatedService, '/bind9')
  54. .then(result => {
  55. if (result.status === 200) {
  56. const { error_msg, ok_msg } = result.data;
  57. if (error_msg) {
  58. setState({ ...state, errorMessage: error_msg, okMessage: '', loading: false });
  59. } else if (ok_msg) {
  60. setState({ ...state, errorMessage: '', okMessage: ok_msg, loading: false });
  61. } else {
  62. setState({ ...state, loading: false });
  63. }
  64. }
  65. })
  66. .catch(err => console.error(err));
  67. }
  68. }
  69. return (
  70. <div className="edit-template edit-bind9">
  71. <Helmet>
  72. <title>{`Vesta - ${i18n.SERVER}`}</title>
  73. </Helmet>
  74. <Toolbar mobile={false}>
  75. <div></div>
  76. <div className="search-toolbar-name">
  77. {i18n['Configuring Server']} / {state.data.service_name}
  78. </div>
  79. <div className="error">
  80. <span className="error-message">
  81. {state.data.errorMessage ? <FontAwesomeIcon icon="long-arrow-alt-right" /> : ''} {state.errorMessage}
  82. </span>
  83. </div>
  84. <div className="success">
  85. <span className="ok-message">
  86. {state.okMessage ? <FontAwesomeIcon icon="long-arrow-alt-right" /> : ''} <span>{HtmlParser(state.okMessage)}</span>
  87. </span>
  88. </div>
  89. </Toolbar>
  90. <AddItemLayout>
  91. {state.loading ? <Spinner /> :
  92. <form onSubmit={event => submitFormHandler(event)} id="edit-bind9">
  93. <input type="hidden" name="save" value="save" />
  94. <input type="hidden" name="token" value={token} />
  95. <TextArea
  96. defaultValue={state.data.options}
  97. title={state.data.options_path}
  98. name="v_options"
  99. id="v_options"
  100. rows="10" />
  101. <br />
  102. <TextArea
  103. defaultValue={state.data.config}
  104. title={state.data.config_path}
  105. name="v_config"
  106. id="v_config"
  107. rows="10" />
  108. <br />
  109. <Checkbox
  110. title={i18n['restart']}
  111. defaultChecked={true}
  112. name="v_restart"
  113. id="restart" />
  114. <div className="buttons-wrapper">
  115. <button type="submit" className="add">{i18n.Save}</button>
  116. <button type="button" className="back" onClick={() => history.push('/list/server/')}>{i18n.Back}</button>
  117. </div>
  118. </form>
  119. }
  120. </AddItemLayout>
  121. </div >
  122. );
  123. }
  124. export default Bind9;