Skip to content

Commit

Permalink
can upload and view resume
Browse files Browse the repository at this point in the history
  • Loading branch information
kyleqhua committed May 15, 2020
1 parent ebb2a2a commit bce6ca9
Show file tree
Hide file tree
Showing 11 changed files with 229 additions and 82 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,4 @@ yarn-debug.log*
/config/database.yml

# Ignore vscode settings
.vscode/
.vscode/
2 changes: 1 addition & 1 deletion .ruby-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
ruby-2.5.6
ruby-2.6.3
110 changes: 58 additions & 52 deletions app/controllers/api/professional_questionnaires_controller.rb
Original file line number Diff line number Diff line change
@@ -1,60 +1,66 @@
class Api::ProfessionalQuestionnairesController < ApplicationController
before_action :set_questionnaire, only: [:update, :destroy]
respond_to :json

def create
@questionnaire = ProfessionalQuestionnaire.new(questionnaire_params)
authorize @questionnaire, policy_class: QuestionnairePolicy
sentry_helper(@questionnaire)
if @questionnaire.save
render json: @questionnaire, status: :created
else
Raven.capture_message("Could not create professional questionnaire")
render json: { error: 'Could not create professional questionnaire' }
end
end

def update
authorize @questionnaire, policy_class: QuestionnairePolicy
if @questionnaire.update(questionnaire_params)
render json: @questionnaire, status: :ok
else
Raven.capture_message("Could not update professional questionnaire")
render json: { error: 'Could not update professional questionnaire' }, status: :unprocessable_entity
end
before_action :set_questionnaire, only: [:update, :destroy]
respond_to :json

def create
@questionnaire = ProfessionalQuestionnaire.new(questionnaire_params)
authorize @questionnaire, policy_class: QuestionnairePolicy
sentry_helper(@questionnaire)
if @questionnaire.save
render json: @questionnaire, status: :created
else
Raven.capture_message("Could not create professional questionnaire")
render json: { error: 'Could not create professional questionnaire' }
end

def destroy
authorize @questionnaire, policy_class: QuestionnairePolicy
if @questionnaire.destroy
render json: @questionnaire, status: :ok
else
Raven.capture_message("Failed to delete professional questionnaire")
render json: { error: 'Failed to delete professional questionnaire' }, status: :unprocessable_entity
end

def update
authorize @questionnaire, policy_class: QuestionnairePolicy
if !questionnaire_params.nil? && questionnaire_params.fetch(:resume).present? && !(questionnaire_params.fetch(:resume).eql?("null"))
if @questionnaire.resume.attached?
@questionnaire.resume.purge
end
@questionnaire.resume.attach(questionnaire_params.fetch(:resume))
end

private
def set_questionnaire
@questionnaire = authorize ProfessionalQuestionnaire.find(params[:id]), policy_class: QuestionnairePolicy
rescue ActiveRecord::RecordNotFound => exception
Raven.extra_context(professional_questionnaire_id: params[:id])
Raven.capture_exception(exception)
render json: { error: 'Could not find professional questionnaire' }, status: :not_found

if @questionnaire.update!(questionnaire_params.except(:resume))
render json: @questionnaire, status: :ok
else
Raven.capture_message("Could not update professional questionnaire")
render json: { error: 'Could not update professional questionnaire' }, status: :unprocessable_entity
end
end

def sentry_helper(professional_questionnaire)
Raven.extra_context(professional_questionnaire: professional_questionnaire.attributes)
Raven.extra_context(participant: professional_questionnaire.participant.user.attributes)
end

# may not work
def questionnaire_params
questionnaire_params = params.require(:professional_questionnaire).permit(:participant_id, :course_completion,
:work_history, :job_search_materials, :professional_goals,
:barriers, :education_history, :begin_skills_assessment_date, :end_skills_assessment_date,
:assigned_mentor, :success_strategies)
def destroy
authorize @questionnaire, policy_class: QuestionnairePolicy
if @questionnaire.destroy
render json: @questionnaire, status: :ok
else
Raven.capture_message("Failed to delete professional questionnaire")
render json: { error: 'Failed to delete professional questionnaire' }, status: :unprocessable_entity
end

end


private
def set_questionnaire
@questionnaire = authorize ProfessionalQuestionnaire.find(params[:id]), policy_class: QuestionnairePolicy
rescue ActiveRecord::RecordNotFound => exception
Raven.extra_context(professional_questionnaire_id: params[:id])
Raven.capture_exception(exception)
render json: { error: 'Could not find professional questionnaire' }, status: :not_found
end

def sentry_helper(professional_questionnaire)
Raven.extra_context(professional_questionnaire: professional_questionnaire.attributes)
Raven.extra_context(participant: professional_questionnaire.participant.user.attributes)
end

# may not work
def questionnaire_params
questionnaire_params = params.require(:professional_questionnaire).permit(:participant_id, :course_completion,
:work_history, :job_search_materials, :professional_goals,
:barriers, :education_history, :begin_skills_assessment_date, :end_skills_assessment_date,
:assigned_mentor, :success_strategies, :resume)
end

end
13 changes: 12 additions & 1 deletion app/controllers/participants_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ def show
end
@professional_questionnaire = ProfessionalQuestionnairesSerializer.new(professional_q)

@resumeURL = nil
if (professional_q.resume.attached?)
@resumeURL = url_for(professional_q.resume)
end

@assignments = authorize @participant.assignments
@assignment_list = []
@assignments.each do |a|
Expand Down Expand Up @@ -54,9 +59,15 @@ def dashboard

def set_participant
@participant = authorize Participant.find(params[:id])
puts @participant.professional_questionnaire
@resumeURL = "https://guides.rubyonrails.org/routing.html"
if @participant.professional_questionnaire.nil? && @participant.professional_questionnaire.resume.attached?
puts url_for(@participant.professional_questionnaire.resume)
@resumeURL = url_for(@participant.professional_questionnaire.resume)
end
rescue ActiveRecord::RecordNotFound => exception
Raven.extra_context(participant_id: params[:id])
Raven.capture_exception(exception)
redirect_to participant_path
end
end
end
17 changes: 16 additions & 1 deletion app/javascript/components/ParticipantShowPage/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,21 @@ class ParticipantShowPage extends React.Component {
professionalQuestionnaire,
studioAssessments,
assignmentList,
resumeURL,
} = this.props;

console.log(userType);
console.log(paperworks);
console.log(participant);
console.log(status);
console.log(participantId);
console.log(personalQuestionnaire);
console.log(professionalQuestionnaire);
console.log(studioAssessments);
console.log(assignmentList);
console.log(resumeURL);


return (
<Grid
container
Expand Down Expand Up @@ -90,6 +103,7 @@ class ParticipantShowPage extends React.Component {
questionnaireType="personal"
participantId={participantId}
questionnaire={personalQuestionnaire}
resumeURL={resumeURL}
/>
</Grid>
<Grid item>
Expand All @@ -98,6 +112,7 @@ class ParticipantShowPage extends React.Component {
questionnaireType="professional"
participantId={participantId}
questionnaire={professionalQuestionnaire}
resumeURL={resumeURL}
/>
</Grid>
</Grid>
Expand Down Expand Up @@ -156,4 +171,4 @@ ParticipantShowPage.propTypes = {
assignmentList: PropTypes.array,
};

export default withStyles(styles)(ParticipantShowPage);
export default withStyles(styles)(ParticipantShowPage);
128 changes: 108 additions & 20 deletions app/javascript/components/QuestionnaireForm/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ import styles from './styles';
class QuestionnaireForm extends React.Component {
constructor(props) {
super(props);
this.state = {};
this.state = {
file: null,
};
this.handleSubmit = this.handleSubmit.bind(this);
}

Expand All @@ -46,28 +48,52 @@ class QuestionnaireForm extends React.Component {
}

handleSubmit() {
const qType = `${this.props.type}_questionnaire`;
const body = {};
if (this.props.type === 'professional') {
const qType = `${this.props.type}_questionnaire`;
const formData = new FormData();

Object.keys(this.state.questionnaire).forEach(f => {
body[f] = this.state.questionnaire[f];
});
body.participant_id = this.props.participantId;
Object.keys(this.state.questionnaire).forEach(f => {
formData.append(`${qType}[${f}]`, this.state.questionnaire[f]);
});
formData.append(`${qType}[resume]`, this.state.file);
formData.append(`${qType}[participant_id]`, this.props.participantId);
const { id } = this.props.questionnaire;
const request = `/api/${qType}s/${id}`;
apiPut(request, formData)
.then(() => window.location.reload())
.catch(error => {
Sentry.configureScope(function (scope) {
scope.setExtra('file', 'QuestionnaireForm');
scope.setExtra('action', 'apiPut');
scope.setExtra('QuestionnaireForm', JSON.stringify(formData));
scope.setExtra('qType', qType);
});
Sentry.captureException(error);
});
} else {
const qType = `${this.props.type}_questionnaire`;
const body = {};

Object.keys(this.state.questionnaire).forEach(f => {
body[f] = this.state.questionnaire[f];
});
body.participant_id = this.props.participantId;

const { id } = this.props.questionnaire;
const request = `/api/${qType}s/${id}`;
const { id } = this.props.questionnaire;
const request = `/api/${qType}s/${id}`;

apiPut(request, { [qType]: body })
.then(() => window.location.reload())
.catch(error => {
Sentry.configureScope(function(scope) {
scope.setExtra('file', 'QuestionnaireForm');
scope.setExtra('action', 'apiPut');
scope.setExtra('QuestionnaireForm', body);
scope.setExtra('qType', qType);
apiPut(request, { [qType]: body })
.then(() => window.location.reload())
.catch(error => {
Sentry.configureScope(function (scope) {
scope.setExtra('file', 'QuestionnaireForm');
scope.setExtra('action', 'apiPut');
scope.setExtra('QuestionnaireForm', body);
scope.setExtra('qType', qType);
});
Sentry.captureException(error);
});
Sentry.captureException(error);
});
}
}

handleTextFormChange(e) {
Expand Down Expand Up @@ -139,6 +165,23 @@ class QuestionnaireForm extends React.Component {
createTextForm(fieldName, fieldValue, contentText) {
// content text is prompt/title for the text box
// field name is the name of the field that will be filled in the database
if (fieldValue === null || fieldValue === 'null') {
return (
<div className={this.props.classes.questionnaireEntry}>
<DialogContentText>{contentText}</DialogContentText>
<TextField
className={`${this.props.classes.dialogContentTextField} ${this.props.classes.questionnaireTextField}`}
onChange={e => this.handleTextFormChange(e)}
variant="outlined"
id={fieldName}
multiline
type="text"
margin="dense"
maxRows={20}
/>
</div>
);
}
if (fieldName === 'DOC_status') {
return (
<div className={this.props.classes.questionnaireEntry}>
Expand Down Expand Up @@ -357,10 +400,55 @@ class QuestionnaireForm extends React.Component {

return this.createTextForm(f, questionnaire[f], sentenceCase);
});
if (this.props.type === 'professional') {
questionnaires.push(this.getFileUpload());
}
if (this.props.type === 'personal') {
questionnaires.push(this.showUploadedFile);
}
return <div className={styles.container}>{questionnaires}</div>;
}
}

getFileUpload() {
return (
<div>
<DialogContentText>Upload Resume</DialogContentText>
{this.showUploadedFile()}
{this.showSelectedFile()}
<input
type="file"
onChange={event => {
this.setState({ file: event.target.files[0] });
}}
/>
</div>
);
}

showUploadedFile() {
if (this.props.resumeURL) {
return (
<Button onClick={() => window.open(this.props.resumeURL, '_blank')}>
View Uploaded Resume
</Button>
);
}
return (<div>No Resume Uploaded</div>);
}

showSelectedFile() {
const { file } = this.state;
if (file) {
const objectURL = window.URL.createObjectURL(file);
return (
<Button onClick={() => window.open(objectURL, '_blank')}>
View Selected File
</Button>
);
}
}

render() {
return (
<>
Expand Down Expand Up @@ -396,4 +484,4 @@ QuestionnaireForm.propTypes = {
handleClose: PropTypes.func,
};

export default withStyles(styles)(QuestionnaireForm);
export default withStyles(styles)(QuestionnaireForm);
Loading

0 comments on commit bce6ca9

Please sign in to comment.