diff --git a/assets/js/VacancyPage.jsx b/assets/js/VacancyPage.jsx index 24fad1e8ef8c87e66a4d55b4d37464890631e2fa..66886b55c2e0344949fff2b7ced5b7e970c50b70 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 04a2d8ed32110ae122bb2588f4e5fbc97c16c979..dcb2f06889a662e7ea9abd097b6112f9e753e018 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 db3f3d3f8ee261145fb5558ed00099d804fcb28c..8031a48dbf55003d0648ac5b4746b21eece2d890 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 b78b71ff4383f91c7e9b016cdd239bcaf7a2bd39..92bcc964d096916c8dbdc5feb92a88418f1a9dba 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 +}