MOBILE-3458 login: Show qr when configured
This commit is contained in:
		
							parent
							
								
									22266da7a7
								
							
						
					
					
						commit
						8df8c24270
					
				@ -81,6 +81,7 @@
 | 
				
			|||||||
    "siteurl": "",
 | 
					    "siteurl": "",
 | 
				
			||||||
    "sitename": "",
 | 
					    "sitename": "",
 | 
				
			||||||
    "multisitesdisplay": "",
 | 
					    "multisitesdisplay": "",
 | 
				
			||||||
 | 
					    "onlyallowlistedsites": false,
 | 
				
			||||||
    "skipssoconfirmation": false,
 | 
					    "skipssoconfirmation": false,
 | 
				
			||||||
    "forcedefaultlanguage": false,
 | 
					    "forcedefaultlanguage": false,
 | 
				
			||||||
    "privacypolicy": "https:\/\/moodle.net\/moodle-app-privacy\/",
 | 
					    "privacypolicy": "https:\/\/moodle.net\/moodle-app-privacy\/",
 | 
				
			||||||
@ -104,4 +105,4 @@
 | 
				
			|||||||
        "mac": "id1255924440",
 | 
					        "mac": "id1255924440",
 | 
				
			||||||
        "linux": "https:\/\/download.moodle.org\/desktop\/download.php?platform=linux&arch=64"
 | 
					        "linux": "https:\/\/download.moodle.org\/desktop\/download.php?platform=linux&arch=64"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -105,4 +105,10 @@ ion-app.app-root page-core-login-site {
 | 
				
			|||||||
            background: transparent;
 | 
					            background: transparent;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .core-login-site-qrcode-separator {
 | 
				
			||||||
 | 
					        text-align: center;
 | 
				
			||||||
 | 
					        margin-top: 12px;
 | 
				
			||||||
 | 
					        font-size: 1.2em;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -34,6 +34,16 @@
 | 
				
			|||||||
            <div padding>
 | 
					            <div padding>
 | 
				
			||||||
                <button ion-button block [disabled]="siteChecked && !isBrowserSSO && !credForm.valid" class="core-login-login-button">{{ 'core.login.loginbutton' | translate }}</button>
 | 
					                <button ion-button block [disabled]="siteChecked && !isBrowserSSO && !credForm.valid" class="core-login-login-button">{{ 'core.login.loginbutton' | translate }}</button>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <ng-container *ngIf="showScanQR">
 | 
				
			||||||
 | 
					                <div class="core-login-site-qrcode-separator">{{ 'core.login.or' | translate }}</div>
 | 
				
			||||||
 | 
					                <ion-item class="core-login-site-qrcode">
 | 
				
			||||||
 | 
					                    <a ion-button block color="light" margin-top icon-start (click)="showInstructionsAndScanQR()">
 | 
				
			||||||
 | 
					                        <core-icon name="fa-qrcode" aria-hidden="true"></core-icon>
 | 
				
			||||||
 | 
					                        {{ 'core.scanqr' | translate }}
 | 
				
			||||||
 | 
					                    </a>
 | 
				
			||||||
 | 
					                </ion-item>
 | 
				
			||||||
 | 
					            </ng-container>
 | 
				
			||||||
        </form>
 | 
					        </form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <!-- Forgotten password button. -->
 | 
					        <!-- Forgotten password button. -->
 | 
				
			||||||
 | 
				
			|||||||
@ -16,12 +16,14 @@ import { Component, ViewChild, ElementRef } from '@angular/core';
 | 
				
			|||||||
import { IonicPage, NavController, NavParams } from 'ionic-angular';
 | 
					import { IonicPage, NavController, NavParams } from 'ionic-angular';
 | 
				
			||||||
import { TranslateService } from '@ngx-translate/core';
 | 
					import { TranslateService } from '@ngx-translate/core';
 | 
				
			||||||
import { CoreAppProvider } from '@providers/app';
 | 
					import { CoreAppProvider } from '@providers/app';
 | 
				
			||||||
 | 
					import { CoreUtils } from '@providers/utils/utils';
 | 
				
			||||||
import { CoreEventsProvider } from '@providers/events';
 | 
					import { CoreEventsProvider } from '@providers/events';
 | 
				
			||||||
import { CoreSitesProvider } from '@providers/sites';
 | 
					import { CoreSitesProvider } from '@providers/sites';
 | 
				
			||||||
import { CoreDomUtilsProvider } from '@providers/utils/dom';
 | 
					import { CoreDomUtilsProvider } from '@providers/utils/dom';
 | 
				
			||||||
import { CoreLoginHelperProvider } from '../../providers/helper';
 | 
					import { CoreLoginHelperProvider } from '../../providers/helper';
 | 
				
			||||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
 | 
					import { FormBuilder, FormGroup, Validators } from '@angular/forms';
 | 
				
			||||||
import { CoreConfigConstants } from '../../../../configconstants';
 | 
					import { CoreConfigConstants } from '../../../../configconstants';
 | 
				
			||||||
 | 
					import { CoreCustomURLSchemes } from '@providers/urlschemes';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Page to enter the user credentials.
 | 
					 * Page to enter the user credentials.
 | 
				
			||||||
@ -47,6 +49,7 @@ export class CoreLoginCredentialsPage {
 | 
				
			|||||||
    isBrowserSSO = false;
 | 
					    isBrowserSSO = false;
 | 
				
			||||||
    isFixedUrlSet = false;
 | 
					    isFixedUrlSet = false;
 | 
				
			||||||
    showForgottenPassword = true;
 | 
					    showForgottenPassword = true;
 | 
				
			||||||
 | 
					    showScanQR: boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected siteConfig;
 | 
					    protected siteConfig;
 | 
				
			||||||
    protected eventThrown = false;
 | 
					    protected eventThrown = false;
 | 
				
			||||||
@ -74,6 +77,17 @@ export class CoreLoginCredentialsPage {
 | 
				
			|||||||
            username: [navParams.get('username') || '', Validators.required],
 | 
					            username: [navParams.get('username') || '', Validators.required],
 | 
				
			||||||
            password: ['', Validators.required]
 | 
					            password: ['', Validators.required]
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const canScanQR = CoreUtils.instance.canScanQR();
 | 
				
			||||||
 | 
					        if (canScanQR) {
 | 
				
			||||||
 | 
					            if (typeof CoreConfigConstants['displayqroncredentialscreen'] == 'undefined') {
 | 
				
			||||||
 | 
					                this.showScanQR = this.loginHelper.isFixedUrlSet();
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                this.showScanQR = !!CoreConfigConstants['displayqroncredentialscreen'];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            this.showScanQR = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@ -267,4 +281,46 @@ export class CoreLoginCredentialsPage {
 | 
				
			|||||||
    signup(): void {
 | 
					    signup(): void {
 | 
				
			||||||
        this.navCtrl.push('CoreLoginEmailSignupPage', { siteUrl: this.siteUrl });
 | 
					        this.navCtrl.push('CoreLoginEmailSignupPage', { siteUrl: this.siteUrl });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Show instructions and scan QR code.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    showInstructionsAndScanQR(): void {
 | 
				
			||||||
 | 
					        // Show some instructions first.
 | 
				
			||||||
 | 
					        this.domUtils.showAlertWithOptions({
 | 
				
			||||||
 | 
					            title: this.translate.instant('core.login.faqwhereisqrcode'),
 | 
				
			||||||
 | 
					            message: this.translate.instant('core.login.faqwhereisqrcodeanswer',
 | 
				
			||||||
 | 
					                {$image: CoreLoginHelperProvider.FAQ_QRCODE_IMAGE_HTML}),
 | 
				
			||||||
 | 
					            buttons: [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    text: this.translate.instant('core.cancel'),
 | 
				
			||||||
 | 
					                    role: 'cancel'
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    text: this.translate.instant('core.next'),
 | 
				
			||||||
 | 
					                    handler: (): void => {
 | 
				
			||||||
 | 
					                        this.scanQR();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Scan a QR code and put its text in the URL input.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return Promise resolved when done.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    async scanQR(): Promise<void> {
 | 
				
			||||||
 | 
					        // Scan for a QR code.
 | 
				
			||||||
 | 
					        const text = await CoreUtils.instance.scanQR();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (text && CoreCustomURLSchemes.instance.isCustomURL(text)) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                await CoreCustomURLSchemes.instance.handleCustomURL(text);
 | 
				
			||||||
 | 
					            } catch (error) {
 | 
				
			||||||
 | 
					                CoreCustomURLSchemes.instance.treatHandleCustomURLError(error);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -56,17 +56,6 @@
 | 
				
			|||||||
                    <ion-option *ngFor="let site of fixedSites" [value]="site.url">{{site.name}}</ion-option>
 | 
					                    <ion-option *ngFor="let site of fixedSites" [value]="site.url">{{site.name}}</ion-option>
 | 
				
			||||||
                </ion-select>
 | 
					                </ion-select>
 | 
				
			||||||
            </ion-item>
 | 
					            </ion-item>
 | 
				
			||||||
 | 
					 | 
				
			||||||
            <ng-container *ngIf="!fixedSites && showScanQR && !hasSites && !enteredSiteUrl">
 | 
					 | 
				
			||||||
                <div class="core-login-site-qrcode-separator">{{ 'core.login.or' | translate }}</div>
 | 
					 | 
				
			||||||
                <ion-item class="core-login-site-qrcode">
 | 
					 | 
				
			||||||
                    <a ion-button block color="light" margin-top icon-start (click)="showInstructionsAndScanQR()">
 | 
					 | 
				
			||||||
                        <core-icon name="fa-qrcode" aria-hidden="true"></core-icon>
 | 
					 | 
				
			||||||
                        {{ 'core.scanqr' | translate }}
 | 
					 | 
				
			||||||
                    </a>
 | 
					 | 
				
			||||||
                </ion-item>
 | 
					 | 
				
			||||||
            </ng-container>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        </form>
 | 
					        </form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <!-- Pick the site from a list of fixed sites. -->
 | 
					        <!-- Pick the site from a list of fixed sites. -->
 | 
				
			||||||
@ -85,6 +74,16 @@
 | 
				
			|||||||
            <a *ngFor="let site of fixedSites" ion-button block (click)="connect($event, site.url)" [title]="site.name" margin-bottom>{{site.name}}</a>
 | 
					            <a *ngFor="let site of fixedSites" ion-button block (click)="connect($event, site.url)" [title]="site.name" margin-bottom>{{site.name}}</a>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <ng-container *ngIf="showScanQR && !hasSites && !enteredSiteUrl">
 | 
				
			||||||
 | 
					            <div class="core-login-site-qrcode-separator">{{ 'core.login.or' | translate }}</div>
 | 
				
			||||||
 | 
					            <ion-item class="core-login-site-qrcode">
 | 
				
			||||||
 | 
					                <a ion-button block color="light" margin-top icon-start (click)="showInstructionsAndScanQR()">
 | 
				
			||||||
 | 
					                    <core-icon name="fa-qrcode" aria-hidden="true"></core-icon>
 | 
				
			||||||
 | 
					                    {{ 'core.scanqr' | translate }}
 | 
				
			||||||
 | 
					                </a>
 | 
				
			||||||
 | 
					            </ion-item>
 | 
				
			||||||
 | 
					        </ng-container>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <!-- Help. -->
 | 
					        <!-- Help. -->
 | 
				
			||||||
        <ion-list no-lines margin-top>
 | 
					        <ion-list no-lines margin-top>
 | 
				
			||||||
            <a ion-item text-center text-wrap class="core-login-need-help" (click)="showHelp()" detail-none>
 | 
					            <a ion-item text-center text-wrap class="core-login-need-help" (click)="showHelp()" detail-none>
 | 
				
			||||||
 | 
				
			|||||||
@ -129,10 +129,4 @@ ion-app.app-root page-core-login-site {
 | 
				
			|||||||
    .core-login-default-icon {
 | 
					    .core-login-default-icon {
 | 
				
			||||||
        filter: grayscale(100%);
 | 
					        filter: grayscale(100%);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    .core-login-site-qrcode-separator {
 | 
					 | 
				
			||||||
        text-align: center;
 | 
					 | 
				
			||||||
        margin-top: 12px;
 | 
					 | 
				
			||||||
        font-size: 1.2em;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -80,7 +80,6 @@ export class CoreLoginSitePage {
 | 
				
			|||||||
            protected textUtils: CoreTextUtilsProvider) {
 | 
					            protected textUtils: CoreTextUtilsProvider) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.showKeyboard = !!navParams.get('showKeyboard');
 | 
					        this.showKeyboard = !!navParams.get('showKeyboard');
 | 
				
			||||||
        this.showScanQR = this.utils.canScanQR();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let url = '';
 | 
					        let url = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -103,6 +102,9 @@ export class CoreLoginSitePage {
 | 
				
			|||||||
            });
 | 
					            });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.showScanQR = this.utils.canScanQR() && (typeof CoreConfigConstants['displayqronsitescreen'] == 'undefined' ||
 | 
				
			||||||
 | 
					            !!CoreConfigConstants['displayqronsitescreen']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.siteForm = fb.group({
 | 
					        this.siteForm = fb.group({
 | 
				
			||||||
            siteUrl: [url, this.moodleUrlValidator()]
 | 
					            siteUrl: [url, this.moodleUrlValidator()]
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user