mirror of
https://github.com/xuthus83/pigallery2.git
synced 2025-01-14 14:43:17 +08:00
package update and improving lightbox
This commit is contained in:
parent
7e425fc54e
commit
3f10c670f5
@ -1,13 +1,13 @@
|
|||||||
import {IIndexingManager} from "../interfaces/IIndexingManager";
|
import {IIndexingManager} from '../interfaces/IIndexingManager';
|
||||||
import {IndexingProgressDTO} from "../../../common/entities/settings/IndexingProgressDTO";
|
import {IndexingProgressDTO} from '../../../common/entities/settings/IndexingProgressDTO';
|
||||||
import {ObjectManagerRepository} from "../ObjectManagerRepository";
|
import {ObjectManagerRepository} from '../ObjectManagerRepository';
|
||||||
import {ISQLGalleryManager} from "./IGalleryManager";
|
import {ISQLGalleryManager} from './IGalleryManager';
|
||||||
import * as path from "path";
|
import * as path from 'path';
|
||||||
import {SQLConnection} from "./SQLConnection";
|
import {SQLConnection} from './SQLConnection';
|
||||||
import {DirectoryEntity} from "./enitites/DirectoryEntity";
|
import {DirectoryEntity} from './enitites/DirectoryEntity';
|
||||||
import {Logger} from "../../Logger";
|
import {Logger} from '../../Logger';
|
||||||
|
|
||||||
const LOG_TAG = "[IndexingManager]";
|
const LOG_TAG = '[IndexingManager]';
|
||||||
|
|
||||||
export class IndexingManager implements IIndexingManager {
|
export class IndexingManager implements IIndexingManager {
|
||||||
directoriesToIndex: string[] = [];
|
directoriesToIndex: string[] = [];
|
||||||
@ -30,24 +30,24 @@ export class IndexingManager implements IIndexingManager {
|
|||||||
}
|
}
|
||||||
this.indexingProgress.indexed++;
|
this.indexingProgress.indexed++;
|
||||||
for (let i = 0; i < scanned.directories.length; i++) {
|
for (let i = 0; i < scanned.directories.length; i++) {
|
||||||
this.directoriesToIndex.push(path.join(scanned.directories[i].path, scanned.directories[i].name))
|
this.directoriesToIndex.push(path.join(scanned.directories[i].path, scanned.directories[i].name));
|
||||||
}
|
}
|
||||||
process.nextTick(this.indexNewDirectory);
|
process.nextTick(this.indexNewDirectory);
|
||||||
};
|
};
|
||||||
|
|
||||||
startIndexing(): void {
|
startIndexing(): void {
|
||||||
if (this.directoriesToIndex.length == 0 && this.enabled == false) {
|
if (this.directoriesToIndex.length == 0 && this.enabled == false) {
|
||||||
Logger.info(LOG_TAG, "Starting indexing");
|
Logger.info(LOG_TAG, 'Starting indexing');
|
||||||
this.indexingProgress = <IndexingProgressDTO>{
|
this.indexingProgress = <IndexingProgressDTO>{
|
||||||
indexed: 0,
|
indexed: 0,
|
||||||
left: 0,
|
left: 0,
|
||||||
current: ""
|
current: ''
|
||||||
};
|
};
|
||||||
this.directoriesToIndex.push("/");
|
this.directoriesToIndex.push('/');
|
||||||
this.enabled = true;
|
this.enabled = true;
|
||||||
this.indexNewDirectory();
|
this.indexNewDirectory();
|
||||||
} else {
|
} else {
|
||||||
Logger.info(LOG_TAG, "Already indexing..");
|
Logger.info(LOG_TAG, 'Already indexing..');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ export class IndexingManager implements IIndexingManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cancelIndexing(): void {
|
cancelIndexing(): void {
|
||||||
Logger.info(LOG_TAG, "Canceling indexing");
|
Logger.info(LOG_TAG, 'Canceling indexing');
|
||||||
this.directoriesToIndex = [];
|
this.directoriesToIndex = [];
|
||||||
this.indexingProgress = null;
|
this.indexingProgress = null;
|
||||||
this.enabled = false;
|
this.enabled = false;
|
||||||
@ -66,15 +66,16 @@ export class IndexingManager implements IIndexingManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async reset(): Promise<void> {
|
async reset(): Promise<void> {
|
||||||
Logger.info(LOG_TAG, "Resetting DB");
|
Logger.info(LOG_TAG, 'Resetting DB');
|
||||||
this.directoriesToIndex = [];
|
this.directoriesToIndex = [];
|
||||||
this.indexingProgress = null;
|
this.indexingProgress = null;
|
||||||
this.enabled = false;
|
this.enabled = false;
|
||||||
const connection = await SQLConnection.getConnection();
|
const connection = await SQLConnection.getConnection();
|
||||||
return connection
|
return connection
|
||||||
.getRepository(DirectoryEntity)
|
.getRepository(DirectoryEntity)
|
||||||
.createQueryBuilder("directory")
|
.createQueryBuilder('directory')
|
||||||
.delete()
|
.delete()
|
||||||
.execute();
|
.execute().then(() => {
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,9 +16,9 @@ import {NotificationService} from '../model/notification.service';
|
|||||||
export class FrameComponent {
|
export class FrameComponent {
|
||||||
|
|
||||||
user: BehaviorSubject<UserDTO>;
|
user: BehaviorSubject<UserDTO>;
|
||||||
authenticationRequired: boolean = false;
|
authenticationRequired = false;
|
||||||
public title: string;
|
public title: string;
|
||||||
isIn: boolean = false;
|
isIn = false;
|
||||||
|
|
||||||
constructor(private _authService: AuthenticationService,
|
constructor(private _authService: AuthenticationService,
|
||||||
public notificationService: NotificationService) {
|
public notificationService: NotificationService) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<gallery-lightbox #lightbox (onLastElement)="onLightboxLastElement()"></gallery-lightbox>
|
<app-gallery-lightbox #lightbox (onLastElement)="onLightboxLastElement()"></app-gallery-lightbox>
|
||||||
<app-frame>
|
<app-frame>
|
||||||
|
|
||||||
<ng-container navbar>
|
<ng-container navbar>
|
||||||
@ -18,7 +18,6 @@
|
|||||||
<li *ngIf="showShare">
|
<li *ngIf="showShare">
|
||||||
<gallery-share></gallery-share>
|
<gallery-share></gallery-share>
|
||||||
</li>
|
</li>
|
||||||
-
|
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ import {SearchResultDTO} from '../../../common/entities/SearchResultDTO';
|
|||||||
import {ShareService} from './share.service';
|
import {ShareService} from './share.service';
|
||||||
import {NavigationService} from '../model/navigation.service';
|
import {NavigationService} from '../model/navigation.service';
|
||||||
import {UserRoles} from '../../../common/entities/UserDTO';
|
import {UserRoles} from '../../../common/entities/UserDTO';
|
||||||
import {Observable} from 'rxjs/Rx';
|
import {interval} from 'rxjs/observable/interval';
|
||||||
import {ContentWrapper} from '../../../common/entities/ConentWrapper';
|
import {ContentWrapper} from '../../../common/entities/ConentWrapper';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -24,8 +24,8 @@ export class GalleryComponent implements OnInit, OnDestroy {
|
|||||||
@ViewChild(GallerySearchComponent) search: GallerySearchComponent;
|
@ViewChild(GallerySearchComponent) search: GallerySearchComponent;
|
||||||
@ViewChild(GalleryGridComponent) grid: GalleryGridComponent;
|
@ViewChild(GalleryGridComponent) grid: GalleryGridComponent;
|
||||||
|
|
||||||
public showSearchBar: boolean = false;
|
public showSearchBar = false;
|
||||||
public showShare: boolean = false;
|
public showShare = false;
|
||||||
public directories: DirectoryDTO[] = [];
|
public directories: DirectoryDTO[] = [];
|
||||||
public isPhotoWithLocation = false;
|
public isPhotoWithLocation = false;
|
||||||
private $counter;
|
private $counter;
|
||||||
@ -64,11 +64,11 @@ export class GalleryComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
private onRoute = async (params: Params) => {
|
private onRoute = async (params: Params) => {
|
||||||
const searchText = params['searchText'];
|
const searchText = params['searchText'];
|
||||||
if (searchText && searchText != '') {
|
if (searchText && searchText !== '') {
|
||||||
let typeString = params['type'];
|
const typeString = params['type'];
|
||||||
|
|
||||||
if (typeString && typeString != '') {
|
if (typeString && typeString !== '') {
|
||||||
let type: SearchTypes = <any>SearchTypes[typeString];
|
const type: SearchTypes = <any>SearchTypes[typeString];
|
||||||
this._galleryService.search(searchText, type);
|
this._galleryService.search(searchText, type);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ export class GalleryComponent implements OnInit, OnDestroy {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params['sharingKey'] && params['sharingKey'] != '') {
|
if (params['sharingKey'] && params['sharingKey'] !== '') {
|
||||||
const sharing = await this.shareService.getSharing();
|
const sharing = await this.shareService.getSharing();
|
||||||
this._router.navigate(['/gallery', sharing.path], {queryParams: {sk: this.shareService.getSharingKey()}});
|
this._router.navigate(['/gallery', sharing.path], {queryParams: {sk: this.shareService.getSharingKey()}});
|
||||||
return;
|
return;
|
||||||
@ -140,7 +140,7 @@ export class GalleryComponent implements OnInit, OnDestroy {
|
|||||||
this.subscription.route = this._route.params.subscribe(this.onRoute);
|
this.subscription.route = this._route.params.subscribe(this.onRoute);
|
||||||
|
|
||||||
if (this.shareService.isSharing()) {
|
if (this.shareService.isSharing()) {
|
||||||
this.$counter = Observable.interval(1000);
|
this.$counter = interval(1000);
|
||||||
this.subscription.timer = this.$counter.subscribe((x) => this.updateTimer(x));
|
this.subscription.timer = this.$counter.subscribe((x) => this.updateTimer(x));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,9 +6,6 @@
|
|||||||
width: 100%; /* Full width */
|
width: 100%; /* Full width */
|
||||||
height: 100%; /* Full height */
|
height: 100%; /* Full height */
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
display: flex; /* add */
|
|
||||||
justify-content: center; /* add to align horizontal */
|
|
||||||
align-items: center; /* add to align vertical */
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,8 @@
|
|||||||
*ngIf="!fullScreenService.isFullScreenEnabled()"
|
*ngIf="!fullScreenService.isFullScreenEnabled()"
|
||||||
(click)="fullScreenService.showFullScreen(root)" title="toggle fullscreen" i18n-title></span>
|
(click)="fullScreenService.showFullScreen(root)" title="toggle fullscreen" i18n-title></span>
|
||||||
|
|
||||||
<span class="glyphicon glyphicon-remove highlight" (click)="hide()" title="close" i18n-title></span>
|
<span class="glyphicon glyphicon-remove highlight control-button" (click)="hide()" title="close"
|
||||||
|
i18n-title></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="navigation-arrow highlight"
|
<div class="navigation-arrow highlight"
|
||||||
|
@ -1,20 +1,33 @@
|
|||||||
import {ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, OnDestroy, Output, QueryList, ViewChild} from '@angular/core';
|
import {
|
||||||
|
ChangeDetectorRef,
|
||||||
|
Component,
|
||||||
|
ElementRef,
|
||||||
|
EventEmitter,
|
||||||
|
HostListener,
|
||||||
|
OnDestroy,
|
||||||
|
OnInit,
|
||||||
|
Output,
|
||||||
|
QueryList,
|
||||||
|
ViewChild
|
||||||
|
} from '@angular/core';
|
||||||
import {PhotoDTO} from '../../../../common/entities/PhotoDTO';
|
import {PhotoDTO} from '../../../../common/entities/PhotoDTO';
|
||||||
import {GalleryPhotoComponent} from '../grid/photo/photo.grid.gallery.component';
|
import {GalleryPhotoComponent} from '../grid/photo/photo.grid.gallery.component';
|
||||||
import {Dimension} from '../../model/IRenderable';
|
import {Dimension} from '../../model/IRenderable';
|
||||||
import {FullScreenService} from '../fullscreen.service';
|
import {FullScreenService} from '../fullscreen.service';
|
||||||
import {OverlayService} from '../overlay.service';
|
import {OverlayService} from '../overlay.service';
|
||||||
import {Subscription} from 'rxjs';
|
import {Subscription} from 'rxjs/Subscription';
|
||||||
import {animate, AnimationBuilder, AnimationPlayer, style} from '@angular/animations';
|
import {animate, AnimationBuilder, AnimationPlayer, style} from '@angular/animations';
|
||||||
import {GalleryLightboxPhotoComponent} from './photo/photo.lightbox.gallery.component';
|
import {GalleryLightboxPhotoComponent} from './photo/photo.lightbox.gallery.component';
|
||||||
import {Observable} from 'rxjs/Observable';
|
import {Observable} from 'rxjs/Observable';
|
||||||
|
import {timer} from 'rxjs/observable/timer';
|
||||||
|
import {filter} from 'rxjs/operators';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'gallery-lightbox',
|
selector: 'app-gallery-lightbox',
|
||||||
styleUrls: ['./lightbox.gallery.component.css'],
|
styleUrls: ['./lightbox.gallery.component.css'],
|
||||||
templateUrl: './lightbox.gallery.component.html'
|
templateUrl: './lightbox.gallery.component.html'
|
||||||
})
|
})
|
||||||
export class GalleryLightboxComponent implements OnDestroy {
|
export class GalleryLightboxComponent implements OnDestroy, OnInit {
|
||||||
|
|
||||||
|
|
||||||
@Output('onLastElement') onLastElement = new EventEmitter();
|
@Output('onLastElement') onLastElement = new EventEmitter();
|
||||||
@ -32,13 +45,16 @@ export class GalleryLightboxComponent implements OnDestroy {
|
|||||||
private changeSubscription: Subscription = null;
|
private changeSubscription: Subscription = null;
|
||||||
private timer: Observable<number>;
|
private timer: Observable<number>;
|
||||||
private timerSub: Subscription;
|
private timerSub: Subscription;
|
||||||
public playBackState: number = 0;
|
public playBackState = 0;
|
||||||
public controllersDimmed = true;
|
public controllersDimmed = true;
|
||||||
public controllersVisible = true;
|
public controllersVisible = true;
|
||||||
|
|
||||||
public infoPanelVisible = false;
|
public infoPanelVisible = false;
|
||||||
public infoPanelWidth = 0;
|
public infoPanelWidth = 0;
|
||||||
public animating = false;
|
public animating = false;
|
||||||
|
startPhotoDimension: Dimension = <Dimension>{top: 0, left: 0, width: 0, height: 0};
|
||||||
|
iPvisibilityTimer = null;
|
||||||
|
visibilityTimer = null;
|
||||||
|
|
||||||
|
|
||||||
constructor(public fullScreenService: FullScreenService,
|
constructor(public fullScreenService: FullScreenService,
|
||||||
@ -47,7 +63,7 @@ export class GalleryLightboxComponent implements OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
this.timer = Observable.timer(1000, 2000);
|
this.timer = timer(1000, 2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
@ -77,7 +93,7 @@ export class GalleryLightboxComponent implements OnDestroy {
|
|||||||
if (this.activePhotoId + 1 < this.gridPhotoQL.length) {
|
if (this.activePhotoId + 1 < this.gridPhotoQL.length) {
|
||||||
this.showPhoto(this.activePhotoId + 1);
|
this.showPhoto(this.activePhotoId + 1);
|
||||||
if (this.activePhotoId + 3 >= this.gridPhotoQL.length) {
|
if (this.activePhotoId + 3 >= this.gridPhotoQL.length) {
|
||||||
this.onLastElement.emit({}); //trigger to render more photos if there are
|
this.onLastElement.emit({}); // trigger to render more photos if there are
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -102,7 +118,7 @@ export class GalleryLightboxComponent implements OnDestroy {
|
|||||||
this.controllersVisible = true;
|
this.controllersVisible = true;
|
||||||
this.showControls();
|
this.showControls();
|
||||||
this.visible = true;
|
this.visible = true;
|
||||||
let selectedPhoto = this.findPhotoComponent(photo);
|
const selectedPhoto = this.findPhotoComponent(photo);
|
||||||
if (selectedPhoto === null) {
|
if (selectedPhoto === null) {
|
||||||
throw new Error('Can\'t find Photo');
|
throw new Error('Can\'t find Photo');
|
||||||
}
|
}
|
||||||
@ -125,37 +141,34 @@ export class GalleryLightboxComponent implements OnDestroy {
|
|||||||
|
|
||||||
this.blackCanvasOpacity = 0;
|
this.blackCanvasOpacity = 0;
|
||||||
this.startPhotoDimension = selectedPhoto.getDimension();
|
this.startPhotoDimension = selectedPhoto.getDimension();
|
||||||
//disable scroll
|
// disable scroll
|
||||||
this.overlayService.showOverlay();
|
this.overlayService.showOverlay();
|
||||||
this.blackCanvasOpacity = 1.0;
|
this.blackCanvasOpacity = 1.0;
|
||||||
this.showPhoto(this.gridPhotoQL.toArray().indexOf(selectedPhoto), false);
|
this.showPhoto(this.gridPhotoQL.toArray().indexOf(selectedPhoto), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
startPhotoDimension: Dimension = <Dimension>{top: 0, left: 0, width: 0, height: 0};
|
//noinspection JSUnusedGlobalSymbols
|
||||||
|
@HostListener('window:keydown', ['$event'])
|
||||||
private updateActivePhoto(photoIndex: number, resize: boolean = true) {
|
onKeyPress(e: KeyboardEvent) {
|
||||||
let pcList = this.gridPhotoQL.toArray();
|
if (this.visible !== true) {
|
||||||
|
return;
|
||||||
|
|
||||||
if (photoIndex < 0 || photoIndex > this.gridPhotoQL.length) {
|
|
||||||
throw new Error('Can\'t find the photo');
|
|
||||||
}
|
}
|
||||||
this.activePhotoId = photoIndex;
|
const event: KeyboardEvent = window.event ? <any>window.event : e;
|
||||||
this.activePhoto = pcList[photoIndex];
|
switch (event.keyCode) {
|
||||||
|
case 37:
|
||||||
if (resize) {
|
if (this.activePhotoId > 0) {
|
||||||
this.animatePhoto(this.calcLightBoxPhotoDimension(this.activePhoto.gridPhoto.photo));
|
this.prevImage();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 39:
|
||||||
|
if (this.activePhotoId < this.gridPhotoQL.length - 1) {
|
||||||
|
this.nextImage();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 27: // escape
|
||||||
|
this.hide();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
this.navigation.hasPrev = photoIndex > 0;
|
|
||||||
this.navigation.hasNext = photoIndex + 1 < pcList.length;
|
|
||||||
|
|
||||||
let to = this.activePhoto.getDimension();
|
|
||||||
|
|
||||||
//if target image out of screen -> scroll to there
|
|
||||||
if (this.getBodyScrollTop() > to.top || this.getBodyScrollTop() + this.getPhotoFrameHeight() < to.top) {
|
|
||||||
this.setBodyScrollTop(to.top);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public hide() {
|
public hide() {
|
||||||
@ -228,46 +241,10 @@ export class GalleryLightboxComponent implements OnDestroy {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private findPhotoComponent(photo: any): GalleryPhotoComponent {
|
|
||||||
let galleryPhotoComponents = this.gridPhotoQL.toArray();
|
|
||||||
for (let i = 0; i < galleryPhotoComponents.length; i++) {
|
|
||||||
if (galleryPhotoComponents[i].gridPhoto.photo == photo) {
|
|
||||||
return galleryPhotoComponents[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//noinspection JSUnusedGlobalSymbols
|
|
||||||
@HostListener('window:keydown', ['$event'])
|
|
||||||
onKeyPress(e: KeyboardEvent) {
|
|
||||||
if (this.visible != true) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let event: KeyboardEvent = window.event ? <any>window.event : e;
|
|
||||||
switch (event.keyCode) {
|
|
||||||
case 37:
|
|
||||||
if (this.activePhotoId > 0) {
|
|
||||||
this.prevImage();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 39:
|
|
||||||
if (this.activePhotoId < this.gridPhotoQL.length - 1) {
|
|
||||||
this.nextImage();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 27: //escape
|
|
||||||
this.hide();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iPvisibilityTimer = null;
|
|
||||||
|
|
||||||
public toggleInfoPanel() {
|
public toggleInfoPanel() {
|
||||||
|
|
||||||
|
|
||||||
if (this.infoPanelWidth != 400) {
|
if (this.infoPanelWidth !== 400) {
|
||||||
this.showInfoPanel();
|
this.showInfoPanel();
|
||||||
} else {
|
} else {
|
||||||
this.hideInfoPanel();
|
this.hideInfoPanel();
|
||||||
@ -275,6 +252,49 @@ export class GalleryLightboxComponent implements OnDestroy {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hideInfoPanel(_animate: boolean = true) {
|
||||||
|
this.iPvisibilityTimer = setTimeout(() => {
|
||||||
|
this.iPvisibilityTimer = null;
|
||||||
|
this.infoPanelVisible = false;
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
const starPhotoPos = this.calcLightBoxPhotoDimension(this.activePhoto.gridPhoto.photo);
|
||||||
|
this.infoPanelWidth = 0;
|
||||||
|
const endPhotoPos = this.calcLightBoxPhotoDimension(this.activePhoto.gridPhoto.photo);
|
||||||
|
if (_animate) {
|
||||||
|
this.animatePhoto(starPhotoPos, endPhotoPos);
|
||||||
|
}
|
||||||
|
if (_animate) {
|
||||||
|
this.animateLightbox(<Dimension>{
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
width: this.getPhotoFrameWidth() - 400,
|
||||||
|
height: this.getPhotoFrameHeight()
|
||||||
|
},
|
||||||
|
<Dimension>{
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
width: this.getPhotoFrameWidth(),
|
||||||
|
height: this.getPhotoFrameHeight()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public play() {
|
||||||
|
this.pause();
|
||||||
|
this.timerSub = this.timer.pipe(filter(t => t % 2 === 0)).subscribe(() => {
|
||||||
|
if (this.photoElement.imageLoadFinished === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.navigation.hasNext) {
|
||||||
|
this.nextImage();
|
||||||
|
} else {
|
||||||
|
this.showPhoto(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.playBackState = 1;
|
||||||
|
}
|
||||||
|
|
||||||
showInfoPanel() {
|
showInfoPanel() {
|
||||||
this.infoPanelVisible = true;
|
this.infoPanelVisible = true;
|
||||||
|
|
||||||
@ -299,32 +319,19 @@ export class GalleryLightboxComponent implements OnDestroy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hideInfoPanel(animate: boolean = true) {
|
public fastForward() {
|
||||||
this.iPvisibilityTimer = setTimeout(() => {
|
this.pause();
|
||||||
this.iPvisibilityTimer = null;
|
this.timerSub = this.timer.subscribe(() => {
|
||||||
this.infoPanelVisible = false;
|
if (this.photoElement.imageLoadFinished === false) {
|
||||||
}, 1000);
|
return;
|
||||||
|
}
|
||||||
const starPhotoPos = this.calcLightBoxPhotoDimension(this.activePhoto.gridPhoto.photo);
|
if (this.navigation.hasNext) {
|
||||||
this.infoPanelWidth = 0;
|
this.nextImage();
|
||||||
const endPhotoPos = this.calcLightBoxPhotoDimension(this.activePhoto.gridPhoto.photo);
|
} else {
|
||||||
if (animate) {
|
this.showPhoto(0);
|
||||||
this.animatePhoto(starPhotoPos, endPhotoPos);
|
}
|
||||||
}
|
});
|
||||||
if (animate) {
|
this.playBackState = 2;
|
||||||
this.animateLightbox(<Dimension>{
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
width: this.getPhotoFrameWidth() - 400,
|
|
||||||
height: this.getPhotoFrameHeight()
|
|
||||||
},
|
|
||||||
<Dimension>{
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
width: this.getPhotoFrameWidth(),
|
|
||||||
height: this.getPhotoFrameHeight()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -344,26 +351,31 @@ export class GalleryLightboxComponent implements OnDestroy {
|
|||||||
return window.innerHeight;
|
return window.innerHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private updateActivePhoto(photoIndex: number, resize: boolean = true) {
|
||||||
|
const pcList = this.gridPhotoQL.toArray();
|
||||||
|
|
||||||
private calcLightBoxPhotoDimension(photo: PhotoDTO): Dimension {
|
|
||||||
let width = 0;
|
if (photoIndex < 0 || photoIndex > this.gridPhotoQL.length) {
|
||||||
let height = 0;
|
throw new Error('Can\'t find the photo');
|
||||||
const photoAspect = photo.metadata.size.width / photo.metadata.size.height;
|
}
|
||||||
const windowAspect = this.getPhotoFrameWidth() / this.getPhotoFrameHeight();
|
this.activePhotoId = photoIndex;
|
||||||
if (photoAspect < windowAspect) {
|
this.activePhoto = pcList[photoIndex];
|
||||||
width = Math.round(photo.metadata.size.width * (this.getPhotoFrameHeight() / photo.metadata.size.height));
|
|
||||||
height = this.getPhotoFrameHeight();
|
if (resize) {
|
||||||
} else {
|
this.animatePhoto(this.calcLightBoxPhotoDimension(this.activePhoto.gridPhoto.photo));
|
||||||
width = this.getPhotoFrameWidth();
|
}
|
||||||
height = Math.round(photo.metadata.size.height * (this.getPhotoFrameWidth() / photo.metadata.size.width));
|
this.navigation.hasPrev = photoIndex > 0;
|
||||||
|
this.navigation.hasNext = photoIndex + 1 < pcList.length;
|
||||||
|
|
||||||
|
const to = this.activePhoto.getDimension();
|
||||||
|
|
||||||
|
// if target image out of screen -> scroll to there
|
||||||
|
if (this.getBodyScrollTop() > to.top || this.getBodyScrollTop() + this.getPhotoFrameHeight() < to.top) {
|
||||||
|
this.setBodyScrollTop(to.top);
|
||||||
}
|
}
|
||||||
let top = (this.getPhotoFrameHeight() / 2 - height / 2);
|
|
||||||
let left = (this.getPhotoFrameWidth() / 2 - width / 2);
|
|
||||||
|
|
||||||
return <Dimension>{top: top, left: left, width: width, height: height};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
visibilityTimer = null;
|
|
||||||
|
|
||||||
@HostListener('mousemove')
|
@HostListener('mousemove')
|
||||||
onMousemove() {
|
onMousemove() {
|
||||||
@ -391,34 +403,32 @@ export class GalleryLightboxComponent implements OnDestroy {
|
|||||||
this.playBackState = 0;
|
this.playBackState = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public play() {
|
private findPhotoComponent(photo: any): GalleryPhotoComponent {
|
||||||
this.pause();
|
const galleryPhotoComponents = this.gridPhotoQL.toArray();
|
||||||
this.timerSub = this.timer.filter(t => t % 2 == 0).subscribe(() => {
|
for (let i = 0; i < galleryPhotoComponents.length; i++) {
|
||||||
if (this.photoElement.imageLoadFinished == false) {
|
if (galleryPhotoComponents[i].gridPhoto.photo === photo) {
|
||||||
return;
|
return galleryPhotoComponents[i];
|
||||||
}
|
}
|
||||||
if (this.navigation.hasNext) {
|
}
|
||||||
this.nextImage();
|
return null;
|
||||||
} else {
|
|
||||||
this.showPhoto(0);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.playBackState = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public fastForward() {
|
private calcLightBoxPhotoDimension(photo: PhotoDTO): Dimension {
|
||||||
this.pause();
|
let width = 0;
|
||||||
this.timerSub = this.timer.subscribe(() => {
|
let height = 0;
|
||||||
if (this.photoElement.imageLoadFinished == false) {
|
const photoAspect = photo.metadata.size.width / photo.metadata.size.height;
|
||||||
return;
|
const windowAspect = this.getPhotoFrameWidth() / this.getPhotoFrameHeight();
|
||||||
}
|
if (photoAspect < windowAspect) {
|
||||||
if (this.navigation.hasNext) {
|
width = Math.round(photo.metadata.size.width * (this.getPhotoFrameHeight() / photo.metadata.size.height));
|
||||||
this.nextImage();
|
height = this.getPhotoFrameHeight();
|
||||||
} else {
|
} else {
|
||||||
this.showPhoto(0);
|
width = this.getPhotoFrameWidth();
|
||||||
}
|
height = Math.round(photo.metadata.size.height * (this.getPhotoFrameWidth() / photo.metadata.size.width));
|
||||||
});
|
}
|
||||||
this.playBackState = 2;
|
const top = (this.getPhotoFrameHeight() / 2 - height / 2);
|
||||||
|
const left = (this.getPhotoFrameWidth() / 2 - width / 2);
|
||||||
|
|
||||||
|
return <Dimension>{top: top, left: left, width: width, height: height};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
.imgContainer img {
|
.imgContainer img {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.imgContainer {
|
|
||||||
justify-content: center; /* add to align horizontal */
|
|
||||||
align-items: center; /* add to align vertical */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -9,13 +9,13 @@ import {GridPhoto} from '../../grid/GridPhoto';
|
|||||||
export class GalleryLightboxPhotoComponent implements OnChanges {
|
export class GalleryLightboxPhotoComponent implements OnChanges {
|
||||||
|
|
||||||
@Input() gridPhoto: GridPhoto;
|
@Input() gridPhoto: GridPhoto;
|
||||||
@Input() loadImage: boolean = false;
|
@Input() loadImage = false;
|
||||||
@Input() windowAspect: number = 1;
|
@Input() windowAspect = 1;
|
||||||
|
|
||||||
public imageSize = {width: 'auto', height: '100'};
|
public imageSize = {width: 'auto', height: '100'};
|
||||||
|
|
||||||
imageLoaded: boolean = false;
|
imageLoaded = false;
|
||||||
public imageLoadFinished: boolean = false;
|
public imageLoadFinished = false;
|
||||||
|
|
||||||
constructor(public elementRef: ElementRef) {
|
constructor(public elementRef: ElementRef) {
|
||||||
}
|
}
|
||||||
@ -28,7 +28,7 @@ export class GalleryLightboxPhotoComponent implements OnChanges {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onImageError() {
|
onImageError() {
|
||||||
//TODO:handle error
|
// TODO:handle error
|
||||||
this.imageLoadFinished = true;
|
this.imageLoadFinished = true;
|
||||||
console.error('cant load image');
|
console.error('cant load image');
|
||||||
}
|
}
|
||||||
@ -40,16 +40,18 @@ export class GalleryLightboxPhotoComponent implements OnChanges {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public thumbnailPath(): string {
|
public thumbnailPath(): string {
|
||||||
if (this.gridPhoto.isThumbnailAvailable() === true)
|
if (this.gridPhoto.isThumbnailAvailable() === true) {
|
||||||
return this.gridPhoto.getThumbnailPath();
|
return this.gridPhoto.getThumbnailPath();
|
||||||
|
}
|
||||||
|
|
||||||
if (this.gridPhoto.isReplacementThumbnailAvailable() === true)
|
if (this.gridPhoto.isReplacementThumbnailAvailable() === true) {
|
||||||
return this.gridPhoto.getReplacementThumbnailPath();
|
return this.gridPhoto.getReplacementThumbnailPath();
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public showThumbnail(): boolean {
|
public showThumbnail(): boolean {
|
||||||
return this.gridPhoto && !this.imageLoaded &&
|
return this.gridPhoto /*&& !this.imageLoaded*/ &&
|
||||||
(this.gridPhoto.isThumbnailAvailable() || this.gridPhoto.isReplacementThumbnailAvailable());
|
(this.gridPhoto.isThumbnailAvailable() || this.gridPhoto.isReplacementThumbnailAvailable());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,8 +22,8 @@ export class AuthenticationService {
|
|||||||
private _networkService: NetworkService) {
|
private _networkService: NetworkService) {
|
||||||
this.user = new BehaviorSubject(null);
|
this.user = new BehaviorSubject(null);
|
||||||
|
|
||||||
//picking up session..
|
// picking up session..
|
||||||
if (this.isAuthenticated() == false && Cookie.get(CookieNames.session) != null) {
|
if (this.isAuthenticated() === false && Cookie.get(CookieNames.session) != null) {
|
||||||
if (typeof ServerInject !== 'undefined' && typeof ServerInject.user !== 'undefined') {
|
if (typeof ServerInject !== 'undefined' && typeof ServerInject.user !== 'undefined') {
|
||||||
this.user.next(ServerInject.user);
|
this.user.next(ServerInject.user);
|
||||||
}
|
}
|
||||||
@ -35,11 +35,11 @@ export class AuthenticationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_networkService.addGlobalErrorHandler((error: ErrorDTO) => {
|
_networkService.addGlobalErrorHandler((error: ErrorDTO) => {
|
||||||
if (error.code == ErrorCodes.NOT_AUTHENTICATED) {
|
if (error.code === ErrorCodes.NOT_AUTHENTICATED) {
|
||||||
this.user.next(null);
|
this.user.next(null);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (error.code == ErrorCodes.NOT_AUTHORISED) {
|
if (error.code === ErrorCodes.NOT_AUTHORISED) {
|
||||||
this.logout();
|
this.logout();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ export class NotificationService {
|
|||||||
this._authService.user.subscribe(() => {
|
this._authService.user.subscribe(() => {
|
||||||
if (this._authService.isAuthenticated() &&
|
if (this._authService.isAuthenticated() &&
|
||||||
(!this.lastUser ||
|
(!this.lastUser ||
|
||||||
this.lastUser.id != this._authService.user.value.id) &&
|
this.lastUser.id !== this._authService.user.value.id) &&
|
||||||
this._authService.user.value.role >= UserRoles.Guest) {
|
this._authService.user.value.role >= UserRoles.Guest) {
|
||||||
this.getServerNotifications();
|
this.getServerNotifications();
|
||||||
}
|
}
|
||||||
|
@ -10,21 +10,21 @@ import {IPrivateConfig} from '../../../../common/config/private/IPrivateConfig';
|
|||||||
import {I18n} from '@ngx-translate/i18n-polyfill';
|
import {I18n} from '@ngx-translate/i18n-polyfill';
|
||||||
|
|
||||||
|
|
||||||
export abstract class SettingsComponent<T, S extends AbstractSettingsService<T>=AbstractSettingsService<T>>
|
export abstract class SettingsComponent<T, S extends AbstractSettingsService<T>= AbstractSettingsService<T>>
|
||||||
implements OnInit, OnDestroy, OnChanges {
|
implements OnInit, OnDestroy, OnChanges {
|
||||||
|
|
||||||
@Input()
|
@Input()
|
||||||
public simplifiedMode: boolean = true;
|
public simplifiedMode = true;
|
||||||
|
|
||||||
@ViewChild('settingsForm')
|
@ViewChild('settingsForm')
|
||||||
form: HTMLFormElement;
|
form: HTMLFormElement;
|
||||||
|
|
||||||
@Output('hasAvailableSettings')
|
@Output('hasAvailableSettings')
|
||||||
hasAvailableSettings: boolean = true;
|
hasAvailableSettings = true;
|
||||||
|
|
||||||
public inProgress = false;
|
public inProgress = false;
|
||||||
public error: string = null;
|
public error: string = null;
|
||||||
public changed: boolean = false;
|
public changed = false;
|
||||||
private _subscription = null;
|
private _subscription = null;
|
||||||
private _settingsSubscription = null;
|
private _settingsSubscription = null;
|
||||||
|
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
import {Component} from '@angular/core';
|
import {Component, OnDestroy, OnInit} from '@angular/core';
|
||||||
import {IndexingSettingsService} from './indexing.settings.service';
|
import {IndexingSettingsService} from './indexing.settings.service';
|
||||||
import {AuthenticationService} from '../../model/network/authentication.service';
|
import {AuthenticationService} from '../../model/network/authentication.service';
|
||||||
import {NavigationService} from '../../model/navigation.service';
|
import {NavigationService} from '../../model/navigation.service';
|
||||||
import {NotificationService} from '../../model/notification.service';
|
import {NotificationService} from '../../model/notification.service';
|
||||||
import {ErrorDTO} from '../../../../common/entities/Error';
|
import {ErrorDTO} from '../../../../common/entities/Error';
|
||||||
import {Observable} from 'rxjs/Rx';
|
import {Observable} from 'rxjs/Observable';
|
||||||
|
import {interval} from 'rxjs/observable/interval';
|
||||||
import {IndexingConfig, ReIndexingSensitivity} from '../../../../common/config/private/IPrivateConfig';
|
import {IndexingConfig, ReIndexingSensitivity} from '../../../../common/config/private/IPrivateConfig';
|
||||||
import {SettingsComponent} from '../_abstract/abstract.settings.component';
|
import {SettingsComponent} from '../_abstract/abstract.settings.component';
|
||||||
import {Utils} from '../../../../common/Utils';
|
import {Utils} from '../../../../common/Utils';
|
||||||
@ -17,7 +18,8 @@ import {I18n} from '@ngx-translate/i18n-polyfill';
|
|||||||
'./../_abstract/abstract.settings.component.css'],
|
'./../_abstract/abstract.settings.component.css'],
|
||||||
providers: [IndexingSettingsService],
|
providers: [IndexingSettingsService],
|
||||||
})
|
})
|
||||||
export class IndexingSettingsComponent extends SettingsComponent<IndexingConfig, IndexingSettingsService> {
|
export class IndexingSettingsComponent extends SettingsComponent<IndexingConfig, IndexingSettingsService>
|
||||||
|
implements OnInit, OnDestroy {
|
||||||
|
|
||||||
|
|
||||||
types: Array<any> = [];
|
types: Array<any> = [];
|
||||||
@ -37,7 +39,7 @@ export class IndexingSettingsComponent extends SettingsComponent<IndexingConfig,
|
|||||||
}
|
}
|
||||||
if ((<IndexingSettingsService>this._settingsService).progress.value != null && this.subscription.timer == null) {
|
if ((<IndexingSettingsService>this._settingsService).progress.value != null && this.subscription.timer == null) {
|
||||||
if (!this.$counter) {
|
if (!this.$counter) {
|
||||||
this.$counter = Observable.interval(5000);
|
this.$counter = interval(5000);
|
||||||
}
|
}
|
||||||
this.subscription.timer = this.$counter.subscribe((x) => this.updateProgress());
|
this.subscription.timer = this.$counter.subscribe((x) => this.updateProgress());
|
||||||
}
|
}
|
||||||
@ -54,7 +56,13 @@ export class IndexingSettingsComponent extends SettingsComponent<IndexingConfig,
|
|||||||
notification: NotificationService,
|
notification: NotificationService,
|
||||||
i18n: I18n) {
|
i18n: I18n) {
|
||||||
|
|
||||||
super(i18n('Indexing'), _authService, _navigation, <any>_settingsService, notification, i18n, s => s.Server.indexing);
|
super(i18n('Indexing'),
|
||||||
|
_authService,
|
||||||
|
_navigation,
|
||||||
|
<any>_settingsService,
|
||||||
|
notification,
|
||||||
|
i18n,
|
||||||
|
s => s.Server.indexing);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ export class IndexingSettingsService extends AbstractSettingsService<IndexingCon
|
|||||||
|
|
||||||
|
|
||||||
public isSupported(): boolean {
|
public isSupported(): boolean {
|
||||||
return this._settingsService.settings.value.Server.database.type != DatabaseType.memory;
|
return this._settingsService.settings.value.Server.database.type !== DatabaseType.memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public index() {
|
public index() {
|
||||||
|
13
gulpfile.js
13
gulpfile.js
@ -30,12 +30,17 @@ var createFrontendTask = function (type, script) {
|
|||||||
gulp.task('build-frontend', function (done) {
|
gulp.task('build-frontend', function (done) {
|
||||||
var languages = getLanguages();
|
var languages = getLanguages();
|
||||||
var tasks = [];
|
var tasks = [];
|
||||||
createFrontendTask('build-frontend-release default', "ng build --aot -prod --output-path=./release/dist --no-progress --locale=en" +
|
createFrontendTask('build-frontend-release default',
|
||||||
" --i18n-format xlf --i18n-file frontend/" + translationFolder + "/messages.en.xlf" + " --missing-translation warning");
|
"ng build --aot -prod --output-path=./release/dist --no-progress --locale=en" +
|
||||||
|
" --i18n-format xlf --i18n-file frontend/" + translationFolder + "/messages.en.xlf" +
|
||||||
|
" --missing-translation warning");
|
||||||
tasks.push('build-frontend-release default');
|
tasks.push('build-frontend-release default');
|
||||||
for (var i = 0; i < languages.length; i++) {
|
for (var i = 0; i < languages.length; i++) {
|
||||||
createFrontendTask('build-frontend-release ' + languages[i], "ng build --aot -prod --output-path=./release/dist/" + languages[i] + " --no-progress --locale=" + languages[i] +
|
createFrontendTask('build-frontend-release ' + languages[i],
|
||||||
" --i18n-format xlf --i18n-file frontend/" + translationFolder + "/messages." + languages[i] + ".xlf" + " --missing-translation warning");
|
"ng build --aot -prod --output-path=./release/dist/" + languages[i] +
|
||||||
|
" --no-progress --locale=" + languages[i] +
|
||||||
|
" --i18n-format xlf --i18n-file frontend/" + translationFolder + "/messages." + languages[i] + ".xlf" +
|
||||||
|
" --missing-translation warning");
|
||||||
tasks.push('build-frontend-release ' + languages[i]);
|
tasks.push('build-frontend-release ' + languages[i]);
|
||||||
}
|
}
|
||||||
tasks.push(function () {
|
tasks.push(function () {
|
||||||
|
66
package.json
66
package.json
@ -32,7 +32,7 @@
|
|||||||
"body-parser": "1.18.2",
|
"body-parser": "1.18.2",
|
||||||
"cookie-parser": "^1.4.3",
|
"cookie-parser": "^1.4.3",
|
||||||
"cookie-session": "2.0.0-beta.3",
|
"cookie-session": "2.0.0-beta.3",
|
||||||
"ejs": "2.5.8",
|
"ejs": "2.5.9",
|
||||||
"express": "4.16.3",
|
"express": "4.16.3",
|
||||||
"jimp": "0.2.28",
|
"jimp": "0.2.28",
|
||||||
"locale": "0.1.0",
|
"locale": "0.1.0",
|
||||||
@ -42,38 +42,38 @@
|
|||||||
"ts-exif-parser": "0.1.23",
|
"ts-exif-parser": "0.1.23",
|
||||||
"ts-node-iptc": "1.0.9",
|
"ts-node-iptc": "1.0.9",
|
||||||
"typeconfig": "1.0.6",
|
"typeconfig": "1.0.6",
|
||||||
"typeorm": "0.1.19",
|
"typeorm": "0.2.4",
|
||||||
"winston": "2.4.1"
|
"winston": "2.4.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@agm/core": "^1.0.0-beta.2",
|
"@agm/core": "^1.0.0-beta.2",
|
||||||
"@angular/animations": "^5.2.9",
|
"@angular/animations": "^5.2.10",
|
||||||
"@angular/cli": "1.7.3",
|
"@angular/cli": "1.7.4",
|
||||||
"@angular/common": "~5.2.9",
|
"@angular/common": "~5.2.10",
|
||||||
"@angular/compiler": "~5.2.9",
|
"@angular/compiler": "~5.2.10",
|
||||||
"@angular/compiler-cli": "^5.2.9",
|
"@angular/compiler-cli": "^5.2.10",
|
||||||
"@angular/core": "~5.2.9",
|
"@angular/core": "~5.2.10",
|
||||||
"@angular/forms": "~5.2.9",
|
"@angular/forms": "~5.2.10",
|
||||||
"@angular/http": "~5.2.9",
|
"@angular/http": "~5.2.10",
|
||||||
"@angular/language-service": "^5.2.9",
|
"@angular/language-service": "^5.2.10",
|
||||||
"@angular/platform-browser": "~5.2.9",
|
"@angular/platform-browser": "~5.2.10",
|
||||||
"@angular/platform-browser-dynamic": "~5.2.9",
|
"@angular/platform-browser-dynamic": "~5.2.10",
|
||||||
"@angular/router": "~5.2.9",
|
"@angular/router": "~5.2.10",
|
||||||
"@ngx-translate/i18n-polyfill": "^0.1.2",
|
"@ngx-translate/i18n-polyfill": "^0.1.3",
|
||||||
"@types/bcryptjs": "^2.4.1",
|
"@types/bcryptjs": "^2.4.1",
|
||||||
"@types/chai": "^4.1.2",
|
"@types/chai": "^4.1.3",
|
||||||
"@types/cookie-session": "^2.0.34",
|
"@types/cookie-session": "^2.0.34",
|
||||||
"@types/express": "^4.11.1",
|
"@types/express": "^4.11.1",
|
||||||
"@types/gm": "^1.17.33",
|
"@types/gm": "^1.17.33",
|
||||||
"@types/jasmine": "^2.8.6",
|
"@types/jasmine": "^2.8.6",
|
||||||
"@types/jimp": "^0.2.28",
|
"@types/jimp": "^0.2.28",
|
||||||
"@types/node": "^9.6.1",
|
"@types/node": "^10.0.3",
|
||||||
"@types/sharp": "^0.17.7",
|
"@types/sharp": "^0.17.8",
|
||||||
"@types/winston": "^2.3.8",
|
"@types/winston": "^2.3.9",
|
||||||
"bootstrap": "3.3.7",
|
"bootstrap": "3.3.7",
|
||||||
"chai": "^4.1.2",
|
"chai": "^4.1.2",
|
||||||
"codelyzer": "~4.2.1",
|
"codelyzer": "~4.3.0",
|
||||||
"core-js": "^2.5.4",
|
"core-js": "^2.5.5",
|
||||||
"ejs-loader": "^0.3.1",
|
"ejs-loader": "^0.3.1",
|
||||||
"gulp": "^3.9.1",
|
"gulp": "^3.9.1",
|
||||||
"gulp-json-modify": "^1.0.2",
|
"gulp-json-modify": "^1.0.2",
|
||||||
@ -84,38 +84,38 @@
|
|||||||
"jasmine-core": "^3.1.0",
|
"jasmine-core": "^3.1.0",
|
||||||
"jasmine-spec-reporter": "~4.2.1",
|
"jasmine-spec-reporter": "~4.2.1",
|
||||||
"jw-bootstrap-switch-ng2": "1.0.10",
|
"jw-bootstrap-switch-ng2": "1.0.10",
|
||||||
"karma": "^2.0.0",
|
"karma": "^2.0.2",
|
||||||
"karma-chrome-launcher": "^2.2.0",
|
"karma-chrome-launcher": "^2.2.0",
|
||||||
"karma-cli": "^1.0.1",
|
"karma-cli": "^1.0.1",
|
||||||
"karma-coverage-istanbul-reporter": "^1.4.2",
|
"karma-coverage-istanbul-reporter": "^1.4.2",
|
||||||
"karma-jasmine": "^1.1.1",
|
"karma-jasmine": "^1.1.2",
|
||||||
"karma-jasmine-html-reporter": "^1.0.0",
|
"karma-jasmine-html-reporter": "^1.0.0",
|
||||||
"karma-phantomjs-launcher": "^1.0.4",
|
"karma-phantomjs-launcher": "^1.0.4",
|
||||||
"karma-remap-istanbul": "^0.6.0",
|
"karma-remap-istanbul": "^0.6.0",
|
||||||
"karma-systemjs": "^0.16.0",
|
"karma-systemjs": "^0.16.0",
|
||||||
"merge2": "^1.2.1",
|
"merge2": "^1.2.1",
|
||||||
"mocha": "^5.0.5",
|
"mocha": "^5.1.1",
|
||||||
"ng2-cookies": "^1.0.12",
|
"ng2-cookies": "^1.0.12",
|
||||||
"ng2-slim-loading-bar": "^4.0.0",
|
"ng2-slim-loading-bar": "^4.0.0",
|
||||||
"ng2-toastr": "^4.1.2",
|
"ng2-toastr": "^4.1.2",
|
||||||
"ngx-bootstrap": "^2.0.3",
|
"ngx-bootstrap": "^2.0.4",
|
||||||
"ngx-clipboard": "^10.0.0",
|
"ngx-clipboard": "^10.0.0",
|
||||||
"protractor": "^5.3.0",
|
"protractor": "^5.3.1",
|
||||||
"remap-istanbul": "^0.11.0",
|
"remap-istanbul": "^0.11.1",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
"run-sequence": "^2.2.1",
|
"run-sequence": "^2.2.1",
|
||||||
"rxjs": "^5.5.8",
|
"rxjs": "5.5.8",
|
||||||
"ts-helpers": "^1.1.2",
|
"ts-helpers": "^1.1.2",
|
||||||
"ts-node": "~5.0.1",
|
"ts-node": "~6.0.2",
|
||||||
"tslint": "^5.9.1",
|
"tslint": "^5.9.1",
|
||||||
"typescript": "^2.8.1",
|
"typescript": "^2.8.3",
|
||||||
"xlf-google-translate": "^1.0.0-beta.8",
|
"xlf-google-translate": "^1.0.0-beta.8",
|
||||||
"zone.js": "git://github.com/JiaLiPassion/zone.js#jasmine-dist"
|
"zone.js": "git://github.com/JiaLiPassion/zone.js#jasmine-dist"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"bcrypt": "^1.0.3",
|
"bcrypt": "^2.0.1",
|
||||||
"gm": "^1.23.1",
|
"gm": "^1.23.1",
|
||||||
"sharp": "^0.20.1"
|
"sharp": "^0.20.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 6.9"
|
"node": ">= 6.9"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user