Skip to content

Commit 8a137eb

Browse files
authored
feat: created directives for menu addon (#1183)
* #1132 add a menu example with an addon * #1132 add directives for the addon * #1132 update the directived * #1132 add a checkbox example
1 parent a2791b5 commit 8a137eb

10 files changed

Lines changed: 119 additions & 10 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<fd-menu fd-menu-addon>
2+
<ul fd-menu-list>
3+
<li>
4+
<div fd-menu-item-addon>
5+
<fd-icon [glyph]="'cart-5'"></fd-icon>
6+
</div>
7+
<a href=""
8+
fd-menu-item>Option 1</a>
9+
</li>
10+
<li>
11+
<div fd-menu-item-addon>
12+
<fd-icon [glyph]="'accept'"></fd-icon>
13+
</div>
14+
<a href=""
15+
fd-menu-item>Option 2</a>
16+
</li>
17+
<li>
18+
<div fd-menu-item-addon></div>
19+
<a href=""
20+
fd-menu-item>Option 3</a>
21+
</li>
22+
<li>
23+
<div fd-menu-item-addon>
24+
<input type="checkbox" class="fd-form__control">
25+
</div>
26+
<a href=""
27+
fd-menu-item>Option 4</a>
28+
</li>
29+
<li>
30+
<div fd-menu-item-addon>
31+
<fd-icon [glyph]="'cart'"></fd-icon>
32+
</div>
33+
<a href=""
34+
fd-menu-item>Option 5</a>
35+
</li>
36+
</ul>
37+
</fd-menu>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { Component } from '@angular/core';
2+
3+
@Component({
4+
selector: 'fd-menu-addon-example',
5+
templateUrl: './menu-addon-example.component.html'
6+
})
7+
export class MenuAddonExampleComponent { }

docs/app/documentation/component-docs/menu/menu-docs.component.html

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@ <h2>Menu</h2>
66

77
<separator></separator>
88

9+
<h2>Menu with Addon</h2>
10+
<description>This is an additional container that can be used for an icon
11+
or checkbox before the meni item text. This can be achieved with the directives
12+
<code>fd-menu-item-addon</code> and <code>fd-menu-addon</code> </description>
13+
<component-example [name]="'ex10'">
14+
<fd-menu-addon-example></fd-menu-addon-example>
15+
</component-example>
16+
<code-example [exampleFiles]="menuAddon"></code-example>
17+
18+
<separator></separator>
19+
920
<h2>Menu with Group</h2>
1021
<component-example [name]="'ex2'">
1122
<fd-menu-group-example></fd-menu-group-example>

docs/app/documentation/component-docs/menu/menu-docs.component.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Component } from '@angular/core';
22

33
import * as menuSrc from '!raw-loader!./examples/menu-example.component.html';
4+
import * as menuAddon from '!raw-loader!./examples/menu-addon-example.component.html';
45
import * as menuGroupSrc from '!raw-loader!./examples/menu-group-example.component.html';
56
import * as menuKeyboardSrcH from '!raw-loader!./examples/menu-keyboard-support-example.component.html';
67
import * as menuKeyboardSrcT from '!raw-loader!./examples/menu-keyboard-support-example.component.ts';
@@ -18,6 +19,10 @@ export class MenuDocsComponent {
1819
language: 'html',
1920
code: menuSrc
2021
}];
22+
menuAddon: ExampleFile[] = [{
23+
language: 'html',
24+
code: menuAddon
25+
}];
2126

2227
menuGroup: ExampleFile[] = [{
2328
language: 'html',

docs/app/documentation/documentation.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ import {
147147
MenuGroupExampleComponent,
148148
MenuSeparatorExampleComponent
149149
} from './component-docs/menu/examples/menu-examples.component';
150+
import { MenuAddonExampleComponent } from './component-docs/menu/examples/menu-addon-examples.component';
150151
import { ModalOpenTemplateExampleComponent } from './component-docs/modal/examples/template-as-content/modal-open-template-example.component';
151152
import { ModalContentComponent } from './component-docs/modal/examples/component-as-content/modal-content.component';
152153
import { ModalComponentAsContentExampleComponent } from './component-docs/modal/examples/component-as-content/modal-component-as-content-example.component';
@@ -552,6 +553,7 @@ import { ComboboxSearchFunctionExampleComponent } from './component-docs/combobo
552553
ListCheckboxFormExampleComponent,
553554
ListSingleSelectExampleComponent,
554555
MenuExampleComponent,
556+
MenuAddonExampleComponent,
555557
MenuGroupExampleComponent,
556558
MenuSeparatorExampleComponent,
557559
MenuKeyboardSupportExampleComponent,

docs/app/documentation/utilities/api-files.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,11 @@ export const API_FILES = {
108108
'LocalizationEditorMainComponent',
109109
],
110110
menu: [
111+
'MenuAddonDirective',
111112
'MenuComponent',
112113
'MenuGroupComponent',
113114
'MenuItemDirective',
115+
'MenuItemAddonDirective',
114116
'MenuListDirective',
115117
'MenuTitleDirective',
116118
'MenuKeyboardService'
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Directive, HostBinding } from '@angular/core';
2+
3+
/**
4+
* The directive for menu addon(for icons).
5+
*/
6+
@Directive({
7+
selector: '[fd-menu-addon], [fdMenuAddon]'
8+
})
9+
export class MenuAddonDirective {
10+
/** @hidden */
11+
@HostBinding('class.fd-menu--addon-before')
12+
fdMenuAddonClass: boolean = true;
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Directive, HostBinding } from '@angular/core';
2+
3+
/**
4+
* The directive for menu item addon(for icons).
5+
*/
6+
@Directive({
7+
selector: '[fd-menu-item-addon], [fdMenuItemAddon]'
8+
})
9+
export class MenuItemAddonDirective {
10+
/** @hidden */
11+
@HostBinding('class.fd-menu__addon-before')
12+
fdMenuItemAddonClass: boolean = true;
13+
}

library/src/lib/menu/menu.component.spec.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ import { MenuItemDirective } from './menu-item.directive';
99
@Component({
1010
selector: 'fd-menu-test',
1111
template: `
12-
<fd-menu>
12+
<fd-menu fd-menu-addon>
1313
<ul fd-menu-list>
1414
<li fd-menu-item #element1>
15+
<div fd-menu-item-addon></div>
1516
Option 1
1617
</li>
1718
<li fd-menu-item #element2>
@@ -38,7 +39,7 @@ export class TestMenuComponent implements AfterViewInit {
3839
@ViewChild('elementOutOfScope') elementOutOfScope: ElementRef;
3940
@ViewChildren(MenuItemDirective)
4041
menuItems: QueryList<MenuItemDirective>;
41-
public ngAfterViewInit(): void {}
42+
public ngAfterViewInit(): void { }
4243
}
4344

4445

@@ -81,15 +82,15 @@ describe('MenuComponent', () => {
8182
it('should focus second element', () => {
8283
const list = elements.map(element => element.nativeElement);
8384
spyOn(list[1], 'focus');
84-
const event: any = { code: 'ArrowDown', preventDefault: () => {} };
85+
const event: any = { code: 'ArrowDown', preventDefault: () => { } };
8586
service.keyDownHandler(event, 0, items.toArray());
8687
expect(list[1].focus).toHaveBeenCalled();
8788
});
88-
89+
8990
it('Should use default function and select last element, when encounter a beginning and arrow up', () => {
9091
const list = elements.map(element => element.nativeElement);
9192
spyOn(list[3], 'focus');
92-
const event: any = { code: 'ArrowUp', preventDefault: () => {} };
93+
const event: any = { code: 'ArrowUp', preventDefault: () => { } };
9394
service.keyDownHandler(event, 0, items.toArray());
9495
expect(list[3].focus).toHaveBeenCalled();
9596
});
@@ -98,7 +99,7 @@ describe('MenuComponent', () => {
9899
const _elementOutOfScope = elementOutOfScope.nativeElement;
99100
service.focusEscapeAfterList = () => { _elementOutOfScope.focus(); };
100101
spyOn(_elementOutOfScope, 'focus');
101-
const event: any = { code: 'ArrowDown', preventDefault: () => {} };
102+
const event: any = { code: 'ArrowDown', preventDefault: () => { } };
102103
service.keyDownHandler(event, 3, items.toArray());
103104
expect(_elementOutOfScope.focus).toHaveBeenCalled();
104105
});
@@ -107,7 +108,7 @@ describe('MenuComponent', () => {
107108
const _elementOutOfScope = elementOutOfScope.nativeElement;
108109
service.focusEscapeBeforeList = () => { _elementOutOfScope.focus(); };
109110
spyOn(_elementOutOfScope, 'focus');
110-
const event: any = { code: 'ArrowUp', preventDefault: () => {} };
111+
const event: any = { code: 'ArrowUp', preventDefault: () => { } };
111112
service.keyDownHandler(event, 0, items.toArray());
112113
expect(_elementOutOfScope.focus).toHaveBeenCalled();
113114
});

library/src/lib/menu/menu.module.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,28 @@ import { MenuGroupComponent } from './menu-group.component';
66
import { MenuTitleDirective } from './menu-title.directive';
77
import { MenuListDirective } from './menu-list.directive';
88
import { MenuItemDirective } from './menu-item.directive';
9+
import { MenuAddonDirective } from './menu-addon.directive';
10+
import { MenuItemAddonDirective } from './menu-item-addon.directive';
911

1012
@NgModule({
1113
imports: [CommonModule],
12-
exports: [MenuComponent, MenuGroupComponent, MenuTitleDirective, MenuListDirective, MenuItemDirective],
13-
declarations: [MenuComponent, MenuGroupComponent, MenuTitleDirective, MenuListDirective, MenuItemDirective]
14+
exports: [
15+
MenuComponent,
16+
MenuGroupComponent,
17+
MenuTitleDirective,
18+
MenuListDirective,
19+
MenuItemDirective,
20+
MenuAddonDirective,
21+
MenuItemAddonDirective
22+
],
23+
declarations: [
24+
MenuComponent,
25+
MenuGroupComponent,
26+
MenuTitleDirective,
27+
MenuListDirective,
28+
MenuItemDirective,
29+
MenuAddonDirective,
30+
MenuItemAddonDirective
31+
]
1432
})
15-
export class MenuModule {}
33+
export class MenuModule { }

0 commit comments

Comments
 (0)