Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.79 KB | None | 0 0
  1. // @route Put api/words/:id
  2. // @desc Update a word by id
  3. // @access Private
  4.  
  5. router.put(
  6. '/:id',
  7. passport.authenticate('jwt', { session: false }),
  8. (req, res) => {
  9. const { errors, isValid } = validateWordInput(req.body);
  10.  
  11. // Check validation
  12. if (!isValid) {
  13. // Return any errors
  14. return res.status(400).json(errors);
  15. }
  16. Profile.findOne({ user: req.user.id }).then(profile => {
  17. Word.findById(req.params.id)
  18. .then(word => {
  19. // Check for word owner
  20. if (word.user.toString() !== req.user.id) {
  21. return res
  22. .status(401)
  23. .json({ notauthorized: 'User not authorized' });
  24. }
  25.  
  26. const wordID = req.params.id;
  27. const wordInput = req.body;
  28.  
  29. // Update
  30. Word.findByIdAndUpdate(
  31. { _id: wordID },
  32. { $set: wordInput },
  33. { returnOriginal: false },
  34. (err, word) => {
  35. if (err) {
  36. console.log(err);
  37. }
  38. }
  39. ).then(word => res.json(word));
  40. })
  41. .catch(err => res.status(404).json({ nowordfound: 'No word found' }));
  42. });
  43. }
  44. );
  45.  
  46. import React, { Component } from 'react';
  47. import { Link, withRouter } from 'react-router-dom';
  48. import TextFieldGroup from '../common/TextFieldGroup';
  49. import SelectListGroup from '../common/SelectListGroup';
  50. import { connect } from 'react-redux';
  51. import PropTypes from 'prop-types';
  52. import { addWord, updateWord } from '../../actions/wordActions';
  53. import isEmpty from '../../validation/is-empty';
  54.  
  55. class EditWord extends Component {
  56. constructor(props) {
  57. super(props);
  58. this.state = {
  59. ugrWordCyr: '',
  60. rusTranslation: '',
  61. example: '',
  62. exampleTranslation: '',
  63. origin: '',
  64. sphere: '',
  65. see: '',
  66. lexis: '',
  67. grammar: '',
  68. partOfSpeech: '',
  69. style: '',
  70. errors: {}
  71. };
  72. this.onChange = this.onChange.bind(this);
  73. this.onSubmit = this.onSubmit.bind(this);
  74. this.onCheck = this.onCheck.bind(this);
  75. }
  76.  
  77. componentWillReceiveProps(nextProps) {
  78. if (nextProps.errors) {
  79. this.setState({ errors: nextProps.errors });
  80. }
  81.  
  82. if (nextProps.words.words) {
  83. const words = nextProps.words.words;
  84.  
  85. // if profile field does not exist make empty string
  86. words.ugrwordsCyr = !isEmpty(words.ugrwordsCyr) ? words.ugrwordsCyr : '';
  87. words.rusTranslation = !isEmpty(words.rusTranslation)
  88. ? words.rusTranslation
  89. : '';
  90. words.example = !isEmpty(words.example) ? words.example : '';
  91. words.exampleTranslation = !isEmpty(words.exampleTranslation)
  92. ? words.exampleTranslation
  93. : '';
  94. words.origin = !isEmpty(words.origin) ? words.origin : '';
  95. words.sphere = !isEmpty(words.sphere) ? words.sphere : '';
  96. words.see = !isEmpty(words.see) ? words.see : {};
  97. words.lexis = !isEmpty(words.lexis) ? words.lexis : {};
  98. words.grammar = !isEmpty(words.grammar) ? words.grammar : {};
  99. words.see = !isEmpty(words.see) ? words.see : {};
  100. words.style = !isEmpty(words.style) ? words.style : {};
  101.  
  102. // Set component fields state
  103. this.setState({
  104. ugrWordCyr: words.ugrWordCyr,
  105. rusTranslation: words.rusTranslation,
  106. example: words.example,
  107. exampleTranslation: words.exampleTranslation,
  108. origin: words.origin,
  109. lexis: words.lexis,
  110. grammar: words.grammar,
  111. see: words.see,
  112. partOfSpeech: words.partOfSpeech
  113. });
  114. }
  115. }
  116.  
  117. onSubmit(e) {
  118. e.preventDefault();
  119. const wordData = {
  120. ugrWordCyr: this.state.ugrWordCyr,
  121. rusTranslation: this.state.rusTranslation,
  122. example: this.state.example,
  123. exampleTranslation: this.state.exampleTranslation,
  124. origin: this.state.origin,
  125. sphere: this.state.sphere,
  126. see: this.state.see,
  127. lexis: this.state.lexis,
  128. grammar: this.state.grammar,
  129. partOfSpeech: this.state.partOfSpeech,
  130. style: this.state.style
  131. };
  132. this.props.updateWord(wordData, this.props.history);
  133. }
  134.  
  135. onChange(e) {
  136. this.setState({ [e.target.name]: e.target.value });
  137. }
  138.  
  139. onCheck(e) {
  140. this.setState({
  141. current: !this.state.current
  142. });
  143. }
  144. render() {
  145. const { errors } = this.state;
  146. const sphereOptions = [
  147. { label: 'Выберите сферу употребления слова', value: 0 },
  148. { label: 'Анатомия', value: 'Анатомия' },
  149. { label: 'Археология', value: 'Археология' },
  150. { label: 'Архитектура', value: 'Архитектура' },
  151. { label: 'Астрономия', value: 'Астрономия' },
  152. { label: 'Биология', value: 'Биология' },
  153. { label: 'Ботаника', value: 'Ботаника' },
  154. { label: 'Бухгалтерия', value: 'Бухгалтерия' },
  155. { label: 'Ветеренария', value: 'Ветеренария' },
  156. { label: 'География', value: 'География' },
  157. { label: 'Диалектизм', value: 'Диалектизм' },
  158. { label: 'Дипломатический термин', value: 'Дипломатический термин' },
  159. { label: 'Железнодорожное дело', value: 'Железнодорожное дело' },
  160. { label: 'Зоология', value: 'Зоология' },
  161. { label: 'Исторический термин', value: 'Исторический термин' },
  162. { label: 'Кулинария', value: 'Кулинария' },
  163. { label: 'Лингвистика', value: 'Лингвистика' },
  164. { label: 'Математика', value: 'Математика' },
  165. { label: 'Медицина', value: 'Медицина' },
  166. { label: 'Религия', value: 'Религия' },
  167. { label: 'Физкультура и спорт', value: 'Физкультура и спорт' },
  168. { label: 'Сельзкое хозяйство', value: 'Сельзкое хозяйство' },
  169. { label: 'Фармацептический термин', value: 'Фармацептический термин' },
  170. { label: 'Физика', value: 'Физика' },
  171. { label: 'Физиология', value: 'Физиология' },
  172. { label: 'Фольклор', value: 'Фольклор' },
  173. { label: 'Химия', value: 'Химия' },
  174. { label: 'Экономика', value: 'Экономика' },
  175. { label: 'Этнография', value: 'Этнография' },
  176. { label: 'Юридический термин', value: 'Юридический термин' }
  177. ];
  178. const originOptions = [
  179. { label: 'Выберите вариант происхождения слова', value: 0 },
  180. { label: 'Арабское слово', value: 'Арабское слово' },
  181. { label: 'Китайское слово', value: 'Китайское слово' },
  182. { label: 'Русское слово', value: 'Русское слово' },
  183. { label: 'Монгольский язык', value: 'Монгольский язык' },
  184. { label: 'Персидское слово', value: 'Персидское слово' },
  185. { label: 'Уйгурское слово', value: 'Уйгурское слово' },
  186. { label: 'Китайско-Уйгурское слово', value: 'Китайско-Уйгурское слово' },
  187. {
  188. label: 'Монгольско-Уйгурское слово',
  189. value: 'Могольско-Уйгурское слово'
  190. },
  191. { label: 'Русско-уйгурское слово', value: 'Русско-уйгурское слово' },
  192. { label: 'Арабско-Уйгурское слово', value: 'Арабско-Уйгурское слово' },
  193. { label: 'Персидско-Уйгурское слово', value: 'Персидско-Уйгурское слово' }
  194. ];
  195.  
  196. const lexisOptions = [
  197. { label: 'Выберите лексику слова', value: 0 },
  198. { label: 'В переносном значении', value: 'В переносном значении' },
  199. { label: 'Малоупотребительно', value: 'Малоупотребительно' },
  200. { label: 'Поговорка', value: 'Поговорка' },
  201. { label: 'Пословица', value: 'Пословица' },
  202. { label: 'В разных значениях', value: 'В разных значениях' },
  203. { label: 'В прямом значении', value: 'В прямом значении' }
  204. ];
  205.  
  206. const styleOptions = [
  207. { label: 'Выберите стиль слова', value: 0 },
  208. { label: 'Бранное слово', value: 'Бранное слово' },
  209. { label: 'Поэтическое слово', value: 'Поэтическое слово' },
  210. { label: 'Разговорное слово', value: 'Разговорное слово' },
  211. { label: 'Книжный стиль', value: 'Книжный стиль' },
  212. { label: 'Неодобрительно', value: 'Неодобрительно' },
  213. { label: 'В ироничном смысле', value: 'В ироничном смысле' }
  214. ];
  215.  
  216. const partOfSpeechOptions = [
  217. { label: 'Выберите часть речи к которому принадлежит слово', value: 0 },
  218. { label: 'Вводное слово', value: 'Вводное слово' },
  219. {
  220. label: 'Вопросительное местоимение',
  221. value: 'Вопросительное местоимение'
  222. },
  223. { label: 'Вопросительная частица', value: 'Вопросительная частица' },
  224. { label: 'Глагол', value: 'Глагол' },
  225. {
  226. label: 'Количественное числительное',
  227. value: 'Количественное числительное'
  228. },
  229. {
  230. label: 'Существительное',
  231. value: 'Существительное'
  232. },
  233. {
  234. label: 'Порядковое числительное',
  235. value: 'Порядковое числительное'
  236. },
  237. {
  238. label: 'Междометие',
  239. value: 'Междометие'
  240. },
  241. {
  242. label: 'Звукоподражание',
  243. value: 'Звукоподражание'
  244. },
  245. {
  246. label: 'Личное местоимение',
  247. value: 'Личное местоимение'
  248. },
  249. {
  250. label: 'Местоимение',
  251. value: 'Местоимение'
  252. },
  253. {
  254. label: 'Отрицательная частица',
  255. value: 'Отрицательная частица'
  256. },
  257. {
  258. label: 'Имя прилагательное',
  259. value: 'Имя прилагательное'
  260. },
  261. {
  262. label: 'Причастие',
  263. value: 'Причастие'
  264. },
  265. {
  266. label: 'Разделительный союз',
  267. value: 'Разделительный союз'
  268. },
  269. {
  270. label: 'Собирательное существительное',
  271. value: 'Собирательное существительное'
  272. },
  273. {
  274. label: 'Соединительный союз',
  275. value: 'Соединительный союз'
  276. },
  277. {
  278. label: 'Указательное местоимение',
  279. value: 'Указательное местоимение'
  280. },
  281. {
  282. label: 'Число',
  283. value: 'Число'
  284. },
  285. {
  286. label: 'Усилительная частица',
  287. value: 'Усилительная частица'
  288. },
  289. {
  290. label: 'Утвердительная частица',
  291. value: 'Утвердительная частица'
  292. }
  293. ];
  294.  
  295. const grammarOptions = [
  296. { label: 'Выберите грамматику слова', value: 0 },
  297. { label: 'Имя действия', value: 'Имя действия' },
  298. { label: 'Лицо глагола', value: 'Лицо глагола' },
  299. { label: 'Взаимный залог', value: 'Взаимный залог' },
  300. { label: 'Возвратный залог', value: 'Возвратный залог' },
  301. { label: 'Грамматика', value: 'Грамматика' },
  302. { label: 'Дательный падеж', value: 'Дательный падеж' },
  303. { label: 'Деепречастие', value: 'Деепречастие' },
  304. { label: 'Единственное число', value: 'Единственное число' },
  305. { label: 'Множественное число', value: 'Множественное число' },
  306. { label: 'Многократный вид глагола', value: 'Многократный вид глагола' },
  307. { label: 'Однократный вид глагола', value: 'Однократный вид глагола' },
  308. { label: 'Направительный падеж', value: 'Направительный падеж' },
  309. { label: 'Сравнительная степень', value: 'Сравнительная степень' },
  310. { label: 'Страдательный залог', value: 'Страдательный залог' },
  311. { label: 'Родительный падеж', value: 'Родительный падеж' },
  312. { label: 'Уменьшительная форма', value: 'Уменьшительная форма' }
  313. ];
  314. return (
  315. <div className="add-word">
  316. <div className="container">
  317. <div className="row">
  318. <div className="col-md-8 m-auto">
  319. <Link to="/my-words" className="btn btn-light">
  320. Go Back
  321. </Link>
  322. <h1 className="display-4 text-center">Edit Word</h1>
  323. <form onSubmit={this.onSubmit}>
  324. <TextFieldGroup
  325. placeholder="Бала"
  326. info="Введите слово на уйгурском"
  327. name="ugrWordCyr"
  328. value={this.state.ugrWordCyr}
  329. onChange={this.onChange}
  330. error={errors.ugrWordCyr}
  331. />
  332. <TextFieldGroup
  333. placeholder="Ребенок"
  334. info="Введите слово на русском"
  335. name="rusTranslation"
  336. value={this.state.rusTranslation}
  337. onChange={this.onChange}
  338. error={errors.rusTranslation}
  339. />
  340. <div className="form-check mb-form">
  341. <input
  342. type="checkbox"
  343. className="form-check-input"
  344. name="see"
  345. value={this.state.see}
  346. onChange={this.onCheck}
  347. id="see"
  348. />
  349. <label htmlFor="see">Смотри</label>
  350. </div>
  351. <TextFieldGroup
  352. placeholder=""
  353. info="Введите пример предложения на уйгурском"
  354. name="example"
  355. value={this.state.example}
  356. onChange={this.onChange}
  357. error={errors.example}
  358. />
  359. <TextFieldGroup
  360. placeholder=""
  361. info="Введите перевод примерного предложения на русском"
  362. name="exampleTranslation"
  363. value={this.state.exampleTranslation}
  364. onChange={this.onChange}
  365. error={errors.exampleTranslation}
  366. />
  367. <h6>Происхождение слова</h6>
  368. <SelectListGroup
  369. placeholder="Арабское"
  370. name="origin"
  371. value={this.state.origin}
  372. onChange={this.onChange}
  373. error={errors.origin}
  374. options={originOptions}
  375. />
  376. <h6>Сфера употребления слова</h6>
  377. <SelectListGroup
  378. placeholder="Физика"
  379. name="sphere"
  380. value={this.state.sphere}
  381. onChange={this.onChange}
  382. error={errors.sphere}
  383. options={sphereOptions}
  384. />
  385. <h6>Лексика слова</h6>
  386. <SelectListGroup
  387. placeholder=""
  388. name="lexis"
  389. value={this.state.lexis}
  390. onChange={this.onChange}
  391. error={errors.lexis}
  392. options={lexisOptions}
  393. />
  394. <h6>Стиль слова</h6>
  395. <SelectListGroup
  396. placeholder=""
  397. name="style"
  398. value={this.state.style}
  399. onChange={this.onChange}
  400. error={errors.style}
  401. options={styleOptions}
  402. />
  403. <h6>Часть речи</h6>
  404. <SelectListGroup
  405. placeholder=""
  406. name="partOfSpeech"
  407. value={this.state.partOfSpeech}
  408. onChange={this.onChange}
  409. error={errors.partOfSpeech}
  410. options={partOfSpeechOptions}
  411. />
  412. <h6>Грамматика слова</h6>
  413. <SelectListGroup
  414. placeholder=""
  415. name="grammar"
  416. value={this.state.grammar}
  417. onChange={this.onChange}
  418. error={errors.grammar}
  419. options={grammarOptions}
  420. />
  421. <input
  422. type="submit"
  423. value="submit"
  424. className="btn btn-info btn-block mt-4"
  425. />
  426. </form>
  427. </div>
  428. </div>
  429. </div>
  430. </div>
  431. );
  432. }
  433. }
  434.  
  435. EditWord.propTypes = {
  436. addWord: PropTypes.func.isRequired,
  437. updateWord: PropTypes.func.isRequired,
  438. errors: PropTypes.object.isRequired
  439. };
  440.  
  441. const mapStateToProps = state => ({
  442. errors: state.errors,
  443. word: state.words
  444. });
  445.  
  446. export default connect(
  447. mapStateToProps,
  448. { addWord, updateWord }
  449. )(withRouter(EditWord));
  450.  
  451. import axios from 'axios';
  452. import { GET_ERRORS, GET_WORDS_BY_USER, ADD_WORD, UPDATE_WORD } from './types';
  453.  
  454. export const addWord = (wordData, history) => dispatch => {
  455. axios
  456. .post('/api/words', wordData)
  457. .then(res => {
  458. dispatch({
  459. type: ADD_WORD,
  460. payload: res.data
  461. });
  462. history.push('/dashboard');
  463. })
  464. .catch(err =>
  465. dispatch({
  466. type: GET_ERRORS,
  467. payload: err.response.data
  468. })
  469. );
  470. };
  471.  
  472. export const getWordsByUser = () => dispatch => {
  473. axios
  474. .get('/api/words')
  475. .then(res =>
  476. dispatch({
  477. type: GET_WORDS_BY_USER,
  478. payload: res.data
  479. })
  480. )
  481. .catch(err =>
  482. dispatch({
  483. type: GET_WORDS_BY_USER,
  484. payload: null
  485. })
  486. );
  487. };
  488.  
  489. **export const updateWord = id => dispatch => {
  490. axios
  491. .get('/api/words/:id')
  492. .then(res =>
  493. dispatch({
  494. type: UPDATE_WORD,
  495. payload: res.data
  496. })
  497. )
  498. .catch(err =>
  499. dispatch({
  500. type: UPDATE_WORD,
  501. payload: null
  502. })
  503. );
  504. };**
  505.  
  506. import { GET_WORDS_BY_USER, ADD_WORD, UPDATE_WORD } from '../actions/types';
  507.  
  508. const initialState = {
  509. words: [],
  510. word: {},
  511. loading: false
  512. };
  513.  
  514. export default function(state = initialState, action) {
  515. switch (action.type) {
  516. case ADD_WORD:
  517. return {
  518. ...state,
  519. words: [action.payload, ...state.words]
  520. };
  521. case GET_WORDS_BY_USER:
  522. return {
  523. ...state,
  524. words: action.payload,
  525. loading: false
  526. };
  527. case UPDATE_WORD:
  528. return {
  529. ...state,
  530. word: action.payload
  531. };
  532. default:
  533. return state;
  534. }
  535. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement