diff --git a/assets/css/custom.css b/assets/css/custom.css index 952d5128d9259ef649fe13edb3b581de2d62b2f8..55678587b83b02673ef5315a03ad52b53da1b3ae 100755 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -175,3 +175,47 @@ card .formRegis{ color: black; } +.biodata h5{ + line-height: 30%; +} + +.biodata-company h4{ + color: grey; +} + +.button-profile{ + margin-top:30px; +} + +.ui.segment.profile-form{ + padding-bottom: 37px; + margin-top:4%; +} + +.profilePage{ + margin-bottom:40px; + margin-left:5%; + margin-right:5%; +} + +.ui.segment.segment-profile-company{ + margin-left: 10%; + margin-right: 10%; + padding: 5%; +} + +.ui.segment.profile-form-company{ + margin-top:4%; + margin-left: 10%; + margin-right: 10%; + padding-bottom:3%; +} + +.company-profile{ + padding-bottom:5%; +} + +.ui.segment.vacancyList-company{ + margin-left: 10%; + margin-right: 10%; +} diff --git a/assets/js/ProfilePage.jsx b/assets/js/ProfilePage.jsx index b3ce4d416861c7d80abfa88e46c7129e8e7164cb..383877d05ccf8eda8e6c63e594895ba0bfe85b38 100644 --- a/assets/js/ProfilePage.jsx +++ b/assets/js/ProfilePage.jsx @@ -1,6 +1,7 @@ import React from 'react'; import { Segment, Image, Header, Icon, Checkbox, Container, Button, Form } from 'semantic-ui-react'; import Server from './lib/Server'; +import ModalAlert from './components/ModalAlert'; export default class ProfilePage extends React.Component { @@ -23,81 +24,90 @@ export default class ProfilePage extends React.Component { cityOfBirth: '', dateOfBirth: '', resume: '', - phone: '', - showTranscript: '', + phone_number: '', + show_transcript: '', + photo: '', form: { picture: '', name: '', - phone: '', + phone_number: '', resume: '', - showTranscript: '', + show_transcript: '', }, + needRefresh: 0, + bagikanTranskrip: '', }; 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.refresh = this.refresh.bind(this); this.getProfile(); } getProfile() { - if (this.props.route.own) { - // check api format in /api#!/login - this.state = { - id: this.props.user.data.student.id, - npm: this.props.user.data.student.npm, - name: this.props.user.data.student.name, - major: this.props.user.data.student.major, - batch: this.props.user.data.student.batch, - email: this.props.user.data.student.user.email, - cityOfBirth: this.props.user.data.student.birth_place, - dateOfBirth: this.props.user.data.student.birth_date, - resume: this.props.user.data.student.resume, - phone: this.props.user.data.student.phone_number, - showTranscript: this.props.user.data.student.show_transcript, - form: { - picture: '', - name: '', - phone: '', - resume: '', - showTranscript: '', - }, - }; - return Promise.resolve(this.state); - } else { - return Server.get(`/students/${this.props.params.id}/`).then((data) => { - this.setState({ - id: data.id, - name: data.name, - npm: data.npm, - resume: data.resume, - major: data.major, - batch: data.batch, - email: data.user.email, - cityOfBirth: data.birth_place, - dateOfBirth: data.birth_date, - phone: data.phone_number, - showTranscript: data.show_transcript, - }); - }, error => error.then(() => { + const id = this.props.route.own ? this.props.user.data.student.id : this.props.params.id; + return Server.get(`/students/${id}/`).then((data) => { + this.setState({ + id: data.id, + name: data.name, + npm: data.npm, + resume: data.resume, + major: data.major, + batch: data.batch, + email: data.user.email, + cityOfBirth: data.birth_place, + dateOfBirth: data.birth_date, + phone_number: data.phone_number, + photo: data.photo, + show_transcript: data.show_transcript, + bagikanTranskrip: (data.show_transcript ? 'Ya' : 'Tidak'), + }); + }, error => error.then(() => { // this.modalAlert.open('Gagal Mengambil ', r.error); - this.state.name = 'Gagal mendapatkan informasi'; - })); - } + this.state.name = 'Gagal mendapatkan informasi'; + })); + } + + handleSubmit = (e) => { + e.preventDefault(); + + const submitForm = {}; + console.log(this.state.form); + Object.keys(this.state.form).forEach((key) => { + if (this.state.form[key] !== '') { + submitForm[key] = this.state.form[key]; + } + }); + console.log(submitForm); + Server.submit(`/profiles/students/${this.state.id}/`, submitForm, 'PATCH').then(() => { + this.modalAlert.open('Profil berhasil diperbaharui', 'Silakan periksa kembali profil anda', this.refresh ); + }, error => error.then((r) => { + this.modalAlert.open('Pembaharuan profil gagal', r.error); + })); + }; + + refresh = () => { + this.setState({ needRefresh: (this.state.needRefresh + 1) }); + } + + handleFile = (e) => { + const form = this.state.form; + form[e.target.name] = e.target.files[0]; + this.setState({ form }); } handleChange = (e) => { - console.log(e.target.name); const form = this.state.form; form[e.target.name] = e.target.value; this.setState({ form }); - console.log(this.state.form); }; handleCheckbox = (e, d) => { const form = this.state.form; form[d.name] = d.checked; - this.setState({ form }); - console.log(this.state.form); + this.setState({ form, show_transcript: d.checked }); }; updateForm(show) { @@ -110,28 +120,30 @@ export default class ProfilePage extends React.Component { Edit Profile Page </Header.Content> </Header> + <ModalAlert ref={(modal) => { this.modalAlert = modal; }} /> <Form size="small" onSubmit={this.handleSubmit}> <Form.Field> <label htmlFor="photo">Profile Picture</label> - <input onChange={this.handleChange} placeholder="Profile Photo.jpg" name="photo" type="File" /> + <input onChange={this.handleFile} placeholder="Profile Photo.jpg" name="photo" type="File" /> </Form.Field> <Form.Field> <label htmlFor="email">Email</label> <input onChange={this.handleChange} placeholder="jojon@email.com" name="email" /> </Form.Field> <Form.Field> - <label htmlFor="phone">No. Hp</label> - <input onChange={this.handleChange} placeholder="08123456789" name="phone" /> + <label htmlFor="phone_number">No. Hp</label> + <input onChange={this.handleChange} placeholder="08123456789" name="phone_number" /> </Form.Field> <Form.Field> <label htmlFor="resume">Resume</label> - <input onChange={this.handleChange} placeholder="Resume" name="resume" type="File" /> + <input onChange={this.handleFile} placeholder="Resume" name="resume" type="File" /> </Form.Field> <Form.Field> <Checkbox onChange={this.handleCheckbox} + checked={ this.state.show_transcript ? true : false } label="Ijinkan perusahaan tempat saya mendaftar untuk melihat transkrip akademik saya" - name="showTranscript" + name="show_transcript" /> </Form.Field> <Button type="submit" size="small" primary floated="right">Submit</Button> @@ -144,23 +156,29 @@ export default class ProfilePage extends React.Component { } render() { + const defaultPicture = 'http://semantic-ui.com/images/wireframe/square-image.png'; return ( <div className="profilePage"> <Segment className="biodata-section"> <Header as="h2" icon textAlign="center"> - <Image src="http://semantic-ui.com/images/wireframe/square-image.png" size="small" shape="circular" /> + <Image src={this.state.photo ? this.state.photo : defaultPicture} size="small" shape="circular" /> </Header> <Container textAlign="center" className="profile-biodata"> <div className="biodata"> <h3> { this.state.name } </h3> <h5> { this.state.major }, { this.state.batch } </h5> <h5> { this.state.email } </h5> - <h5> { this.state.phone } </h5> + <h5> { this.state.phone_number } </h5> <h5> { this.state.cityOfBirth}, { this.state.dateOfBirth } </h5> </div> <div className="button-profile"> - <Button primary size="small">Resume</Button> - { this.state.showTranscript ? <Button primary size="small">Transkrip</Button> : <div /> } + <a href={this.state.resume ? this.state.resume : '#'} ><Button primary size="small">Resume</Button></a> + { this.state.show_transcript && (this.state.needRefresh > 0) && + <Button primary size="small">Transkrip</Button> + } + </div> + <div> + Bagikan Transkrip: <b>{ this.state.bagikanTranskrip }</b> </div> </Container> </Segment > diff --git a/assets/js/components/VacancyList.jsx b/assets/js/components/VacancyList.jsx index fdd6237514cfdc07dd25448da9b54f9cdda93265..e6fdad2ae3ff05387549b60a7e5cd3c7e1ac9714 100644 --- a/assets/js/components/VacancyList.jsx +++ b/assets/js/components/VacancyList.jsx @@ -105,7 +105,7 @@ export default class VacancyList extends React.Component { } render = () => ( - <Segment> + <Segment padded className="vacancyList-company"> <ModalAlert ref={(modal) => { this.modalAlert = modal; }} /> <Grid container columns="eleven" doubling> { this.companyHeader() } diff --git a/assets/js/lib/Server.jsx b/assets/js/lib/Server.jsx index 030bba1c45f3698def46a04d7d0534b882cab53f..6100dcc427252b020d105807c8d3265ba5d72c0b 100644 --- a/assets/js/lib/Server.jsx +++ b/assets/js/lib/Server.jsx @@ -19,14 +19,15 @@ export default class Server { static submit(path, data, method = 'POST', useCache = false) { const form = new FormData(); - Object.keys(data).map(k => form.append(k, data[k])); + Object.keys(data).map(k => { + form.append(k, data[k]); + }); const requestData = { - 'X-CSRFToken': Server.getCookie('csrftoken'), - mode: 'no-cors', - method: 'POST', + headers: { 'X-CSRFToken': Server.getCookie('csrftoken') }, body: form, credentials: 'same-origin', + method, }; return this.handleFetchRequest(requestData, path, useCache);