HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/bomacon/bomacon.nl/resources/js/site/components/fileUpload.js
// /* ==========================================================================
//    FileUpload handler
//    - Handles the FileUpload component which has the proper classes.
//    - Can only be used in conjunction with ChocolateFactory which handles the post.
//  ========================================================================== */
//
// const FileUploadHandler = {
//   fileUploadWrapperClass: '.js-file-upload',
//   fileUploadListClass: '.js-file-upload__list',
//   fileUploadInputClass: '.js-file-upload__input',
//   fileUploadButtonClass: '.js-file-upload__button',
//
//   init: function () {
//
//     const fileUploads = document.querySelectorAll(FileUploadHandler.fileUploadWrapperClass);
//     const fileUploadsCount = fileUploads.length;
//
//     if(isset(fileUploads) && fileUploadsCount !== 0){
//       for(let i = 0; i < fileUploadsCount; i++){
//         const fileUpload = fileUploads[i];
//         this.initFileUploadHandler(fileUpload);
//       }
//     }
//   },
//
//   addFile: function (inputElement) {
//     if(!inputElement) return;
//
//     const node = inputElement.cloneNode();
//     const list = inputElement.parentNode.parentNode.querySelector(FileUploadHandler.fileUploadListClass);
//     let li = document.createElement('li');
//     let remove = document.createElement('button');
//     let textNode = document.createTextNode(inputElement.value.split("\\")[inputElement.value.split('\\').length - 1]);
//
//     node.value = "";
//     node.addEventListener('change', this.eventHandler);
//
//     remove.setAttribute('type', 'button');
//     remove.addEventListener('click', this.eventHandler);
//
//     inputElement.parentNode.appendChild(node);
//     inputElement.style.display = 'none';
//
//     li.appendChild(inputElement);
//     li.appendChild(textNode);
//     li.appendChild(remove);
//
//     list.appendChild(li);
//   },
//
//   removeFile: function (event) {
//     event.target.parentNode.parentNode.removeChild(event.target.parentNode);
//   },
//
//   eventHandler: function (event) {
//     switch (event.type) {
//       case 'click':
//         if (event.currentTarget.classList.contains(FileUploadHandler.fileUploadButtonClass.substring(1))) {
//           event.currentTarget.parentNode.querySelector(FileUploadHandler.fileUploadInputClass).click();
//         }
//         else {
//           FileUploadHandler.removeFile(event);
//         }
//
//         break;
//       case 'change':
//         FileUploadHandler.addFile(event.target);
//         break;
//     }
//   },
//
//   initFileUploadHandler: function (fileUpload) {
//     const inputElement = fileUpload.querySelector(FileUploadHandler.fileUploadInputClass);
//     const inputButtonElement = fileUpload.querySelector(FileUploadHandler.fileUploadButtonClass);
//     inputButtonElement.addEventListener('click', this.eventHandler);
//     inputElement.addEventListener('change', this.eventHandler);
//   },
//
//
// };
//
// FileUploadHandler.init();


/* ==========================================================================
   FileUpload handler - FIXED VERSION
   - Handles the FileUpload component which has the proper classes.
   - Can only be used in conjunction with ChocolateFactory which handles the post.
 ========================================================================== */

// Helper function to check if variable exists (assuming this was missing)
function isset(variable) {
  return variable !== undefined && variable !== null;
}

const FileUploadHandler = {
  fileUploadWrapperClass: '.js-file-upload',
  fileUploadListClass: '.js-file-upload__list',
  fileUploadInputClass: '.js-file-upload__input',
  fileUploadButtonClass: '.js-file-upload__button',

  init: function () {
    const fileUploads = document.querySelectorAll(FileUploadHandler.fileUploadWrapperClass);
    const fileUploadsCount = fileUploads.length;

    if(isset(fileUploads) && fileUploadsCount !== 0){
      for(let i = 0; i < fileUploadsCount; i++){
        const fileUpload = fileUploads[i];
        this.initFileUploadHandler(fileUpload);
      }
    }
  },

  addFiles: function (inputElement) {
    if(!inputElement || !inputElement.files) return;

    const list = inputElement.closest(FileUploadHandler.fileUploadWrapperClass)
        .querySelector(FileUploadHandler.fileUploadListClass);

    // Handle multiple files
    Array.from(inputElement.files).forEach(file => {
      this.addSingleFile(file, inputElement, list);
    });

    // Create new input for additional files
    this.createNewInput(inputElement);
  },

  addSingleFile: function(file, originalInput, list) {
    const li = document.createElement('li');
    const fileName = document.createElement('span');
    const removeBtn = document.createElement('button');

    // Clone the original input and set its files
    const hiddenInput = originalInput.cloneNode();
    const dt = new DataTransfer();
    dt.items.add(file);
    hiddenInput.files = dt.files;
    hiddenInput.style.display = 'none';

    fileName.textContent = file.name;
    fileName.className = 'file-name';

    removeBtn.textContent = '×';
    removeBtn.type = 'button';
    removeBtn.className = 'remove-file-btn';
    removeBtn.addEventListener('click', (e) => {
      e.preventDefault();
      this.removeFile(e);
    });

    li.appendChild(hiddenInput);
    li.appendChild(fileName);
    li.appendChild(removeBtn);
    list.appendChild(li);
  },

  createNewInput: function(originalInput) {
    const newInput = originalInput.cloneNode();
    newInput.value = '';
    newInput.addEventListener('change', this.eventHandler.bind(this));

    // Replace the original input
    originalInput.parentNode.replaceChild(newInput, originalInput);
  },

  removeFile: function (event) {
    const listItem = event.target.parentNode;
    listItem.parentNode.removeChild(listItem);
  },

  eventHandler: function (event) {
    switch (event.type) {
      case 'click':
        if (event.currentTarget.classList.contains(FileUploadHandler.fileUploadButtonClass.substring(1))) {
          event.preventDefault();
          const fileInput = event.currentTarget.parentNode.querySelector(FileUploadHandler.fileUploadInputClass);
          fileInput.click();
        }
        break;

      case 'change':
        this.addFiles(event.target);
        break;
    }
  },

  initFileUploadHandler: function (fileUpload) {
    const inputElement = fileUpload.querySelector(FileUploadHandler.fileUploadInputClass);
    const inputButtonElement = fileUpload.querySelector(FileUploadHandler.fileUploadButtonClass);

    inputButtonElement.addEventListener('click', this.eventHandler.bind(this));
    inputElement.addEventListener('change', this.eventHandler.bind(this));
  }
};

// Initialize when DOM is ready
document.addEventListener('DOMContentLoaded', function() {
  FileUploadHandler.init();
});