Free cookie consent management tool by TermsFeed Policy Generator

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

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

#1888:

  • DAL: Added a Delete method which deletes by experiment id.
  • HL DataTables will now be transposed and mapped as double[ROWS][COLUMNS] (transposed)
  • JS: Moved all classes into "modules" to prevent namespace pollution (using OAAS_MODEL for model classes, OAAS_VIEW for views and OAAS_CONTROLLER for controllers)
  • JS: Moved DatatypeMapper classes into Backbone views
  • JS: Models now correctly send DELETE requests
  • Added a new job overview page (which also renders run details) using AJAX
  • Using moment.min.js to format DateTime as string
  • Controllers now inherit from BaseController which provides a RedirectToLoginIfNecessary-method
  • Added loading animations to several AJAX bound places (loading experiments / scenarios)
  • Added a section to _Layout.cshtml which allows page-specific JavaScript includes (<script> only for a certain page)
  • Fixed Build/Edit of experiment menu redirecting to the wrong page
  • The Experiment Variation Dialog disables input fields, if the property has not been activated before
File size: 8.4 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.template = _.template($('#runTemplate').html());
86            this.$el.empty();
87            for (var i = 0; i < this.model.models.length; i++) {
88                var rev = new my.ResultEntryView({ model: this.model.models[i], el: this.$el });
89                rev.render();
90            }
91        }
92    });
93
94    my.AccordionView = Backbone.View.extend({
95        render: function () {
96            this.$el.accordion({
97                heightStyle: 'content',
98                collapsible: true,
99                active: false
100            });
101        },
102        refresh: function () {
103            this.$el.accordtion("refresh");
104        }
105    });
106
107    my.ResizableView = Backbone.View.extend({
108        events: {
109            'resizestop': 'resized'
110        },
111        render: function () {
112            this.$el.resizable();
113        },
114        resized: function (evt) {
115            this.trigger('resized', evt);
116        }
117    });
118
119    my.TabView = Backbone.View.extend({
120        // model structure: [{ name:
121        events: {
122            'tabsactivate': 'tabActivated'
123        },
124        render: function () {
125            this.$el.empty();
126            var header = $('<ul />').appendTo(this.$el);
127            for (var i = 0; i < this.model.length; i++) {
128                var li = $('<li/>').appendTo(header);
129                var id = 'tab_' + my.PlotView.nextId() + '_' + i;
130                $('<a />').attr('href', '#' + id).text(this.model[i].name).appendTo(li);
131
132                var targetDiv = $('<div/>').attr('id', id).appendTo(this.$el);
133                $(this.model[i].content).appendTo(targetDiv);
134            }
135            this.$el.tabs({
136                collapsible: true,
137                active: false
138            });
139        },
140        tabActivated: function (event, ui) {
141            var tabElement = $(ui.newPanel[0]);
142            this.trigger('tab-activated', { name: ui.newTab.text(), element: tabElement });
143        }
144    });
145
146    my.ResultEntryView = Backbone.View.extend({
147        initialize: function () {
148            this.plotted = {};
149        },
150        render: function () {
151            this.template = _.template($('#runTemplate').html());
152            var table = $(this.template(this.model.attributes));
153            var body = $("tbody", table);
154            table.appendTo(this.$el);
155            var results = this.model.get('results');
156            for (var i = 0; i < results.length; i++) {
157                var row = $('<tr/>').attr('data-index', i);
158                $('<td/>').text(results[i].Name).appendTo(row);
159                //TODO: Switch Value type and create different items here
160                if ($.isArray(results[i].Value)) {
161                    var col = $('<td/>').appendTo(row);
162                    var tevDiv = $('<div/>');
163                    // TODO: REMOVE TABLEEDITVIEW and create it only on demand!!!
164                    // var tev = new my.TableEditView({ model: results[i].Value, el: tevDiv, useDatatable: true });
165                    // tev.render();
166                    var plotDiv = $('<div/>').appendTo($('#tmp'));
167                    //var pv = new PlotView({model: results[i], el: plotDiv});
168                    //pv.render();
169                    this.plotted[i] = {};
170                    var tv = new my.TabView({
171                        model: [
172                          { name: 'Table', content: tevDiv },
173                          { name: 'Plot', content: plotDiv },
174                        ],
175                        el: col
176                    });
177                    this.listenTo(tv, 'tab-activated', this.tabActivated);
178                    tv.render();
179
180                }
181                else {
182                    $('<td/>').text(results[i].Value).appendTo(row);
183                }
184                row.appendTo(body);
185            }
186        },
187        tabActivated: function (evt) {
188            var index = parseInt(evt.element.parents('tr').attr('data-index'));
189            if (evt.name == 'Plot' && !this.plotted[index].Plot) {
190                this.plotted[index].Plot = true;
191                var plotDiv = $('<div/>').appendTo($('#tmp'));
192                var pv = new my.PlotView({ model: this.model.get('results')[index], el: plotDiv });
193                pv.render();
194                plotDiv.appendTo(evt.element);
195                var rv = new my.ResizableView({ el: evt.element });
196
197                this.listenTo(rv, 'resized', function (evt) {
198                    plotDiv.height($(evt.target).height() * 0.96);
199                    plotDiv.width($(evt.target).width() * 0.96);
200                    pv.refresh();
201                });
202                rv.render();
203            } else if (evt.name == 'Table' && !this.plotted[index].Table) {
204                this.plotted[index].Table = true;
205                var tevDiv = $('<div/>');
206                var tev = new my.TableEditView({ model: this.model.get('results')[index].Value, rowNames: this.model.get('results')[index].RowNames, useDatatable: true, el: tevDiv });
207                tev.render();
208                tevDiv.appendTo(evt.element)
209            }
210        }
211    });
212    return my;
213} (OAAS_VIEW || {}, Backbone, _, $));
Note: See TracBrowser for help on using the repository browser.