migrating to bootstrap v4

This commit is contained in:
Patrik J. Braun 2018-05-13 16:59:57 -04:00
parent b7d9b21e9e
commit b3b3e63967
52 changed files with 762 additions and 648 deletions

View File

@ -21,6 +21,7 @@
"styles": [ "styles": [
"../node_modules/ng2-toastr/bundles/ng2-toastr.min.css", "../node_modules/ng2-toastr/bundles/ng2-toastr.min.css",
"../node_modules/bootstrap/dist/css/bootstrap.css", "../node_modules/bootstrap/dist/css/bootstrap.css",
"../node_modules/open-iconic/font/css/open-iconic-bootstrap.css",
"styles.css" "styles.css"
], ],
"scripts": [], "scripts": [],

View File

@ -3,7 +3,6 @@
[![Build Status](https://travis-ci.org/bpatrik/pigallery2.svg?branch=master)](https://travis-ci.org/bpatrik/pigallery2) [![Build Status](https://travis-ci.org/bpatrik/pigallery2.svg?branch=master)](https://travis-ci.org/bpatrik/pigallery2)
[![Coverage Status](https://coveralls.io/repos/github/bpatrik/PiGallery2/badge.svg?branch=master)](https://coveralls.io/github/bpatrik/PiGallery2?branch=master) [![Coverage Status](https://coveralls.io/repos/github/bpatrik/PiGallery2/badge.svg?branch=master)](https://coveralls.io/github/bpatrik/PiGallery2?branch=master)
[![Heroku](https://heroku-badge.herokuapp.com/?app=pigallery2&style=flat)](https://pigallery2.herokuapp.com) [![Heroku](https://heroku-badge.herokuapp.com/?app=pigallery2&style=flat)](https://pigallery2.herokuapp.com)
[![Code Climate](https://codeclimate.com/github/bpatrik/pigallery2/badges/gpa.svg)](https://codeclimate.com/github/bpatrik/pigallery2)
[![Dependency Status](https://david-dm.org/bpatrik/pigallery2.svg)](https://david-dm.org/bpatrik/pigallery2) [![Dependency Status](https://david-dm.org/bpatrik/pigallery2.svg)](https://david-dm.org/bpatrik/pigallery2)
[![devDependency Status](https://david-dm.org/bpatrik/pigallery2/dev-status.svg)](https://david-dm.org/bpatrik/pigallery2#info=devDependencies) [![devDependency Status](https://david-dm.org/bpatrik/pigallery2/dev-status.svg)](https://david-dm.org/bpatrik/pigallery2#info=devDependencies)

View File

@ -18,7 +18,6 @@ export class GalleryMWs {
public static async listDirectory(req: Request, res: Response, next: NextFunction) { public static async listDirectory(req: Request, res: Response, next: NextFunction) {
console.log('listDirectory');
const directoryName = req.params.directory || '/'; const directoryName = req.params.directory || '/';
const absoluteDirectoryName = path.join(ProjectPath.ImageFolder, directoryName); const absoluteDirectoryName = path.join(ProjectPath.ImageFolder, directoryName);
@ -34,8 +33,6 @@ export class GalleryMWs {
req.resultPipe = new ContentWrapper(null, null, true); req.resultPipe = new ContentWrapper(null, null, true);
return next(); return next();
} }
console.log(req.session.user);
console.log(directory);
if (req.session.user.permissions && if (req.session.user.permissions &&
req.session.user.permissions.length > 0 && req.session.user.permissions.length > 0 &&
req.session.user.permissions[0] !== '/*') { req.session.user.permissions[0] !== '/*') {

View File

@ -100,11 +100,6 @@ export class Server {
keys: ['key1' + s4() + s4() + s4() + s4(), 'key2' + s4() + s4() + s4() + s4(), 'key3' + s4() + s4() + s4() + s4()] keys: ['key1' + s4() + s4() + s4() + s4(), 'key2' + s4() + s4() + s4() + s4(), 'key3' + s4() + s4() + s4() + s4()]
})); }));
/* this.app.use((req: Request, res: Response, next: NextFunction) => {
res.setHeader('Accept-Ranges', 'none');
res.setHeader('Connection', 'close');
next();
});*/
/** /**
* Parse parameters in POST * Parse parameters in POST

View File

@ -44,5 +44,17 @@ export interface GPSMetadata {
latitude?: number; latitude?: number;
longitude?: number; longitude?: number;
altitude?: number; altitude?: number;
}
export module PhotoDTO {
export const hasPositionData = (photo: PhotoDTO): boolean => {
return !!photo.metadata.positionData &&
!!(photo.metadata.positionData.city ||
photo.metadata.positionData.state ||
photo.metadata.positionData.country ||
(photo.metadata.positionData.GPSData &&
photo.metadata.positionData.GPSData.altitude &&
photo.metadata.positionData.GPSData.latitude &&
photo.metadata.positionData.GPSData.longitude));
};
} }

View File

@ -1,11 +1,11 @@
<app-frame> <app-frame>
<div body class="container"> <div body class="container">
<div class="panel panel-default" *ngIf="notificationService.notifications.length>0"> <div class="card mb-4" *ngIf="notificationService.notifications.length>0">
<div class="panel-heading"> <h5 class="card-header" i18n>
<h3 class="panel-title" i18n>Server notifications</h3> Server notifications
</div> </h5>
<div class="panel-body"> <div class="card-body">
<ng-container *ngFor="let notification of notificationService.notifications"> <ng-container *ngFor="let notification of notificationService.notifications">
<div class="alert alert-{{getCss(notification.type)}}" role="alert"> <div class="alert alert-{{getCss(notification.type)}}" role="alert">
@ -16,28 +16,26 @@
</ng-container> </ng-container>
</div> </div>
<div class="panel-footer" i18n> <div class="card-footer" i18n>
To dismiss these notifications, restart the server. To dismiss these notifications, restart the server.
</div> </div>
</div> </div>
<div class="form-horizontal"> <div class="form-horizontal">
<div class="form-group"> <div class="form-group d-flex justify-content-end">
<label class="col-sm-10 col-xs-8 control-label" for="simplifiedMode" i18n>Mode</label> <label class="control-label align-self-end mr-2" for="simplifiedMode" i18n>Mode</label>
<div class="col-sm-2 col-xs-4"> <bSwitch
<bSwitch id="simplifiedMode"
id="simplifiedMode" class="switch"
class="switch" name="simplifiedMode"
name="simplifiedMode" [switch-off-color]="'warning'"
[switch-off-color]="'warning'" [switch-on-color]="'primary'"
[switch-on-color]="'primary'" [switch-inverse]="'inverse'"
[switch-inverse]="'inverse'" [switch-off-text]="text.Advanced"
[switch-off-text]="text.Advanced" [switch-on-text]="text.Simplified"
[switch-on-text]="text.Simplified" [switch-handle-width]="'100'"
[switch-handle-width]="'100'" [switch-label-width]="'20'"
[switch-label-width]="'20'" [(ngModel)]="simplifiedMode">
[(ngModel)]="simplifiedMode"> </bSwitch>
</bSwitch>
</div>
</div> </div>
</div> </div>
<app-settings-basic [simplifiedMode]="simplifiedMode"></app-settings-basic> <app-settings-basic [simplifiedMode]="simplifiedMode"></app-settings-basic>

View File

@ -47,6 +47,7 @@ import {InfoPanelLightboxComponent} from './gallery/lightbox/infopanel/info-pane
import {MapSettingsComponent} from './settings/map/map.settings.component'; import {MapSettingsComponent} from './settings/map/map.settings.component';
import {TooltipModule} from 'ngx-bootstrap/tooltip'; import {TooltipModule} from 'ngx-bootstrap/tooltip';
import {BsDropdownModule} from 'ngx-bootstrap/dropdown'; import {BsDropdownModule} from 'ngx-bootstrap/dropdown';
import {CollapseModule} from 'ngx-bootstrap/collapse';
import {ThumbnailSettingsComponent} from './settings/thumbnail/thumbanil.settings.component'; import {ThumbnailSettingsComponent} from './settings/thumbnail/thumbanil.settings.component';
import {SearchSettingsComponent} from './settings/search/search.settings.component'; import {SearchSettingsComponent} from './settings/search/search.settings.component';
import {SettingsService} from './settings/settings.service'; import {SettingsService} from './settings/settings.service';
@ -90,6 +91,7 @@ export class CustomUrlSerializer implements UrlSerializer {
} }
} }
// use the require method provided by webpack
declare const require; declare const require;
export function translationsFactory(locale: string) { export function translationsFactory(locale: string) {
@ -109,6 +111,7 @@ export function translationsFactory(locale: string) {
TooltipModule.forRoot(), TooltipModule.forRoot(),
ToastModule.forRoot(), ToastModule.forRoot(),
ModalModule.forRoot(), ModalModule.forRoot(),
CollapseModule.forRoot(),
BsDropdownModule.forRoot(), BsDropdownModule.forRoot(),
AgmCoreModule.forRoot(), AgmCoreModule.forRoot(),
SlimLoadingBarModule.forRoot() SlimLoadingBarModule.forRoot()
@ -168,7 +171,13 @@ export function translationsFactory(locale: string) {
useFactory: translationsFactory, useFactory: translationsFactory,
deps: [LOCALE_ID] deps: [LOCALE_ID]
}, },
I18n I18n,
/*
{provide: TRANSLATIONS, useValue: translationsFactory('en')},
{provide: TRANSLATIONS_FORMAT, useValue: 'xlf'},
{provide: LOCALE_ID, useValue: 'en'},
{provide: MISSING_TRANSLATION_STRATEGY, useValue: MissingTranslationStrategy.Ignore},
*/
], ],
bootstrap: [AppComponent] bootstrap: [AppComponent]
}) })

View File

@ -1,3 +1,7 @@
nav {
z-index: 999;
}
.navbar { .navbar {
margin-bottom: 20px; margin-bottom: 20px;
} }
@ -18,7 +22,7 @@ ng2-slim-loading-bar {
.admin-link { .admin-link {
padding-bottom: 0; padding-bottom: 0;
padding-left: 0; padding-left: 0;
font-size: 20px; font-size: 18px;
} }
.divider-vertical:first-child { .divider-vertical:first-child {
@ -26,10 +30,8 @@ ng2-slim-loading-bar {
} }
.navbar .divider-vertical { .navbar .divider-vertical {
height: 30px; margin: 5px 10px;
margin: 10px; border-left: 1px solid rgba(255, 255, 255, 0.5);
border-right: 1px solid #ffffff;
border-left: 1px solid #f2f2f2;
} }
.navbar-inverse .divider-vertical { .navbar-inverse .divider-vertical {
@ -61,5 +63,9 @@ ng2-slim-loading-bar {
app-language { app-language {
display: block; display: block;
margin-right: 10px; }
.navbar-expand .navbar-nav .nav-link {
padding-right: 1.0rem;
padding-left: 1.0rem;
} }

View File

@ -1,55 +1,47 @@
<ng2-slim-loading-bar [color]="'#337ab7'" [height]="'3px'"></ng2-slim-loading-bar> <ng2-slim-loading-bar [color]="'#337ab7'" [height]="'3px'"></ng2-slim-loading-bar>
<nav class="navbar navbar-inverse navbar-static-top"> <nav class="navbar navbar-dark bg-dark navbar-expand-md">
<div class="container"> <a class="navbar-brand" [routerLink]="['/gallery','/']"
<div class="navbar-header"> [queryParams]="_shareService.isSharing() ? { sk: _shareService.getSharingKey() }:{}">
<button type="button" class="navbar-toggle collapsed" <img src="assets/icon_inv.png" width="30" height="30" class="d-inline-block align-top" alt="">
data-toggle="collapse" data-target="#navbar" <strong>{{title}}</strong>
aria-expanded="false" aria-controls="navbar" </a>
(click)="toggleState()"> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav"
<span class="sr-only">Toggle navigation</span> aria-expanded="false" aria-label="Toggle navigation" (click)="toggleState()">
<span class="icon-bar"></span> <span class="navbar-toggler-icon"></span>
<span class="icon-bar"></span> </button>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" [routerLink]="['/gallery','/']"><img src="assets/icon_inv.png"
style="max-height: 26px; display: inline;"/>
{{title}}</a>
</div>
<div id="navbar" class="collapse navbar-collapse" [ngClass]="{ 'in': isIn }">
<ul class="nav navbar-nav">$
</ul>
<ul class="nav navbar-nav navbar-right"> <div class="collapse navbar-collapse" id="navbarNav" [collapse]="collapsed">
<ng-content select="[navbar]"></ng-content> <ul class="navbar-nav navbar-right ml-auto">
<li class="divider-vertical"> <ng-content select="[navbar]"></ng-content>
</li> <li class="nav-item divider-vertical">
<li *ngIf="authenticationRequired"> </li>
<p class="navbar-text" *ngIf="user.value"> <li class="nav-item mr-2 ml-2" *ngIf="authenticationRequired" style=" white-space: nowrap;">
<span class="glyphicon glyphicon-user" aria-hidden="true"></span> {{user.value.name}}</p> <span class="navbar-text" *ngIf="user.value">
</li> <span class="oi oi-person"></span> {{user.value.name}}</span>
<li *ngIf="isAdmin()"> </li>
<a style="cursor: pointer" <li class="nav-item" *ngIf="isAdmin()">
class="admin-link" <a style="cursor: pointer;"
[routerLink]="['/admin']"> class="nav-link admin-link"
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> [routerLink]="['/admin']">
<span *ngIf="notificationService.notifications.length>0" class="badge">{{notificationService.notifications.length}}</span> <span class="oi oi-wrench"></span>
</a> <span *ngIf="notificationService.notifications.length>0" class="badge">{{notificationService.notifications.length}}</span>
</li> </a>
<li> </li>
<app-language class="navbar-btn" isDark="true"></app-language> <li class="nav-item ml-2">
</li> <app-language class="navbar-btn" isDark="true"></app-language>
<li *ngIf="authenticationRequired"> </li>
<button class="btn btn-default navbar-btn" <li class="nav-item ml-2" *ngIf="authenticationRequired">
style="cursor: pointer" <button class="btn btn-default navbar-btn"
(click)="logout()"> style="cursor: pointer"
<ng-container i18n>Logout</ng-container> (click)="logout()">
<span class="glyphicon glyphicon-log-out" aria-hidden="true"></span> <span class="oi oi-account-logout"></span>
</button> <ng-container i18n>Logout</ng-container>
</li> </button>
</ul> </li>
</ul>
</div><!--/.nav-collapse --> </div><!--/.nav-collapse -->
</div>
</nav> </nav>
<ng-content select="[body]"></ng-content> <ng-content select="[body]"></ng-content>

View File

@ -5,6 +5,7 @@ import {UserDTO, UserRoles} from '../../../common/entities/UserDTO';
import {Config} from '../../../common/config/public/Config'; import {Config} from '../../../common/config/public/Config';
import {BehaviorSubject} from 'rxjs/BehaviorSubject'; import {BehaviorSubject} from 'rxjs/BehaviorSubject';
import {NotificationService} from '../model/notification.service'; import {NotificationService} from '../model/notification.service';
import {ShareService} from '../gallery/share.service';
@Component({ @Component({
selector: 'app-frame', selector: 'app-frame',
@ -18,17 +19,18 @@ export class FrameComponent {
user: BehaviorSubject<UserDTO>; user: BehaviorSubject<UserDTO>;
authenticationRequired = false; authenticationRequired = false;
public title: string; public title: string;
isIn = false; collapsed = true;
constructor(private _authService: AuthenticationService, constructor(private _authService: AuthenticationService,
public notificationService: NotificationService) { public notificationService: NotificationService,
public _shareService: ShareService) {
this.user = this._authService.user; this.user = this._authService.user;
this.authenticationRequired = Config.Client.authenticationRequired; this.authenticationRequired = Config.Client.authenticationRequired;
this.title = Config.Client.applicationTitle; this.title = Config.Client.applicationTitle;
} }
toggleState() { // click handler toggleState() { // click handler
this.isIn = !this.isIn; this.collapsed = !this.collapsed;
} }
isAdmin() { isAdmin() {

View File

@ -57,6 +57,10 @@ export class Photo extends IconPhoto {
} }
hasPositionData(): boolean {
return PhotoDTO.hasPositionData(this.photo);
}
getThumbnailPath() { getThumbnailPath() {
const size = this.getThumbnailSize(); const size = this.getThumbnailSize();
return Utils.concatUrls(Config.Client.urlBase, return Utils.concatUrls(Config.Client.urlBase,

View File

@ -9,9 +9,8 @@
<div class="photo" *ngIf="thumbnail && thumbnail.Available" <div class="photo" *ngIf="thumbnail && thumbnail.Available"
[style.background-image]="getSanitizedThUrl()"></div> [style.background-image]="getSanitizedThUrl()"></div>
<span *ngIf="!thumbnail || !thumbnail.Available" class="glyphicon glyphicon-folder-open no-image" <span *ngIf="!thumbnail || !thumbnail.Available" class="oi oi-folder no-image"
aria-hidden="true"> aria-hidden="true">
</span> </span>
</div> </div>
<!--Info box --> <!--Info box -->

View File

@ -3,25 +3,25 @@
<ng-container navbar> <ng-container navbar>
<li *ngIf="countDown"> <li class="nav-item" *ngIf="countDown">
<p class="navbar-text"> <span class="navbar-text">
<ng-container i18n>Link availability</ng-container> <ng-container i18n>Link availability</ng-container>
: {{countDown.day}} : {{countDown.day}}
<ng-container i18n>days</ng-container> <ng-container i18n>days</ng-container>
, ,
{{("0"+countDown.hour).slice(-2)}}:{{("0"+countDown.minute).slice(-2)}}:{{("0"+countDown.second).slice(-2)}} {{("0"+countDown.hour).slice(-2)}}:{{("0"+countDown.minute).slice(-2)}}:{{("0"+countDown.second).slice(-2)}}
</p> </span>
</li> </li>
<li *ngIf="showSearchBar"> <li class="nav-item" *ngIf="showSearchBar">
<app-gallery-search #search></app-gallery-search> <app-gallery-search #search></app-gallery-search>
</li> </li>
<li *ngIf="showShare"> <li class="nav-item" *ngIf="showShare">
<app-gallery-share></app-gallery-share> <app-gallery-share></app-gallery-share>
</li> </li>
</ng-container> </ng-container>
<div body class="container" style="width: 100%; padding:0" *ngIf="_galleryService.content.value.directory"> <div body class="container-fluid" style="width: 100%; padding:0" *ngIf="_galleryService.content.value.directory">
<app-gallery-navbar [directory]="_galleryService.content.value.directory"></app-gallery-navbar> <app-gallery-navbar [directory]="_galleryService.content.value.directory"></app-gallery-navbar>
<div class="directories"> <div class="directories">
@ -34,7 +34,7 @@
[lightbox]="lightbox"></app-gallery-grid> [lightbox]="lightbox"></app-gallery-grid>
</div> </div>
<div body class="container" style="width: 100%; padding:0" *ngIf="_galleryService.content.value.searchResult"> <div body class="container-fluid" style="width: 100%; padding:0" *ngIf="_galleryService.content.value.searchResult">
<div class="alert alert-info" role="alert" <div class="alert alert-info" role="alert"
*ngIf="_galleryService.content.value.searchResult.resultOverflow == true" i18n> *ngIf="_galleryService.content.value.searchResult.resultOverflow == true" i18n>
Too many results to show. Refine your search. Too many results to show. Refine your search.
@ -43,10 +43,10 @@
<li class="active"> <li class="active">
<ng-container i18n>Searching for:</ng-container> <ng-container i18n>Searching for:</ng-container>
<span [ngSwitch]="_galleryService.content.value.searchResult.searchType"> <span [ngSwitch]="_galleryService.content.value.searchResult.searchType">
<span *ngSwitchCase="0" class="glyphicon glyphicon-picture"></span> <span *ngSwitchCase="SearchTypes.image" class="oi oi-image"></span>
<span *ngSwitchCase="1" class="glyphicon glyphicon-folder-open"></span> <span *ngSwitchCase="SearchTypes.directory" class="oi oi-folder"></span>
<span *ngSwitchCase="2" class="glyphicon glyphicon-tag"></span> <span *ngSwitchCase="SearchTypes.keyword" class="oi oi-tag"></span>
<span *ngSwitchCase="3" class="glyphicon glyphicon-map-marker"></span> <span *ngSwitchCase="SearchTypes.position" class="oi oi-map-marker"></span>
</span> </span>
<strong>{{_galleryService.content.value.searchResult.searchText}}</strong> <strong>{{_galleryService.content.value.searchResult.searchText}}</strong>
</li> </li>

View File

@ -37,6 +37,7 @@ export class GalleryComponent implements OnInit, OnDestroy {
}; };
public countDown = null; public countDown = null;
public mapEnabled = true; public mapEnabled = true;
SearchTypes: any = [];
constructor(public _galleryService: GalleryService, constructor(public _galleryService: GalleryService,
private _authService: AuthenticationService, private _authService: AuthenticationService,
@ -45,6 +46,7 @@ export class GalleryComponent implements OnInit, OnDestroy {
private _route: ActivatedRoute, private _route: ActivatedRoute,
private _navigation: NavigationService) { private _navigation: NavigationService) {
this.mapEnabled = Config.Client.Map.enabled; this.mapEnabled = Config.Client.Map.enabled;
this.SearchTypes = SearchTypes;
PageHelper.showScrollY(); PageHelper.showScrollY();
} }

View File

@ -1,6 +1,6 @@
<div class="static" *ngIf="animate == false"> <div class="static" *ngIf="animate == false">
<span class="glyphicon" <span class="oi"
[ngClass]="error ? 'glyphicon-warning-sign' : 'glyphicon-picture'" aria-hidden="true"> [ngClass]="error ? 'oi-warning' : 'oi-image'" aria-hidden="true">
</span> </span>
</div> </div>
<div class="sk-cube-grid animate" *ngIf="animate == true"> <div class="sk-cube-grid animate" *ngIf="animate == true">

View File

@ -15,8 +15,8 @@
[style.width.px]="container.nativeElement.offsetWidth"> [style.width.px]="container.nativeElement.offsetWidth">
<div class="photo-name">{{gridPhoto.photo.name}}</div> <div class="photo-name">{{gridPhoto.photo.name}}</div>
<div class="photo-position" *ngIf="gridPhoto.photo.metadata.positionData"> <div class="photo-position" *ngIf="gridPhoto.hasPositionData()">
<span class="glyphicon glyphicon-map-marker"></span> <span class="oi oi-map-marker"></span>
<ng-template [ngIf]="getPositionText()"> <ng-template [ngIf]="getPositionText()">
<a [routerLink]="['/search', getPositionText(), {type:SearchTypes[SearchTypes.position]}]" <a [routerLink]="['/search', getPositionText(), {type:SearchTypes[SearchTypes.position]}]"
*ngIf="searchEnabled"> *ngIf="searchEnabled">

View File

@ -69,6 +69,7 @@ export class GalleryPhotoComponent implements IRenderable, OnInit, OnDestroy {
} }
} }
getPositionText(): string { getPositionText(): string {
if (!this.gridPhoto) { if (!this.gridPhoto) {
return ''; return '';

View File

@ -21,6 +21,8 @@
.details-sub { .details-sub {
color: #555; color: #555;
padding: 0;
font-size: 0.875rem;
} }
.details-sub div { .details-sub div {
@ -39,7 +41,6 @@
} }
.close { .close {
margin-top: 5px; margin: 0;
margin-right: 12px; font-size: 1.2rem;
font-size: 36px;
} }

View File

@ -1,74 +1,75 @@
<div class="content"> <div class="content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" (click)="close()" aria-label="Close"><span <h2 class="modal-title" i18n>Info</h2>
aria-hidden="true">&times;</span></button> <button type="button" class="close" (click)="close()" aria-label="Close">
<h1 class="modal-title" i18n>Info</h1> <span class="oi oi-x" aria-hidden="true"></span>
</button>
</div> </div>
<div class="row"> <div class="row">
<div class="col-xs-2"> <div class="col-2">
<span class="details-icon glyphicon glyphicon-picture"></span> <span class="details-icon oi oi-image"></span>
</div> </div>
<div class="col-xs-10"> <div class="col-10">
<div class="details-main"> <div class="details-main">
{{photo.name}} {{photo.name}}
</div> </div>
<div class="details-sub"> <div class="details-sub row">
<div class="col-xs-4">{{photo.metadata.size.width}} x {{photo.metadata.size.height}}</div> <div class="col-4">{{photo.metadata.size.width}} x {{photo.metadata.size.height}}</div>
<div class="col-xs-4">{{calcMpx()}}MP</div> <div class="col-4">{{calcMpx()}}MP</div>
<div class="col-xs-4" *ngIf="photo.metadata.fileSize">{{calcFileSize()}}</div> <div class="col-4" *ngIf="photo.metadata.fileSize">{{calcFileSize()}}</div>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-xs-2"> <div class="col-2">
<span class="details-icon glyphicon glyphicon-calendar"></span> <span class="details-icon oi oi-calendar"></span>
</div> </div>
<div class="col-xs-10"> <div class="col-10">
<div class="details-main"> <div class="details-main">
{{getDate()}} {{getDate()}}
<ng-container *ngIf="getYear() !== getCurrentYear()"> <ng-container *ngIf="getYear() !== getCurrentYear()">
,{{getYear()}} ,{{getYear()}}
</ng-container> </ng-container>
</div> </div>
<div class="details-sub"> <div class="details-sub row">
<div class="col-xs-12">{{getDay()}}, {{getTime()}}</div> <div class="col-12">{{getDay()}}, {{getTime()}}</div>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-xs-2"> <div class="col-2">
<span class="details-icon glyphicon glyphicon-camera"></span> <span class="details-icon oi oi-camera-slr"></span>
</div> </div>
<div class="col-xs-10"> <div class="col-10">
<div class="details-main"> <div class="details-main">
{{photo.metadata.cameraData.model || photo.metadata.cameraData.make || "Camera"}} {{photo.metadata.cameraData.model || photo.metadata.cameraData.make || "Camera"}}
</div> </div>
<div class="details-sub"> <div class="details-sub row">
<div class="col-xs-3" *ngIf="photo.metadata.cameraData.ISO">ISO{{photo.metadata.cameraData.ISO}}</div> <div class="col-3" *ngIf="photo.metadata.cameraData.ISO">ISO{{photo.metadata.cameraData.ISO}}</div>
<div class="col-xs-3" *ngIf="photo.metadata.cameraData.fStop">f/{{photo.metadata.cameraData.fStop}}</div> <div class="col-3" *ngIf="photo.metadata.cameraData.fStop">f/{{photo.metadata.cameraData.fStop}}</div>
<div class="col-xs-3" *ngIf="photo.metadata.cameraData.exposure"> <div class="col-3" *ngIf="photo.metadata.cameraData.exposure">
{{toFraction(photo.metadata.cameraData.exposure)}}s {{toFraction(photo.metadata.cameraData.exposure)}}s
</div> </div>
<div class="col-xs-3" *ngIf="photo.metadata.cameraData.focalLength"> <div class="col-3" *ngIf="photo.metadata.cameraData.focalLength">
{{photo.metadata.cameraData.focalLength}}mm {{photo.metadata.cameraData.focalLength}}mm
</div> </div>
<div class="col-xs-12" *ngIf="photo.metadata.cameraData.lens">{{photo.metadata.cameraData.lens}}</div> <div class="col-12" *ngIf="photo.metadata.cameraData.lens">{{photo.metadata.cameraData.lens}}</div>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row" *ngIf="hasPositionData()">
<div class="col-xs-2"> <div class="col-2">
<span class="details-icon glyphicon glyphicon-map-marker"></span> <span class="details-icon oi oi-map-marker"></span>
</div> </div>
<div class="col-xs-10"> <div class="col-10">
<div class="details-main"> <div class="details-main">
{{getPositionText() || "Position"}} {{getPositionText() || "Position"}}
</div> </div>
<div class="details-sub" *ngIf="hasGPS()"> <div class="details-sub row" *ngIf="hasGPS()">
<div class="col-xs-12"> <div class="col-12">
{{photo.metadata.positionData.GPSData.latitude.toFixed(3)}}, {{photo.metadata.positionData.GPSData.latitude.toFixed(3)}},
{{photo.metadata.positionData.GPSData.longitude.toFixed(3)}} {{photo.metadata.positionData.GPSData.longitude.toFixed(3)}}
</div> </div>

View File

@ -64,6 +64,10 @@ export class InfoPanelLightboxComponent {
return '1/' + (1 / f); return '1/' + (1 / f);
} }
hasPositionData(): boolean {
return PhotoDTO.hasPositionData(this.photo);
}
hasGPS() { hasGPS() {
return this.photo.metadata.positionData && this.photo.metadata.positionData.GPSData && return this.photo.metadata.positionData && this.photo.metadata.positionData.GPSData &&
this.photo.metadata.positionData.GPSData.latitude && this.photo.metadata.positionData.GPSData.longitude; this.photo.metadata.positionData.GPSData.latitude && this.photo.metadata.positionData.GPSData.longitude;
@ -74,12 +78,12 @@ export class InfoPanelLightboxComponent {
return ''; return '';
} }
let str = this.photo.metadata.positionData.city || let str = this.photo.metadata.positionData.city ||
this.photo.metadata.positionData.state; this.photo.metadata.positionData.state || '';
if (str.length !== 0) { if (str.length !== 0) {
str += ', '; str += ', ';
} }
str += this.photo.metadata.positionData.country; str += this.photo.metadata.positionData.country || '';
return str; return str;
} }

View File

@ -22,6 +22,9 @@ app-gallery-lightbox-photo {
height: 100%; /* Full height */ height: 100%; /* Full height */
background-color: black; background-color: black;
transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out;
-o-transition: all 0.3s ease-in-out;
-webkit-transition: all 0.3s ease-in-out;
-moz-transition: all 0.3s ease-in-out;
} }
.navigation-arrow { .navigation-arrow {
@ -48,6 +51,9 @@ app-gallery-lightbox-photo {
position: fixed; position: fixed;
color: white; color: white;
transition: width 0.3s ease-in-out, opacity 1s; transition: width 0.3s ease-in-out, opacity 1s;
-webkit-transition: width 0.3s ease-in-out, opacity 1s;
-o-transition: width 0.3s ease-in-out, opacity 1s;
-moz-transition: width 0.3s ease-in-out, opacity 1s;
} }
#controllers-container.dim-controls { #controllers-container.dim-controls {
@ -127,4 +133,7 @@ app-info-panel {
right: 0; right: 0;
top: 0; top: 0;
transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out;
-o-transition: all 0.3s ease-in-out;
-moz-transition: all 0.3s ease-in-out;
-webkit-transition: all 0.3s ease-in-out;
} }

View File

@ -19,44 +19,50 @@
<div class="controls controls-top"> <div class="controls controls-top">
<a *ngIf="activePhoto" [href]="activePhoto.gridPhoto.getPhotoPath()" <a *ngIf="activePhoto" [href]="activePhoto.gridPhoto.getPhotoPath()"
[download]="activePhoto.gridPhoto.photo.name"> [download]="activePhoto.gridPhoto.photo.name">
<span class="glyphicon glyphicon-download-alt highlight control-button" <span class="oi oi-data-transfer-download highlight control-button"
title="download" i18n-title></span> title="download" i18n-title></span>
</a> </a>
<span class="glyphicon glyphicon-info-sign highlight control-button" (click)="toggleInfoPanel()" <span class="oi oi-info highlight control-button"
(click)="toggleInfoPanel()"
title="info" i18n-title></span> title="info" i18n-title></span>
<span class=" glyphicon glyphicon-resize-small highlight control-button" <span class="oi oi-fullscreen-exit highlight control-button"
*ngIf="fullScreenService.isFullScreenEnabled()" *ngIf="fullScreenService.isFullScreenEnabled()"
(click)="fullScreenService.exitFullScreen()" title="toggle fullscreen" i18n-title></span> (click)="fullScreenService.exitFullScreen()"
title="toggle fullscreen" i18n-title>
<span class="glyphicon glyphicon-fullscreen highlight control-button" </span>
<span class="oi oi-fullscreen-enter highlight control-button"
*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 control-button" (click)="hide()" title="close" <span class="oi oi-x highlight control-button" (click)="hide()" title="close"
i18n-title></span> i18n-title></span>
</div> </div>
<div class="navigation-arrow highlight" <div class="navigation-arrow highlight"
*ngIf="navigation.hasPrev" title="key: left arrow" id="leftArrow" i18n-title *ngIf="navigation.hasPrev" title="key: left arrow" id="leftArrow" i18n-title
(click)="prevImage()"><span (click)="prevImage()"><span
class="glyphicon glyphicon-chevron-left"></span></div> class="oi oi-chevron-left"></span></div>
<div class="navigation-arrow highlight" <div class="navigation-arrow highlight"
*ngIf="navigation.hasNext" title="key: right arrow" id="rightArrow" i18n-title *ngIf="navigation.hasNext" title="key: right arrow" id="rightArrow" i18n-title
(click)="nextImage()"><span (click)="nextImage()"><span
class="glyphicon glyphicon-chevron-right"></span></div> class="oi oi-chevron-right"></span></div>
<div class="controls controls-playback"> <div class="controls controls-playback">
<span class="glyphicon glyphicon-pause highlight control-button" <span class="oi oi-media-pause highlight control-button"
[ngClass]="playBackState == 0 ? 'button-disabled':''" [ngClass]="playBackState == 0 ? 'button-disabled':''"
(click)="pause()" (click)="pause()"
title="pause"></span> title="pause"></span>
<span <span
class="glyphicon glyphicon-play highlight control-button" class="oi oi-media-play highlight control-button"
[ngClass]="playBackState == 1 ? 'button-active':''" [ngClass]="playBackState == 1 ? 'button-active':''"
(click)="play()" (click)="play()"
title="auto play"></span> title="auto play"></span>
<span class="glyphicon glyphicon-forward highlight control-button" <span class="oi oi-media-skip-forward highlight control-button"
[ngClass]="playBackState == 2 ? 'button-active':''" [ngClass]="playBackState == 2 ? 'button-active':''"
(click)="fastForward()" (click)="fastForward()"
title="fast auto play"></span> title="fast auto play"></span>

View File

@ -11,6 +11,9 @@
align-items: center; /* add to align vertical */ align-items: center; /* add to align vertical */
cursor: pointer; cursor: pointer;
transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out;
-o-transition: all 0.3s ease-in-out;
-webkit-transition: all 0.3s ease-in-out;
-moz-transition: all 0.3s ease-in-out;
} }
.sebm-google-map-container { .sebm-google-map-container {
@ -27,6 +30,9 @@
height: 100%; /* Full height */ height: 100%; /* Full height */
background-color: black; background-color: black;
transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out;
-o-transition: all 0.3s ease-in-out;
-webkit-transition: all 0.3s ease-in-out;
-moz-transition: all 0.3s ease-in-out;
} }
#controllers-container { #controllers-container {

View File

@ -27,8 +27,8 @@
[style.width.px]="photo.preview.width" [style.width.px]="photo.preview.width"
[style.height.px]="photo.preview.height" [style.height.px]="photo.preview.height"
*ngIf="!photo.preview.thumbnail.Src"> *ngIf="!photo.preview.thumbnail.Src">
<span class="glyphicon" <span class="oi"
[ngClass]="photo.preview.thumbnail.Error ? 'glyphicon-warning-sign' : 'glyphicon-picture'" [ngClass]="photo.preview.thumbnail.Error ? 'oi-warning' : 'oi-picture'"
aria-hidden="true"> aria-hidden="true">
</span> </span>
</div> </div>
@ -41,17 +41,17 @@
<div id="controllers-container" *ngIf="visible"> <div id="controllers-container" *ngIf="visible">
<div id="controls"> <div id="controls">
<span> <span>
<span class=" glyphicon glyphicon-resize-small highlight" <span class="oi oi-fullscreen-exit highlight"
*ngIf="fullScreenService.isFullScreenEnabled()" *ngIf="fullScreenService.isFullScreenEnabled()"
(click)="fullScreenService.exitFullScreen()" title="toggle fullscreen"></span> (click)="fullScreenService.exitFullScreen()" title="toggle fullscreen"></span>
</span> </span>
<span> <span>
<span class="glyphicon glyphicon-fullscreen highlight" <span class="oi oi-fullscreen-enter highlight"
*ngIf="!fullScreenService.isFullScreenEnabled()" *ngIf="!fullScreenService.isFullScreenEnabled()"
(click)="fullScreenService.showFullScreen(root)" title="toggle fullscreen"></span> (click)="fullScreenService.showFullScreen(root)" title="toggle fullscreen"></span>
</span> </span>
<span> <span>
<span class="glyphicon glyphicon-remove highlight" (click)="hide()" title="close"></span> <span class="oi oi-x highlight" (click)="hide()" title="close"></span>
</span> </span>
</div> </div>

View File

@ -1,8 +1,9 @@
<ol id="directory-path" class="breadcrumb"> <nav aria-label="breadcrumb">
<li *ngFor="let path of routes"> <ol id="directory-path" class="breadcrumb">
<a *ngIf="path.route" [routerLink]="['/gallery',path.route]" <li *ngFor="let path of routes" class="breadcrumb-item">
[queryParams]="_shareService.isSharing() ? { sk: _shareService.getSharingKey() }:{}">{{path.name}}</a> <a *ngIf="path.route" [routerLink]="['/gallery',path.route]"
<span *ngIf="!path.route">{{path.name}}</span> [queryParams]="_shareService.isSharing() ? { sk: _shareService.getSharingKey() }:{}">{{path.name}}</a>
</li> <ng-container *ngIf="!path.route">{{path.name}}</ng-container>
</li>
</ol> </ol>
</nav>

View File

@ -28,7 +28,7 @@
} }
.autocomplete-item:hover { .autocomplete-item:hover {
background-color: #337ab7; background-color: #007bff;
} }
.autocomplete-item:hover a { .autocomplete-item:hover a {
@ -42,5 +42,5 @@
} }
form { form {
padding-right: 50px; padding-right: 1em;
} }

View File

@ -1,7 +1,7 @@
<form class="navbar-form" role="search" #SearchForm="ngForm"> <form class="navbar-form" role="search" #SearchForm="ngForm">
<div class="input-group"> <div class="input-group">
<input type="text" <input type="text"
class="form-control" class="form-control "
i18n-placeholder i18n-placeholder
placeholder="Search" placeholder="Search"
(keyup)="onSearchChange($event)" (keyup)="onSearchChange($event)"
@ -21,10 +21,10 @@
<div class="autocomplete-item" *ngFor="let item of autoCompleteItems"> <div class="autocomplete-item" *ngFor="let item of autoCompleteItems">
<a [routerLink]="['/search', item.text, {type: SearchTypes[item.type]}]"> <a [routerLink]="['/search', item.text, {type: SearchTypes[item.type]}]">
<span [ngSwitch]="item.type"> <span [ngSwitch]="item.type">
<span *ngSwitchCase="0" class="glyphicon glyphicon-picture"></span> <span *ngSwitchCase="SearchTypes.image" class="oi oi-image"></span>
<span *ngSwitchCase="1" class="glyphicon glyphicon-folder-open"></span> <span *ngSwitchCase="SearchTypes.directory" class="oi oi-folder"></span>
<span *ngSwitchCase="2" class="glyphicon glyphicon-tag"></span> <span *ngSwitchCase="SearchTypes.keyword" class="oi oi-tag"></span>
<span *ngSwitchCase="3" class="glyphicon glyphicon-map-marker"></span> <span *ngSwitchCase="SearchTypes.position" class="oi oi-map-marker"></span>
</span> </span>
{{item.preText}}<strong>{{item.highLightText}}</strong>{{item.postText}} {{item.preText}}<strong>{{item.highLightText}}</strong>{{item.postText}}
</a> </a>
@ -32,8 +32,8 @@
</div> </div>
<div class="input-group-btn" style="display: block"> <div class="input-group-btn" style="display: block">
<button class="btn btn-default dropdown-toggle" type="button" (click)="onSearch()"><i <button class="btn btn-default" type="button" (click)="onSearch()">
class="glyphicon glyphicon-search"></i> <span class="oi oi-magnifying-glass"></span>
</button> </button>
</div> </div>
</div> </div>

View File

@ -72,7 +72,6 @@ export class GallerySearchComponent implements OnDestroy {
} }
public setMouseOverAutoComplete(value: boolean) { public setMouseOverAutoComplete(value: boolean) {
this.mouseOverAutoComplete = value; this.mouseOverAutoComplete = value;
} }

View File

@ -10,3 +10,4 @@
padding-top: 1px; padding-top: 1px;
padding-bottom: 1px; padding-bottom: 1px;
} }

View File

@ -1,6 +1,6 @@
<button id="shareButton" class="btn btn-default navbar-btn btn-link" <button id="shareButton" class="nav-link btn btn-default btn-link"
type="button" [disabled]="!enabled" (click)="showModal()"> type="button" [disabled]="!enabled" (click)="showModal()">
<span class="glyphicon glyphicon-share-alt"></span> <span class="oi oi-share"></span>
<ng-container i18n>Share</ng-container> <ng-container i18n>Share</ng-container>
</button> </button>
@ -10,16 +10,17 @@
tabindex="-1" role="dialog" aria-labelledby="shareModalLabel" tabindex="-1" role="dialog" aria-labelledby="shareModalLabel"
[config]="{ backdrop: false }" [config]="{ backdrop: false }"
aria-hidden="true"> aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog" role="document">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" (click)="hideModal()" aria-label="Close"><span <h5 class="modal-title" id="shareModalLabel" i18n>Share</h5>
aria-hidden="true">&times;</span></button> <button type="button" class="close" (click)="hideModal()" data-dismiss="modal" aria-label="Close">
<h4 class="modal-title" id="shareModalLabel" i18n>Share</h4> <span aria-hidden="true">&times;</span>
</button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row"> <div class="row">
<div class="col-sm-10"> <div class="col-9">
<input id="shareLink" <input id="shareLink"
name="shareLink" name="shareLink"
placeholder="link" placeholder="link"
@ -27,20 +28,20 @@
type="text" type="text"
[ngModel]="url"> [ngModel]="url">
</div> </div>
<div class="col-sm-2 pull-right"> <div class="col-3">
<button id="copyButton" name="copyButton" <button id="copyButton" name="copyButton"
ngxClipboard [cbContent]="url" ngxClipboard [cbContent]="url"
(cbOnSuccess)="onCopy()" (cbOnSuccess)="onCopy()"
class="btn btn-primary" i18n>Copy class="btn btn-primary btn-block" i18n>Copy
</button> </button>
</div> </div>
</div> </div>
<hr/> <hr/>
<div class="row"> <div class="row">
<div class="col-sm-3"> <div class="col-4">
<label class="control-label" i18n>Sharing:</label> <label class="control-label" i18n>Sharing:</label>
</div> </div>
<div class="col-sm-9"> <div class="col-8">
<input disabled type="text" <input disabled type="text"
class="full-width form-control" class="full-width form-control"
[ngModel]="currentDir"> [ngModel]="currentDir">
@ -48,27 +49,33 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-3"> <div class="col-4">
<label class="control-label" i18n>Include subfolders:</label> <label class="control-label" i18n>Include subfolders:</label>
</div> </div>
<div class="col-sm-4"> <div class="col-8">
<input id="recursiveShareBox" <bSwitch
type="checkbox" class="switch"
(change)="update()" name="includeSubfolders"
[(ngModel)]="input.includeSubfolders" [switch-on-color]="'success'"
checked="checked" [switch-inverse]="'inverse'"
value="remember-me"> [switch-off-text]="text.No"
[switch-on-text]="text.Yes"
[switch-handle-width]="'100'"
[switch-label-width]="'20'"
(change)="update()"
[(ngModel)]="input.includeSubfolders">
</bSwitch>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-3"> <div class="col-4">
<label class="control-label"> <label class="control-label">
<ng-container i18n>Password</ng-container> <ng-container i18n>Password</ng-container>
: :
</label> </label>
</div> </div>
<div class="col-sm-6"> <div class="col-8">
<input id="password" <input id="password"
class="form-control" class="form-control"
type="password" type="password"
@ -80,21 +87,21 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-3"> <div class="col-4">
<label class="control-label" i18n>Valid:</label> <label class="control-label" i18n>Valid:</label>
</div> </div>
<div class="col-sm-3" style="padding-right: 1px"> <div class="col-4" style="padding-right: 1px">
<input class="form-control" [(ngModel)]="input.valid.amount" (change)="update()" <input class="form-control" [(ngModel)]="input.valid.amount" (change)="update()"
name="validAmount" name="validAmount"
type="number" min="0" step="1"/> type="number" min="0" step="1"/>
</div> </div>
<div class="col-sm-3" style="padding-left: 1px"> <div class="col-4" style="padding-left: 1px">
<select class="form-control col-md-3" [(ngModel)]="input.valid.type" (change)="update()" name="validType" <select class="form-control" [(ngModel)]="input.valid.type" (change)="update()" name="validType"
required> required>
<option value="{{ValidityTypes.Minutes}}" i18n>Minutes</option> <option [ngValue]="ValidityTypes.Minutes" i18n>Minutes</option>
<option value="{{ValidityTypes.Hours}}" i18n>Hours</option> <option [ngValue]="ValidityTypes.Hours" i18n>Hours</option>
<option value="{{ValidityTypes.Days}}" i18n>Days</option> <option [ngValue]="ValidityTypes.Days" i18n>Days</option>
<option value="{{ValidityTypes.Months}}" i18n>Months</option> <option [ngValue]="ValidityTypes.Months" i18n>Months</option>
</select> </select>
</div> </div>
</div> </div>

View File

@ -36,11 +36,19 @@ export class GalleryShareComponent implements OnInit, OnDestroy {
passwordProtection = false; passwordProtection = false;
ValidityTypes: any; ValidityTypes: any;
text = {
Yes: 'Yes',
No: 'No'
};
constructor(private _sharingService: ShareService, constructor(private _sharingService: ShareService,
public _galleryService: GalleryService, public _galleryService: GalleryService,
private _notification: NotificationService, private _notification: NotificationService,
public i18n: I18n) { public i18n: I18n) {
this.ValidityTypes = ValidityTypes; this.ValidityTypes = ValidityTypes;
this.text.Yes = i18n('Yes');
this.text.No = i18n('No');
} }

View File

@ -10,13 +10,10 @@
<ng-container *ngIf="current != null"> <ng-container *ngIf="current != null">
{{current}} {{current}}
</ng-container> </ng-container>
<span *ngIf="current == null" class="glyphicon glyphicon-globe"> <span *ngIf="current == null" class="oi oi-globe"></span>
</span>
<span class="caret"></span>
</button> </button>
<ul *dropdownMenu class="dropdown-menu" aria-labelledby="language"> <div *dropdownMenu class="dropdown-menu" aria-labelledby="language">
<li *ngFor="let lang of languages"> <a *ngFor="let lang of languages" class="dropdown-item" href="/{{lang}}">{{lang}}</a>
<a href="/{{lang}}">{{lang}}</a> </div>
</li>
</ul>
</div> </div>

View File

@ -1,6 +1,3 @@
.container {
}
.title h1 { .title h1 {
font-size: 80px; font-size: 80px;
font-weight: bold; font-weight: bold;
@ -21,24 +18,6 @@
} }
} }
.title {
margin-top: 40px;
width: 100%;
text-align: center;
}
.card {
padding: 15px;
max-width: 350px;
width: 100% !important;
background-color: #F7F7F7;
border-radius: 2px;
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
overflow: hidden;
height: 295px;
margin: 0px auto 0;
}
/*Margin by pixel:*/ /*Margin by pixel:*/
@media screen and ( min-height: 600px ) { @media screen and ( min-height: 600px ) {
.card { .card {
@ -46,21 +25,13 @@
} }
} }
.has-margin { .card {
margin-bottom: 10px; min-width: 400px;
} background-color: #F7F7F7;
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
.input-group .form-control, .checkbox {
padding: 10px;
font-size: 16px;
} }
.error-message { .error-message {
color: #d9534f; color: #d9534f;
} }
.btn-login {
width: 100%;
font-size: 18px;
}

View File

@ -1,53 +1,66 @@
<div class="container"> <div class="container d-flex flex-column justify-content-center">
<div class="row"> <div class="row align-self-end">
<app-language class="pull-right"></app-language> <app-language></app-language>
</div> </div>
<div class="row title"> <div class="row title align-self-center">
<h1><img src="assets/icon.png"/>{{title}}</h1> <h1><img src="assets/icon.png"/>{{title}}</h1>
</div> </div>
<div class="row card"> <div class="row card align-self-center">
<div class="col-md-12"> <div class="card-body">
<h1 i18n>Please log in</h1> <h4 class="card-title" i18n>Please log in</h4>
<form name="form" id="form" class="form-horizontal" #LoginForm="ngForm" (submit)="onLogin()"> <form name="form" id="form" #LoginForm="ngForm" (submit)="onLogin()">
<div class="error-message" [hidden]="loginError==false" i18n> <div class="error-message" [hidden]="loginError==false" i18n>
Wrong username or password Wrong username or password
</div> </div>
<div class="input-group has-margin">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span> <div class="form-group ">
<input id="username" <label class="sr-only" for="username">Username</label>
type="text" <div class="input-group mb-2">
class="form-control" <div class="input-group-prepend">
i18n-placeholder <div class="input-group-text"><span class="oi oi-person"></span></div>
placeholder="Username" </div>
autocomplete="login-username" <input type="text"
autofocus i18n-placeholder
[(ngModel)]="loginCredential.username" class="form-control"
name="username" required> name="username"
id="username"
autocomplete="login-username"
[(ngModel)]="loginCredential.username"
placeholder="Username"
required>
</div>
</div> </div>
<div class="input-group"> <div class="form-group ">
<span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span> <label class="sr-only" for="password">Password</label>
<input id="password" <div class="input-group mb-2">
class="form-control" <div class="input-group-prepend">
type="password" <div class="input-group-text"><span class="oi oi-lock-locked"></span></div>
[(ngModel)]="loginCredential.password" </div>
name="password" <input type="password"
autocomplete="login-password" i18n-placeholder
i18n-placeholder class="form-control"
placeholder="Password" name="password"
required> id="password"
placeholder="Password"
autocomplete="login-password"
[(ngModel)]="loginCredential.password"
required>
</div>
</div> </div>
<div class="checkbox"> <div class="form-group">
<label><input type="checkbox" name="rememberMe" [(ngModel)]="loginCredential.rememberMe" value=""> <div class="custom-control custom-checkbox">
<ng-container i18n>Remember me</ng-container> <input type="checkbox" class="custom-control-input" name="rememberMe" id="rememberMe"
</label> [(ngModel)]="loginCredential.rememberMe">
<label class="custom-control-label" for="rememberMe" i18n>Remember me</label>
</div>
</div> </div>
<div class="form-group"> <div class="form-group">
<!-- Button --> <!-- Button -->
<div class="col-sm-12 controls"> <div class="col-sm-12 controls">
<button class="btn btn-primary pull-right btn-login" <button class="btn btn-primary btn-lg btn-block"
[disabled]="!LoginForm.form.valid || inProgress" [disabled]="!LoginForm.form.valid || inProgress"
type="submit" type="submit"
name="action" i18n>Login name="action" i18n>Login

View File

@ -10,28 +10,13 @@
margin: 5px 0; margin: 5px 0;
} }
.panel-title {
display: inline-block;
margin-top: 8px;
padding: 0;
}
.panel-heading {
height: 44px;
}
.panel-heading bSwitch {
display: inline-block;
}
.panel-heading {
padding: 5px 15px;
}
.switch-wrapper { .switch-wrapper {
display: inline-block; display: inline-block;
float: none;
text-align: right; text-align: right;
padding: 0; padding: 0;
float: right;
margin-top: -4px;
margin-bottom: -4px;
} }

View File

@ -1,24 +1,24 @@
<form #settingsForm="ngForm" class="form-horizontal"> <form #settingsForm="ngForm" class="form-horizontal">
<div class="panel panel-default"> <div class="card mb-4">
<div class="panel-heading"> <h5 class="card-header" i18n>
<h3 class="panel-title" i18n>Basic settings</h3> Basic settings
</div> </h5>
<div class="panel-body"> <div class="card-body">
<div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div> <div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div>
<div class="form-group" [hidden]="simplifiedMode"> <div class="form-group row" [hidden]="simplifiedMode">
<label class="col-sm-2 control-label" for="applicationTitle" i18n>Page title</label> <label class="col-md-2 control-label" for="applicationTitle" i18n>Page title</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="text" class="form-control" placeholder="Pigallery 2" <input type="text" class="form-control" placeholder="Pigallery 2"
id="applicationTitle" id="applicationTitle"
[(ngModel)]="settings.applicationTitle" [(ngModel)]="settings.applicationTitle"
name="applicationTitle" required> name="applicationTitle" required>
</div> </div>
</div> </div>
<div class="form-group" [hidden]="simplifiedMode"> <div class="form-group row" [hidden]="simplifiedMode">
<label class="col-sm-2 control-label" for="port">Port</label> <label class="col-md-2 control-label" for="port">Port</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="number" class="form-control" placeholder="80" <input type="number" class="form-control" placeholder="80"
id="port" id="port"
min="0" min="0"
@ -26,48 +26,53 @@
max="65535" max="65535"
[(ngModel)]="settings.port" [(ngModel)]="settings.port"
name="port" required> name="port" required>
<span class="help-block" i18n>Port number. Port 80 is usually what you need.</span> <small class="form-text text-muted" i18n>Port number. Port 80 is usually what you need.</small>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="folder">Images folder</label> <label class="col-md-2 control-label" for="folder">Images folder</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="text" class="form-control" placeholder="path" <input type="text" class="form-control" placeholder="path"
id="folder" id="folder"
[(ngModel)]="settings.imagesFolder" [(ngModel)]="settings.imagesFolder"
name="folder" required> name="folder" required>
<span class="help-block" i18n>Images are loaded from this folder (read permission required)</span> <small class="form-text text-muted" i18n>Images are loaded from this folder (read permission required)</small>
</div> </div>
</div> </div>
<div class="form-group" [hidden]="simplifiedMode"> <div class="form-group row" [hidden]="simplifiedMode">
<label class="col-sm-2 control-label" for="publicUrl" i18n>Page public url</label> <label class="col-md-2 control-label" for="publicUrl" i18n>Page public url</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="url" class="form-control" placeholder="{{urlPlaceholder}}" <input type="url" class="form-control" placeholder="{{urlPlaceholder}}"
id="publicUrl" id="publicUrl"
[(ngModel)]="settings.publicUrl" [(ngModel)]="settings.publicUrl"
name="publicUrl"> name="publicUrl">
<span class="help-block" i18n>If you access the page form local network its good to know the public url for creating sharing link</span> <small class="form-text text-muted" i18n>If you access the page form local network its good to know the public
url for creating sharing link
</small>
</div> </div>
</div> </div>
<div class="form-group" [hidden]="simplifiedMode"> <div class="form-group row" [hidden]="simplifiedMode">
<label class="col-sm-2 control-label" for="urlBase" i18n>Url Base</label> <label class="col-md-2 control-label" for="urlBase" i18n>Url Base</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="url" class="form-control" placeholder="/myGallery" <input type="url" class="form-control" placeholder="/myGallery"
id="urlBase" id="urlBase"
[(ngModel)]="settings.urlBase" [(ngModel)]="settings.urlBase"
name="urlBase"> name="urlBase">
<span class="help-block" i18n>If you access the gallery under a sub url (like: http://mydomain.com/myGallery), set it here. If not working you might miss the '/' from the beginning of the url.</span> <small class="form-text text-muted" i18n>If you access the gallery under a sub url (like:
http://mydomain.com/myGallery), set it here. If not working you might miss the '/' from the beginning of the
url.
</small>
</div> </div>
</div> </div>
<button class="btn btn-success pull-right" <button class="btn btn-success float-right"
[disabled]="!settingsForm.form.valid || !changed || inProgress" [disabled]="!settingsForm.form.valid || !changed || inProgress"
(click)="save()" i18n>Save (click)="save()" i18n>Save
</button> </button>
<button class="btn btn-default pull-right" <button class="btn btn-default float-right"
(click)="reset()" i18n>Reset (click)="reset()" i18n>Reset
</button> </button>
</div> </div>

View File

@ -35,8 +35,7 @@ export class BasicSettingsComponent extends SettingsComponent<BasicConfigDTO> {
public async save(): Promise<boolean> { public async save(): Promise<boolean> {
const val = await super.save(); const val = await super.save();
if (val === true) { if (val === true) {
this.notification.info(this.i18n('Restart the server to apply the new settings'));
this.notification.info('Restart the server to apply the new settings');
} }
return val; return val;
} }

View File

@ -1,8 +1,8 @@
<div class="panel panel-default"> <div class="card mb-4">
<div class="panel-heading"> <h5 class="card-header" i18n>
<h3 class="panel-title" i18n>Database settings</h3> Database settings
</div> </h5>
<div class="panel-body"> <div class="card-body">
<div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div> <div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div>
<form #settingsForm="ngForm"> <form #settingsForm="ngForm">
<p class="title" i18n>Type:</p> <p class="title" i18n>Type:</p>
@ -10,8 +10,9 @@
<option *ngFor="let type of types" [ngValue]="type.key">{{type.value}} <option *ngFor="let type of types" [ngValue]="type.key">{{type.value}}
</option> </option>
</select> </select>
<span *ngIf="settings.type == DatabaseType.mysql" <small *ngIf="settings.type == DatabaseType.mysql"
class="help-block" i18n>Install manually mysql node module to use mysql (npm install mysql)</span> class="form-text text-muted" i18n>Install manually mysql node module to use mysql (npm install mysql)
</small>
<ng-container *ngIf="settings.type == DatabaseType.mysql"> <ng-container *ngIf="settings.type == DatabaseType.mysql">
<p class="title" i18n>MySQL settings:</p> <p class="title" i18n>MySQL settings:</p>
@ -26,16 +27,16 @@
</ng-container> </ng-container>
<ng-container *ngIf="settings.type == DatabaseType.sqlite"> <ng-container *ngIf="settings.type == DatabaseType.sqlite">
<p class="title" i18n>SQLie settings:</p> <p class="title" i18n>SQLie settings:</p>
<input type="text" class="form-control" placeholder="storage" autofocus <input type="text" class="form-control" placeholder="storage"
[(ngModel)]="settings.sqlite.storage" name="host" required> [(ngModel)]="settings.sqlite.storage" name="host" required>
</ng-container> </ng-container>
</form> </form>
<button class="btn btn-success pull-right" <button class="btn btn-success float-right"
[disabled]="!settingsForm.form.valid || !changed || inProgress" [disabled]="!settingsForm.form.valid || !changed || inProgress"
(click)="save()" i18n>Save (click)="save()" i18n>Save
</button> </button>
<button class="btn btn-default pull-right" <button class="btn btn-default float-right"
(click)="reset()" i18n>Reset (click)="reset()" i18n>Reset
</button> </button>
</div> </div>

View File

@ -1,3 +0,0 @@
.buttons {
text-align: center;
}

View File

@ -1,57 +1,60 @@
<form #settingsForm="ngForm" class="form-horizontal"> <form #settingsForm="ngForm" class="form-horizontal">
<div class="panel panel-default"> <div class="card mb-4">
<div class="panel-heading"> <h5 class="card-header" i18n>
<h3 class="panel-title col-xs-4" i18n>Folder indexing</h3> Folder indexing
</div> </h5>
<div class="panel-body"> <div class="card-body">
<div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div> <div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div>
<ng-container *ngIf="!simplifiedMode"> <ng-container *ngIf="!simplifiedMode">
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="cachedFolderTimeout" i18n>Index cache timeout [ms]</label> <label class="col-md-2 control-label" for="cachedFolderTimeout" i18n>Index cache timeout [ms]</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="number" class="form-control" placeholder="36000" <input type="number" class="form-control" placeholder="36000"
id="cachedFolderTimeout" id="cachedFolderTimeout"
min="0" min="0"
step="1" step="1"
[(ngModel)]="settings.cachedFolderTimeout" [(ngModel)]="settings.cachedFolderTimeout"
name="cachedFolderTimeout" required> name="cachedFolderTimeout" required>
<span class="help-block" i18n>If there was no indexing in this time, it reindexes. (skipped if indexen in DB and sensitivity is low)</span> <small class="form-text text-muted" i18n>If there was no indexing in this time, it reindexes. (skipped if
indexen in DB and sensitivity is low)
</small>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="folderPreviewSize" i18n>Sub folder preview size</label> <label class="col-md-2 control-label" for="folderPreviewSize" i18n>Sub folder preview size</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="number" class="form-control" placeholder="1" <input type="number" class="form-control" placeholder="1"
id="folderPreviewSize" id="folderPreviewSize"
min="0" min="0"
step="1" step="1"
[(ngModel)]="settings.folderPreviewSize" [(ngModel)]="settings.folderPreviewSize"
name="folderPreviewSize" required> name="folderPreviewSize" required>
<span class="help-block" i18n>Reads this many photos from sub folders</span> <small class="form-text text-muted" i18n>Reads this many photos from sub folders</small>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="reIndexingSensitivity" i18n>Folder reindexing sensitivity</label> <label class="col-md-2 control-label" for="reIndexingSensitivity" i18n>Folder reindexing sensitivity</label>
<div class="col-sm-10"> <div class="col-md-10">
<select id="reIndexingSensitivity" class="form-control" [(ngModel)]="settings.reIndexingSensitivity" <select id="reIndexingSensitivity" class="form-control" [(ngModel)]="settings.reIndexingSensitivity"
name="reIndexingSensitivity" required> name="reIndexingSensitivity" required>
<option *ngFor="let type of types" [ngValue]="type.key">{{type.value}} <option *ngFor="let type of types" [ngValue]="type.key">{{type.value}}
</option> </option>
</select> </select>
<span <small
class="help-block" class="form-text text-muted"
i18n>Set the reindexing sensitivity. High value check the folders for change more often</span> i18n>Set the reindexing sensitivity. High value check the folders for change more often
</small>
</div> </div>
</div> </div>
<button class="btn btn-success pull-right" <button class="btn btn-success float-right"
[disabled]="!settingsForm.form.valid || !changed || inProgress" [disabled]="!settingsForm.form.valid || !changed || inProgress"
(click)="save()" i18n>Save (click)="save()" i18n>Save
</button> </button>
<button class="btn btn-default pull-right" <button class="btn btn-default float-right"
(click)="reset()" i18n>Reset (click)="reset()" i18n>Reset
</button> </button>
<br/> <br/>
@ -69,7 +72,7 @@
<div *ngIf="_settingsService.progress.value != null"> <div *ngIf="_settingsService.progress.value != null">
indexing: {{_settingsService.progress.value.current}} indexing: {{_settingsService.progress.value.current}}
<div class="progress"> <div class="progress">
<div class="progress-bar progress-bar-success" <div class="progress-bar progress-bar-success"
role="progressbar" role="progressbar"
aria-valuenow="2" aria-valuenow="2"
aria-valuemin="0" aria-valuemin="0"
@ -81,7 +84,7 @@
</div> </div>
</div> </div>
<div class="row buttons"> <div class="row justify-content-center">
<button class="btn btn-success" <button class="btn btn-success"
*ngIf="_settingsService.progress.value == null" *ngIf="_settingsService.progress.value == null"
[disabled]="inProgress" [disabled]="inProgress"

View File

@ -1,8 +1,8 @@
<form #settingsForm="ngForm" class="form-horizontal"> <form #settingsForm="ngForm" class="form-horizontal">
<div class="panel panel-default"> <div class="card mb-4">
<div class="panel-heading"> <h5 class="card-header">
<h3 class="panel-title col-xs-4" i18n>Map settings</h3> <ng-container i18n>Map settings</ng-container>
<div class="switch-wrapper col-xs-8"> <div class="switch-wrapper">
<bSwitch <bSwitch
class="switch" class="switch"
name="enabled" name="enabled"
@ -16,31 +16,33 @@
[(ngModel)]="settings.enabled"> [(ngModel)]="settings.enabled">
</bSwitch> </bSwitch>
</div> </div>
</div> </h5>
<div class="panel-body"> <div class="card-body">
<div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div> <div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="googleApiKey" i18n>Google maps api key</label> <label class="col-md-2 control-label" for="googleApiKey" i18n>Google maps api key</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="text" class="form-control" placeholder="Google api key" <input type="text" class="form-control" placeholder="Google api key"
[(ngModel)]="settings.googleApiKey" [(ngModel)]="settings.googleApiKey"
[disabled]="!settings.enabled" [disabled]="!settings.enabled"
name="googleApiKey" id="googleApiKey" required> name="googleApiKey" id="googleApiKey" required>
<span class="help-block"><ng-container i18n>To show the images on a map,</ng-container> <a <small class="form-text text-muted">
<ng-container i18n>To show the images on a map,</ng-container>
<a
href="https://developers.google.com/maps/documentation/javascript/get-api-key" i18n>google api key</a> <ng-container href="https://developers.google.com/maps/documentation/javascript/get-api-key" i18n>google api key</a> <ng-container
i18n>is need</ng-container></span> i18n>is need
</ng-container>
</small>
</div> </div>
</div> </div>
<button class="btn btn-success pull-right" <button class="btn btn-success float-right"
[disabled]="!settingsForm.form.valid || !changed || inProgress" [disabled]="!settingsForm.form.valid || !changed || inProgress"
(click)="save()" i18n>Save (click)="save()" i18n>Save
</button> </button>
<button class="btn btn-default pull-right" <button class="btn btn-default float-right"
(click)="reset()" i18n>Reset (click)="reset()" i18n>Reset
</button> </button>
</div> </div>

View File

@ -1,15 +1,15 @@
<form #settingsForm="ngForm" class="form-horizontal"> <form #settingsForm="ngForm" class="form-horizontal">
<div class="panel panel-default"> <div class="card mb-4">
<div class="panel-heading"> <h5 class="card-header" i18n>
<h3 class="panel-title" i18n>Other settings</h3> Other settings
</div> </h5>
<div class="panel-body"> <div class="card-body">
<div [hidden]="!error" class="alert alert-danger" role="alert"><strong i18n>Error: </strong>{{error}}</div> <div [hidden]="!error" class="alert alert-danger" role="alert"><strong i18n>Error: </strong>{{error}}</div>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="enableThreading" i18n>Threading</label> <label class="col-md-2 control-label" for="enableThreading" i18n>Threading</label>
<div class="col-sm-10"> <div class="col-md-10">
<bSwitch <bSwitch
id="enableThreading" id="enableThreading"
class="switch" class="switch"
@ -22,14 +22,16 @@
[switch-label-width]="'20'" [switch-label-width]="'20'"
[(ngModel)]="settings.enableThreading"> [(ngModel)]="settings.enableThreading">
</bSwitch> </bSwitch>
<span class="help-block" i18n>Runs directory scanning and thumbnail generation (only for Jimp) in a different thread</span> <small class="form-text text-muted" i18n>Runs directory scanning and thumbnail generation (only for Jimp) in a
different thread
</small>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="enableOnScrollThumbnailPrioritising" i18n>Scroll based thumbnail <label class="col-md-2 control-label" for="enableOnScrollThumbnailPrioritising" i18n>Scroll based thumbnail
generation</label> generation</label>
<div class="col-sm-10"> <div class="col-md-10">
<bSwitch <bSwitch
id="enableOnScrollThumbnailPrioritising" id="enableOnScrollThumbnailPrioritising"
class="switch" class="switch"
@ -42,13 +44,14 @@
[switch-label-width]="'20'" [switch-label-width]="'20'"
[(ngModel)]="settings.enableOnScrollThumbnailPrioritising"> [(ngModel)]="settings.enableOnScrollThumbnailPrioritising">
</bSwitch> </bSwitch>
<span class="help-block" i18n>Those thumbnails get higher priority that are visible on the screen</span> <small class="form-text text-muted" i18n>Those thumbnails get higher priority that are visible on the screen
</small>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="enableOnScrollRendering" i18n>Lazy image rendering</label> <label class="col-md-2 control-label" for="enableOnScrollRendering" i18n>Lazy image rendering</label>
<div class="col-sm-10"> <div class="col-md-10">
<bSwitch <bSwitch
id="enableOnScrollRendering" id="enableOnScrollRendering"
class="switch" class="switch"
@ -61,14 +64,16 @@
[switch-label-width]="'20'" [switch-label-width]="'20'"
[(ngModel)]="settings.enableOnScrollRendering"> [(ngModel)]="settings.enableOnScrollRendering">
</bSwitch> </bSwitch>
<span class="help-block" i18n>Shows only the required amount of photos at once. Renders more if page bottom is reached</span> <small class="form-text text-muted" i18n>Shows only the required amount of photos at once. Renders more if
page bottom is reached
</small>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="enableCache" i18n>Cache</label> <label class="col-md-2 control-label" for="enableCache" i18n>Cache</label>
<div class="col-sm-10"> <div class="col-md-10">
<bSwitch <bSwitch
id="enableCache" id="enableCache"
class="switch" class="switch"
@ -81,16 +86,17 @@
[switch-label-width]="'20'" [switch-label-width]="'20'"
[(ngModel)]="settings.enableCache"> [(ngModel)]="settings.enableCache">
</bSwitch> </bSwitch>
<span class="help-block" i18n>Caches directory contents and search results for better performance</span> <small class="form-text text-muted" i18n>Caches directory contents and search results for better performance
</small>
</div> </div>
</div> </div>
<button class="btn btn-success pull-right" <button class="btn btn-success float-right"
[disabled]="!settingsForm.form.valid || !changed || inProgress" [disabled]="!settingsForm.form.valid || !changed || inProgress"
(click)="save()" i18n>Save (click)="save()" i18n>Save
</button> </button>
<button class="btn btn-default pull-right" <button class="btn btn-default float-right"
(click)="reset()" i18n>Reset (click)="reset()" i18n>Reset
</button> </button>
</div> </div>

View File

@ -1,9 +1,9 @@
<form #settingsForm="ngForm"> <form #settingsForm="ngForm">
<div class="panel panel-default" <div class="card mb-4"
[ngClass]="settings.enabled && !_settingsService.isSupported()?'panel-warning':''"> [ngClass]="settings.enabled && !_settingsService.isSupported()?'panel-warning':''">
<div class="panel-heading"> <h5 class="card-header">
<h3 class="panel-title col-xs-6" i18n>Search settings</h3> <ng-container i18n>Search settings</ng-container>
<div class="switch-wrapper col-xs-6"> <div class="switch-wrapper">
<bSwitch <bSwitch
class="switch" class="switch"
name="enabled" name="enabled"
@ -17,15 +17,15 @@
[(ngModel)]="settings.enabled"> [(ngModel)]="settings.enabled">
</bSwitch> </bSwitch>
</div> </div>
</div> </h5>
<div class="panel-body"> <div class="card-body">
<div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div> <div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div>
<ng-container *ngIf="settings.enabled || _settingsService.isSupported()"> <ng-container *ngIf="settings.enabled || _settingsService.isSupported()">
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="autocompleteEnabled" i18n>Autocomplete</label> <label class="col-md-2 control-label" for="autocompleteEnabled" i18n>Autocomplete</label>
<div class="col-sm-10"> <div class="col-md-10">
<bSwitch <bSwitch
id="autocompleteEnabled" id="autocompleteEnabled"
class="switch" class="switch"
@ -39,14 +39,14 @@
[switch-label-width]="'20'" [switch-label-width]="'20'"
[(ngModel)]="settings.autocompleteEnabled"> [(ngModel)]="settings.autocompleteEnabled">
</bSwitch> </bSwitch>
<span class="help-block" i18n>Show hints while typing search query</span> <small class="form-text text-muted" i18n>Show hints while typing search query</small>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="instantSearchEnabled" i18n>Instant search</label> <label class="col-md-2 control-label" for="instantSearchEnabled" i18n>Instant search</label>
<div class="col-sm-10"> <div class="col-md-10">
<bSwitch <bSwitch
id="instantSearchEnabled" id="instantSearchEnabled"
class="switch" class="switch"
@ -60,7 +60,7 @@
[switch-label-width]="'20'" [switch-label-width]="'20'"
[(ngModel)]="settings.instantSearchEnabled"> [(ngModel)]="settings.instantSearchEnabled">
</bSwitch> </bSwitch>
<span class="help-block" i18n>Enables showing search results, while typing search query</span> <small class="form-text text-muted" i18n>Enables showing search results, while typing search query</small>
</div> </div>
</div> </div>
@ -68,11 +68,11 @@
<div class="panel-info" *ngIf="(!settings.enabled && !_settingsService.isSupported())" i18n> <div class="panel-info" *ngIf="(!settings.enabled && !_settingsService.isSupported())" i18n>
Search is not supported with these settings Search is not supported with these settings
</div> </div>
<button class="btn btn-success pull-right" <button class="btn btn-success float-right"
[disabled]="!settingsForm.form.valid || !changed || inProgress" [disabled]="!settingsForm.form.valid || !changed || inProgress"
(click)="save()" i18n>Save (click)="save()" i18n>Save
</button> </button>
<button class="btn btn-default pull-right" <button class="btn btn-default float-right"
(click)="reset()" i18n>Reset (click)="reset()" i18n>Reset
</button> </button>
</div> </div>

View File

@ -1,9 +1,9 @@
<form #settingsForm="ngForm"> <form #settingsForm="ngForm">
<div class="panel panel-default" <div class="card mb-4"
[ngClass]="settings.enabled && !_settingsService.isSupported()?'panel-warning':''"> [ngClass]="settings.enabled && !_settingsService.isSupported()?'panel-warning':''">
<div class="panel-heading"> <h5 class="card-header">
<h3 class="panel-title col-xs-6" i18n>Share settings</h3> <ng-container i18n>Share settings</ng-container>
<div class="switch-wrapper col-xs-6"> <div class="switch-wrapper">
<bSwitch <bSwitch
class="switch" class="switch"
name="enabled" name="enabled"
@ -17,14 +17,14 @@
[(ngModel)]="settings.enabled"> [(ngModel)]="settings.enabled">
</bSwitch> </bSwitch>
</div> </div>
</div> </h5>
<div class="panel-body"> <div class="card-body">
<div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div> <div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div>
<ng-container *ngIf="settings.enabled || _settingsService.isSupported()"> <ng-container *ngIf="settings.enabled || _settingsService.isSupported()">
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="passwordProtected" i18n>Password protected</label> <label class="col-md-2 control-label" for="passwordProtected" i18n>Password protected</label>
<div class="col-sm-10"> <div class="col-md-10">
<bSwitch <bSwitch
id="passwordProtected" id="passwordProtected"
class="switch" class="switch"
@ -38,7 +38,7 @@
[switch-label-width]="'20'" [switch-label-width]="'20'"
[(ngModel)]="settings.passwordProtected"> [(ngModel)]="settings.passwordProtected">
</bSwitch> </bSwitch>
<span class="help-block" i18n>Enables password protected sharing links</span> <small class="form-text text-muted" i18n>Enables password protected sharing links</small>
</div> </div>
</div> </div>
@ -47,11 +47,11 @@
<div class="panel-info" *ngIf="(!settings.enabled && !_settingsService.isSupported())" i18n> <div class="panel-info" *ngIf="(!settings.enabled && !_settingsService.isSupported())" i18n>
Sharing is not supported with these settings Sharing is not supported with these settings
</div> </div>
<button class="btn btn-success pull-right" <button class="btn btn-success float-right"
[disabled]="!settingsForm.form.valid || !changed || inProgress" [disabled]="!settingsForm.form.valid || !changed || inProgress"
(click)="save()" i18n>Save (click)="save()" i18n>Save
</button> </button>
<button class="btn btn-default pull-right" <button class="btn btn-default float-right"
(click)="reset()" i18n>Reset (click)="reset()" i18n>Reset
</button> </button>
</div> </div>

View File

@ -1,9 +1,9 @@
<form #settingsForm="ngForm" class="form-horizontal"> <form #settingsForm="ngForm" class="form-horizontal">
<div class="panel panel-default"> <div class="card mb-4">
<div class="panel-heading"> <h5 class="card-header" i18n>
<h3 class="panel-title" i18n>Thumbnail settings</h3> Thumbnail settings
</div> </h5>
<div class="panel-body"> <div class="card-body">
<div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div> <div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div>
<div [hidden]="settings.server.processingLibrary!=ThumbnailProcessingLib.Jimp" <div [hidden]="settings.server.processingLibrary!=ThumbnailProcessingLib.Jimp"
class="alert alert-warning" class="alert alert-warning"
@ -12,37 +12,43 @@
</div> </div>
<fieldset> <fieldset>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="lib" i18n>Thumbnail generation library</label> <label class="col-md-2 control-label" for="lib" i18n>Thumbnail generation library</label>
<div class="col-sm-10"> <div class="col-md-10">
<select id="lib" class="form-control" [(ngModel)]="settings.server.processingLibrary" <select id="lib" class="form-control" [(ngModel)]="settings.server.processingLibrary"
name="type" required> name="type" required>
<option *ngFor="let type of types" [ngValue]="type.key">{{type.value}} <option *ngFor="let type of types" [ngValue]="type.key">{{type.value}}
</option> </option>
</select> </select>
<span *ngIf="settings.server.processingLibrary==ThumbnailProcessingLib.sharp" <small *ngIf="settings.server.processingLibrary==ThumbnailProcessingLib.sharp"
class="help-block" i18n>Make sure that sharp node module is installed (npm install sharp).</span> class="form-text text-muted" i18n>Make sure that sharp node module is installed (npm install sharp).
<span *ngIf="settings.server.processingLibrary==ThumbnailProcessingLib.gm" </small>
class="help-block"><ng-container i18n>Make sure that gm node module and</ng-container> <a <small *ngIf="settings.server.processingLibrary==ThumbnailProcessingLib.gm"
href="http://www.graphicsmagick.org/" i18n>GraphicsMagick</a> <ng-container i18n>are installed (npm install sharp).</ng-container></span> class="form-text text-muted">
<ng-container i18n>Make sure that gm node module and</ng-container>
<a
href="http://www.graphicsmagick.org/" i18n>GraphicsMagick</a>
<ng-container i18n>are installed (npm install sharp).</ng-container>
</small>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label" for="th_folder" i18n>Thumbnail folder</label> <label class="col-md-2 control-label" for="th_folder" i18n>Thumbnail folder</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="text" class="form-control" placeholder="path" <input type="text" class="form-control" placeholder="path"
id="th_folder" id="th_folder"
[(ngModel)]="settings.server.folder" [(ngModel)]="settings.server.folder"
name="path" required> name="path" required>
<span class="help-block" i18n>Thumbnails will be saved in this folder. Write access is required</span> <small class="form-text text-muted" i18n>Thumbnails will be saved in this folder. Write access is required
</small>
</div> </div>
</div> </div>
<div class="form-group" [hidden]="simplifiedMode"> <div class="form-group row" [hidden]="simplifiedMode">
<label class="col-sm-2 control-label" for="quality" i18n>Thumbnail Quality</label> <label class="col-md-2 control-label" for="quality" i18n>Thumbnail Quality</label>
<div class="col-sm-10"> <div class="col-md-10">
<bSwitch <bSwitch
id="quality" id="quality"
class="switch" class="switch"
@ -55,14 +61,14 @@
[switch-label-width]="'20'" [switch-label-width]="'20'"
[(ngModel)]="settings.server.qualityPriority"> [(ngModel)]="settings.server.qualityPriority">
</bSwitch> </bSwitch>
<span class="help-block" i18n>High quality may be slow. Especially with Jimp.</span> <small class="form-text text-muted" i18n>High quality may be slow. Especially with Jimp.</small>
</div> </div>
</div> </div>
<div class="form-group" [hidden]="simplifiedMode"> <div class="form-group row" [hidden]="simplifiedMode">
<label class="col-sm-2 control-label" for="icon">Icon size</label> <label class="col-md-2 control-label" for="icon">Icon size</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="number" class="form-control" placeholder="30" <input type="number" class="form-control" placeholder="30"
id="icon" id="icon"
[(ngModel)]="settings.client.iconSize" [(ngModel)]="settings.client.iconSize"
@ -70,34 +76,34 @@
max="100" max="100"
step="1" step="1"
name="icon" required> name="icon" required>
<span class="help-block" i18n>Icon size (used on maps)</span> <small class="form-text text-muted" i18n>Icon size (used on maps)</small>
</div> </div>
</div> </div>
<div class="form-group" [hidden]="simplifiedMode"> <div class="form-group row" [hidden]="simplifiedMode">
<label class="col-sm-2 control-label" for="thumbnailSizes" i18n>Thumbnail sizes</label> <label class="col-md-2 control-label" for="thumbnailSizes" i18n>Thumbnail sizes</label>
<div class="col-sm-10"> <div class="col-md-10">
<input type="text" class="form-control" placeholder="200; 400" <input type="text" class="form-control" placeholder="200; 400"
id="thumbnailSizes" id="thumbnailSizes"
[(ngModel)]="ThumbnailSizes" [(ngModel)]="ThumbnailSizes"
name="thumbnailSizes" required> name="thumbnailSizes" required>
<span class="help-block"> <small class="form-text text-muted">
<ng-container i18n>Size of the thumbnails.</ng-container><br/> <ng-container i18n>Size of the thumbnails.</ng-container><br/>
<ng-container i18n>The best matching size will be generated. (More size gives better quality, but use storage to store and CPU to render.)</ng-container><br/> <ng-container i18n>The best matching size will be generated. (More size gives better quality, but use storage to store and CPU to render.)</ng-container><br/>
<ng-container <ng-container
i18n>';' separated integers. If size is 200, tha thumbnail will have 200^2 pixels.</ng-container> i18n>';' separated integers. If size is 200, tha thumbnail will have 200^2 pixels.</ng-container>
</span> </small>
</div> </div>
</div> </div>
</fieldset> </fieldset>
<button class="btn btn-success pull-right" <button class="btn btn-success float-right"
[disabled]="!settingsForm.form.valid || !changed || inProgress" [disabled]="!settingsForm.form.valid || !changed || inProgress"
(click)="save()" i18n>Save (click)="save()" i18n>Save
</button> </button>
<button class="btn btn-default pull-right" <button class="btn btn-default float-right"
(click)="reset()" i18n>Reset (click)="reset()" i18n>Reset
</button> </button>
</div> </div>

View File

@ -1,7 +1,7 @@
<div class="panel panel-default"> <div class="card mb-4">
<div class="panel-heading"> <h5 class="card-header">
<h3 class="panel-title col-xs-6" i18n>Password protection </h3> <ng-container i18n>Password protection</ng-container>
<div class="switch-wrapper col-xs-6"> <div class="switch-wrapper">
<bSwitch <bSwitch
class="switch" class="switch"
name="enabled" name="enabled"
@ -16,8 +16,8 @@
(onChangeState)="switched($event)"> (onChangeState)="switched($event)">
</bSwitch> </bSwitch>
</div> </div>
</div> </h5>
<div class="panel-body"> <div class="card-body">
<div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div> <div [hidden]="!error" class="alert alert-danger" role="alert"><strong>Error: </strong>{{error}}</div>
<ng-container *ngIf="enabled"> <ng-container *ngIf="enabled">
@ -44,14 +44,14 @@
<td> <td>
<button [disabled]="!canModifyUser(user)" (click)="deleteUser(user)" <button [disabled]="!canModifyUser(user)" (click)="deleteUser(user)"
[ngClass]="canModifyUser(user)? 'btn-danger':'btn-default'" [ngClass]="canModifyUser(user)? 'btn-danger':'btn-default'"
class="btn pull-right"> class="btn float-right">
<span class="glyphicon glyphicon-trash" aria-hidden="true" aria-label="Delete"></span> <span class="oi oi-trash" aria-hidden="true" aria-label="Delete"></span>
</button> </button>
</td> </td>
</tr> </tr>
</table> </table>
<button class="btn btn-primary pull-right" <button class="btn btn-primary float-right"
(click)="initNewUser()" i18n>+ Add user (click)="initNewUser()" i18n>+ Add user
</button> </button>
</ng-container> </ng-container>
@ -67,11 +67,11 @@
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" (click)="userModal.hide()" aria-label="Close"><span <h5 class="modal-title" id="userModalLabel" i18n>Add new User</h5>
aria-hidden="true">&times;</span></button> <button type="button" class="close" (click)="userModal.hide()" data-dismiss="modal" aria-label="Close">
<h4 class="modal-title" id="userModalLabel" i18n>Add new User</h4> <span aria-hidden="true">&times;</span>
</button>
</div> </div>
<form #NewUserForm="ngForm"> <form #NewUserForm="ngForm">
<div class="modal-body"> <div class="modal-body">
<input type="text" class="form-control" i18n-placeholder placeholder="Username" autofocus <input type="text" class="form-control" i18n-placeholder placeholder="Username" autofocus

View File

@ -75,6 +75,7 @@ export class UserMangerSettingsComponent implements OnInit {
this.enabled = await this._userSettings.getSettings(); this.enabled = await this._userSettings.getSettings();
} }
async switched(event: { previousValue: false, currentValue: true }) { async switched(event: { previousValue: false, currentValue: true }) {
this.inProgress = true; this.inProgress = true;
this.error = ''; this.error = '';
@ -84,6 +85,7 @@ export class UserMangerSettingsComponent implements OnInit {
await this.getSettings(); await this.getSettings();
if (this.enabled === true) { if (this.enabled === true) {
this.notification.success(this.i18n('Password protection enabled'), this.i18n('Success')); this.notification.success(this.i18n('Password protection enabled'), this.i18n('Success'));
this.notification.info(this.i18n('Server restart is recommended.'));
this.getUsersList(); this.getUsersList();
} else { } else {
this.notification.success(this.i18n('Password protection disabled'), this.i18n('Success')); this.notification.success(this.i18n('Password protection disabled'), this.i18n('Success'));

View File

@ -1,6 +1,3 @@
.container {
}
.title h1 { .title h1 {
font-size: 80px; font-size: 80px;
font-weight: bold; font-weight: bold;
@ -11,46 +8,30 @@
height: 80px; height: 80px;
} }
.title { @media screen and ( max-width: 500px ) {
margin-top: 40px; .title h1 {
width: 100%; font-size: 70px;
text-align: center; }
}
.card { .title img {
padding: 15px; height: 70px;
max-width: 350px;
width: 100% !important;
background-color: #F7F7F7;
border-radius: 2px;
box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
overflow: hidden;
height: 150px;
margin: 0px auto 0;
}
/*Margin by pixel:*/
@media screen and ( min-height: 400px ) {
.card {
margin-top: calc((100vh - 120px - 150px) / 2 - 60px)
} }
} }
.has-margin { /*Margin by pixel:*/
margin-bottom: 10px; @media screen and ( min-height: 600px ) {
.card {
margin-top: calc((100vh - 120px - 295px) / 2 - 60px)
}
} }
.input-group .form-control, .checkbox { .card {
padding: 10px; min-width: 400px;
font-size: 16px; background-color: #F7F7F7;
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
} }
.error-message { .error-message {
color: #d9534f; color: #d9534f;
} }
.btn-login {
width: 100%;
font-size: 18px;
}

View File

@ -1,36 +1,41 @@
<div class="container"> <div class="container d-flex flex-column justify-content-center">
<div class="row align-self-end">
<div class="row"> <app-language></app-language>
<app-language class="pull-right"></app-language>
</div> </div>
<div class="row title"> <div class="row title align-self-center">
<h1><img src="assets/icon.png"/>{{title}}</h1> <h1><img src="assets/icon.png"/>{{title}}</h1>
</div> </div>
<div class="row card align-self-center">
<div class="row card"> <div class="card-body">
<div class="col-md-12">
<form name="form" id="form" class="form-horizontal" #LoginForm="ngForm" (submit)="onLogin()"> <form name="form" id="form" class="form-horizontal" #LoginForm="ngForm" (submit)="onLogin()">
<div class="error-message" [hidden]="loginError==false" i18n> <div class="error-message" [hidden]="loginError==false" i18n>
Wrong password Wrong password
</div> </div>
<div class="input-group has-margin">
<span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span> <div class="form-group ">
<input id="password" <label class="sr-only" for="password">Password</label>
class="form-control" <div class="input-group mb-2">
type="password" <div class="input-group-prepend">
[(ngModel)]="password" <div class="input-group-text"><span class="oi oi-lock-locked"></span></div>
name="password" </div>
i18n-placeholder <input type="password"
placeholder="Password" i18n-placeholder
required> class="form-control"
name="password"
id="password"
placeholder="Password"
autocomplete="login-password"
[(ngModel)]="password"
required>
</div>
</div> </div>
<div class="form-group"> <div class="form-group">
<!-- Button --> <!-- Button -->
<div class="col-sm-12 controls"> <div class="col-sm-12 controls">
<button class="btn btn-primary pull-right btn-login" <button class="btn btn-primary btn-lg btn-block"
[disabled]="!LoginForm.form.valid" [disabled]="!LoginForm.form.valid"
type="submit" type="submit"
name="action" i18n>Enter name="action" i18n>Enter

View File

@ -26,7 +26,7 @@
<source>Username</source> <source>Username</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/login/login.component.ts</context> <context context-type="sourcefile">app/login/login.component.ts</context>
<context context-type="linenumber">21</context> <context context-type="linenumber">29</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context> <context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context>
@ -42,19 +42,19 @@
<source>Password</source> <source>Password</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/login/login.component.ts</context> <context context-type="sourcefile">app/login/login.component.ts</context>
<context context-type="linenumber">37</context> <context context-type="linenumber">45</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/sharelogin/share-login.component.ts</context> <context context-type="sourcefile">app/sharelogin/share-login.component.ts</context>
<context context-type="linenumber">25</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">67</context> <context context-type="linenumber">74</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">78</context> <context context-type="linenumber">84</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context> <context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context>
@ -70,7 +70,7 @@
<source>Remember me</source> <source>Remember me</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/login/login.component.ts</context> <context context-type="sourcefile">app/login/login.component.ts</context>
<context context-type="linenumber">43</context> <context context-type="linenumber">56</context>
</context-group> </context-group>
<target>Remember me</target> <target>Remember me</target>
</trans-unit> </trans-unit>
@ -79,7 +79,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/login/login.component.ts</context> <context context-type="sourcefile">app/login/login.component.ts</context>
<context context-type="linenumber">53</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
<target>Login <target>Login
</target> </target>
@ -90,7 +90,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/sharelogin/share-login.component.ts</context> <context context-type="sourcefile">app/sharelogin/share-login.component.ts</context>
<context context-type="linenumber">13</context> <context context-type="linenumber">11</context>
</context-group> </context-group>
<target> <target>
Wrong password Wrong password
@ -101,7 +101,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/sharelogin/share-login.component.ts</context> <context context-type="sourcefile">app/sharelogin/share-login.component.ts</context>
<context context-type="linenumber">36</context> <context context-type="linenumber">41</context>
</context-group> </context-group>
<target>Enter <target>Enter
</target> </target>
@ -118,7 +118,7 @@
<source>info</source> <source>info</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">26</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
<target>info</target> <target>info</target>
</trans-unit> </trans-unit>
@ -126,11 +126,11 @@
<source>toggle fullscreen</source> <source>toggle fullscreen</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">30</context> <context context-type="linenumber">32</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">34</context> <context context-type="linenumber">39</context>
</context-group> </context-group>
<target>toggle fullscreen</target> <target>toggle fullscreen</target>
</trans-unit> </trans-unit>
@ -138,7 +138,7 @@
<source>close</source> <source>close</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">36</context> <context context-type="linenumber">42</context>
</context-group> </context-group>
<target>close</target> <target>close</target>
</trans-unit> </trans-unit>
@ -146,7 +146,7 @@
<source>key: left arrow</source> <source>key: left arrow</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">41</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<target>key: left arrow</target> <target>key: left arrow</target>
</trans-unit> </trans-unit>
@ -154,7 +154,7 @@
<source>key: right arrow</source> <source>key: right arrow</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">45</context> <context context-type="linenumber">51</context>
</context-group> </context-group>
<target>key: right arrow</target> <target>key: right arrow</target>
</trans-unit> </trans-unit>
@ -206,7 +206,7 @@
<source>Logout</source> <source>Logout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/frame/frame.component.ts</context> <context context-type="sourcefile">app/frame/frame.component.ts</context>
<context context-type="linenumber">45</context> <context context-type="linenumber">38</context>
</context-group> </context-group>
<target>Logout</target> <target>Logout</target>
</trans-unit> </trans-unit>
@ -218,7 +218,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">18</context> <context context-type="linenumber">16</context>
</context-group> </context-group>
<target>Share</target> <target>Share</target>
</trans-unit> </trans-unit>
@ -227,7 +227,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">34</context> <context context-type="linenumber">35</context>
</context-group> </context-group>
<target>Copy <target>Copy
</target> </target>
@ -236,7 +236,7 @@
<source>Sharing:</source> <source>Sharing:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">41</context> <context context-type="linenumber">42</context>
</context-group> </context-group>
<target>Sharing:</target> <target>Sharing:</target>
</trans-unit> </trans-unit>
@ -244,7 +244,7 @@
<source>Include subfolders:</source> <source>Include subfolders:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">52</context> <context context-type="linenumber">53</context>
</context-group> </context-group>
<target>Include subfolders:</target> <target>Include subfolders:</target>
</trans-unit> </trans-unit>
@ -252,7 +252,7 @@
<source>Valid:</source> <source>Valid:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">84</context> <context context-type="linenumber">90</context>
</context-group> </context-group>
<target>Valid:</target> <target>Valid:</target>
</trans-unit> </trans-unit>
@ -260,7 +260,7 @@
<source>Minutes</source> <source>Minutes</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">94</context> <context context-type="linenumber">100</context>
</context-group> </context-group>
<target>Minutes</target> <target>Minutes</target>
</trans-unit> </trans-unit>
@ -268,7 +268,7 @@
<source>Hours</source> <source>Hours</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">95</context> <context context-type="linenumber">101</context>
</context-group> </context-group>
<target>Hours</target> <target>Hours</target>
</trans-unit> </trans-unit>
@ -276,7 +276,7 @@
<source>Days</source> <source>Days</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">96</context> <context context-type="linenumber">102</context>
</context-group> </context-group>
<target>Days</target> <target>Days</target>
</trans-unit> </trans-unit>
@ -284,15 +284,17 @@
<source>Months</source> <source>Months</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">97</context> <context context-type="linenumber">103</context>
</context-group> </context-group>
<target>Months</target> <target>Months</target>
</trans-unit> </trans-unit>
<trans-unit id="f0acecaa22df19767da6d9990458470b17da3d7a" datatype="html"> <trans-unit id="ac9751501a838bfb31f23e94ceb9616fe498a267" datatype="html">
<source>Server notifications</source> <source>
Server notifications
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/admin/admin.component.ts</context> <context context-type="sourcefile">app/admin/admin.component.ts</context>
<context context-type="linenumber">6</context> <context context-type="linenumber">5</context>
</context-group> </context-group>
<target>Server notifications</target> <target>Server notifications</target>
</trans-unit> </trans-unit>
@ -320,17 +322,17 @@
<source>Info</source> <source>Info</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/infopanel/info-panel.lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/infopanel/info-panel.lightbox.gallery.component.ts</context>
<context context-type="linenumber">5</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Info</target> <target>Info</target>
</trans-unit> </trans-unit>
<trans-unit id="343879e5c41bab3cbc6160ae25fb0ed8e08859f0" datatype="html"> <trans-unit id="427589505741d1da181b756815701e756184cb8d" datatype="html">
<source>Password protection </source> <source>Password protection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context> <context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context>
<context context-type="linenumber">3</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Password protection </target> <target>Password protection</target>
</trans-unit> </trans-unit>
<trans-unit id="cff1428d10d59d14e45edec3c735a27b5482db59" datatype="html"> <trans-unit id="cff1428d10d59d14e45edec3c735a27b5482db59" datatype="html">
<source>Name</source> <source>Name</source>
@ -374,7 +376,7 @@
<source>Add new User</source> <source>Add new User</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context> <context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context>
<context context-type="linenumber">72</context> <context context-type="linenumber">70</context>
</context-group> </context-group>
<target>Add new User</target> <target>Add new User</target>
</trans-unit> </trans-unit>
@ -396,11 +398,13 @@
<target>Add User <target>Add User
</target> </target>
</trans-unit> </trans-unit>
<trans-unit id="25e15358423a68caf2960ac3eac6f7cfd19d5a30" datatype="html"> <trans-unit id="26029ad47ff6a694b272298b212b5458128810be" datatype="html">
<source>Database settings</source> <source>
Database settings
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/database/database.settings.component.ts</context> <context context-type="sourcefile">app/settings/database/database.settings.component.ts</context>
<context context-type="linenumber">3</context> <context context-type="linenumber">2</context>
</context-group> </context-group>
<target>Database settings</target> <target>Database settings</target>
</trans-unit> </trans-unit>
@ -517,7 +521,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/map/map.settings.component.ts</context> <context context-type="sourcefile">app/settings/map/map.settings.component.ts</context>
<context context-type="linenumber">41</context> <context context-type="linenumber">39</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context> <context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context>
@ -547,7 +551,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/map/map.settings.component.ts</context> <context context-type="sourcefile">app/settings/map/map.settings.component.ts</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">42</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context> <context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context>
@ -572,11 +576,13 @@
<target>Reset <target>Reset
</target> </target>
</trans-unit> </trans-unit>
<trans-unit id="d6644690d6218f5ecc21dd3b2c69aca33d6d58c3" datatype="html"> <trans-unit id="7f69d84360f0db236db44098d55961bc2d267b5e" datatype="html">
<source>Thumbnail settings</source> <source>
Thumbnail settings
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context> <context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context>
<context context-type="linenumber">4</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Thumbnail settings</target> <target>Thumbnail settings</target>
</trans-unit> </trans-unit>
@ -792,11 +798,13 @@
Sharing is not supported with these settings Sharing is not supported with these settings
</target> </target>
</trans-unit> </trans-unit>
<trans-unit id="fe4fefb86d4b6629064ff0fa96fdc2b80fc151b0" datatype="html"> <trans-unit id="d62666b3159a0b5916b8f908c84e6b6f441ec1d1" datatype="html">
<source>Basic settings</source> <source>
Basic settings
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.ts</context> <context context-type="sourcefile">app/settings/basic/basic.settings.component.ts</context>
<context context-type="linenumber">4</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Basic settings</target> <target>Basic settings</target>
</trans-unit> </trans-unit>
@ -856,11 +864,13 @@
</context-group> </context-group>
<target>If you access the gallery under a sub url (like: http://mydomain.com/myGallery), set it here. If not working you might miss the '/' from the beginning of the url.</target> <target>If you access the gallery under a sub url (like: http://mydomain.com/myGallery), set it here. If not working you might miss the '/' from the beginning of the url.</target>
</trans-unit> </trans-unit>
<trans-unit id="1e99f581a015c671d53abad7c7df6a5ad35bfe85" datatype="html"> <trans-unit id="ee1319d3bfb2e70e14212ea2c3896e4ac4dc0092" datatype="html">
<source>Other settings</source> <source>
Other settings
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/other/other.settings.component.ts</context> <context context-type="sourcefile">app/settings/other/other.settings.component.ts</context>
<context context-type="linenumber">4</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Other settings</target> <target>Other settings</target>
</trans-unit> </trans-unit>
@ -938,11 +948,13 @@
</context-group> </context-group>
<target>Caches directory contents and search results for better performance</target> <target>Caches directory contents and search results for better performance</target>
</trans-unit> </trans-unit>
<trans-unit id="87b1696eb068572c3908643c425ee3090938c1a0" datatype="html"> <trans-unit id="5e00b6f637f57796ae6ce0bbafedf3849e28a171" datatype="html">
<source>Folder indexing</source> <source>
Folder indexing
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.ts</context> <context context-type="sourcefile">app/settings/indexing/indexing.settings.component.ts</context>
<context context-type="linenumber">4</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Folder indexing</target> <target>Folder indexing</target>
</trans-unit> </trans-unit>
@ -1096,6 +1108,22 @@
</context-group> </context-group>
<target>Images</target> <target>Images</target>
</trans-unit> </trans-unit>
<trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952" datatype="html">
<source>Yes</source>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>Yes</target>
</trans-unit>
<trans-unit id="3d3ae7deebc5949b0c1c78b9847886a94321d9fd" datatype="html">
<source>No</source>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>No</target>
</trans-unit>
<trans-unit id="867c1b6839b592cec2156dd0b8a0009fe1557bfa" datatype="html"> <trans-unit id="867c1b6839b592cec2156dd0b8a0009fe1557bfa" datatype="html">
<source>Url has been copied to clipboard</source> <source>Url has been copied to clipboard</source>
<context-group purpose="location"> <context-group purpose="location">
@ -1216,6 +1244,18 @@
</context-group> </context-group>
<target>Basic</target> <target>Basic</target>
</trans-unit> </trans-unit>
<trans-unit id="6244017173fe88802248f410e78f2e637f98f634" datatype="html">
<source>Restart the server to apply the new settings</source>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/settings/basic/basic.settings.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/settings/other/other.settings.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>Restart the server to apply the new settings</target>
</trans-unit>
<trans-unit id="f53ab04e9d8449445abf482bf44b521e2e695c3c" datatype="html"> <trans-unit id="f53ab04e9d8449445abf482bf44b521e2e695c3c" datatype="html">
<source>Indexing</source> <source>Indexing</source>
<context-group purpose="location"> <context-group purpose="location">
@ -1260,14 +1300,6 @@
</context-group> </context-group>
<target>Other</target> <target>Other</target>
</trans-unit> </trans-unit>
<trans-unit id="6244017173fe88802248f410e78f2e637f98f634" datatype="html">
<source>Restart the server to apply the new settings</source>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/settings/other/other.settings.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>Restart the server to apply the new settings</target>
</trans-unit>
<trans-unit id="45dda89cf029b7d7b457a8dff01dc4b9a6485816" datatype="html"> <trans-unit id="45dda89cf029b7d7b457a8dff01dc4b9a6485816" datatype="html">
<source>Thumbnail</source> <source>Thumbnail</source>
<context-group purpose="location"> <context-group purpose="location">
@ -1292,6 +1324,14 @@
</context-group> </context-group>
<target>Password protection enabled</target> <target>Password protection enabled</target>
</trans-unit> </trans-unit>
<trans-unit id="c76b3ba44c5b7ab363729f81f763b29ef5d7a641" datatype="html">
<source>Server restart is recommended.</source>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/settings/usermanager/usermanager.settings.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>Server restart is recommended.</target>
</trans-unit>
<trans-unit id="00de5dcd17a5ebd17e67e0688bc638e01bc510a4" datatype="html"> <trans-unit id="00de5dcd17a5ebd17e67e0688bc638e01bc510a4" datatype="html">
<source>Password protection disabled</source> <source>Password protection disabled</source>
<context-group purpose="location"> <context-group purpose="location">

View File

@ -24,7 +24,7 @@
<source>Username</source> <source>Username</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/login/login.component.ts</context> <context context-type="sourcefile">app/login/login.component.ts</context>
<context context-type="linenumber">21</context> <context context-type="linenumber">29</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context> <context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context>
@ -40,19 +40,19 @@
<source>Password</source> <source>Password</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/login/login.component.ts</context> <context context-type="sourcefile">app/login/login.component.ts</context>
<context context-type="linenumber">37</context> <context context-type="linenumber">45</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/sharelogin/share-login.component.ts</context> <context context-type="sourcefile">app/sharelogin/share-login.component.ts</context>
<context context-type="linenumber">25</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">67</context> <context context-type="linenumber">74</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">78</context> <context context-type="linenumber">84</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context> <context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context>
@ -68,7 +68,7 @@
<source>Remember me</source> <source>Remember me</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/login/login.component.ts</context> <context context-type="sourcefile">app/login/login.component.ts</context>
<context context-type="linenumber">43</context> <context context-type="linenumber">56</context>
</context-group> </context-group>
<target>Emlékezz rám</target> <target>Emlékezz rám</target>
</trans-unit> </trans-unit>
@ -77,7 +77,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/login/login.component.ts</context> <context context-type="sourcefile">app/login/login.component.ts</context>
<context context-type="linenumber">53</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
<target>Belépés</target> <target>Belépés</target>
</trans-unit> </trans-unit>
@ -87,7 +87,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/sharelogin/share-login.component.ts</context> <context context-type="sourcefile">app/sharelogin/share-login.component.ts</context>
<context context-type="linenumber">13</context> <context context-type="linenumber">11</context>
</context-group> </context-group>
<target>Rossz jelszó</target> <target>Rossz jelszó</target>
</trans-unit> </trans-unit>
@ -96,7 +96,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/sharelogin/share-login.component.ts</context> <context context-type="sourcefile">app/sharelogin/share-login.component.ts</context>
<context context-type="linenumber">36</context> <context context-type="linenumber">41</context>
</context-group> </context-group>
<target>Belépés</target> <target>Belépés</target>
</trans-unit> </trans-unit>
@ -112,7 +112,7 @@
<source>info</source> <source>info</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">26</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
<target>info</target> <target>info</target>
</trans-unit> </trans-unit>
@ -120,11 +120,11 @@
<source>toggle fullscreen</source> <source>toggle fullscreen</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">30</context> <context context-type="linenumber">32</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">34</context> <context context-type="linenumber">39</context>
</context-group> </context-group>
<target>teljes képernyőre váltás</target> <target>teljes képernyőre váltás</target>
</trans-unit> </trans-unit>
@ -132,7 +132,7 @@
<source>close</source> <source>close</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">36</context> <context context-type="linenumber">42</context>
</context-group> </context-group>
<target>bezárás</target> <target>bezárás</target>
</trans-unit> </trans-unit>
@ -140,7 +140,7 @@
<source>key: left arrow</source> <source>key: left arrow</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">41</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<target>billentyű: balra nyíl</target> <target>billentyű: balra nyíl</target>
</trans-unit> </trans-unit>
@ -148,7 +148,7 @@
<source>key: right arrow</source> <source>key: right arrow</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/lightbox.gallery.component.ts</context>
<context context-type="linenumber">45</context> <context context-type="linenumber">51</context>
</context-group> </context-group>
<target>billentyű: jobbra nyíl</target> <target>billentyű: jobbra nyíl</target>
</trans-unit> </trans-unit>
@ -174,7 +174,7 @@
<context context-type="sourcefile">app/gallery/gallery.component.ts</context> <context context-type="sourcefile">app/gallery/gallery.component.ts</context>
<context context-type="linenumber">10</context> <context context-type="linenumber">10</context>
</context-group> </context-group>
<target>napok</target> <target>nap</target>
</trans-unit> </trans-unit>
<trans-unit id="c17b163553f84f2f704031a1b343e7b89c5c5ee1" datatype="html"> <trans-unit id="c17b163553f84f2f704031a1b343e7b89c5c5ee1" datatype="html">
<source> <source>
@ -198,7 +198,7 @@
<source>Logout</source> <source>Logout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/frame/frame.component.ts</context> <context context-type="sourcefile">app/frame/frame.component.ts</context>
<context context-type="linenumber">45</context> <context context-type="linenumber">38</context>
</context-group> </context-group>
<target>Kijelentkezés</target> <target>Kijelentkezés</target>
</trans-unit> </trans-unit>
@ -210,7 +210,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">18</context> <context context-type="linenumber">16</context>
</context-group> </context-group>
<target>Megosztás</target> <target>Megosztás</target>
</trans-unit> </trans-unit>
@ -219,7 +219,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">34</context> <context context-type="linenumber">35</context>
</context-group> </context-group>
<target>Másolat</target> <target>Másolat</target>
</trans-unit> </trans-unit>
@ -227,7 +227,7 @@
<source>Sharing:</source> <source>Sharing:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">41</context> <context context-type="linenumber">42</context>
</context-group> </context-group>
<target>megosztás:</target> <target>megosztás:</target>
</trans-unit> </trans-unit>
@ -235,7 +235,7 @@
<source>Include subfolders:</source> <source>Include subfolders:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">52</context> <context context-type="linenumber">53</context>
</context-group> </context-group>
<target>Alkönyvtárak beillesztése:</target> <target>Alkönyvtárak beillesztése:</target>
</trans-unit> </trans-unit>
@ -243,7 +243,7 @@
<source>Valid:</source> <source>Valid:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">84</context> <context context-type="linenumber">90</context>
</context-group> </context-group>
<target>Érvényes:</target> <target>Érvényes:</target>
</trans-unit> </trans-unit>
@ -251,7 +251,7 @@
<source>Minutes</source> <source>Minutes</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">94</context> <context context-type="linenumber">100</context>
</context-group> </context-group>
<target>Percek</target> <target>Percek</target>
</trans-unit> </trans-unit>
@ -259,7 +259,7 @@
<source>Hours</source> <source>Hours</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">95</context> <context context-type="linenumber">101</context>
</context-group> </context-group>
<target>Órák</target> <target>Órák</target>
</trans-unit> </trans-unit>
@ -267,7 +267,7 @@
<source>Days</source> <source>Days</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">96</context> <context context-type="linenumber">102</context>
</context-group> </context-group>
<target>Napok</target> <target>Napok</target>
</trans-unit> </trans-unit>
@ -275,15 +275,17 @@
<source>Months</source> <source>Months</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">97</context> <context context-type="linenumber">103</context>
</context-group> </context-group>
<target>hónapok</target> <target>hónapok</target>
</trans-unit> </trans-unit>
<trans-unit id="f0acecaa22df19767da6d9990458470b17da3d7a" datatype="html"> <trans-unit id="ac9751501a838bfb31f23e94ceb9616fe498a267" datatype="html">
<source>Server notifications</source> <source>
Server notifications
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/admin/admin.component.ts</context> <context context-type="sourcefile">app/admin/admin.component.ts</context>
<context context-type="linenumber">6</context> <context context-type="linenumber">5</context>
</context-group> </context-group>
<target>Szerver értesítések</target> <target>Szerver értesítések</target>
</trans-unit> </trans-unit>
@ -309,12 +311,12 @@
<source>Info</source> <source>Info</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/gallery/lightbox/infopanel/info-panel.lightbox.gallery.component.ts</context> <context context-type="sourcefile">app/gallery/lightbox/infopanel/info-panel.lightbox.gallery.component.ts</context>
<context context-type="linenumber">5</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Info</target> <target>Info</target>
</trans-unit> </trans-unit>
<trans-unit id="343879e5c41bab3cbc6160ae25fb0ed8e08859f0" datatype="html"> <trans-unit id="427589505741d1da181b756815701e756184cb8d" datatype="html">
<source>Password protection </source> <source>Password protection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context> <context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context>
<context context-type="linenumber">3</context> <context context-type="linenumber">3</context>
@ -360,7 +362,7 @@
<source>Add new User</source> <source>Add new User</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context> <context context-type="sourcefile">app/settings/usermanager/usermanager.settings.component.ts</context>
<context context-type="linenumber">72</context> <context context-type="linenumber">70</context>
</context-group> </context-group>
<target>Új felhasználó hozzáadása</target> <target>Új felhasználó hozzáadása</target>
</trans-unit> </trans-unit>
@ -381,11 +383,13 @@
</context-group> </context-group>
<target>Felhasználó hozzáadása</target> <target>Felhasználó hozzáadása</target>
</trans-unit> </trans-unit>
<trans-unit id="25e15358423a68caf2960ac3eac6f7cfd19d5a30" datatype="html"> <trans-unit id="26029ad47ff6a694b272298b212b5458128810be" datatype="html">
<source>Database settings</source> <source>
Database settings
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/database/database.settings.component.ts</context> <context context-type="sourcefile">app/settings/database/database.settings.component.ts</context>
<context context-type="linenumber">3</context> <context context-type="linenumber">2</context>
</context-group> </context-group>
<target>Adatbázis beállítások</target> <target>Adatbázis beállítások</target>
</trans-unit> </trans-unit>
@ -500,7 +504,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/map/map.settings.component.ts</context> <context context-type="sourcefile">app/settings/map/map.settings.component.ts</context>
<context context-type="linenumber">41</context> <context context-type="linenumber">39</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context> <context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context>
@ -529,7 +533,7 @@
</source> </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/map/map.settings.component.ts</context> <context context-type="sourcefile">app/settings/map/map.settings.component.ts</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">42</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context> <context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context>
@ -553,11 +557,13 @@
</context-group> </context-group>
<target>Visszaállítás</target> <target>Visszaállítás</target>
</trans-unit> </trans-unit>
<trans-unit id="d6644690d6218f5ecc21dd3b2c69aca33d6d58c3" datatype="html"> <trans-unit id="7f69d84360f0db236db44098d55961bc2d267b5e" datatype="html">
<source>Thumbnail settings</source> <source>
Thumbnail settings
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context> <context context-type="sourcefile">app/settings/thumbnail/thumbanil.settings.component.ts</context>
<context context-type="linenumber">4</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Miniatűr beállítások</target> <target>Miniatűr beállítások</target>
</trans-unit> </trans-unit>
@ -768,13 +774,15 @@
</context-group> </context-group>
<target>A megosztás nem támogatott ezekkel a beállításokkal</target> <target>A megosztás nem támogatott ezekkel a beállításokkal</target>
</trans-unit> </trans-unit>
<trans-unit id="fe4fefb86d4b6629064ff0fa96fdc2b80fc151b0" datatype="html"> <trans-unit id="d62666b3159a0b5916b8f908c84e6b6f441ec1d1" datatype="html">
<source>Basic settings</source> <source>
Basic settings
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.ts</context> <context context-type="sourcefile">app/settings/basic/basic.settings.component.ts</context>
<context context-type="linenumber">4</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Alapvető beállítások</target> <target>Alapbeállítások</target>
</trans-unit> </trans-unit>
<trans-unit id="870d05214ce19848ea4b7fe698e9a2e73db0c715" datatype="html"> <trans-unit id="870d05214ce19848ea4b7fe698e9a2e73db0c715" datatype="html">
<source>Page title</source> <source>Page title</source>
@ -832,11 +840,13 @@
</context-group> </context-group>
<target>Ha az oldalt egy al címen lehet elérni (pl: http://oldalam.hu/myGallery), akkor az alcímet itt állitsd be. Hiba esetén lehet, hogy a "/" hiányzik az url elejéről.</target> <target>Ha az oldalt egy al címen lehet elérni (pl: http://oldalam.hu/myGallery), akkor az alcímet itt állitsd be. Hiba esetén lehet, hogy a "/" hiányzik az url elejéről.</target>
</trans-unit> </trans-unit>
<trans-unit id="1e99f581a015c671d53abad7c7df6a5ad35bfe85" datatype="html"> <trans-unit id="ee1319d3bfb2e70e14212ea2c3896e4ac4dc0092" datatype="html">
<source>Other settings</source> <source>
Other settings
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/other/other.settings.component.ts</context> <context context-type="sourcefile">app/settings/other/other.settings.component.ts</context>
<context context-type="linenumber">4</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Egyéb beállitások</target> <target>Egyéb beállitások</target>
</trans-unit> </trans-unit>
@ -914,11 +924,13 @@
</context-group> </context-group>
<target>Gyorsítótárazza a könyvtár tartalmát és a keresési eredményeket a jobb teljesítmény érdekében</target> <target>Gyorsítótárazza a könyvtár tartalmát és a keresési eredményeket a jobb teljesítmény érdekében</target>
</trans-unit> </trans-unit>
<trans-unit id="87b1696eb068572c3908643c425ee3090938c1a0" datatype="html"> <trans-unit id="5e00b6f637f57796ae6ce0bbafedf3849e28a171" datatype="html">
<source>Folder indexing</source> <source>
Folder indexing
</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.ts</context> <context context-type="sourcefile">app/settings/indexing/indexing.settings.component.ts</context>
<context context-type="linenumber">4</context> <context context-type="linenumber">3</context>
</context-group> </context-group>
<target>Mappa indexelése</target> <target>Mappa indexelése</target>
</trans-unit> </trans-unit>
@ -1067,6 +1079,22 @@
</context-group> </context-group>
<target>képek</target> <target>képek</target>
</trans-unit> </trans-unit>
<trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952" datatype="html">
<source>Yes</source>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>Igen</target>
</trans-unit>
<trans-unit id="3d3ae7deebc5949b0c1c78b9847886a94321d9fd" datatype="html">
<source>No</source>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/gallery/share/share.gallery.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>Nem</target>
</trans-unit>
<trans-unit id="867c1b6839b592cec2156dd0b8a0009fe1557bfa" datatype="html"> <trans-unit id="867c1b6839b592cec2156dd0b8a0009fe1557bfa" datatype="html">
<source>Url has been copied to clipboard</source> <source>Url has been copied to clipboard</source>
<context-group purpose="location"> <context-group purpose="location">
@ -1187,6 +1215,18 @@
</context-group> </context-group>
<target>Alapvető</target> <target>Alapvető</target>
</trans-unit> </trans-unit>
<trans-unit id="6244017173fe88802248f410e78f2e637f98f634" datatype="html">
<source>Restart the server to apply the new settings</source>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/settings/basic/basic.settings.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/settings/other/other.settings.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>Indítsa újra a weboldalt az új beállítások alkalmazásához</target>
</trans-unit>
<trans-unit id="f53ab04e9d8449445abf482bf44b521e2e695c3c" datatype="html"> <trans-unit id="f53ab04e9d8449445abf482bf44b521e2e695c3c" datatype="html">
<source>Indexing</source> <source>Indexing</source>
<context-group purpose="location"> <context-group purpose="location">
@ -1231,14 +1271,6 @@
</context-group> </context-group>
<target>Más</target> <target>Más</target>
</trans-unit> </trans-unit>
<trans-unit id="6244017173fe88802248f410e78f2e637f98f634" datatype="html">
<source>Restart the server to apply the new settings</source>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/settings/other/other.settings.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>Indítsa újra a weboldalt az új beállítások alkalmazásához</target>
</trans-unit>
<trans-unit id="45dda89cf029b7d7b457a8dff01dc4b9a6485816" datatype="html"> <trans-unit id="45dda89cf029b7d7b457a8dff01dc4b9a6485816" datatype="html">
<source>Thumbnail</source> <source>Thumbnail</source>
<context-group purpose="location"> <context-group purpose="location">
@ -1263,6 +1295,14 @@
</context-group> </context-group>
<target>Jelszavas védelem engedélyezve</target> <target>Jelszavas védelem engedélyezve</target>
</trans-unit> </trans-unit>
<trans-unit id="c76b3ba44c5b7ab363729f81f763b29ef5d7a641" datatype="html">
<source>Server restart is recommended.</source>
<context-group purpose="location">
<context context-type="sourcefile">frontend/app/settings/usermanager/usermanager.settings.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>Szerver újraindítás javasolt.</target>
</trans-unit>
<trans-unit id="00de5dcd17a5ebd17e67e0688bc638e01bc510a4" datatype="html"> <trans-unit id="00de5dcd17a5ebd17e67e0688bc638e01bc510a4" datatype="html">
<source>Password protection disabled</source> <source>Password protection disabled</source>
<context-group purpose="location"> <context-group purpose="location">

View File

@ -70,7 +70,7 @@
"@types/node": "^10.0.3", "@types/node": "^10.0.3",
"@types/sharp": "^0.17.8", "@types/sharp": "^0.17.8",
"@types/winston": "^2.3.9", "@types/winston": "^2.3.9",
"bootstrap": "3.3.7", "bootstrap": "4.1.1",
"chai": "^4.1.2", "chai": "^4.1.2",
"codelyzer": "~4.3.0", "codelyzer": "~4.3.0",
"core-js": "^2.5.5", "core-js": "^2.5.5",
@ -100,6 +100,7 @@
"ng2-toastr": "^4.1.2", "ng2-toastr": "^4.1.2",
"ngx-bootstrap": "^2.0.4", "ngx-bootstrap": "^2.0.4",
"ngx-clipboard": "^10.0.0", "ngx-clipboard": "^10.0.0",
"open-iconic": "^1.1.1",
"protractor": "^5.3.1", "protractor": "^5.3.1",
"remap-istanbul": "^0.11.1", "remap-istanbul": "^0.11.1",
"rimraf": "^2.6.2", "rimraf": "^2.6.2",