blob: 32043a777f1b1de6caca270379db021886d70d76 [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Foundation
* 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.
*/
// TODO fininsh to import all methods from https://github.com/opencord/ng-xos-lib/blob/master/src/ui_components/dumbComponents/table/table.component.js
// TODO import tests
import './table.scss';
import * as _ from 'lodash';
enum EXosTableColType {
'boolean',
'array',
'object',
'custom',
'date' ,
'icon'
}
export interface IXosTableColumn {
label: string;
prop: string;
type?: string; // understand why enum does not work
formatter?(item: any): string;
link?(item: any): string;
hover?(item: any): string;
}
interface IXosTableCgfOrder {
reverse?: boolean;
field: string;
}
export interface IXosTableCfg {
columns: any[];
pagination?: {
pageSize: number;
};
order?: IXosTableCgfOrder;
filter?: string;
selectedRow?: number;
filteredData?: any[];
actions?: any[]; // TODO create interface
}
class TableCtrl {
$inject = ['$onInit', '$scope'];
public columns: any[];
public orderBy: string;
public reverse: boolean;
public classes: string;
public data: any;
private config: IXosTableCfg;
private currentPage: number;
private loader: boolean = true;
constructor(
private $scope: ng.IScope
) {
}
$onInit() {
this.$scope.$watch(() => this.data, data => {
if (angular.isDefined(data)) {
this.loader = false;
}
});
this.classes = 'table table-striped'; // table-bordered
if (!this.config) {
throw new Error('[xosTable] Please provide a configuration via the "config" attribute');
}
if (!this.config.columns) {
throw new Error('[xosTable] Please provide a columns list in the configuration');
}
// handle default ordering
if (this.config.order && angular.isObject(this.config.order)) {
this.reverse = this.config.order.reverse || false;
this.orderBy = this.config.order.field || 'id';
}
// if columns with type 'custom' are provided
// check that a custom formatter is provided too
let customCols = _.filter(this.config.columns, {type: 'custom'});
if (angular.isArray(customCols) && customCols.length > 0) {
_.forEach(customCols, (col) => {
if (!col.formatter || !angular.isFunction(col.formatter)) {
throw new Error('[xosTable] You have provided a custom field type, a formatter function should provided too.');
}
});
}
// if columns with type 'icon' are provided
// check that a custom formatter is provided too
let iconCols = _.filter(this.config.columns, {type: 'icon'});
if (angular.isArray(iconCols) && iconCols.length > 0) {
_.forEach(iconCols, (col) => {
if (!col.formatter || !angular.isFunction(col.formatter)) {
throw new Error('[xosTable] You have provided an icon field type, a formatter function should provided too.');
}
});
}
// if a link property is passed,
// it should be a function
let linkedColumns = _.filter(this.config.columns, col => angular.isDefined(col.link));
if (angular.isArray(linkedColumns) && linkedColumns.length > 0) {
_.forEach(linkedColumns, (col) => {
if (!angular.isFunction(col.link)) {
throw new Error('[xosTable] The link property should be a function.');
}
});
}
// if an hover property is passed,
// it should be a function
let hoverColumns = _.filter(this.config.columns, col => angular.isDefined(col.hover));
if (angular.isArray(hoverColumns) && hoverColumns.length > 0) {
_.forEach(hoverColumns, (col) => {
if (!angular.isFunction(col.hover)) {
throw new Error('[xosTable] The hover property should be a function.');
}
});
}
if (this.config.pagination) {
this.currentPage = 0;
}
}
public goToPage = (n) => {
this.currentPage = n;
};
}
export const xosTable: angular.IComponentOptions = {
template: require('./table.html'),
controllerAs: 'vm',
controller: TableCtrl,
bindings: {
data: '<',
config: '='
}
};