{"version":3,"file":"validate_empty_required_fields.js","mappings":"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","sources":["webpack://a4-meinberlin/./meinberlin/assets/js/validate_empty_required_fields.js"],"sourcesContent":["(function () {\n  'use strict'\n\n  const VALIDATE_CLASS = 'js-validate'\n  const CLIENT_ERROR_CLASS = 'client-validation-error'\n\n  const gettext = window.gettext || function (msg) { return msg }\n  const ngettext = window.ngettext || function (singular, plural, count) {\n    return count === 1 ? singular : plural\n  }\n\n  document.addEventListener('DOMContentLoaded', function () {\n    document.querySelectorAll(`form.${VALIDATE_CLASS}`).forEach(setupFormValidation)\n  })\n\n  function setupFormValidation (form) {\n    form.setAttribute('novalidate', 'novalidate')\n\n    let errorContainer = form.querySelector('.client-validation-errors')\n    if (!errorContainer) {\n      errorContainer = document.createElement('div')\n      errorContainer.class = 'client-validation-errors'\n      errorContainer.style.display = 'none'\n      form.insertBefore(errorContainer, form.firstChild)\n    }\n\n    form.addEventListener('submit', function (event) {\n      clearAllClientErrors(form)\n\n      const requiredFields = this.querySelectorAll('[required]')\n      const emptyFields = []\n\n      requiredFields.forEach(field => {\n        const isEmpty = field.type === 'checkbox' ? !field.checked : field.value.trim() === ''\n        if (isEmpty) {\n          emptyFields.push({\n            element: field,\n            name: getFieldLabel(field),\n            type: field.type\n          })\n          field.classList.add('field-error')\n          field.setAttribute('aria-invalid', 'true')\n        }\n      })\n\n      if (emptyFields.length > 0) {\n        event.preventDefault()\n        showClientErrors(emptyFields, errorContainer)\n        emptyFields[0].element.focus()\n        announceErrors(emptyFields.length)\n        return false\n      }\n    })\n\n    form.querySelectorAll('[required]').forEach(field => {\n      field.addEventListener('input', function () {\n        if (this.value.trim() !== '') {\n          this.classList.remove('field-error')\n          this.removeAttribute('aria-invalid')\n        }\n      })\n    })\n  }\n\n  function showClientErrors (emptyFields, errorContainer) {\n    errorContainer.innerHTML = ''\n\n    const errorList = document.createElement('ul')\n    errorList.className = 'errorlist'\n    errorList.setAttribute('aria-live', 'assertive')\n    errorList.setAttribute('aria-atomic', 'true')\n\n    emptyFields.forEach(fieldData => {\n      const errorItem = document.createElement('li')\n      errorItem.className = `message message--error ${CLIENT_ERROR_CLASS}`\n      errorItem.textContent = getErrorMessage(fieldData)\n      errorList.appendChild(errorItem)\n    })\n\n    errorContainer.appendChild(errorList)\n    errorContainer.style.display = 'block'\n\n    // Remove server-side errors\n    removeServerErrors(errorContainer.closest('form'))\n  }\n\n  function removeServerErrors (form) {\n    // Find and remove all server error containers\n    const serverErrorLists = form.querySelectorAll('.errorlist:not(.client-validation-errors .errorlist)')\n    serverErrorLists.forEach(list => {\n      // Only remove if it's not our client container\n      if (!list.closest('.client-validation-errors')) {\n        list.remove()\n      }\n    })\n\n    // Also clear field-specific server errors\n    form.querySelectorAll('.field-error').forEach(field => {\n      const fieldContainer = field.closest('.form-group, .password-field-wrapper')\n      if (fieldContainer) {\n        const fieldErrors = fieldContainer.querySelector('.errorlist')\n        if (fieldErrors && !fieldErrors.closest('.client-validation-errors')) {\n          fieldErrors.remove()\n        }\n      }\n    })\n  }\n\n  function clearAllClientErrors (form) {\n    const clientContainer = form.querySelector('.client-validation-errors')\n    if (clientContainer) {\n      clientContainer.innerHTML = ''\n      clientContainer.style.display = 'none'\n    }\n\n    form.querySelectorAll('.field-error').forEach(field => {\n      field.classList.remove('field-error')\n      field.removeAttribute('aria-invalid')\n    })\n  }\n\n  function getFieldLabel (field) {\n    const label = document.querySelector(`label[for=\"${field.id}\"]`)\n    if (label) {\n      return label.textContent\n        .replace(/\\*/g, '')\n        .replace(/\\(required\\)/gi, '')\n        .trim()\n    }\n    return field.placeholder || field.name || gettext('This field')\n  }\n\n  function getErrorMessage (fieldData) {\n    const fieldLabel = fieldData.name.toLowerCase()\n    const fieldType = fieldData.type\n\n    if (fieldLabel.includes('password') || fieldType === 'password') {\n      return gettext('Please enter your password.')\n    } else if (fieldLabel.includes('email') || fieldType === 'email') {\n      return gettext('Please enter your email address.')\n    } else if (fieldLabel.includes('username') || fieldLabel.includes('benutzername')) {\n      return gettext('Please enter your username.')\n    } else if (fieldLabel.includes('terms_of_use') || fieldLabel.includes('terms')) {\n      return gettext('You must accept the terms of use.')\n    } else {\n      return gettext('This field is required.')\n    }\n  }\n\n  function announceErrors (errorCount) {\n    const announcement = document.createElement('div')\n    announcement.setAttribute('role', 'alert')\n    announcement.setAttribute('aria-live', 'assertive')\n    announcement.className = 'sr-only'\n\n    if (errorCount === 1) {\n      announcement.textContent = gettext('The form contains an error.')\n    } else {\n      announcement.textContent = ngettext(\n        'The form contains an error.',\n        'The form contains %s errors.',\n        errorCount\n      ).replace('%s', errorCount)\n    }\n\n    document.body.appendChild(announcement)\n    setTimeout(() => announcement.remove(), 1000)\n  }\n})()\n"],"names":["CLIENT_ERROR_CLASS","gettext","window","msg","ngettext","singular","plural","count","setupFormValidation","form","setAttribute","errorContainer","querySelector","document","createElement","class","style","display","insertBefore","firstChild","addEventListener","event","clientContainer","innerHTML","querySelectorAll","forEach","field","classList","remove","removeAttribute","clearAllClientErrors","requiredFields","this","emptyFields","type","checked","value","trim","push","element","name","getFieldLabel","add","length","preventDefault","errorList","className","fieldData","errorItem","concat","textContent","fieldLabel","toLowerCase","fieldType","includes","getErrorMessage","appendChild","serverErrorLists","list","closest","fieldContainer","fieldErrors","removeServerErrors","showClientErrors","focus","errorCount","announcement","replace","body","setTimeout","announceErrors","label","id","placeholder"],"ignoreList":[],"sourceRoot":""}