@asadi/angular-date-components
Version:
`Angular Date Components` is a comprehensive angular library of date-related components designed to meet the needs of applications that require localization based on various calendar systems. While the package currently includes two powerful components (S
1 lines • 96.3 kB
Source Map (JSON)
{"version":3,"file":"asadi-angular-date-components-scheduler.mjs","sources":["../../../../projects/asadi/angular-date-components/scheduler/src/directives/adc-scheduler-source.directive.ts","../../../../projects/asadi/angular-date-components/scheduler/src/utils/scheduler-event.tools.ts","../../../../projects/asadi/angular-date-components/scheduler/src/utils/scheduler.tools.ts","../../../../projects/asadi/angular-date-components/scheduler/src/components/adc-scheduler-base/adc-scheduler-base.ts","../../../../projects/asadi/angular-date-components/scheduler/src/components/adcday-view/adcday-view.component.ts","../../../../projects/asadi/angular-date-components/scheduler/src/components/adcday-view/adcday-view.component.html","../../../../projects/asadi/angular-date-components/scheduler/src/components/adcweek-view/adcweek-view.component.ts","../../../../projects/asadi/angular-date-components/scheduler/src/components/adcweek-view/adcweek-view.component.html","../../../../projects/asadi/angular-date-components/scheduler/src/components/adcmonth-view/adcmonth-view.component.ts","../../../../projects/asadi/angular-date-components/scheduler/src/components/adcmonth-view/adcmonth-view.component.html","../../../../projects/asadi/angular-date-components/scheduler/src/adcscheduler.module.ts","../../../../projects/asadi/angular-date-components/scheduler/src/components/adcscheduler/adcscheduler.component.ts","../../../../projects/asadi/angular-date-components/scheduler/src/components/adcscheduler/adcscheduler.component.html","../../../../projects/asadi/angular-date-components/scheduler/asadi-angular-date-components-scheduler.ts"],"sourcesContent":["import { Directive, EventEmitter, Input, Output} from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { ADCISchedulerDateRangeSelectEvent, ADCISchedulerEvent, ADCISchedulerEventSelectEvent } from '../interface.global';\r\nimport { ADCIDateRangeChangeEvent } from '@asadi/angular-date-components/core';\r\n\r\n\r\n/**\r\n * Directive to manage and emit events related to the scheduler, such as date range selection and event selection.\r\n * It handles holidays, weekends, and events and provides observables for changes in these values.\r\n */\r\n@Directive({\r\n selector: '[SchedulerSource]',\r\n standalone: true\r\n})\r\nexport class ADCSchedulerSource {\r\n\r\n private _events: BehaviorSubject<ADCISchedulerEvent[]> = new BehaviorSubject(([] as ADCISchedulerEvent[]));\r\n private _holidays: BehaviorSubject<string[]> = new BehaviorSubject(([] as string[]));\r\n private _weekends: BehaviorSubject<number[]> = new BehaviorSubject(([] as number[]));\r\n \r\n /**\r\n * Emitted when a date range is selected by the user.\r\n * This output allows handling of date range selection events in the parent component.\r\n * \r\n * @example\r\n * <div SchedulerSource (DateRangeSelect)=\"onDateRangeSelect($event)\"></div>\r\n */\r\n @Output('dateRangeSelect')\r\n private dateRangeSelect: EventEmitter<ADCISchedulerDateRangeSelectEvent> = new EventEmitter<ADCISchedulerDateRangeSelectEvent>();\r\n\r\n /**\r\n * Emitted when an event is selected in the scheduler.\r\n * This output allows handling of event selection events in the parent component.\r\n * \r\n * @example\r\n * <div SchedulerSource (EventSelect)=\"onEventSelect($event)\"></div>\r\n */\r\n @Output('eventSelect')\r\n private EventSelect: EventEmitter<ADCISchedulerEventSelectEvent> = new EventEmitter<ADCISchedulerEventSelectEvent>();\r\n\r\n /**\r\n * Emitted when the date range is changed.\r\n * This output allows handling of date range change events in the parent component.\r\n * \r\n * @example\r\n * <div SchedulerSource (DateRangeChange)=\"onDateRangeChange($event)\"></div>\r\n */\r\n @Output('dateRangeChange')\r\n private dateRangeChange: EventEmitter<ADCIDateRangeChangeEvent> = new EventEmitter<ADCIDateRangeChangeEvent>();\r\n\r\n /**\r\n * The list of holiday dates to exclude in the scheduler.\r\n * When this value is updated, it updates the internal holidays list.\r\n * \r\n * @example\r\n * <div SchedulerSource [Holidays]=\"holidayList\"></div>\r\n */\r\n @Input('holidays')\r\n set holidays(value: string[])\r\n {\r\n if(value == null)\r\n {\r\n this._holidays.next([]);\r\n }else\r\n {\r\n this._holidays.next(value);\r\n }\r\n }\r\n get holidays(): string[]\r\n {\r\n return this._holidays.value;\r\n }\r\n\r\n\r\n /**\r\n * The list of weekend days (represented as day numbers, e.g., [0, 6] for Sunday and Saturday).\r\n * When this value is updated, it updates the internal weekends list.\r\n * \r\n * @example\r\n * <div SchedulerSource [Weekends]=\"[0, 6]\"></div>\r\n */\r\n @Input('weekends')\r\n set weekends(value: number[])\r\n {\r\n if(value == null)\r\n {\r\n this._weekends.next([]);\r\n }else\r\n {\r\n this._weekends.next(value);\r\n }\r\n }\r\n get weekends(): number[]\r\n {\r\n return this._weekends.value;\r\n }\r\n\r\n @Input('startOf')\r\n startOf: string | null = null;\r\n\r\n /**\r\n * The list of scheduler events to be displayed in the scheduler.\r\n * When this value is updated, it updates the internal events list.\r\n * \r\n * @example\r\n * <div SchedulerSource [Events]=\"eventList\"></div>\r\n */\r\n @Input('events')\r\n set events(value: ADCISchedulerEvent[])\r\n {\r\n if(value == null)\r\n {\r\n this._events.next([]);\r\n }else\r\n {\r\n this._events.next(value);\r\n }\r\n \r\n }\r\n get events(): ADCISchedulerEvent[]\r\n {\r\n return this._events.value;\r\n }\r\n\r\n eventChanges(): Observable<ADCISchedulerEvent[]>\r\n {\r\n return this._events.asObservable();\r\n }\r\n\r\n holidayChanges(): Observable<string[]>\r\n {\r\n return this._holidays.asObservable();\r\n }\r\n\r\n weekendChanges(): Observable<number[]>\r\n {\r\n return this._weekends.asObservable();\r\n }\r\n\r\n onEventSelect(e: ADCISchedulerEventSelectEvent): void\r\n {\r\n this.EventSelect.emit(e);\r\n }\r\n\r\n onDateRangeSelect(e: ADCISchedulerDateRangeSelectEvent)\r\n {\r\n this.dateRangeSelect.next(e);\r\n };\r\n\r\n onDateRangeChange(e: ADCIDateRangeChangeEvent): void\r\n {\r\n this.dateRangeChange.next(e);\r\n }\r\n}\r\n","import { ADCDateTimeTools } from \"@asadi/angular-date-components/core\";\r\nimport { ADCISchedulerEvent } from \"../interface.global\";\r\n\r\n\r\n/**\r\n * Utility class for handling event-related operations within a scheduler.\r\n * This class provides methods for filtering events based on a date range.\r\n */\r\nexport class ADCSchedulerEventTools\r\n{\r\n private readonly tools: ADCDateTimeTools = new ADCDateTimeTools();\r\n\r\n\r\n /**\r\n * Filters events that fall within a given date range.\r\n * This method checks whether the start date or end date of an event falls within the specified range.\r\n * It returns an array of events that are within the date range or span across it.\r\n * \r\n * @param startDate - The start date of the date range to filter by.\r\n * @param endDate - The end date of the date range to filter by.\r\n * @param events - An array of events to be filtered.\r\n * \r\n * @returns An array of events that fall within or span across the given date range.\r\n * \r\n * @example\r\n * ```typescript\r\n * const events: ADCISchedulerEvent[] = [\r\n * { startDate: '2024-11-01', endDate: '2024-11-02', title: 'Event 1' },\r\n * { startDate: '2024-11-03', endDate: '2024-11-04', title: 'Event 2' },\r\n * ];\r\n * const filteredEvents = schedulerEventTools.getEventsBetweenDateRange('2024-11-01', '2024-11-03', events);\r\n * console.log(filteredEvents); // Outputs events within the range\r\n * ```\r\n */\r\n getEventsBetweenDateRange(startDate: string, endDate: string, events: ADCISchedulerEvent[] | null): ADCISchedulerEvent[]\r\n {\r\n if(events == null) return [];\r\n\r\n const rangeStart = this.tools.dateOnly(startDate);\r\n const rangeEnd = this.tools.dateOnly(endDate);\r\n \r\n return events.filter((e) => {\r\n\r\n const eventStart = this.tools.dateOnly(e.startDate);\r\n const eventEnd = this.tools.dateOnly(e.endDate);\r\n\r\n return eventStart >= rangeStart && eventStart <= rangeEnd || \r\n eventEnd >= rangeStart && eventEnd <= rangeEnd || \r\n eventStart < rangeStart && eventEnd > rangeEnd\r\n });\r\n }\r\n}","import { ADCDateTimeTools } from \"@asadi/angular-date-components/core\";\r\nimport { ADCSchedulerEventTools } from \"./scheduler-event.tools\";\r\n\r\nexport class ADCSchedulerTools\r\n{\r\n readonly dateTime = new ADCDateTimeTools();\r\n readonly scheduler = new ADCSchedulerEventTools();\r\n}","import { inject } from '@angular/core';\r\nimport { ADCIDateAdapter, ADCIDateFormatter, ADCIDateRangeChangeEvent, ADCILabels, ADCIOptions, ADCITableEvent, ADC_DATE_ADAPTER, ADC_DATE_FORMATTER, ADC_LABELS, ADC_OPTIONS } from '@asadi/angular-date-components/core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { DateChangeService } from '@asadi/angular-date-components/core';\r\nimport { ADCSchedulerSource } from '../../directives/adc-scheduler-source.directive';\r\nimport { ADCISchedulerDateRangeSelectEvent, ADCISchedulerEvent, ADCISchedulerEventSelectEvent } from '../../interface.global';\r\nimport { ADCSchedulerTools } from '../../utils/scheduler.tools';\r\n\r\n\r\n/**\r\n * Base class for the ADC scheduler. This class provides fundamental functionality for managing date changes,\r\n * event handling, and interacting with the scheduler source. It handles the event subscription and delegates \r\n * specific logic to abstract methods for customization.\r\n */\r\nexport abstract class AdcSchedulerBase {\r\n\r\n // Private members\r\n private readonly destroy$: Subject<void> = new Subject();\r\n private readonly dateChangeService: DateChangeService = inject(DateChangeService);\r\n private readonly schedulerSource: ADCSchedulerSource = inject(ADCSchedulerSource);\r\n private isViewReady: boolean = false;\r\n\r\n /**\r\n * The date adapter used for managing date-related operations.\r\n */\r\n readonly dateAdapter: ADCIDateAdapter = inject(ADC_DATE_ADAPTER);\r\n\r\n /**\r\n * The date formatter used for formatting dates.\r\n */\r\n readonly dateFormatter: ADCIDateFormatter = inject(ADC_DATE_FORMATTER);\r\n\r\n /**\r\n * A utility toolset for the scheduler, offering additional methods for scheduling operations.\r\n */\r\n readonly tools: ADCSchedulerTools = new ADCSchedulerTools();\r\n\r\n /**\r\n * The optional set of labels used for UI display.\r\n */\r\n readonly labels?: ADCILabels = inject(ADC_LABELS);\r\n\r\n readonly options = inject<ADCIOptions>(ADC_OPTIONS);\r\n\r\n\r\n /**\r\n * start of date provided in the scheduler component use it to set initial date range.\r\n */\r\n readonly startOf: string | null = this.schedulerSource.startOf;\r\n\r\n /**\r\n * Initializes the scheduler by setting up event subscriptions and handlers.\r\n * Subscribes to date change and event change notifications from the date change service and scheduler source.\r\n * \r\n * @returns void\r\n */\r\n init(): void {\r\n this.initViewHanlder();\r\n\r\n // Subscribe to date change events\r\n this.dateChangeService.onNext().pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n this.isViewReady = false;\r\n this.nextButtonHandler();\r\n });\r\n\r\n this.dateChangeService.onPrevious().pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n this.isViewReady = false;\r\n this.previousButtonHandler();\r\n });\r\n\r\n this.dateChangeService.onToday().pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n this.isViewReady = false;\r\n this.todayButtonHandler();\r\n });\r\n\r\n // Subscribe to event changes from the scheduler source\r\n this.schedulerSource.eventChanges().pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n if(!this.isViewReady) return;\r\n\r\n this.eventChangesHandler(e);\r\n });\r\n\r\n // Subscribe to holiday changes\r\n this.schedulerSource.holidayChanges().pipe(takeUntil(this.destroy$)).subscribe((value: string[]) => {\r\n this.holidaysChangesHandler(value);\r\n });\r\n\r\n // Subscribe to weekend changes\r\n this.schedulerSource.weekendChanges().pipe(takeUntil(this.destroy$)).subscribe((value: number[]) => {\r\n this.weekendsChangesHandler(value);\r\n });\r\n }\r\n\r\n /**\r\n * Handler for the init view. This method should implement logic for setting the initial view date.\r\n * \r\n * @returns void\r\n */\r\n abstract initViewHanlder(): void;\r\n\r\n // Abstract methods that must be implemented by subclasses\r\n /**\r\n * Handler for the 'Today' button. This method should implement logic for resetting to today's date.\r\n * \r\n * @returns void\r\n */\r\n abstract todayButtonHandler(): void;\r\n\r\n /**\r\n * Handler for the 'Previous' button. This method should implement logic for navigating to the previous date range.\r\n * \r\n * @returns void\r\n */\r\n abstract previousButtonHandler(): void;\r\n\r\n /**\r\n * Handler for the 'Next' button. This method should implement logic for navigating to the next date range.\r\n * \r\n * @returns void\r\n */\r\n abstract nextButtonHandler(): void;\r\n\r\n /**\r\n * Handler for event changes. This method should implement logic for processing updated scheduler events.\r\n * \r\n * @param schedulerEvents - The updated list of scheduler events.\r\n * @returns void\r\n */\r\n abstract eventChangesHandler(schedulerEvents: ADCISchedulerEvent[] | undefined): void;\r\n\r\n // /**\r\n // * Handler for date changes. This method should implement logic for processing updated date ranges.\r\n // * \r\n // * @returns void\r\n // */\r\n // abstract dateChangesHandler(): void;\r\n\r\n /**\r\n * Handler for changes to weekends. This method should implement logic for processing updated weekend information.\r\n * \r\n * @param weekends - The updated list of weekend days.\r\n * @returns void\r\n */\r\n abstract weekendsChangesHandler(weekends: number[]): void;\r\n\r\n /**\r\n * Handler for changes to holidays. This method should implement logic for processing updated holiday information.\r\n * \r\n * @param holidays - The updated list of holiday dates.\r\n * @returns void\r\n */\r\n abstract holidaysChangesHandler(holidays: string[]): void;\r\n\r\n /**\r\n * Sends a date range change event to the scheduler source.\r\n * \r\n * @param e - The date range change event to be emitted.\r\n * @returns void\r\n */\r\n dateRangeChange(e: ADCIDateRangeChangeEvent) {\r\n this.schedulerSource.onDateRangeChange(e);\r\n }\r\n\r\n /**\r\n * Sends a date range selection event to the scheduler source.\r\n * \r\n * @param e - The date range selection event to be emitted.\r\n * @returns void\r\n */\r\n dateRangeSelect(e: ADCISchedulerDateRangeSelectEvent) {\r\n this.schedulerSource.onDateRangeSelect(e);\r\n }\r\n\r\n /**\r\n * Sends an event selection event to the scheduler source.\r\n * \r\n * @param e - The event selection event to be emitted.\r\n * @returns void\r\n */\r\n eventClick(e: ADCISchedulerEventSelectEvent) {\r\n this.schedulerSource.onEventSelect(e);\r\n }\r\n\r\n abstract onEventClick(event: ADCITableEvent, dom: HTMLElement, jsEvent: MouseEvent): void;\r\n\r\n /**\r\n * Marks the view as ready to process events.\r\n * \r\n * Once this method is called:\r\n * - The `eventChangesHandler` will be triggered immediately with the current list of events.\r\n * - Subsequent updates to events will also be handled automatically until the view is marked as unready.\r\n * \r\n * @returns void\r\n */\r\n markViewAsReady(): void\r\n {\r\n this.isViewReady = true;\r\n this.eventChangesHandler(this.schedulerSource.events);\r\n }\r\n\r\n /**\r\n * Cleans up subscriptions when the component or service is destroyed.\r\n * \r\n * @returns void\r\n */\r\n destroy(): void {\r\n this.destroy$.next();\r\n }\r\n}\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { ADCCommonService, ADCDateSplitter, ADCITableCell, ADCITableEvent, ADCITableRow, ADCStaticValues, FlatEventBuilder, TableSelection } \r\nfrom '@asadi/angular-date-components/core';\r\nimport { ADCISchedulerDateRangeSelectEvent, ADCISchedulerEvent } from '../../interface.global';\r\nimport { AdcSchedulerBase } from '../adc-scheduler-base/adc-scheduler-base';\r\n\r\n@Component({\r\n selector: 'adc-day-view',\r\n templateUrl: './adcday-view.component.html',\r\n styleUrls: ['./adcday-view.component.css']\r\n})\r\nexport class ADCDayViewComponent extends AdcSchedulerBase implements OnInit, OnDestroy{\r\n\r\n year: number = 0;\r\n week: number = 0;\r\n day: number = 0;\r\n\r\n currentDate: string = '';\r\n title: string = '';\r\n hoursOfDay: string[] = ADCStaticValues.getHoursOfDay();\r\n daysOfweek: string[] = ADCStaticValues.getDaysOfWeek();\r\n monthsOfYear: string[] = this.dateAdapter.getMonthsOfYear();\r\n\r\n dateSplitter: ADCDateSplitter = this.dateFormatter.DateSplitter;\r\n\r\n events: ADCISchedulerEvent[] = [];\r\n\r\n rows: ADCITableRow[] = [];\r\n\r\n weekends: number[] = [];\r\n holidays: string[] = [];\r\n\r\n readonly today: string = this.dateAdapter.today();\r\n readonly commonService = new ADCCommonService(this.dateAdapter, this.labels);\r\n readonly selectionManager = new TableSelection(this.dateFilter);\r\n readonly eventBuilder = new FlatEventBuilder();\r\n\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n ngOnInit(): void \r\n {\r\n super.init();\r\n\r\n this.selectionManager.cellSelectionStream.subscribe(event => this.onDateRangeSelect(event.start, event.end));\r\n\r\n this.eventBuilder.eventSelectionStream.subscribe(e => {\r\n this.onEventClick(e.event, e.dom, e.jsEvent);\r\n });\r\n }\r\n\r\n dateFilter(cell1: ADCITableCell, cell2: ADCITableCell): boolean\r\n {\r\n return (cell2.rowValue == cell1.rowValue && cell2.columnValue >= cell1.columnValue) || (cell2.rowValue > cell1.rowValue);\r\n }\r\n\r\n override initViewHanlder(): void \r\n {\r\n if(this.startOf == null)\r\n {\r\n this.todayButtonHandler();\r\n }\r\n else\r\n {\r\n this.day = this.dateAdapter.getDayIndexOf(this.startOf);\r\n this.week = this.dateAdapter.getWeekOf(this.startOf);\r\n this.year = this.dateAdapter.getYearOf(this.startOf);\r\n this.calculateCurrentDate();\r\n }\r\n }\r\n\r\n override todayButtonHandler(): void\r\n {\r\n this.day = this.dateAdapter.getCurrentDay();\r\n this.week = this.dateAdapter.getCurrentWeek();\r\n this.year = this.dateAdapter.getCurrentYear();\r\n\r\n this.calculateCurrentDate();\r\n }\r\n\r\n override previousButtonHandler(): void\r\n {\r\n this.day--;\r\n if(this.day < 0)\r\n {\r\n this.day = 6;\r\n this.week--;\r\n\r\n if(this.week < 1)\r\n {\r\n this.year--;\r\n this.week = this.dateAdapter.getWeeksOfYear(this.year);\r\n }\r\n }\r\n\r\n this.calculateCurrentDate();\r\n }\r\n\r\n override nextButtonHandler(): void\r\n {\r\n this.day++;\r\n if(this.day > 6)\r\n {\r\n this.day = 0;\r\n this.week++;\r\n\r\n const weeksOfYear = this.dateAdapter.getWeeksOfYear(this.year);\r\n\r\n if(this.week > weeksOfYear)\r\n {\r\n this.week = 1;\r\n this.year++;\r\n }\r\n }\r\n\r\n this.calculateCurrentDate();\r\n }\r\n\r\n calculateCurrentDate(): void\r\n {\r\n const date = this.dateAdapter.getDateOfDay(this.year, this.week, this.day);\r\n this.currentDate = this.dateAdapter.transformDate(+date.split(this.dateSplitter)[0], +date.split(this.dateSplitter)[1], +date.split(this.dateSplitter)[2]);\r\n\r\n const day: string = this.labels?.daysOfWeek[this.commonService.getDayIndex(this.day)] || this.daysOfweek[this.day];\r\n const month = this.monthsOfYear[+date.split(this.dateSplitter)[1] - 1];\r\n\r\n this.title = `${day} \r\n ${+date.split(this.dateSplitter)[2]} \r\n ${this.commonService.getMonthName(month) || month} ${this.labels?.year || \"Year\"} \r\n ${this.year}`;\r\n\r\n this.dateChangesHandler();\r\n super.dateRangeChange({startDate: this.currentDate, endDate: this.currentDate});\r\n }\r\n\r\n override eventChangesHandler(schedulerEvents: ADCISchedulerEvent[]): void\r\n {\r\n const tableEvents: ADCITableEvent[] = [];\r\n\r\n this.events = schedulerEvents;\r\n\r\n const viewEvents = this.tools.scheduler.getEventsBetweenDateRange(this.currentDate, this.currentDate, this.events);\r\n \r\n viewEvents.forEach((e: ADCISchedulerEvent) => {\r\n\r\n\r\n const row = this.rows[1];\r\n\r\n const rowDate = this.tools.dateTime.dateOnly(row.value);\r\n const eventStartDate = this.tools.dateTime.dateOnly(e.startDate);\r\n const eventEndDate = this.tools.dateTime.dateOnly(e.endDate);\r\n const eventStartHour = this.tools.dateTime.hourOrDefault(e.startTime, '00');\r\n const eventEndHour = this.tools.dateTime.hourOrDefault(e.endTime, '23');\r\n\r\n\r\n const startColumnIndex = eventStartDate != rowDate ? -1 : row.columns.findIndex(c => {\r\n return this.tools.dateTime.hour(c.value) == eventStartHour\r\n });\r\n\r\n const endColumnIndex = eventEndDate != rowDate ? -1 : row.columns.findIndex(c => {\r\n return this.tools.dateTime.hour(c.value) == eventEndHour\r\n });\r\n\r\n const startTime = +this.tools.dateTime.minutesOrDefault(e.startTime, '00');\r\n const endTime = +this.tools.dateTime.minutesOrDefault(e.endTime, '60');\r\n\r\n const cellEvent: ADCITableEvent = {\r\n columnStart: startColumnIndex != -1 ? startColumnIndex : null,\r\n columnEnd: endColumnIndex != -1 ? endColumnIndex : null,\r\n data: e,\r\n rowStart: 1,\r\n rowEnd: 1,\r\n offsetX: startTime / 60,\r\n fractionX: endTime / 60,\r\n overlapTolerance: this.options.eventOverlapTolerance / 60\r\n };\r\n\r\n if(e.allDay == true)\r\n {\r\n const eventHourEnd = +this.tools.dateTime.hourOrDefault(e.endTime, '23');\r\n\r\n cellEvent.fractionX = 24 - eventHourEnd;\r\n }\r\n\r\n tableEvents.push(cellEvent);\r\n });\r\n\r\n this.eventBuilder.data = tableEvents;\r\n }\r\n\r\n dateChangesHandler(): void\r\n {\r\n this.rows = this.getRowInitialValue();\r\n\r\n const date = this.dateAdapter.getDateOfDay(this.year, this.week, this.day);\r\n const splittedDate = date.split(this.dateSplitter);\r\n \r\n const dayIndex = this.commonService.getDayIndex(this.day);\r\n\r\n const transformDate = this.dateAdapter.transformDate(+splittedDate[0], +splittedDate[1], +splittedDate[2]);\r\n\r\n const row: ADCITableRow = {\r\n label: this.labels?.daysOfWeek[dayIndex] || this.daysOfweek[dayIndex],\r\n verticalAlign: 'center',\r\n horizontalAlign: 'center',\r\n prefix: '',\r\n suffix: `${splittedDate[0]}${this.dateSplitter}${splittedDate[1]}${this.dateSplitter}${splittedDate[2]}`,\r\n value: transformDate.split('T')[0],\r\n classList: ''.concat(\r\n this.weekends.includes(this.day) || this.holidays.includes(this.currentDate.split('T')[0]) ? ' holiday ' : ' ',\r\n ),\r\n columns: []\r\n }\r\n\r\n this.hoursOfDay.forEach((hour) => {\r\n\r\n row.columns.push({\r\n verticalAlign: 'center',\r\n horizontalAlign: 'center',\r\n selectable: true,\r\n classList: '',\r\n label: '',\r\n prefix: '',\r\n suffix: '',\r\n value: hour,\r\n });\r\n\r\n });\r\n\r\n this.rows.push(row);\r\n }\r\n\r\n override weekendsChangesHandler(weekends: number[]): void \r\n {\r\n this.weekends = weekends;\r\n this.dateChangesHandler();\r\n }\r\n\r\n override holidaysChangesHandler(holidays: string[]): void \r\n {\r\n this.holidays = holidays;\r\n this.dateChangesHandler();\r\n }\r\n\r\n onDateRangeSelect(start: ADCITableCell, end: ADCITableCell): void\r\n {\r\n const e: ADCISchedulerDateRangeSelectEvent = \r\n {\r\n endDate: end.rowValue.split('T')[0],\r\n endTime: end.columnValue,\r\n startDate: start.rowValue.split('T')[0],\r\n startTime: start.columnValue,\r\n }\r\n\r\n super.dateRangeSelect(e);\r\n }\r\n\r\n override onEventClick(event: ADCITableEvent, dom: HTMLElement, jsEvent: MouseEvent): void \r\n {\r\n const schedulerEvent: ADCISchedulerEvent = this.events.filter(item => item.id == event.data.id)[0];\r\n\r\n super.eventClick({dom: dom, event: schedulerEvent, jsEvent: jsEvent});\r\n }\r\n\r\n ngOnDestroy(): void \r\n {\r\n super.destroy(); \r\n }\r\n\r\n private getRowInitialValue(): ADCITableRow[]\r\n {\r\n return [{\r\n classList: '',\r\n label: '',\r\n prefix: '',\r\n suffix: '',\r\n value: '',\r\n verticalAlign: 'center',\r\n horizontalAlign: 'center',\r\n columns: ADCStaticValues.getHoursOfDay().map((hour: string, hourIndex: number) => {\r\n return {\r\n verticalAlign: 'center',\r\n horizontalAlign: 'center',\r\n selectable: false,\r\n label: hour,\r\n prefix: '',\r\n suffix: '',\r\n value: hour,\r\n classList: ''\r\n }\r\n })\r\n }];\r\n }\r\n}\r\n","\r\n<adc-table\r\n[rows]=\"rows\"\r\n[title]=\"title\"\r\n[titleClass]=\"''.concat(\r\n today == currentDate.split('T')[0] ? ' today ' : ' ',\r\n weekends.includes(day) || holidays.includes(currentDate.split('T')[0]) ? ' holiday ' : ' '\r\n)\"\r\n[selectionManager]=\"selectionManager\"\r\n[eventBuilder]=\"eventBuilder\"\r\n(viewReady)=\"markViewAsReady()\"\r\n></adc-table>\r\n\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { ADCCommonService, ADCDateSplitter, ADCITableCell, ADCITableColumn, ADCITableEvent, ADCITableRow, ADCStaticValues, FlatEventBuilder, TableSelection} from '@asadi/angular-date-components/core';\r\nimport { ADCISchedulerDateRangeSelectEvent, ADCISchedulerEvent } from '../../interface.global';\r\nimport { AdcSchedulerBase } from '../adc-scheduler-base/adc-scheduler-base';\r\n\r\n@Component({\r\n selector: 'adc-week-view',\r\n templateUrl: './adcweek-view.component.html',\r\n styleUrls: ['./adcweek-view.component.css']\r\n})\r\nexport class ADCWeekViewComponent extends AdcSchedulerBase implements OnInit, OnDestroy {\r\n\r\n week: number = 0;\r\n year: number = 0;\r\n\r\n private daysOfWeek: string[] = ADCStaticValues.getDaysOfWeek();\r\n\r\n title: string = '';\r\n \r\n dateSplitter: ADCDateSplitter = this.dateFormatter.DateSplitter;\r\n events: ADCISchedulerEvent[] = [];\r\n rows: ADCITableRow[] = [];\r\n\r\n private startOfWeek: string = '';\r\n private endOfWeek: string = '';\r\n\r\n weekends: number[] = [];\r\n holidays: string[] = [];\r\n\r\n readonly today: string = this.dateAdapter.today();\r\n readonly commonService = new ADCCommonService(this.dateAdapter, this.labels);\r\n readonly selectionManager = new TableSelection(this.dateFilter);\r\n readonly eventBuilder = new FlatEventBuilder();\r\n\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n ngOnInit(): void \r\n {\r\n super.init();\r\n\r\n this.selectionManager.cellSelectionStream.subscribe(event => this.onDateRangeSelect(event.start, event.end));\r\n\r\n this.eventBuilder.eventSelectionStream.subscribe(e => {\r\n this.onEventClick(e.event, e.dom, e.jsEvent);\r\n });\r\n }\r\n\r\n dateFilter(cell1: ADCITableCell, cell2: ADCITableCell): boolean\r\n {\r\n return cell2.rowValue > cell1.rowValue || (cell2.rowValue == cell1.rowValue && cell2.columnIndex >= cell1.columnIndex);\r\n }\r\n\r\n override initViewHanlder(): void \r\n {\r\n if(this.startOf == null)\r\n {\r\n this.todayButtonHandler();\r\n }\r\n else\r\n {\r\n this.week = this.dateAdapter.getWeekOf(this.startOf);\r\n this.year = this.dateAdapter.getYearOf(this.startOf);\r\n this.calculateCurrentDate();\r\n }\r\n }\r\n\r\n override todayButtonHandler(): void\r\n {\r\n this.week = this.dateAdapter.getCurrentWeek();\r\n this.year = this.dateAdapter.getCurrentYear();\r\n\r\n this.calculateCurrentDate();\r\n }\r\n\r\n override previousButtonHandler(): void\r\n {\r\n this.week--;\r\n\r\n if(this.week < 1)\r\n {\r\n this.year--;\r\n this.week = this.dateAdapter.getWeeksOfYear(this.year) - 1;\r\n }\r\n\r\n this.calculateCurrentDate();\r\n }\r\n\r\n override nextButtonHandler(): void\r\n {\r\n this.week++;\r\n const weeksOfYear = this.dateAdapter.getWeeksOfYear(this.year);\r\n\r\n if(this.week >= weeksOfYear)\r\n {\r\n this.year++;\r\n this.week = 1;\r\n }\r\n\r\n this.calculateCurrentDate();\r\n }\r\n\r\n calculateCurrentDate(): void\r\n {\r\n const start = this.dateAdapter.getDateOfDay(this.year, this.week, 0);\r\n const end = this.dateAdapter.getDateOfDay(this.year, this.week, 6);\r\n\r\n this.startOfWeek = this.dateAdapter.transformDate(+start.split(this.dateSplitter)[0], +start.split(this.dateSplitter)[1], +start.split(this.dateSplitter)[2]);\r\n this.endOfWeek = this.dateAdapter.transformDate(+end.split(this.dateSplitter)[0], +end.split(this.dateSplitter)[1], +end.split(this.dateSplitter)[2]);\r\n\r\n this.title = `${this.labels?.week || \"Week\"} ${this.week} ${this.labels?.year || \"Year\"} ${this.year}`;\r\n\r\n this.dateChangesHandler();\r\n super.dateRangeChange({startDate: this.startOfWeek, endDate: this.endOfWeek});\r\n }\r\n\r\n override eventChangesHandler(schedulerEvents: ADCISchedulerEvent[]): void\r\n {\r\n const tableEvents: ADCITableEvent[] = [];\r\n\r\n this.events = schedulerEvents;\r\n\r\n const viewEvents = this.tools.scheduler.getEventsBetweenDateRange(this.startOfWeek, this.endOfWeek, this.events);\r\n \r\n viewEvents.forEach((e: ADCISchedulerEvent) => {\r\n\r\n const startRowIndex = this.rows.findIndex((r, i) => {\r\n\r\n if(i == 0) return;\r\n\r\n return this.tools.dateTime.dateOnly(r.value) == this.tools.dateTime.dateOnly(e.startDate);\r\n });\r\n\r\n const startColumnIndex = startRowIndex == -1 ? 0 : this.rows[startRowIndex].columns.findIndex(c => \r\n this.tools.dateTime.hour(c.value) === this.tools.dateTime.hourOrDefault(e.startTime, '00'));\r\n\r\n const endRowIndex = this.rows.findIndex((r, i) => {\r\n\r\n if(i == 0) return;\r\n\r\n return this.tools.dateTime.dateOnly(r.value) == this.tools.dateTime.dateOnly(e.endDate);\r\n });\r\n\r\n const endColumnIndex = endRowIndex == -1 ? this.rows[this.rows.length - 1].columns.length - 1 : this.rows[endRowIndex].columns.findIndex(c => \r\n this.tools.dateTime.hour(c.value) === this.tools.dateTime.hourOrDefault(e.endTime, '23'));\r\n\r\n const startTime = +this.tools.dateTime.minutesOrDefault(e.startTime, '00');\r\n const endTime = +this.tools.dateTime.minutesOrDefault(e.endTime, '60');\r\n\r\n\r\n const cellEvent: ADCITableEvent = {\r\n columnStart: startRowIndex != -1 ? startColumnIndex : null,\r\n columnEnd: endRowIndex != -1 ? endColumnIndex : null,\r\n data: e,\r\n rowStart: startRowIndex != -1 ? startRowIndex : 0,\r\n rowEnd: endRowIndex != -1 ? endRowIndex : this.rows.length - 1,\r\n offsetX: startTime / 60,\r\n fractionX: endTime / 60,\r\n overlapTolerance: this.options.eventOverlapTolerance / 60\r\n };\r\n\r\n if(e.allDay == true)\r\n {\r\n const eventHourEnd = +this.tools.dateTime.hourOrDefault(e.endTime, '23');\r\n\r\n cellEvent.fractionX = 24 - eventHourEnd;\r\n }\r\n\r\n tableEvents.push(cellEvent);\r\n });\r\n\r\n this.eventBuilder.data = tableEvents;\r\n }\r\n\r\n dateChangesHandler(): void\r\n {\r\n this.rows = this.getInitialRowValue(); \r\n\r\n this.daysOfWeek.forEach((day: string, index: number) => {\r\n \r\n const dayIndex = this.commonService.getDayIndex(index);\r\n \r\n const date = this.dateAdapter.getDateOfDay(this.year, +this.week, index);\r\n const splittedDate = date.split(this.dateSplitter);\r\n const transformedDate = this.dateAdapter.transformDate(+splittedDate[0], +splittedDate[1], +splittedDate[2]);\r\n\r\n const row: ADCITableRow = {\r\n label: this.labels?.daysOfWeek[dayIndex] || day,\r\n prefix: '',\r\n suffix: splittedDate[1] + this.dateSplitter + splittedDate[2],\r\n verticalAlign: 'center',\r\n horizontalAlign: 'center',\r\n classList: ''.concat(\r\n transformedDate.split('T')[0] == this.today ? ' today ' : ' ',\r\n this.weekends.includes(index) || this.holidays.includes(transformedDate.split('T')[0]) ? ' holiday ' : ' ',\r\n ),\r\n value: transformedDate.split('T')[0],\r\n columns: []\r\n };\r\n\r\n ADCStaticValues.getHoursOfDay().forEach((hour: string, hourIndex: number) => {\r\n\r\n const column: ADCITableColumn = {\r\n label: '',\r\n prefix: '',\r\n suffix: '',\r\n verticalAlign: 'center',\r\n horizontalAlign: 'center',\r\n classList: '',\r\n value: `${hour}`,\r\n selectable: true\r\n }\r\n\r\n row.columns.push(column);\r\n })\r\n\r\n this.rows.push(row);\r\n\r\n })\r\n }\r\n\r\n override weekendsChangesHandler(weekends: number[]): void \r\n {\r\n this.weekends = weekends;\r\n this.dateChangesHandler();\r\n }\r\n\r\n override holidaysChangesHandler(holidays: string[]): void \r\n {\r\n this.holidays = holidays;\r\n this.dateChangesHandler();\r\n }\r\n\r\n onDateRangeSelect(start: ADCITableCell, end: ADCITableCell): void\r\n {\r\n const e: ADCISchedulerDateRangeSelectEvent = \r\n {\r\n endDate: end.rowValue,\r\n endTime: end.columnValue,\r\n startDate: start.rowValue,\r\n startTime: start.columnValue,\r\n }\r\n \r\n super.dateRangeSelect(e);\r\n }\r\n\r\n\r\n override onEventClick(event: ADCITableEvent, dom: HTMLElement, jsEvent: MouseEvent): void \r\n {\r\n const schedulerEvent: ADCISchedulerEvent = this.events.filter(item => item.id == event.data.id)[0];\r\n\r\n super.eventClick({dom: dom, event: schedulerEvent, jsEvent: jsEvent});\r\n }\r\n\r\n ngOnDestroy(): void \r\n {\r\n super.destroy();\r\n }\r\n\r\n private getInitialRowValue(): ADCITableRow[]\r\n {\r\n return [{\r\n verticalAlign: 'center',\r\n horizontalAlign: 'center',\r\n classList: '',\r\n label: '',\r\n prefix: '',\r\n suffix: '',\r\n value: '',\r\n columns: ADCStaticValues.getHoursOfDay().map((hour, hourIndex) => {\r\n return {\r\n verticalAlign: 'center',\r\n horizontalAlign: 'center',\r\n classList: '',\r\n selectable: false,\r\n label: hour,\r\n prefix: '',\r\n suffix: '',\r\n value: hour,\r\n }\r\n })\r\n }]\r\n }\r\n}\r\n","\r\n\r\n \r\n<adc-table\r\n[rows]=\"rows\"\r\n[title]=\"title\"\r\n[selectionManager]=\"selectionManager\"\r\n[eventBuilder]=\"eventBuilder\"\r\n(viewReady)=\"markViewAsReady()\"\r\n></adc-table>\r\n<!-- \r\n[eventBuilder]=\"builder\"\r\n<div flatEventBuilder [columns]=\"columns.length\" [rows]=\"rows.length\" #builder=\"eventBuilder\"></div> -->\r\n\r\n\r\n\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { ADCDateSplitter, ADCITableEvent, ADCITableRow, ADCCommonService, ADCStaticValues, ADCITableCell, TableSelection, FlatEventBuilder} from '@asadi/angular-date-components/core';\r\nimport { ADCISchedulerDateRangeSelectEvent, ADCISchedulerEvent } from '../../interface.global';\r\nimport { AdcSchedulerBase } from '../adc-scheduler-base/adc-scheduler-base';\r\n\r\n@Component({\r\n selector: 'adc-month-view',\r\n templateUrl: './adcmonth-view.component.html',\r\n styleUrls: ['./adcmonth-view.component.css']\r\n})\r\nexport class ADCMonthViewComponent extends AdcSchedulerBase implements OnInit, OnDestroy{\r\n\r\n month: number = 0;\r\n year: number = 0;\r\n\r\n daysOfWeek: string[] = ADCStaticValues.getDaysOfWeek();\r\n monthsOfYear: string[] = this.dateAdapter.getMonthsOfYear();\r\n weeksOfMonth: string[] = [];\r\n\r\n title: string = '';\r\n \r\n dateSplitter: ADCDateSplitter = this.dateFormatter.DateSplitter;\r\n\r\n events: ADCISchedulerEvent[] = [];\r\n\r\n rows: ADCITableRow[] = [];\r\n\r\n private startOfMonth: string = '';\r\n private endOfMonth: string = '';\r\n\r\n weekends: number[] = [];\r\n holidays: string[] = [];\r\n\r\n readonly today: string = this.dateAdapter.today();\r\n readonly commonService = new ADCCommonService(this.dateAdapter, this.labels);\r\n readonly selectionManager = new TableSelection(this.dateFilter);\r\n readonly eventBuilder = new FlatEventBuilder();\r\n\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n ngOnInit(): void \r\n {\r\n super.init();\r\n\r\n this.selectionManager.cellSelectionStream.subscribe(e => {\r\n this.onDateRangeSelect(e.start, e.end);\r\n });\r\n\r\n this.eventBuilder.eventSelectionStream.subscribe(e => {\r\n this.onEventClick(e.event, e.dom, e.jsEvent);\r\n });\r\n }\r\n\r\n dateFilter(cell1: ADCITableCell, cell2: ADCITableCell): boolean\r\n {\r\n return +cell2.rowValue > +cell1.rowValue || (cell2.rowValue == cell1.rowValue && cell2.columnIndex >= cell1.columnIndex);\r\n }\r\n\r\n override todayButtonHandler(): void\r\n {\r\n this.month = this.dateAdapter.getCurrentMonth();\r\n this.year = this.dateAdapter.getCurrentYear();\r\n\r\n this.calculateCurrentDate();\r\n }\r\n\r\n override previousButtonHandler(): void\r\n {\r\n this.month--;\r\n if(this.month < 1)\r\n {\r\n this.month = 12;\r\n this.year--;\r\n }\r\n\r\n this.calculateCurrentDate();\r\n }\r\n\r\n override nextButtonHandler(): void\r\n {\r\n this.month++;\r\n if(this.month > 12)\r\n {\r\n this.month = 1;\r\n this.year++;\r\n }\r\n\r\n this.calculateCurrentDate();\r\n }\r\n\r\n calculateCurrentDate(): void\r\n {\r\n this.weeksOfMonth = this.dateAdapter.getWeeksOfMonth(this.year, this.month);\r\n this.startOfMonth = this.dateAdapter.transformDate(this.year, this.month, 1);\r\n const daysOfMonth = this.dateAdapter.getDaysOfMonth(this.year, this.month);\r\n this.endOfMonth = this.dateAdapter.transformDate(this.year, this.month, daysOfMonth);\r\n\r\n const month = this.monthsOfYear[this.month - 1];\r\n\r\n this.title = this.commonService.getMonthName(month) || month + ' ' + this.year;\r\n\r\n this.dateChangesHandler();\r\n super.dateRangeChange({startDate: this.startOfMonth, endDate: this.endOfMonth});\r\n }\r\n\r\n override initViewHanlder(): void \r\n {\r\n if(this.startOf == null)\r\n {\r\n this.todayButtonHandler();\r\n }\r\n else\r\n {\r\n this.month = this.dateAdapter.getMonthOf(this.startOf);\r\n this.year = this.dateAdapter.getYearOf(this.startOf);\r\n this.calculateCurrentDate();\r\n }\r\n }\r\n\r\n override eventChangesHandler(schedulerEvents: ADCISchedulerEvent[]): void\r\n {\r\n const tableEvents: ADCITableEvent[] = [];\r\n\r\n this.events = schedulerEvents;\r\n\r\n const viewEvents = this.tools.scheduler.getEventsBetweenDateRange(this.startOfMonth, this.endOfMonth, this.events);\r\n\r\n viewEvents.forEach((e: ADCISchedulerEvent) => {\r\n\r\n const startRowIndex = this.rows.findIndex((r, i) => {\r\n if(i == 0) return;\r\n\r\n return r.columns.map(c => (this.tools.dateTime.dateOnly(c.value))).includes(this.tools.dateTime.dateOnly(e.startDate))\r\n });\r\n\r\n const startColumnIndex = startRowIndex == -1 ? 0 : this.rows[startRowIndex].columns.findIndex(c => \r\n this.tools.dateTime.dateOnly(c.value) == this.tools.dateTime.dateOnly(e.startDate)\r\n );\r\n\r\n const endRowIndex = this.rows.findIndex((r, i) => {\r\n\r\n if(i == 0) return;\r\n\r\n return r.columns.map(c => (this.tools.dateTime.dateOnly(c.value))).includes(this.tools.dateTime.dateOnly(e.endDate));\r\n });\r\n\r\n const endColumnIndex = endRowIndex == -1 ? this.rows[this.rows.length - 1].columns.length - 1 : this.rows[endRowIndex].columns.findIndex(c => \r\n this.tools.dateTime.dateOnly(c.value) == this.tools.dateTime.dateOnly(e.endDate)\r\n );\r\n\r\n const startTime = +this.tools.dateTime.hourOrDefault(e.startTime, '00');\r\n const endTime = +this.tools.dateTime.hourOrDefault(e.endTime, '24');\r\n\r\n const cellEvent: ADCITableEvent = {\r\n columnStart: startRowIndex != -1 ? startColumnIndex : null,\r\n columnEnd: endRowIndex != -1 ? endColumnIndex : null,\r\n data: e,\r\n rowStart: startRowIndex != -1 ? startRowIndex : 0,\r\n rowEnd: endRowIndex != -1 ? endRowIndex : this.rows.length - 1,\r\n offsetX: startTime / 24,\r\n fractionX: e.allDay == true ? 1 : (endTime / 24),\r\n overlapTolerance: this.options.eventOverlapTolerance / 24\r\n };\r\n\r\n tableEvents.push(cellEvent);\r\n });\r\n\r\n this.eventBuilder.data = tableEvents;\r\n }\r\n\r\n dateChangesHandler(): void\r\n {\r\n this.rows = this.getRowsInitialValue();\r\n\r\n this.weeksOfMonth.forEach((week: string, weekIndex: number) => {\r\n\r\n const row: ADCITableRow = {\r\n verticalAlign: 'start',\r\n horizontalAlign: 'start',\r\n label: '',\r\n classList: '',\r\n prefix: '',\r\n suffix: '',\r\n value: week,\r\n columns: []\r\n };\r\n\r\n this.daysOfWeek.forEach((day: string, dayIndex: number) => {\r\n\r\n const date = this.dateAdapter.getDateOfDay(this.year, +week, dayIndex);\r\n const splittedDate = date.split(this.dateSplitter);\r\n const transformedDate = this.dateAdapter.transformDate(+splittedDate[0], +splittedDate[1], +splittedDate[2]);\r\n\r\n row.columns.push({\r\n classList: ''.concat(\r\n transformedDate.split('T')[0] == this.today && this.month == +splittedDate[1] ? ' today ' : ' ',\r\n this.weekends.includes(dayIndex) || this.holidays.includes(transformedDate.split('T')[0]) ? ' holiday ' : ' ',\r\n this.month != +splittedDate[1] ? ' unavailable ' : ' '\r\n ),\r\n label: splittedDate[2],\r\n prefix: '',\r\n suffix: '',\r\n value: transformedDate.split('T')[0],\r\n verticalAlign: 'start',\r\n horizontalAlign: 'start',\r\n selectable: true\r\n })\r\n\r\n });\r\n\r\n this.rows.push(row);\r\n\r\n\r\n }); \r\n }\r\n\r\n override weekendsChangesHandler(weekends: number[]): void \r\n {\r\n this.weekends = weekends;\r\n this.dateChangesHandler();\r\n }\r\n\r\n override holidaysChangesHandler(holidays: string[]): void \r\n {\r\n this.holidays = holidays;\r\n this.dateChangesHandler();\r\n }\r\n\r\n onDateRangeSelect(startCell: ADCITableCell, endCell: ADCITableCell): void\r\n {\r\n const startDate = this.dateAdapter.getDateOfDay(this.year, +startCell.rowValue, +startCell.columnIndex).split(this.dateSplitter);\r\n const transformedStart = this.dateAdapter.transformDate(+startDate[0], +startDate[1], +startDate[2]);\r\n\r\n const endDate = this.dateAdapter.getDateOfDay(this.year, +endCell.rowValue, +endCell.columnIndex).split(this.dateSplitter);\r\n const transformedEnd = this.dateAdapter.transformDate(+endDate[0], +endDate[1], +endDate[2]);\r\n\r\n\r\n const e: ADCISchedulerDateRangeSelectEvent = \r\n {\r\n endDate: transformedEnd,\r\n endTime: '00:00',\r\n startDate: transformedStart,\r\n startTime: '00:00',\r\n }\r\n\r\n super.dateRangeSelect(e);\r\n }\r\n\r\n\r\n override onEventClick(event: ADCITableEvent, dom: HTMLElement, jsEvent: MouseEvent): void \r\n {\r\n const schedulerEvent: ADCISchedulerEvent = this.events.filter(item => item.id == event.data.id)[0];\r\n\r\n super.eventClick({dom: dom, event: schedulerEvent, jsEvent: jsEvent});\r\n }\r\n\r\n ngOnDestroy(): void {\r\n super.destroy();\r\n }\r\n\r\n private getRowsInitialValue(): ADCITableRow[]\r\n {\r\n return [{\r\n label: '',\r\n prefix: '',\r\n suffix: '',\r\n verticalAlign: 'center',\r\n horizontalAlign: 'center',\r\n classList: '',\r\n value: '',\r\n columns: this.daysOfWeek.map((dayName, index) => {\r\n\r\n const dIndex = this.commonService.getDayIndex(index);\r\n\r\n return {\r\n label: this.labels?.daysOfWeek[dIndex] || dayName,\r\n prefix: '',\r\n suffix: '',\r\n verticalAlign: 'center',\r\n horizontalAlign: 'center',\r\n classList: this.weekends.includes(index) ? 'holiday' : '',\r\n display: true,\r\n value: index.toString(),\r\n selectable: false,\r\n }\r\n }),\r\n }]\r\n }\r\n}\r\n"," \r\n<adc-table\r\n[rows]=\"rows\"\r\n[title]=\"title\"\r\n[showRowDetails]=\"false\"\r\n[selectionManager]=\"selectionManager\"\r\n[eventBuilder]=\"eventBuilder\"\r\n(viewReady)=\"markViewAsReady()\"\r\n></adc-table>\r\n\r\n<!-- [eventBuilder]=\"builder\" -->\r\n\r\n<!-- [tableEvents]=\"tableEvents\" -->\r\n\r\n<!-- <div flatEventBuilder [columns]=\"columns.length\" [rows]=\"rows.length\" #builder=\"eventBuilder\"></div> -->\r\n\r\n\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { ADCDayViewComponent } from './components/adcday-view/adcday-view.component';\r\nimport { ADCWeekViewComponent } from './components/adcweek-view/adcweek-view.component';\r\nimport { ADCMonthViewComponent } from './components/adcmonth-view/adcmonth-view.component';\r\n\r\n\r\nimport { ADCTableComponent } from '@asadi/angular-date-components/core';\r\n\r\n@NgModule({\r\n declarations: [\r\n ADCDayViewComponent,\r\n ADCWeekViewComponent,\r\n ADCMonthViewComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n ADCTableComponent,\r\n ],\r\n exports: [\r\n ADCDayViewComponent,\r\n ADCWeekViewComponent,\r\n ADCMonthViewComponent\r\n ]\r\n})\r\nexport class ADCSchedulerModule { }\r\n","import { booleanAttribute, Component, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';\r\nimport { ADCSchedulerModule } from '../../adcscheduler.module';\r\nimport { ADCILabels, ADCIOptions, ADCIViewButton, ADC_LABELS, ADC_OPTIONS } from '@asadi/angular-date-components/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ADCSchedulerSource } from '../../directives/adc-scheduler-source.directive';\r\nimport { ADCBaseContainerComponent } from '@asadi/angular-date-components/core';\r\nimport { DateChangeService } from '@asadi/angular-date-components/core';\r\nimport { ADCISchedulerView } from '../../interface.global';\r\nimport { ADCMonthViewComponent } from '../adcmonth-view/adcmonth-view.component';\r\nimport { ADCWeekViewComponent } from '../adcweek-view/adcweek-view.component';\r\nimport { ADCDayViewComponent } from '../adcday-view/adcday-view.component';\r\n\r\nconst defaultViews: string[] = ['month', 'week', 'day'];\r\n\r\n\r\n/**\r\n * A component for rendering and managing a scheduler interface with different views (month, week, day).\r\n * The component allows navigation between views, changing the displayed date, and adding custom views.\r\n * \r\n * ### Usage Example\r\n * ```html\r\n * <adc-scheduler \r\n * [DefaultViews]=\"['month', 'week']\" \r\n * [CustomViews]=\"customViews\" \r\n * (ViewChange)=\"onViewChanged($event)\" \r\n * (Next)=\"onNextClicked()\" \r\n * (Previous)=\"onPreviousClicked()\">\r\n * </adc-scheduler>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'adc-scheduler',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ADCSchedulerModule,\r\n ADCBaseContainerComponent\r\n ],\r\n hostDirectives: [\r\n {\r\n directive: ADCSchedulerSource,\r\n outputs: ['dateRangeSelect', 'eventSelect', 'dateRangeChange'],\r\n inputs: ['startOf', 'holidays', 'weekends', 'events']\r\n }\r\n ],\r\n templateUrl: './adcscheduler.component.html',\r\n styleUrls: ['./adcscheduler.component.css'],\r\n providers: [\r\n DateChangeService\r\n ]\r\n})\r\nexport class ADCSchedulerComponent {\r\n\r\n currentView: string = this.schedulerOptions.initialView;\r\n\r\n private defaultViewComponents: ADCISchedulerView[] = [\r\n {\r\n id: 'month',\r\n name: this.labels?.month || 'month',\r\n component: ADCMonthViewComponent\r\n },\r\n {\r\n id: 'week',\r\n name: this.labels?.week || 'week',\r\n component: ADCWeekViewComponent\r\n },\r\n {\r\n id: 'day',\r\n name: this.labels?.day || 'day',\r\n component: ADCDayViewComponent\r\n }\r\n ]\r\n\r\n viewButtons: ADCIViewButton[] = [];\r\n schedulerViews: ADCISchedulerView[] = this.defaultViewComponents;\r\n\r\n private _defaultViews: string[] = [];\r\n private _customViews: ADCISchedulerView[] = [];\r\n\r\n /**\r\n * The default views to be shown in the scheduler (month, week, etc.).\r\n * This input allows you to customize the views shown by default.\r\n * \r\n * @example\r\n * <adc-sched