From b95de260ee46d6278d03cff294015aa11fd99a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 26 Feb 2019 15:06:33 +0100 Subject: [PATCH] MOBILE-2819 a11y: Apply aria attributes to components --- .../mod/wiki/components/index/index.scss | 1 - src/components/chrono/chrono.ts | 2 +- .../context-menu/context-menu-popover.ts | 2 ++ src/components/context-menu/context-menu.ts | 25 ++++++++++++---- .../core-context-menu-popover.html | 4 +-- .../context-menu/core-context-menu.html | 2 +- src/components/icon/core-icon.html | 2 +- src/components/icon/icon.ts | 2 ++ .../input-errors/core-input-errors.html | 2 +- src/components/ion-tabs/core-ion-tabs.html | 4 +-- src/components/loading/core-loading.html | 6 ++-- .../progress-bar/core-progress-bar.html | 2 +- .../core-rich-text-editor.html | 4 +-- .../search-box/core-search-box.html | 4 +-- .../core-send-message-form.html | 2 +- src/components/tabs/core-tabs.html | 18 +++++------ src/components/tabs/tab.ts | 28 ++++++++++++++++- src/components/tabs/tabs.scss | 27 ++++++++++------- src/components/tabs/tabs.ts | 5 ++-- src/components/timer/core-timer.html | 4 +-- .../components/format/core-course-format.html | 2 +- src/core/course/components/format/format.ts | 30 +++++++++++++------ .../components/module/core-course-module.html | 2 +- src/core/course/components/module/module.ts | 6 +++- .../section-selector/section-selector.html | 20 +++++++------ .../section-selector/section-selector.scss | 4 +++ src/core/mainmenu/pages/more/more.html | 8 ++--- 27 files changed, 144 insertions(+), 74 deletions(-) diff --git a/src/addon/mod/wiki/components/index/index.scss b/src/addon/mod/wiki/components/index/index.scss index 9b7a2f796..49867d614 100644 --- a/src/addon/mod/wiki/components/index/index.scss +++ b/src/addon/mod/wiki/components/index/index.scss @@ -7,7 +7,6 @@ $addon-mod-wiki-toc-background-color: $gray-light !default; ion-app.app-root addon-mod-wiki-index { background-color: $white; - .core-tabs-content-container, .addon-mod_wiki-page-content { background-color: $white; } diff --git a/src/components/chrono/chrono.ts b/src/components/chrono/chrono.ts index 5770db45f..8783416af 100644 --- a/src/components/chrono/chrono.ts +++ b/src/components/chrono/chrono.ts @@ -28,7 +28,7 @@ import { Component, Input, OnChanges, OnDestroy, Output, EventEmitter, SimpleCha */ @Component({ selector: 'core-chrono', - template: '{{ time / 1000 | coreSecondsToHMS }}' + template: '{{ time / 1000 | coreSecondsToHMS }}' }) export class CoreChronoComponent implements OnChanges, OnDestroy { @Input() running: boolean; // Set it to true to start the chrono. Set it to false to stop it. diff --git a/src/components/context-menu/context-menu-popover.ts b/src/components/context-menu/context-menu-popover.ts index 7aa987c24..aa468f189 100644 --- a/src/components/context-menu/context-menu-popover.ts +++ b/src/components/context-menu/context-menu-popover.ts @@ -26,12 +26,14 @@ import { CoreLoggerProvider } from '@providers/logger'; }) export class CoreContextMenuPopoverComponent { title: string; + uniqueId: string; items: CoreContextMenuItemComponent[]; protected logger: any; constructor(navParams: NavParams, private viewCtrl: ViewController, logger: CoreLoggerProvider) { this.title = navParams.get('title'); this.items = navParams.get('items') || []; + this.uniqueId = navParams.get('id'); this.logger = logger.getInstance('CoreContextMenuPopoverComponent'); } diff --git a/src/components/context-menu/context-menu.ts b/src/components/context-menu/context-menu.ts index 5d453384f..1f674eebd 100644 --- a/src/components/context-menu/context-menu.ts +++ b/src/components/context-menu/context-menu.ts @@ -16,6 +16,7 @@ import { Component, Input, OnInit, OnDestroy, ElementRef, Optional } from '@angu import { PopoverController } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; +import { CoreUtilsProvider } from '@providers/utils/utils'; import { CoreContextMenuItemComponent } from './context-menu-item'; import { CoreContextMenuPopoverComponent } from './context-menu-popover'; import { CoreTabComponent } from '@components/tabs/tab'; @@ -34,14 +35,16 @@ export class CoreContextMenuComponent implements OnInit, OnDestroy { hideMenu = true; // It will be unhidden when items are added. ariaLabel: string; + expanded = false; protected items: CoreContextMenuItemComponent[] = []; protected itemsMovedToParent: CoreContextMenuItemComponent[] = []; protected itemsChangedStream: Subject; // Stream to update the hideMenu boolean when items change. protected instanceId: string; protected parentContextMenu: CoreContextMenuComponent; + protected uniqueId: string; constructor(private translate: TranslateService, private popoverCtrl: PopoverController, elementRef: ElementRef, - private domUtils: CoreDomUtilsProvider, @Optional() public coreTab: CoreTabComponent) { + private domUtils: CoreDomUtilsProvider, @Optional() public coreTab: CoreTabComponent, utils: CoreUtilsProvider) { // Create the stream and subscribe to it. We ignore successive changes during 250ms. this.itemsChangedStream = new Subject(); this.itemsChangedStream.auditTime(250).subscribe(() => { @@ -56,6 +59,9 @@ export class CoreContextMenuComponent implements OnInit, OnDestroy { }); }); + // Calculate the unique ID. + this.uniqueId = 'core-context-menu-' + utils.getUniqueId('CoreContextMenuComponent'); + this.instanceId = this.domUtils.storeInstanceByElement(elementRef.nativeElement, this); } @@ -170,10 +176,19 @@ export class CoreContextMenuComponent implements OnInit, OnDestroy { * @param {MouseEvent} event Event. */ showContextMenu(event: MouseEvent): void { - const popover = this.popoverCtrl.create(CoreContextMenuPopoverComponent, { title: this.title, items: this.items }); - popover.present({ - ev: event - }); + if (!this.expanded) { + const popover = this.popoverCtrl.create(CoreContextMenuPopoverComponent, + { title: this.title, items: this.items, id: this.uniqueId }); + + popover.onDidDismiss(() => { + this.expanded = false; + }); + popover.present({ + ev: event + }); + + this.expanded = true; + } } /** diff --git a/src/components/context-menu/core-context-menu-popover.html b/src/components/context-menu/core-context-menu-popover.html index 81a1965fb..f3c0d2323 100644 --- a/src/components/context-menu/core-context-menu-popover.html +++ b/src/components/context-menu/core-context-menu-popover.html @@ -1,6 +1,6 @@ - + {{title}} - + diff --git a/src/components/context-menu/core-context-menu.html b/src/components/context-menu/core-context-menu.html index 262bb3256..0628573be 100644 --- a/src/components/context-menu/core-context-menu.html +++ b/src/components/context-menu/core-context-menu.html @@ -1,4 +1,4 @@ - \ No newline at end of file diff --git a/src/components/icon/core-icon.html b/src/components/icon/core-icon.html index 8e4a85f3a..54452fe8f 100644 --- a/src/components/icon/core-icon.html +++ b/src/components/icon/core-icon.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/components/icon/icon.ts b/src/components/icon/icon.ts index 8171e018f..50351f582 100644 --- a/src/components/icon/icon.ts +++ b/src/components/icon/icon.ts @@ -54,6 +54,8 @@ export class CoreIconComponent implements OnInit, OnDestroy { this.newElement.classList.add('icon'); this.newElement.classList.add('fa'); this.newElement.classList.add(this.name); + this.newElement.setAttribute('aria-hidden', 'true'); + this.newElement.setAttribute('role', 'img'); if (this.isTrueProperty(this.fixedWidth)) { this.newElement.classList.add('fa-fw'); } diff --git a/src/components/input-errors/core-input-errors.html b/src/components/input-errors/core-input-errors.html index e960807e8..62ab3df6a 100644 --- a/src/components/input-errors/core-input-errors.html +++ b/src/components/input-errors/core-input-errors.html @@ -12,5 +12,5 @@ -
{{ errorText }}
+
{{ errorText }}
\ No newline at end of file diff --git a/src/components/ion-tabs/core-ion-tabs.html b/src/components/ion-tabs/core-ion-tabs.html index c3e62e9e6..d4276f461 100644 --- a/src/components/ion-tabs/core-ion-tabs.html +++ b/src/components/ion-tabs/core-ion-tabs.html @@ -1,5 +1,5 @@ -
- +
+
diff --git a/src/components/loading/core-loading.html b/src/components/loading/core-loading.html index 0e34fe572..c149e9bf1 100644 --- a/src/components/loading/core-loading.html +++ b/src/components/loading/core-loading.html @@ -1,10 +1,10 @@ -
+
-

{{message}}

+

{{message}}

-
+
\ No newline at end of file diff --git a/src/components/progress-bar/core-progress-bar.html b/src/components/progress-bar/core-progress-bar.html index 7c7319034..d024ba4b8 100644 --- a/src/components/progress-bar/core-progress-bar.html +++ b/src/components/progress-bar/core-progress-bar.html @@ -1,5 +1,5 @@
- +
diff --git a/src/components/rich-text-editor/core-rich-text-editor.html b/src/components/rich-text-editor/core-rich-text-editor.html index 972fe0c0c..7a02610dd 100644 --- a/src/components/rich-text-editor/core-rich-text-editor.html +++ b/src/components/rich-text-editor/core-rich-text-editor.html @@ -1,5 +1,5 @@
-
+
@@ -22,7 +22,7 @@
- +
diff --git a/src/components/search-box/core-search-box.html b/src/components/search-box/core-search-box.html index 7712caf71..260d45215 100644 --- a/src/components/search-box/core-search-box.html +++ b/src/components/search-box/core-search-box.html @@ -1,7 +1,7 @@ -
+ - + diff --git a/src/components/send-message-form/core-send-message-form.html b/src/components/send-message-form/core-send-message-form.html index f02a7ee2c..b1829854a 100644 --- a/src/components/send-message-form/core-send-message-form.html +++ b/src/components/send-message-form/core-send-message-form.html @@ -1,5 +1,5 @@ - +