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.

4818 lines
182 KiB

10 months ago
<!DOCTYPE html>
2 weeks ago
<html lang="en" xmlns="http://www.w3.org/1999/html">
10 months ago
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/remixicon@2.5.0/fonts/remixicon.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
2 weeks ago
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
10 months ago
<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>
2 weeks ago
#arminta-logo {
display: block; /* Initially visible */
}
10 months ago
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap');
2 weeks ago
:root {
--background-color1: #fafaff;
--background-color2: #ffffff;
--background-color3: #ededed;
--background-color4: #cad7fda4;
--primary-color: #4b49ac;
--secondary-color: #0c007d;
--Border-color: #3f0097;
--one-use-color: #3f0097;
--two-use-color: #5500cb;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Roboto', sans-serif;
}
body {
background-color: #D9D9D9;
font-size: 1.0rem; /* Decrease the base font size */
10 months ago
font-family: 'Roboto', sans-serif;
2 weeks ago
height: 100vh;
display: flex;
flex-direction: column;
10 months ago
}
.header {
height: 60px;
width: 100%;
display: flex;
align-items: center;
2 weeks ago
border-bottom: 1px solid white;
font-size: 1.0rem;
background-color: #ACC7D2;
display: flex;
justify-content: space-between;
align-items: center;
10 months ago
}
2 weeks ago
10 months ago
.search--notification--profile {
display: flex;
align-items: center;
justify-content: space-between;
width: calc(100% - 100px);
padding: 0 40px;
margin-left: -10px;
}
2 weeks ago
.sidebar-link img {
filter: brightness(0) invert(1);
}
10 months ago
.search {
2 weeks ago
background-color: #F1F4F8;
border-radius: 50px;
width: 400px;
10 months ago
padding: 5px;
display: flex;
align-items: center;
justify-content: space-between;
2 weeks ago
margin-left:230px;
10 months ago
}
.search-container {
display: flex;
align-items: center;
border: 1px solid black;
border-radius: 5px;
padding: 0 5px;
}
.search input {
2 weeks ago
background-color: transparent;
10 months ago
outline: none;
border: none;
text-indent: 15px;
2 weeks ago
width: 85%;
10 months ago
}
.search button {
outline: none;
border: none;
2 weeks ago
border-radius: 50%;
background-color: #fff;
padding: 8px;
10 months ago
display: flex;
align-items: center;
justify-content: center;
}
2 weeks ago
10 months ago
.main {
position: relative;
width: 100%;
2 weeks ago
height: calc(100vh - 60px);
overflow-y: auto;
overflow-x: hidden;
10 months ago
}
2 weeks ago
.search button i {
font-size: 1.1rem;
color: #5073FB;
}
/* Sidebar Styling */
10 months ago
.sidebar {
2 weeks ago
position: fixed;
10 months ago
left: 0;
2 weeks ago
height: 100vh;
width: 263.5px; /* Expanded width */
background-color: #054560;
10 months ago
padding: 30px;
2 weeks ago
transition: width 0.3s ease-in-out; /* Smooth transition for width change */
overflow: hidden;
z-index:1000;
transition: all 0.5s ease;}
#sidebar.collapsed {
width: 0; /* Collapsed state */
10 months ago
}
2 weeks ago
10 months ago
.sidebar.active {
2 weeks ago
width: 80px; /* Collapsed width */
10 months ago
}
2 weeks ago
.sidebar--items {
list-style: none;
padding: 0;
}
.sidebar--item {
display: inline-block;
margin-left: 15px;
}
10 months ago
.sidebar.active .sidebar--item {
2 weeks ago
display: none; /* Hide labels when sidebar is collapsed */
}
.icon {
display: inline-block;
width: 30px;
margin-left: -8px; /* Adjust as needed for better positioning */
transition: margin-left 0.3s ease; /
10 months ago
}
2 weeks ago
.sidebar-link {
text-decoration: none;
color: white;
display: flex;
align-items: center;
padding: 10px;
width: 220px; /* Default width */
transition: width 0.3s ease, transform 0.3s ease, background 0.3s ease;
position: relative;
}
.sidebar-link:hover {
width: 280px; /* Expanded width */
background: #009FC1;
transform: translateX(-20px); /* Move left by 20px */
transition: width 0.3s ease, transform 0.3s ease, background 0.3s ease;
}
/* Toggle Menu Icon */
.fa-bars, .fa-ellipsis-vertical {
cursor: pointer;
font-size: 30px;
color: red;
margin-left:100px;
}
10 months ago
li {
list-style: none;
}
a {
text-decoration: none;
}
2 weeks ago
li a span{
margin-left:-7px;
}
10 months ago
.sidebar--items a,
.sidebar--bottom-items a {
display: flex;
align-items: center;
margin-bottom: 10px;
2 weeks ago
font-size: 1.0rem;
color: white;
10 months ago
padding: 10px;
border-radius: 10px;
2 weeks ago
10 months ago
}
.sidebar--items a:hover,
.sidebar--bottom-items a:hover {
2 weeks ago
color: #054560;
background: #ACC7D2;
}
.sidebar--items a.active {
color: #054560; /* Match hover color for active link */
font-weight: bold; /* Optional: Bold font for active link */
background: #ACC7D2;
}
.main::-webkit-scrollbar, .sidebar::-webkit-scrollbar {
width: 10px;
}
.main::-webkit-scrollbar-track, .sidebar::-webkit-scrollbar-track {
background: #f1f1f1;
}
.main::-webkit-scrollbar-thumb, .sidebar::-webkit-scrollbar-thumb {
background: #888;
}
.main::-webkit-scrollbar-thumb:hover, .sidebar::-webkit-scrollbar-thumb:hover {
background: #555;
10 months ago
}
2 weeks ago
10 months ago
#clientDetailsContainer{
body {
font-family: Arial, sans-serif;
}
.container {
width: 45rem;
margin: auto;
padding: 20px;
border-radius: 10px;
2 weeks ago
10 months ago
}
.two-col {
display: flex;
white-space: nowrap;
}
.three-col .col1,
.three-col .col2 {
flex: 0 0 22%;
}
.two-col .form-group {
margin-bottom: 15px;
}
.two-col input,
.two-col select {
width: calc(100% - 50px);
padding: 10px;
border-radius: 10px;
border: 1px solid #ccc;
}
label.required::after {
content: "*";
color: red;
margin-left: 5px;
}
ul {
list-style-type: none;
padding: 0;
margin-bottom: 20px;
margin-left: 300px;
}
li {
float:left;
margin-bottom: 20px;
margin-left: -10px;
}
li a {
display: block;
color: black;
text-align: center;
padding: 1px;
text-decoration: underline;
margin-top: 20px;
margin-left: 60px;
}
a:hover {
color:red;
}
.container1 {
margin-left: 100px;
width: 900px;
}
2 weeks ago
.nav a.active {
color: red; /* Change the color to your desired color */
font-weight: bold; /* Make the font bold, if desired */
/* Add any other styling for the active link */
}
.icon img:hover {
background:#009FC1
}
.fa-ellipsis-vertical {
margin-left:-100px;
color:red;
}
10 months ago
}
2 weeks ago
10 months ago
</style>
<title> Admin Dashboard</title>
</head>
<body>
2 weeks ago
<div class="wrapper" >
10 months ago
<section class="header">
2 weeks ago
{% load static %}
<li>
<a id="menu-icon" class="fa-solid fa-bars" onclick="toggleSidebar()"
style="cursor: pointer; font-size: 25px; color: black; margin-left:40px; margin-top: -100px;"></a>
</li>
<li>
<img id="arminta-logo" src="{% static 'images/Arminta_Logo_1.svg' %}" alt="Logo"
style=" margin-left:20px; margin-bottom:15px;">
</li>
10 months ago
<div class="search--notification--profile">
2 weeks ago
<div class="search">
<input type="text" placeholder="Search">
<button><i class="ri-search-2-line" style="color:#054560"></i></button>
</div>
<h3 style="margin-left:0px;" >Skyonn Technologies</h3>
10 months ago
</div>
2 weeks ago
<div class="bell" style="margin-right: 30px; color:#054560">
<i class="fa-solid fa-bell"></i>
</div>
<div class="profile" style="margin-right: 30px;" >
<div class="profile-content" style="display: flex;align-items: center;">
<div class="profile-picture" style="position: relative; width: 60px; height: 60px;">
{% if picture %}
<img id="profileImage" src="{{picture.url}}" alt="Profile Picture" class="profile-img" style="width: 50px;
height: 50px;border-radius: 50%;object-fit: cover;margin-top: 5px;" data-admin-id="{{ admin_id }}">
{% endif %}
</div>
</div>
10 months ago
</div>
2 weeks ago
<h3 style="margin-right: 40px; color:#054560">{{first_name}}</h3>
<a href="{% url 'admin_logout' %}" style="margin-right: 50px; color: red; font-size: larger; text-decoration: underline;">LogOut</a>
10 months ago
</section>
2 weeks ago
<section class="main" >
<div class="sidebar" id="sidebar" >
<ul class="sidebar--items">
{% load static %}
<li>
<a href="#" class="sidebar-link" onclick="showClientDetails(); activateSidebarLink(this)">
<span class="icon"><img src="{% static 'images/Client Details (3).svg' %}" ></span>
<span class="sidebar--item" style="margin-left:20px">Client Details</span>
</a>
</li>
<li>
<a href="#" class="sidebar-link" onclick="activateLink(this); loadPage('/skyonnadmin/Internal_team_details/','{{admin_id}}'); hideClientDetails(); activateSidebarLink(this)">
<span class="icon"><img src="{% static 'images/Internal team Details (1).svg' %}" ></span>
<span class="sidebar--item" style="margin-left:20px">Internal Team Details</span>
</a>
</li>
10 months ago
<li>
2 weeks ago
<a href="#" class="sidebar-link" onclick="loadPage('//'); hideClientDetails(); activateSidebarLink(this)">
<span class="icon"><img src="{% static 'images/Messages.svg' %}"></span>
<span class="sidebar--item" style="margin-left:20px"> Messages</span>
10 months ago
</a>
</li>
<li>
2 weeks ago
<a href="#" class="sidebar-link" onclick="loadPage('//'); hideClientDetails(); activateSidebarLink(this)">
<span class="icon"><img src="{% static 'images/Pending process.svg' %}"></span>
<span class="sidebar--item" style="margin-left:20px"> Pending Process</span>
10 months ago
</a>
</li>
<li>
2 weeks ago
<a href="#" class="sidebar-link" onclick="loadPage('//'); hideClientDetails(); activateSidebarLink(this)">
<span class="icon"><img src="{% static 'images/submited Resumes.svg' %}"></span>
<span class="sidebar--item" style="margin-left:20px"> Submitted Resumes</span>
10 months ago
</a>
</li>
<li>
2 weeks ago
<a href="#" class="sidebar-link" onclick="loadPage('//'); hideClientDetails(); activateSidebarLink(this)">
<span class="icon"><img src="{% static 'images/Add A New SPOC.svg' %}"></span>
<span class="sidebar--item" style="margin-left:20px"> Add a New SPOC</span>
10 months ago
</a>
</li>
<li>
2 weeks ago
<a href="#" class="sidebar-link" onclick="loadPage('/new_job_postings/'); hideClientDetails(); activateSidebarLink(this)">
<span class="icon"><img src="{% static 'images/Activity Report.svg' %}"></span>
<span class="sidebar--item" style="margin-left:20px"> Activity Report</span>
10 months ago
</a>
</li>
</ul>
</div>
<div id="clientDetailsContainer" style="display: none;">
2 weeks ago
10 months ago
<ul>
2 weeks ago
<h4 style="margin-left:280px; margin-top:10px; text-decoration:underline; color:#054560;">Client Details</h4>
<div class="nav" style="margin-left:-60px;" >
<li><a href="#" class="btn" onclick="activateLink(this); loadPage('/skyonnadmin/add_client/','{{admin_id}}')">Add New Client</a></li>
<li><a href="#" class="btn" onclick="activateLink(this); loadPage('/skyonnadmin/add_subclient/','{{admin_id}}')">Add Sub Clients/Locations</a></li>
<li><a href="#" class="btn" onclick="activateLink(this); loadPage('/skyonnadmin/add_new_contact/','{{admin_id}}')">Add New Contact</a></li>
<li><a href="#" class="btn" onclick="activateLink(this); loadPage('/skyonnadmin/existing_client/','{{admin_id}}')">Existing Client</a></li>
10 months ago
</div>
</ul>
</div>
2 weeks ago
<div id="dynamicContentContainer">
</div>
<div id="AdminDetailsModal" class="modal" style="position: fixed;top: 60px;right: 0;width: 30%;height: 80%;border: 1px black;display: none;background-color: white; border:2px solid black; box-shadow: -2px 0px 5px rgba(0,0,0,0.2);z-index:1000;">
<div class="modal-content" style="padding: 40px;height: 100%;">
<a href="#" onclick="closeModal()" style="font-size: 24px; margin-left: 360px; color:red;">
<i class="fa fa-times"></i>
</a>
<div class="profile-picture-container" style="text-align: center; margin-bottom: 40px;">
<img id="profile_picture" src="{{picture.url}}" alt="Profile Picture" style="width: 150px; margin-top:-50px; height: 150px; border-radius: 50%; object-fit: cover; border: 2px solid #ddd;">
</div>
<div class="data" style="margin-left:1px" >
<p><strong style="color:#054560">FirstName:</strong> <span style="margin-left:50px;" id="first_name"></span></p><br>
<p><strong style="color:#054560">LastName:</strong> <span style="margin-left:50px;" id="last_name"></span></p><br>
<p><strong style="color:#054560">PhoneNo1:</strong> <span style="margin-left:50px;" id="phone"></span></p><br>
<p><strong style="color:#054560">PhoneNo2:</strong> <span style="margin-left:50px;" id="phone_number_2"></span></p><br>
<p><strong style="color:#054560">Company Email:</strong> <span style="margin-left:13px;" id="company_email"></span></p><br>
<p><strong style="color:#054560">Personal Email:</strong> <span style="margin-left:15px;" id="personal_email"></span></p><br>
<p><strong style="color:#054560">Address:</strong> <span style="margin-left:65px;" id="address"></span></p><br>
<p><strong style="color:#054560">Work Location:</strong> <span style="margin-left:22px;" id="work_location"></span></p><br>
</div>
</div>
<script>
10 months ago
2 weeks ago
function changeGST() {
var gstInput = document.getElementById("GSTNo");
var button = document.getElementById("changeButton");
// If input is disabled, enable it to allow editing
if (gstInput.disabled) {
gstInput.disabled = false; // Enable the input
gstInput.focus(); // Set focus on the input field
button.textContent = "Save"; // Change the button text to "Save"
} else {
// If input is enabled, disable it and save the new value
gstInput.disabled = true;
button.textContent = "Change"; // Change the button text back to "Change"
// Handle saving logic here if needed (e.g., sending the updated value to the server)
var updatedGST = gstInput.value;
console.log("Updated GST No:", updatedGST); // You can replace this with actual saving logic
}
}
function searchEmployee() {
var input, filter, table, tr, i, txtValue;
input = document.getElementById("searchInput");
filter = input.value.toUpperCase();
table = document.getElementById("employeeTableBody"); // Use the table body
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
var found = false;
// Check relevant columns (FirstName, LastName, Designation, Department, etc.)
var tds = tr[i].getElementsByTagName("td");
// Check all relevant columns (adjust indexes as necessary)
for (var j = 0; j < tds.length; j++) {
if (tds[j]) {
txtValue = tds[j].textContent || tds[j].innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
found = true;
break; // No need to check further columns if a match is found
}
}
10 months ago
}
2 weeks ago
// Show or hide the row based on search results
tr[i].style.display = found ? "" : "none";
}
10 months ago
}
2 weeks ago
function closeModal() {
const modal = document.getElementById('AdminDetailsModal');
if (modal) {
modal.style.display = 'none';
// Clear all modal data fields
document.getElementById('first_name').innerText = '';
document.getElementById('last_name').innerText = '';
document.getElementById('phone').innerText = '';
document.getElementById('phone_number_2').innerText = '';
document.getElementById('company_email').innerText = '';
document.getElementById('personal_email').innerText = '';
document.getElementById('address').innerText = '';
document.getElementById('work_location').innerText = '';
}
}
10 months ago
2 weeks ago
// Add event listener after DOM content is fully loaded
document.addEventListener('DOMContentLoaded', function() {
// Handle profile image click to load admin details
document.addEventListener('click', function(event) {
if (event.target && event.target.id === 'profileImage') {
const adminId = event.target.dataset.adminId;
const popup = document.getElementById('AdminDetailsModal');
// Toggle popup visibility
if (popup.style.display === 'block') {
closeModal();
return;
10 months ago
}
2 weeks ago
// Fetch admin details via AJAX
let xhr = new XMLHttpRequest();
xhr.open('GET', `/skyonnadmin/get_admin_details/?admin_id=${adminId}`, true);
xhr.onload = function() {
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
const adminDetails = response.admin_data;
showAdminDetails(adminDetails);
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
});
// Close modal when clicking outside of it or on the close button
document.addEventListener('click', function(event) {
const modal = document.getElementById('AdminDetailsModal');
if (modal && modal.style.display === 'block' && !modal.contains(event.target) && event.target.id !== 'profileImage') {
closeModal();
}
}, true);
});
function showAdminDetails(adminDetails) {
const popup = document.getElementById('AdminDetailsModal');
if (popup) {
document.getElementById('first_name').innerText = adminDetails.first_name;
document.getElementById('last_name').innerText = adminDetails.last_name;
document.getElementById('phone').innerText = adminDetails.phone;
document.getElementById('phone_number_2').innerText = adminDetails.phone_number_2;
document.getElementById('company_email').innerText = adminDetails.company_email;
document.getElementById('personal_email').innerText = adminDetails.personal_email;
document.getElementById('address').innerText = adminDetails.address;
document.getElementById('work_location').innerText = adminDetails.work_location;
// Display the popup
popup.style.display = 'block';
10 months ago
}
}
2 weeks ago
function toggleSidebar() {
var sidebar = document.getElementById('sidebar');
var menuIcon = document.getElementById('menu-icon');
if (sidebar && menuIcon) {
// Toggle the sidebar's active state on click
sidebar.classList.toggle('active');
// Toggle between menu bar and cross icons based on sidebar active state
if (sidebar.classList.contains('active')) {
// When the sidebar is active (open), show the cross icon
menuIcon.classList.remove('fa-bars');
menuIcon.classList.add('fa-times'); // Show cross icon
} else {
menuIcon.classList.remove('fa-times');
menuIcon.classList.add('fa-bars');
10 months ago
}
2 weeks ago
} else {
console.error("Sidebar or Menu Icon not found");
10 months ago
}
}
2 weeks ago
// No automatic mouse enter or leave events for sidebar; menu icon is handled only on click
document.addEventListener('DOMContentLoaded', () => {
// Sidebar will only be controlled via the menu icon click
});
var sidebarTimeout;
function handleSidebarMouseEvents() {
var sidebar = document.getElementById('sidebar');
var body = document.querySelector('body');
if (sidebar && body) {
// When mouse enters the sidebar, close it
sidebar.addEventListener('mouseenter', () => {
clearTimeout(sidebarTimeout);
if (sidebar.classList.contains('active')) {
sidebar.classList.remove('active');
}
});
sidebar.addEventListener('mouseleave', () => {
clearTimeout(sidebarTimeout);
sidebarTimeout = setTimeout(() => {
if (!sidebar.classList.contains('active')) {
sidebar.classList.add('active');
}
}, 300);
});
10 months ago
}
2 weeks ago
}
10 months ago
2 weeks ago
// Initialize event listeners on DOM load
document.addEventListener('DOMContentLoaded', () => {
handleSidebarMouseEvents(); // Set up the mouse enter/leave events
});
10 months ago
2 weeks ago
<!-- document.addEventListener('click', function (event) {-->
<!-- if(event.target && event.target.id === 'Existing_employeeLink') {-->
<!-- const form = document.getElementById('Existing_employeeLink');-->
10 months ago
2 weeks ago
<!-- fetch('/skyonnadmin/existing_employee/')-->
<!-- .then(response => response.json())-->
<!-- .then(data => {-->
<!-- const employees = data.employees;-->
<!-- console.log(employees);-->
<!-- const employeeTableBody = document.getElementById('employeeTableBody');-->
<!-- employeeTableBody.innerHTML = ''; // Clear previous data-->
10 months ago
2 weeks ago
<!-- if(employees.length > 0) {-->
<!-- employees.forEach(emp => {-->
<!-- const row = `-->
<!-- <tr>-->
<!-- <td>${emp.FirstName}</td>-->
<!-- <td>${emp.LastName}</td>-->
<!-- <td>${emp.Designation}</td>-->
<!-- <td>${emp.Department}</td>-->
10 months ago
2 weeks ago
<!-- <td>${emp.PhoneNo1}</td>-->
<!-- <td>${emp.LandNumber}</td>-->
<!-- <td>${emp.Email1}</td>-->
<!-- <td>${emp.Email2}</td>-->
<!-- <td>${emp.Level}</td>-->
<!-- </tr>`;-->
10 months ago
2 weeks ago
<!-- employeeTableBody.insertAdjacentHTML('beforeend', row);-->
<!-- });-->
<!-- }-->
<!-- })-->
<!-- .catch(error => {-->
<!-- console.error('Error fetching employee data:', error);-->
<!-- })-->
<!-- }-->
<!-- });-->
10 months ago
2 weeks ago
document.addEventListener('click', function (event) {
if(event.target && event.target.id === 'Existing_employeeLink') {
const form = document.getElementById('Existing_employeeLink');
10 months ago
2 weeks ago
fetch('/skyonnadmin/existing_employee/')
.then(response => response.json())
.then(data => {
const employees = data.employees;
console.log(employees);
const employeeTableBody = document.getElementById('employeeTableBody');
employeeTableBody.innerHTML = ''; // Clear previous data
10 months ago
2 weeks ago
if(employees.length > 0) {
employees.forEach(emp => {
const row = `
<tr>
<td contentEditable='false' data-key="FirstName" style="color: blue"><a href="#" class="FirstName-link" data-FirstName="${emp.FirstName}">${emp.FirstName}</td>
<td contentEditable='false' data-key="LastName" style="color: blue"><a href="#" class="LastName-link" data-LastName="${emp.LastName}">${emp.LastName}</td>
<td contentEditable='false' data-key="Designation">${emp.Designation}</td>
<td contentEditable='false' data-key="Department">${emp.Department}</td>
<td contentEditable='false' data-key="PhoneNo1">${emp.PhoneNo1}</td>
<td contentEditable='false' data-key="LandNumber">${emp.LandNumber}</td>
<td contentEditable='false' class='non-editable' data-email="${emp.Email1}">${emp.Email1}</td>
<td contentEditable='false' data-key="Email2">${emp.Email2}</td>
<td contentEditable='false' data-key="Level">${emp.Level}</td>
<td style="width: 150px;">
<button class="edit-internalTeam" style="font-size: 20px; margin-left; -50px;">Edit</button>
<button class="delete-internalTeam" style="font-size: 20px;">Delete</button>
<button class="print-internalTeam" style="font-size: 20px;">Print</button>
</td>
</tr>`;
10 months ago
2 weeks ago
employeeTableBody.insertAdjacentHTML('beforeend', row);
10 months ago
2 weeks ago
});
AddEditDelete();
}
})
.catch(error => {
console.error('Error fetching employee data:', error);
})
}
10 months ago
2 weeks ago
function enforceMaxLength(event) {
const cell = event.target
const maxLengths = {'PhoneNo1':10 , 'LandNumber':20 , 'Pincode':6}
const field = cell.getAttribute('data-key');
const maxLength = maxLengths[field]
if(maxLength && cell.textContent.length > maxLength) {
cell.textContent = cell.textContent.slice(0,maxLength);
const range = document.createRange();
const selection = window.getSelection();
range.setStart(cell.childNodes[0], cell.textContent.length); //makes cursor stay at end of text when it reaches max length
range.collapse(true);
selection.removeAllRanges();
selection.addRange(range);
}
}
const employeeTableBody = document.getElementById('employeeTableBody');
if (!employeeTableBody) return;
employeeTableBody.addEventListener('input',enforceMaxLength);
});
document.addEventListener('DOMContentLoaded', function() { //to show popup for client details
document.addEventListener('click', function(event) {
if (event.target && (event.target.matches('.FirstName-link') || event.target.matches('.LastName-link'))) {
event.preventDefault();
const firstName = event.target.getAttribute('data-FirstName') || '';
console.log(firstName);
const lastName = event.target.getAttribute('data-LastName') || '';
console.log(lastName);
const row = event.target.closest('tr');
const email = row.querySelector('[data-email]').getAttribute('data-email') || '';
const params = new URLSearchParams();
if (firstName) params.append('firstName',firstName);
if (lastName) params.append('lastName',lastName);
if (email) params.append('Email1',email);
let xhr = new XMLHttpRequest();
xhr.open('GET', `/skyonnadmin/get_employee/?${params.toString()}`, true);
xhr.onload = function() {
if (xhr.status === 200) {
const details = JSON.parse(xhr.responseText);
console.log('Details received:', details);
showPopup(details);
} else {
console.error('Request failed. Status:', xhr.status);
}
};
xhr.send();
10 months ago
}
2 weeks ago
});
document.addEventListener('click', function(event) {
const popup = document.getElementById('detailsModal');
if (popup && popup.style.display === 'block' && !popup.contains(event.target) && !event.target.matches('.FirstName-link, .LastName-link')) {
popup.style.display = 'none';
}
}, true);
})
function showPopup(data) {
const popup = document.getElementById('detailsModal');
if (popup) {
// Fill in the popup with data
document.getElementById('FirstName_1').textContent = (data.FirstName || '');
document.getElementById('LastName_1').textContent = (data.LastName || '');
document.getElementById('Designation_1').textContent = (data.Designation || '');
document.getElementById('Department_1').textContent = (data.Department || '');
document.getElementById('Address_1_1').textContent = (data.Address_1 || '');
document.getElementById('Address_2_1').textContent = (data.Address_2 || '');
document.getElementById('City_1').textContent = (data.City || '');
document.getElementById('State_1').textContent = (data.State || '');
document.getElementById('Pincode_1').textContent = (data.Pincode || '');
document.getElementById('Country_1').textContent = (data.Country || '');
document.getElementById('PhoneNo1_1').textContent = (data.PhoneNo1 || '');
document.getElementById('LandNumber_1').textContent = (data.LandNumber || '');
document.getElementById('Email1_1').textContent = (data.Email1 || '');
document.getElementById('Email2_1').textContent = (data.Email2 || '');
document.getElementById('Level_1').textContent = (data.Level || '');
// Attach the close button event listener each time the popup is shown
document.getElementById('closePopup').addEventListener('click', function() {
popup.style.display = 'none';
});
// Display the popup
popup.style.display = 'block';
} else {
console.error('Popup element not found');
10 months ago
}
2 weeks ago
}
function AddEditDelete() {
document.querySelectorAll('.edit-internalTeam').forEach(button => {
button.addEventListener('click', editInternalTeam);
});
document.querySelectorAll('.delete-internalTeam').forEach(button => {
button.addEventListener('click', deleteInternalTeam);
});
document.querySelectorAll('.print-internalTeam').forEach(button => {
button.addEventListener('click', printInternalTeam);
});
}
function editInternalTeam(event) {
event.preventDefault();
const button = event.target;
let row = button.closest('tr');
console.log('editing Internal Team');
if (button.textContent === 'Edit') {
Array.from(row.cells).forEach((cell, index) => {
if (index < row.cells.length - 1) { // Exclude the last cell (actions cell)
const isEditable = cell.getAttribute('data-editable') !== 'true' && !cell.classList.contains('non-editable');
console.log(isEditable);
if (isEditable) {
cell.contentEditable = true;
cell.style.backgroundColor = '';
cell.removeEventListener('blur', validateInternalTeam);
cell.addEventListener('blur', validateInternalTeam);
} else {
cell.contentEditable = false;
cell.style.backgroundColor = '#e0e0e0'; // Set background color for non-editable cells
10 months ago
}
}
2 weeks ago
});
button.setAttribute('data-original-firstname', row.cells[0].textContent.trim());
button.setAttribute('data-original-lastname', row.cells[1].textContent.trim());
button.textContent = 'Save';
}
else if (button.textContent === 'Save') {
let isValid = true;
Array.from(row.cells).forEach((cell, index) => {
if (index < row.cells.length - 1) {
const isEditable = cell.getAttribute('data-editable') !== 'true' && !cell.classList.contains('non-editable');
if(isEditable) {
if (!validateInternalTeam({ target: cell })) {
10 months ago
isValid = false;
2 weeks ago
}
}
10 months ago
}
2 weeks ago
});
10 months ago
2 weeks ago
if (!isValid) {
alert("Validation failed. Please fill out the required fields.");
return; // If validation fails, do not proceed to save
}
10 months ago
2 weeks ago
const updatedData = {
FirstName: row.cells[0].textContent,
LastName: row.cells[1].textContent,
Designation: row.cells[2].textContent,
Department: row.cells[3].textContent,
PhoneNo1: row.cells[4].textContent,
LandNumber: row.cells[5].textContent,
Email1: row.cells[6].textContent,
Email2: row.cells[7].textContent,
Level: row.cells[8].textContent
};
Array.from(row.cells).forEach((cell, index) => {
cell.contentEditable = false;
cell.style.backgroundColor = '';
});
button.textContent = 'Edit';
fetch(`/skyonnadmin/edit_internalTeam/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': '{{csrf_token}}'
},
body: JSON.stringify(updatedData)
})
.then(response => {
if (response.ok) {
console.log('Data saved successfully.');
alert('Data saved successfully!');
const originalFirstName = button.getAttribute('data-original-firstname');
console.log(originalFirstName);
const originalLastName = button.getAttribute('data-original-lastname');
console.log(originalLastName);
if (updatedData.FirstName !== originalFirstName || updatedData.LastName !== originalLastName) {
fetch('/skyonnadmin/existing_employee/')
.then(response => response.json())
.then(data => {
const employees = data.employees;
console.log(employees);
const employeeTableBody = document.getElementById('employeeTableBody');
employeeTableBody.innerHTML = ''; // Clear previous data
if(employees.length > 0) {
employees.forEach(emp => {
const row = `
<tr>
<td contentEditable='false' data-key="FirstName" style="color: blue"><a href="#" class="FirstName-link" data-FirstName="${emp.FirstName}">${emp.FirstName}</td>
<td contentEditable='false' data-key="LastName" style="color: blue"><a href="#" class="LastName-link" data-LastName="${emp.LastName}">${emp.LastName}</td>
<td contentEditable='false' data-key="Designation">${emp.Designation}</td>
<td contentEditable='false' data-key="Department">${emp.Department}</td>
<td contentEditable='false' data-key="PhoneNo1">${emp.PhoneNo1}</td>
<td contentEditable='false' data-key="LandNumber">${emp.LandNumber}</td>
<td contentEditable='false' class='non-editable' data-email="${emp.Email1}">${emp.Email1}</td>
<td contentEditable='false' data-key="Email2">${emp.Email2}</td>
<td contentEditable='false' data-key="Level">${emp.Level}</td>
<td style="width: 150px;">
<button class="edit-internalTeam" style="font-size: 20px; margin-left; -50px;">Edit</button>
<button class="delete-internalTeam" style="font-size: 20px;">Delete</button>
<button class="print-internalTeam" style="font-size: 20px;">Print</button>
</td>
</tr>`;
employeeTableBody.insertAdjacentHTML('beforeend', row);
});
AddEditDelete();
}
})
.catch(error => {
console.error('Error fetching employee data:', error);
})
}
} else {
console.error('Failed to save data.');
alert('Failed to save data.');
}
})
.catch(error => {
console.error('Error saving employee data:', error);
});
}
}
function validateInternalTeam(event) {
const cell = event.target;
const row = cell.closest('tr');
const field = cell.getAttribute('data-key');
const emailCell = row.querySelector('[data-email]')
const email1 = emailCell.getAttribute('data-email');
let value = cell.textContent.trim();
let alertShown = cell.getAttribute('data-alert-shown') === 'true';
let isValid = true;
let hasEmailError = false;
let hasPhoneError = false;
const pincodePattern = /^[1-9][0-9]{5}$/;
value = cell.textContent.trim(); // Get updated value when the user finishes editing
if ((field === 'FirstName' || field === 'LastName' || field === 'Designation' || field === 'Department' || field === 'Level') && value === '') {
if (!alertShown) {
alert(`${field} field cannot be empty`);
cell.setAttribute('data-alert-shown', 'true');
}
cell.style.backgroundColor = "#FFCCCC";
cell.focus();
isValid = false;
} else {
cell.setAttribute('data-alert-shown', 'false');
cell.style.backgroundColor = ""; // Reset background color
}
// Email Validation
if (field === 'Email2' && value !=='') {
const emailPattern = /^[^\s@]+@[^\s@]+\.[a-zA-Z]{2,}$/;
const emailPattern2 = /^[^\s@]{1,64}@([^\s@_]+\.)+[a-zA-Z]{2,}$/;
if (!value.match(emailPattern) || value.includes('..') || !value.match(emailPattern2)) {
if (!alertShown) {
alert('Invalid Email Address format');
cell.setAttribute('data-alert-shown', 'true');
}
cell.style.backgroundColor = "#FFCCCC"; // Highlight error
isValid = false;
cell.focus(); // Keep focus on the email field
} else {
const emailExists = checkEmailExists(value,email1);
console.log('emailExists:',emailExists);
if (emailExists) {
if (!alertShown) {
alert('Email already exists. Please use a different email.');
cell.setAttribute('data-alert-shown', 'true'); // Prevent multiple alerts
}
cell.style.backgroundColor = "#FFCCCC"; // Highlight error
isValid = false;
hasEmailError = true;
cell.focus();
} else {
cell.style.backgroundColor = ""; // Reset background color
hasEmailError = false; // No email error
cell.setAttribute('data-alert-shown', 'false'); // Reset alert
}
}
}
if (field === 'PhoneNo1' && value !== '') {
const phonePattern = /^[6-9]\d{9}$/;
if (!value.match(phonePattern)) {
if (!alertShown) {
alert('Invalid phone number format');
cell.setAttribute('data-alert-shown', 'true');
}
cell.style.backgroundColor = "#FFCCCC";
isValid = false;
cell.focus(); // Keep focus on the phone field
} else {
const phoneExists = checkPhoneNumberExists(value,email1);
console.log('phoneExists:',phoneExists);
if (phoneExists) {
if (!alertShown) {
alert('phone number already exists. Please use a different number.');
cell.setAttribute('data-alert-shown', 'true'); // Prevent multiple alerts
}
cell.style.backgroundColor = "#FFCCCC";
isValid = false;
hasPhoneError = true;
cell.focus();
} else {
cell.style.backgroundColor = ""; // Reset background color
hasPhoneError = false; // No phone error
console.log('hasPhoneError:',hasPhoneError);
cell.setAttribute('data-alert-shown', 'false'); // Reset alert
}
}
}
if (field === 'LandNumber' && value !== '') {
const phonePattern = /^(\+91[-\s]?)?[0]?\d{2,5}[-\s]?\d{3,4}[-\s]?\d{4}$/;
if (!value.match(phonePattern)) {
if (!alertShown) {
alert('Invalid phone number format');
cell.setAttribute('data-alert-shown', 'true');
}
cell.style.backgroundColor = "#FFCCCC";
isValid = false;
cell.focus(); // Keep focus on the phone field
} else {
const phoneExists = checkPhoneNumberExists(value,email1);
console.log('phoneExists:',phoneExists);
if (phoneExists) {
if (!alertShown) {
alert('Landline number already exists. Please use a different number.');
cell.setAttribute('data-alert-shown', 'true'); // Prevent multiple alerts
}
cell.style.backgroundColor = "#FFCCCC";
isValid = false;
hasPhoneError = true;
cell.focus();
} else {
cell.style.backgroundColor = ""; // Reset background color
hasPhoneError = false; // No phone error
console.log('hasPhoneError:',hasPhoneError);
cell.setAttribute('data-alert-shown', 'false'); // Reset alert
}
}
}
const phoneCell =row.querySelector('[data-key="PhoneNo1"]');
const landNumberCell =row.querySelector('[data-key="LandNumber"]');
const phoneNo1Value = phoneCell ? phoneCell.textContent.trim() : '';
const landNumberValue = landNumberCell ? landNumberCell.textContent.trim() : '';
const focusField = cell.getAttribute('data-key') === 'PhoneNo1' ? landNumberCell : phoneCell;
if (field === 'PhoneNo1' || field === 'LandNumber' ) {
if(phoneNo1Value === '' && landNumberValue === '') {
if (!alertShown) {
alert(`Both Phonenumber and Landnumber fields cannot be empty.Please fill atleast one`);
cell.setAttribute('data-alert-shown', 'true');
if (focusField) {
focusField.focus();
}
}
isValid = false;
}
} else {
cell.setAttribute('data-alert-shown', 'false');
}
return isValid;
}
function checkEmailExists(email2,email1) {
const xhr = new XMLHttpRequest();
xhr.open('GET', `/skyonnadmin/validate_existingEmployee/?Email2=${encodeURIComponent(email2)}&Email1=${encodeURIComponent(email1)}`, false); // Synchronous request with email and contact_id
xhr.send();
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
return response.email_exists;
} else {
console.error('Error checking email.');
return false;
}
}
function checkPhoneNumberExists(phoneNumber,email1) {
const xhr = new XMLHttpRequest();
xhr.open('GET', `/skyonnadmin/validate_existingEmployee/?PhoneNo1=${encodeURIComponent(phoneNumber)}&LandNumber=${encodeURIComponent(phoneNumber)}&Email1=${encodeURIComponent(email1)}`, false); // Synchronous request with phone number and contact_id
xhr.send();
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
return response.phone_exists; // Return true if phone number exists
} else {
console.error('Error checking phone number.');
return false;
}
}
function deleteInternalTeam(event) {
event.preventDefault();
const button = event.target;
const row = button.closest('tr'); // Get the row to delete
const emailCell = row.querySelector('[data-email]');
const email = emailCell.getAttribute('data-email');
console.log('Deleting row with Email:', email);
if (confirm(`Are you sure you want to delete data?`)) {
return fetch(`/skyonnadmin/delete_internalTeam/?Email1=${encodeURIComponent(email)}`, {
method: 'DELETE',
10 months ago
headers: {
2 weeks ago
'Content-Type': 'application/json',
'X-CSRFToken': '{{ csrf_token }}' // Properly include the CSRF token
}
})
.then(response => {
if (response.ok) {
row.remove();
console.log('Data deleted successfully');
alert('Data deleted successfully');
} else {
console.error('Failed to delete Internal Team details');
}
})
.catch(error => {
console.error('Network error during data deletion:', error);
});
}
}
function printInternalTeam(event) {
event.preventDefault();
console.log('Print clicked');
const row = event.target.closest('tr');
const emailCell = row.querySelector('[data-email]');
const email = emailCell.getAttribute('data-email');
console.log(`Email: ${email}`);
// Make a POST request to the server for fetching additional details
fetch(`/skyonnadmin/print_internalTeam/?Email1=${encodeURIComponent(email)}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': '{{csrf_token}}',
10 months ago
},
})
.then(response => {
2 weeks ago
if (!response.ok) {
throw new Error('Failed to fetch employee data');
}
return response.json(); // Return the parsed JSON
10 months ago
})
.then(data => {
2 weeks ago
console.log('Data received from server:', data);
// Create printable content from received data
const printContent = `
<h1>Internal Team Details</h1>
<p><strong>FirstName:</strong> ${data.FirstName}</p>
<p><strong>LastName:</strong> ${data.LastName}</p>
<p><strong>Designation:</strong> ${data.Designation}</p>
<p><strong>Department:</strong> ${data.Department}</p>
<p><strong>PhoneNo1:</strong> ${data.PhoneNo1}</p>
<p><strong>LandNumber:</strong> ${data.LandNumber}</p>
<p><strong>Email1:</strong> ${data.Email1}</p>
<p><strong>Email2:</strong> ${data.Email2}</p>
<p><strong>Level:</strong> ${data.Level}</p>
`;
// Open a new window and display the printable content
const printWindow = window.open('');
printWindow.document.write(`
<html>
<head>
<title>Company: Skyonn Technologies</title>
<style>
body { font-family: Arial, sans-serif; margin: 0;}
h1 { text-align: center; }
p { margin: 10px 0; }
}
</style>
</head>
<body onload="window.print(); window.close();">
${printContent}
</body>
</html>
`);
printWindow.document.close();
})
.catch(error => {
console.error('Error fetching employee data:', error);
});
10 months ago
}
2 weeks ago
document.addEventListener('DOMContentLoaded', function () {
window.UploadExcel=function() {
console.log('file uploaded');
const excel_file = document.getElementById('excelFile').files[0];
if (!excel_file) {
alert("Please select an Excel file.");
return;
}
const formData = new FormData();
formData.append('excelFile', excel_file);
// Initial fetch to get the row count from the server
fetch("/skyonnadmin/get_row_count/", {
method: "POST",
body: formData,
headers: {
"X-CSRFToken": '{{ csrf_token }}'
}
})
.then(response => response.json())
.then(data => {
if (data.error) {
console.error("Error fetching row count:", data.error);
alert("An error occurred while processing the file. Please try again.");
return;
}
const rowCount = data.row_count;
if (confirm(`This Excel file contains ${rowCount} rows. Do you want to upload it?`)) {
const formData = new FormData();
formData.append('excelFile',excel_file);
fetch("/skyonnadmin/load_excel_data/", {
method: "POST",
10 months ago
body: formData,
headers: {
2 weeks ago
"X-CSRFToken": '{{ csrf_token}}'
10 months ago
}
2 weeks ago
})
.then(response => response.json())
.then(data => {
console.log('data:',data);
if (data.error) {
console.log(data.error);
// Display error for specific fields, including missing PhoneNo1 and LandNumber
if (data.empty_fields) {
console.log(data.empty_fields);
const errors = [];
for (const field in data.empty_fields) {
if (field === 'Contact') {
errors.push(`Empty data in both PhoneNo1 and LandNumber column`);
}
if (field !== 'PhoneNo1' && field !== 'LandNumber' && field !== 'Contact') {
errors.push(`Empty data in column '${field}' in provided excel sheet`);
}
}
console.log(errors);
if (errors.length > 0) {
alert(errors);
}
}
return;
}
console.log(data.data);
excelRows = data.data;
console.log('excelRows:',excelRows);
let currentRowIndex = 0;
function processRow(rowData) {
console.log(`processing row is: ${currentRowIndex}`);
for (const header in rowData) {
const field = document.getElementById(header);
const value = rowData[header];
if (field) {
if (header === 'Level') {
field.value = `Level ${value}`;
}
else {
field.value = value;
}
}
else {
console.warn(`No form field found with ID: ${header}`);
}
}
}
window.saveInternal_team_details = async function() {
const form = document.getElementById('internal-team');
const orderedFieldIds = [
'FirstName', 'LastName', 'Designation', 'Department', 'Address_1', 'City', 'State', 'Pincode', 'Country',
'PhoneNo1','LandNumber','Email1','Email2','Level'
];
const phoneNumberInput1 = document.getElementById('PhoneNo1');
const phoneNumberInput2 = document.getElementById('LandNumber');
if(!phoneNumberInput1.value.trim() && !phoneNumberInput2.value.trim()) {
alert('please fill atleast one phone number: PhoneNo or Landline');
return;
}
const validateField = (field, pattern = null, errorMsg = '') => {
const fieldValue = field.value.trim();
if (!fieldValue && (field.id === 'PhoneNo1' || field.id === 'LandNumber')) {
field.setCustomValidity('');
return true; // Skip validation for these fields if they are empty
}
if (!fieldValue) {
field.setCustomValidity('This field cannot be empty.');
field.reportValidity();
return false;
}
if (pattern && !pattern.test(fieldValue)) {
field.setCustomValidity(errorMsg || 'Invalid input format.');
field.reportValidity();
return false;
}
field.setCustomValidity('');
return true;
};
const getTabIndexFields = () => {
return orderedFieldIds
.map(id => {
const field = document.getElementById(id);
// Check if the field exists and log its tabindex
if (field) {
const tabindex = parseInt(field.getAttribute('tabindex'), 10) || 0;
<!-- console.log(`Field ID: ${id}, Tabindex: ${tabindex}`);-->
return { field, tabindex };
} else {
console.warn(`Field with ID: ${id} not found`);
return null;
}
})
};
const validateFieldInOrder= async () => {
let isValid =true;
const fields = getTabIndexFields().sort((a, b) => a.tabindex - b.tabindex);
for (let { field,tabindex } of fields) {
let valid;
// Specific validations based on field type
if (field.id === 'PhoneNo1') {
valid = validateField(field, /^[6-9]\d{9}$/, 'Please enter a valid Phone number.');
}
else if (field.id === 'Email1') {
valid = validateField(field, !field.value.match(/^[^\s@]+@[^\s@]+\.[a-zA-Z]{2,}$/) || field.value.includes('..') || !field.value.match(/^[^\s@]{1,64}@([^\s@_]+\.)+[a-zA-Z]{2,}$/),
'Please enter a valid Email address.');
}
else if (field.id === 'LandNumber') {
valid = validateField(field, /^(\+91[-\s]?)?[0]?\d{2,5}[-\s]?\d{3,4}[-\s]?\d{4}$/, 'Please enter a valid Landline number.');
}
else if (field.id === 'Email2') {
valid = validateField(field, !field.value.match(/^[^\s@]+@[^\s@]+\.[a-zA-Z]{2,}$/) || field.value.includes('..') || !field.value.match(/^[^\s@]{1,64}@([^\s@_]+\.)+[a-zA-Z]{2,}$/),
'Please enter a valid Email address.'); }
else if (field.id === 'Pincode') {
valid = validateField(field, /^[1-9][0-9]{5}$/, 'Please enter a valid Pincode.');
}
else {
valid = validateField(field); // General non-empty check
}
if(!valid) {
console.log(`Validation error at tabindex: ${tabindex}`);
isValid = false;
field.focus();
break;
}
if (field.id === 'PhoneNo1' || field.id === 'LandNumber' || field.id === 'Email1' || field.id === 'Email2') {
const exists = await checkFieldExists(field.id, field);
if (!exists) {
field.focus();
isValid = false;
break;
}
}
}
return isValid;
};
const checkFieldExists = (fieldName, field) => {
return new Promise((resolve) => {
const value = field.value.trim();
fetch(`/skyonnadmin/validate_internal_team/?${fieldName}=${value}`)
.then(response => response.json())
.then(data => {
if (data.exists) {
field.setCustomValidity(`${fieldName} already exists.`);
field.reportValidity();
resolve(false);
} else {
field.setCustomValidity('');
resolve(true);
}
})
.catch(error => {
console.error('Error:', error);
resolve(false);
});
});
};
const isValid = await validateFieldInOrder();
if (!isValid) {
console.log("Validation failed. Please correct the highlighted errors.");
return;
}
// Proceed with saving if valid
const formData = new FormData(form);
const url = form.getAttribute('action');
try{
const response = await fetch(url, {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': '{{ csrf_token }}',
},
})
if (!response.ok) throw new Error('Failed to save internal team details.');
const data = await response.json();
console.log('Row saved:',data);
10 months ago
form.reset();
2 weeks ago
currentRowIndex++;
if (currentRowIndex < excelRows.length) {
processRow(excelRows[currentRowIndex]);
}
return true;
} catch (error) {
console.error('Error saving row:', error);
return false;
}
}
async function processRowsSequentially() {
while (currentRowIndex < excelRows.length) {
processRow(excelRows[currentRowIndex]);
const saved = await saveInternal_team_details();
if (!saved){
console.log("Error at the row", currentRowIndex);
return;
}
console.log('Row saved successfully:', currentRowIndex);
}
if (currentRowIndex === excelRows.length) {
alert(`All ${excelRows.length} rows have been processed successfully`);
}
}
processRowsSequentially();
10 months ago
})
2 weeks ago
.catch(error => console.error("Error uploading Excel file:", error)); //load excel data
}
else {
excelFile.value = ""; // get row count
}
})
10 months ago
}
2 weeks ago
})
document.addEventListener('DOMContentLoaded', function () {
document.addEventListener('change', function () {
const excel_file = document.getElementById('excelFile').files[0];
if(!excel_file) {
console.log('main dom');
const form = document.getElementById('internal-team');
const phoneNumberInput1 = document.getElementById('PhoneNo1');
const emailInput1 = document.getElementById('Email1');
const phoneNumberInput2 = document.getElementById('LandNumber');
const emailInput2 = document.getElementById('Email2');
const pincodeInput = document.getElementById('Pincode');
if(!phoneNumberInput1 || !emailInput1 || !phoneNumberInput2 || !emailInput2) { return;}
const phonePattern = /^[6-9]\d{9}$/;
const pincodePattern = /^[1-9][0-9]{5}$/;
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);
});
pincodeInput.addEventListener('input', () => {
clearValidation(pincodeInput);
});
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();
} else {
clearValidation(emailInput1);
if (emailInput1.value.trim()) {
checkFieldExists('Email1', 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();
} else {
clearValidation(phoneNumberInput1);
if (phoneNumberInput1.value.trim()) {
checkFieldExists('PhoneNo1', 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();
} else {
clearValidation(emailInput2);
if (emailInput2.value.trim()) {
checkFieldExists('Email2', emailInput2);
}
}
});
phoneNumberInput2.addEventListener('blur', () => {
const normalValue = phoneNumberInput2.value.trim()
console.log(normalValue);
if (phoneNumberInput2.value.trim() && !phoneNumberInput2.value.match(/^(\+91[-\s]?)?[0]?\d{2,5}[-\s]?\d{3,4}[-\s]?\d{4}$/)) {
phoneNumberInput2.style.borderColor = '';
phoneNumberInput2.setCustomValidity('Please enter a valid Landline number.');
phoneNumberInput2.reportValidity();
} else {
clearValidation(phoneNumberInput2);
if (normalValue) {
checkFieldExists('LandNumber', phoneNumberInput2, normalValue);
}
}
});
pincodeInput.addEventListener('blur', () => {
if (pincodeInput.value.trim() && !pincodeInput.value.match(/^[1-9][0-9]{5}$/)) {
pincodeInput.style.borderColor = '';
pincodeInput.setCustomValidity('Please enter a valid Pincode');
pincodeInput.reportValidity();
} else {
clearValidation(pincodeInput);
}
});
function checkFieldExists(fieldName, field, normalValue=null) {
const value = normalValue || field.value.trim();
fetch(`/skyonnadmin/validate_internal_team/?${fieldName}=${value}`)
.then(response => response.json())
.then(data => {
if (data.exists) {
if(fieldName == 'PhoneNo1' || fieldName == 'LandNumber') {
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.saveInternal_team_details= async function() {
console.log('main window');
const form = document.getElementById('internal-team');
const orderedFieldIds = [
'FirstName', 'LastName', 'Designation', 'Department', 'Address_1', 'City', 'State', 'Pincode', 'Country',
'PhoneNo1','Email1','Level'
];
const FirstNameInput = document.getElementById('FirstName');
const phoneNumberInput1 = document.getElementById('PhoneNo1');
const emailInput1 = document.getElementById('Email1');
const phoneNumberInput2 = document.getElementById('LandNumber');
const emailInput2 = document.getElementById('Email2');
const pincodeInput = document.getElementById('Pincode');
<!-- if(!phoneNumberInput1.value.trim() && !phoneNumberInput2.value.trim()) {-->
<!-- return;-->
<!-- }-->
let isValid = true;
// Clear any previous custom validation messages and reset border colors
orderedFieldIds.forEach(id => {
const field = document.getElementById(id);
if (field) {
field.setCustomValidity(''); // Clear previous validation message
field.style.borderColor = ''; // Reset border color
}
});
// Iterate over each field in the specified order to validate
for (let id of orderedFieldIds) {
const field = document.getElementById(id);
if (field && !field.value.trim()) {
isValid = false;
field.setCustomValidity('Please fill out this field.');
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 = 'black';
}
}
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 = 'black';
}
};
checkValidity(phoneNumberInput1, /^[6-9]\d{9}$/, 'Please enter a valid Phonenumber.');
validateEmail(emailInput1);
if (phoneNumberInput2.value.trim()) {
checkValidity(phoneNumberInput2, /^(\+91[-\s]?)?[0]?\d{2,5}[-\s]?\d{3,4}[-\s]?\d{4}$/, 'Please enter a valid Landline number.');
}
if (emailInput2.value.trim()) {
validateEmail(emailInput2);
}
checkValidity(pincodeInput, /^[1-9][0-9]{5}$/, 'Please enter a valid Pincode');
const checkFieldExists = (fieldName, field, normalValue = null) => {
return new Promise((resolve, reject) => {
const value = normalValue || field.value.trim();
fetch(`/skyonnadmin/validate_internal_team/?${fieldName}=${value}`)
.then(response => response.json())
.then(data => {
if (data.exists) {
if (fieldName === 'PhoneNo1' || fieldName === 'LandNumber') {
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 = 'black';
resolve(true); // Valid
}
})
.catch(error => {
console.error('Error:', error);
reject(error);
});
});
}
if (isValid) {
const phoneNo1Valid = await checkFieldExists('PhoneNo1', phoneNumberInput1);
const email1Valid = await checkFieldExists('Email1', emailInput1);
const normalValue = phoneNumberInput2.value.trim()
console.log(normalValue);
const phoneNo2Valid = await checkFieldExists('PhoneNo2', phoneNumberInput2,normalValue);
const email2Valid = await checkFieldExists('Email2', emailInput2);
isValid = phoneNo1Valid && email1Valid && phoneNo2Valid && email2Valid;
}
if (!isValid) {
console.log("Validation failed. Please fill out the required fields.");
return;
}
// Proceed with saving data if all fields are valid
10 months ago
const formData = new FormData(form);
const url = form.getAttribute('action');
2 weeks ago
console.log("Submitting form to:", url);
console.log("Form data:", [...formData.entries()]); // Log the form data
10 months ago
fetch(url, {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': '{{ csrf_token }}', // Assuming you have CSRF token available
},
})
.then(response => {
if (!response.ok) {
2 weeks ago
throw new Error('Failed to save internal team details.');
10 months ago
}
return response.json();
})
.then(data => {
2 weeks ago
if (data.status === 'error') {
if (data.field && data.message) {
const errorField = form.querySelector(`[name=${data.field}]`);
if (errorField) {
errorField.style.borderColor = '';
errorField.setCustomValidity(data.message);
errorField.reportValidity();
errorField.focus();
errorField.value = '';
errorField.addEventListener('input', () => {
errorField.style.borderColor = 'black';
errorField.setCustomValidity('');
errorField.reportValidity();
}, { once: true });
} else {
alert(data.message);
}
} else {
alert(data.message || 'Error saving Client.');
}
} else {
alert('Internal Team saved successfully.');
form.reset();
}
})
10 months ago
.catch(error => {
console.error('Error:', error);
2 weeks ago
alert('Error: ' + error.message);
})
}
document.addEventListener('click',function() {
if (event.target && event.target.matches('.client-link')) { //hyperlink to show company details
event.preventDefault();
const client = event.target.getAttribute('data-client');
let xhr= new XMLHttpRequest();
xhr.open('GET',`/get_client_details/?client=${client}`,true);
xhr.onload = function() {
if (xhr.status === 200) {
const details = JSON.parse(xhr.responseText);
console.log(details);
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send()
}
});
function updateButtonStates() {
const clientDropdown = document.getElementById("ClientDropdown");
const subClientDropdown = document.getElementById("SubClientDropdown");
const getCompanyDetailsButton = document.getElementById("getCompanyDetailsButton");
const getTeamDetailsButton = document.getElementById("getTeamDetailsButton");
const clientSelected = clientDropdown.value !== "";
const subClientSelected = subClientDropdown.value !== "";
if (clientSelected || subClientSelected) {
getCompanyDetailsButton.classList.remove("disabled-button");
getCompanyDetailsButton.classList.add("enabled-button");
getCompanyDetailsButton.disabled = false;
getTeamDetailsButton.classList.remove("disabled-button");
getTeamDetailsButton.classList.add("enabled-button");
getTeamDetailsButton.disabled = false;
} else {
getCompanyDetailsButton.classList.remove("enabled-button");
getCompanyDetailsButton.classList.add("disabled-button");
getCompanyDetailsButton.disabled = true;
getTeamDetailsButton.classList.remove("enabled-button");
getTeamDetailsButton.classList.add("disabled-button");
getTeamDetailsButton.disabled = true;
}
}
function initializeEventListeners() {
const clientDropdown = document.getElementById("ClientDropdown");
const subClientDropdown = document.getElementById("SubClientDropdown");
clientDropdown.addEventListener("change", updateButtonStates);
subClientDropdown.addEventListener("change", updateButtonStates);
updateButtonStates();
}
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
const clientDropdown = document.getElementById("ClientDropdown");
const subClientDropdown = document.getElementById("SubClientDropdown");
if (clientDropdown && subClientDropdown) {
initializeEventListeners();
}
});
});
observer.observe(document.body, { childList: true, subtree: true });
document.addEventListener("DOMContentLoaded", function () {
initializeEventListeners();
});
document.addEventListener('click', function(event) {
const clientDropdown = document.getElementById('ClientDropdown');
const subClientDropdown = document.getElementById('SubClientDropdown');
const searchKeyword = document.getElementById('searchKeyword')
if (!searchKeyword) return;
function handleSearch() {
const clientValue = clientDropdown ? clientDropdown.value.trim() : '';
const subClientValue = subClientDropdown ? subClientDropdown.value.trim() : '';
const keyword = searchKeyword.value.trim();
console.log('keyword1:',keyword);
if (keyword === '') {
console.log('Making empty');
let tableContainer = document.getElementById('TableContainer');
tableContainer.innerHTML = '';
return;
}
performSearch();
}
function performSearch() {
const client = document.getElementById('ClientDropdown').value;
const subClient = document.getElementById('SubClientDropdown').value;
const searchKeyword = document.getElementById('searchKeyword').value;
console.log('keyword2:',searchKeyword);
let xhr = new XMLHttpRequest();
xhr.open('GET', `/skyonnadmin/get_SearchData/?client=${client}&subClient=${subClient}&searchKeyword=${searchKeyword}`, true);
xhr.onload = function() {
if (xhr.status === 200) {
filteredData = JSON.parse(xhr.responseText);
console.log(filteredData);
renderNewTables(filteredData);
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
searchKeyword.addEventListener('input', handleSearch);
if (clientDropdown) {
clientDropdown.addEventListener('change', handleSearch);
}
if (subClientDropdown) {
subClientDropdown.addEventListener('change', handleSearch);
}
});
function renderNewTables(filteredData) {
let tableContainer = document.getElementById('TableContainer');
tableContainer.innerHTML = '';
let TableHTML = '<div id="TableName"><table border="1">';
if (filteredData.client_details.length === 0 && filteredData.sub_company_details.length === 0 && filteredData.contacts.length === 0) {
TableHTML += `<thead style="margin-left:-370px;"><tr><th>No details found</th></tr></thead>`;
TableHTML += `</table></div>`;
tableContainer.innerHTML += TableHTML;
return;
}
if (filteredData.client_details.length > 0) {
renderClientTable(filteredData.client_details, 'Main client');
}
if (filteredData.sub_company_details.length > 0) {
renderClientTable(filteredData.sub_company_details, 'Sub client');
}
if (filteredData.contacts.length > 0) {
renderTeamDetails(filteredData);
}
AddActionButtons();
}
<!--document.addEventListener('DOMContentLoaded', function() {-->
<!-- document.addEventListener('change', function(event) {-->
<!-- var target = event.target;-->
<!-- if (target && target.id === 'Client') {-->
<!-- var client = target.value; // Get selected client-->
<!-- let SPOC1 = document.getElementById('SPOC');-->
<!-- if (!SPOC1) return;-->
<!-- let SPOC2 = document.getElementById('SPOC2');-->
<!-- if (!SPOC2) return;-->
<!-- SPOC1.innerHTML = '<option value="">Select SPOC1</option>';-->
<!-- SPOC2.innerHTML = '<option value="">Select SPOC2</option>';-->
<!-- // Make AJAX request to get filtered data-->
<!-- let xhr = new XMLHttpRequest();-->
<!-- xhr.open('GET', '/skyonnadmin/get_contacts/?Client=' + client, true);-->
<!-- xhr.onload = function() {-->
<!-- if (xhr.status === 200) {-->
<!-- var spocData = JSON.parse(xhr.responseText);-->
<!-- spocData.forEach(function(contact) {-->
<!-- const option1 = document.createElement('option');-->
<!-- option1.value = `${contact.FirstName}-${contact.Department}`;-->
<!-- option1.textContent = `${contact.FirstName}-${contact.Department}`;-->
<!-- SPOC1.appendChild(option1);-->
<!-- const option2 = document.createElement('option');-->
<!-- option2.value = `${contact.FirstName}-${contact.Department}`;-->
<!-- option2.textContent = `${contact.FirstName}-${contact.Department}`;-->
<!-- SPOC2.appendChild(option2);-->
<!-- });-->
<!-- } else {-->
<!-- console.error('Request failed. Status: ' + xhr.status);-->
<!-- }-->
<!-- };-->
<!-- xhr.onerror = function() {-->
<!-- console.error('Request failed.');-->
<!-- };-->
<!-- xhr.send();-->
<!-- }-->
<!-- })-->
<!--});-->
document.addEventListener('DOMContentLoaded', function() {
document.addEventListener('change', function(event) {
var target = event.target;
const formId = document.getElementById('Add_new_contact');
console.log(formId);
if (target && target.id === 'ClientDropdown' && formId.id === 'Add_new_contact') {
var parentCompany = target.value; // Get selected client
var subClientDropdown = target.closest('form').querySelector('#SubClientDropdown');
subClientDropdown.innerHTML = '';
if (subClientDropdown.tagName.toLowerCase() === 'input') {
var element = document.createElement('select');
element.id = 'SubClientDropdown';
element.name = 'Sub_Company';
element.style.marginLeft = '10px';
element.tabIndex = 2;
subClientDropdown.parentNode.replaceChild(element,subClientDropdown);
subClientDropdown = element;
}
// Make an AJAX request to fetch sub-clients filtered by selected client
var xhr = new XMLHttpRequest();
xhr.open('GET', '/skyonnadmin/get_subclients/?parent_company=' + parentCompany, true);
xhr.onload = function() {
if (xhr.status === 200) {
// Parse response and add options to SubClient dropdown
var subClients = JSON.parse(xhr.responseText);
subClients.forEach(function(subClient) {
var option = document.createElement('option');
option.value = subClient;
option.text = subClient;
subClientDropdown.appendChild(option);
});
var parentOption = document.createElement('option');
parentOption.value = parentCompany;
parentOption.textContent = parentCompany;
subClientDropdown.insertBefore(parentOption,subClientDropdown.firstChild);
subClientDropdown.value = parentCompany;
subClientDropdown.disabled = false;
if (subClientDropdown.options.length === 1) {
var inputElement = document.createElement('input');
inputElement.type = 'text';
inputElement.id = 'SubClientDropdown';
inputElement.name = 'Sub_Company';
inputElement.disabled = true;
inputElement.value = subClientDropdown.options[0].text;
subClientDropdown.parentNode.replaceChild(inputElement, subClientDropdown);
}
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
});
});
document.addEventListener('DOMContentLoaded', function() {
document.addEventListener('change', function() {
const form = document.getElementById('Add_new_contact');
if (!form) return;
const emailInput = document.getElementById('Email');
const phoneNumberInput = document.getElementById('Phone_number');
const requiredFields = form.querySelectorAll('input[required], select[required]');
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 = '';
};
emailInput.addEventListener('input', () => {
clearValidation(emailInput);
});
phoneNumberInput.addEventListener('input', () => {
clearValidation(phoneNumberInput);
});
emailInput.addEventListener('blur', () => {
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,}$/))) {
emailInput.style.borderColor = '';
emailInput.setCustomValidity('Invalid email format.');
emailInput.reportValidity();
} else {
clearValidation(emailInput);
if (emailInput.value.trim()) {
checkFieldExists('Email', emailInput);
}
}
});
phoneNumberInput.addEventListener('blur', () => {
if (phoneNumberInput.value.trim() && !phoneNumberInput.value.match(/^[6-9]\d{9}$/)) {
phoneNumberInput.style.borderColor = '';
phoneNumberInput.setCustomValidity('Invalid phone number format.');
phoneNumberInput.reportValidity();
} else {
clearValidation(phoneNumberInput);
if (phoneNumberInput.value.trim()) {
checkFieldExists('Phone_number', phoneNumberInput);
}
}
});
function checkFieldExists(fieldName, field) {
const value = field.value.trim();
fetch(`/validate_field/?${fieldName}=${value}`)
.then(response => response.json())
.then(data => {
if (data.exists) {
if (fieldName === 'Phone_number') {
field.setCustomValidity('Phone number already exists.');
} else {
field.setCustomValidity('Email already exists.');
}
field.style.borderColor = 'red';
field.reportValidity();
} else {
field.setCustomValidity('');
field.style.borderColor = 'black';
}
})
.catch(error => {
console.error('Error:', error);
});
}
})
});
window.saveAdd_new_contact = async function () {
const form = document.getElementById('Add_new_contact');
const requiredFields = [
document.getElementById('ClientDropdown'), // Company
document.getElementById('FirstName'),
document.getElementById('Designation'), // Designation
document.getElementById('Department'), // Department
document.getElementById('Email'), // Email
document.getElementById('Phone_number') // Phone Number
];
let isValid = true;
// Clear previous validation messages
requiredFields.forEach(field => {
field.setCustomValidity('');
field.style.borderColor = '';
});
// Sequential validation of required fields
for (let field of requiredFields) {
if (!field.value.trim()) {
isValid = false;
field.setCustomValidity('Please fill out this field.');
field.reportValidity();
field.focus();
return; // Stop validation if any field is invalid
}
}
// Email validation
const emailInput = document.getElementById('Email');
if (
emailInput.value.trim() &&
(!/^[^\s@]+@[^\s@]+\.[a-zA-Z]{2,}$/.test(emailInput.value) || emailInput.value.includes('..'))
) {
isValid = false;
emailInput.setCustomValidity('Please enter a valid email address.');
emailInput.reportValidity();
emailInput.focus();
return;
}
// Phone number validation
const phoneNumberInput = document.getElementById('Phone_number');
const phonePattern = /^[6-9]\d{9}$/;
if (phoneNumberInput.value.trim() && !phonePattern.test(phoneNumberInput.value)) {
isValid = false;
phoneNumberInput.setCustomValidity('Invalid phone number format.');
phoneNumberInput.reportValidity();
phoneNumberInput.focus();
return;
}
// Asynchronous validation for uniqueness
const checkFieldExists = (fieldName, input) => {
return new Promise((resolve, reject) => {
fetch(`/validate_field/?${fieldName}=${encodeURIComponent(input.value.trim())}`)
.then(response => response.json())
.then(data => {
if (data.exists) {
isValid = false;
input.setCustomValidity(`${fieldName.replace('_', ' ')} already exists.`);
input.reportValidity();
input.focus();
resolve(false);
} else {
input.setCustomValidity('');
input.style.borderColor = 'black';
resolve(true);
}
})
.catch(error => {
console.error('Error:', error);
reject(error);
});
});
};
const phoneNoValid = await checkFieldExists('Phone_number', phoneNumberInput);
const emailValid = await checkFieldExists('Email', emailInput);
isValid = isValid && phoneNoValid && emailValid;
if (!isValid) {
console.log('Validation failed. Please fill out the required fields.');
return;
}
// Submit form if all validations pass
const formData = new FormData(form);
const url = form.getAttribute('action');
try {
const response = await fetch(url, {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': '{{ csrf_token }}', // Adjust according to your CSRF setup
},
});
const data = await response.json();
if (!response.ok || data.status === 'error') {
if (data.field && data.message) {
const errorField = form.querySelector(`[name="${data.field}"]`);
if (errorField) {
errorField.setCustomValidity(data.message);
errorField.reportValidity();
errorField.focus();
} else {
alert(data.message || 'Error saving contact.');
}
} else {
alert(data.message || 'Error saving contact.');
}
} else {
alert('Contact details saved successfully.');
form.reset();
}
} catch (error) {
console.error('Error:', error);
alert('Error: Unable to save contact. Please try again later.');
}
};
<!--document.addEventListener('DOMContentLoaded', function() {-->
<!-- document.addEventListener('change', function() {-->
<!-- const form = document.getElementById('AddSPOCform');-->
<!-- if (!form) return;-->
<!-- const emailInput = document.getElementById('Email');-->
<!-- const phoneNumberInput = document.getElementById('Phone_number');-->
<!-- const requiredFields = form.querySelectorAll('input[required], select[required]');-->
<!-- 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 = '';-->
<!-- };-->
<!-- emailInput.addEventListener('input', () => {-->
<!-- clearValidation(emailInput);-->
<!-- });-->
<!-- phoneNumberInput.addEventListener('input', () => {-->
<!-- clearValidation(phoneNumberInput);-->
<!-- });-->
<!-- emailInput.addEventListener('blur', () => {-->
<!-- 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,}$/))) {-->
<!-- emailInput.style.borderColor = '';-->
<!-- emailInput.setCustomValidity('Invalid email format.');-->
<!-- emailInput.reportValidity();-->
<!-- } else {-->
<!-- clearValidation(emailInput);-->
<!-- if (emailInput.value.trim()) {-->
<!-- checkFieldExists('Email', emailInput.value.trim());-->
<!-- }-->
<!-- }-->
<!-- });-->
<!-- phoneNumberInput.addEventListener('blur', () => {-->
<!-- if (phoneNumberInput.value.trim() && !phoneNumberInput.value.match(/^[6-9]\d{9}$/)) {-->
<!-- phoneNumberInput.style.borderColor = '';-->
<!-- phoneNumberInput.setCustomValidity('Invalid phone number format.');-->
<!-- phoneNumberInput.reportValidity();-->
<!-- } else {-->
<!-- clearValidation(phoneNumberInput);-->
<!-- if (phoneNumberInput.value.trim()) {-->
<!-- checkFieldExists('Phone_number', phoneNumberInput.value.trim());-->
<!-- }-->
<!-- }-->
<!-- });-->
<!-- function checkFieldExists(fieldName, fieldValue) {-->
<!-- const xhr = new XMLHttpRequest();-->
<!-- const url = `/skyonnadmin/validate_field/?${fieldName}=${encodeURIComponent(fieldValue.trim())}`;-->
<!-- xhr.open('GET', url, true);-->
<!-- xhr.setRequestHeader('X-CSRFToken', '{{ csrf_token }}'); // Ensure CSRF token is included-->
<!-- xhr.onload = function() {-->
<!-- if (xhr.status === 200) {-->
<!-- const response = JSON.parse(xhr.responseText);-->
<!-- if (response.exists) {-->
<!-- handleValidationResult(fieldName, fieldValue, `${fieldName === 'Email' ? 'Email' : 'Phone number'} already exists.`);-->
<!-- } else {-->
<!-- handleValidationResult(fieldName, fieldValue, '');-->
<!-- }-->
<!-- } else {-->
<!-- console.error('Request failed. Status: ' + xhr.status);-->
<!-- }-->
<!-- };-->
<!-- xhr.send();-->
<!-- }-->
<!-- // Function to handle validation result-->
<!-- function handleValidationResult(fieldName, fieldValue, errorMessage) {-->
<!-- const inputField = fieldName === 'Email' ? emailInput : phoneNumberInput;-->
<!-- if (errorMessage) {-->
<!-- inputField.setCustomValidity(errorMessage);-->
<!-- inputField.style.borderColor = '';-->
<!-- inputField.reportValidity();-->
<!-- inputField.focus();-->
<!-- } else {-->
<!-- inputField.setCustomValidity('');-->
<!-- inputField.style.borderColor = '';-->
<!-- }-->
<!-- }-->
<!-- })-->
<!--});-->
<!-- window.saveAdd_SPOC = function() {-->
<!-- const form = document.getElementById('AddSPOCform');-->
<!-- const requiredFields = form.querySelectorAll('input[required], select[required]');-->
<!-- const phoneNumberInput = document.getElementById('Phone_number');-->
<!-- let isValid = true;-->
<!-- requiredFields.forEach(field => {-->
<!-- field.setCustomValidity(''); // Clear previous validation message-->
<!-- field.style.borderColor = ''; // Reset border color-->
<!-- });-->
<!-- // Iterate over each required field to check if it has value-->
<!-- for (let field of requiredFields) {-->
<!-- if (!field.value.trim()) {-->
<!-- isValid = false;-->
<!-- field.style.borderColor = '';-->
<!-- field.setCustomValidity('Please fill out this field.');-->
<!-- field.reportValidity();-->
<!-- break;-->
<!-- } else {-->
<!-- // If field is filled, reset border to black-->
<!-- field.style.borderColor = 'black';-->
<!-- field.setCustomValidity('');-->
<!-- }-->
<!-- }-->
<!-- if (phoneNumberInput.value.trim() && !phoneNumberInput.value.match(/^[6-9]\d{9}$/)) {-->
<!-- isValid = false;-->
<!-- phoneNumberInput.style.borderColor = '';-->
<!-- phoneNumberInput.setCustomValidity('Invalid phone number format.');-->
<!-- phoneNumberInput.reportValidity();-->
<!-- }-->
<!-- if (!isValid) {-->
<!-- // Prevent form submission if validation fails-->
<!-- console.log("Validation failed. Please fill out the required fields.");-->
<!-- return;-->
<!-- }-->
<!-- // Final check for email and phone number uniqueness-->
<!-- checkFieldExistsPromise('Phone_number', phoneNumberInput.value.trim()).then(isUnique => {-->
<!-- if (!isUnique) {-->
<!-- console.log("Validation failed. Phone number already exists.");-->
<!-- phoneNumberInput.setCustomValidity('Phone number already exists.');-->
<!-- phoneNumberInput.style.borderColor = '';-->
<!-- phoneNumberInput.reportValidity();-->
<!-- phoneNumberInput.focus();-->
<!-- return;-->
<!-- }-->
<!-- // If all validations pass, submit the form-->
<!-- const formData = new FormData(form);-->
<!-- const url = form.getAttribute('action');-->
<!-- fetch(url, {-->
<!-- method: 'POST',-->
<!-- body: formData,-->
<!-- headers: {-->
<!-- 'X-CSRFToken': '{{ csrf_token }}',-->
<!-- },-->
<!-- })-->
<!-- .then(response => response.json())-->
<!-- .then(data => {-->
<!-- if (data.status === 'error') {-->
<!-- if (data.field && data.message) {-->
<!-- const errorField = form.querySelector(`[name=${data.field}]`);-->
<!-- if (errorField) {-->
<!-- errorField.style.borderColor = '';-->
<!-- errorField.setCustomValidity(data.message);-->
<!-- errorField.reportValidity();-->
<!-- errorField.focus();-->
<!-- } else {-->
<!-- alert(data.message);-->
<!-- }-->
<!-- } else {-->
<!-- alert(data.message || 'Error saving Contact.');-->
<!-- }-->
<!-- } else {-->
<!-- alert('Contact saved successfully.');-->
<!-- form.reset();-->
<!-- hidePopup(); // Hide the main popup-->
<!-- showSuccessPopup();-->
<!-- }-->
<!-- })-->
<!-- .catch(error => {-->
<!-- console.error('Error:', error);-->
<!-- });-->
<!-- });-->
<!-- };-->
<!-- function checkFieldExistsPromise(fieldName, fieldValue) {-->
<!-- return new Promise((resolve, reject) => {-->
<!-- const xhr = new XMLHttpRequest();-->
<!-- const url = `/skyonnadmin/validate_field/?${fieldName}=${encodeURIComponent(fieldValue.trim())}`;-->
<!-- xhr.open('GET', url, true);-->
<!-- xhr.setRequestHeader('X-CSRFToken', '{{ csrf_token }}'); // Ensure CSRF token is included-->
<!-- xhr.onload = function() {-->
<!-- if (xhr.status === 200) {-->
<!-- const response = JSON.parse(xhr.responseText);-->
<!-- resolve(!response.exists);-->
<!-- } else {-->
<!-- console.error('Request failed. Status: ' + xhr.status);-->
<!-- reject();-->
<!-- }-->
<!-- };-->
<!-- xhr.send();-->
<!-- });-->
<!-- }-->
<!-- function refreshSPOCs() {-->
<!-- console.log('refreshing SPOCs');-->
<!-- let client = document.getElementById('Client').value;-->
<!-- let SPOC1 = document.getElementById('SPOC');-->
<!-- if (!SPOC1) return;-->
<!-- let SPOC2 = document.getElementById('SPOC2');-->
<!-- if (!SPOC2) return;-->
<!-- SPOC1.innerHTML = '<option value="">Select SPOC1</option>';-->
<!-- SPOC2.innerHTML = '<option value="">Select SPOC2</option>';-->
<!-- // Make AJAX request to get filtered data-->
<!-- let xhr = new XMLHttpRequest();-->
<!-- xhr.open('GET', '/skyonnadmin/get_contacts/?Client=' + client, true);-->
<!-- xhr.onload = function() {-->
<!-- if (xhr.status === 200) {-->
<!-- var spocData = JSON.parse(xhr.responseText);-->
<!-- spocData.forEach(function(contact) {-->
<!-- const option1 = document.createElement('option');-->
<!-- option1.value = `${contact.FirstName}-${contact.Department}`;-->
<!-- option1.textContent = `${contact.FirstName}-${contact.Department}`;-->
<!-- SPOC1.appendChild(option1);-->
<!-- const option2 = document.createElement('option');-->
<!-- option2.value = `${contact.FirstName}-${contact.Department}`;-->
<!-- option2.textContent = `${contact.FirstName}-${contact.Department}`;-->
<!-- SPOC2.appendChild(option2);-->
<!-- });-->
<!-- } else {-->
<!-- console.error('Request failed. Status: ' + xhr.status);-->
<!-- }-->
<!-- };-->
<!-- xhr.onerror = function() {-->
<!-- console.error('Request failed.');-->
<!-- };-->
<!-- xhr.send();-->
<!-- }-->
document.addEventListener('click', function(event) {
if (event.target && event.target.id === 'getTeamDetailsButton') {
let client = document.getElementById('ClientDropdown').value;
let subClient = document.getElementById('SubClientDropdown').value; //render team details based on client and subclient selected from add contact database
// Make AJAX request to get filtered data
let xhr = new XMLHttpRequest();
xhr.open('GET', '/skyonnadmin/get_team_details/?client=' + client + '&subClient=' + subClient, true);
xhr.onload = function() {
if (xhr.status === 200) {
// Parse the response and store filtered data
filteredData = JSON.parse(xhr.responseText);
console.log(filteredData);
renderTeamDetails(filteredData); // Render the filtered data in a table
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
function enforceCellMaxLength(event) {
const cell = event.target
const maxLengths = {'Phone_number':10, 'Pincode':6}
const field = cell.getAttribute('data-key');
const maxLength = maxLengths[field]
if(maxLength && cell.textContent.length > maxLength) {
cell.textContent = cell.textContent.slice(0,maxLength);
const range = document.createRange();
const selection = window.getSelection();
range.setStart(cell.childNodes[0], cell.textContent.length); //makes cursor stay at end of text when it reaches max length
range.collapse(true);
selection.removeAllRanges();
selection.addRange(range);
}
}
const TableBody = document.getElementById('TableContainer');
if (!TableBody) return;
TableBody.addEventListener('input',enforceCellMaxLength);
})
function renderTeamDetails(filteredData) {
let tableBody = document.getElementById('TableContainer');
<!-- tableBody.innerHTML ='';-->
const searchKeyword = document.getElementById('searchKeyword').value
if(!searchKeyword) {
tableBody.innerHTML = `
<ul style="margin-left: 400px;">
<li><a href="#" data-department="Hiring Managers">Talent Acquisition</a></li>
<li><a href="#" data-department="Account Department">Accounts Department</a></li>
<li><a href="#" data-department="Human Resources">Human Resources</a></li>
<li><a href="#" data-department="Administration And Legal">Administration And Legal</a></li>
<li><a href="#" data-department="Business Development">Business Development</a></li>
</ul>`;
}
let AddContactTableHTML = '<div id="TableName"><table border="1">';
AddContactTableHTML += '<caption style="margin-left: -10px;"><b>Contact Details</b></caption>';
if (filteredData.contacts.length === 0) {
AddContactTableHTML += '<thead><tr><th>No details found</th></tr></thead>';
AddContactTableHTML += '</table></div>';
tableBody.innerHTML = AddContactTableHTML;
return;
}
else {
AddContactTableHTML += '<thead><tr>';
Object.keys(filteredData.contacts[0]).slice(1).filter(column => column !== 'Contact_id')
.forEach(function (column) {
AddContactTableHTML += `<th>${capitalizeFirstLetter(column)}</th>`;
});
AddContactTableHTML += `<th>Action</th>`;
AddContactTableHTML += '</tr></thead><tbody>';
filteredData.contacts.forEach(function(item) { // Populate table rows dynamically
AddContactTableHTML += `<tr data-contact-id="${item.Contact_id}">`;
Object.keys(item).slice(1).filter(key => key !== 'Contact_id').forEach(function (key) {
AddContactTableHTML += `<td data-key="${key}" ${['FirstName', 'LastName', 'Designation', 'Phone_number', 'Email'].includes(key)? 'data-editable="false"': ''}>${item[key]}</td>`;
});
AddContactTableHTML += `
<td style="width: 150px;">
<button class="edit-button-contact" style="font-size: 15px;">Edit</button>
<button class="delete-button-contact" style="font-size: 15px;">Delete</button>
</td>
`;
AddContactTableHTML +='</tr>';
})
}
AddContactTableHTML += '</tbody></table></div>';
tableBody.innerHTML += AddContactTableHTML;
bindActionButtons();
document.getElementById('TableContainer').addEventListener('click', function(event) {
if (event.target && event.target.tagName === 'A') {
event.preventDefault();
var department = event.target.getAttribute('data-department');
let client = document.getElementById('ClientDropdown').value;
let subClient = document.getElementById('SubClientDropdown').value;
fetchDepartment(department,client,subClient);
}
})
}
function fetchDepartment(department,client,subClient) {
var xhr = new XMLHttpRequest();
xhr.open('GET','/skyonnadmin/get_department/?client=' + client + '&subClient=' +subClient + '&Department=' + encodeURIComponent(department) , true);
xhr.onload = function() {
if (xhr.status === 200) {
var Data = JSON.parse(xhr.responseText);
renderDepartment(Data);
}
else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
function renderDepartment(Data) {
let tableContainer = document.getElementById('TableContainer');
tableContainer.innerHTML =`
<ul style="margin-left: 400px;">
<li><a href="#" data-department="Hiring Managers">Talent Acquisition</a></li>
<li><a href="#" data-department="Account Department">Accounts Department</a></li>
<li><a href="#" data-department="Human Resources">Human Resources</a></li>
<li><a href="#" data-department="Administration And Legal">Administration And Legal</a></li>
<li><a href="#" data-department="Business Development">Business Development</a></li>
</ul>` ;
let DepartmentTableHTML = '<div id="TableName"><table border="1">';
if (!Data || Data.length === 0) {
// If Data is empty, create a row indicating no details found
DepartmentTableHTML += '<thead><tr><th>No details found</th></tr></thead>';
}
else {
DepartmentTableHTML += '<thead><tr>';
Object.keys(filteredData.contacts[0]).slice(1).filter(column => column !== 'Contact_id')
.forEach(function (column) {
DepartmentTableHTML += `<th>${capitalizeFirstLetter(column)}</th>`;
});
DepartmentTableHTML += `<th>Action</th>`;
DepartmentTableHTML += '</tr></thead><tbody>';
Data.forEach(function(item) { // Populate table rows dynamically
DepartmentTableHTML += `<tr data-contact-id="${item.Contact_id}">`;
Object.keys(item).slice(1).filter(key => key !== 'Contact_id').forEach(function (key) {
DepartmentTableHTML += `<td data-key="${key}" ${
['FirstName', 'LastName', 'Designation', 'Phone_number', 'Email'].includes(key)? 'data-editable="false"': ''}>${item[key]}</td>`;
});
DepartmentTableHTML += `
<td style="width: 150px;">
<button class="edit-button-contact" style="font-size: 15px;">Edit</button>
<button class="delete-button-contact" style="font-size: 15px;">Delete</button>
</td>
`;
DepartmentTableHTML +='</tr>';
})
}
DepartmentTableHTML += '</tbody></table></div>';
tableContainer.innerHTML += DepartmentTableHTML;
}
function bindActionButtons() {
const tableContainer = document.getElementById('TableContainer');
const newContainer = tableContainer.cloneNode(true);
tableContainer.parentNode.replaceChild(newContainer, tableContainer);
newContainer.addEventListener('click', function(event) {
const target = event.target;
if (target.classList.contains('edit-button-contact')) {
console.log('binding edit contact');
const row = target.closest('tr');
const contactId = row.getAttribute('data-contact-id');
const contactData = filteredData.contacts.find(contact => contact.Contact_id === contactId);
console.log('Edit contact:', contactData);
editTeamDetails(event,row);
}
if (target.classList.contains('delete-button-contact')) {
console.log('binding delete contact');
const row = target.closest('tr');
const contactId = row.getAttribute('data-contact-id');
deleteContact(event,contactId);
}
});
}
function editTeamDetails(event,row) {
event.preventDefault();
const button = event.target;
if (button.textContent === 'Edit') {
console.log('editing team details');
Array.from(row.cells).forEach((cell, index) => {
if (index < row.cells.length - 1) {
const isEditable = cell.getAttribute('data-editable') !== 'false';
cell.contentEditable = isEditable;
if (!isEditable) {
cell.contentEditable = true;
cell.style.backgroundColor = '';
cell.removeEventListener('blur', validateTeamDetails);
cell.addEventListener('blur', validateTeamDetails);
} else {
cell.contentEditable = false;
cell.style.backgroundColor = '#e0e0e0';
}
}
});
button.textContent = 'Save';
}
else if (button.textContent === 'Save') {
let isValid = true;
Array.from(row.cells).forEach((cell, index) => {
if (index < row.cells.length - 1 && cell.contentEditable === 'true') {
const isCellValid = validateTeamDetails({ target: cell });
if (!isCellValid) {
isValid = false;
}
}
});
if (!isValid) {
alert("Validation failed. Please fill out the required fields.");
return;
}
const contact_id = row.getAttribute('data-contact-id');
const newData = {
Contact_id: contact_id,
Company: row.querySelector('[data-key="Company"]').textContent.trim(),
Sub_company: row.querySelector('[data-key="Sub_company"]').textContent.trim(),
FirstName: row.querySelector('[data-key="FirstName"]').textContent.trim(),
LastName: row.querySelector('[data-key="LastName"]').textContent.trim(),
Department: row.querySelector('[data-key="Department"]').textContent.trim(),
Designation: row.querySelector('[data-key="Designation"]').textContent.trim(),
Phone_number: row.querySelector('[data-key="Phone_number"]').textContent.trim(),
Email: row.querySelector('[data-key="Email"]').textContent.trim()
};
Array.from(row.cells).forEach((cell, index) => {
cell.contentEditable = false;
cell.style.backgroundColor = '';
});
button.textContent = 'Edit';
fetch(`/skyonnadmin/edit_teamDetails/?Contact_id=${encodeURIComponent(contact_id)}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': '{{csrf_token}}'
},
body: JSON.stringify(newData)
})
.then(response => {
if (response.ok) {
console.log('Data saved successfully.');
alert('Data saved successfully!');
} else {
console.error('Failed to save data.');
alert('Failed to save data.');
}
})
.catch(error => {
console.error('Error saving employee data:', error);
});
}
}
function validateTeamDetails(event) {
const cell = event.target;
const field = cell.getAttribute('data-key');
let value = cell.textContent.trim();
const row = cell.closest('tr');
const contactId = row.getAttribute('data-contact-id');
let alertShown = cell.getAttribute('data-alert-shown') === 'true';
let isValid = true;
let hasEmailError = false;
let hasPhoneError = false;
value = cell.textContent.trim();
if ((field === 'FirstName' || field === 'Designation') && value === '') {
if (!alertShown) {
alert(`${field} field cannot be empty`);
cell.setAttribute('data-alert-shown', 'true');
}
cell.style.backgroundColor = "#FFCCCC";
cell.focus();
isValid = false;
} else {
cell.setAttribute('data-alert-shown', 'false');
cell.style.backgroundColor = ""; // Reset background color
}
if (field === 'Email') {
const emailPattern = /^[^\s@]+@[^\s@]+\.[a-zA-Z]{2,}$/;
const emailPattern2 = /^[^\s@]{1,64}@([^\s@_]+\.)+[a-zA-Z]{2,}$/;
if (!value.match(emailPattern) || value.includes('..') || !value.match(emailPattern2)) {
if (!alertShown) {
alert('Invalid Email Address format');
cell.setAttribute('data-alert-shown', 'true'); // Prevent multiple alerts
}
cell.style.backgroundColor = "#FFCCCC"; // Highlight error
isValid = false;
cell.focus();
} else {
const emailExists = checkEmailExistsSync(value,contactId);
console.log('emailExists:',emailExists);
if (emailExists) {
if (!alertShown) {
alert('email already exists. Please use a different email.');
cell.setAttribute('data-alert-shown', 'true');
}
cell.style.backgroundColor = "#FFCCCC"; // Highlight error
isValid = false;
hasEmailError = true; // Mark email error
cell.focus(); // Keep focus on the email field
} else {
cell.style.backgroundColor = "";
hasEmailError = false;
cell.setAttribute('data-alert-shown', 'false');
}
}
}
if (field === 'Phone_number') {
const phonePattern = /^[6-9]\d{9}$/;
if (!value.match(phonePattern)) {
if (!alertShown) {
alert('Invalid phone number format');
cell.setAttribute('data-alert-shown', 'true');
}
cell.style.backgroundColor = "#FFCCCC";
isValid = false;
cell.focus();
} else {
const phoneExists = checkPhoneNumberExistsSync(value,contactId);
console.log('phoneExists:',phoneExists);
if (phoneExists) {
if (!alertShown) {
alert('phone number already exists. Please use a different number.');
cell.setAttribute('data-alert-shown', 'true'); // Prevent multiple alerts
}
cell.style.backgroundColor = "#FFCCCC"; // Highlight error
isValid = false;
hasPhoneError = true; // Mark phone error
cell.focus(); // Keep focus on the phone field
} else {
cell.style.backgroundColor = ""; // Reset background color
hasPhoneError = false; // No phone error
console.log('hasPhoneError:',hasPhoneError);
cell.setAttribute('data-alert-shown', 'false'); // Reset alert
}
}
}
return isValid;
}
function checkEmailExistsSync(email,contactId) {
const xhr = new XMLHttpRequest();
xhr.open('GET', `/skyonnadmin/validate_cell_field/?Email=${encodeURIComponent(email)}&Contact_id=${encodeURIComponent(contactId)}`, false); // Synchronous request with email and contact_id
xhr.send();
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
return response.email_exists;
} else {
console.error('Error checking email.');
return false;
}
}
function checkPhoneNumberExistsSync(phoneNumber,contactId) {
const xhr = new XMLHttpRequest();
xhr.open('GET', `/skyonnadmin/validate_cell_field/?Phone_number=${encodeURIComponent(phoneNumber)}&Contact_id=${encodeURIComponent(contactId)}`, false); // Synchronous request with phone number and contact_id
xhr.send();
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
return response.phone_exists; // Return true if phone number exists
} else {
console.error('Error checking phone number.');
return false;
}
}
function deleteContact(event,contactId) {
event.preventDefault();
console.log('Deleting contact...');
const button = event.target;
const row = button.closest('tr'); // Get the row to delete
const contact_id = row.getAttribute('data-contact-id');
console.log('Deleting row with Contact Id:', contact_id);
if (confirm(`Are you sure you want to delete the details?`)) {
row.remove();
deleteTeamDetails(contact_id); // Call function to delete row from database
}
}
function deleteTeamDetails(contact_id) {
return fetch(`/skyonnadmin/delete_teamDetails/?Contact_id=${encodeURIComponent(contact_id)}`, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': '{{ csrf_token }}' // Properly include the CSRF token
}
})
.then(response => {
if (response.ok) {
console.log(`Contact with id ${contact_id} deleted successfully.`);
<!-- alert(`Contact with id ${contact_id} deleted successfully.`);-->
} else {
console.error('Failed to delete contact from server.');
}
})
.catch(error => {
console.error('Network error during contact deletion:', error);
});
}
document.addEventListener('DOMContentLoaded', function() {
window.refreshClientDropdown=function () {
const form = document.getElementById('Existing_client');
const clientDropdown = form.querySelector('#ClientDropdown');
console.log(clientDropdown);
var xhr = new XMLHttpRequest();
xhr.open('GET', '/skyonnadmin/get_parentCompany/', true);
xhr.onload = function() {
if (xhr.status === 200) {
clientDropdown.innerHTML = '<option value="">Select Client</option>';
var data = JSON.parse(xhr.responseText);
data.forEach(function(company) {
const option = document.createElement('option');
option.value = company.parent_company;
option.textContent = company.parent_company;
clientDropdown.appendChild(option);
});
const tableContainer = document.getElementById('TableContainer');
tableContainer.innerHTML = '';
<!-- const contactTableContainer = document.getElementById('contactContainerId');-->
<!-- contactTableContainer.innerHTML = '';-->
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
});
function checkForOtherOption() {
var departmentSelect = document.getElementById('Department');
var selectedOption = departmentSelect.value;
if (selectedOption === 'Other') {
// Create an input element
var input = document.createElement('input');
input.type = 'text';
input.placeholder = 'Enter department';
input.style.marginLeft = '22px';
input.onblur = function() {
if (input.value.trim() !== "") {
// Add the new department as an option to the select
var newOption = document.createElement('option');
newOption.value = input.value;
newOption.text = input.value;
newOption.selected = true;
departmentSelect.add(newOption, departmentSelect.options.length - 1);
}
// Switch back to select element and reset the "Other" option
departmentSelect.style.display = 'inline-block';
input.style.display = 'none';
departmentSelect.value = input.value;
input.remove();
};
// Insert the input element after the select element
departmentSelect.parentNode.insertBefore(input, departmentSelect.nextSibling);
// Hide the select element and show the input element
departmentSelect.style.display = 'none';
input.style.display = 'inline-block';
input.focus();
}
}
function showTeamDetails(){
console.log('1')
var teamDetailsList = document.getElementById('teamDetailsList');
if (teamDetailsList.style.display === 'none' || teamDetailsList.style.display === '') {
teamDetailsList.style.display = 'block';
} else {
teamDetailsList.style.display = 'none';
}
}
function loadPage(pageName, adminId) {
var urlWithAdminId = pageName + "?admin_id=" + adminId; // Append admin_id as query parameter
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("dynamicContentContainer").innerHTML = this.responseText;
}
};
xhttp.open("GET", urlWithAdminId, true);
xhttp.send();
}
function activateLink(clickedLink) {
var allLinks = document.querySelectorAll('.nav a');
// Remove 'active' class from all links
allLinks.forEach(function(link) {
link.classList.remove('active');
});
// Add 'active' class to the clicked link
clickedLink.classList.add('active');
}
function activateSidebarLink(clickedLink) {
// Remove 'active' class from all sidebar links
var sidebarLinks = document.querySelectorAll('.sidebar-link');
sidebarLinks.forEach(function(link) {
link.classList.remove('active');
});
// Add 'active' class to the clicked sidebar link
clickedLink.classList.add('active');
}
function showClientDetails() {
var clientDetailsContainer = document.getElementById('clientDetailsContainer');
clientDetailsContainer.style.display = 'block';
document.getElementById('dynamicContentContainer').innerHTML = ''; // Clear any existing content
}
function saveEmployee(button) {
var row = button.closest('tr');
Array.from(row.cells).forEach(cell => cell.contentEditable = false);
button.textContent = 'Edit';
button.onclick = function() { editEmployee(this); };
}
function deleteEmployee(button) {
var row = button.closest('tr');
row.parentNode.removeChild(row);
}
function addActionButtons(row) {
var actionCell = row.insertCell();
var editButton = createButton('Edit', editEmployee);
var deleteButton = createButton('Delete', deleteEmployee);
actionCell.append(editButton, deleteButton);
var space = document.createElement('span');
space.innerHTML = '&nbsp;';
actionCell.append(editButton, space, deleteButton);
}
function createButton(text, onclickFunction) {
var button = document.createElement('button');
button.textContent = text;
button.onclick = function() { onclickFunction(this); };
return button;
}
function addRowToOriginalTable(data) {
var table = document.getElementById('originalEmployeeTable').getElementsByTagName('tbody')[0];
var row = table.insertRow();
data.forEach(item => row.insertCell().textContent = item);
addActionButtons(row);
}
var isNewTableAdded = false;
function addNewTable() {
if (!isNewTableAdded) {
var originalTableParent = document.querySelector('.original-table');
var newTable = document.createElement('table');
newTable.id = 'newEmployeeTable';
newTable.style.width = '80%';
newTable.style.Color = 'white';
newTable.style.marginLeft = '350px';
newTable.style.borderCollapse = 'collapse';
newTable.style.marginBottom = '20px';
newTable.style.borderBottom = 'none';
var originalTableHeader = originalTableParent.querySelector('thead').cloneNode(true);
newTable.appendChild(originalTableHeader);
var newRow = newTable.insertRow();
var columns = originalTableHeader.querySelectorAll('th').length;
for (var i = 0; i < columns - 1; i++) {
newRow.insertCell().contentEditable = true;
}
newRow.insertCell().innerHTML = '<button onclick="saveNewTable()">Save</button>';
originalTableParent.appendChild(newTable);
isNewTableAdded = true;
}
}
function saveNewTable() {
var confirmation = confirm("Are you sure you want to save the details?");
if (confirmation) {
var originalTable = document.getElementById('originalEmployeeTable');
var originalTBody = originalTable.getElementsByTagName('tbody')[0];
var newTable = document.getElementById('newEmployeeTable');
var newRows = newTable.getElementsByTagName('tr');
console.log('new rows assigning');
var addContact= [];
console.log('adding contact started');
for (var i = 1; i < newRows.length; i++) {
var newData = Array.from(newRows[i].cells).slice(0, -1).map(cell => cell.innerText);
addContact.push({
name: newData[0], // Assuming first cell is name, adjust if needed
designation: newData[1], // Assuming second cell is designation, adjust if needed
department: newData[2], // Assuming third cell is department, adjust if needed
phone_no: newData[3], // Assuming fourth cell is phone_no, adjust if needed
email: newData[4], // Assuming fifth cell is email, adjust if needed
location: newData[5] // Assuming sixth cell is location, adjust if needed
// Add other properties as needed
});
console.log(addContact)
}
fetch('/skyonnadmin/add_contact/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest',
'X-CSRFToken': '{{ csrf_token }}'
},
body: JSON.stringify(addContact)
})
.then(response => {
if (response.ok) {
console.log('Data saved successfully.');
for (var i = 1; i < newRows.length; i++) {
var newRow = originalTBody.insertRow();
newData.forEach(item => newRow.insertCell().textContent = item);
addActionButtons(newRow);
console.log('new rows assigned')
}
newTable.remove();
isNewTableAdded = false;
}
else {
console.error('Failed to save data.');
}
})
.catch(error => {
console.error('Error:', error);
});
}
}
document.addEventListener('click', function(event) {
if (event.target && event.target.id === 'getCompanyDetailsButton') {
let client = document.getElementById('ClientDropdown').value;
let subClient = document.getElementById('SubClientDropdown').value;
// Make AJAX request to get filtered data
let xhr = new XMLHttpRequest();
xhr.open('GET', '/skyonnadmin/get_filtered_data/?client=' + client + '&subClient=' + subClient, true);
xhr.onload = function() {
if (xhr.status === 200) {
// Parse the response and store filtered data
filteredData = JSON.parse(xhr.responseText);
console.log(filteredData);
renderTable(filteredData); // Render the filtered data in a table
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
});
function capitalizeFirstLetter(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
function renderTable(filteredData) {
let tableContainer = document.getElementById('TableContainer');
tableContainer.innerHTML = '';
const searchKeyword = document.getElementById('searchKeyword').value.trim();
const searchButton = document.getElementById('searchButton')
if (filteredData.client_details.length > 0 && filteredData.sub_company_details.length > 0) {
renderClientTable(filteredData.client_details, 'Main client');
renderClientTable(filteredData.sub_company_details, 'Sub client');
} else {
renderClientTable(filteredData.client_details, 'Main client');
}
AddActionButtons();
}
function renderClientTable(data, caption) {
let tableHTML = `<div id="TableName"><table border="1">`;
tableHTML += `<caption><b>${caption}</b></caption>`;
tableHTML += '<thead><tr>';
let columns = Object.keys(data[0]).slice(1).filter(column => !['client_id', 'sub_client_id'].includes(column)); // Skip the first column (usually ID)
columns.forEach(function(column) {
tableHTML += `<th>${capitalizeFirstLetter(column)}</th>`;
});
tableHTML += `<th style="width: 150px;">Action</th>`;
tableHTML += '</tr></thead><tbody>';
data.forEach(function(item) {
let idAttribute = '';
if (item.client_id) {
idAttribute = `data-client-id="${item.client_id}" data-parent-company="${item.parent_company}"`;
} else if (item.sub_client_id) {
idAttribute = `data-sub-client-id="${item.sub_client_id}" data-original-subcompany="${item.sub_company}" data-parent-company="${item.parent_company}"`;
}
tableHTML += `<tr ${idAttribute}>`;
columns.forEach(function(column) {
tableHTML += `<td data-key="${column}" ${['parent_company', 'country'].includes(column) ? 'data-editable="false"' : 'data-editable="true"' } style="word-wrap: break-word; max-width: 100px;">${item[column]}</td>`;
});
tableHTML += `
<td style="width: 150px;">
<button class="edit-button-client" style="font-size: 15px; margin-left; -50px;">Edit</button>
<button class="delete-button-client" style="font-size: 15px;">Delete</button>
</td>
`;
tableHTML += '</tr>';
});
tableHTML += '</tbody></table></div>';
if (caption === 'Main client') {
tableHTML += '<div id="error-message1" style="color: red; margin-top: 2px; margin-left: 1270px;"></div>';
tableHTML += '</div>'; // Close clientTableContainer div
} else if (caption === 'Sub client') {
tableHTML += '<div id="error-message2" style="color: red; margin-top: 2px; margin-left: 1280px;"></div>';
tableHTML += '</div>'; // Close subClientTableContainer div
}
document.getElementById('TableContainer').innerHTML += tableHTML;
}
function AddActionButtons() {
document.querySelectorAll('.edit-button-client').forEach(button => {
button.addEventListener('click', editCompanyDetails);
});
document.querySelectorAll('.delete-button-client').forEach(button => {
button.addEventListener('click', deleteClient);
});
}
function editCompanyDetails(event) {
event.preventDefault();
const button = event.target;
let row = button.closest('tr');
console.log('editing company details');
Array.from(row.cells).forEach((cell, index) => {
if (index < row.cells.length - 1) { // Exclude the last cell (actions cell)
const isEditable = cell.getAttribute('data-editable') === 'true';
console.log(isEditable);
if (isEditable) {
cell.contentEditable = true;
cell.removeEventListener('blur', validateCompanyDetails);
cell.addEventListener('blur', validateCompanyDetails);
} else {
cell.contentEditable = false;
cell.style.backgroundColor = '#e0e0e0'; // Set background color for non-editable cells
}
}
});
button.textContent = 'Save';
button.classList.remove('edit-button-client');
button.classList.add('save-button-client');
button.removeEventListener('click', editCompanyDetails);
button.addEventListener('click', saveCompanyDetails);
}
function validateCompanyDetails(event) {
const cell = event.target;
const value = cell.textContent.trim();
const field = cell.getAttribute('data-key');
let isValid = true; // Assume the input is valid by default
let alertShown = cell.getAttribute('data-alert-shown') === 'true';
const row = cell.closest('tr');
// Identify the error container based on client or sub-client
let errorContainer;
if (row.getAttribute('data-client-id')) {
errorContainer = document.getElementById('error-message1');
} else if (row.getAttribute('data-sub-client-id')) {
errorContainer = document.getElementById('error-message2');
}
// Clear previous error messages
if (errorContainer) {
errorContainer.innerHTML = '';
}
// Define the fields that require validation
const fieldsToValidate = ['sub_company','GST_No', 'location_Id', 'location_id', 'address_1', 'City', 'state', 'Pincode'];
const isPincode = field === 'Pincode';
const pincodePattern = /^[1-9][0-9]{5}$/;
// Check if the field is allowed to be empty
if (fieldsToValidate.includes(field) && value === '') {
if (!alertShown) {
alert(`${field} field cannot be empty`);
cell.setAttribute('data-alert-shown', 'true');
}
isValid = false;
} else {
cell.setAttribute('data-alert-shown', 'false'); // Reset alert flag for valid input
}
// Pincode validation
if (isPincode) {
if (!pincodePattern.test(value)) {
if (!alertShown) {
alert('Invalid Pincode format');
cell.setAttribute('data-alert-shown', 'true');
}
isValid = false;
} else {
cell.setAttribute('data-alert-shown', 'false'); // Reset flag for valid pincode
}
}
// Set styling and validity feedback
if (!isValid) {
cell.style.backgroundColor = "#FFCCCC";
cell.setAttribute('data-valid', 'false');
cell.focus();
} else {
cell.style.backgroundColor = "";
cell.setAttribute('data-valid', 'true');
}
return isValid;
}
function saveCompanyDetails(event) {
event.preventDefault();
const button = event.target;
const row = button.closest('tr');
console.log('saving');
let isValid = true;
const originalSubcompany = row.getAttribute('data-original-subcompany');
console.log('originalSubcompany',originalSubcompany);
// Get the error row below the current row
Array.from(row.cells).forEach((cell, index) => {
if (index < row.cells.length - 1) { // Exclude the last cell (actions cell)
if (cell.contentEditable === 'true') {
validateCompanyDetails({ target: cell });
if (cell.getAttribute('data-valid') === 'false') {
isValid = false;
}
}
}
});
if (!isValid) {
alert('Please fix the validation errors before saving.');
return;
}
const id = row.getAttribute('data-client-id') || row.getAttribute('data-sub-client-id');
console.log(id);
let newData = {};
if (row.getAttribute('data-client-id')) {
newData = {
client_id: id,
parent_company: getDataValue(row, 'parent_company'),
GST_No: getDataValue(row, 'GST_No'),
location_Id: getDataValue(row, 'location_Id'),
address_1: getDataValue(row, 'address_1'),
address_2: getDataValue(row, 'address_2'),
City: getDataValue(row, 'City'),
state: getDataValue(row, 'state'),
Pincode: getDataValue(row, 'Pincode'),
country: getDataValue(row, 'country')
};
} else if (row.getAttribute('data-sub-client-id')) {
newData = {
sub_client_id: id,
parent_company: getDataValue(row, 'parent_company'),
sub_company: getDataValue(row, 'sub_company'),
GST_No: getDataValue(row, 'GST_No'),
location_id: getDataValue(row, 'location_id'),
address_1: getDataValue(row, 'address_1'),
address_2: getDataValue(row, 'address_2'),
City: getDataValue(row, 'City'),
State: getDataValue(row, 'State'),
Pincode: getDataValue(row, 'Pincode'),
country: getDataValue(row, 'country')
};
}
console.log('New data to save:', newData);
const updateSubcompany = newData.sub_company
console.log('updateSubcompany',updateSubcompany);
// Fetch request to save data
fetch(`/skyonnadmin/edit_CompanyDetails/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': '{{ csrf_token }}'
},
body: JSON.stringify(newData)
})
.then(response => {
if (response.ok) {
console.log(`Data with id ${id} saved successfully.`);
alert(`Data with id ${id} saved successfully.`);
Array.from(row.cells).forEach((cell, index) => {
if (index < row.cells.length - 1) { // Exclude the last cell (actions cell)
cell.contentEditable = false;
cell.style.backgroundColor = 'white';
cell.removeEventListener('blur', validateCompanyDetails);
}
});
button.textContent = 'Edit';
button.classList.remove('save-button-client');
button.classList.add('edit-button-client');
button.removeEventListener('click', saveCompanyDetails);
button.addEventListener('click', editCompanyDetails);
if(originalSubcompany !== updateSubcompany && newData.sub_client_id) {
refreshClientDropdown();
}
} else {
throw new Error('Failed to save details.');
}
})
.catch(error => {
console.error('Error saving details:', error);
// Handle error
});
function getDataValue(row, key) {
const cell = row.querySelector(`[data-key="${key}"]`);
return cell ? cell.textContent.trim() : '';
}
}
function deleteClient(event) {
console.log('deleting');
event.preventDefault();
const button = event.target;
const row = button.closest('tr');
const clientId = row.getAttribute('data-client-id');
const subClientId = row.getAttribute('data-sub-client-id');
const parentCompanyId = row.getAttribute('data-parent-company');
const subCompanyId = row.getAttribute('data-original-subcompany');
<!-- const idToDelete = row.getAttribute('parent_company');-->
console.log('Deleting row with id:', parentCompanyId);
const confirmationMessage = clientId
? `Are you sure you want to delete the Client,Subclient and Contact data for Parent Company: ${parentCompanyId}?`
: `Are you sure you want to delete the subclient ${subCompanyId} with client : ${parentCompanyId}?`;
if (confirm(confirmationMessage)) {
deleteCompanyDetails({ client_id: clientId, sub_client_id: subClientId, parent_company: parentCompanyId }, row);
}
}
function deleteCompanyDetails(data,row) {
fetch(`/skyonnadmin/delete_CompanyDetails/` , {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': '{{ csrf_token }}' // Include CSRF token if needed
},
body: JSON.stringify(data)
})
.then(response => {
if (response.ok) {
console.log(`Data deleted successfully.`);
row.remove(); // Remove the row from the table
refreshClientDropdown();
} else {
throw new Error('Failed to delete details.');
}
})
.catch(error => {
console.error('Error deleting details:', error);
// Handle error
});
}
function saveForm() {
event.preventDefault();
var formData = new FormData(document.getElementById('jobPostingForm'));
if (!validateForm(formData)) {
return false;
}
var xhr = new XMLHttpRequest();
xhr.open('POST', 'url/to/submit/form', true);
xhr.onload = function() {
if (xhr.status >= 200 && xhr.status < 300) {
console.log(xhr.responseText);
} else {
console.error(xhr.statusText);
}
};
xhr.onerror = function() {
console.error(xhr.statusText);
};
xhr.send(formData);
return false;
}
function validateForm(formData) {
var requiredFields = ['ParentCompany', 'SubCompany', 'Location', 'Department', 'GSTNo', 'Address', 'FirstName', 'PhoneNo1', 'CompanyEmail', 'Designation', 'LastName', 'Location', 'Designation'];
for (var i = 0; i < requiredFields.length; i++) {
var field = requiredFields[i];
if (!formData.get(field)) {
alert("Please fill in all the required fields.");
return false;
}
}
return true;
}
document.addEventListener('DOMContentLoaded', function() {
document.addEventListener('change', function() {
const form = document.getElementById('addClientForm');
if (!form) return;
const parentCompanyInput = document.getElementById('ParentCompany');
let requiredFields = form.querySelectorAll('input[required], select[required]');
const clearValidation = (field) => {
field.setCustomValidity('');
field.style.borderColor = '';
};
const validateField = (field) => {
if (!field.value.trim()) {
field.style.borderColor = '';
field.setCustomValidity('Please fill out this field.');
field.reportValidity();
field.focus();
return false;
} else {
field.style.borderColor = 'black';
field.setCustomValidity('');
return true;
}
};
parentCompanyInput.addEventListener('input', () => clearValidation(parentCompanyInput));
parentCompanyInput.addEventListener('blur', () => {
if (validateField(parentCompanyInput)) {
const xhr = new XMLHttpRequest();
xhr.open('GET', '/skyonnadmin/check_parent_company/?ParentCompany=' + encodeURIComponent(parentCompanyInput.value), true);
xhr.onload = () => {
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
if (response.exists) {
parentCompanyInput.style.borderColor = '';
parentCompanyInput.setCustomValidity('Parent company already exists.');
parentCompanyInput.reportValidity();
} else {
parentCompanyInput.style.borderColor = 'black';
}
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
});
});
});
window.saveClient = function() {
let isValid = true;
const form = document.getElementById('addClientForm');
let requiredFields = form.querySelectorAll('input[required], select[required]');
requiredFields.forEach(field => {
field.setCustomValidity(''); // Clear previous validation message
field.style.borderColor = ''; // Reset border color
});
// Iterate over each required field to check if it has value
for (let field of requiredFields) {
if (!field.value.trim()) {
isValid = false;
field.style.borderColor = '';
field.setCustomValidity('Please fill out this field.');
field.reportValidity();
field.focus();
break;
} else {
// If field is filled, reset border to black
field.style.borderColor = 'black';
field.setCustomValidity('');
}
}
if (!isValid) {
// Prevent form submission if validation fails
console.log("Validation failed. Please fill out the required fields.");
return;
}
const formData = new FormData(form);
const url = form.getAttribute('action');
fetch(url, {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': '{{ csrf_token }}',
},
})
.then(response => response.json())
.then(data => {
if (data.status === 'error') {
if (data.field && data.message) {
const errorField = form.querySelector(`[name=${data.field}]`);
if (errorField) {
errorField.style.borderColor = '';
errorField.setCustomValidity(data.message);
errorField.reportValidity();
errorField.focus();
errorField.value = '';
errorField.addEventListener('input', () => {
errorField.style.borderColor = 'black';
errorField.setCustomValidity('');
errorField.reportValidity();
}, { once: true });
} else {
alert(data.message);
}
} else {
alert(data.message || 'Error saving Client.');
}
} else {
alert('Client saved successfully.');
form.reset();
}
})
.catch(error => {
console.error('Error:', error);
alert('Error: ' + error.message);
});
};
document.addEventListener('DOMContentLoaded', function() {
window.populateParentCompanyDropdown=function() {
const form = document.getElementById('subLocationsForm');
if (!form) return;
const clientDropdown = form.querySelector('#ParentCompany');
if (!clientDropdown) return;
var xhr = new XMLHttpRequest();
xhr.open('GET', '/skyonnadmin/get_parentCompany/', true);
xhr.onload = function() {
if (xhr.status === 200) {
clientDropdown.innerHTML = '<option value="">Select Client</option>';
var data = JSON.parse(xhr.responseText);
data.forEach(function(company) {
const option = document.createElement('option');
option.value = company.parent_company;
option.textContent = company.parent_company;
clientDropdown.appendChild(option);
});
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
});
function toggleaddSubLocation() {
var mainForm = document.getElementById("addClientForm");
var subForm = document.getElementById("subLocationsForm");
var addButton = document.getElementById("addSubLocation");
mainForm.style.display = "none";
subForm.style.display = "block";
addButton.style.display = "none";
// Populate the dropdown when the form is displayed
populateParentCompanyDropdown();
}
function saveSubLocation() {
const form = document.getElementById('subLocationsForm');
const requiredFields = form.querySelectorAll('input[required], select[required]');
let isValid = true;
// Clear any previous custom validation messages and reset border colors
requiredFields.forEach(field => {
field.setCustomValidity(''); // Clear previous validation message
field.style.borderColor = ''; // Reset border color
});
// Iterate over each required field to check if it has value
for (let field of requiredFields) {
if (!field.value.trim()) {
isValid = false;
field.style.borderColor = '';
field.setCustomValidity('Please fill out this field.');
field.reportValidity();
field.focus();
break;
}
}
if (!isValid) {
// Prevent form submission if validation fails
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 => {
return response.json().then(data => {
if (!response.ok) {
// Handle specific error messages
if (data.message) {
throw new Error(data.message);
}
}
return data;
});
})
.then(data => {
console.log('Success:', data);
alert('Sub_Location saved successfully.');
})
.catch(error => {
console.error('Error:', error);
alert('Error:' + error.message);
})
.finally(() => {
// Clear all fields in the form whether success or error
form.reset();
});
}
document.addEventListener('DOMContentLoaded', function() {
document.addEventListener('change', function() {
const form = document.getElementById('addSubClientForm');
if (!form) return;
const ParentCompanyInput = document.getElementById('ParentCompany');
const SubCompanyInput = document.getElementById('SubCompany');
const locationInput = document.getElementById('Location_Id');
const GSTNoInput = document.getElementById('GSTNo');
console.log('GSTNoInput:',GSTNoInput.disabled);
const requiredFields = form.querySelectorAll('input[required], select[required]');
const clearValidation = (field) => {
field.setCustomValidity('');
field.style.borderColor = '';
};
const validateField = (field) => {
if (!field.value.trim()) {
field.style.borderColor = '';
field.setCustomValidity('Please fill out this field.');
field.reportValidity();
field.focus();
return false;
} else {
field.style.borderColor = 'black';
field.setCustomValidity('');
return true;
}
};
const fetchGSTNo = () => {
const xhr = new XMLHttpRequest();
xhr.open('GET', '/skyonnadmin/get_GSTNo/?ParentCompany=' + encodeURIComponent(ParentCompanyInput.value), true);
xhr.onload = () => {
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
if (response.GST_No) {
GSTNoInput.value = response.GST_No;
}
} else {
console.error('Request failed. Status:', xhr.status);
}
};
xhr.send();
};
ParentCompanyInput.addEventListener('change', () => {
if (ParentCompanyInput.value) {
fetchGSTNo();
}
});
ParentCompanyInput.addEventListener('blur', () => {
if (ParentCompanyInput.value) {
fetchGSTNo();
}
});
SubCompanyInput.addEventListener('input', () => clearValidation(SubCompanyInput));
SubCompanyInput.addEventListener('blur', () => {
if (validateField(SubCompanyInput) && GSTNoInput.disabled) {
const xhr = new XMLHttpRequest();
xhr.open('GET', '/skyonnadmin/check_sub_company/?SubCompany=' + encodeURIComponent(SubCompanyInput.value), true);
xhr.onload = () => {
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
if (response.exists) {
SubCompanyInput.style.borderColor = '';
SubCompanyInput.setCustomValidity('Sub company already exists.');
SubCompanyInput.reportValidity();
} else {
SubCompanyInput.style.borderColor = '';
}
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
});
if (changeButton.textContent === 'Change') {
changeButton.addEventListener('click', function (event) {
event.preventDefault();
console.log('Change clicked');
GSTNoInput.disabled = false; // Enable input for editing
GSTNoInput.focus(); // Focus on the input field
changeButton.textContent = 'Save';
})
} else if (changeButton.textContent === 'Save' && GSTNoInput.value.trim() !== '') {
changeButton.addEventListener('click', function (event) {
console.log('Save clicked');
GSTNoInput.disabled = true; // Disable the input
changeButton.textContent = 'Change'; // Change the button text back to Change
console.log('Updated GST No:', updatedGST);
})
}
});
});
window.saveSubClient = function() {
let isValid = true;
const GSTNoInput = document.getElementById('GSTNo');
const changeButton = document.getElementById("changeButton");
const form = document.getElementById('addSubClientForm');
let requiredFields = form.querySelectorAll('input[required], select[required]');
requiredFields.forEach(field => {
field.setCustomValidity(''); // Clear previous validation message
field.style.borderColor = ''; // Reset border color
});
// Iterate over each required field to check if it has value
for (let field of requiredFields) {
if (!field.value.trim()) {
isValid = false;
field.style.borderColor = '';
field.setCustomValidity('Please fill out this field.');
field.reportValidity();
field.focus();
break;
} else {
// If field is filled, reset border to black
field.style.borderColor = 'black';
field.setCustomValidity('');
}
}
if (!isValid) {
// Prevent form submission if validation fails
console.log("Validation failed. Please fill out the required fields.");
return;
}
const updatedGST = GSTNoInput.value.trim(); // Get the input value
if (!updatedGST) {
GSTNoInput.setCustomValidity('GST field cannot be empty');
GSTNoInput.reportValidity();
GSTNoInput.focus(); // Refocus the input field if invalid
return;
}
if (changeButton.textContent === 'Save') {
GSTNoInput.setCustomValidity('click save button');
GSTNoInput.reportValidity();
GSTNoInput.focus(); // Refocus the input field if invalid
return;
}
const formData = new FormData(form);
formData.append('GSTNo',GSTNoInput.value);
const url = form.getAttribute('action');
fetch(url, {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': '{{ csrf_token }}',
},
})
.then(response => response.json())
.then(data => {
if (data.status === 'error') {
if (data.field && data.message) {
const errorField = form.querySelector(`[name=${data.field}]`);
if (errorField) {
errorField.style.borderColor = '';
errorField.setCustomValidity(data.message);
errorField.reportValidity();
errorField.focus();
errorField.value = '';
errorField.addEventListener('input', () => clearValidation(errorField), { once: true });
} else {
alert(data.message);
}
} else {
alert(data.message || 'Error saving Sub Client.');
}
} else {
alert('Sub Client saved successfully.');
form.reset();
GSTNoInput.disabled = true;
changeButton.textContent = 'Change';
}
})
.catch(error => {
console.error('Error:', error);
alert('Error: ' + error.message);
});
};
function hideClientDetails() {
// Example implementation
var clientDetailsContainer = document.getElementById('clientDetailsContainer');
if (clientDetailsContainer) {
clientDetailsContainer.style.display = 'none';
}
10 months ago
}
2 weeks ago
document.addEventListener('DOMContentLoaded', function() {
document.addEventListener('change', function(event) {
var target = event.target;
const formId = document.getElementById('Existing_client');
console.log(formId);
if (target && target.id === 'ClientDropdown' && formId.id === 'Existing_client') {
var parentCompany = target.value; // Get selected client
var subClientDropdown = target.closest('form').querySelector('#SubClientDropdown');
subClientDropdown.innerHTML = '';
// Make an AJAX request to fetch sub-clients filtered by selected client
var xhr = new XMLHttpRequest();
xhr.open('GET', '/skyonnadmin/get_subclients/?parent_company=' + parentCompany, true);
xhr.onload = function() {
if (xhr.status === 200) {
subClientDropdown.innerHTML = '<option value="All Sub Clients">All Sub Clients</option>';
// Parse response and add options to SubClient dropdown
var subClients = JSON.parse(xhr.responseText);
subClients.forEach(function(subClient) {
var option = document.createElement('option');
option.value = subClient;
option.text = subClient;
subClientDropdown.appendChild(option);
});
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send();
}
});
});
const subCompanyInput = document.getElementById('SubCompany');
subCompanyInput.addEventListener('input', () => {
subCompanyInput.value = subCompanyInput.value.replace(/\b\w/g, (char) => char.toUpperCase());
});
<!-- document.addEventListener('DOMContentLoaded', function() {-->
<!-- // Define a variable to store the filtered data-->
<!-- let filteredData = [];-->
<!-- // Function to display filtered data based on selected tab-->
<!-- function displayFilteredData(department) {-->
<!-- // Clear the table body-->
<!-- let tableBody = document.querySelector('#originalEmployeeTable tbody');-->
<!-- tableBody.innerHTML = '';-->
<!-- // Filter the data based on department-->
<!-- let departmentData = filteredData.filter(function(item) {-->
<!-- return item.department.toLowerCase() === department;-->
<!-- });-->
<!-- // Append filtered data to the table-->
<!-- departmentData.forEach(function(item) {-->
<!-- let row = `<tr>-->
<!-- <td>${item.name}</td>-->
<!-- <td>${item.designation}</td>-->
<!-- <td>${item.department}</td>-->
<!-- <td>${item.phone}</td>-->
<!-- <td>${item.email}</td>-->
<!-- <td>${item.location}</td>-->
<!-- <td>Action</td>-->
<!-- </tr>`;-->
<!-- tableBody.innerHTML += row;-->
<!-- });-->
<!-- }-->
<!-- // Event listener for clicking on department tabs-->
<!-- let departmentLinks = document.querySelectorAll('.department-link');-->
<!-- departmentLinks.forEach(function(link) {-->
<!-- link.addEventListener('click', function() {-->
<!-- let department = this.getAttribute('data-department');-->
<!-- displayFilteredData(department);-->
<!-- });-->
<!-- });-->
<!-- -->
<!-- -->
<!-- // Event listener for clicking on Get Details button-->
<!--document.addEventListener('click', function(event) {-->
<!-- if (event.target && event.target.id === 'getDetailsButton') {-->
<!-- console.log('getting filtered data')-->
<!-- let client = document.getElementById('ClientDropdown').value;-->
<!-- let subClient = document.getElementById('SubClientDropdown').value;-->
<!-- // Make AJAX request to get filtered data-->
<!-- let xhr = new XMLHttpRequest();-->
<!-- xhr.open('GET', '/skyonnadmin/get_filtered_data/?client=' + client + '&subClient=' + subClient, true);-->
<!-- xhr.onload = function() {-->
<!-- if (xhr.status === 200) {-->
<!-- // Parse the response and store filtered data-->
<!-- filteredData = JSON.parse(xhr.responseText);-->
<!-- // Display data based on selected tab-->
<!-- let activeTab = document.querySelector('.department-link.active');-->
<!-- if (activeTab) {-->
<!-- let department = activeTab.getAttribute('data-department');-->
<!-- displayFilteredData(department);-->
<!-- }-->
<!-- } else {-->
<!-- console.error('Request failed. Status: ' + xhr.status);-->
<!-- }-->
<!-- };-->
<!-- xhr.send();-->
<!-- }-->
<!--});-->
<!-- });-->
<!-- function showPopup() {-->
<!-- document.getElementById('popup').style.display = 'block';-->
<!-- }-->
<!-- function hidePopup() {-->
<!-- document.getElementById('popup').style.display = 'none';-->
<!-- }-->
<!-- function saveForm() {-->
<!-- if (validateForm()) {-->
<!-- document.getElementById('jobPostingForm').submit();-->
<!-- hidePopup();-->
<!-- }-->
<!-- }-->
<!-- function validateForm() {-->
<!-- var requiredFields = document.querySelectorAll('input[required], select[required], textarea[required]');-->
<!-- var isValid = true;-->
<!-- requiredFields.forEach(function(field) {-->
<!-- if (!field.value.trim()) {-->
<!-- isValid = false;-->
<!-- field.style.border = '2px solid red';-->
<!-- } else {-->
<!-- field.style.border = '1px solid #ccc';-->
<!-- }-->
<!-- });-->
<!-- if (!isValid) {-->
<!-- alert('Please fill in all required fields.');-->
<!-- }-->
<!-- return isValid;-->
<!-- }-->
<!-- function limitNumberOfPostings(input) {-->
<!-- var maxPostings = 100;-->
<!-- if (input.value > maxPostings) {-->
<!-- input.value = maxPostings; // Set the value to the maximum allowed-->
<!-- }-->
<!-- }-->
<!-- function updateInputField() {-->
<!-- var selectedStatesInput = document.getElementById("selectedStatesInput");-->
<!-- var selectedStates = [];-->
<!-- var checkboxes = document.querySelectorAll('input[type="checkbox"]:checked');-->
<!-- for (var i = 0; i < checkboxes.length; i++) {-->
<!-- selectedStates.push(checkboxes[i].value);-->
<!-- }-->
<!-- selectedStatesInput.value = selectedStates.join(", ");-->
<!-- // Close the dropdown after updating the input field-->
<!-- var dropdownContent = document.getElementById("checkboxContainer");-->
<!-- dropdownContent.style.display = "none";-->
<!--}-->
<!--function toggleOtherInputField() {-->
<!-- var otherCheckbox = document.getElementById("OtherCheckbox");-->
<!-- var selectedStatesInput = document.getElementById("selectedStatesInput");-->
<!-- var dropdownContent = document.getElementById("checkboxContainer");-->
<!-- if (otherCheckbox.checked) {-->
<!-- // Show the modal for adding a new location-->
<!-- showAddLocationModal();-->
<!-- dropdownContent.style.display = "none";-->
<!-- } else {-->
<!-- // If "Other" is unchecked, clear the input field, make it readonly again, and show dropdown content-->
<!-- selectedStatesInput.value = "";-->
<!-- selectedStatesInput.readOnly = true;-->
<!-- dropdownContent.style.display = "block";-->
<!-- }-->
<!--}-->
<!--function toggleDropdown() {-->
<!-- var dropdownContent = document.getElementById("checkboxContainer");-->
<!-- if (dropdownContent.style.display === "none") {-->
<!-- dropdownContent.style.display = "block";-->
<!-- } else {-->
<!-- dropdownContent.style.display = "none";-->
<!-- }-->
<!--}-->
<!--function showAddLocationModal() {-->
<!-- document.getElementById("addLocationModal").style.display = "block";-->
<!--}-->
<!--function closeAddLocationModal() {-->
<!-- document.getElementById("addLocationModal").style.display = "none";-->
<!-- document.getElementById("OtherCheckbox").checked = false;-->
<!--}-->
<!--function saveNewLocation() {-->
<!-- var newLocation = document.getElementById("newLocationInput").value.trim();-->
<!-- var selectedStatesInput = document.getElementById("selectedStatesInput");-->
<!-- if (newLocation) {-->
<!-- // Add new location to the dropdown-->
<!-- addLocationToDropdown(newLocation);-->
<!-- // Save new location to local storage-->
<!-- saveLocation(newLocation);-->
<!-- // Update the input field with the new location-->
<!-- var currentInput = selectedStatesInput.value;-->
<!-- selectedStatesInput.value = currentInput ? currentInput + ", " + newLocation : newLocation;-->
<!-- // Clear and reset the input field-->
<!-- document.getElementById("newLocationInput").value = "";-->
<!-- closeAddLocationModal();-->
<!-- } else {-->
<!-- alert("Please enter a location.");-->
<!-- }-->
<!--}-->
<!--function addLocationToDropdown(location) {-->
<!-- var checkboxContainer = document.getElementById("checkboxItems");-->
<!-- if (!checkboxContainer) {-->
<!-- return;-->
<!-- }-->
<!-- var newCheckbox = document.createElement("input");-->
<!-- newCheckbox.type = "checkbox";-->
<!-- newCheckbox.value = location;-->
<!-- newCheckbox.style.marginLeft = "-50px";-->
<!-- newCheckbox.id = "checkbox_" + location.replace(/\s+/g, '_');-->
<!-- newCheckbox.name = "checkbox_" + location.replace(/\s+/g, '_');-->
<!-- newCheckbox.onchange = updateInputField;-->
<!-- var newCheckboxLabel = document.createElement("label");-->
<!-- newCheckboxLabel.style.marginLeft = "-48px";-->
<!-- newCheckboxLabel.setAttribute("for", newCheckbox.id);-->
<!-- newCheckboxLabel.appendChild(document.createTextNode(" " + location));-->
<!-- checkboxContainer.appendChild(newCheckbox);-->
<!-- checkboxContainer.appendChild(newCheckboxLabel);-->
<!-- checkboxContainer.appendChild(document.createElement("br"));-->
<!--}-->
<!--function saveLocation(location) {-->
<!-- var locations = JSON.parse(localStorage.getItem('locations')) || [];-->
<!-- locations.push(location);-->
<!-- localStorage.setItem('locations', JSON.stringify(locations));-->
<!--}-->
<!--function loadLocations() {-->
<!-- var locations = JSON.parse(localStorage.getItem('locations')) || [];-->
<!-- locations.forEach(function(location) {-->
<!-- addLocationToDropdown(location);-->
<!-- });-->
<!--}-->
<!--document.addEventListener('DOMContentLoaded',function() {-->
<!-- document.addEventListener('change',function(event) {-->
<!-- var target = event.target;-->
<!-- if (target && target.id === 'Client') {-->
<!-- var client = target.value;-->
<!-- let xhr= new XMLHttpRequest();-->
<!-- xhr.open('GET',`/get_locations/?Client=${client}`,true);-->
<!-- xhr.onload = function() {-->
<!-- if (xhr.status === 200) {-->
<!-- const locations = JSON.parse(xhr.responseText);-->
<!-- updateCheckboxItems(locations);-->
<!-- } else {-->
<!-- console.error('Request failed. Status: ' + xhr.status);-->
<!-- }-->
<!-- };-->
<!-- xhr.send()-->
<!-- }-->
<!-- function updateCheckboxItems(locations) {-->
<!-- const checkboxItems = document.getElementById('checkboxItems');-->
<!-- checkboxItems.innerHTML = `-->
<!-- <input type="checkbox" id="telanganaCheckbox" name="telanganaCheckbox" value="Telangana" onchange="updateInputField()" style="margin-left: -50px;">-->
<!-- <label for="telanganaCheckbox" style="margin-left: -50px;">Telangana</label><br>-->
<!-- <input type="checkbox" id="andhraCheckbox" name="andhraCheckbox" value="Andhra Pradesh" onchange="updateInputField()" style="margin-left: -50px;">-->
<!-- <label for="andhraCheckbox" style="margin-left: -50px;">Andhra Pradesh</label><br>-->
<!-- <input type="checkbox" id="gujaratCheckbox" name="gujaratCheckbox" value="Gujarat" onchange="updateInputField()" style="margin-left: -50px;">-->
<!-- <label for="gujaratCheckbox" style="margin-left: -50px;">Gujarat</label><br>-->
<!-- `;-->
<!-- locations.forEach(function(location) {-->
<!-- const existingLocation = checkboxItems.querySelector(`input[value="${location}"]`)-->
<!-- if (!existingLocation) {-->
<!-- // Create a checkbox and label for each location-->
<!-- const checkbox = document.createElement('input');-->
<!-- checkbox.type = 'checkbox';-->
<!-- checkbox.name = location;-->
<!-- checkbox.value = location;-->
<!-- checkbox.style.marginLeft = '-50px';-->
<!-- checkbox.onchange = updateInputField;-->
<!-- const label = document.createElement('label');-->
<!-- label.textContent = location;-->
<!-- label.style.marginLeft = '-45px';-->
<!-- label.htmlFor = location;-->
<!-- // Append checkbox and label to the container-->
<!-- checkboxItems.appendChild(checkbox);-->
<!-- checkboxItems.appendChild(label);-->
<!-- checkboxItems.appendChild(document.createElement('br'));-->
<!-- }-->
<!-- });-->
<!-- }-->
<!-- });-->
<!--});-->
<!--function showPopup() {-->
<!-- document.getElementById('addContactPopup').style.display = 'flex';-->
<!--}-->
<!--function hidePopup() {-->
<!-- document.getElementById('addContactPopup').style.display = 'none';-->
<!--}-->
<!--function showSuccessPopup() {-->
<!-- document.getElementById('successPopup').style.display = 'flex';-->
<!--}-->
<!--function hideSuccessPopup() {-->
<!-- document.getElementById('successPopup').style.display = 'none';-->
<!--}-->
<!-- // Function to validate the job posting form (to be implemented)-->
<!-- function saveJobPosting() {-->
<!-- // Add your form validation and submission logic here-->
<!-- alert('Job posting saved!');-->
<!-- }-->
<!--function saveJobPosting() {-->
<!-- const form = document.getElementById('jobPostingForm');-->
<!-- const orderedFieldIds = [-->
<!-- 'Client', 'JobID', 'selectedStatesInput', 'SPOC', 'SPOC2',-->
<!-- 'NoOfPosting', 'StartDate', 'CloseDate', 'Type', 'Experience',-->
<!-- 'BudgetMin', 'BudgetMax', 'Header', 'JobDescription', 'SpecialInstructions', 'JD'-->
<!-- ];-->
<!-- let isValid = true;-->
<!-- let firstInvalidField = null;-->
<!-- // Clear any previous custom validation messages and reset border colors-->
<!-- orderedFieldIds.forEach(id => {-->
<!-- const field = document.getElementById(id);-->
<!-- if (field) {-->
<!-- field.setCustomValidity(''); // Clear previous validation message-->
<!-- field.style.borderColor = ''; // Reset border color-->
<!-- }-->
<!-- });-->
<!-- // Iterate over each field in the specified order to validate-->
<!-- for (let id of orderedFieldIds) {-->
<!-- const field = document.getElementById(id);-->
<!-- if (field) {-->
<!-- if (!field.value.trim()) {-->
<!-- isValid = false;-->
<!-- field.setCustomValidity('Please fill out this field.');-->
<!-- // Show the validation message for this field-->
<!-- field.reportValidity();-->
<!-- // Focus the first invalid field-->
<!-- if (!firstInvalidField) {-->
<!-- firstInvalidField = field;-->
<!-- }-->
<!-- // Exit the loop after finding the first invalid field-->
<!-- break;-->
<!-- } else {-->
<!-- // If the field is valid, reset its border color-->
<!-- field.style.borderColor = '';-->
<!-- field.setCustomValidity('');-->
<!-- }-->
<!-- }-->
<!-- }-->
<!-- if (!isValid) {-->
<!-- // Focus on the first invalid field according to the specified order-->
<!-- if (firstInvalidField) {-->
<!-- firstInvalidField.focus();-->
<!-- }-->
<!-- 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 => {-->
<!-- if (!response.ok) {-->
<!-- throw new Error('Failed to save job posting.');-->
<!-- }-->
<!-- return response.json();-->
<!-- })-->
<!-- .then(data => {-->
<!-- console.log('Success:', data);-->
<!-- alert('Job saved successfully.');-->
<!-- })-->
<!-- .catch(error => {-->
<!-- console.error('Error:', error);-->
<!-- alert('Error: ' + error.message);-->
<!-- })-->
<!-- .finally(() => {-->
<!-- // Clear all fields in the form whether success or error-->
<!-- form.reset();-->
<!-- // Reset field borders to their default state-->
<!-- orderedFieldIds.forEach(id => {-->
<!-- const field = document.getElementById(id);-->
<!-- if (field) {-->
<!-- field.style.borderColor = 'initial'; // Reset to default border color-->
<!-- }-->
<!-- });-->
<!-- });-->
<!--}-->
<!--function validateDates() {-->
<!-- var startDate = new Date(document.getElementById("StartDate").value);-->
<!-- var closeDate = new Date(document.getElementById("CloseDate").value);-->
<!-- if (closeDate <= startDate) {-->
<!-- alert("Close Date must be greater than Start Date.");-->
<!-- document.getElementById("CloseDate").value = "";-->
<!-- }-->
<!-- }-->
<!--function validateBudget() {-->
<!-- var budgetMin = parseInt(document.getElementById("BudgetMin").value);-->
<!-- var budgetMax = parseInt(document.getElementById("BudgetMax").value);-->
<!-- var budgetMaxInput = document.getElementById("BudgetMax");-->
<!-- var errorPopup = document.getElementById("budgetMaxErrorPopup");-->
<!-- // Check if BudgetMin is less than or equal to 10000-->
<!-- if (budgetMin <= 0) {-->
<!-- // Show the error popup for BudgetMin-->
<!-- errorPopup.textContent = "Budget Min must be greater than max.";-->
<!-- errorPopup.classList.add("show");-->
<!-- // Optionally, you can set styles to visually indicate the error-->
<!-- var budgetMinInput = document.getElementById("BudgetMin");-->
<!-- budgetMinInput.focus(); // Focus back on BudgetMin for correction-->
<!-- return; // Exit function early to prevent further validation-->
<!-- } else {-->
<!-- // Hide the error popup for BudgetMin-->
<!-- errorPopup.classList.remove("show");-->
<!-- var budgetMinInput = document.getElementById("BudgetMin");-->
<!-- budgetMinInput.style.borderColor = "";-->
<!-- budgetMinInput.style.color = "";-->
<!-- }-->
<!-- // Check if BudgetMax is less than or equal to BudgetMin-->
<!-- if (budgetMax <= budgetMin) {-->
<!-- // Show the error popup for BudgetMax-->
<!-- errorPopup.textContent = "Budget Max must be greater than Budget Min.";-->
<!-- errorPopup.classList.add("show");-->
<!-- // Optionally, you can set styles to visually indicate the error-->
<!-- budgetMaxInput.focus(); // Focus back on BudgetMax for correction-->
<!-- } else {-->
<!-- // Hide the error popup for BudgetMax-->
<!-- errorPopup.classList.remove("show");-->
<!-- budgetMaxInput.style.borderColor = "";-->
<!-- budgetMaxInput.style.color = "";-->
<!-- }-->
<!--}-->
<!--// Attach the validation function to the input events-->
<!--document.getElementById("BudgetMin").addEventListener("input", validateBudget);-->
<!--document.getElementById("BudgetMin").addEventListener("blur", validateBudget);-->
<!--document.getElementById("BudgetMax").addEventListener("input", validateBudget);-->
<!--document.getElementById("BudgetMax").addEventListener("blur", validateBudget);-->
document.addEventListener('DOMContentLoaded', function() {
const searchInput = document.querySelector("input[type='text']");
searchInput.addEventListener("input", debounce(function() {
const query = this.value.trim();
// Modify the URL in the address bar without reloading the page
const newUrl = `${window.location.origin}${window.location.pathname}?query=${encodeURIComponent(query)}`;
history.pushState({ path: newUrl }, '', newUrl);
fetch(`./?query=${encodeURIComponent(query)}`) // Adjusted to relative path
.then(response => response.text())
.then(html => {
const parser = new DOMParser();
const doc = parser.parseFromString(html, "text/html");
const newBody = doc.querySelector("tbody");
const oldBody = document.querySelector("table tbody");
if (oldBody && newBody) {
oldBody.parentNode.replaceChild(newBody, oldBody);
}
})
.catch(error => console.error('Error fetching filtered job postings:', error));
}, 500));
});
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
clearTimeout(timeout);
timeout = setTimeout(function() {
timeout = null;
if (!immediate) func.apply(context, args);
}, wait);
if (immediate && !timeout) func.apply(context, args);
};
};
<!--function alljobposting(){-->
<!--document.addEventListener('DOMContentLoaded', function() {-->
<!-- const searchInput = document.querySelector("input[type='text']");-->
<!-- searchInput.addEventListener("input", debounce(function() {-->
<!-- const query = this.value.trim();-->
<!-- // Modify the URL in the address bar without reloading the page-->
<!-- const newUrl = `${window.location.origin}${window.location.pathname}?query=${encodeURIComponent(query)}`;-->
<!-- history.pushState({ path: newUrl }, '', newUrl);-->
<!-- fetch(`./?query=${encodeURIComponent(query)}`) // Adjusted to relative path-->
<!-- .then(response => response.text())-->
<!-- .then(html => {-->
<!-- const parser = new DOMParser();-->
<!-- const doc = parser.parseFromString(html, "text/html");-->
<!-- const newBody = doc.querySelector("tbody");-->
<!-- const oldBody = document.querySelector("table tbody");-->
<!-- if (oldBody && newBody) {-->
<!-- oldBody.parentNode.replaceChild(newBody, oldBody);-->
<!-- }-->
<!-- })-->
<!-- .catch(error => console.error('Error fetching filtered job postings:', error));-->
<!-- }, 500));-->
<!--});-->
<!--function debounce(func, wait, immediate) {-->
<!-- var timeout;-->
<!-- return function() {-->
<!-- var context = this, args = arguments;-->
<!-- clearTimeout(timeout);-->
<!-- timeout = setTimeout(function() {-->
<!-- timeout = null;-->
<!-- if (!immediate) func.apply(context, args);-->
<!-- }, wait);-->
<!-- if (immediate && !timeout) func.apply(context, args);-->
<!-- };-->
<!--};-->
<!-- }-->
function searchJob() {
var input, filter, table, tr, td, i, txtValue;
input = document.getElementById("searchInput");
filter = input.value.toUpperCase();
table = document.querySelector("table");
tr = table.getElementsByTagName("tr");
for (i = 1; i < tr.length; i++) {
var found = false;
td = tr[i].getElementsByTagName("td")[1]; // Get the second column (JobID)
if (td) {
txtValue = td.textContent || td.innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
found = true;
}
}
tr[i].style.display = found ? "" : "none";
}
}
function goBack() {
hidePopup(); // Assuming you have a function to hide the popup
// Optionally, show another section or perform other actions
10 months ago
}
10 months ago
2 weeks ago
function toggleForm(formId) {
var forms = ['Existing_employeeform', 'add_employeeform'];
forms.forEach(function(id) {
var form = document.getElementById(id);
if (form && id === formId) {
form.style.display = form.style.display === 'block' ? 'none' : 'block';
} else if (form) {
form.style.display = 'none';
}
});
}
function validatePhoneNumbers() {
var phoneNo1 = document.getElementById('PhoneNo1').value;
var phoneNo2 = document.getElementById('PhoneNo2').value;
if (phoneNo1 === '' && phoneNo2 === '') {
alert("Please enter either Mobile No or Land No.");
return false; // Prevent form submission
}
// Allow form submission if one of the fields is filled
return true;
}
</script>
</section>
</div>
10 months ago
</body>
</html>