Free cookie consent management tool by TermsFeed Policy Generator

source: branches/OaaS/HeuristicLab.Services.Optimization.Web/Content/job.view.js @ 9335

Last change on this file since 9335 was 9335, checked in by fschoepp, 11 years ago

#1888:

  • The Edit-Experiment-Page now correctly displays the experiments again.
  • Disabled key navigation for all wizards.
  • Added a RunCollectionView to render different Plots for the run results of a job.
  • Added a Boxplot-Chart and a Bubble-Chart for rendering the results.
  • Added underscoreAddon.js which provides methods to calculate mean/sum of an JavaScript array/list.
File size: 8.1 KB
Line 
1var OAAS_VIEW = (function (my, Backbone, _, $) {
2    // ================= VIEWS ===================
3    my.LoadingView = Backbone.View.extend({
4        render: function () {
5            this.$el.empty();
6            this.template = _.template($('#loadingTemplate').html());
7            $(this.template({ text: this.model })).appendTo(this.$el);
8        }
9    });
10
11    my.JobOverView = Backbone.View.extend({
12        events: {
13            'click tr': 'rowClicked',
14            'click button[data-name="DeleteButton"]': 'deleteClicked'
15        },
16        initialize: function () {
17            this.collection.bind('remove', this.render, this);
18            //this.collection.bind('a', this.render, this);
19        },
20        render: function () {
21            var prevSettings = null;
22            if (this.table) {
23                prevSettings = this.table.fnSettings();
24            }
25            this.$el.empty();
26            // create header
27            var table = $('<table />');
28            this.template = _.template($('#jobHeaderTemplate').html());
29            $(this.template({})).appendTo(table);
30
31            // create content
32            var tbody = $('<tbody />');
33            this.collection.each(function (model) {
34                var row = new my.JobOverViewRow({ model: model });
35                row.render();
36                row.$el.appendTo(tbody);
37            });
38            tbody.appendTo(table);
39            table.appendTo(this.$el);
40            if (prevSettings != null) {
41                this.table = table.dataTable({
42                    'aaSorting': prevSettings.aaSorting,
43                    'iDisplayLength' : prevSettings._iDisplayLength,
44                    'iDisplayStart' : prevSettings._iDisplayStart,
45                });
46                this.table.fnFilter(prevSettings.oPreviousSearch.sSearch);
47            } else {
48                this.table = table.dataTable();
49            }
50            this.highlightSelectedJob();
51        },
52        highlightSelectedJob: function () {
53            $('tr', this.table).removeClass('selectedRow');
54            if (this.selectedJob) {
55                $('tr[data-jobId="' + this.selectedJob + '"]', this.table).addClass('selectedRow');
56            }
57        },
58        rowClicked: function (row) {
59            var jobId = $(row.target).parent("tr").attr("data-jobId");
60            if (jobId) {
61                this.selectedJob = jobId;
62                this.highlightSelectedJob();
63                this.trigger('jobSelected', jobId);
64            }
65        },
66        deleteClicked: function (evt) {
67            var target = $(evt.target);
68            var id = target.attr('data-id');
69            var jobs = this.collection.where({ Id: id });
70            if (jobs.length == 1) {
71                jobs[0].destroy(); // triggers a remove event on this.collection -> DELETE /Job/1 will be called
72            }
73        }
74    });
75
76    my.JobOverViewRow = Backbone.View.extend({
77        render: function () {
78            this.template = _.template($('#jobRowTemplate').html());
79            this.setElement($(this.template(this.model.attributes)));
80        }
81    });
82
83    my.ResultView = Backbone.View.extend({
84        render: function () {
85            this.$el.empty();
86            var div = $('<h3/>').text('Compare with charts').appendTo(this.$el);
87            var div = $('<div/>').appendTo(this.$el);
88            var rcv = new my.RunCollectionView({model: this.model, el: div});
89            rcv.render();
90            for (var i = 0; i < this.model.models.length; i++) {
91                var rev = new my.ResultEntryView({ model: this.model.models[i], el: this.$el });
92                rev.render();
93            }
94        }
95    });
96
97    my.AccordionView = Backbone.View.extend({
98        render: function () {
99            this.$el.accordion({
100                heightStyle: 'content',
101                collapsible: true,
102                active: false
103            });
104        },
105        refresh: function () {
106            this.$el.accordtion("refresh");
107        }
108    });
109
110    my.ResizableView = Backbone.View.extend({
111        events: {
112            'resizestop': 'resized'
113        },
114        render: function () {
115            this.$el.resizable();
116        },
117        resized: function (evt) {
118            this.trigger('resized', evt);
119        }
120    });
121
122    my.TabView = Backbone.View.extend({
123        // model structure: [{ name:
124        events: {
125            'tabsactivate': 'tabActivated'
126        },
127        render: function () {
128            this.$el.empty();
129            var header = $('<ul />').appendTo(this.$el);
130            for (var i = 0; i < this.model.length; i++) {
131                var li = $('<li/>').appendTo(header);
132                var id = 'tab_' + my.PlotView.nextId() + '_' + i;
133                $('<a />').attr('href', '#' + id).text(this.model[i].name).appendTo(li);
134
135                var targetDiv = $('<div/>').attr('id', id).appendTo(this.$el);
136                $(this.model[i].content).appendTo(targetDiv);
137            }
138            this.$el.tabs({
139                collapsible: true,
140                active: false
141            });
142        },
143        tabActivated: function (event, ui) {
144            var tabElement = $(ui.newPanel[0]);
145            this.trigger('tab-activated', { name: ui.newTab.text(), element: tabElement });
146        }
147    });
148
149    my.ResultEntryView = Backbone.View.extend({
150        initialize: function () {
151            this.plotted = {};
152        },
153        render: function () {
154            this.template = _.template($('#runTemplate').html());
155            var table = $(this.template(this.model.attributes));
156            var body = $("tbody", table);
157            table.appendTo(this.$el);
158            var results = this.model.get('results');
159            for (var i = 0; i < results.length; i++) {
160                var row = $('<tr/>').attr('data-index', i);
161                $('<td/>').text(results[i].Name).appendTo(row);
162                if ($.isArray(results[i].Value)) {
163                    var col = $('<td/>').appendTo(row);
164                    var tevDiv = $('<div/>');
165                    var plotDiv = $('<div/>').appendTo($('#tmp'));;
166                    this.plotted[i] = {};
167                    var tv = new my.TabView({
168                        model: [
169                          { name: 'Table', content: tevDiv },
170                          { name: 'Plot', content: plotDiv },
171                        ],
172                        el: col
173                    });
174                    this.listenTo(tv, 'tab-activated', this.tabActivated);
175                    tv.render();
176
177                }
178                else {
179                    $('<td/>').text(results[i].Value).appendTo(row);
180                }
181                row.appendTo(body);
182            }
183        },
184        tabActivated: function (evt) {
185            var index = parseInt(evt.element.parents('tr').attr('data-index'));
186            if (evt.name == 'Plot' && !this.plotted[index].Plot) {
187                this.plotted[index].Plot = true;
188                var plotDiv = $('<div/>').appendTo($('#tmp'));
189                var pv = new my.PlotView({ model: this.model.get('results')[index], el: plotDiv, transpose: true });
190                pv.render();
191                plotDiv.appendTo(evt.element);
192                var rv = new my.ResizableView({ el: evt.element });
193
194                this.listenTo(rv, 'resized', function (evt) {
195                    plotDiv.height($(evt.target).height() * 0.96);
196                    plotDiv.width($(evt.target).width() * 0.96);
197                    pv.refresh();
198                });
199                rv.render();
200            } else if (evt.name == 'Table' && !this.plotted[index].Table) {
201                this.plotted[index].Table = true;
202                var tevDiv = $('<div/>');
203                var tev = new my.TableEditView({ model: this.model.get('results')[index].Value, rowNames: this.model.get('results')[index].RowNames, useDatatable: true, el: tevDiv });
204                tev.render();
205                tevDiv.appendTo(evt.element)
206            }
207        }
208    });
209    return my;
210} (OAAS_VIEW || {}, Backbone, _, $));
Note: See TracBrowser for help on using the repository browser.