1var Dashboards = Dashboards || {models:{},views:{},collections:{}}; 2Dashboards.models.DashboardModel = Backbone.Model.extend({ 3 4 url: '/dashboards', 5 6 defaults:{ 7 title: '', 8 description: '', 9 category_id: '', 10 notes: '', 11 featured_dashboard: false, 12 show_related: false, 13 htmlCount: 0, 14 resourceListCount: 0, 15 individualResourceCount: 0, 16 mobile: false 17 }, 18 19 initialize: function(options){ 20 21 this.retryConfig = options.retryConfig; 22 this.widgets = new Dashboards.collections.WidgetCollection(); 23 24 _.forEach(options.widgets,function(data){ 25 if(data.resource_type == "html"){ 26 this.addHTMLBlock(data); 27 } else if (data.resource_type == "RESOURCE_LIST"){ 28 this.addResourceList(data); 29 } else if (data.resource_type == "INDIVIDUAL_RESOURCE"){ 30 this.addIndividualResource(data); 31 } else { 32 this.widgets.add(new Dashboards.models.WidgetModel(_.extend(data, {retryConfig: _.clone(this.retryConfig)}))); 33 } 34 }.bind(this)); 35 36 this.tags = new Dashboards.collections.TagsCollection(); 37 38 _.forEach(options.tags,function(data){ 39 var model = new this.tags.model({ 40 tag__name: data.name 41 }); 42 if(model.isValid(true)){ 43 this.tags.add(model.toJSON()); 44 } 45 }.bind(this)); 46 47 }, 48 49 addHTMLBlock: function(data){ 50 data.resource_id = this.getHTMLCount(); 51 data.resource_type = 'html'; 52 var resource = new Dashboards.models.ResourceModel(data); 53 this.addResource(resource); 54 }, 55 56 getHTMLCount: function(){ 57 var resp = this.get('htmlCount'); 58 this.set('htmlCount',resp+1); 59 return resp; 60 }, 61 62 addResourceList: function(data){ 63 data.resource_id = this.getResourceListCount(); 64 data.resource_type = 'RESOURCES_LIST'; 65 var resource = new Dashboards.models.ResourceModel(data); 66 this.addResource(resource); 67 }, 68 69 getResourceListCount: function(){ 70 var resp = this.get('resourceListCount'); 71 this.set('resourceListCount',resp+1); 72 return resp; 73 }, 74 75 addIndividualResource: function(data){ 76 data.resource_id = this.getIndividualResourceCount(); 77 data.resource_type = 'INDIVIDUAL_RESOURCE'; 78 var resource = new Dashboards.models.ResourceModel(data); 79 this.addResource(resource); 80 }, 81 82 getIndividualResourceCount: function(){ 83 var resp = this.get('individualResourceCount'); 84 this.set('individualResourceCount',resp+1); 85 return resp; 86 }, 87 88 addResource: function(resource){ 89 this.addWidget(resource); 90 }, 91 92 removeResource: function(resource){ 93 this.removeWidget(resource); 94 }, 95 96 updateWidgetsData: function(newData){ 97 var that = this; 98 _.forEach(newData,function(data){ 99 var item = that.widgets.get(data.id); 100 if(item){ 101 item.set('x', data.x ), 102 item.set('y', data.y ), 103 item.set('w', data.w ), 104 item.set('h', data.h ) 105 } 106 }); 107 }, 108 109 addWidget: function(data){ 110 var id = 'id-widget-'+data.createID(); 111 var item = this.widgets.get(id); 112 if(!item){ 113 this.widgets.add(new Dashboards.models.WidgetModel( 114 _.extend(data.toJSON(), {retryConfig: _.clone(this.retryConfig)}) 115 )); 116 } 117 }, 118 119 removeWidget: function(data){ 120 this.removeWidgetById('id-widget-'+data.createID()); 121 }, 122 123 removeWidgetById: function(id){ 124 var item = this.widgets.get(id); 125 if(item){ 126 this.widgets.remove(item); 127 } 128 }, 129 130 save: function (attrs, options) { 131 var data = this.getSettings(); 132 133 return $.ajax({ 134 type:'POST', 135 data: data, 136 dataType: 'json' 137 }).then(function (response) { 138 if(response.status=='ok'){ 139 // console.log(response); 140 return response; 141 } else { 142 // console.error(response); 143 } 144 }); 145 }, 146 147 getSettings: function(){ 148 var widgetsObjs = {}; 149 150 this.widgets.sort(); 151 152 this.widgets.each(function(e,i){ 153 var params = []; 154 _.forEach(e.resource.get('parameters'),function(p){ 155 params.push('pArgument'+p.position+'='+p.value); 156 }); 157 158 widgetsObjs['widgets-'+i+'-x'] = e.get('x'); 159 widgetsObjs['widgets-'+i+'-y'] = e.get('y'); 160 widgetsObjs['widgets-'+i+'-w'] = e.get('w'); 161 widgetsObjs['widgets-'+i+'-h'] = e.get('h'); 162 widgetsObjs['widgets-'+i+'-resource_type'] = e.resource.get('resource_type'); 163 if(e.resource.get('resource_type')!='html'){ 164 widgetsObjs['widgets-'+i+'-resource_id'] = e.resource.get('resource_id'); 165 } 166 widgetsObjs['widgets-'+i+'-html'] = e.resource.get('html'); 167 widgetsObjs['widgets-'+i+'-order'] = i; 168 widgetsObjs['widgets-'+i+'-parameters'] = params.join('&'); 169 170 if(e.resource.get('resource_type') == 'RESOURCES_LIST'){ 171 widgetsObjs['widgets-'+i+'-list_name'] = e.resource.get('list_name'); 172 widgetsObjs['widgets-'+i+'-list_name_color'] = e.resource.get('list_name_color'); 173 widgetsObjs['widgets-'+i+'-links_color'] = e.resource.get('links_color'); 174 widgetsObjs['widgets-'+i+'-title_blocks-TOTAL_FORMS'] = e.resource.get("title_blocks").length; 175 widgetsObjs['widgets-'+i+'-title_blocks-INITIAL_FORMS'] = 0; 176 widgetsObjs['widgets-'+i+'-title_blocks-MAX_NUM_FORMS'] = ''; 177 _.forEach(e.resource.get("title_blocks").models, function(tb,j){ 178 widgetsObjs['widgets-'+i+'-title_blocks-'+j+'-order'] = j; 179 widgetsObjs['widgets-'+i+'-title_blocks-'+j+'-htmlContent'] = tb.get("htmlContent"); 180 widgetsObjs['widgets-'+i+'-title_blocks-'+j+'-backgroundColor'] = tb.get("backgroundColor"); 181 widgetsObjs['widgets-'+i+'-title_blocks-'+j+'-borderColor'] = tb.get("borderColor"); 182 widgetsObjs['widgets-'+i+'-title_blocks-'+j+'-borderWidth'] = tb.get("borderWidth"); 183 }); 184 widgetsObjs['widgets-'+i+'-resources_list-TOTAL_FORMS'] = e.resource.get("resources_list").length; 185 widgetsObjs['widgets-'+i+'-resources_list-INITIAL_FORMS'] = 0; 186 widgetsObjs['widgets-'+i+'-resources_list-MAX_NUM_FORMS'] = ''; 187 _.forEach(e.resource.get("resources_list").models, function(rlr,j){ 188 widgetsObjs['widgets-'+i+'-resources_list-'+j+'-order'] = j; 189 widgetsObjs['widgets-'+i+'-resources_list-'+j+'-resource_id'] = rlr.get("resource_id"); 190 widgetsObjs['widgets-'+i+'-resources_list-'+j+'-resource_name'] = rlr.get("resource_name"); 191 widgetsObjs['widgets-'+i+'-resources_list-'+j+'-direct_download'] = rlr.get("direct_download"); 192 widgetsObjs['widgets-'+i+'-resources_list-'+j+'-hide_icon']
192= rlr.get("hide_icon"); 193 }); 194 } else if (e.resource.get('resource_type') == 'INDIVIDUAL_RESOURCE'){ 195 widgetsObjs['widgets-'+i+'-gradient_begin_color'] = e.resource.get('gradient_begin_color'); 196 widgetsObjs['widgets-'+i+'-gradient_end_color'] = e.resource.get('gradient_end_color'); 197 widgetsObjs['widgets-'+i+'-gradient_type'] = e.resource.get('gradient_type'); 198 widgetsObjs['widgets-'+i+'-resource_id'] = e.resource.get('selected_resource').get("resource_id"); 199 widgetsObjs['widgets-'+i+'-resource_name'] = e.resource.get('selected_resource').get("resource_name"); 200 widgetsObjs['widgets-'+i+'-text_color'] = e.resource.get('selected_resource').get("text_color"); 201 widgetsObjs['widgets-'+i+'-text_size'] = e.resource.get('selected_resource').get("text_size"); 202 widgetsObjs['widgets-'+i+'-direct_download'] = e.resource.get('selected_resource').get("direct_download"); 203 } 204 }); 205 206 var tagsObj = {}; 207 this.tags.each(function(e,i){ 208 tagsObj['tags-'+i+'-name'] = e.get('tag__name'); 209 }); 210 211 var extraParams = _.extend(widgetsObjs,tagsObj); 212 213 return _.extend( 214 { 215 title: this.get('title'), 216 description: this.get('description'), 217 category: this.get('category_id'), 218 notes: this.get('notes'), 219 show_related: this.get('show_related'), 220 featured_dashboard: this.get('featured_dashboard'), 221 'widgets-TOTAL_FORMS': this.widgets.length, 222 'widgets-INITIAL_FORMS': 0, 223 'widgets-MAX_NUM_FORMS': '', 224 'tags-TOTAL_FORMS': this.tags.length, 225 'tags-INITIAL_FORMS': 0, 226 'tags-MAX_NUM_FORMS': '' 227 }, 228 extraParams 229 ); 230 }, 231 232 validateMetadata: function(){ 233 var validTitle = !_.isEmpty(this.get('title')), 234 validDescription = !_.isEmpty(this.get('description')), 235 validCategory = !_.isEmpty(""+this.get('category_id')); 236 237 return { 238 valid: ( validTitle && validDescription && validCategory ), 239 fields:{ 240 'title': !validTitle, 241 'description': !validDescription, 242 'category': !validCategory 243 } 244 }; 245 }, 246 247 remove: function (options) { 248 var opts = _.extend({url: '/dashboards/remove/' + this.id}, options || {}); 249 250 return Backbone.Model.prototype.destroy.call(this, opts); 251 }, 252 253 remove_revision: function (options) { 254 var opts = _.extend({url: '/dashboards/remove/revision/' + this.id}, options || {}); 255 256 return Backbone.Model.prototype.destroy.call(this, opts); 257 } 258 259});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.