forked from CIT/Vmeda.Online
126 lines
4.7 KiB
TypeScript
126 lines
4.7 KiB
TypeScript
// (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, OnChanges, SimpleChange, OnDestroy } from '@angular/core';
|
|
import { ModalController } from 'ionic-angular';
|
|
import { CoreEventsProvider } from '@providers/events';
|
|
import { CoreRatingProvider, CoreRatingInfo, CoreRatingInfoItem } from '@core/rating/providers/rating';
|
|
import { CoreSitesProvider } from '@providers/sites';
|
|
|
|
/**
|
|
* Component that displays the aggregation of a rating item.
|
|
*/
|
|
@Component({
|
|
selector: 'core-rating-aggregate',
|
|
templateUrl: 'core-rating-aggregate.html'
|
|
})
|
|
export class CoreRatingAggregateComponent implements OnChanges, OnDestroy {
|
|
@Input() ratingInfo: CoreRatingInfo;
|
|
@Input() contextLevel: string;
|
|
@Input() instanceId: number;
|
|
@Input() itemId: number;
|
|
@Input() aggregateMethod: number;
|
|
@Input() scaleId: number;
|
|
@Input() courseId?: number;
|
|
|
|
disabled = false;
|
|
protected labelKey: string;
|
|
protected showCount: boolean;
|
|
protected item: CoreRatingInfoItem;
|
|
protected aggregateObserver;
|
|
protected updateSiteObserver;
|
|
|
|
constructor(private eventsProvider: CoreEventsProvider, private modalCtrl: ModalController,
|
|
private ratingProvider: CoreRatingProvider, sitesProvider: CoreSitesProvider) {
|
|
|
|
this.disabled = this.ratingProvider.isRatingDisabledInSite();
|
|
|
|
// Update visibility if current site info is updated.
|
|
this.updateSiteObserver = eventsProvider.on(CoreEventsProvider.SITE_UPDATED, () => {
|
|
this.disabled = this.ratingProvider.isRatingDisabledInSite();
|
|
}, sitesProvider.getCurrentSiteId());
|
|
}
|
|
|
|
/**
|
|
* Detect changes on input properties.
|
|
*/
|
|
ngOnChanges(changes: {[name: string]: SimpleChange}): void {
|
|
this.aggregateObserver && this.aggregateObserver.off();
|
|
|
|
this.item = (this.ratingInfo.ratings || []).find((rating) => rating.itemid == this.itemId);
|
|
if (!this.item) {
|
|
return;
|
|
}
|
|
|
|
if (this.aggregateMethod == CoreRatingProvider.AGGREGATE_AVERAGE) {
|
|
this.labelKey = 'core.rating.aggregateavg';
|
|
} else if (this.aggregateMethod == CoreRatingProvider.AGGREGATE_COUNT) {
|
|
this.labelKey = 'core.rating.aggregatecount';
|
|
} else if (this.aggregateMethod == CoreRatingProvider.AGGREGATE_MAXIMUM) {
|
|
this.labelKey = 'core.rating.aggregatemax';
|
|
} else if (this.aggregateMethod == CoreRatingProvider.AGGREGATE_MINIMUM) {
|
|
this.labelKey = 'core.rating.aggregatemin';
|
|
} else if (this.aggregateMethod == CoreRatingProvider.AGGREGATE_SUM) {
|
|
this.labelKey = 'core.rating.aggregatesum';
|
|
} else {
|
|
this.labelKey = '';
|
|
|
|
return;
|
|
}
|
|
|
|
this.showCount = (this.aggregateMethod != CoreRatingProvider.AGGREGATE_COUNT);
|
|
|
|
// Update aggrgate when the user adds or edits a rating.
|
|
this.aggregateObserver = this.eventsProvider.on(CoreRatingProvider.AGGREGATE_CHANGED_EVENT, (data) => {
|
|
if (data.contextLevel == this.contextLevel &&
|
|
data.instanceId == this.instanceId &&
|
|
data.component == this.ratingInfo.component &&
|
|
data.ratingArea == this.ratingInfo.ratingarea &&
|
|
data.itemId == this.itemId) {
|
|
this.item.aggregatestr = data.aggregate;
|
|
this.item.count = data.count;
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Open the individual ratings page.
|
|
*/
|
|
openRatings(): void {
|
|
if (!this.ratingInfo.canviewall || !this.item.count || this.disabled) {
|
|
return;
|
|
}
|
|
|
|
const params = {
|
|
contextLevel: this.contextLevel,
|
|
instanceId: this.instanceId,
|
|
ratingComponent: this.ratingInfo.component,
|
|
ratingArea: this.ratingInfo.ratingarea,
|
|
itemId: this.itemId,
|
|
scaleId: this.scaleId,
|
|
courseId: this.courseId
|
|
};
|
|
const modal = this.modalCtrl.create('CoreRatingRatingsPage', params);
|
|
modal.present();
|
|
}
|
|
|
|
/**
|
|
* Component being destroyed.
|
|
*/
|
|
ngOnDestroy(): void {
|
|
this.aggregateObserver && this.aggregateObserver.off();
|
|
this.updateSiteObserver && this.updateSiteObserver.off();
|
|
}
|
|
}
|