{"version":3,"file":"multi-file-upload.mjs","sources":["../../../../src/moj/components/multi-file-upload/multi-file-upload.mjs"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-empty-function */\n\nimport { ConfigurableComponent } from 'govuk-frontend'\n\n/**\n * @augments {ConfigurableComponent<MultiFileUploadConfig>}\n */\nexport class MultiFileUpload extends ConfigurableComponent {\n  /**\n   * @param {Element | null} $root - HTML element to use for multi file upload\n   * @param {MultiFileUploadConfig} [config] - Multi file upload config\n   */\n  constructor($root, config = {}) {\n    super($root, config)\n\n    if (!MultiFileUpload.isSupported()) {\n      return this\n    }\n\n    const $feedbackContainer =\n      this.config.feedbackContainer.element ??\n      this.$root.querySelector(this.config.feedbackContainer.selector)\n\n    if (!$feedbackContainer || !($feedbackContainer instanceof HTMLElement)) {\n      return this\n    }\n\n    this.$feedbackContainer = $feedbackContainer\n\n    this.setupFileInput()\n    this.setupDropzone()\n    this.setupLabel()\n    this.setupStatusBox()\n\n    this.$root.addEventListener('click', this.onFileDeleteClick.bind(this))\n    this.$root.classList.add('moj-multi-file-upload--enhanced')\n  }\n\n  setupDropzone() {\n    this.$dropzone = document.createElement('div')\n    this.$dropzone.classList.add('moj-multi-file-upload__dropzone')\n\n    this.$dropzone.addEventListener('dragover', this.onDragOver.bind(this))\n    this.$dropzone.addEventListener('dragleave', this.onDragLeave.bind(this))\n    this.$dropzone.addEventListener('drop', this.onDrop.bind(this))\n\n    this.$fileInput.replaceWith(this.$dropzone)\n    this.$dropzone.appendChild(this.$fileInput)\n  }\n\n  setupLabel() {\n    const $label = document.createElement('label')\n    $label.setAttribute('for', this.$fileInput.id)\n    $label.classList.add('govuk-button', 'govuk-button--secondary')\n    $label.textContent = this.config.dropzoneButtonText\n\n    const $hint = document.createElement('p')\n    $hint.classList.add('govuk-body')\n    $hint.textContent = this.config.dropzoneHintText\n\n    this.$label = $label\n    this.$dropzone.append($hint)\n    this.$dropzone.append($label)\n  }\n\n  setupFileInput() {\n    this.$fileInput = /** @type {HTMLInputElement} */ (\n      this.$root.querySelector('.moj-multi-file-upload__input')\n    )\n    this.$fileInput.addEventListener('change', this.onFileChange.bind(this))\n    this.$fileInput.addEventListener('focus', this.onFileFocus.bind(this))\n    this.$fileInput.addEventListener('blur', this.onFileBlur.bind(this))\n  }\n\n  setupStatusBox() {\n    this.$status = document.createElement('div')\n    this.$status.classList.add('govuk-visually-hidden')\n    this.$status.setAttribute('aria-live', 'polite')\n    this.$status.setAttribute('role', 'status')\n    this.$dropzone.append(this.$status)\n  }\n\n  /**\n   * @param {DragEvent} event - Drag event\n   */\n  onDragOver(event) {\n    event.preventDefault()\n    this.$dropzone.classList.add('moj-multi-file-upload--dragover')\n  }\n\n  onDragLeave() {\n    this.$dropzone.classList.remove('moj-multi-file-upload--dragover')\n  }\n\n  /**\n   * @param {DragEvent} event - Drag event\n   */\n  onDrop(event) {\n    event.preventDefault()\n    this.$dropzone.classList.remove('moj-multi-file-upload--dragover')\n    this.$feedbackContainer.classList.remove('moj-hidden')\n    this.$status.textContent = this.config.uploadStatusText\n    this.uploadFiles(event.dataTransfer.files)\n  }\n\n  /**\n   * @param {FileList} files - File list\n   */\n  uploadFiles(files) {\n    for (const file of Array.from(files)) {\n      this.uploadFile(file)\n    }\n  }\n\n  onFileChange() {\n    this.$feedbackContainer.classList.remove('moj-hidden')\n    this.$status.textContent = this.config.uploadStatusText\n    this.uploadFiles(this.$fileInput.files)\n\n    const $fileInput = this.$fileInput.cloneNode(true)\n    if (!$fileInput || !($fileInput instanceof HTMLInputElement)) {\n      return\n    }\n\n    $fileInput.value = ''\n    this.$fileInput.replaceWith($fileInput)\n\n    this.setupFileInput()\n    this.$fileInput.focus()\n  }\n\n  onFileFocus() {\n    this.$label.classList.add('moj-multi-file-upload--focused')\n  }\n\n  onFileBlur() {\n    this.$label.classList.remove('moj-multi-file-upload--focused')\n  }\n\n  /**\n   * @param {UploadResponseSuccess['success']} success\n   */\n  getSuccessHtml(success) {\n    return `<span class=\"moj-multi-file-upload__success\"> <svg class=\"moj-banner__icon\" fill=\"currentColor\" role=\"presentation\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 25 25\" height=\"25\" width=\"25\"><path d=\"M25,6.2L8.7,23.2L0,14.1l4-4.2l4.7,4.9L21,2L25,6.2z\"/></svg>${success.messageHtml}</span>`\n  }\n\n  /**\n   * @param {UploadResponseError['error']} error\n   */\n  getErrorHtml(error) {\n    return `<span class=\"moj-multi-file-upload__error\"> <svg class=\"moj-banner__icon\" fill=\"currentColor\" role=\"presentation\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 25 25\" height=\"25\" width=\"25\"><path d=\"M13.6,15.4h-2.3v-4.5h2.3V15.4z M13.6,19.8h-2.3v-2.2h2.3V19.8z M0,23.2h25L12.5,2L0,23.2z\"/></svg>${error.message}</span>`\n  }\n\n  /**\n   * @param {File} file\n   */\n  getFileRow(file) {\n    const $row = document.createElement('div')\n\n    $row.classList.add('govuk-summary-list__row', 'moj-multi-file-upload__row')\n\n    $row.innerHTML = `\n    <div class=\"govuk-summary-list__value moj-multi-file-upload__message\">\n      <span class=\"moj-multi-file-upload__filename\">${file.name}</span>\n      <span class=\"moj-multi-file-upload__progress\">0%</span>\n    </div>\n    <div class=\"govuk-summary-list__actions moj-multi-file-upload__actions\"></div>\n  `\n\n    return $row\n  }\n\n  /**\n   * @param {UploadResponseFile} file\n   */\n  getDeleteButton(file) {\n    const $button = document.createElement('button')\n\n    $button.setAttribute('type', 'button')\n    $button.setAttribute('name', 'delete')\n    $button.setAttribute('value', file.filename)\n\n    $button.classList.add(\n      'moj-multi-file-upload__delete',\n      'govuk-button',\n      'govuk-button--secondary',\n      'govuk-!-margin-bottom-0'\n    )\n\n    $button.innerHTML = `Delete <span class=\"govuk-visually-hidden\">${file.originalname}</span>`\n\n    return $button\n  }\n\n  /**\n   * @param {File} file\n   */\n  uploadFile(file) {\n    this.config.hooks.entryHook(this, file)\n\n    const $item = this.getFileRow(file)\n    const $message = $item.querySelector('.moj-multi-file-upload__message')\n    const $actions = $item.querySelector('.moj-multi-file-upload__actions')\n    const $progress = $item.querySelector('.moj-multi-file-upload__progress')\n\n    const formData = new FormData()\n    formData.append('documents', file)\n\n    this.$feedbackContainer\n      .querySelector('.moj-multi-file-upload__list')\n      .append($item)\n\n    const xhr = new XMLHttpRequest()\n\n    const onLoad = () => {\n      if (\n        xhr.status < 200 ||\n        xhr.status >= 300 ||\n        !('success' in xhr.response)\n      ) {\n        return onError()\n      }\n\n      $message.innerHTML = this.getSuccessHtml(xhr.response.success)\n      this.$status.textContent = xhr.response.success.messageText\n\n      $actions.append(this.getDeleteButton(xhr.response.file))\n      this.config.hooks.exitHook(this, file, xhr, xhr.statusText)\n    }\n\n    const onError = () => {\n      const error = new Error(\n        xhr.response && 'error' in xhr.response\n          ? xhr.response.error.message\n          : xhr.statusText || 'Upload failed'\n      )\n\n      $message.innerHTML = this.getErrorHtml(error)\n      this.$status.textContent = error.message\n\n      this.config.hooks.errorHook(this, file, xhr, xhr.statusText, error)\n    }\n\n    xhr.addEventListener('load', onLoad)\n    xhr.addEventListener('error', onError)\n\n    xhr.upload.addEventListener('progress', (event) => {\n      if (!event.lengthComputable) {\n        return\n      }\n\n      const percentComplete = Math.round((event.loaded / event.total) * 100)\n      $progress.textContent = ` ${percentComplete}%`\n    })\n\n    xhr.open('POST', this.config.uploadUrl)\n    xhr.responseType = 'json'\n\n    xhr.send(formData)\n  }\n\n  /**\n   * @param {MouseEvent} event - Click event\n   */\n  onFileDeleteClick(event) {\n    const $button = event.target\n\n    if (\n      !$button ||\n      !($button instanceof HTMLButtonElement) ||\n      !$button.classList.contains('moj-multi-file-upload__delete')\n    ) {\n      return\n    }\n\n    event.preventDefault() // if user refreshes page and then deletes\n\n    const xhr = new XMLHttpRequest()\n\n    xhr.addEventListener('load', () => {\n      if (xhr.status < 200 || xhr.status >= 300) {\n        return\n      }\n\n      const $rows = Array.from(\n        this.$feedbackContainer.querySelectorAll('.moj-multi-file-upload__row')\n      )\n\n      if ($rows.length === 1) {\n        this.$feedbackContainer.classList.add('moj-hidden')\n      }\n\n      const $rowDelete = $rows.find(($row) => $row.contains($button))\n      if ($rowDelete) $rowDelete.remove()\n\n      this.config.hooks.deleteHook(this, undefined, xhr, xhr.statusText)\n    })\n\n    xhr.open('POST', this.config.deleteUrl)\n    xhr.setRequestHeader('Content-Type', 'application/json')\n    xhr.responseType = 'json'\n\n    xhr.send(\n      JSON.stringify({\n        [$button.name]: $button.value\n      })\n    )\n  }\n\n  static isSupported() {\n    return (\n      this.isDragAndDropSupported() &&\n      this.isFormDataSupported() &&\n      this.isFileApiSupported()\n    )\n  }\n\n  static isDragAndDropSupported() {\n    const div = document.createElement('div')\n    return typeof div.ondrop !== 'undefined'\n  }\n\n  static isFormDataSupported() {\n    return typeof FormData === 'function'\n  }\n\n  static isFileApiSupported() {\n    const input = document.createElement('input')\n    input.type = 'file'\n    return typeof input.files !== 'undefined'\n  }\n\n  /**\n   * Name for the component used when initialising using data-module attributes.\n   */\n  static moduleName = 'moj-multi-file-upload'\n\n  /**\n   * Multi file upload default config\n   *\n   * @type {MultiFileUploadConfig}\n   */\n  static defaults = Object.freeze({\n    uploadStatusText: 'Uploading files, please wait',\n    dropzoneHintText: 'Drag and drop files here or',\n    dropzoneButtonText: 'Choose files',\n    feedbackContainer: {\n      selector: '.moj-multi-file__uploaded-files'\n    },\n    hooks: {\n      entryHook: () => {},\n      exitHook: () => {},\n      errorHook: () => {},\n      deleteHook: () => {}\n    }\n  })\n\n  /**\n   * Multi file upload config schema\n   *\n   * @satisfies {Schema<MultiFileUploadConfig>}\n   */\n  static schema = Object.freeze(\n    /** @type {const} */ ({\n      properties: {\n        uploadUrl: { type: 'string' },\n        deleteUrl: { type: 'string' },\n        uploadStatusText: { type: 'string' },\n        dropzoneHintText: { type: 'string' },\n        dropzoneButtonText: { type: 'string' },\n        feedbackContainer: { type: 'object' },\n        hooks: { type: 'object' }\n      }\n    })\n  )\n}\n\n/**\n * Multi file upload config\n *\n * @typedef {object} MultiFileUploadConfig\n * @property {string} [uploadUrl] - File upload URL\n * @property {string} [deleteUrl] - File delete URL\n * @property {string} [uploadStatusText] - Upload status text\n * @property {string} [dropzoneHintText] - Dropzone hint text\n * @property {string} [dropzoneButtonText] - Dropzone button text\n * @property {object} [feedbackContainer] - Feedback container config\n * @property {string} [feedbackContainer.selector] - Selector for feedback container\n * @property {Element | null} [feedbackContainer.element] - HTML element for feedback container\n * @property {MultiFileUploadHooks} [hooks] - Upload hooks\n */\n\n/**\n * Multi file upload hooks\n *\n * @typedef {object} MultiFileUploadHooks\n * @property {OnUploadFileEntryHook} [entryHook] - File upload entry hook\n * @property {OnUploadFileExitHook} [exitHook] - File upload exit hook\n * @property {OnUploadFileErrorHook} [errorHook] - File upload error hook\n * @property {OnUploadFileDeleteHook} [deleteHook] - File delete hook\n */\n\n/**\n * Upload hook: File entry\n *\n * @callback OnUploadFileEntryHook\n * @param {InstanceType<typeof MultiFileUpload>} upload - Multi file upload\n * @param {File} file - File upload\n */\n\n/**\n * Upload hook: File exit\n *\n * @callback OnUploadFileExitHook\n * @param {InstanceType<typeof MultiFileUpload>} upload - Multi file upload\n * @param {File} file - File upload\n * @param {XMLHttpRequest} xhr - XMLHttpRequest\n * @param {string} textStatus - Text status\n */\n\n/**\n * Upload hook: File error\n *\n * @callback OnUploadFileErrorHook\n * @param {InstanceType<typeof MultiFileUpload>} upload - Multi file upload\n * @param {File} file - File upload\n * @param {XMLHttpRequest} xhr - XMLHttpRequest\n * @param {string} textStatus - Text status\n * @param {Error} errorThrown - Error thrown\n */\n\n/**\n * Upload hook: File delete\n *\n * @callback OnUploadFileDeleteHook\n * @param {InstanceType<typeof MultiFileUpload>} upload - Multi file upload\n * @param {File} [file] - File upload\n * @param {XMLHttpRequest} xhr - XMLHttpRequest\n * @param {string} textStatus - Text status\n */\n\n/**\n * @typedef {object} UploadResponseSuccess\n * @property {{ messageText: string, messageHtml: string }} success - Response success\n * @property {UploadResponseFile} file - Response file\n */\n\n/**\n * @typedef {object} UploadResponseError\n * @property {{ message: string }} error - Response error\n * @property {UploadResponseFile} file - Response file\n */\n\n/**\n * @typedef {object} UploadResponseFile\n * @property {string} filename - File name\n * @property {string} originalname - Original file name\n */\n\n/**\n * @import { Schema } from 'govuk-frontend/dist/govuk/common/configuration.mjs'\n */\n"],"names":["MultiFileUpload","ConfigurableComponent","constructor","$root","config","_this$config$feedback","isSupported","$feedbackContainer","feedbackContainer","element","querySelector","selector","HTMLElement","setupFileInput","setupDropzone","setupLabel","setupStatusBox","addEventListener","onFileDeleteClick","bind","classList","add","$dropzone","document","createElement","onDragOver","onDragLeave","onDrop","$fileInput","replaceWith","appendChild","$label","setAttribute","id","textContent","dropzoneButtonText","$hint","dropzoneHintText","append","onFileChange","onFileFocus","onFileBlur","$status","event","preventDefault","remove","uploadStatusText","uploadFiles","dataTransfer","files","file","Array","from","uploadFile","cloneNode","HTMLInputElement","value","focus","getSuccessHtml","success","messageHtml","getErrorHtml","error","message","getFileRow","$row","innerHTML","name","getDeleteButton","$button","filename","originalname","hooks","entryHook","$item","$message","$actions","$progress","formData","FormData","xhr","XMLHttpRequest","onLoad","status","response","onError","messageText","exitHook","statusText","Error","errorHook","upload","lengthComputable","percentComplete","Math","round","loaded","total","open","uploadUrl","responseType","send","target","HTMLButtonElement","contains","$rows","querySelectorAll","length","$rowDelete","find","deleteHook","undefined","deleteUrl","setRequestHeader","JSON","stringify","isDragAndDropSupported","isFormDataSupported","isFileApiSupported","div","ondrop","input","type","moduleName","defaults","Object","freeze","schema","properties"],"mappings":"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"}