Тестовое задание на Angular. Создание admin лейаута.

Aleksandr Serenko
F.A.F.N.U.R
Published in
2 min readJul 5, 2021

В данной статье создадим Admin layout по аналогии с базовым layout’ом всего приложения.

В макете выведем admin menu и выделим место для вывода основного контента.

Реализация AdminLayout

Создадим модуль и компонент:

В шаблоне представлены два экрана мобильные устройства и персональные ПК.

<ng-container *ngIf="isDesktopScreen; then desktopTpl; else mobileTpl"></ng-container>

<ng-template #desktopTpl>
<app-container mode="fluid" height="max-height">
<app-row mode="md">
<app-column class="admin-menu" [modes]="{ md: 4, lg: 3, xl: 2 }">
<app-admin-desktop-menu automation-id="admin-desktop-menu"></app-admin-desktop-menu>
</app-column>
<app-column [modes]="{ md: 8, lg: 9, xl: 10 }">
<router-outlet></router-outlet>
</app-column>
</app-row>
</app-container>
</ng-template>

<ng-template #mobileTpl>
<app-admin-mobile-menu class="admin-menu" automation-id="admin-mobile-menu"></app-admin-mobile-menu>
<app-container mode="fluid" height="max-height">
<router-outlet></router-outlet>
</app-container>
</ng-template>

В данном случае, в мобильной версии показыватся админ меню сверху, а ниже будет идти контент. В десктопной версии, будут колонки, где слева будет выводиться меню, а справа соответствующий контент.

Для реализации определения типа устройства вновь используется BreakpontObservable из Angular CDK:

this.breakpointObserver
.observe(mediaBreakpointUp(GridBreakpointType.Md))
.pipe(
tap((breakpoints) => {
this.isDesktopScreen = breakpoints.matches;
this.changeDetectorRef.markForCheck();
}),
takeUntil(this.destroy$)
)
.subscribe();

Реализация AdminMenu

Теперь реализуем admin menu, которое в мобильной и десктопной версиях будет отличаться.

Создадим мобильное меню:

Реализация меню тривиальна. Берем список ссылок и выводим его, использовав Angular Material Tabs:

<nav mat-tab-nav-bar>
<a mat-tab-link automation-id="admin-mobile-menu-link" [routerLink]="link.route | navPath" *ngFor="let link of links">
{{ link.label }}
</a>
</nav>

Ссылки берутся из сервиса AdminMenuService:

Где в компоненте, при инициализации задаются ссылки:

ngOnInit(): void {
this.links = this.adminMenuService.links();
}

Отметим, что это гипертрофированный случай использования сервисов. В данном случае можно просто определить ссылки в виде константы и использовать ее и создавать сервис явно не нужно.

В версии для настольных РС, меню создается аналогичным способом:

Так как по непонятным причинам, ссылка была вынесена в отдельный модуль, модуль ссылки:

Как и в случае с мобильным меню, просто перебираем ссылки и выводим их.

Данных компонентов достаточно, чтобы начать создавать страницу админ панели.

Ссылки

Вернуться к оглавлению — Введение.

Следующая статья — Создание страницы в админ панели.

Предыдущая статья — Навигация в приложении.

Все исходники на github/fafnur/barinb.

Группа в Medium: https://medium.com/fafnur
Группа в Vkontakte: https://vk.com/fafnur
Группа в Facebook: https://www.facebook.com/groups/fafnur/
Telegram канал: https://t.me/f_a_f_n_u_r
Twitter: https://twitter.com/Fafnur1
LinkedIn: https://www.linkedin.com/in/fafnur

--

--

Aleksandr Serenko
F.A.F.N.U.R

Senior Front-end Developer, Angular evangelist, Nx apologist, NodeJS warlock