MOBILE-2317 user: Add profile field delegate
parent
e836171c02
commit
ba1267410e
|
@ -0,0 +1,46 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { IonicModule } from 'ionic-angular';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
import { AddonUserProfileFieldCheckboxHandler } from './providers/handler';
|
||||||
|
import { CoreUserProfileFieldDelegate } from '../../../core/user/providers/user-profile-field-delegate';
|
||||||
|
import { AddonUserProfileFieldCheckboxComponent } from './component/checkbox';
|
||||||
|
import { CoreComponentsModule } from '../../../components/components.module';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [
|
||||||
|
AddonUserProfileFieldCheckboxComponent
|
||||||
|
],
|
||||||
|
imports: [
|
||||||
|
IonicModule,
|
||||||
|
TranslateModule.forChild(),
|
||||||
|
CoreComponentsModule
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
AddonUserProfileFieldCheckboxHandler
|
||||||
|
],
|
||||||
|
exports: [
|
||||||
|
AddonUserProfileFieldCheckboxComponent
|
||||||
|
],
|
||||||
|
entryComponents: [
|
||||||
|
AddonUserProfileFieldCheckboxComponent
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldCheckboxModule {
|
||||||
|
constructor(userProfileFieldDelegate: CoreUserProfileFieldDelegate, handler: AddonUserProfileFieldCheckboxHandler) {
|
||||||
|
userProfileFieldDelegate.registerHandler(handler);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!-- Render (no edit). -->
|
||||||
|
<ion-item *ngIf="!edit && field && field.name">
|
||||||
|
<h2>{{ field.name }}</h2>
|
||||||
|
<p *ngIf="field.value != '0'">
|
||||||
|
{{ 'core.yes' | translate }}
|
||||||
|
</p>
|
||||||
|
<p *ngIf="field.value == '0'">
|
||||||
|
{{ 'core.no' | translate }}
|
||||||
|
</p>
|
||||||
|
</ion-item>
|
||||||
|
<!-- Edit. -->
|
||||||
|
<ion-item *ngIf="edit && field && field.shortname">
|
||||||
|
<ion-label [core-mark-required]="field.required">{{ field.name }}</ion-label>
|
||||||
|
<ion-checkbox text-wrap [name]="field.modelName" [(ngModel)]="model[field.modelName]" [disabled]="!signup && field.locked" [required]="field.required" core-input-errors>
|
||||||
|
</ion-checkbox>
|
||||||
|
</ion-item>
|
|
@ -0,0 +1,47 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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, Input, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directive to render a checkbox user profile field.
|
||||||
|
*/
|
||||||
|
@Component({
|
||||||
|
selector: 'core-user-profile-field-checkbox',
|
||||||
|
templateUrl: 'checkbox.html'
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldCheckboxComponent implements OnInit {
|
||||||
|
@Input() field: any; // The profile field to be rendered.
|
||||||
|
@Input() edit?: boolean = false; // True if editing the field. Defaults to false.
|
||||||
|
@Input() model?: any; // Model where to store the data. Required if edit=true or signup=true.
|
||||||
|
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component being initialized.
|
||||||
|
*/
|
||||||
|
ngOnInit() {
|
||||||
|
let field = this.field;
|
||||||
|
|
||||||
|
if (field && this.edit && this.model) {
|
||||||
|
field.modelName = 'profile_field_' + field.shortname;
|
||||||
|
|
||||||
|
// Initialize the value.
|
||||||
|
if (typeof field.defaultdata != 'undefined' && typeof this.model[field.modelName] == 'undefined') {
|
||||||
|
this.model[field.modelName] = field.defaultdata && field.defaultdata !== '0' && field.defaultdata !== 'false';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { Injectable } from '@angular/core';
|
||||||
|
import { CoreUserProfileFieldHandler, CoreUserProfileFieldHandlerData } from '../../../../core/user/providers/user-profile-field-delegate';
|
||||||
|
import { AddonUserProfileFieldCheckboxComponent } from '../component/checkbox';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checkbox user profile field handlers.
|
||||||
|
*/
|
||||||
|
@Injectable()
|
||||||
|
export class AddonUserProfileFieldCheckboxHandler implements CoreUserProfileFieldHandler {
|
||||||
|
name = 'checkbox';
|
||||||
|
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not the handler is enabled on a site level.
|
||||||
|
*
|
||||||
|
* @return {boolean|Promise<boolean>} True or promise resolved with true if enabled.
|
||||||
|
*/
|
||||||
|
isEnabled() : boolean|Promise<boolean> {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data to send for the field based on the input data.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @param {any} model Model with the input data.
|
||||||
|
* @return {CoreUserProfileFieldHandlerData} Data to send for the field.
|
||||||
|
*/
|
||||||
|
getData(field: any, signup: boolean, registerAuth: string, model: any): CoreUserProfileFieldHandlerData {
|
||||||
|
let name = 'profile_field_' + field.shortname;
|
||||||
|
|
||||||
|
if (typeof model[name] != 'undefined') {
|
||||||
|
return {
|
||||||
|
type: 'checkbox',
|
||||||
|
name: name,
|
||||||
|
value: model[name] ? 1 : 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the Component to use to display the user profile field.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @return {any} The component to use, undefined if not found.
|
||||||
|
*/
|
||||||
|
getComponent(field: any, signup: boolean, registerAuth: string) {
|
||||||
|
return AddonUserProfileFieldCheckboxComponent;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!-- Render (no edit). -->
|
||||||
|
<ion-item *ngIf="!edit && field && field.name">
|
||||||
|
<h2>{{ field.name }}</h2>
|
||||||
|
<p>{{ field.value * 1000 | coreFormatDate:"dfmediumdate"}}</p>
|
||||||
|
</ion-item>
|
||||||
|
<!-- Edit. -->
|
||||||
|
<ion-item *ngIf="edit && field && field.shortname" text-wrap>
|
||||||
|
<ion-label [core-mark-required]="field.required">{{ field.name }}</ion-label>
|
||||||
|
<ion-datetime [name]="field.modelName" [displayFormat]="field.format | translate" [disabled]="!signup && field.locked" [(ngModel)]="model[field.modelName]" [required]="field.required" core-input-errors [max]="field.max" [min]="field.min"></ion-datetime>
|
||||||
|
</ion-item>
|
|
@ -0,0 +1,63 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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, Input, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directive to render a datetime user profile field.
|
||||||
|
*/
|
||||||
|
@Component({
|
||||||
|
selector: 'core-user-profile-field-datetime',
|
||||||
|
templateUrl: 'datetime.html'
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldDatetimeComponent implements OnInit {
|
||||||
|
@Input() field: any; // The profile field to be rendered.
|
||||||
|
@Input() edit?: boolean = false; // True if editing the field. Defaults to false.
|
||||||
|
@Input() model?: any; // Model where to store the data. Required if edit=true or signup=true.
|
||||||
|
|
||||||
|
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component being initialized.
|
||||||
|
*/
|
||||||
|
ngOnInit() {
|
||||||
|
let field = this.field,
|
||||||
|
year;
|
||||||
|
if (field && this.edit && this.model) {
|
||||||
|
field.modelName = 'profile_field_' + field.shortname;
|
||||||
|
|
||||||
|
// Check if it's only date or it has time too.
|
||||||
|
field.hasTime = field.param3 && field.param3 !== '0' && field.param3 !== 'false';
|
||||||
|
field.format = field.hasTime ? 'core.dffulldate' : 'core.dfdaymonthyear';
|
||||||
|
|
||||||
|
// Check min value.
|
||||||
|
if (field.param1) {
|
||||||
|
year = parseInt(field.param1, 10);
|
||||||
|
if (year) {
|
||||||
|
field.min = year;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check max value.
|
||||||
|
if (field.param2) {
|
||||||
|
year = parseInt(field.param2, 10);
|
||||||
|
if (year) {
|
||||||
|
field.max = year;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { IonicModule } from 'ionic-angular';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
import { AddonUserProfileFieldDatetimeHandler } from './providers/handler';
|
||||||
|
import { CoreUserProfileFieldDelegate } from '../../../core/user/providers/user-profile-field-delegate';
|
||||||
|
import { AddonUserProfileFieldDatetimeComponent } from './component/datetime';
|
||||||
|
import { CoreComponentsModule } from '../../../components/components.module';
|
||||||
|
import { CorePipesModule } from '../../../pipes/pipes.module';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [
|
||||||
|
AddonUserProfileFieldDatetimeComponent
|
||||||
|
],
|
||||||
|
imports: [
|
||||||
|
IonicModule,
|
||||||
|
TranslateModule.forChild(),
|
||||||
|
CoreComponentsModule,
|
||||||
|
CorePipesModule
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
AddonUserProfileFieldDatetimeHandler
|
||||||
|
],
|
||||||
|
exports: [
|
||||||
|
AddonUserProfileFieldDatetimeComponent
|
||||||
|
],
|
||||||
|
entryComponents: [
|
||||||
|
AddonUserProfileFieldDatetimeComponent
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldDatetimeModule {
|
||||||
|
constructor(userProfileFieldDelegate: CoreUserProfileFieldDelegate, handler: AddonUserProfileFieldDatetimeHandler) {
|
||||||
|
userProfileFieldDelegate.registerHandler(handler);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { Injectable } from '@angular/core';
|
||||||
|
import { CoreUserProfileFieldHandler, CoreUserProfileFieldHandlerData } from '../../../../core/user/providers/user-profile-field-delegate';
|
||||||
|
import { AddonUserProfileFieldDatetimeComponent } from '../component/datetime';
|
||||||
|
import { Platform } from 'ionic-angular';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Datetime user profile field handlers.
|
||||||
|
*/
|
||||||
|
@Injectable()
|
||||||
|
export class AddonUserProfileFieldDatetimeHandler implements CoreUserProfileFieldHandler {
|
||||||
|
name = 'datetime';
|
||||||
|
|
||||||
|
constructor(private platform: Platform) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not the handler is enabled on a site level.
|
||||||
|
*
|
||||||
|
* @return {boolean|Promise<boolean>} True or promise resolved with true if enabled.
|
||||||
|
*/
|
||||||
|
isEnabled() : boolean|Promise<boolean> {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data to send for the field based on the input data.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @param {any} model Model with the input data.
|
||||||
|
* @return {CoreUserProfileFieldHandlerData} Data to send for the field.
|
||||||
|
*/
|
||||||
|
getData(field: any, signup: boolean, registerAuth: string, model: any): CoreUserProfileFieldHandlerData {
|
||||||
|
let hasTime = field.param3 && field.param3 !== '0' && field.param3 !== 'false',
|
||||||
|
modelName = 'profile_field_' + field.shortname,
|
||||||
|
date = JSON.parse(JSON.stringify(model[modelName + '_date'])),
|
||||||
|
time;
|
||||||
|
|
||||||
|
if (date) {
|
||||||
|
if (hasTime && this.platform.is('ios')) {
|
||||||
|
// In iOS the time is in a different input. Add it to the date.
|
||||||
|
time = model[modelName + '_time'];
|
||||||
|
if (!time) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
date.setHours(time.getHours());
|
||||||
|
date.setMinutes(time.getMinutes());
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: 'datetime',
|
||||||
|
name: 'profile_field_' + field.shortname,
|
||||||
|
value: Math.round(date.getTime() / 1000)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the Component to use to display the user profile field.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @return {any} The component to use, undefined if not found.
|
||||||
|
*/
|
||||||
|
getComponent(field: any, signup: boolean, registerAuth: string) {
|
||||||
|
return AddonUserProfileFieldDatetimeComponent;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
<!-- Render (no edit). -->
|
||||||
|
<ion-item *ngIf="!edit && field && field.name">
|
||||||
|
<h2>{{ field.name }}</h2>
|
||||||
|
<p><core-format-text [text]="field.value"></core-format-text></p>
|
||||||
|
</ion-item>
|
||||||
|
<!-- Edit. -->
|
||||||
|
<ion-item *ngIf="edit && field && field.shortname" text-wrap>
|
||||||
|
<ion-label [core-mark-required]="field.required">{{ field.name }}</ion-label>
|
||||||
|
<ion-select [name]="field.modelName" [(ngModel)]="model[field.modelName]" [disabled]="!signup && field.locked" [required]="field.required" core-input-errors>
|
||||||
|
<ion-option value="">{{ 'core.choosedots' | translate }}</ion-option>
|
||||||
|
<ion-option *ngFor="let option of field.options" [value]="option">{{option}}</ion-option>
|
||||||
|
</ion-select>
|
||||||
|
</ion-item>
|
|
@ -0,0 +1,55 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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, Input, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directive to render a menu user profile field.
|
||||||
|
*/
|
||||||
|
@Component({
|
||||||
|
selector: 'core-user-profile-field-menu',
|
||||||
|
templateUrl: 'menu.html'
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldMenuComponent implements OnInit {
|
||||||
|
@Input() field: any; // The profile field to be rendered.
|
||||||
|
@Input() edit?: boolean = false; // True if editing the field. Defaults to false.
|
||||||
|
@Input() model?: any; // Model where to store the data. Required if edit=true or signup=true.
|
||||||
|
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component being initialized.
|
||||||
|
*/
|
||||||
|
ngOnInit() {
|
||||||
|
let field = this.field;
|
||||||
|
|
||||||
|
if (field && this.edit && this.model) {
|
||||||
|
field.modelName = 'profile_field_' + field.shortname;
|
||||||
|
|
||||||
|
// Parse options.
|
||||||
|
if (field.param1) {
|
||||||
|
field.options = field.param1.split(/\r\n|\r|\n/g);
|
||||||
|
} else {
|
||||||
|
field.options = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the value using default data.
|
||||||
|
if (typeof field.defaultdata != 'undefined' && typeof this.model[field.modelName] == 'undefined') {
|
||||||
|
this.model[field.modelName] = field.defaultdata;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { IonicModule } from 'ionic-angular';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
import { AddonUserProfileFieldMenuHandler } from './providers/handler';
|
||||||
|
import { CoreUserProfileFieldDelegate } from '../../../core/user/providers/user-profile-field-delegate';
|
||||||
|
import { AddonUserProfileFieldMenuComponent } from './component/menu';
|
||||||
|
import { CoreComponentsModule } from '../../../components/components.module';
|
||||||
|
import { CoreDirectivesModule } from '../../../directives/directives.module';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [
|
||||||
|
AddonUserProfileFieldMenuComponent
|
||||||
|
],
|
||||||
|
imports: [
|
||||||
|
IonicModule,
|
||||||
|
TranslateModule.forChild(),
|
||||||
|
CoreComponentsModule,
|
||||||
|
CoreDirectivesModule
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
AddonUserProfileFieldMenuHandler
|
||||||
|
],
|
||||||
|
exports: [
|
||||||
|
AddonUserProfileFieldMenuComponent
|
||||||
|
],
|
||||||
|
entryComponents: [
|
||||||
|
AddonUserProfileFieldMenuComponent
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldMenuModule {
|
||||||
|
constructor(userProfileFieldDelegate: CoreUserProfileFieldDelegate, handler: AddonUserProfileFieldMenuHandler) {
|
||||||
|
userProfileFieldDelegate.registerHandler(handler);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { Injectable } from '@angular/core';
|
||||||
|
import { CoreUserProfileFieldHandler, CoreUserProfileFieldHandlerData } from '../../../../core/user/providers/user-profile-field-delegate';
|
||||||
|
import { AddonUserProfileFieldMenuComponent } from '../component/menu';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Menu user profile field handlers.
|
||||||
|
*/
|
||||||
|
@Injectable()
|
||||||
|
export class AddonUserProfileFieldMenuHandler implements CoreUserProfileFieldHandler {
|
||||||
|
name = 'menu';
|
||||||
|
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not the handler is enabled on a site level.
|
||||||
|
*
|
||||||
|
* @return {boolean|Promise<boolean>} True or promise resolved with true if enabled.
|
||||||
|
*/
|
||||||
|
isEnabled() : boolean|Promise<boolean> {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data to send for the field based on the input data.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @param {any} model Model with the input data.
|
||||||
|
* @return {CoreUserProfileFieldHandlerData} Data to send for the field.
|
||||||
|
*/
|
||||||
|
getData(field: any, signup: boolean, registerAuth: string, model: any): CoreUserProfileFieldHandlerData {
|
||||||
|
let name = 'profile_field_' + field.shortname;
|
||||||
|
|
||||||
|
if (model[name]) {
|
||||||
|
return {
|
||||||
|
type: 'menu',
|
||||||
|
name: name,
|
||||||
|
value: model[name]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the Component to use to display the user profile field.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @return {any} The component to use, undefined if not found.
|
||||||
|
*/
|
||||||
|
getComponent(field: any, signup: boolean, registerAuth: string) {
|
||||||
|
return AddonUserProfileFieldMenuComponent;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!-- Render (no edit). -->
|
||||||
|
<ion-item *ngIf="!edit && field && field.name">
|
||||||
|
<h2>{{ field.name }}</h2>
|
||||||
|
<p><core-format-text [text]="field.value"></core-format-text></p>
|
||||||
|
</ion-item>
|
||||||
|
<!-- Edit. -->
|
||||||
|
<ion-item *ngIf="edit && field && field.shortname" text-wrap>
|
||||||
|
<ion-label [core-mark-required]="field.required">{{ field.name }}</ion-label>
|
||||||
|
<ion-input [type]="field.inputType" [name]="field.modelName" [placeholder]="field.name" [(ngModel)]="model[field.modelName]" [disabled]="!signup && field.locked" maxlength="{{field.maxlength}}" [required]="field.required" core-input-errors></ion-input>
|
||||||
|
</ion-item>
|
|
@ -0,0 +1,55 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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, Input, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directive to render a text user profile field.
|
||||||
|
*/
|
||||||
|
@Component({
|
||||||
|
selector: 'core-user-profile-field-text',
|
||||||
|
templateUrl: 'text.html'
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldTextComponent implements OnInit {
|
||||||
|
@Input() field: any; // The profile field to be rendered.
|
||||||
|
@Input() edit?: boolean = false; // True if editing the field. Defaults to false.
|
||||||
|
@Input() model?: any; // Model where to store the data. Required if edit=true or signup=true.
|
||||||
|
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component being initialized.
|
||||||
|
*/
|
||||||
|
ngOnInit() {
|
||||||
|
let field = this.field;
|
||||||
|
|
||||||
|
if (field && this.edit && this.model) {
|
||||||
|
field.modelName = 'profile_field_' + field.shortname;
|
||||||
|
|
||||||
|
// Check max length.
|
||||||
|
if (field.param2) {
|
||||||
|
field.maxlength = parseInt(field.param2, 10) || '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if it's a password or text.
|
||||||
|
field.inputType = field.param3 && field.param3 !== '0' && field.param3 !== 'false' ? 'password' : 'text';
|
||||||
|
|
||||||
|
// Initialize the value using default data.
|
||||||
|
if (typeof field.defaultdata != 'undefined' && typeof this.model[field.modelName] == 'undefined') {
|
||||||
|
this.model[field.modelName] = field.defaultdata;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { Injectable } from '@angular/core';
|
||||||
|
import { CoreUserProfileFieldHandler, CoreUserProfileFieldHandlerData } from '../../../../core/user/providers/user-profile-field-delegate';
|
||||||
|
import { AddonUserProfileFieldTextComponent } from '../component/text';
|
||||||
|
import { CoreTextUtilsProvider } from '../../../../providers/utils/text';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Text user profile field handlers.
|
||||||
|
*/
|
||||||
|
@Injectable()
|
||||||
|
export class AddonUserProfileFieldTextHandler implements CoreUserProfileFieldHandler {
|
||||||
|
name = 'text';
|
||||||
|
|
||||||
|
constructor(private textUtils: CoreTextUtilsProvider) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not the handler is enabled on a site level.
|
||||||
|
*
|
||||||
|
* @return {boolean|Promise<boolean>} True or promise resolved with true if enabled.
|
||||||
|
*/
|
||||||
|
isEnabled() : boolean|Promise<boolean> {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data to send for the field based on the input data.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @param {any} model Model with the input data.
|
||||||
|
* @return {CoreUserProfileFieldHandlerData} Data to send for the field.
|
||||||
|
*/
|
||||||
|
getData(field: any, signup: boolean, registerAuth: string, model: any): CoreUserProfileFieldHandlerData {
|
||||||
|
let name = 'profile_field_' + field.shortname;
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: 'text',
|
||||||
|
name: name,
|
||||||
|
value: this.textUtils.cleanTags(model[name])
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the Component to use to display the user profile field.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @return {any} The component to use, undefined if not found.
|
||||||
|
*/
|
||||||
|
getComponent(field: any, signup: boolean, registerAuth: string) {
|
||||||
|
return AddonUserProfileFieldTextComponent;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { IonicModule } from 'ionic-angular';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
import { AddonUserProfileFieldTextHandler } from './providers/handler';
|
||||||
|
import { CoreUserProfileFieldDelegate } from '../../../core/user/providers/user-profile-field-delegate';
|
||||||
|
import { AddonUserProfileFieldTextComponent } from './component/text';
|
||||||
|
import { CoreComponentsModule } from '../../../components/components.module';
|
||||||
|
import { CoreDirectivesModule } from '../../../directives/directives.module';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [
|
||||||
|
AddonUserProfileFieldTextComponent
|
||||||
|
],
|
||||||
|
imports: [
|
||||||
|
IonicModule,
|
||||||
|
TranslateModule.forChild(),
|
||||||
|
CoreComponentsModule,
|
||||||
|
CoreDirectivesModule
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
AddonUserProfileFieldTextHandler
|
||||||
|
],
|
||||||
|
exports: [
|
||||||
|
AddonUserProfileFieldTextComponent
|
||||||
|
],
|
||||||
|
entryComponents: [
|
||||||
|
AddonUserProfileFieldTextComponent
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldTextModule {
|
||||||
|
constructor(userProfileFieldDelegate: CoreUserProfileFieldDelegate, handler: AddonUserProfileFieldTextHandler) {
|
||||||
|
userProfileFieldDelegate.registerHandler(handler);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!-- Render (no edit). -->
|
||||||
|
<ion-item *ngIf="!edit && field && field.name">
|
||||||
|
<h2>{{ field.name }}</h2>
|
||||||
|
<p><core-format-text [text]="field.value"></core-format-text></p>
|
||||||
|
</ion-item>
|
||||||
|
<!-- Edit. -->
|
||||||
|
<ion-item *ngIf="edit && field && field.shortname" text-wrap>
|
||||||
|
<ion-label [core-mark-required]="field.required">{{ field.name }}</ion-label>
|
||||||
|
<ion-textarea [name]="field.modelName" [(ngModel)]="model[field.modelName]" [placeholder]="field.name" [disabled]="!signup && field.locked" [required]="field.required"></ion-textarea>
|
||||||
|
</ion-item>
|
|
@ -0,0 +1,50 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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, Input, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directive to render a textarea user profile field.
|
||||||
|
*/
|
||||||
|
@Component({
|
||||||
|
selector: 'core-user-profile-field-textarea',
|
||||||
|
templateUrl: 'textarea.html'
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldTextareaComponent implements OnInit {
|
||||||
|
@Input() field: any; // The profile field to be rendered.
|
||||||
|
@Input() edit?: boolean = false; // True if editing the field. Defaults to false.
|
||||||
|
@Input() model?: any; // Model where to store the data. Required if edit=true or signup=true.
|
||||||
|
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component being initialized.
|
||||||
|
*/
|
||||||
|
ngOnInit() {
|
||||||
|
let field = this.field;
|
||||||
|
|
||||||
|
if (field && this.edit && this.model) {
|
||||||
|
field.modelName = 'profile_field_' + field.shortname;
|
||||||
|
this.model[field.modelName] = {
|
||||||
|
format: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
// Initialize the value using default data.
|
||||||
|
if (typeof field.defaultdata != 'undefined' && typeof this.model[field.modelName].text == 'undefined') {
|
||||||
|
this.model[field.modelName].text = field.defaultdata;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { Injectable } from '@angular/core';
|
||||||
|
import { CoreUserProfileFieldHandler, CoreUserProfileFieldHandlerData } from '../../../../core/user/providers/user-profile-field-delegate';
|
||||||
|
import { AddonUserProfileFieldTextareaComponent } from '../component/textarea';
|
||||||
|
import { CoreTextUtilsProvider } from '../../../../providers/utils/text';
|
||||||
|
import { CoreDomUtilsProvider } from '../../../../providers/utils/dom';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Textarea user profile field handlers.
|
||||||
|
*/
|
||||||
|
@Injectable()
|
||||||
|
export class AddonUserProfileFieldTextareaHandler implements CoreUserProfileFieldHandler {
|
||||||
|
name = 'textarea';
|
||||||
|
|
||||||
|
constructor(private textUtils: CoreTextUtilsProvider, private domUtils: CoreDomUtilsProvider) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not the handler is enabled on a site level.
|
||||||
|
*
|
||||||
|
* @return {boolean|Promise<boolean>} True or promise resolved with true if enabled.
|
||||||
|
*/
|
||||||
|
isEnabled() : boolean|Promise<boolean> {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data to send for the field based on the input data.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @param {any} model Model with the input data.
|
||||||
|
* @return {Promise<CoreUserProfileFieldHandlerData>} Data to send for the field.
|
||||||
|
*/
|
||||||
|
getData(field: any, signup: boolean, registerAuth: string, model: any): Promise<CoreUserProfileFieldHandlerData> {
|
||||||
|
let name = 'profile_field_' + field.shortname;
|
||||||
|
|
||||||
|
if (model[name]) {
|
||||||
|
return this.domUtils.isRichTextEditorEnabled().then((enabled) => {
|
||||||
|
let text = model[name].text || '';
|
||||||
|
if (!enabled) {
|
||||||
|
// Rich text editor not enabled, add some HTML to the message if needed.
|
||||||
|
text = this.textUtils.formatHtmlLines(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: 'textarea',
|
||||||
|
name: name,
|
||||||
|
value: JSON.stringify({
|
||||||
|
text: text,
|
||||||
|
format: model[name].format || 1
|
||||||
|
})
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the Component to use to display the user profile field.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @return {any} The component to use, undefined if not found.
|
||||||
|
*/
|
||||||
|
getComponent(field: any, signup: boolean, registerAuth: string) {
|
||||||
|
return AddonUserProfileFieldTextareaComponent;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { IonicModule } from 'ionic-angular';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
import { AddonUserProfileFieldTextareaHandler } from './providers/handler';
|
||||||
|
import { CoreUserProfileFieldDelegate } from '../../../core/user/providers/user-profile-field-delegate';
|
||||||
|
import { AddonUserProfileFieldTextareaComponent } from './component/textarea';
|
||||||
|
import { CoreComponentsModule } from '../../../components/components.module';
|
||||||
|
import { CoreDirectivesModule } from '../../../directives/directives.module';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [
|
||||||
|
AddonUserProfileFieldTextareaComponent
|
||||||
|
],
|
||||||
|
imports: [
|
||||||
|
IonicModule,
|
||||||
|
TranslateModule.forChild(),
|
||||||
|
CoreComponentsModule,
|
||||||
|
CoreDirectivesModule
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
AddonUserProfileFieldTextareaHandler
|
||||||
|
],
|
||||||
|
exports: [
|
||||||
|
AddonUserProfileFieldTextareaComponent
|
||||||
|
],
|
||||||
|
entryComponents: [
|
||||||
|
AddonUserProfileFieldTextareaComponent
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldTextareaModule {
|
||||||
|
constructor(userProfileFieldDelegate: CoreUserProfileFieldDelegate, handler: AddonUserProfileFieldTextareaHandler) {
|
||||||
|
userProfileFieldDelegate.registerHandler(handler);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { AddonUserProfileFieldCheckboxModule } from './checkbox/checkbox.module';
|
||||||
|
import { AddonUserProfileFieldDatetimeModule } from './datetime/datetime.module';
|
||||||
|
import { AddonUserProfileFieldMenuModule } from './menu/menu.module';
|
||||||
|
import { AddonUserProfileFieldTextModule } from './text/text.module';
|
||||||
|
import { AddonUserProfileFieldTextareaModule } from './textarea/textarea.module';
|
||||||
|
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [],
|
||||||
|
imports: [
|
||||||
|
AddonUserProfileFieldCheckboxModule,
|
||||||
|
AddonUserProfileFieldDatetimeModule,
|
||||||
|
AddonUserProfileFieldMenuModule,
|
||||||
|
AddonUserProfileFieldTextModule,
|
||||||
|
AddonUserProfileFieldTextareaModule
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
],
|
||||||
|
exports: []
|
||||||
|
})
|
||||||
|
export class AddonUserProfileFieldModule {}
|
|
@ -64,6 +64,8 @@ import { CoreUserModule } from '../core/user/user.module';
|
||||||
|
|
||||||
// Addon modules.
|
// Addon modules.
|
||||||
import { AddonCalendarModule } from '../addon/calendar/calendar.module';
|
import { AddonCalendarModule } from '../addon/calendar/calendar.module';
|
||||||
|
import { AddonUserProfileFieldModule } from '../addon/userprofilefield/userprofilefield.module';
|
||||||
|
|
||||||
|
|
||||||
// For translate loader. AoT requires an exported function for factories.
|
// For translate loader. AoT requires an exported function for factories.
|
||||||
export function createTranslateLoader(http: HttpClient) {
|
export function createTranslateLoader(http: HttpClient) {
|
||||||
|
@ -99,7 +101,8 @@ export function createTranslateLoader(http: HttpClient) {
|
||||||
CoreSiteHomeModule,
|
CoreSiteHomeModule,
|
||||||
CoreContentLinksModule,
|
CoreContentLinksModule,
|
||||||
CoreUserModule,
|
CoreUserModule,
|
||||||
AddonCalendarModule
|
AddonCalendarModule,
|
||||||
|
AddonUserProfileFieldModule
|
||||||
],
|
],
|
||||||
bootstrap: [IonicApp],
|
bootstrap: [IonicApp],
|
||||||
entryComponents: [
|
entryComponents: [
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { CommonModule } from '@angular/common';
|
||||||
|
import { IonicModule } from 'ionic-angular';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
import { CoreUserProfileFieldComponent } from './user-profile-field/user-profile-field';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [
|
||||||
|
CoreUserProfileFieldComponent
|
||||||
|
],
|
||||||
|
imports: [
|
||||||
|
CommonModule,
|
||||||
|
IonicModule,
|
||||||
|
TranslateModule.forChild(),
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
],
|
||||||
|
exports: [
|
||||||
|
CoreUserProfileFieldComponent
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class CoreUserComponentsModule {}
|
|
@ -0,0 +1,2 @@
|
||||||
|
<!-- User profile field that overrides the default one. -->
|
||||||
|
<ng-template #userProfileField></ng-template>
|
|
@ -0,0 +1,5 @@
|
||||||
|
core-user-profile-field {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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, Input, ViewChild, ViewContainerRef, ComponentFactoryResolver, ComponentRef, OnInit } from '@angular/core';
|
||||||
|
import { CoreLoggerProvider } from '../../../../providers/logger';
|
||||||
|
import { CoreUserProfileFieldDelegate } from '../../providers/user-profile-field-delegate';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directive to render user profile field.
|
||||||
|
*/
|
||||||
|
@Component({
|
||||||
|
selector: 'core-user-profile-field',
|
||||||
|
templateUrl: 'user-profile-field.html'
|
||||||
|
})
|
||||||
|
export class CoreUserProfileFieldComponent implements OnInit {
|
||||||
|
@Input() field: any; // The profile field to be rendered.
|
||||||
|
@Input() signup?: boolean = false; // True if editing the field in signup. Defaults to false.
|
||||||
|
@Input() edit?: boolean = false; // True if editing the field. Defaults to false.
|
||||||
|
@Input() model?: any; // Model where to store the data. Required if edit=true or signup=true.
|
||||||
|
@Input() registerAuth?: string; // Register auth method. E.g. 'email'.
|
||||||
|
|
||||||
|
// Get the containers where to inject dynamic components. We use a setter because they might be inside a *ngIf.
|
||||||
|
@ViewChild('userProfileField', { read: ViewContainerRef }) set userProfileField (el: ViewContainerRef) {
|
||||||
|
if (this.field) {
|
||||||
|
this.createComponent(this.ufDelegate.getComponent(this.field, this.signup, this.registerAuth), el);
|
||||||
|
} else {
|
||||||
|
// The component hasn't been initialized yet. Store the container.
|
||||||
|
this.fieldContainer = el;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected logger;
|
||||||
|
|
||||||
|
// Instances and containers of all the components that the handler could define.
|
||||||
|
protected fieldContainer: ViewContainerRef;
|
||||||
|
protected fieldInstance: any;
|
||||||
|
|
||||||
|
constructor(logger: CoreLoggerProvider, private factoryResolver: ComponentFactoryResolver,
|
||||||
|
private ufDelegate: CoreUserProfileFieldDelegate) {
|
||||||
|
this.logger = logger.getInstance('CoreUserProfileFieldComponent');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component being initialized.
|
||||||
|
*/
|
||||||
|
ngOnInit() {
|
||||||
|
this.createComponent(this.ufDelegate.getComponent(this.field, this.signup, this.registerAuth), this.fieldContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a component, add it to a container and set the input data.
|
||||||
|
*
|
||||||
|
* @param {any} componentClass The class of the component to create.
|
||||||
|
* @param {ViewContainerRef} container The container to add the component to.
|
||||||
|
* @return {boolean} Whether the component was successfully created.
|
||||||
|
*/
|
||||||
|
protected createComponent(componentClass: any, container: ViewContainerRef) : boolean {
|
||||||
|
if (!componentClass || !container) {
|
||||||
|
// No component to instantiate or container doesn't exist right now.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.fieldInstance && container === this.fieldContainer) {
|
||||||
|
// Component already instantiated and the component hasn't been destroyed, nothing to do.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Create the component and add it to the container.
|
||||||
|
const factory = this.factoryResolver.resolveComponentFactory(componentClass),
|
||||||
|
componentRef = container.createComponent(factory);
|
||||||
|
|
||||||
|
this.fieldContainer = container;
|
||||||
|
this.fieldInstance = componentRef.instance;
|
||||||
|
|
||||||
|
// Set the Input data.
|
||||||
|
this.fieldInstance.field = this.field;
|
||||||
|
this.fieldInstance.edit = this.edit;
|
||||||
|
this.fieldInstance.model = this.model;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch(ex) {
|
||||||
|
this.logger.error('Error creating user field component', ex, componentClass);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -59,6 +59,7 @@
|
||||||
<h2>{{ 'core.user.interests' | translate}}</h2>
|
<h2>{{ 'core.user.interests' | translate}}</h2>
|
||||||
<p><core-format-text [text]="user.interests"></core-format-text></p>
|
<p><core-format-text [text]="user.interests"></core-format-text></p>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
<core-user-profile-field *ngFor="let field of user.customfields" [field]="field"></core-user-profile-field>
|
||||||
</ion-item-group>
|
</ion-item-group>
|
||||||
<ion-item-group *ngIf="user.description">
|
<ion-item-group *ngIf="user.description">
|
||||||
<ion-item-divider color="light">{{ 'core.user.description' | translate}}</ion-item-divider>
|
<ion-item-divider color="light">{{ 'core.user.description' | translate}}</ion-item-divider>
|
||||||
|
|
|
@ -18,6 +18,7 @@ import { TranslateModule } from '@ngx-translate/core';
|
||||||
import { CoreUserAboutPage } from './about';
|
import { CoreUserAboutPage } from './about';
|
||||||
import { CoreDirectivesModule } from '../../../../directives/directives.module';
|
import { CoreDirectivesModule } from '../../../../directives/directives.module';
|
||||||
import { CoreComponentsModule } from '../../../../components/components.module';
|
import { CoreComponentsModule } from '../../../../components/components.module';
|
||||||
|
import { CoreUserComponentsModule } from '../../components/components.module';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [
|
declarations: [
|
||||||
|
@ -26,6 +27,7 @@ import { CoreComponentsModule } from '../../../../components/components.module';
|
||||||
imports: [
|
imports: [
|
||||||
CoreComponentsModule,
|
CoreComponentsModule,
|
||||||
CoreDirectivesModule,
|
CoreDirectivesModule,
|
||||||
|
CoreUserComponentsModule,
|
||||||
IonicPageModule.forChild(CoreUserAboutPage),
|
IonicPageModule.forChild(CoreUserAboutPage),
|
||||||
TranslateModule.forChild()
|
TranslateModule.forChild()
|
||||||
],
|
],
|
||||||
|
|
|
@ -23,7 +23,7 @@ import { CoreEventsProvider } from '../../../../providers/events';
|
||||||
import { CoreSitesProvider } from '../../../../providers/sites';
|
import { CoreSitesProvider } from '../../../../providers/sites';
|
||||||
import { CoreMimetypeUtilsProvider } from '../../../../providers/utils/mimetype';
|
import { CoreMimetypeUtilsProvider } from '../../../../providers/utils/mimetype';
|
||||||
import { CoreFileUploaderHelperProvider } from '../../../fileuploader/providers/helper';
|
import { CoreFileUploaderHelperProvider } from '../../../fileuploader/providers/helper';
|
||||||
import { CoreUserDelegate } from '../../providers/delegate';
|
import { CoreUserDelegate } from '../../providers/user-delegate';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Page that displays an user profile page.
|
* Page that displays an user profile page.
|
||||||
|
@ -103,7 +103,6 @@ export class CoreUserProfilePage {
|
||||||
this.isLoadingHandlers = true;
|
this.isLoadingHandlers = true;
|
||||||
|
|
||||||
this.userDelegate.getProfileHandlersFor(user, this.courseId).then((handlers) => {
|
this.userDelegate.getProfileHandlersFor(user, this.courseId).then((handlers) => {
|
||||||
console.error(handlers);
|
|
||||||
this.actionHandlers = [];
|
this.actionHandlers = [];
|
||||||
this.newPageHandlers = [];
|
this.newPageHandlers = [];
|
||||||
this.communicationHandlers = [];
|
this.communicationHandlers = [];
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { CoreUserDelegate, CoreUserProfileHandler, CoreUserProfileHandlerData } from './delegate';
|
import { CoreUserDelegate, CoreUserProfileHandler, CoreUserProfileHandlerData } from './user-delegate';
|
||||||
import { CoreSitesProvider } from '../../../providers/sites';
|
import { CoreSitesProvider } from '../../../providers/sites';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// 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 { Injectable } from '@angular/core';
|
||||||
|
import { CoreDelegate, CoreDelegateHandler } from '../../../classes/delegate';
|
||||||
|
import { CoreLoggerProvider } from '../../../providers/logger';
|
||||||
|
import { CoreSitesProvider } from '../../../providers/sites';
|
||||||
|
import { CoreEventsProvider } from '../../../providers/events';
|
||||||
|
|
||||||
|
export interface CoreUserProfileFieldHandler extends CoreDelegateHandler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the Component to use to display the user profile field.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} [signup] True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @return {any} The component to use, undefined if not found.
|
||||||
|
*/
|
||||||
|
getComponent(field: any, signup: boolean, registerAuth: string): any;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data to send for the field based on the input data.
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @param {any} model Model with the input data.
|
||||||
|
* @return {Promise<CoreUserProfileFieldHandlerData>|CoreUserProfileFieldHandlerData} Data to send for the field.
|
||||||
|
*/
|
||||||
|
getData?(field: any, signup: boolean, registerAuth: string, model: any):
|
||||||
|
Promise<CoreUserProfileFieldHandlerData> | CoreUserProfileFieldHandlerData;
|
||||||
|
};
|
||||||
|
|
||||||
|
export interface CoreUserProfileFieldHandlerData {
|
||||||
|
/**
|
||||||
|
* Name to display.
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field type.
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
type?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Value of the field.
|
||||||
|
* @type {any}
|
||||||
|
*/
|
||||||
|
value: any;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service to interact with user profile fields. Provides functions to register a plugin.
|
||||||
|
*/
|
||||||
|
@Injectable()
|
||||||
|
export class CoreUserProfileFieldDelegate extends CoreDelegate {
|
||||||
|
protected handlers: {[s: string]: CoreUserProfileFieldHandler} = {};
|
||||||
|
protected enabledHandlers: {[s: string]: CoreUserProfileFieldHandler} = {};
|
||||||
|
|
||||||
|
constructor(protected loggerProvider: CoreLoggerProvider, protected sitesProvider: CoreSitesProvider,
|
||||||
|
protected eventsProvider: CoreEventsProvider) {
|
||||||
|
super('CoreUserProfileFieldDelegate', loggerProvider, sitesProvider, eventsProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the component to use to display an user field.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the directive for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} registerAuth Register auth method. E.g. 'email'
|
||||||
|
* @return {any} The component to use, undefined if not found.
|
||||||
|
*/
|
||||||
|
getComponent(field: any, signup: boolean, registerAuth: string) : any {
|
||||||
|
let type = field.type || field.datatype;
|
||||||
|
return this.executeFunction(type, 'getComponent', [field, signup, registerAuth]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data to send for a certain field based on the input data.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the data for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @param {string} registerAuth Register auth method. E.g. 'email'.
|
||||||
|
* @param {any} model Model with the input data.
|
||||||
|
* @return {Promise<any>} Data to send for the field.
|
||||||
|
*/
|
||||||
|
getDataForField(field: any, signup: boolean, registerAuth: string, model: any): Promise<any> {
|
||||||
|
let handler = this.getHandler(field, signup);
|
||||||
|
|
||||||
|
if (handler) {
|
||||||
|
let name = 'profile_field_' + field.shortname;
|
||||||
|
if (handler.getData) {
|
||||||
|
return Promise.resolve(handler.getData(field, signup, registerAuth, model));
|
||||||
|
} else if (field.shortname && typeof model[name] != 'undefined') {
|
||||||
|
// Handler doesn't implement the function, but the model has data for the field.
|
||||||
|
return Promise.resolve({
|
||||||
|
type: field.type || field.datatype,
|
||||||
|
name: name,
|
||||||
|
value: model[name]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Promise.reject(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data to send for a list of fields based on the input data.
|
||||||
|
*
|
||||||
|
* @param {any[]} fields User fields to get the data for.
|
||||||
|
* @param {boolean} [signup] True if user is in signup page.
|
||||||
|
* @param {string} [registerAuth] Register auth method. E.g. 'email'.
|
||||||
|
* @param {any} model Model with the input data.
|
||||||
|
* @return {Promise<any>} Data to send.
|
||||||
|
*/
|
||||||
|
getDataForFields(fields: any[], signup = false, registerAuth = "", model: any): Promise<any> {
|
||||||
|
let result = [],
|
||||||
|
promises = [];
|
||||||
|
|
||||||
|
fields.forEach((field) => {
|
||||||
|
this.getDataForField(field, signup, registerAuth, model).then((data) => {
|
||||||
|
result.push(data);
|
||||||
|
}).catch(() => {
|
||||||
|
// Ignore errors.
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return Promise.all(promises).then(() => {
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a handler.
|
||||||
|
*
|
||||||
|
* @param {any} field User field to get the directive for.
|
||||||
|
* @param {boolean} signup True if user is in signup page.
|
||||||
|
* @return {any} Handler.
|
||||||
|
*/
|
||||||
|
protected getHandler(field: any, signup: boolean): any {
|
||||||
|
let type = field.type || field.datatype;
|
||||||
|
|
||||||
|
if (signup) {
|
||||||
|
if (this.handlers[type]) {
|
||||||
|
return this.handlers[type];
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.enabledHandlers[type];
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,7 +13,8 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { CoreUserDelegate } from './providers/delegate';
|
import { CoreUserDelegate } from './providers/user-delegate';
|
||||||
|
import { CoreUserProfileFieldDelegate } from './providers/user-profile-field-delegate';
|
||||||
import { CoreUserProvider } from './providers/user';
|
import { CoreUserProvider } from './providers/user';
|
||||||
import { CoreUserHelperProvider } from './providers/helper';
|
import { CoreUserHelperProvider } from './providers/helper';
|
||||||
import { CoreUserProfileMailHandler } from './providers/user-handler';
|
import { CoreUserProfileMailHandler } from './providers/user-handler';
|
||||||
|
@ -25,6 +26,7 @@ import { CoreUserProfileMailHandler } from './providers/user-handler';
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
CoreUserDelegate,
|
CoreUserDelegate,
|
||||||
|
CoreUserProfileFieldDelegate,
|
||||||
CoreUserProfileMailHandler,
|
CoreUserProfileMailHandler,
|
||||||
CoreUserProvider,
|
CoreUserProvider,
|
||||||
CoreUserHelperProvider
|
CoreUserHelperProvider
|
||||||
|
|
Loading…
Reference in New Issue