Add share button
This commit is contained in:
parent
de443bb5de
commit
51d5283917
@ -21,7 +21,7 @@ import {TranslateModule, TranslateService} from '@ngx-translate/core';
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import * as enLang from '../assets/i18n/en.json';
|
import * as enLang from '../assets/i18n/en.json';
|
||||||
import {HttpClientModule} from '@angular/common/http';
|
import {HttpClientModule} from '@angular/common/http';
|
||||||
import {MatButtonToggleModule, MatCheckboxModule, MatDividerModule, MatTooltipModule} from '@angular/material';
|
import {MatButtonToggleModule, MatCheckboxModule, MatDialogModule, MatDividerModule, MatTooltipModule} from '@angular/material';
|
||||||
import {FormsModule} from '@angular/forms';
|
import {FormsModule} from '@angular/forms';
|
||||||
import {RegionComponent} from './components/region/region.component';
|
import {RegionComponent} from './components/region/region.component';
|
||||||
import {ResultComponent} from './components/result/result.component';
|
import {ResultComponent} from './components/result/result.component';
|
||||||
@ -30,6 +30,8 @@ import {GraphComponent} from './components/graph/graph.component';
|
|||||||
import {RegionStatsComponent} from './components/region-stats/region-stats.component';
|
import {RegionStatsComponent} from './components/region-stats/region-stats.component';
|
||||||
import {BookmarkButtonComponent} from './components/bookmark-button/bookmark-button.component';
|
import {BookmarkButtonComponent} from './components/bookmark-button/bookmark-button.component';
|
||||||
import {BookmarkListComponent} from './containers/bookmark-list/bookmark-list.component';
|
import {BookmarkListComponent} from './containers/bookmark-list/bookmark-list.component';
|
||||||
|
import {ShareButtonComponent} from './components/share-button/share-button.component';
|
||||||
|
import {ShareDialogComponent} from './dialogs/share-dialog/share-dialog.component';
|
||||||
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
@ -45,7 +47,9 @@ import {BookmarkListComponent} from './containers/bookmark-list/bookmark-list.co
|
|||||||
GraphComponent,
|
GraphComponent,
|
||||||
RegionStatsComponent,
|
RegionStatsComponent,
|
||||||
BookmarkButtonComponent,
|
BookmarkButtonComponent,
|
||||||
BookmarkListComponent
|
BookmarkListComponent,
|
||||||
|
ShareButtonComponent,
|
||||||
|
ShareDialogComponent
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
@ -66,10 +70,14 @@ import {BookmarkListComponent} from './containers/bookmark-list/bookmark-list.co
|
|||||||
FormsModule,
|
FormsModule,
|
||||||
MatButtonToggleModule,
|
MatButtonToggleModule,
|
||||||
MatDividerModule,
|
MatDividerModule,
|
||||||
MatTooltipModule
|
MatTooltipModule,
|
||||||
|
MatDialogModule
|
||||||
],
|
],
|
||||||
providers: [],
|
providers: [],
|
||||||
bootstrap: [AppComponent]
|
bootstrap: [AppComponent],
|
||||||
|
entryComponents: [
|
||||||
|
ShareDialogComponent
|
||||||
|
]
|
||||||
})
|
})
|
||||||
export class AppModule {
|
export class AppModule {
|
||||||
constructor(translate: TranslateService) {
|
constructor(translate: TranslateService) {
|
||||||
|
|||||||
@ -7,8 +7,6 @@
|
|||||||
<span class="region-country">| {{region.country}}</span>
|
<span class="region-country">| {{region.country}}</span>
|
||||||
</div>
|
</div>
|
||||||
<app-bookmark-button [region]="region"></app-bookmark-button>
|
<app-bookmark-button [region]="region"></app-bookmark-button>
|
||||||
<button mat-icon-button>
|
<app-share-button [region]="region"></app-share-button>
|
||||||
<mat-icon>share</mat-icon>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -7,9 +7,7 @@
|
|||||||
<span class="result-country">| {{result.country}}</span>
|
<span class="result-country">| {{result.country}}</span>
|
||||||
</div>
|
</div>
|
||||||
<app-bookmark-button [region]="result"></app-bookmark-button>
|
<app-bookmark-button [region]="result"></app-bookmark-button>
|
||||||
<button mat-icon-button>
|
<app-share-button [region]="result"></app-share-button>
|
||||||
<mat-icon>share</mat-icon>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="result-details">
|
<div class="result-details">
|
||||||
<table>
|
<table>
|
||||||
|
|||||||
@ -0,0 +1,3 @@
|
|||||||
|
<button (click)="onShare($event)" mat-icon-button>
|
||||||
|
<mat-icon>share</mat-icon>
|
||||||
|
</button>
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
|
||||||
|
|
||||||
|
import {ShareButtonComponent} from './share-button.component';
|
||||||
|
|
||||||
|
describe('ShareButtonComponent', () => {
|
||||||
|
let component: ShareButtonComponent;
|
||||||
|
let fixture: ComponentFixture<ShareButtonComponent>;
|
||||||
|
|
||||||
|
beforeEach(async(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ShareButtonComponent]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ShareButtonComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
import {Component, Input, OnInit} from '@angular/core';
|
||||||
|
import {Region} from '../../interfaces/region.interface';
|
||||||
|
import {ShareDialogComponent} from '../../dialogs/share-dialog/share-dialog.component';
|
||||||
|
import {MatDialog} from '@angular/material';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-share-button',
|
||||||
|
templateUrl: './share-button.component.html',
|
||||||
|
styleUrls: ['./share-button.component.scss']
|
||||||
|
})
|
||||||
|
export class ShareButtonComponent implements OnInit {
|
||||||
|
|
||||||
|
@Input()
|
||||||
|
region: Region;
|
||||||
|
|
||||||
|
constructor(public dialog: MatDialog) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
}
|
||||||
|
|
||||||
|
async onShare(event: Event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
if (navigator.share) {
|
||||||
|
try {
|
||||||
|
await this.executeMobileShareMenu();
|
||||||
|
} catch (e) {
|
||||||
|
this.executeShareDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
this.executeShareDialog();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async executeMobileShareMenu() {
|
||||||
|
const shareData = {
|
||||||
|
title: 'Travopti',
|
||||||
|
text: `Check out the region "${this.region.name}"`,
|
||||||
|
url: `https://travopti.de/region/${this.region.region_id}`
|
||||||
|
};
|
||||||
|
// @ts-ignore
|
||||||
|
await navigator.share(shareData);
|
||||||
|
}
|
||||||
|
|
||||||
|
executeShareDialog() {
|
||||||
|
this.dialog.open(ShareDialogComponent, {
|
||||||
|
width: '350px',
|
||||||
|
data: this.region
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -7,9 +7,7 @@
|
|||||||
<span class="region-name">{{region.name}}</span>
|
<span class="region-name">{{region.name}}</span>
|
||||||
</div>
|
</div>
|
||||||
<app-bookmark-button [region]="region"></app-bookmark-button>
|
<app-bookmark-button [region]="region"></app-bookmark-button>
|
||||||
<button mat-icon-button>
|
<app-share-button [region]="region"></app-share-button>
|
||||||
<mat-icon>share</mat-icon>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
<p *ngIf="region.description" class="region-decsription">
|
<p *ngIf="region.description" class="region-decsription">
|
||||||
<span>{{region.description.substr(0, DESC_CUT_POINT)}}</span>
|
<span>{{region.description.substr(0, DESC_CUT_POINT)}}</span>
|
||||||
|
|||||||
@ -0,0 +1,13 @@
|
|||||||
|
<div class="dialog-header">
|
||||||
|
<span mat-dialog-title>Share the link</span>
|
||||||
|
<button [mat-dialog-close]="undefined" mat-icon-button>
|
||||||
|
<mat-icon>clear</mat-icon>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="dialog-body">
|
||||||
|
<input #url [disabled]="isCopied" class="url" value="http://{{host}}/region/{{data.region_id}}">
|
||||||
|
<button (click)="onCopy()" [disabled]="isCopied" color="primary" mat-flat-button>
|
||||||
|
<mat-icon>{{isCopied ? 'done' : 'content_copy'}}</mat-icon>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
.dialog-header {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
|
||||||
|
span {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-body {
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
.url {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
border: 1px solid black;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
|
||||||
|
|
||||||
|
import {ShareDialogComponent} from './share-dialog.component';
|
||||||
|
|
||||||
|
describe('ShareDialogComponent', () => {
|
||||||
|
let component: ShareDialogComponent;
|
||||||
|
let fixture: ComponentFixture<ShareDialogComponent>;
|
||||||
|
|
||||||
|
beforeEach(async(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ShareDialogComponent]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ShareDialogComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
import {Component, ElementRef, Inject, OnInit, ViewChild} from '@angular/core';
|
||||||
|
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material';
|
||||||
|
import {Region} from '../../interfaces/region.interface';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-share-dialog',
|
||||||
|
templateUrl: './share-dialog.component.html',
|
||||||
|
styleUrls: ['./share-dialog.component.scss']
|
||||||
|
})
|
||||||
|
export class ShareDialogComponent implements OnInit {
|
||||||
|
|
||||||
|
@ViewChild('url', {static: false})
|
||||||
|
urlTextBox: ElementRef;
|
||||||
|
|
||||||
|
readonly host = window.location.host;
|
||||||
|
|
||||||
|
isCopied = false;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
public dialogRef: MatDialogRef<ShareDialogComponent>,
|
||||||
|
@Inject(MAT_DIALOG_DATA) public data: Region
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
}
|
||||||
|
|
||||||
|
onCopy() {
|
||||||
|
const urlElement: HTMLInputElement = this.urlTextBox.nativeElement;
|
||||||
|
|
||||||
|
urlElement.select();
|
||||||
|
urlElement.setSelectionRange(0, 999); // For mobile devices
|
||||||
|
|
||||||
|
document.execCommand('copy');
|
||||||
|
|
||||||
|
urlElement.value = 'Copied to Clipboard!';
|
||||||
|
this.isCopied = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user