|
|
|
<!DOCTYPE html>
|
|
|
|
<html lang="en">
|
|
|
|
<head>
|
|
|
|
<meta charset="UTF-8">
|
|
|
|
<title>Skyonn Recruiting Portal</title>
|
|
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" integrity="sha512-z3gLpd7yknf1YoNbCzqRKc4qyor8gaKU1qmn+CShxbuBusANI9QpRohGBreCFkKxLhei6S9CQXFEbbKuqLg0DA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
|
|
|
<style>
|
|
|
|
body {
|
|
|
|
font-family: Arial;
|
|
|
|
}
|
|
|
|
|
|
|
|
.container {
|
|
|
|
width: 20rem;
|
|
|
|
margin: auto;
|
|
|
|
border: 1px solid black;
|
|
|
|
padding: 20px;
|
|
|
|
border-radius: 10px;
|
|
|
|
margin-top: 50px;
|
|
|
|
position: relative;
|
|
|
|
}
|
|
|
|
|
|
|
|
.input-group {
|
|
|
|
margin-bottom: 10px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.input-group input[type="text"],
|
|
|
|
.input-group input[type="password"],
|
|
|
|
.input-group input[type="email"],
|
|
|
|
.input-group select {
|
|
|
|
width: calc(100% - 22px);
|
|
|
|
border-radius: 5px;
|
|
|
|
padding: 10px;
|
|
|
|
box-sizing: border-box;
|
|
|
|
display: block;
|
|
|
|
margin-bottom: 5px;
|
|
|
|
font-weight: bold;
|
|
|
|
}
|
|
|
|
|
|
|
|
button {
|
|
|
|
background-color: white;
|
|
|
|
color: black;
|
|
|
|
padding: 5px;
|
|
|
|
border-radius: 5px;
|
|
|
|
margin: 3px 0;
|
|
|
|
width: 100%;
|
|
|
|
font-size: 15px;
|
|
|
|
background-color:#66D3FA;
|
|
|
|
}
|
|
|
|
|
|
|
|
h2 {
|
|
|
|
color: black;
|
|
|
|
text-align: center;
|
|
|
|
margin-top: -5px;
|
|
|
|
margin-bottom: 20px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.toggle-form {
|
|
|
|
text-align: center;
|
|
|
|
margin-top: 20px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.toggle-form a {
|
|
|
|
color: #3C99DC;
|
|
|
|
text-decoration: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
.footer-text {
|
|
|
|
position: absolute;
|
|
|
|
bottom: 0;
|
|
|
|
width: 100%;
|
|
|
|
text-align: center;
|
|
|
|
color: #3C99DC;
|
|
|
|
margin-bottom: 10px;
|
|
|
|
}
|
|
|
|
.eye-icon {
|
|
|
|
position: absolute;
|
|
|
|
right: 50px;
|
|
|
|
top: 48%;
|
|
|
|
transform: translateY(-50%);
|
|
|
|
cursor: pointer;
|
|
|
|
font-size: 15px;
|
|
|
|
color: #999;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div class="container">
|
|
|
|
<h2>Skyonn Recruiting Portal</h2>
|
|
|
|
|
|
|
|
<div id="login-form">
|
|
|
|
<form id="loginForm" action="{% url 'user_login' %}" method="post">
|
|
|
|
{% csrf_token %}
|
|
|
|
<div class="input-group">
|
|
|
|
<input type="text" placeholder="Email" id="PhoneField" name="phone" required>
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<input type="password" placeholder="Password" name="password" id="passwordField" required>
|
|
|
|
<span id="togglePassword" class="eye-icon" style="color:black;"><i class="fa fa-eye"></i></span>
|
|
|
|
</div>
|
|
|
|
<button type="button" id="submitButton" onclick="userLogin()">Login</button>
|
|
|
|
</form>
|
|
|
|
<div class="toggle-form">
|
|
|
|
<p>New user? <a href="#" onclick="toggleForms('signup-form')">Sign Up</a></p>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div id="signup-form" style="display: none;">
|
|
|
|
<form method="post" action="{% url 'create_user' %}" enctype="multipart/form-data">
|
|
|
|
{% csrf_token %}
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="first_name">First Name*:</label>
|
|
|
|
<input type="text" id="first_name" name="first_name" required>
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="last_name">Last Name*:</label>
|
|
|
|
<input type="text" id="last_name" name="last_name" required>
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="phone">Phone no.*:</label>
|
|
|
|
<input type="text" id="phone" name="phone" required>
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="phone_2">Phone no. 2:</label>
|
|
|
|
<input type="text" id="phone_2" name="phone_2">
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="company_email">Company Email*:</label>
|
|
|
|
<input type="email" id="company_email" name="company_email" required>
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="personal_email">Personal Email*:</label>
|
|
|
|
<input type="email" id="personal_email" name="personal_email" required>
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="address">Address*:</label>
|
|
|
|
<input type="text" id="address" name="address" required>
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="work_location">Work Location*:</label>
|
|
|
|
<input type="text" id="work_location" name="work_location" required>
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="role">Role*:</label>
|
|
|
|
<select id="role" name="role" required>
|
|
|
|
<option value="recruiter">Recruiter</option>
|
|
|
|
<option value="manager">Manager</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="password">Password*:</label>
|
|
|
|
<input type="password" id="password" name="password" required>
|
|
|
|
</div>
|
|
|
|
<div class="input-group">
|
|
|
|
<label for="picture">Upload Picture *</label>
|
|
|
|
<input type="file" id="picture" name="picture" accept=".svg, .jpg, .jpeg, .png">
|
|
|
|
</div>
|
|
|
|
<input type="submit" value="Create Account" name="signup-form">
|
|
|
|
</form>
|
|
|
|
|
|
|
|
<div class="toggle-form">
|
|
|
|
<p>Already have an account? <a href="#" onclick="toggleForms('login-form')">Login</a></p>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<script>
|
|
|
|
|
|
|
|
const togglePassword = document.querySelector('#togglePassword');
|
|
|
|
const passwordField = document.querySelector('#password');
|
|
|
|
|
|
|
|
togglePassword.addEventListener('click', function () {
|
|
|
|
const type = passwordField.getAttribute('type') === 'password' ? 'text' : 'password';
|
|
|
|
passwordField.setAttribute('type', type);
|
|
|
|
const icon = this.querySelector('i');
|
|
|
|
icon.classList.toggle('fa-eye');
|
|
|
|
icon.classList.toggle('fa-eye-slash');
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
function toggleForms(formId) {
|
|
|
|
var signupForm = document.getElementById('signup-form');
|
|
|
|
var loginForm = document.getElementById('login-form');
|
|
|
|
|
|
|
|
if (formId === 'signup-form') {
|
|
|
|
signupForm.style.display = 'block';
|
|
|
|
loginForm.style.display = 'none';
|
|
|
|
} else {
|
|
|
|
signupForm.style.display = 'none';
|
|
|
|
loginForm.style.display = 'block';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
|
|
|
|
|
|
const form = document.getElementById('loginForm');
|
|
|
|
const phoneField = document.getElementById('PhoneField');
|
|
|
|
const passwordField = document.getElementById('passwordField');
|
|
|
|
|
|
|
|
const clearValidation = (field) => {
|
|
|
|
field.setCustomValidity('');
|
|
|
|
field.style.borderColor = '';
|
|
|
|
};
|
|
|
|
|
|
|
|
phoneField.addEventListener('input', () => {
|
|
|
|
clearValidation(phoneField);
|
|
|
|
});
|
|
|
|
|
|
|
|
passwordField.addEventListener('input', () => {
|
|
|
|
clearValidation(passwordField);
|
|
|
|
});
|
|
|
|
// Function to perform AJAX validation
|
|
|
|
const validateField = (field, fieldName) => {
|
|
|
|
const formData = new FormData();
|
|
|
|
formData.append(fieldName, field.value.trim());
|
|
|
|
|
|
|
|
fetch(form.action, { // Replace with your actual login URL
|
|
|
|
method: 'POST',
|
|
|
|
body: formData,
|
|
|
|
headers: {
|
|
|
|
'X-CSRFToken': '{{csrf_token}}'
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.then(response => response.json())
|
|
|
|
.then(data => {
|
|
|
|
clearValidation(field); // Clear previous validation
|
|
|
|
if (data.error) {
|
|
|
|
field.setCustomValidity(data.error);
|
|
|
|
field.reportValidity();
|
|
|
|
} else {
|
|
|
|
field.style.borderColor = 'green'; // Show success feedback
|
|
|
|
field.setCustomValidity(''); // Clear any errors
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(error => {
|
|
|
|
console.error('Error:', error);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
// Trigger validation on blur for phone number
|
|
|
|
phoneField.addEventListener('blur', () => {
|
|
|
|
if (phoneField.value.trim()) {
|
|
|
|
validateField(phoneField, 'phone');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger validation on blur for password (only if phone is valid)
|
|
|
|
passwordField.addEventListener('blur', () => {
|
|
|
|
if (phoneField.value.trim() && passwordField.value.trim()) {
|
|
|
|
const formData = new FormData();
|
|
|
|
formData.append('phone', phoneField.value.trim());
|
|
|
|
formData.append('password', passwordField.value.trim());
|
|
|
|
|
|
|
|
fetch(form.action, { // Replace with your actual login URL
|
|
|
|
method: 'POST',
|
|
|
|
body: formData,
|
|
|
|
headers: {
|
|
|
|
'X-CSRFToken': '{{csrf_token}}'
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.then(response => response.json())
|
|
|
|
.then(data => {
|
|
|
|
clearValidation(passwordField); // Clear previous validation
|
|
|
|
if (data.error) {
|
|
|
|
passwordField.setCustomValidity(data.error);
|
|
|
|
passwordField.reportValidity();
|
|
|
|
} else {
|
|
|
|
passwordField.setCustomValidity('');
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(error => {
|
|
|
|
console.error('Error:', error);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
window.userLogin = function() {
|
|
|
|
const form = document.getElementById('loginForm');
|
|
|
|
const formData = new FormData(form);
|
|
|
|
|
|
|
|
fetch(form.action, {
|
|
|
|
method: 'POST',
|
|
|
|
body: formData,
|
|
|
|
headers: {
|
|
|
|
'X-CSRFToken': '{{csrf_token}}'
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.then(response => response.json())
|
|
|
|
.then(data => {
|
|
|
|
if (data.error) {
|
|
|
|
if (data.error.includes('phone number')) {
|
|
|
|
phoneField.setCustomValidity(data.error);
|
|
|
|
phoneField.reportValidity();
|
|
|
|
} else if (data.error.includes('password')) {
|
|
|
|
passwordField.setCustomValidity(data.error);
|
|
|
|
passwordField.reportValidity();
|
|
|
|
}
|
|
|
|
} else if (data.success) {
|
|
|
|
window.location.href = data.redirect_url;
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(error => {
|
|
|
|
console.error('Error:', error);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
</body>
|
|
|
|
</html>
|