diff --git a/docs/app/documentation/component-docs/dropdown/examples/dropdown-default-example.component.html b/docs/app/documentation/component-docs/dropdown/examples/dropdown-default-example.component.html index 67ace5b62e0..36cd62645e0 100644 --- a/docs/app/documentation/component-docs/dropdown/examples/dropdown-default-example.component.html +++ b/docs/app/documentation/component-docs/dropdown/examples/dropdown-default-example.component.html @@ -1,6 +1,5 @@ - - Dropdown + + Compact Dropdown
    @@ -22,9 +21,8 @@

    - - Compact Dropdown + + Compact Dropdown
      diff --git a/docs/app/documentation/component-docs/dropdown/examples/dropdown-icons-example.component.html b/docs/app/documentation/component-docs/dropdown/examples/dropdown-icons-example.component.html index 3132c9b3ef0..c0f82cddc9b 100644 --- a/docs/app/documentation/component-docs/dropdown/examples/dropdown-icons-example.component.html +++ b/docs/app/documentation/component-docs/dropdown/examples/dropdown-icons-example.component.html @@ -1,6 +1,5 @@ - - Dropdown + + Dropdown
        diff --git a/docs/app/documentation/component-docs/dropdown/examples/dropdown-infinite-scroll-example.component.html b/docs/app/documentation/component-docs/dropdown/examples/dropdown-infinite-scroll-example.component.html index 73f489c58a4..78344fc20ea 100644 --- a/docs/app/documentation/component-docs/dropdown/examples/dropdown-infinite-scroll-example.component.html +++ b/docs/app/documentation/component-docs/dropdown/examples/dropdown-infinite-scroll-example.component.html @@ -1,5 +1,5 @@ - - Dropdown + + Dropdown
          - Dropdown + + Dropdown
            diff --git a/docs/app/documentation/component-docs/dropdown/examples/dropdown-toolbar-example.component.html b/docs/app/documentation/component-docs/dropdown/examples/dropdown-toolbar-example.component.html index 27ac26e247a..fd008d45a9e 100644 --- a/docs/app/documentation/component-docs/dropdown/examples/dropdown-toolbar-example.component.html +++ b/docs/app/documentation/component-docs/dropdown/examples/dropdown-toolbar-example.component.html @@ -1,7 +1,5 @@ - - Dropdown + + Dropdown
              @@ -23,10 +21,8 @@

              - - Compact Dropdown + + Compact Dropdown
                diff --git a/docs/app/documentation/core-helpers/api/api.component.html b/docs/app/documentation/core-helpers/api/api.component.html index d17b5d7c79b..90ee20e3a1a 100644 --- a/docs/app/documentation/core-helpers/api/api.component.html +++ b/docs/app/documentation/core-helpers/api/api.component.html @@ -1,10 +1,8 @@

                {{activeFile}}

                - - Select a file ({{files.length}}) + + Select a file ({{files.length}})
                  diff --git a/library/src/lib/calendar/calendar.component.ts b/library/src/lib/calendar/calendar.component.ts index 0dc100e8f6c..760bb91421c 100644 --- a/library/src/lib/calendar/calendar.component.ts +++ b/library/src/lib/calendar/calendar.component.ts @@ -100,9 +100,9 @@ export class CalendarComponent implements OnInit, OnDestroy, AfterViewChecked, C @Output() isInvalidDateInput: EventEmitter = new EventEmitter(); - /** @hidden Used when this calendar is for a date time picker component. For internal use. */ + /** Whether wants to allow escape focus, otherwise it resets on beginning. */ @Input() - isDateTimePicker: boolean = false; + allowFocusEscape: boolean = false; /** @hidden Whether the date is invalid. Internal use. */ invalidDate: boolean = false; @@ -899,7 +899,7 @@ export class CalendarComponent implements OnInit, OnDestroy, AfterViewChecked, C } newFocusedYearId = '#' + this.id + '-fd-year-' + (year + 1); } else if (event.code === 'Tab' && !event.shiftKey) { - if (!this.isDateTimePicker) { + if (!this.allowFocusEscape) { event.preventDefault(); this.focusElement('#arrowLeft'); } @@ -936,7 +936,7 @@ export class CalendarComponent implements OnInit, OnDestroy, AfterViewChecked, C newFocusedMonthId = '#' + this.id + '-fd-month-' + (month + 1); } } else if (event.code === 'Tab' && !event.shiftKey) { - if (!this.isDateTimePicker) { + if (!this.allowFocusEscape) { event.preventDefault(); this.focusElement('#arrowLeft'); } @@ -949,7 +949,7 @@ export class CalendarComponent implements OnInit, OnDestroy, AfterViewChecked, C /** @hidden */ onKeydownDayHandler(event, cell) { if (event.code === 'Tab' && !event.shiftKey) { - if (!this.isDateTimePicker) { + if (!this.allowFocusEscape) { event.preventDefault(); this.focusElement('#arrowLeft'); } diff --git a/library/src/lib/datetime-picker/datetime-picker.component.html b/library/src/lib/datetime-picker/datetime-picker.component.html index a86401a1557..dba27a1e0ae 100644 --- a/library/src/lib/datetime-picker/datetime-picker.component.html +++ b/library/src/lib/datetime-picker/datetime-picker.component.html @@ -38,7 +38,7 @@ [(selectedDay)]="selectedDay" (isInvalidDateInput)="isInvalidDateInputHandler($event)" [dateFromDatePicker]="dateFromInput" - [isDateTimePicker]="true" + [allowFocusEscape]="true" [startingDayOfWeek]="startingDayOfWeek">
                diff --git a/library/src/lib/popover/popover-dropdown/popover-dropdown.component.html b/library/src/lib/popover/popover-dropdown/popover-dropdown.component.html new file mode 100644 index 00000000000..4a84b236f80 --- /dev/null +++ b/library/src/lib/popover/popover-dropdown/popover-dropdown.component.html @@ -0,0 +1,19 @@ +
                + +
                diff --git a/library/src/lib/popover/popover-dropdown/popover-dropdown.component.spec.ts b/library/src/lib/popover/popover-dropdown/popover-dropdown.component.spec.ts new file mode 100644 index 00000000000..cd39e8834d8 --- /dev/null +++ b/library/src/lib/popover/popover-dropdown/popover-dropdown.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { PopoverDropdownComponent } from './popover-dropdown.component'; + + +describe('PopoverControlComponent', () => { + let component: PopoverDropdownComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PopoverDropdownComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PopoverDropdownComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/library/src/lib/popover/popover-dropdown/popover-dropdown.component.ts b/library/src/lib/popover/popover-dropdown/popover-dropdown.component.ts new file mode 100644 index 00000000000..25b0342500a --- /dev/null +++ b/library/src/lib/popover/popover-dropdown/popover-dropdown.component.ts @@ -0,0 +1,50 @@ +import { Component, Host, Inject, Input, OnDestroy, ViewEncapsulation } from '@angular/core'; +import { Subscription } from 'rxjs'; +import { PopoverComponent } from '../popover.component'; +/** + * A component used to enforce a certain layout for the popover. With additional styling + * ```html + * + * Dropdown + * Popover Body + * + * ``` + */ +@Component({ + selector: 'fd-dropdown-control', + host: { + class: 'fd-dropdown', + }, + templateUrl: 'popover-dropdown.component.html', + encapsulation: ViewEncapsulation.None, +}) +export class PopoverDropdownComponent { + /** Whether the popover should have an arrow. */ + @Input() + noArrow: boolean = true; + + /** Whether the popover is disabled. */ + @Input() + disabled: boolean = false; + + /** The glyph to display. */ + @Input() + glyph: string; + + /** The btnType to display. */ + @Input() + btnType: string = ''; + + /** Whether the dropdown is in compact format. */ + @Input() + compact: boolean = false; + + /** Whether the dropdown is in a toolbar. */ + @Input() + toolbar: boolean = false; + + /** Whether the dropdown is opened. */ + @Input() + isOpen: boolean = false; + +} diff --git a/library/src/lib/popover/popover.component.html b/library/src/lib/popover/popover.component.html index 4a3ced3746d..e4cf93078ce 100644 --- a/library/src/lib/popover/popover.component.html +++ b/library/src/lib/popover/popover.component.html @@ -1,49 +1,11 @@ -
                -
                -
                - -
                - - - -
                -
                -
                +
                +
                diff --git a/library/src/lib/popover/popover.component.ts b/library/src/lib/popover/popover.component.ts index 7e96dd46ed1..5d6ec753c56 100644 --- a/library/src/lib/popover/popover.component.ts +++ b/library/src/lib/popover/popover.component.ts @@ -3,10 +3,11 @@ import { Input, Output, EventEmitter, - ViewChild, ViewEncapsulation + ViewChild, ViewEncapsulation, ContentChild } from '@angular/core'; import { Placement, PopperOptions } from 'popper.js'; import { PopoverDirective } from './popover-directive/popover.directive'; +import { PopoverDropdownComponent } from './popover-dropdown/popover-dropdown.component'; let popoverUniqueId: number = 0; @@ -31,6 +32,8 @@ export class PopoverComponent { /** @hidden */ @ViewChild(PopoverDirective) directiveRef: PopoverDirective; + /** @hidden */ + @ContentChild(PopoverDropdownComponent) dropdownComponent: PopoverDropdownComponent; /** Whether the popover should have an arrow. */ @Input() @@ -58,26 +61,10 @@ export class PopoverComponent { @Input() placement: Placement; - /** Only to be used when the popover is used as a dropdown. The glyph to display. */ - @Input() - glyph: string; - - /** Only to be used when the popover is used as a dropdown. The btnType to display. */ - @Input() - btnType: string = ''; - /** Whether the popover is open. Can be used through two-way binding. */ @Input() isOpen: boolean = false; - /** Only to be used when the popover is used as a dropdown. Whether the dropdown is in compact format. */ - @Input() - compact: boolean = false; - - /** Only to be used when the popover is used as a dropdown. Whether the dropdown is in a toolbar. */ - @Input() - toolbar: boolean = false; - /** The Popper.js options to attach to this popover. * See the [Popper.js Documentation](https://popper.js.org/popper-documentation.html) for details. */ @Input() @@ -154,4 +141,22 @@ export class PopoverComponent { this.directiveRef.updatePopper(); } + /** + * Function is called every time popover changes open attribute + */ + public openChanged(isOpen: boolean) { + this.isOpenChange.emit(isOpen); + this.updateDropdownIsOpen(isOpen); + } + + + /** @hidden + * Function that allows us to control aria-expanded on dropdown child + * */ + private updateDropdownIsOpen(isOpen: boolean) { + if (this.dropdownComponent) { + this.dropdownComponent.isOpen = isOpen; + } + } + } diff --git a/library/src/lib/popover/popover.module.ts b/library/src/lib/popover/popover.module.ts index 013adb910fd..0aeffe9d843 100644 --- a/library/src/lib/popover/popover.module.ts +++ b/library/src/lib/popover/popover.module.ts @@ -6,11 +6,19 @@ import { PopoverControlComponent } from './popover-control/popover-control.compo import { PopoverBodyComponent } from './popover-body/popover-body.component'; import { PopoverDirective } from './popover-directive/popover.directive'; import { PopoverContainer } from './popover-directive/popover-container'; +import { PopoverDropdownComponent } from './popover-dropdown/popover-dropdown.component'; @NgModule({ - declarations: [PopoverComponent, PopoverControlComponent, PopoverBodyComponent, PopoverDirective, PopoverContainer], + declarations: [ + PopoverComponent, + PopoverControlComponent, + PopoverBodyComponent, + PopoverDirective, + PopoverContainer, + PopoverDropdownComponent, + ], imports: [CommonModule], - exports: [PopoverComponent, PopoverControlComponent, PopoverBodyComponent, PopoverDirective], + exports: [PopoverComponent, PopoverControlComponent, PopoverBodyComponent, PopoverDirective, PopoverDropdownComponent], entryComponents: [PopoverContainer] }) export class PopoverModule {} diff --git a/library/src/lib/time/time.component.ts b/library/src/lib/time/time.component.ts index 1b1d4e99db4..39296e9044d 100644 --- a/library/src/lib/time/time.component.ts +++ b/library/src/lib/time/time.component.ts @@ -51,10 +51,6 @@ export class TimeComponent implements OnChanges, ControlValueAccessor { @Input() time: TimeObject = { hour: 0, minute: 0, second: 0 }; - /** @hidden */ - @Input() - isDateTimePicker: boolean = false; - /** @hidden */ @Output() focusArrowLeft: EventEmitter = new EventEmitter();