151 lines
5.9 KiB
Plaintext
151 lines
5.9 KiB
Plaintext
@* {{-- FILTER BAR --}} *@
|
|
<div class="cv-filters">
|
|
<div class="cv-search-box">
|
|
<i class="fas fa-hashtag"></i>
|
|
<input type="text" id="fc-srchItemNo" placeholder="Item Number..." />
|
|
</div>
|
|
<div class="cv-search-box">
|
|
<i class="fas fa-box"></i>
|
|
<input type="text" id="fc-srchItemName" placeholder="Item Name..." />
|
|
</div>
|
|
<div class="cv-search-box">
|
|
<i class="fas fa-file-alt"></i>
|
|
<input type="text" id="fc-srchPRNo" placeholder="PR Number..." />
|
|
</div>
|
|
|
|
@* {{-- Supplier dropdown --}} *@
|
|
<div class="cv-supplier-wrap" id="fc-supplierWrap">
|
|
<div class="cv-sup-trigger">
|
|
<span class="cv-sup-left">
|
|
<i class="fas fa-store"></i>
|
|
<span class="cv-sup-lbl">All Suppliers</span>
|
|
</span>
|
|
<i class="fas fa-chevron-down cv-sup-caret"></i>
|
|
</div>
|
|
<div class="cv-sup-dropdown">
|
|
<div class="cv-sup-searchbox">
|
|
<i class="fas fa-search"></i>
|
|
<input type="text" placeholder="Search supplier..." autocomplete="off" />
|
|
</div>
|
|
<div class="cv-sup-list">
|
|
<div class="cv-sup-opt active" data-value="">
|
|
<i class="fas fa-th-large"></i> All Suppliers
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="cv-filter-right">
|
|
<span class="cv-pgsz-lbl">Show</span>
|
|
<select class="cv-pgsz-sel" id="fc-pageSize">
|
|
<option value="6">6 per page</option>
|
|
<option value="12" selected>12 per page</option>
|
|
<option value="24">24 per page</option>
|
|
<option value="48">48 per page</option>
|
|
</select>
|
|
<span class="cv-result-count" id="fc-resultCount">0 results</span>
|
|
</div>
|
|
</div>
|
|
|
|
@* {{-- CARD GRID --}} *@
|
|
<div class="cv-grid" id="fc-grid">
|
|
<div class="cv-state" style="grid-column:1/-1">
|
|
<div class="cv-spinner"></div><p>Loading…</p>
|
|
</div>
|
|
</div>
|
|
|
|
@* {{-- PAGINATION --}} *@
|
|
<div class="cv-pagination">
|
|
<span class="cv-pg-info" id="fc-pageInfo"></span>
|
|
<div class="cv-pg-btns" id="fc-pageButtons"></div>
|
|
</div>
|
|
|
|
<script>
|
|
(function () {
|
|
"use strict";
|
|
const H = window.CanvassHelpers;
|
|
|
|
const s = { page: 1, pageSize: 12, totalCount: 0, supplier: "", searchPR: "", searchItem: "", searchName: "", timer: null };
|
|
|
|
const grid = document.getElementById("fc-grid");
|
|
const countEl = document.getElementById("fc-resultCount");
|
|
const pageInfo = document.getElementById("fc-pageInfo");
|
|
const pageBtns = document.getElementById("fc-pageButtons");
|
|
const inItemNo = document.getElementById("fc-srchItemNo");
|
|
const inName = document.getElementById("fc-srchItemName");
|
|
const inPR = document.getElementById("fc-srchPRNo");
|
|
const inSize = document.getElementById("fc-pageSize");
|
|
|
|
const sup = H.initSupplierDropdown(
|
|
document.getElementById("fc-supplierWrap"),
|
|
val => { s.supplier = val; s.page = 1; fetchData(); }
|
|
);
|
|
|
|
[inItemNo, inName, inPR].forEach(el =>
|
|
el.addEventListener("input", () => {
|
|
clearTimeout(s.timer);
|
|
s.timer = setTimeout(() => {
|
|
s.searchItem = inItemNo.value.trim();
|
|
s.searchName = inName.value.trim();
|
|
s.searchPR = inPR.value.trim();
|
|
s.page = 1; fetchData();
|
|
}, 350);
|
|
})
|
|
);
|
|
inSize.addEventListener("change", () => { s.pageSize = parseInt(inSize.value,10); s.page=1; fetchData(); });
|
|
|
|
async function fetchData() {
|
|
grid.innerHTML = `<div class="cv-state" style="grid-column:1/-1"><div class="cv-spinner"></div><p>Loading…</p></div>`;
|
|
const p = new URLSearchParams({ searchPRNo: s.searchPR, searchItemNo: s.searchItem, searchItemName: s.searchName, searchSupplier: s.supplier, pageNumber: s.page, pageSize: s.pageSize, draw: Date.now() });
|
|
try {
|
|
const res = await fetch(`/CanvassMgmt/GetCanvassPerSupplier?${p}`);
|
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
const json = await res.json();
|
|
s.totalCount = json.recordsTotal ?? 0;
|
|
|
|
sup.setItems(json.supplierList);
|
|
|
|
renderCards(json.data ?? []);
|
|
H.renderPagination(pageBtns, pageInfo, s, pg => { s.page=pg; fetchData(); });
|
|
countEl.textContent = `${s.totalCount.toLocaleString()} result${s.totalCount !== 1 ? "s" : ""}`;
|
|
} catch (err) {
|
|
console.error(err);
|
|
grid.innerHTML = `<div class="cv-state" style="grid-column:1/-1"><i class="fas fa-exclamation-triangle" style="color:#ff5c5c"></i><p>Failed to load data.</p></div>`;
|
|
}
|
|
}
|
|
|
|
function renderCards(data) {
|
|
if (!data.length) {
|
|
grid.innerHTML = `<div class="cv-state" style="grid-column:1/-1"><i class="fas fa-inbox"></i><p>No records found.</p></div>`;
|
|
return;
|
|
}
|
|
// <button class="cv-btn cv-btn-primary btn-canvass" data-id="${i.supplierId}">
|
|
// <i class="fas fa-eye"></i> View Canvass
|
|
// </button>
|
|
grid.innerHTML = data.map(item =>
|
|
H.buildCardHtml(item, i => `
|
|
|
|
<button class="cv-btn cv-btn-outline btn-email" data-id="${i.supplierId}">
|
|
<i class="fas fa-paper-plane"></i> Send Email
|
|
</button>`)
|
|
).join("");
|
|
|
|
grid.querySelectorAll(".btn-canvass").forEach(b =>
|
|
b.addEventListener("click", () => openCanvass(b.dataset.id)));
|
|
grid.querySelectorAll(".btn-email").forEach(b =>
|
|
b.addEventListener("click", () => sendEmail(b.dataset.id)));
|
|
}
|
|
|
|
function openCanvass(id) {
|
|
document.getElementById("supplierId").value = id;
|
|
// e.g. $('#canvassModal').modal('show');
|
|
console.log("Open canvass:", id);
|
|
}
|
|
function sendEmail(id) {
|
|
console.log("Send email:", id);
|
|
}
|
|
|
|
fetchData();
|
|
})();
|
|
</script>
|