diff --git a/ng-table/ng-table-tests.ts b/ng-table/ng-table-tests.ts
new file mode 100644
index 0000000000..1cc9c47a02
--- /dev/null
+++ b/ng-table/ng-table-tests.ts
@@ -0,0 +1,114 @@
+///
+
+interface IPerson {
+ age: number;
+ name: string;
+}
+
+function printPerson(p: IPerson) {
+ console.log('age: ' + p.age);
+ console.log('name: ' + p.name);
+}
+
+// NgTableParams signature tests
+namespace NgTableParamsTests {
+
+ let initialParams: NgTable.IParamValues = {
+ filter: { name: 'Christian' },
+ sorting: { age: 'asc' }
+ };
+ let settings: NgTable.ISettings = {
+ dataset: [{ age: 1, name: 'Christian' }, { age: 2, name: 'Lee' }, { age: 40, name: 'Christian' }],
+ filterOptions: {
+ filterComparator: true,
+ filterDelay: 100
+ },
+ counts: [10, 20, 50]
+ };
+
+ export let tableParams = new NgTableParams(initialParams, settings);
+
+ // modify parameters
+ tableParams.filter({ name: 'Lee' });
+ tableParams.sorting('age', 'desc');
+ tableParams.count(10);
+ tableParams.group(item => (item.age * 10).toString());
+
+ // modify settings at runtime
+ tableParams.settings({
+ dataset: [{ age: 1, name: 'Brandon' }, { age: 2, name: 'Lee' }]
+ });
+
+ tableParams.reload().then(rows => {
+ rows.forEach(printPerson);
+ });
+}
+
+// Dynamic table column signature tests
+namespace ColumnTests {
+ interface ICustomColFields {
+ field: string;
+ }
+ let dynamicCols: (NgTable.Columns.IDynamicTableColDef & ICustomColFields)[];
+
+ dynamicCols.push({
+ class: () => 'table',
+ field: 'age',
+ filter: { age: 'number' },
+ sortable: true,
+ show: true,
+ title: 'Age of Person',
+ titleAlt: 'Age'
+ });
+}
+
+namespace EventsTests {
+ declare let events: NgTable.Events.IEventsChannel;
+
+ let unregistrationFuncs: NgTable.Events.IUnregistrationFunc[] = [];
+ let x: NgTable.Events.IUnregistrationFunc;
+
+ x = events.onAfterCreated(params => {
+ // do stuff
+ });
+ unregistrationFuncs.push(x);
+
+ x = events.onAfterReloadData((params, newData, oldData) => {
+ newData.forEach(row => {
+ if (isDataGroup(row)) {
+ row.data.forEach(printPerson)
+ } else {
+ printPerson(row);
+ }
+ });
+ }, NgTableParamsTests.tableParams);
+ unregistrationFuncs.push(x);
+
+ x = events.onDatasetChanged((params, newDataset, oldDataset) => {
+ if (newDataset != null) {
+ newDataset.forEach(printPerson);
+ }
+ }, NgTableParamsTests.tableParams);
+ unregistrationFuncs.push(x);
+
+ x = events.onPagesChanged((params, newButtons, oldButtons) => {
+ newButtons.forEach(printPageButton);
+ }, NgTableParamsTests.tableParams);
+ unregistrationFuncs.push(x);
+
+ unregistrationFuncs.forEach(f => {
+ f();
+ });
+
+
+ function printPageButton(btn: NgTable.IPageButton) {
+ console.log('type: ' + btn.type);
+ console.log('number: ' + btn['number']);
+ console.log('current: ' + btn.current);
+ console.log('active: ' + btn.active);
+ }
+
+ function isDataGroup(row: any): row is NgTable.Data.IDataRowGroup {
+ return ('$hideRows' in row);
+ }
+}
\ No newline at end of file
diff --git a/ng-table/ng-table.d.ts b/ng-table/ng-table.d.ts
new file mode 100644
index 0000000000..ab485a2779
--- /dev/null
+++ b/ng-table/ng-table.d.ts
@@ -0,0 +1,838 @@
+// Type definitions for ng-table
+// Project: https://github.com/esvit/ng-table
+// Definitions by: Christian Crowhurst
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+///
+
+/**
+ * Parameters manager for an ngTable directive
+ */
+declare class NgTableParams {
+ /**
+ * The page of data rows currently being displayed in the table
+ */
+ data: T[];
+
+ constructor(baseParameters?: NgTable.IParamValues, baseSettings?: NgTable.ISettings)
+
+ /**
+ * Returns the number of data rows per page
+ */
+ count(): number
+ /**
+ * Sets the number of data rows per page.
+ * Changes to count will cause `isDataReloadRequired` to return true
+ */
+ count(count: number): NgTableParams
+
+ /**
+ * Returns the current filter values used to restrict the set of data rows.
+ * @param trim supply true to return the current filter minus any insignificant values
+ * (null, undefined and empty string)
+ */
+ filter(trim?: boolean): NgTable.IFilterValues
+ /**
+ * Sets filter values to the `filter` supplied; any existing filter will be removed
+ * Changes to filter will cause `isDataReloadRequired` to return true and the current `page` to be set to 1
+ */
+ filter(filter: NgTable.IFilterValues): NgTableParams
+ /**
+ * Generate array of pages.
+ * When no arguments supplied, the current parameter state of this `NgTableParams` instance will be used
+ */
+ generatePagesArray(currentPage?: number, totalItems?: number, pageSize?: number, maxBlocks?: number): NgTable.IPageButton[]
+ /**
+ * Returns the current grouping used to group the data rows
+ */
+ group(): NgTable.Grouping
+ /**
+ * Sets grouping to the `field` and `sortDirection` supplied; any existing grouping will be removed
+ * Changes to group will cause `isDataReloadRequired` to return true and the current `page` to be set to 1
+ */
+ group(field: string, sortDirection?: string): NgTableParams
+ /**
+ * Sets grouping to the `group` supplied; any existing grouping will be removed.
+ * Changes to group will cause `isDataReloadRequired` to return true and the current `page` to be set to 1
+ */
+ group(group: NgTable.Grouping): NgTableParams
+ /**
+ * Returns true when an attempt to `reload` the current `parameter` values have resulted in a failure.
+ * This method will continue to return true until the `reload` is successfully called or when the
+ * `parameter` values have changed
+ */
+ hasErrorState(): boolean
+ /**
+ * Returns true if `filter` has significant filter value(s) (any value except null, undefined, or empty string),
+ * otherwise false
+ */
+ hasFilter(): boolean
+ /**
+ * Return true when a change to `filters` require the `reload` method
+ * to be run so as to ensure the data presented to the user reflects these filters
+ */
+ hasFilterChanges(): boolean
+ /**
+ * Returns true when at least one group has been set
+ */
+ hasGroup(): boolean
+ /**
+ * Returns true when the `group` and when supplied, the `sortDirection` matches an existing group
+ */
+ hasGroup(group: string | NgTable.IGroupingFunc, sortDirection?: string): boolean
+ /**
+ * Return true when a change to this instance should require the `reload` method
+ * to be run so as to ensure the data rows presented to the user reflects the current state.
+ *
+ * Note that this method will return false when the `reload` method has run but fails. In this case
+ * `hasErrorState` will return true.
+ *
+ * The built-in `ngTable` directives will watch for when this function returns true and will then call
+ * the `reload` method to load its data rows
+ */
+ isDataReloadRequired(): boolean
+ /**
+ * Returns sorting values in a format that can be consumed by the angular `$orderBy` filter service
+ */
+ orderBy(): string[]
+ /**
+ * Trigger a reload of the data rows
+ */
+ reload>(): ng.IPromise
+ /**
+ * Returns the settings for the table.
+ */
+ settings(): NgTable.ISettings
+ /**
+ * Sets the settings for the table; new setting values will be merged with the existing settings.
+ * Supplying a new `dataset` will cause `isDataReloadRequired` to return true and the `ngTableEventsChannel`
+ * to fire its `datasetChanged` event
+ */
+ settings(newSettings: NgTable.ISettings): NgTableParams
+ /**
+ * Returns the current sorting used to order the data rows.
+ * Changes to sorting will cause `isDataReloadRequired` to return true
+ */
+ sorting(): NgTable.ISortingValues
+ /**
+ * Sets sorting values to the `sorting` supplied; any existing sorting will be removed.
+ * Changes to sorting will cause `isDataReloadRequired` to return true
+ */
+ sorting(sorting: NgTable.ISortingValues): NgTableParams
+ /**
+ * Sets sorting to the `field` and `direction` supplied; any existing sorting will be removed
+ */
+ sorting(field: string, direction: string): NgTableParams
+ /**
+ * Returns the index of the current "slice" of data rows
+ */
+ page(): number
+ /**
+ * Sets the index of the current "slice" of data rows. The index starts at 1.
+ * Changing the page number will cause `isDataReloadRequired` to return true
+ */
+ page(page: number): NgTableParams
+ /**
+ * Returns the count of the data rows that match the current `filter`
+ */
+ total(): number
+ /**
+ * Sets `settings().total` to the value supplied.
+ * Typically you will need to set a `total` in the body of any custom `getData` function
+ * you supply as a setting value to this instance.
+ * @example
+ * var tp = new NgTableParams({}, { getData: customGetData })
+ * function customGetData(params) {
+ * var queryResult = /* code to fetch current data rows and total *\/
+ * params.total(queryResult.total);
+ * return queryResult.dataRowsPage;
+ * }
+ */
+ total(total: number): NgTableParams
+ /**
+ * Returns the current parameter values uri-encoded. Set `asString` to
+ * true for the parameters to be returned as an array of strings of the form 'paramName=value'
+ * otherwise parameters returned as a key-value object
+ */
+ url(asString?: boolean): { [name: string]: string } | string[]
+}
+
+declare namespace NgTable {
+
+ interface IDataSettings {
+ applyPaging?: boolean;
+ }
+
+ /**
+ * An angular value object that allow for overriding of the initial default values used when constructing
+ * an instance of `NgTableParams`
+ */
+ interface IDefaults {
+ params?: IParamValues;
+ settings?: ISettings
+ }
+
+ /**
+ * Map of the names of fields declared on a data row and the corrosponding filter value
+ */
+ interface IFilterValues { [name: string]: any }
+
+ /**
+ * Map of the names of fields on a data row and the corrosponding sort direction;
+ * Set the value of a key to undefined to let value of `ISettings.defaultSort` apply
+ */
+ interface ISortingValues { [name: string]: string }
+
+ type Grouping = IGroupValues | IGroupingFunc;
+
+ /**
+ * Map of the names of fields on a data row and the corrosponding sort direction
+ */
+ interface IGroupValues { [name: string]: string }
+
+ /**
+ * Signature of a function that should return the name of the group
+ * that the `item` should be placed within
+ */
+ interface IGroupingFunc {
+ (item: T): string;
+ /**
+ * 'asc' or 'desc'; leave undefined to let the value of `ISettings.groupOptions.defaultSort` apply
+ */
+ sortDirection?: string
+ }
+
+ /**
+ * The runtime values for `NgTableParams` that determine the set of data rows and
+ * how they are to be displayed in a table
+ */
+ interface IParamValues {
+ /**
+ * The index of the "slice" of data rows, starting at 1, to be displayed by the table.
+ */
+ page?: number;
+ /**
+ * The number of data rows per page
+ */
+ count?: number;
+ /**
+ * The filter that should be applied to restrict the set of data rows
+ */
+ filter?: IFilterValues;
+ /**
+ * The sort order that should be applied to the data rows.
+ */
+ sorting?: ISortingValues;
+ /**
+ * The grouping that should be applied to the data rows
+ */
+ group?: string | Grouping;
+ }
+
+
+ type FilterComparator = boolean | IFilterComparatorFunc;
+
+ interface IFilterComparatorFunc {
+ (actual: T, expected: T): boolean;
+ }
+
+ interface IFilterFunc {
+ (data: T[], filter: IFilterValues, filterComparator: FilterComparator): T[]
+ }
+
+
+ interface IFilterSettings {
+ /**
+ * Use this to determine how items are matched against the filter values.
+ * This setting is identical to the `comparator` parameter supported by the angular
+ * `$filter` filter service
+ *
+ * Defaults to `undefined` which will result in a case insensitive susbstring match when
+ * `IDefaultGetData` service is supplying the implementation for the
+ * `ISettings.getData` function
+ */
+ filterComparator?: FilterComparator;
+ /**
+ * A duration to wait for the user to stop typing before applying the filter.
+ * - Defaults to 0 for small managed inmemory arrays ie where a `ISettings.dataset` argument is
+ * supplied to `NgTableParams.settings`.
+ * - Defaults to 500 milliseconds otherwise.
+ */
+ filterDelay?: number;
+ /**
+ * The number of elements up to which a managed inmemory array is considered small. Defaults to 10000.
+ */
+ filterDelayThreshold?: number;
+ /**
+ * Overrides `IDefaultGetDataProvider.filterFilterName`.
+ * The value supplied should be the name of the angular `$filter` service that will be selected to perform
+ * the actual filter logic.
+ * Defaults to 'filter'.
+ */
+ filterFilterName?: string;
+ /**
+ * Tells `IDefaultGetData` to use this function supplied to perform the filtering instead of selecting an angular $filter.
+ */
+ filterFn?: IFilterFunc;
+ /**
+ * The layout to use when multiple html templates are to rendered in a single table header column.
+ * Available values:
+ * - stack (the default)
+ * - horizontal
+ */
+ filterLayout?: string
+ }
+
+ interface IGroupSettings {
+ /**
+ * The default sort direction that will be used whenever a group is supplied that
+ * does not define its own sort direction
+ */
+ defaultSort?: string;
+ /**
+ * Determines whether groups should be displayed expanded to show their items. Defaults to true
+ */
+ isExpanded?: boolean;
+ }
+
+ /**
+ * Definition of the buttons rendered by the data row pager directive
+ */
+ interface IPageButton {
+ type: string;
+ number?: number;
+ active: boolean;
+ current?: boolean;
+ }
+
+ /**
+ * Configuration settings for `NgTableParams`
+ */
+ interface ISettings {
+ /**
+ * Returns true whenever a call to `getData` is in progress
+ */
+ $loading?: boolean;
+ /**
+ * An array that contains all the data rows that NgTable should manage.
+ * The `gateData` function will be used to manage the data rows
+ * that ultimately will be displayed.
+ */
+ dataset?: T[];
+ dataOptions?: {};
+ /**
+ * The total number of data rows before paging has been applied.
+ * Typically you will not need to supply this yourself
+ */
+ total?: number;
+ /**
+ * The default sort direction that will be used whenever a sorting is supplied that
+ * does not define its own sort direction
+ */
+ defaultSort?: string;
+ filterOptions?: IFilterSettings;
+ groupOptions?: IGroupSettings;
+ /**
+ * The page size buttons that should be displayed. Each value defined in the array
+ * determines the possible values that can be supplied to `NgTableParams.page()`
+ */
+ counts?: number[];
+ /**
+ * The collection of interceptors that should apply to the results of a call to
+ * the `getData` function before the data rows are displayed in the table
+ */
+ interceptors?: IInterceptor[];
+ /**
+ * Configuration for the template that will display the page size buttons
+ */
+ paginationMaxBlocks?: number;
+ /**
+ * Configuration for the template that will display the page size buttons
+ */
+ paginationMinBlocks?: number;
+ /**
+ * The html tag that will be used to display the sorting indicator in the table header
+ */
+ sortingIndicator?: string;
+ /**
+ * The function that will be used fetch data rows. Leave undefined to let the `IDefaultGetData`
+ * service provide a default implementation that will work with the `dataset` array you supply.
+ *
+ * Typically you will supply a custom function when you need to execute filtering, paging and sorting
+ * on the server
+ */
+ getData?: Data.IGetDataFunc | Data.IInterceptableGetDataFunc;
+ /**
+ * The function that will be used group data rows according to the groupings returned by `NgTableParams.group()`
+ */
+ getGroups?: Data.IGetGroupFunc;
+ }
+
+ /**
+ * Configuration values that determine the behaviour of the `ngTableFilterConfig` service
+ */
+ interface IFilterConfigValues {
+ /**
+ * The default base url to use when deriving the url for a filter template given just an alias name
+ * Defaults to 'ng-table/filters/'
+ */
+ defaultBaseUrl?: string;
+ /**
+ * The extension to use when deriving the url of a filter template when given just an alias name
+ */
+ defaultExt?: string;
+ /**
+ * A map of alias names and their corrosponding urls. A lookup against this map will be used
+ * to find the url matching an alias name.
+ * If no match is found then a url will be derived using the following pattern `${defaultBaseUrl}${aliasName}.${defaultExt}`
+ */
+ aliasUrls?: { [name: string]: string };
+ }
+
+ /**
+ * The angular provider used to configure the behaviour of the `ngTableFilterConfig` service
+ */
+ interface IFilterConfigProvider {
+ $get: IFilterConfig;
+ /**
+ * Reset back to factory defaults the config values that `ngTableFilterConfig` service will use
+ */
+ resetConfigs(): void;
+ /**
+ * Set the config values used by `ngTableFilterConfig` service
+ */
+ setConfig(customConfig: IFilterConfigValues): void;
+ }
+
+ /**
+ * A key value-pair map where the key is the name of a field in a data row and the value is the definition
+ * for the template used to render a filter cell in the header of a html table.
+ * Where the value is supplied as a string this should either be url to a html template or an alias to a url registered
+ * using the `ngTableFilterConfigProvider`
+ * @example
+ * vm.ageFilter = { "age": "number" }
+ * @example
+ * vm.ageFilter = { "age": "my/custom/ageTemplate.html" }
+ * @example
+ * vm.ageFilter = { "age": { id: "number", placeholder: "Age of person"} }
+ */
+ interface IFilterTemplateDefMap {
+ [name: string]: string | IFilterTemplateDef
+ }
+
+ /**
+ * A fully qualified template definition for a single filter
+ */
+ interface IFilterTemplateDef {
+ /**
+ * A url to a html template of an alias to a url registered using the `ngTableFilterConfigProvider`
+ */
+ id: string,
+ /**
+ * The text that should be rendered as a prompt to assist the user when entering a filter value
+ */
+ placeholder: string
+ }
+
+ /**
+ * Exposes configuration values and methods used to return the location of the html
+ * templates used to render the filter row of an ng-table directive
+ */
+ interface IFilterConfig {
+ /**
+ * Readonly copy of the final values used to configure the service.
+ */
+ config: IFilterConfigValues,
+ /**
+ * Return the url of the html filter template for the supplied definition and key.
+ * For more information see the documentation for `IFilterTemplateMap`
+ */
+ getTemplateUrl(filterDef: string | IFilterTemplateDef, filterKey?: string): string,
+ /**
+ * Return the url of the html filter template registered with the alias supplied
+ */
+ getUrlForAlias(aliasName: string, filterKey?: string): string
+ }
+
+ interface InternalTableParams extends NgTableParams {
+ isNullInstance: boolean
+ }
+
+ /**
+ * A custom object that can be registered with an NgTableParams instance that can be used
+ * to post-process the results (and failures) returned by its `getData` function
+ */
+ interface IInterceptor {
+ response?: (data: TData, params: NgTableParams) => TData;
+ responseError?: (reason: any, params: NgTableParams) => any;
+ }
+
+ type SelectData = ISelectOption[] | ISelectDataFunc
+
+ interface ISelectOption {
+ id: string | number;
+ title: string;
+ }
+
+ interface ISelectDataFunc {
+ (): ISelectOption[] | ng.IPromise
+ }
+
+ /**
+ * Definition of the constructor function that will construct new instances of `NgTableParams`.
+ * On construction of `NgTableParams` the `ngTableEventsChannel` will fire its `afterCreated` event.
+ */
+ interface ITableParamsConstructor {
+ new (baseParameters?: IParamValues, baseSettings?: ISettings): NgTableParams
+ }
+
+
+ namespace Data {
+
+ type DataResult = T | IDataRowGroup;
+
+ interface IDataRowGroup {
+ data: T[];
+ $hideRows: boolean;
+ value: string;
+ }
+
+ /**
+ * A default implementation of the getData function that will apply the `filter`, `orderBy` and
+ * paging values from the `NgTableParams` instance supplied to the data array supplied.
+ *
+ * A call to this function will:
+ * - return the resulting array
+ * - assign the total item count after filtering to the `total` of the `NgTableParams` instance supplied
+ */
+ interface IDefaultGetData {
+ (data: T[], params: NgTableParams): T[];
+ /**
+ * Convenience function that this service will use to apply paging to the data rows.
+ *
+ * Returns a slice of rows from the `data` array supplied and sets the `NgTableParams.total()`
+ * on the `params` instance supplied to `data.length`
+ */
+ applyPaging(data: T[], params: NgTableParams): T[],
+ /**
+ * Returns a reference to the function that this service will use to filter data rows
+ */
+ getFilterFn(params: NgTableParams): IFilterFunc,
+ /**
+ * Returns a reference to the function that this service will use to sort data rows
+ */
+ getOrderByFn(params?: NgTableParams): void
+ }
+
+ /**
+ * Allows for the configuration of the ngTableDefaultGetData service.
+ */
+ interface IDefaultGetDataProvider {
+ $get(): IDefaultGetData;
+ /**
+ * The name of a angular filter that knows how to apply the values returned by
+ * `NgTableParams.filter()` to restrict an array of data.
+ * (defaults to the angular `filter` filter service)
+ */
+ filterFilterName: string,
+ /**
+ * The name of a angular filter that knows how to apply the values returned by
+ * `NgTableParams.orderBy()` to sort an array of data.
+ * (defaults to the angular `orderBy` filter service)
+ */
+ sortingFilterName: string
+ }
+
+ interface IGetDataBcShimFunc {
+ (originalFunc: ILegacyGetDataFunc): { (params: NgTableParams): ng.IPromise }
+ }
+
+ /**
+ * Signature of a function that will called whenever NgTable requires to load data rows
+ * into the table.
+ * `params` is the table requesting the data rows
+ */
+ interface IGetDataFunc {
+ (params: NgTableParams): T[] | ng.IPromise;
+ }
+
+ interface IGetGroupFunc {
+ (params: NgTableParams): { [name: string]: IDataRowGroup[] }
+ }
+
+ /**
+ * Variation of the `IGetDataFunc` function signature that allows for flexibility for
+ * the shape of the return value.
+ * Typcially you will use this function signature when you want to configure `NgTableParams` with
+ * interceptors that will return the final data rows array.
+ */
+ interface IInterceptableGetDataFunc {
+ (params: NgTableParams): TResult;
+ }
+
+ interface ILegacyGetDataFunc {
+ ($defer: ng.IDeferred, params: NgTableParams): void
+ }
+ }
+
+ namespace Events {
+ interface IEventSelectorFunc {
+ (publisher: NgTableParams): boolean
+ }
+
+ type EventSelector = NgTableParams | IEventSelectorFunc
+
+ interface IDatasetChangedListener {
+ (publisher: NgTableParams, newDataset: T[], oldDataset: T[]): any
+ }
+ interface IAfterCreatedListener {
+ (publisher: NgTableParams): any
+ }
+ interface IAfterReloadDataListener {
+ (publisher: NgTableParams, newData: NgTable.Data.DataResult[], oldData: NgTable.Data.DataResult[]): any
+ }
+ interface IPagesChangedListener {
+ (publisher: NgTableParams, newPages: NgTable.IPageButton[], oldPages: NgTable.IPageButton[]): any
+ }
+
+ interface IUnregistrationFunc {
+ (): void
+ }
+
+ interface IEventsChannel {
+ /**
+ * Subscribe to receive notification whenever a new `NgTableParams` instance has finished being constructed.
+ * Optionally supply an `eventFilter` to restrict which events that should trigger the `listener` to be called. Supply a
+ * `scope` to have angular automatically unregister the listener when the `scope` is destroyed.
+ *
+ * @param listener the function that will be called when the event fires
+ * @param scope the angular `$scope` that will limit the lifetime of the event subscription
+ * @param eventFilter a predicate function that should return true to receive the event
+ * @return a unregistration function that when called will unregister the `listener`
+ */
+ onAfterCreated(listener: Events.IAfterCreatedListener, scope: ng.IScope, eventFilter?: Events.IEventSelectorFunc): IUnregistrationFunc;
+ /**
+ * Subscribe to receive notification whenever a new `NgTableParams` instance has finished being constructed.
+ * Optionally supply an `eventFilter` to restrict which events that should trigger the `listener` to be called.
+ *
+ * @param listener the function that will be called when the event fires
+ * @param eventFilter a predicate function that should return true to receive the event
+ * @return a unregistration function that when called will unregister the `listener`
+ */
+ onAfterCreated(listener: Events.IAfterCreatedListener, eventFilter?: Events.IEventSelectorFunc): IUnregistrationFunc;
+ /**
+ * Subscribe to receive notification whenever the `reload` method of an `NgTableParams` instance has successfully executed
+ * Optionally supply an `eventFilter` to restrict which events that should trigger the `listener` to be called. Supply a
+ * `scope` to have angular automatically unregister the listener when the `scope` is destroyed.
+ *
+ * @param listener the function that will be called when the event fires
+ * @param scope the angular `$scope` that will limit the lifetime of the event subscription
+ * @param eventFilter either the specific `NgTableParams` instance you want to receive events for or a predicate function that should return true to receive the event
+ * @return a unregistration function that when called will unregister the `listener`
+ */
+ onAfterReloadData(listener: Events.IAfterReloadDataListener, scope: ng.IScope, eventFilter?: Events.EventSelector): IUnregistrationFunc;
+ /**
+ * Subscribe to receive notification whenever the `reload` method of an `NgTableParams` instance has successfully executed
+ * Optionally supply an `eventFilter` to restrict which events that should trigger the `listener` to be called.
+ *
+ * @param listener the function that will be called when the event fires
+ * @param eventFilter a predicate function that should return true to receive the event
+ * @return a unregistration function that when called will unregister the `listener`
+ */
+ onAfterReloadData(listener: Events.IAfterReloadDataListener, eventFilter?: Events.EventSelector): IUnregistrationFunc;
+
+ /**
+ * Subscribe to receive notification whenever a new data rows *array* is supplied as a `settings` value to a `NgTableParams` instance.
+ * Optionally supply an `eventFilter` to restrict which events that should trigger the `listener` to be called. Supply a
+ * `scope` to have angular automatically unregister the listener when the `scope` is destroyed.
+ *
+ * @param listener the function that will be called when the event fires
+ * @param scope the angular `$scope` that will limit the lifetime of the event subscription
+ * @param eventFilter either the specific `NgTableParams` instance you want to receive events for or a predicate function that should return true to receive the event
+ * @return a unregistration function that when called will unregister the `listener`
+ */
+ onDatasetChanged(listener: Events.IDatasetChangedListener, scope: ng.IScope, eventFilter?: Events.EventSelector): IUnregistrationFunc;
+ /**
+ * Subscribe to receive notification whenever a new data rows *array* is supplied as a `settings` value to a `NgTableParams` instance.
+ * Optionally supply an `eventFilter` to restrict which events that should trigger the `listener` to be called.
+ *
+ * @param listener the function that will be called when the event fires
+ * @param eventFilter either the specific `NgTableParams` instance you want to receive events for or a predicate function that should return true to receive the event
+ * @return a unregistration function that when called will unregister the `listener`
+ */
+ onDatasetChanged(listener: Events.IDatasetChangedListener, eventFilter?: Events.EventSelector): IUnregistrationFunc;
+
+ /**
+ * Subscribe to receive notification whenever the paging buttons for an `NgTableParams` instance change
+ * Optionally supply an `eventFilter` to restrict which events that should trigger the `listener` to be called. Supply a
+ * `scope` to have angular automatically unregister the listener when the `scope` is destroyed.
+ *
+ * @param listener the function that will be called when the event fires
+ * @param scope the angular `$scope` that will limit the lifetime of the event subscription
+ * @param eventFilter either the specific `NgTableParams` instance you want to receive events for or a predicate function that should return true to receive the event
+ * @return a unregistration function that when called will unregister the `listener`
+ */
+ onPagesChanged(listener: Events.IPagesChangedListener, scope: ng.IScope, eventFilter?: Events.EventSelector): IUnregistrationFunc;
+ /**
+ * Subscribe to receive notification whenever the paging buttons for an `NgTableParams` instance change
+ * Optionally supply an `eventFilter` to restrict which events that should trigger the `listener` to be called.
+ *
+ * @param listener the function that will be called when the event fires
+ * @param eventFilter either the specific `NgTableParams` instance you want to receive events for or a predicate function that should return true to receive the event
+ * @return a unregistration function that when called will unregister the `listener`
+ */
+ onPagesChanged(listener: Events.IPagesChangedListener, eventFilter?: Events.EventSelector): IUnregistrationFunc;
+
+ publishAfterCreated(publisher: NgTableParams): void;
+ publishAfterReloadData(publisher: NgTableParams, newData: T[], oldData: T[]): void;
+ publishDatasetChanged(publisher: NgTableParams, newDataset: T[], oldDataset: T[]): void;
+ publishPagesChanged(publisher: NgTableParams, newPages: NgTable.IPageButton[], oldPages: NgTable.IPageButton[]): void;
+ }
+ }
+
+ namespace Columns {
+
+ type ColumnFieldContext = ng.IScope & {
+ $column: IColumnDef;
+ $columns: IColumnDef[];
+ }
+
+ interface IColumnField {
+ (context?: ColumnFieldContext): T;
+ assign($scope: ng.IScope, value: T): void;
+ }
+
+ /**
+ * The definition of the column within a ngTable.
+ * When using `ng-table` directive a column definition will be parsed from each `td` tag found in the
+ * `tr` data row tag.
+ *
+ * @example
+ *
+ * |
+ * |
+ *
+ */
+ interface IColumnDef {
+ /**
+ * Custom CSS class that should be added to the `th` tag(s) of this column in the table header
+ *
+ * To set this on the `td` tag of a html table use the attribute `header-class` or `data-header-class`
+ */
+ class: IColumnField;
+ /**
+ * The `ISelectOption`s that can be used in a html filter template for this colums.
+ */
+ data?: SelectData;
+ /**
+ * The index position of this column within the `$columns` container array
+ */
+ id: number;
+ /**
+ * The definition of 0 or more html filter templates that should be rendered for this column in
+ * the table header
+ */
+ filter: IColumnField;
+ /**
+ * Supplies the `ISelectOption`s that can be used in a html filter template for this colums.
+ * At the creation of the `NgTableParams` this field will be called and the result then assigned
+ * to the `data` field of this column.
+ */
+ filterData: IColumnField | SelectData>;
+ /**
+ * The name of the data row field that will be used to group on, or false when this column
+ * does not support grouping
+ */
+ groupable: IColumnField;
+ /**
+ * The url of a custom html template that should be used to render a table header for this column
+ *
+ * To set this on the `td` tag for a html table use the attribute `header` or `data-header`
+ */
+ headerTemplateURL: IColumnField;
+ /**
+ * The text that should be used as a tooltip for this column in the table header
+ */
+ headerTitle: IColumnField;
+ /**
+ * Determines whether this column should be displayed in the table
+ *
+ * To set this on the `td` tag for a html table use the attribute `ng-if`
+ */
+ show: IColumnField;
+ /**
+ * The name of the data row field that will be used to sort on, or false when this column
+ * does not support sorting
+ */
+ sortable: IColumnField;
+ /**
+ * The title of this column that should be displayed in the table header
+ */
+ title: IColumnField;
+ /**
+ * An alternate column title. Typically this can be used for responsive table layouts
+ * where the titleAlt should be used for small screen sizes
+ */
+ titleAlt: IColumnField;
+ }
+
+ type DynamicTableColField = IDynamicTableColFieldFunc | T;
+
+ interface IDynamicTableColFieldFunc {
+ (context: ColumnFieldContext): T;
+ }
+
+ /**
+ * The definition of the column supplied to a ngTableDynamic directive.
+ */
+ interface IDynamicTableColDef {
+ /**
+ * Custom CSS class that should be added to the `th` tag(s) of this column in the table header
+ */
+ class?: DynamicTableColField;
+ /**
+ * The definition of 0 or more html filter templates that should be rendered for this column in
+ * the table header
+ */
+ filter?: DynamicTableColField;
+ /**
+ * Supplies the `ISelectOption`s that can be used in a html filter template for this colums.
+ * At the creation of the `NgTableParams` this field will be called and the result then assigned
+ * to the `data` field of this column.
+ */
+ filterData?: DynamicTableColField | SelectData>;
+ /**
+ * The name of the data row field that will be used to group on, or false when this column
+ * does not support grouping
+ */
+ groupable?: DynamicTableColField;
+ /**
+ * The url of a custom html template that should be used to render a table header for this column
+ */
+ headerTemplateURL?: DynamicTableColField;
+ /**
+ * The text that should be used as a tooltip for this column in the table header
+ */
+ headerTitle?: DynamicTableColField;
+ /**
+ * Determines whether this column should be displayed in the table
+ */
+ show?: DynamicTableColField;
+ /**
+ * The name of the data row field that will be used to sort on, or false when this column
+ * does not support sorting
+ */
+ sortable?: DynamicTableColField;
+ /**
+ * The title of this column that should be displayed in the table header
+ */
+ title?: DynamicTableColField;
+ /**
+ * An alternate column title. Typically this can be used for responsive table layouts
+ * where the titleAlt should be used for small screen sizes
+ */
+ titleAlt?: DynamicTableColField;
+ }
+ }
+}
+