blob: 2c0b272024a5a4cdbeb04c19032e54fbea9c1491 [file] [log] [blame]
Matteo Scandolo9f87f302016-12-13 18:11:10 -08001// TODO fininsh to import all methods from https://github.com/opencord/ng-xos-lib/blob/master/src/ui_components/dumbComponents/table/table.component.js
2// TODO import tests
3
Matteo Scandolo035c5932016-12-14 09:55:15 -08004import './table.scss';
Matteo Scandolo9f87f302016-12-13 18:11:10 -08005import * as _ from 'lodash';
6
Matteo Scandolod58d5042016-12-16 16:59:21 -08007enum EXosTableColType {
8 'boolean',
9 'array',
10 'object',
11 'custom',
12 'date' ,
13 'icon'
14}
15
16export interface IXosTableColumn {
17 label: string;
18 prop: string;
19 type?: string; // understand why enum does not work
20 formatter?(item: any): string;
21 link?(item: any): string;
Matteo Scandolo8b2370c2017-02-02 17:19:07 -080022 hover?(item: any): string;
Matteo Scandolod58d5042016-12-16 16:59:21 -080023}
24
Matteo Scandolo9f87f302016-12-13 18:11:10 -080025interface IXosTableCgfOrder {
Matteo Scandolod62ea792016-12-22 14:02:28 -080026 reverse?: boolean;
Matteo Scandolo9f87f302016-12-13 18:11:10 -080027 field: string;
28}
29
30export interface IXosTableCfg {
31 columns: any[];
Matteo Scandolo8b2370c2017-02-02 17:19:07 -080032 pagination?: {
33 pageSize: number;
34 };
Matteo Scandolod62ea792016-12-22 14:02:28 -080035 order?: IXosTableCgfOrder;
36 filter?: string;
37 actions?: any[]; // TODO create interface
Matteo Scandolo9f87f302016-12-13 18:11:10 -080038}
39
40class TableCtrl {
41 $inject = ['$onInit'];
42
43 public columns: any[];
44 public orderBy: string;
45 public reverse: boolean;
Matteo Scandolo266907e2016-12-20 13:41:42 -080046 public classes: string;
Matteo Scandolo9f87f302016-12-13 18:11:10 -080047 private config: IXosTableCfg;
Matteo Scandolo8b2370c2017-02-02 17:19:07 -080048 private currentPage: number;
Matteo Scandolo9f87f302016-12-13 18:11:10 -080049
50
51 $onInit() {
Matteo Scandolo266907e2016-12-20 13:41:42 -080052
53 this.classes = 'table table-striped'; // table-bordered
54
Matteo Scandolo9f87f302016-12-13 18:11:10 -080055 if (!this.config) {
56 throw new Error('[xosTable] Please provide a configuration via the "config" attribute');
57 }
58
59 if (!this.config.columns) {
60 throw new Error('[xosTable] Please provide a columns list in the configuration');
61 }
62
63 // handle default ordering
Matteo Scandolo035c5932016-12-14 09:55:15 -080064 if (this.config.order && angular.isObject(this.config.order)) {
Matteo Scandolo9f87f302016-12-13 18:11:10 -080065 this.reverse = this.config.order.reverse || false;
66 this.orderBy = this.config.order.field || 'id';
67 }
68
69 // if columns with type 'custom' are provided
Matteo Scandolo035c5932016-12-14 09:55:15 -080070 // check that a custom formatter is provided too
Matteo Scandolo9f87f302016-12-13 18:11:10 -080071 let customCols = _.filter(this.config.columns, {type: 'custom'});
72 if (angular.isArray(customCols) && customCols.length > 0) {
73 _.forEach(customCols, (col) => {
74 if (!col.formatter || !angular.isFunction(col.formatter)) {
75 throw new Error('[xosTable] You have provided a custom field type, a formatter function should provided too.');
76 }
77 });
78 }
79
80 // if columns with type 'icon' are provided
Matteo Scandolo035c5932016-12-14 09:55:15 -080081 // check that a custom formatter is provided too
Matteo Scandolo9f87f302016-12-13 18:11:10 -080082 let iconCols = _.filter(this.config.columns, {type: 'icon'});
83 if (angular.isArray(iconCols) && iconCols.length > 0) {
84 _.forEach(iconCols, (col) => {
85 if (!col.formatter || !angular.isFunction(col.formatter)) {
86 throw new Error('[xosTable] You have provided an icon field type, a formatter function should provided too.');
87 }
88 });
89 }
90
91 // if a link property is passed,
92 // it should be a function
93 let linkedColumns = _.filter(this.config.columns, col => angular.isDefined(col.link));
94 if (angular.isArray(linkedColumns) && linkedColumns.length > 0) {
95 _.forEach(linkedColumns, (col) => {
96 if (!angular.isFunction(col.link)) {
97 throw new Error('[xosTable] The link property should be a function.');
98 }
99 });
100 }
101
Matteo Scandolo8b2370c2017-02-02 17:19:07 -0800102 // if an hover property is passed,
103 // it should be a function
104 let hoverColumns = _.filter(this.config.columns, col => angular.isDefined(col.hover));
105 if (angular.isArray(hoverColumns) && hoverColumns.length > 0) {
106 _.forEach(hoverColumns, (col) => {
107 if (!angular.isFunction(col.hover)) {
108 throw new Error('[xosTable] The hover property should be a function.');
109 }
110 });
111 }
112
113 if (this.config.pagination) {
114 this.currentPage = 0;
115 }
116
Matteo Scandolo9f87f302016-12-13 18:11:10 -0800117 this.columns = this.config.columns;
118
119 }
Matteo Scandolo8b2370c2017-02-02 17:19:07 -0800120
121 public goToPage = (n) => {
122 this.currentPage = n;
123 };
Matteo Scandolo9f87f302016-12-13 18:11:10 -0800124}
125
126export const xosTable: angular.IComponentOptions = {
127 template: require('./table.html'),
128 controllerAs: 'vm',
129 controller: TableCtrl,
130 bindings: {
131 data: '=',
132 config: '='
133 }
134};