• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

atinc / ngx-tethys / 10698a89-6a67-4df9-92de-a09375e9923d

12 Dec 2023 02:44AM UTC coverage: 90.216% (-0.2%) from 90.396%
10698a89-6a67-4df9-92de-a09375e9923d

Pull #2967

circleci

mengshuicmq
Merge branch 'cmq/feat-#INFR-10719' of https://github.com/atinc/ngx-tethys into cmq/feat-#INFR-10719
Pull Request #2967: feat(datePicker): date-picker support quarter(#INFR-10719)

5366 of 6616 branches covered (0.0%)

Branch coverage included in aggregate %.

60 of 83 new or added lines in 7 files covered. (72.29%)

19 existing lines in 5 files now uncovered.

13390 of 14174 relevant lines covered (94.47%)

968.26 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.79
/src/date-picker/lib/popups/inner-popup.component.ts
1
import {
2
    ChangeDetectionStrategy,
3
    Component,
4
    EventEmitter,
5
    HostBinding,
6
    Input,
7
    OnChanges,
8
    Output,
9
    SimpleChanges,
10
    TemplateRef
11
} from '@angular/core';
12

13
import { coerceBooleanProperty, FunctionProp, TinyDate } from 'ngx-tethys/util';
14
import { DateHelperService } from '../../date-helper.service';
15
import { RangePartType } from '../../inner-types';
16
import { isAfterMoreThanLessOneYear, isAfterMoreThanOneDecade, isAfterMoreThanOneMonth, isAfterMoreThanOneYear } from '../../picker.util';
17
import { DisabledDateFn, ThyPanelMode } from '../../standard-types';
18
import { DateHeaderComponent } from '../date/date-header.component';
19
import { DateTableComponent } from '../date/date-table.component';
20

21
import { NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';
1✔
22
import { ThyInputDirective } from 'ngx-tethys/input';
23
import { DecadeHeaderComponent } from '../decade/decade-header.component';
199✔
24
import { DecadeTableComponent } from '../decade/decade-table.component';
25
import { MonthHeaderComponent } from '../month/month-header.component';
26
import { MonthTableComponent } from '../month/month-table.component';
420✔
27
import { YearHeaderComponent } from '../year/year-header.component';
28
import { YearTableComponent } from '../year/year-table.component';
29
import { QuarterTableComponent } from '../quarter/quarter-table.component';
197✔
30

197✔
31
/**
197✔
32
 * @private
197✔
33
 */
197✔
34
@Component({
197✔
35
    changeDetection: ChangeDetectionStrategy.OnPush,
197✔
36
    // eslint-disable-next-line @angular-eslint/component-selector
197✔
37
    selector: 'inner-popup',
38
    exportAs: 'innerPopup',
39
    templateUrl: 'inner-popup.component.html',
420✔
40
    standalone: true,
64✔
41
    imports: [
42
        NgIf,
420!
43
        ThyInputDirective,
×
44
        NgSwitch,
45
        NgSwitchCase,
46
        DecadeHeaderComponent,
47
        DecadeTableComponent,
8✔
48
        YearHeaderComponent,
49
        YearTableComponent,
50
        MonthHeaderComponent,
28!
51
        MonthTableComponent,
28✔
52
        QuarterTableComponent,
53
        NgSwitchDefault,
54
        DateHeaderComponent,
3✔
55
        DateTableComponent
3✔
56
    ]
2✔
57
})
2✔
58
export class InnerPopupComponent implements OnChanges {
59
    @HostBinding('class.thy-calendar-picker-inner-popup') className = true;
60
    @HostBinding('class.thy-calendar-picker-inner-popup-with-range-input') _showDateRangeInput = false;
1✔
61

1✔
62
    @Input() showWeek: boolean;
63
    @Input() isRange: boolean;
64
    @Input() activeDate: TinyDate;
65
    @Input() rangeActiveDate: TinyDate[]; // Range ONLY
2✔
66
    @Input() enablePrev: boolean;
2!
67
    @Input() enableNext: boolean;
2✔
68
    @Input() disabledDate: DisabledDateFn;
2✔
69
    @Input() dateRender: FunctionProp<TemplateRef<Date> | string>;
70
    @Input() selectedValue: TinyDate[]; // Range ONLY
UNCOV
71
    @Input() hoverValue: TinyDate[]; // Range ONLY
×
UNCOV
72

×
73
    @Input() panelMode: ThyPanelMode;
74

75
    @Input() set showDateRangeInput(value: boolean) {
76
        this._showDateRangeInput = coerceBooleanProperty(value);
3✔
77
    }
3✔
78

2✔
79
    get showDateRangeInput() {
2✔
80
        return this._showDateRangeInput;
81
    }
82

1✔
83
    @Input() partType: RangePartType;
1✔
84

85
    @Input() endPanelMode: ThyPanelMode;
86

UNCOV
87
    @Output() readonly panelModeChange = new EventEmitter<ThyPanelMode>();
×
UNCOV
88

×
UNCOV
89
    @Input() value: TinyDate;
×
UNCOV
90

×
91
    @Output() readonly headerChange = new EventEmitter<TinyDate>();
92
    @Output() readonly selectDate = new EventEmitter<TinyDate>();
UNCOV
93
    @Output() readonly dayHover = new EventEmitter<TinyDate>();
×
UNCOV
94

×
95
    prefixCls = 'thy-calendar';
96

97
    constructor(private dateHelper: DateHelperService) {}
98

666✔
99
    ngOnChanges(changes: SimpleChanges): void {
432✔
100
        if (changes.activeDate && !changes.activeDate.currentValue) {
188✔
101
            this.activeDate = new TinyDate();
188✔
102
        }
103
        if (changes.panelMode && changes.panelMode.currentValue === 'time') {
104
            this.panelMode = 'date';
244✔
105
        }
106
    }
107

108
    getReadableValue(value: TinyDate) {
234✔
109
        return value ? this.dateHelper.format(value.nativeDate, 'yyyy-MM-dd') : '';
110
    }
111

112
    onSelectDate(date: TinyDate | Date): void {
840✔
113
        const value = date instanceof TinyDate ? date : new TinyDate(date);
490✔
114

217✔
115
        this.selectDate.emit(value);
217✔
116
    }
188✔
117

118
    onChooseMonth(value: TinyDate): void {
29✔
119
        this.activeDate = this.activeDate.setMonth(value.getMonth());
20✔
120
        if (this.endPanelMode === 'month') {
121
            this.value = value;
9✔
122
            this.selectDate.emit(value);
5✔
123
        } else {
124
            this.headerChange.emit(value);
125
            this.panelModeChange.emit(this.endPanelMode);
126
        }
273✔
127
    }
128

129
    onChooseQuarter(value: TinyDate): void {
130
        this.activeDate = this.activeDate.setQuarter(value.getQuarter());
350✔
131
        if (this.endPanelMode === 'quarter') {
132
            this.value = value;
133
            this.selectDate.emit(value);
1✔
134
        } else {
135
            this.headerChange.emit(value);
136
            this.panelModeChange.emit(this.endPanelMode);
1✔
137
        }
138
    }
139

140
    onChooseYear(value: TinyDate): void {
141
        this.activeDate = this.activeDate.setYear(value.getYear());
142
        if (this.endPanelMode === 'year') {
143
            this.value = value;
144
            this.selectDate.emit(value);
145
        } else {
146
            this.headerChange.emit(value);
147
            this.panelModeChange.emit(this.endPanelMode);
148
        }
149
    }
150

151
    onChooseDecade(value: TinyDate): void {
152
        this.activeDate = this.activeDate.setYear(value.getYear());
153
        if (this.endPanelMode === 'decade') {
154
            this.value = value;
155
            this.selectDate.emit(value);
156
        } else {
157
            this.headerChange.emit(value);
158
            this.panelModeChange.emit('year');
159
        }
160
    }
1✔
161

162
    enablePrevNext(direction: 'prev' | 'next', mode: ThyPanelMode): boolean {
163
        if (this.isRange) {
164
            if ((this.partType === 'left' && direction === 'next') || (this.partType === 'right' && direction === 'prev')) {
165
                const [headerLeftDate, headerRightDate] = this.rangeActiveDate;
166
                return isAfterMoreThanOneMonth(headerRightDate, headerLeftDate);
167
            } else {
168
                return true;
169
            }
170
        } else {
171
            return true;
172
        }
173
    }
174

175
    enableSuperPrevNext(direction: 'prev' | 'next', panelMode: ThyPanelMode) {
176
        if (this.isRange) {
177
            if ((this.partType === 'left' && direction === 'next') || (this.partType === 'right' && direction === 'prev')) {
178
                const [headerLeftDate, headerRightDate] = this.rangeActiveDate;
179
                if (panelMode === 'date') {
180
                    return isAfterMoreThanLessOneYear(headerRightDate, headerLeftDate);
181
                } else if (panelMode === 'month' || panelMode === 'quarter') {
182
                    return isAfterMoreThanOneYear(headerRightDate, headerLeftDate);
183
                } else if (panelMode === 'year') {
184
                    return isAfterMoreThanOneDecade(headerRightDate, headerLeftDate);
185
                }
186
            } else {
187
                return true;
188
            }
189
        } else {
190
            return true;
191
        }
192
    }
193
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc