Skip to content

Commit c005478

Browse files
authored
feat(ui5-textarea): add ariaLabel and ariaLabelledby properties (#2124)
As the Input, the TextArea should support aria-label and aria-labelledby set on the custom element. Note: internally we also set aria-label, using the base method "getEffectiveAriaLabelText" for the purpose. Related to #2107
1 parent c9ee25e commit c005478

File tree

4 files changed

+59
-5
lines changed

4 files changed

+59
-5
lines changed

packages/main/src/TextArea.hbs

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
?readonly="{{readonly}}"
2525
?required="{{required}}"
2626
aria-required="{{required}}"
27-
aria-labelledby={{ariaLabelledBy}}
28-
aria-describedby={{ariaDescribedBy}}
27+
aria-label="{{ariaLabelText}}"
28+
aria-describedby="{{ariaDescribedBy}}"
2929
maxlength="{{_exceededTextProps.calcedMaxLength}}"
3030
.value="{{value}}"
3131
@input="{{_oninput}}"
@@ -39,7 +39,7 @@
3939
{{> afterTextarea}}
4040

4141
{{#if showExceededText}}
42-
<span id="{{_id}}-exceededText" class="ui5-textarea-exceeded-text">{{_exceededTextProps.exceededText}}</span>
42+
<span class="ui5-textarea-exceeded-text">{{_exceededTextProps.exceededText}}</span>
4343
{{/if}}
4444

4545
{{#if hasValueState}}

packages/main/src/TextArea.js

+38-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
22
import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
33
import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
44
import Integer from "@ui5/webcomponents-base/dist/types/Integer.js";
5+
import getEffectiveAriaLabelText from "@ui5/webcomponents-base/dist/util/getEffectiveAriaLabelText.js";
56
import { fetchI18nBundle, getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
67
import { getFeature } from "@ui5/webcomponents-base/dist/FeaturesRegistry.js";
78
import { isIE } from "@ui5/webcomponents-base/dist/Device.js";
@@ -209,6 +210,31 @@ const metadata = {
209210
type: String,
210211
},
211212

213+
/**
214+
* Defines the aria-label attribute for the textarea.
215+
*
216+
* @type {String}
217+
* @since 1.0.0-rc.9
218+
* @private
219+
* @defaultvalue ""
220+
*/
221+
ariaLabel: {
222+
type: String,
223+
},
224+
225+
226+
/**
227+
* Receives id(or many ids) of the elements that label the textarea.
228+
*
229+
* @type {String}
230+
* @defaultvalue ""
231+
* @private
232+
* @since 1.0.0-rc.9
233+
*/
234+
ariaLabelledby: {
235+
type: String,
236+
},
237+
212238
/**
213239
* @private
214240
*/
@@ -539,8 +565,18 @@ class TextArea extends UI5Element {
539565
return this.disabled ? undefined : "0";
540566
}
541567

542-
get ariaLabelledBy() {
543-
return this.showExceededText ? `${this._id}-exceededText` : undefined;
568+
get ariaLabelText() {
569+
const effectiveAriaLabelText = getEffectiveAriaLabelText(this);
570+
571+
if (this.showExceededText) {
572+
if (effectiveAriaLabelText) {
573+
return `${effectiveAriaLabelText} ${this._exceededTextProps.exceededText}`;
574+
}
575+
576+
return this._exceededTextProps.exceededText;
577+
}
578+
579+
return effectiveAriaLabelText;
544580
}
545581

546582
get ariaDescribedBy() {

packages/main/test/pages/TextArea.html

+6
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,12 @@
199199
<ui5-textarea growing growing-max-lines="4"></ui5-textarea>
200200
</section>
201201

202+
<section class="aria-label and aria-labelledby">
203+
<span id="infoText">info text</span>
204+
<ui5-textarea id="textAreaAriaLabel" aria-label="Hello World"></ui5-textarea>
205+
<ui5-textarea id="textAreaAriaLabelledBy" maxlength="20" show-exceeded-text aria-labelledby="infoText" class="fixed-width fixed-height"></ui5-textarea>
206+
</section>
207+
202208
<script>
203209
var changeCounter = 0;
204210
var inputCounter = 0;

packages/main/test/specs/TextArea.spec.js

+12
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@ describe("Attributes propagation", () => {
3535

3636
assert.strictEqual(browser.$("#basic-textarea").shadow$("textarea").getValue(), sExpectedValue, "Value property was set correctly");
3737
});
38+
39+
it("Tests aria-label and aria-labelledby", () => {
40+
const textArea1 = browser.$("#textAreaAriaLabel").shadow$("textarea");
41+
const textArea2 = browser.$("#textAreaAriaLabelledBy").shadow$("textarea");
42+
const EXPECTED_ARIA_LABEL1 = "Hello World";
43+
const EXPECTED_ARIA_LABEL2 = "info text 20 characters remaining";
44+
45+
assert.strictEqual(textArea1.getAttribute("aria-label"), EXPECTED_ARIA_LABEL1,
46+
"The aria-label is correctly set internally.");
47+
assert.strictEqual(textArea2.getAttribute("aria-label"), EXPECTED_ARIA_LABEL2,
48+
"The aria-label is correctly set internally.");
49+
});
3850
});
3951

4052
describe("disabled and readonly textarea", () => {

0 commit comments

Comments
 (0)