From 21d34916b6884902a9b7853973bd39b75ef5d36c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Mau=C3=9F?= <lukas.mauss@mni.thm.de> Date: Wed, 26 Feb 2020 19:24:11 +0100 Subject: [PATCH] Switch to 'angularx-qrcode'-lib for qr-codes --- package-lock.json | 195 ++++++++++++++++-- package.json | 1 + .../qr-code-dialog.component.html | 14 +- .../qr-code-dialog.component.scss | 51 +---- .../qr-code-dialog.component.ts | 63 +----- .../shared/header/header.component.ts | 8 +- src/app/components/shared/shared.module.ts | 4 +- 7 files changed, 212 insertions(+), 124 deletions(-) diff --git a/package-lock.json b/package-lock.json index 070ab0c6a..281cb5e0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2524,6 +2524,16 @@ "resolved": "https://registry.npmjs.org/angular2-uuid/-/angular2-uuid-1.1.1.tgz", "integrity": "sha1-cvA81TK39AAy6x7PufhFc4S+lW4=" }, + "angularx-qrcode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/angularx-qrcode/-/angularx-qrcode-2.1.0.tgz", + "integrity": "sha512-4mtlPJmemQINEz8OH6cYOllLJ77kFamk38G1L8OLF4X/nrxWaFIxMiKcPHf/HVeqATSAPismgqPu9aM5RhF/ig==", + "requires": { + "@angular/common": ">= 5.0.0 < 9.1.0", + "qrcode": "1.4.2", + "tslib": "^1.9.0" + } + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", @@ -3595,8 +3605,7 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-api": { "version": "3.0.0", @@ -3957,7 +3966,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -4738,8 +4746,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -5031,6 +5038,11 @@ "randombytes": "^2.0.0" } }, + "dijkstrajs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz", + "integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs=" + }, "dir-glob": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", @@ -10434,8 +10446,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", @@ -10603,6 +10614,11 @@ } } }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" + }, "portfinder": { "version": "1.0.25", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", @@ -11564,6 +11580,159 @@ "integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=", "dev": true }, + "qrcode": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.2.tgz", + "integrity": "sha512-eR6RgxFYPDFH+zFLTJKtoNP/RlsHANQb52AUmQ2bGDPMuUw7jJb0F+DNEgx7qQGIElrbFxWYMc0/B91zLZPF9Q==", + "requires": { + "dijkstrajs": "^1.0.1", + "isarray": "^2.0.1", + "pngjs": "^3.3.0", + "yargs": "^13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -11966,8 +12135,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { "version": "1.0.1", @@ -12394,8 +12562,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.1", @@ -14850,8 +15017,7 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "with-callback": { "version": "1.0.2", @@ -14951,8 +15117,7 @@ "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { "version": "2.1.2", diff --git a/package.json b/package.json index 10e58fda9..1803e9968 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@ngx-translate/core": "^10.0.2", "@ngx-translate/http-loader": "^4.0.0", "@stomp/ng2-stompjs": "^7.2.0", + "angularx-qrcode": "^2.1.0", "chart.js": "^2.7.3", "core-js": "^2.5.7", "is-docker": "^1.1.0", diff --git a/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.html b/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.html index 30efef0b7..9acd0f06e 100644 --- a/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.html +++ b/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.html @@ -1,14 +1,12 @@ <ars-screen> - <div class="qr_content" #imageWrapper> - <ngx-qrcode></ngx-qrcode> - </div> - <div class="qr_header"> - <button mat-icon-button (click)="close();"> + <div fxLayout="column" fxLayoutAlign="center center" class="qr-container"> + <button class="exitButton" mat-raised-button (click)="onCloseClick()"> <mat-icon>close</mat-icon> </button> - <div class="qr_text" #text> - <h2>{{url}} - <br>{{'qr-dialog.session' | translate}}: {{qrCode.substring(36, 40)}} {{qrCode.substring(40, 44)}}</h2> + <div> + <h2>frag.jetzt</h2> + <h2>{{'qr-dialog.session' | translate}}: {{key.slice(0, 4)}} {{key.slice(4, 8)}}</h2> </div> + <qrcode [qrdata]="data" [width]="qrWidth" [errorCorrectionLevel]="'M'"></qrcode> </div> </ars-screen> diff --git a/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.scss b/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.scss index 96c9f68a9..9c210d2aa 100644 --- a/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.scss +++ b/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.scss @@ -1,47 +1,16 @@ - -.qr_header { - width: 100%; - height: 64px; - position: absolute; - left: 0px; - top: 0px; - background-color: #FFFFFF; -} - -.qr_text > h2{ - color:black!important; +::ng-deep .mat-dialog-container { + background-color: var(--surface); } -.qr_header > button { - margin-right: 16px; - margin-top: 12px; - position: fixed; /* or position: absolute; */ - top: 0; - right: 0; - color: #000000; +.qr-container { + height: 100%; } -.qr_content { - background-repeat: no-repeat; - background-position: center; - background-size: contain; - width: 100%; - height: calc(100% - 64px); +.exitButton { + background-color: var(--secondary); + color: var(--on-secondary); position: absolute; - left: 0px; - top: 64px; - image-rendering: pixelated; - background-color: #FFFFFF; -} - -.qr_content img { - display: none; -} - -.qr_text{ - float:left; - position:fixed; - left:50%; - top:0px; - transform:translate(-50%); + top: 2em; + right: 2em; + max-height: 100px; } diff --git a/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.ts b/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.ts index 9573ead46..7d462a2ba 100644 --- a/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.ts +++ b/src/app/components/shared/_dialogs/qr-code-dialog/qr-code-dialog.component.ts @@ -1,16 +1,5 @@ -import { - AfterViewInit, - Component, - ElementRef, - OnInit, - QueryList, - Renderer2, - ViewChild, - ViewChildren, - ViewEncapsulation -} from '@angular/core'; +import { AfterViewInit, Component, OnInit, ViewEncapsulation } from '@angular/core'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; -import { DialogConfirmActionButtonType } from '../../dialog/dialog-action-buttons/dialog-action-buttons.component'; @Component({ selector: 'app-qr-code-dialog', @@ -20,20 +9,13 @@ import { DialogConfirmActionButtonType } from '../../dialog/dialog-action-button }) export class QrCodeDialogComponent implements OnInit, AfterViewInit { - @ViewChild('imageWrapper') imgWrp: ElementRef; - @ViewChild('text') text: ElementRef; - - url: string = window.location.hostname; - private img: HTMLImageElement; - qrCode = ''; - - confirmButtonType: DialogConfirmActionButtonType = DialogConfirmActionButtonType.Primary; + data: string; + qrWidth: number; + key: string; constructor( private dialog: MatDialog, private dialogRef: MatDialogRef<QrCodeDialogComponent>, - private ref: ElementRef, - private render: Renderer2 ) { } @@ -41,40 +23,11 @@ export class QrCodeDialogComponent implements OnInit, AfterViewInit { } ngAfterViewInit() { - window.addEventListener('resize', e => { - this.onresize(); - }); - this.onresize(); - } - - private onresize() { - const width = this.imgWrp.nativeElement.offsetWidth; - const height = this.imgWrp.nativeElement.offsetHeight; - if (width > height) {this.setPosition(height); } else { this.setPosition(width); } - } - - private setPosition(offset: number) { - this.render.setStyle( - this.text.nativeElement, - 'margin-left', - (-offset / 2) + (this.text.nativeElement.offsetWidth / 2) + (offset / 10) + 'px' - ); - } - - public setQRCode(url: string) { - this.qrCode = url; - // this.code.value = url; - // this.code.createQRCode(); - // this.code.toDataURL().then((a) => { - // this.createImage(a.toString()); - // }); - } - - private createImage(base: string) { - this.render.setStyle(this.imgWrp.nativeElement, 'background-image', 'url(' + base + ')'); + const minSize = Math.min(document.body.clientWidth, document.body.clientHeight); + this.qrWidth = minSize - (minSize / 5); } - public close() { - this.dialog.closeAll(); + onCloseClick(): void { + this.dialogRef.close(); } } diff --git a/src/app/components/shared/header/header.component.ts b/src/app/components/shared/header/header.component.ts index b716cc30f..555477fe5 100644 --- a/src/app/components/shared/header/header.component.ts +++ b/src/app/components/shared/header/header.component.ts @@ -222,7 +222,7 @@ export class HeaderComponent implements OnInit { /*QR*/ - public getQRCode(): string { + public getURL(): string { return `${window.location.protocol}//${window.location.hostname}/participant/room/${this.shortId}`; } @@ -231,11 +231,11 @@ export class HeaderComponent implements OnInit { const dialogRef = this.dialog.open(QrCodeDialogComponent, { panelClass: 'screenDialog' }); - const qrDialog: QrCodeDialogComponent = dialogRef.componentInstance; - // qrDialog.setQRCode(this.getQRCode()); + const url = this.getURL(); + dialogRef.componentInstance.data = url; + dialogRef.componentInstance.key = url.slice(-8); dialogRef.afterClosed().subscribe(res => { Rescale.exitFullscreen(); }); } - } diff --git a/src/app/components/shared/shared.module.ts b/src/app/components/shared/shared.module.ts index 3645c47fc..c5e4d0cbc 100644 --- a/src/app/components/shared/shared.module.ts +++ b/src/app/components/shared/shared.module.ts @@ -25,6 +25,7 @@ import { RemoveFromHistoryComponent } from './_dialogs/remove-from-history/remov import { CommentAnswerComponent } from './comment-answer/comment-answer.component'; import { MarkdownModule } from 'ngx-markdown'; import { MatRippleModule } from '@angular/material/core'; +import { QRCodeModule } from 'angularx-qrcode'; @NgModule({ imports: [ @@ -33,7 +34,8 @@ import { MatRippleModule } from '@angular/material/core'; SharedRoutingModule, MatRippleModule, ArsModule, - MarkdownModule + MarkdownModule, + QRCodeModule ], declarations: [ RoomJoinComponent, -- GitLab