ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
1,155 lines (1,151 loc) • 69.7 kB
JavaScript
import { __esDecorate, __runInitializers } from 'tslib';
import * as i10 from '@angular/cdk/overlay';
import { OverlayModule } from '@angular/cdk/overlay';
import * as i3$1 from '@angular/cdk/platform';
import { _getEventTarget } from '@angular/cdk/platform';
import { DecimalPipe, NgTemplateOutlet, AsyncPipe } from '@angular/common';
import * as i0 from '@angular/core';
import { EventEmitter, forwardRef, numberAttribute, booleanAttribute, Input, Output, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component, inject, computed, signal, NgModule } from '@angular/core';
import * as i6 from '@angular/forms';
import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
import { Subject, of } from 'rxjs';
import { takeUntil, distinctUntilChanged, withLatestFrom, map } from 'rxjs/operators';
import { isValid } from 'date-fns';
import { slideMotion } from 'ng-zorro-antd/core/animation';
import * as i1 from 'ng-zorro-antd/core/config';
import { WithConfig } from 'ng-zorro-antd/core/config';
import { NzFormStatusService, NzFormNoStatusService, NzFormItemFeedbackIconComponent } from 'ng-zorro-antd/core/form';
import { warn } from 'ng-zorro-antd/core/logger';
import * as i7 from 'ng-zorro-antd/core/outlet';
import { NzOutletModule } from 'ng-zorro-antd/core/outlet';
import * as i9 from 'ng-zorro-antd/core/overlay';
import { NzOverlayModule } from 'ng-zorro-antd/core/overlay';
import { NzDestroyService } from 'ng-zorro-antd/core/services';
import { isNotNil, isNil, fromEventOutsideAngular, getStatusClassNames } from 'ng-zorro-antd/core/util';
import * as i8 from 'ng-zorro-antd/icon';
import { NzIconModule } from 'ng-zorro-antd/icon';
import * as i5 from 'ng-zorro-antd/space';
import { NZ_SPACE_COMPACT_SIZE, NZ_SPACE_COMPACT_ITEM_TYPE, NzSpaceCompactItemDirective } from 'ng-zorro-antd/space';
import * as i2$1 from 'ng-zorro-antd/button';
import { NzButtonModule } from 'ng-zorro-antd/button';
import { reqAnimFrame } from 'ng-zorro-antd/core/polyfill';
import * as i2 from 'ng-zorro-antd/i18n';
import { NzI18nModule } from 'ng-zorro-antd/i18n';
import * as i3 from 'ng-zorro-antd/core/transition-patch';
import * as i4 from 'ng-zorro-antd/core/wave';
import * as i4$1 from '@angular/cdk/bidi';
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
class TimeHolder {
selected12Hours = undefined;
_value;
_use12Hours = false;
_defaultOpenValue;
_changes = new Subject();
setMinutes(value, disabled) {
if (!disabled) {
this.initValue();
this.value.setMinutes(value);
this.update();
}
return this;
}
setHours(value, disabled) {
if (!disabled) {
this.initValue();
if (this._use12Hours) {
if (this.selected12Hours === 'PM' && value !== 12) {
this.value.setHours(value + 12);
}
else if (this.selected12Hours === 'AM' && value === 12) {
this.value.setHours(0);
}
else {
this.value.setHours(value);
}
}
else {
this.value.setHours(value);
}
this.update();
}
return this;
}
setSeconds(value, disabled) {
if (!disabled) {
this.initValue();
this.value.setSeconds(value);
this.update();
}
return this;
}
setUse12Hours(value) {
this._use12Hours = value;
return this;
}
get changes() {
return this._changes.asObservable();
}
setValue(value, use12Hours) {
if (isNotNil(use12Hours)) {
this._use12Hours = use12Hours;
}
if (value !== this.value) {
this._value = value;
if (isNotNil(this.value)) {
if (this._use12Hours && isNotNil(this.hours)) {
this.selected12Hours = this.hours >= 12 ? 'PM' : 'AM';
}
}
else {
this._clear();
}
}
return this;
}
initValue() {
if (isNil(this.value)) {
this.setValue(new Date(), this._use12Hours);
}
}
clear() {
this._clear();
this.update();
}
get isEmpty() {
return !(isNotNil(this.hours) || isNotNil(this.minutes) || isNotNil(this.seconds));
}
_clear() {
this._value = undefined;
this.selected12Hours = undefined;
}
update() {
if (this.isEmpty) {
this._value = undefined;
}
else {
if (isNotNil(this.hours)) {
this.value.setHours(this.hours);
}
if (isNotNil(this.minutes)) {
this.value.setMinutes(this.minutes);
}
if (isNotNil(this.seconds)) {
this.value.setSeconds(this.seconds);
}
if (this._use12Hours) {
if (this.selected12Hours === 'PM' && this.hours < 12) {
this.value.setHours(this.hours + 12);
}
if (this.selected12Hours === 'AM' && this.hours >= 12) {
this.value.setHours(this.hours - 12);
}
}
}
this.changed();
}
changed() {
this._changes.next(this.value);
}
/**
* @description
* UI view hours
* Get viewHours which is selected in `time-picker-panel` and its range is [12, 1, 2, ..., 11]
*/
get viewHours() {
return this._use12Hours && isNotNil(this.hours) ? this.calculateViewHour(this.hours) : this.hours;
}
setSelected12Hours(value) {
if (value.toUpperCase() !== this.selected12Hours) {
this.selected12Hours = value.toUpperCase();
this.update();
}
}
get value() {
return this._value || this._defaultOpenValue;
}
get hours() {
return this.value?.getHours();
}
get minutes() {
return this.value?.getMinutes();
}
get seconds() {
return this.value?.getSeconds();
}
setDefaultOpenValue(value) {
this._defaultOpenValue = value;
return this;
}
calculateViewHour(value) {
const selected12Hours = this.selected12Hours;
if (selected12Hours === 'PM' && value > 12) {
return value - 12;
}
if (selected12Hours === 'AM' && value === 0) {
return 12;
}
return value;
}
}
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
function makeRange(length, step = 1, start = 0) {
return new Array(Math.ceil(length / step)).fill(0).map((_, i) => (i + start) * step);
}
class NzTimePickerPanelComponent {
ngZone;
cdr;
dateHelper;
elementRef;
_nzHourStep = 1;
_nzMinuteStep = 1;
_nzSecondStep = 1;
unsubscribe$ = new Subject();
onChange;
onTouch;
_format = 'HH:mm:ss';
_disabledHours = () => [];
_disabledMinutes = () => [];
_disabledSeconds = () => [];
_allowEmpty = true;
time = new TimeHolder();
hourEnabled = true;
minuteEnabled = true;
secondEnabled = true;
firstScrolled = false;
enabledColumns = 3;
hourRange;
minuteRange;
secondRange;
use12HoursRange;
hourListElement;
minuteListElement;
secondListElement;
use12HoursListElement;
nzInDatePicker = false; // If inside a date-picker, more diff works need to be done
nzAddOn;
nzHideDisabledOptions = false;
nzClearText;
nzNowText;
nzOkText;
nzPlaceHolder;
nzUse12Hours = false;
nzDefaultOpenValue;
closePanel = new EventEmitter();
set nzAllowEmpty(value) {
this._allowEmpty = value;
}
get nzAllowEmpty() {
return this._allowEmpty;
}
set nzDisabledHours(value) {
this._disabledHours = value;
if (this._disabledHours) {
this.buildHours();
}
}
get nzDisabledHours() {
return this._disabledHours;
}
set nzDisabledMinutes(value) {
if (isNotNil(value)) {
this._disabledMinutes = value;
this.buildMinutes();
}
}
get nzDisabledMinutes() {
return this._disabledMinutes;
}
set nzDisabledSeconds(value) {
if (isNotNil(value)) {
this._disabledSeconds = value;
this.buildSeconds();
}
}
get nzDisabledSeconds() {
return this._disabledSeconds;
}
set format(value) {
if (isNotNil(value)) {
this._format = value;
this.enabledColumns = 0;
const charSet = new Set(value);
this.hourEnabled = charSet.has('H') || charSet.has('h');
this.minuteEnabled = charSet.has('m');
this.secondEnabled = charSet.has('s');
if (this.hourEnabled) {
this.enabledColumns++;
}
if (this.minuteEnabled) {
this.enabledColumns++;
}
if (this.secondEnabled) {
this.enabledColumns++;
}
if (this.nzUse12Hours) {
this.build12Hours();
}
}
}
get format() {
return this._format;
}
set nzHourStep(value) {
this._nzHourStep = value || 1;
this.buildHours();
}
get nzHourStep() {
return this._nzHourStep;
}
set nzMinuteStep(value) {
this._nzMinuteStep = value || 1;
this.buildMinutes();
}
get nzMinuteStep() {
return this._nzMinuteStep;
}
set nzSecondStep(value) {
this._nzSecondStep = value || 1;
this.buildSeconds();
}
get nzSecondStep() {
return this._nzSecondStep;
}
buildHours() {
let hourRanges = 24;
let disabledHours = this.nzDisabledHours?.();
let startIndex = 0;
if (this.nzUse12Hours) {
hourRanges = 12;
if (disabledHours) {
if (this.time.selected12Hours === 'PM') {
/**
* Filter and transform hours which greater or equal to 12
* [0, 1, 2, ..., 12, 13, 14, 15, ..., 23] => [12, 1, 2, 3, ..., 11]
*/
disabledHours = disabledHours.filter(i => i >= 12).map(i => (i > 12 ? i - 12 : i));
}
else {
/**
* Filter and transform hours which less than 12
* [0, 1, 2,..., 12, 13, 14, 15, ...23] => [12, 1, 2, 3, ..., 11]
*/
disabledHours = disabledHours.filter(i => i < 12 || i === 24).map(i => (i === 24 || i === 0 ? 12 : i));
}
}
startIndex = 1;
}
this.hourRange = makeRange(hourRanges, this.nzHourStep, startIndex).map(r => ({
index: r,
disabled: !!disabledHours && disabledHours.indexOf(r) !== -1
}));
if (this.nzUse12Hours && this.hourRange[this.hourRange.length - 1].index === 12) {
const temp = [...this.hourRange];
temp.unshift(temp[temp.length - 1]);
temp.splice(temp.length - 1, 1);
this.hourRange = temp;
}
}
buildMinutes() {
this.minuteRange = makeRange(60, this.nzMinuteStep).map(r => ({
index: r,
disabled: !!this.nzDisabledMinutes && this.nzDisabledMinutes(this.time.hours).indexOf(r) !== -1
}));
}
buildSeconds() {
this.secondRange = makeRange(60, this.nzSecondStep).map(r => ({
index: r,
disabled: !!this.nzDisabledSeconds && this.nzDisabledSeconds(this.time.hours, this.time.minutes).indexOf(r) !== -1
}));
}
build12Hours() {
const isUpperFormat = this._format.includes('A');
this.use12HoursRange = [
{
index: 0,
value: isUpperFormat ? 'AM' : 'am'
},
{
index: 1,
value: isUpperFormat ? 'PM' : 'pm'
}
];
}
buildTimes() {
this.buildHours();
this.buildMinutes();
this.buildSeconds();
this.build12Hours();
}
scrollToTime(delay = 0) {
if (this.hourEnabled && this.hourListElement) {
this.scrollToSelected(this.hourListElement.nativeElement, this.time.viewHours, delay, 'hour');
}
if (this.minuteEnabled && this.minuteListElement) {
this.scrollToSelected(this.minuteListElement.nativeElement, this.time.minutes, delay, 'minute');
}
if (this.secondEnabled && this.secondListElement) {
this.scrollToSelected(this.secondListElement.nativeElement, this.time.seconds, delay, 'second');
}
if (this.nzUse12Hours && this.use12HoursListElement) {
const selectedHours = this.time.selected12Hours;
const index = selectedHours === 'AM' ? 0 : 1;
this.scrollToSelected(this.use12HoursListElement.nativeElement, index, delay, '12-hour');
}
}
selectHour(hour) {
this.time.setHours(hour.index, hour.disabled);
if (this._disabledMinutes) {
this.buildMinutes();
}
if (this._disabledSeconds || this._disabledMinutes) {
this.buildSeconds();
}
}
selectMinute(minute) {
this.time.setMinutes(minute.index, minute.disabled);
if (this._disabledSeconds) {
this.buildSeconds();
}
}
selectSecond(second) {
this.time.setSeconds(second.index, second.disabled);
}
select12Hours(value) {
this.time.setSelected12Hours(value.value);
if (this._disabledHours) {
this.buildHours();
}
if (this._disabledMinutes) {
this.buildMinutes();
}
if (this._disabledSeconds) {
this.buildSeconds();
}
}
scrollToSelected(instance, index, duration = 0, unit) {
if (!instance) {
return;
}
const transIndex = this.translateIndex(index, unit);
const currentOption = (instance.children[transIndex] || instance.children[0]);
this.scrollTo(instance, currentOption.offsetTop, duration);
}
translateIndex(index, unit) {
if (unit === 'hour') {
return this.calcIndex(this.nzDisabledHours?.(), this.hourRange.map(item => item.index).indexOf(index));
}
else if (unit === 'minute') {
return this.calcIndex(this.nzDisabledMinutes?.(this.time.hours), this.minuteRange.map(item => item.index).indexOf(index));
}
else if (unit === 'second') {
// second
return this.calcIndex(this.nzDisabledSeconds?.(this.time.hours, this.time.minutes), this.secondRange.map(item => item.index).indexOf(index));
}
else {
// 12-hour
return this.calcIndex([], this.use12HoursRange.map(item => item.index).indexOf(index));
}
}
scrollTo(element, to, duration) {
if (duration <= 0) {
element.scrollTop = to;
return;
}
const difference = to - element.scrollTop;
const perTick = (difference / duration) * 10;
this.ngZone.runOutsideAngular(() => {
reqAnimFrame(() => {
element.scrollTop = element.scrollTop + perTick;
if (element.scrollTop === to) {
return;
}
this.scrollTo(element, to, duration - 10);
});
});
}
calcIndex(array, index) {
if (array?.length && this.nzHideDisabledOptions) {
return index - array.reduce((pre, value) => pre + (value < index ? 1 : 0), 0);
}
else {
return index;
}
}
changed() {
if (this.onChange) {
this.onChange(this.time.value);
}
}
touched() {
if (this.onTouch) {
this.onTouch();
}
}
timeDisabled(value) {
const hour = value.getHours();
const minute = value.getMinutes();
const second = value.getSeconds();
return ((this.nzDisabledHours?.().indexOf(hour) ?? -1) > -1 ||
(this.nzDisabledMinutes?.(hour).indexOf(minute) ?? -1) > -1 ||
(this.nzDisabledSeconds?.(hour, minute).indexOf(second) ?? -1) > -1);
}
onClickNow() {
const now = new Date();
if (this.timeDisabled(now)) {
return;
}
this.time.setValue(now);
this.changed();
this.closePanel.emit();
}
onClickOk() {
this.time.setValue(this.time.value, this.nzUse12Hours);
this.changed();
this.closePanel.emit();
}
isSelectedHour(hour) {
return hour.index === this.time.viewHours;
}
isSelectedMinute(minute) {
return minute.index === this.time.minutes;
}
isSelectedSecond(second) {
return second.index === this.time.seconds;
}
isSelected12Hours(value) {
return value.value.toUpperCase() === this.time.selected12Hours;
}
constructor(ngZone, cdr, dateHelper, elementRef) {
this.ngZone = ngZone;
this.cdr = cdr;
this.dateHelper = dateHelper;
this.elementRef = elementRef;
}
ngOnInit() {
this.time.changes.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
this.changed();
this.touched();
this.scrollToTime(120);
});
this.buildTimes();
this.ngZone.runOutsideAngular(() => {
setTimeout(() => {
this.scrollToTime();
this.firstScrolled = true;
});
});
fromEventOutsideAngular(this.elementRef.nativeElement, 'mousedown')
.pipe(takeUntil(this.unsubscribe$))
.subscribe(event => {
event.preventDefault();
});
}
ngOnDestroy() {
this.unsubscribe$.next();
this.unsubscribe$.complete();
}
ngOnChanges(changes) {
const { nzUse12Hours, nzDefaultOpenValue } = changes;
if (!nzUse12Hours?.previousValue && nzUse12Hours?.currentValue) {
this.build12Hours();
this.enabledColumns++;
}
if (nzDefaultOpenValue?.currentValue) {
this.time.setDefaultOpenValue(this.nzDefaultOpenValue || new Date());
}
}
writeValue(value) {
this.time.setValue(value, this.nzUse12Hours);
this.buildTimes();
if (value && this.firstScrolled) {
this.scrollToTime(120);
}
// Mark this component to be checked manually with internal properties changing (see: https://github.com/angular/angular/issues/10816)
this.cdr.markForCheck();
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouch = fn;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzTimePickerPanelComponent, deps: [{ token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i2.DateHelperService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: NzTimePickerPanelComponent, isStandalone: true, selector: "nz-time-picker-panel", inputs: { nzInDatePicker: ["nzInDatePicker", "nzInDatePicker", booleanAttribute], nzAddOn: "nzAddOn", nzHideDisabledOptions: "nzHideDisabledOptions", nzClearText: "nzClearText", nzNowText: "nzNowText", nzOkText: "nzOkText", nzPlaceHolder: "nzPlaceHolder", nzUse12Hours: ["nzUse12Hours", "nzUse12Hours", booleanAttribute], nzDefaultOpenValue: "nzDefaultOpenValue", nzAllowEmpty: ["nzAllowEmpty", "nzAllowEmpty", booleanAttribute], nzDisabledHours: "nzDisabledHours", nzDisabledMinutes: "nzDisabledMinutes", nzDisabledSeconds: "nzDisabledSeconds", format: "format", nzHourStep: ["nzHourStep", "nzHourStep", numberAttribute], nzMinuteStep: ["nzMinuteStep", "nzMinuteStep", numberAttribute], nzSecondStep: ["nzSecondStep", "nzSecondStep", numberAttribute] }, outputs: { closePanel: "closePanel" }, host: { properties: { "class.ant-picker-time-panel-column-0": "enabledColumns === 0 && !nzInDatePicker", "class.ant-picker-time-panel-column-1": "enabledColumns === 1 && !nzInDatePicker", "class.ant-picker-time-panel-column-2": "enabledColumns === 2 && !nzInDatePicker", "class.ant-picker-time-panel-column-3": "enabledColumns === 3 && !nzInDatePicker", "class.ant-picker-time-panel-narrow": "enabledColumns < 3", "class.ant-picker-time-panel-placement-bottomLeft": "!nzInDatePicker" }, classAttribute: "ant-picker-time-panel" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzTimePickerPanelComponent), multi: true }], viewQueries: [{ propertyName: "hourListElement", first: true, predicate: ["hourListElement"], descendants: true }, { propertyName: "minuteListElement", first: true, predicate: ["minuteListElement"], descendants: true }, { propertyName: "secondListElement", first: true, predicate: ["secondListElement"], descendants: true }, { propertyName: "use12HoursListElement", first: true, predicate: ["use12HoursListElement"], descendants: true }], exportAs: ["nzTimePickerPanel"], usesOnChanges: true, ngImport: i0, template: `
@if (nzInDatePicker) {
<div class="ant-picker-header">
<div class="ant-picker-header-view">{{ dateHelper.format($any(time?.value), format) || ' ' }}</div>
</div>
}
<div class="ant-picker-content">
@if (hourEnabled) {
<ul #hourListElement class="ant-picker-time-panel-column" style="position: relative;">
@for (hour of hourRange; track $index) {
@if (!(nzHideDisabledOptions && hour.disabled)) {
<li
class="ant-picker-time-panel-cell"
(click)="selectHour(hour)"
[class.ant-picker-time-panel-cell-selected]="isSelectedHour(hour)"
[class.ant-picker-time-panel-cell-disabled]="hour.disabled"
>
<div class="ant-picker-time-panel-cell-inner">{{ hour.index | number: '2.0-0' }}</div>
</li>
}
}
</ul>
}
@if (minuteEnabled) {
<ul #minuteListElement class="ant-picker-time-panel-column" style="position: relative;">
@for (minute of minuteRange; track $index) {
@if (!(nzHideDisabledOptions && minute.disabled)) {
<li
class="ant-picker-time-panel-cell"
(click)="selectMinute(minute)"
[class.ant-picker-time-panel-cell-selected]="isSelectedMinute(minute)"
[class.ant-picker-time-panel-cell-disabled]="minute.disabled"
>
<div class="ant-picker-time-panel-cell-inner">{{ minute.index | number: '2.0-0' }}</div>
</li>
}
}
</ul>
}
@if (secondEnabled) {
<ul #secondListElement class="ant-picker-time-panel-column" style="position: relative;">
@for (second of secondRange; track $index) {
@if (!(nzHideDisabledOptions && second.disabled)) {
<li
class="ant-picker-time-panel-cell"
(click)="selectSecond(second)"
[class.ant-picker-time-panel-cell-selected]="isSelectedSecond(second)"
[class.ant-picker-time-panel-cell-disabled]="second.disabled"
>
<div class="ant-picker-time-panel-cell-inner">{{ second.index | number: '2.0-0' }}</div>
</li>
}
}
</ul>
}
@if (nzUse12Hours) {
<ul #use12HoursListElement class="ant-picker-time-panel-column" style="position: relative;">
@for (range of use12HoursRange; track range) {
<li
(click)="select12Hours(range)"
class="ant-picker-time-panel-cell"
[class.ant-picker-time-panel-cell-selected]="isSelected12Hours(range)"
>
<div class="ant-picker-time-panel-cell-inner">{{ range.value }}</div>
</li>
}
</ul>
}
</div>
@if (!nzInDatePicker) {
<div class="ant-picker-footer">
@if (nzAddOn) {
<div class="ant-picker-footer-extra">
<ng-template [ngTemplateOutlet]="nzAddOn"></ng-template>
</div>
}
<ul class="ant-picker-ranges">
<li class="ant-picker-now">
<a (click)="onClickNow()">
{{ nzNowText || ('Calendar.lang.now' | nzI18n) }}
</a>
</li>
<li class="ant-picker-ok">
<button nz-button type="button" nzSize="small" nzType="primary" (click)="onClickOk()">
{{ nzOkText || ('Calendar.lang.ok' | nzI18n) }}
</button>
</li>
</ul>
</div>
}
`, isInline: true, dependencies: [{ kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NzI18nModule }, { kind: "pipe", type: i2.NzI18nPipe, name: "nzI18n" }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$1.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzTimePickerPanelComponent, decorators: [{
type: Component,
args: [{
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'nz-time-picker-panel',
exportAs: 'nzTimePickerPanel',
template: `
@if (nzInDatePicker) {
<div class="ant-picker-header">
<div class="ant-picker-header-view">{{ dateHelper.format($any(time?.value), format) || ' ' }}</div>
</div>
}
<div class="ant-picker-content">
@if (hourEnabled) {
<ul #hourListElement class="ant-picker-time-panel-column" style="position: relative;">
@for (hour of hourRange; track $index) {
@if (!(nzHideDisabledOptions && hour.disabled)) {
<li
class="ant-picker-time-panel-cell"
(click)="selectHour(hour)"
[class.ant-picker-time-panel-cell-selected]="isSelectedHour(hour)"
[class.ant-picker-time-panel-cell-disabled]="hour.disabled"
>
<div class="ant-picker-time-panel-cell-inner">{{ hour.index | number: '2.0-0' }}</div>
</li>
}
}
</ul>
}
@if (minuteEnabled) {
<ul #minuteListElement class="ant-picker-time-panel-column" style="position: relative;">
@for (minute of minuteRange; track $index) {
@if (!(nzHideDisabledOptions && minute.disabled)) {
<li
class="ant-picker-time-panel-cell"
(click)="selectMinute(minute)"
[class.ant-picker-time-panel-cell-selected]="isSelectedMinute(minute)"
[class.ant-picker-time-panel-cell-disabled]="minute.disabled"
>
<div class="ant-picker-time-panel-cell-inner">{{ minute.index | number: '2.0-0' }}</div>
</li>
}
}
</ul>
}
@if (secondEnabled) {
<ul #secondListElement class="ant-picker-time-panel-column" style="position: relative;">
@for (second of secondRange; track $index) {
@if (!(nzHideDisabledOptions && second.disabled)) {
<li
class="ant-picker-time-panel-cell"
(click)="selectSecond(second)"
[class.ant-picker-time-panel-cell-selected]="isSelectedSecond(second)"
[class.ant-picker-time-panel-cell-disabled]="second.disabled"
>
<div class="ant-picker-time-panel-cell-inner">{{ second.index | number: '2.0-0' }}</div>
</li>
}
}
</ul>
}
@if (nzUse12Hours) {
<ul #use12HoursListElement class="ant-picker-time-panel-column" style="position: relative;">
@for (range of use12HoursRange; track range) {
<li
(click)="select12Hours(range)"
class="ant-picker-time-panel-cell"
[class.ant-picker-time-panel-cell-selected]="isSelected12Hours(range)"
>
<div class="ant-picker-time-panel-cell-inner">{{ range.value }}</div>
</li>
}
</ul>
}
</div>
@if (!nzInDatePicker) {
<div class="ant-picker-footer">
@if (nzAddOn) {
<div class="ant-picker-footer-extra">
<ng-template [ngTemplateOutlet]="nzAddOn"></ng-template>
</div>
}
<ul class="ant-picker-ranges">
<li class="ant-picker-now">
<a (click)="onClickNow()">
{{ nzNowText || ('Calendar.lang.now' | nzI18n) }}
</a>
</li>
<li class="ant-picker-ok">
<button nz-button type="button" nzSize="small" nzType="primary" (click)="onClickOk()">
{{ nzOkText || ('Calendar.lang.ok' | nzI18n) }}
</button>
</li>
</ul>
</div>
}
`,
host: {
class: 'ant-picker-time-panel',
'[class.ant-picker-time-panel-column-0]': `enabledColumns === 0 && !nzInDatePicker`,
'[class.ant-picker-time-panel-column-1]': `enabledColumns === 1 && !nzInDatePicker`,
'[class.ant-picker-time-panel-column-2]': `enabledColumns === 2 && !nzInDatePicker`,
'[class.ant-picker-time-panel-column-3]': `enabledColumns === 3 && !nzInDatePicker`,
'[class.ant-picker-time-panel-narrow]': `enabledColumns < 3`,
'[class.ant-picker-time-panel-placement-bottomLeft]': `!nzInDatePicker`
},
providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzTimePickerPanelComponent), multi: true }],
imports: [DecimalPipe, NgTemplateOutlet, NzI18nModule, NzButtonModule]
}]
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i2.DateHelperService }, { type: i0.ElementRef }], propDecorators: { hourListElement: [{
type: ViewChild,
args: ['hourListElement', { static: false }]
}], minuteListElement: [{
type: ViewChild,
args: ['minuteListElement', { static: false }]
}], secondListElement: [{
type: ViewChild,
args: ['secondListElement', { static: false }]
}], use12HoursListElement: [{
type: ViewChild,
args: ['use12HoursListElement', { static: false }]
}], nzInDatePicker: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzAddOn: [{
type: Input
}], nzHideDisabledOptions: [{
type: Input
}], nzClearText: [{
type: Input
}], nzNowText: [{
type: Input
}], nzOkText: [{
type: Input
}], nzPlaceHolder: [{
type: Input
}], nzUse12Hours: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzDefaultOpenValue: [{
type: Input
}], closePanel: [{
type: Output
}], nzAllowEmpty: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzDisabledHours: [{
type: Input
}], nzDisabledMinutes: [{
type: Input
}], nzDisabledSeconds: [{
type: Input
}], format: [{
type: Input
}], nzHourStep: [{
type: Input,
args: [{ transform: numberAttribute }]
}], nzMinuteStep: [{
type: Input,
args: [{ transform: numberAttribute }]
}], nzSecondStep: [{
type: Input,
args: [{ transform: numberAttribute }]
}] } });
const NZ_CONFIG_MODULE_NAME = 'timePicker';
let NzTimePickerComponent = (() => {
let _nzHourStep_decorators;
let _nzHourStep_initializers = [];
let _nzHourStep_extraInitializers = [];
let _nzMinuteStep_decorators;
let _nzMinuteStep_initializers = [];
let _nzMinuteStep_extraInitializers = [];
let _nzSecondStep_decorators;
let _nzSecondStep_initializers = [];
let _nzSecondStep_extraInitializers = [];
let _nzClearText_decorators;
let _nzClearText_initializers = [];
let _nzClearText_extraInitializers = [];
let _nzNowText_decorators;
let _nzNowText_initializers = [];
let _nzNowText_extraInitializers = [];
let _nzOkText_decorators;
let _nzOkText_initializers = [];
let _nzOkText_extraInitializers = [];
let _nzPopupClassName_decorators;
let _nzPopupClassName_initializers = [];
let _nzPopupClassName_extraInitializers = [];
let _nzFormat_decorators;
let _nzFormat_initializers = [];
let _nzFormat_extraInitializers = [];
let _nzUse12Hours_decorators;
let _nzUse12Hours_initializers = [];
let _nzUse12Hours_extraInitializers = [];
let _nzSuffixIcon_decorators;
let _nzSuffixIcon_initializers = [];
let _nzSuffixIcon_extraInitializers = [];
let _nzAllowEmpty_decorators;
let _nzAllowEmpty_initializers = [];
let _nzAllowEmpty_extraInitializers = [];
let _nzBackdrop_decorators;
let _nzBackdrop_initializers = [];
let _nzBackdrop_extraInitializers = [];
return class NzTimePickerComponent {
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
_nzHourStep_decorators = [WithConfig()];
_nzMinuteStep_decorators = [WithConfig()];
_nzSecondStep_decorators = [WithConfig()];
_nzClearText_decorators = [WithConfig()];
_nzNowText_decorators = [WithConfig()];
_nzOkText_decorators = [WithConfig()];
_nzPopupClassName_decorators = [WithConfig()];
_nzFormat_decorators = [WithConfig()];
_nzUse12Hours_decorators = [WithConfig()];
_nzSuffixIcon_decorators = [WithConfig()];
_nzAllowEmpty_decorators = [WithConfig()];
_nzBackdrop_decorators = [WithConfig()];
__esDecorate(null, null, _nzHourStep_decorators, { kind: "field", name: "nzHourStep", static: false, private: false, access: { has: obj => "nzHourStep" in obj, get: obj => obj.nzHourStep, set: (obj, value) => { obj.nzHourStep = value; } }, metadata: _metadata }, _nzHourStep_initializers, _nzHourStep_extraInitializers);
__esDecorate(null, null, _nzMinuteStep_decorators, { kind: "field", name: "nzMinuteStep", static: false, private: false, access: { has: obj => "nzMinuteStep" in obj, get: obj => obj.nzMinuteStep, set: (obj, value) => { obj.nzMinuteStep = value; } }, metadata: _metadata }, _nzMinuteStep_initializers, _nzMinuteStep_extraInitializers);
__esDecorate(null, null, _nzSecondStep_decorators, { kind: "field", name: "nzSecondStep", static: false, private: false, access: { has: obj => "nzSecondStep" in obj, get: obj => obj.nzSecondStep, set: (obj, value) => { obj.nzSecondStep = value; } }, metadata: _metadata }, _nzSecondStep_initializers, _nzSecondStep_extraInitializers);
__esDecorate(null, null, _nzClearText_decorators, { kind: "field", name: "nzClearText", static: false, private: false, access: { has: obj => "nzClearText" in obj, get: obj => obj.nzClearText, set: (obj, value) => { obj.nzClearText = value; } }, metadata: _metadata }, _nzClearText_initializers, _nzClearText_extraInitializers);
__esDecorate(null, null, _nzNowText_decorators, { kind: "field", name: "nzNowText", static: false, private: false, access: { has: obj => "nzNowText" in obj, get: obj => obj.nzNowText, set: (obj, value) => { obj.nzNowText = value; } }, metadata: _metadata }, _nzNowText_initializers, _nzNowText_extraInitializers);
__esDecorate(null, null, _nzOkText_decorators, { kind: "field", name: "nzOkText", static: false, private: false, access: { has: obj => "nzOkText" in obj, get: obj => obj.nzOkText, set: (obj, value) => { obj.nzOkText = value; } }, metadata: _metadata }, _nzOkText_initializers, _nzOkText_extraInitializers);
__esDecorate(null, null, _nzPopupClassName_decorators, { kind: "field", name: "nzPopupClassName", static: false, private: false, access: { has: obj => "nzPopupClassName" in obj, get: obj => obj.nzPopupClassName, set: (obj, value) => { obj.nzPopupClassName = value; } }, metadata: _metadata }, _nzPopupClassName_initializers, _nzPopupClassName_extraInitializers);
__esDecorate(null, null, _nzFormat_decorators, { kind: "field", name: "nzFormat", static: false, private: false, access: { has: obj => "nzFormat" in obj, get: obj => obj.nzFormat, set: (obj, value) => { obj.nzFormat = value; } }, metadata: _metadata }, _nzFormat_initializers, _nzFormat_extraInitializers);
__esDecorate(null, null, _nzUse12Hours_decorators, { kind: "field", name: "nzUse12Hours", static: false, private: false, access: { has: obj => "nzUse12Hours" in obj, get: obj => obj.nzUse12Hours, set: (obj, value) => { obj.nzUse12Hours = value; } }, metadata: _metadata }, _nzUse12Hours_initializers, _nzUse12Hours_extraInitializers);
__esDecorate(null, null, _nzSuffixIcon_decorators, { kind: "field", name: "nzSuffixIcon", static: false, private: false, access: { has: obj => "nzSuffixIcon" in obj, get: obj => obj.nzSuffixIcon, set: (obj, value) => { obj.nzSuffixIcon = value; } }, metadata: _metadata }, _nzSuffixIcon_initializers, _nzSuffixIcon_extraInitializers);
__esDecorate(null, null, _nzAllowEmpty_decorators, { kind: "field", name: "nzAllowEmpty", static: false, private: false, access: { has: obj => "nzAllowEmpty" in obj, get: obj => obj.nzAllowEmpty, set: (obj, value) => { obj.nzAllowEmpty = value; } }, metadata: _metadata }, _nzAllowEmpty_initializers, _nzAllowEmpty_extraInitializers);
__esDecorate(null, null, _nzBackdrop_decorators, { kind: "field", name: "nzBackdrop", static: false, private: false, access: { has: obj => "nzBackdrop" in obj, get: obj => obj.nzBackdrop, set: (obj, value) => { obj.nzBackdrop = value; } }, metadata: _metadata }, _nzBackdrop_initializers, _nzBackdrop_extraInitializers);
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
}
nzConfigService;
i18n;
element;
renderer;
cdr;
dateHelper;
platform;
directionality;
_nzModuleName = NZ_CONFIG_MODULE_NAME;
_onChange;
_onTouched;
destroy$ = inject(NzDestroyService);
isNzDisableFirstChange = true;
isInit = false;
focused = false;
inputValue = '';
value = null;
preValue = null;
inputSize;
i18nPlaceHolder$ = of(undefined);
overlayPositions = [
{
offsetY: 3,
originX: 'start',
originY: 'bottom',
overlayX: 'start',
overlayY: 'top'
},
{
offsetY: -3,
originX: 'start',
originY: 'top',
overlayX: 'start',
overlayY: 'bottom'
},
{
offsetY: 3,
originX: 'end',
originY: 'bottom',
overlayX: 'end',
overlayY: 'top'
},
{
offsetY: -3,
originX: 'end',
originY: 'top',
overlayX: 'end',
overlayY: 'bottom'
}
];
dir = 'ltr';
// status
prefixCls = 'ant-picker';
statusCls = {};
status = '';
hasFeedback = false;
get origin() {
return this.element;
}
inputRef;
nzId = null;
nzSize = 'default';
nzStatus = '';
nzHourStep = __runInitializers(this, _nzHourStep_initializers, 1);
nzMinuteStep = (__runInitializers(this, _nzHourStep_extraInitializers), __runInitializers(this, _nzMinuteStep_initializers, 1));
nzSecondStep = (__runInitializers(this, _nzMinuteStep_extraInitializers), __runInitializers(this, _nzSecondStep_initializers, 1));
nzClearText = (__runInitializers(this, _nzSecondStep_extraInitializers), __runInitializers(this, _nzClearText_initializers, 'clear'));
nzNowText = (__runInitializers(this, _nzClearText_extraInitializers), __runInitializers(this, _nzNowText_initializers, ''));
nzOkText = (__runInitializers(this, _nzNowText_extraInitializers), __runInitializers(this, _nzOkText_initializers, ''));
nzPopupClassName = (__runInitializers(this, _nzOkText_extraInitializers), __runInitializers(this, _nzPopupClassName_initializers, ''));
nzPlaceHolder = (__runInitializers(this, _nzPopupClassName_extraInitializers), '');
nzAddOn;
nzDefaultOpenValue;
nzDisabledHours;
nzDisabledMinutes;
nzDisabledSeconds;
nzFormat = __runInitializers(this, _nzFormat_initializers, 'HH:mm:ss');
nzOpen = (__runInitializers(this, _nzFormat_extraInitializers), false);
nzUse12Hours = __runInitializers(this, _nzUse12Hours_initializers, false);
nzSuffixIcon = (__runInitializers(this, _nzUse12Hours_extraInitializers), __runInitializers(this, _nzSuffixIcon_initializers, 'clock-circle'));
nzOpenChange = (__runInitializers(this, _nzSuffixIcon_extraInitializers), new EventEmitter());
nzHideDisabledOptions = false;
nzAllowEmpty = __runInitializers(this, _nzAllowEmpty_initializers, true);
nzDisabled = (__runInitializers(this, _nzAllowEmpty_extraInitializers), false);
nzAutoFocus = false;
nzBackdrop = __runInitializers(this, _nzBackdrop_initializers, false);
nzBorderless = (__runInitializers(this, _nzBackdrop_extraInitializers), false);
nzInputReadOnly = false;
emitValue(value) {
this.setValue(value, true);
if (this._onChange) {
this._onChange(this.value);
}
if (this._onTouched) {
this._onTouched();
}
}
setValue(value, syncPreValue = false) {
if (syncPreValue) {
this.preValue = isValid(value) ? new Date(value) : null;
}
this.value = isValid(value) ? new Date(value) : null;
this.inputValue = this.dateHelper.format(value, this.nzFormat);
this.cdr.markForCheck();
}
open() {
if (this.nzDisabled || this.nzOpen) {
return;
}
this.focus();
this.nzOpen = true;
this.nzOpenChange.emit(this.nzOpen);
}
close() {
this.nzOpen = false;
this.cdr.markForCheck();
this.nzOpenChange.emit(this.nzOpen);
}
updateAutoFocus() {
if (this.isInit && !this.nzDisabled) {
if (this.nzAutoFocus) {
this.renderer.setAttribute(this.inputRef.nativeElement, 'autofocus', 'autofocus');
}
else {
this.renderer.removeAttribute(this.inputRef.nativeElement, 'autofocus');
}
}
}
onClickClearBtn(event) {
event.stopPropagation();
this.emitValue(null);
}
onClickOutside(event) {
const target = _getEventTarget(event);
if (!this.element.nativeElement.contains(target)) {
this.setCurrentValueAndClose();
}
}
onFocus(value) {
this.focused = value;
if (!value) {
if (this.checkTimeValid(this.value)) {
this.setCurrentValueAndClose();
}
else {
this.setValue(this.preValue);
this.close();
}
}
}
focus() {
if (this.inputRef.nativeElement) {
this.inputRef.nativeElement.focus();
}
}
blur() {
if (this.inputRef.nativeElement) {
this.inputRef.nativeElement.blur();
}
}
onKeyupEsc() {
this.setValue(this.preValue);
}
onKeyupEnter() {
if (this.nzOpen && isValid(this.value)) {
this.setCurrentValueAndClose();
}
else if (!this.nzOpen) {
this.open();
}
}
onInputChange(str) {
if (!this.platform.TRIDENT && document.activeElement === this.inputRef.nativeElement) {
this.open();
this.parseTimeString(str);
}
}
onPanelValueChange(value) {
this.setValue(value);
this.focus();
}
closePanel() {
this.inputRef.nativeElement.blur();
}
setCurrentValueAndClose() {
this.emitValue(this.value);
this.close();
}
finalSize = computed(() => {
if (this.compactSize) {
return this.compactSize();
}
return this.size();
});
size = signal(this.nzSize);
compactSize = inject(NZ_SPACE_COMPACT_SIZE, { optional: true });
nzFormStatusService = inject(NzFormStatusService, { optional: true });
nzFormNoStatusService = inject(NzFormNoStatusService, { optional: true });
constructor(nzConfigService, i18n, element, renderer, cdr, dateHelper, platform, directionality) {
this.nzConfigService = nzConfigService;
this.i18n = i18n;
this.element = element;
this.renderer = renderer;
this.cdr = cdr;
this.dateHelper = dateHelper;
this.platform = platform;
this.directionality = directionality;
}
ngOnInit() {
this.nzFormStatusService?.formStatusChanges
.pipe(distinctUntilChanged((pre, cur) => {
return pre.status === cur.status && pre.hasFeedback === cur.hasFeedback;
}), withLatestFrom(this.nzFormNoStatusService ? this.nzFormNoStatusService.noFormStatus : of(false)), map(([{ status, hasFeedback }, noStatus]) => ({ status: noStatus ? '' : status, hasFeedback })), takeUntil(this.destroy$))
.subscribe(({ status, hasFeedback }) => {
this.setStatusStyles(status, hasFeedback);
});
this.inputSize = Math.max(8, this.nzFormat.length) + 2;
this.i18nPlaceHolder$ = this.i18n.localeChange.pipe(map((nzLocale) => nzLocale.TimePicker.placeholder));
this.dir = this.directionality.value;
this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction) => {
this.dir = direction;
});
}
ngOnChanges({ nzUse12Hours, nzFormat, nzDisabled, nzAutoFocus, nzStatus, nzSize }) {
if (nzUse12Hours && !nzUse12Hours.previousValue && nzUse12Hours.currentValue && !nzFormat) {
this.nzFormat = 'h:mm:ss a';
}
if (nzDisabled) {
const value = nzDisabled.currentValue;
const input = this.inputRef.nativeElement;
if (value) {
this.renderer.setAttribute(input, 'disabled', '');
}
else {
this.renderer.removeAttribute(input, 'disabled');
}
}
if (nzAutoFocus) {
this.updateAutoFocus();
}
if (nzStatus) {
this.setStatusStyles(this.nzStatus, this.hasFeedback);
}
if (nzSize) {
this.size.set(nzSize.currentValue);
}
}
parseTimeString(str) {
const value = this.dateHelper.parseTime(str, this.nzFormat) || null;