1/** 2 * Created by Maksim on 22.08.14. 3 */ 4 5Lenta.Generic = Backbone.View.extend({ 6 7 ModelMap: { 8 1: [Lenta.Event], 9 2: [Lenta.ServiceEvent], 10 3: [Lenta.StartTrack, Lenta.EndTrack], 11 4: [Lenta.SimpleTrack] 12 }, 13 14 initialize: function(opts){ 15 this.mainView = opts.mainView; 16 this.scrollY = 0; 17 this.day_items = {}; 18 this.days_open = []; 19 this.is_single = false; 20 app.updatesMan.on('add-items', this.onAddItems, this); 21 }, 22 23 render: function (){ 24 return this.$el; 25 }, 26 27 remove: function(){ 28 app.updatesMan.off('add-items', this.onAddItems); 29 this.removeDays(); 30 this.removeMarker(); 31 this.removeShape(); 32 Backbone.View.prototype.remove.apply(this); 33 this.widget.$el.removeClass('mode-'+this.className); 34 }, 35 36 onAdded: function(){ 37 this.rebuild(); 38 this.widget.$el.addClass('mode-'+this.className); 39 }, 40 41 removeShape: function (){ 42 var map = app.main.getPanel('map'); 43 if(map) 44 map.hideShape(); 45 }, 46 47 removeMarker: function (){ 48 var map = app.main.getPanel('map'); 49 if (!map) { 50 return; 51 } 52 if (app.marker) { 53 app.marker.circle && map.removeLayer(app.marker.circle); 54 map.removeLayer(app.marker); 55 delete app.marker; 56 } 57 if (app.markerOpt) { 58 map.removeLayer(app.markerOpt); 59 delete app.markerOpt; 60 } 61 }, 62 63 isAllowItem: function (model){ 64 return true; 65 }, 66 67 filterByDateRange: function (models){ 68 return _.filter(models, function (m){return m.isPlaced(app.updatesMan.filter_from, app.updatesMan.filter_to)}); 69 }, 70 71 filterSliders: function (models){ 72 return models; 73 }, 74 75 onScroll: function (y){ 76 this.scrollY = y; 77 this.updateView(); 78 }, 79 80 updateView: function (){ 81 var paneY = this.scrollY; 82 var paneEl = this.widget.$('.scroll-pane'); 83 var paneH = paneEl.height(); 84 for(var i in this.day_items){ 85 var d = this.day_items[i]; 86 var h = d.$el.height(); 87 var y = d.$el.position().top; 88 89 var visible = paneY-y<h && y-paneY<paneH; 90 if (d.visible !== visible) { 91 d.setVisible(visible); 92 } 93 94 if(y < paneY) 95 d.header.css('top', '' + (paneY - y) + 'px'); 96 else 97 d.header.css('top', '0px'); 98 99 d.updateView(); 100 } 101 }, 102 103 getAllItems: function (){ 104 return []; 105 }, 106 107 // ÐоÑледние Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ 108 onAddItems: function (models){ 109 110 }, 111 112 // ÐобовлÑем модели, Ñоздаем Ð²Ð¸Ð´Ñ 113 addModels: function (models){ 114 var views = []; 115 for(var i=0; i<models.length; ++i){ 116 var m = models[i]; 117 var cl = this.ModelMap[m.TYPE]; 118 for(var j=0; j<cl.length; ++j) 119 views.push(new cl[j]({model:m, widget:this})); 120 } 121 this.addViews(views); 122 }, 123 124 makeDay: function (time){ 125 var ds = _.keys(this.day_items); 126 var dv = new Lenta.Day({model:time, widget: this}); 127 for(var i=ds.length-1; i>=0; --i){ 128 if(time > this.day_items[ds[i]].model){ 129 var $el = dv.render(); 130 $el.insertBefore( this.day_items[ds[i]].$el ); 131 return dv; 132 } 133 } 134 this.$el.append(dv.render()); 135 return dv; 136 }, 137 138 // ÐобовлÑем Ð²Ð¸Ð´Ñ ÑобÑÑий в главнÑй вилд, ÑаÑкидÑваем Ð¸Ñ Ð¿Ð¾ днÑм 139 addViews: function(views){ 140 if(views.length === 0){ 141 this.showWarning(); 142 return; 143 } 144 this.hideWarning(); 145 146 var days = {}; 147 for(var i=0; i<views.length; ++i){ 148 var time = views[i].getDayTime(); 149 var ds = time.ts(); 150 if(ds === 0) continue; 151 if(ds in days === false) 152 days[ds] = []; 153 days[ds].push(views[i]); 154 if(ds in this.day_items === false) { 155 this.day_items[ds] = this.makeDay(time); 156 } 157 } 158 159 for(var ds in days) { 160 this.day_items[ds].addItems(days[ds]); 161 } 162 163 this.updateView(); 164 }, 165 166 showWarning: function (){ 167 this.$('#empty-item').remove(); 168 var warn = $('<div class="item" id="empty-item"><div class="title">'+app.loc('Ðа ÑекÑÑий пеÑиод ÑобÑÑий вÑбÑаннÑÑ Ñипов неÑ')+'</div></div>'); 169 this.$el.append(warn); 170 }, 171 hideWarning: function (){ 172 this.$('#empty-item').remove(); 173 }, 174 175 removeDays: function (){ 176 _.forEach(this.day_items, function (day){ 177 day.remove(); 178 }); 179 this.day_items = {}; 180 }, 181 182 rebuild: function(){ 183 this.widget.showLoading(); 184 clearTimeout(this._filter_toid); 185 this._filter_toid = setTimeout(_.bind(function (){ 186 this._rebuild(); 187 }, this), 40); 188 }, 189 190 beforeRebuild: function (){ 191 this.days_open = []; 192 var ds = _.keys(this.day_items); 193 ds.forEach(_.bind(function(di){ 194 if(this.day_items[di].$el.hasClass('open')) this.days_open.push(di) 195 },this)); 196 }, 197 afterRebuild: function (){ 198 var ds = _.keys(this.day_items);
199 this.days_open.forEach(_.bind(function(di){ 200 if (this.day_items[di]) { 201 this.day_items[di].onClick(); 202 if (this._select) { 203 const selItems = this.day_items[di].items 204 .find(event_view => event_view.model.attributes.id === this._select.model.attributes.id); 205 if (selItems.length) { 206 selItems.onClick(); 207 } 208 } 209 } 210 },this)); 211 212 if(ds.length === 1 && !this.day_items[ds[0]].$el.hasClass('open')) 213 this.day_items[ds[0]].onClick(); 214 215 $(".scroll-pane").scrollTop(this.scrollY); 216 this.onScroll(this.scrollY); 217 }, 218 219 _rebuild: function (){ 220 this.beforeRebuild(); 221 222 this.removeDays(); 223 224 var items = this.getAllItems(); 225 // filter by dates 226 items = this.filterByDateRange(items); 227 // filter by buttons 228 var btns = this.widget.getFilterButtons(); 229 items = _.filter(items, function (m){return Lenta.ModelFilter[m.TYPE](m, btns)}); 230 // filter by sliders 231 items = this.filterSliders(items); 232 233 this.addModels(items); 234 235 this.afterRebuild(); 236 237 clearTimeout(this._stopLoading_tid); 238 this._stopLoading_tid = setTimeout(_.bind(function (){ 239 this.widget.hideLoading(); 240 }, this), 40); 241 } 242});
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.