-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+

+

+
+
+
+ {{ mobileAppSettings.qrCodeConfig.qrCodeLabel }}
-
-
- {{ mobileAppSettings.qrCodeConfig.qrCodeLabel }}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.scss
index ddb8870d42..b13fbe0f8f 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.scss
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.scss
@@ -17,24 +17,61 @@
@import '../../../../../../scss/constants';
:host {
+ width: 100%;
height: 100%;
display: flex;
- flex-direction: column;
- background-color: transparent;
+ justify-content: center;
}
-.tb-qrcode-label {
- font-size: 14px;
- color: rgba(0, 0, 0, 0.54);
+.tb-mobile-app-qrcode-panel {
+ width: 100%;
+ height: 100%;
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ gap: 8px;
+ padding: 16px;
+ &.preview {
+ max-width: 300px;
+ padding: 0;
+ }
+ > div:not(.tb-mobile-app-qrcode-overlay) {
+ z-index: 1;
+ }
+ .tb-mobile-app-qrcode-overlay {
+ position: absolute;
+ top: 12px;
+ left: 12px;
+ bottom: 12px;
+ right: 12px;
+ }
- @media #{$mat-md-lg} {
- font-size: 11px;
- line-height: 16px;
+ div.tb-widget-title {
+ padding: 0;
+ }
+
+ .tb-qrcode-label {
+ align-self: center;
+ text-align: center;
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.54);
}
-}
-.tb-qrcode {
- box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.08);
- border-radius: 6px;
+ .tb-qrcode {
+ display: flex;
+ flex: 0.3;
+ min-width: 100px;
+ padding: 3px;
+ border-radius: 6px;
+ background-color: #fff;
+ }
+
+ .tb-badges {
+ display: flex;
+ flex-direction: column;
+ flex: 0.4;
+ gap: 8px;
+ }
}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.ts
index 0f450d47f7..6aeef19b19 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.ts
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/mobile-app-qrcode-widget.component.ts
@@ -14,19 +14,21 @@
/// limitations under the License.
///
-import { ChangeDetectorRef, Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';
+import { ChangeDetectorRef, Component, ElementRef, Input, OnDestroy, OnInit, TemplateRef } from '@angular/core';
import { PageComponent } from '@shared/components/page.component';
import { AppState } from '@core/core.state';
import { Store } from '@ngrx/store';
-import { BadgePosition, BadgeStyle, badgeStyleURLMap, MobileAppSettings } from '@shared/models/mobile-app.models';
+import { BadgePosition, MobileAppSettings } from '@shared/models/mobile-app.models';
import { MobileAppService } from '@core/http/mobile-app.service';
import { WidgetContext } from '@home/models/widget-component.models';
import { UtilsService } from '@core/services/utils.service';
-import { Subject } from 'rxjs';
+import { Observable, Subject } from 'rxjs';
import { MINUTE } from '@shared/models/time/time.models';
-import { MobileAppQrCodeWidgetSettings } from '@home/components/widget/lib/cards/mobile-app-qr-code-widget.models';
-import { isDefinedAndNotNull } from '@core/utils';
+import { isDefinedAndNotNull, mergeDeep } from '@core/utils';
import { ResizeObserver } from '@juggle/resize-observer';
+import { backgroundStyle, ComponentStyle, overlayStyle } from '@shared/models/widget-settings.models';
+import { ImagePipe } from '@shared/pipe/image.pipe';
+import { DomSanitizer } from '@angular/platform-browser';
@Component({
selector: 'tb-mobile-app-qrcode-widget',
@@ -35,62 +37,76 @@ import { ResizeObserver } from '@juggle/resize-observer';
})
export class MobileAppQrcodeWidgetComponent extends PageComponent implements OnInit, OnDestroy {
+ private readonly destroy$ = new Subject
();
+ private widgetResize$: ResizeObserver;
+
+ private mobileAppSettingsValue: MobileAppSettings;
+ private deepLink: string;
+ private deepLinkTTL: number;
+ private deepLinkTTLTimeoutID: NodeJS.Timeout;
+
+ previewMode = false;
+
+ badgePosition = BadgePosition;
+ showBadgeContainer = true;
+
+ backgroundStyle$: Observable;
+ overlayStyle: ComponentStyle = {};
+
+ qrCodeSVG = '';
+
@Input()
ctx: WidgetContext;
@Input()
- set mobileAppSettings(settings: MobileAppSettings | MobileAppQrCodeWidgetSettings) {
+ widgetTitlePanel: TemplateRef;
+
+ @Input()
+ set mobileAppSettings(settings: MobileAppSettings) {
if (settings) {
this.mobileAppSettingsValue = settings;
}
};
- get mobileAppSettings(): MobileAppSettings | MobileAppQrCodeWidgetSettings {
+ get mobileAppSettings(): MobileAppSettings {
return this.mobileAppSettingsValue;
}
- @ViewChild('canvas', {static: true}) canvasRef: ElementRef;
-
- private readonly destroy$ = new Subject();
- private widgetResize$: ResizeObserver;
-
- badgeStyle = BadgeStyle;
- badgePosition = BadgePosition;
- badgeStyleURLMap = badgeStyleURLMap;
- showBadgeContainer = true;
-
- private mobileAppSettingsValue: MobileAppSettings | MobileAppQrCodeWidgetSettings;
- private deepLinkTTL: number;
- private deepLinkTTLTimeoutID: NodeJS.Timeout;
-
constructor(protected store: Store,
protected cd: ChangeDetectorRef,
private mobileAppService: MobileAppService,
private utilsService: UtilsService,
- private elementRef: ElementRef) {
+ private elementRef: ElementRef,
+ private imagePipe: ImagePipe,
+ private sanitizer: DomSanitizer,) {
super(store);
}
ngOnInit(): void {
if (!this.mobileAppSettings) {
- if (isDefinedAndNotNull(this.ctx.settings.useSystemSettings) && !this.ctx.settings.useSystemSettings) {
- this.mobileAppSettings = this.ctx.settings;
- } else {
- this.mobileAppService.getMobileAppSettings().subscribe((settings => {
- this.mobileAppSettings = settings;
- this.cd.markForCheck();
- }));
- }
+ this.mobileAppService.getMobileAppSettings().subscribe((settings => {
+ this.mobileAppSettings = settings;
+ if (isDefinedAndNotNull(this.ctx.settings.useSystemSettings) && !this.ctx.settings.useSystemSettings) {
+ this.mobileAppSettings = mergeDeep(this.mobileAppSettings, this.ctx.settings);
+ }
+
+ this.widgetResize$ = new ResizeObserver(() => {
+ const showHideBadgeContainer = this.elementRef.nativeElement.offsetWidth > 250;
+ if (showHideBadgeContainer !== this.showBadgeContainer) {
+ this.showBadgeContainer = showHideBadgeContainer;
+ this.cd.markForCheck();
+ }
+ });
+
+ this.widgetResize$.observe(this.elementRef.nativeElement);
+ this.backgroundStyle$ = backgroundStyle(this.ctx.settings.background, this.imagePipe, this.sanitizer);
+ this.overlayStyle = overlayStyle(this.ctx.settings.background.overlay);
+ this.cd.markForCheck();
+ }));
+ } else {
+ this.previewMode = true;
}
this.initMobileAppQRCode();
- this.widgetResize$ = new ResizeObserver(() => {
- const showHideBadgeContainer = this.elementRef.nativeElement.offsetWidth > 250;
- if (showHideBadgeContainer !== this.showBadgeContainer) {
- this.showBadgeContainer = showHideBadgeContainer;
- this.cd.markForCheck();
- }
- });
- this.widgetResize$.observe(this.elementRef.nativeElement);
}
ngOnDestroy() {
@@ -103,12 +119,22 @@ export class MobileAppQrcodeWidgetComponent extends PageComponent implements OnI
clearTimeout(this.deepLinkTTLTimeoutID);
}
+ navigateByDeepLink($event) {
+ if ($event) {
+ $event.stopPropagation();
+ }
+ if (this.ctx.isMobile) {
+ window.open(this.deepLink, '_blank');
+ }
+ }
+
private initMobileAppQRCode() {
if (this.deepLinkTTLTimeoutID) {
clearTimeout(this.deepLinkTTLTimeoutID);
this.deepLinkTTLTimeoutID = null;
}
this.mobileAppService.getMobileAppDeepLink().subscribe(link => {
+ this.deepLink = link;
this.deepLinkTTL = Number(this.utilsService.getQueryParam('ttl', link)) * MINUTE;
this.updateQRCode(link);
this.deepLinkTTLTimeoutID = setTimeout(() => this.initMobileAppQRCode(), this.deepLinkTTL);
@@ -117,7 +143,10 @@ export class MobileAppQrcodeWidgetComponent extends PageComponent implements OnI
private updateQRCode(link: string) {
import('qrcode').then((QRCode) => {
- QRCode.toCanvas(this.canvasRef.nativeElement, link, { width: 100 });
+ QRCode.toString(link, (err, string) => {
+ this.qrCodeSVG = string;
+ this.cd.markForCheck();
+ })
});
}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/mobile-app-qr-code-widget-settings.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/mobile-app-qr-code-widget-settings.component.html
index 4d930347c8..ea849e4f30 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/mobile-app-qr-code-widget-settings.component.html
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/mobile-app-qr-code-widget-settings.component.html
@@ -16,71 +16,57 @@
-->