Skip to content

Commit f08dc46

Browse files
authoredJan 7, 2023
feat(theme:layout-default): add layout-default-top-menu-item (#1570)
1 parent f8c0589 commit f08dc46

9 files changed

+112
-5
lines changed
 

‎packages/theme/layout-default/index.en-US.md

+4
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ The layout can be dynamically managed at runtime through the `LayoutDefaultServi
141141

142142
The trigger style of the head item.
143143

144+
### layout-default-top-menu-item
145+
146+
Header business menu item.
147+
144148
## Layout description
145149

146150
In the upper-left-right layout mode, it is applied to the development of the **business page**. Its specification details:

‎packages/theme/layout-default/index.zh-CN.md

+4
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ export class LayoutBasicComponent {
141141

142142
头部项的触发样式。
143143

144+
### layout-default-top-menu-item
145+
146+
头部业务菜单项。
147+
144148
## 布局说明
145149

146150
按上-左-右布局方式,运用于**业务页**的开发。其规范细节:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';
2+
3+
import { BooleanInput, InputBoolean } from '@delon/util/decorator';
4+
5+
@Component({
6+
selector: 'layout-default-top-menu-item',
7+
template: `<ng-content></ng-content>`,
8+
host: {
9+
'[class.alain-default__nav-item]': `true`,
10+
'[class.alain-default__top-menu-item]': `true`,
11+
'[class.alain-default__top-menu-item-selected]': `selected`,
12+
'[class.alain-default__top-menu-item-disabled]': `disabled`
13+
},
14+
preserveWhitespaces: false,
15+
changeDetection: ChangeDetectionStrategy.OnPush,
16+
encapsulation: ViewEncapsulation.None
17+
})
18+
export class LayoutDefaultTopMenuItemComponent {
19+
static ngAcceptInputType_selected: BooleanInput;
20+
static ngAcceptInputType_disabled: BooleanInput;
21+
22+
@Input() @InputBoolean() selected = false;
23+
@Input() @InputBoolean() disabled = false;
24+
}

‎packages/theme/layout-default/layout.module.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@ import { LayoutDefaultHeaderItemTriggerDirective } from './layout-header-item-tr
1313
import { LayoutDefaultHeaderItemComponent } from './layout-header-item.component';
1414
import { LayoutDefaultHeaderComponent } from './layout-header.component';
1515
import { LayoutDefaultNavComponent } from './layout-nav.component';
16+
import { LayoutDefaultTopMenuItemComponent } from './layout-top-menu-item';
1617
import { LayoutDefaultComponent } from './layout.component';
1718

1819
const COMPONENTS = [
1920
LayoutDefaultComponent,
2021
LayoutDefaultNavComponent,
2122
LayoutDefaultHeaderComponent,
2223
LayoutDefaultHeaderItemComponent,
23-
LayoutDefaultHeaderItemTriggerDirective
24+
LayoutDefaultHeaderItemTriggerDirective,
25+
LayoutDefaultTopMenuItemComponent
2426
];
2527

2628
@NgModule({

‎packages/theme/layout-default/public_api.ts

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export * from './layout.module';
33
export * from './layout-header.component';
44
export * from './layout-header-item.component';
55
export * from './layout-header-item-trigger.directive';
6+
export * from './layout-top-menu-item';
67
export * from './layout-nav.component';
78
export * from './types';
89
export * from './layout.service';

‎packages/theme/layout-default/style/_header.less

+23-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
margin: 0;
4444
padding: 0;
4545

46+
&:first-child {
47+
margin-right: 16px;
48+
}
49+
4650
&-middle {
4751
flex: 1;
4852
}
@@ -76,7 +80,7 @@
7680

7781
&:hover {
7882
color: #fff;
79-
background-color: rgba(255, 255, 255, 0.2) !important;
83+
background-color: @alain-default-header-nav-bg-hover;
8084
}
8185

8286
> i,
@@ -87,6 +91,24 @@
8791
}
8892
}
8993
}
94+
95+
&__top-menu-item {
96+
display: flex;
97+
align-items: center;
98+
height: @alain-default-header-hg;
99+
padding: @alain-default-header-top-menu-item-padding;
100+
border-radius: 0;
101+
102+
&-selected {
103+
color: #fff;
104+
background-color: @alain-default-header-nav-bg-hover;
105+
}
106+
107+
&-disabled {
108+
opacity: .5;
109+
pointer-events: none;
110+
}
111+
}
90112
}
91113

92114
// Search

‎packages/theme/layout-default/style/theme-compact.less

+2
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@
55

66
@alain-default-aside-collapsed-nav-fs: 20px;
77
@alain-default-aside-collapsed-nav-img-wh: 20px;
8+
9+
@alain-default-header-top-menu-item-padding: 0 8px;

‎packages/theme/layout-default/style/theme-default.less

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
@alain-default-header-icon-fs: 18px;
99
@alain-default-header-logo-max-height: 36px;
1010
@alain-default-header-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.2);
11+
@alain-default-header-nav-bg-hover: rgba(255, 255, 255, 0.2);
12+
13+
@alain-default-header-top-menu-item-padding: 0 16px;
1114

1215
@alain-default-aside-wd: 200px;
1316
@alain-default-aside-bg: #fff;

‎src/dev/layout.component.ts

+48-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Component, Inject, OnInit } from '@angular/core';
2+
import { Router } from '@angular/router';
23

3-
// import { Router } from '@angular/router';
44
import {
55
AppstoreOutline,
66
BellOutline,
@@ -25,6 +25,7 @@ import {
2525
import { ReuseCustomContextMenu } from '@delon/abc/reuse-tab';
2626
import { ALAIN_I18N_TOKEN, Menu, MenuService, RTLService, SettingsService, User } from '@delon/theme';
2727
import { LayoutDefaultOptions } from '@delon/theme/layout-default';
28+
import { deepCopy } from '@delon/util/other';
2829
import { NzIconService } from 'ng-zorro-antd/icon';
2930
import { NzMessageService } from 'ng-zorro-antd/message';
3031

@@ -60,6 +61,16 @@ const ICONS = [
6061
<i nz-icon nzType="github"></i>
6162
</a>
6263
</layout-default-header-item>
64+
<layout-default-header-item direction="middle">
65+
<layout-default-top-menu-item
66+
*ngFor="let m of topMenus"
67+
(click)="changeMenu(m.key)"
68+
[selected]="m.selected"
69+
[disabled]="m.disabled"
70+
>
71+
<i nz-icon nzType="github"></i> {{ m.label }}
72+
</layout-default-top-menu-item>
73+
</layout-default-header-item>
6374
<layout-default-header-item direction="right">
6475
<a class="alain-default__nav-item" (click)="rtl.toggle()">{{ rtl.nextDir | uppercase }}</a>
6576
</layout-default-header-item>
@@ -106,6 +117,11 @@ export class DevLayoutComponent implements OnInit {
106117
get user(): User {
107118
return this.settings.user;
108119
}
120+
topMenus: Array<{ key: string; label: string; selected?: boolean; disabled?: boolean }> = [
121+
{ key: '', label: 'Default', selected: true },
122+
{ key: 'bus', label: 'Bus', selected: false },
123+
{ key: 'disabled', label: 'Disabbled', disabled: true }
124+
];
109125

110126
menus: Menu[] = [
111127
{
@@ -190,14 +206,32 @@ export class DevLayoutComponent implements OnInit {
190206
private menuSrv: MenuService,
191207
public settings: SettingsService,
192208
public msgSrv: NzMessageService,
193-
// private router: Router,
209+
private router: Router,
194210
@Inject(ALAIN_I18N_TOKEN) private i18n: I18NService,
195211
public rtl: RTLService
196212
) {
197213
iconSrv.addIcon(...ICONS);
198214
// this.testReuse();
199215
}
200216

217+
changeMenu(key: string): void {
218+
this.menuSrv.add(
219+
key === ''
220+
? deepCopy(this.menus)
221+
: [
222+
{
223+
text: 'test',
224+
group: true,
225+
children: [{ text: `TYPE - ${key}`, link: '/dev/view/1', icon: 'anticon anticon-appstore' }]
226+
}
227+
]
228+
);
229+
for (let tm of this.topMenus) {
230+
tm.selected = tm.key === key;
231+
}
232+
this.loadFirstValidMenu();
233+
}
234+
201235
// private testReuse(): void {
202236
// const urls = ['/dev/l2', '/dev/l3', '/dev/l4', '/dev/l5', '/dev/l6'];
203237
// const fn = (pos: number) => {
@@ -222,6 +256,17 @@ export class DevLayoutComponent implements OnInit {
222256
}
223257

224258
ngOnInit(): void {
225-
this.menuSrv.add(this.menus);
259+
this.menuSrv.add(deepCopy(this.menus));
260+
}
261+
262+
private loadFirstValidMenu(): void {
263+
let res: Menu | undefined;
264+
this.menuSrv.visit(this.menuSrv.menus, item => {
265+
if (res == null && item.hide !== true && item.link != null && item.link.length > 0) {
266+
res = item;
267+
}
268+
});
269+
if (res == null) return;
270+
this.router.navigateByUrl(res.link!!);
226271
}
227272
}

0 commit comments

Comments
 (0)
Please sign in to comment.