@hreimer/angular-image-viewer
Version:
A configurable Angular image viewer component, compatible with Angular 11.x+
1 lines • 27.4 kB
Source Map (JSON)
{"version":3,"file":"hreimer-angular-image-viewer.mjs","sources":["../../../projects/angular-image-viewer/src/lib/models/custom-image-event-model.ts","../../../projects/angular-image-viewer/src/lib/directives/full-screen.directive.ts","../../../projects/angular-image-viewer/src/lib/angular-image-viewer.component.ts","../../../projects/angular-image-viewer/src/lib/angular-image-viewer.component.html","../../../projects/angular-image-viewer/src/lib/angular-image-viewer.module.ts","../../../projects/angular-image-viewer/src/public-api.ts","../../../projects/angular-image-viewer/src/hreimer-angular-image-viewer.ts"],"sourcesContent":["export class CustomImageEvent {\n name: string;\n imageIndex: number;\n\n constructor(name, imageIndex) {\n this.name = name;\n this.imageIndex = imageIndex;\n }\n}\n","import { Directive, Input, ElementRef, OnChanges, OnInit, SimpleChanges } from '@angular/core';\n// import * as screenfull from 'screenfull';\n\n@Directive({\n selector: '[appScreenfull]'\n})\nexport class FullScreenDirective implements OnChanges, OnInit {\n\n @Input('appScreenfull') fullscreenState: boolean;\n\n constructor(private el: ElementRef) { }\n\n ngOnChanges(changes: SimpleChanges) {\n // console.log('fullscreenState isFirstChange:', changes[\"fullscreenState\"].isFirstChange());\n // console.log('fullscreenState', this.fullscreenState);\n // if (screenfull.isEnabled) {\n // screenfull.toggle(this.el.nativeElement);\n // }\n // if (this.fullscreenState && screenfull.isEnabled) {\n // screenfull.request(this.el.nativeElement);\n // } else if (screenfull.isEnabled) {\n // screenfull.exit();\n // }\n\n // tslint:disable-next-line: no-string-literal\n if (!changes['fullscreenState'].isFirstChange()) {\n\n if (this.fullscreenState) {\n const element: any = this.el.nativeElement;\n\n // tslint:disable-next-line: max-line-length\n const requestMethod = element.requestFullscreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullScreen;\n\n if (requestMethod) { // Native full screen.\n requestMethod.call(element);\n } else {\n console.log('FullScreen Request Method Not Supported on this browser.');\n }\n } else {\n const element: any = document;\n\n // tslint:disable-next-line: max-line-length\n const requestMethod = element.cancelFullscreen || element.webkitExitFullscreen || element.webkitCancelFullScreen || element.mozCancelFullScreen || element.msExitFullScreen;\n\n if (requestMethod) { // Native Cancel full screen.\n requestMethod.call(element);\n } else {\n console.log('FullScreen Cancel Request Method Not Supported on this browser.');\n }\n }\n }\n\n }\n\n ngOnInit() {\n\n }\n\n}\n","import { Component, OnInit, HostListener, Optional, Inject, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\nimport { ImageViewerConfig } from './models/image-viewer-config.model';\nimport { CustomImageEvent } from './models/custom-image-event-model';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n\nconst DEFAULT_CONFIG: ImageViewerConfig = {\n btnContainerClass: 'btn-container',\n btnClass: 'default',\n btnSubClass: 'material-icons',\n zoomFactor: 0.1,\n containerBackgroundColor: '#ccc',\n wheelZoom: false,\n allowFullscreen: true,\n allowKeyboardNavigation: true,\n btnShow: {\n zoomIn: true,\n zoomOut: true,\n rotateClockwise: true,\n rotateCounterClockwise: true,\n next: true,\n prev: true,\n reset: true\n },\n btnIcons: {\n zoomIn: {\n classes: 'fa fa-plus',\n text: 'zoom_in'\n },\n zoomOut: {\n classes: 'fa fa-minus',\n text: 'zoom_out'\n },\n rotateClockwise: {\n classes: 'fa fa-repeat',\n text: 'rotate_right'\n },\n rotateCounterClockwise: {\n classes: 'fa fa-undo',\n text: 'rotate_left'\n },\n next: {\n classes: 'fa fa-arrow-right',\n text: 'arrow_right'\n },\n prev: {\n classes: 'fa fa-arrow-left',\n text: 'arrow_left'\n },\n fullscreen: {\n classes: 'fa fa-arrows-alt',\n text: 'fullscreen'\n },\n reset: {\n classes: 'fa fa-undo',\n text: 'restore'\n },\n }\n};\n\n\n@Component({\n selector: 'angular-image-viewer',\n templateUrl: './angular-image-viewer.component.html',\n styleUrls: ['./angular-image-viewer.component.scss']\n})\nexport class AngularImageViewerComponent implements OnInit, OnChanges {\n\n @Input()\n src: string[];\n\n @Input()\n screenHeightOccupied: 0; // In Px\n\n @Input()\n index = 0;\n\n @Input()\n config: ImageViewerConfig;\n\n @Output()\n indexChange: EventEmitter<number> = new EventEmitter();\n\n @Output()\n configChange: EventEmitter<ImageViewerConfig> = new EventEmitter();\n\n @Output()\n customImageEvent: EventEmitter<CustomImageEvent> = new EventEmitter();\n\n styleHeight = '100%';\n\n public style = { transform: '', msTransform: '', oTransform: '', webkitTransform: '' };\n public fullscreen = false;\n public loading = true;\n private scale = 1;\n private rotation = 0;\n private translateX = 0;\n private translateY = 0;\n private prevX: number;\n private prevY: number;\n private hovered = false;\n\n constructor(@Optional() @Inject('config') public moduleConfig: ImageViewerConfig,\n private sanitizer: DomSanitizer) { }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.screenHeightOccupied) {\n this.styleHeight = 'calc(100% - ' + this.screenHeightOccupied + 'px)';\n // console.log('Style Height:', this.styleHeight);\n }\n }\n\n ngOnInit() {\n const merged = this.mergeConfig(DEFAULT_CONFIG, this.moduleConfig);\n this.config = this.mergeConfig(merged, this.config);\n this.triggerConfigBinding();\n }\n\n @HostListener('window:keyup.ArrowRight', ['$event'])\n nextImage(event) {\n if (this.canNavigate(event) && this.index < this.src.length - 1) {\n this.loading = true;\n this.index++;\n this.triggerIndexBinding();\n this.reset();\n }\n }\n\n @HostListener('window:keyup.ArrowLeft', ['$event'])\n prevImage(event) {\n if (this.canNavigate(event) && this.index > 0) {\n this.loading = true;\n this.index--;\n this.triggerIndexBinding();\n this.reset();\n }\n }\n\n zoomIn() {\n this.scale *= (1 + this.config.zoomFactor);\n this.updateStyle();\n }\n\n zoomOut() {\n if (this.scale > this.config.zoomFactor) {\n this.scale /= (1 + this.config.zoomFactor);\n }\n this.updateStyle();\n }\n\n scrollZoom(evt) {\n if (this.config.wheelZoom) {\n evt.deltaY > 0 ? this.zoomOut() : this.zoomIn();\n return false;\n }\n }\n\n rotateClockwise() {\n this.rotation += 90;\n this.updateStyle();\n }\n\n rotateCounterClockwise() {\n this.rotation -= 90;\n this.updateStyle();\n }\n\n onLoad(url) {\n // console.log('Loading Image Done:', url);\n this.loading = false;\n }\n\n onLoadStart(url) {\n // console.log('Loading Image:', url);\n this.loading = true;\n }\n\n imageNotFound(url) {\n // console.log('Image not found Url:', url);\n }\n\n onDragOver(evt) {\n this.translateX += (evt.clientX - this.prevX);\n this.translateY += (evt.clientY - this.prevY);\n this.prevX = evt.clientX;\n this.prevY = evt.clientY;\n this.updateStyle();\n }\n\n onDragStart(evt) {\n if (evt.dataTransfer && evt.dataTransfer.setDragImage) {\n evt.dataTransfer.setDragImage(evt.target.nextElementSibling, 0, 0);\n }\n this.prevX = evt.clientX;\n this.prevY = evt.clientY;\n }\n\n toggleFullscreen() {\n this.fullscreen = !this.fullscreen;\n if (!this.fullscreen) {\n this.reset();\n }\n }\n\n triggerIndexBinding() {\n this.indexChange.emit(this.index);\n }\n\n triggerConfigBinding() {\n this.configChange.next(this.config);\n }\n\n fireCustomEvent(name, imageIndex) {\n this.customImageEvent.emit(new CustomImageEvent(name, imageIndex));\n }\n\n reset() {\n this.scale = 1;\n this.rotation = 0;\n this.translateX = 0;\n this.translateY = 0;\n this.updateStyle();\n }\n\n @HostListener('mouseover')\n onMouseOver() {\n this.hovered = true;\n }\n\n @HostListener('mouseleave')\n onMouseLeave() {\n this.hovered = false;\n }\n\n private canNavigate(event: any) {\n return event == null || (this.config.allowKeyboardNavigation && this.hovered);\n }\n\n private updateStyle() {\n this.style.transform = `translate(${this.translateX}px, ${this.translateY}px) rotate(${this.rotation}deg) scale(${this.scale})`;\n this.style.msTransform = this.style.transform;\n this.style.webkitTransform = this.style.transform;\n this.style.oTransform = this.style.transform;\n }\n\n private mergeConfig(defaultValues: ImageViewerConfig, overrideValues: ImageViewerConfig): ImageViewerConfig {\n let result: ImageViewerConfig = { ...defaultValues };\n if (overrideValues) {\n result = { ...defaultValues, ...overrideValues };\n\n if (overrideValues.btnIcons) {\n result.btnIcons = { ...defaultValues.btnIcons, ...overrideValues.btnIcons };\n }\n }\n return result;\n }\n\n}\n","<div [appScreenfull]=\"fullscreen\" class=\"img-container\" [style.height]=\"styleHeight\"\n [style.backgroundColor]=\"config.containerBackgroundColor\" (wheel)=\"scrollZoom($event)\"\n (dragover)=\"onDragOver($event)\">\n <img [src]=\"src[index]\" [ngStyle]=\"style\" alt=\"Image not found...\" (dragstart)=\"onDragStart($event)\"\n (load)=\"onLoad(src[index])\" (error)=\"imageNotFound(src[index])\" (loadstart)=\"onLoadStart(src[index])\" />\n <!-- Div below will be used to hide the 'ghost' image when dragging -->\n <div></div>\n <div class=\"spinner-container\" *ngIf=\"loading\">\n <div class=\"spinner\"></div>\n </div>\n\n <!-- Button Container -->\n <div class=\"btn-container\" [class]=\"config.btnContainerClass\">\n <!-- Rotate Counter Clockwise -->\n <ng-container *ngIf=\"config.btnShow.rotateCounterClockwise\">\n <button type=\"button\" [class]=\"config.btnClass\"\n (click)=\"rotateCounterClockwise()\" *ngIf=\"config.btnIcons.rotateCounterClockwise.classes\" >\n <span [class]=\"config.btnIcons.rotateCounterClockwise.classes\"></span>\n </button>\n <a [class]=\"config.btnClass\" *ngIf=\"config.btnIcons.rotateCounterClockwise.text\" (click)=\"rotateCounterClockwise()\">\n <span [class]=\"config.btnSubClass\">{{config.btnIcons.rotateCounterClockwise.text}}</span>\n </a>\n </ng-container>\n\n <!-- Rotate Clockwise -->\n <ng-container *ngIf=\"config.btnShow.rotateClockwise\">\n <button type=\"button\" [class]=\"config.btnClass\"\n (click)=\"rotateClockwise()\" *ngIf=\"config.btnIcons.rotateClockwise.classes\" >\n <span [class]=\"config.btnIcons.rotateClockwise.classes\"></span>\n </button>\n <a [class]=\"config.btnClass\" *ngIf=\"config.btnIcons.rotateClockwise.text\" (click)=\"rotateClockwise()\">\n <span [class]=\"config.btnSubClass\">{{config.btnIcons.rotateClockwise.text}}</span>\n </a>\n </ng-container>\n\n <!-- Zoom Out -->\n <ng-container *ngIf=\"config.btnShow.zoomOut\">\n <button type=\"button\" [class]=\"config.btnClass\"\n (click)=\"zoomOut()\" *ngIf=\"config.btnIcons.zoomOut.classes\" >\n <span [class]=\"config.btnIcons.zoomOut.classes\"></span>\n </button>\n <a [class]=\"config.btnClass\" *ngIf=\"config.btnIcons.zoomOut.text\" (click)=\"zoomOut()\">\n <span [class]=\"config.btnSubClass\">{{config.btnIcons.zoomOut.text}}</span>\n </a>\n </ng-container>\n\n <!-- Zoom In -->\n <ng-container *ngIf=\"config.btnShow.zoomIn\">\n <button type=\"button\" [class]=\"config.btnClass\"\n (click)=\"zoomIn()\" *ngIf=\"config.btnIcons.zoomIn.classes\" >\n <span [class]=\"config.btnIcons.zoomIn.classes\"></span>\n </button>\n <a [class]=\"config.btnClass\" *ngIf=\"config.btnIcons.zoomIn.text\" (click)=\"zoomIn()\">\n <span [class]=\"config.btnSubClass\">{{config.btnIcons.zoomIn.text}}</span>\n </a>\n </ng-container>\n\n <!-- Fullscreen -->\n <ng-container *ngIf=\"config.allowFullscreen\">\n <button type=\"button\" [class]=\"config.btnClass\"\n (click)=\"toggleFullscreen()\" *ngIf=\"config.btnIcons.fullscreen.classes\" >\n <span [class]=\"config.btnIcons.fullscreen.classes\"></span>\n </button>\n <a [class]=\"config.btnClass\" *ngIf=\"config.btnIcons.fullscreen.text\" (click)=\"toggleFullscreen()\">\n <span [class]=\"config.btnSubClass\">{{config.btnIcons.fullscreen.text}}</span>\n </a>\n </ng-container>\n\n <!-- Reset -->\n <ng-container *ngIf=\"config.btnShow.reset\">\n <button type=\"button\" [class]=\"config.btnClass\"\n (click)=\"reset()\" *ngIf=\"config.btnIcons.reset.classes\" >\n <span [class]=\"config.btnIcons.reset.classes\"></span>\n </button>\n <a [class]=\"config.btnClass\" *ngIf=\"config.btnIcons.reset.text\" (click)=\"reset()\">\n <span [class]=\"config.btnSubClass\">{{config.btnIcons.reset.text}}</span>\n </a>\n </ng-container>\n\n <!-- Custom Buttons -->\n <ng-container *ngFor=\"let cBtn of config.customBtns\">\n <button *ngIf=\"cBtn.icon.classes\" type=\"button\" [class]=\"config.btnClass\"\n (click)=\"fireCustomEvent(cBtn.name, index)\">\n <span *ngIf=\"cBtn.icon.classes\" [class]=\"cBtn.icon.classes\"></span>\n </button>\n <ng-container *ngIf=\"cBtn.icon.text\">\n <a [class]=\"config.btnClass\" *ngIf=\"cBtn.icon.text\" (click)=\"fireCustomEvent(cBtn.name, index)\">\n <span [class]=\"config.btnSubClass\">{{cBtn.icon.text}}</span>\n </a>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Prev / Next Nav Container -->\n <div class=\"nav-button-container\" *ngIf=\"src.length > 1\">\n <button *ngIf=\"config.btnShow.next\" type=\"button\" [class]=\"config.btnClass\" (click)=\"prevImage($event)\" [disabled]=\"index === 0\">\n <span *ngIf=\"config.btnIcons.prev.classes\" [class]=\"config.btnIcons.prev.classes\"></span>\n </button>\n <a [class]=\"config.btnClass\" *ngIf=\"config.btnIcons.prev.text\" (click)=\"prevImage($event)\">\n <span [class]=\"config.btnSubClass\">{{config.btnIcons.prev.text}}</span>\n </a>\n <button *ngIf=\"config.btnShow.next\" type=\"button\" [class]=\"config.btnClass\" (click)=\"nextImage($event)\"\n [disabled]=\"index === src.length - 1\">\n <span *ngIf=\"config.btnIcons.next.classes\" [class]=\"config.btnIcons.next.classes\"></span>\n </button>\n <a [class]=\"config.btnClass\" *ngIf=\"config.btnIcons.next.text\" (click)=\"nextImage($event)\">\n <span [class]=\"config.btnSubClass\">{{config.btnIcons.next.text}}</span>\n </a>\n </div>\n</div>","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { AngularImageViewerComponent } from './angular-image-viewer.component';\nimport { FullScreenDirective } from './directives/full-screen.directive';\n// import { ImageViewerConfig } from 'dist/angular-image-viewer/public-api';\n\n\n\n@NgModule({\n declarations: [AngularImageViewerComponent, FullScreenDirective],\n imports: [\n CommonModule,\n BrowserModule,\n FormsModule,\n BrowserAnimationsModule,\n ],\n exports: [AngularImageViewerComponent, FullScreenDirective]\n})\nexport class AngularImageViewerModule {\n /**\n * forRoot\n * @returns A module with its provider dependencies\n */\n // static forRoot(imageViewerConfig: ImageViewerConfig): ModuleWithProviders {\n // return {\n // ngModule: AngularImageViewerModule,\n // providers: [\n // {\n // provide: imageViewerConfig,\n // useValue: imageViewerConfig\n // }\n // ]\n // };\n // }\n}\n","/*\n * Public API Surface of angular-image-viewer\n */\n\nexport * from './lib/angular-image-viewer.module';\nexport { AngularImageViewerComponent } from './lib/angular-image-viewer.component';\nexport { ImageViewerConfig} from './lib/models/image-viewer-config.model';\nexport { CustomImageEvent } from './lib/models/custom-image-event-model';\nexport { FullScreenDirective } from './lib/directives/full-screen.directive';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.FullScreenDirective"],"mappings":"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"}