Fakultas Ilmu Komputer UI

Commit b9039abc authored by M. Reza Qorib's avatar M. Reza Qorib
Browse files

Merge branch 'develop' of https://gitlab.com/PPL2017csui/PPLA1 into Features/StudentAcceptedCount

# Conflicts:
#	assets/js/ProfilePage.jsx
parents 478c8adc 0372c497
import React from 'react';
import { Segment, Image, Header, Icon, Checkbox, Container, Button, Form } from 'semantic-ui-react';
import Server from './lib/Server';
import Storage from './lib/Storage';
import ModalAlert from './components/ModalAlert';
export default class ProfilePage extends React.Component {
......@@ -36,12 +37,14 @@ export default class ProfilePage extends React.Component {
},
bagikanTranskrip: '',
acceptedNo: 0,
refresh: 1,
};
this.getProfile = this.getProfile.bind(this);
this.handleChange = this.handleChange.bind(this);
this.handleCheckbox = this.handleCheckbox.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.handleFile = this.handleFile.bind(this);
this.gotoLink = this.gotoLink.bind(this);
this.getProfile();
}
......@@ -61,11 +64,17 @@ export default class ProfilePage extends React.Component {
phone_number: data.phone_number,
photo: data.photo,
show_transcript: data.show_transcript,
bagikanTranskrip: (data.show_transcript ? 'Ya' : 'Tidak'),
acceptedNo: data.accepted_no,
bagikanTranskrip: data.show_transcript,
refresh: this.state.refresh + 1,
});
if (this.props.route.own) {
const newSession = this.props.user.data;
newSession.student = data;
Storage.set('user-data', newSession);
window.scrollTo(0, 0);
}
}, error => error.then(() => {
// this.modalAlert.open('Gagal Mengambil ', r.error);
this.state.name = 'Gagal mendapatkan informasi';
}));
}
......@@ -80,9 +89,9 @@ export default class ProfilePage extends React.Component {
}
});
Server.submit(`/profiles/students/${this.state.id}/`, submitForm, 'PATCH').then(() => {
this.modalAlert.open('Profil berhasil diperbaharui', 'Silakan periksa kembali profil anda' );
this.modalAlert.open('Profil berhasil diperbaharui', 'Silakan periksa kembali profil anda', this.getProfile);
}, error => error.then((r) => {
this.modalAlert.open('Pembaharuan profil gagal', r.error);
this.modalAlert.open('Pembaharuan profil gagal', r.detail);
}));
};
......@@ -105,6 +114,11 @@ export default class ProfilePage extends React.Component {
this.setState({ form, show_transcript: d.checked });
};
gotoLink = (url) => {
const win = window.open(url);
win.focus();
};
updateForm(show) {
if (show) {
return (
......@@ -116,7 +130,7 @@ export default class ProfilePage extends React.Component {
</Header.Content>
</Header>
<ModalAlert ref={(modal) => { this.modalAlert = modal; }} />
<Form size="small" onSubmit={this.handleSubmit}>
<Form ref={(input) => { this.form = input; }} key={this.state.refresh} size="small" onSubmit={this.handleSubmit}>
<Form.Field>
<label htmlFor="photo">Profile Picture</label>
<input onChange={this.handleFile} placeholder="Profile Photo.jpg" name="photo" type="File" />
......@@ -136,7 +150,7 @@ export default class ProfilePage extends React.Component {
<Form.Field>
<Checkbox
onChange={this.handleCheckbox}
checked={ this.state.show_transcript ? true : false }
checked={!!this.state.show_transcript}
label="Ijinkan perusahaan tempat saya mendaftar untuk melihat transkrip akademik saya"
name="show_transcript"
/>
......@@ -168,19 +182,18 @@ export default class ProfilePage extends React.Component {
<p>Sudah diterima di { this.state.acceptedNo } perusahaan</p>
</div>
<div className="button-profile">
<a href={this.state.resume ? this.state.resume : '#'} ><Button primary size="small">Resume</Button></a>
{ this.state.show_transcript &&
<Button primary size="small">Transkrip</Button>
}
<a target="_blank" rel="noopener noreferrer" href={this.state.resume ? this.state.resume : '#'} >
<Button primary size="small">Resume</Button>
</a>
</div>
<div>
Bagikan Transkrip: <b>{ this.state.bagikanTranskrip }</b>
<br />
Bagikan Transkrip: <b>{ this.state.bagikanTranskrip ? 'Ya' : 'Tidak'}</b>
</div>
</Container>
</Segment >
{ this.updateForm(this.props.route.own) }
</div>
);
}
}
import React from 'react';
import { Container } from 'semantic-ui-react';
import Tabs from './components/Tabs';
import Pane from './components/Pane';
import VacancyList from './components/VacancyList';
......@@ -77,17 +78,20 @@ export default class VacancyPage extends React.Component {
);
} else if (this.props.user.role === 'company' || this.props.user.role === 'admin') {
return (
<Pagination
url={`/companies/${this.state.id}/vacancies/`}
child={
<VacancyList
key={1}
user={this.props.user}
userId={this.state.id}
/>
}
error="Anda belum diverifikasi. Harap hubungi admin"
/>
<Container className="vacancies">
<Pagination
key={1}
url={`/companies/${this.state.id}/vacancies/`}
child={
<VacancyList
key={1}
user={this.props.user}
userId={this.state.id}
/>
}
error="Anda belum diverifikasi. Harap hubungi admin"
/>
</Container>
);
}
......
......@@ -316,6 +316,7 @@ describe('VacancyList', () => {
it('fails delete vacancy', () => {
fetchMock.restore();
fetchMock.delete('*', 404);
fetchMock.get('*', response2);
const vacancyList = ReactTestUtils.renderIntoDocument(
<VacancyList userId={1} items={newResponse} user={companyUser} deleteCallback={() => {}} />,
);
......
import React from 'react';
import { Icon, Modal, Button, TextArea, Form } from 'semantic-ui-react';
import { Icon, Modal, Button, TextArea, Form, Message } from 'semantic-ui-react';
import ModalAlert from './../components/ModalAlert';
import Server from './../lib/Server';
......@@ -68,7 +68,15 @@ export default class ApplyModal extends React.Component {
<div className="coverLetter">
<br />
<div className="linkCV">
<a href={this.props.resume} target="_blank" rel="noopener noreferrer"> Klik untuk lihat CV terakhirmu</a>
{ this.props.resume ? (<a href={this.props.resume} target="_blank" rel="noopener noreferrer"> Klik untuk lihat CV terakhirmu</a>)
: (
<Message
error
icon="warning sign"
header="CV Tidak Ditemukan"
content="Anda belum mengunggah CV. Harap ubah profil anda terlebih dahulu pada halaman Profil."
/>)
}
</div>
<br />
<div>
......@@ -82,7 +90,7 @@ export default class ApplyModal extends React.Component {
</Modal.Content>
<Modal.Actions>
<Button loading={this.state.load} color="blue" disabled={!this.props.active} onClick={this.handleApply}>
<Button loading={this.state.load} color="blue" disabled={!this.props.active || this.props.resume == null} onClick={this.handleApply}>
{ this.props.active ? 'Daftar' : 'Sudah Terdaftar' } <Icon name="right chevron" />
</Button>
</Modal.Actions>
......
import React from 'react';
import { Modal, Button } from 'semantic-ui-react';
import { Modal, Button, Icon, Segment } from 'semantic-ui-react';
import Server from './../lib/Server';
import ConfirmationModal from './../components/ConfirmationModal';
import Applicant from './../components/Applicant';
......@@ -21,6 +21,7 @@ export default class ApproveModal extends React.Component {
this.handleOpen = this.handleOpen.bind(this);
this.reject = this.reject.bind(this);
this.accept = this.accept.bind(this);
this.gotoStudentProfile = this.gotoStudentProfile.bind(this);
this.gotoStudentResume = this.gotoStudentResume.bind(this);
this.gotoStudentTranscript = this.gotoStudentTranscript.bind(this);
}
......@@ -69,6 +70,8 @@ export default class ApproveModal extends React.Component {
gotoStudentTranscript = () => this.gotoLink(`/transcript/${this.props.data.id}`);
gotoStudentProfile = () => this.gotoLink(`/mahasiswa/${this.props.data.student.id}`);
accept = () => {
this.modal.open(
'Terima Lamaran?',
......@@ -89,15 +92,25 @@ export default class ApproveModal extends React.Component {
<Modal.Header>Data Lamaran</Modal.Header>
<Modal.Content>
<h4> Cover Letter </h4>
{ 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.gotoStudentResume} href="#" >CV Pelamar </a> : ''}
<br />
{this.props.data.student.show_transcript ? <a onClick={this.gotoStudentTranscript} href="#" >Transkrip Pelamar</a> : ''}
<br />
<Segment>
<p>
{ this.props.data.cover_letter ? this.props.data.cover_letter : 'Kosong' }
</p>
</Segment>
<br />
<div>
<b>
{this.props.data.student.resume ? <a onClick={this.gotoStudentResume} href="#" >CV Pelamar </a> : 'Pelamar tidak memiliki CV'}
<br />
{this.props.data.student.show_transcript ? <a onClick={this.gotoStudentTranscript} href="#" >Transkrip Pelamar</a> : 'Pelamar tidak mengijinkan transktip dilihat'}
<br />
</b>
</div>
</Modal.Content>
<Modal.Actions>
<Button color="facebook" onClick={this.gotoStudentProfile} floated="left" >
<Icon name="user outline" /> Lihat Profil
</Button>
<Button.Group>
<Button disabled={this.props.data.status === Applicant.APPLICATION_STATUS.REJECTED} loading={this.state.rejectLoading} color="red" onClick={this.reject}>Tolak Lamaran</Button>
<Button.Or />
......
......@@ -2,6 +2,7 @@ import React from 'react';
import moment from 'moment';
import { Button, Icon, Item, Grid } from 'semantic-ui-react';
import { Link } from 'react-router';
import Server from '../lib/Server';
const defaultImage = 'http://semantic-ui.com/images/wireframe/image.png';
......@@ -15,8 +16,12 @@ export default class CompanyVacancy extends React.Component {
constructor(props) {
super(props);
/* istanbul ignore next */
moment.locale('id');
this.state = { deleteLoading: false };
this.state = { deleteLoading: false, count: 0, countNew: 0 };
Server.get(`/vacancies/${this.props.data.id}/count/`, false).then((data) => {
this.setState({ count: data.count, countNew: data.count_new });
});
}
getLink = `/buat-lowongan/${this.props.data.id}`;
......@@ -25,12 +30,13 @@ export default class CompanyVacancy extends React.Component {
return (
<Item className="applicantItems">
<Item.Image src={this.props.data.company.logo ? this.props.data.company.logo : defaultImage} size="small" />
<Item.Content>
<Item.Content verticalAlign="middle" style={{ wordWrap: 'break-word', width: '100%' }} >
<Item.Header as="a">{this.props.data.name}</Item.Header>
<Grid.Row>
<Grid.Column floated="left">
<h5> 105 Pendaftar </h5>
Ditutup {moment(moment(this.props.data.close_time)).fromNow()}
<p>{ this.state.count } Pendaftar<br/>
{ this.state.countNew } Pendaftar Baru<br/><br/>
Ditutup {moment(moment(this.props.data.close_time)).fromNow()}</p>
</Grid.Column>
<Grid.Column floated="right">
{this.props.data.verified ?
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment