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

atinc / ngx-tethys / a94de615-1a97-46e8-b07e-aa98619b3649

13 Nov 2024 12:34PM UTC coverage: 90.366% (-0.03%) from 90.398%
a94de615-1a97-46e8-b07e-aa98619b3649

push

circleci

minlovehua
feat: support i18n

5517 of 6751 branches covered (81.72%)

Branch coverage included in aggregate %.

67 of 76 new or added lines in 19 files covered. (88.16%)

55 existing lines in 10 files now uncovered.

13225 of 13989 relevant lines covered (94.54%)

1000.62 hits per line

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

86.67
/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
    inject
12
} from '@angular/core';
13

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

1✔
22
import { ThyInputDirective } from 'ngx-tethys/input';
23
import { DecadeHeader } from '../decade/decade-header.component';
200✔
24
import { DecadeTable } from '../decade/decade-table.component';
200✔
25
import { MonthHeader } from '../month/month-header.component';
200✔
26
import { MonthTable } from '../month/month-table.component';
200✔
27
import { YearHeader } from '../year/year-header.component';
200✔
28
import { YearTable } from '../year/year-table.component';
200✔
29
import { QuarterTable } from '../quarter/quarter-table.component';
200✔
30
import { ThyI18nTranslate } from 'ngx-tethys/i18n';
200✔
31

32
/**
33
 * @private
202✔
34
 */
35
@Component({
36
    changeDetection: ChangeDetectionStrategy.OnPush,
470✔
37
    // eslint-disable-next-line @angular-eslint/component-selector
38
    selector: 'inner-popup',
39
    exportAs: 'innerPopup',
470✔
40
    templateUrl: 'inner-popup.component.html',
70✔
41
    standalone: true,
42
    imports: [
470!
43
        ThyInputDirective,
×
44
        DecadeHeader,
45
        DecadeTable,
46
        YearHeader,
47
        YearTable,
8✔
48
        MonthHeader,
49
        MonthTable,
50
        QuarterTable,
28!
51
        DateHeader,
28✔
52
        DateTable,
53
        ThyI18nTranslate
54
    ]
3✔
55
})
3✔
56
export class InnerPopup implements OnChanges {
2✔
57
    private dateHelper = inject(DateHelperService);
2✔
58

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
×
72

×
73
    @Input() panelMode: ThyPanelMode;
74

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

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

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

86
    @Input() endPanelMode: ThyPanelMode;
UNCOV
87

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

×
90
    @Input() value: TinyDate;
×
91

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

96
    prefixCls = 'thy-calendar';
97

98
    ngOnChanges(changes: SimpleChanges): void {
736✔
99
        if (changes.activeDate && !changes.activeDate.currentValue) {
452✔
100
            this.activeDate = new TinyDate();
198✔
101
        }
198✔
102
        if (changes.panelMode && changes.panelMode.currentValue === 'time') {
103
            this.panelMode = 'date';
104
        }
254✔
105
    }
106

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

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

522✔
114
        this.selectDate.emit(value);
233✔
115
    }
233✔
116

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

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

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

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

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

174
    enableSuperPrevNext(direction: 'prev' | 'next', panelMode: ThyPanelMode) {
175
        if (this.isRange) {
176
            if ((this.partType === 'left' && direction === 'next') || (this.partType === 'right' && direction === 'prev')) {
177
                const [headerLeftDate, headerRightDate] = this.rangeActiveDate;
178
                if (panelMode === 'date') {
179
                    return isAfterMoreThanLessOneYear(headerRightDate, headerLeftDate);
180
                } else if (panelMode === 'month' || panelMode === 'quarter') {
181
                    return isAfterMoreThanOneYear(headerRightDate, headerLeftDate);
182
                } else if (panelMode === 'year') {
183
                    return isAfterMoreThanOneDecade(headerRightDate, headerLeftDate);
184
                }
185
            } else {
186
                return true;
187
            }
188
        } else {
189
            return true;
190
        }
191
    }
192
}
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