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

atinc / ngx-tethys / 4fa5f46d-cf0f-4aa7-aeb7-9c52248a4f70

29 Apr 2025 10:09AM UTC coverage: 90.253% (-0.02%) from 90.272%
4fa5f46d-cf0f-4aa7-aeb7-9c52248a4f70

Pull #3360

circleci

web-flow
Merge branch 'master' into #TINFR-1474
Pull Request #3360: refactor(grid): migration signal #TINFR-1474

5609 of 6876 branches covered (81.57%)

Branch coverage included in aggregate %.

30 of 32 new or added lines in 5 files covered. (93.75%)

9 existing lines in 3 files now uncovered.

13392 of 14177 relevant lines covered (94.46%)

920.4 hits per line

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

82.76
/src/grid/thy-row.directive.ts
1
import { Directive, OnChanges, OnInit, AfterViewInit, OnDestroy, ChangeDetectionStrategy, input } from '@angular/core';
2
import { ReplaySubject } from 'rxjs';
3
import { isString } from 'ngx-tethys/util';
4
import { useHostRenderer } from '@tethys/cdk/dom';
5

6
export type ThyRowJustify = 'start' | 'end' | 'center' | 'space-around' | 'space-between';
7
export type ThyRowAlign = 'top' | 'middle' | 'bottom';
8

9
/**
10
 * 栅格行指令
11
 * @name thyRow
12
 * @order 30
1✔
13
 */
14
@Directive({
4✔
15
    selector: '[thyRow]',
4✔
16
    host: {
4✔
17
        class: 'thy-row'
18
    }
19
})
4✔
20
export class ThyRowDirective implements OnInit, OnChanges, AfterViewInit {
21
    /**
22
     * 栅格的间距
4✔
23
     */
24
    readonly thyGutter = input<
25
        | {
26
              xs?: number;
8✔
27
              sm?: number;
8✔
28
              md?: number;
8✔
29
              lg?: number;
2✔
30
              xl?: number;
31
              xxl?: number;
8✔
32
          }
1✔
33
        | number
1✔
34
    >(undefined);
35

8!
UNCOV
36
    public actualGutter$ = new ReplaySubject<[number, number]>(1);
×
UNCOV
37

×
38
    private hostRenderer = useHostRenderer();
39

40
    constructor() {}
41

8✔
42
    ngOnInit() {
8!
UNCOV
43
        this.setGutterStyle();
×
44
    }
45

8✔
46
    ngOnChanges() {
47
        this.setGutterStyle();
1✔
48
    }
1✔
49

50
    ngAfterViewInit(): void {}
51

52
    private setGutterStyle() {
1✔
53
        const [horizontalGutter, verticalGutter] = this.getGutter();
54
        this.actualGutter$.next([horizontalGutter, verticalGutter]);
55
        const renderGutter = (name: string, gutter: number) => {
56
            this.hostRenderer.setStyle(name, `-${gutter / 2}px`);
57
        };
58
        if (horizontalGutter > 0) {
59
            renderGutter('margin-left', horizontalGutter);
60
            renderGutter('margin-right', horizontalGutter);
61
        }
62
        if (verticalGutter > 0) {
63
            renderGutter('margin-top', verticalGutter);
64
            renderGutter('margin-bottom', verticalGutter);
65
        }
66
    }
67

68
    private getGutter() {
69
        const thyGutter = this.thyGutter();
70
        if (isString(thyGutter)) {
71
            throw Error(`thyGutter value can not be string type`);
72
        }
73
        return [thyGutter as number, 0];
74
    }
75
}
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