|
|
<!DOCTYPE html> |
|
|
<html> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<title>Team Registration - JSON Editor</title> |
|
|
|
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/spectre.css@latest/dist/spectre.min.css"> |
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/spectre.css@latest/dist/spectre-exp.min.css"> |
|
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css"> |
|
|
|
|
|
|
|
|
<style> |
|
|
body { font-family: Arial, sans-serif; padding: 20px; } |
|
|
#editor_holder { margin-bottom: 20px; } |
|
|
.btn-group-custom { |
|
|
display: flex; |
|
|
justify-content: center; |
|
|
gap: 1rem; |
|
|
margin-top: 3rem; |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
<h1>Team Registration Form</h1> |
|
|
<div id="editor_holder"></div> |
|
|
<div class="btn-group btn-group-custom "> |
|
|
<button id="submit" class="btn btn-primary">Submit</button> |
|
|
<button id="cancel" class="btn btn-error">Cancel</button> |
|
|
</div> |
|
|
<script src="https://cdn.jsdelivr.net/npm/@json-editor/json-editor@latest/dist/jsoneditor.min.js"></script> |
|
|
</body> |
|
|
|
|
|
<script> |
|
|
const schema = { |
|
|
"title": `All the information you provide in the form must be accurate; otherwise, your registration will be rejected. If you are a student participant, please check the "Is Student" box and fill in the relevant information.`, |
|
|
"type": "object", |
|
|
"definitions": { |
|
|
"student": { |
|
|
"type": "object", |
|
|
"id": "student", |
|
|
"properties": { |
|
|
"majar": { |
|
|
"type": "string", |
|
|
"title": "Majar", |
|
|
"minLength": 1, |
|
|
}, |
|
|
"degree": { |
|
|
"type": "string", |
|
|
"title": "Degree", |
|
|
"enum": ["Bachelor", "Master", "PhD"] |
|
|
}, |
|
|
"advising_professor": { |
|
|
"type": "string", |
|
|
"title": "Advising Professo", |
|
|
"minLength": 1, |
|
|
}, |
|
|
"grade": { |
|
|
"type": "string", |
|
|
"title": "Grade", |
|
|
"minLength": 1, |
|
|
}, |
|
|
"expected_graduation_year": { |
|
|
"type": "string", |
|
|
"title": "Expected Graduation Year", |
|
|
"minLength": 1, |
|
|
} |
|
|
} |
|
|
} |
|
|
}, |
|
|
"properties": { |
|
|
"team_name": { |
|
|
"type": "string", |
|
|
"title": "Team Name", |
|
|
"minLength": 1, |
|
|
}, |
|
|
"team_members": { |
|
|
"type": "array", |
|
|
"title": "Team Members", |
|
|
"minItems": 1, |
|
|
"maxItems": 12, |
|
|
"format": "tabs", |
|
|
"items": { |
|
|
"type": "object", |
|
|
"title": "Member", |
|
|
"properties": { |
|
|
"name": { |
|
|
"type": "string", |
|
|
"title": "Name", |
|
|
"minLength": 1 |
|
|
}, |
|
|
"email": { |
|
|
"type": "string", |
|
|
"title": "Email", |
|
|
"format": "email", |
|
|
"minLength": 1 |
|
|
}, |
|
|
"institution": { |
|
|
"type": "string", |
|
|
"title": "Institution", |
|
|
"minLength": 1 |
|
|
}, |
|
|
"student_info": { |
|
|
"title": "Is Student", |
|
|
"oneOf": [ |
|
|
{ |
|
|
"title": "no", |
|
|
"type": "null" |
|
|
}, |
|
|
{ |
|
|
"title": "yes", |
|
|
"$ref": "#/definitions/student" |
|
|
} |
|
|
] |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
const editor = new JSONEditor(document.getElementById('editor_holder'), { |
|
|
schema: schema, |
|
|
theme: 'spectre', |
|
|
iconlib: 'fontawesome5', |
|
|
disable_array_delete_all_rows: true, |
|
|
disable_array_delete_last_row: true, |
|
|
disable_collapse: true, |
|
|
disable_edit_json: true, |
|
|
disable_properties: true, |
|
|
disable_array_reorder: true, |
|
|
prompt_before_delete: false, |
|
|
required_by_default: true, |
|
|
array_controls_top: true, |
|
|
remove_button_labels: true, |
|
|
show_errors: "change", |
|
|
}); |
|
|
|
|
|
submitButton = document.getElementById('submit'); |
|
|
cancelButton = document.getElementById('cancel'); |
|
|
|
|
|
submitButton.addEventListener('click', () => { |
|
|
const errors = editor.validate(); |
|
|
editor.showValidationErrors(errors); |
|
|
if (errors.length > 0) { |
|
|
return; |
|
|
} |
|
|
const regsiterData = editor.getValue(); |
|
|
regsiterData.team_members = regsiterData.team_members.map(member => { |
|
|
return { |
|
|
name: member.name, |
|
|
email: member.email, |
|
|
institution: member.institution, |
|
|
is_student: member.student_info !== null, |
|
|
...member.student_info |
|
|
}; |
|
|
}); |
|
|
|
|
|
submitButton.textContent = "Submitting..."; |
|
|
submitButton.classList.add('disabled'); |
|
|
cancelButton.classList.add('disabled'); |
|
|
fetch('/register', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(regsiterData) }) |
|
|
.then(response => { |
|
|
if (response.status !== 200) { |
|
|
throw new Error('Network response was not ok'); |
|
|
} |
|
|
return response.json(); |
|
|
}) |
|
|
.then(data => { |
|
|
if (data.success) { |
|
|
window.location.href = "/" |
|
|
} else { |
|
|
alert("Registration failed: " + data.response); |
|
|
} |
|
|
}) |
|
|
.finally(() => { |
|
|
setTimeout(() => { |
|
|
submitButton.textContent = "Submit"; |
|
|
submitButton.classList.remove('disabled'); |
|
|
cancelButton.classList.remove('disabled'); |
|
|
}, 2000); |
|
|
}) |
|
|
}); |
|
|
cancelButton.addEventListener('click', () => { |
|
|
window.location.href = "/"; |
|
|
}); |
|
|
</script> |
|
|
</html> |
|
|
|