PageSourceSearch

https://p-on.ru/js/view/lenta/widget-generic.js?1789650322

js p-on.ru collected 2026-09-24 10:57:18 UTC 6,842 bytes, 242 lines download raw bytes

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.