dropdown menu

master
Boris Voropaev 2023-10-23 14:18:57 +03:00
parent 6659ffa412
commit f289492f49
20 changed files with 139 additions and 262 deletions

View File

@ -2,7 +2,7 @@
width: 100%;
padding: 40px 100px;
background-color: var(--blue-3);
background-color: var(--prime-act);
color: white;
display: flex;
flex-direction: column;

View File

@ -61,7 +61,7 @@
}
display: block;
background: var(--blue-3);
background: var(--prime-act);
color: white;
width: 480px;
padding: 32px 40px;

View File

@ -1,36 +1,25 @@
<div class="user" (click)="ddHidden=!ddHidden" (mouseover)="ddHidden=false" (mouseleave)="ddHidden=true" >
<div class="user" (click)="ddHidden=!ddHidden"(mouseover)="ddHidden=false" (mouseleave)="ddHidden=true">
<div class="avatar">
<img *ngIf="avatar" [src]="avatar.links?.thumb" />
<span *ngIf="!avatar" class="initials">{{user.initials}}</span>
</div>
<div class="dropdown" [class.hidden]="ddHidden" (click)="close()">
<ul >
<li (click)="link('profile')">Личный кабинет</li>
<div class="dropdown" [class.hidden]="ddHidden" (click)="close()" #menu>
<div class="menu">
<div (click)="link('profile')" class="type">
<div class="row">Личный кабинет</div>
</div>
<!-- <li *ngIf="isJournalVisible" (click)="link('applications')">Журнал заявок</li> -->
<li *ngIf="authService.isAdmin" (click)="link('administrate')">Структура сайта</li>
<li (click)="logout()">Выход из системы</li>
</ul>
<div class="type" *ngIf="authService.isAdmin" (click)="link('administrate')">
<div class="row">Структура сайта</div>
</div>
<div class="type" (click)="logout()">
<div class="row">Выход из системы</div>
</div>
</div>
</div>
<div class="name">
{{user.name}}
</div>
<div class="toggle"></div>
</div>
<!--div class="user" *ngIf="user">
<div class="avatar">
<img *ngIf="avatar" [src]="avatar.links?.thumb" />
<span *ngIf="!avatar" class="initials">{{user.initials}}</span>
<div class="button">
<div class="triangle"></div>
<div class="dropdown">
<ul>
<li><a routerLink="/profile">Личный кабинет</a></li>
<li *ngIf="isJournalVisible"><a routerLink="/applications">Журнал заявок</a></li>
<li *ngIf="authService.isAdmin"><a routerLink="/administrate">Панель управления</a></li>
<li (click)="logout()"><span>Выход из системы</span></li>
</ul>
</div>
</div>
</div>
</div-->
<drop-down [target]="menu" [visible]="!ddHidden" ico="arrow_drop_down_24"></drop-down>
</div>

View File

@ -1,7 +1,5 @@
.user {
.ddHidden{
display: none;
}
position: relative;
display: flex;
padding: 11px;
@ -39,61 +37,7 @@
white-space: nowrap;
}
.toggle{
height: 24px;
width: 24px;
background: url("~src/assets/images/icons/arrow_drop_down_grey_24dp.svg") no-repeat center;
margin-top: 7px;
}
.dropdown {
display: none;
}
.dropdown {
display: block;
width: 250px;
right: 12px;
top: 42px;
z-index: 1;
ul {
display: flex;
flex-direction: column;
margin: 0;
padding: 0;
list-style: none;
border-radius: 12px;
li {
display: block;
padding: 12px 20px;
color: var(--second-act);
cursor: pointer;
border-bottom: #E0E0E0 solid 1px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
&:first-child {
border-radius: 8px 8px 0 0;
}
&:last-child {
border-radius: 0 0 8px 8px;
a, span {
border-bottom: none;
}
}
&:hover {
background-color: #f7f7f7;
}
}
}
&.hidden {
display: none;
}
}
}

View File

@ -2,6 +2,7 @@ import {NgModule} from '@angular/core';
import {BrowserModule} from "@angular/platform-browser";
import {RouterModule} from "@angular/router";
import {FormsModule, ReactiveFormsModule} from "@angular/forms";
import { VigetModule } from '@app/_modules/viget/viget.module';
import {PagesModule} from "@app/_modules/pages/pages.module";
import { PagesMenuModule } from '../pages/menu/pages-menu.module';
@ -12,6 +13,7 @@ import {SettingSiteComponent} from "@app/_modules/layout/setting-site/setting-si
import {HeaderUserBarComponent} from "@app/_modules/layout/header/user-bar/header-user-bar.component";
import { RetainerComponent } from './retainer/retainer.component';
@NgModule({
imports: [
BrowserModule,
@ -19,7 +21,8 @@ import { RetainerComponent } from './retainer/retainer.component';
ReactiveFormsModule,
RouterModule,
PagesModule,
PagesMenuModule
PagesMenuModule,
VigetModule
],
declarations: [
GridComponent,

View File

@ -55,7 +55,7 @@
&.style-color {
color: #28a814;
background-color: #F6F6F6;
background-color: var(--light);
}
&.style-brown {
background-color: #f7f0d2;

View File

@ -1,5 +1,5 @@
.content {
background-color: #F6F6F6;
background-color: var(--light);
padding-bottom: 120px;
.limiter{
max-width: 1280px;

View File

@ -1,15 +1,19 @@
<div class="add" (mouseleave)="hideDD()">
<div class="toggle" [class.active]="ddVisible" (click)="toggleDD()">Добавить элемент</div>
<div class="dropdown active" [class.active]="ddVisible">
<div class="menu">
<div *ngFor="let type of types" class="type">
<div class="row" *ngIf="type?.children?.data?.length > 0; else addItem" (click)="submenu(type)">
<div class="toggle prime" [class.active]="ddVisible" (click)="toggleDD()">
<ico ico="add_circle_24"></ico>
<a [class.active]="ddVisible">Добавить элемент</a>
<drop-down ico="arrow_drop_down_24" [target]="menu" [visible]="ddVisible"></drop-down>
</div>
<div class="dropdown" #menu>
<div class="menu" *ngIf="types?.length">
<div *ngFor="let type of types; let i=index" class="type">
<div class="row" *ngIf="type?.children?.data?.length > 0; else addItem" (click)="toggleSub(i)">
<div class="title">{{type.title}}</div>
<div class="submenu{{type.showChilren?' active':''}}"></div>
<drop-down ico="expand_less_24" [target]="submenu" [visible]="sub[i]" [angle] = "[180,0]"></drop-down>
</div>
<ng-container *ngIf="type.showChilren">
<div #submenu>
<div class="sub-row" *ngFor="let childrenType of type?.children?.data" (click)="add(childrenType.name)" [innerText]="childrenType.title"></div>
</ng-container>
</div>
<ng-template #addItem>
<div class="row" (click)="add(type.name)"><div class="title" [innerText]="type.title"></div></div>
</ng-template>

View File

@ -1,127 +1,17 @@
.add {
.add{
position: relative;
display: inline-block;
height: 24px;
margin-top: 16px;
margin-bottom: 40px;
.toggle {
position: relative;
padding-left: 32px;
color: var(--prime);
// background: var(--white) url("~src/assets/images/icons/add_24dp.svg") no-repeat center;
cursor: pointer;
z-index: 1;
&:before {
display: inline-block;
width: 24px;
height: 24px;
background: url("~src/assets/images/icons/add_cirle_24dp.svg") no-repeat center;
content: '';
z-index: 0;
bottom: -2px;
position: absolute;
left: 0px;
}
&:hover{
&:before{
background-image: url("~src/assets/images/icons/add_cirle_active_24dp.svg");
}
&:after{
background-image: url("~src/assets/images/icons/arrow_drop_down_active_24dp.svg");
};
color: var(--blue-3);
}
&.active{
&:before{
background-image: url("~src/assets/images/icons/add_cirle_active_24dp.svg");
}
&:after{
transform: rotate(180deg);
background-image: url("~src/assets/images/icons/arrow_drop_down_active_24dp.svg");
};
color: var(--blue-3);
}
&:after {
display: inline-block;
width: 24px;
height: 24px;
background: url("~src/assets/images/icons/arrow_drop_down_24dp.svg") no-repeat center;
content: '';
z-index: 0;
bottom: -2px;
position: absolute;
right: -28px;
transform: rotate(0deg);
transition: transform .3s;
.toggle{
position:inherit;
display: flex;
gap:8px;
align-items: center;
drop-down{
margin-top: 4px;
}
&.active{
a{
color: var(--prime-act);
}
}
.dropdown {
display: none;
width: 250px;
left: 48px;
top: 24px;
z-index: 10;
&.active {
display: block;
}
.menu {
display: flex;
flex-direction: column;
margin: 0;
padding: 0;
border-radius: 12px;
position: relative;
z-index: 30;
.type {
display: flex;
flex-direction: column;
&:first-child {
border-radius: 12px 12px 0 0;
}
&:last-child {
border-radius: 0 0 12px 12px;
.row {
border-bottom: none;
}
a, span {
border-bottom: none;
}
}
>&:hover {
background-color: #f7f7f7;
}
.row {
display: flex;
flex-direction: row;
justify-content: space-between;
padding: 12px 20px;
border-bottom: #E0E0E0 solid 1px;
column-gap: 12px;
cursor: pointer;
color: var(--second-act);
background: transparent;
}
.sub-row {
padding: 12px 16px 12px 32px;
border-bottom: #E0E0E0 solid 1px;
color: var(--second);
cursor: pointer;
&:hover {
background-color: #f7f7f7;
}
}
}
}
}
}
}

View File

@ -12,6 +12,7 @@ export class AddSectionComponent {
@Input() modelType: string;
public types = <any>[];
public ddVisible = false;
public sub:boolean[] =[]
constructor(private formsService: FormsService, private objectsService: ObjectsService) {
}
@ -57,4 +58,9 @@ export class AddSectionComponent {
hideDD() {
this.ddVisible = false;
}
toggleSub(i:number){
let val=!this.sub[i];
this.sub = this.sub.map(item=>false);
this.sub[i]=val;
}
}

View File

@ -4,6 +4,7 @@ import {FormsModule, ReactiveFormsModule} from "@angular/forms";
import {SwiperModule} from "swiper/angular";
import {ObjectsModule} from "@app/_modules/objects/objects.module";
import { VigetModule } from '@app/_modules/viget/viget.module';
import {PageSectionsComponent} from "@app/_modules/pages/sections/list/page-sections.component";
import {PageSectionComponent} from "@app/_modules/pages/sections/item/page-section.component";
@ -27,6 +28,7 @@ import {ImageGroupSectionComponent} from "@app/_modules/pages/sections/types/bas
import {MemberSectionItemComponent} from "@app/_modules/pages/sections/types/basic/member/item/member-section-item.component";
import {MemberSectionListComponent} from "@app/_modules/pages/sections/types/basic/member/list/member-section-list.component";
@NgModule({
imports: [
CommonModule,
@ -34,6 +36,7 @@ import {MemberSectionListComponent} from "@app/_modules/pages/sections/types/bas
ReactiveFormsModule,
ObjectsModule,
SwiperModule,
VigetModule
],
declarations: [
PageMenuComponent,

View File

@ -8,7 +8,7 @@
a {
color: var(--prime);
&:hover{
color: var(--blue-3);
color: var(--prime-act);
};
}
>div{

View File

@ -47,7 +47,7 @@
}
a {
img {
border: 2px solid var(--blue-4);
border: 2px solid var(--prime-dis);
cursor: pointer;
}
}

View File

@ -1,3 +1,3 @@
<div class="toggle" (click)="click()">
<ico [ico]="ico" [color]="visible?'var(--active)':null" [rotate]="visible?angle[1]:angle[0]"></ico>
<ico [ico]="ico" [rotate]="visible?angle[1]:angle[0]"></ico>
</div>

View File

@ -7,9 +7,26 @@
}
}
:host-context(a){
:host-context(.prime, a){
svg.color{color: var(--prime)}
}
:host-context(.prime:hover, a:hover){
svg.color{color: var(--prime-hov)}
}
:host-context(.prime.active, a.active, .prime:active, a:active){
svg.color{color: var(--prime-act)}
}
:host-context(.second, button){
svg.color{color: var(--second)}
}
:host-context(.second:hover, button:hover){
svg.color{color: var(--second-hov)}
}
:host-context(.second.active, button.active, .second:active, button:active){
svg.color{color: var(--second-act)}
}
:host{
display: inline-flex;
}

View File

@ -27,7 +27,7 @@ export class IcoComponent {
this.width = this.size[0]
this.height = this.size[1]
}
this.url = `assets/images/icons/${this.ico}.svg#ico`
this.url = `assets/images/ico/${this.ico}.svg#ico`
}

View File

@ -1,8 +1,8 @@
import { NgModule } from "@angular/core";
import {BrowserModule} from "@angular/platform-browser";
import { IcoComponent } from "./ico/ico.component";
import { QRCodeComponent } from "./qrcode/qrcode.component";
import { QRCodeModule } from "angularx-qrcode";
// import { QRCodeComponent } from "./qrcode/qrcode.component";
// import { QRCodeModule } from "angularx-qrcode";
import {DropDownComponent } from "./drop-down/drop-down.component";
import { SliderComponent } from './slider/slider.component';
import { SwitchComponent } from './switch/switch.component';
@ -11,18 +11,18 @@ import { SwitchComponent } from './switch/switch.component';
@NgModule({
imports:[
BrowserModule,
QRCodeModule
// QRCodeModule
],
declarations: [
IcoComponent,
QRCodeComponent,
// QRCodeComponent,
DropDownComponent,
SliderComponent,
SwitchComponent,
],
exports: [
IcoComponent,
QRCodeComponent,
// QRCodeComponent,
DropDownComponent,
SliderComponent,
SwitchComponent

View File

@ -6,6 +6,7 @@
--radius-1: 12px;
--radius-2: 20px;
--white: #ffffff;
--light: #DDD;
--prime: #0070BA;
@ -21,15 +22,12 @@
--blue-0: #2EB2E8;
--blue-3: #004077;
--blue-4: #A1CAE5;
}
.style-color{
background-color: #f6f6f6;
background-color: var(--light);
}
.mat-calendar-body-selected {
@ -78,6 +76,7 @@ body {
padding: 0;
margin: 0;
color: var(--second-act);
background-color: var(--light);
}
.limiter {
@ -126,7 +125,7 @@ a {
color: var(--prime);
cursor: pointer;
&:hover{
color: var(--blue-3);
color: var(--prime-act);
};
&.document {
display: inline-flex;

View File

@ -1,41 +1,54 @@
.dropdown {
position: absolute;
top: 100%;
right: 0;
width: 100%;
background-color: #ffffff;
border: #dedede solid 1px;
box-shadow: 0 3px 6px 0 rgb(0 0 0 / 16%);
width: 250px;
left: 48px;
top: 32px;
z-index: 10;
z-index: 1000;
border-radius: 8px;
.menu {
margin: 0;
padding: 0;
list-style: none;
border-radius: 8px;
display: flex;
flex-direction: column;
border: var(--second-dis) solid 1px;
border-radius: var(--radius-1);
box-shadow: 0 3px 6px 0 rgb(0 0 0 / 16%);
.type {
width: 100%;
display: flex;
flex-direction: column;
background-color: var(--white);
border-bottom: var(--second-dis) solid 1px;
overflow: hidden;
&:first-child {
border-radius: var(--radius-1) var(--radius-1) 0 0;
}
&:last-child {
border-radius: 0 0 var(--radius-1) var(--radius-1);
.row {
border-bottom: none;
}
a, span {
border-bottom: none;
}
}
>&:hover {
background-color: var(--light);
}
.row {
width: 100%;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
column-gap: 16px;
padding: 12px 20px;
column-gap: 12px;
cursor: pointer;
color: var(--second-act);
.title {
}
.submenu {
width: 20px;
height: 20px;
background: transparent url('~src/assets/images/icons/expand_less_20.svg') 50% 50% no-repeat;
transform: rotateZ(180deg);
transition: transform 0.3s;
&.active {
transform: rotateZ(0deg);
}
}
a, span {
@ -53,8 +66,17 @@
border-bottom: none;
}
}
}
.sub-row {
padding: 12px 16px 12px 32px;
border-top: var(--second-dis) solid 1px;
color: var(--second);
background-color: var(--white);
cursor: pointer;
&:hover {
background-color: #f7f7f7;
background-color: var(--light);
}
}
}

View File

@ -66,8 +66,8 @@ input, select, textarea {
}
}
&:focus{
background-color:var(--blue-3);
border-color:var(--blue-3);
background-color:var(--prime-act);
border-color:var(--prime-act);
&:before {
transform: translateX(20px);
}