Skip to content

Commit e17912e

Browse files
committed
test(multiple): Add reportViolations method for aria directives to log element and violations
1 parent 1c89b14 commit e17912e

18 files changed

Lines changed: 74 additions & 55 deletions

src/aria/accordion/accordion-group.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
OnDestroy,
2020
} from '@angular/core';
2121
import {Directionality} from '@angular/cdk/bidi';
22-
import {AccordionGroupPattern, SortedCollection} from '../private';
22+
import {AccordionGroupPattern, SortedCollection, reportViolations} from '../private';
2323
import {ACCORDION_GROUP} from './accordion-tokens';
2424
import {AccordionTrigger} from './accordion-trigger';
2525

@@ -120,10 +120,7 @@ export class AccordionGroup implements OnDestroy {
120120
if (typeof ngDevMode === 'undefined' || ngDevMode) {
121121
afterRenderEffect({
122122
read: () => {
123-
const violations = this._pattern.validate();
124-
for (const violation of violations) {
125-
console.error(violation);
126-
}
123+
reportViolations(this._pattern.validate(), this.element);
127124
},
128125
});
129126
}

src/aria/accordion/accordion-panel.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
input,
1717
} from '@angular/core';
1818
import {_IdGenerator} from '@angular/cdk/a11y';
19-
import {DeferredContentAware, AccordionTriggerPattern} from '../private';
19+
import {DeferredContentAware, AccordionTriggerPattern, reportViolations} from '../private';
2020
import {AccordionContent} from './accordion-content';
2121

2222
/**
@@ -102,9 +102,7 @@ export class AccordionPanel {
102102
violations.push('ngAccordionPanel must have an ngAccordionTrigger to control it.');
103103
}
104104

105-
for (const violation of violations) {
106-
console.error(violation);
107-
}
105+
reportViolations(violations, this.element);
108106
},
109107
});
110108
}

src/aria/accordion/accordion-trigger.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
afterRenderEffect,
2020
} from '@angular/core';
2121
import {_IdGenerator} from '@angular/cdk/a11y';
22-
import {AccordionTriggerPattern} from '../private';
22+
import {AccordionTriggerPattern, reportViolations} from '../private';
2323
import {ACCORDION_GROUP} from './accordion-tokens';
2424
import {AccordionPanel} from './accordion-panel';
2525

@@ -104,9 +104,7 @@ export class AccordionTrigger implements OnInit, OnDestroy {
104104
);
105105
}
106106

107-
for (const violation of violations) {
108-
console.error(violation);
109-
}
107+
reportViolations(violations, this.element);
110108
},
111109
});
112110
}

src/aria/combobox/combobox-popup.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
signal,
1717
afterRenderEffect,
1818
} from '@angular/core';
19-
import {DeferredContent, ComboboxPopupPattern} from '@angular/aria/private';
19+
import {DeferredContent, ComboboxPopupPattern, reportViolations} from '@angular/aria/private';
2020
import type {Combobox} from './combobox';
2121
import type {ComboboxWidget} from './combobox-widget';
2222
import {COMBOBOX_POPUP} from './combobox-tokens';
@@ -72,11 +72,13 @@ export class ComboboxPopup implements OnInit, OnDestroy {
7272
if (typeof ngDevMode === 'undefined' || ngDevMode) {
7373
afterRenderEffect({
7474
read: () => {
75+
const violations: string[] = [];
7576
if (!this._widget()) {
76-
console.error(
77+
violations.push(
7778
'ngComboboxPopup must contain an ngComboboxWidget to establish focus controls.',
7879
);
7980
}
81+
reportViolations(violations, this.combobox().element);
8082
},
8183
});
8284
}

src/aria/combobox/combobox.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ import {
1919
signal,
2020
Renderer2,
2121
} from '@angular/core';
22-
import {DeferredContentAware, ComboboxPattern, tabIndexTransform} from '@angular/aria/private';
22+
import {
23+
DeferredContentAware,
24+
ComboboxPattern,
25+
tabIndexTransform,
26+
reportViolations,
27+
} from '@angular/aria/private';
2328
import type {ComboboxPopup} from './combobox-popup';
2429

2530
/**
@@ -128,11 +133,13 @@ export class Combobox extends DeferredContentAware implements OnInit {
128133
if (typeof ngDevMode === 'undefined' || ngDevMode) {
129134
afterRenderEffect({
130135
read: () => {
136+
const violations: string[] = [];
131137
if (!this._popup()) {
132-
console.error(
138+
violations.push(
133139
'ngCombobox must have a corresponding ngComboboxPopup template to render.',
134140
);
135141
}
142+
reportViolations(violations, this.element);
136143
},
137144
});
138145
}

src/aria/grid/grid.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
GridRowPattern,
2626
SortedCollection,
2727
tabIndexTransform,
28+
reportViolations,
2829
} from '../private';
2930
import {GridRow} from './grid-row';
3031
import {GRID} from './grid-tokens';
@@ -160,10 +161,7 @@ export class Grid implements OnDestroy {
160161
if (typeof ngDevMode === 'undefined' || ngDevMode) {
161162
afterRenderEffect({
162163
read: () => {
163-
const violations = this._pattern.validate();
164-
for (const violation of violations) {
165-
console.error(violation);
166-
}
164+
reportViolations(this._pattern.validate(), this.element);
167165
},
168166
});
169167
}

src/aria/listbox/listbox.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import {
2323
} from '@angular/core';
2424
import {Directionality} from '@angular/cdk/bidi';
2525
import {_IdGenerator} from '@angular/cdk/a11y';
26-
import {ListboxPattern, SortedCollection, tabIndexTransform} from '../private';
26+
import {ListboxPattern, SortedCollection, tabIndexTransform, reportViolations} from '../private';
2727
import {Option} from './option';
2828
import {LISTBOX} from './tokens';
2929

@@ -165,11 +165,7 @@ export class Listbox<V> implements OnDestroy {
165165
if (typeof ngDevMode === 'undefined' || ngDevMode) {
166166
afterRenderEffect({
167167
read: () => {
168-
const violations = this._pattern.validate();
169-
170-
for (const violation of violations) {
171-
console.error(violation);
172-
}
168+
reportViolations(this._pattern.validate(), this.element);
173169
},
174170
});
175171
}

src/aria/menu/menu-item.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
OnInit,
1919
afterRenderEffect,
2020
} from '@angular/core';
21-
import {MenuItemPattern} from '../private';
21+
import {MenuItemPattern, reportViolations} from '../private';
2222
import {_IdGenerator} from '@angular/cdk/a11y';
2323
import {MENU_COMPONENT} from './menu-tokens';
2424
import type {Menu} from './menu';
@@ -108,9 +108,11 @@ export class MenuItem<V> implements OnInit, OnDestroy {
108108
if (typeof ngDevMode === 'undefined' || ngDevMode) {
109109
afterRenderEffect({
110110
read: () => {
111+
const violations: string[] = [];
111112
if (!this.parent) {
112-
console.error('ngMenuItem must be placed inside an ngMenu or ngMenuBar container.');
113+
violations.push('ngMenuItem must be placed inside an ngMenu or ngMenuBar container.');
113114
}
115+
reportViolations(violations, this.element);
114116
},
115117
});
116118
}

src/aria/menu/menu.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
signal,
2222
untracked,
2323
} from '@angular/core';
24-
import {MenuPattern, DeferredContentAware, SortedCollection} from '../private';
24+
import {MenuPattern, DeferredContentAware, SortedCollection, reportViolations} from '../private';
2525
import {_IdGenerator} from '@angular/cdk/a11y';
2626
import {Directionality} from '@angular/cdk/bidi';
2727
import {MenuTrigger} from './menu-trigger';
@@ -194,10 +194,7 @@ export class Menu<V> implements OnDestroy {
194194
if (typeof ngDevMode === 'undefined' || ngDevMode) {
195195
afterRenderEffect({
196196
read: () => {
197-
const violations = this._pattern.validate();
198-
for (const violation of violations) {
199-
console.error(violation);
200-
}
197+
reportViolations(this._pattern.validate(), this.element);
201198
},
202199
});
203200
}

src/aria/private/public-api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ export * from './utils/collection';
2626
export * from './utils/element';
2727
export * from './utils/element-resolver';
2828
export * from './utils/transforms';
29+
export * from './utils/violations';
2930
export * from './combobox/combobox';

0 commit comments

Comments
 (0)