AppSetting.jsx 6.4 KB

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