UNPKG

cfc-ds

Version:

Design System do Conselho Federal de Contabilidade baseado no govbr-ds

343 lines 66.5 kB
import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { DateTimePickerMode } from '../../enums/date-time-picker.enum'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "../icon/icon.component"; export class DatetimerPickerComponent { elementRef; label = 'Data e Hora'; mode = DateTimePickerMode.DateTime; rangeSelection = false; minDate = null; maxDate = null; dateTimeChange = new EventEmitter(); isOpen = false; selectedDate = new Date(); endDate = null; displayValue = ''; // Dados do calendário currentMonth; currentYear; weekDays = ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab']; monthNames = [ 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro' ]; calendarDays = []; // Dados do seletor de tempo hours = '00'; minutes = '00'; // ControlValueAccessor onChange = () => { }; onTouched = () => { }; disabled = false; // Propriedades calculadas para o template get showDatePicker() { return this.mode === DateTimePickerMode.DateTime || this.mode === DateTimePickerMode.Date; } get showTimePicker() { return this.mode === DateTimePickerMode.DateTime || this.mode === DateTimePickerMode.Time; } constructor(elementRef) { this.elementRef = elementRef; const today = new Date(); this.currentMonth = today.getMonth(); this.currentYear = today.getFullYear(); } ngOnInit() { this.buildCalendar(); this.updateDisplayValue(); } clickOutside(event) { if (!this.elementRef.nativeElement.contains(event.target)) { this.isOpen = false; } } toggle() { if (this.disabled) return; this.isOpen = !this.isOpen; if (this.isOpen) { this.buildCalendar(); } } buildCalendar() { this.calendarDays = []; // Determinar o primeiro dia do mês const firstDay = new Date(this.currentYear, this.currentMonth, 1); const lastDay = new Date(this.currentYear, this.currentMonth + 1, 0); // Adicionar dias do mês anterior const daysFromPrevMonth = firstDay.getDay(); const prevMonth = new Date(this.currentYear, this.currentMonth, 0); for (let i = daysFromPrevMonth - 1; i >= 0; i--) { const date = new Date(this.currentYear, this.currentMonth - 1, prevMonth.getDate() - i); this.calendarDays.push({ date, isCurrentMonth: false, isToday: this.isToday(date), isDisabled: this.isDateDisabled(date) }); } // Adicionar dias do mês atual for (let i = 1; i <= lastDay.getDate(); i++) { const date = new Date(this.currentYear, this.currentMonth, i); this.calendarDays.push({ date, isCurrentMonth: true, isToday: this.isToday(date), isDisabled: this.isDateDisabled(date) }); } // Adicionar dias do próximo mês const daysFromNextMonth = 42 - this.calendarDays.length; for (let i = 1; i <= daysFromNextMonth; i++) { const date = new Date(this.currentYear, this.currentMonth + 1, i); this.calendarDays.push({ date, isCurrentMonth: false, isToday: this.isToday(date), isDisabled: this.isDateDisabled(date) }); } } previousMonth() { if (this.currentMonth === 0) { this.currentMonth = 11; this.currentYear--; } else { this.currentMonth--; } this.buildCalendar(); } nextMonth() { if (this.currentMonth === 11) { this.currentMonth = 0; this.currentYear++; } else { this.currentMonth++; } this.buildCalendar(); } selectDate(date) { if (this.disabled || this.isDateDisabled(date)) return; if (this.rangeSelection && this.selectedDate && !this.endDate) { if (date < this.selectedDate) { this.endDate = this.selectedDate; this.selectedDate = date; } else { this.endDate = date; } this.updateDisplayValue(); this.notifyChange(); if (!this.showTimePicker) this.isOpen = false; } else { this.selectedDate = new Date(date); this.endDate = null; // Preservar a hora e minutos atuais if (this.showTimePicker) { this.selectedDate.setHours(parseInt(this.hours)); this.selectedDate.setMinutes(parseInt(this.minutes)); } else { // Zerar as horas e minutos se apenas data this.selectedDate.setHours(0); this.selectedDate.setMinutes(0); this.selectedDate.setSeconds(0); this.selectedDate.setMilliseconds(0); } this.updateDisplayValue(); this.notifyChange(); if (!this.showTimePicker) this.isOpen = false; } } updateHour(increment) { if (this.disabled) return; let hour = parseInt(this.hours) + increment; if (hour > 23) hour = 0; if (hour < 0) hour = 23; this.hours = hour.toString().padStart(2, '0'); this.updateTimeOnSelectedDate(); } updateMinute(increment) { if (this.disabled) return; let minute = parseInt(this.minutes) + increment; if (minute > 59) minute = 0; if (minute < 0) minute = 59; this.minutes = minute.toString().padStart(2, '0'); this.updateTimeOnSelectedDate(); } updateTimeOnSelectedDate() { if (this.disabled || !this.selectedDate) return; this.selectedDate.setHours(parseInt(this.hours)); this.selectedDate.setMinutes(parseInt(this.minutes)); this.updateDisplayValue(); this.notifyChange(); } updateDisplayValue() { if (this.rangeSelection && this.endDate) { const startFormatted = this.formatDate(this.selectedDate); const endFormatted = this.formatDate(this.endDate); this.displayValue = `${startFormatted} até ${endFormatted}`; // Atualizar horas e minutos com base na data selecionada if (this.showTimePicker) { this.hours = this.selectedDate.getHours().toString().padStart(2, '0'); this.minutes = this.selectedDate.getMinutes().toString().padStart(2, '0'); } } else { this.displayValue = this.formatDate(this.selectedDate); if (this.showTimePicker) { this.hours = this.selectedDate.getHours().toString().padStart(2, '0'); this.minutes = this.selectedDate.getMinutes().toString().padStart(2, '0'); if (this.showDatePicker) { this.displayValue += ` ${this.hours}:${this.minutes}`; } else { this.displayValue = `${this.hours}:${this.minutes}`; } } } } formatDate(date) { if (!date) return ''; const day = date.getDate().toString().padStart(2, '0'); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const year = date.getFullYear(); return `${day}/${month}/${year}`; } isToday(date) { const today = new Date(); return date.getDate() === today.getDate() && date.getMonth() === today.getMonth() && date.getFullYear() === today.getFullYear(); } isDateDisabled(date) { if (this.minDate && date < this.minDate) return true; if (this.maxDate && date > this.maxDate) return true; return false; } isSelectedDate(date) { return this.selectedDate && date.getDate() === this.selectedDate.getDate() && date.getMonth() === this.selectedDate.getMonth() && date.getFullYear() === this.selectedDate.getFullYear(); } isEndDate(date) { if (!this.endDate) return false; return date.getDate() === this.endDate.getDate() && date.getMonth() === this.endDate.getMonth() && date.getFullYear() === this.endDate.getFullYear(); } isInRange(date) { if (!this.rangeSelection || !this.selectedDate || !this.endDate) return false; return date > this.selectedDate && date < this.endDate; } setYear(year) { if (!isNaN(year)) { this.currentYear = year; this.buildCalendar(); } } setMonth(month) { this.currentMonth = month; this.buildCalendar(); } // Implementação de ControlValueAccessor writeValue(value) { if (!value) { // Definir valor padrão se nulo this.selectedDate = new Date(); this.endDate = null; this.updateDisplayValue(); return; } if (this.isDateTimeRange(value)) { this.selectedDate = new Date(value.start); this.endDate = value.end ? new Date(value.end) : null; } else { this.selectedDate = new Date(value); this.endDate = null; } // Atualizar horas e minutos if (this.showTimePicker && this.selectedDate) { this.hours = this.selectedDate.getHours().toString().padStart(2, '0'); this.minutes = this.selectedDate.getMinutes().toString().padStart(2, '0'); } this.updateDisplayValue(); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; } isDateTimeRange(value) { return value && 'start' in value && 'end' in value; } notifyChange() { const value = this.rangeSelection && this.endDate ? { start: this.selectedDate, end: this.endDate } : this.selectedDate; this.onChange(value); this.onTouched(); this.dateTimeChange.emit(value); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatetimerPickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatetimerPickerComponent, selector: "cfc-datetimer-picker", inputs: { label: "label", mode: "mode", rangeSelection: "rangeSelection", minDate: "minDate", maxDate: "maxDate" }, outputs: { dateTimeChange: "dateTimeChange" }, host: { listeners: { "document:click": "clickOutside($event)" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: DatetimerPickerComponent, multi: true } ], ngImport: i0, template: "<!-- datetimer-picker.component.html - vers\u00E3o otimizada -->\r\n<div class=\"dt-picker-container\">\r\n <label *ngIf=\"label\">{{ label }}</label>\r\n <div class=\"dt-input-container\">\r\n <input\r\n type=\"text\"\r\n [value]=\"displayValue\"\r\n (click)=\"toggle()\"\r\n [disabled]=\"disabled\"\r\n readonly\r\n class=\"dt-input\"\r\n [class.disabled]=\"disabled\"\r\n >\r\n <span class=\"dt-input-icon\" (click)=\"!disabled && toggle()\">\r\n <cfc-icon *ngIf=\"showDatePicker\" [iconName]=\"'calendar'\" [familyName]=\"'fas'\" [size]=\"'14px'\"></cfc-icon>\r\n <cfc-icon *ngIf=\"!showDatePicker && showTimePicker\" [iconName]=\"'clock'\" [familyName]=\"'fas'\" [size]=\"'14px'\"></cfc-icon>\r\n </span>\r\n </div>\r\n \r\n <div class=\"dt-dropdown\" *ngIf=\"isOpen\">\r\n <!-- Date Picker Component -->\r\n <div class=\"dt-calendar\" *ngIf=\"showDatePicker\">\r\n <div class=\"dt-calendar-header\">\r\n <button type=\"button\" class=\"dt-nav-btn\" (click)=\"previousMonth()\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-left'\" ></cfc-icon>\r\n </button>\r\n <div class=\"dt-month-year\">\r\n <select class=\"dt-month-select\" [(ngModel)]=\"currentMonth\" (ngModelChange)=\"setMonth($event)\">\r\n <option *ngFor=\"let month of monthNames; let i = index\" [value]=\"i\">{{ month }}</option>\r\n </select>\r\n <input class=\"dt-year-input\" type=\"number\" [(ngModel)]=\"currentYear\" (ngModelChange)=\"setYear($event)\">\r\n </div>\r\n <button type=\"button\" class=\"dt-nav-btn\" (click)=\"nextMonth()\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-right'\" ></cfc-icon>\r\n </button>\r\n </div>\r\n \r\n <div class=\"dt-calendar-weekdays\">\r\n <div class=\"dt-weekday\" *ngFor=\"let day of weekDays\">{{ day }}</div>\r\n </div>\r\n \r\n <div class=\"dt-calendar-days\">\r\n <div\r\n *ngFor=\"let day of calendarDays\"\r\n class=\"dt-day\"\r\n [class.dt-other-month]=\"!day.isCurrentMonth\"\r\n [class.dt-today]=\"day.isToday\"\r\n [class.dt-selected]=\"isSelectedDate(day.date)\"\r\n [class.dt-end-date]=\"isEndDate(day.date)\"\r\n [class.dt-in-range]=\"isInRange(day.date)\"\r\n [class.dt-disabled]=\"day.isDisabled\"\r\n (click)=\"!day.isDisabled && selectDate(day.date)\"\r\n >\r\n {{ day.date.getDate() }}\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Time Picker Component -->\r\n <div class=\"dt-timepicker\" *ngIf=\"showTimePicker\">\r\n <div class=\"dt-time-container\">\r\n <div class=\"dt-time-selector\">\r\n <button type=\"button\" class=\"dt-time-btn\" (click)=\"updateHour(1)\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-up'\" ></cfc-icon>\r\n </button>\r\n <input type=\"text\" class=\"dt-time-input\" [value]=\"hours\" readonly>\r\n <button type=\"button\" class=\"dt-time-btn\" (click)=\"updateHour(-1)\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-down'\" ></cfc-icon>\r\n </button>\r\n </div>\r\n <div class=\"dt-time-divider\">:</div>\r\n <div class=\"dt-time-selector\">\r\n <button type=\"button\" class=\"dt-time-btn\" (click)=\"updateMinute(1)\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-up'\" ></cfc-icon>\r\n </button>\r\n <input type=\"text\" class=\"dt-time-input\" [value]=\"minutes\" readonly>\r\n <button type=\"button\" class=\"dt-time-btn\" (click)=\"updateMinute(-1)\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-down'\" ></cfc-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n ", styles: [".dt-picker-container{position:relative;font-family:Arial,sans-serif;width:100%;max-width:320px}label{display:block;margin-bottom:5px;font-size:14px;color:#333}.dt-input-container{position:relative;display:flex;align-items:center}.dt-input{width:100%;padding:8px 30px 8px 10px;border:1px solid #ccc;border-radius:4px;font-size:14px;height:38px;background-color:#fff}.dt-input:focus{outline:none;border-color:orange;box-shadow:0 0 0 2px #ffa5004d}.dt-input-icon{position:absolute;right:10px;color:#06c;cursor:pointer}.calendar-icon,.clock-icon{font-size:18px;color:#06c;display:flex;align-items:center;justify-content:center;height:24px;width:24px}.dt-dropdown{position:absolute;top:calc(100% + 5px);left:0;z-index:1000;background-color:#fff;border-radius:4px;box-shadow:0 2px 10px #0000001a;width:280px;overflow:hidden}.dt-calendar{padding:10px}.dt-calendar-header{display:flex;justify-content:space-between;align-items:center}.dt-nav-btn{background-color:transparent;border:none;color:#06c;font-size:18px;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%}.dt-nav-btn:first-child mat-icon{font-size:20px}.dt-nav-btn:last-child mat-icon{font-size:20px}.dt-nav-btn:hover{background-color:#0066cc1a}.dt-month-year{display:flex;align-items:center;gap:5px}.dt-month-select{padding:3px 8px;border:none;background-color:transparent;color:#06c;font-size:14px;cursor:pointer;appearance:none;outline:none}.dt-year-input{width:70px;padding:3px 8px;border:1px solid #ccc;border-radius:4px;font-size:14px;text-align:center}.dt-time-btn mat-icon{font-size:16px;height:16px;width:16px}.dt-calendar-weekdays{display:grid;grid-template-columns:repeat(7,1fr);margin-bottom:5px}.dt-weekday{text-align:center;font-size:12px;font-weight:700;color:#666;padding:5px 0}.dt-calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.dt-day{height:30px;display:flex;align-items:center;justify-content:center;font-size:14px;cursor:pointer;border-radius:50%;color:#06c}.dt-day:hover{background-color:#0066cc1a}.dt-other-month{color:#aaa}.dt-today{color:#f33;font-weight:700}.dt-selected,.dt-end-date{background-color:#06c;color:#fff;font-weight:700}.dt-selected:hover,.dt-end-date:hover{background-color:#05a}.dt-in-range{background-color:#06c3}.dt-disabled{opacity:.4;cursor:not-allowed;text-decoration:line-through}.dt-timepicker{padding:10px;border-top:1px solid #eee}.dt-time-container{display:flex;justify-content:center;align-items:center;gap:10px}.dt-time-selector{display:flex;flex-direction:column;align-items:center}.dt-time-btn{background-color:transparent;border:none;color:#06c;font-size:12px;cursor:pointer;display:flex;align-items:center;justify-content:center}.dt-time-btn:hover{background-color:#0066cc1a}.dt-time-input{width:40px;height:40px;padding:3px;border:1px solid #ccc;border-radius:4px;font-size:14px;text-align:center;margin:3px 0}.dt-time-divider{font-size:18px;font-weight:700;color:#333}:host-context(.dark-mode) .dt-input{background-color:#1f1f1f;color:#fff;border-color:#444}:host-context(.dark-mode) .dt-dropdown{background-color:#1f1f1f}:host-context(.dark-mode) label{color:#fff}:host-context(.dark-mode) .dt-calendar-header,:host-context(.dark-mode) .dt-nav-btn,:host-context(.dark-mode) .dt-month-select,:host-context(.dark-mode) .dt-calendar-weekdays,:host-context(.dark-mode) .dt-day,:host-context(.dark-mode) .dt-time-btn,:host-context(.dark-mode) .dt-time-divider{color:#fff}:host-context(.dark-mode) .dt-year-input,:host-context(.dark-mode) .dt-time-input{background-color:#2f2f2f;color:#fff;border-color:#444}:host-context(.dark-mode) .dt-other-month{color:#666}:host-context(.dark-mode) .dt-today{color:#f66}:host-context(.dark-mode) .dt-selected,:host-context(.dark-mode) .dt-end-date{background-color:#07d;color:#fff}:host-context(.dark-mode) .dt-in-range{background-color:#0077dd4d}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.IconComponent, selector: "cfc-icon", inputs: ["iconName", "familyName", "className", "size", "color"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatetimerPickerComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-datetimer-picker', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: DatetimerPickerComponent, multi: true } ], template: "<!-- datetimer-picker.component.html - vers\u00E3o otimizada -->\r\n<div class=\"dt-picker-container\">\r\n <label *ngIf=\"label\">{{ label }}</label>\r\n <div class=\"dt-input-container\">\r\n <input\r\n type=\"text\"\r\n [value]=\"displayValue\"\r\n (click)=\"toggle()\"\r\n [disabled]=\"disabled\"\r\n readonly\r\n class=\"dt-input\"\r\n [class.disabled]=\"disabled\"\r\n >\r\n <span class=\"dt-input-icon\" (click)=\"!disabled && toggle()\">\r\n <cfc-icon *ngIf=\"showDatePicker\" [iconName]=\"'calendar'\" [familyName]=\"'fas'\" [size]=\"'14px'\"></cfc-icon>\r\n <cfc-icon *ngIf=\"!showDatePicker && showTimePicker\" [iconName]=\"'clock'\" [familyName]=\"'fas'\" [size]=\"'14px'\"></cfc-icon>\r\n </span>\r\n </div>\r\n \r\n <div class=\"dt-dropdown\" *ngIf=\"isOpen\">\r\n <!-- Date Picker Component -->\r\n <div class=\"dt-calendar\" *ngIf=\"showDatePicker\">\r\n <div class=\"dt-calendar-header\">\r\n <button type=\"button\" class=\"dt-nav-btn\" (click)=\"previousMonth()\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-left'\" ></cfc-icon>\r\n </button>\r\n <div class=\"dt-month-year\">\r\n <select class=\"dt-month-select\" [(ngModel)]=\"currentMonth\" (ngModelChange)=\"setMonth($event)\">\r\n <option *ngFor=\"let month of monthNames; let i = index\" [value]=\"i\">{{ month }}</option>\r\n </select>\r\n <input class=\"dt-year-input\" type=\"number\" [(ngModel)]=\"currentYear\" (ngModelChange)=\"setYear($event)\">\r\n </div>\r\n <button type=\"button\" class=\"dt-nav-btn\" (click)=\"nextMonth()\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-right'\" ></cfc-icon>\r\n </button>\r\n </div>\r\n \r\n <div class=\"dt-calendar-weekdays\">\r\n <div class=\"dt-weekday\" *ngFor=\"let day of weekDays\">{{ day }}</div>\r\n </div>\r\n \r\n <div class=\"dt-calendar-days\">\r\n <div\r\n *ngFor=\"let day of calendarDays\"\r\n class=\"dt-day\"\r\n [class.dt-other-month]=\"!day.isCurrentMonth\"\r\n [class.dt-today]=\"day.isToday\"\r\n [class.dt-selected]=\"isSelectedDate(day.date)\"\r\n [class.dt-end-date]=\"isEndDate(day.date)\"\r\n [class.dt-in-range]=\"isInRange(day.date)\"\r\n [class.dt-disabled]=\"day.isDisabled\"\r\n (click)=\"!day.isDisabled && selectDate(day.date)\"\r\n >\r\n {{ day.date.getDate() }}\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Time Picker Component -->\r\n <div class=\"dt-timepicker\" *ngIf=\"showTimePicker\">\r\n <div class=\"dt-time-container\">\r\n <div class=\"dt-time-selector\">\r\n <button type=\"button\" class=\"dt-time-btn\" (click)=\"updateHour(1)\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-up'\" ></cfc-icon>\r\n </button>\r\n <input type=\"text\" class=\"dt-time-input\" [value]=\"hours\" readonly>\r\n <button type=\"button\" class=\"dt-time-btn\" (click)=\"updateHour(-1)\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-down'\" ></cfc-icon>\r\n </button>\r\n </div>\r\n <div class=\"dt-time-divider\">:</div>\r\n <div class=\"dt-time-selector\">\r\n <button type=\"button\" class=\"dt-time-btn\" (click)=\"updateMinute(1)\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-up'\" ></cfc-icon>\r\n </button>\r\n <input type=\"text\" class=\"dt-time-input\" [value]=\"minutes\" readonly>\r\n <button type=\"button\" class=\"dt-time-btn\" (click)=\"updateMinute(-1)\">\r\n <cfc-icon [size]=\"'16px'\" [familyName]=\"'fas'\" [iconName]=\"'chevron-down'\" ></cfc-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n ", styles: [".dt-picker-container{position:relative;font-family:Arial,sans-serif;width:100%;max-width:320px}label{display:block;margin-bottom:5px;font-size:14px;color:#333}.dt-input-container{position:relative;display:flex;align-items:center}.dt-input{width:100%;padding:8px 30px 8px 10px;border:1px solid #ccc;border-radius:4px;font-size:14px;height:38px;background-color:#fff}.dt-input:focus{outline:none;border-color:orange;box-shadow:0 0 0 2px #ffa5004d}.dt-input-icon{position:absolute;right:10px;color:#06c;cursor:pointer}.calendar-icon,.clock-icon{font-size:18px;color:#06c;display:flex;align-items:center;justify-content:center;height:24px;width:24px}.dt-dropdown{position:absolute;top:calc(100% + 5px);left:0;z-index:1000;background-color:#fff;border-radius:4px;box-shadow:0 2px 10px #0000001a;width:280px;overflow:hidden}.dt-calendar{padding:10px}.dt-calendar-header{display:flex;justify-content:space-between;align-items:center}.dt-nav-btn{background-color:transparent;border:none;color:#06c;font-size:18px;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%}.dt-nav-btn:first-child mat-icon{font-size:20px}.dt-nav-btn:last-child mat-icon{font-size:20px}.dt-nav-btn:hover{background-color:#0066cc1a}.dt-month-year{display:flex;align-items:center;gap:5px}.dt-month-select{padding:3px 8px;border:none;background-color:transparent;color:#06c;font-size:14px;cursor:pointer;appearance:none;outline:none}.dt-year-input{width:70px;padding:3px 8px;border:1px solid #ccc;border-radius:4px;font-size:14px;text-align:center}.dt-time-btn mat-icon{font-size:16px;height:16px;width:16px}.dt-calendar-weekdays{display:grid;grid-template-columns:repeat(7,1fr);margin-bottom:5px}.dt-weekday{text-align:center;font-size:12px;font-weight:700;color:#666;padding:5px 0}.dt-calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.dt-day{height:30px;display:flex;align-items:center;justify-content:center;font-size:14px;cursor:pointer;border-radius:50%;color:#06c}.dt-day:hover{background-color:#0066cc1a}.dt-other-month{color:#aaa}.dt-today{color:#f33;font-weight:700}.dt-selected,.dt-end-date{background-color:#06c;color:#fff;font-weight:700}.dt-selected:hover,.dt-end-date:hover{background-color:#05a}.dt-in-range{background-color:#06c3}.dt-disabled{opacity:.4;cursor:not-allowed;text-decoration:line-through}.dt-timepicker{padding:10px;border-top:1px solid #eee}.dt-time-container{display:flex;justify-content:center;align-items:center;gap:10px}.dt-time-selector{display:flex;flex-direction:column;align-items:center}.dt-time-btn{background-color:transparent;border:none;color:#06c;font-size:12px;cursor:pointer;display:flex;align-items:center;justify-content:center}.dt-time-btn:hover{background-color:#0066cc1a}.dt-time-input{width:40px;height:40px;padding:3px;border:1px solid #ccc;border-radius:4px;font-size:14px;text-align:center;margin:3px 0}.dt-time-divider{font-size:18px;font-weight:700;color:#333}:host-context(.dark-mode) .dt-input{background-color:#1f1f1f;color:#fff;border-color:#444}:host-context(.dark-mode) .dt-dropdown{background-color:#1f1f1f}:host-context(.dark-mode) label{color:#fff}:host-context(.dark-mode) .dt-calendar-header,:host-context(.dark-mode) .dt-nav-btn,:host-context(.dark-mode) .dt-month-select,:host-context(.dark-mode) .dt-calendar-weekdays,:host-context(.dark-mode) .dt-day,:host-context(.dark-mode) .dt-time-btn,:host-context(.dark-mode) .dt-time-divider{color:#fff}:host-context(.dark-mode) .dt-year-input,:host-context(.dark-mode) .dt-time-input{background-color:#2f2f2f;color:#fff;border-color:#444}:host-context(.dark-mode) .dt-other-month{color:#666}:host-context(.dark-mode) .dt-today{color:#f66}:host-context(.dark-mode) .dt-selected,:host-context(.dark-mode) .dt-end-date{background-color:#07d;color:#fff}:host-context(.dark-mode) .dt-in-range{background-color:#0077dd4d}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { label: [{ type: Input }], mode: [{ type: Input }], rangeSelection: [{ type: Input }], minDate: [{ type: Input }], maxDate: [{ type: Input }], dateTimeChange: [{ type: Output }], clickOutside: [{ type: HostListener, args: ['document:click', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGV0aW1lci1waWNrZXIvZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGV0aW1lci1waWNrZXIvZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFjLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7O0FBZXZFLE1BQU0sT0FBTyx3QkFBd0I7SUEwQ2Y7SUF6Q1gsS0FBSyxHQUFXLGFBQWEsQ0FBQztJQUM5QixJQUFJLEdBQXVCLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztJQUN2RCxjQUFjLEdBQVksS0FBSyxDQUFDO0lBQ2hDLE9BQU8sR0FBZ0IsSUFBSSxDQUFDO0lBQzVCLE9BQU8sR0FBZ0IsSUFBSSxDQUFDO0lBRTNCLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztJQUVwRSxNQUFNLEdBQVksS0FBSyxDQUFDO0lBQ3hCLFlBQVksR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ2hDLE9BQU8sR0FBZ0IsSUFBSSxDQUFDO0lBQzVCLFlBQVksR0FBVyxFQUFFLENBQUM7SUFFMUIsc0JBQXNCO0lBQ3RCLFlBQVksQ0FBUztJQUNyQixXQUFXLENBQVM7SUFDcEIsUUFBUSxHQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFL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Q0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUV0RSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO3dHQXRVVSx3QkFBd0I7NEZBQXhCLHdCQUF3QixxUkFSeEI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsd0JBQXdCO2dCQUNyQyxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsMEJDZkgsaW9JQW9GRTs7NEZEbkVXLHdCQUF3QjtrQkFacEMsU0FBUzsrQkFDRSxzQkFBc0IsYUFHckI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVywwQkFBMEI7NEJBQ3JDLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOytFQUdRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLGNBQWM7c0JBQXZCLE1BQU07Z0JBK0NQLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVUaW1lUGlja2VyTW9kZSB9IGZyb20gJy4uLy4uL2VudW1zL2RhdGUtdGltZS1waWNrZXIuZW51bSc7XHJcbmltcG9ydCB7IERhdGVUaW1lUmFuZ2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0ZS10aW1lLXJhbmdlLm1vZGVsJ1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjZmMtZGF0ZXRpbWVyLXBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGV0aW1lci1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9kYXRldGltZXItcGlja2VyLmNvbXBvbmVudC5zY3NzJyxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBEYXRldGltZXJQaWNrZXJDb21wb25lbnQsXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZXRpbWVyUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICdEYXRhIGUgSG9yYSc7XHJcbiAgQElucHV0KCkgbW9kZTogRGF0ZVRpbWVQaWNrZXJNb2RlID0gRGF0ZVRpbWVQaWNrZXJNb2RlLkRhdGVUaW1lO1xyXG4gIEBJbnB1dCgpIHJhbmdlU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbWluRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIG1heERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQE91dHB1dCgpIGRhdGVUaW1lQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgRGF0ZVRpbWVSYW5nZT4oKTtcclxuXHJcbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWREYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcclxuICBlbmREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgZGlzcGxheVZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLy8gRGFkb3MgZG8gY2FsZW5kw6FyaW9cclxuICBjdXJyZW50TW9udGg6IG51bWJlcjtcclxuICBjdXJyZW50WWVhcjogbnVtYmVyO1xyXG4gIHdlZWtEYXlzOiBzdHJpbmdbXSA9IFsnRG9tJywgJ1NlZycsICdUZXInLCAnUXVhJywgJ1F1aScsICdTZXgnLCAnU2FiJ107XHJcbiAgbW9udGhOYW1lczogc3RyaW5nW10gPSBbXHJcbiAgICAnSmFuZWlybycsICdGZXZlcmVpcm8nLCAnTWFyw6dvJywgJ0FicmlsJywgJ01haW8nLCAnSnVuaG8nLFxyXG4gICAgJ0p1bGhvJywgJ0Fnb3N0bycsICdTZXRlbWJybycsICdPdXR1YnJvJywgJ05vdmVtYnJvJywgJ0RlemVtYnJvJ1xyXG4gIF07XHJcbiAgY2FsZW5kYXJEYXlzOiBBcnJheTx7ZGF0ZTogRGF0ZSwgaXNDdXJyZW50TW9udGg6IGJvb2xlYW4sIGlzVG9kYXk6IGJvb2xlYW4sIGlzRGlzYWJsZWQ6IGJvb2xlYW59PiA9IFtdO1xyXG5cclxuICAvLyBEYWRvcyBkbyBzZWxldG9yIGRlIHRlbXBvXHJcbiAgaG91cnM6IHN0cmluZyA9ICcwMCc7XHJcbiAgbWludXRlczogc3RyaW5nID0gJzAwJztcclxuXHJcbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICBwcml2YXRlIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcclxuICBwcml2YXRlIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XHJcbiAgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8gUHJvcHJpZWRhZGVzIGNhbGN1bGFkYXMgcGFyYSBvIHRlbXBsYXRlXHJcbiAgZ2V0IHNob3dEYXRlUGlja2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gRGF0ZVRpbWVQaWNrZXJNb2RlLkRhdGVUaW1lIHx8IHRoaXMubW9kZSA9PT0gRGF0ZVRpbWVQaWNrZXJNb2RlLkRhdGU7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd1RpbWVQaWNrZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBEYXRlVGltZVBpY2tlck1vZGUuRGF0ZVRpbWUgfHwgdGhpcy5tb2RlID09PSBEYXRlVGltZVBpY2tlck1vZGUuVGltZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSB0b2RheS5nZXRNb250aCgpO1xyXG4gICAgdGhpcy5jdXJyZW50WWVhciA9IHRvZGF5LmdldEZ1bGxZZWFyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYnVpbGRDYWxlbmRhcigpO1xyXG4gICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBjbGlja091dHNpZGUoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZSgpIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLmJ1aWxkQ2FsZW5kYXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJ1aWxkQ2FsZW5kYXIoKSB7XHJcbiAgICB0aGlzLmNhbGVuZGFyRGF5cyA9IFtdO1xyXG5cclxuICAgIC8vIERldGVybWluYXIgbyBwcmltZWlybyBkaWEgZG8gbcOqc1xyXG4gICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgMSk7XHJcbiAgICBjb25zdCBsYXN0RGF5ID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGggKyAxLCAwKTtcclxuXHJcbiAgICAvLyBBZGljaW9uYXIgZGlhcyBkbyBtw6pzIGFudGVyaW9yXHJcbiAgICBjb25zdCBkYXlzRnJvbVByZXZN