@ministryofjustice/frontend 6.0.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/moj/all.bundle.js +16 -6
- package/moj/all.bundle.js.map +1 -1
- package/moj/all.bundle.mjs +16 -6
- package/moj/all.bundle.mjs.map +1 -1
- package/moj/common/moj-frontend-version.mjs +2 -2
- package/moj/common/moj-frontend-version.mjs.map +1 -1
- package/moj/components/date-picker/date-picker.bundle.js +11 -1
- package/moj/components/date-picker/date-picker.bundle.js.map +1 -1
- package/moj/components/date-picker/date-picker.bundle.mjs +11 -1
- package/moj/components/date-picker/date-picker.bundle.mjs.map +1 -1
- package/moj/components/date-picker/date-picker.mjs +11 -1
- package/moj/components/date-picker/date-picker.mjs.map +1 -1
- package/moj/components/messages/README.md +1 -1
- package/moj/components/multi-file-upload/multi-file-upload.bundle.js +3 -3
- package/moj/components/multi-file-upload/multi-file-upload.bundle.js.map +1 -1
- package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs +3 -3
- package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs.map +1 -1
- package/moj/components/multi-file-upload/multi-file-upload.mjs +3 -3
- package/moj/components/multi-file-upload/multi-file-upload.mjs.map +1 -1
- package/moj/components/pagination/template.njk +2 -2
- package/moj/components/timeline/README.md +1 -1
- package/moj/core/_moj-frontend-properties.scss +1 -1
- package/moj/moj-frontend.min.css +1 -1
- package/moj/moj-frontend.min.css.map +1 -1
- package/moj/moj-frontend.min.js +1 -1
- package/moj/moj-frontend.min.js.map +1 -1
- package/moj/objects/_scrollable-pane.scss +2 -2
- package/moj/objects/_scrollable-pane.scss.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker.mjs","sources":["../../../../src/moj/components/date-picker/date-picker.mjs"],"sourcesContent":["import { ConfigurableComponent } from 'govuk-frontend'\n\n/**\n * @augments {ConfigurableComponent<DatePickerConfig>}\n */\nexport class DatePicker extends ConfigurableComponent {\n /**\n * @param {Element | null} $root - HTML element to use for date picker\n * @param {DatePickerConfig} [config] - Date picker config\n */\n constructor($root, config = {}) {\n super($root, config)\n\n const $input =\n this.config.input.element ??\n this.$root.querySelector(this.config.input.selector)\n\n if (!$input || !($input instanceof HTMLInputElement)) {\n return this\n }\n\n this.$input = $input\n\n this.dayLabels = [\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday'\n ]\n\n this.monthLabels = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ]\n\n this.currentDate = new Date()\n this.currentDate.setHours(0, 0, 0, 0)\n this.calendarDays = /** @type {DSCalendarDay[]} */ ([])\n this.excludedDates = /** @type {Date[]} */ ([])\n this.excludedDays = /** @type {number[]} */ ([])\n\n this.buttonClass = 'moj-datepicker__button'\n this.selectedDayButtonClass = 'moj-datepicker__button--selected'\n this.currentDayButtonClass = 'moj-datepicker__button--current'\n this.todayButtonClass = 'moj-datepicker__button--today'\n\n this.setOptions()\n this.initControls()\n }\n\n initControls() {\n this.id = `datepicker-${this.$input.id}`\n\n this.$dialog = this.createDialog()\n this.createCalendarHeaders()\n\n const $componentWrapper = document.createElement('div')\n const $inputWrapper = document.createElement('div')\n $componentWrapper.classList.add('moj-datepicker__wrapper')\n $inputWrapper.classList.add('govuk-input__wrapper')\n\n this.$input.parentElement.insertBefore($componentWrapper, this.$input)\n $componentWrapper.appendChild($inputWrapper)\n $inputWrapper.appendChild(this.$input)\n\n $inputWrapper.insertAdjacentHTML('beforeend', this.toggleTemplate())\n $componentWrapper.insertAdjacentElement('beforeend', this.$dialog)\n\n this.$calendarButton = /** @type {HTMLButtonElement} */ (\n this.$root.querySelector('.moj-js-datepicker-toggle')\n )\n\n this.$dialogTitle = /** @type {HTMLHeadingElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-month-year')\n )\n\n this.createCalendar()\n\n this.$prevMonthButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-prev-month')\n )\n\n this.$prevYearButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-prev-year')\n )\n\n this.$nextMonthButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-next-month')\n )\n\n this.$nextYearButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-next-year')\n )\n\n this.$cancelButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-cancel')\n )\n\n this.$okButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-ok')\n )\n\n // add event listeners\n this.$prevMonthButton.addEventListener('click', (event) =>\n this.focusPreviousMonth(event, false)\n )\n this.$prevYearButton.addEventListener('click', (event) =>\n this.focusPreviousYear(event, false)\n )\n this.$nextMonthButton.addEventListener('click', (event) =>\n this.focusNextMonth(event, false)\n )\n this.$nextYearButton.addEventListener('click', (event) =>\n this.focusNextYear(event, false)\n )\n this.$cancelButton.addEventListener('click', (event) => {\n event.preventDefault()\n this.closeDialog()\n })\n this.$okButton.addEventListener('click', () => {\n this.selectDate(this.currentDate)\n })\n\n const $dialogButtons = this.$dialog.querySelectorAll(\n 'button:not([disabled=\"true\"])'\n )\n\n this.$firstButtonInDialog = $dialogButtons[0]\n this.$lastButtonInDialog = $dialogButtons[$dialogButtons.length - 1]\n this.$firstButtonInDialog.addEventListener('keydown', (event) =>\n this.firstButtonKeydown(event)\n )\n this.$lastButtonInDialog.addEventListener('keydown', (event) =>\n this.lastButtonKeydown(event)\n )\n\n this.$calendarButton.addEventListener('click', (event) =>\n this.toggleDialog(event)\n )\n\n this.$dialog.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.closeDialog()\n event.preventDefault()\n event.stopPropagation()\n }\n })\n\n document.body.addEventListener('mouseup', (event) => {\n this.backgroundClick(event)\n })\n\n // populates calendar with initial dates, avoids Wave errors about null buttons\n this.updateCalendar()\n }\n\n createDialog() {\n const titleId = `datepicker-title-${this.$input.id}`\n const $dialog = document.createElement('div')\n\n $dialog.id = this.id\n $dialog.setAttribute('class', 'moj-datepicker__dialog')\n $dialog.setAttribute('role', 'dialog')\n $dialog.setAttribute('aria-modal', 'true')\n $dialog.setAttribute('aria-labelledby', titleId)\n $dialog.innerHTML = this.dialogTemplate(titleId)\n $dialog.hidden = true\n\n return $dialog\n }\n\n createCalendar() {\n const $tbody = this.$dialog.querySelector('tbody')\n let dayCount = 0\n for (let i = 0; i < 6; i++) {\n // create row\n const $row = $tbody.insertRow(i)\n\n for (let j = 0; j < 7; j++) {\n // create cell (day)\n const $cell = document.createElement('td')\n $row.appendChild($cell)\n const $dateButton = document.createElement('button')\n $dateButton.setAttribute('type', 'button')\n $cell.appendChild($dateButton)\n\n const calendarDay = new DSCalendarDay($dateButton, dayCount, i, j, this)\n this.calendarDays.push(calendarDay)\n dayCount++\n }\n }\n }\n\n toggleTemplate() {\n return `<button class=\"moj-datepicker__toggle moj-js-datepicker-toggle\" type=\"button\" aria-haspopup=\"dialog\" aria-controls=\"${this.id}\" aria-expanded=\"false\">\n <span class=\"govuk-visually-hidden\">Choose date</span>\n <svg width=\"32\" height=\"24\" focusable=\"false\" class=\"moj-datepicker-icon\" aria-hidden=\"true\" role=\"img\" viewBox=\"0 0 22 22\">\n <path\n fill=\"currentColor\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M16.1333 2.93333H5.86668V4.4C5.86668 5.21002 5.21003 5.86667 4.40002 5.86667C3.59 5.86667 2.93335 5.21002 2.93335 4.4V2.93333H2C0.895431 2.93333 0 3.82877 0 4.93334V19.2667C0 20.3712 0.89543 21.2667 2 21.2667H20C21.1046 21.2667 22 20.3712 22 19.2667V4.93333C22 3.82876 21.1046 2.93333 20 2.93333H19.0667V4.4C19.0667 5.21002 18.41 5.86667 17.6 5.86667C16.79 5.86667 16.1333 5.21002 16.1333 4.4V2.93333ZM20.5333 8.06667H1.46665V18.8C1.46665 19.3523 1.91436 19.8 2.46665 19.8H19.5333C20.0856 19.8 20.5333 19.3523 20.5333 18.8V8.06667Z\"\n ></path>\n <rect x=\"3.66669\" width=\"1.46667\" height=\"5.13333\" rx=\"0.733333\" fill=\"currentColor\"></rect>\n <rect x=\"16.8667\" width=\"1.46667\" height=\"5.13333\" rx=\"0.733333\" fill=\"currentColor\"></rect>\n </svg>\n </button>`\n }\n\n /**\n * HTML template for calendar dialog\n *\n * @param {string} [titleId] - Id attribute for dialog title\n * @returns {string}\n */\n dialogTemplate(titleId) {\n return `<div class=\"moj-datepicker__dialog-header\">\n <div class=\"moj-datepicker__dialog-navbuttons\">\n <button type=\"button\" class=\"moj-datepicker__button moj-js-datepicker-prev-year\">\n <span class=\"govuk-visually-hidden\">Previous year</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M23.1643 20L28.9572 14.2071L27.5429 12.7929L20.3358 20L27.5429 27.2071L28.9572 25.7929L23.1643 20Z\" fill=\"currentColor\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M17.1643 20L22.9572 14.2071L21.5429 12.7929L14.3358 20L21.5429 27.2071L22.9572 25.7929L17.1643 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n\n <button type=\"button\" class=\"moj-datepicker__button moj-js-datepicker-prev-month\">\n <span class=\"govuk-visually-hidden\">Previous month</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M20.5729 20L25.7865 14.2071L24.5137 12.7929L18.0273 20L24.5137 27.2071L25.7865 25.7929L20.5729 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n </div>\n\n <h2 id=\"${titleId}\" class=\"moj-datepicker__dialog-title moj-js-datepicker-month-year\" aria-live=\"polite\">June 2020</h2>\n\n <div class=\"moj-datepicker__dialog-navbuttons\">\n <button type=\"button\" class=\"moj-datepicker__button moj-js-datepicker-next-month\">\n <span class=\"govuk-visually-hidden\">Next month</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M23.4271 20L18.2135 14.2071L19.4863 12.7929L25.9727 20L19.4863 27.2071L18.2135 25.7929L23.4271 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n\n <button type=\"button\" class=\"moj-datepicker__button moj-js-datepicker-next-year\">\n <span class=\"govuk-visually-hidden\">Next year</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M20.8357 20L15.0428 14.2071L16.4571 12.7929L23.6642 20L16.4571 27.2071L15.0428 25.7929L20.8357 20Z\" fill=\"currentColor\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M26.8357 20L21.0428 14.2071L22.4571 12.7929L29.6642 20L22.4571 27.2071L21.0428 25.7929L26.8357 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <table class=\"moj-datepicker__calendar moj-js-datepicker-grid\" role=\"application\" aria-labelledby=\"${titleId}\">\n <thead>\n <tr></tr>\n </thead>\n\n <tbody></tbody>\n </table>\n\n <div class=\"govuk-button-group\">\n <button type=\"button\" class=\"govuk-button moj-js-datepicker-ok\">Select</button>\n <button type=\"button\" class=\"govuk-button govuk-button--secondary moj-js-datepicker-cancel\">Close</button>\n </div>`\n }\n\n createCalendarHeaders() {\n this.dayLabels.forEach((day) => {\n const html = `<th scope=\"col\"><span aria-hidden=\"true\">${day.substring(0, 3)}</span><span class=\"govuk-visually-hidden\">${day}</span></th>`\n const $headerRow = this.$dialog.querySelector('thead > tr')\n $headerRow.insertAdjacentHTML('beforeend', html)\n })\n }\n\n /**\n * Pads given number with leading zeros\n *\n * @param {number} value - The value to be padded\n * @param {number} length - The length in characters of the output\n * @returns {string}\n */\n leadingZeros(value, length = 2) {\n let ret = value.toString()\n\n while (ret.length < length) {\n ret = `0${ret}`\n }\n\n return ret\n }\n\n setOptions() {\n this.setMinAndMaxDatesOnCalendar()\n this.setExcludedDates()\n this.setExcludedDays()\n this.setWeekStartDay()\n }\n\n setMinAndMaxDatesOnCalendar() {\n if (this.config.minDate) {\n this.minDate = this.formattedDateFromString(this.config.minDate, null)\n if (this.minDate && this.currentDate < this.minDate) {\n this.currentDate = this.minDate\n }\n }\n\n if (this.config.maxDate) {\n this.maxDate = this.formattedDateFromString(this.config.maxDate, null)\n if (this.maxDate && this.currentDate > this.maxDate) {\n this.currentDate = this.maxDate\n }\n }\n }\n\n setExcludedDates() {\n if (this.config.excludedDates) {\n this.excludedDates = this.config.excludedDates\n .replace(/\\s+/, ' ')\n .split(' ')\n .map((item) => {\n return item.includes('-')\n ? this.parseDateRangeString(item)\n : [this.formattedDateFromString(item)]\n })\n .reduce((dates, items) => dates.concat(items))\n .filter((date) => date)\n }\n }\n\n /**\n * Parses a daterange string into an array of dates\n *\n * @param {string} datestring - A daterange string in the format \"dd/mm/yyyy-dd/mm/yyyy\"\n */\n parseDateRangeString(datestring) {\n const dates = []\n const [startDate, endDate] = datestring\n .split('-')\n .map((d) => this.formattedDateFromString(d, null))\n\n if (startDate && endDate) {\n const date = new Date(startDate.getTime())\n /* eslint-disable no-unmodified-loop-condition */\n while (date <= endDate) {\n dates.push(new Date(date))\n date.setDate(date.getDate() + 1)\n }\n /* eslint-enable no-unmodified-loop-condition */\n }\n return dates\n }\n\n setExcludedDays() {\n if (this.config.excludedDays) {\n // lowercase and arrange dayLabels to put indexOf sunday == 0 for comparison\n // with getDay() function\n const weekDays = this.dayLabels.map((item) => item.toLowerCase())\n if (this.config.weekStartDay === 'monday') {\n weekDays.unshift(weekDays.pop())\n }\n\n this.excludedDays = this.config.excludedDays\n .replace(/\\s+/, ' ')\n .toLowerCase()\n .split(' ')\n .map((item) => weekDays.indexOf(item))\n .filter((item) => item !== -1)\n }\n }\n\n setWeekStartDay() {\n const weekStartDayParam = this.config.weekStartDay\n if (weekStartDayParam && weekStartDayParam.toLowerCase() === 'sunday') {\n this.config.weekStartDay = 'sunday'\n // Rotate dayLabels array to put Sunday as the first item\n this.dayLabels.unshift(this.dayLabels.pop())\n } else {\n this.config.weekStartDay = 'monday'\n }\n }\n\n /**\n * Determine if a date is selectable\n *\n * @param {Date} date - the date to check\n * @returns {boolean}\n */\n isExcludedDate(date) {\n // This comparison does not work correctly - it will exclude the mindate itself\n // see: https://github.com/ministryofjustice/moj-frontend/issues/923\n if (this.minDate && this.minDate > date) {\n return true\n }\n\n // This comparison works as expected - the maxdate will not be excluded\n if (this.maxDate && this.maxDate < date) {\n return true\n }\n\n for (const excludedDate of this.excludedDates) {\n if (date.toDateString() === excludedDate.toDateString()) {\n return true\n }\n }\n\n if (this.excludedDays.includes(date.getDay())) {\n return true\n }\n\n return false\n }\n\n /**\n * Get a Date object from a string\n *\n * @param {string} dateString - string in the format d/m/yyyy dd/mm/yyyy\n * @param {Date} fallback - date object to return if formatting fails\n * @returns {Date}\n */\n formattedDateFromString(dateString, fallback = new Date()) {\n let formattedDate = null\n // Accepts d/m/yyyy and dd/mm/yyyy\n const dateFormatPattern = /(\\d{1,2})([-/,. ])(\\d{1,2})\\2(\\d{4})/\n\n if (!dateFormatPattern.test(dateString)) return fallback\n\n const match = dateFormatPattern.exec(dateString)\n const day = match[1]\n const month = match[3]\n const year = match[4]\n\n formattedDate = new Date(`${year}-${month}-${day}`)\n if (\n formattedDate instanceof Date &&\n Number.isFinite(formattedDate.getTime())\n ) {\n return formattedDate\n }\n return fallback\n }\n\n /**\n * Get a formatted date string from a Date object\n *\n * @param {Date} date - date to format to a string\n * @returns {string}\n */\n formattedDateFromDate(date) {\n if (this.config.leadingZeros) {\n return `${this.leadingZeros(date.getDate())}/${this.leadingZeros(date.getMonth() + 1)}/${date.getFullYear()}`\n }\n\n return `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear()}`\n }\n\n /**\n * Get a human readable date in the format Monday 2 March 2024\n *\n * @param {Date} date - Date to format\n * @returns {string}\n */\n formattedDateHuman(date) {\n return `${this.dayLabels[(date.getDay() + 6) % 7]} ${date.getDate()} ${this.monthLabels[date.getMonth()]} ${date.getFullYear()}`\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n backgroundClick(event) {\n if (\n this.isOpen() &&\n event.target instanceof Node &&\n !this.$dialog.contains(event.target) &&\n !this.$input.contains(event.target) &&\n !this.$calendarButton.contains(event.target)\n ) {\n event.preventDefault()\n this.closeDialog()\n }\n }\n\n /**\n * @param {KeyboardEvent} event - Keydown event\n */\n firstButtonKeydown(event) {\n if (event.key === 'Tab' && event.shiftKey) {\n this.$lastButtonInDialog.focus()\n event.preventDefault()\n }\n }\n\n /**\n * @param {KeyboardEvent} event - Keydown event\n */\n lastButtonKeydown(event) {\n if (event.key === 'Tab' && !event.shiftKey) {\n this.$firstButtonInDialog.focus()\n event.preventDefault()\n }\n }\n\n // render calendar\n updateCalendar() {\n this.$dialogTitle.innerHTML = `${this.monthLabels[this.currentDate.getMonth()]} ${this.currentDate.getFullYear()}`\n\n const day = this.currentDate\n const firstOfMonth = new Date(day.getFullYear(), day.getMonth(), 1)\n let dayOfWeek\n\n if (this.config.weekStartDay === 'monday') {\n dayOfWeek = firstOfMonth.getDay() === 0 ? 6 : firstOfMonth.getDay() - 1 // Change logic to make Monday first day of week, i.e. 0\n } else {\n dayOfWeek = firstOfMonth.getDay()\n }\n\n firstOfMonth.setDate(firstOfMonth.getDate() - dayOfWeek)\n\n const thisDay = new Date(firstOfMonth)\n\n // loop through our days\n for (const calendarDay of this.calendarDays) {\n const hidden = thisDay.getMonth() !== day.getMonth()\n const disabled = this.isExcludedDate(thisDay)\n\n calendarDay.update(thisDay, hidden, disabled)\n\n thisDay.setDate(thisDay.getDate() + 1)\n }\n }\n\n /**\n * @param {boolean} [focus] - Focus the day button\n */\n setCurrentDate(focus = true) {\n const { currentDate } = this\n this.calendarDays.forEach((calendarDay) => {\n calendarDay.$button.classList.add('moj-datepicker__button')\n calendarDay.$button.classList.add('moj-datepicker__calendar-day')\n calendarDay.$button.setAttribute('tabindex', '-1')\n calendarDay.$button.classList.remove(this.selectedDayButtonClass)\n const calendarDayDate = calendarDay.date\n calendarDayDate.setHours(0, 0, 0, 0)\n\n const today = new Date()\n today.setHours(0, 0, 0, 0)\n\n if (\n calendarDayDate.getTime() ===\n currentDate.getTime() /* && !calendarDay.button.disabled */\n ) {\n if (focus) {\n calendarDay.$button.setAttribute('tabindex', '0')\n calendarDay.$button.focus()\n calendarDay.$button.classList.add(this.selectedDayButtonClass)\n }\n }\n\n if (\n this.inputDate &&\n calendarDayDate.getTime() === this.inputDate.getTime()\n ) {\n calendarDay.$button.classList.add(this.currentDayButtonClass)\n calendarDay.$button.setAttribute('aria-current', 'date')\n } else {\n calendarDay.$button.classList.remove(this.currentDayButtonClass)\n calendarDay.$button.removeAttribute('aria-current')\n }\n\n if (calendarDayDate.getTime() === today.getTime()) {\n calendarDay.$button.classList.add(this.todayButtonClass)\n } else {\n calendarDay.$button.classList.remove(this.todayButtonClass)\n }\n })\n\n // if no date is tab-able, make the first non-disabled date tab-able\n if (!focus) {\n const enabledDays = this.calendarDays.filter((calendarDay) => {\n return (\n window.getComputedStyle(calendarDay.$button).display === 'block' &&\n !calendarDay.$button.disabled\n )\n })\n\n enabledDays[0].$button.setAttribute('tabindex', '0')\n\n this.currentDate = enabledDays[0].date\n }\n }\n\n /**\n * @param {Date} date - Date to select\n */\n selectDate(date) {\n if (this.isExcludedDate(date)) {\n return\n }\n\n this.$calendarButton.querySelector('span').innerText =\n `Choose date. Selected date is ${this.formattedDateHuman(date)}`\n this.$input.value = this.formattedDateFromDate(date)\n\n const changeEvent = new Event('change', { bubbles: true, cancelable: true })\n this.$input.dispatchEvent(changeEvent)\n\n this.closeDialog()\n }\n\n isOpen() {\n return this.$dialog.classList.contains('moj-datepicker__dialog--open')\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n toggleDialog(event) {\n event.preventDefault()\n if (this.isOpen()) {\n this.closeDialog()\n } else {\n this.setMinAndMaxDatesOnCalendar()\n this.openDialog()\n }\n }\n\n openDialog() {\n this.$dialog.hidden = false\n this.$dialog.classList.add('moj-datepicker__dialog--open')\n this.$calendarButton.setAttribute('aria-expanded', 'true')\n\n // position the dialog\n // if input is wider than dialog pin it to the right\n if (this.$input.offsetWidth > this.$dialog.offsetWidth) {\n this.$dialog.style.right = `0px`\n }\n this.$dialog.style.top = `${this.$input.offsetHeight + 3}px`\n\n // get the date from the input element\n this.inputDate = this.formattedDateFromString(this.$input.value)\n this.currentDate = this.inputDate\n this.currentDate.setHours(0, 0, 0, 0)\n\n this.updateCalendar()\n this.setCurrentDate()\n }\n\n closeDialog() {\n this.$dialog.hidden = true\n this.$dialog.classList.remove('moj-datepicker__dialog--open')\n this.$calendarButton.setAttribute('aria-expanded', 'false')\n this.$calendarButton.focus()\n }\n\n /**\n * @param {Date} date - Date to go to\n * @param {boolean} [focus] - Focus the day button\n */\n goToDate(date, focus) {\n const current = this.currentDate\n this.currentDate = date\n\n if (\n current.getMonth() !== this.currentDate.getMonth() ||\n current.getFullYear() !== this.currentDate.getFullYear()\n ) {\n this.updateCalendar()\n }\n\n this.setCurrentDate(focus)\n }\n\n // day navigation\n focusNextDay() {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() + 1)\n this.goToDate(date)\n }\n\n focusPreviousDay() {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() - 1)\n this.goToDate(date)\n }\n\n // week navigation\n focusNextWeek() {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() + 7)\n this.goToDate(date)\n }\n\n focusPreviousWeek() {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() - 7)\n this.goToDate(date)\n }\n\n focusFirstDayOfWeek() {\n const date = new Date(this.currentDate)\n const firstDayOfWeekIndex = this.config.weekStartDay === 'sunday' ? 0 : 1\n const dayOfWeek = date.getDay()\n const diff =\n dayOfWeek >= firstDayOfWeekIndex\n ? dayOfWeek - firstDayOfWeekIndex\n : 6 - dayOfWeek\n\n date.setDate(date.getDate() - diff)\n date.setHours(0, 0, 0, 0)\n\n this.goToDate(date)\n }\n\n focusLastDayOfWeek() {\n const date = new Date(this.currentDate)\n const lastDayOfWeekIndex = this.config.weekStartDay === 'sunday' ? 6 : 0\n const dayOfWeek = date.getDay()\n const diff =\n dayOfWeek <= lastDayOfWeekIndex\n ? lastDayOfWeekIndex - dayOfWeek\n : 7 - dayOfWeek\n\n date.setDate(date.getDate() + diff)\n date.setHours(0, 0, 0, 0)\n\n this.goToDate(date)\n }\n\n /**\n * Month navigation\n *\n * @param {KeyboardEvent | MouseEvent} event - Key press or click event\n * @param {boolean} [focus] - Focus the day button\n */\n focusNextMonth(event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setMonth(date.getMonth() + 1, 1)\n this.goToDate(date, focus)\n }\n\n /**\n * @param {KeyboardEvent | MouseEvent} event - Key press or click event\n * @param {boolean} [focus] - Focus the day button\n */\n focusPreviousMonth(event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setMonth(date.getMonth() - 1, 1)\n this.goToDate(date, focus)\n }\n\n /**\n * Year navigation\n *\n * @param {KeyboardEvent | MouseEvent} event - Key press or click event\n * @param {boolean} [focus] - Focus the day button\n */\n focusNextYear(event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setFullYear(date.getFullYear() + 1, date.getMonth(), 1)\n this.goToDate(date, focus)\n }\n\n /**\n * @param {KeyboardEvent | MouseEvent} event - Key press or click event\n * @param {boolean} [focus] - Focus the day button\n */\n focusPreviousYear(event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setFullYear(date.getFullYear() - 1, date.getMonth(), 1)\n this.goToDate(date, focus)\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-date-picker'\n\n /**\n * Date picker default config\n *\n * @type {DatePickerConfig}\n */\n static defaults = Object.freeze({\n leadingZeros: false,\n weekStartDay: 'monday',\n input: {\n selector: '.moj-js-datepicker-input'\n }\n })\n\n /**\n * Date picker config schema\n *\n * @satisfies {Schema<DatePickerConfig>}\n */\n static schema = Object.freeze(\n /** @type {const} */ ({\n properties: {\n excludedDates: { type: 'string' },\n excludedDays: { type: 'string' },\n leadingZeros: { type: 'boolean' },\n maxDate: { type: 'string' },\n minDate: { type: 'string' },\n weekStartDay: { type: 'string' },\n input: { type: 'object' }\n }\n })\n )\n}\n\nclass DSCalendarDay {\n /**\n *\n * @param {HTMLButtonElement} $button\n * @param {number} index\n * @param {number} row\n * @param {number} column\n * @param {DatePicker} picker\n */\n constructor($button, index, row, column, picker) {\n this.index = index\n this.row = row\n this.column = column\n this.$button = $button\n this.picker = picker\n this.date = new Date()\n this.$button.addEventListener('keydown', this.keyPress.bind(this))\n this.$button.addEventListener('click', this.click.bind(this))\n }\n\n /**\n * @param {Date} day - the Date for the calendar day\n * @param {boolean} hidden - visibility of the day\n * @param {boolean} disabled - is the day selectable or excluded\n */\n update(day, hidden, disabled) {\n const label = day.getDate()\n let accessibleLabel = this.picker.formattedDateHuman(day)\n\n if (disabled) {\n this.$button.setAttribute('aria-disabled', 'true')\n accessibleLabel = `Excluded date, ${accessibleLabel}`\n } else {\n this.$button.removeAttribute('aria-disabled')\n }\n\n if (hidden) {\n this.$button.style.display = 'none'\n } else {\n this.$button.style.display = 'block'\n }\n this.$button.setAttribute(\n 'data-testid',\n this.picker.formattedDateFromDate(day)\n )\n\n this.$button.innerHTML = `<span class=\"govuk-visually-hidden\">${accessibleLabel}</span><span aria-hidden=\"true\">${label}</span>`\n this.date = new Date(day)\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n click(event) {\n this.picker.goToDate(this.date)\n this.picker.selectDate(this.date)\n\n event.stopPropagation()\n event.preventDefault()\n }\n\n /**\n * @param {KeyboardEvent} event - Keydown event\n */\n keyPress(event) {\n let calendarNavKey = true\n\n switch (event.key) {\n case 'ArrowLeft':\n this.picker.focusPreviousDay()\n break\n case 'ArrowRight':\n this.picker.focusNextDay()\n break\n case 'ArrowUp':\n this.picker.focusPreviousWeek()\n break\n case 'ArrowDown':\n this.picker.focusNextWeek()\n break\n case 'Home':\n this.picker.focusFirstDayOfWeek()\n break\n case 'End':\n this.picker.focusLastDayOfWeek()\n break\n case 'PageUp': {\n if (event.shiftKey) {\n this.picker.focusPreviousYear(event)\n } else {\n this.picker.focusPreviousMonth(event)\n }\n break\n }\n case 'PageDown': {\n if (event.shiftKey) {\n this.picker.focusNextYear(event)\n } else {\n this.picker.focusNextMonth(event)\n }\n break\n }\n default:\n calendarNavKey = false\n break\n }\n\n if (calendarNavKey) {\n event.preventDefault()\n event.stopPropagation()\n }\n }\n}\n\n/**\n * Date picker config\n *\n * @typedef {object} DatePickerConfig\n * @property {string} [excludedDates] - Dates that cannot be selected\n * @property {string} [excludedDays] - Days that cannot be selected\n * @property {boolean} [leadingZeros] - Whether to add leading zeroes when populating the field\n * @property {string} [minDate] - The earliest available date\n * @property {string} [maxDate] - The latest available date\n * @property {string} [weekStartDay] - First day of the week in calendar view\n * @property {object} [input] - Input config\n * @property {string} [input.selector] - Selector for the input element\n * @property {Element | null} [input.element] - HTML element for the input\n */\n\n/**\n * @import { Schema } from 'govuk-frontend/dist/govuk/common/configuration.mjs'\n */\n"],"names":["DatePicker","ConfigurableComponent","constructor","$root","config","_this$config$input$el","$input","input","element","querySelector","selector","HTMLInputElement","dayLabels","monthLabels","currentDate","Date","setHours","calendarDays","excludedDates","excludedDays","buttonClass","selectedDayButtonClass","currentDayButtonClass","todayButtonClass","setOptions","initControls","id","$dialog","createDialog","createCalendarHeaders","$componentWrapper","document","createElement","$inputWrapper","classList","add","parentElement","insertBefore","appendChild","insertAdjacentHTML","toggleTemplate","insertAdjacentElement","$calendarButton","$dialogTitle","createCalendar","$prevMonthButton","$prevYearButton","$nextMonthButton","$nextYearButton","$cancelButton","$okButton","addEventListener","event","focusPreviousMonth","focusPreviousYear","focusNextMonth","focusNextYear","preventDefault","closeDialog","selectDate","$dialogButtons","querySelectorAll","$firstButtonInDialog","$lastButtonInDialog","length","firstButtonKeydown","lastButtonKeydown","toggleDialog","key","stopPropagation","body","backgroundClick","updateCalendar","titleId","setAttribute","innerHTML","dialogTemplate","hidden","$tbody","dayCount","i","$row","insertRow","j","$cell","$dateButton","calendarDay","DSCalendarDay","push","forEach","day","html","substring","$headerRow","leadingZeros","value","ret","toString","setMinAndMaxDatesOnCalendar","setExcludedDates","setExcludedDays","setWeekStartDay","minDate","formattedDateFromString","maxDate","replace","split","map","item","includes","parseDateRangeString","reduce","dates","items","concat","filter","date","datestring","startDate","endDate","d","getTime","setDate","getDate","weekDays","toLowerCase","weekStartDay","unshift","pop","indexOf","weekStartDayParam","isExcludedDate","excludedDate","toDateString","getDay","dateString","fallback","formattedDate","dateFormatPattern","test","match","exec","month","year","Number","isFinite","formattedDateFromDate","getMonth","getFullYear","formattedDateHuman","isOpen","target","Node","contains","shiftKey","focus","firstOfMonth","dayOfWeek","thisDay","disabled","update","setCurrentDate","$button","remove","calendarDayDate","today","inputDate","removeAttribute","enabledDays","window","getComputedStyle","display","innerText","changeEvent","Event","bubbles","cancelable","dispatchEvent","openDialog","offsetWidth","style","right","top","offsetHeight","goToDate","current","focusNextDay","focusPreviousDay","focusNextWeek","focusPreviousWeek","focusFirstDayOfWeek","firstDayOfWeekIndex","diff","focusLastDayOfWeek","lastDayOfWeekIndex","setMonth","setFullYear","moduleName","defaults","Object","freeze","schema","properties","type","index","row","column","picker","keyPress","bind","click","label","accessibleLabel","calendarNavKey"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"date-picker.mjs","sources":["../../../../src/moj/components/date-picker/date-picker.mjs"],"sourcesContent":["import { ConfigurableComponent } from 'govuk-frontend'\n\n/**\n * @augments {ConfigurableComponent<DatePickerConfig>}\n */\nexport class DatePicker extends ConfigurableComponent {\n /**\n * @param {Element | null} $root - HTML element to use for date picker\n * @param {DatePickerConfig} [config] - Date picker config\n */\n constructor($root, config = {}) {\n super($root, config)\n\n const $input =\n this.config.input.element ??\n this.$root.querySelector(this.config.input.selector)\n\n if (!$input || !($input instanceof HTMLInputElement)) {\n return this\n }\n\n this.$input = $input\n\n this.dayLabels = [\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday'\n ]\n\n this.monthLabels = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ]\n\n this.currentDate = new Date()\n this.currentDate.setHours(0, 0, 0, 0)\n this.calendarDays = /** @type {DSCalendarDay[]} */ ([])\n this.excludedDates = /** @type {Date[]} */ ([])\n this.excludedDays = /** @type {number[]} */ ([])\n\n this.buttonClass = 'moj-datepicker__button'\n this.selectedDayButtonClass = 'moj-datepicker__button--selected'\n this.currentDayButtonClass = 'moj-datepicker__button--current'\n this.todayButtonClass = 'moj-datepicker__button--today'\n\n this.setOptions()\n this.initControls()\n }\n\n initControls() {\n this.id = `datepicker-${this.$input.id}`\n\n this.$dialog = this.createDialog()\n this.createCalendarHeaders()\n\n const $componentWrapper = document.createElement('div')\n const $inputWrapper = document.createElement('div')\n $componentWrapper.classList.add('moj-datepicker__wrapper')\n $inputWrapper.classList.add('govuk-input__wrapper')\n\n this.$input.parentElement.insertBefore($componentWrapper, this.$input)\n $componentWrapper.appendChild($inputWrapper)\n $inputWrapper.appendChild(this.$input)\n\n $inputWrapper.insertAdjacentHTML('beforeend', this.toggleTemplate())\n $componentWrapper.insertAdjacentElement('beforeend', this.$dialog)\n\n this.$calendarButton = /** @type {HTMLButtonElement} */ (\n this.$root.querySelector('.moj-js-datepicker-toggle')\n )\n\n this.$dialogTitle = /** @type {HTMLHeadingElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-month-year')\n )\n\n this.createCalendar()\n\n this.$prevMonthButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-prev-month')\n )\n\n this.$prevYearButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-prev-year')\n )\n\n this.$nextMonthButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-next-month')\n )\n\n this.$nextYearButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-next-year')\n )\n\n this.$cancelButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-cancel')\n )\n\n this.$okButton = /** @type {HTMLButtonElement} */ (\n this.$dialog.querySelector('.moj-js-datepicker-ok')\n )\n\n // add event listeners\n this.$prevMonthButton.addEventListener('click', (event) =>\n this.focusPreviousMonth(event, false)\n )\n this.$prevYearButton.addEventListener('click', (event) =>\n this.focusPreviousYear(event, false)\n )\n this.$nextMonthButton.addEventListener('click', (event) =>\n this.focusNextMonth(event, false)\n )\n this.$nextYearButton.addEventListener('click', (event) =>\n this.focusNextYear(event, false)\n )\n this.$cancelButton.addEventListener('click', (event) => {\n event.preventDefault()\n this.closeDialog()\n })\n this.$okButton.addEventListener('click', () => {\n this.selectDate(this.currentDate)\n })\n\n const $dialogButtons = this.$dialog.querySelectorAll(\n 'button:not([disabled=\"true\"])'\n )\n\n this.$firstButtonInDialog = $dialogButtons[0]\n this.$lastButtonInDialog = $dialogButtons[$dialogButtons.length - 1]\n this.$firstButtonInDialog.addEventListener('keydown', (event) =>\n this.firstButtonKeydown(event)\n )\n this.$lastButtonInDialog.addEventListener('keydown', (event) =>\n this.lastButtonKeydown(event)\n )\n\n this.$calendarButton.addEventListener('click', (event) =>\n this.toggleDialog(event)\n )\n\n this.$dialog.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.closeDialog()\n event.preventDefault()\n event.stopPropagation()\n }\n })\n\n document.body.addEventListener('mouseup', (event) => {\n this.backgroundClick(event)\n })\n\n // populates calendar with initial dates, avoids Wave errors about null buttons\n this.updateCalendar()\n }\n\n createDialog() {\n const titleId = `datepicker-title-${this.$input.id}`\n const $dialog = document.createElement('div')\n\n $dialog.id = this.id\n $dialog.setAttribute('class', 'moj-datepicker__dialog')\n $dialog.setAttribute('role', 'dialog')\n $dialog.setAttribute('aria-modal', 'true')\n $dialog.setAttribute('aria-labelledby', titleId)\n $dialog.innerHTML = this.dialogTemplate(titleId)\n $dialog.hidden = true\n\n return $dialog\n }\n\n createCalendar() {\n const $tbody = this.$dialog.querySelector('tbody')\n let dayCount = 0\n for (let i = 0; i < 6; i++) {\n // create row\n const $row = $tbody.insertRow(i)\n\n for (let j = 0; j < 7; j++) {\n // create cell (day)\n const $cell = document.createElement('td')\n $row.appendChild($cell)\n const $dateButton = document.createElement('button')\n $dateButton.setAttribute('type', 'button')\n $cell.appendChild($dateButton)\n\n const calendarDay = new DSCalendarDay($dateButton, dayCount, i, j, this)\n this.calendarDays.push(calendarDay)\n dayCount++\n }\n }\n }\n\n toggleTemplate() {\n return `<button class=\"moj-datepicker__toggle moj-js-datepicker-toggle\" type=\"button\" aria-haspopup=\"dialog\" aria-controls=\"${this.id}\" aria-expanded=\"false\">\n <span class=\"govuk-visually-hidden\">Choose date</span>\n <svg width=\"32\" height=\"24\" focusable=\"false\" class=\"moj-datepicker-icon\" aria-hidden=\"true\" role=\"img\" viewBox=\"0 0 22 22\">\n <path\n fill=\"currentColor\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M16.1333 2.93333H5.86668V4.4C5.86668 5.21002 5.21003 5.86667 4.40002 5.86667C3.59 5.86667 2.93335 5.21002 2.93335 4.4V2.93333H2C0.895431 2.93333 0 3.82877 0 4.93334V19.2667C0 20.3712 0.89543 21.2667 2 21.2667H20C21.1046 21.2667 22 20.3712 22 19.2667V4.93333C22 3.82876 21.1046 2.93333 20 2.93333H19.0667V4.4C19.0667 5.21002 18.41 5.86667 17.6 5.86667C16.79 5.86667 16.1333 5.21002 16.1333 4.4V2.93333ZM20.5333 8.06667H1.46665V18.8C1.46665 19.3523 1.91436 19.8 2.46665 19.8H19.5333C20.0856 19.8 20.5333 19.3523 20.5333 18.8V8.06667Z\"\n ></path>\n <rect x=\"3.66669\" width=\"1.46667\" height=\"5.13333\" rx=\"0.733333\" fill=\"currentColor\"></rect>\n <rect x=\"16.8667\" width=\"1.46667\" height=\"5.13333\" rx=\"0.733333\" fill=\"currentColor\"></rect>\n </svg>\n </button>`\n }\n\n /**\n * HTML template for calendar dialog\n *\n * @param {string} [titleId] - Id attribute for dialog title\n * @returns {string}\n */\n dialogTemplate(titleId) {\n return `<div class=\"moj-datepicker__dialog-header\">\n <div class=\"moj-datepicker__dialog-navbuttons\">\n <button type=\"button\" class=\"moj-datepicker__button moj-js-datepicker-prev-year\">\n <span class=\"govuk-visually-hidden\">Previous year</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M23.1643 20L28.9572 14.2071L27.5429 12.7929L20.3358 20L27.5429 27.2071L28.9572 25.7929L23.1643 20Z\" fill=\"currentColor\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M17.1643 20L22.9572 14.2071L21.5429 12.7929L14.3358 20L21.5429 27.2071L22.9572 25.7929L17.1643 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n\n <button type=\"button\" class=\"moj-datepicker__button moj-js-datepicker-prev-month\">\n <span class=\"govuk-visually-hidden\">Previous month</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M20.5729 20L25.7865 14.2071L24.5137 12.7929L18.0273 20L24.5137 27.2071L25.7865 25.7929L20.5729 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n </div>\n\n <h2 id=\"${titleId}\" class=\"moj-datepicker__dialog-title moj-js-datepicker-month-year\" aria-live=\"polite\">June 2020</h2>\n\n <div class=\"moj-datepicker__dialog-navbuttons\">\n <button type=\"button\" class=\"moj-datepicker__button moj-js-datepicker-next-month\">\n <span class=\"govuk-visually-hidden\">Next month</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M23.4271 20L18.2135 14.2071L19.4863 12.7929L25.9727 20L19.4863 27.2071L18.2135 25.7929L23.4271 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n\n <button type=\"button\" class=\"moj-datepicker__button moj-js-datepicker-next-year\">\n <span class=\"govuk-visually-hidden\">Next year</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M20.8357 20L15.0428 14.2071L16.4571 12.7929L23.6642 20L16.4571 27.2071L15.0428 25.7929L20.8357 20Z\" fill=\"currentColor\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M26.8357 20L21.0428 14.2071L22.4571 12.7929L29.6642 20L22.4571 27.2071L21.0428 25.7929L26.8357 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <table class=\"moj-datepicker__calendar moj-js-datepicker-grid\" role=\"application\" aria-labelledby=\"${titleId}\">\n <thead>\n <tr></tr>\n </thead>\n\n <tbody></tbody>\n </table>\n\n <div class=\"govuk-button-group\">\n <button type=\"button\" class=\"govuk-button moj-js-datepicker-ok\">Select</button>\n <button type=\"button\" class=\"govuk-button govuk-button--secondary moj-js-datepicker-cancel\">Close</button>\n </div>`\n }\n\n createCalendarHeaders() {\n this.dayLabels.forEach((day) => {\n const html = `<th scope=\"col\"><span aria-hidden=\"true\">${day.substring(0, 3)}</span><span class=\"govuk-visually-hidden\">${day}</span></th>`\n const $headerRow = this.$dialog.querySelector('thead > tr')\n $headerRow.insertAdjacentHTML('beforeend', html)\n })\n }\n\n /**\n * Pads given number with leading zeros\n *\n * @param {number} value - The value to be padded\n * @param {number} length - The length in characters of the output\n * @returns {string}\n */\n leadingZeros(value, length = 2) {\n let ret = value.toString()\n\n while (ret.length < length) {\n ret = `0${ret}`\n }\n\n return ret\n }\n\n setOptions() {\n this.setMinAndMaxDatesOnCalendar()\n this.setExcludedDates()\n this.setExcludedDays()\n this.setWeekStartDay()\n }\n\n setMinAndMaxDatesOnCalendar() {\n if (this.config.minDate) {\n this.minDate = this.formattedDateFromString(this.config.minDate, null)\n if (this.minDate && this.currentDate < this.minDate) {\n this.currentDate = this.minDate\n }\n }\n\n if (this.config.maxDate) {\n this.maxDate = this.formattedDateFromString(this.config.maxDate, null)\n if (this.maxDate && this.currentDate > this.maxDate) {\n this.currentDate = this.maxDate\n }\n }\n }\n\n setExcludedDates() {\n if (this.config.excludedDates) {\n this.excludedDates = this.config.excludedDates\n .replace(/\\s+/, ' ')\n .split(' ')\n .map((item) => {\n return item.includes('-')\n ? this.parseDateRangeString(item)\n : [this.formattedDateFromString(item)]\n })\n .reduce((dates, items) => dates.concat(items))\n .filter((date) => date)\n }\n }\n\n /**\n * Parses a daterange string into an array of dates\n *\n * @param {string} datestring - A daterange string in the format \"dd/mm/yyyy-dd/mm/yyyy\"\n */\n parseDateRangeString(datestring) {\n const dates = []\n const [startDate, endDate] = datestring\n .split('-')\n .map((d) => this.formattedDateFromString(d, null))\n\n if (startDate && endDate) {\n const date = new Date(startDate.getTime())\n /* eslint-disable no-unmodified-loop-condition */\n while (date <= endDate) {\n dates.push(new Date(date))\n date.setDate(date.getDate() + 1)\n }\n /* eslint-enable no-unmodified-loop-condition */\n }\n return dates\n }\n\n setExcludedDays() {\n if (this.config.excludedDays) {\n // lowercase and arrange dayLabels to put indexOf sunday == 0 for comparison\n // with getDay() function\n const weekDays = this.dayLabels.map((item) => item.toLowerCase())\n if (this.config.weekStartDay === 'monday') {\n weekDays.unshift(weekDays.pop())\n }\n\n this.excludedDays = this.config.excludedDays\n .replace(/\\s+/, ' ')\n .toLowerCase()\n .split(' ')\n .map((item) => weekDays.indexOf(item))\n .filter((item) => item !== -1)\n }\n }\n\n setWeekStartDay() {\n const weekStartDayParam = this.config.weekStartDay\n if (weekStartDayParam && weekStartDayParam.toLowerCase() === 'sunday') {\n this.config.weekStartDay = 'sunday'\n // Rotate dayLabels array to put Sunday as the first item\n this.dayLabels.unshift(this.dayLabels.pop())\n } else {\n this.config.weekStartDay = 'monday'\n }\n }\n\n /**\n * Determine if a date is selectable\n *\n * @param {Date} date - the date to check\n * @returns {boolean}\n */\n isExcludedDate(date) {\n // This comparison does not work correctly - it will exclude the mindate itself\n // see: https://github.com/ministryofjustice/moj-frontend/issues/923\n if (this.minDate && this.minDate > date) {\n return true\n }\n\n // This comparison works as expected - the maxdate will not be excluded\n if (this.maxDate && this.maxDate < date) {\n return true\n }\n\n for (const excludedDate of this.excludedDates) {\n if (date.toDateString() === excludedDate.toDateString()) {\n return true\n }\n }\n\n if (this.excludedDays.includes(date.getDay())) {\n return true\n }\n\n return false\n }\n\n /**\n * Get a Date object from a string\n *\n * @param {string} dateString - string in the format d/m/yyyy dd/mm/yyyy\n * @param {Date} fallback - date object to return if formatting fails\n * @returns {Date}\n */\n formattedDateFromString(dateString, fallback = new Date()) {\n let formattedDate = null\n // Accepts d/m/yyyy and dd/mm/yyyy\n const dateFormatPattern = /(\\d{1,2})([-/,. ])(\\d{1,2})\\2(\\d{4})/\n\n if (!dateFormatPattern.test(dateString)) return fallback\n\n const match = dateFormatPattern.exec(dateString)\n const day = match[1]\n const month = match[3]\n const year = match[4]\n\n formattedDate = new Date(Number(year), Number(month) - 1, Number(day))\n if (\n formattedDate instanceof Date &&\n Number.isFinite(formattedDate.getTime())\n ) {\n return formattedDate\n }\n return fallback\n }\n\n /**\n * Get a formatted date string from a Date object\n *\n * @param {Date} date - date to format to a string\n * @returns {string}\n */\n formattedDateFromDate(date) {\n if (this.config.leadingZeros) {\n return `${this.leadingZeros(date.getDate())}/${this.leadingZeros(date.getMonth() + 1)}/${date.getFullYear()}`\n }\n\n return `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear()}`\n }\n\n /**\n * Get a human readable date in the format Monday 2 March 2024\n *\n * @param {Date} date - Date to format\n * @returns {string}\n */\n formattedDateHuman(date) {\n return `${this.dayLabels[(date.getDay() + 6) % 7]} ${date.getDate()} ${this.monthLabels[date.getMonth()]} ${date.getFullYear()}`\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n backgroundClick(event) {\n if (\n this.isOpen() &&\n event.target instanceof Node &&\n !this.$dialog.contains(event.target) &&\n !this.$input.contains(event.target) &&\n !this.$calendarButton.contains(event.target)\n ) {\n event.preventDefault()\n this.closeDialog()\n }\n }\n\n /**\n * @param {KeyboardEvent} event - Keydown event\n */\n firstButtonKeydown(event) {\n if (event.key === 'Tab' && event.shiftKey) {\n this.$lastButtonInDialog.focus()\n event.preventDefault()\n }\n }\n\n /**\n * @param {KeyboardEvent} event - Keydown event\n */\n lastButtonKeydown(event) {\n if (event.key === 'Tab' && !event.shiftKey) {\n this.$firstButtonInDialog.focus()\n event.preventDefault()\n }\n }\n\n // render calendar\n updateCalendar() {\n this.$dialogTitle.innerHTML = `${this.monthLabels[this.currentDate.getMonth()]} ${this.currentDate.getFullYear()}`\n\n const day = this.currentDate\n const firstOfMonth = new Date(day.getFullYear(), day.getMonth(), 1)\n let dayOfWeek\n\n if (this.config.weekStartDay === 'monday') {\n dayOfWeek = firstOfMonth.getDay() === 0 ? 6 : firstOfMonth.getDay() - 1 // Change logic to make Monday first day of week, i.e. 0\n } else {\n dayOfWeek = firstOfMonth.getDay()\n }\n\n firstOfMonth.setDate(firstOfMonth.getDate() - dayOfWeek)\n\n const thisDay = new Date(firstOfMonth)\n\n // loop through our days\n for (const calendarDay of this.calendarDays) {\n const hidden = thisDay.getMonth() !== day.getMonth()\n const disabled = this.isExcludedDate(thisDay)\n\n calendarDay.update(thisDay, hidden, disabled)\n\n thisDay.setDate(thisDay.getDate() + 1)\n }\n }\n\n /**\n * @param {boolean} [focus] - Focus the day button\n */\n setCurrentDate(focus = true) {\n const { currentDate } = this\n this.calendarDays.forEach((calendarDay) => {\n calendarDay.$button.classList.add('moj-datepicker__button')\n calendarDay.$button.classList.add('moj-datepicker__calendar-day')\n calendarDay.$button.setAttribute('tabindex', '-1')\n calendarDay.$button.classList.remove(this.selectedDayButtonClass)\n const calendarDayDate = calendarDay.date\n calendarDayDate.setHours(0, 0, 0, 0)\n\n const today = new Date()\n today.setHours(0, 0, 0, 0)\n\n if (\n calendarDayDate.getTime() ===\n currentDate.getTime() /* && !calendarDay.button.disabled */\n ) {\n if (focus) {\n calendarDay.$button.setAttribute('tabindex', '0')\n calendarDay.$button.focus()\n calendarDay.$button.classList.add(this.selectedDayButtonClass)\n }\n }\n\n if (\n this.inputDate &&\n calendarDayDate.getTime() === this.inputDate.getTime()\n ) {\n calendarDay.$button.classList.add(this.currentDayButtonClass)\n calendarDay.$button.setAttribute('aria-current', 'date')\n } else {\n calendarDay.$button.classList.remove(this.currentDayButtonClass)\n calendarDay.$button.removeAttribute('aria-current')\n }\n\n if (calendarDayDate.getTime() === today.getTime()) {\n calendarDay.$button.classList.add(this.todayButtonClass)\n } else {\n calendarDay.$button.classList.remove(this.todayButtonClass)\n }\n })\n\n // if no date is tab-able, make the first non-disabled date tab-able\n if (!focus) {\n const enabledDays = this.calendarDays.filter((calendarDay) => {\n return (\n window.getComputedStyle(calendarDay.$button).display === 'block' &&\n !calendarDay.$button.disabled\n )\n })\n\n enabledDays[0].$button.setAttribute('tabindex', '0')\n\n this.currentDate = enabledDays[0].date\n }\n }\n\n /**\n * @param {Date} date - Date to select\n */\n selectDate(date) {\n if (this.isExcludedDate(date)) {\n return\n }\n\n this.$calendarButton.querySelector('span').innerText =\n `Choose date. Selected date is ${this.formattedDateHuman(date)}`\n this.$input.value = this.formattedDateFromDate(date)\n\n const changeEvent = new Event('change', { bubbles: true, cancelable: true })\n this.$input.dispatchEvent(changeEvent)\n\n this.closeDialog()\n }\n\n isOpen() {\n return this.$dialog.classList.contains('moj-datepicker__dialog--open')\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n toggleDialog(event) {\n event.preventDefault()\n if (this.isOpen()) {\n this.closeDialog()\n } else {\n this.setMinAndMaxDatesOnCalendar()\n this.openDialog()\n }\n }\n\n openDialog() {\n this.$dialog.hidden = false\n this.$dialog.classList.add('moj-datepicker__dialog--open')\n this.$calendarButton.setAttribute('aria-expanded', 'true')\n\n // position the dialog\n // if input is wider than dialog pin it to the right\n if (this.$input.offsetWidth > this.$dialog.offsetWidth) {\n this.$dialog.style.right = `0px`\n }\n this.$dialog.style.top = `${this.$input.offsetHeight + 3}px`\n\n // get the date from the input element\n this.inputDate = this.formattedDateFromString(this.$input.value)\n // move current date to the closest selectable date if it is out of range\n if (this.minDate && this.minDate > this.inputDate) {\n this.inputDate = new Date(this.minDate.getTime())\n }\n if (this.maxDate && this.maxDate < this.inputDate) {\n this.inputDate = new Date(this.maxDate.getTime())\n }\n if (this.minDate && this.maxDate && this.minDate > this.maxDate) {\n console.error('min date is after max date. No dates will be selectable')\n }\n\n this.currentDate = this.inputDate\n this.currentDate.setHours(0, 0, 0, 0)\n\n this.updateCalendar()\n this.setCurrentDate()\n }\n\n closeDialog() {\n this.$dialog.hidden = true\n this.$dialog.classList.remove('moj-datepicker__dialog--open')\n this.$calendarButton.setAttribute('aria-expanded', 'false')\n this.$calendarButton.focus()\n }\n\n /**\n * @param {Date} date - Date to go to\n * @param {boolean} [focus] - Focus the day button\n */\n goToDate(date, focus) {\n const current = this.currentDate\n this.currentDate = date\n\n if (\n current.getMonth() !== this.currentDate.getMonth() ||\n current.getFullYear() !== this.currentDate.getFullYear()\n ) {\n this.updateCalendar()\n }\n\n this.setCurrentDate(focus)\n }\n\n // day navigation\n focusNextDay() {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() + 1)\n this.goToDate(date)\n }\n\n focusPreviousDay() {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() - 1)\n this.goToDate(date)\n }\n\n // week navigation\n focusNextWeek() {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() + 7)\n this.goToDate(date)\n }\n\n focusPreviousWeek() {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() - 7)\n this.goToDate(date)\n }\n\n focusFirstDayOfWeek() {\n const date = new Date(this.currentDate)\n const firstDayOfWeekIndex = this.config.weekStartDay === 'sunday' ? 0 : 1\n const dayOfWeek = date.getDay()\n const diff =\n dayOfWeek >= firstDayOfWeekIndex\n ? dayOfWeek - firstDayOfWeekIndex\n : 6 - dayOfWeek\n\n date.setDate(date.getDate() - diff)\n date.setHours(0, 0, 0, 0)\n\n this.goToDate(date)\n }\n\n focusLastDayOfWeek() {\n const date = new Date(this.currentDate)\n const lastDayOfWeekIndex = this.config.weekStartDay === 'sunday' ? 6 : 0\n const dayOfWeek = date.getDay()\n const diff =\n dayOfWeek <= lastDayOfWeekIndex\n ? lastDayOfWeekIndex - dayOfWeek\n : 7 - dayOfWeek\n\n date.setDate(date.getDate() + diff)\n date.setHours(0, 0, 0, 0)\n\n this.goToDate(date)\n }\n\n /**\n * Month navigation\n *\n * @param {KeyboardEvent | MouseEvent} event - Key press or click event\n * @param {boolean} [focus] - Focus the day button\n */\n focusNextMonth(event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setMonth(date.getMonth() + 1, 1)\n this.goToDate(date, focus)\n }\n\n /**\n * @param {KeyboardEvent | MouseEvent} event - Key press or click event\n * @param {boolean} [focus] - Focus the day button\n */\n focusPreviousMonth(event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setMonth(date.getMonth() - 1, 1)\n this.goToDate(date, focus)\n }\n\n /**\n * Year navigation\n *\n * @param {KeyboardEvent | MouseEvent} event - Key press or click event\n * @param {boolean} [focus] - Focus the day button\n */\n focusNextYear(event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setFullYear(date.getFullYear() + 1, date.getMonth(), 1)\n this.goToDate(date, focus)\n }\n\n /**\n * @param {KeyboardEvent | MouseEvent} event - Key press or click event\n * @param {boolean} [focus] - Focus the day button\n */\n focusPreviousYear(event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setFullYear(date.getFullYear() - 1, date.getMonth(), 1)\n this.goToDate(date, focus)\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-date-picker'\n\n /**\n * Date picker default config\n *\n * @type {DatePickerConfig}\n */\n static defaults = Object.freeze({\n leadingZeros: false,\n weekStartDay: 'monday',\n input: {\n selector: '.moj-js-datepicker-input'\n }\n })\n\n /**\n * Date picker config schema\n *\n * @satisfies {Schema<DatePickerConfig>}\n */\n static schema = Object.freeze(\n /** @type {const} */ ({\n properties: {\n excludedDates: { type: 'string' },\n excludedDays: { type: 'string' },\n leadingZeros: { type: 'boolean' },\n maxDate: { type: 'string' },\n minDate: { type: 'string' },\n weekStartDay: { type: 'string' },\n input: { type: 'object' }\n }\n })\n )\n}\n\nclass DSCalendarDay {\n /**\n *\n * @param {HTMLButtonElement} $button\n * @param {number} index\n * @param {number} row\n * @param {number} column\n * @param {DatePicker} picker\n */\n constructor($button, index, row, column, picker) {\n this.index = index\n this.row = row\n this.column = column\n this.$button = $button\n this.picker = picker\n this.date = new Date()\n this.$button.addEventListener('keydown', this.keyPress.bind(this))\n this.$button.addEventListener('click', this.click.bind(this))\n }\n\n /**\n * @param {Date} day - the Date for the calendar day\n * @param {boolean} hidden - visibility of the day\n * @param {boolean} disabled - is the day selectable or excluded\n */\n update(day, hidden, disabled) {\n const label = day.getDate()\n let accessibleLabel = this.picker.formattedDateHuman(day)\n\n if (disabled) {\n this.$button.setAttribute('aria-disabled', 'true')\n accessibleLabel = `Excluded date, ${accessibleLabel}`\n } else {\n this.$button.removeAttribute('aria-disabled')\n }\n\n if (hidden) {\n this.$button.style.display = 'none'\n } else {\n this.$button.style.display = 'block'\n }\n this.$button.setAttribute(\n 'data-testid',\n this.picker.formattedDateFromDate(day)\n )\n\n this.$button.innerHTML = `<span class=\"govuk-visually-hidden\">${accessibleLabel}</span><span aria-hidden=\"true\">${label}</span>`\n this.date = new Date(day)\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n click(event) {\n this.picker.goToDate(this.date)\n this.picker.selectDate(this.date)\n\n event.stopPropagation()\n event.preventDefault()\n }\n\n /**\n * @param {KeyboardEvent} event - Keydown event\n */\n keyPress(event) {\n let calendarNavKey = true\n\n switch (event.key) {\n case 'ArrowLeft':\n this.picker.focusPreviousDay()\n break\n case 'ArrowRight':\n this.picker.focusNextDay()\n break\n case 'ArrowUp':\n this.picker.focusPreviousWeek()\n break\n case 'ArrowDown':\n this.picker.focusNextWeek()\n break\n case 'Home':\n this.picker.focusFirstDayOfWeek()\n break\n case 'End':\n this.picker.focusLastDayOfWeek()\n break\n case 'PageUp': {\n if (event.shiftKey) {\n this.picker.focusPreviousYear(event)\n } else {\n this.picker.focusPreviousMonth(event)\n }\n break\n }\n case 'PageDown': {\n if (event.shiftKey) {\n this.picker.focusNextYear(event)\n } else {\n this.picker.focusNextMonth(event)\n }\n break\n }\n default:\n calendarNavKey = false\n break\n }\n\n if (calendarNavKey) {\n event.preventDefault()\n event.stopPropagation()\n }\n }\n}\n\n/**\n * Date picker config\n *\n * @typedef {object} DatePickerConfig\n * @property {string} [excludedDates] - Dates that cannot be selected\n * @property {string} [excludedDays] - Days that cannot be selected\n * @property {boolean} [leadingZeros] - Whether to add leading zeroes when populating the field\n * @property {string} [minDate] - The earliest available date\n * @property {string} [maxDate] - The latest available date\n * @property {string} [weekStartDay] - First day of the week in calendar view\n * @property {object} [input] - Input config\n * @property {string} [input.selector] - Selector for the input element\n * @property {Element | null} [input.element] - HTML element for the input\n */\n\n/**\n * @import { Schema } from 'govuk-frontend/dist/govuk/common/configuration.mjs'\n */\n"],"names":["DatePicker","ConfigurableComponent","constructor","$root","config","_this$config$input$el","$input","input","element","querySelector","selector","HTMLInputElement","dayLabels","monthLabels","currentDate","Date","setHours","calendarDays","excludedDates","excludedDays","buttonClass","selectedDayButtonClass","currentDayButtonClass","todayButtonClass","setOptions","initControls","id","$dialog","createDialog","createCalendarHeaders","$componentWrapper","document","createElement","$inputWrapper","classList","add","parentElement","insertBefore","appendChild","insertAdjacentHTML","toggleTemplate","insertAdjacentElement","$calendarButton","$dialogTitle","createCalendar","$prevMonthButton","$prevYearButton","$nextMonthButton","$nextYearButton","$cancelButton","$okButton","addEventListener","event","focusPreviousMonth","focusPreviousYear","focusNextMonth","focusNextYear","preventDefault","closeDialog","selectDate","$dialogButtons","querySelectorAll","$firstButtonInDialog","$lastButtonInDialog","length","firstButtonKeydown","lastButtonKeydown","toggleDialog","key","stopPropagation","body","backgroundClick","updateCalendar","titleId","setAttribute","innerHTML","dialogTemplate","hidden","$tbody","dayCount","i","$row","insertRow","j","$cell","$dateButton","calendarDay","DSCalendarDay","push","forEach","day","html","substring","$headerRow","leadingZeros","value","ret","toString","setMinAndMaxDatesOnCalendar","setExcludedDates","setExcludedDays","setWeekStartDay","minDate","formattedDateFromString","maxDate","replace","split","map","item","includes","parseDateRangeString","reduce","dates","items","concat","filter","date","datestring","startDate","endDate","d","getTime","setDate","getDate","weekDays","toLowerCase","weekStartDay","unshift","pop","indexOf","weekStartDayParam","isExcludedDate","excludedDate","toDateString","getDay","dateString","fallback","formattedDate","dateFormatPattern","test","match","exec","month","year","Number","isFinite","formattedDateFromDate","getMonth","getFullYear","formattedDateHuman","isOpen","target","Node","contains","shiftKey","focus","firstOfMonth","dayOfWeek","thisDay","disabled","update","setCurrentDate","$button","remove","calendarDayDate","today","inputDate","removeAttribute","enabledDays","window","getComputedStyle","display","innerText","changeEvent","Event","bubbles","cancelable","dispatchEvent","openDialog","offsetWidth","style","right","top","offsetHeight","console","error","goToDate","current","focusNextDay","focusPreviousDay","focusNextWeek","focusPreviousWeek","focusFirstDayOfWeek","firstDayOfWeekIndex","diff","focusLastDayOfWeek","lastDayOfWeekIndex","setMonth","setFullYear","moduleName","defaults","Object","freeze","schema","properties","type","index","row","column","picker","keyPress","bind","click","label","accessibleLabel","calendarNavKey"],"mappings":"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"}
|
|
@@ -182,13 +182,13 @@
|
|
|
182
182
|
$message.innerHTML = this.getSuccessHtml(xhr.response.success);
|
|
183
183
|
this.$status.textContent = xhr.response.success.messageText;
|
|
184
184
|
$actions.append(this.getDeleteButton(xhr.response.file));
|
|
185
|
-
this.config.hooks.exitHook(this, file, xhr, xhr.
|
|
185
|
+
this.config.hooks.exitHook(this, file, xhr, xhr.statusText);
|
|
186
186
|
};
|
|
187
187
|
const onError = () => {
|
|
188
188
|
const error = new Error(xhr.response && 'error' in xhr.response ? xhr.response.error.message : xhr.statusText || 'Upload failed');
|
|
189
189
|
$message.innerHTML = this.getErrorHtml(error);
|
|
190
190
|
this.$status.textContent = error.message;
|
|
191
|
-
this.config.hooks.errorHook(this, file, xhr, xhr.
|
|
191
|
+
this.config.hooks.errorHook(this, file, xhr, xhr.statusText, error);
|
|
192
192
|
};
|
|
193
193
|
xhr.addEventListener('load', onLoad);
|
|
194
194
|
xhr.addEventListener('error', onError);
|
|
@@ -225,7 +225,7 @@
|
|
|
225
225
|
}
|
|
226
226
|
const $rowDelete = $rows.find($row => $row.contains($button));
|
|
227
227
|
if ($rowDelete) $rowDelete.remove();
|
|
228
|
-
this.config.hooks.deleteHook(this, undefined, xhr, xhr.
|
|
228
|
+
this.config.hooks.deleteHook(this, undefined, xhr, xhr.statusText);
|
|
229
229
|
});
|
|
230
230
|
xhr.open('POST', this.config.deleteUrl);
|
|
231
231
|
xhr.setRequestHeader('Content-Type', 'application/json');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-file-upload.bundle.js","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.responseText)\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.responseText, 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.responseText)\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","responseText","Error","statusText","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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"}
|
|
1
|
+
{"version":3,"file":"multi-file-upload.bundle.js","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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"}
|
|
@@ -422,13 +422,13 @@ class MultiFileUpload extends ConfigurableComponent {
|
|
|
422
422
|
$message.innerHTML = this.getSuccessHtml(xhr.response.success);
|
|
423
423
|
this.$status.textContent = xhr.response.success.messageText;
|
|
424
424
|
$actions.append(this.getDeleteButton(xhr.response.file));
|
|
425
|
-
this.config.hooks.exitHook(this, file, xhr, xhr.
|
|
425
|
+
this.config.hooks.exitHook(this, file, xhr, xhr.statusText);
|
|
426
426
|
};
|
|
427
427
|
const onError = () => {
|
|
428
428
|
const error = new Error(xhr.response && 'error' in xhr.response ? xhr.response.error.message : xhr.statusText || 'Upload failed');
|
|
429
429
|
$message.innerHTML = this.getErrorHtml(error);
|
|
430
430
|
this.$status.textContent = error.message;
|
|
431
|
-
this.config.hooks.errorHook(this, file, xhr, xhr.
|
|
431
|
+
this.config.hooks.errorHook(this, file, xhr, xhr.statusText, error);
|
|
432
432
|
};
|
|
433
433
|
xhr.addEventListener('load', onLoad);
|
|
434
434
|
xhr.addEventListener('error', onError);
|
|
@@ -465,7 +465,7 @@ class MultiFileUpload extends ConfigurableComponent {
|
|
|
465
465
|
}
|
|
466
466
|
const $rowDelete = $rows.find($row => $row.contains($button));
|
|
467
467
|
if ($rowDelete) $rowDelete.remove();
|
|
468
|
-
this.config.hooks.deleteHook(this, undefined, xhr, xhr.
|
|
468
|
+
this.config.hooks.deleteHook(this, undefined, xhr, xhr.statusText);
|
|
469
469
|
});
|
|
470
470
|
xhr.open('POST', this.config.deleteUrl);
|
|
471
471
|
xhr.setRequestHeader('Content-Type', 'application/json');
|