nhance/app/Views/insurer_branch.php
2026-05-05 17:17:44 +05:30

1142 lines
47 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<style>
.modal-subtitle {
font-weight: 500;
font-style: normal;
font-size: 18px;
line-height: 100%;
letter-spacing: 0%;
text-align: center;
margin-top: 5px;
color: #6c757d;
}
.field-error {
color: #dc3545;
font-size: 12px;
margin-top: 4px;
display: block;
}
.is-invalid {
border-color: #dc3545 !important;
}
/* Avoid duplicate validation messages: keep custom .field-error only */
#insurer_branch_form .parsley-errors-list {
display: none !important;
}
</style>
<!-- Optional CSS -->
<style>
/* Make modal really XL and scrollable */
#insurerBranchModal .modal-dialog.modal-xl {
max-width: 90%;
height: 90vh;
}
#insurerBranchModal .modal-content {
height: 100%;
overflow: hidden;
}
#insurerBranchModal .modal-body {
overflow-y: auto;
max-height: 80vh;
}
#insurerBranchModal {
padding-right: 0 !important;
}
#insurerBranchModal.show {
display: flex !important;
align-items: center;
justify-content: center;
}
#insurerBranchModal {
z-index: 1060;
}
.modal-backdrop {
z-index: 1050;
}
</style>
<div class="tab-pane fade" id="branch-tab" style="padding-left: 25px;">
<div class="table-responsive nh-listing-table-scope" id="branch_table" >
<table data-custom-table-css="table" class="table table-borderless table-nowrap mb-0 w-100 nowrap" id="branch-datatable">
<thead class="">
<tr>
<th>Branch Name</th>
<th>Branch Code</th>
<th>Action</th>
</tr>
</thead>
<tbody id="insurer_branch_list">
</tbody>
</table>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="insurerBranchModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-xl">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header flex-column">
<div class="d-flex w-100 justify-content-between align-items-center">
<h4 class="modal-title mb-0" id="modalLabel">New Branch</h4>
<button type="button" class="close js-branch-modal-close" data-dismiss="modal" data-bs-dismiss="modal" aria-hidden="true" onclick="hideBranchModal()">×</button>
</div>
</div>
<!-- Modal Body -->
<div class="modal-body">
<form id="insurer_branch_form" role="form" class="parsley-examples" novalidate method="post" action="" enctype="multipart/form-data">
<input type="hidden" class="form-control" value="<?= csrf_hash() ?>" name="<?= csrf_token() ?>" />
<input type="hidden" name="PrimaryKey" id="insurer_Branch_PrimaryKey" />
<input type="hidden" name="insurer_id" id="insurer_id_branch" value="<?= isset($insurer['id']) ? $insurer['id'] : '' ?>"/>
<div class="row">
<!-- Left Section: Branch Details -->
<div class="col-md-8 d-flex flex-column" style="max-height: calc(80vh - 50px);">
<!-- Branch Name & Code -->
<div class="form-row">
<div class="form-group col-md-6">
<label for="branch_name">Branch Name <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="branch_name"
placeholder="Enter Branch Name" name="branch_name" required
data-parsley-minlength="3"
data-parsley-pattern="^[a-zA-Z0-9\s_-]+$"
data-parsley-pattern-message="Branch Name can contain letters, numbers, spaces, underscore (_) and hyphen (-).">
</div>
<div class="form-group col-md-6">
<label for="branch_code">Branch Code <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="branch_code"
placeholder="Enter Branch Code" name="branch_code" required
data-parsley-pattern="^[a-zA-Z0-9\s_-]+$"
data-parsley-pattern-message="Branch Code can contain letters, numbers, spaces, underscore (_) and hyphen (-)."
oninput="this.value = this.value.replace(/[^A-Za-z0-9_\- ]/g, '')"
onblur="this.value = this.value.trim();">
</div>
</div>
<!-- Address Lines -->
<div class="form-row">
<div class="form-group col-md-6">
<label for="address1">Address Line 1 <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="address1" name="address1" placeholder="Enter Address 1" required>
</div>
<div class="form-group col-md-6">
<label for="address2">Address Line 2</label>
<input type="text" class="form-control" id="address2" placeholder="Enter Address 2" name="address2">
</div>
</div>
<!-- State & District -->
<div class="form-row">
<div class="form-group col-md-6">
<label for="state">State <span class="text-danger">*</span></label>
<select class="form-control" id="state" name="state" required>
<option value="">Select State</option>
<?php foreach($state as $value) { ?>
<option value="<?= $value['id'] ?>"><?= $value['state'] ?></option>
<?php } ?>
</select>
</div>
<div class="form-group col-md-6">
<label for="district">District <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="district"
placeholder="Enter District" name="district" required
data-parsley-pattern="^[a-zA-Z0-9\s-]+$"
data-parsley-pattern-message="District can contain letters, numbers, spaces, and hyphens.">
</div>
</div>
<!-- City & Pincode -->
<div class="form-row">
<div class="form-group col-md-6">
<label for="branch_city">City <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="branch_city"
placeholder="Enter City" name="city" required
data-parsley-pattern="^[a-zA-Z0-9\s-]+$"
data-parsley-pattern-message="City can contain letters, numbers, spaces, and hyphens.">
</div>
<div class="form-group col-md-6">
<label for="pincode">Pincode <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="pincode" placeholder="Enter Pincode" name="pincode" required maxlength="6" inputmode="numeric"
data-parsley-pattern="^[0-9]{6}$"
data-parsley-pattern-message="Pincode must be exactly 6 digits.">
</div>
</div>
<!-- Submit / Cancel -->
<div class="form-row">
<!-- <div class="form-group col-md-12 mt-2"> -->
<div class="w-100 d-flex justify-content-end" style="margin-top: 85px;">
<button type="submit" class="btn btn-primary mr-2" id="btnSubmit">Submit</button>
<button type="button" class="btn app-btn-outline-secondary btnBack" id="btnBack" data-dismiss="modal" data-bs-dismiss="modal" aria-hidden="true" onclick="hideBranchModal()">Cancel</button>
</div>
<!-- </div> -->
</div>
</div>
<!-- Right Section: Contact Details -->
<div class="col-md-4" style="background:#f8f9fa; max-height: calc(80vh - 50px); overflow-y:auto; border-radius:8px; padding:10px;">
<!-- First Contact -->
<div id="contact_1_wrapper" class="bg-white p-2 mb-2 rounded contact-block">
<div class="d-flex justify-content-between align-items-center mb-2">
<h6 class="modal-subtitle mb-0">Contact 1</h6>
<div class="d-flex align-items-center">
<i class="mdi mdi-trash-can text-danger" style="cursor:pointer; font-size:24px !important;" onclick="removeContact(this)" id="${uniqueId}_remove"></i>
</div>
</div>
<!-- Contact Form Fields -->
<div class="form-row">
<!-- <input type="hidden" name="primarykey[]" id="contact_id_1" value=""/> -->
<div class="form-group col-md-12">
<label for="name">Name <span class="text-danger">*</span></label>
<input value="" type="text" class="form-control" placeholder="Enter Contact Name" name="name[]" id="name" required
data-parsley-pattern="^[a-zA-Z0-9\s_-]+$"
data-parsley-pattern-message="Contact name can contain letters, numbers, spaces, underscore (_) and hyphen (-).">
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label for="designation">Designation <span class="text-danger">*</span></label>
<input value="" type="text" class="form-control" placeholder="Enter Designation Name" name="designation[]" id="designation" required
data-parsley-pattern="^[A-Za-z0-9\\-_\\/ ]+$"
data-parsley-pattern-message="Designation may only contain letters, numbers, /, -, _ and spaces.">
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label for="email">Email <span class="text-danger">*</span></label>
<input value="" type="email" data-parsley-trigger="change" class="form-control" placeholder="Enter Contact Email" name="email[]" id="email" required
data-parsley-pattern="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
data-parsley-pattern-message="Please enter a valid email format (e.g., name@domain.com).">
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label for="mobile">Mobile <span class="text-danger">*</span></label>
<!-- <input name="mobile[]" pattern="[0-9]{10}" value="" type="tel" data-parsley-type="number" data-parsley-length="[10,10]" class="form-control" placeholder="Enter Contact Mobile" id="mobile" required> -->
<!-- oninput="this.value = this.value.replace(/[^0-9]/g,'');" maxlength="10" -->
<input value="" name="mobile[]" value="" data-parsley-type="digits" data-parsley-length="[10,10]" data-parsley-trigger="change" type="text" class="form-control" placeholder="Enter Contact Mobile" id="mobile" required maxlength="10" inputmode="numeric">
</div>
</div>
</div>
<!-- Container for dynamically added contacts -->
<div id="container"></div>
<div>
<button type="button" class="btn btn-primary btn-sm ac me-3" style="width: 100%;" onclick="appendContactHtml()" id="add"><i class="mdi mdi-plus"></i> Add Contact</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<script>
var contactCount = 1;
var insurer_branch_form_action = '';
var insurer_Branch_PrimaryKey = $('#insurer_id_branch').val();
var branchDataTable = null;
var branchDebugPrefix = '[InsurerBranch]';
window.addEventListener('error', function (event) {
try {
console.error(branchDebugPrefix + ' window.error:', event.message, 'at', event.filename + ':' + event.lineno + ':' + event.colno, event.error || '');
} catch (e) {}
});
window.addEventListener('unhandledrejection', function (event) {
try {
console.error(branchDebugPrefix + ' unhandledrejection:', event.reason);
} catch (e) {}
});
/**
* This app loads Bootstrap 3/4 jQuery plugins (see footer) and may also expose
* a partial window.bootstrap.Modal. Prefer $.fn.modal when present so the modal
* actually opens; native bootstrap.Modal is only a fallback.
*/
function showBranchModal() {
var $m = $('#insurerBranchModal');
console.log(branchDebugPrefix + ' modal function');
if (typeof jQuery !== 'undefined' && jQuery.fn && typeof jQuery.fn.modal === 'function') {
try {
$m.modal('show');
console.log(branchDebugPrefix + ' opened with jQuery.modal');
setTimeout(function () {
if (!$m.hasClass('show') || !$m.is(':visible')) {
console.warn(branchDebugPrefix + ' jQuery modal did not render, applying force-open fallback');
forceShowBranchModal();
}
}, 120);
} catch (err) {
console.error(branchDebugPrefix + ' jQuery.modal show failed:', err);
forceShowBranchModal();
}
return;
}
var modalEl = document.getElementById('insurerBranchModal');
if (!modalEl) {
console.error(branchDebugPrefix + ' modal element #insurerBranchModal not found');
return;
}
if (window.bootstrap && bootstrap.Modal) {
if (typeof bootstrap.Modal.getOrCreateInstance === 'function') {
try {
bootstrap.Modal.getOrCreateInstance(modalEl).show();
console.log(branchDebugPrefix + ' opened with bootstrap.Modal.getOrCreateInstance');
} catch (err) {
console.error(branchDebugPrefix + ' bootstrap getOrCreateInstance failed:', err);
forceShowBranchModal();
}
return;
}
if (typeof bootstrap.Modal.getInstance === 'function') {
var existing = bootstrap.Modal.getInstance(modalEl);
if (existing) {
try {
existing.show();
console.log(branchDebugPrefix + ' opened with existing bootstrap modal instance');
} catch (err) {
console.error(branchDebugPrefix + ' existing bootstrap modal show failed:', err);
forceShowBranchModal();
}
return;
}
}
try {
(new bootstrap.Modal(modalEl)).show();
console.log(branchDebugPrefix + ' opened with new bootstrap.Modal');
} catch (e) {
console.error(branchDebugPrefix + ' bootstrap.Modal constructor show failed:', e);
forceShowBranchModal();
}
return;
}
console.error(branchDebugPrefix + ' no modal library available (jQuery modal/bootstrap modal missing)');
forceShowBranchModal();
}
function forceShowBranchModal() {
var modalEl = document.getElementById('insurerBranchModal');
if (!modalEl) {
console.error(branchDebugPrefix + ' forceShow failed: modal element missing');
return;
}
modalEl.style.display = 'block';
modalEl.classList.add('show');
modalEl.removeAttribute('aria-hidden');
modalEl.setAttribute('aria-modal', 'true');
document.body.classList.add('modal-open');
if (!document.querySelector('.modal-backdrop')) {
var backdrop = document.createElement('div');
backdrop.className = 'modal-backdrop fade show';
document.body.appendChild(backdrop);
}
console.log(branchDebugPrefix + ' force-open fallback applied');
}
function hideBranchModal() {
var $m = $('#insurerBranchModal');
var modalEl = document.getElementById('insurerBranchModal');
if (!modalEl) {
return;
}
var closed = false;
try {
if (typeof jQuery !== 'undefined' && jQuery.fn && typeof jQuery.fn.modal === 'function') {
$m.modal('hide');
closed = true;
}
if (!closed && window.bootstrap && bootstrap.Modal && modalEl) {
if (typeof bootstrap.Modal.getOrCreateInstance === 'function') {
bootstrap.Modal.getOrCreateInstance(modalEl).hide();
closed = true;
}
if (!closed && typeof bootstrap.Modal.getInstance === 'function') {
var existing = bootstrap.Modal.getInstance(modalEl);
if (existing) {
existing.hide();
closed = true;
}
}
if (!closed) {
(new bootstrap.Modal(modalEl)).hide();
closed = true;
}
}
} catch (e) {
console.error(branchDebugPrefix + ' hide modal failed; forcing close', e);
}
// Guarantee immediate close even if modal plugin state is broken.
if (!closed || modalEl.classList.contains('show')) {
forceHideBranchModal();
}
}
function forceHideBranchModal() {
var modalEl = document.getElementById('insurerBranchModal');
if (!modalEl) {
return;
}
modalEl.classList.remove('show');
modalEl.style.display = 'none';
modalEl.setAttribute('aria-hidden', 'true');
modalEl.removeAttribute('aria-modal');
document.body.classList.remove('modal-open');
document.body.style.removeProperty('padding-right');
$('.modal-backdrop').remove();
}
function setBranchModalTitle(title) {
$('#modalLabel').text(title || 'New Branch');
}
function renderBranchRows(rows) {
var html = '';
$.each(rows || [], function(index, item) {
html += `
<tr>
<td>${item.branch_name || ''}</td>
<td>${item.branch_code || ''}</td>
<td>
<a class="mdi mdi-lead-pencil btnBranchEdit" href="#" data-id="${item.id}" style="font-size:18px;"></a>
<a style="color:#02a8b5" data-id="${item.id}" onclick="removeInsurerBranch(this)"><i data-id="${item.id}" class="mdi mdi-delete" style="font-size:18px;"></i></a>
</td>
</tr>
`;
});
$('#insurer_branch_list').html(html);
}
function getFieldKey($field) {
var name = ($field.attr('name') || '').trim();
var id = ($field.attr('id') || '').trim();
if (name === 'name[]') return 'contact_name';
if (name === 'designation[]') return 'designation';
if (name === 'email[]') return 'email';
if (name === 'mobile[]') return 'mobile';
if (id) return id;
return name.replace(/\[\]$/, '');
}
function getErrorMessage(key, value) {
var v = (value || '').toString().trim();
var alphaHyphenSpace = /^[a-zA-Z\s\-]+$/;
var alphaNumHyphenSpace = /^[a-zA-Z0-9\s\-]+$/;
var contactNamePattern = /^[a-zA-Z0-9\s_-]+$/;
var emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
switch (key) {
case 'branch_name':
if (v.length < 3) return 'Branch Name must be at least 3 characters.';
if (!/^[a-zA-Z0-9\s_-]+$/.test(v)) return 'Branch Name can contain letters, numbers, spaces, underscore (_) and hyphen (-).';
return '';
case 'branch_code':
if (!/^[a-zA-Z0-9\s_-]+$/.test(v)) return 'Branch Code can contain letters, numbers, spaces, underscore (_) and hyphen (-).';
return '';
case 'address1':
return '';
case 'state':
if (!alphaHyphenSpace.test(v)) return 'State name can only contain letters, spaces, and hyphens.';
return '';
case 'district':
if (!alphaNumHyphenSpace.test(v)) return 'District can contain letters, numbers, spaces, and hyphens.';
return '';
case 'branch_city':
if (!alphaNumHyphenSpace.test(v)) return 'City can contain letters, numbers, spaces, and hyphens.';
return '';
case 'pincode':
if (!/^\d+$/.test(v)) return 'Pincode must be digits only.';
if (!/^\d{6}$/.test(v)) return 'Pincode must be exactly 6 digits.';
return '';
case 'contact_name':
if (v.length < 2) return 'Contact name must be at least 2 characters';
if (!contactNamePattern.test(v)) return 'Contact name is invalid Format';
return '';
case 'designation':
if (!/^[A-Za-z0-9\-_\/ ]+$/.test(v)) return 'Designation may only contain letters, numbers, /, -, _ and spaces.';
return '';
case 'email':
if (!emailPattern.test(v)) return 'Please enter a valid email format (e.g., name@domain.com).';
return '';
case 'mobile':
if (!/^\d+$/.test(v)) return 'Mobile must contain only digits';
if (!/^\d{10}$/.test(v)) return 'Mobile number must be exactly 10 digits';
return '';
default:
return '';
}
}
function getErrorElement($field) {
var $group = $field.closest('.form-group');
var $existing = $group.find('.field-error');
if ($existing.length) {
if ($existing.length > 1) {
$existing.slice(1).remove();
}
return $existing.first();
}
var $error = $('<small class="field-error"></small>');
$field.after($error);
return $error;
}
function validateField($field) {
if (!$field || !$field.length) return true;
var key = getFieldKey($field);
var value = $field.val();
if (key === 'state') {
var selectedText = ($field.find('option:selected').text() || '').trim();
value = (selectedText === 'Select State') ? '' : selectedText;
}
var message = getErrorMessage(key, value);
var $error = getErrorElement($field);
if (message) {
$field.addClass('is-invalid');
$error.text(message);
return false;
}
$field.removeClass('is-invalid');
$error.text('');
return true;
}
function validateInsurerBranchForm() {
var isValid = true;
var selectors = [
'#branch_name',
'#branch_code',
'#address1',
'#state',
'#district',
'#branch_city',
'#pincode',
'input[name="name[]"]',
'input[name="designation[]"]',
'input[name="email[]"]',
'input[name="mobile[]"]'
];
$(selectors.join(',')).each(function () {
if (!validateField($(this))) {
isValid = false;
}
});
return isValid;
}
function initBranchDataTable() {
if ($.fn.DataTable.isDataTable('#branch-datatable')) {
$('#branch-datatable').DataTable().destroy();
}
branchDataTable = $('#branch-datatable').DataTable({
paging: true,
searching: true,
autoWidth: false,
scrollX: false,
responsive: false,
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
language: {
search: `
<div class="datatable-search-wrapper" style="position:relative; display:inline-block;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon" style="position:absolute; right:11px; top:50%; transform:translateY(-53%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon" style="position:absolute; right:11px; top:50%; transform:translateY(-53%); color:#666; display:none;"></i>
</div>`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No data available</div>'
},
buttons: [
{
text: '<i class="mdi mdi-plus" ></i><span class=" btn-custom"> Add Branch </span>',
className: 'btn app-btn-primary mr-2 js-insurer-branch-add',
action: function(e, dt, node, config) {
openCreateBranchModal(e);
}
}
]
});
}
function openCreateBranchModal(e) {
try {
console.log(branchDebugPrefix + ' add button click captured');
if (e && typeof e.preventDefault === 'function') {
e.preventDefault();
}
insurer_branch_form_action = '<?= base_url("master/insurer/branch/create"); ?>';
contactCount = 1;
setBranchModalTitle('New Branch');
showBranchModal();
var $form = $('#insurer_branch_form');
if ($form.length && $form[0] && typeof $form[0].reset === 'function') {
$form[0].reset();
}
$('#branch_name').val('');
$('#branch_code').val('');
$('#state').val('');
$('#district').val('');
$('#branch_city').val('');
$('#name').val('');
$('#email').val('');
$('#mobile').val('');
$('#designation').val('');
var addButton = document.getElementById('add');
if (addButton && addButton.style.display === 'none') {
addButton.style.display = 'block';
}
var buttonIds = JSON.parse(localStorage.getItem('buttonIds')) || [];
for (var i = 0; i < buttonIds.length; i++) {
var firstElement = buttonIds[i].split('_')[0];
var elementToRemove = document.getElementById(firstElement);
if (elementToRemove) {
elementToRemove.parentNode.removeChild(elementToRemove);
}
localStorage.removeItem('buttonIds');
}
} catch (err) {
console.error(branchDebugPrefix + ' openCreateBranchModal failed:', err);
}
}
$(document).ready(function () {
insurer_Branch_PrimaryKey = $('#insurer_id_branch').val();
var data = <?= isset($insuer_branch) ? json_encode($insuer_branch) : '[]' ?>;
if(insurer_Branch_PrimaryKey !== ''){
console.log("insurer branch data", data);
}
renderBranchRows(data);
initBranchDataTable();
$('a[data-toggle="tab"], a[data-bs-toggle="tab"]').on('shown.bs.tab', function () {
if ($.fn.DataTable.isDataTable('#branch-datatable')) {
$('#branch-datatable').DataTable().columns.adjust();
}
});
$(document).on('click', '.js-insurer-branch-add', function(e){
console.log(branchDebugPrefix + ' delegated click fired for .js-insurer-branch-add/#btnBranchAdd');
// DataTable button already calls openCreateBranchModal in its action.
// Avoid double invocation when both handlers fire.
if (!$(this).hasClass('dt-button')) {
openCreateBranchModal(e);
}
});
$(document).on('input change', '#insurer_branch_form input, #insurer_branch_form select', function () {
validateField($(this));
});
$(document).on('input', '#pincode', function () {
this.value = (this.value || '').replace(/\D/g, '').slice(0, 6);
validateField($(this));
});
$(document).on('input', 'input[name="mobile[]"]', function () {
this.value = (this.value || '').replace(/\D/g, '').slice(0, 10);
validateField($(this));
});
});
$('.btnBack').click(function(e){
if (e && typeof e.preventDefault === 'function') {
e.preventDefault();
}
var $fb = $('#insurer_branch_form');
if ($fb.length && $fb[0] && typeof $fb[0].reset === 'function') {
$fb[0].reset();
}
contactCount = 1
hideBranchModal();
// $('#add_branch').hide();
// $('#branch_table').show();
// $('.btnBack').hide();
// $('#btnBranchAdd').show();
$('#branch_name').val('');
$('#branch_code').val('');
$('#state').val('');
$('#district').val('');
$('#branch_city').val('');
$('#name').val('');
$('#email').val('');
$('#mobile').val('');
$('#designation').val('');
$('#container').empty(); $('#contact_1_wrapper input').val('');
})
$(document).on('click', '.js-branch-modal-close', function(e){
if (e && typeof e.preventDefault === 'function') {
e.preventDefault();
}
hideBranchModal();
});
$("#insurer_branch_form").submit(function(events) {
console.log(1, insurer_branch_form_action);
events.preventDefault();
var isValid = validateInsurerBranchForm();
if (isValid) {
var formData = new FormData($('#insurer_branch_form')[0]);
$('.loader').fadeIn();
$('.loader-mask').fadeIn();
$.ajax({
data: formData,
url: insurer_branch_form_action,
type: "POST",
dataType: 'json',
processData: false,
contentType: false,
beforeSend: function() {
$('.loader').fadeIn();
$('.loader-mask').fadeIn();
},
success: function(res) {
$("#insurer_branch_form")[0].reset();
console.log(res);
if (res && res.status) {
toastr.success(res.message || 'Insurer branch saved successfully', 'Success');
window.location.reload();
return;
}
$('#insurer_branch_list tr').remove();
renderBranchRows(res.data || []);
initBranchDataTable();
$('#container').empty(); $('#contact_1_wrapper input').val('');
hideBranchModal();
toastr.warning((res && res.message) ? res.message : 'Unable to save insurer branch', 'Warning');
// $('#add_branch').hide();
// $('#branch_table').show();
// $('.btnBack').hide();
// $('#btnBranchAdd').show();
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
console.error(status, error);
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
toastr.warning('Something Wrong!', 'Warning');
}, 1000);
},
complete: function() {
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
}, 1000);
hideBranchModal();
}
});
}
});
$('body').on('click', '.btnBranchEdit', function () {
$('#container').html("");
contactCount = 1;
var branch_id = $(this).attr('data-id');
$('#insurer_Branch_PrimaryKey').val(branch_id);
insurer_branch_form_action = '<?= base_url("master/insurer/branch/edit"); ?>';
setBranchModalTitle('Edit Branch');
console.log(insurer_branch_form_action)
$('.loader').fadeIn();
$('.loader-mask').fadeIn();
$.ajax({
url: '<?php echo base_url('master/insurer/branch/editget/');?>'+branch_id,
type: "GET",
dataType: 'json',
success: function (res) {
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
}, 1000);
showBranchModal();
// $('#add_branch').show();
// $('#branch_table').show();
// $('.btnBack').show();
// $('#btnBranchAdd').hide();
console.log("res.levelcontact[0].id"+res.levelcontact[0].id);
$('#branch_name').val(res.insurerbranch.branch_name);
$('#branch_code').val(res.insurerbranch.branch_code);
$('#state option[value="' + res.insurerbranch.state + '"]').prop('selected', true);
$('#district').val(res.insurerbranch.district);
$('#branch_city').val(res.insurerbranch.city);
$('#pincode').val(res.insurerbranch.pincode);
$('#address1').val(res.insurerbranch.address1);
$('#address2').val(res.insurerbranch.address2);
$('#contact_id_1').val(res.levelcontact[0].id);
$('.form-row').find('#name').val(res.levelcontact[0].name);
$('#email').val(res.levelcontact[0].email);
$('#mobile').val(res.levelcontact[0].mobile);
$('#designation').val(res.levelcontact[0].designation);
res.levelcontact.shift();
$.each(res.levelcontact, function(index, contact) {
if (contact !== undefined) {
appendContactHtml(contact);
}
});
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
console.error(status, error);
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
toastr.warning('Something Wrong!', 'Warning');
}, 1000);
}
});
});
// function appendContactHtml(contact = false, reset = false) {
// console.log('appendContactHtml function called ')
// contactCount++;
// var container = document.getElementById('container');
// var uniqueId = Date.now().toString();
// var html = `
// <div id="${uniqueId}" class="bg-white p-2 mb-2 rounded">
// <div class="d-flex justify-content-between align-items-center mb-2">
// <h6 class="modal-subtitle mb-0">Contact ${contactCount}</h6>
// <div class="d-flex align-items-center">
// <i class="mdi mdi-trash-can text-danger" style="cursor:pointer; font-size:24px !important;" onclick="removeContact(this)" id="${uniqueId}_remove"></i>
// </div>
// </div>
// <br>
// <div class="form-row">
// <input type="hidden" name="primarykey[]" id="contact_id_1" value="${contact !== undefined && contact !== false ? contact.id : ''}"/>
// <div class="form-group col-md-12">
// <label for="${uniqueId}_first_name">Name<span class="text-danger">*</span></label>
// <input value="${contact !== undefined && contact !== false ? contact.name : ''}" type="text" class="form-control" placeholder="Enter Contact Name" name="name[]" id="${uniqueId}_name" required>
// </div>
// </div>
// <div class="form-row">
// <div class="form-group col-md-12">
// <label for="${uniqueId}_last_name">Email<span class="text-danger">*</span></label>
// <input data-parsley-type="email" value="${contact !== undefined && contact !== false ? contact.email : ''}" type="email" class="form-control" placeholder="Enter Contact Email" name="email[]" id="${uniqueId}_email" required>
// </div>
// </div>
// <div class="form-row">
// <div class="form-group col-md-12">
// <label for="${uniqueId}_mobile">Mobile<span class="text-danger">*</span></label>
// <input data-parsley-type="number" data-parsley-length="[10,10]" pattern="[0-9]{10}" value="${contact !== undefined && contact !== false ? contact.mobile : ''}" type="tel" class="form-control" placeholder="Enter Contact Mobile" name="mobile[]" id="${uniqueId}_mobile" required>
// </div>
// </div>
// <div class="form-row">
// <div class="form-group col-md-12">
// <label for="${uniqueId}_designation">Designation<span class="text-danger">*</span></label>
// <input value="${contact !== undefined && contact !== false ? contact.designation : ''}" type="text" class="form-control" placeholder="Enter Designation Name" name="designation[]" id="${uniqueId}_designation" required>
// </div>
// </div>
// </div>
// `;
// if(reset == false){
// container.insertAdjacentHTML('beforeend', html);
// storeButtonId(uniqueId + '_add');
// if (contactCount >= 3) {
// hideStoredAddButtons();
// }
// }
// }
// function removeContact(button) {
// var uniqueId = button.id.split("_")[0];
// var contactSection = document.getElementById(uniqueId);
// if (contactSection) {
// contactSection.parentNode.removeChild(contactSection);
// contactCount --;
// if (contactCount < 3) {
// var addButton = document.querySelector('.ac');
// if (addButton) {
// addButton.style.display = 'block';
// }
// }
// }
// }
// function storeButtonId(id) {
// var buttonIds = JSON.parse(localStorage.getItem('buttonIds')) || [];
// buttonIds.push(id);
// localStorage.setItem('buttonIds', JSON.stringify(buttonIds));
// }
// function hideStoredAddButtons() {
// var storedIds = JSON.parse(localStorage.getItem('buttonIds')) || [];
// storedIds.forEach(function(id) {
// var addButton = document.getElementById(id);
// var first_addButton = document.querySelector('.ac')
// if (addButton) {
// addButton.style.display = 'none';
// first_addButton.style.display = 'none';
// }
// });
// }
function renumberContacts() {
var contacts = document.querySelectorAll('.contact-block');
contacts.forEach(function(contact, index) {
let title = contact.querySelector('.modal-subtitle');
if (title) {
title.textContent = "Contact " + (index + 1); // auto numbering
}
});
contactCount = contacts.length; // keep global in sync
}
function appendContactHtml(contact = false, reset = false) {
console.log('appendContactHtml function called ');
var container = document.getElementById('container');
var uniqueId = Date.now().toString();
// <input type="hidden" name="primarykey[]" id="contact_id_1" value="${contact !== undefined && contact !== false ? contact.id : ''}"/>
var html = `
<div id="${uniqueId}" class="bg-white p-2 mb-2 rounded contact-block">
<div class="d-flex justify-content-between align-items-center mb-2">
<h6 class="modal-subtitle mb-0"></h6>
<div class="d-flex align-items-center">
<i class="mdi mdi-trash-can text-danger" style="cursor:pointer; font-size:24px !important;" onclick="removeContact(this)" id="${uniqueId}_remove"></i>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label>Name<span class="text-danger">*</span></label>
<input value="${contact ? contact.name : ''}" type="text" class="form-control" placeholder="Enter Contact Name" name="name[]" required
data-parsley-pattern="^[a-zA-Z0-9\s_-]+$"
data-parsley-pattern-message="Contact name can contain letters, numbers, spaces, underscore (_) and hyphen (-).">
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label>Designation<span class="text-danger">*</span></label>
<input value="${contact ? contact.designation : ''}" type="text" class="form-control" placeholder="Enter Designation Name" name="designation[]" required
data-parsley-pattern="^[A-Za-z0-9\\-_\\/ ]+$"
data-parsley-pattern-message="Designation may only contain letters, numbers, /, -, _ and spaces.">
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label>Email<span class="text-danger">*</span></label>
<input value="${contact ? contact.email : ''}" type="email" data-parsley-trigger="change" class="form-control" placeholder="Enter Contact Email" name="email[]" required
data-parsley-pattern="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
data-parsley-pattern-message="Please enter a valid email format (e.g., name@domain.com).">
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label>Mobile<span class="text-danger">*</span></label>
<input value="${contact ? contact.mobile : ''}" name="mobile[]" value="" data-parsley-type="digits" data-parsley-length="[10,10]" data-parsley-trigger="change" type="text" class="form-control" placeholder="Enter Contact Mobile" id="mobile" required maxlength="10" inputmode="numeric">
</div>
</div>
</div>
`;
if(!reset){
container.insertAdjacentHTML('beforeend', html);
renumberContacts(); // ✅ fix numbering
toggleAddButton();
}
}
function removeContact(btn){
var $block = $(btn).closest('.contact-block');
var isFirst = $block.attr('id') === 'contact_1_wrapper';
if (isFirst) {
var $next = $('#container .contact-block').first();
if ($next.length){
$block.replaceWith($next);
$next.attr('id','contact_1_wrapper');
$next.find('.modal-subtitle').text('Contact 1');
} else {
$block.find('input').val('');
return;
}
} else {
$block.remove();
}
renumberContacts();
toggleAddButton();
}
function toggleAddButton() {
var totalContacts = document.querySelectorAll('.contact-block, #contact_1_wrapper').length;
var addButton = document.querySelector('.ac');
if (totalContacts >= 3) {
addButton.style.display = 'none';
} else {
addButton.style.display = 'block';
}
}
function showNextAddButton() {
var storedIds = JSON.parse(localStorage.getItem('buttonIds')) || [];
var addButtonShown = false;
// Iterate through the stored IDs to find the next "Add" button to show
storedIds.forEach(function(id) {
if (!addButtonShown) {
var addButton = document.getElementById(id);
if (addButton && addButton.style.display === 'none') {
addButton.style.display = 'block';
addButtonShown = true; // Set to true once an "Add" button is shown
}
}
});
}
function validateForm() {
var isValid = true;
$('#insurer_branch_form input, #insurer_branch_form select').each(function() {
if ($(this).is('input[name="emial[]"]') || $(this).is('input[type="text"]') || $(this).is('select') ) {
if ($.trim($(this).val()) == '') {
isValid = false;
return false;
}
}
});
return isValid;
}
function removeInsurerBranch(element) {
Swal.fire({
title: "Are you sure?",
text: "You need to remove this insurer branch.",
icon: "info",
showCancelButton: true,
confirmButtonColor: "#3085d6",
confirmButtonText: "Yes",
}).then((result) => {
if (result.isConfirmed) {
var id = element.getAttribute('data-id');
var form_action = '<?= base_url("master/insurer/branch/remove/") ?>' + id;
$.ajax({
url: form_action,
type: "GET",
dataType: 'json',
processData: false,
contentType: false,
success: function(res) {
// console.log(res.status == true);
if(res){
if (res.status == true) {
toastr.success('Insurer branch removed successfully', 'Success');
location.reload();
} else {
toastr.warning('Failed to remove insurer branch', 'Warning');
}
}
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
console.error(status, error);
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
toastr.warning('Failed to remove insurer branch', 'Warning');
}
});
}
});
}
</script>