From e3e1abf9aab2bbe61950da19851abb48d297a8cc Mon Sep 17 00:00:00 2001 From: "M. Reza Qorib" <rezaqorib96@gmail.com> Date: Wed, 29 Mar 2017 09:05:25 +0700 Subject: [PATCH] [#140654507] #13 Add bookmark and cancel bookmark feature --- assets/js/VacancyPage.jsx | 7 +++---- assets/js/components/LoginForm.jsx | 4 ++-- assets/js/components/Vacancy.jsx | 15 +++++++++++++-- assets/js/components/VacancyList.jsx | 28 ++++++++++++++++++++++++---- 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/assets/js/VacancyPage.jsx b/assets/js/VacancyPage.jsx index 24fad1e8..66886b55 100644 --- a/assets/js/VacancyPage.jsx +++ b/assets/js/VacancyPage.jsx @@ -22,18 +22,17 @@ export default class VacancyPage extends React.Component { render() { const student = Storage.get('user-data').student; - return ( <div className="halamanLowongan"> <Tabs selected={0}> <Pane label="Semua Lowongan" > - <VacancyList key={1} url="/vacancies/" /> + <VacancyList key={1} studentId={student.id} url="/vacancies/" /> </Pane> <Pane label="Lamaran saya" > - <VacancyList key={2} url={`/students/${student.id}/applied-vacancies/`} /> + <VacancyList key={2} studentId={student.id} url={`/students/${student.id}/applied-vacancies/`} /> </Pane> <Pane label="Lamaran Ditandai" > - <VacancyList key={3} url={`/students/${student.id}/bookmarked-vacancies/`} /> + <VacancyList key={3} studentId={student.id} url={`/students/${student.id}/bookmarked-vacancies/`} /> </Pane> </Tabs> diff --git a/assets/js/components/LoginForm.jsx b/assets/js/components/LoginForm.jsx index 04a2d8ed..dcb2f068 100644 --- a/assets/js/components/LoginForm.jsx +++ b/assets/js/components/LoginForm.jsx @@ -57,14 +57,14 @@ export default class LoginForm extends React.Component { <Image src={`./assets/img/${this.props.imgSrc}`} size={this.props.imgSize} verticalAlign="middle" /> <span>{ this.props.header }</span> </div> <Form.Group widths="equal"> - <Form.Field required> + <Form.Field> <label htmlFor="id"> Username </label> <Input type="text" id="username" icon="user" iconPosition="left" placeholder="username" onChange={e => this.handleChange(e, 'username')} required /> </Form.Field> </Form.Group> <Form.Group widths="equal"> - <Form.Field required> + <Form.Field> <label htmlFor="password"> Password </label> <Input type="password" id="password" icon="key" iconPosition="left" placeholder="password" onChange={e => this.handleChange(e, 'password')} required /> </Form.Field> diff --git a/assets/js/components/Vacancy.jsx b/assets/js/components/Vacancy.jsx index db3f3d3f..8031a48d 100644 --- a/assets/js/components/Vacancy.jsx +++ b/assets/js/components/Vacancy.jsx @@ -9,18 +9,29 @@ const defaultImage = 'http://semantic-ui.com/images/wireframe/image.png'; export default class Vacancy extends React.Component { static propTypes = { data: React.PropTypes.object.isRequired, + bookmarked: React.PropTypes.number, + }; + + static defaultProps = { + bookmarked: 0, }; constructor(props) { super(props); /* istanbul ignore next */ + this.state = { bookmarked: this.props.bookmarked }; this.bookmark = this.bookmark.bind(this); } bookmark() { const studentId = Storage.get('user-data').student.id; const data = { vacancy_id: this.props.data.id }; - Server.post(`/students/${studentId}/bookmarked-vacancies/`, data); + if (this.state.bookmarked < 1){ + Server.post(`/students/${studentId}/bookmarked-vacancies/`, data); + } else { + Server.delete(`/students/${studentId}/bookmarked-vacancies/${this.props.data.id}/`); + } + this.state.bookmarked = 1 - this.state.bookmarked; } render() { @@ -32,7 +43,7 @@ export default class Vacancy extends React.Component { <h3>{ this.props.data.name }</h3> <div className="bookmark"> - <Rating icon="star" onRate={this.bookmark} size="massive" defaultRating={0} maxRating={1} /> + <Rating icon="star" onRate={this.bookmark} size="massive" defaultRating={this.props.bookmarked} maxRating={1} /> </div> <h4>{ this.props.data.company.name }</h4> <h5>{ this.props.data.company.address }</h5> diff --git a/assets/js/components/VacancyList.jsx b/assets/js/components/VacancyList.jsx index b78b71ff..92bcc964 100644 --- a/assets/js/components/VacancyList.jsx +++ b/assets/js/components/VacancyList.jsx @@ -1,28 +1,48 @@ import React from 'react'; import { Item } from 'semantic-ui-react'; -import Lowongan from './Vacancy'; +import Vacancy from './Vacancy'; import Server from '../lib/Server'; export default class VacancyList extends React.Component { static propTypes = { url: React.PropTypes.string.isRequired, + studentId: React.PropTypes.number.isRequired, + }; + + static defaultProps = { + bookmarkList: false, }; constructor(props) { super(props); /* istanbul ignore next */ + this.updateBookmarkList(); Server.get(this.props.url, false).then((data) => { this.setState({ vacancies: data }); }); - this.state = { vacancies: [] }; + this.state = { vacancies: [], bookmarkList: [] }; + this.updateBookmarkList = this.updateBookmarkList.bind(this); this.generateVacancies = this.generateVacancies.bind(this); + this.checkBookmark = this.checkBookmark.bind(this); + } + + checkBookmark(id) { + for (let i = 0; i < this.state.bookmarkList.length; i++) { + if (id == this.state.bookmarkList[i].id) { return 1; } + } + return 0; } + updateBookmarkList() { + Server.get(`/students/${this.props.studentId}/bookmarked-vacancies/`, false).then((data) => { + this.setState({ bookmarkList: data }); + }); + } generateVacancies() { return this.state.vacancies.map(vacancy => - <Lowongan key={vacancy.id} data={vacancy} />, + <Vacancy key={vacancy.id} bookmarked={this.checkBookmark(vacancy.id)} data={vacancy} />, ); } @@ -32,4 +52,4 @@ export default class VacancyList extends React.Component { { this.generateVacancies() } </Item.Group> ); -} \ No newline at end of file +} -- GitLab