UNPKG

ngx-persian-datepicker-element

Version:

Angular wrapper for Persian DatePicker Web Component with signal-based inputs (English/Persian docs)

1 lines 31.1 kB
{"version":3,"file":"ngx-persian-datepicker-element.mjs","sources":["../../../projects/ngx-persian-datepicker-element/src/lib/ngx-persian-datepicker.component.ts","../../../projects/ngx-persian-datepicker-element/src/lib/ngx-persian-datepicker.module.ts","../../../projects/ngx-persian-datepicker-element/src/lib/index.ts","../../../projects/ngx-persian-datepicker-element/src/public-api.ts","../../../projects/ngx-persian-datepicker-element/src/ngx-persian-datepicker-element.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n CUSTOM_ELEMENTS_SCHEMA,\r\n computed,\r\n effect,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n inject,\r\n Injector,\r\n input,\r\n InputSignal,\r\n NgZone,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n signal,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\r\n\r\n// Import local type definitions\r\nimport { DateTuple } from './persian-datepicker-types';\r\n\r\n// Import the web component\r\n// This import ensures the web component script is included in the bundle\r\nimport 'persian-datepicker-element/dist/persian-datepicker-element.min.js';\r\n\r\n/** \r\n * Angular wrapper for the Persian DatePicker Web Component\r\n * \r\n * This component provides Angular bindings for the native Persian DatePicker web component,\r\n * allowing it to be used with Angular forms (both reactive and template-driven) and\r\n * custom event handling.\r\n * \r\n * Note: The component automatically imports and registers the persian-datepicker-element\r\n * web component, so you don't need to add any scripts to your angular.json file.\r\n * \r\n * @example\r\n * Basic usage:\r\n * ```html\r\n * <ngx-persian-datepicker-element \r\n * placeholderInput=\"انتخاب تاریخ\"\r\n * formatInput=\"YYYY/MM/DD\" \r\n * [showEventsInput]=\"true\" \r\n * (dateChange)=\"onDateChange($event)\">\r\n * </ngx-persian-datepicker-element>\r\n * ```\r\n * \r\n * With Angular forms:\r\n * ```html\r\n * <form [formGroup]=\"myForm\">\r\n * <ngx-persian-datepicker-element formControlName=\"date\"></ngx-persian-datepicker-element>\r\n * </form>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ngx-persian-datepicker-element',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n template: '<div #container></div>',\r\n styles: [`\r\n :host {\r\n display: block;\r\n width: 100%;\r\n }\r\n `],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NgxPersianDatepickerComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class NgxPersianDatepickerComponent implements OnInit, OnDestroy, ControlValueAccessor {\r\n // Dependency injection using inject() function\r\n private readonly elRef = inject(ElementRef);\r\n private readonly zone = inject(NgZone);\r\n private readonly injector = inject(Injector);\r\n\r\n // Web component reference - expose it to be accessed from parent components\r\n readonly elementSignal = signal<HTMLElement | null>(null);\r\n\r\n // Form control implementation as signals\r\n private readonly onChangeSignal = signal<(value: any) => void>(() => {});\r\n private readonly onTouchSignal = signal<() => void>(() => {});\r\n private readonly valueSignal = signal<DateTuple | null>(null);\r\n private readonly disabledSignal = signal<boolean>(false);\r\n\r\n // #region Input Signals\r\n readonly placeholder = input<string | undefined>(undefined);\r\n readonly format = input<string | undefined>(undefined);\r\n readonly showEvents = input<boolean | undefined>(undefined);\r\n readonly eventTypes = input<string | string[] | undefined>(undefined);\r\n readonly rtl = input<boolean | undefined>(undefined);\r\n readonly minDate = input<DateTuple | undefined>(undefined);\r\n readonly maxDate = input<DateTuple | undefined>(undefined);\r\n readonly disabledDates = input<string | ((year: number, month: number, day: number) => boolean) | undefined>(undefined);\r\n readonly rangeMode = input<boolean | undefined>(undefined);\r\n readonly rangeStart = input<DateTuple | undefined>(undefined);\r\n readonly rangeEnd = input<DateTuple | undefined>(undefined);\r\n readonly defaultDate = input<DateTuple | undefined>(undefined);\r\n // #endregion\r\n\r\n // #region Outputs\r\n @Output() dateChange = new EventEmitter<any>();\r\n // #endregion\r\n\r\n /** Reference to the container where the web component will be attached */\r\n @ViewChild('container', { static: true }) containerRef!: ElementRef;\r\n\r\n constructor() {\r\n // Create an effect to respond to changes in the element signal\r\n effect(() => {\r\n const element = this.elementSignal();\r\n if (element) {\r\n // Apply initial attributes and styles when the element is created\r\n this.setInitialAttributes();\r\n }\r\n });\r\n\r\n // Create effects for each input to update attributes when they change\r\n this.setupInputEffects();\r\n }\r\n\r\n /**\r\n * Apply theme variables to the datepicker element\r\n * @param variables Object containing CSS variable names and values\r\n */\r\n applyThemeVariables(variables: Record<string, string>) {\r\n const element = this.elementSignal();\r\n if (!element) return;\r\n \r\n for (const [prop, value] of Object.entries(variables)) {\r\n element.style.setProperty(prop, value);\r\n }\r\n }\r\n\r\n /**\r\n * Set up effects for all inputs to update attributes/styles when they change\r\n */\r\n private setupInputEffects() {\r\n // Placeholder\r\n effect(() => {\r\n const value = this.placeholder();\r\n if (value !== undefined) {\r\n this.updateAttribute('placeholder', value);\r\n }\r\n });\r\n\r\n // Format\r\n effect(() => {\r\n const value = this.format();\r\n if (value !== undefined) {\r\n this.updateAttribute('format', value);\r\n }\r\n });\r\n\r\n // Show Holidays\r\n effect(() => {\r\n const value = this.showEvents();\r\n if (value !== undefined) {\r\n this.updateAttribute('show-holidays', String(value));\r\n }\r\n });\r\n\r\n // Holiday Types\r\n effect(() => {\r\n const value = this.eventTypes();\r\n if (value !== undefined) {\r\n this.updateeventTypesAttribute(value);\r\n }\r\n });\r\n\r\n // RTL\r\n effect(() => {\r\n const value = this.rtl();\r\n if (value !== undefined) {\r\n this.updateAttribute('rtl', String(value));\r\n }\r\n });\r\n\r\n // Range picker effects\r\n effect(() => {\r\n const value = this.rangeMode();\r\n if (value !== undefined) {\r\n this.updateAttribute('range-mode', String(value));\r\n }\r\n });\r\n\r\n effect(() => {\r\n const value = this.rangeStart();\r\n if (value !== undefined) {\r\n this.updateAttribute('range-start', JSON.stringify(value));\r\n }\r\n });\r\n\r\n effect(() => {\r\n const value = this.rangeEnd();\r\n if (value !== undefined) {\r\n this.updateAttribute('range-end', JSON.stringify(value));\r\n }\r\n });\r\n\r\n // Add effects for new inputs\r\n effect(() => {\r\n const value = this.minDate();\r\n if (value !== undefined) {\r\n this.updateAttribute('min-date', JSON.stringify(value));\r\n }\r\n });\r\n\r\n effect(() => {\r\n const value = this.maxDate();\r\n if (value !== undefined) {\r\n this.updateAttribute('max-date', JSON.stringify(value));\r\n }\r\n });\r\n\r\n effect(() => {\r\n const value = this.disabledDates();\r\n if (value !== undefined) {\r\n if (typeof value === 'function') {\r\n const element = this.elementSignal();\r\n if (element && 'setDisabledDatesFn' in element) {\r\n (element as any).setDisabledDatesFn(value);\r\n }\r\n } else {\r\n this.updateAttribute('disabled-dates', value);\r\n }\r\n }\r\n });\r\n\r\n effect(() => {\r\n const value = this.defaultDate();\r\n if (value !== undefined) {\r\n this.updateAttribute('default-date', JSON.stringify(value));\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n // Create the web component instance\r\n this.createWebComponent();\r\n }\r\n\r\n /**\r\n * Create the web component instance\r\n */\r\n private createWebComponent() {\r\n // Create the element\r\n this.zone.runOutsideAngular(() => {\r\n try {\r\n // Make sure the web component is registered\r\n // This will typically happen from the import, but we check just in case\r\n if (typeof window !== 'undefined' && !customElements.get('persian-datepicker-element')) {\r\n console.warn('persian-datepicker-element not found in custom elements registry. The import should have registered it.');\r\n }\r\n \r\n // Create the web component\r\n const element = document.createElement('persian-datepicker-element');\r\n \r\n // Add the change event listener\r\n element.addEventListener('change', this.handleChangeEvent);\r\n \r\n // Store the element in the signal\r\n this.elementSignal.set(element);\r\n \r\n // Append to the container\r\n if (this.containerRef && this.containerRef.nativeElement) {\r\n this.containerRef.nativeElement.appendChild(element);\r\n } else {\r\n this.elRef.nativeElement.appendChild(element);\r\n }\r\n } catch (error) {\r\n console.error('Error creating persian-datepicker-element:', error);\r\n }\r\n });\r\n }\r\n\r\n // Helper method to update attributes\r\n private updateAttribute(name: string, value: string | undefined) {\r\n const element = this.elementSignal();\r\n if (element && value !== undefined) {\r\n element.setAttribute(name, value);\r\n }\r\n }\r\n\r\n\r\n // Helper method specifically for holiday types\r\n private updateeventTypesAttribute(value: string | string[] | undefined) {\r\n const element = this.elementSignal();\r\n if (element && value !== undefined) {\r\n const formattedValue = Array.isArray(value) ? value.join(',') : value;\r\n element.setAttribute('holiday-types', formattedValue);\r\n }\r\n }\r\n\r\n\r\n ngOnDestroy() {\r\n // Clean up event listeners\r\n const element = this.elementSignal();\r\n if (element) {\r\n element.removeEventListener('change', this.handleChangeEvent);\r\n }\r\n }\r\n\r\n /**\r\n * Handle change events from the web component\r\n */\r\n private handleChangeEvent = (event: any) => {\r\n // Use NgZone to ensure the change is detected by Angular\r\n this.zone.run(() => {\r\n // Get the selected date from the event detail\r\n const { jalali, gregorian, isHoliday, events, isRange, range } = event.detail;\r\n \r\n // Emit the dateChange event\r\n this.dateChange.emit({\r\n jalali,\r\n gregorian,\r\n isHoliday,\r\n events,\r\n isRange,\r\n range\r\n });\r\n \r\n // Update form control value\r\n this.valueSignal.set(jalali);\r\n this.onChangeSignal()(jalali);\r\n this.onTouchSignal()();\r\n });\r\n };\r\n\r\n /**\r\n * Set initial attributes on the web component based on the signals\r\n */\r\n private setInitialAttributes() {\r\n const element = this.elementSignal();\r\n if (!element) return;\r\n \r\n // Set attributes based on input signals\r\n const placeholder = this.placeholder();\r\n if (placeholder !== undefined) {\r\n element.setAttribute('placeholder', placeholder);\r\n }\r\n \r\n const format = this.format();\r\n if (format !== undefined) {\r\n element.setAttribute('format', format);\r\n }\r\n \r\n const showEvents = this.showEvents();\r\n if (showEvents !== undefined) {\r\n element.setAttribute('show-holidays', String(showEvents));\r\n }\r\n \r\n const eventTypes = this.eventTypes();\r\n if (eventTypes !== undefined) {\r\n this.updateeventTypesAttribute(eventTypes);\r\n }\r\n \r\n const rtl = this.rtl();\r\n if (rtl !== undefined) {\r\n element.setAttribute('rtl', String(rtl));\r\n }\r\n\r\n const minDate = this.minDate();\r\n if (minDate !== undefined) {\r\n element.setAttribute('min-date', JSON.stringify(minDate));\r\n }\r\n\r\n const maxDate = this.maxDate();\r\n if (maxDate !== undefined) {\r\n element.setAttribute('max-date', JSON.stringify(maxDate));\r\n }\r\n\r\n const disabledDates = this.disabledDates();\r\n if (disabledDates !== undefined) {\r\n if (typeof disabledDates === 'function') {\r\n (element as any).setDisabledDatesFn(disabledDates);\r\n } else {\r\n element.setAttribute('disabled-dates', disabledDates);\r\n }\r\n }\r\n\r\n const rangeMode = this.rangeMode();\r\n if (rangeMode !== undefined) {\r\n element.setAttribute('range-mode', String(rangeMode));\r\n }\r\n\r\n const rangeStart = this.rangeStart();\r\n if (rangeStart !== undefined) {\r\n element.setAttribute('range-start', JSON.stringify(rangeStart));\r\n }\r\n\r\n const rangeEnd = this.rangeEnd();\r\n if (rangeEnd !== undefined) {\r\n element.setAttribute('range-end', JSON.stringify(rangeEnd));\r\n }\r\n\r\n const defaultDate = this.defaultDate();\r\n if (defaultDate !== undefined) {\r\n element.setAttribute('default-date', JSON.stringify(defaultDate));\r\n }\r\n\r\n // Set disabled state\r\n if (this.disabledSignal()) {\r\n element.setAttribute('disabled', '');\r\n }\r\n \r\n // Set initial value if needed\r\n if (this.valueSignal()) {\r\n this.writeValue(this.valueSignal());\r\n }\r\n }\r\n\r\n // #region ControlValueAccessor Implementation\r\n /**\r\n * Write value to the component (used by Angular forms)\r\n */\r\n writeValue(value: DateTuple | null): void {\r\n this.valueSignal.set(value);\r\n \r\n const element = this.elementSignal();\r\n if (element && value) {\r\n // Set the value on the web component\r\n const [year, month, day] = value;\r\n (element as any).setValue(year, month, day);\r\n } else if (element) {\r\n // Clear the value\r\n (element as any).clear();\r\n }\r\n }\r\n\r\n /**\r\n * Register change callback (used by Angular forms)\r\n */\r\n registerOnChange(fn: any): void {\r\n this.onChangeSignal.set(fn);\r\n }\r\n\r\n /**\r\n * Register touch callback (used by Angular forms)\r\n */\r\n registerOnTouched(fn: any): void {\r\n this.onTouchSignal.set(fn);\r\n }\r\n\r\n /**\r\n * Set disabled state (used by Angular forms)\r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabledSignal.set(isDisabled);\r\n \r\n const element = this.elementSignal();\r\n if (element) {\r\n if (isDisabled) {\r\n element.setAttribute('disabled', '');\r\n } else {\r\n element.removeAttribute('disabled');\r\n }\r\n }\r\n }\r\n // #endregion\r\n\r\n // Add range picker methods\r\n public setRange(start: DateTuple, end: DateTuple): void {\r\n const element = this.elementSignal();\r\n if (element) {\r\n (element as any).setRange(start, end);\r\n }\r\n }\r\n\r\n public getRange(): { start: DateTuple | null; end: DateTuple | null } {\r\n const element = this.elementSignal();\r\n if (element) {\r\n return (element as any).getRange() || { start: null, end: null };\r\n }\r\n return { start: null, end: null };\r\n }\r\n\r\n public clear(): void {\r\n const element = this.elementSignal();\r\n if (element) {\r\n (element as any).clear();\r\n }\r\n }\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { NgxPersianDatepickerComponent } from './ngx-persian-datepicker.component';\r\nimport { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\r\n\r\n// Import is handled by index.ts to ensure it's only registered once\r\n// The comment is kept for documentation purposes\r\n\r\n/**\r\n * Module for the Persian DatePicker Angular wrapper component.\r\n * \r\n * This module can be imported in traditional Angular applications that use modules.\r\n * For standalone components, you can import the NgxPersianDatepickerComponent directly.\r\n * \r\n * The persian-datepicker web component is bundled directly with this package, so you \r\n * don't need to add any extra scripts to your angular.json file.\r\n * \r\n * @example\r\n * ```typescript\r\n * // In your app.module.ts or feature module\r\n * import { NgxPersianDatepickerModule } from 'ngx-persian-datepicker-element';\r\n * \r\n * @NgModule({\r\n * imports: [\r\n * // ... other imports\r\n * NgxPersianDatepickerModule\r\n * ],\r\n * // ... declarations, providers, etc.\r\n * })\r\n * export class AppModule { }\r\n * ```\r\n */\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NgxPersianDatepickerComponent // Import as a standalone component\r\n ],\r\n exports: [\r\n NgxPersianDatepickerComponent\r\n ],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA] // Required for using custom elements in Angular templates\r\n})\r\nexport class NgxPersianDatepickerModule { } ","// Register the web component first\r\n// Use a more explicit import path to help bundlers resolve the package\r\nimport 'persian-datepicker-element/dist/persian-datepicker-element.min.js';\r\n\r\n// Then export the Angular components\r\nexport * from './persian-datepicker-types';\r\nexport * from './ngx-persian-datepicker.component';\r\nexport * from './ngx-persian-datepicker.module'; ","/*\r\n * Public API Surface of ngx-persian-datepicker-element\r\n */\r\n\r\nexport * from './lib/index';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}