@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
105 lines • 16.3 kB
JavaScript
import { DOWN_ARROW, ENTER, ESCAPE, LEFT_ARROW, RIGHT_ARROW, UP_ARROW } from '@angular/cdk/keycodes';
import { Attribute, ChangeDetectionStrategy, Component, HostListener, inject, Input, ViewChild } from '@angular/core';
import { BehaviorSubject, Subject } from 'rxjs';
import { filter, takeUntil } from 'rxjs/operators';
import { TooltipDirective } from '../tooltip/index';
import { FloatingActionButtonsService } from './floating-action-buttons.service';
import * as i0 from "@angular/core";
import * as i1 from "../../directives/accessibility/focus-indicator/focus-indicator.directive";
import * as i2 from "@angular/common";
export class FloatingActionButtonComponent {
constructor(primary) {
this.fab = inject(FloatingActionButtonsService);
this._tooltip = inject(TooltipDirective, { optional: true });
/** Determine if this is the primary button in the set */
this.primary = false;
/** Store the tabindex */
this.tabindex$ = new BehaviorSubject(-1);
/** Unsubscribe from all observables on component destroy */
this._onDestroy = new Subject();
this.primary = primary !== null;
}
ngAfterViewInit() {
if (this._tooltip) {
// ensure the tooltip gets hidden when the button is hidden
this.fab.open$.pipe(takeUntil(this._onDestroy), filter(isOpen => !isOpen && !this.primary))
.subscribe(() => this._tooltip.hide());
}
}
ngOnDestroy() {
this._onDestroy.next();
this._onDestroy.complete();
}
focus() {
this.button.nativeElement.focus();
}
onFocus() {
// ensure the tooltip gets shown
if (this._tooltip) {
this._tooltip.show();
}
}
onBlur() {
// ensure the tooltip gets hidden
if (this._tooltip) {
this._tooltip.hide();
}
}
close() {
this.fab.close();
}
onKeydown(event) {
switch (event.which) {
case UP_ARROW:
if (this.fab.isVertical()) {
this.fab.focusSibling(this.fab.direction$.value !== 'bottom');
event.preventDefault();
}
break;
case DOWN_ARROW:
if (this.fab.isVertical()) {
this.fab.focusSibling(this.fab.direction$.value === 'bottom');
event.preventDefault();
}
break;
case LEFT_ARROW:
if (this.fab.isHorizontal()) {
this.fab.focusSibling(this.fab.direction$.value !== 'right');
event.preventDefault();
}
break;
case RIGHT_ARROW:
if (this.fab.isHorizontal()) {
this.fab.focusSibling(this.fab.direction$.value === 'right');
event.preventDefault();
}
break;
case ENTER:
this.fab.focusPrimaryButton();
break;
case ESCAPE:
this.fab.focusPrimaryButton();
this.fab.close();
break;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FloatingActionButtonComponent, deps: [{ token: 'fab-primary', attribute: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: FloatingActionButtonComponent, selector: "ux-floating-action-button", inputs: { ariaLabel: ["aria-label", "ariaLabel"] }, host: { listeners: { "keydown": "onKeydown($event)" } }, viewQueries: [{ propertyName: "button", first: true, predicate: ["button"], descendants: true, static: true }], ngImport: i0, template: "<button #button\n uxFocusIndicator\n [programmaticFocusIndicator]=\"true\"\n type=\"button\"\n class=\"btn floating-action-button\"\n [class.button-primary]=\"primary\"\n [class.button-secondary]=\"!primary\"\n [attr.aria-label]=\"ariaLabel\"\n [tabIndex]=\"tabindex$ | async\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (click)=\"primary ? fab.toggle() : close()\">\n\n <ng-content></ng-content>\n\n</button>", dependencies: [{ kind: "directive", type: i1.FocusIndicatorDirective, selector: "[uxFocusIndicator]", inputs: ["checkChildren", "mouseFocusIndicator", "touchFocusIndicator", "keyboardFocusIndicator", "programmaticFocusIndicator"], outputs: ["indicator"], exportAs: ["ux-focus-indicator"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FloatingActionButtonComponent, decorators: [{
type: Component,
args: [{ selector: 'ux-floating-action-button', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "<button #button\n uxFocusIndicator\n [programmaticFocusIndicator]=\"true\"\n type=\"button\"\n class=\"btn floating-action-button\"\n [class.button-primary]=\"primary\"\n [class.button-secondary]=\"!primary\"\n [attr.aria-label]=\"ariaLabel\"\n [tabIndex]=\"tabindex$ | async\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (click)=\"primary ? fab.toggle() : close()\">\n\n <ng-content></ng-content>\n\n</button>" }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Attribute,
args: ['fab-primary']
}] }], propDecorators: { ariaLabel: [{
type: Input,
args: ['aria-label']
}], button: [{
type: ViewChild,
args: ['button', { static: true }]
}], onKeydown: [{
type: HostListener,
args: ['keydown', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvYXRpbmctYWN0aW9uLWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy1hY3Rpb24tYnV0dG9ucy9mbG9hdGluZy1hY3Rpb24tYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLWFjdGlvbi1idXR0b25zL2Zsb2F0aW5nLWFjdGlvbi1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckcsT0FBTyxFQUFpQixTQUFTLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7O0FBUWpGLE1BQU0sT0FBTyw2QkFBNkI7SUFvQnRDLFlBQXNDLE9BQWU7UUFuQjVDLFFBQUcsR0FBRyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUVuQyxhQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFHLElBQUksRUFBQyxDQUFDLENBQUM7UUFRekUseURBQXlEO1FBQ3pELFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFekIseUJBQXlCO1FB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QUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxNQUFNO1lBRVYsS0FBSyxLQUFLO2dCQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDOUIsTUFBTTtZQUVWLEtBQUssTUFBTTtnQkFDUCxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU07UUFFZCxDQUFDO0lBRUwsQ0FBQzsrR0F4R1EsNkJBQTZCLGtCQW9CZixhQUFhO21HQXBCM0IsNkJBQTZCLDhSQ2IxQyxnZkFlUzs7NEZERkksNkJBQTZCO2tCQU56QyxTQUFTOytCQUNJLDJCQUEyQixtQkFFcEIsdUJBQXVCLENBQUMsTUFBTSx1QkFDMUIsS0FBSzs7MEJBc0JiLFNBQVM7MkJBQUMsYUFBYTt5Q0FkZixTQUFTO3NCQUE3QixLQUFLO3VCQUFDLFlBQVk7Z0JBR29CLE1BQU07c0JBQTVDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFvRHJDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET1dOX0FSUk9XLCBFTlRFUiwgRVNDQVBFLCBMRUZUX0FSUk9XLCBSSUdIVF9BUlJPVywgVVBfQVJST1cgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQXR0cmlidXRlLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uL3Rvb2x0aXAvaW5kZXgnO1xuaW1wb3J0IHsgRmxvYXRpbmdBY3Rpb25CdXR0b25zU2VydmljZSB9IGZyb20gJy4vZmxvYXRpbmctYWN0aW9uLWJ1dHRvbnMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXgtZmxvYXRpbmctYWN0aW9uLWJ1dHRvbicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zsb2F0aW5nLWFjdGlvbi1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlXG59KVxuZXhwb3J0IGNsYXNzIEZsb2F0aW5nQWN0aW9uQnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICByZWFkb25seSBmYWIgPSBpbmplY3QoRmxvYXRpbmdBY3Rpb25CdXR0b25zU2VydmljZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90b29sdGlwID0gaW5qZWN0KFRvb2x0aXBEaXJlY3RpdmUsIHsgb3B0aW9uYWwgOiB0cnVlfSk7XG5cbiAgICAvKiogRGVmaW5lIHRoZSBhcmlhIGxhYmVsIGZvciB0aGUgYnV0dG9uICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsJykgYXJpYUxhYmVsOiBzdHJpbmc7XG5cbiAgICAvKiogQWNjZXNzIHRoZSBlbGVtZW50IHJlZiBvZiB0aGUgYnV0dG9uIGVsZW1lbnQgKi9cbiAgICBAVmlld0NoaWxkKCdidXR0b24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBidXR0b246IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgdGhlIHByaW1hcnkgYnV0dG9uIGluIHRoZSBzZXQgKi9cbiAgICBwcmltYXJ5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogU3RvcmUgdGhlIHRhYmluZGV4ICovXG4gICAgdGFiaW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KC0xKTtcblxuICAgIC8qKiBVbnN1YnNjcmliZSBmcm9tIGFsbCBvYnNlcnZhYmxlcyBvbiBjb21wb25lbnQgZGVzdHJveSAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihAQXR0cmlidXRlKCdmYWItcHJpbWFyeScpIHByaW1hcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLnByaW1hcnkgPSBwcmltYXJ5ICE9PSBudWxsO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgICAgICBpZiAodGhpcy5fdG9vbHRpcCkge1xuICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSB0b29sdGlwIGdldHMgaGlkZGVuIHdoZW4gdGhlIGJ1dHRvbiBpcyBoaWRkZW5cbiAgICAgICAgICAgIHRoaXMuZmFiLm9wZW4kLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSksIGZpbHRlcihpc09wZW4gPT4gIWlzT3BlbiAmJiAhdGhpcy5wcmltYXJ5KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3Rvb2x0aXAuaGlkZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIC8vIGVuc3VyZSB0aGUgdG9vbHRpcCBnZXRzIHNob3duXG4gICAgICAgIGlmICh0aGlzLl90b29sdGlwKSB7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgLy8gZW5zdXJlIHRoZSB0b29sdGlwIGdldHMgaGlkZGVuXG4gICAgICAgIGlmICh0aGlzLl90b29sdGlwKSB7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZhYi5jbG9zZSgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcblxuICAgICAgICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mYWIuaXNWZXJ0aWNhbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFiLmZvY3VzU2libGluZyh0aGlzLmZhYi5kaXJlY3Rpb24kLnZhbHVlICE9PSAnYm90dG9tJyk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIERPV05fQVJST1c6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmFiLmlzVmVydGljYWwoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZhYi5mb2N1c1NpYmxpbmcodGhpcy5mYWIuZGlyZWN0aW9uJC52YWx1ZSA9PT0gJ2JvdHRvbScpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBMRUZUX0FSUk9XOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZhYi5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZhYi5mb2N1c1NpYmxpbmcodGhpcy5mYWIuZGlyZWN0aW9uJC52YWx1ZSAhPT0gJ3JpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFJJR0hUX0FSUk9XOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZhYi5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZhYi5mb2N1c1NpYmxpbmcodGhpcy5mYWIuZGlyZWN0aW9uJC52YWx1ZSA9PT0gJ3JpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEVOVEVSOlxuICAgICAgICAgICAgICAgIHRoaXMuZmFiLmZvY3VzUHJpbWFyeUJ1dHRvbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEVTQ0FQRTpcbiAgICAgICAgICAgICAgICB0aGlzLmZhYi5mb2N1c1ByaW1hcnlCdXR0b24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZhYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIH1cblxuICAgIH1cbn1cbiIsIjxidXR0b24gI2J1dHRvblxuICAgICAgICB1eEZvY3VzSW5kaWNhdG9yXG4gICAgICAgIFtwcm9ncmFtbWF0aWNGb2N1c0luZGljYXRvcl09XCJ0cnVlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGZsb2F0aW5nLWFjdGlvbi1idXR0b25cIlxuICAgICAgICBbY2xhc3MuYnV0dG9uLXByaW1hcnldPVwicHJpbWFyeVwiXG4gICAgICAgIFtjbGFzcy5idXR0b24tc2Vjb25kYXJ5XT1cIiFwcmltYXJ5XCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgICAgICBbdGFiSW5kZXhdPVwidGFiaW5kZXgkIHwgYXN5bmNcIlxuICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxuICAgICAgICAoY2xpY2spPVwicHJpbWFyeSA/IGZhYi50b2dnbGUoKSA6IGNsb3NlKClcIj5cblxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuPC9idXR0b24+Il19