You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
565 lines
20 KiB
565 lines
20 KiB
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Skyonn Admin 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;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<h2>Skyonn Admin Portal</h2>
|
|
|
|
<div id="login-form">
|
|
<form id="loginForm" action="{% url 'admin_login' %}" method="post" enctype="multipart/form-data">
|
|
{% csrf_token %}
|
|
<div class="input-group">
|
|
<input type="text" id="PhoneField" placeholder="Phone" name="phone" >
|
|
</div>
|
|
<div class="input-group">
|
|
<input type="password" id="passwordField" placeholder="Password" name="password" >
|
|
</div>
|
|
<button type="button" id="submitButton" onclick="adminLogin()">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 id="signupForm" method="post" action="{% url 'create_admin' %}" 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="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="button" value="Create Account" onclick="saveAdmin()">
|
|
</form>
|
|
|
|
<div class="toggle-form">
|
|
<p>Already have an account? <a href="#" onclick="toggleForms('login-form')">Login</a></p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
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);
|
|
});
|
|
}
|
|
});
|
|
|
|
// Handle form submission (already implemented in your code)
|
|
window.adminLogin = 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);
|
|
});
|
|
}
|
|
});
|
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
document.addEventListener('change', function () {
|
|
|
|
const form = document.getElementById('signupForm');
|
|
|
|
const phoneNumberInput1 = document.getElementById('phone');
|
|
const emailInput1 = document.getElementById('company_email');
|
|
const phoneNumberInput2 = document.getElementById('phone_2');
|
|
const emailInput2 = document.getElementById('personal_email');
|
|
|
|
if(!phoneNumberInput1 || !emailInput1 || !phoneNumberInput2 || !emailInput2) { return;}
|
|
|
|
const phonePattern = /^[6-9]\d{9}$/;
|
|
const emailPattern = /^[^\s@]+@[^\s@]+\.[a-zA-Z]{2,}$/;
|
|
const emailPattern2 = /^[^\s@]{1,64}@([^\s@_]+\.)+[a-zA-Z]{2,}$/;
|
|
|
|
const validateField = (field) => {
|
|
if (!field.value.trim()) {
|
|
field.style.borderColor = '';
|
|
field.setCustomValidity('Please fill out this field.');
|
|
field.reportValidity();
|
|
return false;
|
|
} else {
|
|
field.style.borderColor = 'black';
|
|
field.setCustomValidity('');
|
|
return true;
|
|
}
|
|
};
|
|
|
|
const clearValidation = (field) => {
|
|
field.setCustomValidity('');
|
|
field.style.borderColor = '';
|
|
};
|
|
|
|
emailInput1.addEventListener('input', () => {
|
|
clearValidation(emailInput1);
|
|
});
|
|
|
|
phoneNumberInput1.addEventListener('input', () => {
|
|
clearValidation(phoneNumberInput1);
|
|
});
|
|
|
|
emailInput2.addEventListener('input', () => {
|
|
clearValidation(emailInput2);
|
|
});
|
|
|
|
phoneNumberInput2.addEventListener('input', () => {
|
|
clearValidation(phoneNumberInput2);
|
|
});
|
|
|
|
emailInput1.addEventListener('blur', () => {
|
|
if (emailInput1.value.trim() && (!emailInput1.value.match(/^[^\s@]+@[^\s@]+\.[a-zA-Z]{2,}$/) || emailInput1.value.includes('..') || !emailInput1.value.match(/^[^\s@]{1,64}@([^\s@_]+\.)+[a-zA-Z]{2,}$/))) {
|
|
emailInput1.style.borderColor = '';
|
|
emailInput1.setCustomValidity('Please enter a valid Email address');
|
|
emailInput1.reportValidity();
|
|
return;
|
|
} else {
|
|
clearValidation(emailInput1);
|
|
if (emailInput1.value.trim()) {
|
|
checkFieldExists('company_email', emailInput1);
|
|
}
|
|
}
|
|
});
|
|
|
|
phoneNumberInput1.addEventListener('blur', () => {
|
|
if (phoneNumberInput1.value.trim() && !phoneNumberInput1.value.match(/^[6-9]\d{9}$/)) {
|
|
phoneNumberInput1.style.borderColor = '';
|
|
phoneNumberInput1.setCustomValidity('Please enter a valid Phonenumber.');
|
|
phoneNumberInput1.reportValidity();
|
|
return;
|
|
} else {
|
|
clearValidation(phoneNumberInput1);
|
|
if (phoneNumberInput1.value.trim()) {
|
|
checkFieldExists('phone', phoneNumberInput1);
|
|
}
|
|
}
|
|
});
|
|
|
|
emailInput2.addEventListener('blur', () => {
|
|
if (emailInput2.value.trim() && (!emailInput2.value.match(/^[^\s@]+@[^\s@]+\.[a-zA-Z]{2,}$/) || emailInput2.value.includes('..') || !emailInput2.value.match(/^[^\s@]{1,64}@([^\s@_]+\.)+[a-zA-Z]{2,}$/))) {
|
|
emailInput2.style.borderColor = '';
|
|
emailInput2.setCustomValidity('Please enter a valid Email address');
|
|
emailInput2.reportValidity();
|
|
return;
|
|
} else {
|
|
clearValidation(emailInput2);
|
|
if (emailInput2.value.trim()) {
|
|
checkFieldExists('personal_email', emailInput2);
|
|
}
|
|
}
|
|
});
|
|
|
|
phoneNumberInput2.addEventListener('blur', () => {
|
|
if (phoneNumberInput2.value.trim() && !phoneNumberInput2.value.match(/^[6-9]\d{9}$/)) {
|
|
phoneNumberInput2.style.borderColor = '';
|
|
phoneNumberInput2.setCustomValidity('Please enter a valid Phonenumber.');
|
|
phoneNumberInput2.reportValidity();
|
|
return;
|
|
} else {
|
|
clearValidation(phoneNumberInput2);
|
|
if (phoneNumberInput2.value.trim()) {
|
|
checkFieldExists('phone_2', phoneNumberInput2);
|
|
}
|
|
}
|
|
});
|
|
|
|
function checkFieldExists(fieldName, field) {
|
|
const value = field.value.trim();
|
|
fetch(`/skyonnadmin/validate_admin/?${fieldName}=${value}`)
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.exists) {
|
|
if(fieldName == 'phone' || fieldName == 'phone_2') {
|
|
field.setCustomValidity('Phone number already exists.');
|
|
}
|
|
else {
|
|
field.setCustomValidity('Email already exists.');
|
|
}
|
|
field.style.borderColor = 'red';
|
|
field.reportValidity();
|
|
field.focus();
|
|
} else {
|
|
clearValidation(field);
|
|
}
|
|
})
|
|
.catch(error => console.error('Error:', error));
|
|
};
|
|
});
|
|
});
|
|
|
|
window.saveAdmin = async function() {
|
|
const form = document.getElementById('signupForm');
|
|
const requiredFields = [
|
|
'first_name', 'last_name', 'phone', 'phone_2', 'company_email', 'personal_email', 'address', 'work_location',
|
|
'picture','password'];
|
|
|
|
|
|
const phoneNumberInput1 = document.getElementById('phone');
|
|
const emailInput1 = document.getElementById('company_email');
|
|
const phoneNumberInput2 = document.getElementById('phone_2');
|
|
const emailInput2 = document.getElementById('personal_email');
|
|
|
|
let isValid = true;
|
|
|
|
requiredFields.forEach(id => {
|
|
const field = document.getElementById(id);
|
|
if (field) {
|
|
field.setCustomValidity(''); // Clear previous validation message
|
|
field.style.borderColor = ''; // Reset border color
|
|
}
|
|
});
|
|
|
|
for (let id of requiredFields) {
|
|
const field = document.getElementById(id);
|
|
if (id !== 'picture' && field.value.trim() === '') {
|
|
isValid = false;
|
|
field.setCustomValidity('Please fill out this field.');
|
|
field.reportValidity();
|
|
}
|
|
if(id === 'picture' && field.files.length === 0) {
|
|
isValid = false;
|
|
field.setCustomValidity('Please upload a image');
|
|
field.reportValidity();
|
|
}
|
|
}
|
|
|
|
const validateEmail = (emailInput) => {
|
|
if (emailInput.value.trim() && (!emailInput.value.match(/^[^\s@]+@[^\s@]+\.[a-zA-Z]{2,}$/) || emailInput.value.includes('..') || !emailInput.value.match(/^[^\s@]{1,64}@([^\s@_]+\.)+[a-zA-Z]{2,}$/))) {
|
|
isValid = false;
|
|
emailInput.style.borderColor = '';
|
|
emailInput.setCustomValidity('Please enter a valid Email address');
|
|
emailInput.reportValidity();
|
|
}
|
|
else {
|
|
emailInput.setCustomValidity('');
|
|
emailInput.style.borderColor = '';
|
|
}
|
|
}
|
|
|
|
|
|
const checkValidity = (field,pattern,errorMsg) =>{
|
|
if (field.value.trim() && !field.value.match(pattern)) {
|
|
field.setCustomValidity(errorMsg);
|
|
field.reportValidity();
|
|
isValid=false;
|
|
}
|
|
else {
|
|
field.setCustomValidity('');
|
|
field.style.borderColor = '';
|
|
}
|
|
};
|
|
|
|
checkValidity(phoneNumberInput1, /^[6-9]\d{9}$/, 'Please enter a valid Phonenumber.');
|
|
|
|
validateEmail(emailInput1);
|
|
|
|
if (phoneNumberInput2.value.trim()) {
|
|
checkValidity(phoneNumberInput2, /^[6-9]\d{9}$/, 'Please enter a valid Phonenumber.');
|
|
}
|
|
|
|
if (emailInput2.value.trim()) {
|
|
validateEmail(emailInput2);
|
|
}
|
|
|
|
|
|
const checkFieldExists = (fieldName, field) => {
|
|
return new Promise((resolve, reject) => {
|
|
const value = field.value.trim();
|
|
fetch(`/skyonnadmin/validate_admin/?${fieldName}=${value}`)
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.exists) {
|
|
if (fieldName === 'phone' || fieldName === 'phone_2') {
|
|
field.setCustomValidity('Phone number already exists.');
|
|
} else {
|
|
field.setCustomValidity('Email already exists.');
|
|
}
|
|
field.style.borderColor = 'red';
|
|
field.reportValidity();
|
|
resolve(false); //Invalid
|
|
} else {
|
|
field.setCustomValidity('');
|
|
field.style.borderColor = '';
|
|
resolve(true); // Valid
|
|
}
|
|
})
|
|
.catch(error => {
|
|
console.error('Error:', error);
|
|
reject(error);
|
|
});
|
|
});
|
|
}
|
|
|
|
if (isValid) {
|
|
const phoneNo1Valid = await checkFieldExists('phone', phoneNumberInput1);
|
|
const phoneNo2Valid = await checkFieldExists('phone_2', phoneNumberInput2);
|
|
const email1Valid = await checkFieldExists('company_email', emailInput1);
|
|
const email2Valid = await checkFieldExists('personal_email', emailInput2);
|
|
|
|
isValid = phoneNo1Valid && email1Valid && phoneNo2Valid && email2Valid;
|
|
|
|
console.log(phoneNo1Valid, email1Valid, phoneNo2Valid, email2Valid, isValid);
|
|
}
|
|
|
|
|
|
if (!isValid) {
|
|
console.log("Validation failed. Please fill out the required fields.");
|
|
return;
|
|
}
|
|
|
|
// Proceed with saving data if all fields are valid
|
|
const formData = new FormData(form);
|
|
const url = form.getAttribute('action');
|
|
|
|
console.log("Submitting form to:", url);
|
|
console.log("Form data:", [...formData.entries()]); // Log the form data
|
|
|
|
|
|
fetch(url, {
|
|
method: 'POST',
|
|
body: formData,
|
|
headers: {
|
|
'X-CSRFToken': '{{ csrf_token }}', // Assuming you have CSRF token available
|
|
},
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
console.log('Success:', data);
|
|
form.reset();
|
|
window.location.href = data.redirect_url;
|
|
})
|
|
.catch(error => {
|
|
console.error('Error:', error);
|
|
alert('Error: ' + error.message);
|
|
})
|
|
}
|
|
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|