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

+3-9
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

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

+30-31
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)