AppSetting.jsx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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 { withUnstatedContainers } from '../../UnstatedUtils';
  6. import { toastSuccess, toastError } from '../../../util/apiNotification';
  7. import AppContainer from '../../../services/AppContainer';
  8. import AdminAppContainer from '../../../services/AdminAppContainer';
  9. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  10. const logger = loggerFactory('growi:appSettings');
  11. class AppSetting extends React.Component {
  12. constructor(props) {
  13. super(props);
  14. this.submitHandler = this.submitHandler.bind(this);
  15. }
  16. async submitHandler() {
  17. const { t, adminAppContainer } = this.props;
  18. try {
  19. await adminAppContainer.updateAppSettingHandler();
  20. toastSuccess(t('toaster.update_successed', { target: t('App Settings') }));
  21. } catch (err) {
  22. toastError(err);
  23. logger.error(err);
  24. }
  25. }
  26. render() {
  27. const { t, adminAppContainer, appContainer } = this.props;
  28. const locales = appContainer.locales;
  29. const languages = Object.keys(locales);
  30. return (
  31. <React.Fragment>
  32. <div className="form-group row">
  33. <label className="text-left text-md-right col-md-3 col-form-label">{t('admin:app_setting.site_name')}</label>
  34. <div className="col-md-6">
  35. <input
  36. className="form-control"
  37. type="text"
  38. defaultValue={adminAppContainer.state.title || ''}
  39. onChange={(e) => {
  40. adminAppContainer.changeTitle(e.target.value);
  41. }}
  42. placeholder="GROWI"
  43. />
  44. <p className="form-text text-muted">{t('admin:app_setting.sitename_change')}</p>
  45. </div>
  46. </div>
  47. <div className="row form-group mb-5">
  48. <label
  49. className="text-left text-md-right col-md-3 col-form-label">{t('admin:app_setting.confidential_name')}</label>
  50. <div className="col-md-6">
  51. <input
  52. className="form-control"
  53. type="text"
  54. defaultValue={adminAppContainer.state.confidential || ''}
  55. onChange={(e) => {
  56. adminAppContainer.changeConfidential(e.target.value);
  57. }}
  58. placeholder={t('admin:app_setting.confidential_example')}
  59. />
  60. <p className="form-text text-muted">{t('admin:app_setting.header_content')}</p>
  61. </div>
  62. </div>
  63. <div className="row form-group mb-5">
  64. <label
  65. className="text-left text-md-right col-md-3 col-form-label">{t('admin:app_setting.default_language')}</label>
  66. <div className="col-md-6">
  67. {
  68. languages.map((lan)=>(
  69. <div key={lan} className="custom-control custom-radio custom-control-inline">
  70. <input
  71. type="radio"
  72. id={'radioLang' + lan}
  73. className="custom-control-input"
  74. name="globalLang"
  75. value={lan}
  76. checked={adminAppContainer.state.globalLang === lan}
  77. onChange={(e) => {
  78. adminAppContainer.changeGlobalLang(e.target.value);
  79. }}
  80. />
  81. <label className="custom-control-label" htmlFor={'radioLang' + lan}>{locales[lan]["_conf"]["name"]}</label>
  82. </div>
  83. ))
  84. }
  85. </div>
  86. </div>
  87. <div className="row form-group mb-5">
  88. <label
  89. className="text-left text-md-right col-md-3 col-form-label">{t('admin:app_setting.file_uploading')}</label>
  90. <div className="col-md-6">
  91. <div className="custom-control custom-checkbox custom-checkbox-info">
  92. <input
  93. type="checkbox"
  94. id="cbFileUpload"
  95. className="custom-control-input"
  96. name="fileUpload"
  97. checked={adminAppContainer.state.fileUpload}
  98. onChange={(e) => {
  99. adminAppContainer.changeFileUpload(e.target.checked);
  100. }}
  101. />
  102. <label className="custom-control-label"
  103. htmlFor="cbFileUpload">{t('admin:app_setting.enable_files_except_image')}</label>
  104. </div>
  105. <p className="form-text text-muted">
  106. {t('admin:app_setting.attach_enable')}
  107. </p>
  108. </div>
  109. </div>
  110. <AdminUpdateButtonRow onClick={this.submitHandler} disabled={adminAppContainer.state.retrieveError != null}/>
  111. </React.Fragment>
  112. );
  113. }
  114. }
  115. /**
  116. * Wrapper component for using unstated
  117. */
  118. const AppSettingWrapper = withUnstatedContainers(AppSetting, [AppContainer, AdminAppContainer]);
  119. AppSetting.propTypes = {
  120. t: PropTypes.func.isRequired, // i18next
  121. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  122. adminAppContainer: PropTypes.instanceOf(AdminAppContainer).isRequired,
  123. };
  124. export default withTranslation()(AppSettingWrapper);