ng-material-date-range-picker
Version:
This library provides the date range selection with two views.
1 lines • 105 kB
Source Map (JSON)
{"version":3,"file":"ng-material-date-range-picker.mjs","sources":["../../../projects/ng-date-picker/src/lib/constant/date-filter-const.ts","../../../projects/ng-date-picker/src/lib/utils/date-picker-utilities.ts","../../../projects/ng-date-picker/src/lib/data/default-date-options.ts","../../../projects/ng-date-picker/src/lib/utils/human-date-parser.ts","../../../projects/ng-date-picker/src/lib/calendar/calendar.component.ts","../../../projects/ng-date-picker/src/lib/calendar/calendar.component.html","../../../projects/ng-date-picker/src/lib/ng-date-picker.component.ts","../../../projects/ng-date-picker/src/lib/ng-date-picker.component.html","../../../projects/ng-date-picker/src/lib/model/select-date-option.model.ts","../../../projects/ng-date-picker/src/lib/ng-date-picker.module.ts","../../../projects/ng-date-picker/src/public-api.ts","../../../projects/ng-date-picker/src/ng-material-date-range-picker.ts"],"sourcesContent":["/**\n * @(#)date-filter-enum.ts Sept 08, 2023\n *\n * @author Aakash Kumar\n */\nexport const ACTIVE_DATE_DEBOUNCE = 100;\n\nexport enum DATE_OPTION_TYPE {\n DATE_DIFF = 1,\n LAST_MONTH = 2,\n THIS_MONTH = 3,\n YEAR_TO_DATE = 4,\n CUSTOM = 5,\n MONTH_TO_DATE = 6,\n WEEK_TO_DATE = 7,\n}\n","import { DateRange, MatCalendar } from '@angular/material/datepicker';\nimport { DatePipe } from '@angular/common';\nimport { DATE_OPTION_TYPE } from '../constant/date-filter-const';\nimport { ISelectDateOption } from '../model/select-date-option.model';\nimport { ChangeDetectorRef } from '@angular/core';\nimport { ActiveDate } from '../model/active-date.model';\n\n/**\n * Resets the selection state for all options\n * and marks the given option as selected if provided.\n *\n * @param options - List of date options\n * @param selectedOption - Option to be marked as selected\n */\nexport function resetOptionSelection(\n options: ISelectDateOption[],\n selectedOption?: ISelectDateOption\n) {\n options.forEach((option) => (option.isSelected = false));\n if (selectedOption) {\n selectedOption.isSelected = true;\n }\n}\n\n/**\n * Marks the custom date option as selected.\n *\n * @param options - List of date options\n */\nexport function selectCustomOption(options: ISelectDateOption[]): void {\n const customOption = options.find(\n (option) => option.optionType === DATE_OPTION_TYPE.CUSTOM\n );\n if (customOption) customOption.isSelected = true;\n}\n\n/**\n * Returns a new date with the given year offset applied.\n *\n * @param offset - Number of years to add (negative for past years)\n * @returns Date object with updated year\n */\nexport function getDateWithOffset(offset: number) {\n const date = new Date();\n date.setFullYear(date.getFullYear() + offset);\n return date;\n}\n\n/**\n * Creates a deep clone of the provided object or array.\n *\n * @param data - Data to be cloned\n * @returns A deep copy of the data\n */\nexport function getClone<T>(data: T): T {\n return JSON.parse(JSON.stringify(data));\n}\n\n/**\n * Formats a date object into a string using Angular DatePipe.\n *\n * @param date - Date to be formatted\n * @param dateFormat - Desired date format (e.g., 'dd/MM/yyyy')\n * @returns Formatted date string\n */\nexport function getDateString(date: Date, dateFormat: string): string {\n const datePipe = new DatePipe('en');\n return datePipe.transform(date, dateFormat) ?? '';\n}\n\n/**\n * Formats a date range into a string with start and end dates.\n *\n * @param range - Date range with start and end\n * @param dateFormat - Desired date format\n * @returns Formatted range string (e.g., '01/01/2023 - 07/01/2023')\n */\nexport function getFormattedDateString(\n range: DateRange<Date>,\n dateFormat: string\n) {\n if (!(range.start && range.end)) {\n return '';\n }\n return (\n getDateString(range.start, dateFormat) +\n ' - ' +\n getDateString(range.end, dateFormat)\n );\n}\n\n/**\n * Creates a standardized date option object for dropdowns.\n *\n * @param label - Display label for the option\n * @param key - Option key from DEFAULT_DATE_OPTION_ENUM\n * @param dateDiff - Offset in days from current date (default: 0)\n * @param isVisible - Whether the option is visible (default: true)\n * @returns ISelectDateOption object\n */\nexport function createOption(\n label: string,\n key: DATE_OPTION_TYPE,\n dateDiff = 0,\n isVisible = true\n): ISelectDateOption {\n return {\n optionLabel: label,\n optionType: key,\n dateDiff,\n isSelected: false,\n isVisible,\n };\n}\n\n/** Escapes a string so it can be used as a literal inside a RegExp. */\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Returns true when both dates fall on the same calendar day. */\nexport function isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n/**\n * Parses a date string against an Angular-style date format (the subset of\n * tokens `yyyy`, `yy`, `MM`, `M`, `dd`, `d`). Returns `null` if the string\n * does not match the format or is not a real calendar date (e.g. `31/02`).\n *\n * @param value - The user-entered date string.\n * @param format - The expected format, e.g. `dd/MM/yyyy`.\n * @returns The parsed Date, or `null` if it does not match.\n */\nexport function parseDateByFormat(value: string, format: string): Date | null {\n const tokens: string[] = [];\n const tokenRegex = /yyyy|yy|MM|M|dd|d/g;\n let pattern = '^';\n let lastIndex = 0;\n let token: RegExpExecArray | null;\n while ((token = tokenRegex.exec(format)) !== null) {\n pattern += escapeRegExp(format.slice(lastIndex, token.index));\n switch (token[0]) {\n case 'yyyy':\n pattern += '(\\\\d{4})';\n break;\n case 'yy':\n pattern += '(\\\\d{2})';\n break;\n case 'MM':\n case 'dd':\n pattern += '(\\\\d{2})';\n break;\n default: // 'M' or 'd'\n pattern += '(\\\\d{1,2})';\n break;\n }\n tokens.push(token[0]);\n lastIndex = token.index + token[0].length;\n }\n pattern += escapeRegExp(format.slice(lastIndex)) + '$';\n\n const match = new RegExp(pattern).exec(value.trim());\n if (!match) {\n return null;\n }\n\n let year = NaN;\n let month = NaN;\n let day = NaN;\n tokens.forEach((token, index) => {\n const part = parseInt(match[index + 1], 10);\n if (token.startsWith('y')) {\n year = token === 'yy' ? 2000 + part : part;\n } else if (token.startsWith('M')) {\n month = part - 1;\n } else {\n day = part;\n }\n });\n if (isNaN(year) || isNaN(month) || isNaN(day)) {\n return null;\n }\n\n const date = new Date(year, month, day);\n // Reject overflow dates such as 31/02 that Date silently rolls over.\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== day\n ) {\n return null;\n }\n return date;\n}\n\n/**\n * Derives the relative date-math expressions (start/end) for a date option,\n * for display in editable inputs. Only day-diff options have a clean relative\n * form (e.g. `Last 7 Days` -> `now-7d` .. `now`); an explicit `startExpr` /\n * `endExpr` on the option overrides the derived value. Returns `null` when no\n * relative representation applies, so the caller falls back to absolute dates.\n *\n * @param option - The selected date option.\n * @returns `{ start, end }` expressions, or `null`.\n */\nexport function getRelativeExpr(\n option?: ISelectDateOption | null\n): { start: string; end: string } | null {\n if (!option) {\n return null;\n }\n if (option.startExpr && option.endExpr) {\n return { start: option.startExpr, end: option.endExpr };\n }\n if (option.optionType !== DATE_OPTION_TYPE.DATE_DIFF) {\n return null;\n }\n const diff = option.dateDiff ?? 0;\n const start = diff === 0 ? 'now' : `now${diff > 0 ? '+' : ''}${diff}d`;\n return { start, end: 'now' };\n}\n\n/**\n * Returns the date of the next month based on the given date.\n *\n * @param currDate - Current date\n * @returns A new Date object incremented by one month\n */\nexport function getDateOfNextMonth(currDate: Date): Date {\n const date = new Date(currDate);\n date.setMonth(currDate.getMonth() + 1);\n return date;\n}\n\n/**\n * Returns the first day of the month following the given date.\n *\n * @param currDate - The current date\n * @returns A Date object set to the first day of the next month\n */\nexport function getFirstDateOfNextMonth(currDate: Date): Date {\n return new Date(currDate.getFullYear(), currDate.getMonth() + 1, 1);\n}\n\n/**\n * Returns the number of days in the month of the given date.\n *\n * @param date The date to calculate the days for.\n * @returns Number of days in the month.\n */\nexport function getDaysInMonth(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n}\n\n/**\n * Computes the expected DateRange for a given option, mirroring the\n * logic in updateDateWithSelectedOption. Used for auto-matching a\n * provided selectedDates against the available options list.\n *\n * Returns null for CUSTOM options and any unhandled types.\n *\n * @param option - The date option to compute a range for\n * @returns Computed DateRange, or null if not applicable\n */\nexport function computeOptionDateRange(\n option: ISelectDateOption\n): DateRange<Date> | null {\n if (option.optionType === DATE_OPTION_TYPE.CUSTOM) {\n return null;\n }\n\n if (option.callBackFunction) {\n return option.callBackFunction();\n }\n\n const currDate = new Date();\n let startDate: Date = new Date();\n let lastDate: Date = new Date();\n\n switch (option.optionType) {\n case DATE_OPTION_TYPE.DATE_DIFF:\n startDate = new Date();\n startDate.setDate(startDate.getDate() + (option.dateDiff ?? 0));\n lastDate = new Date();\n break;\n\n case DATE_OPTION_TYPE.LAST_MONTH: {\n const lastMonth = new Date(currDate);\n lastMonth.setMonth(currDate.getMonth() - 1);\n startDate = new Date(lastMonth.getFullYear(), lastMonth.getMonth(), 1);\n lastDate = new Date(\n lastMonth.getFullYear(),\n lastMonth.getMonth(),\n getDaysInMonth(lastMonth)\n );\n break;\n }\n\n case DATE_OPTION_TYPE.THIS_MONTH:\n startDate = new Date(currDate.getFullYear(), currDate.getMonth(), 1);\n lastDate = new Date(\n currDate.getFullYear(),\n currDate.getMonth(),\n getDaysInMonth(currDate)\n );\n break;\n\n case DATE_OPTION_TYPE.YEAR_TO_DATE:\n startDate = new Date(currDate.getFullYear(), 0, 1);\n lastDate = new Date();\n break;\n\n case DATE_OPTION_TYPE.MONTH_TO_DATE:\n startDate = new Date(currDate.getFullYear(), currDate.getMonth(), 1);\n lastDate = new Date();\n break;\n\n default:\n return null;\n }\n\n return new DateRange<Date>(startDate, lastDate);\n}\n\n/**\n * Overrides the `activeDate` setter for a MatCalendar instance, injecting custom handler logic\n * while preserving the original setter behavior. Useful for reacting to internal date navigation\n * events (e.g., month changes) in Angular Material's calendar.\n *\n * @param calendar - Instance of MatCalendar whose `activeDate` setter will be overridden.\n * @param cdref - ChangeDetectorRef to trigger view updates after the setter runs.\n * @param handler - Custom callback function executed whenever `activeDate` is set.\n */\nexport function overrideActiveDateSetter(\n calendar: MatCalendar<Date>,\n cdref: ChangeDetectorRef,\n handler: (date: ActiveDate) => void\n): void {\n const proto = Object.getPrototypeOf(calendar);\n const descriptor = Object.getOwnPropertyDescriptor(proto, 'activeDate');\n\n if (!(descriptor?.set && descriptor?.get)) {\n console.warn(\n 'overrideActiveDateSetter: activeDate setter/getter not found on MatCalendar prototype.'\n );\n return;\n }\n const originalSetter = descriptor.set;\n const originalGetter = descriptor.get;\n\n Object.defineProperty(calendar, 'activeDate', {\n configurable: true,\n enumerable: false,\n get() {\n return originalGetter.call(this);\n },\n\n set(value: Date) {\n const activeDate: ActiveDate = {\n previous: originalGetter.call(this) ?? value,\n current: value,\n };\n originalSetter.call(this, value);\n handler.call(this, activeDate);\n cdref.markForCheck();\n },\n });\n}\n","/**\n * @(#)default-date-options.ts Sept 08, 2023\n *\n * @author Aakash Kumar\n */\nimport { DATE_OPTION_TYPE } from '../constant/date-filter-const';\nimport { ISelectDateOption } from '../model/select-date-option.model';\nimport { createOption } from '../utils/date-picker-utilities';\n\nexport const DEFAULT_DATE_OPTIONS: ISelectDateOption[] = <ISelectDateOption[]>[\n createOption('Today', DATE_OPTION_TYPE.DATE_DIFF, 0),\n createOption('Yesterday', DATE_OPTION_TYPE.DATE_DIFF, -1),\n createOption('Last 7 Days', DATE_OPTION_TYPE.DATE_DIFF, -7),\n createOption('Last 30 Days', DATE_OPTION_TYPE.DATE_DIFF, -30),\n createOption('Last Month', DATE_OPTION_TYPE.LAST_MONTH),\n createOption('This Month', DATE_OPTION_TYPE.THIS_MONTH),\n createOption('Month To Date', DATE_OPTION_TYPE.MONTH_TO_DATE),\n createOption('Week To Date', DATE_OPTION_TYPE.WEEK_TO_DATE, 0, false),\n createOption('Year To Date', DATE_OPTION_TYPE.YEAR_TO_DATE),\n createOption('Custom Range', DATE_OPTION_TYPE.CUSTOM),\n];\n","/**\n * Human-readable timedelta / date parsing utilities.\n *\n * Three independent parsers plus a public entry point that combines them:\n * 1. {@link parseIso8601Duration} - ISO 8601 durations (`P7D`, `PT1H30M`),\n * strict uppercase as required by the spec.\n * 2. {@link parseDateMath} - Grafana/Elasticsearch style date math (`now-7d`).\n * 3. {@link parseNaturalLanguage} - natural language (`7 days ago`) via a\n * parser the host app registers with {@link setNaturalLanguageParser}\n * (typically `chrono-node`). No parser registered means this step is a\n * no-op, so the library never depends on `chrono-node` directly.\n *\n * {@link parseHumanDate} tries all three and accepts lowercase ISO durations.\n */\n\n/**\n * A calendar duration parsed from an ISO 8601 duration string.\n * Each field defaults to 0 when its component is absent.\n */\nexport interface Duration {\n years: number;\n months: number;\n weeks: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\n/**\n * Options for {@link parseHumanDate}.\n */\nexport interface ParseHumanDateOptions {\n /** Reference \"now\" used to resolve relative expressions. Defaults to `new Date()`. */\n base?: Date;\n /**\n * Direction applied to a bare ISO 8601 duration: `-1` resolves it to the\n * past (`base - duration`, e.g. \"last 7 days\"), `1` to the future.\n * Defaults to `-1` to match this picker's \"Last N days\" vocabulary.\n */\n durationSign?: 1 | -1;\n /**\n * Whether to fall back to the registered natural-language parser.\n * Defaults to `true`. Has no effect if no parser was registered.\n */\n useNaturalLanguage?: boolean;\n}\n\n// ISO 8601 duration. Designators are uppercase per spec; `M` is months before\n// the `T` separator and minutes after it. Fractions allow `.` or `,`.\n// The `(?!$)` guards reject the degenerate `P` and `PT` strings.\nconst ISO_8601_DURATION =\n /^P(?!$)(?:(\\d+(?:[.,]\\d+)?)Y)?(?:(\\d+(?:[.,]\\d+)?)M)?(?:(\\d+(?:[.,]\\d+)?)W)?(?:(\\d+(?:[.,]\\d+)?)D)?(?:T(?!$)(?:(\\d+(?:[.,]\\d+)?)H)?(?:(\\d+(?:[.,]\\d+)?)M)?(?:(\\d+(?:[.,]\\d+)?)S)?)?$/;\n\n// Date math: `now` followed by zero or more `±N<unit>` operations.\n// Units: y=year, M=month, w=week, d=day, h=hour, m=minute, s=second.\nconst DATE_MATH = /^now((?:[+-]\\d+[yMwdhms])*)$/;\nconst DATE_MATH_OP = /([+-])(\\d+)([yMwdhms])/g;\n\n/**\n * Parses a strict, uppercase ISO 8601 duration string into a {@link Duration}.\n *\n * Spec-compliant: designators must be uppercase, so `P7D` parses but `p7d`\n * does not. Use {@link parseHumanDate} if you need lenient (lowercase) input.\n *\n * @param input - Candidate ISO 8601 duration, e.g. `P1Y2M10DT2H30M`.\n * @returns The parsed duration, or `null` if the string is not a valid duration.\n */\nexport function parseIso8601Duration(input: string): Duration | null {\n const match = ISO_8601_DURATION.exec(input);\n if (!match) {\n return null;\n }\n const num = (value: string | undefined): number =>\n value === undefined ? 0 : parseFloat(value.replace(',', '.'));\n return {\n years: num(match[1]),\n months: num(match[2]),\n weeks: num(match[3]),\n days: num(match[4]),\n hours: num(match[5]),\n minutes: num(match[6]),\n seconds: num(match[7]),\n };\n}\n\n/**\n * Applies a single date-math unit to a date, returning a new Date.\n * Date-level units use calendar-aware setters; the caller guarantees `unit`.\n */\nfunction applyUnit(date: Date, unit: string, amount: number): Date {\n const result = new Date(date.getTime());\n switch (unit) {\n case 'y':\n result.setFullYear(result.getFullYear() + amount);\n break;\n case 'M':\n result.setMonth(result.getMonth() + amount);\n break;\n case 'w':\n result.setDate(result.getDate() + amount * 7);\n break;\n case 'd':\n result.setDate(result.getDate() + amount);\n break;\n case 'h':\n result.setHours(result.getHours() + amount);\n break;\n case 'm':\n result.setMinutes(result.getMinutes() + amount);\n break;\n case 's':\n result.setSeconds(result.getSeconds() + amount);\n break;\n }\n return result;\n}\n\n/**\n * Applies a {@link Duration} to a base date, returning a new Date.\n *\n * Calendar units (years, months, weeks, days) use Date setters and are\n * therefore truncated to integers; sub-day units (hours, minutes, seconds)\n * are applied as milliseconds and preserve fractional values.\n *\n * @param base - The date to offset from.\n * @param duration - The duration to apply.\n * @param sign - `1` to add (future), `-1` to subtract (past). Defaults to `1`.\n * @returns A new Date offset from `base`.\n */\nexport function addDuration(base: Date, duration: Duration, sign: 1 | -1 = 1): Date {\n let result = new Date(base.getTime());\n result = applyUnit(result, 'y', sign * duration.years);\n result = applyUnit(result, 'M', sign * duration.months);\n result.setDate(result.getDate() + sign * (duration.weeks * 7 + duration.days));\n const subDayMs =\n (duration.hours * 3600 + duration.minutes * 60 + duration.seconds) * 1000;\n result.setTime(result.getTime() + sign * subDayMs);\n return result;\n}\n\n/**\n * Parses a Grafana/Elasticsearch style date-math expression into a Date.\n *\n * Supports `now` optionally followed by `±N<unit>` operations applied left to\n * right, e.g. `now`, `now-7d`, `now-1M+15d`. Units: `y M w d h m s`\n * (note `M` = month, `m` = minute). Snapping (`/d`) is not supported.\n *\n * @param input - The date-math expression.\n * @param base - Reference \"now\". Defaults to `new Date()`.\n * @returns The resolved Date, or `null` if the expression is not date math.\n */\nexport function parseDateMath(input: string, base: Date = new Date()): Date | null {\n const match = DATE_MATH.exec(input);\n if (!match) {\n return null;\n }\n let result = new Date(base.getTime());\n const operations = match[1];\n DATE_MATH_OP.lastIndex = 0;\n let op: RegExpExecArray | null;\n while ((op = DATE_MATH_OP.exec(operations)) !== null) {\n const sign = op[1] === '-' ? -1 : 1;\n const amount = parseInt(op[2], 10);\n result = applyUnit(result, op[3], sign * amount);\n }\n return result;\n}\n\n/**\n * Signature of a natural-language date parser, matching `chrono-node`'s\n * `parseDate(text, ref)` export.\n */\nexport type NaturalLanguageParser = (text: string, ref?: Date) => Date | null;\n\n// A parser registered by the host app via `setNaturalLanguageParser`. The\n// library never imports `chrono-node` itself, keeping it a truly optional\n// dependency that works the same in browser, SSR, and Node builds.\nlet registeredParser: NaturalLanguageParser | null = null;\n\n/**\n * Registers a natural-language parser (typically `chrono-node`'s `parseDate`)\n * for {@link parseNaturalLanguage} / {@link parseHumanDate} to use.\n *\n * The consumer imports the package themselves, so their bundler resolves it\n * and this library never references it directly. Call with `null` to disable.\n *\n * @example\n * import * as chrono from 'chrono-node';\n * setNaturalLanguageParser((text, ref) => chrono.parseDate(text, ref));\n *\n * @param parser - The parser to use, or `null` to disable.\n */\nexport function setNaturalLanguageParser(\n parser: NaturalLanguageParser | null\n): void {\n registeredParser = parser;\n}\n\n/**\n * Parses natural language (`7 days ago`, `next friday`) using the parser\n * registered via {@link setNaturalLanguageParser}.\n *\n * @param input - The natural-language date expression.\n * @param base - Reference date the parser resolves against. Defaults to `new Date()`.\n * @returns The parsed Date, or `null` if no parser is registered or the text\n * could not be parsed.\n */\nexport function parseNaturalLanguage(\n input: string,\n base: Date = new Date()\n): Date | null {\n if (!registeredParser) {\n return null;\n }\n try {\n return registeredParser(input, base) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Public entry point: parses a human-readable date/duration expression into a\n * concrete Date by trying, in order, date math, ISO 8601 duration, then\n * natural language via the registered parser.\n *\n * Unlike {@link parseIso8601Duration}, this accepts lowercase ISO durations\n * (`p7d`) by upper-casing the input before the ISO attempt.\n *\n * @param input - The expression, e.g. `now-7d`, `P7D`, `p7d`, `3 weeks ago`.\n * @param options - See {@link ParseHumanDateOptions}.\n * @returns The parsed Date, or `null` if nothing matched.\n */\nexport function parseHumanDate(\n input: string,\n options: ParseHumanDateOptions = {}\n): Date | null {\n const base = options.base ?? new Date();\n const durationSign = options.durationSign ?? -1;\n const useNaturalLanguage = options.useNaturalLanguage ?? true;\n\n const trimmed = input?.trim();\n if (!trimmed) {\n return null;\n }\n\n // 1. Date math (`now-7d`) - unambiguous and cheap.\n const fromDateMath = parseDateMath(trimmed, base);\n if (fromDateMath) {\n return fromDateMath;\n }\n\n // 2. ISO 8601 duration - upper-cased so lowercase input is accepted here.\n const duration = parseIso8601Duration(trimmed.toUpperCase());\n if (duration) {\n return addDuration(base, duration, durationSign);\n }\n\n // 3. Natural language via the registered parser, if any.\n if (useNaturalLanguage) {\n return parseNaturalLanguage(trimmed, base);\n }\n\n return null;\n}\n","/**\n * @(#)calendar.component.scss Sept 07, 2023\n *\n * Custom Calendar Component that manages two side-by-side\n * month views with support for date range selection, hover\n * highlighting, and navigation controls.\n *\n * @author Aakash Kumar\n */\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n inject,\n Input,\n Output,\n Renderer2,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { DateRange, MatCalendar } from '@angular/material/datepicker';\nimport { ActiveDate } from '../model/active-date.model';\nimport {\n getDateOfNextMonth,\n getFirstDateOfNextMonth,\n overrideActiveDateSetter,\n} from '../utils/date-picker-utilities';\nimport { ACTIVE_DATE_DEBOUNCE } from '../constant/date-filter-const';\n\n@Component({\n standalone: false,\n selector: 'lib-calendar',\n templateUrl: './calendar.component.html',\n styleUrls: ['./calendar.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CalendarComponent implements AfterViewInit {\n firstViewStartDate = signal(new Date());\n secondViewStartDate = signal(getDateOfNextMonth(this.firstViewStartDate()));\n secondViewMinDate = signal(\n getFirstDateOfNextMonth(this.firstViewStartDate())\n );\n\n @Input() minDate!: Date;\n @Input() maxDate!: Date;\n\n /** Emits when the user changes the selection by clicking dates in the views. */\n @Output() selectedDatesChange = new EventEmitter<DateRange<Date>>();\n\n @ViewChild('firstCalendarView') firstCalendarView!: MatCalendar<Date>;\n @ViewChild('secondCalendarView') secondCalendarView!: MatCalendar<Date>;\n\n private _selectedDates!: DateRange<Date> | null;\n private isAllowHoverEvent: boolean = false;\n private cdref = inject(ChangeDetectorRef);\n private el = inject(ElementRef);\n private renderer = inject(Renderer2);\n\n /**\n * Updates the selected date range and synchronizes both calendar views.\n */\n @Input()\n set selectedDates(selectedDates: DateRange<Date> | null) {\n this._selectedDates = selectedDates;\n if (!selectedDates || !(selectedDates.start && selectedDates.end)) return;\n\n const startDate = selectedDates.start ?? new Date();\n const endDate = selectedDates.end;\n this.firstViewStartDate.set(startDate);\n this.secondViewMinDate.set(getFirstDateOfNextMonth(startDate));\n const computedEndDate =\n startDate.getMonth() === endDate.getMonth()\n ? getDateOfNextMonth(endDate)\n : endDate;\n this.secondViewStartDate.set(computedEndDate);\n }\n\n get selectedDates() {\n return this._selectedDates;\n }\n\n /**\n * Lifecycle hook that is called after Angular has fully initialized\n * the component's view (and child views).\n *\n * Used here to attach hover events and register active date change\n * listeners once the calendar views are available in the DOM.\n */\n ngAfterViewInit(): void {\n this.attachHoverEvent('firstCalendarView');\n this.attachHoverEvent('secondCalendarView');\n this.registerActiveDateChangeEvents();\n }\n\n /**\n * Handles month selection in the first view.\n *\n * @param event - Selected month date\n */\n monthSelected(viewName: string) {\n if (viewName === 'secondCalendarView') {\n this.removeDefaultFocus(this);\n }\n this.attachHoverEvent(viewName);\n }\n\n /**\n * Updates the selected date range when a date is clicked.\n *\n * @param date - Date clicked by the user\n */\n updateDateRangeSelection(date: Date | null): void {\n const selectedDates = this.selectedDates;\n if (\n !selectedDates ||\n (selectedDates.start && selectedDates.end) ||\n (selectedDates.start && date && selectedDates.start > date)\n ) {\n this._selectedDates = new DateRange<Date>(date, null);\n this.isAllowHoverEvent = true;\n } else {\n this.isAllowHoverEvent = false;\n this._selectedDates = new DateRange<Date>(selectedDates.start, date);\n }\n this.selectedDatesChange.emit(this._selectedDates);\n this.cdref.markForCheck();\n }\n\n /**\n * Registers event handlers for active date changes on both calendar views.\n *\n * This method overrides the default `activeDate` property setter of each\n * calendar view to ensure custom handlers are executed whenever the\n * active date changes.\n */\n private registerActiveDateChangeEvents(): void {\n overrideActiveDateSetter(\n this.firstCalendarView,\n this.cdref,\n this.onFirstViewActiveDateChange.bind(this)\n );\n overrideActiveDateSetter(\n this.secondCalendarView,\n this.cdref,\n this.onSecondViewActiveDateChange.bind(this)\n );\n }\n\n /**\n * Handles the event when the active date of the first calendar view changes.\n *\n * @param activeDate - Object containing `previous` and `current` date values.\n */\n private onFirstViewActiveDateChange(activeDate: ActiveDate): void {\n const handler = this.isPrevious(activeDate)\n ? () => this.handleFirstViewPrevEvent(activeDate)\n : () => this.handleFirstViewNextEvent(activeDate.current);\n\n // Delay execution because active date event fires before view update\n setTimeout(handler, ACTIVE_DATE_DEBOUNCE);\n }\n\n /**\n * Handles the event when the active date of the second calendar view changes.\n *\n * @param activeDate - Object containing `previous` and `current` date values.\n */\n private onSecondViewActiveDateChange(activeDate: ActiveDate): void {\n this.attachHoverEvent('secondCalendarView');\n }\n\n /**\n * Handles the \"next\" navigation event for the first calendar view.\n *\n * @param currDate - The currently active date in the first calendar view.\n * @param force - Optional flag that can be used to enforce updates (not used in current logic).\n */\n private handleFirstViewNextEvent(currDate: Date, force?: boolean): void {\n if (this.firstCalendarView.currentView.toLocaleLowerCase() !== 'month') {\n return;\n }\n this.attachHoverEvent('firstCalendarView');\n const nextMonthDate = getFirstDateOfNextMonth(currDate);\n let secondViewActiveDate = this.secondCalendarView.activeDate;\n if (nextMonthDate < secondViewActiveDate) {\n this.secondViewMinDate.set(nextMonthDate);\n this.attachHoverEvent('secondCalendarView');\n return;\n }\n secondViewActiveDate = getDateOfNextMonth(currDate);\n this.secondViewMinDate.set(nextMonthDate);\n this.secondCalendarView.activeDate = secondViewActiveDate;\n this.cdref.detectChanges();\n }\n\n /**\n * Handles the \"previous\" navigation event for the first calendar view.\n *\n * @param activeDate - Object containing `previous` and `current` date values.\n */\n private handleFirstViewPrevEvent(activeDate: ActiveDate): void {\n if (this.firstCalendarView.currentView.toLocaleLowerCase() !== 'month') {\n return;\n }\n this.secondViewMinDate.set(getFirstDateOfNextMonth(activeDate.current));\n this.attachHoverEvent('firstCalendarView');\n this.attachHoverEvent('secondCalendarView');\n }\n\n /**\n * Checks whether the previous date is greater than the current date.\n *\n * @param activeDate - Object containing `previous` and `current` date values.\n * @returns `true` if the previous date is later than the current date, otherwise `false`.\n */\n private isPrevious(activeDate: ActiveDate): boolean {\n return activeDate.previous > activeDate.current;\n }\n\n /**\n * Attaches hover events to all date cells in the first view.\n */\n private attachHoverEvent(viewId: string) {\n const nodes = this.el.nativeElement.querySelectorAll(\n `#${viewId} .mat-calendar-body-cell`\n );\n setTimeout(() => this.addHoverEvents(nodes), ACTIVE_DATE_DEBOUNCE);\n }\n\n /**\n * Removes active focus from the second view.\n *\n * @param classRef - Reference to this component\n */\n private removeDefaultFocus(classRef: CalendarComponent): void {\n setTimeout(() => {\n const btn: HTMLButtonElement[] =\n classRef.el.nativeElement.querySelectorAll(\n '#secondCalendarView button.mat-calendar-body-active'\n );\n if (btn?.length) {\n btn[0].blur();\n }\n }, 1);\n }\n\n /**\n * Updates the selection range dynamically on hover.\n *\n * @param date - Hovered date\n */\n private updateSelectionOnMouseHover(date: Date): void {\n const selectedDates = this.selectedDates;\n if (selectedDates?.start && date && selectedDates.start < date) {\n const dateRange: DateRange<Date> = new DateRange<Date>(\n selectedDates.start,\n date\n );\n this.firstCalendarView.selected = dateRange;\n this.secondCalendarView.selected = dateRange;\n this.firstCalendarView['_changeDetectorRef'].markForCheck();\n this.secondCalendarView['_changeDetectorRef'].markForCheck();\n this.isAllowHoverEvent = true;\n }\n }\n\n /**\n * Attaches hover events to given nodes to update range selection.\n *\n * @param nodes - Date cell nodes\n */\n private addHoverEvents(nodes: any): void {\n if (!nodes) {\n return;\n }\n Array.from(nodes).forEach((button) => {\n this.renderer.listen(button, 'mouseover', (event) => {\n if (this.isAllowHoverEvent) {\n const date = new Date(event.target['ariaLabel']);\n this.updateSelectionOnMouseHover(date);\n }\n });\n });\n this.firstCalendarView['_changeDetectorRef'].markForCheck();\n this.secondCalendarView['_changeDetectorRef'].markForCheck();\n }\n}\n","<!--**\n * @(#)calendar.component.html Sept 07, 2023\n\n * @author Aakash Kumar\n *-->\n<div class=\"calendar-container\">\n <div class=\"first-view\">\n <mat-calendar id=\"firstCalendarView\" #firstCalendarView [startAt]=\"firstViewStartDate()\" [selected]=\"selectedDates\"\n (selectedChange)=\"updateDateRangeSelection($event)\" (monthSelected)=\"monthSelected('firstCalendarView')\" [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"></mat-calendar>\n </div>\n <div class=\"second-view\">\n <mat-calendar id=\"secondCalendarView\" #secondCalendarView [startAt]=\"secondViewStartDate()\" [minDate]=\"secondViewMinDate()\"\n [maxDate]=\"maxDate\" [selected]=\"selectedDates\" (selectedChange)=\"updateDateRangeSelection($event)\"\n (monthSelected)=\"monthSelected('secondCalendarView')\"></mat-calendar>\n </div>\n</div>\n","/**\n * @(#)ng-date-picker.component.ts Sept 05, 2023\n *\n * @author Aakash Kumar\n */\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n ElementRef,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport {\n AbstractControl,\n FormControl,\n FormGroup,\n ValidationErrors,\n Validators,\n} from '@angular/forms';\nimport { DateRange } from '@angular/material/datepicker';\nimport { SelectedDateEvent } from '../public-api';\nimport { CalendarComponent } from './calendar/calendar.component';\nimport { DATE_OPTION_TYPE } from './constant/date-filter-const';\nimport { DEFAULT_DATE_OPTIONS } from './data/default-date-options';\nimport { ISelectDateOption } from './model/select-date-option.model';\nimport {\n computeOptionDateRange,\n getClone,\n getDateString,\n getDateWithOffset,\n getDaysInMonth,\n getFormattedDateString,\n getRelativeExpr, \n parseDateByFormat,\n isSameDay,\n resetOptionSelection,\n selectCustomOption,\n} from './utils/date-picker-utilities';\nimport { parseHumanDate } from './utils/human-date-parser';\n\n@Component({\n standalone: false,\n selector: 'ng-date-range-picker',\n templateUrl: './ng-date-picker.component.html',\n styleUrls: ['./ng-date-picker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgDatePickerComponent implements OnInit, AfterViewInit {\n public isDateOptionList: boolean = false;\n public isCustomRange: boolean = false;\n @Input() inputLabel: string = 'Date Range';\n @Input() staticOptionId = 'static-options';\n @Input() dynamicOptionId = 'dynamic-options';\n @Input() calendarId: string = 'custom-calendar';\n @Input() enableDefaultOptions: boolean = true;\n @Input() selectedDates!: DateRange<Date> | null;\n @Input() dateFormat: string = 'dd/MM/yyyy';\n @Input() isShowStaticDefaultOptions: boolean = false;\n @Input() hideDefaultOptions: boolean = false;\n @Input() cdkConnectedOverlayOffsetX = 0;\n @Input() cdkConnectedOverlayOffsetY = 0;\n @Input() listCdkConnectedOverlayOffsetY = 0;\n @Input() listCdkConnectedOverlayOffsetX = 0;\n @Input() selectedOptionIndex = 3;\n @Input() displaySelectedLabel = false;\n /**\n * When true, the main input shows the human-readable expressions\n * (e.g. `now-7d - now`) instead of the absolute date range. If\n * `displaySelectedLabel` is also true, the label takes priority.\n */\n @Input() displaySelectedExpression = false;\n /**\n * When true, the custom-range footer shows two editable Material inputs\n * (start / end) that accept dates in `dateFormat`, ISO 8601 durations\n * (`p7d`), or date math (`now-7d`). When false, a read-only label is shown.\n */\n @Input() enableEditableDates = false;\n @Input() cdkConnectedOverlayPush = true;\n @Input() cdkConnectedOverlayPositions = [];\n @Input() allowSingleDateSelection = true;\n /**\n * When true, automatically selects the preset option whose computed date range\n * matches the provided selectedDates (works with both default and custom options).\n * Falls back to \"Custom Range\" if no option matches.\n */\n @Input() autoSelectOption: boolean = false;\n\n // default min date is current date - 10 years.\n @Input() minDate = getDateWithOffset(-10);\n // default max date is current date + 10 years.\n @Input() maxDate = getDateWithOffset(10);\n\n @Output() onDateSelectionChanged = new EventEmitter<SelectedDateEvent>();\n @Output() dateListOptions = new EventEmitter<ISelectDateOption[]>();\n\n private cdref: ChangeDetectorRef = inject(ChangeDetectorRef);\n private el: ElementRef = inject(ElementRef);\n\n private _dateOptions: WritableSignal<ISelectDateOption[]> = signal([]);\n visibleOptions = computed(() =>\n this._dateOptions().filter((op) => op.isVisible)\n );\n\n /**\n * Reactive form backing the editable start/end inputs. Each control accepts\n * a `dateFormat` date, an ISO 8601 duration, or a date-math expression; the\n * group is invalid when either value is unparseable or start is after end.\n */\n editableForm = new FormGroup(\n {\n start: new FormControl('', {\n nonNullable: true,\n validators: [Validators.required, (c) => this.validateDateControl(c)],\n }),\n end: new FormControl('', {\n nonNullable: true,\n validators: [Validators.required, (c) => this.validateDateControl(c)],\n }),\n },\n { validators: (g) => this.validateRange(g) }\n );\n\n // The raw expressions the user last committed via the editable inputs, kept\n // so human-language input (e.g. `now-7d`) is shown again instead of being\n // replaced by an absolute date - but only while it still resolves to the\n // current range (see populateEditableForm).\n private editableExpr: { start: string; end: string } | null = null;\n\n constructor() {}\n\n @Input()\n set dateDropDownOptions(defaultDateList: ISelectDateOption[]) {\n const options = [\n ...(this.enableDefaultOptions ? getClone(DEFAULT_DATE_OPTIONS) : []),\n ...(defaultDateList ?? []),\n ];\n this._dateOptions.set(options);\n }\n\n get dateDropDownOptions(): ISelectDateOption[] {\n return this._dateOptions() ?? [];\n }\n\n ngOnInit(): void {\n if (this.isDefaultInitRequired()) {\n this.initDefaultOptions();\n }\n this.dateListOptions.emit(this.dateDropDownOptions);\n }\n\n ngAfterViewInit(): void {\n this.updateDefaultDatesValues();\n }\n\n /**\n * Toggles the visibility of the default date option list.\n * If the custom range panel is open, closes it instead.\n *\n * @param event Optional MouseEvent triggering the toggle.\n */\n toggleDateOptionSelectionList(event?: MouseEvent): void {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n\n if (this.isCustomRange) {\n this.isCustomRange = false;\n return;\n }\n if (this.isDateOptionList) {\n this.isDateOptionList = false;\n return;\n }\n // When the active selection is a custom range, reopen straight into the\n // custom-range view instead of the options list.\n const selectedOption = this.dateDropDownOptions.find((o) => o.isSelected);\n if (selectedOption?.optionType === DATE_OPTION_TYPE.CUSTOM) {\n this.isCustomRange = true;\n this.populateEditableForm();\n return;\n }\n this.isDateOptionList = true;\n }\n\n /**\n * Updates the custom date range selection from the input.\n *\n * @param input The HTML input element associated with the date picker.\n * @param selectedDates The selected date range.\n */\n updateCustomRange(\n input: HTMLInputElement,\n selectedDates: DateRange<Date> | null\n ): void {\n if (this.allowSingleDateSelection && !selectedDates?.end) {\n const date = selectedDates?.start ?? new Date();\n selectedDates = new DateRange<Date>(date, date);\n }\n if (this.isCustomRange) {\n resetOptionSelection(this.dateDropDownOptions);\n selectCustomOption(this.dateDropDownOptions);\n this.syncOptionSelection();\n this.isCustomRange = false;\n }\n\n const start = selectedDates?.start ?? new Date();\n const end = selectedDates?.end ?? new Date();\n this.updateSelectedDates(input, start, end, null);\n }\n\n /**\n * Updates the selection when a specific date option is clicked.\n *\n * @param option The selected date option.\n * @param input The HTML input element to update with selected dates.\n */\n updateSelection(option: ISelectDateOption, input: HTMLInputElement): void {\n this.isDateOptionList = false;\n this.isCustomRange = option.optionType === DATE_OPTION_TYPE.CUSTOM;\n if (this.isCustomRange) {\n resetOptionSelection(this.dateDropDownOptions);\n selectCustomOption(this.dateDropDownOptions);\n this.populateEditableForm();\n } else {\n resetOptionSelection(this.dateDropDownOptions, option);\n this.updateDateOnOptionSelect(option, input);\n }\n this.syncOptionSelection();\n this.cdref.markForCheck();\n }\n\n /**\n * Re-emits the options signal after an in-place selection change so the\n * OnPush views (bound to the `visibleOptions` computed) reliably reflect the\n * new `isSelected` state - the same notification the initial signal `set`\n * provides.\n */\n private syncOptionSelection(): void {\n this._dateOptions.update((options) => [...options]);\n }\n\n /**\n * Toggles the custom date range selection view visibility.\n */\n toggleCustomDateRangeView(): void {\n this.isCustomRange = !this.isCustomRange;\n if (this.isCustomRange) {\n this.populateEditableForm();\n }\n }\n\n /**\n * Parses a single editable input value, accepting either a `dateFormat`\n * date or one of the human formats (ISO 8601 duration, date math).\n *\n * @param value - The raw input string.\n * @returns The parsed Date, or `null` if it cannot be parsed.\n */\n private parseInputValue(value: string): Date | null {\n const trimmed = value?.trim();\n if (!trimmed) {\n return null;\n }\n return parseDateByFormat(trimmed, this.dateFormat) ?? parseHumanDate(trimmed);\n }\n\n /**\n * Validator for a single editable date control: valid when the value parses\n * to a date. Empty values are left to the `required` validator.\n */\n private validateDateControl(control: AbstractControl): ValidationErrors | null {\n const value = (control.value ?? '').trim();\n if (!value) {\n return null;\n }\n return this.parseInputValue(value) ? null : { invalidDate: true };\n }\n\n /**\n * Group validator ensuring the parsed start date is not after the end date.\n */\n private validateRange(group: AbstractControl): ValidationErrors | null {\n const start = this.parseInputValue(group.get('start')?.value ?? '');\n const end = this.parseInputValue(group.get('end')?.value ?? '');\n if (start && end && start > end) {\n return { rangeOrder: true };\n }\n return null;\n }\n\n /**\n * Commits the editable inputs to the calendar so the views and the Apply\n * action reflect the typed values. No-op when editing is disabled or the\n * form is invalid.\n *\n * @param calendar - The calendar component instance from the template.\n */\n commitEditableDates(calendar: CalendarComponent): void {\n if (!this.enableEditableDates || this.editableForm.invalid) {\n return;\n }\n const startRaw = this.editableForm.controls.start.value.trim();\n const endRaw = this.editableForm.controls.end.value.trim();\n const start = this.parseInputValue(startRaw);\n const end = this.parseInputValue(endRaw);\n if (!start || !end) {\n return;\n }\n // Remember exactly what the user typed so the expression (e.g. `now-7d`)\n // survives a reopen instead of being shown as a resolved absolute date.\n this.editableExpr = { start: startRaw, end: endRaw };\n calendar.selectedDates = new DateRange<Date>(start, end);\n this.cdref.markForCheck();\n }\n\n /**\n * Reflects a calendar (date-click) selection in the editable inputs as\n * absolute dates. A calendar pick is an explicit absolute selection, so any\n * remembered expression is cleared and the inputs show formatted dates.\n *\n * @param range - The range emitted by the calendar.\n */\n onCalendarSelectionChange(range: DateRange<Date>): void {\n if (!this.enableEditableDates) {\n return;\n }\n this.editableExpr = null;\n this.editableForm.setValue({\n start: range.start ? getDateString(range.start, this.dateFormat) : '',\n end: range.end ? getDateString(range.end, this.dateFormat) : '',\n });\n this.cdref.markForCheck();\n }\n\n /**\n * Commits the editable inputs and applies the range, closing the panel -\n * the same as clicking Apply. Used for the Enter key. No-op when editing is\n * disabled or the form is invalid, so Enter never closes with bad input.\n *\n * @param input - The main date input element to update.\n * @param calendar - The calendar component instance from the template.\n */\n applyEditableDates(input: HTMLInputElement, calendar: CalendarComponent): void {\n if (!this.enableEditableDates || this.editableForm.invalid) {\n return;\n }\n this.commitEditableDates(calendar);\n this.updateCustomRange(input, calendar.selectedDates);\n }\n\n /**\n * Pre-fills the editable inputs from the current selection: relative\n * expressions for a day-diff option (e.g. `now-7d` .. `now`), otherwise the\n * absolute formatted dates.\n */\n private populateEditableForm(): void {\n if (!this.enableEditableDates) {\n return;\n }\n const range = this.selectedDates;\n if (range?.start && range?.end) {\n const option =\n this.dateDropDownOptions.find((o) => o.isSelected) ?? null;\n this.editableForm.setValue(\n this.resolveDisplayExpr(range.start, range.end, option)\n );\n } else {\n this.editableForm.setValue({ start: '', end: '' });\n }\n }\n\n /**\n * Resolves the human-readable start/end expressions for a range. Prefers the\n * user's own committed expression (when it still resolves to this range),\n * then the relative form of a day-diff option, and finally the absolute\n * formatted dates. Shared by the editable inputs and the emitted event.\n *\n * @param start - Range start date.\n * @param end - Range end date.\n * @param opt - The associated date option, if any.\n * @returns The start and end expression strings.\n */\n private resolveDisplayExpr(\n start: Date,\n end: Date,\n opt: ISelectDateOption | null\n ): { start: string; end: string } {\n if (this.editableExpr && this.exprMatchesDates(this.editableExpr, start, end)) {\n return { start: this.editableExpr.start, end: this.editableExpr.end };\n }\n const optionExpr = getRelativeExpr(opt);\n if (optionExpr) {\n return optionExpr;\n }\n return {\n start: getDateString(start, this.dateFormat),\n end: getDateString(end, this.dateFormat),\n };\n }\n\n /**\n * Checks whether a saved expression still resolves (to day precision) to the\n * given dates, so a stale expression is not reused after the range changed\n * by other means.\n */\n private exprMatchesDates(\n expr: { start: string; end: string },\n start: Date,\n end: Date\n ): boolean {\n const exprStart = this.parseInputValue(expr.start);\n const exprEnd = this.parseInputValue(expr.end);\n return (\n !!exprStart &&\n !!exprEnd &&\n isSameDay(exprStart, start) &&\n isSameDay(exprEnd, end)\n );\n }\n\n /**\n * Clears the currently selected dates and resets all related properties.\n *\n * @param event The MouseEvent triggering the clear action.\n */\n clearSelection(event: MouseEvent): void {\n event?.stopImmediatePropagation();\n this.minDate = getDateWithOffset(-10);\n this.maxDate = getDateWithOffset(10);\n this.selectedDates = null;\n resetOptionSelection(this.dateDropDownOptions);\n this.syncOptionSelection();\n this.clearDateInput();\n this.cdref.markForCheck();\n const selectedDateEventData: SelectedDateEvent = {\n range: null,\n selectedOption: null,\n startExpr: null,\n endExpr: null,\n };\n this.onDateSelectionChanged.emit(selectedDateEventData);\n }\n\n /**\n * Clears the input field value for the date picker.\n */\n private clearDateInput(): void {\n const dateInputField =\n this.el.nativeElement.querySelector('#date-input-field');\n if (dateInputField) {\n dateInputField.value = '';\n }\n }\n\n /**\n * Updates selected dates based on a selected option and input element.\n *\n * @param option The selected date option.\n * @param input The HTML input element to update.\n */\n private updateDateOnOptionSelect(\n option: ISelectDateOption,\n input: HTMLInputElement\n ): void {\n // If there is a callback function, use it to get the date range\n if (option?.callBackFunction) {\n const dateRange: DateRange<Date> = option.callBackFunction();\n if (dateRange?.start && dateRange?.end) {\n this.updateSelectedDates(input, dateRange.start, dateRange.end, option);\n return;\n }\n }\n this.updateDateWithSelectedOption(option, input);\n }\n\n /**\n * Calculates and updates the start and end dates based on the selected option.\n *\n * @param option The selected date option.\n * @param input The HTML input element to update.\n */\n private updateDateWithSelectedOption(\n option: ISelectDateOption,\n input: HTMLInputElement\n ): void {\n const currDate = new Date();\n let startDate: Date = new Date();\n let lastDate: Date = new Date();\n // Determine the date range based on the option key\n switch (option.optionType) {\n case DATE_OPTION_TYPE.DATE_DIFF:\n startDate.setDate(startDate.getDate() + (option.dateDiff ?? 0));\n break;\n\n case DATE_OPTION_TYPE.LAST_MONTH:\n currDate.setMonth(currDate.getMonth() - 1);\n startDate = new Date(currDate.getFullYear(), currDate.getMonth(), 1);\n lastDate = new Date(\n currDate.getFullYear(),\n currDate.getMonth(),\n getDaysInMonth(currDate)\n );\n break;\n\n case DATE_OPTION_TYPE.THIS_MONTH:\n startDate = new Date(currDate.getFullYear(), currDate.getMonth(), 1);\n lastDate = new Date(\n currDate.getFullYear(),\n currDate.getMonth(),\n getDaysInMonth(currDate)\n );\n break;\n\n case DATE_OPTION_TYPE.YEAR_TO_DATE:\n startDate = new Date(currDate.getFullYear(), 0, 1);\n break;\n\n case DATE_OPTION_TYPE.MONTH_TO_DATE:\n startDate = new Date(currDate.getFullYear(), currDate.getMonth(), 1);\n break;\n\n default:\n break;\n }\n\n // Update the selected dates\n this.updateSelectedDates(input, startDate, lastDate, option);\n }\n\n /**\n * Updates the date range and input display.\n *\n * @param input The HTML input element.\n * @param start Start date of the range.\n * @param end End date of the range.\n * @param opt Optional selected date option.\n */\n private updateSelectedDates(\n input: HTMLInputElement,\n start: Date,\n end: Date,\n opt: ISelectDateOption | null\n ): void {\n const range = new DateRange(start, end);\n this.selectedDates = range;\n\n const expr = this.resolveDisplayExpr(start, end, opt);\n const rangeLabel = `${getDateString(\n start,\n this.dateFormat\n )} - ${getDateString(end, this.dateFormat)}`;\n\n if (this.displaySelectedLabel && opt?.optionLabel) {\n input.value = opt.optionLabel;\n } else if (this.displaySelectedExpression) {\n input.value = `${expr.start} - ${expr.end}`;\n } else {\n input.value = rangeLabel;\n }\n\n this.onDateSelectionChanged.emit({\n range,\n selectedOption:\n this.dateDropDownOptions.find((o) => o.isSelected) ?? null,\n startExpr: expr.start,\n endExpr: expr.end,\n });\n this.cdref.markForCheck();\n }\n\n /**\n * Updates the input and internal state with default dates on initialization.\n * When autoSelectOption is true and selectedDates is provided, attempts to\n * match against existing options before falling back to Custom Range.\n */\n private updateDefaultDatesValues(): void {\n const input: HTMLInputElement =\n this.el.nativeElement.querySelector('#date-input-field');\n\n if (this.selectedDates?.start && this.selectedDates?.end) {\n const matchedOption = this.autoSelectOption\n ? this.findMatchingOption(this.selectedDates as DateRange<Date>)\n : null;\n\n if (matchedOption) {\n resetOptionSelection(this.dateDropDownOptions, matchedOption);\n const label = this.displaySelectedLabel ? matchedOption.optionLabel : null;\n input.value = label ?? getFormattedDateString(this.selectedDates, this.dateFormat);\n } else {\n resetOptionSelection(this.dateDropDownOptions);\n selectCustomOption(this.dateDropDownOptions);\n input.value = getFormattedDateString(this.selectedDates, this.dateFormat);\n }\n\n this.cdref.detectChanges();\n return;\n }\n\n const selectedOptions = this._dateOptions().find(\n (option) => option.isSelected\n );\n\n if (\n selectedOptions &&\n selectedOptions.optionType !== DATE_OPTION_TYPE.CUSTOM\n ) {\n this.updatedFromListValueSelection(selectedOptions, input);\n this.cdref.detectChanges();\n }\n }\n\n /**\n * Iterates over all non-custom options and returns the first one whose\n * computed date range matches the provided selectedDates (day-level comparison).\n * Works for both default options and consumer-provided options with callBackFunction.\n *\n * @param selectedDates The date range to match against\n * @returns The matching ISelectDateOption, or null if none found\n */\n private findMatchingOption(\n selectedDates: DateRange<Date>\n ): ISelectDateOption | null {\n const candidates = this.dateDropDownOptions.filter(\n (option) => option.optionType !== DATE_OPTION_TYPE.CUSTOM\n );\n\n for (const option of candidates) {\n const range = computeOptionDateRange(option);\n if (\n range?.start &&\n range?.end &&\n isSameDay(range.start, selectedDates.start!) &&\n isSameDay(range.end, selectedDates.end!)\n ) {\n return option;\n }\n }\n\n return null;\n }\n\n /**\n * Updates the input and selected dates based on a selected option from the list.\n *\n * @param selectedOption The selected date option.\n * @param input The HTML input element to update.\n */\n private updatedFromListValueSelection(\n selectedOption: ISelectDateOption,\n input: HTMLInputElement\n ): void {\n // This will update value if option is selected from default list.\n if (!selectedOption['callBackFunction']) {\n this.updateDateOnOptionSelect(selectedOption, input);\n return;\n }\n // This will update value if option is selected from provided custom list.\n const dateRange: DateRange<Date> = selectedOption.callBackFunction();\n this.updateSelectedDates(\n input,\n dateRange.start ?? new Date(),\n dateRange.end ?? new Date(),\n selectedOption\n );\n }\n\n /**\n * Checks whether default initialization of options is required.\n *\n * @returns True if default options need to be initialized, otherwise false.\n */\n private isDefaultInitRequired(): boolean {\n return this.enableDefaultOptions && !this._dateOptions.length;\n }\n\n /**\n * Initializes the default date options with the selected index.\n */\n private initDefaultOptions(): void {\n const options = getClone<ISelectDateOption[]>(DEFAULT_DATE_OPTIONS).map(\n (opt, idx) => ({\n ...opt,\n isSelected: idx === this.selectedOptionIndex,\n })\n );\n this._dateOptions.set(options);\n }\n}\n","<!--**\n * @(#)ng-date-picker.component.html Sept 05, 2023\n\n * @author Aakash Kumar\n *-->\n<div class=\"date-picker-main ndp-main\" cdkOverlayOrigin #trigger>\n <mat-form-field class=\"w-full\" [class]=\"{'display-hidden':isShowStaticDefaultOptions}\" (click)=\"toggleDateOptionSelectionList($event)\">\n <mat-label (click)=\"toggleDateOptionSelectionList($event)\">{{inputLabel}}</mat-label>\n <input matInput readonly=\"readonly\" #dateInput class=\"cursor-pointer\" id=\"date-input-field\">\n @if (!!dateInput.value) {\n <button mat-icon-button matSuffix class=\"cursor-pointer pe-0 ps-0\" matTooltip=\"Clear\"\n (click)=\"clearSelection($event)\">\n <mat-icon>clear</mat-icon>\n </button>\n }\n <button mat-icon-button matSuffix class=\"cursor-pointer\"> <mat-icon>date_range</mat-icon></button>\n </mat-form-field>\n\n @if(dateDropDownOptions.length && isShowStaticDefaultOptions) {\n <ng-container *ngTemplateOutlet=\"dateOptionList;\n context: {\n $implicit: visibleOptions(),\n dateInput: dateInput,\n optionId: staticOptionId,\n className:'w-full custom-ckd-container ndp-cdk-container range-input',\n }\"\n ></ng-container>\n }\n\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayHasBackdrop]=\"false\" [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isDateOptionList\" [cdkConnectedOverlayPush]=\"cdkConnectedOverlayPush\"\n [cdkConnectedOverlayOffsetX]=\"listCdkConnectedOverlayOffsetX\"\n [cdkConnectedOverlayOffsetY]=\"listCdkConnectedOverlayOffsetY\"\n (overlayOutsideClick)=\"!isShowStaticDefaultOptions && toggleDateOptionSelectionList()\">\n\n @if(dateDropDownOptions.length && !isShowStaticDefaultOptions) {\n <ng-container *ngTemplateOutlet=\"dateOptionList;\n context: {\n $implicit: visibleOptions(),\n dateInput: dateInput,\n optionId: dynamicOptionId,\n className:'w-full custom-ckd-container ndp-cdk-container range-input',\n }\"\n ></ng-container>\n }\n </ng-template>\n\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayHasBackdrop]=\"false\" [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isCustomRange\" [cdkConnectedOverlayPush]=\"cdkConnectedOverlayPush\"\n [cdkConnectedOverlayPositions]=\"cdkConnectedOverlayPositions\"\n [cdkConnectedOverlayOffsetX]=\"cdkConnectedOverlayOffsetX\" [cdkConnectedOverlayOffsetY]=\"cdkConnectedOverlayOffsetY\"\n (overlayOutsideClick)=\"toggleCustomDateRangeView()\">\n <div class=\"custom-ckd-container ndp-cdk-container custom-calendar-container ndp-calendar-container\" [class]=\"{'without-default-opt':hideDefaultOptions}\">\n <div class=\"row-1\">\n @if (!hideDefaultOptions) {\n <div class=\"pt-custom column-1\">\n <ng-container\n *ngTemplateOutlet=\"dateOptionList;\n context: {\n $implicit: visibleOptions(),\n dateInput: dateInput,\n }\"\n ></ng-container>\n </div>\n <div class=\"ndp-column-separator\"></div>\n }\n <div class=\"mt-2 column-2\"><lib-calendar [selectedDates]=\"selectedDates\" #calendar [minDate]=\"minDate\"\n [maxDate]=\"maxDate\" (selectedDatesChange)=\"onCalendarSelectionChange($event)\"></lib-calendar></div>\n </div>\n <div class=\"row-2 br-top\">\n <div class=\"footer-content ndp-footer-content\">\n @if (enableEditableDates) {\n <form class=\"ndp-date-inputs\" [formGroup]=\"editableForm\">\n <mat-form-field class=\"ndp-date-field\" subscriptSizing=\"dynamic\">\n <mat-label>Start</mat-label>\n <input matInput formControlName=\"start\" placeholder=\"e.g. now-7d\"\n (blur)=\"commitEditableDates(calendar)\"\n (keydown.enter)=\"applyEditableDates(dateInput, calendar)\">\n @if (editableForm.controls.start.hasError('required')) {\n <mat-error>Required</mat-error>\n } @else if (editableForm.controls.start.hasError('invalidDate')) {\n <mat-error>Invalid date or expression</mat-error>\n }\n </mat-form-field>\n <mat-form-field class=\"ndp-date-field\" subscriptSizing=\"dynamic\">\n <mat-label>End</mat-label>\n <input matInput formControlName=\"end\" placeholder=\"e.g. now\"\n (blur)=\"commitEditableDates(calendar)\"\n (keydown.enter)=\"applyEditableDates(dateInput, calendar)\">\n @if (editableForm.controls.end.hasError('required')) {\n <mat-error>Required</mat-error>\n } @else if (editableForm.controls.end.hasError('invalidDate')) {\n <mat-error>Invalid date or expression</mat-error>\n } @else if (editableForm.hasError('rangeOrder')) {\n <mat-error>Start must be before end</mat-error>\n }\n </mat-form-field>\n </form>\n } @else {\n <span id=\"range-label-text\" class=\"ndp-range-label-text\">\n {{calendar?.selectedDates?.start | date: dateFormat}}\n @if (calendar?.selectedDates?.end) {\n <span> - {{calendar.selectedDates?.end | date: dateFormat}} </span>\n }\n </span>\n }\n <div class=\"buttons\">\n <button mat-button mat-raised-button (click)=\"isCustomRange=false;\">Cancel</button>\n <button mat-button mat-raised-button color=\"primary\"\n [class.disabled]=\"enableEditableDates ? editableForm.invalid : !(calendar?.selectedDates?.start && calendar?.selectedDates?.end)\"\n (click)=\"enableEditableDates && commitEditableDates(calendar); updateCustomRange(dateInput,calendar.selectedDates);\"> Apply </button>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n</div>\n\n<ng-template #dateOptionList let-options let-input=\"dateInput\" let-optionId=\"optionId\" let-className=\"className\">\n <mat-action-list [ngClass]=\"className\" [id]=\"optionId\">\n @for (option of options; track option.optionLabel) {\n <mat-list-item [activated]=\"option.isSelected\" (click)=\"updateSelection(option, input)\">\n {{option.optionLabel}}\n </mat-list-item>\n }\n </mat-action-list>\n</ng-template>\n","import { DateRange } from '@angular/material/datepicker';\nimport { DATE_OPTION_TYPE } from '../constant/date-filter-const';\n\n/**\n * @(#)select-date-option.ts Sept 08, 2023\n *\n * Defines the structure and behavior of a selectable date option,\n * used in date filtering components.\n *\n * @author Aakash Kumar\n */\nexport interface ISelectDateOption {\n /**\n * Label displayed in the drop-down list for this option.\n * Example: \"Last 7 Days\", \"Today\", \"Custom\".\n */\n optionLabel: string;\n\n /**\n * Type of the option, indicating how the date is determined.\n * Defaults to DATE_DIFF if not provided.\n */\n optionType?: DATE_OPTION_TYPE;\n\n /**\n * Number of days offset from today.\n *\n * - Positive numbers indicate future dates.\n * - Negative numbers indicate past dates.\n * - Used only when optionType is DATE_DIFF and no callback is provided.\n *\n * Example: -7 → \"Last 7 Days\"\n */\n dateDiff?: number;\n\n /**\n * Whether this option is currently selected.\n */\n isSelected: boolean;\n\n /**\n * Whether this option should be shown in the drop-down list.\n */\n isVisible: boolean;\n\n /**\n * Custom function to calculate and return a DateRange.\n * Used when optionType requires special handling beyond dateDiff.\n */\n callBackFunction?: () => DateRange<Date>;\n\n /**\n * Optional date-math/relative expression shown for the range start when\n * editable inputs are enabled (e.g. `now-7d`). Overrides the value derived\n * from `dateDiff`. Must be paired with {@link endExpr}.\n */\n startExpr?: string;\n\n /**\n * Optional date-math/relative expression shown for the range end when\n * editable inputs are enabled (e.g. `now`). Must be paired with\n * {@link startExpr}.\n */\n endExpr?: string;\n}\n\n/**\n * Default implementation of a selectable date option.\n * Provides default values for all fields.\n */\nexport class SelectDateOption implements ISelectDateOption {\n optionLabel = '';\n optionType = DATE_OPTION_TYPE.DATE_DIFF;\n dateDiff = 0;\n isSelected = false;\n isVisible = false;\n callBackFunction!: () => DateRange<Date>;\n}\n","/**\n * @(#)ng-date-picker.module.ts Sept 05, 2023\n *\n * @author Aakash Kumar\n */\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { CalendarComponent } from './calendar/calendar.component';\nimport { NgDatePickerComponent } from './ng-date-picker.component';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n@NgModule({\n declarations: [NgDatePickerComponent, CalendarComponent],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatDatepickerModule,\n MatNativeDateModule,\n MatInputModule,\n MatAutocompleteModule,\n OverlayModule,\n MatIconModule,\n MatButtonModule,\n MatListModule,\n MatFormFieldModule,\n MatTooltipModule,\n ],\n exports: [NgDatePickerComponent],\n})\nexport class NgDatePickerModule {}\n","/**\n * @(#)public-api.ts Sept 05, 2023\n *\n * @author Aakash Kumar\n */\n\n// Public API Surface of ng-date-picker\nexport * from './lib/ng-date-picker.component';\nexport * from './lib/model/select-date-option.model';\nexport * from './lib/ng-date-picker.module';\nexport * from './lib/constant/date-filter-const';\nexport * from './lib/model/date-selection-event.model';\nexport * from './lib/utils/human-date-parser';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i9.CalendarComponent"],"mappings":"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"}