2019-05-02 08:47:53 +02:00

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();
}
}