2
0

AppSetting.jsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import loggerFactory from '@alias/logger';
  5. import { createSubscribedElement } from '../../UnstatedUtils';
  6. import { toastSuccess, toastError } from '../../../util/apiNotification';
  7. import AppContainer from '../../../services/AppContainer';
  8. const logger = loggerFactory('growi:appSettings');
  9. class AppSetting extends React.Component {
  10. constructor(props) {
  11. super(props);
  12. this.state = {
  13. title: '',
  14. confidential: '',
  15. globalLang: 'en-US',
  16. fileUpload: false,
  17. };
  18. this.submitHandler = this.submitHandler.bind(this);
  19. this.inputTitleChangeHandler = this.inputTitleChangeHandler.bind(this);
  20. this.inputConfidentialChangeHandler = this.inputConfidentialChangeHandler.bind(this);
  21. this.inputGlobalLangChangeHandler = this.inputGlobalLangChangeHandler.bind(this);
  22. this.inputFileUploadChangeHandler = this.inputFileUploadChangeHandler.bind(this);
  23. }
  24. async componentDidMount() {
  25. try {
  26. const response = await this.props.appContainer.apiv3.get('/app-settings/app-setting');
  27. const appSettingParams = response.data.appSettingParams;
  28. this.setState({
  29. title: appSettingParams.title || '',
  30. confidential: appSettingParams.confidential || '',
  31. globalLang: appSettingParams.globalLang || 'en-US',
  32. fileUpload: appSettingParams.fileUpload || false,
  33. });
  34. }
  35. catch (err) {
  36. toastError(err);
  37. logger.error(err);
  38. }
  39. }
  40. async submitHandler() {
  41. const { t } = this.props;
  42. const params = {
  43. title: this.state.title,
  44. confidential: this.state.confidential,
  45. globalLang: this.state.globalLang,
  46. fileUpload: this.state.fileUpload,
  47. };
  48. try {
  49. await this.props.appContainer.apiv3.put('/app-settings/app-setting', params);
  50. toastSuccess(t('Updated app setting'));
  51. }
  52. catch (err) {
  53. toastError(err);
  54. logger.error(err);
  55. }
  56. }
  57. inputTitleChangeHandler(event) {
  58. this.setState({ title: event.target.value });
  59. }
  60. inputConfidentialChangeHandler(event) {
  61. this.setState({ confidential: event.target.value });
  62. }
  63. inputGlobalLangChangeHandler(event) {
  64. this.setState({ globalLang: event.target.value });
  65. }
  66. inputFileUploadChangeHandler(event) {
  67. this.setState({ fileUpload: event.target.checked });
  68. }
  69. render() {
  70. const { t } = this.props;
  71. return (
  72. <React.Fragment>
  73. <div className="row">
  74. <div className="col-md-12">
  75. <div className="form-group">
  76. <label className="col-xs-3 control-label">{t('app_setting.Site Name')}</label>
  77. <div className="col-xs-6">
  78. <input
  79. className="form-control"
  80. id="settingForm[app:title]"
  81. type="text"
  82. name="title"
  83. value={this.state.title}
  84. onChange={this.inputTitleChangeHandler}
  85. placeholder="GROWI"
  86. />
  87. <p className="help-block">{t('app_setting.sitename_change')}</p>
  88. </div>
  89. </div>
  90. </div>
  91. </div>
  92. <div className="row">
  93. <div className="col-md-12">
  94. <div className="form-group">
  95. <label className="col-xs-3 control-label">{t('app_setting.Confidential name')}</label>
  96. <div className="col-xs-6">
  97. <input
  98. className="form-control"
  99. id="settingForm[app:confidential]"
  100. type="text"
  101. name="confidential"
  102. value={this.state.confidential}
  103. onChange={this.inputConfidentialChangeHandler}
  104. placeholder={t('app_setting.ex) internal use only')}
  105. />
  106. <p className="help-block">{t('app_setting.header_content')}</p>
  107. </div>
  108. </div>
  109. </div>
  110. </div>
  111. <div className="form-group">
  112. <label className="col-xs-3 control-label">{t('app_setting.Default Language for new users')}</label>
  113. <div className="col-xs-6">
  114. <div className="radio radio-primary radio-inline">
  115. <input
  116. type="radio"
  117. id="radioLangEn"
  118. name="globalLang"
  119. value="en-US"
  120. checked={this.state.globalLang === 'en-US'}
  121. onClick={this.inputGlobalLangChangeHandler}
  122. />
  123. <label>{t('English')}</label>
  124. </div>
  125. <div className="radio radio-primary radio-inline">
  126. <input
  127. type="radio"
  128. id="radioLangJa"
  129. name="globalLang"
  130. value="ja"
  131. checked={this.state.globalLang === 'ja'}
  132. onClick={this.inputGlobalLangChangeHandler}
  133. />
  134. <label>{t('Japanese')}</label>
  135. </div>
  136. </div>
  137. </div>
  138. <div className="row">
  139. <div className="col-md-12">
  140. <div className="form-group">
  141. <label className="col-xs-3 control-label">{t('app_setting.File Uploading')}</label>
  142. <div className="col-xs-6">
  143. <div className="checkbox checkbox-info">
  144. <input
  145. type="checkbox"
  146. id="cbFileUpload"
  147. name="fileUpload"
  148. checked={this.state.fileUpload}
  149. onChange={this.inputFileUploadChangeHandler}
  150. />
  151. <label>{t('app_setting.enable_files_except_image')}</label>
  152. </div>
  153. <p className="help-block">
  154. {t('app_setting.enable_files_except_image')}
  155. <br />
  156. {t('app_setting.attach_enable')}
  157. </p>
  158. </div>
  159. </div>
  160. </div>
  161. </div>
  162. <div className="row">
  163. <div className="col-md-12">
  164. <div className="form-group">
  165. <div className="col-xs-offset-3 col-xs-6">
  166. <button type="submit" className="btn btn-primary" onClick={this.submitHandler}>
  167. {t('app_setting.Update')}
  168. </button>
  169. </div>
  170. </div>
  171. </div>
  172. </div>
  173. </React.Fragment>
  174. );
  175. }
  176. }
  177. /**
  178. * Wrapper component for using unstated
  179. */
  180. const AppSettingWrapper = (props) => {
  181. return createSubscribedElement(AppSetting, props, [AppContainer]);
  182. };
  183. AppSetting.propTypes = {
  184. t: PropTypes.func.isRequired, // i18next
  185. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  186. };
  187. export default withTranslation()(AppSettingWrapper);