Browse Source

Compensate scrollbars.

pull/852/head
Sebastian 4 years ago
parent
commit
be07cd90d2
  1. 61
      frontend/src/app/framework/angular/compensate-scrollbar.directive.ts
  2. 2
      frontend/src/app/framework/angular/list-view.component.html
  3. 1
      frontend/src/app/framework/declarations.ts
  4. 4
      frontend/src/app/framework/module.ts

61
frontend/src/app/framework/angular/compensate-scrollbar.directive.ts

@ -0,0 +1,61 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Directive, ElementRef, HostListener, Input, Renderer2 } from '@angular/core';
import { ResizeListener, ResizeService, ResourceOwner } from '@app/framework/internal';
@Directive({
selector: '[sqxCompensateScrollbar]',
})
export class CompensateScrollbarDirective extends ResourceOwner implements ResizeListener {
private previousScrollbarWidth = -1;
@Input('sqxCompensateScrollbar')
public enabled?: string | boolean | null = true;
constructor(
private readonly renderer: Renderer2,
private readonly element: ElementRef<HTMLElement>,
private readonly resizeService: ResizeService,
) {
super();
this.own(this.resizeService.listen(this.element.nativeElement, this));
}
public ngAfterViewInit() {
this.resize();
}
public onResize() {
this.resize();
}
@HostListener('scroll')
public onScroll() {
this.resize();
}
private resize() {
if (this.enabled === false) {
return;
}
const element = this.element.nativeElement;
const scrollWidth = element.clientWidth;
const scollbarWidth = element.offsetWidth - scrollWidth;
if (this.previousScrollbarWidth == scollbarWidth) {
return;
}
this.renderer.setStyle(element, 'padding-left', `${scollbarWidth}px`);
this.previousScrollbarWidth = scollbarWidth;
}
}

2
frontend/src/app/framework/angular/list-view.component.html

@ -9,7 +9,7 @@
</div> </div>
</div> </div>
<div class="list-content normal" [class.loading-indicator]="isLoading" #contentElement> <div class="list-content normal" [class.loading-indicator]="isLoading" #contentElement sqxCompensateScrollbar>
<div class="inner normal" [style.minWidth]="innerWidth" [style.maxWidth]="innerWidth" [class.tabled]="table"> <div class="inner normal" [style.minWidth]="innerWidth" [style.maxWidth]="innerWidth" [class.tabled]="table">
<ng-container *ngTemplateOutlet="contentTemplate"></ng-container> <ng-container *ngTemplateOutlet="contentTemplate"></ng-container>
</div> </div>

1
frontend/src/app/framework/declarations.ts

@ -7,6 +7,7 @@
export * from './angular/avatar.component'; export * from './angular/avatar.component';
export * from './angular/code.component'; export * from './angular/code.component';
export * from './angular/compensate-scrollbar.directive';
export * from './angular/dropdown-menu.component'; export * from './angular/dropdown-menu.component';
export * from './angular/external-link.directive'; export * from './angular/external-link.directive';
export * from './angular/forms/confirm-click.directive'; export * from './angular/forms/confirm-click.directive';

4
frontend/src/app/framework/module.ts

@ -11,7 +11,7 @@ import { ModuleWithProviders, NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { ColorPickerModule } from 'ngx-color-picker'; import { ColorPickerModule } from 'ngx-color-picker';
import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterceptor, CanDeactivateGuard, CheckboxGroupComponent, ClipboardService, CodeComponent, CodeEditorComponent, ColorPickerComponent, ConfirmClickDirective, ControlErrorsComponent, ControlErrorsMessagesComponent, CopyDirective, DarkenPipe, DatePipe, DateTimeEditorComponent, DayOfWeekPipe, DayPipe, DialogRendererComponent, DialogService, DisplayNamePipe, DropdownComponent, DropdownMenuComponent, DurationPipe, EditableTitleComponent, ExternalLinkDirective, FileDropDirective, FileSizePipe, FocusOnInitDirective, FormAlertComponent, FormErrorComponent, FormHintComponent, FromNowPipe, FullDateTimePipe, HighlightPipe, HoverBackgroundDirective, ImageSourceDirective, ImageUrlDirective, IndeterminateValueDirective, ISODatePipe, KeysPipe, KNumberPipe, LanguageSelectorComponent, LayoutComponent, LayoutContainerDirective, LightenPipe, ListViewComponent, LoadingInterceptor, LoadingService, LocalizedInputComponent, LocalStoreService, MarkdownDirective, MarkdownInlinePipe, MarkdownPipe, MessageBus, ModalDialogComponent, ModalDirective, ModalPlacementDirective, MonthPipe, OnboardingService, OnboardingTooltipComponent, PagerComponent, ParentLinkDirective, ProgressBarComponent, ResizedDirective, ResizeService, ResourceLoaderService, RootViewComponent, SafeHtmlPipe, SafeResourceUrlPipe, SafeUrlPipe, ScrollActiveDirective, ShortcutComponent, ShortcutDirective, ShortcutService, ShortDatePipe, ShortTimePipe, StarsComponent, StatusIconComponent, StopClickDirective, StopDragDirective, SyncScollingDirective, SyncWidthDirective, TabRouterlinkDirective, TagEditorComponent, TemplateWrapperDirective, TempService, TitleComponent, TitleService, ToggleComponent, ToolbarComponent, TooltipDirective, TransformInputDirective, TranslatePipe, VideoPlayerComponent } from './declarations'; import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterceptor, CanDeactivateGuard, CheckboxGroupComponent, ClipboardService, CodeComponent, CodeEditorComponent, ColorPickerComponent, CompensateScrollbarDirective, ConfirmClickDirective, ControlErrorsComponent, ControlErrorsMessagesComponent, CopyDirective, DarkenPipe, DatePipe, DateTimeEditorComponent, DayOfWeekPipe, DayPipe, DialogRendererComponent, DialogService, DisplayNamePipe, DropdownComponent, DropdownMenuComponent, DurationPipe, EditableTitleComponent, ExternalLinkDirective, FileDropDirective, FileSizePipe, FocusOnInitDirective, FormAlertComponent, FormErrorComponent, FormHintComponent, FromNowPipe, FullDateTimePipe, HighlightPipe, HoverBackgroundDirective, ImageSourceDirective, ImageUrlDirective, IndeterminateValueDirective, ISODatePipe, KeysPipe, KNumberPipe, LanguageSelectorComponent, LayoutComponent, LayoutContainerDirective, LightenPipe, ListViewComponent, LoadingInterceptor, LoadingService, LocalizedInputComponent, LocalStoreService, MarkdownDirective, MarkdownInlinePipe, MarkdownPipe, MessageBus, ModalDialogComponent, ModalDirective, ModalPlacementDirective, MonthPipe, OnboardingService, OnboardingTooltipComponent, PagerComponent, ParentLinkDirective, ProgressBarComponent, ResizedDirective, ResizeService, ResourceLoaderService, RootViewComponent, SafeHtmlPipe, SafeResourceUrlPipe, SafeUrlPipe, ScrollActiveDirective, ShortcutComponent, ShortcutDirective, ShortcutService, ShortDatePipe, ShortTimePipe, StarsComponent, StatusIconComponent, StopClickDirective, StopDragDirective, SyncScollingDirective, SyncWidthDirective, TabRouterlinkDirective, TagEditorComponent, TemplateWrapperDirective, TempService, TitleComponent, TitleService, ToggleComponent, ToolbarComponent, TooltipDirective, TransformInputDirective, TranslatePipe, VideoPlayerComponent } from './declarations';
@NgModule({ @NgModule({
imports: [ imports: [
@ -28,6 +28,7 @@ import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterc
CodeComponent, CodeComponent,
CodeEditorComponent, CodeEditorComponent,
ColorPickerComponent, ColorPickerComponent,
CompensateScrollbarDirective,
ConfirmClickDirective, ConfirmClickDirective,
ControlErrorsComponent, ControlErrorsComponent,
ControlErrorsMessagesComponent, ControlErrorsMessagesComponent,
@ -112,6 +113,7 @@ import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterc
CodeEditorComponent, CodeEditorComponent,
ColorPickerComponent, ColorPickerComponent,
CommonModule, CommonModule,
CompensateScrollbarDirective,
ConfirmClickDirective, ConfirmClickDirective,
ControlErrorsComponent, ControlErrorsComponent,
CopyDirective, CopyDirective,

Loading…
Cancel
Save