MOBILE-3565 settings: Add licenses page
parent
f09c3f9210
commit
51fba1f5d8
|
@ -13,14 +13,14 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
import { CoreApp } from '@services/app';
|
||||||
import { Component } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute, Params, Router } from '@angular/router';
|
import { ActivatedRoute, Params, Router } from '@angular/router';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-settings',
|
selector: 'app-settings',
|
||||||
templateUrl: 'app.html',
|
templateUrl: 'app.html',
|
||||||
})
|
})
|
||||||
export class CoreSettingsAppPage {
|
export class CoreSettingsAppPage implements OnInit {
|
||||||
|
|
||||||
// @ViewChild(CoreSplitViewComponent) splitviewCtrl?: CoreSplitViewComponent;
|
// @ViewChild(CoreSplitViewComponent) splitviewCtrl?: CoreSplitViewComponent;
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ export class CoreSettingsAppPage {
|
||||||
/**
|
/**
|
||||||
* View loaded.
|
* View loaded.
|
||||||
*/
|
*/
|
||||||
ionViewDidLoad(): void {
|
ngOnInit(): void {
|
||||||
if (this.selectedPage) {
|
if (this.selectedPage) {
|
||||||
this.openSettings(this.selectedPage);
|
this.openSettings(this.selectedPage);
|
||||||
} /* else if (this.splitviewCtrl!.isOn()) {
|
} /* else if (this.splitviewCtrl!.isOn()) {
|
||||||
|
|
|
@ -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>
|
|
@ -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 {}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -24,6 +24,10 @@ const routes: Routes = [
|
||||||
path: 'general',
|
path: 'general',
|
||||||
loadChildren: () => import('./pages/general/general.page.module').then( m => m.CoreSettingsGeneralPageModule),
|
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: '',
|
path: '',
|
||||||
loadChildren: () => import('./pages/app/app.page.module').then( m => m.CoreSettingsAppPageModule),
|
loadChildren: () => import('./pages/app/app.page.module').then( m => m.CoreSettingsAppPageModule),
|
||||||
|
|
|
@ -44,7 +44,7 @@ export class CoreFaIconDirective implements OnChanges {
|
||||||
/**
|
/**
|
||||||
* Detect icon name and use svg.
|
* Detect icon name and use svg.
|
||||||
*/
|
*/
|
||||||
setIcon(): void {
|
async setIcon(): Promise<void> {
|
||||||
let library = 'ionic';
|
let library = 'ionic';
|
||||||
let iconName = this.name;
|
let iconName = this.name;
|
||||||
const parts = iconName.split('-', 2);
|
const parts = iconName.split('-', 2);
|
||||||
|
@ -73,13 +73,11 @@ export class CoreFaIconDirective implements OnChanges {
|
||||||
this.element.setAttribute('src', src);
|
this.element.setAttribute('src', src);
|
||||||
|
|
||||||
if (CoreConstants.BUILD.isDevelopment || CoreConstants.BUILD.isTesting) {
|
if (CoreConstants.BUILD.isDevelopment || CoreConstants.BUILD.isTesting) {
|
||||||
Http.instance.get(src).subscribe(() => {
|
try {
|
||||||
// Ignore.
|
await Http.instance.get(src, { responseType: 'text' }).toPromise();
|
||||||
}, (error) => {
|
} catch (error) {
|
||||||
if (error.status != 200) {
|
|
||||||
this.logger.error(`Icon ${this.name} not found`);
|
this.logger.error(`Icon ${this.name} not found`);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.element.removeAttribute('src');
|
this.element.removeAttribute('src');
|
||||||
|
|
Loading…
Reference in New Issue