function renderItembtns(data, row) { var jsonData = JSON.stringify(row).replace(/"/g, """); var buttonsHtml = ''; buttonsHtml += ' '; return buttonsHtml; } function refreshTable() { itemTable.ajax.reload(); } function clearTextModal() { document.getElementById("ItemName").value = ""; document.getElementById("ItemDescription").value = ""; document.getElementById("ItemCategory").value = ""; document.getElementById("requestTypeId").value = ""; } function isFullFilled() { var itemNameInput = document.getElementById('itemName').value; var itemDescriptionInput = document.getElementById('itemDescription').value; var itemCategoryInput = document.getElementById('itemCategoryName').value; var itemLocalNameInput = document.getElementById('itemLocalName').value; var uomNameInput = document.getElementById('uomName').value; var itemQtyInput = document.getElementById('itemQty').value; var itemClassIdInput = document.getElementById('itemClassId').value; var packagingTypeIdInput = document.getElementById('packagingTypeId').value; var prTypeIdInput = document.getElementById('prTypeId').value; var itemColorIdInput = document.getElementById('itemColorId').value; if (!itemNameInput || !itemCategoryInput || itemQtyInput === '0' || !itemDescriptionInput || !itemLocalNameInput || !uomNameInput || !itemClassIdInput || !packagingTypeIdInput || !prTypeIdInput || !itemColorIdInput) { let btnAddToCart = document.getElementById('btnAddToCart'); btnAddToCart.style.display = 'none'; } else { let btnAddToCart = document.getElementById('btnAddToCart'); btnAddToCart.style.display = 'block'; } } $(document).ready(function () { loader = $('#overlay, #loader'); let fetchedData = []; let hasFetched = false; // ensures only one fetch per page load let fetchInProgress = false; // prevents multiple calls before first finishes let cartItemCount = $('#cartItemCount').val(); $('#cartCount').text(cartItemCount); itemTable = $('#ItemTable').DataTable({ serverSide: false, processing: true, deferLoading: 0, data: [], columns: [ { data: 'itemNo' }, { data: 'itemName' }, { data: 'itemDescription' }, { data: 'itemCategoryName' }, { data: null, render: function (data, type, row) { return renderItembtns(data, row); } }, { data: 'cartItemCount', visible: false }, { data: 'createdDate', visible: false }, { data: 'requestTypeId', visible: false } ], order: [[0, 'desc']], responsive: true, language: { emptyTable: "Type in the search box to fetch data." } }); // Simple debounce helper function debounce(func, delay) { let timer; return function (...args) { clearTimeout(timer); timer = setTimeout(() => func.apply(this, args), delay); }; } // Search handler $('#ItemTable_filter input').unbind().on('keyup', debounce(function () { let searchValue = $(this).val().trim(); if (searchValue.length === 0) { itemTable.clear().draw(); return; } if (!hasFetched && !fetchInProgress) { // Fetch only once on first user input fetchInProgress = true; loader.show(); $.ajax({ url: '/ItemMgmt/GetItemList', type: 'GET', success: function (response) { fetchedData = response.data || []; itemTable.clear().rows.add(fetchedData).draw(); hasFetched = true; // mark as fetched }, complete: function () { loader.hide(); fetchInProgress = false; }, error: function (xhr, error) { console.log('Error fetching data:', error); } }); } else if (hasFetched) { // Local filtering only let filteredData = fetchedData.filter(function (item) { return ( item.itemCodeId.toString().includes(searchValue) || item.itemName.toLowerCase().includes(searchValue.toLowerCase()) || item.itemDescription.toLowerCase().includes(searchValue.toLowerCase()) || item.itemCategoryName.toLowerCase().includes(searchValue.toLowerCase()) ); }); itemTable.clear().rows.add(filteredData).draw(); } }, 300)); // debounce delay in ms }); document.addEventListener('DOMContentLoaded', function () { const triggers = Array.from(document.querySelectorAll('[data-bs-toggle="tooltip"]')); triggers.forEach(el => { new bootstrap.Tooltip(el, { container: 'body', // append tooltip to body boundary: 'window', // prevent clipping }); }); });