c378d3b65085c0d2cff4e53733f2a7683d533d47
[portal/sdk.git] /
1 /*
2  * Copyright (c) 2014 DataTorrent, Inc. ALL Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 'use strict';
18
19 angular.module('ui.dashboard')
20   .factory('WidgetModel', function ($log) {
21
22     function defaults() {
23       return {
24         title: 'Widget',
25         style: {},
26         size: {},
27         enableVerticalResize: true,
28         containerStyle: { width: '33%' }, // default width
29         contentStyle: {}
30       };
31     };
32
33     // constructor for widget model instances
34     function WidgetModel(widgetDefinition, overrides) {
35   
36       // Extend this with the widget definition object with overrides merged in (deep extended).
37       angular.extend(this, defaults(), _.merge(angular.copy(widgetDefinition), overrides));
38
39       this.updateContainerStyle(this.style);
40
41       if (!this.templateUrl && !this.template && !this.directive) {
42         this.directive = widgetDefinition.name;
43       }
44
45       if (this.size && _.has(this.size, 'height')) {
46         this.setHeight(this.size.height);
47       }
48
49       if (this.style && _.has(this.style, 'width')) { //TODO deprecate style attribute
50         this.setWidth(this.style.width);
51       }
52
53       if (this.size && _.has(this.size, 'width')) {
54         this.setWidth(this.size.width);
55       }
56     }
57
58     WidgetModel.prototype = {
59       // sets the width (and widthUnits)
60       setWidth: function (width, units) {
61         width = width.toString();
62         units = units || width.replace(/^[-\.\d]+/, '') || '%';
63
64         this.widthUnits = units;
65         width = parseFloat(width);
66
67         // check with min width if set, unit refer to width's unit
68         if (this.size && _.has(this.size, 'minWidth')) {
69           width = _.max([parseFloat(this.size.minWidth), width]);
70         }
71
72         if (width < 0 || isNaN(width)) {
73           $log.warn('malhar-angular-dashboard: setWidth was called when width was ' + width);
74           return false;
75         }
76
77         if (units === '%') {
78           width = Math.min(100, width);
79           width = Math.max(0, width);
80         }
81
82         this.containerStyle.width = width + '' + units;
83
84         this.updateSize(this.containerStyle);
85
86         return true;
87       },
88
89       setHeight: function (height) {
90         this.contentStyle.height = height;
91         this.updateSize(this.contentStyle);
92       },
93
94       setStyle: function (style) {
95         this.style = style;
96         this.updateContainerStyle(style);
97       },
98
99       updateSize: function (size) {
100         angular.extend(this.size, size);
101       },
102
103       updateContainerStyle: function (style) {
104         angular.extend(this.containerStyle, style);
105       },
106       serialize: function() {
107         return _.pick(this, ['title', 'name', 'report_id', 'hideGrid', 'showChart' ,'rcloud_url','reportData','style', 'size', 'dataModelOptions', 'attrs', 'storageHash']);
108       }
109     };
110
111     return WidgetModel;
112   });