q2-tecton-elements 1.52.1 → 1.52.2
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/dist/cjs/click-elsewhere_2.cjs.entry.js +2 -13
- package/dist/cjs/click-elsewhere_2.cjs.entry.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/q2-action-group.cjs.entry.js +38 -14
- package/dist/cjs/q2-action-group.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-calendar.cjs.entry.js +18 -15
- package/dist/cjs/q2-calendar.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-dropdown.cjs.entry.js +1 -3
- package/dist/cjs/q2-dropdown.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-pill.cjs.entry.js +1 -1
- package/dist/cjs/q2-pill.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-select.cjs.entry.js +3 -4
- package/dist/cjs/q2-select.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-tag.cjs.entry.js +1 -2
- package/dist/cjs/q2-tag.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
- package/dist/collection/components/q2-action-group/q2-action-group.js +41 -14
- package/dist/collection/components/q2-action-group/q2-action-group.js.map +1 -1
- package/dist/collection/components/q2-action-group/test/q2-action-group.spec.js +97 -65
- package/dist/collection/components/q2-action-group/test/q2-action-group.spec.js.map +1 -1
- package/dist/collection/components/q2-calendar/q2-calendar.js +22 -17
- package/dist/collection/components/q2-calendar/q2-calendar.js.map +1 -1
- package/dist/collection/components/q2-calendar/test/q2-calendar-test.e2e.js +0 -27
- package/dist/collection/components/q2-calendar/test/q2-calendar-test.e2e.js.map +1 -1
- package/dist/collection/components/q2-dropdown/q2-dropdown.js +5 -9
- package/dist/collection/components/q2-dropdown/q2-dropdown.js.map +1 -1
- package/dist/collection/components/q2-dropdown/test/q2-dropdown-test.e2e.js +14 -59
- package/dist/collection/components/q2-dropdown/test/q2-dropdown-test.e2e.js.map +1 -1
- package/dist/collection/components/q2-pill/q2-pill.js +5 -2
- package/dist/collection/components/q2-pill/q2-pill.js.map +1 -1
- package/dist/collection/components/q2-pill/test/q2-pill-test.e2e.js +0 -49
- package/dist/collection/components/q2-pill/test/q2-pill-test.e2e.js.map +1 -1
- package/dist/collection/components/q2-popover/q2-popover.js +3 -16
- package/dist/collection/components/q2-popover/q2-popover.js.map +1 -1
- package/dist/collection/components/q2-select/q2-select.js +3 -5
- package/dist/collection/components/q2-select/q2-select.js.map +1 -1
- package/dist/collection/components/q2-select/test/q2-select-test.e2e.js.map +1 -1
- package/dist/collection/components/q2-tag/q2-tag.js +5 -4
- package/dist/collection/components/q2-tag/q2-tag.js.map +1 -1
- package/dist/collection/components/q2-tag/test/q2-tag-test.e2e.js +0 -49
- package/dist/collection/components/q2-tag/test/q2-tag-test.e2e.js.map +1 -1
- package/dist/components/q2-action-group.js +40 -14
- package/dist/components/q2-action-group.js.map +1 -1
- package/dist/components/q2-calendar.js +18 -16
- package/dist/components/q2-calendar.js.map +1 -1
- package/dist/components/q2-dropdown.js +1 -4
- package/dist/components/q2-dropdown.js.map +1 -1
- package/dist/components/q2-pill.js +1 -1
- package/dist/components/q2-pill.js.map +1 -1
- package/dist/components/q2-popover2.js +3 -15
- package/dist/components/q2-popover2.js.map +1 -1
- package/dist/components/q2-select2.js +3 -5
- package/dist/components/q2-select2.js.map +1 -1
- package/dist/components/q2-tag.js +1 -3
- package/dist/components/q2-tag.js.map +1 -1
- package/dist/esm/click-elsewhere_2.entry.js +2 -13
- package/dist/esm/click-elsewhere_2.entry.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/q2-action-group.entry.js +38 -14
- package/dist/esm/q2-action-group.entry.js.map +1 -1
- package/dist/esm/q2-calendar.entry.js +18 -15
- package/dist/esm/q2-calendar.entry.js.map +1 -1
- package/dist/esm/q2-dropdown.entry.js +1 -3
- package/dist/esm/q2-dropdown.entry.js.map +1 -1
- package/dist/esm/q2-pill.entry.js +1 -1
- package/dist/esm/q2-pill.entry.js.map +1 -1
- package/dist/esm/q2-select.entry.js +3 -4
- package/dist/esm/q2-select.entry.js.map +1 -1
- package/dist/esm/q2-tag.entry.js +1 -2
- package/dist/esm/q2-tag.entry.js.map +1 -1
- package/dist/esm/q2-tecton-elements.js +1 -1
- package/dist/q2-tecton-elements/click-elsewhere_2.entry.js +21 -33
- package/dist/q2-tecton-elements/click-elsewhere_2.entry.js.map +1 -1
- package/dist/q2-tecton-elements/q2-action-group.entry.js +58 -32
- package/dist/q2-tecton-elements/q2-action-group.entry.js.map +1 -1
- package/dist/q2-tecton-elements/q2-calendar.entry.js +259 -256
- package/dist/q2-tecton-elements/q2-calendar.entry.js.map +1 -1
- package/dist/q2-tecton-elements/q2-dropdown.entry.js +6 -8
- package/dist/q2-tecton-elements/q2-dropdown.entry.js.map +1 -1
- package/dist/q2-tecton-elements/q2-pill.entry.js +13 -13
- package/dist/q2-tecton-elements/q2-pill.entry.js.map +1 -1
- package/dist/q2-tecton-elements/q2-select.entry.js +6 -7
- package/dist/q2-tecton-elements/q2-select.entry.js.map +1 -1
- package/dist/q2-tecton-elements/q2-tag.entry.js +12 -13
- package/dist/q2-tecton-elements/q2-tag.entry.js.map +1 -1
- package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
- package/dist/q2-tecton-elements/q2-tecton-elements.esm.js.map +1 -1
- package/dist/types/components/q2-action-group/q2-action-group.d.ts +4 -0
- package/dist/types/components/q2-calendar/q2-calendar.d.ts +10 -5
- package/dist/types/components/q2-dropdown/q2-dropdown.d.ts +6 -2
- package/dist/types/components/q2-pill/q2-pill.d.ts +5 -1
- package/dist/types/components/q2-popover/q2-popover.d.ts +0 -1
- package/dist/types/components/q2-select/q2-select.d.ts +1 -1
- package/dist/types/components/q2-tag/q2-tag.d.ts +6 -2
- package/dist/types/components.d.ts +8 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["formatDateISO","value","date","Date","isValidDate","formatISO","representation","memoizedFormatDateShort","formatDateShort","isoDate","toISOString","Intl","DateTimeFormat","month","day","year","timeZone","resolvedOptions","format","memoizedFormatDateLong","formatDateLong","memoizedFormatDateFull","formatDateFull","weekday","convertMomentFormat","stringFormat","replace","stringToDate","isString","undefined","result","dateParts","split","map","part","padStart","isIsoString","length","isCompleteDate","isPartialDate","isStandardSlashDate","includes","unshift","pop","UTC","parseInt","now","yearNumber","monthNumber","dayNumber","getFullYear","removeTimezoneOffset","timeZoneOffset","getTimezoneOffset","setMinutes","Math","abs","stringArrayToDate","dateArray","Array","isArray","setupMonthYear","monthIndex","getMonth","selectedYear","validateInput","input","validDays","validDates","invalidDates","startDate","endDate","formatString","assume","isValid","isAvailable","messageType","message","loc","inputDate","buildInputDate","getDate","calendarPosition","monthName","getMonths","getDay","isoString","isNotValidDate","isInvalidDate","isBeforeStartDate","isAfterEndDate","isInvalid","Number","twoDigitDay","fourDigitYear","assumeYear","monthDay","mm","dd","nowLocal","assumedYear","slice","toString","handleMissingZeros","match","sp","reorderDateString","firstDayOfWeekInMonth","getDays","getDaysOfWeek","generateDatesFromMonthYear","daysInMonth","getDaysInMonth","keys","reduce","acc","stepIndex","push","getValidDaysOfWeek","checksum","sunValid","monValid","tuesValid","wedsValid","thursValid","friValid","satValid","ret","validateAgainstChecksum","validDaysOfWeek","newDate","validateAgainstBlacklist","validateAgainstWhitelist","some","validDate","isSameDay","buildDates","selectedMonthYear","currentSelection","dateValidators","typedValue","validationFns","baseValidation","bind","generateDateList","isIncompleteDate","datesInMonth","dayInMonth","dateIndex","fn","dayState","getDayState","classList","generateClassesForCalDay","Object","assign","integer","isEmpty","isActivity","startOfMonthEmpties","addEmptiesMonthStart","endOfMonthEmpties","addEmptiesMonthEnd","isNewDateBeforeStartDate","isAfter","isNewDateAfterEndDate","isBefore","isNowAfterCutoffTime","cutOffTime","currentDate","isSelected","isToday","isStartDate","isEndDate","classes","join","monthStartDayOfWeek","addEmptyDates","monthEndDayOfWeek","emptyDate","from","to","q2CalendarCss","Q2CalendarStyle0","Q2Calendar","this","dayAbbrStrings","dayStrings","defaultFormatString","formatModifier","internalError","monthStrings","scheduledAfterRender","closeCalendar","open","focusInput","goToMonthYear","dateList","buildDateList","checkActiveCellForBlankness","onClickElsewhere","event","target","localName","stopPropagation","onDateKeydown","currentDay","dataset","generateDateFromDay","key","preventDefault","activateDay","addDays","shiftKey","find","selectDate","onDateSelection","dateCell","closest","clickedDate","onHeaderControlKeydown","hasSelectedCell","_a","calendarBody","querySelector","onInputBlur","isTypeable","daysOfWeekChecksum","setHints","defaultHintMessage","setCompleteInput","valueOnBlur","change","emit","onInputChange","onInputClick","disabled","toggleCalendar","onInputFocus","controlElement","tmpTypedValue","onInputInput","detail","onInputKeydown","dateValue","openCalendar","typeable","onInputKeyup","yyyy","validateDate","keyboardSelection","onPopupKeyup","onRefocus","btnPrevMonth","dispatchEvent","FocusEvent","readonly","invalid","success","connectedCallback","componentWillLoad","popDirectionHandler","handleAriaLabel","componentDidLoad","overrideFocus","hostElement","componentDidRender","setTimeout","forEach","defaultChangeHandler","onchange","handleClear","defaultErrorHandler","onerror","hintMessageType","hintMessage","delegateFocus","isEventFromElement","shadowRoot","focus","popoverStateHandler","defaultSuccessHandler","onsuccess","closePopover","_togglePopover","openPopover","setValue","waitForNextPaint","tableCell","calendarTable","click","typeValue","formattedDate","innerInputField","InputEvent","KeyboardEvent","ariaLabelObserver","cutoffTimeObserver","daysOfWeekChecksumObserver","endDateObserver","invalidDatesObserver","handleRenamedProp","startDateObserver","typeableChanged","valueObserver","validDatesObserver","newValue","isMoment","toDate","shortFormattedValue","canClear","clearable","computedPlaceholder","disabledMsg","buttonLabel","placeholder","currentWeeks","weeks","accum","item","index","chunkIndex","floor","ct","cutoffTime","isMomentString","test","errorList","errors","list","filter","error","concat","formattedValue","displayFormat","hintList","hints","hint","_b","selectedDate","selectedCell","toggleElement","btnCalendarToggle","focusDay","monthYear","calendarDays","h","role","ref","scope","onClick","onKeyDown","elm","week","ariaLabel","class","tabindex","activeElement","tagName","hasAttribute","calendarCells","querySelectorAll","indexOfCell","indexOf","dayToFocus","cell","hintMessageElement","present","errorCode","isSelectedMonthAndYear","calculationDateList","dateValueDayOfMonth","_c","isDateValueInvalid","console","warn","renderCalendarPopover","onKeyUp","calendarLabel","label","type","btnNextMonth","btnPrevYear","btnNextYear","id","disclaimer","onFocus","renderHintField","el","renderInputField","hideLabel","optional","ariaExpanded","onChange","onInput","onBlur","_role","_preventEntry","slot","render","popoverElement","direction","popoverDirection","minHeight","popoverMinHeight","align","popoverAlignment","mode","popoverMode","block"],"sources":["src/components/q2-calendar/q2-calendar-helpers.ts","src/components/q2-calendar/q2-calendar-validation.ts","src/components/q2-calendar/q2-calendar.scss?tag=q2-calendar&encapsulation=shadow","src/components/q2-calendar/q2-calendar.tsx"],"sourcesContent":["import { isValid as isValidDate, formatISO, setMinutes } from 'date-fns';\nimport { loc } from '../../utils';\nimport { ISelectedMonthYear, InputValidation } from './q2-calendar-types';\n\nexport interface IMomentLikeObject {\n toDate(): Date;\n}\n\nexport function formatDateISO(value: string | Date) {\n const date = new Date(value);\n if (!isValidDate(date)) return;\n\n return formatISO(date, { representation: 'date' });\n}\n\nlet memoizedFormatDateShort: Intl.DateTimeFormat;\nexport function formatDateShort(value: string | Date) {\n const date = new Date(value);\n if (!isValidDate(date)) return;\n\n const isoDate = date.toISOString();\n if (!memoizedFormatDateShort) {\n memoizedFormatDateShort = new Intl.DateTimeFormat('en-US', {\n month: '2-digit',\n day: '2-digit',\n year: 'numeric',\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n }\n\n return memoizedFormatDateShort.format(new Date(isoDate));\n}\n\nlet memoizedFormatDateLong: Intl.DateTimeFormat;\nexport function formatDateLong(value: string | Date) {\n const date = new Date(value);\n if (!isValidDate(date)) return;\n if (!memoizedFormatDateLong) {\n memoizedFormatDateLong = new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n }\n\n return memoizedFormatDateLong.format(date);\n}\n\nlet memoizedFormatDateFull: Intl.DateTimeFormat;\nexport function formatDateFull(value: string | Date) {\n if (!value) return;\n const date = new Date(value);\n if (!isValidDate(date)) return;\n if (!memoizedFormatDateFull) {\n memoizedFormatDateFull = new Intl.DateTimeFormat('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n weekday: 'long',\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n }\n\n return memoizedFormatDateFull.format(date);\n}\n\nexport function convertMomentFormat(stringFormat: string) {\n return stringFormat\n .replace(/[d]/g, 'E')\n .replace(/[D]/g, 'd')\n .replace(/[Y]/g, 'y')\n .replace(/[l]/g, 'P')\n .replace(/[W]/g, 'I');\n}\n\nexport function stringToDate(date: string | null | void): Date | undefined {\n const isString = typeof date === 'string';\n if (!isString && date && isValidDate(new Date(date || undefined))) {\n date = formatDateISO(date);\n } else if (!date || !isValidDate(new Date(date))) {\n return undefined;\n }\n\n let result: Date;\n const dateParts = date.split(/[\\/\\-]/).map(part => part.padStart(2, '0'));\n const isIsoString = isString && date.length >= 24 && date[10] === 'T';\n const isCompleteDate = dateParts.length === 3;\n const isPartialDate = dateParts.length < 3;\n if (isIsoString) {\n date = date.split('T')[0];\n result = new Date(date);\n } else if (isCompleteDate) {\n const isStandardSlashDate = date.includes('/') && dateParts[2].length === 4;\n\n // Reorder mm/dd/yyyy dates for ISO formatting\n // [mm, dd, yyyy] -> [yyyy, mm, dd]\n if (isStandardSlashDate) dateParts.unshift(dateParts.pop());\n\n result = new Date(Date.UTC(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2])));\n } else if (isPartialDate) {\n const now = new Date();\n\n let yearNumber: number;\n let monthNumber: string;\n let dayNumber: string;\n switch (dateParts.length) {\n case 1:\n yearNumber = now.getFullYear();\n monthNumber = dateParts[0];\n dayNumber = '01';\n break;\n\n case 2:\n yearNumber = now.getFullYear();\n monthNumber = dateParts[0];\n dayNumber = dateParts[1];\n break;\n }\n\n result = new Date(`${yearNumber}-${monthNumber}-${dayNumber}`);\n }\n\n if (!isValidDate(result)) return undefined;\n\n // result = setHours(result, 0);\n result = removeTimezoneOffset(result);\n\n return isValidDate(result) ? result : undefined;\n}\n\nexport function removeTimezoneOffset(date: Date) {\n const timeZoneOffset = date.getTimezoneOffset();\n // Minutes compensation for some timezones like India, Central Australia and etc use GMT+5:30, GMT+9:30\n return setMinutes(date, timeZoneOffset + Math.abs(timeZoneOffset % 60));\n}\n\nexport function stringArrayToDate(dateArray: string[]): Date[] {\n if (!Array.isArray(dateArray) || dateArray.length === 0) {\n return [];\n }\n return dateArray.map(date => stringToDate(date));\n}\n\nexport function setupMonthYear(value: Date | undefined = new Date()): ISelectedMonthYear {\n return {\n monthIndex: value.getMonth(),\n selectedYear: value.getFullYear(),\n };\n}\n\nexport function validateInput(\n input: string = '',\n validDays: number[] = [],\n validDates: string[] = [], // white list\n invalidDates: string[] = [], // black list\n startDate: string,\n endDate: string,\n formatString: string = 'mm/dd/yyyy',\n assume: string\n): InputValidation {\n let isValid: boolean = true;\n let isAvailable: boolean = false;\n let messageType: string = 'info';\n let message: string = `${loc('tecton.element.calendar.hint.format')}: ${formatString}`;\n if (!input) {\n return { isValid, inputDate: new Date(''), isAvailable, messageType, message };\n }\n\n const inputDate = buildInputDate(input, assume);\n const month = inputDate.getMonth() + 1;\n const date = inputDate.getDate();\n const year = inputDate.getFullYear();\n const calendarPosition = [month, date, year];\n\n if (isValidDate(inputDate)) {\n const monthName = getMonths()[inputDate.getMonth()];\n\n if (input.length === 10) {\n isValid = true;\n messageType = null;\n message = null;\n }\n\n isAvailable = validDays.includes(inputDate.getDay());\n const isoString = formatDateISO(inputDate);\n\n if (isAvailable) {\n const isNotValidDate = validDates.length && !validDates.includes(isoString);\n const isInvalidDate = invalidDates.length && invalidDates.includes(isoString);\n const isBeforeStartDate = startDate && startDate > isoString;\n const isAfterEndDate = endDate && endDate < isoString;\n\n if (isNotValidDate || isInvalidDate || isBeforeStartDate || isAfterEndDate) {\n isAvailable = false;\n }\n }\n\n if (input.length >= 5 && !isAvailable) {\n isValid = false;\n messageType = 'error';\n const isInvalid = !monthName || !date || !year;\n message = isInvalid\n ? `${loc('tecton.element.calendar.hint.invalidDate')}: ${formatString}`\n : loc('tecton.element.calendar.hint.notAvailableDate', [formatDateLong(inputDate)]);\n }\n } else {\n isValid = false;\n messageType = 'error';\n message = `${loc('tecton.element.calendar.hint.invalidDate')}: ${formatString}`;\n }\n\n return {\n isValid,\n messageType,\n message,\n inputDate,\n isAvailable,\n calendarPosition,\n };\n}\n\nexport function buildInputDate(input: string, assume: string) {\n const now = new Date();\n // eslint-disable-next-line prefer-const\n let [month, day, year] = input.split('/');\n if (month === '0') month = '01';\n if (day === '0') day = '01';\n if (input.length === 10) {\n return new Date(input);\n } else if (month && day && Number(day) > 0) {\n const twoDigitDay = Number(day) < 10 ? `0${Number(day)}` : day;\n const fourDigitYear = !year || year.length < 4 ? assumeYear(month, day, assume) : year;\n return new Date(`${month}/${twoDigitDay}/${fourDigitYear}`);\n } else if (month) {\n return new Date(`${month}/01/${now.getFullYear()}`);\n }\n}\n\nfunction assumeYear(month: string, day: string, assume: string): string {\n const monthDay = `${month}/${day}`;\n const now = new Date();\n const mm: string = now.getMonth() < 9 ? `0${now.getMonth() + 1}` : `${now.getMonth() + 1}`;\n const dd: string = now.getDate() < 10 ? `0${now.getDate()}` : `${now.getDate()}`;\n const nowLocal = `${mm}/${dd}/${now.getFullYear()}`;\n let assumedYear = now.getFullYear();\n if (assume === 'future' && nowLocal.slice(0, 5) > monthDay) {\n assumedYear = now.getFullYear() + 1;\n } else if (assume === 'past' && nowLocal.slice(0, 5) < monthDay) {\n assumedYear = now.getFullYear() - 1;\n }\n return assumedYear.toString();\n}\n\nexport function handleMissingZeros(input): string {\n if (!input) {\n return '';\n }\n if (input.match(/^[1-9]\\/$/)) {\n return `0${input}/`;\n } else if (input.match(/^[0-9]{2}\\/[1-9]{1}\\/$/)) {\n const sp = input.split('/');\n return `${sp[0]}/0${sp[1]}/`;\n }\n return input;\n}\n\nexport function reorderDateString(input: string): string {\n const dateParts = (input || '').split('-');\n if (dateParts.length !== 3) return '';\n return `${dateParts[1]}/${dateParts[2]}/${dateParts[0]}`;\n}\n\nexport function firstDayOfWeekInMonth(month: number, year: number): number {\n return new Date(year, month, 1, 1, 1, 1, 1).getDay();\n}\n\nexport function getDays(): string[] {\n return [\n loc('tecton.element.calendar.days.short.Sunday'),\n loc('tecton.element.calendar.days.short.Monday'),\n loc('tecton.element.calendar.days.short.Tuesday'),\n loc('tecton.element.calendar.days.short.Wednesday'),\n loc('tecton.element.calendar.days.short.Thursday'),\n loc('tecton.element.calendar.days.short.Friday'),\n loc('tecton.element.calendar.days.short.Saturday'),\n ];\n}\n\nexport function getDaysOfWeek(): string[] {\n return [\n loc('tecton.element.calendar.days.Sunday'),\n loc('tecton.element.calendar.days.Monday'),\n loc('tecton.element.calendar.days.Tuesday'),\n loc('tecton.element.calendar.days.Wednesday'),\n loc('tecton.element.calendar.days.Thursday'),\n loc('tecton.element.calendar.days.Friday'),\n loc('tecton.element.calendar.days.Saturday'),\n ];\n}\n\nexport function getMonths(): string[] {\n return [\n loc('tecton.element.calendar.months.January'),\n loc('tecton.element.calendar.months.February'),\n loc('tecton.element.calendar.months.March'),\n loc('tecton.element.calendar.months.April'),\n loc('tecton.element.calendar.months.May'),\n loc('tecton.element.calendar.months.June'),\n loc('tecton.element.calendar.months.July'),\n loc('tecton.element.calendar.months.August'),\n loc('tecton.element.calendar.months.September'),\n loc('tecton.element.calendar.months.October'),\n loc('tecton.element.calendar.months.November'),\n loc('tecton.element.calendar.months.December'),\n ];\n}\n","import { firstDayOfWeekInMonth } from './q2-calendar-helpers';\nimport { getDaysInMonth, isSameDay, isBefore, isAfter, isValid as isValidDate } from 'date-fns';\nimport { CalendarDay, DateEmpty, Year, IDateValidators, ISelectedMonthYear } from './q2-calendar-types';\n\n// Validation Helpers\nexport type DateList = CalendarDay[];\nexport type IsValid = boolean;\nexport type IsActivityDate = boolean;\nexport type DateValidation = (date: Date) => IsValid;\n\nexport function generateDatesFromMonthYear(month: number, year: Year): Date[] {\n const daysInMonth = getDaysInMonth(new Date(year, month));\n\n return [...Array(daysInMonth).keys()].reduce((acc, stepIndex) => {\n acc.push(new Date(year, month, stepIndex + 1));\n return acc;\n }, []);\n}\n\nexport function getValidDaysOfWeek(checksum: number = 127): number[] {\n /* tslint:disable:no-bitwise */\n const sunValid = checksum & 1;\n const monValid = checksum & 2;\n const tuesValid = checksum & 4;\n const wedsValid = checksum & 8;\n const thursValid = checksum & 16;\n const friValid = checksum & 32;\n const satValid = checksum & 64;\n /* tslint:enable:no-bitwise */\n const ret = [];\n\n if (checksum <= 0) return ret;\n if (sunValid) ret.push(0);\n if (monValid) ret.push(1);\n if (tuesValid) ret.push(2);\n if (wedsValid) ret.push(3);\n if (thursValid) ret.push(4);\n if (friValid) ret.push(5);\n if (satValid) ret.push(6);\n\n return ret;\n}\n\nexport function validateAgainstChecksum(validDaysOfWeek: number[], newDate: Date): IsValid {\n return validDaysOfWeek.includes(newDate.getDay());\n}\n\nexport function validateAgainstBlacklist(invalidDates: Date[], newDate: Date): IsValid {\n return !validateAgainstWhitelist(invalidDates, newDate);\n}\n\nexport function validateAgainstWhitelist(validDates: Date[], newDate: Date): IsValid {\n return validDates.some(validDate => isSameDay(validDate, newDate));\n}\n\nexport function buildDates(\n validDaysOfWeek: number[],\n validDates: Date[],\n invalidDates: Date[],\n selectedMonthYear: ISelectedMonthYear,\n currentSelection: Date | undefined,\n dateValidators: IDateValidators,\n typedValue: string\n): DateList {\n const validationFns = [baseValidation.bind(null, dateValidators, new Date())];\n if (validDates?.length) {\n validationFns.push(validateAgainstWhitelist.bind(null, validDates));\n } else {\n validationFns.push(validateAgainstChecksum.bind(null, validDaysOfWeek));\n }\n validationFns.push(validateAgainstBlacklist.bind(null, invalidDates));\n\n return generateDateList(selectedMonthYear, currentSelection, dateValidators, validationFns, typedValue);\n}\n\nexport function generateDateList(\n { monthIndex, selectedYear }: ISelectedMonthYear,\n currentSelection: Date | undefined,\n dateValidators: IDateValidators,\n validationFns: DateValidation[],\n typedValue: string\n): DateList {\n const isIncompleteDate = !isValidDate(new Date(typedValue));\n const datesInMonth = generateDatesFromMonthYear(monthIndex, selectedYear).map((dayInMonth, dateIndex) => {\n const isInvalid = validationFns.some(fn => !fn(dayInMonth));\n const dayState = getDayState(dayInMonth, dateValidators, currentSelection);\n const classList = generateClassesForCalDay({\n ...dayState,\n isInvalid,\n isIncompleteDate,\n });\n\n return {\n ...dayState,\n isValid: !isInvalid,\n date: dayInMonth,\n integer: dateIndex + 1,\n isEmpty: false,\n isActivity: false,\n classList,\n };\n });\n\n const startOfMonthEmpties = addEmptiesMonthStart(firstDayOfWeekInMonth(monthIndex, selectedYear));\n const endOfMonthEmpties = addEmptiesMonthEnd((startOfMonthEmpties.length + datesInMonth.length) % 7);\n\n return [...startOfMonthEmpties, ...datesInMonth, ...endOfMonthEmpties] as CalendarDay[];\n}\n\nexport function baseValidation(dateValidators: IDateValidators, now: Date, newDate: Date): boolean {\n const isNewDateBeforeStartDate = isAfter(dateValidators?.startDate, newDate);\n const isNewDateAfterEndDate = isBefore(dateValidators?.endDate, newDate);\n const isNowAfterCutoffTime = isSameDay(now, newDate) && isAfter(now, dateValidators?.cutOffTime);\n\n return !(isNewDateBeforeStartDate || isNowAfterCutoffTime || isNewDateAfterEndDate);\n}\n\nexport function getDayState(dayInMonth: Date, dateValidators: IDateValidators, currentDate: Date | undefined) {\n if (!currentDate) currentDate = new Date();\n const isSelected = currentDate && isSameDay(currentDate, dayInMonth);\n const isToday = isSameDay(dayInMonth, new Date());\n const isStartDate = isSameDay(dayInMonth, dateValidators?.startDate);\n const isEndDate = isSameDay(dayInMonth, dateValidators?.endDate);\n\n return { isSelected, isToday, isStartDate, isEndDate };\n}\n\nexport function generateClassesForCalDay({\n isInvalid,\n isSelected,\n isEndDate,\n isStartDate,\n isToday,\n isIncompleteDate,\n}: {\n isInvalid: boolean;\n isSelected: boolean;\n isEndDate: boolean;\n isStartDate: boolean;\n isToday: boolean;\n isIncompleteDate: boolean;\n}): string {\n const classes = [];\n if (!isInvalid) classes.push('is-valid');\n if (isSelected) classes.push('is-selected');\n if (isEndDate) classes.push('is-end-date');\n if (isStartDate) classes.push('is-start-date');\n if (isToday) classes.push('is-today');\n if (isSelected && isInvalid && !isIncompleteDate) classes.push('is-unavailable');\n\n return classes.join(' ');\n}\n\nexport function addEmptiesMonthStart(monthStartDayOfWeek: number): DateEmpty[] {\n return addEmptyDates(0, monthStartDayOfWeek);\n}\n\nexport function addEmptiesMonthEnd(monthEndDayOfWeek: number): DateEmpty[] {\n if (monthEndDayOfWeek === 0) return [];\n return addEmptyDates(monthEndDayOfWeek, 7);\n}\n\nexport const emptyDate: DateEmpty = {\n date: null,\n integer: null,\n isActivity: false,\n isEmpty: true,\n isValid: false,\n isToday: false,\n isSelected: false,\n isStartDate: false,\n isEndDate: false,\n classList: '',\n};\n\nexport function addEmptyDates(from: number, to: number): DateEmpty[] {\n if (from === 7) from = 0;\n return [...Array(to - from).keys()].map(() => ({ ...emptyDate }) as DateEmpty);\n}\n","@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n:host {\n display: block;\n}\n\n:host[hidden] {\n display: none;\n}\n\nclick-elsewhere {\n position: relative;\n display: block;\n}\n\nq2-input {\n margin: 0;\n cursor: pointer;\n}\n\nq2-popover {\n --comp-min-tappable-size: 44px;\n --comp-table-border-spacing: 2px;\n --comp-min-tappable-size-and-spacing: calc(var(--comp-min-tappable-size) + var(--comp-table-border-spacing));\n --comp-popover-padding: #{var-list(var-prefixer(calendar-popover-padding), --app-scale-1x, 5px)};\n --comp-min-table-width: calc(var(--comp-min-tappable-size-and-spacing) * 7);\n --comp-table-container-border-spacing: calc(var(--comp-table-border-spacing) * 2);\n --comp-popover-total-padding: calc(var(--comp-popover-padding) * 2);\n\n --tct-popover-min-width: calc(\n var(--comp-min-table-width) + var(--comp-table-container-border-spacing) + var(--comp-popover-total-padding)\n );\n}\n\n.calendar-field-popup {\n padding: var(--comp-popover-padding);\n}\n\n.calendar-label {\n --comp-label-padding: #{var-list(\n --tct-calendar-label-padding,\n unquote('#{var-list(var-prefixer(calendar-label-vertical-padding), --tct-scale-2, --app-scale-2x, 10px)} 0')\n )};\n font-size: var-list(var-prefixer(calendar-label-font-size), 16px);\n flex: 1 1;\n flex-basis: calc(100% - var-list(--tct-btn-icon-width, 44px));\n margin: 0;\n padding: var(--comp-label-padding);\n}\n\n.cal-month-heading {\n padding: 0 0 0.75rem;\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: var-list(var-prefixer(calendar-month-font-size), 16px);\n font-weight: var-list(var-prefixer(calendar-month-font-weight), 600);\n text-align: center;\n}\n\n.cal-month-text {\n min-width: 82px;\n display: inline-block;\n}\n\n.cal-year-text {\n min-width: 50px;\n display: inline-block;\n}\n\ntable {\n width: 100%;\n margin-bottom: 2px;\n text-align: center;\n border-spacing: var(--comp-table-border-spacing);\n}\n\nth {\n font-size: var-list(var-prefixer(calendar-day-heading-font-size), inherit);\n font-weight: var-list(var-prefixer(calendar-day-heading-font-weight), 600);\n width: 14.285714%;\n}\n\ntd {\n height: var(--comp-min-tappable-size);\n cursor: pointer;\n border: var-list(var-prefixer(calendar-day-border), 0);\n border-radius: var-list(var-prefixer(calendar-day-border-radius));\n\n &.is-unavailable {\n border: 1px solid var-list(--tct-input-error-border-color, --const-stoplight-alert, #d20a0a);\n }\n\n &.is-valid:hover {\n border: var-list(var-prefixer(calendar-day-hover-border), var-prefixer(calendar-day-border) 0);\n border-radius: var-list(\n var-prefixer(calendar-day-hover-border-radius),\n var-prefixer(calendar-day-border-radius)\n );\n\n background: var-list(\n --tct-calendar-day-hover-background,\n var-prefixer(calendar-day-hover-bg),\n --tct-gray-14,\n --app-gray14,\n --tct-gray-l4,\n --app-gray-l4,\n #f2f2f2\n );\n color: var-list(var-prefixer(calendar-day-hover-font-color), inherit);\n }\n\n &[aria-hidden],\n &[aria-disabled] {\n pointer-events: none;\n cursor: not-allowed;\n }\n\n &[aria-disabled] {\n opacity: var-list(var-prefixer(calendar-day-disabled-opacity), --app-disabled-opacity, 0.4);\n }\n\n &[aria-selected] {\n border: var-list(var-prefixer(calendar-day-selected-border), var-prefixer(calendar-day-border) 0);\n border-radius: var-list(\n var-prefixer(calendar-day-selected-border-radius),\n var-prefixer(calendar-day-border-radius)\n );\n background: var-list(\n --tct-calendar-day-selected-background,\n var-prefixer(calendar-day-selected-bg),\n --tct-calendar-day-hover-background, \n var-prefixer(calendar-day-hover-bg),\n var-prefixer(gray-14),\n --tct-gray-l4,\n --app-gray-l4,\n #f2f2f2\n );\n color: var-list(\n var-prefixer(calendar-day-selected-font-color),\n var-prefixer(calendar-day-hover-font-color),\n inherit\n );\n box-shadow: 0 0 0 2px\n var-list(\n var-prefixer(calendar-day-selected-outline-color),\n --tct-stoplight-info,\n --const-stoplight-info,\n #0079c1\n );\n \n }\n &[aria-selected]:focus {\n box-shadow: 0 0 0 2px\n var-list(\n var-prefixer(calendar-day-selected-outline-color),\n --tct-stoplight-info,\n --const-stoplight-info,\n #0079c1\n ),\n 0 0 0 4px var(--const-focus-color, #0066cc)\n }\n}\n\n.today-decorator {\n text-transform: uppercase;\n font-weight: 700;\n font-size: 10px;\n height: 12px;\n}\n\n\n.calendar-disclaimer {\n font-size: var-list(\n var-prefixer(calendar-disclaimer-font-size),\n --tct-font-size-small,\n --app-font-size-small,\n 12px\n );\n border-style: solid;\n border-width: var-list(var-prefixer(calendar-disclaimer-border-width), unquote('1px 0 0 0'));\n border-color: var-list(\n var-prefixer(calendar-disclaimer-border-color),\n var-prefixer(gray-13),\n --tct-gray-l3,\n --app-gray-l3,\n #e6e6e6\n );\n padding: var-list(--tct-calendar-disclaimer-padding, --tct-scale-2, --app-scale-2x, 10px);\n text-align: left;\n}\n","import {\n Component,\n ComponentInterface,\n Prop,\n Element,\n State,\n Event,\n EventEmitter,\n Listen,\n Watch,\n Method,\n h,\n} from '@stencil/core';\nimport { ISelectedMonthYear, CalendarDay, IDateValidators } from './q2-calendar-types';\nimport { addDays, isSameDay, format, isValid as isValidDate } from 'date-fns';\nimport {\n stringToDate,\n setupMonthYear,\n getMonths,\n getDays,\n getDaysOfWeek,\n stringArrayToDate,\n convertMomentFormat,\n validateInput,\n handleMissingZeros,\n formatDateISO,\n formatDateShort,\n IMomentLikeObject,\n removeTimezoneOffset,\n reorderDateString,\n formatDateFull,\n} from './q2-calendar-helpers';\nimport { buildDates, getValidDaysOfWeek, DateList } from './q2-calendar-validation';\nimport {\n handleAriaLabel,\n loc,\n overrideFocus,\n isEventFromElement,\n handleRenamedProp,\n waitForNextPaint,\n} from '../../utils';\nimport { IEventDetail } from '../q2-input/q2-input-types';\nimport { Q2InputCustomEvent } from 'src/components';\n\n@Component({ tag: 'q2-calendar', shadow: true, styleUrl: 'q2-calendar.scss' })\nexport class Q2Calendar implements ComponentInterface {\n // #region Own Properties\n\n btnCalendarToggle: HTMLQ2BtnElement;\n btnNextMonth: HTMLQ2BtnElement;\n btnNextYear: HTMLQ2BtnElement;\n btnPrevMonth: HTMLQ2BtnElement;\n btnPrevYear: HTMLQ2BtnElement;\n calendarBody: HTMLDivElement;\n calendarTable: HTMLTableElement;\n dayAbbrStrings = getDays();\n dayStrings = getDaysOfWeek();\n defaultFormatString = 'mm/dd/yyyy';\n formatModifier: string = 'M/D/YYYY'; // To allow missing leading zero, 4/3/2021 => converts into 04/03/2021\n hintMessageElement: HTMLQ2MessageElement;\n internalError: string = '';\n monthStrings = getMonths();\n popoverElement?: HTMLQ2PopoverElement;\n scheduledAfterRender: (() => void)[] = [];\n selectedMonthYear: ISelectedMonthYear;\n valueOnBlur: string | { toDate(): Date };\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n hostElement: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n controlElement: HTMLQ2InputElement;\n\n @State()\n dateList: CalendarDay[];\n\n @State()\n hintMessage: string = this.defaultHintMessage;\n\n @State()\n hintMessageType: 'info' | 'error' = 'info';\n\n @State()\n keyboardSelection: boolean = false;\n\n @State()\n typedValue: string = '';\n\n // #endregion\n // #region Public Property API\n\n /** @deprecated */\n @Prop({ reflect: true, mutable: true })\n ariaLabel: string;\n\n /**\n * Detects the year automatically based on today's date when the user presses the `Escape` key or the `Blur` mouse event occurs.\n * Setting `future` or `past` as the value will increase or decrease the year by one, respectively.\n */\n @Prop({ reflect: true })\n assume: 'current' | 'future' | 'past' = 'current';\n\n /** @deprecated */\n @Prop({ reflect: true })\n buttonLabel: string;\n\n /** A label shown at the top of the popover date picker. */\n @Prop({ reflect: true })\n calendarLabel: string;\n\n /** Display a button in the input field allowing the user to clear their selection. */\n @Prop({ reflect: true })\n clearable: boolean;\n\n /**\n * Specifies a time of day after which a date is no longer valid.\n *\n * @warning\n * Must be a valid ISO date string.\n */\n @Prop({ reflect: true })\n cutoffTime: string;\n\n /**\n * The most concise way to define valid days of the week for calendar. Each day of the week has a checksum value:\n *\n * - Sunday = 1\n * - Monday = 2\n * - Tuesday = 4\n * - Wednesday = 8\n * - Thursday = 16\n * - Friday = 32\n * - Saturday = 64\n *\n * Add the checksum values of your desired valid days together, and set `daysOfWeekChecksum` to that summed value.\n *\n * **Example:**\n * @snippet\n * element.daysOfWeekChecksum = 127 // All days of the week are valid\n * element.daysOfWeekChecksum = 62; // Only weekdays are valid\n * element.daysOfWeekChecksum = 65; // Only Saturday and Sunday are valid\n *\n */\n @Prop({ reflect: true })\n daysOfWeekChecksum: number;\n\n /** Disable the input field. */\n @Prop({ reflect: true })\n disabled: boolean;\n\n /**\n * Text that displays as the placeholder when the field is marked `disabled`.\n * @localizable\n */\n @Prop({ reflect: true })\n disabledMsg: string;\n\n /** Text that appears at the bottom of the popover date picker. */\n @Prop({ reflect: true })\n disclaimer: string;\n\n /**\n * Determines the display format of the date field value.\n *\n * Must follow the [date-fns](https://date-fns.org/v2.28.0/docs/format) token specification.\n */\n @Prop({ reflect: true })\n displayFormat: string;\n\n /**\n * Defines the last selectable date in the date picker popover.\n *\n * @warning\n * Must be a valid ISO date string.\n */\n @Prop({ reflect: true })\n endDate: string;\n\n /**\n * Each item in the `errors` array will appear below the input field when the field is focused and `typeable` is `true`.\n * @localizable\n */\n @Prop({ mutable: true })\n errors: string[];\n\n /** Hide the input field's ` <label> ` element from view. */\n @Prop({ reflect: true, mutable: true })\n hideLabel: boolean;\n\n /**\n * Each item in the `hints` array will appear below the input field when the field is focused and `typeable` is true.\n * @localizable\n */\n @Prop({ mutable: true })\n hints: string[];\n\n /** Show error styles when the calendar is in an errant state. */\n @Prop({ reflect: true, mutable: true })\n invalid: boolean;\n\n /**\n * Defines an explicit date blacklist.\n *\n * @warning\n * Must be a valid ISO date string.\n *\n * @info\n * When explicit date definitions like `invalidDates` is used, other date validity methods like `daysOfWeekChecksum` are overriden.\n */\n @Prop()\n invalidDates: string[];\n\n /** The visible label for the `q2-calendar` input field. */\n @Prop({ reflect: true, mutable: true })\n label: string;\n\n /** @deprecated */\n @Prop()\n onsuccess: (e: CustomEvent) => void;\n\n /** Determine whether the popover is open or closed. */\n @Prop({ reflect: true, mutable: true })\n open: boolean;\n\n /** Appends \"(optional)\" to the label and sets `aria-required=\"false\"`. */\n @Prop({ reflect: true })\n optional: boolean;\n\n /**\n * Text that appears within the input field when it is blurred and empty.\n * Placeholder text disappears when the user focuses on the field and provides input.\n */\n @Prop({ reflect: true })\n placeholder: string;\n\n /** @deprecated */\n @Prop({ reflect: true })\n popDirection: 'up' | 'down';\n\n /** Aligns the popover date picker to the left or right side of the input field. */\n @Prop()\n popoverAlignment: 'left' | 'right';\n\n /**\n * Force the direction of the popover date picker when it opens.\n * If no value is passed, the component will auto-detect the direction based on available space.\n */\n @Prop({ mutable: true })\n popoverDirection: 'up' | 'down';\n\n /** @deprecated */\n @Prop()\n popoverMinHeight: number = 355;\n\n /**\n * Determines the display mode of the popover.\n *\n * Providing a value of `legacy` instructs the popover to use absolute positioning instead of fixed positioning.\n *\n * @info\n * This is a temporary solution to work around styling issues related to using fixed positioning for the popover\n * when nested inside of elements with transform properties. This will be removed once the popover API is available\n * for use.\n */\n @Prop({ mutable: true })\n popoverMode: 'legacy' = null;\n\n /**\n * The field's content is not editable, but the field remains focusable.\n *\n * Appends \"(readonly)\" to the field label. Supersedes `optional` if both are `true`.\n */\n @Prop({ reflect: true })\n readonly: boolean;\n\n /**\n * Defines the first selectabe date in the date picker popover.\n *\n * @warning\n * Must be a valid ISO date string.\n */\n @Prop({ reflect: true })\n startDate: string;\n\n /** The user can type in the field. Only available in desktop browsers. */\n @Prop({ reflect: true })\n typeable: boolean;\n\n /**\n * Defines an explicit date whitelist.\n *\n * @warning\n * Must be a valid ISO date string.\n *\n * @info\n * When explicit date definitions like `validDates` is used, other date validity methods like `daysOfWeekChecksum` are overriden.\n */\n @Prop()\n validDates: string[];\n\n /**\n * The value of the `q2-calendar` element, e.g. the selected date.\n *\n * **How to change or clear the value with javascript:**\n * @snippet\n * // change date\n * element.value = '2022-12-21';\n * // clear date\n * element.value = null;\n */\n @Prop({ mutable: true, reflect: true })\n value: string | { toDate(): Date };\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when a date is selected or typed in the input field.\n * @legacyEvent\n */\n @Event()\n change: EventEmitter<{\n // ISO formatted date\n value: string | null;\n }>;\n\n /**\n * Emitted when an invalid date is entered into the field.\n */\n @Event()\n error: EventEmitter<{ errors: { message: string; errorCode: string }[] }>;\n\n /**\n * Emitted when a valid date is entered or selected.\n */\n @Event()\n success: EventEmitter<{\n // ISO formatted date\n value: string;\n }>;\n\n // #endregion\n // #region Component Lifecycle Events\n\n connectedCallback() {\n this.selectedMonthYear = setupMonthYear(this.dateValue);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n if (this.value && this.isTypeable && !this.typedValue) {\n this.typedValue = reorderDateString(this.value as string);\n }\n this.validateDate();\n }\n\n componentWillLoad() {\n this.popDirectionHandler();\n handleAriaLabel(this);\n }\n\n componentDidLoad(): void {\n overrideFocus(this.hostElement);\n }\n\n componentDidRender() {\n setTimeout(() => {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n }, 25);\n }\n\n // #endregion\n // #region Listeners\n\n @Listen('change')\n defaultChangeHandler(event: CustomEvent) {\n if (event.target === this.hostElement && !this.hostElement.onchange && !!event.detail) {\n this.value = event.detail.value;\n }\n }\n\n @Listen('clear')\n handleClear() {\n this.change.emit({ value: null });\n this.value = null;\n this.typedValue = '';\n }\n\n @Listen('error')\n defaultErrorHandler(event: CustomEvent) {\n if (event.target === this.hostElement && !this.hostElement.onerror) {\n if (this.hintMessageType === 'error' && this.hintMessage) {\n this.internalError = this.hintMessage;\n } else {\n this.internalError = loc('tecton.element.calendar.hint.invalidDate');\n }\n }\n }\n\n @Listen('focus')\n delegateFocus(event: FocusEvent) {\n if (!isEventFromElement(event, this.hostElement)) return;\n this.controlElement.shadowRoot.querySelector<HTMLElement>('.input-field').focus();\n }\n\n @Listen('popoverStateChanged')\n popoverStateHandler({ detail: { open } }: CustomEvent<{ open: boolean }>) {\n if (this.open !== open) this.open = open;\n }\n\n @Listen('success')\n defaultSuccessHandler(event: CustomEvent) {\n if (event.target !== this.hostElement) {\n return;\n }\n\n if (typeof this.onsuccess === 'function') {\n this.onsuccess(event);\n } else {\n this.internalError = '';\n if (this.hintMessageType === 'error' && this.hintMessage) {\n this.hintMessage = null;\n this.hintMessageType = null;\n this.invalid = false;\n }\n }\n }\n\n // #endregion\n // #region Public Methods API\n\n /**\n * Emulates clicking the `<input>` to hide the popover if it is visible.\n *\n * @testOnly\n */\n @Method()\n async closePopover() {\n if (!this.open) return;\n this._togglePopover();\n }\n\n /**\n * Emulates clicking the `<input>` to display the popover if it is hidden.\n *\n * @testOnly\n */\n @Method()\n async openPopover() {\n if (this.open) return;\n this._togglePopover();\n }\n\n /**\n * Emulates clicking the `<input>` to display the popover, moving to the correct month and year, and clicking the\n * provided date.\n *\n * While a `string` value can be passed, we recommended passing a `Date` object. If the value is invalid, the method\n * will not select the date.\n *\n * @testOnly\n */\n @Method()\n async setValue(value: string | Date) {\n const date = typeof value === 'string' ? stringToDate(value) : value;\n if (!isValidDate(date)) return;\n\n await this.openPopover();\n await waitForNextPaint();\n\n this.goToMonthYear(date.getMonth(), date.getFullYear());\n await waitForNextPaint();\n const tableCell = this.calendarTable?.querySelector<HTMLTableCellElement>(\n `td[data-date=\"${formatDateISO(date)}\"]`\n );\n tableCell?.click();\n }\n\n /**\n * Emulates focusing the `<input>`, entering the provided value, and emitting an `input` event.\n *\n * While a `string` value can be passed, we recommended passing a `Date` object. If the value is invalid, the method\n * will not select the date.\n *\n * @warning\n * Only applicable when the input is typeable.\n *\n * @testOnly\n */\n @Method()\n async typeValue(value: string | Date) {\n if (!this.typeable) return;\n\n const date = typeof value === 'string' ? stringToDate(value) : value;\n const formattedDate = formatDateShort(date);\n if (!isValidDate(date)) return;\n\n const { innerInputField, controlElement } = this;\n innerInputField.focus();\n innerInputField.dispatchEvent(new FocusEvent('focus'));\n innerInputField.value = formattedDate;\n innerInputField.dispatchEvent(new InputEvent('input'));\n controlElement.dispatchEvent(new KeyboardEvent('keyup'));\n }\n\n // #endregion\n // #region Watchers\n\n @Watch('ariaLabel')\n ariaLabelObserver() {\n handleAriaLabel(this);\n }\n\n @Watch('cutoffTime')\n cutoffTimeObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('daysOfWeekChecksum')\n daysOfWeekChecksumObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('endDate')\n endDateObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('invalidDates')\n invalidDatesObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('popDirection')\n popDirectionHandler() {\n handleRenamedProp(this, 'popDirection', 'popoverDirection');\n }\n\n @Watch('startDate')\n startDateObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('typeable')\n typeableChanged() {\n this.valueObserver(this.value);\n }\n\n @Watch('validDates')\n validDatesObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('value')\n valueObserver(newValue: string | IMomentLikeObject) {\n // resetting by empty string\n if (newValue === '') {\n this.value = undefined;\n this.setHints({ isValid: true, message: this.defaultHintMessage, messageType: 'info' });\n return;\n }\n const isMoment = newValue && typeof newValue !== 'string' && 'toDate' in newValue;\n const newDate = isMoment ? (newValue as IMomentLikeObject).toDate() : stringToDate(newValue as string);\n const shortFormattedValue = formatDateShort(newDate);\n if (this.isTypeable) {\n this.typedValue = shortFormattedValue;\n } else {\n this.controlElement.value = shortFormattedValue;\n this.selectedMonthYear = setupMonthYear(newDate);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n // reset hint when value is cleared\n if (this.invalid) return;\n\n if (shortFormattedValue) {\n this.setHints({\n isValid: true,\n message: null,\n messageType: null,\n });\n } else {\n this.setHints({ isValid: true, message: this.defaultHintMessage, messageType: 'info' });\n }\n }\n\n // #endregion\n // #region Local Methods\n\n get canClear() {\n if (this.isTypeable) {\n return this.clearable && !!this.typedValue;\n } else {\n return this.clearable && !!this.value;\n }\n }\n\n get computedPlaceholder(): string {\n if (this.disabled && this.disabledMsg) {\n return loc(this.disabledMsg);\n }\n\n if (this.buttonLabel && (this.disabled || this.placeholder)) {\n return loc(this.buttonLabel);\n }\n\n return (this.placeholder && loc(this.placeholder)) || '';\n }\n\n get currentWeeks() {\n const weeks = this.dateList.reduce<CalendarDay[][]>((accum, item, index) => {\n const chunkIndex = Math.floor(index / 7);\n\n if (!accum[chunkIndex]) {\n accum[chunkIndex] = [];\n }\n\n accum[chunkIndex].push(item);\n\n return accum;\n }, []);\n\n return weeks;\n }\n\n get dateValidators(): IDateValidators {\n const ct = new Date(this.cutoffTime || ''); // should fallback to InvalidDate\n return {\n startDate: stringToDate(this.startDate),\n endDate: stringToDate(this.endDate),\n cutOffTime: isValidDate(ct) ? ct : undefined,\n };\n }\n\n get dateValue(): Date | undefined {\n if (this.isTypeable) {\n return stringToDate(this.typedValue);\n } else {\n let { value } = this;\n const isMoment = value && typeof value !== 'string' && 'toDate' in value;\n if (isMoment) return (value as IMomentLikeObject).toDate();\n\n // stringified moment value assigned in html template e.g.) handlebar\n const isMomentString =\n typeof value === 'string' && value.split(' ').length === 6 && /GMT-\\d{4}/g.test(value);\n if (isMomentString) {\n value = formatDateISO(value as string);\n }\n\n return stringToDate(value as string);\n }\n }\n\n get defaultHintMessage() {\n return this.typeable\n ? loc('tecton.element.calendar.hint.format') + ': ' + this.defaultFormatString\n : loc('tecton.element.calendar.hint.select');\n }\n\n get errorList() {\n const { errors, internalError, invalid } = this;\n let list = [];\n if (internalError) {\n list = [internalError];\n }\n if (Array.isArray(errors) && errors.length) {\n list = errors\n .filter(error => !!error)\n .map(error => loc(error))\n .concat(list);\n } else if (!internalError && invalid) {\n return ['tecton.element.calendar.invalid'];\n }\n return list;\n }\n\n get formattedValue() {\n const { typedValue, dateValue, displayFormat, isTypeable } = this;\n if (isTypeable) return typedValue;\n\n if (dateValue === undefined) return '';\n if (displayFormat) return format(dateValue, convertMomentFormat(displayFormat));\n\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n }).format(dateValue);\n }\n\n get hintList() {\n const { hints, hintMessageType, hintMessage } = this;\n if (Array.isArray(hints) && hints.length) return hints.filter(hint => !!hint).map(hint => loc(hint));\n if (hintMessageType === 'info' && hintMessage) return [hintMessage];\n return [];\n }\n\n get innerInputField(): HTMLInputElement | HTMLButtonElement {\n return this.controlElement?.shadowRoot?.querySelector('.input-field');\n }\n\n get isTypeable(): boolean {\n return this.typeable;\n }\n\n get selectedDate() {\n const selectedCell = this.calendarBody?.querySelector<HTMLTableCellElement>('[aria-selected=\"true\"]');\n return selectedCell ? removeTimezoneOffset(new Date(selectedCell.dataset.date)) : null;\n }\n\n _togglePopover() {\n const toggleElement = this.typeable ? this.btnCalendarToggle : this.innerInputField;\n toggleElement?.click();\n toggleElement?.focus();\n toggleElement.dispatchEvent(new FocusEvent('focus'));\n }\n\n activateDay(date: Date) {\n this.goToMonthYear(date.getMonth(), date.getFullYear());\n this.scheduledAfterRender.push(() => this.focusDay(date));\n }\n\n buildDateList(monthYear: ISelectedMonthYear): DateList {\n const invalidDates = stringArrayToDate(this.invalidDates);\n const validDaysOfWeek = getValidDaysOfWeek(this.daysOfWeekChecksum);\n const validDates = stringArrayToDate(this.validDates);\n return buildDates(\n validDaysOfWeek,\n validDates,\n invalidDates,\n monthYear,\n this.dateValue,\n this.dateValidators,\n this.typedValue\n );\n }\n\n calendarDays() {\n return (\n <table\n role=\"grid\"\n aria-labelledby=\"table-label\"\n ref={ref => (this.calendarTable = ref)}\n >\n <thead>\n <tr>\n {[...Array(7).keys()].map(index => (\n <th\n scope=\"col\"\n aria-label={this.dayStrings[index]}\n >\n {this.dayAbbrStrings[index]}\n </th>\n ))}\n </tr>\n </thead>\n <tbody\n onClick={this.onDateSelection}\n onKeyDown={this.onDateKeydown}\n ref={elm => (this.calendarBody = elm)}\n test-id=\"calendarTableBody\"\n >\n {this.currentWeeks.map(week => (\n <tr>\n {week.map(day => {\n let ariaLabel = '';\n if (day.isToday) ariaLabel = `${loc('tecton.element.calendar.today')}, `;\n ariaLabel += formatDateFull(day.date);\n if (day.isSelected) ariaLabel += ` (${loc('tecton.element.calendar.selected')})`;\n return (\n <td\n class={day.classList}\n aria-hidden={day.isEmpty ? 'true' : undefined}\n tabindex={day.isSelected ? 0 : -1}\n role={day.isSelected ? 'gridcell' : undefined}\n aria-selected={day.isSelected ? 'true' : undefined}\n aria-disabled={day.isValid ? undefined : 'true'}\n data-day={day.integer || undefined}\n data-date={day.date ? formatDateISO(day.date) : undefined}\n >\n {day?.isToday && (\n <div\n class=\"today-decorator\"\n aria-hidden=\"true\"\n >\n {loc('tecton.element.calendar.today')}\n </div>\n )}\n <div aria-label={ariaLabel}>{day?.integer ?? ''}</div>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n checkActiveCellForBlankness() {\n const activeElement = this.hostElement.shadowRoot.activeElement;\n if (!activeElement || activeElement.tagName !== 'TD' || !activeElement.hasAttribute('aria-hidden')) return;\n\n const { calendarBody } = this;\n const calendarCells = Array.from(calendarBody.querySelectorAll<Element>('td'));\n const indexOfCell = Array.from(calendarCells).indexOf(activeElement);\n\n const dayToFocus =\n indexOfCell < 15 ? 1 : calendarCells.filter(cell => !cell.hasAttribute('aria-hidden')).length;\n\n this.focusDay(this.generateDateFromDay(dayToFocus));\n }\n\n closeCalendar = () => {\n if (!this.open) return;\n this.open = false;\n this.focusInput();\n };\n\n async focusDay(date: Date) {\n if (!date) return;\n await waitForNextPaint();\n this.calendarBody.querySelector<HTMLElement>(`td[data-day=\"${date.getDate()}\"]`)?.focus();\n }\n\n focusInput() {\n this.controlElement?.focus();\n }\n\n generateDateFromDay(day: number) {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n return new Date(selectedYear, monthIndex, day);\n }\n\n goToMonthYear = (monthIndex: number, year: number) => {\n if (monthIndex < 0) {\n monthIndex = 11;\n year--;\n } else if (monthIndex > 11) {\n monthIndex = 0;\n year++;\n }\n this.selectedMonthYear = {\n monthIndex,\n selectedYear: year,\n };\n this.dateList = this.buildDateList(this.selectedMonthYear);\n\n this.scheduledAfterRender.push(() => this.checkActiveCellForBlankness());\n };\n\n onClickElsewhere = (event: CustomEvent) => {\n const target = event.target as HTMLClickElsewhereElement;\n if (target.localName === 'click-elsewhere') {\n event.stopPropagation();\n this.closeCalendar();\n }\n };\n\n onDateKeydown = (event: KeyboardEvent) => {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n const currentDay = parseInt((event.target as HTMLElement).dataset.day);\n const currentDate = this.generateDateFromDay(currentDay);\n\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault();\n this.activateDay(addDays(currentDate, -7));\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n this.activateDay(addDays(currentDate, 7));\n break;\n\n case 'ArrowRight':\n event.preventDefault();\n this.activateDay(addDays(currentDate, 1));\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n this.activateDay(addDays(currentDate, -1));\n break;\n\n case 'PageUp':\n event.preventDefault();\n if (event.shiftKey) this.goToMonthYear(monthIndex, selectedYear - 1);\n else this.goToMonthYear(monthIndex - 1, selectedYear);\n break;\n\n case 'PageDown':\n event.preventDefault();\n if (event.shiftKey) this.goToMonthYear(monthIndex, selectedYear + 1);\n else this.goToMonthYear(monthIndex + 1, selectedYear);\n break;\n\n case 'Home':\n event.preventDefault();\n this.activateDay(addDays(currentDate, -currentDate.getDay()));\n break;\n\n case 'End':\n event.preventDefault();\n this.activateDay(addDays(currentDate, 6 - currentDate.getDay()));\n break;\n\n case 'Escape':\n event.preventDefault();\n this.closeCalendar();\n this.focusInput();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (!this.dateList.find(({ date }) => isSameDay(date, currentDate)).isValid) return;\n this.selectDate(currentDate);\n this.closeCalendar();\n this.focusInput();\n break;\n\n case ' ':\n event.preventDefault();\n if (!this.dateList.find(({ date }) => isSameDay(date, currentDate)).isValid) return;\n this.selectDate(currentDate);\n this.closeCalendar();\n this.focusInput();\n break;\n }\n };\n\n onDateSelection = (event: MouseEvent) => {\n const dateCell = (event.target as HTMLElement).closest<HTMLElement>('td:not([aria-hidden])');\n if (!dateCell) return;\n const clickedDate = removeTimezoneOffset(new Date(dateCell.dataset.date));\n this.selectDate(clickedDate);\n this.closeCalendar();\n };\n\n onHeaderControlKeydown = (event: KeyboardEvent) => {\n const currentDate = this.generateDateFromDay(1);\n const hasSelectedCell = this.calendarBody?.querySelector<HTMLTableCellElement>('[aria-selected=\"true\"]');\n\n if (event.key === 'Tab' && !hasSelectedCell) {\n event.preventDefault();\n this.activateDay(currentDate);\n }\n };\n\n onInputBlur = () => {\n if (!this.isTypeable) return;\n\n const validDays = getValidDaysOfWeek(this.daysOfWeekChecksum);\n const { typedValue } = this;\n const { isValid, inputDate, isAvailable } = validateInput(\n this.typedValue,\n validDays,\n this.validDates,\n this.invalidDates,\n this.startDate,\n this.endDate,\n this.defaultFormatString,\n this.assume\n );\n\n if (!typedValue && inputDate?.toString() === 'Invalid Date') {\n // initial/clear state\n this.setHints({ isValid: true, message: this.defaultHintMessage, messageType: 'info' });\n } else if (\n isValid ||\n (typedValue &&\n typedValue.length > 4 && // at least mm/dd provided\n inputDate &&\n isValidDate(inputDate) &&\n isAvailable)\n ) {\n this.setCompleteInput(inputDate);\n } else if (this.value) {\n this.valueOnBlur = this.value;\n this.value = null;\n this.change.emit({ value: null });\n this.typedValue = typedValue;\n }\n };\n\n onInputChange = (event: Event) => {\n event.stopPropagation();\n };\n\n onInputClick = () => {\n if (this.disabled) return;\n this.toggleCalendar();\n };\n\n onInputFocus = (event: FocusEvent) => {\n if (!this.isTypeable) return;\n if (event.target === this.controlElement) {\n if (this.valueOnBlur && !this.value) {\n const tmpTypedValue = this.typedValue;\n this.value = this.valueOnBlur;\n this.typedValue = tmpTypedValue;\n this.valueOnBlur = null;\n }\n this.closeCalendar();\n }\n };\n\n onInputInput = ({ detail: { value } }: Q2InputCustomEvent<IEventDetail> & InputEvent) => {\n this.typedValue = value;\n };\n\n onInputKeydown = (event: KeyboardEvent) => {\n const { dateValue } = this;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.openCalendar();\n this.activateDay(dateValue || new Date());\n break;\n\n case 'Enter':\n case ' ':\n if (this.typeable) break;\n event.preventDefault();\n if (this.open) {\n this.closeCalendar();\n } else {\n this.openCalendar();\n this.activateDay(dateValue || new Date());\n }\n break;\n }\n };\n\n onInputKeyup = (event: KeyboardEvent) => {\n if (this.disabled) {\n return;\n }\n\n switch (event.key) {\n case 'Escape':\n this.onInputBlur();\n this.closeCalendar();\n break;\n }\n\n if (!this.isTypeable) return;\n\n // handle missing zero in month and date\n this.typedValue = handleMissingZeros(this.typedValue);\n const { typedValue } = this;\n const validDays = getValidDaysOfWeek(this.daysOfWeekChecksum);\n const { isValid, message, messageType, inputDate, isAvailable, calendarPosition } = validateInput(\n typedValue,\n validDays,\n this.validDates,\n this.invalidDates,\n this.startDate,\n this.endDate,\n this.defaultFormatString,\n this.assume\n );\n\n if (calendarPosition) {\n const [mm, dd, yyyy] = calendarPosition;\n const date = new Date(yyyy, mm - 1, dd);\n if (isValidDate(date)) {\n this.selectedMonthYear = setupMonthYear(date);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n }\n\n if (event.key === 'Enter') {\n if (\n isValid ||\n (typedValue &&\n typedValue.length > 4 && // at least mm/dd provided\n inputDate &&\n isValidDate(inputDate) &&\n isAvailable)\n ) {\n this.setCompleteInput(inputDate);\n } else if (this.value) {\n this.value = null;\n this.change.emit({ value: null });\n this.typedValue = typedValue;\n }\n\n if (this.keyboardSelection) {\n this.keyboardSelection = false;\n this.closeCalendar();\n } else {\n this.toggleCalendar();\n }\n } else {\n this.setHints({ isValid, message, messageType });\n }\n };\n\n onPopupKeyup = (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.key === 'Esc') {\n this.onInputBlur();\n this.closeCalendar();\n }\n };\n\n onRefocus = () => {\n this.btnPrevMonth?.dispatchEvent(new FocusEvent('focus'));\n };\n\n openCalendar = () => {\n if (this.readonly || this.open) return;\n this.selectedMonthYear = setupMonthYear(this.dateValue);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.open = true;\n };\n\n selectDate = (newDate: Date) => {\n const { isValid } = this.dateList.find(({ date }) => isSameDay(date, newDate));\n if (!isValid) return;\n this.change.emit({ value: formatDateISO(newDate) });\n this.typedValue = formatDateShort(newDate);\n this.invalid = false;\n this.success.emit({ value: formatDateISO(newDate) });\n };\n\n setCompleteInput(inputDate: Date) {\n const formattedDate = formatDateShort(inputDate);\n this.change.emit({ value: formatDateISO(inputDate) });\n this.typedValue = formattedDate;\n this.internalError = null;\n this.setHints({\n isValid: true,\n message: null,\n messageType: null,\n });\n }\n\n setHints({ isValid, message, messageType }) {\n if (message === this.hintMessage) return this.hintMessageElement?.present();\n this.invalid = !isValid;\n this.hintMessage = message;\n this.hintMessageType = messageType;\n if (messageType === 'error' && message) {\n this.internalError = message;\n this.error.emit({\n errors: [\n {\n message,\n errorCode: 'generalInvalid',\n },\n ],\n });\n }\n }\n\n toggleCalendar = () => {\n if (this.readonly) return;\n if (this.open) {\n this.closeCalendar();\n } else {\n this.openCalendar();\n }\n };\n\n validateDate() {\n try {\n if (!!this.value) {\n const { dateValue } = this;\n const month = dateValue?.getMonth() ?? undefined;\n const year = dateValue?.getFullYear() ?? undefined;\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n\n const isSelectedMonthAndYear = month === monthIndex && year === selectedYear;\n let calculationDateList = [];\n\n if (!dateValue) {\n calculationDateList = [];\n } else if (isSelectedMonthAndYear) {\n calculationDateList = this.dateList;\n } else {\n calculationDateList = this.buildDateList({\n monthIndex: month,\n selectedYear: year,\n });\n }\n\n const dateValueDayOfMonth = dateValue?.getDate() ?? undefined;\n const isDateValueInvalid = dateValueDayOfMonth\n ? !calculationDateList.find(({ integer }) => integer === dateValueDayOfMonth).isValid\n : true;\n if (isDateValueInvalid) {\n this.error.emit({\n errors: [\n {\n message: `Value passed is invalid: The date ${this.value} is not valid`,\n errorCode: 'generalInvalid',\n },\n ],\n });\n } else {\n this.success.emit({ value: formatDateISO(dateValue) });\n }\n }\n } catch (error) {\n console.warn('Invalid moment value ', this.dateValue);\n }\n }\n\n // #endregion\n // #region Render Methods\n\n renderCalendarPopover() {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n return (\n <div\n class=\"calendar-field-popup\"\n onKeyUp={this.onPopupKeyup}\n >\n {this.calendarLabel && <p class=\"calendar-label\">{loc(this.calendarLabel)}</p>}\n <div class=\"cal-month-heading\">\n <q2-btn\n label={loc('tecton.element.calendar.previousMonth')}\n hide-label\n ref={elm => (this.btnPrevMonth = elm)}\n class=\"cal-nav-btn prev-month\"\n test-id=\"previousMonthButton\"\n onClick={() => this.goToMonthYear(monthIndex - 1, selectedYear)}\n >\n <q2-icon type=\"chevron-left\" />\n </q2-btn>\n <span class=\"cal-month-text\">{this.monthStrings[monthIndex]}</span>\n <q2-btn\n label={loc('tecton.element.calendar.nextMonth')}\n hide-label\n class=\"cal-nav-btn next-month\"\n ref={elm => (this.btnNextMonth = elm)}\n test-id=\"nextMonthButton\"\n onClick={() => this.goToMonthYear(monthIndex + 1, selectedYear)}\n >\n <q2-icon type=\"chevron-right\" />\n </q2-btn>\n <q2-btn\n label={loc('tecton.element.calendar.previousYear')}\n hide-label\n class=\"cal-nav-btn prev-year\"\n ref={elm => (this.btnPrevYear = elm)}\n test-id=\"previousYearButton\"\n onClick={() => this.goToMonthYear(monthIndex, selectedYear - 1)}\n >\n <q2-icon type=\"chevron-left\" />\n </q2-btn>\n <span class=\"cal-year-text\">{this.selectedMonthYear.selectedYear}</span>\n <q2-btn\n label={loc('tecton.element.calendar.nextYear')}\n hide-label\n class=\"cal-nav-btn next-year\"\n ref={elm => (this.btnNextYear = elm)}\n test-id=\"nextYearButton\"\n onClick={() => this.goToMonthYear(monthIndex, selectedYear + 1)}\n onKeyDown={this.onHeaderControlKeydown}\n >\n <q2-icon type=\"chevron-right\" />\n </q2-btn>\n </div>\n <div\n class=\"sr\"\n aria-live=\"polite\"\n id=\"table-label\"\n >\n {`${this.monthStrings[monthIndex]} ${selectedYear}`}\n </div>\n {this.calendarDays()}\n {this.disclaimer && <div class=\"calendar-disclaimer\">{loc(this.disclaimer)}</div>}\n <q2-btn\n class=\"sr refocus-popup\"\n onFocus={this.onRefocus}\n />\n </div>\n );\n }\n\n renderHintField() {\n if (!this.hintMessage) return;\n\n return (\n <q2-message\n class=\"calendar-hint sr\"\n ref={el => (this.hintMessageElement = el)}\n type={this.hintMessageType}\n >\n {this.hintMessage}\n </q2-message>\n );\n }\n\n renderInputField() {\n const { isTypeable } = this;\n return (\n <q2-input\n ref={el => (this.controlElement = el)}\n class=\"calendar-input-field\"\n value={this.formattedValue}\n label={loc(this.label)}\n hideLabel={this.hideLabel}\n disabled={!!this.disabled}\n readonly={!!this.readonly}\n clearable={this.canClear}\n placeholder={this.computedPlaceholder}\n optional={!!this.optional}\n ariaExpanded={`${!!this.open}`}\n hints={this.hintList}\n errors={this.errorList}\n onClick={isTypeable ? undefined : this.onInputClick}\n onChange={this.onInputChange}\n onInput={this.onInputInput}\n onKeyDown={this.onInputKeydown}\n onKeyUp={this.onInputKeyup}\n onBlur={this.onInputBlur}\n onFocus={this.onInputFocus}\n icon-right={isTypeable ? undefined : 'calendar'}\n format-modifier={isTypeable ? this.formatModifier : this.displayFormat || this.formatModifier}\n type=\"date\"\n hide-messages={!isTypeable}\n test-id=\"inputAndCalendarToggle\"\n _role=\"combobox\"\n _preventEntry={!isTypeable}\n >\n {isTypeable && (\n <q2-btn\n ref={el => (this.btnCalendarToggle = el)}\n slot=\"input-right\"\n onClick={this.onInputClick}\n test-id=\"calendarToggle\"\n label=\"tecton.element.calendar.toggleAriaLabel\"\n hide-label\n >\n <q2-icon type=\"calendar\" />\n </q2-btn>\n )}\n </q2-input>\n );\n }\n\n render() {\n return (\n <click-elsewhere\n class={this.open ? 'dropdown-open' : undefined}\n onChange={this.onClickElsewhere}\n >\n {this.renderInputField()}\n <q2-popover\n ref={el => (this.popoverElement = el)}\n controlElement={this.controlElement}\n open={this.open}\n direction={this.popoverDirection}\n minHeight={this.popoverMinHeight}\n align={this.popoverAlignment}\n mode={this.popoverMode || undefined}\n block\n >\n {this.renderHintField()}\n {this.renderCalendarPopover()}\n </q2-popover>\n </click-elsewhere>\n );\n }\n\n // #endregion\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["formatDateISO","value","date","Date","isValidDate","formatISO","representation","memoizedFormatDateShort","formatDateShort","isoDate","toISOString","Intl","DateTimeFormat","month","day","year","timeZone","resolvedOptions","format","memoizedFormatDateLong","formatDateLong","memoizedFormatDateFull","formatDateFull","weekday","convertMomentFormat","stringFormat","replace","stringToDate","isString","undefined","result","dateParts","split","map","part","padStart","isIsoString","length","isCompleteDate","isPartialDate","isStandardSlashDate","includes","unshift","pop","UTC","parseInt","now","yearNumber","monthNumber","dayNumber","getFullYear","removeTimezoneOffset","timeZoneOffset","getTimezoneOffset","setMinutes","Math","abs","stringArrayToDate","dateArray","Array","isArray","setupMonthYear","monthIndex","getMonth","selectedYear","validateInput","input","validDays","validDates","invalidDates","startDate","endDate","formatString","assume","isValid","isAvailable","messageType","message","loc","inputDate","buildInputDate","getDate","calendarPosition","monthName","getMonths","getDay","isoString","isNotValidDate","isInvalidDate","isBeforeStartDate","isAfterEndDate","isInvalid","Number","twoDigitDay","fourDigitYear","assumeYear","monthDay","mm","dd","nowLocal","assumedYear","slice","toString","handleMissingZeros","match","sp","reorderDateString","firstDayOfWeekInMonth","getDays","getDaysOfWeek","generateDatesFromMonthYear","daysInMonth","getDaysInMonth","keys","reduce","acc","stepIndex","push","getValidDaysOfWeek","checksum","sunValid","monValid","tuesValid","wedsValid","thursValid","friValid","satValid","ret","validateAgainstChecksum","validDaysOfWeek","newDate","validateAgainstBlacklist","validateAgainstWhitelist","some","validDate","isSameDay","buildDates","selectedMonthYear","currentSelection","dateValidators","typedValue","validationFns","baseValidation","bind","generateDateList","isIncompleteDate","datesInMonth","dayInMonth","dateIndex","fn","dayState","getDayState","classList","generateClassesForCalDay","Object","assign","integer","isEmpty","isActivity","startOfMonthEmpties","addEmptiesMonthStart","endOfMonthEmpties","addEmptiesMonthEnd","isNewDateBeforeStartDate","isAfter","isNewDateAfterEndDate","isBefore","isNowAfterCutoffTime","cutOffTime","currentDate","isSelected","isToday","isStartDate","isEndDate","classes","join","monthStartDayOfWeek","addEmptyDates","monthEndDayOfWeek","emptyDate","from","to","q2CalendarCss","Q2CalendarStyle0","Q2Calendar","this","dayAbbrStrings","dayStrings","defaultFormatString","formatModifier","internalError","monthStrings","scheduledAfterRender","closeCalendar","open","focusInput","goToMonthYear","dateList","buildDateList","checkActiveCellForBlankness","onClickElsewhere","event","target","localName","stopPropagation","onDateKeydown","currentDay","dataset","generateDateFromDay","key","preventDefault","activateDay","addDays","shiftKey","find","selectDate","onDateSelection","dateCell","closest","clickedDate","onHeaderControlKeydown","hasSelectedCell","_a","calendarBody","querySelector","onInputBlur","isTypeable","daysOfWeekChecksum","setHints","defaultHintMessage","setCompleteInput","valueOnBlur","change","emit","onInputChange","onInputClick","disabled","toggleCalendar","onInputFocus","controlElement","tmpTypedValue","onInputInput","detail","onInputKeydown","dateValue","openCalendar","typeable","onInputKeyup","yyyy","validateDate","keyboardSelection","onPopupKeyup","onRefocus","btnPrevMonth","dispatchEvent","FocusEvent","readonly","invalid","success","connectedCallback","componentWillLoad","popDirectionHandler","handleAriaLabel","componentDidLoad","overrideFocus","hostElement","componentDidRender","setTimeout","forEach","defaultChangeHandler","onchange","handleClear","defaultErrorHandler","onerror","hintMessageType","hintMessage","delegateFocus","isEventFromElement","shadowRoot","focus","popoverStateHandler","defaultSuccessHandler","onsuccess","closePopover","_togglePopover","openPopover","setValue","waitForNextPaint","tableCell","calendarTable","click","typeValue","formattedDate","innerInputField","InputEvent","KeyboardEvent","ariaLabelObserver","cutoffTimeObserver","daysOfWeekChecksumObserver","endDateObserver","invalidDatesObserver","handleRenamedProp","startDateObserver","typeableChanged","valueObserver","validDatesObserver","newValue","isMoment","toDate","shortFormattedValue","canClear","clearable","computedPlaceholder","disabledMsg","buttonLabel","placeholder","currentWeeks","weeks","accum","item","index","chunkIndex","floor","ct","cutoffTime","isMomentString","test","errorList","errors","list","filter","error","concat","formattedValue","displayFormat","hintList","hints","hint","innerInputContainer","_b","selectedDate","selectedCell","toggleElement","btnCalendarToggle","focusDay","monthYear","calendarDays","h","role","ref","scope","onClick","onKeyDown","elm","week","ariaLabel","class","tabindex","renderCalendarPopover","onKeyUp","calendarLabel","label","type","btnNextMonth","btnPrevYear","btnNextYear","id","disclaimer","onFocus","activeElement","tagName","hasAttribute","calendarCells","querySelectorAll","indexOfCell","indexOf","dayToFocus","cell","renderHintField","el","hintMessageElement","renderInputField","hideLabel","optional","ariaExpanded","onChange","onInput","onBlur","_role","_preventEntry","slot","present","errorCode","isSelectedMonthAndYear","calculationDateList","dateValueDayOfMonth","_c","isDateValueInvalid","console","warn","render","popoverElement","direction","popoverDirection","minHeight","popoverMinHeight","align","popoverAlignment","mode","popoverMode","block"],"sources":["src/components/q2-calendar/q2-calendar-helpers.ts","src/components/q2-calendar/q2-calendar-validation.ts","src/components/q2-calendar/q2-calendar.scss?tag=q2-calendar&encapsulation=shadow","src/components/q2-calendar/q2-calendar.tsx"],"sourcesContent":["import { isValid as isValidDate, formatISO, setMinutes } from 'date-fns';\nimport { loc } from '../../utils';\nimport { ISelectedMonthYear, InputValidation } from './q2-calendar-types';\n\nexport interface IMomentLikeObject {\n toDate(): Date;\n}\n\nexport function formatDateISO(value: string | Date) {\n const date = new Date(value);\n if (!isValidDate(date)) return;\n\n return formatISO(date, { representation: 'date' });\n}\n\nlet memoizedFormatDateShort: Intl.DateTimeFormat;\nexport function formatDateShort(value: string | Date) {\n const date = new Date(value);\n if (!isValidDate(date)) return;\n\n const isoDate = date.toISOString();\n if (!memoizedFormatDateShort) {\n memoizedFormatDateShort = new Intl.DateTimeFormat('en-US', {\n month: '2-digit',\n day: '2-digit',\n year: 'numeric',\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n }\n\n return memoizedFormatDateShort.format(new Date(isoDate));\n}\n\nlet memoizedFormatDateLong: Intl.DateTimeFormat;\nexport function formatDateLong(value: string | Date) {\n const date = new Date(value);\n if (!isValidDate(date)) return;\n if (!memoizedFormatDateLong) {\n memoizedFormatDateLong = new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n }\n\n return memoizedFormatDateLong.format(date);\n}\n\nlet memoizedFormatDateFull: Intl.DateTimeFormat;\nexport function formatDateFull(value: string | Date) {\n if (!value) return;\n const date = new Date(value);\n if (!isValidDate(date)) return;\n if (!memoizedFormatDateFull) {\n memoizedFormatDateFull = new Intl.DateTimeFormat('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n weekday: 'long',\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n }\n\n return memoizedFormatDateFull.format(date);\n}\n\nexport function convertMomentFormat(stringFormat: string) {\n return stringFormat\n .replace(/[d]/g, 'E')\n .replace(/[D]/g, 'd')\n .replace(/[Y]/g, 'y')\n .replace(/[l]/g, 'P')\n .replace(/[W]/g, 'I');\n}\n\nexport function stringToDate(date: string | null | void): Date | undefined {\n const isString = typeof date === 'string';\n if (!isString && date && isValidDate(new Date(date || undefined))) {\n date = formatDateISO(date);\n } else if (!date || !isValidDate(new Date(date))) {\n return undefined;\n }\n\n let result: Date;\n const dateParts = date.split(/[\\/\\-]/).map(part => part.padStart(2, '0'));\n const isIsoString = isString && date.length >= 24 && date[10] === 'T';\n const isCompleteDate = dateParts.length === 3;\n const isPartialDate = dateParts.length < 3;\n if (isIsoString) {\n date = date.split('T')[0];\n result = new Date(date);\n } else if (isCompleteDate) {\n const isStandardSlashDate = date.includes('/') && dateParts[2].length === 4;\n\n // Reorder mm/dd/yyyy dates for ISO formatting\n // [mm, dd, yyyy] -> [yyyy, mm, dd]\n if (isStandardSlashDate) dateParts.unshift(dateParts.pop());\n\n result = new Date(Date.UTC(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2])));\n } else if (isPartialDate) {\n const now = new Date();\n\n let yearNumber: number;\n let monthNumber: string;\n let dayNumber: string;\n switch (dateParts.length) {\n case 1:\n yearNumber = now.getFullYear();\n monthNumber = dateParts[0];\n dayNumber = '01';\n break;\n\n case 2:\n yearNumber = now.getFullYear();\n monthNumber = dateParts[0];\n dayNumber = dateParts[1];\n break;\n }\n\n result = new Date(`${yearNumber}-${monthNumber}-${dayNumber}`);\n }\n\n if (!isValidDate(result)) return undefined;\n\n // result = setHours(result, 0);\n result = removeTimezoneOffset(result);\n\n return isValidDate(result) ? result : undefined;\n}\n\nexport function removeTimezoneOffset(date: Date) {\n const timeZoneOffset = date.getTimezoneOffset();\n // Minutes compensation for some timezones like India, Central Australia and etc use GMT+5:30, GMT+9:30\n return setMinutes(date, timeZoneOffset + Math.abs(timeZoneOffset % 60));\n}\n\nexport function stringArrayToDate(dateArray: string[]): Date[] {\n if (!Array.isArray(dateArray) || dateArray.length === 0) {\n return [];\n }\n return dateArray.map(date => stringToDate(date));\n}\n\nexport function setupMonthYear(value: Date | undefined = new Date()): ISelectedMonthYear {\n return {\n monthIndex: value.getMonth(),\n selectedYear: value.getFullYear(),\n };\n}\n\nexport function validateInput(\n input: string = '',\n validDays: number[] = [],\n validDates: string[] = [], // white list\n invalidDates: string[] = [], // black list\n startDate: string,\n endDate: string,\n formatString: string = 'mm/dd/yyyy',\n assume: string\n): InputValidation {\n let isValid: boolean = true;\n let isAvailable: boolean = false;\n let messageType: string = 'info';\n let message: string = `${loc('tecton.element.calendar.hint.format')}: ${formatString}`;\n if (!input) {\n return { isValid, inputDate: new Date(''), isAvailable, messageType, message };\n }\n\n const inputDate = buildInputDate(input, assume);\n const month = inputDate.getMonth() + 1;\n const date = inputDate.getDate();\n const year = inputDate.getFullYear();\n const calendarPosition = [month, date, year];\n\n if (isValidDate(inputDate)) {\n const monthName = getMonths()[inputDate.getMonth()];\n\n if (input.length === 10) {\n isValid = true;\n messageType = null;\n message = null;\n }\n\n isAvailable = validDays.includes(inputDate.getDay());\n const isoString = formatDateISO(inputDate);\n\n if (isAvailable) {\n const isNotValidDate = validDates.length && !validDates.includes(isoString);\n const isInvalidDate = invalidDates.length && invalidDates.includes(isoString);\n const isBeforeStartDate = startDate && startDate > isoString;\n const isAfterEndDate = endDate && endDate < isoString;\n\n if (isNotValidDate || isInvalidDate || isBeforeStartDate || isAfterEndDate) {\n isAvailable = false;\n }\n }\n\n if (input.length >= 5 && !isAvailable) {\n isValid = false;\n messageType = 'error';\n const isInvalid = !monthName || !date || !year;\n message = isInvalid\n ? `${loc('tecton.element.calendar.hint.invalidDate')}: ${formatString}`\n : loc('tecton.element.calendar.hint.notAvailableDate', [formatDateLong(inputDate)]);\n }\n } else {\n isValid = false;\n messageType = 'error';\n message = `${loc('tecton.element.calendar.hint.invalidDate')}: ${formatString}`;\n }\n\n return {\n isValid,\n messageType,\n message,\n inputDate,\n isAvailable,\n calendarPosition,\n };\n}\n\nexport function buildInputDate(input: string, assume: string) {\n const now = new Date();\n // eslint-disable-next-line prefer-const\n let [month, day, year] = input.split('/');\n if (month === '0') month = '01';\n if (day === '0') day = '01';\n if (input.length === 10) {\n return new Date(input);\n } else if (month && day && Number(day) > 0) {\n const twoDigitDay = Number(day) < 10 ? `0${Number(day)}` : day;\n const fourDigitYear = !year || year.length < 4 ? assumeYear(month, day, assume) : year;\n return new Date(`${month}/${twoDigitDay}/${fourDigitYear}`);\n } else if (month) {\n return new Date(`${month}/01/${now.getFullYear()}`);\n }\n}\n\nfunction assumeYear(month: string, day: string, assume: string): string {\n const monthDay = `${month}/${day}`;\n const now = new Date();\n const mm: string = now.getMonth() < 9 ? `0${now.getMonth() + 1}` : `${now.getMonth() + 1}`;\n const dd: string = now.getDate() < 10 ? `0${now.getDate()}` : `${now.getDate()}`;\n const nowLocal = `${mm}/${dd}/${now.getFullYear()}`;\n let assumedYear = now.getFullYear();\n if (assume === 'future' && nowLocal.slice(0, 5) > monthDay) {\n assumedYear = now.getFullYear() + 1;\n } else if (assume === 'past' && nowLocal.slice(0, 5) < monthDay) {\n assumedYear = now.getFullYear() - 1;\n }\n return assumedYear.toString();\n}\n\nexport function handleMissingZeros(input): string {\n if (!input) {\n return '';\n }\n if (input.match(/^[1-9]\\/$/)) {\n return `0${input}/`;\n } else if (input.match(/^[0-9]{2}\\/[1-9]{1}\\/$/)) {\n const sp = input.split('/');\n return `${sp[0]}/0${sp[1]}/`;\n }\n return input;\n}\n\nexport function reorderDateString(input: string): string {\n const dateParts = (input || '').split('-');\n if (dateParts.length !== 3) return '';\n return `${dateParts[1]}/${dateParts[2]}/${dateParts[0]}`;\n}\n\nexport function firstDayOfWeekInMonth(month: number, year: number): number {\n return new Date(year, month, 1, 1, 1, 1, 1).getDay();\n}\n\nexport function getDays(): string[] {\n return [\n loc('tecton.element.calendar.days.short.Sunday'),\n loc('tecton.element.calendar.days.short.Monday'),\n loc('tecton.element.calendar.days.short.Tuesday'),\n loc('tecton.element.calendar.days.short.Wednesday'),\n loc('tecton.element.calendar.days.short.Thursday'),\n loc('tecton.element.calendar.days.short.Friday'),\n loc('tecton.element.calendar.days.short.Saturday'),\n ];\n}\n\nexport function getDaysOfWeek(): string[] {\n return [\n loc('tecton.element.calendar.days.Sunday'),\n loc('tecton.element.calendar.days.Monday'),\n loc('tecton.element.calendar.days.Tuesday'),\n loc('tecton.element.calendar.days.Wednesday'),\n loc('tecton.element.calendar.days.Thursday'),\n loc('tecton.element.calendar.days.Friday'),\n loc('tecton.element.calendar.days.Saturday'),\n ];\n}\n\nexport function getMonths(): string[] {\n return [\n loc('tecton.element.calendar.months.January'),\n loc('tecton.element.calendar.months.February'),\n loc('tecton.element.calendar.months.March'),\n loc('tecton.element.calendar.months.April'),\n loc('tecton.element.calendar.months.May'),\n loc('tecton.element.calendar.months.June'),\n loc('tecton.element.calendar.months.July'),\n loc('tecton.element.calendar.months.August'),\n loc('tecton.element.calendar.months.September'),\n loc('tecton.element.calendar.months.October'),\n loc('tecton.element.calendar.months.November'),\n loc('tecton.element.calendar.months.December'),\n ];\n}\n","import { firstDayOfWeekInMonth } from './q2-calendar-helpers';\nimport { getDaysInMonth, isSameDay, isBefore, isAfter, isValid as isValidDate } from 'date-fns';\nimport { CalendarDay, DateEmpty, Year, IDateValidators, ISelectedMonthYear } from './q2-calendar-types';\n\n// Validation Helpers\nexport type DateList = CalendarDay[];\nexport type IsValid = boolean;\nexport type IsActivityDate = boolean;\nexport type DateValidation = (date: Date) => IsValid;\n\nexport function generateDatesFromMonthYear(month: number, year: Year): Date[] {\n const daysInMonth = getDaysInMonth(new Date(year, month));\n\n return [...Array(daysInMonth).keys()].reduce((acc, stepIndex) => {\n acc.push(new Date(year, month, stepIndex + 1));\n return acc;\n }, []);\n}\n\nexport function getValidDaysOfWeek(checksum: number = 127): number[] {\n /* tslint:disable:no-bitwise */\n const sunValid = checksum & 1;\n const monValid = checksum & 2;\n const tuesValid = checksum & 4;\n const wedsValid = checksum & 8;\n const thursValid = checksum & 16;\n const friValid = checksum & 32;\n const satValid = checksum & 64;\n /* tslint:enable:no-bitwise */\n const ret = [];\n\n if (checksum <= 0) return ret;\n if (sunValid) ret.push(0);\n if (monValid) ret.push(1);\n if (tuesValid) ret.push(2);\n if (wedsValid) ret.push(3);\n if (thursValid) ret.push(4);\n if (friValid) ret.push(5);\n if (satValid) ret.push(6);\n\n return ret;\n}\n\nexport function validateAgainstChecksum(validDaysOfWeek: number[], newDate: Date): IsValid {\n return validDaysOfWeek.includes(newDate.getDay());\n}\n\nexport function validateAgainstBlacklist(invalidDates: Date[], newDate: Date): IsValid {\n return !validateAgainstWhitelist(invalidDates, newDate);\n}\n\nexport function validateAgainstWhitelist(validDates: Date[], newDate: Date): IsValid {\n return validDates.some(validDate => isSameDay(validDate, newDate));\n}\n\nexport function buildDates(\n validDaysOfWeek: number[],\n validDates: Date[],\n invalidDates: Date[],\n selectedMonthYear: ISelectedMonthYear,\n currentSelection: Date | undefined,\n dateValidators: IDateValidators,\n typedValue: string\n): DateList {\n const validationFns = [baseValidation.bind(null, dateValidators, new Date())];\n if (validDates?.length) {\n validationFns.push(validateAgainstWhitelist.bind(null, validDates));\n } else {\n validationFns.push(validateAgainstChecksum.bind(null, validDaysOfWeek));\n }\n validationFns.push(validateAgainstBlacklist.bind(null, invalidDates));\n\n return generateDateList(selectedMonthYear, currentSelection, dateValidators, validationFns, typedValue);\n}\n\nexport function generateDateList(\n { monthIndex, selectedYear }: ISelectedMonthYear,\n currentSelection: Date | undefined,\n dateValidators: IDateValidators,\n validationFns: DateValidation[],\n typedValue: string\n): DateList {\n const isIncompleteDate = !isValidDate(new Date(typedValue));\n const datesInMonth = generateDatesFromMonthYear(monthIndex, selectedYear).map((dayInMonth, dateIndex) => {\n const isInvalid = validationFns.some(fn => !fn(dayInMonth));\n const dayState = getDayState(dayInMonth, dateValidators, currentSelection);\n const classList = generateClassesForCalDay({\n ...dayState,\n isInvalid,\n isIncompleteDate,\n });\n\n return {\n ...dayState,\n isValid: !isInvalid,\n date: dayInMonth,\n integer: dateIndex + 1,\n isEmpty: false,\n isActivity: false,\n classList,\n };\n });\n\n const startOfMonthEmpties = addEmptiesMonthStart(firstDayOfWeekInMonth(monthIndex, selectedYear));\n const endOfMonthEmpties = addEmptiesMonthEnd((startOfMonthEmpties.length + datesInMonth.length) % 7);\n\n return [...startOfMonthEmpties, ...datesInMonth, ...endOfMonthEmpties] as CalendarDay[];\n}\n\nexport function baseValidation(dateValidators: IDateValidators, now: Date, newDate: Date): boolean {\n const isNewDateBeforeStartDate = isAfter(dateValidators?.startDate, newDate);\n const isNewDateAfterEndDate = isBefore(dateValidators?.endDate, newDate);\n const isNowAfterCutoffTime = isSameDay(now, newDate) && isAfter(now, dateValidators?.cutOffTime);\n\n return !(isNewDateBeforeStartDate || isNowAfterCutoffTime || isNewDateAfterEndDate);\n}\n\nexport function getDayState(dayInMonth: Date, dateValidators: IDateValidators, currentDate: Date | undefined) {\n if (!currentDate) currentDate = new Date();\n const isSelected = currentDate && isSameDay(currentDate, dayInMonth);\n const isToday = isSameDay(dayInMonth, new Date());\n const isStartDate = isSameDay(dayInMonth, dateValidators?.startDate);\n const isEndDate = isSameDay(dayInMonth, dateValidators?.endDate);\n\n return { isSelected, isToday, isStartDate, isEndDate };\n}\n\nexport function generateClassesForCalDay({\n isInvalid,\n isSelected,\n isEndDate,\n isStartDate,\n isToday,\n isIncompleteDate,\n}: {\n isInvalid: boolean;\n isSelected: boolean;\n isEndDate: boolean;\n isStartDate: boolean;\n isToday: boolean;\n isIncompleteDate: boolean;\n}): string {\n const classes = [];\n if (!isInvalid) classes.push('is-valid');\n if (isSelected) classes.push('is-selected');\n if (isEndDate) classes.push('is-end-date');\n if (isStartDate) classes.push('is-start-date');\n if (isToday) classes.push('is-today');\n if (isSelected && isInvalid && !isIncompleteDate) classes.push('is-unavailable');\n\n return classes.join(' ');\n}\n\nexport function addEmptiesMonthStart(monthStartDayOfWeek: number): DateEmpty[] {\n return addEmptyDates(0, monthStartDayOfWeek);\n}\n\nexport function addEmptiesMonthEnd(monthEndDayOfWeek: number): DateEmpty[] {\n if (monthEndDayOfWeek === 0) return [];\n return addEmptyDates(monthEndDayOfWeek, 7);\n}\n\nexport const emptyDate: DateEmpty = {\n date: null,\n integer: null,\n isActivity: false,\n isEmpty: true,\n isValid: false,\n isToday: false,\n isSelected: false,\n isStartDate: false,\n isEndDate: false,\n classList: '',\n};\n\nexport function addEmptyDates(from: number, to: number): DateEmpty[] {\n if (from === 7) from = 0;\n return [...Array(to - from).keys()].map(() => ({ ...emptyDate }) as DateEmpty);\n}\n","@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n:host {\n display: block;\n}\n\n:host[hidden] {\n display: none;\n}\n\nclick-elsewhere {\n position: relative;\n display: block;\n}\n\nq2-input {\n margin: 0;\n cursor: pointer;\n}\n\nq2-popover {\n --comp-min-tappable-size: 44px;\n --comp-table-border-spacing: 2px;\n --comp-min-tappable-size-and-spacing: calc(var(--comp-min-tappable-size) + var(--comp-table-border-spacing));\n --comp-popover-padding: #{var-list(var-prefixer(calendar-popover-padding), --app-scale-1x, 5px)};\n --comp-min-table-width: calc(var(--comp-min-tappable-size-and-spacing) * 7);\n --comp-table-container-border-spacing: calc(var(--comp-table-border-spacing) * 2);\n --comp-popover-total-padding: calc(var(--comp-popover-padding) * 2);\n\n --tct-popover-min-width: calc(\n var(--comp-min-table-width) + var(--comp-table-container-border-spacing) + var(--comp-popover-total-padding)\n );\n}\n\n.calendar-field-popup {\n padding: var(--comp-popover-padding);\n}\n\n.calendar-label {\n --comp-label-padding: #{var-list(\n --tct-calendar-label-padding,\n unquote('#{var-list(var-prefixer(calendar-label-vertical-padding), --tct-scale-2, --app-scale-2x, 10px)} 0')\n )};\n font-size: var-list(var-prefixer(calendar-label-font-size), 16px);\n flex: 1 1;\n flex-basis: calc(100% - var-list(--tct-btn-icon-width, 44px));\n margin: 0;\n padding: var(--comp-label-padding);\n}\n\n.cal-month-heading {\n padding: 0 0 0.75rem;\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: var-list(var-prefixer(calendar-month-font-size), 16px);\n font-weight: var-list(var-prefixer(calendar-month-font-weight), 600);\n text-align: center;\n}\n\n.cal-month-text {\n min-width: 82px;\n display: inline-block;\n}\n\n.cal-year-text {\n min-width: 50px;\n display: inline-block;\n}\n\ntable {\n width: 100%;\n margin-bottom: 2px;\n text-align: center;\n border-spacing: var(--comp-table-border-spacing);\n}\n\nth {\n font-size: var-list(var-prefixer(calendar-day-heading-font-size), inherit);\n font-weight: var-list(var-prefixer(calendar-day-heading-font-weight), 600);\n width: 14.285714%;\n}\n\ntd {\n height: var(--comp-min-tappable-size);\n cursor: pointer;\n border: var-list(var-prefixer(calendar-day-border), 0);\n border-radius: var-list(var-prefixer(calendar-day-border-radius));\n\n &.is-unavailable {\n border: 1px solid var-list(--tct-input-error-border-color, --const-stoplight-alert, #d20a0a);\n }\n\n &.is-valid:hover {\n border: var-list(var-prefixer(calendar-day-hover-border), var-prefixer(calendar-day-border) 0);\n border-radius: var-list(\n var-prefixer(calendar-day-hover-border-radius),\n var-prefixer(calendar-day-border-radius)\n );\n\n background: var-list(\n --tct-calendar-day-hover-background,\n var-prefixer(calendar-day-hover-bg),\n --tct-gray-14,\n --app-gray14,\n --tct-gray-l4,\n --app-gray-l4,\n #f2f2f2\n );\n color: var-list(var-prefixer(calendar-day-hover-font-color), inherit);\n }\n\n &[aria-hidden],\n &[aria-disabled] {\n pointer-events: none;\n cursor: not-allowed;\n }\n\n &[aria-disabled] {\n opacity: var-list(var-prefixer(calendar-day-disabled-opacity), --app-disabled-opacity, 0.4);\n }\n\n &[aria-selected] {\n border: var-list(var-prefixer(calendar-day-selected-border), var-prefixer(calendar-day-border) 0);\n border-radius: var-list(\n var-prefixer(calendar-day-selected-border-radius),\n var-prefixer(calendar-day-border-radius)\n );\n background: var-list(\n --tct-calendar-day-selected-background,\n var-prefixer(calendar-day-selected-bg),\n --tct-calendar-day-hover-background, \n var-prefixer(calendar-day-hover-bg),\n var-prefixer(gray-14),\n --tct-gray-l4,\n --app-gray-l4,\n #f2f2f2\n );\n color: var-list(\n var-prefixer(calendar-day-selected-font-color),\n var-prefixer(calendar-day-hover-font-color),\n inherit\n );\n box-shadow: 0 0 0 2px\n var-list(\n var-prefixer(calendar-day-selected-outline-color),\n --tct-stoplight-info,\n --const-stoplight-info,\n #0079c1\n );\n \n }\n &[aria-selected]:focus {\n box-shadow: 0 0 0 2px\n var-list(\n var-prefixer(calendar-day-selected-outline-color),\n --tct-stoplight-info,\n --const-stoplight-info,\n #0079c1\n ),\n 0 0 0 4px var(--const-focus-color, #0066cc)\n }\n}\n\n.today-decorator {\n text-transform: uppercase;\n font-weight: 700;\n font-size: 10px;\n height: 12px;\n}\n\n\n.calendar-disclaimer {\n font-size: var-list(\n var-prefixer(calendar-disclaimer-font-size),\n --tct-font-size-small,\n --app-font-size-small,\n 12px\n );\n border-style: solid;\n border-width: var-list(var-prefixer(calendar-disclaimer-border-width), unquote('1px 0 0 0'));\n border-color: var-list(\n var-prefixer(calendar-disclaimer-border-color),\n var-prefixer(gray-13),\n --tct-gray-l3,\n --app-gray-l3,\n #e6e6e6\n );\n padding: var-list(--tct-calendar-disclaimer-padding, --tct-scale-2, --app-scale-2x, 10px);\n text-align: left;\n}\n","import {\n Component,\n ComponentInterface,\n Prop,\n Element,\n State,\n Event,\n EventEmitter,\n Listen,\n Watch,\n Method,\n h,\n} from '@stencil/core';\nimport { ISelectedMonthYear, CalendarDay, IDateValidators } from './q2-calendar-types';\nimport { addDays, isSameDay, format, isValid as isValidDate } from 'date-fns';\nimport {\n stringToDate,\n setupMonthYear,\n getMonths,\n getDays,\n getDaysOfWeek,\n stringArrayToDate,\n convertMomentFormat,\n validateInput,\n handleMissingZeros,\n formatDateISO,\n formatDateShort,\n IMomentLikeObject,\n removeTimezoneOffset,\n reorderDateString,\n formatDateFull,\n} from './q2-calendar-helpers';\nimport { buildDates, getValidDaysOfWeek, DateList } from './q2-calendar-validation';\nimport {\n handleAriaLabel,\n loc,\n overrideFocus,\n isEventFromElement,\n handleRenamedProp,\n waitForNextPaint,\n} from '../../utils';\nimport { IEventDetail } from '../q2-input/q2-input-types';\nimport { Q2InputCustomEvent } from 'src/components';\n\n@Component({ tag: 'q2-calendar', shadow: true, styleUrl: 'q2-calendar.scss' })\nexport class Q2Calendar implements ComponentInterface {\n // #region Own Properties\n\n btnCalendarToggle: HTMLQ2BtnElement;\n btnNextMonth: HTMLQ2BtnElement;\n btnNextYear: HTMLQ2BtnElement;\n btnPrevMonth: HTMLQ2BtnElement;\n btnPrevYear: HTMLQ2BtnElement;\n calendarBody: HTMLDivElement;\n calendarTable: HTMLTableElement;\n controlElement: HTMLQ2InputElement;\n dayAbbrStrings = getDays();\n dayStrings = getDaysOfWeek();\n defaultFormatString = 'mm/dd/yyyy';\n formatModifier: string = 'M/D/YYYY'; // To allow missing leading zero, 4/3/2021 => converts into 04/03/2021\n hintMessageElement: HTMLQ2MessageElement;\n internalError: string = '';\n monthStrings = getMonths();\n popoverElement?: HTMLQ2PopoverElement;\n scheduledAfterRender: (() => void)[] = [];\n selectedMonthYear: ISelectedMonthYear;\n valueOnBlur: string | { toDate(): Date };\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n hostElement: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n dateList: CalendarDay[];\n\n @State()\n hintMessage: string = this.defaultHintMessage;\n\n @State()\n hintMessageType: 'info' | 'error' = 'info';\n\n @State()\n keyboardSelection: boolean = false;\n\n @State()\n typedValue: string = '';\n\n // #endregion\n // #region Public Property API\n\n /** @deprecated */\n @Prop({ reflect: true, mutable: true })\n ariaLabel: string;\n\n /**\n * Detects the year automatically based on today's date when the user presses the `Escape` key or the `Blur` mouse event occurs.\n * Setting `future` or `past` as the value will increase or decrease the year by one, respectively.\n */\n @Prop({ reflect: true })\n assume: 'current' | 'future' | 'past' = 'current';\n\n /** @deprecated */\n @Prop({ reflect: true })\n buttonLabel: string;\n\n /** A label shown at the top of the popover date picker. */\n @Prop({ reflect: true })\n calendarLabel: string;\n\n /** Display a button in the input field allowing the user to clear their selection. */\n @Prop({ reflect: true })\n clearable: boolean;\n\n /**\n * Specifies a time of day after which a date is no longer valid.\n *\n * @warning\n * Must be a valid ISO date string.\n */\n @Prop({ reflect: true })\n cutoffTime: string;\n\n /**\n * The most concise way to define valid days of the week for calendar. Each day of the week has a checksum value:\n *\n * - Sunday = 1\n * - Monday = 2\n * - Tuesday = 4\n * - Wednesday = 8\n * - Thursday = 16\n * - Friday = 32\n * - Saturday = 64\n *\n * Add the checksum values of your desired valid days together, and set `daysOfWeekChecksum` to that summed value.\n *\n * **Example:**\n * @snippet\n * element.daysOfWeekChecksum = 127 // All days of the week are valid\n * element.daysOfWeekChecksum = 62; // Only weekdays are valid\n * element.daysOfWeekChecksum = 65; // Only Saturday and Sunday are valid\n *\n */\n @Prop({ reflect: true })\n daysOfWeekChecksum: number;\n\n /** Disable the input field. */\n @Prop({ reflect: true })\n disabled: boolean;\n\n /**\n * Text that displays as the placeholder when the field is marked `disabled`.\n * @localizable\n */\n @Prop({ reflect: true })\n disabledMsg: string;\n\n /** Text that appears at the bottom of the popover date picker. */\n @Prop({ reflect: true })\n disclaimer: string;\n\n /**\n * Determines the display format of the date field value.\n *\n * Must follow the [date-fns](https://date-fns.org/v2.28.0/docs/format) token specification.\n */\n @Prop({ reflect: true })\n displayFormat: string;\n\n /**\n * Defines the last selectable date in the date picker popover.\n *\n * @warning\n * Must be a valid ISO date string.\n */\n @Prop({ reflect: true })\n endDate: string;\n\n /**\n * Each item in the `errors` array will appear below the input field when the field is focused and `typeable` is `true`.\n * @localizable\n */\n @Prop({ mutable: true })\n errors: string[];\n\n /** Hide the input field's ` <label> ` element from view. */\n @Prop({ reflect: true, mutable: true })\n hideLabel: boolean;\n\n /**\n * Each item in the `hints` array will appear below the input field when the field is focused and `typeable` is true.\n * @localizable\n */\n @Prop({ mutable: true })\n hints: string[];\n\n /** Show error styles when the calendar is in an errant state. */\n @Prop({ reflect: true, mutable: true })\n invalid: boolean;\n\n /**\n * Defines an explicit date blacklist.\n *\n * @warning\n * Must be a valid ISO date string.\n *\n * @info\n * When explicit date definitions like `invalidDates` is used, other date validity methods like `daysOfWeekChecksum` are overriden.\n */\n @Prop()\n invalidDates: string[];\n\n /** The visible label for the `q2-calendar` input field. */\n @Prop({ reflect: true, mutable: true })\n label: string;\n\n /** @deprecated */\n @Prop()\n onsuccess: (e: CustomEvent) => void;\n\n /**\n * Determine whether the popover is open or closed.\n *\n * @readonly\n */\n @Prop({ reflect: true, mutable: true })\n open: boolean;\n\n /** Appends \"(optional)\" to the label and sets `aria-required=\"false\"`. */\n @Prop({ reflect: true })\n optional: boolean;\n\n /**\n * Text that appears within the input field when it is blurred and empty.\n * Placeholder text disappears when the user focuses on the field and provides input.\n */\n @Prop({ reflect: true })\n placeholder: string;\n\n /** @deprecated */\n @Prop({ reflect: true })\n popDirection: 'up' | 'down';\n\n /** Aligns the popover date picker to the left or right side of the input field. */\n @Prop()\n popoverAlignment: 'left' | 'right';\n\n /**\n * Force the direction of the popover date picker when it opens.\n * If no value is passed, the component will auto-detect the direction based on available space.\n */\n @Prop({ mutable: true })\n popoverDirection: 'up' | 'down';\n\n /** @deprecated */\n @Prop()\n popoverMinHeight: number = 355;\n\n /**\n * Determines the display mode of the popover.\n *\n * Providing a value of `legacy` instructs the popover to use absolute positioning instead of fixed positioning.\n *\n * @info\n * This is a temporary solution to work around styling issues related to using fixed positioning for the popover\n * when nested inside of elements with transform properties. This will be removed once the popover API is available\n * for use.\n */\n @Prop({ mutable: true })\n popoverMode: 'legacy' = null;\n\n /**\n * The field's content is not editable, but the field remains focusable.\n *\n * Appends \"(readonly)\" to the field label. Supersedes `optional` if both are `true`.\n */\n @Prop({ reflect: true })\n readonly: boolean;\n\n /**\n * Defines the first selectabe date in the date picker popover.\n *\n * @warning\n * Must be a valid ISO date string.\n */\n @Prop({ reflect: true })\n startDate: string;\n\n /** The user can type in the field. Only available in desktop browsers. */\n @Prop({ reflect: true })\n typeable: boolean;\n\n /**\n * Defines an explicit date whitelist.\n *\n * @warning\n * Must be a valid ISO date string.\n *\n * @info\n * When explicit date definitions like `validDates` is used, other date validity methods like `daysOfWeekChecksum` are overriden.\n */\n @Prop()\n validDates: string[];\n\n /**\n * The value of the `q2-calendar` element, e.g. the selected date.\n *\n * **How to change or clear the value with javascript:**\n * @snippet\n * // change date\n * element.value = '2022-12-21';\n * // clear date\n * element.value = null;\n */\n @Prop({ mutable: true, reflect: true })\n value: string | { toDate(): Date };\n\n // #endregion\n // #region Events\n\n /**\n * Emitted when a date is selected or typed in the input field.\n * @legacyEvent\n */\n @Event()\n change: EventEmitter<{\n // ISO formatted date\n value: string | null;\n }>;\n\n /**\n * Emitted when an invalid date is entered into the field.\n */\n @Event()\n error: EventEmitter<{ errors: { message: string; errorCode: string }[] }>;\n\n /**\n * Emitted when a valid date is entered or selected.\n */\n @Event()\n success: EventEmitter<{\n // ISO formatted date\n value: string;\n }>;\n\n // #endregion\n // #region Component Lifecycle Events\n\n connectedCallback() {\n this.selectedMonthYear = setupMonthYear(this.dateValue);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n if (this.value && this.isTypeable && !this.typedValue) {\n this.typedValue = reorderDateString(this.value as string);\n }\n this.validateDate();\n }\n\n componentWillLoad() {\n this.popDirectionHandler();\n handleAriaLabel(this);\n }\n\n componentDidLoad(): void {\n overrideFocus(this.hostElement);\n }\n\n componentDidRender() {\n setTimeout(() => {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n }, 25);\n }\n\n // #endregion\n // #region Listeners\n\n @Listen('change')\n defaultChangeHandler(event: CustomEvent) {\n if (event.target === this.hostElement && !this.hostElement.onchange && !!event.detail) {\n this.value = event.detail.value;\n }\n }\n\n @Listen('clear')\n handleClear() {\n this.change.emit({ value: null });\n this.value = null;\n this.typedValue = '';\n }\n\n @Listen('error')\n defaultErrorHandler(event: CustomEvent) {\n if (event.target === this.hostElement && !this.hostElement.onerror) {\n if (this.hintMessageType === 'error' && this.hintMessage) {\n this.internalError = this.hintMessage;\n } else {\n this.internalError = loc('tecton.element.calendar.hint.invalidDate');\n }\n }\n }\n\n @Listen('focus')\n delegateFocus(event: FocusEvent) {\n if (!isEventFromElement(event, this.hostElement)) return;\n this.controlElement.shadowRoot.querySelector<HTMLElement>('.input-field').focus();\n }\n\n @Listen('popoverStateChanged')\n popoverStateHandler({ detail: { open } }: CustomEvent<{ open: boolean }>) {\n if (this.open !== open) this.open = open;\n }\n\n @Listen('success')\n defaultSuccessHandler(event: CustomEvent) {\n if (event.target !== this.hostElement) {\n return;\n }\n\n if (typeof this.onsuccess === 'function') {\n this.onsuccess(event);\n } else {\n this.internalError = '';\n if (this.hintMessageType === 'error' && this.hintMessage) {\n this.hintMessage = null;\n this.hintMessageType = null;\n this.invalid = false;\n }\n }\n }\n\n // #endregion\n // #region Public Methods API\n\n /**\n * Emulates clicking the `<input>` to hide the popover if it is visible.\n *\n * @testOnly\n */\n @Method()\n async closePopover() {\n if (!this.open) return;\n this._togglePopover();\n }\n\n /**\n * Emulates clicking the `<input>` to display the popover if it is hidden.\n *\n * @testOnly\n */\n @Method()\n async openPopover() {\n if (this.open) return;\n this._togglePopover();\n }\n\n /**\n * Emulates clicking the `<input>` to display the popover, moving to the correct month and year, and clicking the\n * provided date.\n *\n * While a `string` value can be passed, we recommended passing a `Date` object. If the value is invalid, the method\n * will not select the date.\n *\n * @testOnly\n */\n @Method()\n async setValue(value: string | Date) {\n const date = typeof value === 'string' ? stringToDate(value) : value;\n if (!isValidDate(date)) return;\n\n await this.openPopover();\n await waitForNextPaint();\n\n this.goToMonthYear(date.getMonth(), date.getFullYear());\n await waitForNextPaint();\n const tableCell = this.calendarTable?.querySelector<HTMLTableCellElement>(\n `td[data-date=\"${formatDateISO(date)}\"]`\n );\n tableCell?.click();\n }\n\n /**\n * Emulates focusing the `<input>`, entering the provided value, and emitting an `input` event.\n *\n * While a `string` value can be passed, we recommended passing a `Date` object. If the value is invalid, the method\n * will not select the date.\n *\n * @warning\n * Only applicable when the input is typeable.\n *\n * @testOnly\n */\n @Method()\n async typeValue(value: string | Date) {\n if (!this.typeable) return;\n\n const date = typeof value === 'string' ? stringToDate(value) : value;\n const formattedDate = formatDateShort(date);\n if (!isValidDate(date)) return;\n\n const { innerInputField, controlElement } = this;\n innerInputField.focus();\n innerInputField.dispatchEvent(new FocusEvent('focus'));\n innerInputField.value = formattedDate;\n innerInputField.dispatchEvent(new InputEvent('input'));\n controlElement.dispatchEvent(new KeyboardEvent('keyup'));\n }\n\n // #endregion\n // #region Watchers\n\n @Watch('ariaLabel')\n ariaLabelObserver() {\n handleAriaLabel(this);\n }\n\n @Watch('cutoffTime')\n cutoffTimeObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('daysOfWeekChecksum')\n daysOfWeekChecksumObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('endDate')\n endDateObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('invalidDates')\n invalidDatesObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('popDirection')\n popDirectionHandler() {\n handleRenamedProp(this, 'popDirection', 'popoverDirection');\n }\n\n @Watch('startDate')\n startDateObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('typeable')\n typeableChanged() {\n this.valueObserver(this.value);\n }\n\n @Watch('validDates')\n validDatesObserver() {\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n @Watch('value')\n valueObserver(newValue: string | IMomentLikeObject) {\n // resetting by empty string\n if (newValue === '') {\n this.value = undefined;\n this.setHints({ isValid: true, message: this.defaultHintMessage, messageType: 'info' });\n return;\n }\n const isMoment = newValue && typeof newValue !== 'string' && 'toDate' in newValue;\n const newDate = isMoment ? (newValue as IMomentLikeObject).toDate() : stringToDate(newValue as string);\n const shortFormattedValue = formatDateShort(newDate);\n if (this.isTypeable) {\n this.typedValue = shortFormattedValue;\n } else {\n this.controlElement.value = shortFormattedValue;\n this.selectedMonthYear = setupMonthYear(newDate);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n\n // reset hint when value is cleared\n if (this.invalid) return;\n\n if (shortFormattedValue) {\n this.setHints({\n isValid: true,\n message: null,\n messageType: null,\n });\n } else {\n this.setHints({ isValid: true, message: this.defaultHintMessage, messageType: 'info' });\n }\n }\n\n // #endregion\n // #region Local Methods\n\n get canClear() {\n if (this.isTypeable) {\n return this.clearable && !!this.typedValue;\n } else {\n return this.clearable && !!this.value;\n }\n }\n\n get computedPlaceholder(): string {\n if (this.disabled && this.disabledMsg) {\n return loc(this.disabledMsg);\n }\n\n if (this.buttonLabel && (this.disabled || this.placeholder)) {\n return loc(this.buttonLabel);\n }\n\n return (this.placeholder && loc(this.placeholder)) || '';\n }\n\n get currentWeeks() {\n const weeks = this.dateList.reduce<CalendarDay[][]>((accum, item, index) => {\n const chunkIndex = Math.floor(index / 7);\n\n if (!accum[chunkIndex]) {\n accum[chunkIndex] = [];\n }\n\n accum[chunkIndex].push(item);\n\n return accum;\n }, []);\n\n return weeks;\n }\n\n get dateValidators(): IDateValidators {\n const ct = new Date(this.cutoffTime || ''); // should fallback to InvalidDate\n return {\n startDate: stringToDate(this.startDate),\n endDate: stringToDate(this.endDate),\n cutOffTime: isValidDate(ct) ? ct : undefined,\n };\n }\n\n get dateValue(): Date | undefined {\n if (this.isTypeable) {\n return stringToDate(this.typedValue);\n } else {\n let { value } = this;\n const isMoment = value && typeof value !== 'string' && 'toDate' in value;\n if (isMoment) return (value as IMomentLikeObject).toDate();\n\n // stringified moment value assigned in html template e.g.) handlebar\n const isMomentString =\n typeof value === 'string' && value.split(' ').length === 6 && /GMT-\\d{4}/g.test(value);\n if (isMomentString) {\n value = formatDateISO(value as string);\n }\n\n return stringToDate(value as string);\n }\n }\n\n get defaultHintMessage() {\n return this.typeable\n ? loc('tecton.element.calendar.hint.format') + ': ' + this.defaultFormatString\n : loc('tecton.element.calendar.hint.select');\n }\n\n get errorList() {\n const { errors, internalError, invalid } = this;\n let list = [];\n if (internalError) {\n list = [internalError];\n }\n if (Array.isArray(errors) && errors.length) {\n list = errors\n .filter(error => !!error)\n .map(error => loc(error))\n .concat(list);\n } else if (!internalError && invalid) {\n return ['tecton.element.calendar.invalid'];\n }\n return list;\n }\n\n get formattedValue() {\n const { typedValue, dateValue, displayFormat, isTypeable } = this;\n if (isTypeable) return typedValue;\n\n if (dateValue === undefined) return '';\n if (displayFormat) return format(dateValue, convertMomentFormat(displayFormat));\n\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n }).format(dateValue);\n }\n\n get hintList() {\n const { hints, hintMessageType, hintMessage } = this;\n if (Array.isArray(hints) && hints.length) return hints.filter(hint => !!hint).map(hint => loc(hint));\n if (hintMessageType === 'info' && hintMessage) return [hintMessage];\n return [];\n }\n\n get innerInputContainer(): HTMLElement {\n return this.controlElement?.shadowRoot?.querySelector('.input-container');\n }\n\n get innerInputField(): HTMLInputElement | HTMLButtonElement {\n return this.controlElement?.shadowRoot?.querySelector('.input-field');\n }\n\n get isTypeable(): boolean {\n return this.typeable;\n }\n\n get selectedDate() {\n const selectedCell = this.calendarBody?.querySelector<HTMLTableCellElement>('[aria-selected=\"true\"]');\n return selectedCell ? removeTimezoneOffset(new Date(selectedCell.dataset.date)) : null;\n }\n\n _togglePopover() {\n const toggleElement = this.typeable ? this.btnCalendarToggle : this.innerInputField;\n toggleElement?.click();\n toggleElement?.focus();\n toggleElement.dispatchEvent(new FocusEvent('focus'));\n }\n\n activateDay(date: Date) {\n this.goToMonthYear(date.getMonth(), date.getFullYear());\n this.scheduledAfterRender.push(() => this.focusDay(date));\n }\n\n buildDateList(monthYear: ISelectedMonthYear): DateList {\n const invalidDates = stringArrayToDate(this.invalidDates);\n const validDaysOfWeek = getValidDaysOfWeek(this.daysOfWeekChecksum);\n const validDates = stringArrayToDate(this.validDates);\n return buildDates(\n validDaysOfWeek,\n validDates,\n invalidDates,\n monthYear,\n this.dateValue,\n this.dateValidators,\n this.typedValue\n );\n }\n\n calendarDays() {\n return (\n <table\n role=\"grid\"\n aria-labelledby=\"table-label\"\n ref={ref => (this.calendarTable = ref)}\n >\n <thead>\n <tr>\n {[...Array(7).keys()].map(index => (\n <th\n scope=\"col\"\n aria-label={this.dayStrings[index]}\n >\n {this.dayAbbrStrings[index]}\n </th>\n ))}\n </tr>\n </thead>\n <tbody\n onClick={this.onDateSelection}\n onKeyDown={this.onDateKeydown}\n ref={elm => (this.calendarBody = elm)}\n test-id=\"calendarTableBody\"\n >\n {this.currentWeeks.map(week => (\n <tr>\n {week.map(day => {\n let ariaLabel = '';\n if (day.isToday) ariaLabel = `${loc('tecton.element.calendar.today')}, `;\n ariaLabel += formatDateFull(day.date);\n if (day.isSelected) ariaLabel += ` (${loc('tecton.element.calendar.selected')})`;\n return (\n <td\n class={day.classList}\n aria-hidden={day.isEmpty ? 'true' : undefined}\n tabindex={day.isSelected ? 0 : -1}\n role={day.isSelected ? 'gridcell' : undefined}\n aria-selected={day.isSelected ? 'true' : undefined}\n aria-disabled={day.isValid ? undefined : 'true'}\n data-day={day.integer || undefined}\n data-date={day.date ? formatDateISO(day.date) : undefined}\n >\n {day?.isToday && (\n <div\n class=\"today-decorator\"\n aria-hidden=\"true\"\n >\n {loc('tecton.element.calendar.today')}\n </div>\n )}\n <div aria-label={ariaLabel}>{day?.integer ?? ''}</div>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n renderCalendarPopover() {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n return (\n <div\n class=\"calendar-field-popup\"\n onKeyUp={this.onPopupKeyup}\n >\n {this.calendarLabel && <p class=\"calendar-label\">{loc(this.calendarLabel)}</p>}\n <div class=\"cal-month-heading\">\n <q2-btn\n label={loc('tecton.element.calendar.previousMonth')}\n hide-label\n ref={elm => (this.btnPrevMonth = elm)}\n class=\"cal-nav-btn prev-month\"\n test-id=\"previousMonthButton\"\n onClick={() => this.goToMonthYear(monthIndex - 1, selectedYear)}\n >\n <q2-icon type=\"chevron-left\" />\n </q2-btn>\n <span class=\"cal-month-text\">{this.monthStrings[monthIndex]}</span>\n <q2-btn\n label={loc('tecton.element.calendar.nextMonth')}\n hide-label\n class=\"cal-nav-btn next-month\"\n ref={elm => (this.btnNextMonth = elm)}\n test-id=\"nextMonthButton\"\n onClick={() => this.goToMonthYear(monthIndex + 1, selectedYear)}\n >\n <q2-icon type=\"chevron-right\" />\n </q2-btn>\n <q2-btn\n label={loc('tecton.element.calendar.previousYear')}\n hide-label\n class=\"cal-nav-btn prev-year\"\n ref={elm => (this.btnPrevYear = elm)}\n test-id=\"previousYearButton\"\n onClick={() => this.goToMonthYear(monthIndex, selectedYear - 1)}\n >\n <q2-icon type=\"chevron-left\" />\n </q2-btn>\n <span class=\"cal-year-text\">{this.selectedMonthYear.selectedYear}</span>\n <q2-btn\n label={loc('tecton.element.calendar.nextYear')}\n hide-label\n class=\"cal-nav-btn next-year\"\n ref={elm => (this.btnNextYear = elm)}\n test-id=\"nextYearButton\"\n onClick={() => this.goToMonthYear(monthIndex, selectedYear + 1)}\n onKeyDown={this.onHeaderControlKeydown}\n >\n <q2-icon type=\"chevron-right\" />\n </q2-btn>\n </div>\n <div\n class=\"sr\"\n aria-live=\"polite\"\n id=\"table-label\"\n >\n {`${this.monthStrings[monthIndex]} ${selectedYear}`}\n </div>\n {this.calendarDays()}\n {this.disclaimer && <div class=\"calendar-disclaimer\">{loc(this.disclaimer)}</div>}\n <q2-btn\n class=\"sr refocus-popup\"\n onFocus={this.onRefocus}\n />\n </div>\n );\n }\n\n checkActiveCellForBlankness() {\n const activeElement = this.hostElement.shadowRoot.activeElement;\n if (!activeElement || activeElement.tagName !== 'TD' || !activeElement.hasAttribute('aria-hidden')) return;\n\n const { calendarBody } = this;\n const calendarCells = Array.from(calendarBody.querySelectorAll<Element>('td'));\n const indexOfCell = Array.from(calendarCells).indexOf(activeElement);\n\n const dayToFocus =\n indexOfCell < 15 ? 1 : calendarCells.filter(cell => !cell.hasAttribute('aria-hidden')).length;\n\n this.focusDay(this.generateDateFromDay(dayToFocus));\n }\n\n closeCalendar = () => {\n if (!this.open) return;\n this.open = false;\n this.focusInput();\n };\n\n async focusDay(date: Date) {\n if (!date) return;\n await waitForNextPaint();\n this.calendarBody.querySelector<HTMLElement>(`td[data-day=\"${date.getDate()}\"]`)?.focus();\n }\n\n focusInput() {\n this.controlElement?.focus();\n }\n\n generateDateFromDay(day: number) {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n return new Date(selectedYear, monthIndex, day);\n }\n\n goToMonthYear = (monthIndex: number, year: number) => {\n if (monthIndex < 0) {\n monthIndex = 11;\n year--;\n } else if (monthIndex > 11) {\n monthIndex = 0;\n year++;\n }\n this.selectedMonthYear = {\n monthIndex,\n selectedYear: year,\n };\n this.dateList = this.buildDateList(this.selectedMonthYear);\n\n this.scheduledAfterRender.push(() => this.checkActiveCellForBlankness());\n };\n\n renderHintField() {\n if (!this.hintMessage) return;\n\n return (\n <q2-message\n class=\"calendar-hint sr\"\n ref={el => (this.hintMessageElement = el)}\n type={this.hintMessageType}\n >\n {this.hintMessage}\n </q2-message>\n );\n }\n\n renderInputField() {\n const { isTypeable } = this;\n return (\n <q2-input\n ref={el => (this.controlElement = el)}\n class=\"calendar-input-field\"\n value={this.formattedValue}\n label={loc(this.label)}\n hideLabel={this.hideLabel}\n disabled={!!this.disabled}\n readonly={!!this.readonly}\n clearable={this.canClear}\n placeholder={this.computedPlaceholder}\n optional={!!this.optional}\n ariaExpanded={`${!!this.open}`}\n hints={this.hintList}\n errors={this.errorList}\n onClick={isTypeable ? undefined : this.onInputClick}\n onChange={this.onInputChange}\n onInput={this.onInputInput}\n onKeyDown={this.onInputKeydown}\n onKeyUp={this.onInputKeyup}\n onBlur={this.onInputBlur}\n onFocus={this.onInputFocus}\n icon-right={isTypeable ? undefined : 'calendar'}\n format-modifier={isTypeable ? this.formatModifier : this.displayFormat || this.formatModifier}\n type=\"date\"\n hide-messages={!isTypeable}\n test-id=\"inputAndCalendarToggle\"\n _role=\"combobox\"\n _preventEntry={!isTypeable}\n >\n {isTypeable && (\n <q2-btn\n ref={el => (this.btnCalendarToggle = el)}\n slot=\"input-right\"\n onClick={this.onInputClick}\n test-id=\"calendarToggle\"\n label=\"tecton.element.calendar.toggleAriaLabel\"\n hide-label\n >\n <q2-icon type=\"calendar\" />\n </q2-btn>\n )}\n </q2-input>\n );\n }\n\n onClickElsewhere = (event: CustomEvent) => {\n const target = event.target as HTMLClickElsewhereElement;\n if (target.localName === 'click-elsewhere') {\n event.stopPropagation();\n this.closeCalendar();\n }\n };\n\n onDateKeydown = (event: KeyboardEvent) => {\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n const currentDay = parseInt((event.target as HTMLElement).dataset.day);\n const currentDate = this.generateDateFromDay(currentDay);\n\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault();\n this.activateDay(addDays(currentDate, -7));\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n this.activateDay(addDays(currentDate, 7));\n break;\n\n case 'ArrowRight':\n event.preventDefault();\n this.activateDay(addDays(currentDate, 1));\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n this.activateDay(addDays(currentDate, -1));\n break;\n\n case 'PageUp':\n event.preventDefault();\n if (event.shiftKey) this.goToMonthYear(monthIndex, selectedYear - 1);\n else this.goToMonthYear(monthIndex - 1, selectedYear);\n break;\n\n case 'PageDown':\n event.preventDefault();\n if (event.shiftKey) this.goToMonthYear(monthIndex, selectedYear + 1);\n else this.goToMonthYear(monthIndex + 1, selectedYear);\n break;\n\n case 'Home':\n event.preventDefault();\n this.activateDay(addDays(currentDate, -currentDate.getDay()));\n break;\n\n case 'End':\n event.preventDefault();\n this.activateDay(addDays(currentDate, 6 - currentDate.getDay()));\n break;\n\n case 'Escape':\n event.preventDefault();\n this.closeCalendar();\n this.focusInput();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (!this.dateList.find(({ date }) => isSameDay(date, currentDate)).isValid) return;\n this.selectDate(currentDate);\n this.closeCalendar();\n this.focusInput();\n break;\n\n case ' ':\n event.preventDefault();\n if (!this.dateList.find(({ date }) => isSameDay(date, currentDate)).isValid) return;\n this.selectDate(currentDate);\n this.closeCalendar();\n this.focusInput();\n break;\n }\n };\n\n onDateSelection = (event: MouseEvent) => {\n const dateCell = (event.target as HTMLElement).closest<HTMLElement>('td:not([aria-hidden])');\n if (!dateCell) return;\n const clickedDate = removeTimezoneOffset(new Date(dateCell.dataset.date));\n this.selectDate(clickedDate);\n this.closeCalendar();\n };\n\n onHeaderControlKeydown = (event: KeyboardEvent) => {\n const currentDate = this.generateDateFromDay(1);\n const hasSelectedCell = this.calendarBody?.querySelector<HTMLTableCellElement>('[aria-selected=\"true\"]');\n\n if (event.key === 'Tab' && !hasSelectedCell) {\n event.preventDefault();\n this.activateDay(currentDate);\n }\n };\n\n onInputBlur = () => {\n if (!this.isTypeable) return;\n\n const validDays = getValidDaysOfWeek(this.daysOfWeekChecksum);\n const { typedValue } = this;\n const { isValid, inputDate, isAvailable } = validateInput(\n this.typedValue,\n validDays,\n this.validDates,\n this.invalidDates,\n this.startDate,\n this.endDate,\n this.defaultFormatString,\n this.assume\n );\n\n if (!typedValue && inputDate?.toString() === 'Invalid Date') {\n // initial/clear state\n this.setHints({ isValid: true, message: this.defaultHintMessage, messageType: 'info' });\n } else if (\n isValid ||\n (typedValue &&\n typedValue.length > 4 && // at least mm/dd provided\n inputDate &&\n isValidDate(inputDate) &&\n isAvailable)\n ) {\n this.setCompleteInput(inputDate);\n } else if (this.value) {\n this.valueOnBlur = this.value;\n this.value = null;\n this.change.emit({ value: null });\n this.typedValue = typedValue;\n }\n };\n\n onInputChange = (event: Event) => {\n event.stopPropagation();\n };\n\n onInputClick = () => {\n if (this.disabled) return;\n this.toggleCalendar();\n };\n\n onInputFocus = (event: FocusEvent) => {\n if (!this.isTypeable) return;\n if (event.target === this.controlElement) {\n if (this.valueOnBlur && !this.value) {\n const tmpTypedValue = this.typedValue;\n this.value = this.valueOnBlur;\n this.typedValue = tmpTypedValue;\n this.valueOnBlur = null;\n }\n this.closeCalendar();\n }\n };\n\n onInputInput = ({ detail: { value } }: Q2InputCustomEvent<IEventDetail> & InputEvent) => {\n this.typedValue = value;\n };\n\n onInputKeydown = (event: KeyboardEvent) => {\n const { dateValue } = this;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.openCalendar();\n this.activateDay(dateValue || new Date());\n break;\n\n case 'Enter':\n case ' ':\n if (this.typeable) break;\n event.preventDefault();\n if (this.open) {\n this.closeCalendar();\n } else {\n this.openCalendar();\n this.activateDay(dateValue || new Date());\n }\n break;\n }\n };\n\n onInputKeyup = (event: KeyboardEvent) => {\n if (this.disabled) {\n return;\n }\n\n switch (event.key) {\n case 'Escape':\n this.onInputBlur();\n this.closeCalendar();\n break;\n }\n\n if (!this.isTypeable) return;\n\n // handle missing zero in month and date\n this.typedValue = handleMissingZeros(this.typedValue);\n const { typedValue } = this;\n const validDays = getValidDaysOfWeek(this.daysOfWeekChecksum);\n const { isValid, message, messageType, inputDate, isAvailable, calendarPosition } = validateInput(\n typedValue,\n validDays,\n this.validDates,\n this.invalidDates,\n this.startDate,\n this.endDate,\n this.defaultFormatString,\n this.assume\n );\n\n if (calendarPosition) {\n const [mm, dd, yyyy] = calendarPosition;\n const date = new Date(yyyy, mm - 1, dd);\n if (isValidDate(date)) {\n this.selectedMonthYear = setupMonthYear(date);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.validateDate();\n }\n }\n\n if (event.key === 'Enter') {\n if (\n isValid ||\n (typedValue &&\n typedValue.length > 4 && // at least mm/dd provided\n inputDate &&\n isValidDate(inputDate) &&\n isAvailable)\n ) {\n this.setCompleteInput(inputDate);\n } else if (this.value) {\n this.value = null;\n this.change.emit({ value: null });\n this.typedValue = typedValue;\n }\n\n if (this.keyboardSelection) {\n this.keyboardSelection = false;\n this.closeCalendar();\n } else {\n this.toggleCalendar();\n }\n } else {\n this.setHints({ isValid, message, messageType });\n }\n };\n\n onPopupKeyup = (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.key === 'Esc') {\n this.onInputBlur();\n this.closeCalendar();\n }\n };\n\n onRefocus = () => {\n this.btnPrevMonth?.dispatchEvent(new FocusEvent('focus'));\n };\n\n openCalendar = () => {\n if (this.readonly || this.open) return;\n this.selectedMonthYear = setupMonthYear(this.dateValue);\n this.dateList = this.buildDateList(this.selectedMonthYear);\n this.open = true;\n };\n\n selectDate = (newDate: Date) => {\n const { isValid } = this.dateList.find(({ date }) => isSameDay(date, newDate));\n if (!isValid) return;\n this.change.emit({ value: formatDateISO(newDate) });\n this.typedValue = formatDateShort(newDate);\n this.invalid = false;\n this.success.emit({ value: formatDateISO(newDate) });\n };\n\n setCompleteInput(inputDate: Date) {\n const formattedDate = formatDateShort(inputDate);\n this.change.emit({ value: formatDateISO(inputDate) });\n this.typedValue = formattedDate;\n this.internalError = null;\n this.setHints({\n isValid: true,\n message: null,\n messageType: null,\n });\n }\n\n setHints({ isValid, message, messageType }) {\n if (message === this.hintMessage) return this.hintMessageElement?.present();\n this.invalid = !isValid;\n this.hintMessage = message;\n this.hintMessageType = messageType;\n if (messageType === 'error' && message) {\n this.internalError = message;\n this.error.emit({\n errors: [\n {\n message,\n errorCode: 'generalInvalid',\n },\n ],\n });\n }\n }\n\n toggleCalendar = () => {\n if (this.readonly) return;\n if (this.open) {\n this.closeCalendar();\n } else {\n this.openCalendar();\n }\n };\n\n validateDate() {\n try {\n if (!!this.value) {\n const { dateValue } = this;\n const month = dateValue?.getMonth() ?? undefined;\n const year = dateValue?.getFullYear() ?? undefined;\n const { monthIndex, selectedYear } = this.selectedMonthYear;\n\n const isSelectedMonthAndYear = month === monthIndex && year === selectedYear;\n let calculationDateList = [];\n\n if (!dateValue) {\n calculationDateList = [];\n } else if (isSelectedMonthAndYear) {\n calculationDateList = this.dateList;\n } else {\n calculationDateList = this.buildDateList({\n monthIndex: month,\n selectedYear: year,\n });\n }\n\n const dateValueDayOfMonth = dateValue?.getDate() ?? undefined;\n const isDateValueInvalid = dateValueDayOfMonth\n ? !calculationDateList.find(({ integer }) => integer === dateValueDayOfMonth).isValid\n : true;\n if (isDateValueInvalid) {\n this.error.emit({\n errors: [\n {\n message: `Value passed is invalid: The date ${this.value} is not valid`,\n errorCode: 'generalInvalid',\n },\n ],\n });\n } else {\n this.success.emit({ value: formatDateISO(dateValue) });\n }\n }\n } catch (error) {\n console.warn('Invalid moment value ', this.dateValue);\n }\n }\n\n // #endregion\n // #region Render Methods\n\n render() {\n return (\n <click-elsewhere\n class={this.open ? 'dropdown-open' : undefined}\n onChange={this.onClickElsewhere}\n >\n {this.renderInputField()}\n <q2-popover\n ref={el => (this.popoverElement = el)}\n controlElement={this.innerInputContainer}\n open={this.open}\n direction={this.popoverDirection}\n minHeight={this.popoverMinHeight}\n align={this.popoverAlignment}\n mode={this.popoverMode || undefined}\n block\n >\n {this.renderHintField()}\n {this.renderCalendarPopover()}\n </q2-popover>\n </click-elsewhere>\n );\n }\n\n // #endregion\n}\n"],"mappings":"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"}
|
|
@@ -9,8 +9,7 @@ const c = l;
|
|
|
9
9
|
const u = class {
|
|
10
10
|
constructor(e) {
|
|
11
11
|
t(this, e);
|
|
12
|
-
|
|
13
|
-
this.dropdownItemSelector = "q2-dropdown-item:not([disabled]):not([separator])";
|
|
12
|
+
this.dropdownItemSelector = "q2-dropdown-item:not([disabled]):not([separator])";
|
|
14
13
|
this.closeDropdown = () => {
|
|
15
14
|
if (!this.open) return;
|
|
16
15
|
this.open = false;
|
|
@@ -106,7 +105,6 @@ const u = class {
|
|
|
106
105
|
if (this.open) return;
|
|
107
106
|
this.open = true;
|
|
108
107
|
};
|
|
109
|
-
this.controlElement = undefined;
|
|
110
108
|
this.additionalContext = undefined;
|
|
111
109
|
this.alignment = undefined;
|
|
112
110
|
this.ariaLabel = undefined;
|
|
@@ -356,12 +354,12 @@ const u = class {
|
|
|
356
354
|
render() {
|
|
357
355
|
const t = this.toggleButtonProps;
|
|
358
356
|
return e("click-elsewhere", {
|
|
359
|
-
key: "
|
|
357
|
+
key: "9d6def955bd72208a856de2e4676adc934efea87",
|
|
360
358
|
class: this.open ? "dropdown-open" : "",
|
|
361
359
|
onChange: this.onClickElsewhere,
|
|
362
360
|
"test-id": "dropdownContainer"
|
|
363
361
|
}, e("q2-btn", {
|
|
364
|
-
key: "
|
|
362
|
+
key: "dfb9de1b4d0762b370ae1bc06e3e89e9b8753f5a",
|
|
365
363
|
ref: t => this.controlElement = t,
|
|
366
364
|
class: t.className,
|
|
367
365
|
onClick: this.onToggleClick,
|
|
@@ -387,7 +385,7 @@ const u = class {
|
|
|
387
385
|
}) : " ", this.label && !this.hideLabel && e("span", {
|
|
388
386
|
class: "dropdown-button-text"
|
|
389
387
|
}, h(this.label)))), e("q2-popover", {
|
|
390
|
-
key: "
|
|
388
|
+
key: "eb196e420c5379ff094926c230a56922beef0d76",
|
|
391
389
|
ref: t => this.popoverElement = t,
|
|
392
390
|
controlElement: this.controlElement,
|
|
393
391
|
open: this.open,
|
|
@@ -398,13 +396,13 @@ const u = class {
|
|
|
398
396
|
mode: this.popoverMode || undefined,
|
|
399
397
|
block: this.block
|
|
400
398
|
}, e("div", {
|
|
401
|
-
key: "
|
|
399
|
+
key: "7289ddbab50723b054dd1fbeb033c11c2e240439",
|
|
402
400
|
onClick: this.onDropdownMenuClick,
|
|
403
401
|
onKeyDown: this.onDropdownMenuKeydown,
|
|
404
402
|
role: "menu",
|
|
405
403
|
"aria-label": h(this.label) || undefined
|
|
406
404
|
}, e("slot", {
|
|
407
|
-
key: "
|
|
405
|
+
key: "c04e31c427b32aca47c7fb1b2f44eb761d39a42e"
|
|
408
406
|
}))));
|
|
409
407
|
}
|
|
410
408
|
get hostElement() {
|