@luoxiao123/angular-material-date-time-range-picker 21.1.2 → 21.1.3

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/README.md CHANGED
@@ -100,8 +100,8 @@ export class AppComponent {
100
100
 
101
101
  onRangeSelected(range: DateTimePickerValue | undefined) {
102
102
  if (range) {
103
- console.log('Start:', range.start); // ISO 8601 format
104
- console.log('End:', range.end); // ISO 8601 format
103
+ console.log('Start:', range.start); // 格式化后的字符串 (如 "2024-01-24 14:30") 或时间戳
104
+ console.log('End:', range.end); // 格式化后的字符串 (如 "2024-01-24 14:30") 或时间戳
105
105
  }
106
106
  }
107
107
  }
@@ -171,6 +171,7 @@ export class DateRangeModule {}
171
171
  | `disabled` | `boolean` | `false` | 是否禁用组件 |
172
172
  | `placeholder` | `string` | `''` | 输入框占位符 |
173
173
  | `future` | `boolean` | `false` | 是否允许选择未来日期 |
174
+ | `isTimestamp` | `boolean` | `false` | 是否使用时间戳(毫秒)作为输入/输出值 |
174
175
 
175
176
  ### 输出事件
176
177
 
@@ -184,8 +185,8 @@ export class DateRangeModule {}
184
185
 
185
186
  | 属性 | 类型 | 说明 |
186
187
  |------|------|------|
187
- | `start` | `string` | 格式化后的开始日期时间 (基于 MAT_DATE_FORMATS + HH:mm) |
188
- | `end` | `string` | 格式化后的结束日期时间 (基于 MAT_DATE_FORMATS + HH:mm) |
188
+ | `start` | `string \| number` | 格式化后的日期时间字符串 ( "2024-01-24 14:30") 或时间戳 (毫秒) |
189
+ | `end` | `string \| number` | 格式化后的日期时间字符串 ( "2024-01-24 14:30") 或时间戳 (毫秒) |
189
190
 
190
191
  ## 配置
191
192
 
@@ -230,10 +231,17 @@ ngOnInit() {
230
231
  const startDate = new Date(now.getFullYear(), now.getMonth(), 1);
231
232
  const endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
232
233
 
234
+ // 默认模式(字符串)
233
235
  this.selectedRange = {
234
- start: startDate.toISOString(),
236
+ start: startDate.toISOString(), // 推荐使用 ISO 字符串作为初始值
235
237
  end: endDate.toISOString()
236
238
  };
239
+
240
+ // 时间戳模式(如果启用了 isTimestamp="true")
241
+ // this.selectedRange = {
242
+ // start: startDate.getTime(),
243
+ // end: endDate.getTime()
244
+ // };
237
245
  }
238
246
  ```
239
247
 
@@ -282,7 +290,10 @@ A: 当前版本使用中文界面。欢迎提交 PR 添加多语言支持。
282
290
  A: 支持。组件使用标准的 Material Design 样式,可通过 CSS 变量和自定义 CSS 进行定制。
283
291
 
284
292
  ### Q: 如何处理时区问题?
285
- A: 组件返回的日期时间字符串基于本地时间(Local Time),格式化结果取决于 `MAT_DATE_FORMATS` 配置。如果需要处理时区,建议在获取值后使用 `date-fns` 或 `moment.js` 等库进行转换。
293
+ A:
294
+ - **默认模式**:组件返回的日期时间字符串基于本地时间(Local Time),格式化结果取决于 `MAT_DATE_FORMATS` 配置。
295
+ - **时间戳模式**:如果启用了 `isTimestamp="true"`,组件返回的是 UTC 时间戳(毫秒)。
296
+ 如果需要处理时区转换,建议在获取值后使用 `date-fns` 或 `moment.js` 等库。
286
297
 
287
298
  ## 贡献
288
299
 
@@ -91,6 +91,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
91
91
  args: [{ selector: 'date-time-input', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatDatepickerModule, FormsModule, TablerIconComponent, CommonModule], template: "<div class=\"date-time-input-wrapper\">\r\n <label class=\"date-time-input-label\">{{ label() }}</label>\r\n\r\n <div class=\"date-time-input-container\">\r\n <!-- \u65E5\u671F\u90E8\u5206 -->\r\n <div class=\"date-time-input-date\">\r\n <input\r\n type=\"text\"\r\n matInput\r\n [ngModel]=\"dateObj()\"\r\n (ngModelChange)=\"onDateChange($event)\"\r\n [matDatepicker]=\"datePicker\"\r\n (click)=\"datePicker.open()\"\r\n (focus)=\"datePicker.open()\"\r\n placeholder=\"\u9009\u62E9\u65E5\u671F\"\r\n class=\"date-time-input-field\"\r\n />\r\n <mat-datepicker #datePicker></mat-datepicker>\r\n\r\n <button type=\"button\" class=\"date-time-input-icon-btn\" tabindex=\"-1\" aria-hidden=\"true\">\r\n <i-tabler name=\"calendar-due\" strokeWidth=\"2px\" size=\"16px\" />\r\n </button>\r\n </div>\r\n\r\n <!-- \u5206\u9694\u7B26 -->\r\n <div class=\"date-time-input-divider\"></div>\r\n\r\n <!-- \u65F6\u95F4\u90E8\u5206 -->\r\n <div class=\"date-time-input-time\">\r\n <!-- \u5C0F\u65F6 -->\r\n <select class=\"date-time-input-select date-time-input-select-hour\" [ngModel]=\"hourValue()\" (ngModelChange)=\"onHourChange($event)\" [attr.aria-label]=\"'\u5C0F\u65F6'\">\r\n <option [ngValue]=\"null\" disabled>--</option>\r\n @for (hour of hours(); track hour) {\r\n <option [ngValue]=\"hour\">{{ hour | number: '2.0-0' }}</option>\r\n }\r\n </select>\r\n\r\n <!-- \u5206\u9694\u7B26 -->\r\n <span class=\"date-time-input-separator\">:</span>\r\n\r\n <!-- \u5206\u949F -->\r\n <select class=\"date-time-input-select date-time-input-select-minute\" [ngModel]=\"minuteValue()\" (ngModelChange)=\"onMinuteChange($event)\" [attr.aria-label]=\"'\u5206\u949F'\">\r\n <option [ngValue]=\"null\" disabled>--</option>\r\n @for (minute of minutes(); track minute) {\r\n <option [ngValue]=\"minute\">{{ minute | number: '2.0-0' }}</option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block}:host .date-time-input-wrapper{display:flex;flex-direction:column;gap:8px;padding:12px 16px}@media(max-width:767px){:host .date-time-input-wrapper{padding-bottom:0}}:host .date-time-input-label{font-size:.75rem;font-weight:500;text-transform:uppercase;letter-spacing:.5px;color:var(--mat-sys-on-surface-variant, rgba(0, 0, 0, .6))}:host .date-time-input-container{display:flex;align-items:center;width:100%;max-width:100%;border:1px solid var(--mat-divider-color, rgba(0, 0, 0, .12));border-radius:4px;overflow:hidden;background-color:var(--mat-sys-surface-container-low, rgba(0, 0, 0, .02));transition:border-color .2s ease;box-sizing:border-box}:host .date-time-input-container:hover{border-color:var(--mat-divider-color, rgba(0, 0, 0, .24))}:host .date-time-input-container:focus-within{border-color:var(--mat-sys-primary, #1976d2);background-color:var(--mat-sys-surface, #fff)}:host .date-time-input-date{flex:1;display:flex;align-items:center;position:relative;padding:0 8px;min-width:0;overflow:hidden}:host .date-time-input-field{flex:1;height:36px;padding:0;border:none;background:transparent;color:var(--mat-sys-on-surface, rgba(0, 0, 0, .87));font-size:.875rem;min-width:0;overflow:hidden;text-overflow:ellipsis}:host .date-time-input-field::placeholder{color:var(--mat-sys-on-surface-variant, rgba(0, 0, 0, .4))}:host .date-time-input-field:focus{outline:none}:host .date-time-input-icon-btn{position:absolute;right:0;width:24px;height:24px;padding:0;display:flex;align-items:center;justify-content:center;background:transparent;border:none;color:var(--mat-sys-on-surface-variant, rgba(0, 0, 0, .6));pointer-events:none}:host .date-time-input-divider{width:1px;height:20px;background-color:var(--mat-divider-color, rgba(0, 0, 0, .12))}:host .date-time-input-time{flex:1;display:flex;min-width:0;align-items:center;gap:2px;padding:0 8px}:host .date-time-input-select{flex:1;height:36px;border:none;background:transparent;color:var(--mat-sys-on-surface, rgba(0, 0, 0, .87));font-size:.875rem;font-weight:500;padding:0 2px;cursor:pointer;text-align:center}:host .date-time-input-select:focus{outline:none}:host .date-time-input-separator{color:var(--mat-sys-on-surface-variant, rgba(0, 0, 0, .6));font-weight:500;padding:0 2px;-webkit-user-select:none;user-select:none}\n"] }]
92
92
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], dateValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateValue", required: false }] }], hourValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "hourValue", required: false }] }], minuteValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteValue", required: false }] }], hours: [{ type: i0.Input, args: [{ isSignal: true, alias: "hours", required: false }] }], minutes: [{ type: i0.Input, args: [{ isSignal: true, alias: "minutes", required: false }] }], dateChange: [{ type: i0.Output, args: ["dateChange"] }], hourChange: [{ type: i0.Output, args: ["hourChange"] }], minuteChange: [{ type: i0.Output, args: ["minuteChange"] }], timeChange: [{ type: i0.Output, args: ["timeChange"] }] } });
93
93
 
94
+ /**
95
+ * 格式化日期对象为字符串
96
+ *
97
+ * 将给定的 Date 对象格式化为包含日期和时间的字符串。
98
+ * 日期部分使用提供的 DateAdapter 和 MatDateFormats 进行格式化。
99
+ * 时间部分格式化为 HH:mm (24小时制)。
100
+ *
101
+ * @param date - 要格式化的 Date 对象
102
+ * @param dateAdapter - Angular Material 的 DateAdapter,用于处理日期部分的格式化
103
+ * @param dateFormats - Angular Material 的 MatDateFormats,包含日期格式配置
104
+ * @returns 格式化后的日期时间字符串,例如 "2024-01-24 14:30"
105
+ */
94
106
  function formatDate(date, dateAdapter, dateFormats) {
95
107
  const datePart = dateAdapter.format(date, dateFormats.display.dateInput);
96
108
  const hours = date.getHours().toString().padStart(2, '0');
@@ -189,8 +201,8 @@ class DateSelector {
189
201
  this.selectedDateRange = new DateRange(start, end);
190
202
  this.#selectionModel.updateSelection(this.selectedDateRange, this);
191
203
  // 初始化时间值
192
- this.startDate.set(picker.start);
193
- this.endDate.set(picker.end);
204
+ this.startDate.set(!isNaN(start.getTime()) ? start.toISOString() : String(picker.start));
205
+ this.endDate.set(!isNaN(end.getTime()) ? end.toISOString() : String(picker.end));
194
206
  this.startHour.set(start.getHours());
195
207
  this.startMinute.set(start.getMinutes());
196
208
  this.endHour.set(end.getHours());
@@ -545,6 +557,7 @@ class DatePickerComponent {
545
557
  this._formDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_formDisabled" }] : []));
546
558
  this.placeholder = '';
547
559
  this.future = input(false, ...(ngDevMode ? [{ debugName: "future" }] : []));
560
+ this.isTimestamp = input(false, ...(ngDevMode ? [{ debugName: "isTimestamp" }] : []));
548
561
  this.selectedDateRange = model(...(ngDevMode ? [undefined, { debugName: "selectedDateRange" }] : []));
549
562
  this.selectionChange = output();
550
563
  // 内部值存储:{start: string, end: string} 或 null/undefined
@@ -617,11 +630,21 @@ class DatePickerComponent {
617
630
  if (result && result.dateTimePicker) {
618
631
  const start = new Date(result.dateTimePicker.start);
619
632
  const end = new Date(result.dateTimePicker.end);
620
- const startStr = formatDate(start, this._dateAdapter, this._dateFormats);
621
- const endStr = formatDate(end, this._dateAdapter, this._dateFormats);
633
+ let startVal;
634
+ let endVal;
635
+ if (this.isTimestamp()) {
636
+ start.setSeconds(0, 0);
637
+ end.setSeconds(0, 0);
638
+ startVal = start.getTime();
639
+ endVal = end.getTime();
640
+ }
641
+ else {
642
+ startVal = formatDate(start, this._dateAdapter, this._dateFormats);
643
+ endVal = formatDate(end, this._dateAdapter, this._dateFormats);
644
+ }
622
645
  const rangeValue = {
623
- start: startStr,
624
- end: endStr
646
+ start: startVal,
647
+ end: endVal
625
648
  };
626
649
  this.#internalValue.set(rangeValue);
627
650
  // 更新显示用的日期范围
@@ -722,7 +745,7 @@ class DatePickerComponent {
722
745
  this.stateChanges.next();
723
746
  }
724
747
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
725
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DatePickerComponent, isStandalone: true, selector: "date-time-picker", inputs: { required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, future: { classPropertyName: "future", publicName: "future", isSignal: true, isRequired: false, transformFunction: null }, selectedDateRange: { classPropertyName: "selectedDateRange", publicName: "selectedDateRange", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedDateRange: "selectedDateRangeChange", selectionChange: "selectionChange" }, providers: [
748
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DatePickerComponent, isStandalone: true, selector: "date-time-picker", inputs: { required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, future: { classPropertyName: "future", publicName: "future", isSignal: true, isRequired: false, transformFunction: null }, isTimestamp: { classPropertyName: "isTimestamp", publicName: "isTimestamp", isSignal: true, isRequired: false, transformFunction: null }, selectedDateRange: { classPropertyName: "selectedDateRange", publicName: "selectedDateRange", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedDateRange: "selectedDateRangeChange", selectionChange: "selectionChange" }, providers: [
726
749
  provideTablerIcons({ IconCalendarDue, IconX }),
727
750
  {
728
751
  provide: MatFormFieldControl,
@@ -746,11 +769,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
746
769
  type: Input
747
770
  }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], placeholder: [{
748
771
  type: Input
749
- }], future: [{ type: i0.Input, args: [{ isSignal: true, alias: "future", required: false }] }], selectedDateRange: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedDateRange", required: false }] }, { type: i0.Output, args: ["selectedDateRangeChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }] } });
772
+ }], future: [{ type: i0.Input, args: [{ isSignal: true, alias: "future", required: false }] }], isTimestamp: [{ type: i0.Input, args: [{ isSignal: true, alias: "isTimestamp", required: false }] }], selectedDateRange: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedDateRange", required: false }] }, { type: i0.Output, args: ["selectedDateRangeChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }] } });
750
773
 
751
774
  /**
752
775
  * Generated bundle index. Do not edit.
753
776
  */
754
777
 
755
- export { DatePickerComponent, DateSelector };
778
+ export { DatePickerComponent, DateSelector, formatDate };
756
779
  //# sourceMappingURL=luoxiao123-angular-material-date-time-range-picker.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"luoxiao123-angular-material-date-time-range-picker.mjs","sources":["../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/components/container/container.component.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/components/container/container.component.html","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/components/date-time-input/date-time-input.component.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/components/date-time-input/date-time-input.component.html","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/until/index.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/constants.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/date-selector/date-selector.component.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/date-selector/date-selector.component.html","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/date-picker.component.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/date-picker.component.html","../../../projects/angular-material-date-time-range-picker/src/luoxiao123-angular-material-date-time-range-picker.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, model, output, TemplateRef } from '@angular/core';\r\nimport { TablerIconComponent, provideTablerIcons } from '@luoxiao123/angular-tabler-icons';\r\nimport { IconX, IconClock, IconCalendarDue, IconInfoCircle, IconLayoutSidebarLeftCollapse } from '@luoxiao123/angular-tabler-icons/icons';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\n@Component({\r\n selector: 'date-time-picker-container',\r\n templateUrl: './container.component.html',\r\n styleUrls: ['./container.component.scss'],\r\n styles: `\r\n :host {\r\n height: 100%;\r\n }\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TablerIconComponent, NgTemplateOutlet, MatButtonModule],\r\n providers: [provideTablerIcons({ IconInfoCircle, IconCalendarDue, IconX, IconClock, IconLayoutSidebarLeftCollapse })]\r\n})\r\nexport class Container {\r\n hasHeader = model<boolean | undefined>(true);\r\n hasFooter = model<boolean | undefined>(true);\r\n headerTitle = model<string>('');\r\n\r\n headerExtraContent = model<TemplateRef<any> | undefined>();\r\n\r\n footerExtraContent = model<TemplateRef<any> | undefined>();\r\n hasDismiss = model<boolean | undefined>(true);\r\n hasSubmit = model<boolean | undefined>(true);\r\n submitTitle = model<string>('Save');\r\n submitBg = model<string>('');\r\n submitColor = model<string>('');\r\n submitTitleColor = model<string>('');\r\n disabledSubmit = model<boolean | undefined>(false);\r\n\r\n hasSecondaryButton = model<boolean | undefined>(false);\r\n secondaryButtonTitle = model<string>('');\r\n secondaryButtonBg = model<string>('');\r\n secondaryButtonColor = model<string>('');\r\n secondaryButtonTitleColor = model<string>('');\r\n disabledSecondaryButton = model<boolean | undefined>(false);\r\n\r\n dismiss = output<void>();\r\n submit = output<void>();\r\n secondaryButton = output<void>();\r\n}\r\n","<aside class=\"container-wrapper\">\r\n @if (hasHeader()) {\r\n <header class=\"container-header\">\r\n <div class=\"container-header-start\">\r\n <i-tabler name=\"clock\" strokeWidth=\"2px\" size=\"18px\" class=\"container-header-icon\" />\r\n\r\n @if (headerTitle()) {\r\n <h2 class=\"container-header-title\">{{ headerTitle() }}</h2>\r\n }\r\n </div>\r\n\r\n @if (headerExtraContent()) {\r\n <div class=\"container-header-extra\">\r\n <ng-container *ngTemplateOutlet=\"headerExtraContent() ?? null\"></ng-container>\r\n </div>\r\n }\r\n\r\n <button (click)=\"dismiss.emit()\" type=\"button\" class=\"container-header-close\" [attr.aria-label]=\"'关闭'\" tabindex=\"0\">\r\n <i-tabler name=\"x\" strokeWidth=\"2.5px\" size=\"18px\" class=\"container-header-close-icon\" />\r\n </button>\r\n </header>\r\n }\r\n\r\n <main class=\"container-main\">\r\n <ng-content />\r\n </main>\r\n\r\n @if (hasFooter()) {\r\n <footer class=\"container-footer\">\r\n @if (footerExtraContent()) {\r\n <div class=\"container-footer-extra\">\r\n <ng-container *ngTemplateOutlet=\"footerExtraContent() ?? null\"></ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"container-footer-actions\">\r\n @if (hasDismiss()) {\r\n <button mat-stroked-button color=\"primary\" (click)=\"dismiss.emit()\" type=\"button\"> 取消 </button>\r\n }\r\n\r\n @if (hasSecondaryButton()) {\r\n <button mat-stroked-button color=\"primary\" (click)=\"secondaryButton.emit()\" type=\"button\" [disabled]=\"disabledSecondaryButton()\">\r\n {{ secondaryButtonTitle() }}\r\n </button>\r\n }\r\n\r\n @if (hasSubmit()) {\r\n <button mat-raised-button color=\"primary\" (click)=\"submit.emit()\" type=\"button\" [disabled]=\"disabledSubmit()\">\r\n {{ submitTitle() }}\r\n </button>\r\n }\r\n </div>\r\n </footer>\r\n }\r\n</aside>\r\n","import { Component, input, output, ChangeDetectionStrategy, computed } from '@angular/core';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TablerIconComponent } from '@luoxiao123/angular-tabler-icons';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'date-time-input',\r\n templateUrl: './date-time-input.component.html',\r\n styleUrls: ['./date-time-input.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatDatepickerModule, FormsModule, TablerIconComponent, CommonModule]\r\n})\r\nexport class DateTimeInputComponent {\r\n label = input<string>('');\r\n dateValue = input<string | null>(null);\r\n hourValue = input<number | null>(null);\r\n minuteValue = input<number | null>(null);\r\n hours = input<number[]>([]);\r\n minutes = input<number[]>([]);\r\n\r\n dateChange = output<string>();\r\n hourChange = output<number | null>();\r\n minuteChange = output<number | null>();\r\n timeChange = output<void>();\r\n\r\n protected dateObj = computed(() => {\r\n const val = this.dateValue();\r\n return val ? new Date(val) : null;\r\n });\r\n\r\n onDateChange(value: Date | null) {\r\n if (value) {\r\n this.dateChange.emit(value.toISOString());\r\n }\r\n }\r\n\r\n onHourChange(value: number | null) {\r\n this.hourChange.emit(value);\r\n this.timeChange.emit();\r\n }\r\n\r\n onMinuteChange(value: number | null) {\r\n this.minuteChange.emit(value);\r\n this.timeChange.emit();\r\n }\r\n}\r\n","<div class=\"date-time-input-wrapper\">\r\n <label class=\"date-time-input-label\">{{ label() }}</label>\r\n\r\n <div class=\"date-time-input-container\">\r\n <!-- 日期部分 -->\r\n <div class=\"date-time-input-date\">\r\n <input\r\n type=\"text\"\r\n matInput\r\n [ngModel]=\"dateObj()\"\r\n (ngModelChange)=\"onDateChange($event)\"\r\n [matDatepicker]=\"datePicker\"\r\n (click)=\"datePicker.open()\"\r\n (focus)=\"datePicker.open()\"\r\n placeholder=\"选择日期\"\r\n class=\"date-time-input-field\"\r\n />\r\n <mat-datepicker #datePicker></mat-datepicker>\r\n\r\n <button type=\"button\" class=\"date-time-input-icon-btn\" tabindex=\"-1\" aria-hidden=\"true\">\r\n <i-tabler name=\"calendar-due\" strokeWidth=\"2px\" size=\"16px\" />\r\n </button>\r\n </div>\r\n\r\n <!-- 分隔符 -->\r\n <div class=\"date-time-input-divider\"></div>\r\n\r\n <!-- 时间部分 -->\r\n <div class=\"date-time-input-time\">\r\n <!-- 小时 -->\r\n <select class=\"date-time-input-select date-time-input-select-hour\" [ngModel]=\"hourValue()\" (ngModelChange)=\"onHourChange($event)\" [attr.aria-label]=\"'小时'\">\r\n <option [ngValue]=\"null\" disabled>--</option>\r\n @for (hour of hours(); track hour) {\r\n <option [ngValue]=\"hour\">{{ hour | number: '2.0-0' }}</option>\r\n }\r\n </select>\r\n\r\n <!-- 分隔符 -->\r\n <span class=\"date-time-input-separator\">:</span>\r\n\r\n <!-- 分钟 -->\r\n <select class=\"date-time-input-select date-time-input-select-minute\" [ngModel]=\"minuteValue()\" (ngModelChange)=\"onMinuteChange($event)\" [attr.aria-label]=\"'分钟'\">\r\n <option [ngValue]=\"null\" disabled>--</option>\r\n @for (minute of minutes(); track minute) {\r\n <option [ngValue]=\"minute\">{{ minute | number: '2.0-0' }}</option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n</div>\r\n","import { DateAdapter, MatDateFormats } from '@angular/material/core';\r\n\r\nexport function formatDate(date: Date, dateAdapter: DateAdapter<any>, dateFormats: MatDateFormats): string {\r\n const datePart = dateAdapter.format(date, dateFormats.display.dateInput);\r\n const hours = date.getHours().toString().padStart(2, '0');\r\n const minutes = date.getMinutes().toString().padStart(2, '0');\r\n return `${datePart} ${hours}:${minutes}`;\r\n}\r\n","import { TimeRange } from './interfaces';\r\n\r\nexport const DEFAULT_TIME_RANGES: TimeRange[] = [\r\n { label: '最近5分钟', start: 'offset:-5minutes', end: 'offset:now' },\r\n { label: '最近15分钟', start: 'offset:-15minutes', end: 'offset:now' },\r\n { label: '最近30分钟', start: 'offset:-30minutes', end: 'offset:now' },\r\n { label: '最近1小时', start: 'offset:-1hours', end: 'offset:now' },\r\n { label: '最近3小时', start: 'offset:-3hours', end: 'offset:now' },\r\n { label: '最近6小时', start: 'offset:-6hours', end: 'offset:now' },\r\n { label: '最近12小时', start: 'offset:-12hours', end: 'offset:now' },\r\n { label: '最近24小时', start: 'offset:-24hours', end: 'offset:now' },\r\n { label: '最近2天', start: 'offset:-2days', end: 'offset:now' },\r\n { label: '最近7天', start: 'offset:-7days', end: 'offset:now' },\r\n { label: '最近30天', start: 'offset:-30days', end: 'offset:now' },\r\n { label: '最近90天', start: 'offset:-90days', end: 'offset:now' },\r\n { label: '最近6个月', start: 'offset:-6months', end: 'offset:now' },\r\n { label: '最近1年', start: 'offset:-1years', end: 'offset:now' },\r\n { label: '最近2年', start: 'offset:-2years', end: 'offset:now' },\r\n { label: '最近5年', start: 'offset:-5years', end: 'offset:now' },\r\n { label: '昨天', start: 'offset:-1days/start', end: 'offset:-1days/end' },\r\n { label: '前天', start: 'offset:-2days/start', end: 'offset:-2days/end' },\r\n { label: '上周同一天', start: 'offset:-7days/start', end: 'offset:-7days/end' },\r\n { label: '今天', start: 'offset:0days/start', end: 'offset:0days/end' },\r\n { label: '今天至今', start: 'offset:0days/start', end: 'offset:now' },\r\n { label: '本周至今', start: 'startof:week', end: 'offset:now' },\r\n { label: '本月至今', start: 'startof:month', end: 'offset:now' },\r\n { label: '今年至今', start: 'startof:year', end: 'offset:now' }\r\n];\r\n\r\nexport const FUTURE_TIME_RANGES: TimeRange[] = [\r\n { label: '未来1天', start: 'offset:now', end: 'offset:+1days' },\r\n { label: '未来1周', start: 'offset:now', end: 'offset:+1weeks' },\r\n { label: '未来1月', start: 'offset:now', end: 'offset:+1months' },\r\n { label: '未来3月', start: 'offset:now', end: 'offset:+3months' }\r\n];\r\n","import { ChangeDetectionStrategy, Component, inject, model, OnInit, signal, ViewChild, computed } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { DatePickerModel, DateTimePickerValue, TimeRange } from '../interfaces';\r\nimport { TablerIconComponent } from '@luoxiao123/angular-tabler-icons';\r\nimport { DateRange, DefaultMatCalendarRangeStrategy, MatCalendar, MatDatepickerModule, MatRangeDateSelectionModel } from '@angular/material/datepicker';\r\nimport { Container } from '../components';\r\nimport { DateTimeInputComponent } from '../components';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { MatSidenavModule, MatSidenav } from '@angular/material/sidenav';\r\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';\r\nimport { formatDate } from '../until';\r\nimport { DEFAULT_TIME_RANGES, FUTURE_TIME_RANGES } from '../constants';\r\n\r\n@Component({\r\n selector: 'date-time-picker-selector',\r\n templateUrl: './date-selector.component.html',\r\n styleUrls: ['./date-selector.component.scss'],\r\n styles: `\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n `,\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n DefaultMatCalendarRangeStrategy,\r\n MatRangeDateSelectionModel\r\n ],\r\n imports: [\r\n MatCalendar,\r\n TablerIconComponent,\r\n MatDatepickerModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n Container,\r\n DateTimeInputComponent,\r\n MatSidenavModule,\r\n MatButtonModule\r\n ]\r\n})\r\nexport class DateSelector implements OnInit {\r\n readonly #dialogRef = inject(MatDialogRef<DateSelector>);\r\n readonly #data = inject(MAT_DIALOG_DATA) as DatePickerModel;\r\n readonly #selectionModel = inject(MatRangeDateSelectionModel<Date>);\r\n readonly #breakpoints = inject(BreakpointObserver);\r\n private _dateAdapter = inject(DateAdapter);\r\n private _dateFormats = inject(MAT_DATE_FORMATS);\r\n\r\n @ViewChild('sidenav') sidenav?: MatSidenav;\r\n\r\n isMobile = signal(false);\r\n\r\n public data = this.#data;\r\n\r\n startDate = model<string>('');\r\n endDate = model<string>('');\r\n\r\n startHour = model<number | null>(null);\r\n startMinute = model<number | null>(null);\r\n endHour = model<number | null>(null);\r\n endMinute = model<number | null>(null);\r\n\r\n future = model<boolean>(false);\r\n\r\n displayStart = computed(() => {\r\n const startStr = this.startDate();\r\n if (!startStr) return '';\r\n return formatDate(new Date(startStr), this._dateAdapter, this._dateFormats);\r\n });\r\n\r\n displayEnd = computed(() => {\r\n const endStr = this.endDate();\r\n if (!endStr) return '';\r\n return formatDate(new Date(endStr), this._dateAdapter, this._dateFormats);\r\n });\r\n\r\n timeRanges: TimeRange[] = [...DEFAULT_TIME_RANGES];\r\n selectedTimeRange = model<TimeRange | undefined>(undefined);\r\n\r\n selectedDateRange: DateRange<Date> | null = null;\r\n now = new Date();\r\n selectingStart = true;\r\n\r\n constructor() {\r\n this.#breakpoints\r\n .observe([Breakpoints.Handset, Breakpoints.Tablet])\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(result => {\r\n this.isMobile.set(result.matches);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.data) {\r\n this.future.set(this.data.future);\r\n\r\n const picker = this.data.dateTimePicker;\r\n\r\n if (picker) {\r\n if (picker.start && picker.end) {\r\n const start = new Date(picker.start);\r\n const end = new Date(picker.end);\r\n this.selectedDateRange = new DateRange(start, end);\r\n\r\n this.#selectionModel.updateSelection(this.selectedDateRange, this);\r\n\r\n // 初始化时间值\r\n this.startDate.set(picker.start);\r\n this.endDate.set(picker.end);\r\n this.startHour.set(start.getHours());\r\n this.startMinute.set(start.getMinutes());\r\n this.endHour.set(end.getHours());\r\n this.endMinute.set(end.getMinutes());\r\n }\r\n }\r\n\r\n if (this.future()) {\r\n this.timeRanges = [...this.timeRanges, ...FUTURE_TIME_RANGES];\r\n }\r\n }\r\n \r\n if (!this.data?.dateTimePicker) {\r\n this.selectTimeRange(this.timeRanges[5]);\r\n }\r\n }\r\n\r\n selectTimeRange(timeRange: TimeRange): void {\r\n this.selectedTimeRange.set(timeRange);\r\n const { startDate, endDate } = this.processTimeRange(timeRange);\r\n const start = new Date(startDate);\r\n const end = new Date(endDate);\r\n\r\n this.startDate.set(start.toISOString());\r\n this.endDate.set(end.toISOString());\r\n this.startHour.set(start.getHours());\r\n this.startMinute.set(start.getMinutes());\r\n this.endHour.set(end.getHours());\r\n this.endMinute.set(end.getMinutes());\r\n this.selectedDateRange = new DateRange<Date>(start, end);\r\n }\r\n\r\n private processTimeRange(timeRange: TimeRange): { startDate: string; endDate: string } {\r\n const now = new Date();\r\n const parseTime = (time: string): Date => {\r\n if (!time) return new Date(now);\r\n\r\n // 处理 startof: 前缀 (本周/本月/今年)\r\n if (time.startsWith('startof:')) {\r\n const unit = time.replace('startof:', '').trim().toLowerCase();\r\n const result = new Date(now);\r\n result.setHours(0, 0, 0, 0);\r\n\r\n switch (unit) {\r\n case 'week':\r\n // 假设周一为一周的开始\r\n const day = result.getDay() || 7; // 0是周日,改为7\r\n if (day !== 1) {\r\n result.setHours(-24 * (day - 1));\r\n }\r\n break;\r\n case 'month':\r\n result.setDate(1);\r\n break;\r\n case 'year':\r\n result.setMonth(0, 1);\r\n break;\r\n }\r\n return result;\r\n }\r\n\r\n // 处理 offset: 前缀\r\n if (time.startsWith('offset:')) {\r\n const offsetStr = time.replace('offset:', '').trim();\r\n if (offsetStr === 'now') return new Date(now);\r\n\r\n // 检查是否有 /start 或 /end 后缀\r\n let suffix = '';\r\n let cleanOffset = offsetStr;\r\n if (offsetStr.endsWith('/start')) {\r\n suffix = 'start';\r\n cleanOffset = offsetStr.replace('/start', '');\r\n } else if (offsetStr.endsWith('/end')) {\r\n suffix = 'end';\r\n cleanOffset = offsetStr.replace('/end', '');\r\n }\r\n\r\n const regex = /([+-]?)(\\d+)(months?|days?|years?|weeks?|hours?|minutes?)/i;\r\n const match = regex.exec(cleanOffset);\r\n \r\n // 如果没有匹配到数字偏移量,但有后缀(例如 offset:0days/start),尝试解析\r\n // 注意:上面的正则也能匹配 0days\r\n \r\n const result = new Date(now);\r\n \r\n if (match) {\r\n const sign = match[1] === '-' ? -1 : 1;\r\n const value = parseInt(match[2], 10) * sign;\r\n const unit = match[3].toLowerCase();\r\n\r\n switch (unit) {\r\n case 'minutes':\r\n case 'minute':\r\n result.setMinutes(result.getMinutes() + value);\r\n break;\r\n case 'hours':\r\n case 'hour':\r\n result.setHours(result.getHours() + value);\r\n break;\r\n case 'days':\r\n case 'day':\r\n result.setDate(result.getDate() + value);\r\n break;\r\n case 'weeks':\r\n case 'week':\r\n result.setDate(result.getDate() + value * 7);\r\n break;\r\n case 'months':\r\n case 'month':\r\n result.setMonth(result.getMonth() + value);\r\n break;\r\n case 'years':\r\n case 'year':\r\n result.setFullYear(result.getFullYear() + value);\r\n break;\r\n }\r\n }\r\n\r\n // 应用后缀修正\r\n if (suffix === 'start') {\r\n result.setHours(0, 0, 0, 0);\r\n } else if (suffix === 'end') {\r\n result.setHours(23, 59, 59, 999);\r\n }\r\n\r\n return result;\r\n }\r\n return new Date(time);\r\n };\r\n\r\n const startDate = timeRange.start ? parseTime(timeRange.start) : null;\r\n const endDate = timeRange.end ? parseTime(timeRange.end) : now;\r\n\r\n return {\r\n startDate: (startDate ?? endDate).toISOString(),\r\n endDate: endDate.toISOString()\r\n };\r\n }\r\n\r\n changeDatePart(part: 'start' | 'end', date: Date | string): void {\r\n if (!date) return;\r\n\r\n let dateObj: Date;\r\n\r\n if (typeof date === 'string') {\r\n // 如果是字符串,尝试解析它\r\n dateObj = new Date(date);\r\n // 如果不能解析为有效日期,返回\r\n if (isNaN(dateObj.getTime())) return;\r\n } else {\r\n dateObj = new Date(date);\r\n }\r\n\r\n // 保持原有的时间部分(只修改日期部分)\r\n if (part === 'start') {\r\n const currentStart = this.selectedDateRange?.start;\r\n if (currentStart) {\r\n dateObj.setHours(currentStart.getHours(), currentStart.getMinutes(), currentStart.getSeconds());\r\n } else {\r\n dateObj.setHours(0, 0, 0, 0);\r\n }\r\n } else {\r\n const currentEnd = this.selectedDateRange?.end;\r\n if (currentEnd) {\r\n dateObj.setHours(currentEnd.getHours(), currentEnd.getMinutes(), currentEnd.getSeconds());\r\n } else {\r\n dateObj.setHours(0, 0, 0, 0);\r\n }\r\n }\r\n\r\n this.selectedTimeRange.set(undefined);\r\n\r\n let start = this.selectedDateRange?.start ?? null;\r\n let end = this.selectedDateRange?.end ?? null;\r\n\r\n if (part === 'start') {\r\n start = dateObj;\r\n } else {\r\n end = dateObj;\r\n }\r\n\r\n if (start && end && start.getTime() > end.getTime()) {\r\n [start, end] = [end, start];\r\n }\r\n\r\n const range = new DateRange<Date>(start, end);\r\n this.selectedDateRange = range;\r\n this.startDate.set(start?.toISOString() ?? '');\r\n this.endDate.set(end?.toISOString() ?? '');\r\n\r\n if (start) {\r\n this.startHour.set(start.getHours());\r\n this.startMinute.set(start.getMinutes());\r\n } else {\r\n this.startHour.set(null);\r\n this.startMinute.set(null);\r\n }\r\n\r\n if (end) {\r\n this.endHour.set(end.getHours());\r\n this.endMinute.set(end.getMinutes());\r\n } else {\r\n this.endHour.set(null);\r\n this.endMinute.set(null);\r\n }\r\n }\r\n\r\n rangeChanged(selectedDate: Date | null): void {\r\n if (!selectedDate) return;\r\n\r\n if (this.selectingStart) {\r\n // 正在选择开始日期\r\n let h = 0, m = 0, s = 0, ms = 0;\r\n // 尝试保留之前的开始时间\r\n if (this.selectedDateRange?.start) {\r\n h = this.selectedDateRange.start.getHours();\r\n m = this.selectedDateRange.start.getMinutes();\r\n s = this.selectedDateRange.start.getSeconds();\r\n }\r\n\r\n const newStart = new Date(selectedDate);\r\n newStart.setHours(h, m, s, ms);\r\n\r\n this.startDate.set(newStart.toISOString());\r\n this.endDate.set('');\r\n this.startHour.set(newStart.getHours());\r\n this.startMinute.set(newStart.getMinutes());\r\n this.endHour.set(null);\r\n this.endMinute.set(null);\r\n this.selectedTimeRange.set(undefined);\r\n this.selectedDateRange = new DateRange(newStart, null);\r\n this.#selectionModel.updateSelection(this.selectedDateRange, this);\r\n this.selectingStart = false;\r\n } else {\r\n // 正在选择结束日期\r\n const start = this.#selectionModel.selection.start;\r\n if (!start) return;\r\n\r\n const startDay = new Date(start.getFullYear(), start.getMonth(), start.getDate());\r\n const selectedDay = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate());\r\n\r\n let newStart: Date;\r\n let newEnd: Date;\r\n\r\n if (selectedDay.getTime() < startDay.getTime()) {\r\n // 用户选了一个比 Start 更早的日期 -> 交换角色\r\n // 新 Start (selectedDate) 设为 00:00\r\n newStart = new Date(selectedDate);\r\n newStart.setHours(0, 0, 0, 0);\r\n\r\n // 新 End (旧 start) 设为 23:59\r\n newEnd = new Date(start);\r\n newEnd.setHours(23, 59, 59, 999);\r\n } else {\r\n // 正常顺序 (selectedDate >= start)\r\n // Start 保持原样\r\n newStart = new Date(start);\r\n\r\n // End (selectedDate) 设为 23:59\r\n newEnd = new Date(selectedDate);\r\n newEnd.setHours(23, 59, 59, 999);\r\n \r\n // 如果是同一天,确保 Start <= End\r\n if (newStart.getTime() > newEnd.getTime()) {\r\n newStart.setHours(0, 0, 0, 0);\r\n }\r\n }\r\n\r\n this.updateSelection(newStart, newEnd);\r\n this.selectingStart = true;\r\n }\r\n }\r\n\r\n updateSelection(start: Date, end: Date): void {\r\n const range = new DateRange(start, end);\r\n this.selectedDateRange = range;\r\n this.#selectionModel.updateSelection(range, this);\r\n this.startDate.set(start.toISOString());\r\n this.endDate.set(end.toISOString());\r\n this.startHour.set(start.getHours());\r\n this.startMinute.set(start.getMinutes());\r\n this.endHour.set(end.getHours());\r\n this.endMinute.set(end.getMinutes());\r\n }\r\n\r\n submit(): void {\r\n if (!this.selectedDateRange?.start || !this.selectedDateRange?.end) {\r\n return;\r\n }\r\n\r\n const start = new Date(this.selectedDateRange.start);\r\n const end = new Date(this.selectedDateRange.end);\r\n\r\n if (isNaN(start.getTime()) || isNaN(end.getTime())) {\r\n return;\r\n }\r\n\r\n const result: DateTimePickerValue = {\r\n start: start.toISOString(),\r\n end: end.toISOString()\r\n };\r\n\r\n this.data = { ...this.data, dateTimePicker: result };\r\n this.#dialogRef.close(this.data);\r\n }\r\n\r\n dismiss(): void {\r\n this.#dialogRef.close(undefined);\r\n }\r\n\r\n readonly hours = Array.from({ length: 24 }, (_, i) => i);\r\n readonly minutes = Array.from({ length: 60 }, (_, i) => i);\r\n\r\n updateStartTime(): void {\r\n if (this.selectedDateRange?.start && this.startHour() !== null && this.startMinute() !== null) {\r\n const startDate = new Date(this.selectedDateRange.start);\r\n startDate.setHours(this.startHour() ?? 0, this.startMinute() ?? 0, 0, 0);\r\n\r\n let endDate = this.selectedDateRange.end;\r\n const range = new DateRange(startDate, endDate);\r\n this.selectedDateRange = range;\r\n this.#selectionModel.updateSelection(range, this);\r\n this.startDate.set(startDate.toISOString());\r\n }\r\n }\r\n\r\n updateEndTime(): void {\r\n if (this.selectedDateRange?.end && this.endHour() !== null && this.endMinute() !== null) {\r\n const endDate = new Date(this.selectedDateRange.end);\r\n endDate.setHours(this.endHour() ?? 0, this.endMinute() ?? 0, 0, 0);\r\n\r\n let startDate = this.selectedDateRange.start;\r\n const range = new DateRange(startDate, endDate);\r\n this.selectedDateRange = range;\r\n this.#selectionModel.updateSelection(range, this);\r\n this.endDate.set(endDate.toISOString());\r\n }\r\n }\r\n}\r\n","<date-time-picker-container\r\n headerTitle=\"日期时间选择器\"\r\n submitTitle=\"应用\"\r\n [disabledSubmit]=\"!selectedDateRange\"\r\n [footerExtraContent]=\"footerExtraContent\"\r\n (submit)=\"submit()\"\r\n (dismiss)=\"dismiss()\"\r\n>\r\n <mat-sidenav-container class=\"date-selector-sidenav-container\">\r\n <!-- 左侧快捷选择面板 -->\r\n <mat-sidenav #sidenav [mode]=\"isMobile() ? 'over' : 'side'\" [opened]=\"!isMobile()\" class=\"date-selector-sidebar\" dir=\"rtl\">\r\n <div class=\"date-selector-sidebar-inner\" dir=\"ltr\">\r\n <div class=\"date-selector-sidebar-header\">\r\n <span class=\"date-selector-sidebar-title\">快捷选择</span>\r\n @if (isMobile()) {\r\n <button mat-icon-button (click)=\"sidenav.close()\">\r\n <i-tabler name=\"layout-sidebar-left-collapse\" />\r\n </button>\r\n }\r\n </div>\r\n <ul class=\"date-selector-sidebar-list\">\r\n @for (timeRangeItem of timeRanges; track timeRangeItem) {\r\n <li class=\"date-selector-sidebar-item\">\r\n <button\r\n type=\"button\"\r\n (click)=\"selectTimeRange(timeRangeItem); isMobile() && sidenav.close()\"\r\n [class.selected]=\"selectedTimeRange() && selectedTimeRange()?.start === timeRangeItem.start && selectedTimeRange()?.end === timeRangeItem.end\"\r\n class=\"date-selector-sidebar-btn\"\r\n >\r\n <span class=\"date-selector-sidebar-text\">{{ timeRangeItem.label }}</span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </mat-sidenav>\r\n <!-- 左侧快捷选择面板结束 -->\r\n\r\n <mat-sidenav-content>\r\n @if (isMobile()) {\r\n <div class=\"date-selector-mobile-toolbar\">\r\n <button mat-button (click)=\"sidenav.open()\">\r\n <span>快捷选择</span>\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- 主要内容区域 -->\r\n <div class=\"date-selector-main\">\r\n <div class=\"date-selector-content\">\r\n <!-- 日历容器 -->\r\n <section class=\"date-selector-calendar-section\">\r\n <div class=\"date-selector-calendar-wrapper\">\r\n <mat-calendar [maxDate]=\"!future() ? now : undefined\" [(selected)]=\"selectedDateRange\" (selectedChange)=\"rangeChanged($event)\" class=\"date-selector-calendar\" />\r\n </div>\r\n </section>\r\n <!-- 日历容器结束 -->\r\n\r\n <!-- 时间设置容器 -->\r\n <section class=\"date-selector-time-section\">\r\n <!-- 开始和结束输入日期 -->\r\n <div class=\"date-selector-inputs\">\r\n <!-- 从日期 -->\r\n <date-time-input\r\n label=\"开始日期\"\r\n [dateValue]=\"startDate()\"\r\n [hourValue]=\"startHour()\"\r\n (hourChange)=\"startHour.set($event)\"\r\n [minuteValue]=\"startMinute()\"\r\n (minuteChange)=\"startMinute.set($event)\"\r\n [hours]=\"hours\"\r\n [minutes]=\"minutes\"\r\n (dateChange)=\"changeDatePart('start', $event)\"\r\n (timeChange)=\"updateStartTime()\"\r\n />\r\n\r\n <!-- 结束日期 -->\r\n <date-time-input\r\n label=\"结束日期\"\r\n [dateValue]=\"endDate()\"\r\n [hourValue]=\"endHour()\"\r\n (hourChange)=\"endHour.set($event)\"\r\n [minuteValue]=\"endMinute()\"\r\n (minuteChange)=\"endMinute.set($event)\"\r\n [hours]=\"hours\"\r\n [minutes]=\"minutes\"\r\n (dateChange)=\"changeDatePart('end', $event)\"\r\n (timeChange)=\"updateEndTime()\"\r\n />\r\n </div>\r\n\r\n <div class=\"date-selector-hint-wrapper\">\r\n <div class=\"date-selector-hint\">\r\n <i-tabler name=\"info-circle\" strokeWidth=\"2px\" class=\"date-selector-hint-icon\"></i-tabler>\r\n <span class=\"date-selector-hint-text\">如果要选择一天,请双击该天。</span>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n</date-time-picker-container>\r\n\r\n<ng-template #footerExtraContent>\r\n <div class=\"date-selector-footer-range\">\r\n <span class=\"date-selector-footer-label\">范围:</span>\r\n\r\n @if (startDate()) {\r\n <div class=\"date-selector-footer-value\">\r\n @if (startDate()) {\r\n <span class=\"date-selector-footer-date\">{{ displayStart() }}</span>\r\n }\r\n\r\n @if (startDate() && endDate()) {\r\n <span class=\"date-selector-footer-separator\">-</span>\r\n }\r\n\r\n @if (endDate()) {\r\n <span class=\"date-selector-footer-date\">{{ displayEnd() }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, input, model, output, signal, ViewChild, ElementRef, Input, forwardRef, computed, Injector, untracked } from '@angular/core';\r\nimport { take, tap } from 'rxjs';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { DatePickerModel, DateTimePickerValue } from './interfaces';\r\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { TablerIconComponent, provideTablerIcons } from '@luoxiao123/angular-tabler-icons';\r\nimport { IconCalendarDue, IconX } from '@luoxiao123/angular-tabler-icons/icons';\r\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { Subject } from 'rxjs';\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { DateSelector } from './date-selector/date-selector.component';\r\nimport { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';\r\nimport { formatDate } from './until';\r\n\r\n@Component({\r\n selector: 'date-time-picker',\r\n templateUrl: './date-picker.component.html',\r\n styleUrls: ['./date-picker.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TablerIconComponent, MatDatepickerModule, MatDialogModule],\r\n providers: [\r\n provideTablerIcons({ IconCalendarDue, IconX }),\r\n {\r\n provide: MatFormFieldControl,\r\n useExisting: forwardRef(() => DatePickerComponent)\r\n }\r\n ]\r\n})\r\nexport class DatePickerComponent implements ControlValueAccessor, MatFormFieldControl<DateTimePickerValue | null> {\r\n readonly #breakpoints = inject(BreakpointObserver);\r\n readonly #dialog = inject(MatDialog);\r\n readonly #focusMonitor = inject(FocusMonitor);\r\n readonly #elementRef = inject(ElementRef);\r\n readonly #injector = inject(Injector);\r\n private _dateAdapter = inject(DateAdapter);\r\n private _dateFormats = inject(MAT_DATE_FORMATS);\r\n\r\n protected destroyRef = inject(DestroyRef);\r\n\r\n @ViewChild('dateRangeButton') dateRangeButton?: ElementRef<HTMLButtonElement>;\r\n\r\n ngControl = inject(NgControl, { optional: true, self: true });\r\n\r\n @Input() required: boolean = false;\r\n disabledInput = input<boolean>(false, { alias: 'disabled' });\r\n private _formDisabled = signal(false);\r\n @Input() placeholder: string = '';\r\n future = input<boolean>(false);\r\n\r\n selectedDateRange = model<DateRange<Date> | undefined>();\r\n\r\n selectionChange = output<DateTimePickerValue | undefined>();\r\n\r\n // 内部值存储:{start: string, end: string} 或 null/undefined\r\n #internalValue = signal<DateTimePickerValue | null | undefined>(undefined);\r\n\r\n // MatFormFieldControl 属性\r\n readonly stateChanges = new Subject<void>();\r\n readonly #errorStateSignal = signal(false);\r\n readonly #focusedSignal = signal(false);\r\n readonly #id = signal<string>(`date-time-picker-${Math.random().toString(36).substr(2, 9)}`);\r\n\r\n // ControlValueAccessor 回调函数\r\n private onChange?: (value: any) => void;\r\n private onTouched?: () => void;\r\n\r\n protected displayStart = computed(() => {\r\n const range = this.selectedDateRange();\r\n if (!range?.start) return '';\r\n return formatDate(range.start, this._dateAdapter, this._dateFormats);\r\n });\r\n\r\n protected displayEnd = computed(() => {\r\n const range = this.selectedDateRange();\r\n if (!range?.end) return '';\r\n return formatDate(range.end, this._dateAdapter, this._dateFormats);\r\n });\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n this.ngControl.statusChanges?.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n // 监听 focus 事件\r\n this.#focusMonitor\r\n .monitor(this.#elementRef, true)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(origin => {\r\n const isFocused = !!origin;\r\n this.#focusedSignal.set(isFocused);\r\n this.stateChanges.next();\r\n if (!isFocused) {\r\n this.onTouched?.();\r\n }\r\n });\r\n\r\n effect(() => {\r\n this.disabledInput();\r\n untracked(() => this.stateChanges.next());\r\n });\r\n }\r\n\r\n ref = effect((): void => {\r\n this.selectedDateRange();\r\n // 触发 MatFormField 更新\r\n untracked(() => this.stateChanges.next());\r\n });\r\n\r\n openDateDialogSelector(): void {\r\n const isMobile = this.#breakpoints.isMatched([Breakpoints.Handset, Breakpoints.Tablet]);\r\n const currentValue = this.#internalValue();\r\n const data: DatePickerModel = {\r\n dateTimePicker: currentValue ?? undefined,\r\n future: this.future()\r\n };\r\n\r\n const dialogRef = this.#dialog.open(DateSelector, {\r\n width: isMobile ? '100%' : '850px',\r\n height: isMobile ? '90vh' : '520px',\r\n maxWidth: '100vw',\r\n maxHeight: '100vh',\r\n data,\r\n disableClose: false,\r\n panelClass: 'date-time-picker-dialog',\r\n injector: this.#injector\r\n });\r\n\r\n dialogRef\r\n .afterClosed()\r\n .pipe(\r\n take(1),\r\n takeUntilDestroyed(this.destroyRef),\r\n tap((result: DatePickerModel | undefined): void => {\r\n if (result && result.dateTimePicker) {\r\n const start = new Date(result.dateTimePicker.start);\r\n const end = new Date(result.dateTimePicker.end);\r\n \r\n const startStr = formatDate(start, this._dateAdapter, this._dateFormats);\r\n const endStr = formatDate(end, this._dateAdapter, this._dateFormats);\r\n\r\n const rangeValue: DateTimePickerValue = {\r\n start: startStr,\r\n end: endStr\r\n };\r\n this.#internalValue.set(rangeValue);\r\n // 更新显示用的日期范围\r\n this.selectedDateRange.set(new DateRange(start, end));\r\n // 发出用户手动选择的值\r\n this.selectionChange.emit(rangeValue);\r\n // 通知表单控件\r\n if (this.onChange) {\r\n this.onChange(rangeValue);\r\n }\r\n }\r\n\r\n this.onTouched?.();\r\n })\r\n )\r\n .subscribe();\r\n }\r\n\r\n // ControlValueAccessor 实现\r\n writeValue(value: any): void {\r\n // 处理各种值类型:null, undefined, '', {start, end}\r\n if (value === null || value === undefined || value === '') {\r\n this.#internalValue.set(null);\r\n this.selectedDateRange.set(undefined);\r\n } else if (typeof value === 'object' && value.start && value.end) {\r\n this.#internalValue.set(value);\r\n // 尝试转换为 Date 对象以显示在选择器中\r\n try {\r\n const startDate = new Date(value.start);\r\n const endDate = new Date(value.end);\r\n if (!isNaN(startDate.getTime()) && !isNaN(endDate.getTime())) {\r\n this.selectedDateRange.set(new DateRange(startDate, endDate));\r\n }\r\n } catch (e) {\r\n console.warn('Failed to parse date values:', value);\r\n }\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: any) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._formDisabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n get disabled(): boolean {\r\n return this.disabledInput() || this._formDisabled();\r\n }\r\n\r\n // MatFormFieldControl 实现\r\n get empty(): boolean {\r\n return !this.#internalValue();\r\n }\r\n\r\n get shouldPlaceholderFloat(): boolean {\r\n return this.shouldLabelFloat;\r\n }\r\n\r\n get focused(): boolean {\r\n return this.#focusedSignal();\r\n }\r\n\r\n get errorState(): boolean {\r\n return this.#errorStateSignal() || (!!this.ngControl?.invalid && (!!this.ngControl?.touched || !!this.ngControl?.dirty));\r\n }\r\n\r\n get shouldLabelFloat(): boolean {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n get id(): string {\r\n return this.#id();\r\n }\r\n\r\n set value(val: DateTimePickerValue | undefined) {\r\n if (!val) {\r\n this.#internalValue.set(null);\r\n } else {\r\n this.#internalValue.set(val);\r\n this.selectedDateRange.set(new DateRange(new Date(val.start), new Date(val.end)));\r\n }\r\n this.stateChanges.next();\r\n }\r\n\r\n get value(): any {\r\n return this.#internalValue();\r\n }\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n // Material form field 使用此方法将错误 ID 传递给控件\r\n }\r\n\r\n onContainerClick(event: MouseEvent): void {\r\n if ((event.target as HTMLElement).tagName.toLowerCase() !== 'button') {\r\n this.dateRangeButton?.nativeElement.focus();\r\n }\r\n }\r\n\r\n clear(event?: Event): void {\r\n event?.stopPropagation();\r\n this.selectedDateRange.set(undefined);\r\n this.#internalValue.set(null);\r\n this.onChange?.(null);\r\n this.onTouched?.();\r\n this.selectionChange.emit(undefined);\r\n this.stateChanges.next();\r\n }\r\n}\r\n","<div\r\n #dateRangeButton\r\n [attr.id]=\"id\"\r\n [attr.aria-label]=\"'选择日期时间范围'\"\r\n [attr.aria-disabled]=\"disabled\"\r\n (click)=\"!disabled && openDateDialogSelector()\"\r\n (keydown.enter)=\"!disabled && openDateDialogSelector()\"\r\n (keydown.space)=\"!disabled && openDateDialogSelector()\"\r\n [tabindex]=\"disabled ? -1 : 0\"\r\n [attr.role]=\"'button'\"\r\n class=\"date-range-container\"\r\n>\r\n @if (selectedDateRange()) {\r\n <div class=\"date-range-content\">\r\n <span class=\"date-range-value\">{{ displayStart() }}</span>\r\n <span class=\"date-range-separator\"> ~ </span>\r\n <span class=\"date-range-value\">{{ displayEnd() }}</span>\r\n </div>\r\n } @else if (placeholder) {\r\n <span class=\"date-range-placeholder\">{{ placeholder }}</span>\r\n } @else {\r\n <div class=\"date-range-content\"></div>\r\n }\r\n\r\n <div class=\"date-range-actions\">\r\n @if (selectedDateRange() && !disabled) {\r\n <button\r\n (click)=\"clear($event)\"\r\n type=\"button\"\r\n class=\"date-range-clear-btn\"\r\n [attr.aria-label]=\"'清除日期选择'\"\r\n [tabindex]=\"disabled ? -1 : 0\"\r\n [disabled]=\"disabled\"\r\n (keydown.enter)=\"clear($event)\"\r\n (keydown.space)=\"clear($event)\"\r\n [attr.role]=\"'button'\"\r\n >\r\n <i-tabler name=\"x\" strokeWidth=\"2.5px\" size=\"18px\" class=\"date-range-icon\" />\r\n </button>\r\n }\r\n\r\n <i-tabler name=\"calendar-due\" strokeWidth=\"2px\" size=\"18px\" class=\"date-range-icon\" />\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3"],"mappings":"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"}
1
+ {"version":3,"file":"luoxiao123-angular-material-date-time-range-picker.mjs","sources":["../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/components/container/container.component.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/components/container/container.component.html","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/components/date-time-input/date-time-input.component.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/components/date-time-input/date-time-input.component.html","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/until/index.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/constants.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/date-selector/date-selector.component.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/date-selector/date-selector.component.html","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/date-picker.component.ts","../../../projects/angular-material-date-time-range-picker/src/lib/date-picker/date-picker.component.html","../../../projects/angular-material-date-time-range-picker/src/luoxiao123-angular-material-date-time-range-picker.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, model, output, TemplateRef } from '@angular/core';\r\nimport { TablerIconComponent, provideTablerIcons } from '@luoxiao123/angular-tabler-icons';\r\nimport { IconX, IconClock, IconCalendarDue, IconInfoCircle, IconLayoutSidebarLeftCollapse } from '@luoxiao123/angular-tabler-icons/icons';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\n@Component({\r\n selector: 'date-time-picker-container',\r\n templateUrl: './container.component.html',\r\n styleUrls: ['./container.component.scss'],\r\n styles: `\r\n :host {\r\n height: 100%;\r\n }\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TablerIconComponent, NgTemplateOutlet, MatButtonModule],\r\n providers: [provideTablerIcons({ IconInfoCircle, IconCalendarDue, IconX, IconClock, IconLayoutSidebarLeftCollapse })]\r\n})\r\nexport class Container {\r\n hasHeader = model<boolean | undefined>(true);\r\n hasFooter = model<boolean | undefined>(true);\r\n headerTitle = model<string>('');\r\n\r\n headerExtraContent = model<TemplateRef<any> | undefined>();\r\n\r\n footerExtraContent = model<TemplateRef<any> | undefined>();\r\n hasDismiss = model<boolean | undefined>(true);\r\n hasSubmit = model<boolean | undefined>(true);\r\n submitTitle = model<string>('Save');\r\n submitBg = model<string>('');\r\n submitColor = model<string>('');\r\n submitTitleColor = model<string>('');\r\n disabledSubmit = model<boolean | undefined>(false);\r\n\r\n hasSecondaryButton = model<boolean | undefined>(false);\r\n secondaryButtonTitle = model<string>('');\r\n secondaryButtonBg = model<string>('');\r\n secondaryButtonColor = model<string>('');\r\n secondaryButtonTitleColor = model<string>('');\r\n disabledSecondaryButton = model<boolean | undefined>(false);\r\n\r\n dismiss = output<void>();\r\n submit = output<void>();\r\n secondaryButton = output<void>();\r\n}\r\n","<aside class=\"container-wrapper\">\r\n @if (hasHeader()) {\r\n <header class=\"container-header\">\r\n <div class=\"container-header-start\">\r\n <i-tabler name=\"clock\" strokeWidth=\"2px\" size=\"18px\" class=\"container-header-icon\" />\r\n\r\n @if (headerTitle()) {\r\n <h2 class=\"container-header-title\">{{ headerTitle() }}</h2>\r\n }\r\n </div>\r\n\r\n @if (headerExtraContent()) {\r\n <div class=\"container-header-extra\">\r\n <ng-container *ngTemplateOutlet=\"headerExtraContent() ?? null\"></ng-container>\r\n </div>\r\n }\r\n\r\n <button (click)=\"dismiss.emit()\" type=\"button\" class=\"container-header-close\" [attr.aria-label]=\"'关闭'\" tabindex=\"0\">\r\n <i-tabler name=\"x\" strokeWidth=\"2.5px\" size=\"18px\" class=\"container-header-close-icon\" />\r\n </button>\r\n </header>\r\n }\r\n\r\n <main class=\"container-main\">\r\n <ng-content />\r\n </main>\r\n\r\n @if (hasFooter()) {\r\n <footer class=\"container-footer\">\r\n @if (footerExtraContent()) {\r\n <div class=\"container-footer-extra\">\r\n <ng-container *ngTemplateOutlet=\"footerExtraContent() ?? null\"></ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"container-footer-actions\">\r\n @if (hasDismiss()) {\r\n <button mat-stroked-button color=\"primary\" (click)=\"dismiss.emit()\" type=\"button\"> 取消 </button>\r\n }\r\n\r\n @if (hasSecondaryButton()) {\r\n <button mat-stroked-button color=\"primary\" (click)=\"secondaryButton.emit()\" type=\"button\" [disabled]=\"disabledSecondaryButton()\">\r\n {{ secondaryButtonTitle() }}\r\n </button>\r\n }\r\n\r\n @if (hasSubmit()) {\r\n <button mat-raised-button color=\"primary\" (click)=\"submit.emit()\" type=\"button\" [disabled]=\"disabledSubmit()\">\r\n {{ submitTitle() }}\r\n </button>\r\n }\r\n </div>\r\n </footer>\r\n }\r\n</aside>\r\n","import { Component, input, output, ChangeDetectionStrategy, computed } from '@angular/core';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TablerIconComponent } from '@luoxiao123/angular-tabler-icons';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'date-time-input',\r\n templateUrl: './date-time-input.component.html',\r\n styleUrls: ['./date-time-input.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatDatepickerModule, FormsModule, TablerIconComponent, CommonModule]\r\n})\r\nexport class DateTimeInputComponent {\r\n label = input<string>('');\r\n dateValue = input<string | null>(null);\r\n hourValue = input<number | null>(null);\r\n minuteValue = input<number | null>(null);\r\n hours = input<number[]>([]);\r\n minutes = input<number[]>([]);\r\n\r\n dateChange = output<string>();\r\n hourChange = output<number | null>();\r\n minuteChange = output<number | null>();\r\n timeChange = output<void>();\r\n\r\n protected dateObj = computed(() => {\r\n const val = this.dateValue();\r\n return val ? new Date(val) : null;\r\n });\r\n\r\n onDateChange(value: Date | null) {\r\n if (value) {\r\n this.dateChange.emit(value.toISOString());\r\n }\r\n }\r\n\r\n onHourChange(value: number | null) {\r\n this.hourChange.emit(value);\r\n this.timeChange.emit();\r\n }\r\n\r\n onMinuteChange(value: number | null) {\r\n this.minuteChange.emit(value);\r\n this.timeChange.emit();\r\n }\r\n}\r\n","<div class=\"date-time-input-wrapper\">\r\n <label class=\"date-time-input-label\">{{ label() }}</label>\r\n\r\n <div class=\"date-time-input-container\">\r\n <!-- 日期部分 -->\r\n <div class=\"date-time-input-date\">\r\n <input\r\n type=\"text\"\r\n matInput\r\n [ngModel]=\"dateObj()\"\r\n (ngModelChange)=\"onDateChange($event)\"\r\n [matDatepicker]=\"datePicker\"\r\n (click)=\"datePicker.open()\"\r\n (focus)=\"datePicker.open()\"\r\n placeholder=\"选择日期\"\r\n class=\"date-time-input-field\"\r\n />\r\n <mat-datepicker #datePicker></mat-datepicker>\r\n\r\n <button type=\"button\" class=\"date-time-input-icon-btn\" tabindex=\"-1\" aria-hidden=\"true\">\r\n <i-tabler name=\"calendar-due\" strokeWidth=\"2px\" size=\"16px\" />\r\n </button>\r\n </div>\r\n\r\n <!-- 分隔符 -->\r\n <div class=\"date-time-input-divider\"></div>\r\n\r\n <!-- 时间部分 -->\r\n <div class=\"date-time-input-time\">\r\n <!-- 小时 -->\r\n <select class=\"date-time-input-select date-time-input-select-hour\" [ngModel]=\"hourValue()\" (ngModelChange)=\"onHourChange($event)\" [attr.aria-label]=\"'小时'\">\r\n <option [ngValue]=\"null\" disabled>--</option>\r\n @for (hour of hours(); track hour) {\r\n <option [ngValue]=\"hour\">{{ hour | number: '2.0-0' }}</option>\r\n }\r\n </select>\r\n\r\n <!-- 分隔符 -->\r\n <span class=\"date-time-input-separator\">:</span>\r\n\r\n <!-- 分钟 -->\r\n <select class=\"date-time-input-select date-time-input-select-minute\" [ngModel]=\"minuteValue()\" (ngModelChange)=\"onMinuteChange($event)\" [attr.aria-label]=\"'分钟'\">\r\n <option [ngValue]=\"null\" disabled>--</option>\r\n @for (minute of minutes(); track minute) {\r\n <option [ngValue]=\"minute\">{{ minute | number: '2.0-0' }}</option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n</div>\r\n","import { DateAdapter, MatDateFormats } from '@angular/material/core';\r\n\r\n/**\r\n * 格式化日期对象为字符串\r\n * \r\n * 将给定的 Date 对象格式化为包含日期和时间的字符串。\r\n * 日期部分使用提供的 DateAdapter 和 MatDateFormats 进行格式化。\r\n * 时间部分格式化为 HH:mm (24小时制)。\r\n *\r\n * @param date - 要格式化的 Date 对象\r\n * @param dateAdapter - Angular Material 的 DateAdapter,用于处理日期部分的格式化\r\n * @param dateFormats - Angular Material 的 MatDateFormats,包含日期格式配置\r\n * @returns 格式化后的日期时间字符串,例如 \"2024-01-24 14:30\"\r\n */\r\nexport function formatDate(date: Date, dateAdapter: DateAdapter<any>, dateFormats: MatDateFormats): string {\r\n const datePart = dateAdapter.format(date, dateFormats.display.dateInput);\r\n const hours = date.getHours().toString().padStart(2, '0');\r\n const minutes = date.getMinutes().toString().padStart(2, '0');\r\n return `${datePart} ${hours}:${minutes}`;\r\n}\r\n","import { TimeRange } from './interfaces';\r\n\r\nexport const DEFAULT_TIME_RANGES: TimeRange[] = [\r\n { label: '最近5分钟', start: 'offset:-5minutes', end: 'offset:now' },\r\n { label: '最近15分钟', start: 'offset:-15minutes', end: 'offset:now' },\r\n { label: '最近30分钟', start: 'offset:-30minutes', end: 'offset:now' },\r\n { label: '最近1小时', start: 'offset:-1hours', end: 'offset:now' },\r\n { label: '最近3小时', start: 'offset:-3hours', end: 'offset:now' },\r\n { label: '最近6小时', start: 'offset:-6hours', end: 'offset:now' },\r\n { label: '最近12小时', start: 'offset:-12hours', end: 'offset:now' },\r\n { label: '最近24小时', start: 'offset:-24hours', end: 'offset:now' },\r\n { label: '最近2天', start: 'offset:-2days', end: 'offset:now' },\r\n { label: '最近7天', start: 'offset:-7days', end: 'offset:now' },\r\n { label: '最近30天', start: 'offset:-30days', end: 'offset:now' },\r\n { label: '最近90天', start: 'offset:-90days', end: 'offset:now' },\r\n { label: '最近6个月', start: 'offset:-6months', end: 'offset:now' },\r\n { label: '最近1年', start: 'offset:-1years', end: 'offset:now' },\r\n { label: '最近2年', start: 'offset:-2years', end: 'offset:now' },\r\n { label: '最近5年', start: 'offset:-5years', end: 'offset:now' },\r\n { label: '昨天', start: 'offset:-1days/start', end: 'offset:-1days/end' },\r\n { label: '前天', start: 'offset:-2days/start', end: 'offset:-2days/end' },\r\n { label: '上周同一天', start: 'offset:-7days/start', end: 'offset:-7days/end' },\r\n { label: '今天', start: 'offset:0days/start', end: 'offset:0days/end' },\r\n { label: '今天至今', start: 'offset:0days/start', end: 'offset:now' },\r\n { label: '本周至今', start: 'startof:week', end: 'offset:now' },\r\n { label: '本月至今', start: 'startof:month', end: 'offset:now' },\r\n { label: '今年至今', start: 'startof:year', end: 'offset:now' }\r\n];\r\n\r\nexport const FUTURE_TIME_RANGES: TimeRange[] = [\r\n { label: '未来1天', start: 'offset:now', end: 'offset:+1days' },\r\n { label: '未来1周', start: 'offset:now', end: 'offset:+1weeks' },\r\n { label: '未来1月', start: 'offset:now', end: 'offset:+1months' },\r\n { label: '未来3月', start: 'offset:now', end: 'offset:+3months' }\r\n];\r\n","import { ChangeDetectionStrategy, Component, inject, model, OnInit, signal, ViewChild, computed } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { DatePickerModel, DateTimePickerValue, TimeRange } from '../interfaces';\r\nimport { TablerIconComponent } from '@luoxiao123/angular-tabler-icons';\r\nimport { DateRange, DefaultMatCalendarRangeStrategy, MatCalendar, MatDatepickerModule, MatRangeDateSelectionModel } from '@angular/material/datepicker';\r\nimport { Container } from '../components';\r\nimport { DateTimeInputComponent } from '../components';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { MatSidenavModule, MatSidenav } from '@angular/material/sidenav';\r\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';\r\nimport { formatDate } from '../until';\r\nimport { DEFAULT_TIME_RANGES, FUTURE_TIME_RANGES } from '../constants';\r\n\r\n@Component({\r\n selector: 'date-time-picker-selector',\r\n templateUrl: './date-selector.component.html',\r\n styleUrls: ['./date-selector.component.scss'],\r\n styles: `\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n `,\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n DefaultMatCalendarRangeStrategy,\r\n MatRangeDateSelectionModel\r\n ],\r\n imports: [\r\n MatCalendar,\r\n TablerIconComponent,\r\n MatDatepickerModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n Container,\r\n DateTimeInputComponent,\r\n MatSidenavModule,\r\n MatButtonModule\r\n ]\r\n})\r\nexport class DateSelector implements OnInit {\r\n readonly #dialogRef = inject(MatDialogRef<DateSelector>);\r\n readonly #data = inject(MAT_DIALOG_DATA) as DatePickerModel;\r\n readonly #selectionModel = inject(MatRangeDateSelectionModel<Date>);\r\n readonly #breakpoints = inject(BreakpointObserver);\r\n private _dateAdapter = inject(DateAdapter);\r\n private _dateFormats = inject(MAT_DATE_FORMATS);\r\n\r\n @ViewChild('sidenav') sidenav?: MatSidenav;\r\n\r\n isMobile = signal(false);\r\n\r\n public data = this.#data;\r\n\r\n startDate = model<string>('');\r\n endDate = model<string>('');\r\n\r\n startHour = model<number | null>(null);\r\n startMinute = model<number | null>(null);\r\n endHour = model<number | null>(null);\r\n endMinute = model<number | null>(null);\r\n\r\n future = model<boolean>(false);\r\n\r\n displayStart = computed(() => {\r\n const startStr = this.startDate();\r\n if (!startStr) return '';\r\n return formatDate(new Date(startStr), this._dateAdapter, this._dateFormats);\r\n });\r\n\r\n displayEnd = computed(() => {\r\n const endStr = this.endDate();\r\n if (!endStr) return '';\r\n return formatDate(new Date(endStr), this._dateAdapter, this._dateFormats);\r\n });\r\n\r\n timeRanges: TimeRange[] = [...DEFAULT_TIME_RANGES];\r\n selectedTimeRange = model<TimeRange | undefined>(undefined);\r\n\r\n selectedDateRange: DateRange<Date> | null = null;\r\n now = new Date();\r\n selectingStart = true;\r\n\r\n constructor() {\r\n this.#breakpoints\r\n .observe([Breakpoints.Handset, Breakpoints.Tablet])\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(result => {\r\n this.isMobile.set(result.matches);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.data) {\r\n this.future.set(this.data.future);\r\n\r\n const picker = this.data.dateTimePicker;\r\n\r\n if (picker) {\r\n if (picker.start && picker.end) {\r\n const start = new Date(picker.start);\r\n const end = new Date(picker.end);\r\n this.selectedDateRange = new DateRange(start, end);\r\n\r\n this.#selectionModel.updateSelection(this.selectedDateRange, this);\r\n\r\n // 初始化时间值\r\n this.startDate.set(!isNaN(start.getTime()) ? start.toISOString() : String(picker.start));\r\n this.endDate.set(!isNaN(end.getTime()) ? end.toISOString() : String(picker.end));\r\n this.startHour.set(start.getHours());\r\n this.startMinute.set(start.getMinutes());\r\n this.endHour.set(end.getHours());\r\n this.endMinute.set(end.getMinutes());\r\n }\r\n }\r\n\r\n if (this.future()) {\r\n this.timeRanges = [...this.timeRanges, ...FUTURE_TIME_RANGES];\r\n }\r\n }\r\n \r\n if (!this.data?.dateTimePicker) {\r\n this.selectTimeRange(this.timeRanges[5]);\r\n }\r\n }\r\n\r\n selectTimeRange(timeRange: TimeRange): void {\r\n this.selectedTimeRange.set(timeRange);\r\n const { startDate, endDate } = this.processTimeRange(timeRange);\r\n const start = new Date(startDate);\r\n const end = new Date(endDate);\r\n\r\n this.startDate.set(start.toISOString());\r\n this.endDate.set(end.toISOString());\r\n this.startHour.set(start.getHours());\r\n this.startMinute.set(start.getMinutes());\r\n this.endHour.set(end.getHours());\r\n this.endMinute.set(end.getMinutes());\r\n this.selectedDateRange = new DateRange<Date>(start, end);\r\n }\r\n\r\n private processTimeRange(timeRange: TimeRange): { startDate: string; endDate: string } {\r\n const now = new Date();\r\n const parseTime = (time: string): Date => {\r\n if (!time) return new Date(now);\r\n\r\n // 处理 startof: 前缀 (本周/本月/今年)\r\n if (time.startsWith('startof:')) {\r\n const unit = time.replace('startof:', '').trim().toLowerCase();\r\n const result = new Date(now);\r\n result.setHours(0, 0, 0, 0);\r\n\r\n switch (unit) {\r\n case 'week':\r\n // 假设周一为一周的开始\r\n const day = result.getDay() || 7; // 0是周日,改为7\r\n if (day !== 1) {\r\n result.setHours(-24 * (day - 1));\r\n }\r\n break;\r\n case 'month':\r\n result.setDate(1);\r\n break;\r\n case 'year':\r\n result.setMonth(0, 1);\r\n break;\r\n }\r\n return result;\r\n }\r\n\r\n // 处理 offset: 前缀\r\n if (time.startsWith('offset:')) {\r\n const offsetStr = time.replace('offset:', '').trim();\r\n if (offsetStr === 'now') return new Date(now);\r\n\r\n // 检查是否有 /start 或 /end 后缀\r\n let suffix = '';\r\n let cleanOffset = offsetStr;\r\n if (offsetStr.endsWith('/start')) {\r\n suffix = 'start';\r\n cleanOffset = offsetStr.replace('/start', '');\r\n } else if (offsetStr.endsWith('/end')) {\r\n suffix = 'end';\r\n cleanOffset = offsetStr.replace('/end', '');\r\n }\r\n\r\n const regex = /([+-]?)(\\d+)(months?|days?|years?|weeks?|hours?|minutes?)/i;\r\n const match = regex.exec(cleanOffset);\r\n \r\n // 如果没有匹配到数字偏移量,但有后缀(例如 offset:0days/start),尝试解析\r\n // 注意:上面的正则也能匹配 0days\r\n \r\n const result = new Date(now);\r\n \r\n if (match) {\r\n const sign = match[1] === '-' ? -1 : 1;\r\n const value = parseInt(match[2], 10) * sign;\r\n const unit = match[3].toLowerCase();\r\n\r\n switch (unit) {\r\n case 'minutes':\r\n case 'minute':\r\n result.setMinutes(result.getMinutes() + value);\r\n break;\r\n case 'hours':\r\n case 'hour':\r\n result.setHours(result.getHours() + value);\r\n break;\r\n case 'days':\r\n case 'day':\r\n result.setDate(result.getDate() + value);\r\n break;\r\n case 'weeks':\r\n case 'week':\r\n result.setDate(result.getDate() + value * 7);\r\n break;\r\n case 'months':\r\n case 'month':\r\n result.setMonth(result.getMonth() + value);\r\n break;\r\n case 'years':\r\n case 'year':\r\n result.setFullYear(result.getFullYear() + value);\r\n break;\r\n }\r\n }\r\n\r\n // 应用后缀修正\r\n if (suffix === 'start') {\r\n result.setHours(0, 0, 0, 0);\r\n } else if (suffix === 'end') {\r\n result.setHours(23, 59, 59, 999);\r\n }\r\n\r\n return result;\r\n }\r\n return new Date(time);\r\n };\r\n\r\n const startDate = timeRange.start ? parseTime(timeRange.start) : null;\r\n const endDate = timeRange.end ? parseTime(timeRange.end) : now;\r\n\r\n return {\r\n startDate: (startDate ?? endDate).toISOString(),\r\n endDate: endDate.toISOString()\r\n };\r\n }\r\n\r\n changeDatePart(part: 'start' | 'end', date: Date | string): void {\r\n if (!date) return;\r\n\r\n let dateObj: Date;\r\n\r\n if (typeof date === 'string') {\r\n // 如果是字符串,尝试解析它\r\n dateObj = new Date(date);\r\n // 如果不能解析为有效日期,返回\r\n if (isNaN(dateObj.getTime())) return;\r\n } else {\r\n dateObj = new Date(date);\r\n }\r\n\r\n // 保持原有的时间部分(只修改日期部分)\r\n if (part === 'start') {\r\n const currentStart = this.selectedDateRange?.start;\r\n if (currentStart) {\r\n dateObj.setHours(currentStart.getHours(), currentStart.getMinutes(), currentStart.getSeconds());\r\n } else {\r\n dateObj.setHours(0, 0, 0, 0);\r\n }\r\n } else {\r\n const currentEnd = this.selectedDateRange?.end;\r\n if (currentEnd) {\r\n dateObj.setHours(currentEnd.getHours(), currentEnd.getMinutes(), currentEnd.getSeconds());\r\n } else {\r\n dateObj.setHours(0, 0, 0, 0);\r\n }\r\n }\r\n\r\n this.selectedTimeRange.set(undefined);\r\n\r\n let start = this.selectedDateRange?.start ?? null;\r\n let end = this.selectedDateRange?.end ?? null;\r\n\r\n if (part === 'start') {\r\n start = dateObj;\r\n } else {\r\n end = dateObj;\r\n }\r\n\r\n if (start && end && start.getTime() > end.getTime()) {\r\n [start, end] = [end, start];\r\n }\r\n\r\n const range = new DateRange<Date>(start, end);\r\n this.selectedDateRange = range;\r\n this.startDate.set(start?.toISOString() ?? '');\r\n this.endDate.set(end?.toISOString() ?? '');\r\n\r\n if (start) {\r\n this.startHour.set(start.getHours());\r\n this.startMinute.set(start.getMinutes());\r\n } else {\r\n this.startHour.set(null);\r\n this.startMinute.set(null);\r\n }\r\n\r\n if (end) {\r\n this.endHour.set(end.getHours());\r\n this.endMinute.set(end.getMinutes());\r\n } else {\r\n this.endHour.set(null);\r\n this.endMinute.set(null);\r\n }\r\n }\r\n\r\n rangeChanged(selectedDate: Date | null): void {\r\n if (!selectedDate) return;\r\n\r\n if (this.selectingStart) {\r\n // 正在选择开始日期\r\n let h = 0, m = 0, s = 0, ms = 0;\r\n // 尝试保留之前的开始时间\r\n if (this.selectedDateRange?.start) {\r\n h = this.selectedDateRange.start.getHours();\r\n m = this.selectedDateRange.start.getMinutes();\r\n s = this.selectedDateRange.start.getSeconds();\r\n }\r\n\r\n const newStart = new Date(selectedDate);\r\n newStart.setHours(h, m, s, ms);\r\n\r\n this.startDate.set(newStart.toISOString());\r\n this.endDate.set('');\r\n this.startHour.set(newStart.getHours());\r\n this.startMinute.set(newStart.getMinutes());\r\n this.endHour.set(null);\r\n this.endMinute.set(null);\r\n this.selectedTimeRange.set(undefined);\r\n this.selectedDateRange = new DateRange(newStart, null);\r\n this.#selectionModel.updateSelection(this.selectedDateRange, this);\r\n this.selectingStart = false;\r\n } else {\r\n // 正在选择结束日期\r\n const start = this.#selectionModel.selection.start;\r\n if (!start) return;\r\n\r\n const startDay = new Date(start.getFullYear(), start.getMonth(), start.getDate());\r\n const selectedDay = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate());\r\n\r\n let newStart: Date;\r\n let newEnd: Date;\r\n\r\n if (selectedDay.getTime() < startDay.getTime()) {\r\n // 用户选了一个比 Start 更早的日期 -> 交换角色\r\n // 新 Start (selectedDate) 设为 00:00\r\n newStart = new Date(selectedDate);\r\n newStart.setHours(0, 0, 0, 0);\r\n\r\n // 新 End (旧 start) 设为 23:59\r\n newEnd = new Date(start);\r\n newEnd.setHours(23, 59, 59, 999);\r\n } else {\r\n // 正常顺序 (selectedDate >= start)\r\n // Start 保持原样\r\n newStart = new Date(start);\r\n\r\n // End (selectedDate) 设为 23:59\r\n newEnd = new Date(selectedDate);\r\n newEnd.setHours(23, 59, 59, 999);\r\n \r\n // 如果是同一天,确保 Start <= End\r\n if (newStart.getTime() > newEnd.getTime()) {\r\n newStart.setHours(0, 0, 0, 0);\r\n }\r\n }\r\n\r\n this.updateSelection(newStart, newEnd);\r\n this.selectingStart = true;\r\n }\r\n }\r\n\r\n updateSelection(start: Date, end: Date): void {\r\n const range = new DateRange(start, end);\r\n this.selectedDateRange = range;\r\n this.#selectionModel.updateSelection(range, this);\r\n this.startDate.set(start.toISOString());\r\n this.endDate.set(end.toISOString());\r\n this.startHour.set(start.getHours());\r\n this.startMinute.set(start.getMinutes());\r\n this.endHour.set(end.getHours());\r\n this.endMinute.set(end.getMinutes());\r\n }\r\n\r\n submit(): void {\r\n if (!this.selectedDateRange?.start || !this.selectedDateRange?.end) {\r\n return;\r\n }\r\n\r\n const start = new Date(this.selectedDateRange.start);\r\n const end = new Date(this.selectedDateRange.end);\r\n\r\n if (isNaN(start.getTime()) || isNaN(end.getTime())) {\r\n return;\r\n }\r\n\r\n const result: DateTimePickerValue = {\r\n start: start.toISOString(),\r\n end: end.toISOString()\r\n };\r\n\r\n this.data = { ...this.data, dateTimePicker: result };\r\n this.#dialogRef.close(this.data);\r\n }\r\n\r\n dismiss(): void {\r\n this.#dialogRef.close(undefined);\r\n }\r\n\r\n readonly hours = Array.from({ length: 24 }, (_, i) => i);\r\n readonly minutes = Array.from({ length: 60 }, (_, i) => i);\r\n\r\n updateStartTime(): void {\r\n if (this.selectedDateRange?.start && this.startHour() !== null && this.startMinute() !== null) {\r\n const startDate = new Date(this.selectedDateRange.start);\r\n startDate.setHours(this.startHour() ?? 0, this.startMinute() ?? 0, 0, 0);\r\n\r\n let endDate = this.selectedDateRange.end;\r\n const range = new DateRange(startDate, endDate);\r\n this.selectedDateRange = range;\r\n this.#selectionModel.updateSelection(range, this);\r\n this.startDate.set(startDate.toISOString());\r\n }\r\n }\r\n\r\n updateEndTime(): void {\r\n if (this.selectedDateRange?.end && this.endHour() !== null && this.endMinute() !== null) {\r\n const endDate = new Date(this.selectedDateRange.end);\r\n endDate.setHours(this.endHour() ?? 0, this.endMinute() ?? 0, 0, 0);\r\n\r\n let startDate = this.selectedDateRange.start;\r\n const range = new DateRange(startDate, endDate);\r\n this.selectedDateRange = range;\r\n this.#selectionModel.updateSelection(range, this);\r\n this.endDate.set(endDate.toISOString());\r\n }\r\n }\r\n}\r\n","<date-time-picker-container\r\n headerTitle=\"日期时间选择器\"\r\n submitTitle=\"应用\"\r\n [disabledSubmit]=\"!selectedDateRange\"\r\n [footerExtraContent]=\"footerExtraContent\"\r\n (submit)=\"submit()\"\r\n (dismiss)=\"dismiss()\"\r\n>\r\n <mat-sidenav-container class=\"date-selector-sidenav-container\">\r\n <!-- 左侧快捷选择面板 -->\r\n <mat-sidenav #sidenav [mode]=\"isMobile() ? 'over' : 'side'\" [opened]=\"!isMobile()\" class=\"date-selector-sidebar\" dir=\"rtl\">\r\n <div class=\"date-selector-sidebar-inner\" dir=\"ltr\">\r\n <div class=\"date-selector-sidebar-header\">\r\n <span class=\"date-selector-sidebar-title\">快捷选择</span>\r\n @if (isMobile()) {\r\n <button mat-icon-button (click)=\"sidenav.close()\">\r\n <i-tabler name=\"layout-sidebar-left-collapse\" />\r\n </button>\r\n }\r\n </div>\r\n <ul class=\"date-selector-sidebar-list\">\r\n @for (timeRangeItem of timeRanges; track timeRangeItem) {\r\n <li class=\"date-selector-sidebar-item\">\r\n <button\r\n type=\"button\"\r\n (click)=\"selectTimeRange(timeRangeItem); isMobile() && sidenav.close()\"\r\n [class.selected]=\"selectedTimeRange() && selectedTimeRange()?.start === timeRangeItem.start && selectedTimeRange()?.end === timeRangeItem.end\"\r\n class=\"date-selector-sidebar-btn\"\r\n >\r\n <span class=\"date-selector-sidebar-text\">{{ timeRangeItem.label }}</span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </mat-sidenav>\r\n <!-- 左侧快捷选择面板结束 -->\r\n\r\n <mat-sidenav-content>\r\n @if (isMobile()) {\r\n <div class=\"date-selector-mobile-toolbar\">\r\n <button mat-button (click)=\"sidenav.open()\">\r\n <span>快捷选择</span>\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- 主要内容区域 -->\r\n <div class=\"date-selector-main\">\r\n <div class=\"date-selector-content\">\r\n <!-- 日历容器 -->\r\n <section class=\"date-selector-calendar-section\">\r\n <div class=\"date-selector-calendar-wrapper\">\r\n <mat-calendar [maxDate]=\"!future() ? now : undefined\" [(selected)]=\"selectedDateRange\" (selectedChange)=\"rangeChanged($event)\" class=\"date-selector-calendar\" />\r\n </div>\r\n </section>\r\n <!-- 日历容器结束 -->\r\n\r\n <!-- 时间设置容器 -->\r\n <section class=\"date-selector-time-section\">\r\n <!-- 开始和结束输入日期 -->\r\n <div class=\"date-selector-inputs\">\r\n <!-- 从日期 -->\r\n <date-time-input\r\n label=\"开始日期\"\r\n [dateValue]=\"startDate()\"\r\n [hourValue]=\"startHour()\"\r\n (hourChange)=\"startHour.set($event)\"\r\n [minuteValue]=\"startMinute()\"\r\n (minuteChange)=\"startMinute.set($event)\"\r\n [hours]=\"hours\"\r\n [minutes]=\"minutes\"\r\n (dateChange)=\"changeDatePart('start', $event)\"\r\n (timeChange)=\"updateStartTime()\"\r\n />\r\n\r\n <!-- 结束日期 -->\r\n <date-time-input\r\n label=\"结束日期\"\r\n [dateValue]=\"endDate()\"\r\n [hourValue]=\"endHour()\"\r\n (hourChange)=\"endHour.set($event)\"\r\n [minuteValue]=\"endMinute()\"\r\n (minuteChange)=\"endMinute.set($event)\"\r\n [hours]=\"hours\"\r\n [minutes]=\"minutes\"\r\n (dateChange)=\"changeDatePart('end', $event)\"\r\n (timeChange)=\"updateEndTime()\"\r\n />\r\n </div>\r\n\r\n <div class=\"date-selector-hint-wrapper\">\r\n <div class=\"date-selector-hint\">\r\n <i-tabler name=\"info-circle\" strokeWidth=\"2px\" class=\"date-selector-hint-icon\"></i-tabler>\r\n <span class=\"date-selector-hint-text\">如果要选择一天,请双击该天。</span>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n</date-time-picker-container>\r\n\r\n<ng-template #footerExtraContent>\r\n <div class=\"date-selector-footer-range\">\r\n <span class=\"date-selector-footer-label\">范围:</span>\r\n\r\n @if (startDate()) {\r\n <div class=\"date-selector-footer-value\">\r\n @if (startDate()) {\r\n <span class=\"date-selector-footer-date\">{{ displayStart() }}</span>\r\n }\r\n\r\n @if (startDate() && endDate()) {\r\n <span class=\"date-selector-footer-separator\">-</span>\r\n }\r\n\r\n @if (endDate()) {\r\n <span class=\"date-selector-footer-date\">{{ displayEnd() }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, input, model, output, signal, ViewChild, ElementRef, Input, forwardRef, computed, Injector, untracked } from '@angular/core';\r\nimport { take, tap } from 'rxjs';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { DatePickerModel, DateTimePickerValue } from './interfaces';\r\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { TablerIconComponent, provideTablerIcons } from '@luoxiao123/angular-tabler-icons';\r\nimport { IconCalendarDue, IconX } from '@luoxiao123/angular-tabler-icons/icons';\r\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { Subject } from 'rxjs';\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { DateSelector } from './date-selector/date-selector.component';\r\nimport { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';\r\nimport { formatDate } from './until';\r\n\r\n@Component({\r\n selector: 'date-time-picker',\r\n templateUrl: './date-picker.component.html',\r\n styleUrls: ['./date-picker.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TablerIconComponent, MatDatepickerModule, MatDialogModule],\r\n providers: [\r\n provideTablerIcons({ IconCalendarDue, IconX }),\r\n {\r\n provide: MatFormFieldControl,\r\n useExisting: forwardRef(() => DatePickerComponent)\r\n }\r\n ]\r\n})\r\nexport class DatePickerComponent implements ControlValueAccessor, MatFormFieldControl<DateTimePickerValue | null> {\r\n readonly #breakpoints = inject(BreakpointObserver);\r\n readonly #dialog = inject(MatDialog);\r\n readonly #focusMonitor = inject(FocusMonitor);\r\n readonly #elementRef = inject(ElementRef);\r\n readonly #injector = inject(Injector);\r\n private _dateAdapter = inject(DateAdapter);\r\n private _dateFormats = inject(MAT_DATE_FORMATS);\r\n\r\n protected destroyRef = inject(DestroyRef);\r\n\r\n @ViewChild('dateRangeButton') dateRangeButton?: ElementRef<HTMLButtonElement>;\r\n\r\n ngControl = inject(NgControl, { optional: true, self: true });\r\n\r\n @Input() required: boolean = false;\r\n disabledInput = input<boolean>(false, { alias: 'disabled' });\r\n private _formDisabled = signal(false);\r\n @Input() placeholder: string = '';\r\n future = input<boolean>(false);\r\n isTimestamp = input<boolean>(false);\r\n\r\n selectedDateRange = model<DateRange<Date> | undefined>();\r\n\r\n selectionChange = output<DateTimePickerValue | undefined>();\r\n\r\n // 内部值存储:{start: string, end: string} 或 null/undefined\r\n #internalValue = signal<DateTimePickerValue | null | undefined>(undefined);\r\n\r\n // MatFormFieldControl 属性\r\n readonly stateChanges = new Subject<void>();\r\n readonly #errorStateSignal = signal(false);\r\n readonly #focusedSignal = signal(false);\r\n readonly #id = signal<string>(`date-time-picker-${Math.random().toString(36).substr(2, 9)}`);\r\n\r\n // ControlValueAccessor 回调函数\r\n private onChange?: (value: any) => void;\r\n private onTouched?: () => void;\r\n\r\n protected displayStart = computed(() => {\r\n const range = this.selectedDateRange();\r\n if (!range?.start) return '';\r\n return formatDate(range.start, this._dateAdapter, this._dateFormats);\r\n });\r\n\r\n protected displayEnd = computed(() => {\r\n const range = this.selectedDateRange();\r\n if (!range?.end) return '';\r\n return formatDate(range.end, this._dateAdapter, this._dateFormats);\r\n });\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n this.ngControl.statusChanges?.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n // 监听 focus 事件\r\n this.#focusMonitor\r\n .monitor(this.#elementRef, true)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(origin => {\r\n const isFocused = !!origin;\r\n this.#focusedSignal.set(isFocused);\r\n this.stateChanges.next();\r\n if (!isFocused) {\r\n this.onTouched?.();\r\n }\r\n });\r\n\r\n effect(() => {\r\n this.disabledInput();\r\n untracked(() => this.stateChanges.next());\r\n });\r\n }\r\n\r\n ref = effect((): void => {\r\n this.selectedDateRange();\r\n // 触发 MatFormField 更新\r\n untracked(() => this.stateChanges.next());\r\n });\r\n\r\n openDateDialogSelector(): void {\r\n const isMobile = this.#breakpoints.isMatched([Breakpoints.Handset, Breakpoints.Tablet]);\r\n const currentValue = this.#internalValue();\r\n const data: DatePickerModel = {\r\n dateTimePicker: currentValue ?? undefined,\r\n future: this.future()\r\n };\r\n\r\n const dialogRef = this.#dialog.open(DateSelector, {\r\n width: isMobile ? '100%' : '850px',\r\n height: isMobile ? '90vh' : '520px',\r\n maxWidth: '100vw',\r\n maxHeight: '100vh',\r\n data,\r\n disableClose: false,\r\n panelClass: 'date-time-picker-dialog',\r\n injector: this.#injector\r\n });\r\n\r\n dialogRef\r\n .afterClosed()\r\n .pipe(\r\n take(1),\r\n takeUntilDestroyed(this.destroyRef),\r\n tap((result: DatePickerModel | undefined): void => {\r\n if (result && result.dateTimePicker) {\r\n const start = new Date(result.dateTimePicker.start);\r\n const end = new Date(result.dateTimePicker.end);\r\n\r\n let startVal: string | number;\r\n let endVal: string | number;\r\n\r\n if (this.isTimestamp()) {\r\n start.setSeconds(0, 0);\r\n end.setSeconds(0, 0);\r\n startVal = start.getTime();\r\n endVal = end.getTime();\r\n } else {\r\n startVal = formatDate(start, this._dateAdapter, this._dateFormats);\r\n endVal = formatDate(end, this._dateAdapter, this._dateFormats);\r\n }\r\n\r\n const rangeValue: DateTimePickerValue = {\r\n start: startVal,\r\n end: endVal\r\n };\r\n this.#internalValue.set(rangeValue);\r\n // 更新显示用的日期范围\r\n this.selectedDateRange.set(new DateRange(start, end));\r\n // 发出用户手动选择的值\r\n this.selectionChange.emit(rangeValue);\r\n // 通知表单控件\r\n if (this.onChange) {\r\n this.onChange(rangeValue);\r\n }\r\n }\r\n\r\n this.onTouched?.();\r\n })\r\n )\r\n .subscribe();\r\n }\r\n\r\n // ControlValueAccessor 实现\r\n writeValue(value: any): void {\r\n // 处理各种值类型:null, undefined, '', {start, end}\r\n if (value === null || value === undefined || value === '') {\r\n this.#internalValue.set(null);\r\n this.selectedDateRange.set(undefined);\r\n } else if (typeof value === 'object' && value.start && value.end) {\r\n this.#internalValue.set(value);\r\n // 尝试转换为 Date 对象以显示在选择器中\r\n try {\r\n const startDate = new Date(value.start);\r\n const endDate = new Date(value.end);\r\n if (!isNaN(startDate.getTime()) && !isNaN(endDate.getTime())) {\r\n this.selectedDateRange.set(new DateRange(startDate, endDate));\r\n }\r\n } catch (e) {\r\n console.warn('Failed to parse date values:', value);\r\n }\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: any) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._formDisabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n get disabled(): boolean {\r\n return this.disabledInput() || this._formDisabled();\r\n }\r\n\r\n // MatFormFieldControl 实现\r\n get empty(): boolean {\r\n return !this.#internalValue();\r\n }\r\n\r\n get shouldPlaceholderFloat(): boolean {\r\n return this.shouldLabelFloat;\r\n }\r\n\r\n get focused(): boolean {\r\n return this.#focusedSignal();\r\n }\r\n\r\n get errorState(): boolean {\r\n return this.#errorStateSignal() || (!!this.ngControl?.invalid && (!!this.ngControl?.touched || !!this.ngControl?.dirty));\r\n }\r\n\r\n get shouldLabelFloat(): boolean {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n get id(): string {\r\n return this.#id();\r\n }\r\n\r\n set value(val: DateTimePickerValue | undefined) {\r\n if (!val) {\r\n this.#internalValue.set(null);\r\n } else {\r\n this.#internalValue.set(val);\r\n this.selectedDateRange.set(new DateRange(new Date(val.start), new Date(val.end)));\r\n }\r\n this.stateChanges.next();\r\n }\r\n\r\n get value(): any {\r\n return this.#internalValue();\r\n }\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n // Material form field 使用此方法将错误 ID 传递给控件\r\n }\r\n\r\n onContainerClick(event: MouseEvent): void {\r\n if ((event.target as HTMLElement).tagName.toLowerCase() !== 'button') {\r\n this.dateRangeButton?.nativeElement.focus();\r\n }\r\n }\r\n\r\n clear(event?: Event): void {\r\n event?.stopPropagation();\r\n this.selectedDateRange.set(undefined);\r\n this.#internalValue.set(null);\r\n this.onChange?.(null);\r\n this.onTouched?.();\r\n this.selectionChange.emit(undefined);\r\n this.stateChanges.next();\r\n }\r\n}\r\n","<div\r\n #dateRangeButton\r\n [attr.id]=\"id\"\r\n [attr.aria-label]=\"'选择日期时间范围'\"\r\n [attr.aria-disabled]=\"disabled\"\r\n (click)=\"!disabled && openDateDialogSelector()\"\r\n (keydown.enter)=\"!disabled && openDateDialogSelector()\"\r\n (keydown.space)=\"!disabled && openDateDialogSelector()\"\r\n [tabindex]=\"disabled ? -1 : 0\"\r\n [attr.role]=\"'button'\"\r\n class=\"date-range-container\"\r\n>\r\n @if (selectedDateRange()) {\r\n <div class=\"date-range-content\">\r\n <span class=\"date-range-value\">{{ displayStart() }}</span>\r\n <span class=\"date-range-separator\"> ~ </span>\r\n <span class=\"date-range-value\">{{ displayEnd() }}</span>\r\n </div>\r\n } @else if (placeholder) {\r\n <span class=\"date-range-placeholder\">{{ placeholder }}</span>\r\n } @else {\r\n <div class=\"date-range-content\"></div>\r\n }\r\n\r\n <div class=\"date-range-actions\">\r\n @if (selectedDateRange() && !disabled) {\r\n <button\r\n (click)=\"clear($event)\"\r\n type=\"button\"\r\n class=\"date-range-clear-btn\"\r\n [attr.aria-label]=\"'清除日期选择'\"\r\n [tabindex]=\"disabled ? -1 : 0\"\r\n [disabled]=\"disabled\"\r\n (keydown.enter)=\"clear($event)\"\r\n (keydown.space)=\"clear($event)\"\r\n [attr.role]=\"'button'\"\r\n >\r\n <i-tabler name=\"x\" strokeWidth=\"2.5px\" size=\"18px\" class=\"date-range-icon\" />\r\n </button>\r\n }\r\n\r\n <i-tabler name=\"calendar-due\" strokeWidth=\"2px\" size=\"18px\" class=\"date-range-icon\" />\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luoxiao123/angular-material-date-time-range-picker",
3
- "version": "21.1.2",
3
+ "version": "21.1.3",
4
4
  "description": "An Angular Material date-time range picker library component",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -5,18 +5,35 @@ import { ControlValueAccessor, NgControl } from '@angular/forms';
5
5
  import { MatFormFieldControl } from '@angular/material/form-field';
6
6
  import { Subject } from 'rxjs';
7
7
  import { MatSidenav } from '@angular/material/sidenav';
8
+ import { DateAdapter, MatDateFormats } from '@angular/material/core';
8
9
 
10
+ /**
11
+ * 日期时间选择器的值接口
12
+ */
9
13
  interface DateTimePickerValue {
10
- start: string;
11
- end: string;
14
+ /** 开始时间,可以是格式化后的日期字符串或时间戳(毫秒) */
15
+ start: string | number;
16
+ /** 结束时间,可以是格式化后的日期字符串或时间戳(毫秒) */
17
+ end: string | number;
12
18
  }
19
+ /**
20
+ * 日期选择器弹窗的数据模型
21
+ */
13
22
  interface DatePickerModel {
23
+ /** 当前选择的日期时间范围值 */
14
24
  dateTimePicker?: DateTimePickerValue | null;
25
+ /** 是否允许选择未来时间 */
15
26
  future: boolean;
16
27
  }
28
+ /**
29
+ * 预定义时间范围接口
30
+ */
17
31
  interface TimeRange {
32
+ /** 时间范围的显示标签(例如:"最近7天") */
18
33
  label: string;
34
+ /** 时间范围的开始时间(日期字符串) */
19
35
  start: string;
36
+ /** 时间范围的结束时间(日期字符串) */
20
37
  end: string;
21
38
  }
22
39
 
@@ -32,6 +49,7 @@ declare class DatePickerComponent implements ControlValueAccessor, MatFormFieldC
32
49
  private _formDisabled;
33
50
  placeholder: string;
34
51
  future: _angular_core.InputSignal<boolean>;
52
+ isTimestamp: _angular_core.InputSignal<boolean>;
35
53
  selectedDateRange: _angular_core.ModelSignal<DateRange<Date> | undefined>;
36
54
  selectionChange: _angular_core.OutputEmitterRef<DateTimePickerValue | undefined>;
37
55
  readonly stateChanges: Subject<void>;
@@ -59,7 +77,7 @@ declare class DatePickerComponent implements ControlValueAccessor, MatFormFieldC
59
77
  onContainerClick(event: MouseEvent): void;
60
78
  clear(event?: Event): void;
61
79
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatePickerComponent, never>;
62
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatePickerComponent, "date-time-picker", never, { "required": { "alias": "required"; "required": false; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; }; "future": { "alias": "future"; "required": false; "isSignal": true; }; "selectedDateRange": { "alias": "selectedDateRange"; "required": false; "isSignal": true; }; }, { "selectedDateRange": "selectedDateRangeChange"; "selectionChange": "selectionChange"; }, never, never, true, never>;
80
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatePickerComponent, "date-time-picker", never, { "required": { "alias": "required"; "required": false; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; }; "future": { "alias": "future"; "required": false; "isSignal": true; }; "isTimestamp": { "alias": "isTimestamp"; "required": false; "isSignal": true; }; "selectedDateRange": { "alias": "selectedDateRange"; "required": false; "isSignal": true; }; }, { "selectedDateRange": "selectedDateRangeChange"; "selectionChange": "selectionChange"; }, never, never, true, never>;
63
81
  }
64
82
 
65
83
  declare class DateSelector implements OnInit {
@@ -100,5 +118,19 @@ declare class DateSelector implements OnInit {
100
118
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateSelector, "date-time-picker-selector", never, { "startDate": { "alias": "startDate"; "required": false; "isSignal": true; }; "endDate": { "alias": "endDate"; "required": false; "isSignal": true; }; "startHour": { "alias": "startHour"; "required": false; "isSignal": true; }; "startMinute": { "alias": "startMinute"; "required": false; "isSignal": true; }; "endHour": { "alias": "endHour"; "required": false; "isSignal": true; }; "endMinute": { "alias": "endMinute"; "required": false; "isSignal": true; }; "future": { "alias": "future"; "required": false; "isSignal": true; }; "selectedTimeRange": { "alias": "selectedTimeRange"; "required": false; "isSignal": true; }; }, { "startDate": "startDateChange"; "endDate": "endDateChange"; "startHour": "startHourChange"; "startMinute": "startMinuteChange"; "endHour": "endHourChange"; "endMinute": "endMinuteChange"; "future": "futureChange"; "selectedTimeRange": "selectedTimeRangeChange"; }, never, never, true, never>;
101
119
  }
102
120
 
103
- export { DatePickerComponent, DateSelector };
121
+ /**
122
+ * 格式化日期对象为字符串
123
+ *
124
+ * 将给定的 Date 对象格式化为包含日期和时间的字符串。
125
+ * 日期部分使用提供的 DateAdapter 和 MatDateFormats 进行格式化。
126
+ * 时间部分格式化为 HH:mm (24小时制)。
127
+ *
128
+ * @param date - 要格式化的 Date 对象
129
+ * @param dateAdapter - Angular Material 的 DateAdapter,用于处理日期部分的格式化
130
+ * @param dateFormats - Angular Material 的 MatDateFormats,包含日期格式配置
131
+ * @returns 格式化后的日期时间字符串,例如 "2024-01-24 14:30"
132
+ */
133
+ declare function formatDate(date: Date, dateAdapter: DateAdapter<any>, dateFormats: MatDateFormats): string;
134
+
135
+ export { DatePickerComponent, DateSelector, formatDate };
104
136
  export type { DatePickerModel, DateTimePickerValue, TimeRange };