ImportDataPageContents.jsx 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. import React, { useEffect } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. import AdminImportContainer from '~/client/services/AdminImportContainer';
  5. import { toastError } from '~/client/util/toastr';
  6. import { toArrayIfNot } from '~/utils/array-utils';
  7. import loggerFactory from '~/utils/logger';
  8. import { withUnstatedContainers } from '../../UnstatedUtils';
  9. import GrowiArchiveSection from './GrowiArchiveSection';
  10. const logger = loggerFactory('growi:importer');
  11. class ImportDataPageContents extends React.Component {
  12. render() {
  13. const { t, adminImportContainer } = this.props;
  14. return (
  15. <div data-testid="admin-import-data">
  16. <GrowiArchiveSection />
  17. <form
  18. className="mt-5"
  19. id="importerSettingFormEsa"
  20. role="form"
  21. >
  22. <fieldset>
  23. <h2 className="admin-setting-header">{t('importer_management.import_from', { from: 'esa.io' })}</h2>
  24. <table className="table table-bordered table-mapping">
  25. <thead>
  26. <tr>
  27. <th width="45%">esa.io</th>
  28. <th width="10%"></th>
  29. <th>GROWI</th>
  30. </tr>
  31. </thead>
  32. <tbody>
  33. <tr>
  34. <th>{t('importer_management.article')}</th>
  35. <th><i className="icon-arrow-right-circle text-success"></i></th>
  36. <th>{t('importer_management.page')}</th>
  37. </tr>
  38. <tr>
  39. <th>{t('importer_management.category')}</th>
  40. <th><i className="icon-arrow-right-circle text-success"></i></th>
  41. <th>{t('importer_management.page_path')}</th>
  42. </tr>
  43. <tr>
  44. <th>{t('User')}</th>
  45. <th></th>
  46. <th>(TBD)</th>
  47. </tr>
  48. </tbody>
  49. </table>
  50. <div className="card custom-card mb-0 small">
  51. <ul>
  52. <li>{t('importer_management.page_skip')}</li>
  53. </ul>
  54. </div>
  55. <div className="row">
  56. <input type="password" name="dummypass" style={{ display: 'none', top: '-100px', left: '-100px' }} />
  57. </div>
  58. <div className="row">
  59. <label htmlFor="settingForm[importer:esa:team_name]" className="text-start text-md-end col-md-3 col-form-label">
  60. {t('importer_management.esa_settings.team_name')}
  61. </label>
  62. <div className="col-md-6">
  63. <input
  64. className="form-control"
  65. type="text"
  66. name="esaTeamName"
  67. value={adminImportContainer.state.esaTeamName || ''}
  68. onChange={adminImportContainer.handleInputValue}
  69. />
  70. </div>
  71. </div>
  72. <div className="row">
  73. <label htmlFor="settingForm[importer:esa:access_token]" className="text-start text-md-end col-md-3 col-form-label">
  74. {t('importer_management.esa_settings.access_token')}
  75. </label>
  76. <div className="col-md-6">
  77. <input
  78. className="form-control"
  79. type="password"
  80. name="esaAccessToken"
  81. value={adminImportContainer.state.esaAccessToken || ''}
  82. onChange={adminImportContainer.handleInputValue}
  83. />
  84. </div>
  85. </div>
  86. <div className="row">
  87. <div className="offset-md-3 col-md-6">
  88. <input
  89. id="testConnectionToEsa"
  90. type="button"
  91. className="btn btn-primary btn-esa"
  92. name="Esa"
  93. onClick={adminImportContainer.esaHandleSubmit}
  94. value={t('importer_management.import')}
  95. />
  96. <input type="button" className="btn btn-secondary" onClick={adminImportContainer.esaHandleSubmitUpdate} value={t('Update')} />
  97. <span className="offset-0 offset-sm-1">
  98. <input
  99. id="importFromEsa"
  100. type="button"
  101. name="Esa"
  102. className="btn btn-secondary btn-esa"
  103. onClick={adminImportContainer.esaHandleSubmitTest}
  104. value={t('importer_management.esa_settings.test_connection')}
  105. />
  106. </span>
  107. </div>
  108. </div>
  109. </fieldset>
  110. </form>
  111. <form
  112. className="mt-5"
  113. id="importerSettingFormQiita"
  114. role="form"
  115. >
  116. <fieldset>
  117. <h2 className="admin-setting-header">{t('importer_management.import_from', { from: 'Qiita:Team' })}</h2>
  118. <table className="table table-bordered table-mapping">
  119. <thead>
  120. <tr>
  121. <th width="45%">Qiita:Team</th>
  122. <th width="10%"></th>
  123. <th>GROWI</th>
  124. </tr>
  125. </thead>
  126. <tbody>
  127. <tr>
  128. <th>{t('importer_management.article')}</th>
  129. <th><i className="icon-arrow-right-circle text-success"></i></th>
  130. <th>{t('importer_management.page')}</th>
  131. </tr>
  132. <tr>
  133. <th>{t('importer_management.tag')}</th>
  134. <th></th>
  135. <th>-</th>
  136. </tr>
  137. <tr>
  138. <th>{t('importer_management.Directory_hierarchy_tag')}</th>
  139. <th></th>
  140. <th>(TBD)</th>
  141. </tr>
  142. <tr>
  143. <th>{t('User')}</th>
  144. <th></th>
  145. <th>(TBD)</th>
  146. </tr>
  147. </tbody>
  148. </table>
  149. <div className="card custom-card mb-0 small">
  150. <ul>
  151. <li>{t('importer_management.page_skip')}</li>
  152. </ul>
  153. </div>
  154. <div className="row">
  155. <input type="password" name="dummypass" style={{ display: 'none', top: '-100px', left: '-100px' }} />
  156. </div>
  157. <div className="row">
  158. <label htmlFor="settingForm[importer:qiita:team_name]" className="text-start text-md-end col-md-3 col-form-label">
  159. {t('importer_management.qiita_settings.team_name')}
  160. </label>
  161. <div className="col-md-6">
  162. <input
  163. className="form-control"
  164. type="text"
  165. name="qiitaTeamName"
  166. value={adminImportContainer.state.qiitaTeamName || ''}
  167. onChange={adminImportContainer.handleInputValue}
  168. />
  169. </div>
  170. </div>
  171. <div className="row">
  172. <label htmlFor="settingForm[importer:qiita:access_token]" className="text-start text-md-end col-md-3 col-form-label">
  173. {t('importer_management.qiita_settings.access_token')}
  174. </label>
  175. <div className="col-md-6">
  176. <input
  177. className="form-control"
  178. type="password"
  179. name="qiitaAccessToken"
  180. value={adminImportContainer.state.qiitaAccessToken || ''}
  181. onChange={adminImportContainer.handleInputValue}
  182. />
  183. </div>
  184. </div>
  185. <div className="row">
  186. <div className="offset-md-3 col-md-6">
  187. <input
  188. id="testConnectionToQiita"
  189. type="button"
  190. className="btn btn-primary btn-qiita"
  191. name="Qiita"
  192. onClick={adminImportContainer.qiitaHandleSubmit}
  193. value={t('importer_management.import')}
  194. />
  195. <input type="button" className="btn btn-secondary" onClick={adminImportContainer.qiitaHandleSubmitUpdate} value={t('Update')} />
  196. <span className="offset-0 offset-sm-1">
  197. <input
  198. name="Qiita"
  199. type="button"
  200. id="importFromQiita"
  201. className="btn btn-secondary btn-qiita"
  202. onClick={adminImportContainer.qiitaHandleSubmitTest}
  203. value={t('importer_management.qiita_settings.test_connection')}
  204. />
  205. </span>
  206. </div>
  207. </div>
  208. </fieldset>
  209. </form>
  210. </div>
  211. );
  212. }
  213. }
  214. ImportDataPageContents.propTypes = {
  215. t: PropTypes.func.isRequired, // i18next
  216. adminImportContainer: PropTypes.instanceOf(AdminImportContainer).isRequired,
  217. };
  218. const ImportDataPageContentsWrapperFc = (props) => {
  219. const { t } = useTranslation('admin');
  220. const { adminImportContainer } = props;
  221. useEffect(() => {
  222. const fetchImportSettingsData = async() => {
  223. await adminImportContainer.retrieveImportSettingsData();
  224. };
  225. try {
  226. fetchImportSettingsData();
  227. }
  228. catch (err) {
  229. const errs = toArrayIfNot(err);
  230. toastError(errs);
  231. logger.error(errs);
  232. }
  233. }, [adminImportContainer]);
  234. return <ImportDataPageContents t={t} {...props} />;
  235. };
  236. /**
  237. * Wrapper component for using unstated
  238. */
  239. const ImportDataPageContentsWrapper = withUnstatedContainers(ImportDataPageContentsWrapperFc, [AdminImportContainer]);
  240. export default ImportDataPageContentsWrapper;