Advertisement
cydside

Class EditModal

May 17th, 2023
753
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class EditModal {
  2.     constructor() {
  3.         this.modal = null;
  4.         this.btnSave = null;
  5.         this.btnCancel = null;
  6.         this.saveConfirmModal = null;
  7.         this.isDirty = false;
  8.         this.init();
  9.     }
  10.  
  11.     init() {
  12.         // Modal HTML
  13.         const modalHtml = `
  14.       <div class="modal fade" id="edit-modal" tabindex="-1" aria-labelledby="edit-modal-label" aria-hidden="true">
  15.         <!-- Modal content goes here -->
  16.         <div class="modal-dialog">
  17.           <div class="modal-content">
  18.             <div class="modal-header">
  19.               <h5 class="modal-title" id="edit-modal-label">Edit Item</h5>
  20.               <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  21.             </div>
  22.             <div class="modal-body">
  23.               <form>
  24.                 <div class="mb-3">
  25.                   <label for="item-code" class="form-label">Item Code</label>
  26.                   <input type="text" class="form-control" id="item-code">
  27.                 </div>
  28.                 <div class="mb-3">
  29.                   <label for="item-description" class="form-label">Item Description</label>
  30.                   <input type="text" class="form-control" id="item-description">
  31.                 </div>
  32.                 <div class="mb-3">
  33.                   <label for="item-price" class="form-label">Item Price</label>
  34.                   <input type="number" class="form-control" id="item-price">
  35.                 </div>
  36.               </form>
  37.             </div>
  38.             <div class="modal-footer">
  39.               <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="btn-cancel">Cancel</button>
  40.               <button type="button" class="btn btn-primary" id="btn-save">Save Changes</button>
  41.             </div>
  42.           </div>
  43.         </div>
  44.       </div>
  45.     `;
  46.  
  47.         // Save Confirmation Modal HTML
  48.         const saveConfirmModalHtml = `
  49.       <div class="modal fade" id="save-confirm-modal" tabindex="-1" aria-labelledby="save-confirm-modal-label" aria-hidden="true">
  50.         <!-- Save confirmation modal content goes here -->
  51.         <div class="modal-dialog">
  52.           <div class="modal-content">
  53.             <div class="modal-header">
  54.               <h5 class="modal-title" id="save-confirm-modal-label">Save Confirmation</h5>
  55.               <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  56.             </div>
  57.             <div class="modal-body" id="save-confirm-modal-body">
  58.               You have unsaved changes. Are you sure you want to cancel without saving?
  59.             </div>
  60.             <div class="modal-footer">
  61.               <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">No</button>
  62.               <button type="button" class="btn btn-primary" id="btn-save-yes">Yes</button>
  63.             </div>
  64.           </div>
  65.         </div>
  66.       </div>
  67.     `;
  68.  
  69.         const tempDiv = document.createElement('div');
  70.         tempDiv.innerHTML = modalHtml + saveConfirmModalHtml;
  71.  
  72.         this.modal = tempDiv.querySelector('#edit-modal');
  73.         this.btnSave = this.modal.querySelector('#btn-save');
  74.         this.btnCancel = this.modal.querySelector('#btn-cancel');
  75.         this.saveConfirmModal = tempDiv.querySelector('#save-confirm-modal');
  76.         this.btnSaveYes = this.saveConfirmModal.querySelector('#btn-save-yes');
  77.  
  78.         document.body.appendChild(this.modal);
  79.  
  80.         document.body.appendChild(this.saveConfirmModal);
  81.  
  82.         // Initialize the modals using bootstrap.Modal
  83.         this.modalInstance = new bootstrap.Modal(this.modal);
  84.         this.saveConfirmModalInstance = new bootstrap.Modal(this.saveConfirmModal);
  85.  
  86.         // Attach change event listener to each field
  87.         const fields = this.modal.querySelectorAll('.form-control');
  88.         fields.forEach((field) => {
  89.             field.addEventListener('change', () => {
  90.                 this.isDirty = true;
  91.             });
  92.         });
  93.  
  94.         // Attach click event listener to the Cancel button
  95.         this.btnCancel.addEventListener('click', () => {
  96.             if (this.isDirty) {
  97.                 this.showSaveConfirmation();
  98.             } else {
  99.                 this.modalInstance.hide();
  100.             }
  101.         });
  102.  
  103.     }
  104.  
  105.     show(item, onSave) {
  106.         this.isDirty = false;
  107.  
  108.         const itemCodeInput = document.getElementById('item-code');
  109.         const itemDescriptionInput = document.getElementById('item-description');
  110.         const itemPriceInput = document.getElementById('item-price');
  111.  
  112.         const originalItem = {
  113.             code: itemCodeInput.value,
  114.             description: itemDescriptionInput.value,
  115.             price: parseFloat(itemPriceInput.value),
  116.         };
  117.  
  118.         const modalInstance = new bootstrap.Modal(this.modal);
  119.  
  120.         itemCodeInput.value = item.code;
  121.         itemDescriptionInput.value = item.description;
  122.         itemPriceInput.value = item.price;
  123.  
  124.         const handleSave = () => {
  125.             const updatedItem = {
  126.                 code: itemCodeInput.value,
  127.                 description: itemDescriptionInput.value,
  128.                 price: parseFloat(itemPriceInput.value),
  129.             };
  130.  
  131.             onSave(updatedItem);
  132.             modalInstance.hide();
  133.         };
  134.  
  135.         const handleCancel = () => {
  136.             if (this.isDirty) {
  137.                 saveConfirmModalInstance.show();
  138.             } else {
  139.                 modalInstance.hide();
  140.             }
  141.         };
  142.  
  143.         this.modal.addEventListener('hidden.bs.modal', event => {
  144.             handleHide();
  145.         });
  146.  
  147.         const handleHide = () => {
  148.             removeEventListeners();
  149.         };
  150.  
  151.         const removeEventListeners = () => {
  152.             this.btnSave.removeEventListener('click', handleSave);
  153.             this.btnCancel.removeEventListener('click', handleCancel);
  154.         };
  155.  
  156.         const addEventListeners = () => {
  157.             this.btnSave.addEventListener('click', handleSave);
  158.             this.btnCancel.addEventListener('click', handleCancel);
  159.         };
  160.  
  161.         const updateDirtyFlag = () => {
  162.             this.isDirty =
  163.                 itemCodeInput.value !== originalItem.code ||
  164.                 itemDescriptionInput.value !== originalItem.description ||
  165.                 parseFloat(itemPriceInput.value) !== originalItem.price;
  166.         };
  167.  
  168.         itemCodeInput.addEventListener('change', updateDirtyFlag);
  169.         itemDescriptionInput.addEventListener('change', updateDirtyFlag);
  170.         itemPriceInput.addEventListener('change', updateDirtyFlag);
  171.  
  172.         removeEventListeners();
  173.         addEventListeners();
  174.  
  175.         modalInstance.show();
  176.     }
  177.  
  178.     showSaveConfirmation() {
  179.         this.saveConfirmModalInstance.show();
  180.     }
  181. }
  182.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement