maintain code readability

This commit is contained in:
ameerulrasyid 2025-03-10 09:30:17 +08:00
parent 02197f4c1f
commit 6c2923ca1a
3 changed files with 44 additions and 434 deletions

View File

@ -893,35 +893,6 @@
},
})
// Attach click event listener to the delete buttons
$('#itemDatatable tbody').on('click', '.delete-btn', function () {
const itemId = $(this).data('id');
self.deleteItem(itemId);
});
// $('#itemDatatable tbody').on('click', '.print-btn', function () {
// const $button = $(this); The clicked button
// const $row = $button.closest('tr'); The parent row of the button
// const itemId = $button.data('id'); Get the item ID from the button's data attribute
// let imageSrc;
// Check if the table is collapsed
// if ($row.hasClass('child')) {
// For collapsed view: Look for the closest `.dtr-data` that contains the img
// imageSrc = $row.prev('tr').find('td:nth-child(1) img').attr('src');
// } else {
// For expanded view: Find the img in the first column of the current row
// imageSrc = $row.find('td:nth-child(1) img').attr('src');
// }
// if (imageSrc) {
// self.printItem(itemId, imageSrc); Call the print function with the itemId and imageSrc
// } else {
// console.error("Image source not found.");
// }
// });
this.loading = false;
},
@ -948,28 +919,21 @@
this.initAllTables();
} else {
const data = await response.json();
const data = await response.json();
this.items = data.filter(item =>
item.toUser === this.currentUser.id ||
item.lastUser === this.currentUser.id ||
item.toStore === this.currentUser.store ||
item.lastStore === this.currentUser.store
item.toUser === this.currentUser.id ||
item.lastUser === this.currentUser.id ||
item.toStore === this.currentUser.store ||
item.lastStore === this.currentUser.store
);
this.initAllTables();
this.initAllTables();
// console.log(this.items);
}
// const allowedKeys = ["toUser", "lastUser"];
// this.items = (await response.json()).filter(item => allowedKeys.some(key => item[key] === this.currentUser.id));
// this.items = (await response.json()).filter(item => item.lastUser === this.currentUser);
// const allowedKeys = ["toUser", "lastUser"];
// this.items = (await response.json()).filter(item =>
// allowedKeys.some(key => item[key] === this.currentuser.id)
// );
if (this.itemDatatable) {
this.itemDatatable.clear().destroy();
@ -982,101 +946,6 @@
this.loading = false;
},
// FRONT END FUNCTIONS
//----------------------//
//Calculate Total Price
convertCurrency() {
const total = this.DefaultPrice * this.currencyRate;
this.convertPrice = total.toFixed(2);
this.DefaultPrice = this.DefaultPrice
// .replace(/[^0-9.]/g, '') // Remove non-numeric characters except decimal points
// .replace(/(\..*)\..*/g, '$1') // Allow only one decimal point
// .replace(/^(\d*\.\d{0,2})\d*$/, '$1'); // Limit to two decimal places
},
calculateWarrantyEndDate() {
// Check if DODate and warranty are valid
if (!this.DODate || isNaN(Date.parse(this.DODate))) {
this.EndWDate = null;
return;
}
const DODates = new Date(this.DODate);
const warrantyMonth = parseInt(this.warranty);
// Ensure warranty is a valid number
if (!isNaN(warrantyMonth)) {
DODates.setMonth(DODates.getMonth() + warrantyMonth);
this.EndWDate = DODates.toISOString().split('T')[0];
} else {
this.EndWDate = null;
}
},
async deleteItem(itemId) {
if (!confirm("Are you sure you want to delete this item?")) {
return;
}
try {
const response = await fetch(`/InvMainAPI/DeleteItem/${itemId}`, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
});
const result = await response.json();
if (result.success) {
alert(result.message);
// Remove the row from DataTables
this.itemDatatable
.row($(`.delete-btn[data-id="${itemId}"]`).closest('tr'))
.remove()
.draw();
} else {
alert(result.message);
}
}
catch (error) {
console.error("Error deleting item:", error);
alert("An error occurred while deleting the item.");
}
finally {
this.loading = false;
}
},
async printItem(itemId, imgSrc) {
try {
this.thisQRInfo.uniqueID = itemId;
const uniqueQR = itemId;
const container = document.getElementById("QrContainer");
if (!container) {
console.error("Container not found.");
return;
}
// Safely set image content
const sanitizedImgSrc = encodeURI(imgSrc); // Sanitize the URL
container.innerHTML = `<img src="${sanitizedImgSrc}" alt="QR Code" class="text-center " />`;
// Fetch QR information
const qrInfo = this.getPrintedQR(uniqueQR);
if (!qrInfo) {
console.error("QR Info not found.");
return;
}
this.thisQRInfo = qrInfo;
this.thisQRInfo.imgSrc = sanitizedImgSrc
this.thisQRInfo.imgContainer = container.innerHTML
$(`#QrItemModal`).modal('show'); // Show modal
}
catch (error) {
console.error("Error generating QR code:", error);
alert("An error occurred while generating the QR code.");
}
},
async fetchUser() {
try {
const response = await fetch(`/IdentityAPI/GetUserInformation/`, {
@ -1109,89 +978,6 @@
console.error('There was a problem with the fetch operation:', error);
}
},
// getPrintedQR(uniqueID) {
// if (!this.items || !Array.isArray(this.items)) {
// console.error("Items list is not available or is not an array.");
// return null;
// }
// return this.items.find(item => item.uniqueID === uniqueID);
// },
// printQRInfo() {
// Create a virtual DOM element
// const virtualElement = document.createElement('div');
// virtualElement.style.width = '330px '; Match label size for 2 inches at 203 DPI
// virtualElement.style.height = '160px';
// virtualElement.style.position = 'absolute';
// virtualElement.style.left = '-9999px'; Position offscreen to avoid rendering on the main UI
// virtualElement.style.border = '1px solid #000'; Optional: Add a border for debugging dimensions
// Populate the virtual DOM with content
// virtualElement.innerHTML = `
// <div class="container-fluid my-3 QrPrintFont" style="font-family: 'OCR A', monospace;">
// <div class="row" >
// <div class="col-5 text-center d-flex align-items-center justify-content-center">
// <div class="row">
// <div class="col-12">
// <div>${this.thisQRInfo.imgContainer}</div>
// <div class="col-12 h4"style="font-family: 'Arial', monospace;"><b>${this.thisQRInfo.uniqueID}</b></div>
// </div>
// </div>
// </div>
// <div class="col-7 d-flex align-items-center justify-content-left">
// <div class="row-fluid">
// <div class="col-12 h3"style="font-family: 'Verdana', monospace;"><b>${this.thisQRInfo.departmentName}</b></div>
// <div class="col-12 h4"style="font-family: 'Arial', monospace;"><b>${this.thisQRInfo.productShortName}</b></div>
// <div class="col-12 h4"style="font-family: 'Arial', monospace;"><b>${this.thisQRInfo.serialNumber??"-"}</b></div>
// <div class="col-12 h4"style="font-family: 'Arial', monospace;"><b>${this.thisQRInfo.partNumber}</b></div>
// </div>
// </div>
// </div>
// </div>
// `;
// Append the virtual DOM to the body (temporarily)
// document.body.appendChild(virtualElement);
// Wait for the font to be loaded (important for custom fonts like OCR-A)
// document.fonts.load('1em "OCR A"').then(() => {
// Use html2canvas to convert the virtual DOM to an image
// html2canvas(virtualElement, {
// scale: 1, Increase scale for sharper images
// }).then((canvas) => {
// Convert the canvas to an image
// const imgData = canvas.toDataURL('image/png');
// Open the image in a new tab for preview (optional)
// const newWindow = window.open();
// newWindow.location.href = imgData;
// console.log(imgData)
// Use printJS to print the image
// printJS({
// printable: imgData,
// type: 'image',
// css: '/../lib/bootstrap/dist/css/bootstrap.css',
// style: `
// @@media print {
// @@page {
// margin: 5px 5px 0px 5px;
// }
// body { margin: 0; }
// }
// `
// });
// Remove the virtual DOM from the body after use
// document.body.removeChild(virtualElement);
// }).catch((error) => {
// console.error("Error generating image:", error);
// Remove the virtual DOM if an error occurs
// document.body.removeChild(virtualElement);
// });
// }).catch((error) => {
// console.error("Error loading font:", error);
// Remove the virtual DOM if font loading fails
// document.body.removeChild(virtualElement);
// });
// },
handleSorting() {
this.renderTables();
},
@ -1226,11 +1012,9 @@
{ title: "Last User", data: "lastUserName" },
{ title: "From Station", data: "toStationName" },
{ title: "From Store", data: "toStoreName" },
// { title: "Action", data: "action" },
{ title: "Start Status", data: "toOther" },
{ title: "Product Category", data: "productCategory" },
{ title: "Qty", data: "quantity" },
// { title: "Send Date", data: "sendDate" },
{
title: "Note",
data: "consignmentNote",
@ -1280,13 +1064,10 @@
{ title: "Last Station", data: "lastStationName" },
{ title: "From Store", data: "toStoreName" },
{ title: "Last Store", data: "lastStoreName" },
// { title: "Action", data: "action" },
{ title: "Start Status", data: "toOther" },
{ title: "Latest Status", data: "latestStatus" },
{ title: "Product Category", data: "productCategory" },
{ title: "Product Category", data: "productCategory" },
{ title: "Qty", data: "quantity" },
// { title: "Send Date", data: "sendDate" },
// { title: "Receive Date", data: "receiveDate" },
{ title: "Note",
data: "consignmentNote",
render: function (data, type, full, meta) {
@ -1374,7 +1155,7 @@
toggleHistory(itemId) {
this.historyVisible[itemId] = !this.historyVisible[itemId];
// this.historyVisible = {};
// this.historyVisible = {};
},

View File

@ -585,7 +585,6 @@
return {
thisItem: null,
qrCodeResult: null,
debounceTimeout: null,
userlist: null,
stationlist: null,
@ -601,19 +600,6 @@
selectedOther: "",
remark: "",
document: null,
// companies: [
// {
// companyId: 1,
// companyName: "PSTW",
// departments: [{ departmentId: 1, departmentName: "Air" }, { departmentId: 2, departmentName: "Marine" }, { departmentId: 3, departmentName: "River" }]
// },
// {
// companyId: 2,
// companyName: "TES",
// departments: [{ departmentId: 1, departmentName: "Air" }],
// },
// ],
// company: "",
currentUser: null,
currentUserCompanyDept: null,
itemlateststatus: "",
@ -682,59 +668,6 @@
},
},
methods: {
sharpenFrame(videoCanvas) {
const ctx = videoCanvas.getContext("2d");
if (!ctx) return;
const { width, height } = videoCanvas;
const imageData = ctx.getImageData(0, 0, width, height);
const data = imageData.data;
// Sharpening kernel (edge enhancement)
const kernel = [0, -1, 0, -1, 5, -1, 0, -1, 0];
// Apply convolution
const newData = new Uint8ClampedArray(data);
const w = width * 4; // Each pixel has 4 values (RGBA)
for (let y = 1; y < height - 1; y++) {
for (let x = 1; x < width - 1; x++) {
const i = (y * width + x) * 4;
let r = 0, g = 0, b = 0;
for (let ky = -1; ky <= 1; ky++) {
for (let kx = -1; kx <= 1; kx++) {
const j = i + (ky * w) + (kx * 4);
const weight = kernel[(ky + 1) * 3 + (kx + 1)];
r += data[j] * weight;
g += data[j + 1] * weight;
b += data[j + 2] * weight;
}
}
// Apply sharpening
newData[i] = Math.min(255, Math.max(0, r));
newData[i + 1] = Math.min(255, Math.max(0, g));
newData[i + 2] = Math.min(255, Math.max(0, b));
}
}
// Update canvas with the sharpened frame
ctx.putImageData(new ImageData(newData, width, height));
},
processFrame(videoElement) {
console.log(videoElement);
console.log("Type:", typeof videoElement);
console.log(videoElement.constructor.name);
console.log(Array.isArray(videoElement)); // Check if it's an array
console.log(Object.keys(videoElement));
for (const key in videoElement) {
if (videoElement[key] instanceof HTMLVideoElement) {
console.log("Found HTMLVideoElement at:", key, videoElement[key]);
}
}
},
// Split Url dapatkan unique ID Je
onDecode(detectedCodes) {
// const endTime = performance.now();
@ -766,126 +699,48 @@
async onCameraReady(videoElement) {
const video = document.querySelector("video");
console.log("📸 Found Video Element:", video);
console.log("🎬 Video.srcObject:", video?.srcObject);
// console.log("📸 Found Video Element:", video);
// console.log("🎬 Video.srcObject:", video?.srcObject);
const track = video.srcObject.getVideoTracks()[0];
console.log("🎞 Video Track:", track);
const track = video.srcObject.getVideoTracks()[0];
// console.log("🎞 Video Track:", track);
if (track && track.getCapabilities) {
const capabilities = track.getCapabilities(); // Get camera capabilities
console.log("🎛 Camera Capabilities:", capabilities);
if (track && track.getCapabilities) {
const capabilities = track.getCapabilities(); // Get camera capabilities
// console.log("🎛 Camera Capabilities:", capabilities);
if (capabilities.sharpness) {
// track.applyConstraints({
// advanced: [ { sharpness: 100 }, Max sharpness
// { contrast: 50 }, Boost contrast
// { brightness: 60 }, Increase brightness
// { frameRate: 30 }, Try max FPS
// { exposureTime: 100 }, Lower for less motion blur
// { focusMode: "continuous" }, Ensure auto-focus
// { width: 1280, height: 720 }
//]
// }) Max resolution] Max sharpness
if (capabilities.sharpness) {
// Step 1: Apply resolution constraints first
track.applyConstraints({
advanced: [{ width: 1280, height: 720 }]
}).then(() => {
// console.log("✅ Resolution applied", track.getSettings().width, "x", track.getSettings().height);
// Step 2: Apply sharpness separately
return track.applyConstraints({ advanced: [{ sharpness: 100 }] });
}).then(() => {
// console.log("✅ Sharpness applied")
return track.applyConstraints({ advanced: [{ exposureMode: 'continuous' }] });
}).then(() => {
// console.log("✅ exposureMode applied");
// track.applyConstraints ({
// advanced: [
// {sharpness: 80},
// { width: 1280, height: 720 }
// ]
// })
// .then(() => {console.log("✅ Sharpness applied"); console.log("📷 Applied Constraintsss:", track.getSettings()); })
// .catch(err => console.error("❌ Failed to apply sharpness:", err));
})
.then(() => { console.log("📷 Applied Constraintsss:", track.getSettings());
}).catch(err =>
// console.error("❌ Failed to apply constraints:", err)
);
// Step 1: Apply resolution constraints first
track.applyConstraints({
advanced: [{ width: 1280, height: 720 }]
}).then(() => {
console.log("✅ Resolution applied", track.getSettings().width, "x", track.getSettings().height);
// Step 2: Apply sharpness separately
return track.applyConstraints({ advanced: [{ sharpness: 100 }] });
}).then(() => {console.log("✅ Sharpness applied")
// Step 2: Apply sharpness separately
// return track.applyConstraints({ advanced: [{ whiteBalanceMode: 'manual' }] });
// }).then(() => {console.log("✅ whitebalancemode continous applied");
return track.applyConstraints({ advanced: [{ exposureMode: 'continuous' }] });
}).then(() => {console.log("✅ exposureMode applied");
// return track.applyConstraints({ advanced: [{ exposureTime: 100 }] });
// }).then(() => {console.log("✅ exposure time improvement applied");
})
.then(() => { console.log("📷 Applied Constraintsss:", track.getSettings());
}).catch(err => console.error("❌ Failed to apply constraints:", err));
} else {
console.warn("⚠️ Sharpness not supported on this camera");
}
}
console.log("📷 Applied Constraintsss:", track.getSettings());
console.log("📷 Applied Capabilities:",track.getCapabilities());
// console.log("Is it a video element?", videoElement instanceof HTMLVideoElement);
// console.log("Camera Ready! Video element:", videoElement);
// this.videoElement = videoElement; Store for later use
// this.scanStartTime = performance.now(); Start timing
// this.scanTime = null; Reset previous scan time
// if (!videoElement || !videoElement.srcObject) {
// console.error("❌ No video source found.");
// return;
// }
// const track = videoElement.srcObject.getVideoTracks()[0];
// if (!videoElement) {
// console.error("❌ No video element provided.");
// return;
// } else {
// console.log(" video element provided.");
// }
// Wait a bit to ensure the video stream is attached
// await new Promise(resolve => setTimeout(resolve, 1000));
// if (!videoElement.srcObject) {
// console.error("❌ No video source (srcObject is missing).");
// return;
// }
// const track = videoElement.srcObject.getVideoTracks()[0];
// if (!track) {
// console.error("❌ No video track found.");
// return;
// }
// const capabilities = track.getCapabilities();
// console.log("📸 Camera Capabilities:", capabilities); Debugging
// if ("sharpness" in capabilities) {
// try {
// await track.applyConstraints({
// advanced: [{ sharpness: 100 }] Max sharpness
// });
// console.log("✅ Sharpness applied:", track.getSettings().sharpness);
// } catch (error) {
// console.error("❌ Failed to apply sharpness:", error);
// }
// } else {
// console.warn("⚠️ Sharpness not supported on this camera.");
// };
} else {
console.warn("⚠️ Some settings are not supported on this camera");
}
}
// console.log("📷 Applied Constraintsss:", track.getSettings());
// console.log("📷 Applied Capabilities:",track.getCapabilities());
try {
const devices = await navigator.mediaDevices.enumerateDevices();
@ -1039,7 +894,7 @@ console.log("🎬 Video.srcObject:", video?.srcObject);
if (response.ok) {
// If the form submission was successful, display a success message
// alert('Success!', 'Item form has been successfully submitted.', 'success');
const updatedItem = await response.json();
//const updatedItem = await response.json();
// this.items.push(updatedItem);
// console.log(updatedItem);
@ -1072,15 +927,6 @@ console.log("🎬 Video.srcObject:", video?.srcObject);
this.itemassignedtouser = this.thisItem.toUser == this.currentUser.id || this.thisItem.lastUser == this.currentUser.id ? true : false;
// console.log(this.thisItem);
// if ((this.thisItem.toOther === "Repair" || this.thisItem.toOther === "Calibration" || this.thisItem.toOther === "Return" ) && this.thisItem.lastUser === this.currentUser.id && this.thisItem.movementComplete === false) {
// this.selectedAction = "receive";
// }
// if ((this.itemlateststatus === "Repair" || this.itemlateststatus === "Calibration" || this.itemlateststatus === "Return" ) && this.thisItem.lastUser === this.currentUser.id && this.thisItem.movementComplete === false) {
// this.selectedAction = "receive";
// }
} else {
console.error('Failed to fetch item information');
this.responseMessage = await response.text();

View File

@ -553,8 +553,6 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
public async Task<IActionResult> ItemMovementList()
{
//var itemMovementList = await _centralDbContext.ItemMovements.Include(i => i.NextUser).Include(i => i.Item).ThenInclude(i => i.Product).ToListAsync();
var itemMovementList = await _centralDbContext.ItemMovements
.Include(i => i.Item)
.ThenInclude(i => i.Product)
@ -566,7 +564,6 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
.Include(i => i.NextUser)
.Include(i => i.NextUser)
.ToListAsync();
//var itemList = await _centralDbContext.Items.ToListAsync();
int itemrow = 0;
var itemMovementListWithQR = itemMovementList.Select(item => new
@ -578,12 +575,9 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
toUserName = item.NextUser?.FullName,
lastUserName = item.FromUser?.FullName
}).ToList();
//Console.WriteLine(Json(itemMovementList));
//Console.WriteLine(Json(itemMovementListWithQR));
//return Json(itemMovementList);
//return Json(itemMovementListWithQR);
return Json(itemMovementList.Select(i => new
{
i.Id,
@ -614,16 +608,6 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
i.receiveDate,
i.MovementComplete
}));
//return Json(itemMovementList.Select(item => new
//{
// id = itemrow++,
// item,
// QRString = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host.Value}/I/{item.ItemId}", // Generate QR String
// ProductName = item.Item?.Product?.ProductName,
// toUserName = item.NextUser?.FullName,
// lastUserName = item.FromUser?.FullName
//}));
}
[HttpPost("AddItemMovement")]
@ -642,7 +626,6 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
// throw new Exception("itemmovement.ToUser is null");
//}
//var inventoryMaster = await _centralDbContext.InventoryMasters.Include("User").FirstOrDefaultAsync(i => i.UserId == itemmovement.ToUser) ?? new InventoryMasterModel { UserId = itemmovement.ToUser };
var inventoryMaster = await _centralDbContext.InventoryMasters.Include("User").FirstOrDefaultAsync(i => i.UserId == itemmovement.ToUser);
if (inventoryMaster != null)
{