General code review

This commit is contained in:
Andrea
2017-03-03 10:30:51 +01:00
parent 757e543fe4
commit a652e08020
12 changed files with 647 additions and 546 deletions

View File

@@ -32,7 +32,7 @@
}
.oe_form_field_bi_editor .body {
padding-bottom: 0px;
padding-bottom: 0;
}
.oe_form_field_bi_editor .body .left {
@@ -50,15 +50,15 @@
.oe_form_field_bi_editor .body .left .search-bar input {
width: 100%;
border-radius: 0px;
border-left: 0px;
border-right: 0px;
border-top: 0px;
border-radius: 0;
border-left: 0;
border-right: 0;
border-top: 0;
padding-left: 18px;
padding-top: 4px;
position: absolute;
left: 0px;
top: 0px;
left: 0;
top: 0;
z-index: 1;
}
@@ -70,7 +70,7 @@
}
.oe_form_field_bi_editor .body .left .class-list {
height: 400px; /* FIXME */
height: 400px;
overflow-y: scroll;
overflow-x: hidden;
}
@@ -100,7 +100,7 @@
width: 70%;
float: left;
box-sizing: border-box;
height: 423px; /* FIXME */
height: 423px;
overflow-y: scroll;
overflow-x: hidden;
}
@@ -138,7 +138,7 @@
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
border: 1px solid #DDDDDD;
list-style-type: none;
padding: 0px;
padding: 0;
width: 175px;
}

View File

@@ -8,7 +8,6 @@ openerp.bi_view_editor = function (instance, local) {
this._super.apply(this, arguments);
},
start: function() {
var self = this;
this._super();
this.on("change:effective_readonly", this, function() {
this.display_field();
@@ -49,28 +48,28 @@ openerp.bi_view_editor = function (instance, local) {
}
},
filter: function(val) {
val = (typeof val != 'undefined') ? val.toLowerCase() : this.currentFilter;
val = (typeof val !== 'undefined') ? val.toLowerCase() : this.currentFilter;
this.currentFilter = val;
this.$el.find(".class-list .class-container").each(function() {
this.$el.find(".class-list .class-container").each(function() {
var modelData = $(this).find(".class").data('model-data');
//TODO: filter on all model fields (name, technical name, etc)
if(typeof modelData == 'undefined' || (modelData.name.toLowerCase().indexOf(val) == -1 && modelData.model.toLowerCase().indexOf(val) == -1))
if(typeof modelData === 'undefined' || (modelData.name.toLowerCase().indexOf(val) === -1 && modelData.model.toLowerCase().indexOf(val) === -1))
$(this).hide();
else
$(this).show();
});
},
get_field_icons: function(field) {
icons = "";
var icons = "";
if(field.column)
icons += "<span class='fa fa-columns' title='Column'></span> ";
if(field.row)
icons += "<span class='fa fa-bars' title='Row'></span> ";
if(field.measure)
icons += "<span class='fa fa-bar-chart-o' title='Measure'></span> ";
return icons;
return icons;
},
update_field_view: function(row) {
row.find("td:nth-child(3)").html(this.get_field_icons(row.data('field-data')));
@@ -79,13 +78,13 @@ openerp.bi_view_editor = function (instance, local) {
this.set_fields(JSON.parse(this.get('value')));
},
load_classes: function(scrollTo) {
scrollTo = (typeof scrollTo == 'undefined') ? false : scrollTo;
scrollTo = (typeof scrollTo === 'undefined') ? false : scrollTo;
var self = this;
var model = new instance.web.Model("ir.model");
if (this.$el.find(".field-list tbody tr").length > 0) {
model.call("get_related_models", [this.get_model_ids()], { context: new instance.web.CompoundContext() }).then(function(result) {
self.show_classes(result);
});
});
} else {
model.call("get_models", { context: new instance.web.CompoundContext() }).then(function(result) {
self.show_classes(result);
@@ -98,177 +97,147 @@ openerp.bi_view_editor = function (instance, local) {
self.$el.find(".class-list .class").remove();
self.$el.find(".class-list .field").remove();
var css = this.get('effective_readonly') ? 'cursor: default' : 'cursor: pointer';
function addField() {
if (!self.get("effective_readonly")) {
self.add_field($(this));
}
}
function clickHandler(evt) {
if(self.get("effective_readonly")) return;
var classel = $(this);
if (classel.data('bve-processed')) {
classel.parent().find('.field').remove();
classel.data('bve-processed', false);
var index = self.activeModelMenus.indexOf(classel.data('model-data').id);
if(index !== -1) self.activeModelMenus.splice(index, 1);
} else {
self.activeModelMenus.push(classel.data('model-data').id);
model.call("get_fields", [classel.data('model-data').id], { context: new instance.web.CompoundContext() }).then(function(result) {
for (var i = 0; i < result.length; i++) {
classel.find("#bve-field-" + result[i].name).remove();
self._render_field(self, i, result, classel, addField)
}
});
$(this).data('bve-processed', true);
}
}
function renderFields(result) {
console.log(result);
var item = self.$el.find(".class-list #bve-class-" + result[0].model_id);
for (var o = 0; o < result.length; o++) {
self._render_field(self, o, result, item, addField)
}
item.data('bve-processed', true);
}
for (var i = 0; i < result.length; i++) {
var item = $("<div style=\"" + css + "\" class=\"class\" title=\"" + result[i].model + "\" id=\"bve-class-" + result[i].id + "\">" + result[i].name + "</div>")
.data('model-data', result[i])
.click(function (evt) {
if(self.get("effective_readonly")) return;
var classel = $(this);
if (classel.data('bve-processed')) {
classel.parent().find('.field').remove();
classel.data('bve-processed', false);
var index = self.activeModelMenus.indexOf(classel.data('model-data').id);
if(index != -1) self.activeModelMenus.splice(index, 1);
} else {
self.activeModelMenus.push(classel.data('model-data').id);
model.call("get_fields", [classel.data('model-data').id], { context: new instance.web.CompoundContext() }).then(function(result) {
for (var i = 0; i < result.length; i++) {
classel.find("#bve-field-" + result[i].name).remove();
if(self.$el.find(".field-list tbody [name=label-" + result[i].id + "]").length > 0) continue;
classel.after($("<div class=\"field\" title=\"" + result[i].name + "\" id=\"bve-field-" + result[i].name + "\">" + result[i].description + "</div>")
.data('field-data', result[i])
.click(function () {
if (!self.get("effective_readonly")) {
self.add_field($(this));
}
})
.draggable({
'revert': 'invalid',
'scroll': false,
'helper': 'clone',
'appendTo': 'body',
'containment': 'window'
})
);
}
});
$(this).data('bve-processed', true);
}
})
.click(clickHandler)
.wrap("<div class=\"class-container\"></div>").parent();
self.$el.find(".class-list").append(item);
var index = self.activeModelMenus.indexOf(item.find(".class").data('model-data').id);
if(index != -1 && !self.get("effective_readonly")) {
model.call("get_fields", [self.activeModelMenus[index]], { context: new instance.web.CompoundContext() }).then(function(result) {
console.log(result);
var item = self.$el.find(".class-list #bve-class-" + result[0].model_id);
for (var o = 0; o < result.length; o++) {
if(self.$el.find(".field-list tbody [name=label-" + result[o].id + "]").length > 0) continue;
item.after($("<div class=\"field\" title=\"" + result[o].name + "\" id=\"bve-field-" + result[o].name + "\">" + result[o].description + "</div>")
.data('field-data', result[o])
.click(function () {
if (!self.get("effective_readonly")) {
self.add_field($(this));
}
})
.draggable({
'revert': 'invalid',
'scroll': false,
'helper': 'clone',
'appendTo': 'body',
'containment': 'window'
}));
}
item.data('bve-processed', true);
});
if(index !== -1 && !self.get("effective_readonly")) {
model.call("get_fields", [self.activeModelMenus[index]], { context: new instance.web.CompoundContext() }).then(renderFields);
}
self.filter();
}
},
_render_field(_self, _index, _result, _item, _addField) {
if(_self.$el.find(".field-list tbody [name=label-" + _result[_index].id + "]").length > 0) return;
_item.after($("<div class=\"field\" title=\"" + _result[_index].name + "\" id=\"bve-field-" + _result[_index].name + "\">" + _result[_index].description + "</div>")
.data('field-data', _result[_index])
.click(_addField)
.draggable({
'revert': 'invalid',
'scroll': false,
'helper': 'clone',
'appendTo': 'body',
'containment': 'window'
})
);
},
set_checkbox: function(check, identifier, _contextMenu) {
if(check)
_contextMenu.find(identifier).attr('checked', true);
else
_contextMenu.find(identifier).attr('checked', false);
},
_false_if_undefined: function(to_check) {
if (typeof check === 'undefined') return false;
return check;
},
add_field_to_table: function(data, options) {
var self = this;
if (typeof data.row == 'undefined') {
data.row = false;
}
if (typeof data.column == 'undefined') {
data.column = false;
}
if (typeof data.measure == 'undefined') {
data.measure = false;
}
data.row = self._false_if_undefined(data.row);
data.column = self._false_if_undefined(data.column);
data.measure = self._false_if_undefined(data.measure);
var n = 1;
var name = data.name;
while ($.grep(self.get_fields(), function (el) { return el.name == data.name;}).length > 0) {
function checkNameMatches(el) { return el.name === data.name;}
while ($.grep(self.get_fields(), checkNameMatches).length > 0) {
data.name = name + '_' + n;
n += 1;
}
var classes = "";
if (typeof data.join_node != 'undefined') {
if (typeof data.join_node !== 'undefined') {
classes = "join-node displaynone";
}
var delete_button = "";
var disabled = " disabled=\"disabled\" ";
if (!this.get("effective_readonly")) {
if (!this.get("effective_readonly")) {
delete_button = "<span id=\"delete-" + data.id + "\" class=\"delete-button fa fa-trash-o\"/>";
disabled = "";
}
self.$el.find(".field-list tbody")
.append($("<tr class=\"" + classes + "\"><td><input " + disabled + "title=\"" + data.name + " (" + data.model + ") "+ "\" type=\"text\" name=\"label-" + data.id + "\" value=\"" + data.description + "\"/></td><td>" + data.model_name + "</td><td>" + self.get_field_icons(data) + "</td><td>" + delete_button + "</td></tr>")
.append($("<tr class=\"" + classes + "\"><td><input " + disabled + "title=\"" + data.name + " (" + data.model + ")\" type=\"text\" name=\"label-" + data.id + "\" value=\"" + data.description + "\"/></td><td>" + data.model_name + "</td><td>" + self.get_field_icons(data) + "</td><td>" + delete_button + "</td></tr>")
.data('field-data', data)
.contextmenu(function(e) {
e.preventDefault();
if (self.get("effective_readonly")) return;
var target = $(e.currentTarget);
var currentFieldData = target.data('field-data');
var contextMenu = self.$el.find(".context-menu");
contextMenu.css("left", e.pageX + "px");
contextMenu.css("top", e.pageY + "px");
contextMenu.mouseleave(function() {
contextMenu.mouseleave(function() {
contextMenu.hide();
});
contextMenu.find("li").hover(function() {
contextMenu.find("li").hover(function() {
$(this).find("ul").css("color", "#000");
$(this).find("ul").show();
}, function() {
}, function() {
$(this).find("ul").hide();
});
//Set checkboxes
if(currentFieldData.column)
contextMenu.find('#column-checkbox').attr('checked', true);
else
contextMenu.find('#column-checkbox').attr('checked', false);
if(currentFieldData.row)
contextMenu.find('#row-checkbox').attr('checked', true);
else
contextMenu.find('#row-checkbox').attr('checked', false);
if(currentFieldData.measure)
contextMenu.find('#measure-checkbox').attr('checked', true);
else
contextMenu.find('#measure-checkbox').attr('checked', false);
if(currentFieldData.type == "float" || currentFieldData.type == "integer" || currentFieldData.type == "monetary") {
contextMenu.find('#column-checkbox').attr('disabled', true);
contextMenu.find('#row-checkbox').attr('disabled', true);
contextMenu.find('#measure-checkbox').attr('disabled', false);
}
else {
contextMenu.find('#column-checkbox').attr('disabled', false);
contextMenu.find('#row-checkbox').attr('disabled', false);
contextMenu.find('#measure-checkbox').attr('disabled', true);
}
self.set_checkbox(currentFieldData.column, '#column-checkbox', contextMenu);
self.set_checkbox(currentFieldData.row, '#row-checkbox', contextMenu);
self.set_checkbox(currentFieldData.measure, '#measure-checkbox', contextMenu);
var to_disable = false;
if(currentFieldData.type === "float" || currentFieldData.type === "integer" || currentFieldData.type === "monetary") to_disable = true;
var identifiers = [['#column-checkbox', 'column', to_disable], ['#row-checkbox', 'row', to_disable], ['#measure-checkbox', 'measure', !to_disable]];
identifiers.forEach(function (element) {
contextMenu.find(element[0]).attr('disabled', element[2]);
});
//Add change events
contextMenu.find('#column-checkbox').unbind("change");
contextMenu.find('#column-checkbox').change(function() {
currentFieldData.column = $(this).is(":checked");
target.data('field-data', currentFieldData);
self.update_field_view(target);
self.internal_set_value(JSON.stringify(self.get_fields()));
});
contextMenu.find('#row-checkbox').unbind("change");
contextMenu.find('#row-checkbox').change(function() {
currentFieldData.row = $(this).is(":checked");
target.data('field-data', currentFieldData);
self.update_field_view(target);
self.internal_set_value(JSON.stringify(self.get_fields()));
});
contextMenu.find('#measure-checkbox').unbind("change");
contextMenu.find('#measure-checkbox').change(function() {
currentFieldData.measure = $(this).is(":checked");
target.data('field-data', currentFieldData);
self.update_field_view(target);
self.internal_set_value(JSON.stringify(self.get_fields()));
identifiers.forEach(function (element) {
contextMenu.find(element[0]).unbind("change");
contextMenu.find(element[0]).change(function() {
currentFieldData[element[1]] = $(this).is(":checked");
target.data('field-data', currentFieldData);
self.update_field_view(target);
self.internal_set_value(JSON.stringify(self.get_fields()));
});
});
contextMenu.show();
@@ -289,7 +258,7 @@ openerp.bi_view_editor = function (instance, local) {
self.$el.find('.delete-button').click(function() {
$(this).closest('tr').remove();
self.clean_join_nodes();
self.internal_set_value(JSON.stringify(self.get_fields()));
self.internal_set_value(JSON.stringify(self.get_fields()));
self.load_classes();
return false;
});
@@ -299,10 +268,10 @@ openerp.bi_view_editor = function (instance, local) {
var d = $(this).data('field-data');
return d.table_alias;
}));
this.$el.find(".field-list tbody tr").each(function (idx, el) {
var d = $(this).data('field-data');
if (typeof d.join_node != 'undefined' && aliases.indexOf(d.join_node) === -1) {
if (typeof d.join_node !== 'undefined' && aliases.indexOf(d.join_node) === -1) {
$(this).remove();
}
});
@@ -321,31 +290,31 @@ openerp.bi_view_editor = function (instance, local) {
var d = $(this).data('field-data');
model_data[d.table_alias] = {model_id: d.model_id, model_name: d.model_name};
});
return model_data;
return model_data;
},
get_table_alias: function(field) {
if (typeof field.table_alias != 'undefined') {
if (typeof field.table_alias !== 'undefined') {
return field.table_alias;
} else {
var model_ids = this.get_model_ids();
var n = 0;
while (typeof model_ids["t" + n] != 'undefined') n++;
while (typeof model_ids["t" + n] !== 'undefined') n++;
return "t" + n;
}
},
add_field_and_join_node: function(field, join_node) {
var self = this;
if (join_node.join_node == -1) {
var go_to_else = true;
if (join_node.join_node === -1 || join_node.table_alias === -1){
go_to_else = false;
field.table_alias = self.get_table_alias(field);
join_node.join_node = field.table_alias;
if (join_node.join_node === -1) join_node.join_node = field.table_alias;
else join_node.table_alias = field.table_alias;
self.add_field_to_table(join_node);
} else if (join_node.table_alias == -1) {
field.table_alias = self.get_table_alias(field);
join_node.table_alias = field.table_alias;
self.add_field_to_table(join_node);
} else {
field.table_alias = join_node.table_alias;
}
else field.table_alias = join_node.table_alias;
self.add_field_to_table(field);
self.internal_set_value(JSON.stringify(self.get_fields()));
self.load_classes(field);
@@ -358,7 +327,7 @@ openerp.bi_view_editor = function (instance, local) {
var self = this;
model.call('get_join_nodes', [field_data, data], {context: new instance.web.CompoundContext()}).then(function(result) {
if (result.length == 1) {
if (result.length === 1) {
self.add_field_and_join_node(data, result[0]);
self.internal_set_value(JSON.stringify(self.get_fields()));
//self.load_classes(data);
@@ -367,7 +336,7 @@ openerp.bi_view_editor = function (instance, local) {
pop.display_popup(result, self.get_model_data(), self.add_field_and_join_node.bind(self), data);
} else {
// first field and table only.
table_alias = self.get_table_alias(data);
var table_alias = self.get_table_alias(data);
data.table_alias = table_alias;
self.add_field_to_table(data);
self.internal_set_value(JSON.stringify(self.get_fields()));
@@ -396,7 +365,6 @@ openerp.bi_view_editor = function (instance, local) {
});
instance.web.form.widgets.add('BVEEditor', 'instance.bi_view_editor.BVEEditor');
local.JoinNodePopup = instance.web.Widget.extend({
template: "JoinNodePopup",
start: function() {
@@ -410,20 +378,20 @@ openerp.bi_view_editor = function (instance, local) {
joinnodes.empty();
for (var i=0; i<choices.length; i++) {
var description = "";
if (choices[i].join_node != -1 && choices[i].table_alias != -1) {
if (choices[i].join_node !== -1 && choices[i].table_alias !== -1) {
description = "Use the field on table " + model_data[choices[i].table_alias].model_name;
} else {
if (choices[i].join_node == -1) {
description = "Join using the field '" + choices[i].description + "' from model '" + choices[i].model_name + "'";
} else {
description = "Join using the field '" + choices[i].description + "' from new model '" + choices[i].model_name + "'";
var new_str = "";
if (choices[i].join_node !== -1) {
new_str = "new ";
}
description = "Join using the field '" + choices[i].description + "' from " + new_str + "model '" + choices[i].model_name + "'";
}
joinnodes.append($("<a>" + description+ "</a>")
.data('idx', i)
.wrap("<p></p>")
.parent());
}
var dialog = new instance.web.Dialog(this, {
dialogClass: 'oe_act_window',
@@ -439,4 +407,5 @@ openerp.bi_view_editor = function (instance, local) {
this.start();
}
});
};