MOBILE-3565 settings: Add licenses page

main
Pau Ferrer Ocaña 2020-11-05 16:17:31 +01:00
parent f09c3f9210
commit 51fba1f5d8
6 changed files with 190 additions and 11 deletions

View File

@ -13,14 +13,14 @@
// limitations under the License.
import { CoreApp } from '@services/app';
import { Component } from '@angular/core';
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Params, Router } from '@angular/router';
@Component({
selector: 'app-settings',
templateUrl: 'app.html',
})
export class CoreSettingsAppPage {
export class CoreSettingsAppPage implements OnInit {
// @ViewChild(CoreSplitViewComponent) splitviewCtrl?: CoreSplitViewComponent;
@ -42,7 +42,7 @@ export class CoreSettingsAppPage {
/**
* View loaded.
*/
ionViewDidLoad(): void {
ngOnInit(): void {
if (this.selectedPage) {
this.openSettings(this.selectedPage);
} /* else if (this.splitviewCtrl!.isOn()) {

View File

@ -0,0 +1,41 @@
<ion-header>
<ion-toolbar>
<ion-buttons slot="start">
<ion-back-button [attr.aria-label]="'core.back' | translate"></ion-back-button>
</ion-buttons>
<ion-title>{{ 'core.settings.opensourcelicenses' | translate }}</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<core-loading [hideUntil]="loaded">
<ion-item button *ngIf="error" class="ion-text-wrap" [href]="licensesUrl" core-link auto-login="no">
<ion-label>
{{ 'core.settings.opensourcelicenses' | translate }}
</ion-label>
<ion-button [href]="licensesUrl" target="_blank" fill="clear" slot="end" core-link auto-login="no">
{{ 'core.view' | translate }}</ion-button>
</ion-item>
<ng-container *ngIf="!error">
<ion-item *ngFor="let license of licenses" class="ion-text-wrap">
<ion-label>
<h2>
<a *ngIf="license.repository" [href]="license.repository" core-link
auto-login="no">{{ license.name }}</a>
<ng-container *ngIf="!license.repository">{{ license.name }}</ng-container> - {{ license.version }}
</h2>
<h3 *ngIf="license.publisher">
{{ 'core.settings.publisher' | translate }}{{ 'core.labelsep' | translate }} {{ license.publisher }}
</h3>
<p>{{ 'core.settings.license' | translate }}{{ 'core.labelsep' | translate }} {{ license.licenses }}</p>
<p><a *ngIf="license.url" [href]="license.url" core-link auto-login="no">{{ license.url }}</a></p>
<p><a *ngIf="license.email" [href]="'mailto:' + license.email" core-link
auto-login="no">{{ license.email }}</a></p>
</ion-label>
<ion-button *ngIf="license.licenseUrl" [href]="license.licenseUrl" target="_blank"
fill="clear" slot="end" core-link auto-login="no">{{ 'core.view' | translate }}</ion-button>
</ion-item>
</ng-container>
</core-loading>
</ion-content>

View File

@ -0,0 +1,48 @@
// (C) Copyright 2015 Moodle Pty Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import { NgModule } from '@angular/core';
import { TranslateModule } from '@ngx-translate/core';
import { RouterModule, Routes } from '@angular/router';
import { CommonModule } from '@angular/common';
import { IonicModule } from '@ionic/angular';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { CorePipesModule } from '@pipes/pipes.module';
import { CoreSettingsLicensesPage } from './licenses.page';
const routes: Routes = [
{
path: '',
component: CoreSettingsLicensesPage,
},
];
@NgModule({
declarations: [
CoreSettingsLicensesPage,
],
imports: [
RouterModule.forChild(routes),
CommonModule,
IonicModule,
TranslateModule.forChild(),
CoreComponentsModule,
CoreDirectivesModule,
CorePipesModule,
],
})
export class CoreSettingsLicensesPageModule {}

View File

@ -0,0 +1,88 @@
// (C) Copyright 2015 Moodle Pty Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import { Component, OnInit } from '@angular/core';
import { CoreConstants } from '@core/constants';
import { Http } from '@/app/singletons/core.singletons';
/**
* Defines license info
*/
interface CoreSettingsLicense {
name: string;
version: string;
licenses: string;
repository?: string;
publisher?: string;
url?: string;
email?: string;
licenseUrl?: string;
licenseFile?: string;
}
/**
* Page that displays the open source licenses information.
*/
@Component({
selector: 'page-core-settings-licenses',
templateUrl: 'licenses.html',
})
export class CoreSettingsLicensesPage implements OnInit {
licensesUrl: string;
loaded = false;
licenses: CoreSettingsLicense[] = [];
error = false;
constructor() {
let version = 'v' + CoreConstants.CONFIG.versionname;
if (version.indexOf('-') > 0) {
version = 'integration';
}
this.licensesUrl = 'https://raw.githubusercontent.com/moodlehq/moodleapp/' + version + '/licenses.json';
}
/**
* View loaded.
*/
async ngOnInit(): Promise<void> {
try {
const licenses = await Http.instance.get(this.licensesUrl).toPromise();
this.licenses = Object.keys(licenses).map((name) => {
const license = licenses[name];
const nameSplit = name.lastIndexOf('@');
license.name = name.substring(0, nameSplit);
license.version = name.substring(nameSplit + 1);
if (license.repository) {
license.repository = license.repository.replace('git://', 'https://');
if (license.repository.indexOf('github.com') > 0) {
license.licenseUrl = license.repository + '/blob/' + license.version + '/' + license.licenseFile;
}
}
return license;
});
this.error = false;
} catch {
this.error = true;
}
this.loaded = true;
}
}

View File

@ -24,6 +24,10 @@ const routes: Routes = [
path: 'general',
loadChildren: () => import('./pages/general/general.page.module').then( m => m.CoreSettingsGeneralPageModule),
},
{
path: 'licenses',
loadChildren: () => import('./pages/licenses/licenses.page.module').then( m => m.CoreSettingsLicensesPageModule),
},
{
path: '',
loadChildren: () => import('./pages/app/app.page.module').then( m => m.CoreSettingsAppPageModule),

View File

@ -44,7 +44,7 @@ export class CoreFaIconDirective implements OnChanges {
/**
* Detect icon name and use svg.
*/
setIcon(): void {
async setIcon(): Promise<void> {
let library = 'ionic';
let iconName = this.name;
const parts = iconName.split('-', 2);
@ -73,13 +73,11 @@ export class CoreFaIconDirective implements OnChanges {
this.element.setAttribute('src', src);
if (CoreConstants.BUILD.isDevelopment || CoreConstants.BUILD.isTesting) {
Http.instance.get(src).subscribe(() => {
// Ignore.
}, (error) => {
if (error.status != 200) {
try {
await Http.instance.get(src, { responseType: 'text' }).toPromise();
} catch (error) {
this.logger.error(`Icon ${this.name} not found`);
}
});
}
} else {
this.element.removeAttribute('src');