AppSetting.jsx 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import React, { useCallback } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { useTranslation } from 'react-i18next';
  4. import AdminAppContainer from '~/client/services/AdminAppContainer';
  5. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  6. import { localeMetadatas } from '~/client/util/i18n';
  7. import loggerFactory from '~/utils/logger';
  8. import { withUnstatedContainers } from '../../UnstatedUtils';
  9. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  10. const logger = loggerFactory('growi:appSettings');
  11. const AppSetting = (props) => {
  12. const { adminAppContainer } = props;
  13. const { t } = useTranslation();
  14. const submitHandler = useCallback(async() => {
  15. try {
  16. await adminAppContainer.updateAppSettingHandler();
  17. toastSuccess(t('toaster.update_successed', { target: t('App Settings') }));
  18. }
  19. catch (err) {
  20. toastError(err);
  21. logger.error(err);
  22. }
  23. }, [adminAppContainer, t]);
  24. return (
  25. <React.Fragment>
  26. <div className="form-group row">
  27. <label className="text-left text-md-right col-md-3 col-form-label">{t('admin:app_setting.site_name')}</label>
  28. <div className="col-md-6">
  29. <input
  30. className="form-control"
  31. type="text"
  32. defaultValue={adminAppContainer.state.title || ''}
  33. onChange={(e) => {
  34. adminAppContainer.changeTitle(e.target.value);
  35. }}
  36. placeholder="GROWI"
  37. />
  38. <p className="form-text text-muted">{t('admin:app_setting.sitename_change')}</p>
  39. </div>
  40. </div>
  41. <div className="row form-group mb-5">
  42. <label
  43. className="text-left text-md-right col-md-3 col-form-label"
  44. >
  45. {t('admin:app_setting.confidential_name')}
  46. </label>
  47. <div className="col-md-6">
  48. <input
  49. className="form-control"
  50. type="text"
  51. defaultValue={adminAppContainer.state.confidential || ''}
  52. onChange={(e) => {
  53. adminAppContainer.changeConfidential(e.target.value);
  54. }}
  55. placeholder={t('admin:app_setting.confidential_example')}
  56. />
  57. <p className="form-text text-muted">{t('admin:app_setting.header_content')}</p>
  58. </div>
  59. </div>
  60. <div className="row form-group mb-5">
  61. <label
  62. className="text-left text-md-right col-md-3 col-form-label"
  63. >
  64. {t('admin:app_setting.default_language')}
  65. </label>
  66. <div className="col-md-6 py-2">
  67. {
  68. localeMetadatas.map(meta => (
  69. <div key={meta.id} className="custom-control custom-radio custom-control-inline">
  70. <input
  71. type="radio"
  72. id={`radioLang${meta.id}`}
  73. className="custom-control-input"
  74. name="globalLang"
  75. value={meta.id}
  76. checked={adminAppContainer.state.globalLang === meta.id}
  77. onChange={(e) => {
  78. adminAppContainer.changeGlobalLang(e.target.value);
  79. }}
  80. />
  81. <label className="custom-control-label" htmlFor={`radioLang${meta.id}`}>{meta.displayName}</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"
  90. >
  91. {t('admin:app_setting.default_mail_visibility')}
  92. </label>
  93. <div className="col-md-6 py-2">
  94. <div className="custom-control custom-radio custom-control-inline">
  95. <input
  96. type="radio"
  97. id="radio-email-show"
  98. className="custom-control-input"
  99. name="mailVisibility"
  100. checked={adminAppContainer.state.isEmailPublishedForNewUser === true}
  101. onChange={() => { adminAppContainer.changeIsEmailPublishedForNewUserShow(true) }}
  102. />
  103. <label className="custom-control-label" htmlFor="radio-email-show">{t('Show')}</label>
  104. </div>
  105. <div className="custom-control custom-radio custom-control-inline">
  106. <input
  107. type="radio"
  108. id="radio-email-hide"
  109. className="custom-control-input"
  110. name="mailVisibility"
  111. checked={adminAppContainer.state.isEmailPublishedForNewUser === false}
  112. onChange={() => { adminAppContainer.changeIsEmailPublishedForNewUserShow(false) }}
  113. />
  114. <label className="custom-control-label" htmlFor="radio-email-hide">{t('Hide')}</label>
  115. </div>
  116. </div>
  117. </div>
  118. <div className="row form-group mb-5">
  119. <label
  120. className="text-left text-md-right col-md-3 col-form-label"
  121. >
  122. {/* {t('admin:app_setting.file_uploading')} */}
  123. </label>
  124. <div className="col-md-6">
  125. <div className="custom-control custom-checkbox custom-checkbox-info">
  126. <input
  127. type="checkbox"
  128. id="cbFileUpload"
  129. className="custom-control-input"
  130. name="fileUpload"
  131. checked={adminAppContainer.state.fileUpload}
  132. onChange={(e) => {
  133. adminAppContainer.changeFileUpload(e.target.checked);
  134. }}
  135. />
  136. <label
  137. className="custom-control-label"
  138. htmlFor="cbFileUpload"
  139. >
  140. {t('admin:app_setting.enable_files_except_image')}
  141. </label>
  142. </div>
  143. <p className="form-text text-muted">
  144. {t('admin:app_setting.attach_enable')}
  145. </p>
  146. </div>
  147. </div>
  148. <AdminUpdateButtonRow onClick={submitHandler} disabled={adminAppContainer.state.retrieveError != null} />
  149. </React.Fragment>
  150. );
  151. };
  152. /**
  153. * Wrapper component for using unstated
  154. */
  155. const AppSettingWrapper = withUnstatedContainers(AppSetting, [AdminAppContainer]);
  156. AppSetting.propTypes = {
  157. adminAppContainer: PropTypes.instanceOf(AdminAppContainer).isRequired,
  158. };
  159. export default AppSettingWrapper;