summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorYogesh (OpenERP) <ysa@tinyerp.com>2011-11-10 10:41:50 +0530
committerYogesh (OpenERP) <ysa@tinyerp.com>2011-11-10 10:41:50 +0530
commit0ce4e347054fc7713e165f275756ba4a1a0ea1f3 (patch)
treed34b6b381fbafd1a2f24beff7ca9c155a3ab2613 /addons/web/static/src
parentb9b9fbca444327c3e1f68d62efc39d5e64e4edf3 (diff)
parent611705d7f179fb1b3a6db9eff92e1f74ae3e9299 (diff)
[MERGE] Merge with trunk upto revision no 1432.
bzr revid: ysa@tinyerp.com-20111110051150-b1b7e0c3qqowb6u3
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/css/base.css32
-rw-r--r--addons/web/static/src/js/boot.js5
-rw-r--r--addons/web/static/src/js/chrome.js2
-rw-r--r--addons/web/static/src/js/core.js23
-rw-r--r--addons/web/static/src/js/data_export.js9
-rw-r--r--addons/web/static/src/js/view_form.js25
-rw-r--r--addons/web/static/src/js/views.js106
-rw-r--r--addons/web/static/src/xml/base.xml59
8 files changed, 157 insertions, 104 deletions
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index 94e36d60419..01f4b11f4d3 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -654,6 +654,9 @@ label.error {
display: none;
}
+.openerp .oe_search-view-buttons {
+ padding: 10px 0 10px 0;
+}
.openerp .oe_search-view-custom-filter-btn span {
background: url(/web/static/src/img/icons/gtk-add.png) repeat-y;
padding-left: 18px;
@@ -1080,11 +1083,16 @@ label.error {
}
.openerp .oe-view-manager-logs {
clear: both;
- font-size: 85%;
- margin: 0.25em 0;
background: #fff;
- padding: 0 10px;
+ margin: 0.25em 0;
+ font-size: 85%;
color: #4C4C4C;
+ position: relative;
+ overflow: hidden;
+}
+.openerp .oe-view-manager-logs ul {
+ margin: 0;
+ padding: 0 10px;
list-style: none;
}
.openerp .oe-view-manager-logs li:before {
@@ -1094,6 +1102,24 @@ label.error {
text-decoration: none;
color: inherit;
}
+/* only display first three log items of a folded logs list */
+.openerp .oe-view-manager-logs.oe-folded li:nth-child(n+4) {
+ display: none;
+}
+/* display link to more logs if there are more logs to view and the logview is
+ currently folded */
+.openerp .oe-view-manager-logs a.oe-more-logs {
+ display: none;
+}
+.openerp .oe-view-manager-logs.oe-folded.oe-has-more a.oe-more-logs {
+ display: block;
+}
+.openerp .oe-view-manager-logs a.oe-remove-everything {
+ position: absolute;
+ top: 0;
+ right: 0;
+ cursor: pointer;
+}
.openerp .view-manager-main-sidebar {
width: 180px;
diff --git a/addons/web/static/src/js/boot.js b/addons/web/static/src/js/boot.js
index 5fba5f4d8d4..58dcd922ea9 100644
--- a/addons/web/static/src/js/boot.js
+++ b/addons/web/static/src/js/boot.js
@@ -65,6 +65,11 @@ openerp.web = function(instance) {
openerp.web[files[i]](instance);
}
}
+ instance.log = function() {
+ if (instance.connection.debug && window.console) {
+ console.log.apply(console, arguments);
+ }
+ }
};
// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax:
diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js
index d85942feead..25b73ee59d5 100644
--- a/addons/web/static/src/js/chrome.js
+++ b/addons/web/static/src/js/chrome.js
@@ -109,7 +109,7 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
}
},
start: function () {
- this.$dialog = $('<div id="' + this.element_id + '"></div>').dialog(this.dialog_options);
+ this.$dialog = $(this.$element).dialog(this.dialog_options);
this._super();
return this;
},
diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js
index 7b402cae7fd..1929c573e42 100644
--- a/addons/web/static/src/js/core.js
+++ b/addons/web/static/src/js/core.js
@@ -793,6 +793,11 @@ openerp.web.Widget = openerp.web.CallbackEnabled.extend(/** @lends openerp.web.W
*/
identifier_prefix: 'generic-identifier-',
/**
+ * Tag name when creating a default $element.
+ * @type string
+ */
+ tag_name: 'div',
+ /**
* Construct the widget and set its parent if a parent is given.
*
* @constructs openerp.web.Widget
@@ -814,7 +819,7 @@ openerp.web.Widget = openerp.web.CallbackEnabled.extend(/** @lends openerp.web.W
this.element_id = element_id;
this.element_id = this.element_id || _.uniqueId(this.identifier_prefix);
var tmp = document.getElementById(this.element_id);
- this.$element = tmp ? $(tmp) : undefined;
+ this.$element = tmp ? $(tmp) : $(document.createElement(this.tag_name));
this.widget_parent = parent;
this.widget_children = [];
@@ -869,8 +874,7 @@ openerp.web.Widget = openerp.web.CallbackEnabled.extend(/** @lends openerp.web.W
}, target);
},
_render_and_insert: function(insertion, target) {
- var rendered = this.render();
- this.$element = $(rendered);
+ this.render_element();
if (target instanceof openerp.web.Widget)
target = target.$element;
insertion(target);
@@ -879,13 +883,24 @@ openerp.web.Widget = openerp.web.CallbackEnabled.extend(/** @lends openerp.web.W
},
on_inserted: function(element, widget) {},
/**
+ * Renders the element and insert the result of the render() method in this.$element.
+ */
+ render_element: function() {
+ var rendered = this.render();
+ if (rendered || rendered === "")
+ this.$element = $(rendered);
+ return this;
+ },
+ /**
* Renders the widget using QWeb, `this.template` must be defined.
* The context given to QWeb contains the "widget" key that references `this`.
*
* @param {Object} additional Additional context arguments to pass to the template.
*/
render: function (additional) {
- return openerp.web.qweb.render(this.template, _.extend({widget: this}, additional || {}));
+ if (this.template)
+ return openerp.web.qweb.render(this.template, _.extend({widget: this}, additional || {}));
+ return false;
},
/**
* Method called after rendering. Mostly used to bind actions, perform asynchronous
diff --git a/addons/web/static/src/js/data_export.js b/addons/web/static/src/js/data_export.js
index 51ac2cbd568..ea142606b5b 100644
--- a/addons/web/static/src/js/data_export.js
+++ b/addons/web/static/src/js/data_export.js
@@ -165,7 +165,11 @@ openerp.web.DataExport = openerp.web.Dialog.extend({
}
var model = record['params']['model'],
prefix = record['params']['prefix'],
- name = record['params']['name'];
+ name = record['params']['name'],
+ exclude_fields = [];
+ if (record['relation_field']) {
+ exclude_fields.push(record['relation_field']);
+ }
if (!record.loaded) {
var import_comp = self.$element.find("#import_compat").val();
@@ -174,7 +178,8 @@ openerp.web.DataExport = openerp.web.Dialog.extend({
prefix: prefix,
parent_name: name,
import_compat: Boolean(import_comp),
- parent_field_type : record['field_type']
+ parent_field_type : record['field_type'],
+ exclude: exclude_fields
}, function(results) {
record.loaded = true;
self.on_show_data(results, record.id);
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 603e2abb008..15790d3c1c0 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -102,7 +102,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
self.on_pager_action(action);
});
- this.$form_header.find('button.oe_form_button_save').click(this.do_save_then_readonly);
+ this.$form_header.find('button.oe_form_button_save').click(this.on_button_save);
this.$form_header.find('button.oe_form_button_new').click(this.on_button_new);
this.$form_header.find('button.oe_form_button_duplicate').click(this.on_button_duplicate);
this.$form_header.find('button.oe_form_button_delete').click(this.on_button_delete);
@@ -197,7 +197,6 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
this.do_update_pager(record.id == null);
if (this.sidebar) {
this.sidebar.attachments.do_update();
- this.sidebar.$element.find('.oe_sidebar_translate').toggleClass('oe_hide', !record.id);
}
if (this.default_focus_field && !this.embedded_view) {
this.default_focus_field.focus();
@@ -295,7 +294,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
return self.on_processed_onchange(response, processed);
});
} else {
- console.log("Wrong on_change format", on_change);
+ console.warn("Wrong on_change format", on_change);
}
}
} catch(e) {
@@ -346,6 +345,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
return $.Deferred().reject();
}
},
+ on_button_save: function() {
+ return this.do_save().then(this.do_set_readonly);
+ },
on_button_new: function() {
var self = this;
var def = $.Deferred();
@@ -404,9 +406,6 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
* @param {Function} success callback on save success
* @param {Boolean} [prepend_on_create=false] if ``do_save`` creates a new record, should that record be inserted at the start of the dataset (by default, records are added at the end)
*/
- do_save_then_readonly: function(success, prepend_on_create) {
- return this.do_save(success, prepend_on_create).then(this.do_set_readonly);
- },
do_save: function(success, prepend_on_create) {
var self = this;
var action = function() {
@@ -435,12 +434,18 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
self.on_invalid();
return $.Deferred().reject();
} else {
- console.log("About to save", values);
if (!self.datarecord.id) {
+ openerp.log("FormView(", self, ") : About to create", values);
return self.dataset.create(values).pipe(function(r) {
return self.on_created(r, undefined, prepend_on_create);
}).then(success);
+ } else if (_.isEmpty(values)) {
+ openerp.log("FormView(", self, ") : Nothing to save");
+ if (success) {
+ success();
+ }
} else {
+ openerp.log("FormView(", self, ") : About to save", values);
return self.dataset.write(self.datarecord.id, values, {}).pipe(function(r) {
return self.on_saved(r);
}).then(success);
@@ -503,7 +508,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
if (this.sidebar) {
this.sidebar.attachments.do_update();
}
- console.debug("The record has been created with id #" + this.datarecord.id);
+ openerp.log("The record has been created with id #" + this.datarecord.id);
this.reload();
return $.when(_.extend(r, {created: true})).then(success);
}
@@ -697,7 +702,7 @@ openerp.web.form.compute_domain = function(expr, fields) {
stack.push(!_(val).contains(field_value));
break;
default:
- console.log("Unsupported operator in modifiers :", op);
+ console.warn("Unsupported operator in modifiers :", op);
}
}
return _.all(stack, _.identity);
@@ -1097,7 +1102,7 @@ openerp.web.form.WidgetLabel = openerp.web.form.Widget.extend({
var self = this;
this.$element.find("label").dblclick(function() {
var widget = self['for'] || self;
- console.log(widget.element_class , widget);
+ openerp.log(widget.element_class , widget);
window.w = widget;
});
}
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index 62928401492..a6aaf02d5e6 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -441,6 +441,16 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
}
}
+ var $res_logs = this.$element.find('.oe-view-manager-logs:first');
+ $res_logs.delegate('a.oe-more-logs', 'click', function () {
+ $res_logs.removeClass('oe-folded');
+ return false;
+ }).delegate('a.oe-remove-everything', 'click', function () {
+ $res_logs.removeClass('oe-has-more')
+ .find('ul').empty();
+ return false;
+ });
+
return manager_ready;
},
on_mode_switch: function (view_type) {
@@ -518,10 +528,14 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
*/
do_display_log: function (log_records) {
var self = this,
- $logs = this.$element.find('ul.oe-view-manager-logs:first').empty();
- _(log_records).each(function (record) {
+ cutoff = 3,
+ $logs = this.$element.find('.oe-view-manager-logs:first')
+ .addClass('oe-folded'),
+ $logs_list = $logs.find('ul').empty();
+ $logs.toggleClass('oe-has-more', log_records.length > cutoff);
+ _(log_records.reverse()).each(function (record) {
$(_.sprintf('<li><a href="#">%s</a></li>', record.name))
- .appendTo($logs)
+ .appendTo($logs_list)
.delegate('a', 'click', function (e) {
self.do_action({
type: 'ir.actions.act_window',
@@ -564,26 +578,32 @@ session.web.Sidebar = session.web.Widget.extend({
},
add_default_sections: function() {
- this.add_section(_t('Customize'), 'customize');
- this.add_items('customize', [
- {
- label: _t("Manage Views"),
- callback: this.call_default_on_sidebar,
- title: _t("Manage views of the current object")
- }, {
- label: _t("Edit Workflow"),
- callback: this.call_default_on_sidebar,
- title: _t("Manage views of the current object"),
- classname: 'oe_hide oe_sidebar_edit_workflow'
- }, {
- label: _t("Customize Object"),
- callback: this.call_default_on_sidebar,
- title: _t("Manage views of the current object")
- }
- ]);
+ if (this.session.uid === 1) {
+ this.add_section(_t('Customize'), 'customize');
+ this.add_items('customize', [
+ {
+ label: _t("Manage Views"),
+ callback: this.call_default_on_sidebar,
+ title: _t("Manage views of the current object")
+ }, {
+ label: _t("Edit Workflow"),
+ callback: this.call_default_on_sidebar,
+ title: _t("Manage views of the current object"),
+ classname: 'oe_hide oe_sidebar_edit_workflow'
+ }, {
+ label: _t("Customize Object"),
+ callback: this.call_default_on_sidebar,
+ title: _t("Manage views of the current object")
+ }, {
+ label: _t("Translate"),
+ callback: this.call_default_on_sidebar,
+ title: _t("Technical translation")
+ }
+ ]);
+ }
this.add_section(_t('Other Options'), 'other');
- this.add_items('other', [
+ this.add_items('other', [
{
label: _t("Import"),
callback: this.call_default_on_sidebar
@@ -591,10 +611,6 @@ session.web.Sidebar = session.web.Widget.extend({
label: _t("Export"),
callback: this.call_default_on_sidebar
}, {
- label: _t("Translate"),
- callback: this.call_default_on_sidebar,
- classname: 'oe_sidebar_translate oe_hide'
- }, {
label: _t("View Log"),
callback: this.call_default_on_sidebar,
classname: 'oe_hide oe_sidebar_view_log'
@@ -619,14 +635,14 @@ session.web.Sidebar = session.web.Widget.extend({
}
});
},
-
+
add_section: function(name, code) {
if(!code) code = _.underscored(name);
var $section = this.sections[code];
if(!$section) {
- section_id = _.uniqueId(this.element_id + '_section_' + code + '_');
- var $section = $(session.web.qweb.render("Sidebar.section", {
+ var section_id = _.uniqueId(this.element_id + '_section_' + code + '_');
+ $section = $(session.web.qweb.render("Sidebar.section", {
section_id: section_id,
name: name,
classname: 'oe_sidebar_' + code
@@ -740,11 +756,6 @@ session.web.TranslateDialog = session.web.Dialog.extend({
this._super();
$.when(this.languages_loaded).then(function() {
self.$element.html(session.web.qweb.render('TranslateDialog', { widget: self }));
- self.$element.tabs();
- if (!(self.view.translatable_fields && self.view.translatable_fields.length)) {
- self.hide_tabs('fields');
- self.select_tab('view');
- }
self.$fields_form = self.$element.find('.oe_translation_form');
self.$fields_form.find('.oe_trad_field').change(function() {
$(this).toggleClass('touched', ($(this).val() != $(this).attr('data-value')));
@@ -787,21 +798,6 @@ session.web.TranslateDialog = session.web.Dialog.extend({
});
$.when.apply(null, deffered).then(callback);
},
- show_tabs: function() {
- for (var i = 0; i < arguments.length; i++) {
- this.$element.find('ul.oe_translate_tabs li a[href$="' + arguments[i] + '"]').parent().show();
- }
- },
- hide_tabs: function() {
- for (var i = 0; i < arguments.length; i++) {
- this.$element.find('ul.oe_translate_tabs li a[href$="' + arguments[i] + '"]').parent().hide();
- }
- },
- select_tab: function(name) {
- this.show_tabs(name);
- var index = this.$element.find('ul.oe_translate_tabs li a[href$="' + arguments[i] + '"]').parent().index() - 1;
- this.$element.tabs('select', index);
- },
open: function(field) {
var self = this,
sup = this._super;
@@ -810,7 +806,9 @@ session.web.TranslateDialog = session.web.Dialog.extend({
self.do_load_fields_values(function() {
sup.call(self);
if (field) {
- // TODO: focus and scroll to field
+ var $field_input = self.$element.find('tr[data-field="' + field.name + '"] td:nth-child(2) *:first-child');
+ self.$element.scrollTo($field_input);
+ $field_input.focus();
}
});
} else {
@@ -963,7 +961,15 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{
export_view.start();
},
on_sidebar_translate: function() {
- this.open_translate_dialog();
+ return this.do_action({
+ res_model : 'ir.translation',
+ domain : [['type', '!=', 'object'], '|', ['name', '=', this.dataset.model], ['name', 'ilike', this.dataset.model + ',']],
+ views: [[false, 'list'], [false, 'form']],
+ type : 'ir.actions.act_window',
+ auto_search : true,
+ view_type : "list",
+ view_mode : "list"
+ });
},
on_sidebar_view_log: function() {
}
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 95bd6f663dd..f5448168f5e 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -457,7 +457,11 @@
</button>
</t>
<t t-jquery=".oe-view-manager-header" t-operation="after">
- <ul class="oe-view-manager-logs"></ul>
+ <div class="oe-view-manager-logs oe-folded">
+ <ul></ul>
+ <a class="oe-more-logs" href="#">More…</a>
+ <a class="oe-remove-everything ui-icon ui-icon-closethick"/>
+ </div>
</t>
</t>
@@ -482,38 +486,25 @@
</t>
<t t-name="TranslateDialog">
- <ul class="oe_translate_tabs">
- <li><a t-attf-href="##{widget.element_id}_fields">Fields</a></li>
- <li><a t-attf-href="##{widget.element_id}_view">View labels</a></li>
- <li><a t-attf-href="##{widget.element_id}_sidebar">Sidebar Relates</a></li>
- </ul>
- <div t-attf-id="#{widget.element_id}_fields">
- <table t-if="widget.view.translatable_fields" class="oe_frame oe_forms oe_translation_form" border="0" cellpadding="0" cellspacing="0" width="100%">
- <tr>
- <td class="oe_form_separator" width="1%" nowrap="nowrap">
- <div class="separator horizontal">Field</div>
- </td>
- <th t-foreach="widget.languages" align="left">
- <div class="separator horizontal"><t t-esc="name"/></div>
- </th>
- </tr>
- <tr t-foreach="widget.view.translatable_fields" t-as="field">
- <td class="oe_form_frame_cell" width="1%" nowrap="nowrap">
- <label class="oe_label"><t t-esc="field.string"/>:</label>
- </td>
- <td t-foreach="widget.languages" t-as="lg" class="oe_form_frame_cell">
- <input t-if="field.type == 'char'" type="text" t-attf-name="#{lg.code}-#{field.name}" value="" data-value="" class="oe_trad_field" style="width: 100%"/>
- <textarea t-if="field.type == 'text'" t-attf-name="#{lg.code}-#{field.name}" data-value="" class="oe_trad_field" style="width: 100%"></textarea>
- </td>
- </tr>
- </table>
- </div>
- <div t-attf-id="#{widget.element_id}_view">
- Translate view
- </div>
- <div t-attf-id="#{widget.element_id}_sidebar">
- Translate sidebar
- </div>
+ <table t-if="widget.view.translatable_fields" class="oe_frame oe_forms oe_translation_form" border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td class="oe_form_separator" width="1%" nowrap="nowrap">
+ <div class="separator horizontal">Field</div>
+ </td>
+ <th t-foreach="widget.languages" align="left">
+ <div class="separator horizontal"><t t-esc="name"/></div>
+ </th>
+ </tr>
+ <tr t-foreach="widget.view.translatable_fields" t-as="field" t-att-data-field="field.name">
+ <td class="oe_form_frame_cell" width="1%" nowrap="nowrap">
+ <label class="oe_label"><t t-esc="field.string"/>:</label>
+ </td>
+ <td t-foreach="widget.languages" t-as="lg" class="oe_form_frame_cell">
+ <input t-if="field.type == 'char'" type="text" t-attf-name="#{lg.code}-#{field.name}" value="" data-value="" class="oe_trad_field" style="width: 100%"/>
+ <textarea t-if="field.type == 'text'" t-attf-name="#{lg.code}-#{field.name}" data-value="" class="oe_trad_field" style="width: 100%"></textarea>
+ </td>
+ </tr>
+ </table>
</t>
<t t-name="TreeView">
<select t-if="toolbar" style="width: 30%">
@@ -1015,7 +1006,7 @@
<t t-name="SearchView">
<form class="oe_forms">
<t t-call="SearchView.render_lines"/>
- <div class="oe_search-view-buttons" style="text-align: right;">
+ <div class="oe_search-view-buttons">
<input type="submit" value="Search"/>
<input type="reset" value="Clear"/>
<button class="oe_search-view-custom-filter-btn"><span>Advanced Filter</span></button>