Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<ng-template #template>
<button type="button" (click)="model.doAction($event)" (mousedown)="model.doMouseDown($event)" (focus)="model.doFocus($event)" [key2click]="{ processEsc: false, disableTabStop: model.disableTabStop }" [class]="model.getActionBarItemCss()" [attr.title]="model.tooltip || model.title" [attr.aria-checked]="model.ariaChecked" [attr.aria-expanded]="model.ariaExpanded" [attr.role]="model.ariaRole" [disabled]="model.disabled">
<button type="button" (click)="model.doAction($event)" (mousedown)="model.doMouseDown($event)" (focus)="model.doFocus($event)" [key2click]="{ processEsc: false, disableTabStop: model.disableTabStop }" [class]="model.getActionBarItemCss()" [attr.title]="model.tooltip || model.title" [attr.aria-checked]="model.ariaChecked" [attr.aria-expanded]="model.ariaExpanded" [attr.aria-labelledby]="model.ariaLabelledBy" [attr.role]="model.ariaRole" [disabled]="model.disabled">
<svg *ngIf="model.iconName" [iconName]="model.iconName" [size]="model.iconSize" [title]="model.tooltip || model.title" [class]="model.cssClasses.itemIcon" sv-ng-svg-icon></svg>
<sv-ng-string-viewer style="display:contents" *ngIf="model.hasTitle" [model]="model.locTitle" [textClass]="model.getActionBarItemTitleCss()"></sv-ng-string-viewer>
</button>
Expand Down
2 changes: 2 additions & 0 deletions packages/survey-core/src/actions/action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ export interface IAction {
needSpace?: boolean;
ariaChecked?: boolean;
ariaExpanded?: boolean;
ariaLabelledBy?: string;
ariaRole?: string;
elementId?: string;
items?: Array<IAction>;
Expand Down Expand Up @@ -254,6 +255,7 @@ export abstract class BaseAction extends Base implements IAction {
@property({ defaultValue: false }) needSpace: boolean;
@property() ariaChecked: boolean;
@property() ariaExpanded: boolean;
@property() ariaLabelledBy: string;
@property({ defaultValue: "button" }) ariaRole: string;
private idValue: string;
public get id(): string { return this.getId(); }
Expand Down
3 changes: 2 additions & 1 deletion packages/survey-core/src/question_radiogroup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ export class QuestionRadiogroupModel extends QuestionCheckboxBase {
id: `sv-clr-btn-${this.id}`,
action: () => { this.clearValueFromUI(); },
innerCss: this.cssClasses.clearButton,
visible: <any>new ComputedUpdater(() => this.canShowClearButton)
visible: <any>new ComputedUpdater(() => this.canShowClearButton),
ariaLabelledBy: this.a11y_input_ariaLabelledBy
}
);
actions.push(clearAction);
Expand Down
3 changes: 2 additions & 1 deletion packages/survey-core/src/question_slider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -828,7 +828,8 @@ export class QuestionSliderModel extends Question implements ISliderLabelItemOwn
id: `sv-clr-btn-${this.id}`,
action: () => { this.clearValueFromUI(); },
innerCss: this.cssClasses.clearButton,
visible: <any>new ComputedUpdater(() => this.allowClear && !this.isReadOnly)
visible: <any>new ComputedUpdater(() => this.allowClear && !this.isReadOnly),
ariaLabelledBy: this.a11y_input_ariaLabelledBy
}
);
actions.push(clearAction);
Expand Down
9 changes: 9 additions & 0 deletions packages/survey-core/tests/components/actionbartests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,15 @@ QUnit.test(
assert.ok(action.ariaExpanded, "property exists");
}
);
QUnit.test(
"ariaLabelledBy",
(assert) => {
const action = new Action(<any>{});
assert.notOk(action.ariaLabelledBy, "default is undefined");
action.ariaLabelledBy = "id-some";
assert.ok(action.ariaLabelledBy, "property exists");
}
);
QUnit.test("Dispose dots item and all it content", (assert) => {
const model: AdaptiveActionContainer = new AdaptiveActionContainer();
model.setItems([
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ export class SurveyActionBarItem extends SurveyElementBase<
tabIndex={tabIndex}
aria-checked={this.item.ariaChecked}
aria-expanded={this.item.ariaExpanded}
aria-labelledby={this.item.ariaLabelledBy}
role={this.item.ariaRole}
>
{buttonContent}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
v-bind:title="item.tooltip || item.title"
v-bind:aria-checked="item.ariaChecked"
v-bind:aria-expanded="item.ariaExpanded"
v-bind:aria-labelledby="item.ariaLabelledBy"
v-bind:role="item.ariaRole"
v-key2click="{ processEsc: false, disableTabStop: item.disableTabStop }"
>
Expand Down
3 changes: 1 addition & 2 deletions tests/markup/etalon_radiogroup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,7 @@ registerMarkupTests(
"choices": [
"item1",
"item2"
],
titleLocation: "hidden"
]
}
]
},
Expand Down
68 changes: 47 additions & 21 deletions tests/markup/snapshots/radiogroup-clear.snap.html
Original file line number Diff line number Diff line change
@@ -1,22 +1,48 @@
<fieldset aria-invalid="false" aria-label="Question title" aria-required="false" class="sd-selectbase" role="radiogroup">
<div class="sd-item sd-item--allowhover sd-radio sd-radio--allowhover sd-selectbase__item sv-q-col-1" role="presentation">
<label class="sd-selectbase__label">
<input class="sd-item__control sd-radio__control sd-visuallyhidden" id="testid0i_0" name="name_testid0" type="radio" value="item1">
<span class="sd-item__decorator sd-radio__decorator">
</span>
<span class="sd-item__control-label">
<span class="sv-string-viewer">item1</span>
</span>
</label>
<div class="sd-element__title sd-question__title sd-title" id="testid0_ariaTitle">
<div class="sv-title-actions">
<span class="sv-title-actions__title">
<span class="sv-string-viewer sv-string-viewer--multiline">Question title</span>
</span>
<div class="sd-action-bar sd-action-title-bar" style="opacity:0;">
<div class="sv-action">
<div class="sv-action__content">
<button aria-labelledby="testid0_ariaTitle" class="sd-action" role="button" tabindex="0" title="Clear" type="button">
<span class="sd-action__title">Clear</span>
</button>
</div>
</div>
<div class="sv-action sv-action--hidden sv-dots">
<div class="sv-action__content">
<button class="sd-action sd-action--icon sv-dots__item" role="button" tabindex="0" title="More" type="button">
<svg class="sd-action__icon sv-svg-icon" role="presentation" style="height:24px; width:24px;">
<use xlink:href="#icon-more-24x24" class="">
</use>
<title class="">More</title>
</svg>
</button>
<div>
<div class="sv-popup sv-popup--left sv-popup--menu-popup sv-popup--show-pointer" style="display:none;" tabindex="-1">
<div class="sv-popup__container">
<span class="sv-popup__pointer">
</span>
<div class="sv-popup__body-content">
<div class="sv-popup__scrolling-content">
<div class="sv-popup__content">
<div class="sv-list__container">
<div class="sv-list__empty-container">
<div aria-label="No data to display" class="sv-list__empty-text">No data to display</div>
</div>
<ul class="sv-list" role="menu" style="display:none;">
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sd-item sd-item--allowhover sd-radio sd-radio--allowhover sd-selectbase__item sv-q-col-1" role="presentation">
<label class="sd-selectbase__label">
<input class="sd-item__control sd-radio__control sd-visuallyhidden" id="testid0i_1" name="name_testid0" type="radio" value="item2">
<span class="sd-item__decorator sd-radio__decorator">
</span>
<span class="sd-item__control-label">
<span class="sv-string-viewer">item2</span>
</span>
</label>
</div>
</fieldset>
</div>