Compare commits

...

10 Commits

Author SHA1 Message Date
Andrey 952fd67cba add object-type, group, and fields without group 2024-03-20 14:50:02 +03:00
Boris Voropaev 2e5fce6c23 patch fo redirection 2024-03-13 11:15:31 +03:00
Andrey 658f921ce6 fix touch reach text-box in edit document 2024-03-12 16:40:12 +03:00
Andrey a8ea5d681b new vniigaz-v2 css and documents card-person 2024-03-12 10:15:01 +03:00
Boris Voropaev ba4cffd1b0 bug fix 2024-03-11 16:07:08 +03:00
Boris Voropaev 9757ed9a59 vniigaz-v2 css fix 2024-02-20 16:38:48 +03:00
Boris Voropaev 48ff919640 fix tk023 2024-02-20 16:24:48 +03:00
Boris Voropaev 9ed2610996 bugfix 2024-02-14 15:36:39 +03:00
Boris Voropaev 867a88025b tk023 css 2024-02-14 15:10:33 +03:00
Boris Voropaev 1ff70de669 search css 2024-02-14 15:02:04 +03:00
50 changed files with 1098 additions and 295 deletions

View File

@ -104,6 +104,10 @@
"replace": "src/app/_modules/layout/footer/footer.component.ts",
"with": "src/vniigaz-v2/component/layout/footer/footer.component.ts"
},
{
"replace": "src/app/_modules/pages/page/page.component.ts",
"with": "src/vniigaz-v2/component/pages/page/page.component.ts"
},
{
"replace": "src/app/_modules/layout/jumbotron/jumbotron.component.ts",
"with": "src/vniigaz-v2/component/layout/jumbotron/jumbotron.component.ts"
@ -163,6 +167,10 @@
"replace": "src/app/_modules/layout/footer/footer.component.ts",
"with": "src/vniigaz-v2/component/layout/footer/footer.component.ts"
},
{
"replace": "src/app/_modules/pages/page/page.component.ts",
"with": "src/vniigaz-v2/component/pages/page/page.component.ts"
},
{
"replace": "src/app/_modules/layout/jumbotron/jumbotron.component.ts",
"with": "src/vniigaz-v2/component/layout/jumbotron/jumbotron.component.ts"

View File

@ -14,6 +14,10 @@ import {WidjetModule} from "@app/_modules/widjet/widjet.module";
import {AdministrateLicenceComponent} from "@app/_modules/administration/licence/administrate-licence.component";
import {AdministrateUsersComponent} from "@app/_modules/administration/users/administrate-users.component";
import {UsersModule} from "@app/_modules/users/users.module";
import { ObjectTypeComponent } from './object-type/object-type.component';
import { ObjectTypeListComponent } from '@app/_modules/administration/object-type/list/object-type-list.component';
import { ObjectTypeListItemComponent } from '@app/_modules/administration/object-type/list/item/object-type-list-item.component';
import {SortablejsModule} from "@dustfoundation/ngx-sortablejs";
type PathMatch = "full" | "prefix" | undefined;
const routes = [
@ -31,6 +35,7 @@ const routes = [
PagesModule,
WidjetModule,
UsersModule,
SortablejsModule,
],
declarations: [
AdministrationPageComponent,
@ -38,7 +43,10 @@ const routes = [
AdministrateCommitteeComponent,
AdministrateSitePagesComponent,
AdministrateLicenceComponent,
AdministrateUsersComponent
AdministrateUsersComponent,
ObjectTypeComponent,
ObjectTypeListComponent,
ObjectTypeListItemComponent
],
exports: [
RouterModule

View File

@ -0,0 +1,94 @@
<div class="item" [class.hidden]="isHidden" [class.home]="!parent" (click)="touched = true">
<div class="bar">
<div class="left">
<drop-down ico="chevron_right_24" [angle]="[0,90]" *ngIf="hasChildren" (toggle)="active=$event"></drop-down>
</div>
<div class="mid" [class.deleted]="isDeleted">
<div class="info">
<div class="logo" *ngIf="parent">
<!-- <ico ico="web_page_24" color="#FFF"></ico>-->
</div>
<div class="logo" *ngIf="!parent">
<!-- <ico ico="home_24" color="#FFF"></ico>-->
</div>
<div class="name">
<div>
<a [routerLink]="" target="_blank">{{objectType.title}}</a>
</div>
<div *ngIf="!isDeleted" title="Добавить группу" (click)="addGroup()">
<ico ico="webpage_plus_24" class="page-control"></ico>
</div>
<div *ngFor="let group of groups">
<p>Группа объектов: <a [routerLink]="" target="_blank">{{group.name}}</a></p>
<div class="right">
<div *ngIf="!isDeleted" title="Редактировать группу" (click)="editGroup()">
<ico ico="edit_24" class="page-control"></ico>
</div>
<div *ngIf="!isDeleted" title="Удалить группу" (click)="deleteGroup()">
<ico ico="visibility_off_24" class="page-control"></ico>
</div>
</div>
<table>
<tr>
<th style="border: #1F1F1F solid 2px">title</th>
<th style="border: #1F1F1F solid 2px">name</th>
<th style="border: #1F1F1F solid 2px">type</th>
<th style="border: #1F1F1F solid 2px">required</th>
<th style="border: #1F1F1F solid 2px">multiple</th>
<th style="border: #1F1F1F solid 2px">related</th>
<th>
<div *ngIf="!isDeleted" title="Добавить объект" (click)="addField()">
<ico ico="webpage_plus_24" class="page-control"></ico>
</div>
</th>
</tr>
<tr *ngFor="let field of fields">
<td style="border: #1F1F1F solid 1px">{{field.title}}</td>
<td style="border: #1F1F1F solid 1px">{{field.name}}</td>
<td style="border: #1F1F1F solid 1px">{{field.type}}</td>
<td style="border: #1F1F1F solid 1px">{{field.required}}</td>
<td style="border: #1F1F1F solid 1px">{{field.multiple}}</td>
<td style="border: #1F1F1F solid 1px">{{field.related}}</td>
<td>
<div *ngIf="!isDeleted" title="Редактировать объект" (click)="editField()">
<ico ico="edit_24" class="page-control"></ico>
</div>
</td>
<td>
<div *ngIf="!isDeleted" title="Удалить объект" (click)="deleteField()">
<ico ico="visibility_off_24" class="page-control"></ico>
</div>
</td>
</tr>
</table>
</div>
<!-- <a [routerLink]="" target="_blank" *ngIf="page.h1">{{page.h1}}</a>-->
</div>
</div>
</div>
<div class="right">
<div *ngIf="parent && !isDeleted" title="Копировать" (click)="clone()">
<ico ico="copy_24" class="page-control"></ico>
</div>
<div *ngIf="!isDeleted" title="Добавить типовой объект" (click)="add()">
<ico ico="webpage_plus_24" class="page-control"></ico>
</div>
<div *ngIf="!isDeleted" title="Редактировать типовой объект" (click)="edit()">
<ico ico="edit_24" class="page-control"></ico>
</div>
<div *ngIf="isDeleted" title="Восстановить типой объект" (click)="restore()">
<ico ico="visibility_on_24" class="page-control"></ico>
</div>
<div *ngIf="isDeleted" title="Удалить безвозвратно" (click)="delete()">
<ico ico="delete_24" class="page-control"></ico>
</div>
<div *ngIf="!isDeleted" title="Удалить типовой объект" (click)="delete()">
<ico ico="visibility_off_24" class="page-control"></ico>
</div>
</div>
</div>
<div class="items" *ngIf="active">
<object-type-list [parent]="objectType"></object-type-list>
</div>
</div>

View File

@ -0,0 +1,186 @@
import {Component, Input} from '@angular/core';
import {concat, Subscription} from "rxjs";
import {FormsService, ListsService} from "@app/_services";
import {DialogService} from "@app/_services/dialog.service";
import {ObjectTypesService} from "@app/_services/object-types.service";
import {group} from "@angular/animations";
import {concatAll} from "rxjs/operators";
@Component({
selector: 'object-type-list-item',
templateUrl: './object-type-list-item.component.html',
styleUrls: ['./object-type-list-item.component.scss']
})
export class ObjectTypeListItemComponent {
@Input() objectType: any;
@Input() FieldsGroup: any;
@Input() parent: any;
public active = false;
public touched = false;
public subscription: Subscription;
constructor(
public objectTypesService: ObjectTypesService,
private formsService: FormsService,
private listsService: ListsService,
private dialog: DialogService) {
}
ngOnInit() {
this.subscription = this.listsService.controls(this.listId).subscribe(res => {
if (this.touched) this.fetch();
});
}
ngOnDestroy() {
this.subscription?.unsubscribe();
}
get listId() {
return this.objectType.id;
}
get parentListId() {
return this.parent?.id || 'object-type-root';
}
get logo() {
return this.objectType?.logo?.data.links?.full;
}
get noLogoLetters() {
return this.objectType.name.replace(' ', '').slice(0, 2);
}
get children() {
return this.objectType.children?.data;
}
get groups() {
return this.objectType.groups?.data;
}
get fields() {
let allFields = [];
this.groups.forEach(function (groups){
groups.fields.data.forEach(function (fields){
allFields.push(fields);
})
});
return allFields;
}
get isDeleted() {
return !!this.objectType.deletedAt;
}
get isHidden() {
return this.isDeleted && !this.showDeleted;
}
get showDeleted() {
return this.objectTypesService.showDeleted;
}
get hasChildren() {
return this.showDeleted ? this.children?.length : this.children?.filter(objectType => {return !objectType.deletedAt}).length;
}
fetch() {
let include = ['children.children', 'groups'];
this.objectTypesService.show(this.objectType.id, {include: include.join(','), withTrashed: true}).subscribe(res => {
this.objectType = res.data;
});
}
clone() {
this.dialog.confirm(`Копировать страницу ${this.objectType.name}?`).subscribe(
resp=>{
if (resp) {
this.dialog.waiting('Выполняется копирование данных. Подождите, пожалуйста')
this.objectTypesService.clone(this.objectType.id, {recursive: true}).subscribe(res => {
this.dialog.waiting(null);
this.listsService.refresh(this.parentListId);
this.refresh();
});
}
}
)
}
add() {
this.formsService.createModel('objectType', {extraProps: {parent: this.objectType.id}}, this.listId);
this.active = true;
this.refresh()
}
edit() {
this.formsService.editModel('objectType', this.objectType.id, null, this.listId);
}
delete() {
this.dialog.confirm(`Удалить страницу ${this.objectType.name}?`).subscribe(
resp=>{
if (resp) this.objectTypesService.delete(this.objectType.id).subscribe(res => {
this.listsService.refresh(this.parentListId);
this.refresh();
});
}
)
}
restore() {
this.dialog.confirm(`Восстановить страницу ${this.objectType.name}?`).subscribe(
resp=>{
if (resp) this.objectTypesService.restore(this.objectType.id, {}).subscribe(res => {
this.listsService.refresh(this.parentListId);
this.refresh();
});
}
)
}
private refresh(){
this.objectTypesService.root({include:'children'}).subscribe(
res => { this.objectTypesService.rootObjectTypes = res }
)
}
toggle() {
this.active = !this.active;
}
addGroup() {
this.formsService.createModel('fieldsGroup',{extraProps: {object_type: this.objectType.id}});
this.active = true;
this.refresh()
}
editGroup() {
this.formsService.editModel('fieldsGroup', this.objectType.groups.id, null, this.listId);
}
deleteGroup() {
this.dialog.confirm(`Удалить страницу ${this.objectType.groups.name}?`).subscribe(
resp=>{
if (resp) this.objectTypesService.delete(this.objectType.groups.id).subscribe(res => {
this.listsService.refresh(this.parentListId);
this.refresh();
});
}
)
}
addField() {
this.formsService.createModel('field'/*,{extraProps: {object_type: this.objectType.id}}*/);
this.refresh()
}
editField() {
}
deleteField() {
}
}

View File

@ -0,0 +1,3 @@
<div class="items" [sortablejs]="objectTypes" [sortablejsOptions]="parent ? optionsObjectTypes : optionsLocales">
<object-type-list-item [id]="objectType.id" [objectType]="objectType" [parent]="parent" *ngFor="let objectType of objectTypes"></object-type-list-item>
</div>

View File

@ -0,0 +1,86 @@
import {Component, Input} from '@angular/core';
import {Subscription} from "rxjs";
import {SortableOptions} from "sortablejs";
import {Router} from "@angular/router";
import {ObjectTypesService} from "@app/_services/object-types.service";
import {FormsService, ListsService} from "@app/_services";
@Component({
selector: 'object-type-list',
templateUrl: './object-type-list.component.html',
styleUrls: ['./object-type-list.component.scss']
})
export class ObjectTypeListComponent {
@Input() parent: any;
public objectTypes = <any>[];
subscription: Subscription;
public optionsObjectTypes: SortableOptions = {
group: 'object-types',
handle: '.logo',
onUpdate: (event: any) => {this.move(event)},
onAdd: (event: any) => {this.move(event)}
};
public optionsLocales: SortableOptions = {
group: 'site-locales',
handle: '.logo',
onUpdate: (event: any) => {this.move(event)},
onAdd: (event: any) => {this.move(event)}
};
constructor(private router: Router, private objectTypesService: ObjectTypesService, private listsService: ListsService, private formsService: FormsService) {
}
get listId() {
return this.parent?.id || 'object-types-root';
}
ngOnInit() {
this.subscription = this.listsService.controls(this.listId).subscribe(res => {
this.fetch();
});
}
ngOnDestroy() {
this.subscription?.unsubscribe();
}
fetch() {
this.parent ? this.fetchSubObjectTypes() : this.fetchRootObjectTypes();
}
fetchRootObjectTypes() {
let include = [
'children.children',
'groups',
'groups.fields',
'children.groups.fields'
];
this.objectTypesService.root({include: include.join(','), withTrashed: true}).subscribe(res => {
this.objectTypes = res.data;
});
}
fetchSubObjectTypes() {
let include = ['children.children', 'groups', 'children.groups.fields'];
this.objectTypesService.show(this.parent.id, {include: include.join(','), withTrashed: true}).subscribe(res => {
this.objectTypes = res.data?.children?.data;
});
}
add() {
this.formsService.createModel('ObjectType', null, this.listId);
}
move(event: any) {
this.objectTypesService.move(event.item.id, {parent: this.parent?.id, ord: event.newIndex}).subscribe(res => {
this.listsService.refresh(this.parent?.id);
this.objectTypesService.root({include:'children'}).subscribe(
res => { this.objectTypesService.rootObjectTypes = res }
)
});
}
}

View File

@ -0,0 +1,19 @@
<ng-container *ngIf="licenceService.isActive">
<div class="site-admin-control">
<div class="site-admin-control-toggle" (click)="toggle()">
Показать скрытые
<switch [val]="showDeleted"></switch>
</div>
<div class="site-admin-page-block">
<div class="site-admin-company">
<!-- <ico ico="cloud_24" class="page-lable" color="#FFF"></ico>-->
<span>Типовые объекты</span>
</div>
<ico ico="home_plus_24" class="page-control" (click)="addLocale()"></ico>
</div>
</div>
<object-type-list></object-type-list>
</ng-container>
<ng-container *ngIf="!licenceService.isActive">
<p>Лицензия не активна. Перейдите в раздел <a routerLink="/administrate/licence">Данные о лицензии</a></p>
</ng-container>

View File

@ -0,0 +1,43 @@
import { Component } from '@angular/core';
import {ObjectTypesService} from "@app/_services/object-types.service";
import {FormsService} from "@app/_services";
import {LicenceService} from "@app/_services/licence.service";
import {DialogService} from "@app/_services/dialog.service";
@Component({
selector: 'object-type',
templateUrl: './object-type.component.html',
styleUrls: ['./object-type.component.scss']
})
export class ObjectTypeComponent {
constructor(private objectTypesService: ObjectTypesService, private formsService: FormsService, public licenceService: LicenceService, private dialog: DialogService) {
}
get isLicenceActive() {
return this.licenceService.isActive;
}
get isMultilang() {
return this.isLicenceActive && this.licenceService.hasOption('multilang');
}
get showDeleted() {
return this.objectTypesService.showDeleted;
}
ngOnInit() {
}
ngOnDestroy() {
this.objectTypesService.showDeleted = false;
}
addLocale() {
if (this.isMultilang) this.formsService.createModel('objectType', null, 'object-types-root');
else this.dialog.alert('Данная опция не входит в Вашу лицензию. Для включения опции обратитесь в службу поддержки НИР (+7 499 490 04 65, help@nirgroup.ru)');
}
toggle() {
this.objectTypesService.showDeleted = !this.objectTypesService.showDeleted;
}
}

View File

@ -6,7 +6,7 @@
<div class="tabs default">
<div *ngFor="let tab of tabs" >
<button type="button"[class.active]="tab.active" *ngIf="showTab(tab)" routerLink="/administrate/{{tab.name}}">{{tab.title}}</button>
</div>
</div>
</div>
<div [ngSwitch]="tab.name">
<administrate-company *ngSwitchCase="'company'" [companyId]="'main'"></administrate-company>
@ -14,6 +14,7 @@
<administrate-site-pages *ngSwitchCase="'site-pages'"></administrate-site-pages>
<administrate-licence *ngSwitchCase="'licence'"></administrate-licence>
<administrate-users *ngSwitchCase="'users'"></administrate-users>
<object-type *ngSwitchCase="'object-type'"></object-type>
<p *ngSwitchDefault>Страница не найдена</p>
</div>
</div>

View File

@ -36,9 +36,10 @@ export class AdministrationPageComponent {
//this.tabs = [{name: 'company', title: 'Структура ФАУ «ФЦС»'}, {name: 'committee', title: 'Структура ТК 465'}];
//if (this.authService.isSuperAdmin) this.tabs.push({name: 'site-pages', title: 'Структура сайта'});
this.tabs = [
{name: 'site-pages', title: 'Структура сайта', access: ["admin", "editor"]},
{name: 'users', title: 'Пользователи', access: ["admin"]},
{name: 'licence', title: 'Данные о лицензии', access: ["admin"]}];
{name: 'site-pages', title: 'Структура сайта', access: ["admin", "editor"]},
{name: 'users', title: 'Пользователи', access: ["admin"]},
{name: 'licence', title: 'Данные о лицензии', access: ["admin"]},
{name: 'object-type', title: 'Объекты сайта', access: ["admin"]}];
this.switchTab(this.route.snapshot.paramMap.get('tab'));
}

View File

@ -1,4 +1,4 @@
<ul class="breadcrumbs" *ngIf="parents.length>1">
<ul class="breadcrumbs" [ngClass]="depthClass">
<li *ngFor="let parent of parents"><a [routerLink]="parent.link">{{parent.name}}</a></li>
<li>{{page.name}}</li>
</ul>

View File

@ -15,6 +15,13 @@ export class pageBreadcrumbsComponent {
return this.page?.parents?.data;
}
get depthClass(){
let depthClass:any = {};
let name = 'bc-depth-' + this.parents.length;
depthClass[name] = true;
return depthClass
}
ngOnInit() {
}

View File

@ -1 +1 @@
<a class="btn" [href]="url" [target]="targetSelf ? '_self' : '_blank'" [innerText]="title"></a>
<a class="btn" [href]="url" [target]="targetBlank ? '_self' : '_blank'" [innerText]="title"></a>

View File

@ -21,8 +21,8 @@ export class ButtonSectionComponent {
get title() {
return this.objectsService.getValue(this.section, 'button-title');
}
get targetSelf() {
return this.objectsService.getValue(this.section, 'target-self');
get targetBlank() {
return this.objectsService.getValue(this.section, 'target-blank');
}
ngOnInit() {

View File

@ -1,4 +1,4 @@
<div [class]="style" (click)="navigate()">
<div [class]="style" (click)="navigate()" [class.cards-item-default-link]="link">
<div *ngIf="header" class="card-header">{{header}}</div>
<div *ngIf="subheader" class="card-subheader">{{subheader}}</div>
<div *ngIf="text" class="card-text">{{text}}</div>

View File

@ -3,6 +3,17 @@
</div>
<div class="title" *ngIf="name">{{name}}</div>
<div class="subtitle" *ngIf="position">{{position}}</div>
<div class="documents list default">
<div class="items">
<div class="item" *ngFor="let document of documents">
<!-- <file-ico [type]="document.extension"></file-ico>-->
<div class="value">
<a [href]="document.links?.open" target="_blank">{{document.name}}</a>
<div class="description">{{document.description}}</div>
</div>
</div>
</div>
</div>
<div class="phone" *ngIf="phone">{{phone}}</div>
<div class="email" *ngIf="email">{{email}}</div>
<div class="html" [innerHtml]="html"></div>

View File

@ -26,6 +26,9 @@ export class CardsItemPersonsComponent {
get position() {
return this.objectsService.getValue(this.card, 'person-position');
}
get documents() {
return this.objectsService.getValue(this.card, 'documents');
}
get phone() {
return this.objectsService.getValue(this.card, 'contact-phone');
}

View File

@ -11,7 +11,10 @@
</div>
<div class="results" *ngIf="searchString">
<div class="tabs default" *ngIf="total">
<button *ngFor="let tab of tabs" type="button" [class.disabled]="tab.disabled" [class.active]="tab.active" (click)="toggleTab(tab)">{{tab.title}} ({{tab.count || 0}})</button>
<div>
<button *ngFor="let tab of tabs" type="button" [class.disabled]="tab.disabled" [class.active]="tab.active" (click)="toggleTab(tab)">{{tab.title}} ({{tab.count || 0}})</button>
</div>
</div>
<div class="result">
<search-sections [class.hidden]="activeTab.name !== 'pages'"></search-sections>

View File

@ -0,0 +1,9 @@
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class FieldsGroupService {
constructor() { }
}

View File

@ -0,0 +1,108 @@
import {Injectable} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {environment} from '@environments/environment';
import {Observable, BehaviorSubject} from "rxjs";
import {LicenceService} from "@app/_services/licence.service";
import { DialogService } from '@app/_services/dialog.service';
@Injectable({providedIn: 'root'})
export class ObjectTypesService {
public currentObjectTypesSubject = new BehaviorSubject<any>(null);
public rootObjectTypesSubject = new BehaviorSubject<any>(null);
public metaSubject = new BehaviorSubject<any>({title: '', description: '', keywords: ''});
public editModeSubject = new BehaviorSubject<boolean>(false);
public showDeletedSubject = new BehaviorSubject<boolean>(false);
public menuSelectedLink: string;
public rootPage:any;
constructor(private http: HttpClient, private licenceService: LicenceService, private dialog: DialogService) {
//this.find('/').subscribe(res => {this.rootPages = res.data});
}
get currentObjectType() {
return this.currentObjectTypesSubject.value;
}
set currentObjectType(val: any) {
this.currentObjectTypesSubject.next(val);
this.setMetaFromPage(val);
}
// get rootObjectTypes() {
// return this.rootObjectTypesSubject.value;
// }
set rootObjectTypes(val: any) {
this.rootObjectTypesSubject.next(val);
}
// get isRtl() {
// return ['ar'].indexOf(this.rootPage?.slug) !== -1;
// }
get editMode() {
return this.editModeSubject.value;
}
set editMode(value: boolean) {
if (value) {
let error = this.licenceService.checkEditAvailability(this.currentObjectType);
if (error) {
this.dialog.alert(error);
return;
}
}
this.editModeSubject.next(value);
}
get showDeleted() {
return this.showDeletedSubject.value;
}
set showDeleted(value: boolean) {
this.showDeletedSubject.next(value);
}
root(params?: any): Observable<any> {
return this.http.get(`${environment.apiUrl}/api/object-types`, {params: params});
}
find(url: string, params?: any): Observable<any> {
if (!params) params = {};
params.url = url;
return this.http.get(`${environment.apiUrl}/api/object-types/find`, {params: params});
}
list(params?: any): Observable<any> {
return this.http.get(`${environment.apiUrl}/api/object-types`, {params: params});
}
show(id: string, params?: any): Observable<any> {
return this.http.get<any>(`${environment.apiUrl}/api/object-types/${id}`, {params: params});
}
delete(id: string): Observable<any> {
return this.http.delete(`${environment.apiUrl}/api/object-types/${id}`);
}
restore(id: string, data: any): Observable<any> {
return this.http.patch(`${environment.apiUrl}/api/pages/restore/${id}`, data);
}
deleteBackground(id: string): Observable<any> {
return this.http.delete(`${environment.apiUrl}/api/pages/background/${id}`);
}
move(id: string, data: any): Observable<any> {
return this.http.put(`${environment.apiUrl}/api/pages/move/${id}`, data);
}
clone(id: string, data: any): Observable<any> {
return this.http.put(`${environment.apiUrl}/api/pages/clone/${id}`, data);
}
setMetaFromPage(page: any) {
this.setMeta({title: page?.title || page?.name, description: page?.description || '', keywords: page?.keywords || ''});
}
setMeta(meta: any) {
this.metaSubject.next(meta);
}
}

View File

@ -87,7 +87,7 @@ right-content{
width: 100%;
max-width: $page-width;
}
}
}
@ -99,7 +99,7 @@ footer{
width: 100%;
padding: 40px 0;
margin-top: 48px;
color: white;
display: flex;
flex-direction: column;
@ -134,14 +134,14 @@ footer{
display: block;
}
}
.line{
width: 100%;
height: 1px;
background-color: var(--prime);
margin-bottom: 40px;
}
.copyright{
display: flex;
justify-content: space-between;
@ -194,4 +194,4 @@ pages-menu-item{
.pages{
width: 100%;
}
}

View File

@ -25,7 +25,7 @@ header{
&:not(.lvl-0){
display: none;
}
.item{
drop-down{
display: none;
@ -62,7 +62,7 @@ header{
a.logo{
img{
width:114px;
width:114px;
height: 80px;
}
}
@ -156,7 +156,7 @@ right-content{
display: none;
&.parent,&.current{
display: block;
>pages-menu{
>pages-menu{
background-color: var(--white);
padding: 20px;
border-radius: 8px;
@ -206,17 +206,10 @@ right-content{
&.current,&.parent {
background-color: #ededed;
border-radius: 8px;
a {
a {
color: var(--second-act);
}
}
}
}

View File

@ -5,8 +5,8 @@
export const environment = {
production: false,
apiUrl: 'http://api.nircms.lc',
clientId: 4,
clientSecret: 'KmGnhqVbEi3wlzkEyXi1JeNg9FtswdOdKQHpOcAu',
clientId: 2,
clientSecret: 'iyTS47vCZHgMxokKToa1HhOgfvFrwlOu7WkmJ3cQ',
project: null,
licence: 'POUFLO4YW7SU',
defaultLocale: 'ru'

View File

@ -5,8 +5,8 @@
export const environment = {
production: false,
apiUrl: 'http://api.nircms.lc',
clientId: 4,
clientSecret: 'KmGnhqVbEi3wlzkEyXi1JeNg9FtswdOdKQHpOcAu',
clientId: 2,
clientSecret: 'iyTS47vCZHgMxokKToa1HhOgfvFrwlOu7WkmJ3cQ',
project: 'vniigaz-v2',
licence: 'POUFLO4YW7SU',
defaultLocale: 'ru'

View File

@ -1,12 +1,12 @@
<div class="footer layout-corral">
<a>
<a href="https://vniigaz-cert.ru/" target="_blank">
© 2023, Газпром ВНИИГАЗ
</a>
<div>
142717, Московская область, г.о. Ленинский, п. Развилка, ул. Газовиков, зд. 15, стр. 1
142717,&nbsp;Московская&nbsp;область, г.о.&nbsp;Ленинский,&nbsp;п.&nbsp;Развилка, ул.&nbsp;Газовиков,&nbsp;зд.&nbsp;15,&nbsp;стр.&nbsp;1
</div>
<div></div>
<a>
<a href="https://nirgroup.ru/" class="footer-nir" target="_blank">
Работает на платформе НИР
</a>
</div>

View File

@ -1,49 +1,44 @@
<div class="layout-corral " *ngIf="pictURL">
<div class="jumbotron-img">
<div class="layout-corral">
<div class="jumbotron-img" *ngIf="pictURL">
<img [src]="pictURL" alt="">
</div>
<div class="jumbotron-board">
<div class=" jumbotron-registeries">
<a href="uvedomlenie-o-razrabotke"><h2>Разработка стандартов</h2></a>
<div *ngFor="let reg of regestries; index as i;">
<div *ngIf="i<3">
<div *ngFor="let entry of entries">
<div class="">
<span *ngIf="reg.notificationDate" class="notification-date">{{reg.notificationDate | date : 'dd.MM.yyyy'}}&emsp;</span>
<span *ngIf="reg.yearInclusion" class="year-inclusion">{{reg.yearInclusion}}&emsp;</span>
<span>{{reg.type}}&emsp;</span>
<span class="subcommittee">{{reg.subcommittee}}</span>
<span *ngIf="entry.notificationDate" class="notification-date">{{entry.notificationDate | date : 'dd.MM.yyyy'}}&emsp;</span>
<span *ngIf="entry.yearInclusion" class="year-inclusion">{{entry.yearInclusion}}&emsp;</span>
<span>{{entry.type}}&emsp;</span>
<span class="subcommittee">{{entry.subcommittee}}</span>
</div>
<div class="name">
<a [routerLink]="reg.page">{{reg.name}}</a>
<a [routerLink]="entry.page">{{entry.name}}</a>
</div>
<div *ngIf="reg.startDiscussion" class="discussion">
<span class="start-discussion">{{reg.startDiscussion | date : 'dd.MM.yyyy'}}</span> -
<span class="end-discussion">{{reg.endDiscussion | date : 'dd.MM.yyyy'}}</span>
<div *ngIf="entry.startDiscussion" class="discussion">
<span class="start-discussion">{{entry.startDiscussion | date : 'dd.MM.yyyy'}}</span> -
<span class="end-discussion">{{entry.endDiscussion | date : 'dd.MM.yyyy'}}</span>
</div>
<div *ngIf="reg.documentType">
<span class="document-type">{{reg.documentType}}&emsp;</span>
<span class="designation">{{reg.designation}}&emsp;</span>
<span class="order">{{reg.order}}</span>
<div *ngIf="entry.documentType">
<span class="document-type">{{entry.documentType}}&emsp;</span>
<span class="designation">{{entry.designation}}&emsp;</span>
<span class="order">{{entry.order}}</span>
</div>
<br>
</div>
</div>
</div>
<div class=" jumbotron-news">
<a href="novosti"><h2>Новости</h2></a>
<div *ngFor="let pub of news; index as i;">
<div *ngIf="i<3">
<span>{{pub.date}}&emsp;</span>
<a [routerLink]="pub.link ">{{pub.name}}&emsp;</a>
</div> <br>
<div *ngFor="let pub of news">
<span class="pub-date">{{pub.date}}&emsp;</span>
<a [routerLink]="pub.link ">{{pub.name}}&emsp;</a><br>
</div>
</div>

View File

@ -1,8 +1,10 @@
import { Component } from '@angular/core';
import { PagesService } from '@app/_services/pages.service';
import { RegistryEntriesService } from '@app/_services/registry-entries.service';
import {PublicationsService} from "@app/_services/publications.service";
import { RegistriesService } from '@app/_services/registries.service';
import { HttpClient } from '@angular/common/http';
import { environment } from '@environments/environment';
@Component({
selector: 'jumbotron',
@ -11,14 +13,14 @@ import { RegistriesService } from '@app/_services/registries.service';
})
export class JumbotronComponent {
regestries: any[] =[]
entries: any[]
rootEntries: any
news: any[] =[]
constructor(
private pagesService: PagesService,
private entriesService: RegistryEntriesService,
private publicationsService: PublicationsService,
private registriesService: RegistriesService
private http: HttpClient,
){}
get currentPage(){
@ -33,93 +35,55 @@ export class JumbotronComponent {
return !this.pagesService.currentPage?.parents.data.length && this.pagesService.currentPage
}
newlist(type: string, params?: {}) {
return this.http.get(`${environment.apiUrl}/api/registries/list/${type}`, {params: params});
}
ngOnInit(){
let include = ['page'];
this.registriesService.list({
// filters:JSON.stringify({"id": "602770ef-7f5b-421e-a4f4-14e16ca1ee90"}),
include: include.join(',')
}).subscribe(
resp => {
console.log('DATA',resp.data)
let regID:any = [];
regID = regID.concat(
resp.data.filter( reg=> reg.type.name == "notice")
.map(reg=>({id: reg.id, type:reg.type.title, page:reg.page.data.link}))
)
regID = regID.concat(
resp.data.filter( reg=> reg.type.name == "approval")
.map(reg=>({id: reg.id, type:reg.type.title, page:reg.page.data.link}))
)
console.log(regID)
regID.forEach(reg=>{
this.entriesService.list({
page:1,
filters:JSON.stringify({
"registry": reg.id
})
}).subscribe(resp=>{
let include = ['properties.groups.fields.value'];
resp.data.forEach(entry => {
this.entriesService.show(entry.id,{include: include.join(',')}).subscribe(resp=>{
console.log('ENYTY',resp.data)
console.log('REG',reg)
let properties = resp.data.properties.data.groups.data[0].fields.data;
this.regestries.push({
type:reg.type,
page: reg.page,
createdAt:resp.data.createdAt,
notificationDate: properties.find(prop=>prop.name=='notification-date')?.value.data[0],
subcommittee: properties.find(prop=>prop.name=='subcommittee')?.value.data[0],
name: resp.data.name,
link: resp.data.link,
startDiscussion: properties.find(prop=>prop.name=='start-discussion')?.value.data[0],
endDiscussion: properties.find(prop=>prop.name=='end-discussion')?.value.data[0],
yearInclusion: properties.find(prop=>prop.name=='year-inclusion')?.value.data[0],
documentType: properties.find(prop=>prop.name=='document-type')?.value.data[0],
designation: properties.find(prop=>prop.name=='designation')?.value.data[0],
order: properties.find(prop=>prop.name=='order')?.value.data[0],
})
this.regestries.sort((a,b)=> a.createdAt<b.createdAt?1:-1)
})
});
})
})
// this.entriesService.list({
// page:1,
// filters:JSON.stringify({
// "registry": regID[0]
// })
// }).subscribe(resp=>{
// let include = ['properties.groups.fields.value'];
// resp.data.slice(0,3).forEach(entry => {
// this.entriesService.show(entry.id,{include: include.join(',')}).subscribe(resp=>{
// let properties = resp.data.properties.data.groups.data[0].fields.data;
// this.regestries.push({
// notificationDate: properties.find(prop=>prop.name=='notification-date').value.data[0],
// subcommittee: properties.find(prop=>prop.name=='subcommittee').value.data[0],
// name: resp.data.name,
// link: resp.data.link,
// startDiscussion: properties.find(prop=>prop.name=='subcommittee').value.data[0],
// endDiscussion: properties.find(prop=>prop.name=='subcommittee').value.data[0],
// })
// })
// });
// })
let include = ['registry.page', 'properties.groups.fields.value'];
this.newlist('notice',{include: include.join(',')}).subscribe(
(resp:any)=>{
this.rootEntries = resp.data;
this.newlist('approval',{include: include.join(',')}).subscribe(
(resp:any)=>{
this.rootEntries = this.rootEntries
.concat(resp.data)
.sort((a,b)=> a.createdAt<b.createdAt?1:-1)
.slice(0,5)
this.entries = this.rootEntries.map(entry=>{
let properties = entry.properties.data.groups.data[0].fields.data;
let findProp = (propName)=>properties.find(prop=>prop.name==propName)?.value.data[0]
return{
type: entry.registry.data.type.title,
page: entry.registry.data.page.data.link,
name: entry.name,
notificationDate: findProp('notification-date'),
subcommittee: findProp('subcommittee'),
startDiscussion: findProp('start-discussion'),
endDiscussion: findProp('end-discussion'),
yearInclusion: findProp('year-inclusion'),
documentType: findProp('document-type'),
designation: findProp('designation'),
order: findProp('order'),
}
})
}
)
}
);
// this.registriesService.list().subscribe(resp=>{
// console.log('EEEEntry', resp.data)
// let regID = resp.data.find( reg=> reg.type.name == "notice").id
// console.log('EEEEntry', regID)
// })
this.publicationsService.list({subType: 'publication-news'}).subscribe(resp=>{
// console.log('novosti', resp)
this.news = resp.data.slice(0,3).map( pub =>
this.news = resp.data.slice(0,5).map( pub =>
({
name: pub.name,
date: pub.publishDateRus,

View File

@ -1,9 +1,6 @@
.administration-page{
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
font-weight: 500;
h2{
color: var(--second-act);
margin-bottom: 48px;

View File

@ -149,20 +149,22 @@ button.mat-calendar-body-cell{
}
.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){
background-color: rgba(0, 162, 255,0.3);
background-color: rgba(0, 162, 255,0.3) ;
font-weight: 400;
}
.mat-calendar-body-cell-content{
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
width: 32px !important;
height: 32px !important;
button.mat-mdc-button:hover, button.mat-mdc-icon-button:hover{
background-color: rgba(0, 162, 255,0.3) ;
border: none;
}
.mat-calendar-body-cell-content{
font-weight: 500;
line-height: 24px;
}
.tox-promotion, .tox-statusbar__branding {
display: none!important;
}
@ -446,11 +448,6 @@ modal{
}
.toggle {
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
display: flex;
flex-direction: row;
align-items: center;
@ -464,6 +461,7 @@ modal{
overflow: hidden;
text-overflow: ellipsis;
width: 100%;
color: var(--dark);
background-color: #ffffff;
p {
padding: 0;

View File

@ -9,6 +9,7 @@
display: inline-block;
width: 24px;
height: 24px;
flex-shrink: 0;
img{
object-fit: contain;
width: 100%;

View File

@ -262,6 +262,7 @@ form-field-document{
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.6);
z-index:10;
}
.form {
@ -270,6 +271,7 @@ form-field-document{
z-index: 100;
border-radius: 12px;
padding: $p;
margin-top: -100px;
}
}
@ -358,6 +360,9 @@ form-field-image{
}
.trash {
margin-left: 4px;
width: 24px;
height: 24px;
background-image: url("~src/assets/images/icons/delete_24dp.svg");
}
}
}
@ -372,11 +377,6 @@ form-field-image{
.caption {
color: var(--second);
font-family: PT Sans;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 32px;
}
.value {
.error {
@ -555,12 +555,13 @@ auth-page, auth-modal{
.search-form{
margin-bottom: 32px;
}
.results{
.tabs{
button{
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
}
.results{
.tabs{
button{
}
}
}

View File

@ -74,6 +74,9 @@ jumbotron{
>div{
flex-grow: 1;
flex-basis: 50%;
.notification-date, .year-inclusion, .pub-date{
color: var(--second);
}
}
}
}
@ -82,12 +85,13 @@ jumbotron{
footer{
display: flex;
justify-content: center;
border-top: 1px solid var(--light);
.footer{
display: flex;
justify-content: space-between;
flex-wrap: wrap;
padding: 16px 48px 32px;
border-top: 1px solid var(--light);
a, div{
flex-basis: 50%;
&:nth-child(2n){
@ -97,6 +101,9 @@ footer{
a:not(:hover), div{
color: var(--second);
}
.footer-nir{
margin-top: 16px;
}
}
}

View File

@ -9,6 +9,7 @@ pages-menu{
header{
border-bottom: 1px solid var(--light);
.header.layout-corral{
flex-direction: column;
@ -70,7 +71,7 @@ header{
background-color: #FFF;
position: relative;
gap: -1px;
border-bottom: 1px solid var(--light);
pages-menu{
display: none;
}

View File

@ -9,6 +9,14 @@ page-breadcrumbs{
gap:2px;
padding: 0;
list-style-type: none;
&.bc-depth-0{
display: none;
}
&.bc-depth-1{
li:first-child{
display: none;
}
}
li{
&:first-child{
display: inline-flex;
@ -174,6 +182,14 @@ cards-section{
border-top: 1px solid var(--second-dis);
border-bottom: 1px solid var(--second-dis);
margin-bottom: 40px;
&::before{
content: "Группа карточек";
margin-right: auto;
}
>span{
display: none;
}
ico{
cursor: pointer;
svg{
@ -333,6 +349,13 @@ cards-section-items{
.card-text{
}
}
.cards-item-default-link{
cursor: pointer;
.card-subheader{
color: var(--prime);
}
}
}

View File

@ -9,22 +9,16 @@
margin-bottom: 24px;
}
>div{
margin-right: -1px;
button {
padding: 8px 20px;
background: #ffffff;
border-radius: 4px 4px 0 0;
border: var(--prime) solid 1px;
color: var(--prime);
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px; /* 150% */
cursor: pointer;
&:last-child {
margin-right: 0;
}
margin-right: -1px;
span {
white-space: nowrap;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -4,7 +4,7 @@
<base href="/" />
<title>TK 023</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no" />
<link rel="icon" type="image/x-icon" href="/assets/images/favicon.png" />
<link rel="icon" type="image/x-icon" href="/assets/images/favicon.ico" />
</head>
<body>
<app></app>

View File

@ -10,14 +10,13 @@
<a href="https://vniigaz.gazprom.ru/" target="_blank">Учреждено в 1998</a>
</h4>
</div>
</div>
</div>
<div class="space jumbotron-edit-field" *ngIf="editable" dir="ltr">
<div class="layout-corral jumbotron-edit-field-row">
<div class="switch-host" (click)="toggleEditMode()">
Режим редактирования
<switch [val]="editMode"></switch>
</div>
<switch [val]="editMode"></switch>
</div>
</div>
</div>

View File

@ -0,0 +1,17 @@
<div *ngIf="page">
<!-- <div class="limiter">
<page-breadcrumbs [page]="page"></page-breadcrumbs>
</div> -->
<div class="pages" [ngSwitch]="page?.type?.name || page?.type">
<content-page *ngSwitchCase="'content'" [page]="page" [editMode]="editMode"></content-page>
<publications-page *ngSwitchCase="'publications'" [page]="page" [editMode]="editMode"></publications-page>
<registry-page *ngSwitchCase="'registry'" [page]="page" [editMode]="editMode"></registry-page>
<publication-page *ngSwitchCase="'publication'" [page]="page" [editMode]="editMode"></publication-page>
<tk-structure-page *ngSwitchCase="'tk-structure'" [page]="page" [editMode]="editMode"></tk-structure-page>
<p *ngSwitchDefault>Page type {{page?.type?.name}} is undefined</p>
</div>
</div>
<div *ngIf="!loading && !page">
<page-not-found></page-not-found>
</div>
<!--div class="loader" *ngIf="loading"></div-->

View File

@ -0,0 +1,9 @@
@media screen and (min-width: 1330px){
}
@media screen and (max-width: 480px) {
}

View File

@ -0,0 +1,91 @@
import {Component} from '@angular/core';
import {NavigationEnd, Router} from "@angular/router";
import {Subscription} from "rxjs";
import {PagesService} from "@app/_services/pages.service";
import {ListsService} from "@app/_services";
import {Title} from "@angular/platform-browser";
@Component({
templateUrl: 'page.component.html',
styleUrls: ['page.component.scss']
})
export class PageComponent {
public page: any;
public loading = false;
private url: string;
private inited = false;
routeSubscription?: Subscription;
listSubscription: Subscription;
constructor(
private router: Router,
private pagesService: PagesService,
private listsService: ListsService,
private titleService:Title){
this.routeSubscription = this.router.events.subscribe(event => {
if (event instanceof NavigationEnd) this.onNavigationEnd(event);
});
}
get editMode() {
return this.pagesService.editMode;
}
get permissions() {
return this.page?.permissions;
}
get isEditable() {
return this.permissions?.edit || this.permissions?.anything;
}
ngOnInit() {
this.listSubscription = this.listsService.controls().subscribe(res => {
this.inited ? this.fetch() : this.inited = true;
});
}
ngOnDestroy() {
this.routeSubscription?.unsubscribe();
this.listSubscription?.unsubscribe()
}
onNavigationEnd(event: NavigationEnd) {
let url = event.url.split('(')[0].split('?')[0];
if (url !== this.url) {
this.url = url;
this.fetch();
this.pagesService.editMode = false;
}
}
fetch() {
this.loading = true;
let include = [
'parents.children',
'parents.picture',
'children',
'sections.type',
'sections.groups.fields.value',
'sections.objects.groups.fields.value',
'sidebars.groups.fields.value',
'sidebars.type',
'permissions',
'picture',
'posters'
];
if (this.url == '/certification/voluntary/main') this.url = '/sertifikaciya/obyazatelnaya-sertifikaciya'
this.pagesService.find(this.url, {include: include.join(',')}).subscribe(res => {
this.page = res?.data;
if (this.page) {
this.pagesService.currentPage = this.page;
// this.titleService.setTitle(this.page.title||this.page.h1||this.page.name)
}
this.loading = false;
}, error => {
this.loading = false;
});
}
}

View File

@ -37,7 +37,7 @@
}
.site-admin-company{
font-weight: 700;
}
}
}
ico.page-lable{
background-color: var(--prime);
@ -68,9 +68,9 @@ administrate-site-pages{
}
}
}
ico.page-control{
cursor: pointer;
cursor: pointer;
svg{
color:var(--second);
&:hover{
@ -79,7 +79,7 @@ ico.page-control{
}
}
pages-tree{
.item:not(.home){
.bar{
padding-left: 50px;
@ -175,15 +175,130 @@ pages-tree{
}
}
}
}
object-type-list{
.item:not(.home){
.bar{
padding-left: 50px;
}
.item .bar{
padding-left: 100px;
}
.item .item .bar{
padding-left: 150px;
}
.item .item .item .bar{
padding-left: 200px;
}
.item .item .item .item .bar{
padding-left: 250px;
}
.item .item .item .item .item .bar{
padding-left: 300px;
}
}
.item {
flex-direction: column;
align-items: stretch;
.bar {
display: flex;
flex-direction: row;
align-items: flex-start;
padding: 16px 0;
border-bottom: #E0E0E0 solid 1px;
.left {
flex-shrink: 0;
width: 40px;
height: 24px;
cursor: pointer;
}
.mid {
flex-grow: 1;
padding: 0 16px;
.info {
display: flex;
flex-direction: row;
align-items: center;
.logo {
display: flex;
align-items: center;
justify-content: center;
position: relative;
flex-shrink: 0;
width: 40px;
height: 40px;
margin-right: 16px;
border-radius: 100px;
background-color: var(--prime);
color: #ffffff;
cursor: move;
&:hover{
background-color: var(--prime-act);
}
span{
display: none;
}
}
.name {
p {
margin: 0;
a {
color: var(--grey-7);
}
&.sub {
font-size: 0.875rem;
color: #7f7f7f;
}
}
}
}
}
.right {
display: flex;
flex-direction: row;
align-items: flex-start;
flex-shrink: 1;
gap: 8px;
}
}
}
@media screen and (max-width: 1330px) {
.item {
.bar {
.mid {
padding: 0 12px;
.info .logo {
display: none;
}
}
.right {
display: none;
}
}
.items {
padding-left: 16px;
}
&.company {
.items {
padding-left: 40px;
}
}
}
}
}
administrate-licence{
font-family: PT Sans;
@ -193,7 +308,7 @@ administrate-licence{
line-height: 24px;
color: var(--dark);
.default{
.caption{
color: var(--second);
}
@ -242,7 +357,7 @@ users-list{
flex-shrink: 0;
}
}
users-list-item {
display: flex;
align-items: center;
@ -316,4 +431,4 @@ users-list{
}
}
}
}

View File

@ -157,14 +157,18 @@ button.mat-calendar-body-cell{
font-weight: 400;
}
button.mat-mdc-button:hover, button.mat-mdc-icon-button:hover{
background-color: rgba(0, 162, 255,0.3) ;
border: none;
}
.mat-calendar-body-cell-content{
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
width: 75% !important;
font-size: 15px;
font-weight: 500;
line-height: 24px;
width: 32px !important;
height: 32px !important;
}
.tox-promotion, .tox-statusbar__branding {

View File

@ -15,7 +15,7 @@ input, select, textarea {
&:focus, &:focus-visible {
border-color: var(--prime);
outline: none;
}
&:disabled{
border-color: #EDEDED;
@ -202,7 +202,7 @@ form-field-document{
}
}
}
.values {
display: flex;
flex-direction: column;
@ -242,7 +242,7 @@ form-field-document{
ico{
cursor: pointer;
display: flex;
svg{
svg{
color: var(--white);
}
}
@ -264,8 +264,9 @@ form-field-document{
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.6);
z-index: 10;
}
.form {
position: relative;
background-color: #ffffff;
@ -273,7 +274,7 @@ form-field-document{
border-radius: 12px;
padding: $p;
}
}
}
@ -332,7 +333,7 @@ form-field-image{
}
}
}
.values {
display: flex;
column-gap: 24px;
@ -362,7 +363,7 @@ form-field-image{
margin-left: 4px;
}
}
}
}
}
.field {
@ -378,7 +379,7 @@ form-field-image{
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 32px;
line-height: 32px;
}
.value {
.error {
@ -422,21 +423,21 @@ auth-page{
text-align: center;
color: #0071BB;
}
.form {
display: flex;
flex-grow: 1;
padding: 24px;
}
.center {
width: 100%;
max-width: 416px;
margin: auto;
}
}
@media screen and (max-width: 959px) {
.authentication {
flex-direction: column;
@ -454,7 +455,7 @@ auth-page{
}
}
}
}
auth-page, auth-modal{
@ -465,16 +466,16 @@ auth-page, auth-modal{
font-size: 24px;
font-weight: normal;
}
.field {
margin: 0 0 16px;
label {
font-size: 14px;
color: #666666;
line-height: 20px;
}
.checkbox {
display: flex;
flex-direction: row;
@ -497,14 +498,14 @@ auth-page, auth-modal{
}
}
}
.error {
margin: 0 0 16px;
font-size: 14px;
color: #D91519;
text-align: center;
}
.bar {
display: flex;
flex-direction: row;
@ -530,7 +531,7 @@ auth-page, auth-modal{
justify-content: space-between;
}
}
.bottom {
display: flex;
flex-direction: row;
@ -539,8 +540,8 @@ auth-page, auth-modal{
gap: 24px;
margin: 24px 0 0;
}
@media screen and (max-width: 600px) {
.bottom {
flex-direction: column-reverse;
@ -549,5 +550,5 @@ auth-page, auth-modal{
}
}
}
}
}

View File

@ -7,7 +7,7 @@
justify-content: center;
>.layout-corral{
flex-basis: calc($layout-width + 2 * $pxl);
padding: 0 $pxl;
padding: 0 20px;
display: flex;
};
.page-corral{
@ -121,7 +121,7 @@ jumbotron{
left-content{
display: none;
}
right-content{
flex-shrink: 0;
pages-menu.current{
@ -134,7 +134,7 @@ jumbotron{
max-width: 100%;
width: $page-width;
}
}
}
@ -152,7 +152,7 @@ jumbotron{
@media screen and (min-width: 1330px){
.this-root-page{
.content-sapce{
.content-sapce{
.content-grid{
.main-content{
margin-left: 150px;
@ -170,7 +170,7 @@ footer{
width: 100%;
padding: 40px 0;
margin-top: 48px;
font-size: 16px;
font-size: 16px;
color: white;
display: flex;
flex-direction: column;
@ -213,13 +213,13 @@ footer{
display: block;
}
}
.line{
width: 100%;
height: 1px;
background-color: var(--prime);
}
.copyright{
display: flex;
justify-content: space-between;
@ -296,4 +296,4 @@ pages-menu-item{
gap: 24px;
}
}
}

View File

@ -4,7 +4,7 @@ pages-menu{
padding-left: 0;
}
pages-menu{
padding-inline-start: 24px;
padding-inline-start: 6px;
}
@ -21,11 +21,11 @@ header{
pages-menu{
flex-direction: row;
gap:24px;
gap:12px;
&:not(.lvl-0){
display: none;
}
.item{
drop-down{
display: none;
@ -99,7 +99,7 @@ header{
a.logo{
img{
width:114px;
width:114px;
height: 80px;
}
}
@ -372,7 +372,7 @@ right-content{
}
}
}
}

View File

@ -85,7 +85,7 @@ add-section, publications-list{
border-top: 1px solid var(--second-dis);
border-bottom: 1px solid var(--second-dis);
}
&.active{
a{
color: var(--prime-act);
@ -97,7 +97,7 @@ add-section, publications-list{
top:22px;
}
}
}
.menu {
@ -157,9 +157,9 @@ cards-section-items{
align-items: stretch;
gap: 24px;
flex-wrap: wrap;
cards-section-item {
width: 252px;
cards-item-persons{
display: flex;
@ -178,6 +178,9 @@ cards-section-items{
height: 100%;
}
}
.item{
overflow: hidden;
}
.title{
font-family: PT Sans Narrow;
font-size: 24px;
@ -206,7 +209,7 @@ cards-section-items{
.entry-contents{
text-align: justify;
text-indent: 30px;
}
}
}
@ -242,7 +245,7 @@ cards-section-items{
// cards
// cards
@ -279,7 +282,7 @@ cards-section-items{
}
.card-subheader, .card-text{
display: none;
}
}
}
.default{
display: flex;
@ -327,10 +330,10 @@ cards-section-items{
border-color: var(--bk44);
}
.card-subheader{
color: var(--bk88);
color: var(--bk88);
}
.card-header{
color: var(--bk66);
color: var(--bk66);
}
&::after{
background-image: url(/assets/images/ico/arrow_forward_24_hover.svg);
@ -432,7 +435,7 @@ cards-section-items{
// cards
// cards
@ -455,56 +458,56 @@ images-section{
top:24px;
right: 24px;
}
.items {
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
gap: 8px;
img{
img{
border-radius: 12px;
}
&.tiles{
.item{
margin-bottom: 16px;
img{
border: 1px solid var(--second-dis);
max-height: 273px;
max-width: 273px;
max-width: 273px;
}
}
}
}
&.full-width{
display: flex;
flex-direction: column;
.item{
max-width: 100%;
margin-bottom: 32px;
img{
max-width: 100%;
}
}
}
}
.item {
position: relative;
img {
cursor: pointer;
}
&:last-child {
margin-bottom: 0;
}
&.full-width {
display: flex;
flex-direction: column;
@ -515,7 +518,7 @@ images-section{
}
}
}
.swiper-box{
width: 100% !important;
@ -523,7 +526,7 @@ images-section{
max-height: 400px;
}
.fullscreen {
top: 0;
left: 0;
@ -535,12 +538,12 @@ images-section{
width: 100vw;
height: 100vh;
background-color: grey;
}
@media screen and (max-width: 700px){
.carousel {
.prev, .next {
cursor: pointer;
z-index: 1;
@ -558,9 +561,9 @@ images-section{
.slide {
width: calc( 100vw - 80px );
height: calc( (100vw - 80px) * 0.75 );
img {
}
}
}
@ -574,14 +577,14 @@ images-section{
display: flex !important;
}
.fullscreen {
.content {
position: fixed;
display: flex;
pointer-events: none;
width:100vw;
height:100vh;
left: 0;
@ -605,11 +608,11 @@ publications-list{
align-items: flex-end;
gap: 8px;
}
.items {
margin: 24px 0;
}
}
publications-list-item {
display: block;
padding: 24px 0;
@ -625,13 +628,13 @@ publications-list{
font-size: 32px;
line-height: 38px;
}
.date{
color: var(--second);
margin-bottom: 16px;
}
.excerpt{
margin-top: $p;
font-family: PT Sans;
@ -646,20 +649,20 @@ publications-list{
.name{
margin-bottom: 24px;
}
.publication-read-more{
margin-top: 24px;
}
.content{
margin-top: $p;
display: flex;
flex-direction: column;
gap: $p;
};
}
}
publication-page {
@ -668,7 +671,7 @@ publication-page {
color: var(--second);
margin-bottom: 16px;
}
.name{
margin-bottom: 24px;
@ -682,7 +685,7 @@ publication-page {
text-align: justify;
text-indent: 30px;
};
.publication-page-back {
display: inline-flex;
align-items: center;
@ -693,7 +696,7 @@ publication-page {
}
gellery{
.poster{
.poster{
height: 468px;
max-width: calc( 100vw - 80px);
max-height: calc( (100vw - 80px ) * 0.7 );
@ -761,7 +764,7 @@ video-section{
.poster{
object-fit: cover;
width: 100%;
height: 100%;
height: 100%;
}
.icon{
position: absolute;
@ -777,7 +780,7 @@ video-section{
background-color: black;
}
}
}
@ -859,4 +862,4 @@ video-section{
display: none;
}
}
}
}