diff options
| author | Xavier Morel <xmo@openerp.com> | 2011-04-12 15:21:20 +0200 |
|---|---|---|
| committer | Xavier Morel <xmo@openerp.com> | 2011-04-12 15:21:20 +0200 |
| commit | d7da740264e35dd67a7a891770b47d2bc38578ef (patch) | |
| tree | 3c381edfd569b045e959ccd71dbe21dfef141421 /addons/base/static/src | |
| parent | b840e25c1d901f0d83c41eef38ada73e8d61bd7b (diff) | |
| parent | b70b02bc5138d7f5f4b70433cb47e28c39f1f953 (diff) | |
[MERGE] from mainline branch, hook in new record handling
bzr revid: xmo@openerp.com-20110412132120-ii3mosez9kguvcjb
Diffstat (limited to 'addons/base/static/src')
| -rw-r--r-- | addons/base/static/src/base.html | 1 | ||||
| -rw-r--r-- | addons/base/static/src/css/base.css | 181 | ||||
| -rw-r--r-- | addons/base/static/src/img/sideheader-a-bg.png | bin | 0 -> 126 bytes | |||
| -rw-r--r-- | addons/base/static/src/img/toggle-a-bg.png | bin | 0 -> 412 bytes | |||
| -rw-r--r-- | addons/base/static/src/js/chrome.js | 29 | ||||
| -rw-r--r-- | addons/base/static/src/js/data.js | 9 | ||||
| -rw-r--r-- | addons/base/static/src/js/form.js | 313 | ||||
| -rw-r--r-- | addons/base/static/src/js/list.js | 4 | ||||
| -rw-r--r-- | addons/base/static/src/js/search.js | 2 | ||||
| -rw-r--r-- | addons/base/static/src/js/views.js | 16 | ||||
| -rw-r--r-- | addons/base/static/src/xml/base.xml | 58 |
11 files changed, 467 insertions, 146 deletions
diff --git a/addons/base/static/src/base.html b/addons/base/static/src/base.html index 3c8f76a6e23..bd717d32f34 100644 --- a/addons/base/static/src/base.html +++ b/addons/base/static/src/base.html @@ -15,6 +15,7 @@ <script type="text/javascript" src="/base/static/lib/jquery.ui.notify/js/jquery.notify.js"></script> <script type="text/javascript" src="/base/static/lib/jquery.superfish/js/hoverIntent.js"></script> <script type="text/javascript" src="/base/static/lib/jquery.superfish/js/superfish.js"></script> + <script type="text/javascript" src="/base/static/lib/jquery.ba-bbq/jquery.ba-bbq.js"></script> <script type="text/javascript" src="/base/static/src/js/base.js"></script> <script type="text/javascript" src="/base/static/src/js/chrome.js"></script> <script type="text/javascript" src="/base/static/src/js/data.js"></script> diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index ee15d02f3f7..b1ed332da5d 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -172,7 +172,10 @@ body.openerp { padding: 0 0 2px; border: none; background: none; - padding-left: 20px; + padding-left: 10px; +} +.openerp .secondary_menu h3 span, .openerp .secondary_menu h4 span { + left: 0 !important; } .openerp .secondary_menu a { display: block; @@ -201,6 +204,9 @@ body.openerp { text-shadow: #fff 0 1px 0; border: none !important; } +.openerp div.submenu_accordion div.menu_content a span { + padding-left: 20px; +} /* Header */ .openerp .header { @@ -305,16 +311,39 @@ body.openerp { } /* Footer */ -.openerp .footer { +.openerp div.oe_footer { + background: none repeat scroll 0 0 #CCCCCC; + overflow: hidden; + padding: 5px 0; + position: relative; + -moz-box-shadow: inset 0px 3px 5px rgba(0, 0, 0, 0.4); + -webkit-box-shadow: inset 0px 3px 5px rgba(0, 0, 0, 0.4); + box-shadow: inset 0px 3px 5px rgba(0, 0, 0, 0.4); +} +.openerp div.oe_footer p.oe_footer_powered { + left: 50%; + margin: 0; + padding: 0 15px; + color: #666666; + font-weight: bold; + font-size: 0.8em; + font-family: Ubuntu, Helvetica, sans-serif; text-align: center; } +.openerp div.oe_footer p.oe_footer_powered a { + text-decoration: none; + color: #666666; +} /* Main Application */ .openerp .application { - padding: 6px; + padding: 0px; } .openerp h2.oe_view_title { + font-size: 175%; + font-weight: normal; + font-family: Ubuntu, Helvetica, sans-serif; margin: 2px 0; color: #252424; text-shadow: white 0 1px 0; @@ -479,8 +508,37 @@ body.openerp { border-bottom-right-radius: 7px; } +/* Notebook */ +.openerp .oe_form_notebook { + padding: 0px; + background: none; + border-width: 0px; +} +.openerp .oe_form_notebook ul.ui-tabs-nav { + padding-left: 0px; + background: transparent; + border-width: 0px 0px 1px 0px; + border-radius: 0px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + line-height: 0.5em; +} +.openerp .oe_form_notebook ul.ui-tabs-nav li { + font-weight: bold; +} +.openerp .oe_form_notebook .ui-tabs-panel { + background: #f9f9f9; + border-width: 0px 1px 1px 1px; +} +.openerp .oe_form_notebook .ui-tabs-selected { + background: #f9f9f9; +} /* Form */ +.openerp table.oe_frame td { + color: #4c4c4c; + font-weight: 80%; +} .openerp .required.error { border: 1px solid #900; } @@ -491,6 +549,22 @@ body.openerp { float: right; } +.openerp label.oe_form_label_help { + cursor: help; +} +.openerp label.oe_form_label, .openerp label.oe_form_label_help { + display: block; + text-align: right; +} +.openerp label.oe_form_label_help span { + font-size: 80%; + color: darkgreen; + vertical-align:top; + position: relative; + top: -4px; + padding: 0 2px; +} + /* Inputs */ .openerp input[type="text"], .openerp input[type="password"], .openerp select, .openerp textarea { -moz-box-sizing: border-box; @@ -503,11 +577,14 @@ body.openerp { -webkit-border-radius: 3px; border-radius: 3px; background: white; + min-width: 90px; + color: #1f1f1f; } .openerp input[type="text"], .openerp input[type="password"], .openerp select, .openerp .button { height: 22px; } .openerp .button { + color: #4c4c4c; white-space: nowrap; } .openerp .button span { @@ -543,37 +620,119 @@ body.openerp { .openerp .ui-widget { font-size: 1em; } +.openerp .oe_form_field_progressbar .ui-progressbar { + height: 22px; + font-size: 10px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid #999; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + background: white; + min-width: 90px; +} /* Sidebar */ .openerp .view-manager-main-table { + margin: 0; width:100%; + border-collapse:collapse; + height:100%; } -.openerp .view-manager-main-sidebar { + +.openerp .view-manager-main-table tbody { vertical-align: top; +} + +.openerp .view-manager-main-content { + padding: 6px; +} + +.openerp .view-manager-main-sidebar { width:0; padding:0; margin:0; } -.openerp .view-manager-main-sidebar .sidebar-main-div { +.openerp .sidebar-main-div { + height:100%; +} + +.openerp .sidebar-sub-div { padding:0; margin:0; + width:180px; + border-left-color: #D2CFCF; + border-left-style: solid; + border-left-width: 1px; + height:100%; + font-family: Ubuntu, Helvetica, sans-serif; + font-size: 0.9em; +} + +.openerp .closed-sidebar .sidebar-sub-div { + width:22px; } -.openerp .view-manager-main-sidebar .sidebar-sub-div { - border: solid 1px #1F1F1F; - border-bottom-width: 0; +.openerp .closed-sidebar .sidebar-displaying-div { + display:none; +} + +.openerp .sidebar-main-div a { + color: #555; + text-decoration: none; +} + +.openerp .sidebar-main-div a:hover { + color: black; +} + +.openerp .view-manager-main-sidebar h2 { + margin:0; + font-family: Ubuntu, Helvetica, sans-serif; + font-size: 1.15em; + color: #8E8E8E; + text-shadow: white 0px 1px 0px; + padding-left: 10px; + padding-right: 21px; + height: 21px; + background: url(../img/sideheader-a-bg.png) repeat-x; + border-color: #D2CFCF; + border-style: solid; + border-top-width: 1px; + border-bottom-width: 1px; + border-left-width: 0; + border-right-width: 0; } .openerp .view-manager-main-sidebar ul { list-style-type: none; margin: 0; padding: 0; - width: 120px; - border-bottom: solid 1px #1F1F1F; + display: block; } .openerp .view-manager-main-sidebar li { - padding: 3px; + display: block; + padding: 3px 3px 3px 10px; +} + +.openerp .toggle-sidebar { + border-color: #D2CFCF; + border-style: solid; + border-width: 1px; + display: block; + background: url(../img/toggle-a-bg.png); + width: 21px; + height: 21px; + position: absolute; + z-index: 10; +} +.openerp .open-sidebar .toggle-sidebar { + margin-left: 158px; + background-position: 21px 0; } diff --git a/addons/base/static/src/img/sideheader-a-bg.png b/addons/base/static/src/img/sideheader-a-bg.png Binary files differnew file mode 100644 index 00000000000..ca9b64b8b01 --- /dev/null +++ b/addons/base/static/src/img/sideheader-a-bg.png diff --git a/addons/base/static/src/img/toggle-a-bg.png b/addons/base/static/src/img/toggle-a-bg.png Binary files differnew file mode 100644 index 00000000000..b9837ab233e --- /dev/null +++ b/addons/base/static/src/img/toggle-a-bg.png diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index b26dccffb2e..bbfe37661cf 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -245,12 +245,7 @@ openerp.base.Notification = openerp.base.BasicController.extend({ text: text }); }, - // TODO remove to avoid default as attribute - 'default': function(title, text) { - this.notify(title,text); - }, - // TODO change into warn to avoid alert - alert: function(title, text) { + warn: function(title, text) { this.$element.notify('create', 'oe_notification_alert', { title: title, text: text @@ -478,8 +473,10 @@ openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.b continue; openerp[mod] = {}; // init module mod - openerp._openerp[mod](openerp); - self.module_loaded[mod] = true; + if(openerp._openerp[mod] != undefined) { + openerp._openerp[mod](openerp); + self.module_loaded[mod] = true; + } } } }); @@ -783,6 +780,10 @@ openerp.base.Header = openerp.base.Controller.extend({ this.do_update(); }, do_update: function() { + if(jQuery.param != undefined && + jQuery.deparam(jQuery.param.querystring()).kitten != undefined) { + this.kitten = 1; + } this.$element.html(QWeb.render("Header", this)); } }); @@ -907,11 +908,21 @@ openerp.base.WebClient = openerp.base.Controller.extend({ this.header.start(); this.login.start(); this.menu.start(); - this.notification['default']("OpenERP Client", "The openerp client has been initialized."); + this.notification.notify("OpenERP Client", "The openerp client has been initialized."); }, on_logged: function() { this.action = new openerp.base.ActionManager(this.session, "oe_app"); this.action.start(); + + // if using saved actions, load the action and give it to action manager + var parameters = jQuery.deparam(jQuery.param.querystring()); + if(parameters["s_action"] != undefined) { + var key = parseInt(parameters["s_action"]); + var self = this; + this.rpc("/base/session/get_session_action", {key:key}, function(action) { + self.action.do_action(action); + }); + } }, on_menu_action: function(action) { this.action.do_action(action); diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 8f5d6168e75..7b1a930c88f 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -89,7 +89,12 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. context: this.context }, callback); }, - create: function() { + create: function(data, callback) { + return this.rpc('/base/dataset/create', { + model: this.model, + data: data, + context: this.context + }, callback); }, write: function (id, data, callback) { return this.rpc('/base/dataset/save', { @@ -100,7 +105,7 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. }, callback); }, unlink: function(ids) { - this.notification['default']("Unlink", ids); + this.notification.notify("Unlink", ids); }, call: function (method, ids, args, callback) { ids = ids || []; diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index d33c9f2ee7e..e54c46bb533 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -27,6 +27,7 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base this.fields = {}; this.datarecord = {}; this.ready = false; + this.show_invalid = true; }, start: function() { //this.log('Starting FormView '+this.model+this.view_id) @@ -48,10 +49,10 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base self.on_pager_action(action); }); - this.$element.find('div.oe_form_buttons button.oe_form_button_save').click(this.do_save); - this.$element.find('div.oe_form_buttons button.oe_form_button_save_edit').click(this.do_save_edit); - this.$element.find('div.oe_form_buttons button.oe_form_button_cancel').click(this.do_cancel); - this.$element.find('div.oe_form_buttons button.oe_form_button_new').click(this.on_button_new); + this.$element.find('#' + this.element_id + '_header button.oe_form_button_save').click(this.do_save); + this.$element.find('#' + this.element_id + '_header button.oe_form_button_save_edit').click(this.do_save_edit); + this.$element.find('#' + this.element_id + '_header button.oe_form_button_cancel').click(this.do_cancel); + this.$element.find('#' + this.element_id + '_header button.oe_form_button_new').click(this.on_button_new); // sidebar stuff if (this.view_manager.sidebar) { @@ -59,8 +60,19 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base } }, do_show: function () { - this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded); - this.$element.show(); + var self = this; + this.do_update_pager.add({ + unique: true, + callback: function() { + self.$element.show(); + } + }); + if (this.dataset.index === null) { + // null index means we should start a new record + this.on_button_new(); + } else { + this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded); + } }, do_hide: function () { this.$element.hide(); @@ -69,20 +81,22 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base if (record) { this.datarecord = record; for (var f in this.fields) { - this.fields[f].set_value(this.datarecord[f]); + this.fields[f].set_value(this.datarecord[f] || false); + this.fields[f].validate(); } if (!record.id) { + this.show_invalid = false; // Second pass in order to trigger the onchanges in case of new record for (var f in record) { - this.fields[f].on_ui_change(); + this.on_form_changed(this.fields[f]); } } this.on_form_changed(); - this.ready = true; + this.show_invalid = this.ready = true; } else { this.log("No record received"); } - this.do_update_pager(); + this.do_update_pager(record.id == null); }, on_form_changed: function(widget) { if (widget && widget.node.attrs.on_change) { @@ -110,14 +124,13 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base this.dataset.index = this.dataset.ids.length - 1; break; } - this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded); + this.reload(); }, - do_update_pager: function() { - var $pager = this.$element.find('div.oe_form_pager'); - $pager.find("button[data-pager-action='first'], button[data-pager-action='previous']").attr('disabled', this.dataset.index == 0); - $pager.find("button[data-pager-action='next'], button[data-pager-action='last']").attr('disabled', this.dataset.index == this.dataset.ids.length - 1); - this.$element.find('span.oe_pager_index').html(this.dataset.index + 1); - this.$element.find('span.oe_pager_count').html(this.dataset.count); + do_update_pager: function(hide_index) { + var $pager = this.$element.find('#' + this.element_id + '_header div.oe_form_pager').eq(0); + var index = hide_index ? '-' : this.dataset.index + 1; + $pager.find('span.oe_pager_index').html(index); + $pager.find('span.oe_pager_count').html(this.dataset.count); }, do_onchange: function(widget, processed) { processed = processed || []; @@ -196,7 +209,8 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base self.on_record_loaded(result.result); }); }, - do_save: function() { + do_save: function(success) { + var self = this; if (!this.ready) { return false; } @@ -206,21 +220,31 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base f = this.fields[f]; if (f.invalid) { invalid = true; + f.update_dom(); } else if (f.touched) { values[f.name] = f.get_value(); } } if (invalid) { this.on_invalid(); + return false; } else { this.log("About to save", values); - this.dataset.write(this.datarecord.id, values, this.on_saved); + if (!this.datarecord.id) { + this.dataset.create(values, function(r) { + self.on_created(r, success); + }); + } else { + this.dataset.write(this.datarecord.id, values, function(r) { + self.on_saved(r, success); + }); + } + return true; } }, do_save_edit: function() { - if (this.do_save()) { - this.switch_readonly(); - } + this.do_save(); + //this.switch_readonly(); Use promises }, switch_readonly: function() { }, @@ -234,24 +258,48 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base } }); msg += "</ul>"; - this.notification.alert("The following fields are invalid :", msg); + this.notification.warn("The following fields are invalid :", msg); }, - on_saved: function(r) { + on_saved: function(r, success) { if (!r.result) { - this.log("Record was not saved"); + this.notification.warn("Record not saved", "Problem while saving record."); } else { - // Check response for exceptions, display error - this.notification['default']("Record saved", "The record #" + this.datarecord.id + " has been saved."); + this.notification.notify("Record saved", "The record #" + this.datarecord.id + " has been saved."); + if (success) { + success(r); + } + } + }, + on_created: function(r, success) { + if (!r.result) { + this.notification.warn("Record not created", "Problem while creating record."); + } else { + this.datarecord.id = arguments[0].result; + this.dataset.ids.push(this.datarecord.id); + this.dataset.index = this.dataset.ids.length - 1; + this.dataset.count++; + this.do_update_pager(); + this.notification.notify("Record created", "The record has been created with id #" + this.datarecord.id); + if (success) { + success(r); + } } }, do_search: function (domains, contexts, groupbys) { - this.notification['default']("Searching form"); + this.notification.notify("Searching form"); }, on_action: function (action) { - this.notification['default']('Executing action ' + action); + this.notification.notify('Executing action ' + action); }, do_cancel: function () { - this.notification['default']("Cancelling form"); + this.notification.notify("Cancelling form"); + }, + reload: function() { + if (this.datarecord.id) { + this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded); + } else { + this.on_button_new(); + } } }); @@ -396,12 +444,12 @@ openerp.base.form.WidgetFrame = openerp.base.form.Widget.extend({ } } }, - handle_node: function(n) { - var type = this.view.fields_view.fields[n.attrs.name] || {}; - var widget_type = n.attrs.widget || type.type || n.tag; - var widget = new (openerp.base.form.widgets.get_object(widget_type)) (this.view, n); - if (n.tag == 'field' && n.attrs.nolabel != '1') { - var label = new (openerp.base.form.widgets.get_object('label')) (this.view, n); + handle_node: function(node) { + var type = this.view.fields_view.fields[node.attrs.name] || {}; + var widget_type = node.attrs.widget || type.type || node.tag; + var widget = new (openerp.base.form.widgets.get_object(widget_type)) (this.view, node); + if (node.tag == 'field' && node.attrs.nolabel != '1') { + var label = new (openerp.base.form.widgets.get_object('label')) (this.view, node); label["for"] = widget; this.add_widget(label); } @@ -450,6 +498,61 @@ openerp.base.form.WidgetButton = openerp.base.form.Widget.extend({ init: function(view, node) { this._super(view, node); this.template = "WidgetButton"; + }, + start: function() { + this._super.apply(this, arguments); + this.$element.click(this.on_click); + }, + on_click: function(saved) { + var self = this; + if (saved !== true) { + this.view.do_save(function() { + self.on_click(true); + }); + } else { + if (this.node.attrs.confirm) { + var dialog = $('<div>' + this.node.attrs.confirm + '</div>').dialog({ + title: 'Confirm', + modal: true, + buttons: { + Ok: function() { + self.on_confirmed(); + $(this).dialog("close"); + }, + Cancel: function() { + $(this).dialog("close"); + } + } + }); + } else { + this.on_confirmed(); + } + } + }, + on_confirmed: function() { + var attrs = this.node.attrs; + if (attrs.special) { + return this.log("Should close the popup"); + } else { + var type = attrs.type || 'workflow'; + var context = _.extend({}, this.view.dataset.context, attrs.context || {}); + switch(type) { + case 'object': + return this.view.dataset.call(attrs.name, [this.view.datarecord.id], [context], this.on_button_object); + break; + default: + this.log(_.sprintf("Unsupported button type : %s", type)); + } + } + }, + on_button_object: function(r) { + if (r.result === false) { + this.log("Button object returns false"); + } else if (r.result.constructor == Object) { + console.log("TODO: send action to action manager", r.result); + } else { + this.view.reload(); + } } }); @@ -485,12 +588,13 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({ if (node.attrs.nolabel != '1' && this.colspan > 1) { this.colspan--; } - this.field = view.fields_view.fields[node.attrs.name]; + this.field = view.fields_view.fields[node.attrs.name] || {}; this.string = node.attrs.string || this.field.string; this.help = node.attrs.help || this.field.help; - this.nolabel = (node.attrs.nolabel == '1'); - this.readonly = (node.attrs.readonly == '1'); - this.required = (node.attrs.required == '1'); + this.invisible = (this.invisible || this.field.invisible == '1'); + this.nolabel = (this.field.nolabel || node.attrs.nolabel) == '1'; + this.readonly = (this.field.readonly || node.attrs.readonly) == '1'; + this.required = (this.field.required || node.attrs.required) == '1'; this.invalid = false; this.touched = false; }, @@ -499,6 +603,9 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({ this.invalid = false; this.update_dom(); }, + set_value_from_ui: function() { + this.value = undefined; + }, get_value: function() { return this.value; }, @@ -506,10 +613,17 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({ this._super.apply(this, arguments); this.$element.toggleClass('disabled', this.readonly); this.$element.toggleClass('required', this.required); - this.$element.toggleClass('invalid', this.invalid); + if (this.view.show_invalid) { + this.$element.toggleClass('invalid', this.invalid); + } }, on_ui_change: function() { this.touched = true; + this.set_value_from_ui(); + this.validate(); + this.view.on_form_changed(this); + }, + validate: function() { } }); @@ -531,31 +645,41 @@ openerp.base.form.FieldChar = openerp.base.form.Field.extend({ this._super.apply(this, arguments); this.$element.find('input').attr('disabled', this.readonly); }, - on_ui_change: function() { - this._super.apply(this, arguments); + set_value_from_ui: function() { this.value = this.$element.find('input').val(); - this.invalid = this.required && this.value == ""; - this.view.on_form_changed(this); + }, + validate: function() { + this.invalid = false; + if (this.value === false || this.value === "") { + this.invalid = this.required; + } else if (this.validation_regex) { + this.invalid = !this.validation_regex.test(this.value); + } } }); openerp.base.form.FieldEmail = openerp.base.form.FieldChar.extend({ + init: function(view, node) { + this._super(view, node); + this.validation_regex = /@/; + } }); openerp.base.form.FieldUrl = openerp.base.form.FieldChar.extend({ }); openerp.base.form.FieldFloat = openerp.base.form.FieldChar.extend({ + init: function(view, node) { + this._super(view, node); + this.validation_regex = /^\d+(\.\d+)?$/; + }, set_value: function(value) { this._super.apply(this, arguments); var show_value = (value != null && value !== false) ? value.toFixed(2) : ''; - this.$element.find('input').val(value); + this.$element.find('input').val(show_value); }, - on_ui_change: function() { - this._super.apply(this, arguments); + set_value_from_ui: function() { this.value = this.$element.find('input').val().replace(/,/g, '.'); - this.invalid = (this.required && this.value == "") || !this.value.match(/^\d+(\.\d+)?$/) ; - this.view.on_form_changed(this); } }); @@ -563,23 +687,13 @@ openerp.base.form.FieldDate = openerp.base.form.FieldChar.extend({ init: function(view, node) { this._super(view, node); this.template = "FieldDate"; + this.validation_regex = /^\d+-\d+-\d+$/; }, start: function() { this._super.apply(this, arguments); this.$element.find('input').change(this.on_ui_change).datepicker({ dateFormat: 'yy-mm-dd' }); - }, - set_value: function(value) { - this._super.apply(this, arguments); - var show_value = (value != null && value !== false) ? value : ''; - this.$element.find('input').val(show_value); - }, - on_ui_change: function() { - this._super.apply(this, arguments); - this.value = this.$element.find('input').val(); - this.invalid = this.required && this.value == ""; - this.view.on_form_changed(this); } }); @@ -587,6 +701,7 @@ openerp.base.form.FieldDatetime = openerp.base.form.FieldChar.extend({ init: function(view, node) { this._super(view, node); this.template = "FieldDatetime"; + this.validation_regex = /^\d+-\d+-\d+( \d+:\d+(:\d+)?)?$/; }, start: function() { this._super.apply(this, arguments); @@ -594,17 +709,6 @@ openerp.base.form.FieldDatetime = openerp.base.form.FieldChar.extend({ dateFormat: 'yy-mm-dd', timeFormat: 'hh:mm:ss' }); - }, - set_value: function(value) { - this._super.apply(this, arguments); - var show_value = (value != null && value !== false) ? value : ''; - this.$element.find('input').val(show_value); - }, - on_ui_change: function() { - this._super.apply(this, arguments); - this.value = this.$element.find('input').val(); - this.invalid = this.required && this.value == ""; - this.view.on_form_changed(this); } }); @@ -612,6 +716,7 @@ openerp.base.form.FieldText = openerp.base.form.Field.extend({ init: function(view, node) { this._super(view, node); this.template = "FieldText"; + this.validation_regex = null; }, start: function() { this._super.apply(this, arguments); @@ -626,11 +731,16 @@ openerp.base.form.FieldText = openerp.base.form.Field.extend({ this._super.apply(this, arguments); this.$element.find('textarea').attr('disabled', this.readonly); }, - on_ui_change: function() { - this._super.apply(this, arguments); + set_value_from_ui: function() { this.value = this.$element.find('textarea').val(); - this.invalid = this.required && this.value == ""; - this.view.on_form_changed(this); + }, + validate: function() { + this.invalid = false; + if (this.value === false || this.value === "") { + this.invalid = this.required; + } else if (this.validation_regex) { + this.invalid = !this.validation_regex.test(this.value); + } } }); @@ -652,15 +762,29 @@ openerp.base.form.FieldBoolean = openerp.base.form.Field.extend({ this._super.apply(this, arguments); this.$element.find('input')[0].checked = value; }, + set_value_from_ui: function() { + this.value = this.$element.find('input').is(':checked'); + }, update_dom: function() { this._super.apply(this, arguments); - this.$element.find('textarea').attr('disabled', this.readonly); + this.$element.find('input').attr('disabled', this.readonly); }, - on_ui_change: function() { - this._super.apply(this, arguments); - this.value = this.$element.find('input').is(':checked'); + validate: function() { this.invalid = this.required && !this.value; - this.view.on_form_changed(this); + } +}); + +openerp.base.form.FieldProgressBar = openerp.base.form.Field.extend({ + init: function(view, node) { + this._super(view, node); + this.template = "FieldProgressBar"; + }, + start: function() { + this._super.apply(this, arguments); + this.$element.find('div').progressbar({ + value: this.value, + disabled: this.readonly + }); } }); @@ -685,15 +809,15 @@ openerp.base.form.FieldSelection = openerp.base.form.Field.extend({ this.$element.find('select')[0].selectedIndex = 0; } }, + set_value_from_ui: function() { + this.value = this.$element.find('select').val(); + }, update_dom: function() { this._super.apply(this, arguments); this.$element.find('select').attr('disabled', this.readonly); }, - on_ui_change: function() { - this._super.apply(this, arguments); - this.value = this.$element.find('select').val(); - this.invalid = this.required && this.value == ""; - this.view.on_form_changed(this); + validate: function() { + this.invalid = this.required && this.value === ""; } }); @@ -720,7 +844,7 @@ openerp.base.form.FieldOne2ManyDatasSet = openerp.base.DataSetStatic.extend({ this._super(id, data, callback); }, unlink: function() { - this.notification['default']('Unlinking o2m ' + this.ids); + this.notification.notify('Unlinking o2m ' + this.ids); } }); @@ -744,12 +868,14 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ this.viewmanager = new openerp.base.form.FieldOne2ManyViewManager(this.view.session, this.element_id, this.dataset, views); this.viewmanager.start(); }, - set_value_CASSEEEEEEEEEEEEEEEEE: function(value) { + set_value: function(value) { this.value = value; - this.log("o2m.set_value",value); - this.viewmanager.dataset.ids = value; - this.viewmanager.dataset.ids.count = value.length; - this.viewmanager.views.list.controller.do_update(); + if (value != false) { + this.log("o2m.set_value",value); + this.viewmanager.dataset.ids = value; + this.viewmanager.dataset.count = value.length; + this.viewmanager.views.list.controller.do_update(); + } }, get_value: function(value) { return this.operations; @@ -790,6 +916,7 @@ openerp.base.form.widgets = new openerp.base.Registry({ 'email' : 'openerp.base.form.FieldEmail', 'url' : 'openerp.base.form.FieldUrl', 'text' : 'openerp.base.form.FieldText', + 'text_wiki' : 'openerp.base.form.FieldText', 'date' : 'openerp.base.form.FieldDate', 'datetime' : 'openerp.base.form.FieldDatetime', 'selection' : 'openerp.base.form.FieldSelection', @@ -801,7 +928,7 @@ openerp.base.form.widgets = new openerp.base.Registry({ 'boolean' : 'openerp.base.form.FieldBoolean', 'float' : 'openerp.base.form.FieldFloat', 'integer': 'openerp.base.form.FieldFloat', - 'progressbar': 'openerp.base.form.FieldFloat', + 'progressbar': 'openerp.base.form.FieldProgressBar', 'float_time': 'openerp.base.form.FieldFloat' }); diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 8d4a1cce360..0b63639cb5d 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -245,8 +245,8 @@ openerp.base.ListView = openerp.base.Controller.extend( * The default implementation is to switch to a new record on the form view */ do_add_record: function () { - this.notification['default']('Add', "New record"); - // this.switch_to_record(null); + this.notification.notify('Add', "New record"); + this.switch_to_record(null); }, /** * Handles deletion of all selected lines diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index ef10992d75f..21d1408f087 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -215,7 +215,7 @@ openerp.base.SearchView = openerp.base.Controller.extend({ * @param {Array} errors a never-empty array of error objects */ on_invalid: function (errors) { - this.notification['default']("Invalid Search", "triggered from search view"); + this.notification.notify("Invalid Search", "triggered from search view"); }, do_clear: function (e) { if (e && e.preventDefault) { e.preventDefault(); } diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 5e6e3d72745..8cbc766df4d 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -229,10 +229,10 @@ openerp.base.Sidebar = openerp.base.BaseWidget.extend({ set_toolbar: function(toolbar) { this.sections = []; var self = this; - _.each(["print", "action", "relate"], function(type) { - if (toolbar[type].length == 0) + _.each([["print", "Reports"], ["action", "Actions"], ["relate", "Links"]], function(type) { + if (toolbar[type[0]].length == 0) return; - var section = {elements:toolbar[type]}; + var section = {elements:toolbar[type[0]], label:type[1]}; self.sections.push(section); }); this.refresh(); @@ -240,6 +240,11 @@ openerp.base.Sidebar = openerp.base.BaseWidget.extend({ refresh: function() { this.$element.html(QWeb.render("ViewManager.sidebar.internal", _.extend({_:_}, this))); var self = this; + this.$element.find(".toggle-sidebar").click(function(e) { + self.$element.toggleClass('open-sidebar closed-sidebar'); + e.stopPropagation(); + e.preventDefault(); + }); this.$element.find("a").click(function(e) { var $this = jQuery(this); var i = $this.attr("data-i"); @@ -269,8 +274,9 @@ openerp.base.ExternalActionManager = openerp.base.Controller.extend({ viewmanager.start(); } else if (action.target == "current") { this.rpc("/base/session/save_session_action", {the_action:action}, function(key) { - var url = window.location.href; - //window.open(); + var url = window.location.protocol + "//" + window.location.host + + window.location.pathname + "?" + jQuery.param({s_action:""+key}); + window.open(url); }); } } diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 7586f62eff7..67a7d716d26 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -40,8 +40,8 @@ </tr> <tr> <td colspan="2"> - <div id="oe_footer" class="footer"> - Powered by OpenERP. + <div id="oe_footer" class="oe_footer"> + <p class="oe_footer_powered">Powered by <a href="http://www.openerp.com">openerp.com</a>.</p> </div> </td> </tr> @@ -60,7 +60,8 @@ </t> <t t-name="Header"> <a href="/" class="company_logo_link"> - <img src="/base/static/src/img/logo.png" border="0" class="company_logo"/> + <img t-att-src="typeof kitten == 'undefined' ? '/base/static/src/img/logo.png' : + 'http://placekitten.com/180/46'" border="0" class="company_logo"/> </a> <h1 class="header_title" t-if="session.session_is_valid()"> <span class="company">$company</span> - (<span class="database">$database</span>)<br/> @@ -232,7 +233,7 @@ </tr> <t t-name="FormView"> <h2 class="oe_view_title"><t t-esc="view.fields_view.arch.attrs.string"/></h2> - <div class="oe_form_header"> + <div class="oe_form_header" t-att-id="view.element_id + '_header'"> <div class="oe_form_buttons"> <!--<button type="button" class="oe_form_button_save">Save</button>--> <button type="button" class="oe_form_button_save_edit">Save & Edit</button> @@ -292,11 +293,13 @@ </div> </t> <t t-name="WidgetLabel"> - <label t-att-for="widget.element_id + '_field'" t-att-title="widget.help" style="display: block; text-align: right;" + <label t-att-for="widget.element_id + '_field'" + t-att-class="'oe_form_label' + (widget.help ? '_help' : '')" + t-att-title="widget.help" t-att-ondblclick="'console.log(\'' + widget.element_id + '\', openerp.screen.' + widget.element_id + ')'"> <t t-esc="widget.string"/> <span t-if="widget.help">?</span> - : + <t t-if="widget.string">:</t> </label> </t> <t t-name="FieldChar"> @@ -366,6 +369,9 @@ t-att-id="widget.element_id + '_field'" t-att-class="'field_' + widget.type"/> </t> +<t t-name="FieldProgressBar"> + <div t-opentag="true"></div> +</t> <t t-name="WidgetButton"> <button type="button" t-att-id="widget.element_id + '_button'" @@ -528,27 +534,33 @@ <input t-att-id="element_id"/> </t> <t t-name="ViewManager.sidebar"> - <div t-att-id="element_id" class="sidebar-main-div"> + <div t-att-id="element_id" class="sidebar-main-div open-sidebar"> </div> </t> <t t-name="ViewManager.sidebar.internal"> - <t t-if="sections.length > 0 && _.detect(sections, function(x) {return x.elements.length > 0;}) != undefined"> - <div t-att-id="element_id" class="sidebar-sub-div"> - <t t-set="i" t-value="0"/> - <t t-foreach="sections" t-as="section"> - <t t-if="section.elements.length > 0"> - <ul> - <t t-set="j" t-value="0"/> - <t t-foreach="section.elements" t-as="element"> - <li><a t-att-data-i="i" t-att-data-j="j" href="#"><t t-esc="element.name"/></a></li> - <t t-set="j" t-value="j+1"/> - </t> - </ul> - </t> - <t t-set="i" t-value="i+1"/> - </t> - </div> + <t t-set="the_condition" t-value="sections.length > 0 && _.detect(sections, function(x) + {return x.elements.length > 0;}) != undefined"/> + <t t-if="the_condition"> + <a class="toggle-sidebar"></a> + <div t-att-id="element_id" class="sidebar-sub-div"> + <div class="sidebar-displaying-div"> + <t t-set="i" t-value="0"/> + <t t-foreach="sections" t-as="section"> + <t t-if="section.elements.length > 0"> + <h2><t t-esc="section.label"/></h2> + <ul> + <t t-set="j" t-value="0"/> + <t t-foreach="section.elements" t-as="element"> + <li><a t-att-data-i="i" t-att-data-j="j" href="#"><t t-esc="element.name"/></a></li> + <t t-set="j" t-value="j+1"/> + </t> + </ul> + </t> + <t t-set="i" t-value="i+1"/> + </t> + </div> + </div> </t> </t> <t t-name="DialogWarning"> |
