From 0495fbed8ccf309833133a7692862961d3fef98b Mon Sep 17 00:00:00 2001 From: Zamil Majdy <z.majdy1996@gmail.com> Date: Wed, 26 Apr 2017 08:38:50 +0700 Subject: [PATCH] [#140656091] [#33] [Refactor] Add transcript fetch --- assets/js/TranscriptPage.jsx | 65 ++++--------------- .../__test__/components/ApproveModal-test.jsx | 22 ++++--- assets/js/components/ApproveModal.jsx | 14 +++- assets/js/components/Course.jsx | 7 +- assets/js/components/CourseList.jsx | 46 ++++++------- assets/js/components/VacancyList.jsx | 2 +- assets/js/index.jsx | 2 + kape/settings.py | 2 +- 8 files changed, 67 insertions(+), 93 deletions(-) diff --git a/assets/js/TranscriptPage.jsx b/assets/js/TranscriptPage.jsx index 69da971a..eeacde8a 100644 --- a/assets/js/TranscriptPage.jsx +++ b/assets/js/TranscriptPage.jsx @@ -1,59 +1,22 @@ import React from 'react'; import CourseList from './components/CourseList'; +import Server from './lib/Server'; export default class TranscriptPage extends React.Component { - constructor(props) { - super(props); - /* istanbul ignore next */ - this.state = { - data: {"transcript":[{ - "url": "http://api.cs.ui.ac.id/siakngcs/riwayat-mahasiswa/99731/", - "npm": "1406622616", - "kelas": { - "url": "http://api.cs.ui.ac.id/siakngcs/kelas/473569/", - "kd_kls": "473569", - "nm_kls": "MD 1 - B", - "nm_mk_cl": { - "url": "http://api.cs.ui.ac.id/siakngcs/matakuliah/817/", - "kd_mk": "CSF1600100", - "nm_mk": "Matematika Diskret 1", - "kd_org": "06.00.12.01", - "kd_kur": "06.00.12.01-2012", - "jml_sks": 3 - }, - "kd_kur_cl": "06.00.12.01-2012", - "kd_mk_cl": "CSF1600100", - "periode": { - "url": "http://api.cs.ui.ac.id/siakngcs/periode/25/", - "term": 1, - "tahun": 2014 - }, - "pengajar": [ - { - "url": -"http://api.cs.ui.ac.id/siakngcs/dosen/196111251992031001/", - "nomor": "196111251992031001", - "nama": "Prof. Drs. T. Basaruddin M.Sc., Ph.D", - "id_skema": 1, - "nm_skema": "Skema Inti", - "maks_sks": 8 - } - ] - }, - "kd_kls": "473569", - "kd_kur": "06.00.12.01-2012", - "kd_mk": "CSF1600100", - "kd_org": "01.00.12.01", - "term": 1, - "tahun": 2014, - "nilai": "A" - }],"name":"Si jagoan neon" }};//ambil dari database + static propTypes = { + params: React.PropTypes.object.isRequired, + }; - } + constructor(props) { + super(props); + /* istanbul ignore next */ + this.state = {}; + Server.get(`/applications/${this.props.params.id}/`).then(response => this.setState({ data: response })); + } - render() { - return ( - <CourseList data={this.state.data.transcript} name={this.state.data.name}/> - ); + render() { + return ( + this.state.data ? <CourseList data={this.state.data} /> : <h5 style={{ textAlign: 'center' }}> Mohon Tunggu.. </h5> + ); } } diff --git a/assets/js/__test__/components/ApproveModal-test.jsx b/assets/js/__test__/components/ApproveModal-test.jsx index 36f24acd..739192af 100644 --- a/assets/js/__test__/components/ApproveModal-test.jsx +++ b/assets/js/__test__/components/ApproveModal-test.jsx @@ -7,47 +7,53 @@ import ApproveModal from '../../components/ApproveModal'; describe('ApproveModal', () => { it('renders without problem', () => { const modalApproval = ReactTestUtils.renderIntoDocument( - <ApproveModal updateStatus={() => {}} data={{ key: 'value' }} />); + <ApproveModal updateStatus={() => {}} data={{ key: 'value', student: { resume: 'asdasd' } }} />); expect(modalApproval).to.exist; }); it('open without problem', () => { + fetchMock.get('*', { student: { resume: 'asdasd' } }); const modalApproval = ReactTestUtils.renderIntoDocument( - <ApproveModal updateStatus={() => {}} data={{ key: 'value' }} />); + <ApproveModal updateStatus={() => {}} data={{ key: 'value', student: { resume: 'asdasd' } }} />); const modal = ReactTestUtils.findRenderedDOMComponentWithTag(modalApproval, 'Button'); ReactTestUtils.Simulate.click(modal); + fetchMock.restore(); }); it('close without problem', () => { + fetchMock.get('*', { student: { resume: 'asdasd' } }); const modalApproval = ReactTestUtils.renderIntoDocument( - <ApproveModal updateStatus={() => {}} data={{ key: 'value' }} />); + <ApproveModal updateStatus={() => {}} data={{ key: 'value', student: { resume: 'asdasd' } }} />); modalApproval.handleClose(); expect(modalApproval.state.modalOpen).to.equal(false); + fetchMock.restore(); }); it('reject without problem', () => { - fetchMock.get('*', { }); + fetchMock.get('*', { student: { resume: 'asdasd' } }); fetchMock.patch('*', { }); const modalApproval = ReactTestUtils.renderIntoDocument( - <ApproveModal updateStatus={() => {}} data={{ key: 'value' }} />); + <ApproveModal updateStatus={() => {}} data={{ key: 'value', student: { resume: 'asdasd' }, cover_letter: 'asdasd' }} />); modalApproval.modal = { open: () => {} }; modalApproval.reject(); modalApproval.rejectApplication(); + modalApproval.gotoLink('link random'); expect(modalApproval.state.rejectLoading).to.equal(true); fetchMock.restore(); }); it('apply without problem', () => { - fetchMock.get('*', { }); - fetchMock.patch('*', { }); + fetchMock.get('*', { student: { resume: 'asdasd' } }); + fetchMock.patch('*', { }); const modalApproval = ReactTestUtils.renderIntoDocument( - <ApproveModal updateStatus={() => {}} data={{ key: 'value' }} />); + <ApproveModal updateStatus={() => {}} data={{ key: 'value', student: { resume: 'asdasd', show_transcript: true } }} />); modalApproval.modal = { open: () => {} }; modalApproval.accept(); modalApproval.acceptApplication(); + modalApproval.gotoLink('link random'); expect(modalApproval.state.acceptLoading).to.equal(true); fetchMock.restore(); }); diff --git a/assets/js/components/ApproveModal.jsx b/assets/js/components/ApproveModal.jsx index db1839ce..ce81da6b 100644 --- a/assets/js/components/ApproveModal.jsx +++ b/assets/js/components/ApproveModal.jsx @@ -51,6 +51,11 @@ export default class ApproveModal extends React.Component { }); }; + gotoLink = (url) => { + const win = window.open(url); + win.focus(); + }; + accept = () => { this.modal.open( 'Terima Lamaran?', @@ -71,9 +76,12 @@ export default class ApproveModal extends React.Component { <Modal.Header>Data Lamaran</Modal.Header> <Modal.Content> <h4> Cover Letter </h4> - { this.props.data.cover_letter } - <div style={{ float: 'right' }}> - <a href={this.props.data.resume} >CV Pelamar </a> + { this.props.data.cover_letter ? this.props.data.cover_letter : 'Kosong' } + <div style={{ float: 'right', textAlign: 'right' }}> + {this.props.data.student.resume ? <a onClick={() => this.gotoLink(this.props.data.student.resume)} href="#" >CV Pelamar </a> : ''} + <br /> + {this.props.data.student.show_transcript ? <a onClick={() => this.gotoLink(`/transcript/${this.props.data.id}`)} href="#" >Transkrip Pelamar</a> : ''} + <br /> </div> </Modal.Content> <Modal.Actions> diff --git a/assets/js/components/Course.jsx b/assets/js/components/Course.jsx index 87138462..d44fb78a 100644 --- a/assets/js/components/Course.jsx +++ b/assets/js/components/Course.jsx @@ -10,11 +10,10 @@ export default class Course extends React.Component { render() { return ( - <Table.Row> - <Table.Cell>{this.props.courseName}</Table.Cell> - <Table.Cell>{this.props.grade}</Table.Cell> - </Table.Row> + <Table.Cell>{this.props.courseName}</Table.Cell> + <Table.Cell>{this.props.grade}</Table.Cell> + </Table.Row> ); } } diff --git a/assets/js/components/CourseList.jsx b/assets/js/components/CourseList.jsx index cc0357a0..46abb1d1 100644 --- a/assets/js/components/CourseList.jsx +++ b/assets/js/components/CourseList.jsx @@ -4,45 +4,41 @@ import Course from './Course'; export default class CourseList extends React.Component { static propTypes = { - data: React.PropTypes.array.isRequired, - name: React.PropTypes.array.isRequired, + data: React.PropTypes.object.isRequired, }; constructor(props) { super(props); /* istanbul ignore next */ - this.state = { course: this.props.data }; + this.state = { course: this.props.data.transcript }; } generateCourse() { - return this.state.course.map((course, index) => - <Course - key={index} - courseName={course.kelas.nm_kls} - grade={course.nilai} - />, - ); + return this.state.course.map((course, index) => course.kelas ? (<Course + key={index} + grade={course.nilai} + courseName={course.kelas.nm_kls} + />) : null); } render = () => ( - <Grid.Column centered> - + <Grid.Column> <Segment> - <h2>Nama : {this.props.name}</h2> - <Table unstackable> - <Table.Header> - <Table.Row> - <Table.HeaderCell>Mata Kuliah</Table.HeaderCell> - <Table.HeaderCell>Nilai</Table.HeaderCell> - </Table.Row> - </Table.Header> + <h2>Nama : {this.props.data.name}</h2> + <Table unstackable> + <Table.Header> + <Table.Row> + <Table.HeaderCell>Mata Kuliah</Table.HeaderCell> + <Table.HeaderCell>Nilai</Table.HeaderCell> + </Table.Row> + </Table.Header> - <Table.Body> - { this.generateCourse() } - </Table.Body> - </Table> + <Table.Body> + { this.generateCourse() } + </Table.Body> + </Table> </Segment> - </Grid.Column> + </Grid.Column> ); } diff --git a/assets/js/components/VacancyList.jsx b/assets/js/components/VacancyList.jsx index c5224b9c..dc5c089d 100644 --- a/assets/js/components/VacancyList.jsx +++ b/assets/js/components/VacancyList.jsx @@ -95,7 +95,7 @@ export default class VacancyList extends React.Component { if (this.props.type === 'company') { return ( <Grid textAlign="center"> - <Button size="tiny" icon="eye" labelPosition="left" color="facebook" content="Lihat Semua Pendaftar" /> + <Button size="tiny" as={Link} to="/pelamar" icon="eye" labelPosition="left" color="facebook" content="Lihat Semua Pendaftar" /> <Button size="tiny" as={Link} to="/buat-lowongan" icon="add" labelPosition="left" content="Tambah Lowongan Baru" color="teal" /> </Grid> ); diff --git a/assets/js/index.jsx b/assets/js/index.jsx index 0d8360d6..639bd9eb 100644 --- a/assets/js/index.jsx +++ b/assets/js/index.jsx @@ -8,6 +8,7 @@ import CreateVacancy from './CreateVacancy'; import Server from './lib/Server'; import Storage from './lib/Storage'; import ApplicantPage from './ApplicantPage'; +import TranscriptPage from './TranscriptPage'; export default class App extends React.Component { @@ -86,6 +87,7 @@ export default class App extends React.Component { <Router history={browserHistory}> <Route path="/login" component={Login} /> <Route component={Dashboard} onEnter={this.handleAuth}> + <Route path="/transcript/:id" component={company(TranscriptPage)} /> <Route path="/lowongan" component={commonUser(VacancyPage)} /> <Route path="/buat-lowongan" component={company(CreateVacancy)} /> <Route path="/buat-lowongan/:id" component={company(CreateVacancy)} /> diff --git a/kape/settings.py b/kape/settings.py index 6a98953d..8cb907b7 100755 --- a/kape/settings.py +++ b/kape/settings.py @@ -159,4 +159,4 @@ SESSION_COOKIE_HTTPONLY = False RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver') -API_CS_CREDENTIALS = {'user' : 'lalala', 'password' : 'lalala'} +API_CS_CREDENTIALS = {'user': 'kape', 'password': 'ppla1~2017'} -- GitLab