ImportDataPage.jsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. import React, { Fragment } from 'react';
  2. import { withTranslation } from 'react-i18next';
  3. import PropTypes from 'prop-types';
  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 GrowiArchiveSection from './ImportData/GrowiArchiveSection';
  9. const logger = loggerFactory('growi:importer');
  10. class ImportDataPage extends React.Component {
  11. constructor(props) {
  12. super(props);
  13. this.state = {
  14. esaTeamName: '',
  15. esaAccessToken: '',
  16. qiitaTeamName: '',
  17. qiitaAccessToken: '',
  18. };
  19. this.esaHandleSubmit = this.esaHandleSubmit.bind(this);
  20. this.esaHandleSubmitTest = this.esaHandleSubmitTest.bind(this);
  21. this.esaHandleSubmitUpdate = this.esaHandleSubmitUpdate.bind(this);
  22. this.qiitaHandleSubmit = this.qiitaHandleSubmit.bind(this);
  23. this.qiitaHandleSubmitTest = this.qiitaHandleSubmitTest.bind(this);
  24. this.qiitaHandleSubmitUpdate = this.qiitaHandleSubmitUpdate.bind(this);
  25. this.handleInputValue = this.handleInputValue.bind(this);
  26. }
  27. handleInputValue(event) {
  28. this.setState({
  29. [event.target.name]: event.target.value,
  30. });
  31. }
  32. async esaHandleSubmit() {
  33. try {
  34. const params = {
  35. 'importer:esa:team_name': this.state.esaTeamName,
  36. 'importer:esa:access_token': this.state.esaAccessToken,
  37. };
  38. await this.props.appContainer.apiPost('/admin/import/esa', params);
  39. toastSuccess('Import posts from esa success.');
  40. }
  41. catch (err) {
  42. logger.error(err);
  43. toastError(err, 'Error occurred in importing pages from esa.io');
  44. }
  45. }
  46. async esaHandleSubmitTest() {
  47. try {
  48. const params = {
  49. 'importer:esa:team_name': this.state.esaTeamName,
  50. 'importer:esa:access_token': this.state.esaAccessToken,
  51. };
  52. await this.props.appContainer.apiPost('/admin/import/testEsaAPI', params);
  53. toastSuccess('Test connection to esa success.');
  54. }
  55. catch (error) {
  56. toastError(error, 'Test connection to esa failed.');
  57. }
  58. }
  59. async esaHandleSubmitUpdate() {
  60. const params = {
  61. 'importer:esa:team_name': this.state.esaTeamName,
  62. 'importer:esa:access_token': this.state.esaAccessToken,
  63. };
  64. try {
  65. await this.props.appContainer.apiPost('/admin/settings/importerEsa', params);
  66. toastSuccess('Updated');
  67. }
  68. catch (err) {
  69. logger.error(err);
  70. toastError(err, 'Errors');
  71. }
  72. }
  73. async qiitaHandleSubmit() {
  74. try {
  75. const params = {
  76. 'importer:qiita:team_name': this.state.qiitaTeamName,
  77. 'importer:qiita:access_token': this.state.qiitaAccessToken,
  78. };
  79. await this.props.appContainer.apiPost('/admin/import/qiita', params);
  80. toastSuccess('Import posts from qiita:team success.');
  81. }
  82. catch (err) {
  83. logger.error(err);
  84. toastError(err, 'Error occurred in importing pages from qiita:team');
  85. }
  86. }
  87. async qiitaHandleSubmitTest() {
  88. try {
  89. const params = {
  90. 'importer:qiita:team_name': this.state.qiitaTeamName,
  91. 'importer:qiita:access_token': this.state.qiitaAccessToken,
  92. };
  93. await this.props.appContainer.apiPost('/admin/import/testQiitaAPI', params);
  94. toastSuccess('Test connection to qiita:team success.');
  95. }
  96. catch (err) {
  97. logger.error(err);
  98. toastError(err, 'Test connection to qiita:team failed.');
  99. }
  100. }
  101. async qiitaHandleSubmitUpdate() {
  102. const params = {
  103. 'importer:qiita:team_name': this.state.qiitaTeamName,
  104. 'importer:qiita:access_token': this.state.qiitaAccessToken,
  105. };
  106. try {
  107. await this.props.appContainer.apiPost('/admin/settings/importerQiita', params);
  108. toastSuccess('Updated');
  109. }
  110. catch (err) {
  111. logger.error(err);
  112. toastError(err, 'Errors');
  113. }
  114. }
  115. render() {
  116. const {
  117. esaTeamName, esaAccessToken, qiitaTeamName, qiitaAccessToken,
  118. } = this.state;
  119. const { t } = this.props;
  120. return (
  121. <Fragment>
  122. <GrowiArchiveSection />
  123. <form
  124. className="mt-5"
  125. id="importerSettingFormEsa"
  126. role="form"
  127. >
  128. <fieldset>
  129. <h2 className="admin-setting-header">{t('admin:importer_management.import_from', { from: 'esa.io' })}</h2>
  130. <table className="table table-bordered table-mapping">
  131. <thead>
  132. <tr>
  133. <th width="45%">esa.io</th>
  134. <th width="10%"></th>
  135. <th>GROWI</th>
  136. </tr>
  137. </thead>
  138. <tbody>
  139. <tr>
  140. <th>{t('Article')}</th>
  141. <th><i className="icon-arrow-right-circle text-success"></i></th>
  142. <th>{t('Page')}</th>
  143. </tr>
  144. <tr>
  145. <th>{t('Category')}</th>
  146. <th><i className="icon-arrow-right-circle text-success"></i></th>
  147. <th>{t('Page Path')}</th>
  148. </tr>
  149. <tr>
  150. <th>{t('User')}</th>
  151. <th></th>
  152. <th>(TBD)</th>
  153. </tr>
  154. </tbody>
  155. </table>
  156. <div className="card well mb-0 small">
  157. <ul>
  158. <li>{t('admin:importer_management.page_skip')}</li>
  159. </ul>
  160. </div>
  161. <div className="form-group row">
  162. <input type="password" name="dummypass" style={{ display: 'none', top: '-100px', left: '-100px' }} />
  163. </div>
  164. <div className="form-group row">
  165. <label htmlFor="settingForm[importer:esa:team_name]" className="text-left text-md-right col-md-3 col-form-label">
  166. { t('admin:importer_management.esa_settings.team_name') }
  167. </label>
  168. <div className="col-md-6">
  169. <input className="form-control" type="text" name="esaTeamName" value={esaTeamName} onChange={this.handleInputValue} />
  170. </div>
  171. </div>
  172. <div className="form-group row">
  173. <label htmlFor="settingForm[importer:esa:access_token]" className="text-left text-md-right col-md-3 col-form-label">
  174. { t('admin:importer_management.esa_settings.access_token') }
  175. </label>
  176. <div className="col-md-6">
  177. <input className="form-control" type="password" name="esaAccessToken" value={esaAccessToken} onChange={this.handleInputValue} />
  178. </div>
  179. </div>
  180. <div className="form-group row">
  181. <div className="offset-md-3 col-md-6">
  182. <input
  183. id="testConnectionToEsa"
  184. type="button"
  185. className="btn btn-primary btn-esa"
  186. name="Esa"
  187. onClick={this.esaHandleSubmit}
  188. value={t('admin:importer_management.import')}
  189. />
  190. <input type="button" className="btn btn-secondary" onClick={this.esaHandleSubmitUpdate} value={t('Update')} />
  191. <span className="offset-0 offset-sm-1">
  192. <input
  193. id="importFromEsa"
  194. type="button"
  195. name="Esa"
  196. className="btn btn-secondary btn-esa"
  197. onClick={this.esaHandleSubmitTest}
  198. value={t('admin:importer_management.esa_settings.test_connection')}
  199. />
  200. </span>
  201. </div>
  202. </div>
  203. </fieldset>
  204. </form>
  205. <form
  206. className="mt-5"
  207. id="importerSettingFormQiita"
  208. role="form"
  209. >
  210. <fieldset>
  211. <h2 className="admin-setting-header">{t('admin:importer_management.import_from', { from: 'Qiita:Team' })}</h2>
  212. <table className="table table-bordered table-mapping">
  213. <thead>
  214. <tr>
  215. <th width="45%">Qiita:Team</th>
  216. <th width="10%"></th>
  217. <th>GROWI</th>
  218. </tr>
  219. </thead>
  220. <tbody>
  221. <tr>
  222. <th>{t('Article')}</th>
  223. <th><i className="icon-arrow-right-circle text-success"></i></th>
  224. <th>{t('Page')}</th>
  225. </tr>
  226. <tr>
  227. <th>{t('Tag')}</th>
  228. <th></th>
  229. <th>-</th>
  230. </tr>
  231. <tr>
  232. <th>{t('admin:importer_management.Directory_hierarchy_tag')}</th>
  233. <th></th>
  234. <th>(TBD)</th>
  235. </tr>
  236. <tr>
  237. <th>{t('User')}</th>
  238. <th></th>
  239. <th>(TBD)</th>
  240. </tr>
  241. </tbody>
  242. </table>
  243. <div className="card well mb-0 small">
  244. <ul>
  245. <li>{t('admin:importer_management.page_skip')}</li>
  246. </ul>
  247. </div>
  248. <div className="form-group row">
  249. <input type="password" name="dummypass" style={{ display: 'none', top: '-100px', left: '-100px' }} />
  250. </div>
  251. <div className="form-group row">
  252. <label htmlFor="settingForm[importer:qiita:team_name]" className="text-left text-md-right col-md-3 col-form-label">
  253. { t('admin:importer_management.qiita_settings.team_name') }
  254. </label>
  255. <div className="col-md-6">
  256. <input className="form-control" type="text" name="qiitaTeamName" value={qiitaTeamName} onChange={this.handleInputValue} />
  257. </div>
  258. </div>
  259. <div className="form-group row">
  260. <label htmlFor="settingForm[importer:qiita:access_token]" className="text-left text-md-right col-md-3 col-form-label">
  261. { t('admin:importer_management.qiita_settings.access_token') }
  262. </label>
  263. <div className="col-md-6">
  264. <input className="form-control" type="password" name="qiitaAccessToken" value={qiitaAccessToken} onChange={this.handleInputValue} />
  265. </div>
  266. </div>
  267. <div className="form-group row">
  268. <div className="offset-md-3 col-md-6">
  269. <input
  270. id="testConnectionToQiita"
  271. type="button"
  272. className="btn btn-primary btn-qiita"
  273. name="Qiita"
  274. onClick={this.qiitaHandleSubmit}
  275. value={t('admin:importer_management.import')}
  276. />
  277. <input type="button" className="btn btn-secondary" onClick={this.qiitaHandleSubmitUpdate} value={t('Update')} />
  278. <span className="offset-0 offset-sm-1">
  279. <input
  280. name="Qiita"
  281. type="button"
  282. id="importFromQiita"
  283. className="btn btn-secondary btn-qiita"
  284. onClick={this.qiitaHandleSubmitTest}
  285. value={t('admin:importer_management.qiita_settings.test_connection')}
  286. />
  287. </span>
  288. </div>
  289. </div>
  290. </fieldset>
  291. </form>
  292. </Fragment>
  293. );
  294. }
  295. }
  296. ImportDataPage.propTypes = {
  297. t: PropTypes.func.isRequired, // i18next
  298. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  299. };
  300. /**
  301. * Wrapper component for using unstated
  302. */
  303. const ImportDataPageWrapper = withUnstatedContainers(ImportDataPage, [AppContainer]);
  304. export default withTranslation()(ImportDataPageWrapper);