localstorage-getitem-setitem
unknown
javascript
a year ago
30 kB
11
Indexable
<script type="module">
import { toast } from '/node_modules/wc-toast/src/index.js';
import '/node_modules/wc-toast/src/toast.js';
document.addEventListener("DOMContentLoaded", function () {
checkExpiryAndRemove();
const appointmentID = document.getElementById("appointmentID");
const allergiesTextarea = document.getElementById("Allergies");
const doctorAssessmentTextarea = document.getElementById("Prop_DoctorAssessment");
const addNotesTextarea = document.getElementById("Prop_Notes");
const addDiagnosis = document.getElementById("Prop_Diagnosis");
const addMedicalLeaveStartDate = document.getElementById("Prop_MedicalLeaveStartDate");
const addMedicalLeaveEndDate = document.getElementById("Prop_MedicalLeaveEndDate");
const addConsultationFees = document.getElementById("ConsultationFees");
const addPaymentDiscount = document.getElementById("PaymentDiscount");
const saveProductButton = document.getElementById("save-product-btn");
const formAddProduct = document.getElementById("productForm");
const formMedicalRecord = document.getElementById("form");
const savedAppointmentID = localStorage.getItem("appointmentID");
const savedAllergies = localStorage.getItem("allergies");
const savedDoctorAssessment = localStorage.getItem("doctorAssessment");
const savedAddNotes = localStorage.getItem("addNotes");
const savedDiagnosis = localStorage.getItem("addDiagnosis");
const savedMedicalLeaveStartDate = localStorage.getItem("addMedicalLeaveStartDate");
const savedMedicalLeaveEndDate = localStorage.getItem("addMedicalLeaveEndDate");
const savedConsultationFees = localStorage.getItem("addConsultationFees");
const savedPaymentDiscount = localStorage.getItem("addPaymentDiscount");
if (savedAppointmentID && appointmentID) {
appointmentID.value = savedAppointmentID;
}
if (savedAllergies && allergiesTextarea) {
allergiesTextarea.value = savedAllergies;
}
if (savedDoctorAssessment && doctorAssessmentTextarea) {
doctorAssessmentTextarea.value = savedDoctorAssessment;
}
if (savedAddNotes && addNotesTextarea) {
addNotesTextarea.value = savedAddNotes;
}
if (savedDiagnosis && addDiagnosis) {
addDiagnosis.value = savedDiagnosis;
}
if (savedMedicalLeaveStartDate && addMedicalLeaveStartDate) {
addMedicalLeaveStartDate.value = savedMedicalLeaveStartDate;
}
if (savedMedicalLeaveEndDate && addMedicalLeaveEndDate) {
addMedicalLeaveEndDate.value = savedMedicalLeaveEndDate;
}
if (savedConsultationFees && addConsultationFees) {
addConsultationFees.value = savedConsultationFees;
}
if (savedPaymentDiscount && addPaymentDiscount) {
addPaymentDiscount.value = savedPaymentDiscount;
}
const savedProducts = JSON.parse(localStorage.getItem("productItems")) || [];
if (savedProducts.length > 0) {
const tableBody = document.querySelector("tbody#tbodyProductItem");
function populateRows(products) {
if (products.length > 0) {
products.forEach((product) => {
let existingRow = document.getElementById(product.id);
if (existingRow) {
existingRow.querySelectorAll("[name]").forEach(input => {
const key = input.getAttribute("name");
if (product[key] !== undefined) {
input.value = product[key];
}
if (key === "ProductCode" && product[key] !== undefined) {
const dropdown = existingRow.querySelector(".productClassList");
if (dropdown) {
dropdown.tomselect.setValue(product[key]);
}
}
});
}
else
{
const newIndex = tableBody.querySelectorAll('tr.dynamic-productitems-add').length + 1;
const newRow = document.createElement('tr');
newRow.classList.add('dynamic-productitems-add');
newRow.id = product.id;
newRow.innerHTML = `
<td class="p-2">${newIndex} <input type="hidden" name="MedicalRecordPrescriptionsID[]" value="" /></td>
<td class="p-2 w-[20%]">
@Html.EPosSearchableComboBoxFor("ProductCode", new {
Label = "",
Value = Model.Parameters["ProductCode"].ToString(),
ReferenceValue = "SELECT ProductID, (ProductName + ' (RM ' + CAST(SellingPrice AS varchar(50)) + ')') AS Description, Unit, Frequency, Instructions FROM Products WHERE OutletID = '" + Env.OutletID.ToString() + "' ORDER BY ProductName ASC;",
CssClassControl = "productSelect",
sClassSearchableComboBoxFor = "productClassList",
onchange = "updateProductPrice(this); updateDetails(this)",
AutoSubmitAndClearButton = false,
ScriptExist = true,
Placeholder = "Choose a medicine",
ClassSearchableComboBoxForWidth = "w-full"
})
</td>
<td class="hidden p-2 text-right">
<input type="number" name="ProductCurrentPrice" value="${product.ProductCurrentPrice || 0}"
class="text-right bg-gray-200 pointer-events-none border border-gray-300 text-gray-900 text-sm rounded-lg block p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white w-full focus:outline-none focus:border-gray-300"
placeholder="0" step="0.01" readonly onchange="calculateTotal(this)" />
</td>
<td class="p-2 text-right">
<input type="number" name="ProductAdjustedPrice" value="${product.ProductAdjustedPrice || 0}"
class="text-right bg-transparent border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full"
placeholder="0" step="0.01" onchange="calculateTotal(this)" />
</td>
<td class="p-2 w-[5%] text-right">
<input type="number" name="ProductQuantity" value="${product.ProductQuantity || 0}"
class="text-right bg-transparent border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full"
placeholder="0" step="1" onchange="calculateTotal(this)" required />
</td>
<td class="p-2 text-right border-r-2 border-black">
<input type="text" name="TotalPrice" value="${product.TotalPrice || 0}"
class="text-right bg-gray-200 pointer-events-none border border-gray-300 text-gray-900 text-sm rounded-lg block p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white w-full" readonly />
</td>
<td class="p-2 text-right">
<input type="number" name="Frequency" value="${product.Frequency || 0}"
class="text-right bg-transparent border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full"
placeholder="0" step="1" />
</td>
<td class="p-2">
@Html.EPosTextBoxFor("Indications", new {
Label = "",
Value = "${product.Indications || ''}",
CssClassLabel = "",
CssClassControl = ""
})
</td>
<td class="p-2">
@Html.EPosTextBoxFor("Instructions", new {
Label = "",
Value = "${product.Instructions || ''}",
CssClassLabel = "",
CssClassControl = ""
})
</td>
<td class="pl-6 pr-2 py-2">
<div class="flex flex-row min-w-max space-x-2">
<button type="button" onclick="toggleDetails('${product.id}')"
class="w-10 sm:min-w-max h-10 sm:h-auto items-center justify-center sm:justify-start sm:px-4 sm:py-2 border border-gray-200 text-[#111827] hover:text-[#69c07a] hover:border-[#69c07a] font-medium rounded-lg text-sm text-center inline-flex items-center group">
<img src="/Images/Table/clinex-detail-button-icon.png"
alt="detail"
class="bg-contain w-2.5 h-2.5 sm:group-hover:hidden sm:block hidden" />
<img src="/Images/Table/clinex-detail-button-hover-icon.png"
alt="detail Hover"
class="bg-contain w-2.5 h-2.5 sm:hidden group-hover:block" />
</button>
<button type="button" class="delete-button w-10 sm:min-w-max h-10 sm:h-auto items-center justify-center sm:justify-start sm:px-4 sm:py-2 border border-[#DC2626] sm:border-gray-200 text-gray-900 hover:text-[#DC2626] hover:border-[#DC2626] font-medium rounded-lg text-sm text-center inline-flex items-center group">
<img src="/Images/Table/clinex-delete-button-icon.png"
alt="Delete"
class="w-2.5 h-3 sm:group-hover:hidden sm:block hidden pointer-events-none" />
<img src="/Images/Table/clinex-delete-button-hover-icon.png"
alt="Delete Hover"
class="w-2.5 h-3 sm:hidden group-hover:block pointer-events-none" />
</button>
</div>
</td>
`;
tableBody.appendChild(newRow);
}
});
updateRowIndexes();
setDropdownValues();
}
}
function updateRowIndexes() {
const rows = tableBody.querySelectorAll("tr");
rows.forEach((row, index) => {
const firstCell = row.querySelector("td:first-child");
if (firstCell) {
firstCell.innerHTML = `${index + 1} <input type="hidden" name="MedicalRecordPrescriptionsID[]" value="" />`;
}
});
}
function setDropdownValues() {
const rows = document.querySelectorAll("tr.dynamic-productitems-add");
const storedData = JSON.parse(localStorage.getItem('productItems')) || [];
if (storedData.length > 0) {
rows.forEach((row, rowIndex) => {
const dropdown = row.querySelector(".productClassList");
if (dropdown) {
if (!dropdown.tomselect) {
new TomSelect(dropdown, {
create: false,
maxOptions: Infinity,
sortField: {
field: "text",
direction: "asc"
},
placeholder: "Choose a product"
});
}
if (storedData[rowIndex]) {
const productCode = storedData[rowIndex].ProductCode;
dropdown.tomselect.setValue(productCode);
}
}
});
}
}
populateRows(savedProducts);
}
const savedServices = JSON.parse(localStorage.getItem("serviceItems")) || [];
if (savedServices.length > 0) {
const tableBody = document.querySelector("tbody#tbodyServiceItems");
function populateRows(services) {
if (services.length > 0) {
services.forEach((service) => {
let existingRow = document.getElementById(service.id);
if (existingRow) {
existingRow.querySelectorAll("[name]").forEach(input => {
const key = input.getAttribute("name");
if (service[key] !== undefined) {
input.value = service[key];
}
if (key === "MedicalServiceID" && service[key] !== undefined) {
const dropdown = existingRow.querySelector(".servicesClassList");
if (dropdown) {
dropdown.tomselect.setValue(service[key]);
}
}
});
}
else
{
const newIndex = tableBody.querySelectorAll('tr.dynamic-serviceitems-add').length + 1;
const newRow = document.createElement("tr");
newRow.className = "dynamic-serviceitems-add";
newRow.id = service.id;
newRow.innerHTML = `
<td class="p-2">
${newIndex} <input type="hidden" name="MedicalRecordServiceID" value="" />
</td>
<td class="p-2 w-[35%]">
@Html.EPosSearchableComboBoxFor("MedicalServiceID", new {
Label = "",
Value = Model.Parameters["MedicalServiceID"].ToString(),
Placeholder = "Choose a service name",
ReferenceValue = "SELECT MedicalServiceID, (ServiceName + ' (RM' + CAST(Price AS varchar(50)) + ')') AS Description FROM MedicalServices WHERE OutletID = '" + Env.OutletID.ToString() + "' ORDER BY ServiceName ASC;",
CssClassControl = "productSelect custom-select-focus-for-select",
onchange = "updatePrice(this)",
sClassSearchableComboBoxFor = "servicesClassList",
AutoSubmitAndClearButton = false,
ScriptExist = true,
ClassSearchableComboBoxForWidth = "w-full"
})
</td>
<td class="p-2 w-[15%]">
<input type="number" name="CurrentPrice" value="${service.CurrentPrice || 0}"
class="text-right bg-gray-200 pointer-events-none border border-gray-300 text-gray-900 text-sm rounded-lg block p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white w-full focus:outline-none focus:border-gray-300"
placeholder="0" step="0.01" readonly />
</td>
<td class="p-2 w-[15%]">
<input type="number" name="AdjustedPrice" value="${service.AdjustedPrice || 0}"
class="text-right bg-transparent border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full"
placeholder="0" step="0.01" pattern="^\\d+(\\.\\d{1,2})?$"
title="Please enter a valid number (e.g., 0.50)" />
</td>
<td class="p-2 w-[40%]">
@Html.EPosTextBoxFor("Comments", new {
Label = "",
Value = "${service.Comments || ''}",
CssClassLabel = "",
CssClassControl = ""
})
</td>
<td class="p-2">
<button type="button"
class="delete-button w-10 sm:min-w-max h-10 sm:h-auto items-center justify-center sm:justify-start sm:px-2 sm:py-1 border border-[#DC2626] sm:border-gray-200 text-gray-900 hover:text-[#DC2626] hover:border-[#DC2626] font-medium rounded-lg text-sm text-center inline-flex items-center group">
<img src="/Images/Table/clinex-delete-button-icon.png"
alt="Delete"
class="w-2.5 h-3 mr-4 sm:group-hover:hidden sm:block hidden pointer-events-none" />
<img src="/Images/Table/clinex-delete-button-hover-icon.png"
alt="Delete Hover"
class="w-2.5 h-3 mr-0 sm:mr-4 sm:hidden group-hover:block pointer-events-none" />
<span class="font-medium hidden sm:inline-block pointer-events-none">
Delete
</span>
</button>
</td>
`;
tableBody.appendChild(newRow);
}
});
setDropdownValues();
}
}
function setDropdownValues() {
const rows = document.querySelectorAll("tr.dynamic-serviceitems-add");
const storedData = JSON.parse(localStorage.getItem('serviceItems')) || [];
if (storedData.length > 0) {
rows.forEach((row, rowIndex) => {
const dropdown = row.querySelector(".servicesClassList");
if (dropdown) {
if (!dropdown.tomselect) {
new TomSelect(dropdown, {
create: false,
maxOptions: Infinity,
sortField: {
field: "text",
direction: "asc"
},
placeholder: "Choose a service name"
});
}
if (storedData[rowIndex]) {
const MedicalServiceID = storedData[rowIndex].MedicalServiceID;
dropdown.tomselect.setValue(MedicalServiceID);
}
}
});
}
}
populateRows(savedServices);
}
if (formAddProduct) {
formAddProduct.onsubmit = function (event) {
event.preventDefault();
const formData = new FormData(this);
const submitButton = this.querySelector('button[type="submit"]');
const spinner = document.createElement('div');
spinner.classList.add('spinner');
submitButton.disabled = true;
submitButton.textContent = "Submitting...";
submitButton.appendChild(spinner);
fetch('@Url.Action("ModalFunctionForm", "ClinexDoctor")', {
method: 'POST',
body: formData,
headers: {
'X-Requested-With': 'XMLHttpRequest',
'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]').value
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
setTimeout(() => {
spinner.remove();
submitButton.disabled = false;
submitButton.textContent = "Submit";
toast("Product saved!", {
icon: {
type: 'custom',
content: `<img src="/Images/Notification/clinex-success-icon.png" alt="Success Icon" style="margin-top: 3px; margin-right: 4px; width: 25px; height: 25px;">`
},
theme: {
type: 'custom',
style: {
background: '#120703',
color: 'white'
}
}
});
}, 3000);
setTimeout(() => {
location.reload();
}, 3400);
// Save form values to localStorage only when the form is successfully submitted
if (appointmentID) {
const appointmentIDValue = appointmentID.value.trim();
localStorage.setItem("appointmentID", appointmentIDValue);
}
if (allergiesTextarea) {
const allergiesValue = allergiesTextarea.value.trim();
localStorage.setItem("allergies", allergiesValue);
}
if (doctorAssessmentTextarea) {
const doctorAssessmentValue = doctorAssessmentTextarea.value.trim();
localStorage.setItem("doctorAssessment", doctorAssessmentValue);
}
if (addNotesTextarea) {
const addNotesValue = addNotesTextarea.value.trim();
localStorage.setItem("addNotes", addNotesValue);
}
if (addDiagnosis) {
const addDiagnosisValue = addDiagnosis.value.trim();
localStorage.setItem("addDiagnosis", addDiagnosisValue);
}
if (addMedicalLeaveStartDate) {
const addMedicalLeaveStartDateValue = addMedicalLeaveStartDate.value.trim();
localStorage.setItem("addMedicalLeaveStartDate", addMedicalLeaveStartDateValue);
}
if (addMedicalLeaveEndDate) {
const addMedicalLeaveEndDateValue = addMedicalLeaveEndDate.value.trim();
localStorage.setItem("addMedicalLeaveEndDate", addMedicalLeaveEndDateValue);
}
if (addConsultationFees) {
const addConsultationFeesValue = addConsultationFees.value.trim();
localStorage.setItem("addConsultationFees", addConsultationFeesValue);
}
if (addPaymentDiscount) {
const addPaymentDiscountValue = addPaymentDiscount.value.trim();
localStorage.setItem("addPaymentDiscount", addPaymentDiscountValue);
}
const rowProducts = document.querySelectorAll("tr.dynamic-productitems-add").length > 0
? document.querySelectorAll("tr.dynamic-productitems-add")
: document.querySelectorAll("tr.dynamic-productitems");
if (rowProducts.length === 0) {
console.warn("No rows found to save!");
return;
}
const products = [];
rowProducts.forEach((rowProduct) => {
const product = {};
const rowId = rowProduct.getAttribute("id");
if (rowId) {
product.id = rowId;
}
rowProduct.querySelectorAll("[name]").forEach((input) => {
const key = input.getAttribute("name");
const value = input.value || "";
product[key] = value;
});
products.push(product);
});
localStorage.setItem("productItems", JSON.stringify(products));
const rowServiceItems = document.querySelectorAll("tr.dynamic-serviceitems-add").length > 0
? document.querySelectorAll("tr.dynamic-serviceitems-add")
: document.querySelectorAll("tr.dynamic-serviceitems");
if (rowServiceItems.length === 0) {
console.warn("No rows found to save!");
return;
}
const services = [];
rowServiceItems.forEach((rowService) => {
const service = {};
const rowId = rowService.getAttribute("id");
if (rowId) {
service.id = rowId;
}
rowService.querySelectorAll("[name]").forEach((input) => {
const key = input.getAttribute("name");
const value = input.value || "";
service[key] = value;
});
services.push(service);
});
localStorage.setItem("serviceItems", JSON.stringify(services));
const timestamp = new Date().getTime();
const expiryTime = 60 * 60 * 1000; // 1 hour in milliseconds
localStorage.setItem("appointmentID_timestamp", timestamp);
// Example of setting the expiry time for the new key
localStorage.setItem("appointmentID_expiry", expiryTime);
clearErrors();
} else {
spinner.remove();
submitButton.disabled = false;
submitButton.textContent = "Submit";
const errors = parseErrors(data.message);
showErrors(errors);
console.log(errors);
}
})
.catch(error => {
console.error('Error:', error);
spinner.remove();
submitButton.disabled = false;
submitButton.textContent = "Save";
const errorDiv = document.getElementById('modal-error');
errorDiv.textContent = "Failed to submit the form. Please try again later.";
errorDiv.classList.remove('hidden');
});
};Editor is loading...
Leave a Comment