@oneluiz/dual-datepicker 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneluiz/dual-datepicker",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "A customizable dual-calendar date range picker component for Angular 17+",
5
5
  "keywords": [
6
6
  "angular",
@@ -33,20 +33,22 @@
33
33
  "README.md",
34
34
  "LICENSE"
35
35
  ],
36
- "scripts": {
37
- "build": "ng-packagr -p ng-package.json",
38
- "prepare": "npm run build"
36
+ "packageManager": "pnpm@10.13.1+sha512.37ebf1a5c7a30d5fabe0c5df44ee8da4c965ca0c5af3dbab28c3a1681b70a256218d05c81c9c0dcf767ef6b8551eb5b960042b9ed4300c59242336377e01cfad",
37
+ "module": "fesm2022/oneluiz-dual-datepicker.mjs",
38
+ "typings": "index.d.ts",
39
+ "exports": {
40
+ "./package.json": {
41
+ "default": "./package.json"
42
+ },
43
+ ".": {
44
+ "types": "./index.d.ts",
45
+ "esm2022": "./esm2022/oneluiz-dual-datepicker.mjs",
46
+ "esm": "./esm2022/oneluiz-dual-datepicker.mjs",
47
+ "default": "./fesm2022/oneluiz-dual-datepicker.mjs"
48
+ }
39
49
  },
40
- "devDependencies": {
41
- "@angular/common": "^17.3.12",
42
- "@angular/compiler": "^18.2.14",
43
- "@angular/compiler-cli": "^18.2.14",
44
- "@angular/core": "^17.3.12",
45
- "@angular/forms": "^17.3.12",
46
- "ng-packagr": "^18.2.1",
47
- "rxjs": "^7.8.2",
48
- "typescript": "5.5",
49
- "zone.js": "^0.14.10"
50
- },
51
- "packageManager": "pnpm@10.13.1+sha512.37ebf1a5c7a30d5fabe0c5df44ee8da4c965ca0c5af3dbab28c3a1681b70a256218d05c81c9c0dcf767ef6b8551eb5b960042b9ed4300c59242336377e01cfad"
52
- }
50
+ "sideEffects": false,
51
+ "dependencies": {
52
+ "tslib": "^2.3.0"
53
+ }
54
+ }
package/dist/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Luis Cortes
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
package/dist/README.md DELETED
@@ -1,280 +0,0 @@
1
- # @oneluiz/dual-datepicker
2
-
3
- A beautiful, customizable dual-calendar date range picker for Angular 17+. Built as a standalone component with full TypeScript support.
4
-
5
- ![npm version](https://img.shields.io/npm/v/@oneluiz/dual-datepicker)
6
- ![license](https://img.shields.io/npm/l/@ngx-tools/dual-datepicker)
7
- ![Angular](https://img.shields.io/badge/Angular-17%2B-red)
8
-
9
- ## ✨ Features
10
-
11
- - 📅 **Dual Calendar Display** - Side-by-side month view for easy range selection
12
- - 🎨 **Fully Customizable** - Color scheme, padding, and styling
13
- - ⚡ **Preset Ranges** - Configurable quick-select options
14
- - 🎯 **Standalone Component** - No module imports required
15
- - � **Zero Dependencies** - No Bootstrap or other CSS frameworks required
16
- - �📱 **Responsive Design** - Works on desktop and mobile
17
- - 🌐 **TypeScript** - Full type safety
18
- - ♿ **Accessible** - Keyboard navigation and ARIA labels
19
- - 🎭 **Flexible Behavior** - Control when the picker closes
20
-
21
- ## 📦 Installation
22
-
23
- ```bash
24
- npm install @oneluiz/dual-datepicker
25
- ```
26
-
27
- ## 🚀 Quick Start
28
-
29
- ### 1. Import the Component
30
-
31
- ```typescript
32
- import { Component } from '@angular/core';
33
- import { DualDatepickerComponent, DateRange } from '@oneluiz/dual-datepicker';
34
-
35
- @Component({
36
- selector: 'app-root',
37
- standalone: true,
38
- imports: [DualDatepickerComponent],
39
- template: `
40
- <ngx-dual-datepicker
41
- [(ngModel)]="dateRange"
42
- placeholder="Select date range">
43
- </ngx-dual-datepicker>
44
- `
45
- })
46
- export class AppComponent {
47
- dateRange: DateRange = { start: null, end: null };
48
- }
49
- ```
50
-
51
- ### 2. Use with Forms
52
-
53
- ```typescript
54
- import { Component } from '@angular/core';
55
- import { FormsModule } from '@angular/forms';
56
- import { DualDatepickerComponent } from '@oneluiz/dual-datepicker';
57
-
58
- @Component({
59
- selector: 'app-example',
60
- standalone: true,
61
- imports: [FormsModule, DualDatepickerComponent],
62
- template: `
63
- <ngx-dual-datepicker
64
- [(ngModel)]="selectedRange"
65
- [presets]="customPresets"
66
- (ngModelChange)="onDateChange($event)">
67
- </ngx-dual-datepicker>
68
- `
69
- })
70
- export class ExampleComponent {
71
- selectedRange = { start: null, end: null };
72
-
73
- customPresets = [
74
- { label: 'Last 7 days', daysAgo: 7 },
75
- { label: 'Last 30 days', daysAgo: 30 },
76
- { label: 'Last 90 days', daysAgo: 90 }
77
- ];
78
-
79
- onDateChange(range: any) {
80
- console.log('Date range selected:', range);
81
- }
82
- }
83
- ```
84
-
85
- ## 🎨 Customization
86
-
87
- ### Custom Colors (Bootstrap Style)
88
-
89
- ```typescript
90
- <ngx-dual-datepicker
91
- [(ngModel)]="dateRange"
92
- inputBackgroundColor="#ffffff"
93
- inputTextColor="#495057"
94
- inputBorderColor="#ced4da"
95
- inputBorderColorHover="#80bdff"
96
- inputBorderColorFocus="#80bdff"
97
- inputPadding="0.375rem 0.75rem">
98
- </ngx-dual-datepicker>
99
- ```
100
-
101
- ### Custom Colors (GitHub Style)
102
-
103
- ```typescript
104
- <ngx-dual-datepicker
105
- [(ngModel)]="dateRange"
106
- inputBackgroundColor="#f3f4f6"
107
- inputTextColor="#24292e"
108
- inputBorderColor="transparent"
109
- inputBorderColorHover="#d1d5db"
110
- inputBorderColorFocus="#80bdff"
111
- inputPadding="6px 10px">
112
- </ngx-dual-datepicker>
113
- ```
114
-
115
- ### Custom Presets
116
-
117
- ```typescript
118
- customPresets: PresetConfig[] = [
119
- { label: 'Last 15 days', daysAgo: 15 },
120
- { label: 'Last 3 months', daysAgo: 90 },
121
- { label: 'Last 6 months', daysAgo: 180 },
122
- { label: 'Last year', daysAgo: 365 }
123
- ];
124
- ```
125
-
126
- ```html
127
- <ngx-dual-datepicker
128
- [(ngModel)]="dateRange"
129
- [presets]="customPresets">
130
- </ngx-dual-datepicker>
131
- ```
132
-
133
- ## 📖 API Reference
134
-
135
- ### Inputs
136
-
137
- | Property | Type | Default | Description |
138
- |----------|------|---------|-------------|
139
- | `ngModel` | `DateRange` | `{ start: null, end: null }` | Two-way binding for selected date range |
140
- | `placeholder` | `string` | `'Select date range'` | Input placeholder text |
141
- | `presets` | `PresetConfig[]` | Default presets | Array of preset configurations |
142
- | `closeOnSelection` | `boolean` | `false` | Close picker when both dates selected |
143
- | `closeOnPresetSelection` | `boolean` | `false` | Close picker when preset is clicked |
144
- | `closeOnClickOutside` | `boolean` | `true` | Close picker when clicking outside |
145
- | `inputBackgroundColor` | `string` | `'#fff'` | Input background color |
146
- | `inputTextColor` | `string` | `'#495057'` | Input text color |
147
- | `inputBorderColor` | `string` | `'#ced4da'` | Input border color |
148
- | `inputBorderColorHover` | `string` | `'#9ca3af'` | Input border color on hover |
149
- | `inputBorderColorFocus` | `string` | `'#80bdff'` | Input border color on focus |
150
- | `inputPadding` | `string` | `'0.375rem 0.75rem'` | Input padding |
151
-
152
- ### Outputs
153
-
154
- | Event | Type | Description |
155
- |-------|------|-------------|
156
- | `ngModelChange` | `EventEmitter<DateRange>` | Emitted when date range changes |
157
-
158
- ### Types
159
-
160
- ```typescript
161
- interface DateRange {
162
- start: Date | null;
163
- end: Date | null;
164
- }
165
-
166
- interface PresetConfig {
167
- label: string;
168
- daysAgo: number;
169
- }
170
- ```
171
-
172
- ### Default Presets
173
-
174
- ```typescript
175
- [
176
- { label: 'Last month', daysAgo: 30 },
177
- { label: 'Last 6 months', daysAgo: 180 },
178
- { label: 'Last year', daysAgo: 365 }
179
- ]
180
- ```
181
-
182
- ## 🎯 Examples
183
-
184
- ### Minimal Usage
185
-
186
- ```html
187
- <ngx-dual-datepicker [(ngModel)]="dateRange"></ngx-dual-datepicker>
188
- ```
189
-
190
- ### With Auto-close
191
-
192
- ```html
193
- <ngx-dual-datepicker
194
- [(ngModel)]="dateRange"
195
- [closeOnSelection]="true"
196
- [closeOnPresetSelection]="true">
197
- </ngx-dual-datepicker>
198
- ```
199
-
200
- ### Custom Styling
201
-
202
- ```html
203
- <ngx-dual-datepicker
204
- [(ngModel)]="dateRange"
205
- placeholder="Pick your dates"
206
- inputBackgroundColor="#fef3c7"
207
- inputTextColor="#92400e"
208
- inputBorderColor="#fbbf24"
209
- inputBorderColorHover="#f59e0b"
210
- inputBorderColorFocus="#d97706"
211
- inputPadding="8px 12px">
212
- </ngx-dual-datepicker>
213
- ```
214
-
215
- ### With Event Handler
216
-
217
- ```typescript
218
- @Component({
219
- selector: 'app-example',
220
- template: `
221
- <ngx-dual-datepicker
222
- [(ngModel)]="dateRange"
223
- (ngModelChange)="onDateRangeChange($event)">
224
- </ngx-dual-datepicker>
225
-
226
- <div *ngIf="dateRange.start && dateRange.end">
227
- Selected: {{ formatDateRange() }}
228
- </div>
229
- `
230
- })
231
- export class ExampleComponent {
232
- dateRange: DateRange = { start: null, end: null };
233
-
234
- onDateRangeChange(range: DateRange) {
235
- console.log('Start:', range.start);
236
- console.log('End:', range.end);
237
-
238
- if (range.start && range.end) {
239
- // Both dates selected - do something
240
- this.fetchData(range.start, range.end);
241
- }
242
- }
243
-
244
- formatDateRange(): string {
245
- if (!this.dateRange.start || !this.dateRange.end) return '';
246
- return `${this.dateRange.start.toLocaleDateString()} - ${this.dateRange.end.toLocaleDateString()}`;
247
- }
248
-
249
- fetchData(start: Date, end: Date) {
250
- // Your API call here
251
- }
252
- }
253
- ```
254
-
255
- ## 🛠️ Requirements
256
-
257
- - Angular 17.0.0 or higher
258
- - Angular 18.0.0 or higher
259
- - Angular 19.0.0 or higher
260
- - Angular 20.0.0 or higher
261
-
262
- ## 📄 License
263
-
264
- MIT © Luis Cortes
265
-
266
- ## 🤝 Contributing
267
-
268
- Contributions are welcome! Please feel free to submit a Pull Request.
269
-
270
- ## 🐛 Issues
271
-
272
- Found a bug? Please [open an issue](https://github.com/oneluiz/ng-dual-datepicker/issues).
273
-
274
- ## ⭐ Support
275
-
276
- If you find this package useful, please give it a star on [GitHub](https://github.com/oneluiz/ng-dual-datepicker)!
277
-
278
- ---
279
-
280
- Made with ❤️ by [Luis Cortes](https://github.com/oneluiz)
@@ -1,58 +0,0 @@
1
- import { EventEmitter, OnInit, OnChanges, SimpleChanges, ElementRef } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export interface DateRange {
4
- fechaInicio: string;
5
- fechaFin: string;
6
- rangoTexto: string;
7
- }
8
- export interface PresetConfig {
9
- label: string;
10
- daysAgo: number;
11
- }
12
- export declare class DualDatepickerComponent implements OnInit, OnChanges {
13
- private elementRef;
14
- placeholder: string;
15
- fechaInicio: string;
16
- fechaFin: string;
17
- showPresets: boolean;
18
- closeOnSelection: boolean;
19
- closeOnPresetSelection: boolean;
20
- closeOnClickOutside: boolean;
21
- presets: PresetConfig[];
22
- inputBackgroundColor: string;
23
- inputTextColor: string;
24
- inputBorderColor: string;
25
- inputBorderColorHover: string;
26
- inputBorderColorFocus: string;
27
- inputPadding: string;
28
- dateRangeChange: EventEmitter<DateRange>;
29
- dateRangeSelected: EventEmitter<DateRange>;
30
- mostrarDatePicker: boolean;
31
- rangoFechas: string;
32
- fechaSeleccionandoInicio: boolean;
33
- mesActual: Date;
34
- mesAnterior: Date;
35
- diasMesActual: any[];
36
- diasMesAnterior: any[];
37
- constructor(elementRef: ElementRef);
38
- onClickOutside(event: MouseEvent): void;
39
- ngOnInit(): void;
40
- ngOnChanges(changes: SimpleChanges): void;
41
- formatearFecha(fecha: Date): string;
42
- formatearFechaDisplay(fechaStr: string): string;
43
- actualizarRangoFechasTexto(): void;
44
- toggleDatePicker(): void;
45
- cerrarDatePicker(): void;
46
- generarCalendarios(): void;
47
- generarCalendarioMes(fecha: Date): any[];
48
- estaEnRango(fechaStr: string): boolean;
49
- seleccionarDia(diaObj: any): void;
50
- cambiarMes(direccion: number): void;
51
- getNombreMes(fecha: Date): string;
52
- seleccionarRangoPredefinido(preset: PresetConfig): void;
53
- limpiar(): void;
54
- private emitirCambio;
55
- private emitirSeleccion;
56
- static ɵfac: i0.ɵɵFactoryDeclaration<DualDatepickerComponent, never>;
57
- static ɵcmp: i0.ɵɵComponentDeclaration<DualDatepickerComponent, "ngx-dual-datepicker", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "fechaInicio": { "alias": "fechaInicio"; "required": false; }; "fechaFin": { "alias": "fechaFin"; "required": false; }; "showPresets": { "alias": "showPresets"; "required": false; }; "closeOnSelection": { "alias": "closeOnSelection"; "required": false; }; "closeOnPresetSelection": { "alias": "closeOnPresetSelection"; "required": false; }; "closeOnClickOutside": { "alias": "closeOnClickOutside"; "required": false; }; "presets": { "alias": "presets"; "required": false; }; "inputBackgroundColor": { "alias": "inputBackgroundColor"; "required": false; }; "inputTextColor": { "alias": "inputTextColor"; "required": false; }; "inputBorderColor": { "alias": "inputBorderColor"; "required": false; }; "inputBorderColorHover": { "alias": "inputBorderColorHover"; "required": false; }; "inputBorderColorFocus": { "alias": "inputBorderColorFocus"; "required": false; }; "inputPadding": { "alias": "inputPadding"; "required": false; }; }, { "dateRangeChange": "dateRangeChange"; "dateRangeSelected": "dateRangeSelected"; }, never, never, true, never>;
58
- }
@@ -1,243 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule } from '@angular/forms';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- export class DualDatepickerComponent {
7
- elementRef;
8
- placeholder = 'Select date range';
9
- fechaInicio = '';
10
- fechaFin = '';
11
- showPresets = true;
12
- closeOnSelection = true;
13
- closeOnPresetSelection = true;
14
- closeOnClickOutside = true;
15
- presets = [
16
- { label: 'Last month', daysAgo: 30 },
17
- { label: 'Last 6 months', daysAgo: 180 },
18
- { label: 'Last year', daysAgo: 365 }
19
- ];
20
- inputBackgroundColor = '#fff';
21
- inputTextColor = '#495057';
22
- inputBorderColor = '#ced4da';
23
- inputBorderColorHover = '#ced4da';
24
- inputBorderColorFocus = '#80bdff';
25
- inputPadding = '0.375rem 0.75rem';
26
- dateRangeChange = new EventEmitter();
27
- dateRangeSelected = new EventEmitter();
28
- mostrarDatePicker = false;
29
- rangoFechas = '';
30
- fechaSeleccionandoInicio = true;
31
- mesActual = new Date();
32
- mesAnterior = new Date();
33
- diasMesActual = [];
34
- diasMesAnterior = [];
35
- constructor(elementRef) {
36
- this.elementRef = elementRef;
37
- }
38
- onClickOutside(event) {
39
- if (this.mostrarDatePicker && this.closeOnClickOutside) {
40
- const clickedInside = this.elementRef.nativeElement.contains(event.target);
41
- if (!clickedInside) {
42
- this.cerrarDatePicker();
43
- }
44
- }
45
- }
46
- ngOnInit() {
47
- if (this.fechaInicio && this.fechaFin) {
48
- this.actualizarRangoFechasTexto();
49
- this.generarCalendarios();
50
- }
51
- }
52
- ngOnChanges(changes) {
53
- if (changes['fechaInicio'] || changes['fechaFin']) {
54
- if (this.fechaInicio && this.fechaFin) {
55
- this.actualizarRangoFechasTexto();
56
- this.generarCalendarios();
57
- }
58
- else if (!this.fechaInicio && !this.fechaFin) {
59
- this.rangoFechas = '';
60
- }
61
- }
62
- }
63
- formatearFecha(fecha) {
64
- const year = fecha.getFullYear();
65
- const month = String(fecha.getMonth() + 1).padStart(2, '0');
66
- const day = String(fecha.getDate()).padStart(2, '0');
67
- return `${year}-${month}-${day}`;
68
- }
69
- formatearFechaDisplay(fechaStr) {
70
- if (!fechaStr)
71
- return '';
72
- const fecha = new Date(fechaStr + 'T00:00:00');
73
- const meses = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
74
- return `${fecha.getDate()} ${meses[fecha.getMonth()]}`;
75
- }
76
- actualizarRangoFechasTexto() {
77
- if (this.fechaInicio && this.fechaFin) {
78
- const inicio = this.formatearFechaDisplay(this.fechaInicio);
79
- const fin = this.formatearFechaDisplay(this.fechaFin);
80
- this.rangoFechas = `${inicio} - ${fin}`;
81
- }
82
- else {
83
- this.rangoFechas = '';
84
- }
85
- }
86
- toggleDatePicker() {
87
- this.mostrarDatePicker = !this.mostrarDatePicker;
88
- if (this.mostrarDatePicker) {
89
- this.fechaSeleccionandoInicio = true;
90
- this.mesAnterior = new Date(this.mesActual.getFullYear(), this.mesActual.getMonth() - 1, 1);
91
- this.generarCalendarios();
92
- }
93
- }
94
- cerrarDatePicker() {
95
- this.mostrarDatePicker = false;
96
- }
97
- generarCalendarios() {
98
- this.diasMesAnterior = this.generarCalendarioMes(this.mesAnterior);
99
- this.diasMesActual = this.generarCalendarioMes(this.mesActual);
100
- }
101
- generarCalendarioMes(fecha) {
102
- const año = fecha.getFullYear();
103
- const mes = fecha.getMonth();
104
- const primerDia = new Date(año, mes, 1);
105
- const ultimoDia = new Date(año, mes + 1, 0);
106
- const diasEnMes = ultimoDia.getDate();
107
- const primerDiaSemana = primerDia.getDay();
108
- const diasMes = [];
109
- for (let i = 0; i < primerDiaSemana; i++) {
110
- diasMes.push({ dia: null, esMesActual: false });
111
- }
112
- for (let dia = 1; dia <= diasEnMes; dia++) {
113
- const fechaDia = new Date(año, mes, dia);
114
- const fechaStr = this.formatearFecha(fechaDia);
115
- diasMes.push({
116
- dia: dia,
117
- fecha: fechaStr,
118
- esMesActual: true,
119
- esInicio: this.fechaInicio === fechaStr,
120
- esFin: this.fechaFin === fechaStr,
121
- enRango: this.estaEnRango(fechaStr)
122
- });
123
- }
124
- return diasMes;
125
- }
126
- estaEnRango(fechaStr) {
127
- if (!this.fechaInicio || !this.fechaFin)
128
- return false;
129
- return fechaStr >= this.fechaInicio && fechaStr <= this.fechaFin;
130
- }
131
- seleccionarDia(diaObj) {
132
- if (!diaObj.esMesActual)
133
- return;
134
- if (this.fechaSeleccionandoInicio) {
135
- this.fechaInicio = diaObj.fecha;
136
- this.fechaFin = '';
137
- this.fechaSeleccionandoInicio = false;
138
- this.emitirCambio();
139
- }
140
- else {
141
- if (diaObj.fecha < this.fechaInicio) {
142
- this.fechaFin = this.fechaInicio;
143
- this.fechaInicio = diaObj.fecha;
144
- }
145
- else {
146
- this.fechaFin = diaObj.fecha;
147
- }
148
- this.actualizarRangoFechasTexto();
149
- if (this.closeOnSelection) {
150
- this.mostrarDatePicker = false;
151
- }
152
- this.fechaSeleccionandoInicio = true;
153
- this.emitirSeleccion();
154
- }
155
- this.generarCalendarios();
156
- }
157
- cambiarMes(direccion) {
158
- this.mesActual = new Date(this.mesActual.getFullYear(), this.mesActual.getMonth() + direccion, 1);
159
- this.mesAnterior = new Date(this.mesActual.getFullYear(), this.mesActual.getMonth() - 1, 1);
160
- this.generarCalendarios();
161
- }
162
- getNombreMes(fecha) {
163
- const meses = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
164
- return `${meses[fecha.getMonth()]} ${fecha.getFullYear()}`;
165
- }
166
- seleccionarRangoPredefinido(preset) {
167
- const hoy = new Date();
168
- const fechaInicio = new Date(hoy);
169
- fechaInicio.setDate(hoy.getDate() - preset.daysAgo);
170
- this.fechaInicio = this.formatearFecha(fechaInicio);
171
- this.fechaFin = this.formatearFecha(hoy);
172
- this.actualizarRangoFechasTexto();
173
- this.generarCalendarios();
174
- if (this.closeOnPresetSelection) {
175
- this.mostrarDatePicker = false;
176
- }
177
- this.emitirSeleccion();
178
- }
179
- limpiar() {
180
- this.fechaInicio = '';
181
- this.fechaFin = '';
182
- this.rangoFechas = '';
183
- this.mostrarDatePicker = false;
184
- this.fechaSeleccionandoInicio = true;
185
- this.emitirCambio();
186
- }
187
- emitirCambio() {
188
- this.dateRangeChange.emit({
189
- fechaInicio: this.fechaInicio,
190
- fechaFin: this.fechaFin,
191
- rangoTexto: this.rangoFechas
192
- });
193
- }
194
- emitirSeleccion() {
195
- this.dateRangeSelected.emit({
196
- fechaInicio: this.fechaInicio,
197
- fechaFin: this.fechaFin,
198
- rangoTexto: this.rangoFechas
199
- });
200
- }
201
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDatepickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
202
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DualDatepickerComponent, isStandalone: true, selector: "ngx-dual-datepicker", inputs: { placeholder: "placeholder", fechaInicio: "fechaInicio", fechaFin: "fechaFin", showPresets: "showPresets", closeOnSelection: "closeOnSelection", closeOnPresetSelection: "closeOnPresetSelection", closeOnClickOutside: "closeOnClickOutside", presets: "presets", inputBackgroundColor: "inputBackgroundColor", inputTextColor: "inputTextColor", inputBorderColor: "inputBorderColor", inputBorderColorHover: "inputBorderColorHover", inputBorderColorFocus: "inputBorderColorFocus", inputPadding: "inputPadding" }, outputs: { dateRangeChange: "dateRangeChange", dateRangeSelected: "dateRangeSelected" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"datepicker-wrapper\" \n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"rangoFechas\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (mostrarDatePicker) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"seleccionarRangoPredefinido(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"cambiarMes(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ getNombreMes(mesAnterior) }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n <span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span>\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesAnterior; track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ getNombreMes(mesActual) }}</span>\n <button type=\"button\" (click)=\"cambiarMes(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n <span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span>\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesActual; track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n }\n</div>\n", styles: [".datepicker-wrapper{position:relative;width:100%}.datepicker-wrapper .datepicker-input{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;cursor:pointer}.datepicker-wrapper .datepicker-input:hover{border-color:var(--input-border-hover, #ced4da)}.datepicker-wrapper .datepicker-input:focus{border-color:var(--input-border-focus, #80bdff);box-shadow:0 0 0 .2rem #007bff40;outline:0}.datepicker-wrapper .datepicker-input::placeholder{color:#6c757d;opacity:1}.datepicker-wrapper .datepicker-input:disabled,.datepicker-wrapper .datepicker-input[readonly]{background-color:#e9ecef;opacity:1}.date-picker-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e1e4e8;border-radius:8px;box-shadow:0 4px 12px #00000014,0 0 1px #00000014;padding:16px;z-index:1060;min-width:680px}@media (max-width: 768px){.date-picker-dropdown{min-width:100%;left:0;right:0}}.date-picker-header-only-close{display:flex;justify-content:flex-end;margin-bottom:12px}.date-picker-header-only-close .btn-close-calendar{background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;border-radius:6px;cursor:pointer;transition:all .15s ease;font-size:1.5rem;line-height:1}.date-picker-header-only-close .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-header-only-close .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-presets{display:flex;gap:6px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #e5e7eb;align-items:center}@media (max-width: 768px){.date-picker-presets{flex-wrap:wrap}}.date-picker-presets button{font-size:.75rem;padding:6px 14px;border:none;background-color:#f9fafb;color:#374151;border-radius:6px;transition:all .15s ease;font-weight:500;cursor:pointer;border:1px solid #e5e7eb}.date-picker-presets button:hover{background-color:#f3f4f6;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 4px #0000000f}.date-picker-presets button:active{transform:translateY(0);box-shadow:none}.date-picker-presets .btn-close-calendar{margin-left:auto;background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;font-size:1.5rem;line-height:1}.date-picker-presets .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-presets .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-calendars{display:flex;gap:32px}@media (max-width: 768px){.date-picker-calendars{flex-direction:column;gap:16px}}.date-picker-calendar{flex:1}.date-picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px}.date-picker-header span{font-size:.813rem;font-weight:600;color:#111827}.date-picker-header button{padding:4px;color:#6b7280;text-decoration:none;border-radius:6px;transition:all .15s ease;border:none;background:transparent;cursor:pointer}.date-picker-header button:hover{background-color:#f3f4f6;color:#111827}.date-picker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}.date-picker-weekdays span{text-align:center;font-size:.625rem;font-weight:600;color:#6b7280;padding:6px}.date-picker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.date-picker-day{aspect-ratio:1;border:none;background:transparent;border-radius:50%;font-size:.75rem;cursor:pointer;transition:all .15s ease;color:#374151;font-weight:400}.date-picker-day:hover:not(:disabled):not(.selected){background-color:#f3f4f6;color:#111827}.date-picker-day.empty{visibility:hidden}.date-picker-day.selected{background-color:#222;color:#fff;font-weight:600}.date-picker-day.in-range{background-color:#f9fafb;border-radius:0}.date-picker-day:disabled{cursor:not-allowed;opacity:.3}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }] });
203
- }
204
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDatepickerComponent, decorators: [{
205
- type: Component,
206
- args: [{ selector: 'ngx-dual-datepicker', standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"datepicker-wrapper\" \n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"rangoFechas\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (mostrarDatePicker) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"seleccionarRangoPredefinido(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"cambiarMes(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ getNombreMes(mesAnterior) }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n <span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span>\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesAnterior; track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ getNombreMes(mesActual) }}</span>\n <button type=\"button\" (click)=\"cambiarMes(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n <span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span>\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesActual; track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n }\n</div>\n", styles: [".datepicker-wrapper{position:relative;width:100%}.datepicker-wrapper .datepicker-input{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;cursor:pointer}.datepicker-wrapper .datepicker-input:hover{border-color:var(--input-border-hover, #ced4da)}.datepicker-wrapper .datepicker-input:focus{border-color:var(--input-border-focus, #80bdff);box-shadow:0 0 0 .2rem #007bff40;outline:0}.datepicker-wrapper .datepicker-input::placeholder{color:#6c757d;opacity:1}.datepicker-wrapper .datepicker-input:disabled,.datepicker-wrapper .datepicker-input[readonly]{background-color:#e9ecef;opacity:1}.date-picker-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e1e4e8;border-radius:8px;box-shadow:0 4px 12px #00000014,0 0 1px #00000014;padding:16px;z-index:1060;min-width:680px}@media (max-width: 768px){.date-picker-dropdown{min-width:100%;left:0;right:0}}.date-picker-header-only-close{display:flex;justify-content:flex-end;margin-bottom:12px}.date-picker-header-only-close .btn-close-calendar{background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;border-radius:6px;cursor:pointer;transition:all .15s ease;font-size:1.5rem;line-height:1}.date-picker-header-only-close .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-header-only-close .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-presets{display:flex;gap:6px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #e5e7eb;align-items:center}@media (max-width: 768px){.date-picker-presets{flex-wrap:wrap}}.date-picker-presets button{font-size:.75rem;padding:6px 14px;border:none;background-color:#f9fafb;color:#374151;border-radius:6px;transition:all .15s ease;font-weight:500;cursor:pointer;border:1px solid #e5e7eb}.date-picker-presets button:hover{background-color:#f3f4f6;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 4px #0000000f}.date-picker-presets button:active{transform:translateY(0);box-shadow:none}.date-picker-presets .btn-close-calendar{margin-left:auto;background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;font-size:1.5rem;line-height:1}.date-picker-presets .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-presets .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-calendars{display:flex;gap:32px}@media (max-width: 768px){.date-picker-calendars{flex-direction:column;gap:16px}}.date-picker-calendar{flex:1}.date-picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px}.date-picker-header span{font-size:.813rem;font-weight:600;color:#111827}.date-picker-header button{padding:4px;color:#6b7280;text-decoration:none;border-radius:6px;transition:all .15s ease;border:none;background:transparent;cursor:pointer}.date-picker-header button:hover{background-color:#f3f4f6;color:#111827}.date-picker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}.date-picker-weekdays span{text-align:center;font-size:.625rem;font-weight:600;color:#6b7280;padding:6px}.date-picker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.date-picker-day{aspect-ratio:1;border:none;background:transparent;border-radius:50%;font-size:.75rem;cursor:pointer;transition:all .15s ease;color:#374151;font-weight:400}.date-picker-day:hover:not(:disabled):not(.selected){background-color:#f3f4f6;color:#111827}.date-picker-day.empty{visibility:hidden}.date-picker-day.selected{background-color:#222;color:#fff;font-weight:600}.date-picker-day.in-range{background-color:#f9fafb;border-radius:0}.date-picker-day:disabled{cursor:not-allowed;opacity:.3}\n"] }]
207
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { placeholder: [{
208
- type: Input
209
- }], fechaInicio: [{
210
- type: Input
211
- }], fechaFin: [{
212
- type: Input
213
- }], showPresets: [{
214
- type: Input
215
- }], closeOnSelection: [{
216
- type: Input
217
- }], closeOnPresetSelection: [{
218
- type: Input
219
- }], closeOnClickOutside: [{
220
- type: Input
221
- }], presets: [{
222
- type: Input
223
- }], inputBackgroundColor: [{
224
- type: Input
225
- }], inputTextColor: [{
226
- type: Input
227
- }], inputBorderColor: [{
228
- type: Input
229
- }], inputBorderColorHover: [{
230
- type: Input
231
- }], inputBorderColorFocus: [{
232
- type: Input
233
- }], inputPadding: [{
234
- type: Input
235
- }], dateRangeChange: [{
236
- type: Output
237
- }], dateRangeSelected: [{
238
- type: Output
239
- }], onClickOutside: [{
240
- type: HostListener,
241
- args: ['document:click', ['$event']]
242
- }] } });
243
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vc3JjL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxZQUFZLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDbkksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBb0I3QyxNQUFNLE9BQU8sdUJBQXVCO0lBK0JkO0lBOUJYLFdBQVcsR0FBVyxtQkFBbUIsQ0FBQztJQUMxQyxXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3pCLFFBQVEsR0FBVyxFQUFFLENBQUM7SUFDdEIsV0FBVyxHQUFZLElBQUksQ0FBQztJQUM1QixnQkFBZ0IsR0FBWSxJQUFJLENBQUM7SUFDakMsc0JBQXNCLEdBQVksSUFBSSxDQUFDO0lBQ3ZDLG1CQUFtQixHQUFZLElBQUksQ0FBQztJQUNwQyxPQUFPLEdBQW1CO1FBQ2pDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1FBQ3BDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO0tBQ3JDLENBQUM7SUFDTyxvQkFBb0IsR0FBVyxNQUFNLENBQUM7SUFDdEMsY0FBYyxHQUFXLFNBQVMsQ0FBQztJQUNuQyxnQkFBZ0IsR0FBVyxTQUFTLENBQUM7SUFDckMscUJBQXFCLEdBQVcsU0FBUyxDQUFDO0lBQzFDLHFCQUFxQixHQUFXLFNBQVMsQ0FBQztJQUMxQyxZ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LFFBQVE7WUFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBcE5VLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLG93QkN0QnBDLGlxSkErR0EsK2pJRDdGWSxZQUFZLG1IQUFFLFdBQVc7OzRGQUl4Qix1QkFBdUI7a0JBUG5DLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUM7K0VBSzNCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUtHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBYVAsY0FBYztzQkFEYixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICBmZWNoYUluaWNpbzogc3RyaW5nO1xuICBmZWNoYUZpbjogc3RyaW5nO1xuICByYW5nb1RleHRvOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlc2V0Q29uZmlnIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgZGF5c0FnbzogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZHVhbC1kYXRlcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgRHVhbERhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VsZWN0IGRhdGUgcmFuZ2UnO1xuICBASW5wdXQoKSBmZWNoYUluaWNpbzogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGZlY2hhRmluOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2hvd1ByZXNldHM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBjbG9zZU9uU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgY2xvc2VPblByZXNldFNlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNsb3NlT25DbGlja091dHNpZGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwcmVzZXRzOiBQcmVzZXRDb25maWdbXSA9IFtcbiAgICB7IGxhYmVsOiAnTGFzdCBtb250aCcsIGRheXNBZ286IDMwIH0sXG4gICAgeyBsYWJlbDogJ0xhc3QgNiBtb250aHMnLCBkYXlzQWdvOiAxODAgfSxcbiAgICB7IGxhYmVsOiAnTGFzdCB5ZWFyJywgZGF5c0FnbzogMzY1IH1cbiAgXTtcbiAgQElucHV0KCkgaW5wdXRCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9ICcjZmZmJztcbiAgQElucHV0KCkgaW5wdXRUZXh0Q29sb3I6IHN0cmluZyA9ICcjNDk1MDU3JztcbiAgQElucHV0KCkgaW5wdXRCb3JkZXJDb2xvcjogc3RyaW5nID0gJyNjZWQ0ZGEnO1xuICBASW5wdXQoKSBpbnB1dEJvcmRlckNvbG9ySG92ZXI6IHN0cmluZyA9ICcjY2VkNGRhJztcbiAgQElucHV0KCkgaW5wdXRCb3JkZXJDb2xvckZvY3VzOiBzdHJpbmcgPSAnIzgwYmRmZic7XG4gIEBJbnB1dCgpIGlucHV0UGFkZGluZzogc3RyaW5nID0gJzAuMzc1cmVtIDAuNzVyZW0nO1xuXG4gIEBPdXRwdXQoKSBkYXRlUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVSYW5nZT4oKTtcbiAgQE91dHB1dCgpIGRhdGVSYW5nZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U+KCk7XG5cbiAgbW9zdHJhckRhdGVQaWNrZXIgPSBmYWxzZTtcbiAgcmFuZ29GZWNoYXMgPSAnJztcbiAgZmVjaGFTZWxlY2Npb25hbmRvSW5pY2lvID0gdHJ1ZTtcbiAgbWVzQWN0dWFsID0gbmV3IERhdGUoKTtcbiAgbWVzQW50ZXJpb3IgPSBuZXcgRGF0ZSgpO1xuICBkaWFzTWVzQWN0dWFsOiBhbnlbXSA9IFtdO1xuICBkaWFzTWVzQW50ZXJpb3I6IGFueVtdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGlja091dHNpZGUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb3N0cmFyRGF0ZVBpY2tlciAmJiB0aGlzLmNsb3NlT25DbGlja091dHNpZGUpIHtcbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuICAgICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XG4gICAgICAgIHRoaXMuY2VycmFyRGF0ZVBpY2tlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZlY2hhSW5pY2lvICYmIHRoaXMuZmVjaGFGaW4pIHtcbiAgICAgIHRoaXMuYWN0dWFsaXphclJhbmdvRmVjaGFzVGV4dG8oKTtcbiAgICAgIHRoaXMuZ2VuZXJhckNhbGVuZGFyaW9zKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydmZWNoYUluaWNpbyddIHx8IGNoYW5nZXNbJ2ZlY2hhRmluJ10pIHtcbiAgICAgIGlmICh0aGlzLmZlY2hhSW5pY2lvICYmIHRoaXMuZmVjaGFGaW4pIHtcbiAgICAgICAgdGhpcy5hY3R1YWxpemFyUmFuZ29GZWNoYXNUZXh0bygpO1xuICAgICAgICB0aGlzLmdlbmVyYXJDYWxlbmRhcmlvcygpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5mZWNoYUluaWNpbyAmJiAhdGhpcy5mZWNoYUZpbikge1xuICAgICAgICB0aGlzLnJhbmdvRmVjaGFzID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0ZWFyRmVjaGEoZmVjaGE6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHllYXIgPSBmZWNoYS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGZlY2hhLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGRheSA9IFN0cmluZyhmZWNoYS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gIH1cblxuICBmb3JtYXRlYXJGZWNoYURpc3BsYXkoZmVjaGFTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFmZWNoYVN0cikgcmV0dXJuICcnO1xuICAgIGNvbnN0IGZlY2hhID0gbmV3IERhdGUoZmVjaGFTdHIgKyAnVDAwOjAwOjAwJyk7XG4gICAgY29uc3QgbWVzZXMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gICAgcmV0dXJuIGAke2ZlY2hhLmdldERhdGUoKX0gJHttZXNlc1tmZWNoYS5nZXRNb250aCgpXX1gO1xuICB9XG5cbiAgYWN0dWFsaXphclJhbmdvRmVjaGFzVGV4dG8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmVjaGFJbmljaW8gJiYgdGhpcy5mZWNoYUZpbikge1xuICAgICAgY29uc3QgaW5pY2lvID0gdGhpcy5mb3JtYXRlYXJGZWNoYURpc3BsYXkodGhpcy5mZWNoYUluaWNpbyk7XG4gICAgICBjb25zdCBmaW4gPSB0aGlzLmZvcm1hdGVhckZlY2hhRGlzcGxheSh0aGlzLmZlY2hhRmluKTtcbiAgICAgIHRoaXMucmFuZ29GZWNoYXMgPSBgJHtpbmljaW99IC0gJHtmaW59YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yYW5nb0ZlY2hhcyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZURhdGVQaWNrZXIoKTogdm9pZCB7XG4gICAgdGhpcy5tb3N0cmFyRGF0ZVBpY2tlciA9ICF0aGlzLm1vc3RyYXJEYXRlUGlja2VyO1xuICAgIGlmICh0aGlzLm1vc3RyYXJEYXRlUGlja2VyKSB7XG4gICAgICB0aGlzLmZlY2hhU2VsZWNjaW9uYW5kb0luaWNpbyA9IHRydWU7XG4gICAgICB0aGlzLm1lc0FudGVyaW9yID0gbmV3IERhdGUodGhpcy5tZXNBY3R1YWwuZ2V0RnVsbFllYXIoKSwgdGhpcy5tZXNBY3R1YWwuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgdGhpcy5nZW5lcmFyQ2FsZW5kYXJpb3MoKTtcbiAgICB9XG4gIH1cblxuICBjZXJyYXJEYXRlUGlja2VyKCk6IHZvaWQge1xuICAgIHRoaXMubW9zdHJhckRhdGVQaWNrZXIgPSBmYWxzZTtcbiAgfVxuXG4gIGdlbmVyYXJDYWxlbmRhcmlvcygpOiB2b2lkIHtcbiAgICB0aGlzLmRpYXNNZXNBbnRlcmlvciA9IHRoaXMuZ2VuZXJhckNhbGVuZGFyaW9NZXModGhpcy5tZXNBbnRlcmlvcik7XG4gICAgdGhpcy5kaWFzTWVzQWN0dWFsID0gdGhpcy5nZW5lcmFyQ2FsZW5kYXJpb01lcyh0aGlzLm1lc0FjdHVhbCk7XG4gIH1cblxuICBnZW5lcmFyQ2FsZW5kYXJpb01lcyhmZWNoYTogRGF0ZSk6IGFueVtdIHtcbiAgICBjb25zdCBhw7FvID0gZmVjaGEuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtZXMgPSBmZWNoYS5nZXRNb250aCgpO1xuICAgIGNvbnN0IHByaW1lckRpYSA9IG5ldyBEYXRlKGHDsW8sIG1lcywgMSk7XG4gICAgY29uc3QgdWx0aW1vRGlhID0gbmV3IERhdGUoYcOxbywgbWVzICsgMSwgMCk7XG4gICAgY29uc3QgZGlhc0VuTWVzID0gdWx0aW1vRGlhLmdldERhdGUoKTtcbiAgICBjb25zdCBwcmltZXJEaWFTZW1hbmEgPSBwcmltZXJEaWEuZ2V0RGF5KCk7XG5cbiAgICBjb25zdCBkaWFzTWVzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByaW1lckRpYVNlbWFuYTsgaSsrKSB7XG4gICAgICBkaWFzTWVzLnB1c2goeyBkaWE6IG51bGwsIGVzTWVzQWN0dWFsOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBkaWEgPSAxOyBkaWEgPD0gZGlhc0VuTWVzOyBkaWErKykge1xuICAgICAgY29uc3QgZmVjaGFEaWEgPSBuZXcgRGF0ZShhw7FvLCBtZXMsIGRpYSk7XG4gICAgICBjb25zdCBmZWNoYVN0ciA9IHRoaXMuZm9ybWF0ZWFyRmVjaGEoZmVjaGFEaWEpO1xuICAgICAgZGlhc01lcy5wdXNoKHtcbiAgICAgICAgZGlhOiBkaWEsXG4gICAgICAgIGZlY2hhOiBmZWNoYVN0cixcbiAgICAgICAgZXNNZXNBY3R1YWw6IHRydWUsXG4gICAgICAgIGVzSW5pY2lvOiB0aGlzLmZlY2hhSW5pY2lvID09PSBmZWNoYVN0cixcbiAgICAgICAgZXNGaW46IHRoaXMuZmVjaGFGaW4gPT09IGZlY2hhU3RyLFxuICAgICAgICBlblJhbmdvOiB0aGlzLmVzdGFFblJhbmdvKGZlY2hhU3RyKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpYXNNZXM7XG4gIH1cblxuICBlc3RhRW5SYW5nbyhmZWNoYVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmZlY2hhSW5pY2lvIHx8ICF0aGlzLmZlY2hhRmluKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGZlY2hhU3RyID49IHRoaXMuZmVjaGFJbmljaW8gJiYgZmVjaGFTdHIgPD0gdGhpcy5mZWNoYUZpbjtcbiAgfVxuXG4gIHNlbGVjY2lvbmFyRGlhKGRpYU9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKCFkaWFPYmouZXNNZXNBY3R1YWwpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmZlY2hhU2VsZWNjaW9uYW5kb0luaWNpbykge1xuICAgICAgdGhpcy5mZWNoYUluaWNpbyA9IGRpYU9iai5mZWNoYTtcbiAgICAgIHRoaXMuZmVjaGFGaW4gPSAnJztcbiAgICAgIHRoaXMuZmVjaGFTZWxlY2Npb25hbmRvSW5pY2lvID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXRpckNhbWJpbygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGlhT2JqLmZlY2hhIDwgdGhpcy5mZWNoYUluaWNpbykge1xuICAgICAgICB0aGlzLmZlY2hhRmluID0gdGhpcy5mZWNoYUluaWNpbztcbiAgICAgICAgdGhpcy5mZWNoYUluaWNpbyA9IGRpYU9iai5mZWNoYTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmVjaGFGaW4gPSBkaWFPYmouZmVjaGE7XG4gICAgICB9XG4gICAgICB0aGlzLmFjdHVhbGl6YXJSYW5nb0ZlY2hhc1RleHRvKCk7XG4gICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMubW9zdHJhckRhdGVQaWNrZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmVjaGFTZWxlY2Npb25hbmRvSW5pY2lvID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW1pdGlyU2VsZWNjaW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZ2VuZXJhckNhbGVuZGFyaW9zKCk7XG4gIH1cblxuICBjYW1iaWFyTWVzKGRpcmVjY2lvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tZXNBY3R1YWwgPSBuZXcgRGF0ZSh0aGlzLm1lc0FjdHVhbC5nZXRGdWxsWWVhcigpLCB0aGlzLm1lc0FjdHVhbC5nZXRNb250aCgpICsgZGlyZWNjaW9uLCAxKTtcbiAgICB0aGlzLm1lc0FudGVyaW9yID0gbmV3IERhdGUodGhpcy5tZXNBY3R1YWwuZ2V0RnVsbFllYXIoKSwgdGhpcy5tZXNBY3R1YWwuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgIHRoaXMuZ2VuZXJhckNhbGVuZGFyaW9zKCk7XG4gIH1cblxuICBnZXROb21icmVNZXMoZmVjaGE6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1lc2VzID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG4gICAgcmV0dXJuIGAke21lc2VzW2ZlY2hhLmdldE1vbnRoKCldfSAke2ZlY2hhLmdldEZ1bGxZZWFyKCl9YDtcbiAgfVxuXG4gIHNlbGVjY2lvbmFyUmFuZ29QcmVkZWZpbmlkbyhwcmVzZXQ6IFByZXNldENvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IGhveSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgZmVjaGFJbmljaW8gPSBuZXcgRGF0ZShob3kpO1xuICAgIGZlY2hhSW5pY2lvLnNldERhdGUoaG95LmdldERhdGUoKSAtIHByZXNldC5kYXlzQWdvKTtcblxuICAgIHRoaXMuZmVjaGFJbmljaW8gPSB0aGlzLmZvcm1hdGVhckZlY2hhKGZlY2hhSW5pY2lvKTtcbiAgICB0aGlzLmZlY2hhRmluID0gdGhpcy5mb3JtYXRlYXJGZWNoYShob3kpO1xuICAgIHRoaXMuYWN0dWFsaXphclJhbmdvRmVjaGFzVGV4dG8oKTtcbiAgICB0aGlzLmdlbmVyYXJDYWxlbmRhcmlvcygpO1xuICAgIGlmICh0aGlzLmNsb3NlT25QcmVzZXRTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMubW9zdHJhckRhdGVQaWNrZXIgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5lbWl0aXJTZWxlY2Npb24oKTtcbiAgfVxuXG4gIGxpbXBpYXIoKTogdm9pZCB7XG4gICAgdGhpcy5mZWNoYUluaWNpbyA9ICcnO1xuICAgIHRoaXMuZmVjaGFGaW4gPSAnJztcbiAgICB0aGlzLnJhbmdvRmVjaGFzID0gJyc7XG4gICAgdGhpcy5tb3N0cmFyRGF0ZVBpY2tlciA9IGZhbHNlO1xuICAgIHRoaXMuZmVjaGFTZWxlY2Npb25hbmRvSW5pY2lvID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXRpckNhbWJpbygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0aXJDYW1iaW8oKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh7XG4gICAgICBmZWNoYUluaWNpbzogdGhpcy5mZWNoYUluaWNpbyxcbiAgICAgIGZlY2hhRmluOiB0aGlzLmZlY2hhRmluLFxuICAgICAgcmFuZ29UZXh0bzogdGhpcy5yYW5nb0ZlY2hhc1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0aXJTZWxlY2Npb24oKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlUmFuZ2VTZWxlY3RlZC5lbWl0KHtcbiAgICAgIGZlY2hhSW5pY2lvOiB0aGlzLmZlY2hhSW5pY2lvLFxuICAgICAgZmVjaGFGaW46IHRoaXMuZmVjaGFGaW4sXG4gICAgICByYW5nb1RleHRvOiB0aGlzLnJhbmdvRmVjaGFzXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXdyYXBwZXJcIiBcbiAgW3N0eWxlLi0taW5wdXQtYm9yZGVyLWhvdmVyXT1cImlucHV0Qm9yZGVyQ29sb3JIb3ZlclwiXG4gIFtzdHlsZS4tLWlucHV0LWJvcmRlci1mb2N1c109XCJpbnB1dEJvcmRlckNvbG9yRm9jdXNcIj5cbiAgPGlucHV0IFxuICAgIHR5cGU9XCJ0ZXh0XCIgXG4gICAgY2xhc3M9XCJkYXRlcGlja2VyLWlucHV0XCIgXG4gICAgW3ZhbHVlXT1cInJhbmdvRmVjaGFzXCIgXG4gICAgKGNsaWNrKT1cInRvZ2dsZURhdGVQaWNrZXIoKVwiIFxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBpbnB1dEJhY2tncm91bmRDb2xvcixcbiAgICAgICdjb2xvcic6IGlucHV0VGV4dENvbG9yLFxuICAgICAgJ2JvcmRlci1jb2xvcic6IGlucHV0Qm9yZGVyQ29sb3IsXG4gICAgICAncGFkZGluZyc6IGlucHV0UGFkZGluZ1xuICAgIH1cIlxuICAgIHJlYWRvbmx5PlxuXG4gIEBpZiAobW9zdHJhckRhdGVQaWNrZXIpIHtcbiAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWRyb3Bkb3duXCI+XG4gICAgQGlmIChzaG93UHJlc2V0cykge1xuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1wcmVzZXRzXCI+XG4gICAgICBAZm9yIChwcmVzZXQgb2YgcHJlc2V0czsgdHJhY2sgcHJlc2V0LmxhYmVsKSB7XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2VsZWNjaW9uYXJSYW5nb1ByZWRlZmluaWRvKHByZXNldClcIj57eyBwcmVzZXQubGFiZWwgfX08L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlLWNhbGVuZGFyXCIgKGNsaWNrKT1cImNlcnJhckRhdGVQaWNrZXIoKVwiIHRpdGxlPVwiQ2xvc2VcIj5cbiAgICAgICAgw5dcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoIXNob3dQcmVzZXRzKSB7XG4gICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWhlYWRlci1vbmx5LWNsb3NlXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZS1jYWxlbmRhclwiIChjbGljayk9XCJjZXJyYXJEYXRlUGlja2VyKClcIiB0aXRsZT1cIkNsb3NlXCI+XG4gICAgICAgIMOXXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIENhbGVuZGFycyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY2FsZW5kYXJzXCI+XG4gICAgICA8IS0tIFByZXZpb3VzIG1vbnRoIGNhbGVuZGFyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWNhbGVuZGFyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1oZWFkZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2FtYmlhck1lcygtMSlcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTEuMzU0IDEuNjQ2YS41LjUgMCAwIDEgMCAuNzA4TDUuNzA3IDhsNS42NDcgNS42NDZhLjUuNSAwIDAgMS0uNzA4LjcwOGwtNi02YS41LjUgMCAwIDEgMC0uNzA4bDYtNmEuNS41IDAgMCAxIC43MDggMHpcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8c3Bhbj57eyBnZXROb21icmVNZXMobWVzQW50ZXJpb3IpIH19PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk00LjY0NiAxLjY0NmEuNS41IDAgMCAxIC43MDggMGw2IDZhLjUuNSAwIDAgMSAwIC43MDhsLTYgNmEuNS41IDAgMCAxLS43MDgtLjcwOEwxMC4yOTMgOCA0LjY0NiAyLjM1NGEuNS41IDAgMCAxIDAtLjcwOHpcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci13ZWVrZGF5c1wiPlxuICAgICAgICAgIDxzcGFuPlM8L3NwYW4+PHNwYW4+TTwvc3Bhbj48c3Bhbj5UPC9zcGFuPjxzcGFuPlc8L3NwYW4+PHNwYW4+VDwvc3Bhbj48c3Bhbj5GPC9zcGFuPjxzcGFuPlM8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItZGF5c1wiPlxuICAgICAgICAgIEBmb3IgKGRpYU9iaiBvZiBkaWFzTWVzQW50ZXJpb3I7IHRyYWNrIGRpYU9iai5mZWNoYSB8fCAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWRheVwiIFxuICAgICAgICAgICAgICBbY2xhc3MuZW1wdHldPVwiIWRpYU9iai5lc01lc0FjdHVhbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkaWFPYmouZXNJbmljaW8gfHwgZGlhT2JqLmVzRmluXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmluLXJhbmdlXT1cImRpYU9iai5lblJhbmdvICYmICFkaWFPYmouZXNJbmljaW8gJiYgIWRpYU9iai5lc0ZpblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY2Npb25hckRpYShkaWFPYmopXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkaWFPYmouZXNNZXNBY3R1YWxcIj5cbiAgICAgICAgICAgICAge3sgZGlhT2JqLmRpYSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEN1cnJlbnQgbW9udGggY2FsZW5kYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY2FsZW5kYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMS4zNTQgMS42NDZhLjUuNSAwIDAgMSAwIC43MDhMNS43MDcgOGw1LjY0NyA1LjY0NmEuNS41IDAgMCAxLS43MDguNzA4bC02LTZhLjUuNSAwIDAgMSAwLS43MDhsNi02YS41LjUgMCAwIDEgLjcwOCAwelwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuPnt7IGdldE5vbWJyZU1lcyhtZXNBY3R1YWwpIH19PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjYW1iaWFyTWVzKDEpXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNjQ2IDEuNjQ2YS41LjUgMCAwIDEgLjcwOCAwbDYgNmEuNS41IDAgMCAxIDAgLjcwOGwtNiA2YS41LjUgMCAwIDEtLjcwOC0uNzA4TDEwLjI5MyA4IDQuNjQ2IDIuMzU0YS41LjUgMCAwIDEgMC0uNzA4elwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLXdlZWtkYXlzXCI+XG4gICAgICAgICAgPHNwYW4+Uzwvc3Bhbj48c3Bhbj5NPC9zcGFuPjxzcGFuPlQ8L3NwYW4+PHNwYW4+Vzwvc3Bhbj48c3Bhbj5UPC9zcGFuPjxzcGFuPkY8L3NwYW4+PHNwYW4+Uzwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1kYXlzXCI+XG4gICAgICAgICAgQGZvciAoZGlhT2JqIG9mIGRpYXNNZXNBY3R1YWw7IHRyYWNrIGRpYU9iai5mZWNoYSB8fCAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWRheVwiIFxuICAgICAgICAgICAgICBbY2xhc3MuZW1wdHldPVwiIWRpYU9iai5lc01lc0FjdHVhbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkaWFPYmouZXNJbmljaW8gfHwgZGlhT2JqLmVzRmluXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmluLXJhbmdlXT1cImRpYU9iai5lblJhbmdvICYmICFkaWFPYmouZXNJbmljaW8gJiYgIWRpYU9iai5lc0ZpblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY2Npb25hckRpYShkaWFPYmopXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkaWFPYmouZXNNZXNBY3R1YWxcIj5cbiAgICAgICAgICAgICAge3sgZGlhT2JqLmRpYSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lbHVpei1kdWFsLWRhdGVwaWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb25lbHVpei1kdWFsLWRhdGVwaWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,5 +0,0 @@
1
- /**
2
- * Public API Surface of @oneluiz/dual-datepicker
3
- */
4
- export { DualDatepickerComponent } from './dual-datepicker.component';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBAb25lbHVpei9kdWFsLWRhdGVwaWNrZXJcbiAqL1xuXG5leHBvcnQgeyBEdWFsRGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5leHBvcnQgdHlwZSB7IERhdGVSYW5nZSwgUHJlc2V0Q29uZmlnIH0gZnJvbSAnLi9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50JztcbiJdfQ==
@@ -1,254 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { EventEmitter, HostListener, Output, Input, Component } from '@angular/core';
3
- import * as i1 from '@angular/common';
4
- import { CommonModule } from '@angular/common';
5
- import { FormsModule } from '@angular/forms';
6
-
7
- class DualDatepickerComponent {
8
- elementRef;
9
- placeholder = 'Select date range';
10
- fechaInicio = '';
11
- fechaFin = '';
12
- showPresets = true;
13
- closeOnSelection = true;
14
- closeOnPresetSelection = true;
15
- closeOnClickOutside = true;
16
- presets = [
17
- { label: 'Last month', daysAgo: 30 },
18
- { label: 'Last 6 months', daysAgo: 180 },
19
- { label: 'Last year', daysAgo: 365 }
20
- ];
21
- inputBackgroundColor = '#fff';
22
- inputTextColor = '#495057';
23
- inputBorderColor = '#ced4da';
24
- inputBorderColorHover = '#ced4da';
25
- inputBorderColorFocus = '#80bdff';
26
- inputPadding = '0.375rem 0.75rem';
27
- dateRangeChange = new EventEmitter();
28
- dateRangeSelected = new EventEmitter();
29
- mostrarDatePicker = false;
30
- rangoFechas = '';
31
- fechaSeleccionandoInicio = true;
32
- mesActual = new Date();
33
- mesAnterior = new Date();
34
- diasMesActual = [];
35
- diasMesAnterior = [];
36
- constructor(elementRef) {
37
- this.elementRef = elementRef;
38
- }
39
- onClickOutside(event) {
40
- if (this.mostrarDatePicker && this.closeOnClickOutside) {
41
- const clickedInside = this.elementRef.nativeElement.contains(event.target);
42
- if (!clickedInside) {
43
- this.cerrarDatePicker();
44
- }
45
- }
46
- }
47
- ngOnInit() {
48
- if (this.fechaInicio && this.fechaFin) {
49
- this.actualizarRangoFechasTexto();
50
- this.generarCalendarios();
51
- }
52
- }
53
- ngOnChanges(changes) {
54
- if (changes['fechaInicio'] || changes['fechaFin']) {
55
- if (this.fechaInicio && this.fechaFin) {
56
- this.actualizarRangoFechasTexto();
57
- this.generarCalendarios();
58
- }
59
- else if (!this.fechaInicio && !this.fechaFin) {
60
- this.rangoFechas = '';
61
- }
62
- }
63
- }
64
- formatearFecha(fecha) {
65
- const year = fecha.getFullYear();
66
- const month = String(fecha.getMonth() + 1).padStart(2, '0');
67
- const day = String(fecha.getDate()).padStart(2, '0');
68
- return `${year}-${month}-${day}`;
69
- }
70
- formatearFechaDisplay(fechaStr) {
71
- if (!fechaStr)
72
- return '';
73
- const fecha = new Date(fechaStr + 'T00:00:00');
74
- const meses = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
75
- return `${fecha.getDate()} ${meses[fecha.getMonth()]}`;
76
- }
77
- actualizarRangoFechasTexto() {
78
- if (this.fechaInicio && this.fechaFin) {
79
- const inicio = this.formatearFechaDisplay(this.fechaInicio);
80
- const fin = this.formatearFechaDisplay(this.fechaFin);
81
- this.rangoFechas = `${inicio} - ${fin}`;
82
- }
83
- else {
84
- this.rangoFechas = '';
85
- }
86
- }
87
- toggleDatePicker() {
88
- this.mostrarDatePicker = !this.mostrarDatePicker;
89
- if (this.mostrarDatePicker) {
90
- this.fechaSeleccionandoInicio = true;
91
- this.mesAnterior = new Date(this.mesActual.getFullYear(), this.mesActual.getMonth() - 1, 1);
92
- this.generarCalendarios();
93
- }
94
- }
95
- cerrarDatePicker() {
96
- this.mostrarDatePicker = false;
97
- }
98
- generarCalendarios() {
99
- this.diasMesAnterior = this.generarCalendarioMes(this.mesAnterior);
100
- this.diasMesActual = this.generarCalendarioMes(this.mesActual);
101
- }
102
- generarCalendarioMes(fecha) {
103
- const año = fecha.getFullYear();
104
- const mes = fecha.getMonth();
105
- const primerDia = new Date(año, mes, 1);
106
- const ultimoDia = new Date(año, mes + 1, 0);
107
- const diasEnMes = ultimoDia.getDate();
108
- const primerDiaSemana = primerDia.getDay();
109
- const diasMes = [];
110
- for (let i = 0; i < primerDiaSemana; i++) {
111
- diasMes.push({ dia: null, esMesActual: false });
112
- }
113
- for (let dia = 1; dia <= diasEnMes; dia++) {
114
- const fechaDia = new Date(año, mes, dia);
115
- const fechaStr = this.formatearFecha(fechaDia);
116
- diasMes.push({
117
- dia: dia,
118
- fecha: fechaStr,
119
- esMesActual: true,
120
- esInicio: this.fechaInicio === fechaStr,
121
- esFin: this.fechaFin === fechaStr,
122
- enRango: this.estaEnRango(fechaStr)
123
- });
124
- }
125
- return diasMes;
126
- }
127
- estaEnRango(fechaStr) {
128
- if (!this.fechaInicio || !this.fechaFin)
129
- return false;
130
- return fechaStr >= this.fechaInicio && fechaStr <= this.fechaFin;
131
- }
132
- seleccionarDia(diaObj) {
133
- if (!diaObj.esMesActual)
134
- return;
135
- if (this.fechaSeleccionandoInicio) {
136
- this.fechaInicio = diaObj.fecha;
137
- this.fechaFin = '';
138
- this.fechaSeleccionandoInicio = false;
139
- this.emitirCambio();
140
- }
141
- else {
142
- if (diaObj.fecha < this.fechaInicio) {
143
- this.fechaFin = this.fechaInicio;
144
- this.fechaInicio = diaObj.fecha;
145
- }
146
- else {
147
- this.fechaFin = diaObj.fecha;
148
- }
149
- this.actualizarRangoFechasTexto();
150
- if (this.closeOnSelection) {
151
- this.mostrarDatePicker = false;
152
- }
153
- this.fechaSeleccionandoInicio = true;
154
- this.emitirSeleccion();
155
- }
156
- this.generarCalendarios();
157
- }
158
- cambiarMes(direccion) {
159
- this.mesActual = new Date(this.mesActual.getFullYear(), this.mesActual.getMonth() + direccion, 1);
160
- this.mesAnterior = new Date(this.mesActual.getFullYear(), this.mesActual.getMonth() - 1, 1);
161
- this.generarCalendarios();
162
- }
163
- getNombreMes(fecha) {
164
- const meses = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
165
- return `${meses[fecha.getMonth()]} ${fecha.getFullYear()}`;
166
- }
167
- seleccionarRangoPredefinido(preset) {
168
- const hoy = new Date();
169
- const fechaInicio = new Date(hoy);
170
- fechaInicio.setDate(hoy.getDate() - preset.daysAgo);
171
- this.fechaInicio = this.formatearFecha(fechaInicio);
172
- this.fechaFin = this.formatearFecha(hoy);
173
- this.actualizarRangoFechasTexto();
174
- this.generarCalendarios();
175
- if (this.closeOnPresetSelection) {
176
- this.mostrarDatePicker = false;
177
- }
178
- this.emitirSeleccion();
179
- }
180
- limpiar() {
181
- this.fechaInicio = '';
182
- this.fechaFin = '';
183
- this.rangoFechas = '';
184
- this.mostrarDatePicker = false;
185
- this.fechaSeleccionandoInicio = true;
186
- this.emitirCambio();
187
- }
188
- emitirCambio() {
189
- this.dateRangeChange.emit({
190
- fechaInicio: this.fechaInicio,
191
- fechaFin: this.fechaFin,
192
- rangoTexto: this.rangoFechas
193
- });
194
- }
195
- emitirSeleccion() {
196
- this.dateRangeSelected.emit({
197
- fechaInicio: this.fechaInicio,
198
- fechaFin: this.fechaFin,
199
- rangoTexto: this.rangoFechas
200
- });
201
- }
202
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDatepickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
203
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DualDatepickerComponent, isStandalone: true, selector: "ngx-dual-datepicker", inputs: { placeholder: "placeholder", fechaInicio: "fechaInicio", fechaFin: "fechaFin", showPresets: "showPresets", closeOnSelection: "closeOnSelection", closeOnPresetSelection: "closeOnPresetSelection", closeOnClickOutside: "closeOnClickOutside", presets: "presets", inputBackgroundColor: "inputBackgroundColor", inputTextColor: "inputTextColor", inputBorderColor: "inputBorderColor", inputBorderColorHover: "inputBorderColorHover", inputBorderColorFocus: "inputBorderColorFocus", inputPadding: "inputPadding" }, outputs: { dateRangeChange: "dateRangeChange", dateRangeSelected: "dateRangeSelected" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"datepicker-wrapper\" \n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"rangoFechas\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (mostrarDatePicker) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"seleccionarRangoPredefinido(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"cambiarMes(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ getNombreMes(mesAnterior) }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n <span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span>\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesAnterior; track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ getNombreMes(mesActual) }}</span>\n <button type=\"button\" (click)=\"cambiarMes(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n <span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span>\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesActual; track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n }\n</div>\n", styles: [".datepicker-wrapper{position:relative;width:100%}.datepicker-wrapper .datepicker-input{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;cursor:pointer}.datepicker-wrapper .datepicker-input:hover{border-color:var(--input-border-hover, #ced4da)}.datepicker-wrapper .datepicker-input:focus{border-color:var(--input-border-focus, #80bdff);box-shadow:0 0 0 .2rem #007bff40;outline:0}.datepicker-wrapper .datepicker-input::placeholder{color:#6c757d;opacity:1}.datepicker-wrapper .datepicker-input:disabled,.datepicker-wrapper .datepicker-input[readonly]{background-color:#e9ecef;opacity:1}.date-picker-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e1e4e8;border-radius:8px;box-shadow:0 4px 12px #00000014,0 0 1px #00000014;padding:16px;z-index:1060;min-width:680px}@media (max-width: 768px){.date-picker-dropdown{min-width:100%;left:0;right:0}}.date-picker-header-only-close{display:flex;justify-content:flex-end;margin-bottom:12px}.date-picker-header-only-close .btn-close-calendar{background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;border-radius:6px;cursor:pointer;transition:all .15s ease;font-size:1.5rem;line-height:1}.date-picker-header-only-close .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-header-only-close .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-presets{display:flex;gap:6px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #e5e7eb;align-items:center}@media (max-width: 768px){.date-picker-presets{flex-wrap:wrap}}.date-picker-presets button{font-size:.75rem;padding:6px 14px;border:none;background-color:#f9fafb;color:#374151;border-radius:6px;transition:all .15s ease;font-weight:500;cursor:pointer;border:1px solid #e5e7eb}.date-picker-presets button:hover{background-color:#f3f4f6;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 4px #0000000f}.date-picker-presets button:active{transform:translateY(0);box-shadow:none}.date-picker-presets .btn-close-calendar{margin-left:auto;background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;font-size:1.5rem;line-height:1}.date-picker-presets .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-presets .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-calendars{display:flex;gap:32px}@media (max-width: 768px){.date-picker-calendars{flex-direction:column;gap:16px}}.date-picker-calendar{flex:1}.date-picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px}.date-picker-header span{font-size:.813rem;font-weight:600;color:#111827}.date-picker-header button{padding:4px;color:#6b7280;text-decoration:none;border-radius:6px;transition:all .15s ease;border:none;background:transparent;cursor:pointer}.date-picker-header button:hover{background-color:#f3f4f6;color:#111827}.date-picker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}.date-picker-weekdays span{text-align:center;font-size:.625rem;font-weight:600;color:#6b7280;padding:6px}.date-picker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.date-picker-day{aspect-ratio:1;border:none;background:transparent;border-radius:50%;font-size:.75rem;cursor:pointer;transition:all .15s ease;color:#374151;font-weight:400}.date-picker-day:hover:not(:disabled):not(.selected){background-color:#f3f4f6;color:#111827}.date-picker-day.empty{visibility:hidden}.date-picker-day.selected{background-color:#222;color:#fff;font-weight:600}.date-picker-day.in-range{background-color:#f9fafb;border-radius:0}.date-picker-day:disabled{cursor:not-allowed;opacity:.3}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }] });
204
- }
205
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDatepickerComponent, decorators: [{
206
- type: Component,
207
- args: [{ selector: 'ngx-dual-datepicker', standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"datepicker-wrapper\" \n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"rangoFechas\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (mostrarDatePicker) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"seleccionarRangoPredefinido(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"cambiarMes(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ getNombreMes(mesAnterior) }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n <span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span>\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesAnterior; track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ getNombreMes(mesActual) }}</span>\n <button type=\"button\" (click)=\"cambiarMes(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n <span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span>\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesActual; track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n }\n</div>\n", styles: [".datepicker-wrapper{position:relative;width:100%}.datepicker-wrapper .datepicker-input{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;cursor:pointer}.datepicker-wrapper .datepicker-input:hover{border-color:var(--input-border-hover, #ced4da)}.datepicker-wrapper .datepicker-input:focus{border-color:var(--input-border-focus, #80bdff);box-shadow:0 0 0 .2rem #007bff40;outline:0}.datepicker-wrapper .datepicker-input::placeholder{color:#6c757d;opacity:1}.datepicker-wrapper .datepicker-input:disabled,.datepicker-wrapper .datepicker-input[readonly]{background-color:#e9ecef;opacity:1}.date-picker-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e1e4e8;border-radius:8px;box-shadow:0 4px 12px #00000014,0 0 1px #00000014;padding:16px;z-index:1060;min-width:680px}@media (max-width: 768px){.date-picker-dropdown{min-width:100%;left:0;right:0}}.date-picker-header-only-close{display:flex;justify-content:flex-end;margin-bottom:12px}.date-picker-header-only-close .btn-close-calendar{background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;border-radius:6px;cursor:pointer;transition:all .15s ease;font-size:1.5rem;line-height:1}.date-picker-header-only-close .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-header-only-close .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-presets{display:flex;gap:6px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #e5e7eb;align-items:center}@media (max-width: 768px){.date-picker-presets{flex-wrap:wrap}}.date-picker-presets button{font-size:.75rem;padding:6px 14px;border:none;background-color:#f9fafb;color:#374151;border-radius:6px;transition:all .15s ease;font-weight:500;cursor:pointer;border:1px solid #e5e7eb}.date-picker-presets button:hover{background-color:#f3f4f6;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 4px #0000000f}.date-picker-presets button:active{transform:translateY(0);box-shadow:none}.date-picker-presets .btn-close-calendar{margin-left:auto;background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;font-size:1.5rem;line-height:1}.date-picker-presets .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-presets .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-calendars{display:flex;gap:32px}@media (max-width: 768px){.date-picker-calendars{flex-direction:column;gap:16px}}.date-picker-calendar{flex:1}.date-picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px}.date-picker-header span{font-size:.813rem;font-weight:600;color:#111827}.date-picker-header button{padding:4px;color:#6b7280;text-decoration:none;border-radius:6px;transition:all .15s ease;border:none;background:transparent;cursor:pointer}.date-picker-header button:hover{background-color:#f3f4f6;color:#111827}.date-picker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}.date-picker-weekdays span{text-align:center;font-size:.625rem;font-weight:600;color:#6b7280;padding:6px}.date-picker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.date-picker-day{aspect-ratio:1;border:none;background:transparent;border-radius:50%;font-size:.75rem;cursor:pointer;transition:all .15s ease;color:#374151;font-weight:400}.date-picker-day:hover:not(:disabled):not(.selected){background-color:#f3f4f6;color:#111827}.date-picker-day.empty{visibility:hidden}.date-picker-day.selected{background-color:#222;color:#fff;font-weight:600}.date-picker-day.in-range{background-color:#f9fafb;border-radius:0}.date-picker-day:disabled{cursor:not-allowed;opacity:.3}\n"] }]
208
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { placeholder: [{
209
- type: Input
210
- }], fechaInicio: [{
211
- type: Input
212
- }], fechaFin: [{
213
- type: Input
214
- }], showPresets: [{
215
- type: Input
216
- }], closeOnSelection: [{
217
- type: Input
218
- }], closeOnPresetSelection: [{
219
- type: Input
220
- }], closeOnClickOutside: [{
221
- type: Input
222
- }], presets: [{
223
- type: Input
224
- }], inputBackgroundColor: [{
225
- type: Input
226
- }], inputTextColor: [{
227
- type: Input
228
- }], inputBorderColor: [{
229
- type: Input
230
- }], inputBorderColorHover: [{
231
- type: Input
232
- }], inputBorderColorFocus: [{
233
- type: Input
234
- }], inputPadding: [{
235
- type: Input
236
- }], dateRangeChange: [{
237
- type: Output
238
- }], dateRangeSelected: [{
239
- type: Output
240
- }], onClickOutside: [{
241
- type: HostListener,
242
- args: ['document:click', ['$event']]
243
- }] } });
244
-
245
- /**
246
- * Public API Surface of @oneluiz/dual-datepicker
247
- */
248
-
249
- /**
250
- * Generated bundle index. Do not edit.
251
- */
252
-
253
- export { DualDatepickerComponent };
254
- //# sourceMappingURL=oneluiz-dual-datepicker.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oneluiz-dual-datepicker.mjs","sources":["../../src/dual-datepicker.component.ts","../../src/dual-datepicker.component.html","../../src/public-api.ts","../../src/oneluiz-dual-datepicker.ts"],"sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, HostListener, ElementRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nexport interface DateRange {\n fechaInicio: string;\n fechaFin: string;\n rangoTexto: string;\n}\n\nexport interface PresetConfig {\n label: string;\n daysAgo: number;\n}\n\n@Component({\n selector: 'ngx-dual-datepicker',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './dual-datepicker.component.html',\n styleUrl: './dual-datepicker.component.scss'\n})\nexport class DualDatepickerComponent implements OnInit, OnChanges {\n @Input() placeholder: string = 'Select date range';\n @Input() fechaInicio: string = '';\n @Input() fechaFin: string = '';\n @Input() showPresets: boolean = true;\n @Input() closeOnSelection: boolean = true;\n @Input() closeOnPresetSelection: boolean = true;\n @Input() closeOnClickOutside: boolean = true;\n @Input() presets: PresetConfig[] = [\n { label: 'Last month', daysAgo: 30 },\n { label: 'Last 6 months', daysAgo: 180 },\n { label: 'Last year', daysAgo: 365 }\n ];\n @Input() inputBackgroundColor: string = '#fff';\n @Input() inputTextColor: string = '#495057';\n @Input() inputBorderColor: string = '#ced4da';\n @Input() inputBorderColorHover: string = '#ced4da';\n @Input() inputBorderColorFocus: string = '#80bdff';\n @Input() inputPadding: string = '0.375rem 0.75rem';\n\n @Output() dateRangeChange = new EventEmitter<DateRange>();\n @Output() dateRangeSelected = new EventEmitter<DateRange>();\n\n mostrarDatePicker = false;\n rangoFechas = '';\n fechaSeleccionandoInicio = true;\n mesActual = new Date();\n mesAnterior = new Date();\n diasMesActual: any[] = [];\n diasMesAnterior: any[] = [];\n\n constructor(private elementRef: ElementRef) {}\n\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (this.mostrarDatePicker && this.closeOnClickOutside) {\n const clickedInside = this.elementRef.nativeElement.contains(event.target);\n if (!clickedInside) {\n this.cerrarDatePicker();\n }\n }\n }\n\n ngOnInit(): void {\n if (this.fechaInicio && this.fechaFin) {\n this.actualizarRangoFechasTexto();\n this.generarCalendarios();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['fechaInicio'] || changes['fechaFin']) {\n if (this.fechaInicio && this.fechaFin) {\n this.actualizarRangoFechasTexto();\n this.generarCalendarios();\n } else if (!this.fechaInicio && !this.fechaFin) {\n this.rangoFechas = '';\n }\n }\n }\n\n formatearFecha(fecha: Date): string {\n const year = fecha.getFullYear();\n const month = String(fecha.getMonth() + 1).padStart(2, '0');\n const day = String(fecha.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n formatearFechaDisplay(fechaStr: string): string {\n if (!fechaStr) return '';\n const fecha = new Date(fechaStr + 'T00:00:00');\n const meses = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${fecha.getDate()} ${meses[fecha.getMonth()]}`;\n }\n\n actualizarRangoFechasTexto(): void {\n if (this.fechaInicio && this.fechaFin) {\n const inicio = this.formatearFechaDisplay(this.fechaInicio);\n const fin = this.formatearFechaDisplay(this.fechaFin);\n this.rangoFechas = `${inicio} - ${fin}`;\n } else {\n this.rangoFechas = '';\n }\n }\n\n toggleDatePicker(): void {\n this.mostrarDatePicker = !this.mostrarDatePicker;\n if (this.mostrarDatePicker) {\n this.fechaSeleccionandoInicio = true;\n this.mesAnterior = new Date(this.mesActual.getFullYear(), this.mesActual.getMonth() - 1, 1);\n this.generarCalendarios();\n }\n }\n\n cerrarDatePicker(): void {\n this.mostrarDatePicker = false;\n }\n\n generarCalendarios(): void {\n this.diasMesAnterior = this.generarCalendarioMes(this.mesAnterior);\n this.diasMesActual = this.generarCalendarioMes(this.mesActual);\n }\n\n generarCalendarioMes(fecha: Date): any[] {\n const año = fecha.getFullYear();\n const mes = fecha.getMonth();\n const primerDia = new Date(año, mes, 1);\n const ultimoDia = new Date(año, mes + 1, 0);\n const diasEnMes = ultimoDia.getDate();\n const primerDiaSemana = primerDia.getDay();\n\n const diasMes = [];\n\n for (let i = 0; i < primerDiaSemana; i++) {\n diasMes.push({ dia: null, esMesActual: false });\n }\n\n for (let dia = 1; dia <= diasEnMes; dia++) {\n const fechaDia = new Date(año, mes, dia);\n const fechaStr = this.formatearFecha(fechaDia);\n diasMes.push({\n dia: dia,\n fecha: fechaStr,\n esMesActual: true,\n esInicio: this.fechaInicio === fechaStr,\n esFin: this.fechaFin === fechaStr,\n enRango: this.estaEnRango(fechaStr)\n });\n }\n\n return diasMes;\n }\n\n estaEnRango(fechaStr: string): boolean {\n if (!this.fechaInicio || !this.fechaFin) return false;\n return fechaStr >= this.fechaInicio && fechaStr <= this.fechaFin;\n }\n\n seleccionarDia(diaObj: any): void {\n if (!diaObj.esMesActual) return;\n\n if (this.fechaSeleccionandoInicio) {\n this.fechaInicio = diaObj.fecha;\n this.fechaFin = '';\n this.fechaSeleccionandoInicio = false;\n this.emitirCambio();\n } else {\n if (diaObj.fecha < this.fechaInicio) {\n this.fechaFin = this.fechaInicio;\n this.fechaInicio = diaObj.fecha;\n } else {\n this.fechaFin = diaObj.fecha;\n }\n this.actualizarRangoFechasTexto();\n if (this.closeOnSelection) {\n this.mostrarDatePicker = false;\n }\n this.fechaSeleccionandoInicio = true;\n this.emitirSeleccion();\n }\n this.generarCalendarios();\n }\n\n cambiarMes(direccion: number): void {\n this.mesActual = new Date(this.mesActual.getFullYear(), this.mesActual.getMonth() + direccion, 1);\n this.mesAnterior = new Date(this.mesActual.getFullYear(), this.mesActual.getMonth() - 1, 1);\n this.generarCalendarios();\n }\n\n getNombreMes(fecha: Date): string {\n const meses = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n return `${meses[fecha.getMonth()]} ${fecha.getFullYear()}`;\n }\n\n seleccionarRangoPredefinido(preset: PresetConfig): void {\n const hoy = new Date();\n const fechaInicio = new Date(hoy);\n fechaInicio.setDate(hoy.getDate() - preset.daysAgo);\n\n this.fechaInicio = this.formatearFecha(fechaInicio);\n this.fechaFin = this.formatearFecha(hoy);\n this.actualizarRangoFechasTexto();\n this.generarCalendarios();\n if (this.closeOnPresetSelection) {\n this.mostrarDatePicker = false;\n }\n this.emitirSeleccion();\n }\n\n limpiar(): void {\n this.fechaInicio = '';\n this.fechaFin = '';\n this.rangoFechas = '';\n this.mostrarDatePicker = false;\n this.fechaSeleccionandoInicio = true;\n this.emitirCambio();\n }\n\n private emitirCambio(): void {\n this.dateRangeChange.emit({\n fechaInicio: this.fechaInicio,\n fechaFin: this.fechaFin,\n rangoTexto: this.rangoFechas\n });\n }\n\n private emitirSeleccion(): void {\n this.dateRangeSelected.emit({\n fechaInicio: this.fechaInicio,\n fechaFin: this.fechaFin,\n rangoTexto: this.rangoFechas\n });\n }\n}\n","<div class=\"datepicker-wrapper\" \n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"rangoFechas\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (mostrarDatePicker) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"seleccionarRangoPredefinido(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n ×\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n ×\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"cambiarMes(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ getNombreMes(mesAnterior) }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n <span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span>\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesAnterior; track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ getNombreMes(mesActual) }}</span>\n <button type=\"button\" (click)=\"cambiarMes(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n <span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span>\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesActual; track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n }\n</div>\n","/**\n * Public API Surface of @oneluiz/dual-datepicker\n */\n\nexport { DualDatepickerComponent } from './dual-datepicker.component';\nexport type { DateRange, PresetConfig } from './dual-datepicker.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="@oneluiz/dual-datepicker" />
5
- export * from './public-api';
@@ -1,5 +0,0 @@
1
- /**
2
- * Public API Surface of @oneluiz/dual-datepicker
3
- */
4
- export { DualDatepickerComponent } from './dual-datepicker.component';
5
- export type { DateRange, PresetConfig } from './dual-datepicker.component';