Skip to content

Commit a3ee02a

Browse files
committed
refactor(listeners.service): add focusin Trigger
1 parent 2f1b94d commit a3ee02a

File tree

3 files changed

+39
-50
lines changed

3 files changed

+39
-50
lines changed

projects/coreui-angular/src/lib/coreui.types.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export enum BreakpointInfix {
88
md = 'md',
99
lg = 'lg',
1010
xl = 'xl',
11-
xxl = 'xxl'
11+
xxl = 'xxl',
1212
}
1313

1414
export type BreakpointInfixStrings = keyof typeof BreakpointInfix;
@@ -63,13 +63,7 @@ export type TextColors =
6363
| 'white-50'
6464
| string;
6565

66-
export type Alignment =
67-
| 'baseline'
68-
| 'top'
69-
| 'middle'
70-
| 'bottom'
71-
| 'text-top'
72-
| 'text-bottom';
66+
export type Alignment = 'baseline' | 'top' | 'middle' | 'bottom' | 'text-top' | 'text-bottom';
7367

7468
export type BadgePositions =
7569
| 'top-start'
@@ -111,7 +105,7 @@ export type Shapes =
111105
| 'rounded-3'
112106
| string;
113107

114-
export type Triggers = 'hover' | 'focus' | 'click';
108+
export type Triggers = 'hover' | 'focus' | 'click' | 'focusin';
115109

116110
export type Positions = 'fixed' | 'sticky';
117111

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
1-
import { Renderer2 } from '@angular/core';
21
import { TestBed } from '@angular/core/testing';
3-
2+
import { Renderer2 } from '@angular/core';
43
import { ListenersService } from './listeners.service';
54

65
describe('ListenersService', () => {
7-
let renderer: Renderer2;
8-
let service: ListenersService;
9-
106
beforeEach(() => {
117
TestBed.configureTestingModule({
12-
imports: [Renderer2, ListenersService],
13-
providers: [Renderer2]
8+
providers: [Renderer2],
149
});
15-
service = new ListenersService(renderer);
16-
// service = TestBed.inject(ListenersService);
1710
});
1811

1912
it('should be created', () => {
20-
expect(service).toBeTruthy();
13+
TestBed.runInInjectionContext(() => {
14+
const service = new ListenersService();
15+
expect(service).toBeTruthy();
16+
});
2117
});
2218
});

projects/coreui-angular/src/lib/services/listeners.service.ts

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,53 @@
1-
import { ElementRef, Injectable, Renderer2 } from '@angular/core';
1+
import { ElementRef, inject, Injectable, Renderer2 } from '@angular/core';
22
import { Triggers } from '../coreui.types';
33

44
export interface IListenersConfig {
5-
hostElement: ElementRef,
6-
trigger?: Triggers | Triggers[],
7-
callbackOn?: () => void,
8-
callbackOff?: () => void,
9-
callbackToggle?: () => void,
5+
hostElement: ElementRef;
6+
trigger?: Triggers | Triggers[];
7+
callbackOn?: () => void;
8+
callbackOff?: () => void;
9+
callbackToggle?: () => void;
1010
}
1111

1212
@Injectable()
1313
export class ListenersService {
14+
readonly renderer = inject(Renderer2);
1415

1516
private listeners: Map<string, () => void> = new Map();
1617

17-
constructor(
18-
private renderer: Renderer2
19-
) {}
20-
21-
setListeners({ hostElement, trigger, callbackOn, callbackOff, callbackToggle }: IListenersConfig): void {
18+
setListeners({
19+
hostElement,
20+
trigger,
21+
callbackOn,
22+
callbackOff,
23+
callbackToggle,
24+
}: IListenersConfig): void {
2225
const host = hostElement.nativeElement;
2326
const triggers = Array.isArray(trigger) ? trigger : trigger?.split(' ') ?? [];
2427

2528
if (triggers?.includes('click')) {
26-
typeof callbackToggle === 'function' && this.listeners.set(
27-
'click',
28-
this.renderer.listen(host, 'click', callbackToggle)
29-
);
29+
typeof callbackToggle === 'function' &&
30+
this.listeners.set('click', this.renderer.listen(host, 'click', callbackToggle));
3031
}
3132
if (triggers?.includes('focus')) {
32-
typeof callbackOn === 'function' && this.listeners.set(
33-
'focus',
34-
this.renderer.listen(host, 'focus', callbackOn)
35-
);
33+
typeof callbackOn === 'function' &&
34+
this.listeners.set('focus', this.renderer.listen(host, 'focus', callbackOn));
35+
}
36+
if (triggers?.includes('focusin')) {
37+
typeof callbackOff === 'function' &&
38+
this.listeners.set('focusout', this.renderer.listen(host, 'focusout', callbackOff));
39+
typeof callbackOn === 'function' &&
40+
this.listeners.set('focusin', this.renderer.listen(host, 'focusin', callbackOn));
3641
}
3742
if (triggers?.includes('click') || triggers?.includes('focus')) {
38-
typeof callbackOff === 'function' && this.listeners.set(
39-
'blur',
40-
this.renderer.listen(host, 'blur', callbackOff)
41-
);
43+
typeof callbackOff === 'function' &&
44+
this.listeners.set('blur', this.renderer.listen(host, 'blur', callbackOff));
4245
}
4346
if (triggers?.includes('hover')) {
44-
typeof callbackOn === 'function' && this.listeners.set(
45-
'mouseenter',
46-
this.renderer.listen(host, 'mouseenter', callbackOn)
47-
);
48-
typeof callbackOff === 'function' && this.listeners.set(
49-
'mouseleave',
50-
this.renderer.listen(host, 'mouseleave', callbackOff)
51-
);
47+
typeof callbackOn === 'function' &&
48+
this.listeners.set('mouseenter', this.renderer.listen(host, 'mouseenter', callbackOn));
49+
typeof callbackOff === 'function' &&
50+
this.listeners.set('mouseleave', this.renderer.listen(host, 'mouseleave', callbackOff));
5251
}
5352
}
5453

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy