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

IgniteUI / igniteui-angular / 13331632524

14 Feb 2025 02:51PM CUT coverage: 22.015% (-69.6%) from 91.622%
13331632524

Pull #15372

github

web-flow
Merge d52d57714 into bcb78ae0a
Pull Request #15372: chore(*): test ci passing

1990 of 15592 branches covered (12.76%)

431 of 964 new or added lines in 18 files covered. (44.71%)

19956 existing lines in 307 files now uncovered.

6452 of 29307 relevant lines covered (22.02%)

249.17 hits per line

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

58.14
/projects/igniteui-angular/src/lib/core/touch.ts
1
import { Inject, Injectable, NgZone } from '@angular/core';
2
import { ɵgetDOM as getDOM } from '@angular/platform-browser';
3
import { DOCUMENT } from '@angular/common';
4
import { PlatformUtil } from './utils';
5
import { HammerManager, HammerOptions, HammerStatic } from './touch-annotations';
6

7
const EVENT_SUFFIX = 'precise';
2✔
8

9
/**
10
 * Touch gestures manager based on Hammer.js
11
 * Use with caution, this will track references for single manager per element. Very TBD. Much TODO.
12
 *
13
 * @hidden
14
 */
15
@Injectable()
16
export class HammerGesturesManager {
2✔
17
    public static Hammer: HammerStatic = typeof window !== 'undefined' ? (window as any).Hammer : null;
2!
18
    /**
19
     * Event option defaults for each recognizer, see http://hammerjs.github.io/api/ for API listing.
20
     */
21
    protected hammerOptions: HammerOptions = {};
1,767✔
22

23
    private platformBrowser: boolean;
24
    private _hammerManagers: Array<{ element: EventTarget; manager: HammerManager }> = [];
1,767✔
25

26
    constructor(private _zone: NgZone, @Inject(DOCUMENT) private doc: any, private platformUtil: PlatformUtil) {
1,767✔
27
        this.platformBrowser = this.platformUtil.isBrowser;
1,767✔
28
        if (this.platformBrowser && HammerGesturesManager.Hammer) {
1,767✔
29
            this.hammerOptions = {
1,767✔
30
                // D.P. #447 Force TouchInput due to PointerEventInput bug (https://github.com/hammerjs/hammer.js/issues/1065)
31
                // see https://github.com/IgniteUI/igniteui-angular/issues/447#issuecomment-324601803
32
                inputClass: HammerGesturesManager.Hammer.TouchInput,
33
                recognizers: [
34
                    [HammerGesturesManager.Hammer.Pan, { threshold: 0 }],
35
                    [HammerGesturesManager.Hammer.Swipe, { direction: HammerGesturesManager.Hammer.DIRECTION_HORIZONTAL }],
36
                    [HammerGesturesManager.Hammer.Tap],
37
                    [HammerGesturesManager.Hammer.Tap, { event: 'doubletap', taps: 2 }, ['tap']]
38
                ]
39
            };
40
        }
41
    }
42

43
    public supports(eventName: string): boolean {
44
        return eventName.toLowerCase().endsWith('.' + EVENT_SUFFIX);
×
45
    }
46

47
    /**
48
     * Add listener extended with options for Hammer.js. Will use defaults if none are provided.
49
     * Modeling after other event plugins for easy future modifications.
50
     */
51
    public addEventListener(
52
        element: HTMLElement,
53
        eventName: string,
54
        eventHandler: (eventObj) => void,
55
        options: HammerOptions = null): () => void {
×
56
        if (!this.platformBrowser) {
4!
57
            return;
×
58
        }
59

60
        // Creating the manager bind events, must be done outside of angular
61
        return this._zone.runOutsideAngular(() => {
4✔
62
            if (!HammerGesturesManager.Hammer) {
4!
63
                //no hammer
64
                return;
×
65
            }
66
            let mc: HammerManager = this.getManagerForElement(element);
4✔
67
            if (mc === null) {
4✔
68
                // new Hammer is a shortcut for Manager with defaults
69
                mc = new HammerGesturesManager.Hammer(element, Object.assign(this.hammerOptions, options));
4✔
70
                this.addManagerForElement(element, mc);
4✔
71
            }
72
            const handler = (eventObj) => this._zone.run(() => eventHandler(eventObj));
4✔
73
            mc.on(eventName, handler);
4✔
74
            return () => mc.off(eventName, handler);
4✔
75
        });
76
    }
77

78
    /**
79
     * Add listener extended with options for Hammer.js. Will use defaults if none are provided.
80
     * Modeling after other event plugins for easy future modifications.
81
     *
82
     * @param target Can be one of either window, body or document(fallback default).
83
     */
84
    public addGlobalEventListener(target: string, eventName: string, eventHandler: (eventObj) => void): () => void {
UNCOV
85
        if (!this.platformBrowser || !HammerGesturesManager.Hammer) {
×
86
            return;
×
87
        }
88

UNCOV
89
        const element = this.getGlobalEventTarget(target);
×
90

91
        // Creating the manager bind events, must be done outside of angular
UNCOV
92
        return this.addEventListener(element as HTMLElement, eventName, eventHandler);
×
93
    }
94

95
    /**
96
     * Exposes [Dom]Adapter.getGlobalEventTarget to get global event targets.
97
     * Supported: window, document, body. Defaults to document for invalid args.
98
     *
99
     * @param target Target name
100
     */
101
    public getGlobalEventTarget(target: string): EventTarget {
UNCOV
102
        return getDOM().getGlobalEventTarget(this.doc, target);
×
103
    }
104

105
    /**
106
     * Set HammerManager options.
107
     *
108
     * @param element The DOM element used to create the manager on.
109
     *
110
     * ### Example
111
     *
112
     * ```ts
113
     * manager.setManagerOption(myElem, "pan", { pointers: 1 });
114
     * ```
115
     */
116
    public setManagerOption(element: EventTarget, event: string, options: any) {
117
        const manager = this.getManagerForElement(element);
×
118
        manager.get(event).set(options);
×
119
    }
120

121
    /**
122
     * Add an element and manager map to the internal collection.
123
     *
124
     * @param element The DOM element used to create the manager on.
125
     */
126
    public addManagerForElement(element: EventTarget, manager: HammerManager) {
127
        this._hammerManagers.push({element, manager});
4✔
128
    }
129

130
    /**
131
     * Get HammerManager for the element or null
132
     *
133
     * @param element The DOM element used to create the manager on.
134
     */
135
    public getManagerForElement(element: EventTarget): HammerManager {
136
        const result =  this._hammerManagers.filter(value => value.element === element);
4✔
137
        return result.length ? result[0].manager : null;
4!
138
    }
139

140
    /**
141
     * Destroys the HammerManager for the element, removing event listeners in the process.
142
     *
143
     * @param element The DOM element used to create the manager on.
144
     */
145
    public removeManagerForElement(element: HTMLElement) {
146
        let index: number = null;
×
147
        for (let i = 0; i < this._hammerManagers.length; i++) {
×
148
            if (element === this._hammerManagers[i].element) {
×
149
                index = i;
×
150
                break;
×
151
            }
152
        }
153
        if (index !== null) {
×
154
            const item = this._hammerManagers.splice(index, 1)[0];
×
155
            // destroy also
156
            item.manager.destroy();
×
157
        }
158
    }
159

160
    /** Destroys all internally tracked HammerManagers, removing event listeners in the process. */
161
    public destroy() {
162
        for (const item of this._hammerManagers) {
1,767✔
163
            item.manager.destroy();
4✔
164
        }
165
        this._hammerManagers = [];
1,767✔
166
    }
167
}
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