coveo-search-ui
Version:
Coveo JavaScript Search Framework
120 lines (105 loc) • 4.28 kB
text/typescript
import { Component } from '../Base/Component';
import { IComponentBindings } from '../Base/ComponentBindings';
import { ComponentOptions } from '../Base/ComponentOptions';
import { IFieldOption } from '../Base/IComponentOptions';
import { QueryEvents, IBuildingQueryEventArgs, IQuerySuccessEventArgs } from '../../events/QueryEvents';
import { IGroupByRequest } from '../../rest/GroupByRequest';
import { Initialization } from '../Base/Initialization';
import { $$ } from '../../utils/Dom';
import * as Globalize from 'globalize';
import * as _ from 'underscore';
import { exportGlobally } from '../../GlobalExports';
export interface IAggregateOptions {
field: IFieldOption;
operation?: string;
format?: string;
}
/**
* The Aggregate component allows to display the result on an aggregate operation on the index.
*
* It hooks itself to the query to add a new {@link IGroupByRequest}, then displays the result.
*/
export class Aggregate extends Component {
static ID = 'Aggregate';
static doExport() {
exportGlobally({
Aggregate: Aggregate
});
}
/**
* The options for the component
* @componentOptions
*/
static options: IAggregateOptions = {
/**
* Specifies the field on which to do the aggregate operation. This parameter is mandatory.
*/
field: ComponentOptions.buildFieldOption({ required: true }),
/**
* Specifies the aggregate operation to perform.
*
* The possible values are:
* - `sum` - Computes the sum of the computed field values.
* - `average` - Computes the average of the computed field values.
* - `minimum` - Finds the minimum value of the computed field values.
* - `maximum` - Finds the maximum value of the computed field values.
*
* Default value is `sum`.
*/
operation: ComponentOptions.buildStringOption({ defaultValue: 'sum' }),
/**
* Specifies how to format the value.
*
* The available formats are defined in the Globalize library (see
* [Globalize](https://github.com/klaaspieter/jquery-global#globalizeformat-value-format-culture-).
*
* The most commonly used formats are:
* - `c0` - Formats the value as a currency.
* - `n0` - Formats the value as an integer.
* - `n2` - Formats the value as a floating point with 2 decimal digits.
*
* Default value is `c0`.
*/
format: ComponentOptions.buildStringOption({ defaultValue: 'c0' })
};
private index: number;
/**
* Creates a new Aggregate component.
* @param element The HTMLElement on which to instantiate the component.
* @param options The options for the Aggregate component.
* @param bindings The bindings that the component requires to function normally. If not set, these will be
* automatically resolved (with a slower execution time).
*/
constructor(public element: HTMLElement, public options?: IAggregateOptions, bindings?: IComponentBindings) {
super(element, Aggregate.ID, bindings);
this.options = ComponentOptions.initComponentOptions(element, Aggregate, options);
this.bind.onRootElement(QueryEvents.buildingQuery, (args: IBuildingQueryEventArgs) => this.handleBuildingQuery(args));
this.bind.onRootElement(QueryEvents.querySuccess, (args: IQuerySuccessEventArgs) => this.handleQuerySuccess(args));
$$(this.element).hide();
}
private handleBuildingQuery(args: IBuildingQueryEventArgs) {
var request: IGroupByRequest = {
field: <string>this.options.field,
maximumNumberOfValues: 0,
computedFields: [
{
field: <string>this.options.field,
operation: this.options.operation
}
]
};
this.index = args.queryBuilder.groupByRequests.length;
args.queryBuilder.groupByRequests.push(request);
}
private handleQuerySuccess(args: IQuerySuccessEventArgs) {
if (_.isNumber(this.index) && args.results.groupByResults.length != 0) {
var gbr = args.results.groupByResults[this.index];
var aggregate = gbr.globalComputedFieldResults[0];
$$(this.element).text(Globalize.format(aggregate, this.options.format));
$$(this.element).show();
} else {
$$(this.element).hide();
}
}
}
Initialization.registerAutoCreateComponent(Aggregate);