summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorRoberto López López (OpenERP) <rlo@openerp.com>2011-12-22 12:52:43 +0100
committerRoberto López López (OpenERP) <rlo@openerp.com>2011-12-22 12:52:43 +0100
commit7b2ece8ddc6712af1582dab7c4050cd680d69c36 (patch)
treed3fee08c2be9645aff5b29a8e90b430360ac2cdc /addons/web/static/src
parentb3f7278d12a9409a112b5a4f8ef7ef182ef6538d (diff)
parente6e2a6f7db438b46e19944cbd591691a3bc2e0e6 (diff)
merge
bzr revid: rlo@openerp.com-20111222115243-ht5rqa4j5bl7ie96
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/css/base.css511
-rw-r--r--addons/web/static/src/img/iconset-a-help.gifbin0 -> 379 bytes
-rw-r--r--addons/web/static/src/img/iconset-a-help.pngbin0 -> 498 bytes
-rw-r--r--addons/web/static/src/img/logo2.pngbin0 -> 3600 bytes
-rw-r--r--addons/web/static/src/img/pager_first.pngbin0 -> 1570 bytes
-rw-r--r--addons/web/static/src/img/pager_last.pngbin0 -> 1564 bytes
-rw-r--r--addons/web/static/src/img/pager_next.pngbin0 -> 3273 bytes
-rw-r--r--addons/web/static/src/img/pager_previous.pngbin0 -> 3276 bytes
-rw-r--r--addons/web/static/src/img/pattern.pngbin0 -> 98 bytes
-rw-r--r--addons/web/static/src/img/sep-a.gifbin0 -> 43 bytes
-rw-r--r--addons/web/static/src/img/views-icons-a.pngbin0 -> 1224 bytes
-rw-r--r--addons/web/static/src/js/chrome.js80
-rw-r--r--addons/web/static/src/js/core.js88
-rw-r--r--addons/web/static/src/js/data.js16
-rw-r--r--addons/web/static/src/js/data_export.js6
-rw-r--r--addons/web/static/src/js/data_import.js8
-rw-r--r--addons/web/static/src/js/search.js89
-rw-r--r--addons/web/static/src/js/view_editor.js17
-rw-r--r--addons/web/static/src/js/view_form.js311
-rw-r--r--addons/web/static/src/js/view_list.js33
-rw-r--r--addons/web/static/src/js/view_list_editable.js2
-rw-r--r--addons/web/static/src/js/view_page.js13
-rw-r--r--addons/web/static/src/js/views.js76
-rw-r--r--addons/web/static/src/xml/base.xml271
24 files changed, 1035 insertions, 486 deletions
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index 5624f6d0740..59407fd40ee 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -17,6 +17,10 @@ body.openerp, .openerp textarea, .openerp input, .openerp select, .openerp optio
padding: 0 8px 8px 8px;
}
+.openerp .oe_form_frame_cell .view-manager-main-content {
+ padding: 0;
+}
+
.oe_box {
border: 1px solid #aaf;
padding: 2px;
@@ -88,12 +92,6 @@ body.openerp, .openerp textarea, .openerp input, .openerp select, .openerp optio
.openerp .login {
display: none;
}
-.openerp .login form {
- float: left;
- width: 420px;
- margin-left: 40px;
- margin-bottom: 60px;
-}
.openerp .login fieldset {
padding-bottom: 5px;
min-width: 100px;
@@ -133,19 +131,27 @@ body.openerp, .openerp textarea, .openerp input, .openerp select, .openerp optio
}
.openerp .login .login_error_message {
display: none;
- background-color: #9A0404;
- border-radius: 3px;
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- color: white;
+ background-color: #b41616;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
+ -box-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
+ filter: alpha(opacity=95);
+ -khtml-opacity: 0.95;
+ -moz-opacity: 0.95;
+ color: #eee;
font-size: 16px;
- font-weight: bold;
- padding: 5px;
- margin-top: 5px;
+ padding: 8px 12px;
+ margin-top: 15px;
+ text-align: center;
+}
+.openerp .login .login_invalid {
text-align: center;
}
.openerp .login .login_invalid .login_error_message {
- display: block;
+ display: inline-block;
}
.openerp.login-mode .login-container {
@@ -157,6 +163,8 @@ body.openerp, .openerp textarea, .openerp input, .openerp select, .openerp optio
.openerp.login-mode .menu,
.openerp.login-mode .secondary_menu,
.openerp.login-mode .oe-application,
+.openerp.login-mode .oe_footer,
+.openerp.login-mode .header,
.openerp.login-mode .db_options_row {
display: none;
}
@@ -240,6 +248,9 @@ label.error {
height: 100%;
background: #f0eeee;
}
+.openerp .oe-application {
+ height: 100%;
+}
.openerp .oe-application-container {
width: 100%;
height: 100%;
@@ -545,9 +556,9 @@ label.error {
color: #666666;
}
+
/* Main Application */
-.openerp .oe-main-content,
-.openerp .oe-application {
+.openerp .oe-main-content {
padding: 0;
height: 100%;
}
@@ -559,6 +570,10 @@ label.error {
color: #252424;
text-shadow: white 0 1px 0;
}
+.openerp div[id^="notebook"] .oe_view_title {
+ font-size:85%;
+ padding-bottom:4px;
+}
/* View Manager */
.openerp .oe_vm_switch {
@@ -566,6 +581,7 @@ label.error {
}
.openerp .oe-view-manager-header .oe_view_title {
font-size:150%;
+ padding:2px 0 0 0;
}
/* SearchView */
@@ -669,7 +685,6 @@ label.error {
color: #7D7979;
font-weight: bold;
padding: 2px 0 2px 10px;
- margin-top: 4px;
text-decoration: none;
}
.openerp .searchview_group_string:hover {
@@ -686,6 +701,7 @@ label.error {
}
.openerp .searchview_group.expanded .searchview_group_content {
display: block;
+ padding-bottom:3px;
}
.openerp .searchview_group_content .oe_label, .openerp .searchview_group_content .oe_label_help {
@@ -722,11 +738,16 @@ label.error {
}
.openerp .oe_search-view-buttons {
- padding: 10px 0 10px 0;
+ padding: 2px 0 10px 0;
+ vertical-align:middle;
}
.openerp .oe_search-view-filters-management {
float: right;
}
+.openerp .oe_search-view-filters-management, .openerp .oe_search-view-custom-filter-btn {
+ float:right;
+}
+
.openerp .searchview_extended_add_proposition span {
font-size: 0.9em;
background: url(/web/static/src/img/icons/gtk-add.png) repeat-y;
@@ -749,7 +770,7 @@ label.error {
padding-left: 18px;
}
/* List */
-.openerp .oe-listview table {
+.openerp table.oe-listview-content {
clear: right;
width: 100%;
border-spacing: 0;
@@ -774,7 +795,7 @@ label.error {
background: none;
}
-.openerp .oe-listview td,
+.openerp .oe-listview > table > tbody > tr > td,
.openerp .oe-listview th {
vertical-align: middle;
text-align: left;
@@ -794,7 +815,7 @@ label.error {
}
/* Could use :not selectors if they were supported by MSIE8... */
-.openerp .oe-listview tbody td {
+.openerp .oe-listview > table > tbody > tr > td {
border-left: 1px solid #dadada; /*currently commenting to test with no vertical lines in list view*/
}
.openerp .oe-listview tbody td:first-child,
@@ -825,10 +846,15 @@ label.error {
vertical-align: middle;
}
-.openerp .oe-listview table tbody td {
+.openerp .oe-listview > table > tbody > tr > td {
border-bottom: 1px solid #E3E3E3;
}
+
+.openerp .oe-listview td.oe-actions {
+ border-bottom:none;
+}
+
.openerp .oe-listview .oe-record-selector, .openerp .oe-listview .oe-record-edit-link {
border-bottom: 1px solid #E3E3E3;
}
@@ -847,12 +873,16 @@ label.error {
.openerp .oe-listview .oe-field-cell progress {
width: 100%;
}
-.openerp .oe-listview .oe-field-cell button {
+.openerp .oe-listview .oe-field-cell.oe-button button,
+.openerp .oe-listview .oe_form_button button {
margin: 0;
padding: 0;
border: none;
background: none;
width: 16px;
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
}
.openerp .oe-listview .oe-field-cell button:active {
opacity: 0.5;
@@ -878,6 +908,22 @@ label.error {
color: #555;
}
+.openerp .oe_button.oe_button_pager,
+.openerp .oe-list-pager > span,
+.openerp .oe_form_pager > span {
+ line-height: 17px;
+ height: 17px;
+ cursor: pointer;
+ color: gray;
+ font-weight: bold;
+ vertical-align: middle;
+}
+.openerp .oe_button.oe_button_pager,
+.openerp .oe_button.oe_button_pager:disabled {
+ padding: 0 3px 0 3px;
+ margin: 0;
+ height: 17px;
+}
.openerp .oe-listview .oe-group-name {
padding-right: 1em;
}
@@ -1075,6 +1121,9 @@ label.error {
font-weight: bold;
font-size: 13px;
}
+.openerp .oe_tooltip_help {
+ white-space: pre-wrap;
+}
.openerp .oe_tooltip_technical {
padding: 0 0 4px 0;
margin: 5px 0 0 15px;
@@ -1085,7 +1134,7 @@ label.error {
}
.openerp .oe_forms label.oe_label, .openerp .oe_forms label.oe_label_help {
- margin: 4px 0 0 3px;
+ margin: 3px 0 0 3px;
white-space: nowrap;
}
.openerp .oe_forms .searchview_group_content label.oe_label, .openerp .searchview_group_content .oe_forms label.oe_label_help { /* making a distinction between labels in search view and other labels */
@@ -1124,21 +1173,45 @@ label.error {
.openerp .oe_form_readonly {
}
-.openerp .oe_form_readonly .field_char, .openerp .oe_form_readonly .oe_form_field_email {
- padding-top: 4px;
+.openerp .oe_form_readonly .oe_form_frame_cell .field_text,
+.openerp .oe_form_readonly .field_char,
+.openerp .oe_form_readonly .field_int,
+.openerp .oe_form_readonly .field_float,
+.openerp .oe_form_readonly .field_email,
+.openerp .oe_form_readonly .field_date,
+.openerp .oe_form_readonly .field_selection,
+.openerp .oe_forms_readonly .oe_form_field_many2one {
+ padding: 3px 2px 2px 2px;
background-color: white;
+ height: 17px;
+}
+.openerp .oe_form_readonly .oe_form_frame_cell .field_text {
+ height: auto;
+}
+.openerp .oe_form_readonly .field_datetime {
+ padding: 1px 2px 2px 2px;
+ background-color: white;
+ height:19px;
+}
+.openerp .oe_form_readonly .oe_form_field_many2one div {
+ background-color:white;
+ height:18px;
+ margin-bottom:1px;
+ padding: 0px 2px 5px 2px;
}
-.openerp .oe_form_readonly .field_selection {
- padding-top: 2px;
+.openerp .oe_form_readonly .oe_form_field_email div {
background-color: white;
+ padding: 1px 2px 3px 2px;
}
+
.openerp .oe_form_readonly .oe_form_field_text div.field_text {
white-space: pre-wrap;
}
-
-
+.openerp .oe_form_readonly .oe_form_frame_cell .field_text {
+ min-height:100px;
+}
/* Inputs */
.openerp .oe_forms input[type="text"], .openerp .oe_forms input[type="password"], .openerp .oe_forms select, .openerp .oe_forms textarea {
-moz-box-sizing: border-box;
@@ -1155,6 +1228,40 @@ label.error {
min-width: 90px;
color: #1f1f1f;
}
+
+.openerp .oe_forms input.field_many2one,
+.openerp .oe_forms input.field_binary,
+.openerp .oe_forms input.field_binary,
+.openerp .oe_forms input.field_email,
+.openerp .oe_forms input.field_url {
+ border-right: none;
+ -webkit-border-top-right-radius: 0px;
+ -webkit-border-bottom-right-radius: 0px;
+ -moz-border-radius-topright: 0px;
+ -moz-border-radius-bottomright: 0px;
+ border-top-right-radius: 0px;
+ border-bottom-right-radius: 0px;
+}
+.openerp .oe_button.oe_field_button {
+ -webkit-border-top-left-radius: 0px;
+ -webkit-border-bottom-left-radius: 0px;
+ -moz-border-radius-topleft: 0px;
+ -moz-border-radius-bottomleft: 0px;
+ border-top-left-radius: 0px;
+ border-bottom-left-radius: 0px;
+ margin-right:-1px;
+ height: 22px;
+}
+
+.openerp .oe_form_field_email button img,
+.openerp .oe_form_field_url button img {
+ vertical-align: top;
+}
+/* vertically recentering filter management select tag */
+.openerp select.oe_search-view-filters-management {
+ margin-top:2px;
+}
+
.openerp .oe_forms select{
padding-top: 2px;
}
@@ -1169,10 +1276,11 @@ label.error {
.openerp .oe_forms input[type="text"], .openerp .oe_forms input[type="password"], .openerp .oe_forms select, .openerp .oe_forms .oe_button {
height: 22px;
}
+
.openerp .oe_forms input.field_datetime {
min-width: 11em;
}
-.openerp .oe_forms .oe_button {
+.openerp .oe_forms .oe_form_button .oe_button {
color: #4c4c4c;
white-space: nowrap;
min-width: 100%;
@@ -1293,8 +1401,11 @@ label.error {
border-spacing: 4px;
}
.openerp .ui-widget-header {
- background-image: none;
- background-color: white;
+ background: white none;
+}
+/* progress bars */
+.openerp .ui-progressbar .ui-widget-header {
+ background: #cccccc url(/web/static/lib/jquery.ui/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
}
/* Sidebar */
@@ -1311,10 +1422,17 @@ label.error {
.openerp .oe-view-manager-header {
overflow: auto;
+ background: url("/web/static/src/img/sep-a.gif") 0 100% repeat-x;
+ margin:6px 0 6px 2px;
+}
+.openerp .oe_form_frame_cell .oe-view-manager-header { /* Trick: remove the background when element is in a formular */
+ background: none;
}
+
.openerp .oe-view-manager-header h2 {
float: left;
}
+
.openerp .oe_view_manager_menu_tips blockquote {
display: none;
font-size: 85%;
@@ -1328,9 +1446,12 @@ label.error {
margin: 0;
padding: 6px 1px 4px;
}
+
.openerp .oe_view_manager_menu_tips blockquote div {
text-align: right;
+ margin-right:10px;
}
+
.openerp .oe_view_manager_menu_tips blockquote div button {
border: none;
background: none;
@@ -1512,6 +1633,10 @@ label.error {
background: 1px 3px url(/web/static/src/img/icons/gtk-print.png) no-repeat;
}
+.openerp .oe_sidebar_print ul {
+ padding-left:8px;
+}
+
.openerp.kitten-mode-activated .main_table {
background: url(http://placekitten.com/g/1500/800) repeat;
}
@@ -1565,22 +1690,18 @@ label.error {
border-color: #828282;
}
-.openerp .oe-m2o {
- padding-right: 20px;
- white-space: nowrap;
-}
-.openerp .oe_forms .oe-m2o input[type="text"] {
- padding-right: 20px;
- padding-top: 2px;
-}
.openerp .oe-m2o-drop-down-button {
- margin-left: -23px;
+ margin-left: -24px;
}
-.openerp .oe-m2o-drop-down-button img,
-.openerp .oe-m2o-cm-button img {
+.openerp .oe-m2o-drop-down-button img {
margin-bottom: -4px;
cursor: pointer;
}
+.openerp .oe-m2o input {
+ border-right: none;
+ margin-right: 0px !important;
+ padding-bottom: 2px !important;
+}
.openerp .oe-m2o-disabled-cm {
color: grey;
}
@@ -1717,6 +1838,22 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
border-color: rgba(0,0,0,0);
border-left-color: #B5B9FF;
}
+.openerp ul.oe-arrow-list li:first-child span:first-child{
+ -webkit-border-top-left-radius: 3px;
+ -moz-border-radius-topleft: 3px;
+ border-top-left-radius: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ border-bottom-left-radius: 3px;
+}
+.openerp ul.oe-arrow-list li:last-child span:last-child{
+ -webkit-border-top-right-radius: 3px;
+ -moz-border-radius-topright: 3px;
+ border-top-right-radius: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+ -moz-border-radius-bottomright: 3px;
+ border-bottom-right-radius: 3px;
+}
.openerp .oe_view_editor {
border-collapse: collapse;
padding: 0;
@@ -1729,9 +1866,10 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
padding: 0;
border-bottom: 1px solid #CFCCCC;
}
-.openerp .oe_view_editor_row:hover{
+.openerp .oe_view_editor_row:hover {
background-color: #F3F3F3;
}
+
.openerp .oe_view_editor_tree_grid{
text-align: left;
white-space: nowrap;
@@ -1787,10 +1925,118 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
.openerp .centeralign{
text-align:center;
}
+
+.openerp .oe_applications_tiles {
+ color: #4C4C4C;
+ text-shadow: #EEE 0 1px 0;
+ margin: 0 20px;
+}
+
+.openerp .oe_vm_switch {
+ margin:2px 0 0 0;
+}
+
+.openerp .oe_vm_switch_form,
+.openerp .oe_vm_switch_page,
+.openerp .oe_vm_switch_list,
+.openerp .oe_vm_switch_graph,
+.openerp .oe_vm_switch_gantt,
+.openerp .oe_vm_switch_calendar,
+.openerp .oe_vm_switch_kanban,
+.openerp .oe_vm_switch_diagram {
+ background: url("/web/static/src/img/views-icons-a.png") repeat-x scroll left top transparent;
+ overflow: hidden;
+ width: 22px;
+ height: 21px;
+ border: none;
+ background-position: 0px 0px;
+}
+
+.openerp .oe_vm_switch_form span,
+.openerp .oe_vm_switch_page span,
+.openerp .oe_vm_switch_list span,
+.openerp .oe_vm_switch_graph span,
+.openerp .oe_vm_switch_gantt span,
+.openerp .oe_vm_switch_calendar span,
+.openerp .oe_vm_switch_kanban span,
+.openerp .oe_vm_switch_diagram span {
+ display: none;
+}
+
+.openerp .oe_vm_switch_list {
+ background-position: 0px 0px;
+}
+.openerp .oe_vm_switch_list:active,
+.openerp .oe_vm_switch_list:hover,
+.openerp .oe_vm_switch_list:focus,
+.openerp .oe_vm_switch_list[disabled="disabled"] {
+ background-position: 0px -21px;
+}
+
+.openerp .oe_vm_switch_form {
+ background-position: -22px 0px;
+}
+.openerp .oe_vm_switch_form:active,
+.openerp .oe_vm_switch_form:hover,
+.openerp .oe_vm_switch_form:focus,
+.openerp .oe_vm_switch_form[disabled="disabled"] {
+ background-position: -22px -21px;
+}
+
+.openerp .oe_vm_switch_graph {
+ background-position: -44px 0px;
+}
+.openerp .oe_vm_switch_graph:active,
+.openerp .oe_vm_switch_graph:hover,
+.openerp .oe_vm_switch_graph:focus,
+.openerp .oe_vm_switch_graph[disabled="disabled"] {
+ background-position: -44px -21px;
+}
+
+.openerp .oe_vm_switch_gantt {
+ background-position: -66px 0px;
+}
+.openerp .oe_vm_switch_gantt:active,
+.openerp .oe_vm_switch_gantt:hover,
+.openerp .oe_vm_switch_gantt:focus,
+.openerp .oe_vm_switch_gantt[disabled="disabled"] {
+ background-position: -66px -21px;
+}
+
+.openerp .oe_vm_switch_calendar {
+ background-position: -88px 0px;
+}
+.openerp .oe_vm_switch_calendar:active,
+.openerp .oe_vm_switch_calendar:hover,
+.openerp .oe_vm_switch_calendar:focus,
+.openerp .oe_vm_switch_calendar[disabled="disabled"] {
+ background-position: -88px -21px;
+}
+.openerp .oe_vm_switch_kanban {
+ background-position: -110px 0px;
+}
+.openerp .oe_vm_switch_kanban:active,
+.openerp .oe_vm_switch_kanban:hover,
+.openerp .oe_vm_switch_kanban:focus,
+.openerp .oe_vm_switch_kanban[disabled="disabled"] {
+ background-position: -110px -21px;
+}
+
+.openerp .oe_vm_switch_diagram {
+ background-position: 0px 0px;
+}
+.openerp .oe_vm_switch_diagram:active,
+.openerp .oe_vm_switch_diagram:hover,
+.openerp .oe_vm_switch_diagram:focus,
+.openerp .oe_vm_switch_diagram[disabled="disabled"] {
+ background-position: 0px -21px;
+}
+
+>>>>>>> MERGE-SOURCE
/* Buttons */
-.openerp a.button:link,
-.openerp a.button:visited,
-.openerp button {
+.openerp .oe_button:link,
+.openerp .oe_button:visited,
+.openerp .oe_button {
display: inline-block;
border: 1px solid #ababab;
color: #404040;
@@ -1821,8 +2067,7 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
outline: none;
}
-.openerp a.button:hover,
-.openerp button:hover {
+.openerp .oe_button:hover {
-o-background-size: 100% 100%;
-moz-background-size: 100% 100%;
-webkit-background-size: auto auto !important;
@@ -1836,8 +2081,7 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
cursor: pointer;
}
-.openerp a.button:focus,
-.openerp button:focus {
+.openerp .oe_button:focus {
border: 1px solid #80bfff;
-o-background-size: 100% 100%;
-moz-background-size: 100% 100%;
@@ -1855,10 +2099,8 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
box-shadow: 0 0 3px #80bfff, 0 1px 1px rgba(255, 255, 255, 0.8) inset;
}
-.openerp a.button:active,
-.openerp a.button.active,
-.openerp button:active,
-.openerp button.active {
+.openerp .oe_button:active,
+.openerp .oe_button.active {
background: #e3e3e3;
background: -moz-linear-gradient(top, #e3e3e3, #f6f6f6) #1b468f;
background: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#f6f6f6)) #1b468f;
@@ -1869,8 +2111,8 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
box-shadow: none, 0 0 0 transparent;
}
-.openerp a.button.disabled,
-.openerp button:disabled {
+.openerp .oe_button.disabled,
+.openerp .oe_button:disabled {
background: #efefef !important;
border: 1px solid #d1d1d1 !important;
font-size: 12px;
@@ -1884,3 +2126,154 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
text-shadow: 0 1px 1px white !important;
>>>>>>> MERGE-SOURCE
}
+
+/* Login page */
+
+#oe_login {
+ padding: 0;
+ margin: 0;
+ font-family: "Lucida Grande", Helvetica, Verdana, Arial;
+ background: url("/web/static/src/img/pattern.png") repeat;
+ color: #eee;
+ font-size: 14px;
+ height: 100%;
+}
+
+#oe_login ul, ol {
+ padding: 0;
+ margin: 0;
+}
+
+#oe_login li {
+ list-style-type: none;
+ padding-bottom: 4px;
+}
+
+#oe_login a {
+ color: #eee;
+ text-decoration: none;
+}
+
+#oe_login button {
+ float: right;
+ display: inline-block;
+ cursor: pointer;
+ padding: 6px 16px;
+ font-size: 13px;
+ font-family: "Lucida Grande", Helvetica, Verdana, Arial;
+ border: 1px solid #222222;
+ color: white;
+ margin: 0;
+ background: #600606;
+ background: -moz-linear-gradient(#b92020, #600606);
+ background: -webkit-gradient(linear, left top, left bottom, from(#b92020), to(#600606));
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(155, 155, 155, 0.4) inset;
+ -o-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
+}
+
+#oe_login input, #oe_login select {
+ width: 250px;
+ margin-bottom: 10px;
+ font-size: 14px;
+ padding: 5px 6px;
+ border: 1px solid #999999;
+ background: whitesmoke;
+ -moz-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);
+ -webkit-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);
+ -box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+}
+
+#oe_login .dbpane {
+ position: fixed;
+ top: 0;
+ right: 8px;
+ padding: 6px 12px 0px;
+ color: #eee;
+ border: solid 1px #333;
+ background: #101010;
+ filter: alpha(opacity=95);
+ -khtml-opacity: 0.95;
+ -moz-opacity: 0.95;
+ opacity: 0.95;
+ -moz-border-radius: 0 0 8px 8px;
+ -webkit-border-radius: 0 0 8px 8px;
+ border-radius: 0 0 8px 8px;
+}
+
+#oe_login .bottom {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ text-shadow: 0 1px 1px #999999;
+ background: #600606;
+ background: -moz-linear-gradient(#b41616, #600606);
+ background: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606));
+}
+
+#oe_login .pane {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin: -160px -166px;
+ border: solid 1px #333333;
+ background: #101010;
+ padding: 20px 32px;
+ text-align: left;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ border-radius: 8px;
+ -moz-box-shadow: 0 0 18px rgba(0, 0, 0, 0.9);
+ -webkit-box-shadow: 0 0 18px rgba(0, 0, 0, 0.9);
+ -box-shadow: 0 0 18px rgba(0, 0, 0, 0.9);
+ filter: alpha(opacity=95);
+ -khtml-opacity: 0.95;
+ -moz-opacity: 0.95;
+ opacity: 0.95;
+}
+
+#oe_login .pane h2 {
+ margin-top: 0;
+ font-size: 18px;
+}
+
+#oe_login #logo {
+ position: absolute;
+ top: -70px;
+ left: 0;
+ width: 100%;
+ margin: 0 auto;
+ text-align: center;
+}
+
+#oe_login .footer {
+ position: absolute;
+ bottom: -40px;
+ left: 0;
+ width: 100%;
+ text-align: center;
+}
+
+#oe_login .footer a {
+ font-size: 13px;
+ margin: 0 8px;
+}
+
+#oe_login .footer a:hover {
+ text-decoration: underline;
+}
+
+#oe_login .openerp {
+ font-weight: bold;
+ font-family: serif;
+ font-size: 16px;
+}
diff --git a/addons/web/static/src/img/iconset-a-help.gif b/addons/web/static/src/img/iconset-a-help.gif
new file mode 100644
index 00000000000..5400acec57b
--- /dev/null
+++ b/addons/web/static/src/img/iconset-a-help.gif
Binary files differ
diff --git a/addons/web/static/src/img/iconset-a-help.png b/addons/web/static/src/img/iconset-a-help.png
new file mode 100644
index 00000000000..4af5ac170d6
--- /dev/null
+++ b/addons/web/static/src/img/iconset-a-help.png
Binary files differ
diff --git a/addons/web/static/src/img/logo2.png b/addons/web/static/src/img/logo2.png
new file mode 100644
index 00000000000..aca5f4c60d8
--- /dev/null
+++ b/addons/web/static/src/img/logo2.png
Binary files differ
diff --git a/addons/web/static/src/img/pager_first.png b/addons/web/static/src/img/pager_first.png
new file mode 100644
index 00000000000..83074ed696f
--- /dev/null
+++ b/addons/web/static/src/img/pager_first.png
Binary files differ
diff --git a/addons/web/static/src/img/pager_last.png b/addons/web/static/src/img/pager_last.png
new file mode 100644
index 00000000000..dedcede4b62
--- /dev/null
+++ b/addons/web/static/src/img/pager_last.png
Binary files differ
diff --git a/addons/web/static/src/img/pager_next.png b/addons/web/static/src/img/pager_next.png
new file mode 100644
index 00000000000..9b5e7090735
--- /dev/null
+++ b/addons/web/static/src/img/pager_next.png
Binary files differ
diff --git a/addons/web/static/src/img/pager_previous.png b/addons/web/static/src/img/pager_previous.png
new file mode 100644
index 00000000000..7134186008c
--- /dev/null
+++ b/addons/web/static/src/img/pager_previous.png
Binary files differ
diff --git a/addons/web/static/src/img/pattern.png b/addons/web/static/src/img/pattern.png
new file mode 100644
index 00000000000..7e3a2b37834
--- /dev/null
+++ b/addons/web/static/src/img/pattern.png
Binary files differ
diff --git a/addons/web/static/src/img/sep-a.gif b/addons/web/static/src/img/sep-a.gif
new file mode 100644
index 00000000000..5a064f21e89
--- /dev/null
+++ b/addons/web/static/src/img/sep-a.gif
Binary files differ
diff --git a/addons/web/static/src/img/views-icons-a.png b/addons/web/static/src/img/views-icons-a.png
new file mode 100644
index 00000000000..0be5b655e66
--- /dev/null
+++ b/addons/web/static/src/img/views-icons-a.png
Binary files differ
diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js
index 468127f8810..b898472a6b2 100644
--- a/addons/web/static/src/js/chrome.js
+++ b/addons/web/static/src/js/chrome.js
@@ -51,15 +51,19 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
this._super(parent);
this.dialog_options = {
modal: true,
- width: 'auto',
+ destroy_on_close: true,
+ width: $(window).width() * (($(window).width() > 1024) ? 0.5 : 0.75),
min_width: 0,
- max_width: '100%',
+ max_width: '95%',
height: 'auto',
min_height: 0,
- max_height: '100%',
+ max_height: '95%',
autoOpen: false,
+ position: [false, 50],
+ autoResize : 'auto',
buttons: {},
- beforeClose: function () { self.on_close(); }
+ beforeClose: function () { self.on_close(); },
+ resizeStop: this.on_resized
};
for (var f in this) {
if (f.substr(0, 10) == 'on_button_') {
@@ -77,7 +81,7 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
options.max_width = this.get_width(options.max_width || this.dialog_options.max_width);
options.height = this.get_height(options.height || this.dialog_options.height);
options.min_height = this.get_height(options.min_height || this.dialog_options.min_height);
- options.max_height = this.get_height(options.max_height || this.dialog_options.max_width);
+ options.max_height = this.get_height(options.max_height || this.dialog_options.max_height);
if (options.width !== 'auto') {
if (options.width > options.max_width) options.width = options.max_width;
@@ -108,7 +112,7 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
}
},
start: function () {
- this.$dialog = $(this.$element).dialog(this.dialog_options);
+ this.$element.dialog(this.dialog_options);
this._super();
return this;
},
@@ -118,19 +122,26 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
this.$element.html(this.render());
}
this.set_options(dialog_options);
- this.$dialog.dialog(this.dialog_options).dialog('open');
+ this.$element.dialog(this.dialog_options).dialog('open');
return this;
},
close: function() {
- // Closes the dialog but leave it in a state where it could be opened again.
- this.$dialog.dialog('close');
+ this.$element.dialog('close');
},
on_close: function() {
+ if (this.dialog_options.destroy_on_close) {
+ this.$element.dialog('destroy');
+ }
+ },
+ on_resized: function() {
+ if (openerp.connection.debug) {
+ console.log("Dialog resized to %d x %d", this.$element.width(), this.$element.height());
+ }
},
stop: function () {
// Destroy widget
this.close();
- this.$dialog.dialog('destroy');
+ this.$element.dialog('destroy');
this._super();
}
});
@@ -196,10 +207,10 @@ openerp.web.ServerError = openerp.web.Dialog.extend({
// Call the send method from server to send mail with details
new openerp.web.DataSet(self, 'publisher_warranty.contract').call_and_eval('send', [self.error.data,explanation,remark,issuename]).then(function(result){
- if (result === false) (
- alert('There was a communication error.'))
- console.log(arguments);
- });
+ if (result === false) (
+ alert('There was a communication error.'))
+ console.log(arguments);
+ });
});
if (!self.session.has_pwc) {
@@ -561,10 +572,7 @@ openerp.web.Login = openerp.web.Widget.extend(/** @lends openerp.web.Login# */{
this.has_local_storage = typeof(localStorage) != 'undefined';
this.selected_db = null;
this.selected_login = null;
- // var self = this;
- new openerp.web.DataSet(this, 'publisher_warranty.contract');//.call_and_eval('status', []);//.then(function(res) {
-// this.contract = res.status;
- //});
+ new openerp.web.DataSet(this, 'publisher_warranty.contract');
if (this.has_local_storage && this.remember_credentials) {
this.selected_db = localStorage.getItem('last_db_login_success');
@@ -573,15 +581,6 @@ openerp.web.Login = openerp.web.Widget.extend(/** @lends openerp.web.Login# */{
this.selected_password = localStorage.getItem('last_password_login_success');
}
}
-
- var qs = jQuery.deparam(jQuery.param.querystring());
- if (qs.db) {
- this.selected_db = qs.db;
- }
- if (qs.login) {
- this.selected_login = qs.login;
- }
-
},
start: function() {
var self = this;
@@ -621,7 +620,9 @@ openerp.web.Login = openerp.web.Widget.extend(/** @lends openerp.web.Login# */{
this.$element.closest(".openerp").removeClass("login-mode");
},
on_submit: function(ev) {
- ev.preventDefault();
+ if(ev) {
+ ev.preventDefault();
+ }
var $e = this.$element;
var db = $e.find("form [name=db]").val();
var login = $e.find("form input[name=login]").val();
@@ -792,10 +793,8 @@ openerp.web.Header = openerp.web.Widget.extend(/** @lends openerp.web.Header# *
});
});
this.dialog = new openerp.web.Dialog(this,{
- modal: true,
title: _t("Preferences"),
- width: 600,
- height: 500,
+ width: '700px',
buttons: [
{text: _t("Change password"), click: function(){ self.change_password(); }},
{text: _t("Cancel"), click: function(){ $(this).dialog('destroy'); }},
@@ -817,11 +816,9 @@ openerp.web.Header = openerp.web.Widget.extend(/** @lends openerp.web.Header# *
change_password :function() {
var self = this;
- this.dialog = new openerp.web.Dialog(this,{
- modal : true,
+ this.dialog = new openerp.web.Dialog(this, {
title: _t("Change Password"),
- width : 'auto',
- height : 'auto'
+ width : 'auto'
});
this.dialog.start().open();
this.dialog.$element.html(QWeb.render("Change_Pwd", self));
@@ -1012,6 +1009,7 @@ openerp.web.Menu = openerp.web.Widget.extend(/** @lends openerp.web.Menu# */{
var self = this;
if (data.action.length) {
var action = data.action[0][2];
+ action.from_menu = true;
self.on_action(action);
} else {
self.on_action({type: 'null_action'});
@@ -1064,7 +1062,11 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
self.header.appendTo($("#oe_header"));
self.login.appendTo($('#oe_login'));
self.menu.start();
- self.login.on_login_invalid();
+ if(self.session.session_is_valid()) {
+ self.login.on_login_valid();
+ } else {
+ self.login.on_login_invalid();
+ }
});
this.session.ready.then(function() {
self.login.on_login_valid();
@@ -1082,7 +1084,7 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
});
},
do_reload: function() {
- return $.when(this.session.session_init(),this.menu.do_reload());
+ return this.session.session_init().pipe(_.bind(function() {this.menu.do_reload();}, this));
},
do_notify: function() {
var n = this.notification;
@@ -1130,7 +1132,7 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
do_action: function(action) {
var self = this;
// TODO replace by client action menuclick
- if(action.type === "ir.ui.menu") {
+ if(action.menu_id) {
this.do_reload().then(function () {
self.menu.on_menu_click(null, action.menu_id);
});
@@ -1179,7 +1181,7 @@ openerp.web.embed = function (origin, dbname, login, key, action, options) {
currentScript = sc[sc.length-1];
}
openerp.connection.bind(origin).then(function () {
- openerp.connection.session_authenticate(dbname, login, key).then(function () {
+ openerp.connection.session_authenticate(dbname, login, key, true).then(function () {
var client = new openerp.web.EmbeddedClient(action, options);
client.insertAfter(currentScript);
});
diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js
index 018a474ddbc..f4608a26491 100644
--- a/addons/web/static/src/js/core.js
+++ b/addons/web/static/src/js/core.js
@@ -359,6 +359,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
this.debug = ($.deparam($.param.querystring()).debug != undefined);
// TODO: session store in cookie should be optional
this.name = openerp._session_id;
+ this.qweb_mutex = new $.Mutex();
},
bind: function(origin) {
var window_origin = location.protocol+"//"+location.host;
@@ -461,6 +462,8 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
data: JSON.stringify(payload),
processData: false,
}, url);
+ if (this.synch)
+ ajax.async = false;
return $.ajax(ajax);
},
rpc_jsonp: function(url, payload) {
@@ -478,6 +481,8 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
cache: false,
data: data
}, url);
+ if (this.synch)
+ ajax.async = false;
var payload_str = JSON.stringify(payload);
var payload_url = $.param({r:payload_str});
if(payload_url.length < 2000) {
@@ -548,8 +553,8 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
has_pwc: result.has_pwc
});
var deferred = self.do_load_qweb(['/web/webclient/qweb']);
- if(self.uid) {
- return deferred.then(self.load_modules());
+ if(self.session_is_valid()) {
+ return deferred.pipe(_.bind(function() { this.load_modules(); }, self));
}
return deferred;
});
@@ -560,7 +565,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
/**
* The session is validated either by login or by restoration of a previous session
*/
- session_authenticate: function(db, login, password) {
+ session_authenticate: function(db, login, password, volatile) {
var self = this;
var base_location = document.location.protocol + '//' + document.location.host;
var params = { db: db, login: login, password: password, base_location: base_location };
@@ -573,8 +578,9 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
user_context: result.context,
has_pwc: result.has_pwc
});
- // TODO: session store in cookie should be optional
- self.set_cookie('session_id', self.session_id);
+ if (!volatile) {
+ self.set_cookie('session_id', self.session_id);
+ }
return self.load_modules();
});
},
@@ -632,25 +638,23 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
if(openerp._modules_loaded) {
return $.when();
}
- this.rpc('/web/session/modules', {}, function(result) {
+ return this.rpc('/web/session/modules', {}).pipe(function(result) {
self.module_list = result;
var lang = self.user_context.lang;
var params = { mods: ["web"].concat(result), lang: lang};
- self.rpc('/web/webclient/translations',params).pipe(function(transs) {
- openerp.web._t.database.set_bundle(transs);
- var modules = self.module_list.join(',');
- var file_list = ["/web/static/lib/datejs/globalization/" +
- self.user_context.lang.replace("_", "-") + ".js"
- ];
- return $.when(
- self.rpc('/web/webclient/csslist', {mods: modules}, self.do_load_css),
- self.rpc('/web/webclient/qweblist', {mods: modules}).pipe(self.do_load_qweb),
- self.rpc('/web/webclient/jslist', {mods: modules}).pipe(function(files) {
+ var modules = self.module_list.join(',');
+ return $.when(
+ self.rpc('/web/webclient/csslist', {mods: modules}, self.do_load_css),
+ self.rpc('/web/webclient/qweblist', {mods: modules}).pipe(self.do_load_qweb),
+ self.rpc('/web/webclient/translations', params).pipe(function(trans) {
+ openerp.web._t.database.set_bundle(trans);
+ var file_list = ["/web/static/lib/datejs/globalization/" + lang.replace("_", "-") + ".js"];
+ return self.rpc('/web/webclient/jslist', {mods: modules}).pipe(function(files) {
return self.do_load_js(file_list.concat(files));
- })
- ).then(function() {
- self.ready.resolve();
- });
+ });
+ })
+ ).then(function() {
+ self.ready.resolve();
});
});
},
@@ -690,15 +694,14 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
},
do_load_qweb: function(files) {
var self = this;
- if (files.length != 0) {
- var file = files.shift();
- return self.rpc('/web/proxy/load', {path: file}).pipe(function(xml) {
- openerp.web.qweb.add_template(_.str.trim(xml));
- return self.do_load_qweb(files);
+ _.each(files, function(file) {
+ self.qweb_mutex.exec(function() {
+ return self.rpc('/web/proxy/load', {path: file}).pipe(function(xml) {
+ openerp.web.qweb.add_template(_.str.trim(xml));
+ });
});
- } else {
- return $.when();
- }
+ });
+ return self.qweb_mutex.def;
},
on_modules_loaded: function() {
for(var j=0; j<this.module_list.length; j++) {
@@ -806,7 +809,16 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
}
};
timer = setTimeout(waitLoop, CHECK_INTERVAL);
- }
+ },
+ synchronized_mode: function(to_execute) {
+ var synch = this.synch;
+ this.synch = true;
+ try {
+ return to_execute();
+ } finally {
+ this.synch = synch;
+ }
+ },
});
/**
@@ -1173,10 +1185,6 @@ openerp.web.qweb.format_text_node = function(s) {
return tr === ts ? s : tr;
}
-/** Setup default connection */
-openerp.connection = new openerp.web.Connection();
-openerp.web.qweb.default_dict['__debug__'] = openerp.connection.debug;
-
/** Jquery extentions */
$.Mutex = (function() {
function Mutex() {
@@ -1194,6 +1202,11 @@ $.Mutex = (function() {
return Mutex;
})();
+/** Setup default connection */
+openerp.connection = new openerp.web.Connection();
+openerp.web.qweb.default_dict['__debug__'] = openerp.connection.debug;
+
+
$.async_when = function() {
var async = false;
var def = $.Deferred();
@@ -1220,6 +1233,15 @@ $.async_when = function() {
return def;
};
+// special tweak for the web client
+var old_async_when = $.async_when;
+$.async_when = function() {
+ if (openerp.connection.synch)
+ return $.when.apply(this, arguments);
+ else
+ return old_async_when.apply(this, arguments);
+};
+
};
// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax:
diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js
index 46393aaf205..a87b6deebda 100644
--- a/addons/web/static/src/js/data.js
+++ b/addons/web/static/src/js/data.js
@@ -252,14 +252,18 @@ openerp.web.DataSet = openerp.web.Widget.extend( /** @lends openerp.web.DataSet
},
previous: function () {
this.index -= 1;
- if (this.index < 0) {
+ if (!this.ids.length) {
+ this.index = null;
+ } else if (this.index < 0) {
this.index = this.ids.length - 1;
}
return this;
},
next: function () {
this.index += 1;
- if (this.index >= this.ids.length) {
+ if (!this.ids.length) {
+ this.index = null;
+ } else if (this.index >= this.ids.length) {
this.index = 0;
}
return this;
@@ -685,7 +689,7 @@ openerp.web.BufferedDataSet = openerp.web.DataSetStatic.extend({
this.set_ids(_.without.apply(_, [this.ids].concat(ids)));
this.on_change();
var to_return = $.Deferred().then(callback);
- setTimeout(function () {to_return.resolve({result: true});}, 0);
+ $.async_when().then(function () {to_return.resolve({result: true});});
return to_return.promise();
},
reset_ids: function(ids) {
@@ -784,7 +788,7 @@ openerp.web.ProxyDataSet = openerp.web.DataSetSearch.extend({
} else {
console.warn("trying to create a record using default proxy dataset behavior");
var to_return = $.Deferred().then(callback);
- setTimeout(function () {to_return.resolve({"result": undefined});}, 0);
+ $.async_when().then(function () {to_return.resolve({"result": undefined});});
return to_return.promise();
}
},
@@ -796,7 +800,7 @@ openerp.web.ProxyDataSet = openerp.web.DataSetSearch.extend({
} else {
console.warn("trying to write a record using default proxy dataset behavior");
var to_return = $.Deferred().then(callback);
- setTimeout(function () {to_return.resolve({"result": true});}, 0);
+ $.async_when().then(function () {to_return.resolve({"result": true});});
return to_return.promise();
}
},
@@ -805,7 +809,7 @@ openerp.web.ProxyDataSet = openerp.web.DataSetSearch.extend({
this.on_unlink(ids);
console.warn("trying to unlink a record using default proxy dataset behavior");
var to_return = $.Deferred().then(callback);
- setTimeout(function () {to_return.resolve({"result": true});}, 0);
+ $.async_when().then(function () {to_return.resolve({"result": true});});
return to_return.promise();
},
on_unlink: function(ids) {}
diff --git a/addons/web/static/src/js/data_export.js b/addons/web/static/src/js/data_export.js
index 8a2d2c8594b..78dc3bef1f9 100644
--- a/addons/web/static/src/js/data_export.js
+++ b/addons/web/static/src/js/data_export.js
@@ -15,10 +15,6 @@ openerp.web.DataExport = openerp.web.Dialog.extend({
var self = this;
this._super.apply(this, arguments);
this.open({
- modal: true,
- width: '55%',
- height: 'auto',
- position: 'top',
buttons : [
{text: _t("Close"), click: function() { self.close(); }},
{text: _t("Export To File"), click: function() { self.on_click_export_data(); }}
@@ -385,7 +381,7 @@ openerp.web.DataExport = openerp.web.Dialog.extend({
});
},
close: function() {
- $(this.$dialog).remove();
+ this.$element.remove();
this._super();
}
});
diff --git a/addons/web/static/src/js/data_import.js b/addons/web/static/src/js/data_import.js
index 3d626db125d..2b252454869 100644
--- a/addons/web/static/src/js/data_import.js
+++ b/addons/web/static/src/js/data_import.js
@@ -65,10 +65,6 @@ openerp.web.DataImport = openerp.web.Dialog.extend({
var self = this;
this._super();
this.open({
- modal: true,
- width: '70%',
- height: 'auto',
- position: 'top',
buttons: [
{text: _t("Close"), click: function() { self.stop(); }},
{text: _t("Import File"), click: function() { self.do_import(); }, 'class': 'oe-dialog-import-button'}
@@ -144,7 +140,7 @@ openerp.web.DataImport = openerp.web.Dialog.extend({
});
},
toggle_import_button: function (newstate) {
- this.$dialog.dialog('widget')
+ this.$element.dialog('widget')
.find('.oe-dialog-import-button')
.button('option', 'disabled', !newstate);
},
@@ -352,7 +348,7 @@ openerp.web.DataImport = openerp.web.Dialog.extend({
return true;
},
stop: function() {
- $(this.$dialog).remove();
+ this.$element.remove();
this._super();
}
});
diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js
index f7825de4411..27441a66eaf 100644
--- a/addons/web/static/src/js/search.js
+++ b/addons/web/static/src/js/search.js
@@ -1,6 +1,7 @@
openerp.web.search = function(openerp) {
var QWeb = openerp.web.qweb,
- _t = openerp.web._t;
+ _t = openerp.web._t,
+ _lt = openerp.web._lt;
openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.SearchView# */{
template: "EmptyComponent",
@@ -894,8 +895,8 @@ openerp.web.search.BooleanField = openerp.web.search.SelectionField.extend(/** @
init: function () {
this._super.apply(this, arguments);
this.attrs.selection = [
- ['true', 'Yes'],
- ['false', 'No']
+ ['true', _t("Yes")],
+ ['false', _t("No")]
];
},
/**
@@ -1193,7 +1194,7 @@ openerp.web.search.ExtendedSearchProposition = openerp.web.OldWidget.extend(/**
* @param field a field descriptor object (as returned by fields_get, augmented by the field name)
*/
select_field: function(field) {
- var _this = this;
+ var self = this;
if(this.attrs.selected != null) {
this.value.stop();
this.value = null;
@@ -1220,9 +1221,9 @@ openerp.web.search.ExtendedSearchProposition = openerp.web.OldWidget.extend(/**
this.value.set_field(field);
}
_.each(this.value.operators, function(operator) {
- var option = jQuery('<option>', {value: operator.value})
- .text(operator.text)
- .appendTo(_this.$element.find('.searchview_extended_prop_op'));
+ $('<option>', {value: operator.value})
+ .text(String(operator.text))
+ .appendTo(self.$element.find('.searchview_extended_prop_op'));
});
this.$element.find('.searchview_extended_prop_value').html(
this.value.render({}));
@@ -1248,14 +1249,14 @@ openerp.web.search.ExtendedSearchProposition.Char = openerp.web.search.ExtendedS
template: 'SearchView.extended_search.proposition.char',
identifier_prefix: 'extended-search-proposition-char',
operators: [
- {value: "ilike", text: _t("contains")},
- {value: "not ilike", text: _t("doesn't contain")},
- {value: "=", text: _t("is equal to")},
- {value: "!=", text: _t("is not equal to")},
- {value: ">", text: _t("greater than")},
- {value: "<", text: _t("less than")},
- {value: ">=", text: _t("greater or equal than")},
- {value: "<=", text: _t("less or equal than")}
+ {value: "ilike", text: _lt("contains")},
+ {value: "not ilike", text: _lt("doesn't contain")},
+ {value: "=", text: _lt("is equal to")},
+ {value: "!=", text: _lt("is not equal to")},
+ {value: ">", text: _lt("greater than")},
+ {value: "<", text: _lt("less than")},
+ {value: ">=", text: _lt("greater or equal than")},
+ {value: "<=", text: _lt("less or equal than")}
],
get_value: function() {
return this.$element.val();
@@ -1265,12 +1266,12 @@ openerp.web.search.ExtendedSearchProposition.DateTime = openerp.web.search.Exten
template: 'SearchView.extended_search.proposition.empty',
identifier_prefix: 'extended-search-proposition-datetime',
operators: [
- {value: "=", text: _t("is equal to")},
- {value: "!=", text: _t("is not equal to")},
- {value: ">", text: _t("greater than")},
- {value: "<", text: _t("less than")},
- {value: ">=", text: _t("greater or equal than")},
- {value: "<=", text: _t("less or equal than")}
+ {value: "=", text: _lt("is equal to")},
+ {value: "!=", text: _lt("is not equal to")},
+ {value: ">", text: _lt("greater than")},
+ {value: "<", text: _lt("less than")},
+ {value: ">=", text: _lt("greater or equal than")},
+ {value: "<=", text: _lt("less or equal than")}
],
get_value: function() {
return this.datewidget.get_value();
@@ -1285,12 +1286,12 @@ openerp.web.search.ExtendedSearchProposition.Date = openerp.web.search.ExtendedS
template: 'SearchView.extended_search.proposition.empty',
identifier_prefix: 'extended-search-proposition-date',
operators: [
- {value: "=", text: _t("is equal to")},
- {value: "!=", text: _t("is not equal to")},
- {value: ">", text: _t("greater than")},
- {value: "<", text: _t("less than")},
- {value: ">=", text: _t("greater or equal than")},
- {value: "<=", text: _t("less or equal than")}
+ {value: "=", text: _lt("is equal to")},
+ {value: "!=", text: _lt("is not equal to")},
+ {value: ">", text: _lt("greater than")},
+ {value: "<", text: _lt("less than")},
+ {value: ">=", text: _lt("greater or equal than")},
+ {value: "<=", text: _lt("less or equal than")}
],
get_value: function() {
return this.datewidget.get_value();
@@ -1305,12 +1306,12 @@ openerp.web.search.ExtendedSearchProposition.Integer = openerp.web.search.Extend
template: 'SearchView.extended_search.proposition.integer',
identifier_prefix: 'extended-search-proposition-integer',
operators: [
- {value: "=", text: _t("is equal to")},
- {value: "!=", text: _t("is not equal to")},
- {value: ">", text: _t("greater than")},
- {value: "<", text: _t("less than")},
- {value: ">=", text: _t("greater or equal than")},
- {value: "<=", text: _t("less or equal than")}
+ {value: "=", text: _lt("is equal to")},
+ {value: "!=", text: _lt("is not equal to")},
+ {value: ">", text: _lt("greater than")},
+ {value: "<", text: _lt("less than")},
+ {value: ">=", text: _lt("greater or equal than")},
+ {value: "<=", text: _lt("less or equal than")}
],
get_value: function() {
try {
@@ -1321,18 +1322,18 @@ openerp.web.search.ExtendedSearchProposition.Integer = openerp.web.search.Extend
}
});
openerp.web.search.ExtendedSearchProposition.Id = openerp.web.search.ExtendedSearchProposition.Integer.extend({
- operators: [{value: "=", text: _t("is")}]
+ operators: [{value: "=", text: _lt("is")}]
});
openerp.web.search.ExtendedSearchProposition.Float = openerp.web.search.ExtendedSearchProposition.Field.extend({
template: 'SearchView.extended_search.proposition.float',
identifier_prefix: 'extended-search-proposition-float',
operators: [
- {value: "=", text: _t("is equal to")},
- {value: "!=", text: _t("is not equal to")},
- {value: ">", text: _t("greater than")},
- {value: "<", text: _t("less than")},
- {value: ">=", text: _t("greater or equal than")},
- {value: "<=", text: _t("less or equal than")}
+ {value: "=", text: _lt("is equal to")},
+ {value: "!=", text: _lt("is not equal to")},
+ {value: ">", text: _lt("greater than")},
+ {value: "<", text: _lt("less than")},
+ {value: ">=", text: _lt("greater or equal than")},
+ {value: "<=", text: _lt("less or equal than")}
],
get_value: function() {
try {
@@ -1346,8 +1347,8 @@ openerp.web.search.ExtendedSearchProposition.Selection = openerp.web.search.Exte
template: 'SearchView.extended_search.proposition.selection',
identifier_prefix: 'extended-search-proposition-selection',
operators: [
- {value: "=", text: _t("is")},
- {value: "!=", text: _t("is not")}
+ {value: "=", text: _lt("is")},
+ {value: "!=", text: _lt("is not")}
],
set_field: function(field) {
this.field = field;
@@ -1360,8 +1361,8 @@ openerp.web.search.ExtendedSearchProposition.Boolean = openerp.web.search.Extend
template: 'SearchView.extended_search.proposition.boolean',
identifier_prefix: 'extended-search-proposition-boolean',
operators: [
- {value: "=", text: _t("is true")},
- {value: "!=", text: _t("is false")}
+ {value: "=", text: _lt("is true")},
+ {value: "!=", text: _lt("is false")}
],
get_value: function() {
return true;
diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js
index f925a6416eb..649f324744d 100644
--- a/addons/web/static/src/js/view_editor.js
+++ b/addons/web/static/src/js/view_editor.js
@@ -38,10 +38,8 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
}
};
this.view_edit_dialog = new openerp.web.Dialog(this, {
- modal: true,
title: _t("ViewEditor"),
- width: 750,
- height: 500,
+ width: 850,
buttons: [
{text: _t("Create"), click: function() { self.on_create_view(); }},
{text: _t("Edit"), click: function() { self.xml_element_id = 0; self.get_arch(); }},
@@ -67,10 +65,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
on_create_view: function() {
var self = this;
this.create_view_dialog = new openerp.web.Dialog(this, {
- modal: true,
title: _.str.sprintf(_t("Create a view (%s)"), self.model),
- width: 500,
- height: 400,
buttons: [
{text: _t("Save"), click: function () {
var view_values = {};
@@ -363,10 +358,8 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
var self = this;
this.one_object = one_object;
this.edit_xml_dialog = new openerp.web.Dialog(this, {
- modal: true,
title: _.str.sprintf(_t("View Editor %d - %s"), self.main_view_id, self.model),
- width: 750,
- height: 500,
+ height: '90%',
buttons: [
{text: _t("Preview"), click: function() {
var action = {
@@ -752,10 +745,8 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
on_edit_node: function(properties){
var self = this;
this.edit_node_dialog = new openerp.web.Dialog(this,{
- modal: true,
title: _t("Properties"),
- width: 500,
- height: 400,
+ width: 450,
buttons: [
{text: _t("Update"), click: function () {
var warn = false, update_values = [];
@@ -879,10 +870,8 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
{'name': 'position','selection': ['After','Before','Inside'], 'value': false, 'string': 'Position','type': 'selection'}];
this.add_widget = [];
this.add_node_dialog = new openerp.web.Dialog(this,{
- modal: true,
title: _t("Properties"),
width: 450,
- height: 190,
buttons: [
{text: _t("Update"), click: function() {
var check_add_node = true, values = {};
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 34bfe15bd4c..85236a0141c 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -22,6 +22,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
* @param {openerp.web.Session} session the current openerp session
* @param {openerp.web.DataSet} dataset the dataset this view will work with
* @param {String} view_id the identifier of the OpenERP view object
+ * @param {Object} options
+ * - sidebar : [true|false]
+ * - resize_textareas : [true|false|max_height]
*
* @property {openerp.web.Registry} registry=openerp.web.form.widgets widgets registry for this form view instance
*/
@@ -60,7 +63,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
if (this.embedded_view) {
var def = $.Deferred().then(this.on_loaded);
var self = this;
- setTimeout(function() {def.resolve(self.embedded_view);}, 0);
+ $.async_when().then(function() {def.resolve(self.embedded_view);});
return def.promise();
} else {
var context = new openerp.web.CompoundContext(this.dataset.get_context());
@@ -132,18 +135,21 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
},
do_show: function () {
- var promise;
- if (this.dataset.index === null) {
- // null index means we should start a new record
- promise = this.on_button_new();
- } else {
- promise = this.dataset.read_index(_.keys(this.fields_view.fields)).pipe(this.on_record_loaded);
- }
- this.$element.show();
- if (this.sidebar) {
- this.sidebar.$element.show();
- }
- return promise;
+ var self = this,
+ deferred = $.Deferred().resolve();
+ this.has_been_loaded.then(function() {
+ if (self.dataset.index === null) {
+ // null index means we should start a new record
+ deferred.pipe(self.on_button_new());
+ } else {
+ deferred.pipe(self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_record_loaded));
+ }
+ self.$element.show();
+ if (self.sidebar) {
+ self.sidebar.$element.show();
+ }
+ });
+ return deferred;
},
do_hide: function () {
this._super();
@@ -223,6 +229,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
do_update_pager: function(hide_index) {
var $pager = this.$form_header.find('div.oe_form_pager');
var index = hide_index ? '-' : this.dataset.index + 1;
+ $pager.find('button').prop('disabled', this.dataset.ids.length < 2)
$pager.find('span.oe_pager_index').html(index);
$pager.find('span.oe_pager_count').html(this.dataset.ids.length);
},
@@ -270,7 +277,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
var splitted = field.split('.');
if (splitted.length > 1 && _.str.trim(splitted[0]) === "parent" && self.dataset.parent_view) {
if (parent_fields === null) {
- parent_fields = self.dataset.parent_view.get_fields_values();
+ parent_fields = self.dataset.parent_view.get_fields_values([self.dataset.child_name]);
}
var p_val = parent_fields[_.str.trim(splitted[1])];
if (p_val !== undefined) {
@@ -528,9 +535,12 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
this.reload_lock = this.reload_lock.pipe(act, act);
return this.reload_lock;
},
- get_fields_values: function() {
+ get_fields_values: function(blacklist) {
+ blacklist = blacklist || [];
var values = {};
_.each(this.fields, function(value, key) {
+ if (_.include(blacklist, key))
+ return;
var val = value.get_value();
values[key] = val;
});
@@ -564,7 +574,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
return true;
},
sidebar_context: function () {
- return this.do_save().pipe($.proxy(this, 'get_fields_values'));
+ return this.do_save().pipe(_.bind(function() {return this.get_fields_values();}, this));
}
});
openerp.web.FormDialog = openerp.web.Dialog.extend({
@@ -641,7 +651,7 @@ openerp.web.form.SidebarAttachments = openerp.web.Widget.extend({
on_attachment_delete: function(e) {
var self = this, $e = $(e.currentTarget);
var name = _.str.trim($e.parent().find('a.oe-sidebar-attachments-link').text());
- if (confirm(_.sprintf(_t("Do you really want to delete the attachment %s?"), name))) {
+ if (confirm(_.str.sprintf(_t("Do you really want to delete the attachment %s?"), name))) {
this.rpc('/web/dataset/unlink', {
model: 'ir.attachment',
ids: [parseInt($e.attr('data-id'))]
@@ -783,7 +793,7 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form.
trigger = trigger || this.$element;
options = _.extend({
delay: 1000,
- maxWidth: openerp.connection.debug ? '300px' : '200px',
+ maxWidth: '500px',
content: function() {
var template = widget.template + '.tooltip';
if (!QWeb.has_template(template)) {
@@ -805,8 +815,11 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form.
active_id: active_id || false,
active_ids: active_id ? [active_id] : [],
active_model: a_dataset.model,
- parent: a_dataset.parent_view ? a_dataset.parent_view.get_fields_values() : {}
+ parent: {}
});
+ if (a_dataset.parent_view) {
+ fields_values.parent = a_dataset.parent_view.get_fields_values([a_dataset.child_name]);
+ }
return fields_values;
},
_build_eval_context: function() {
@@ -1260,7 +1273,14 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f
},
reset: function() {
this.dirty = false;
- }
+ },
+ get_definition_options: function() {
+ if (!this.definition_options) {
+ var str = this.node.attrs.options || '{}';
+ this.definition_options = JSON.parse(str);
+ }
+ return this.definition_options;
+ },
});
openerp.web.form.FieldChar = openerp.web.form.Field.extend({
@@ -1484,11 +1504,16 @@ openerp.web.form.FieldText = openerp.web.form.Field.extend({
start: function() {
this._super.apply(this, arguments);
this.$element.find('textarea').change(this.on_ui_change);
+ this.resized = false;
},
set_value: function(value) {
this._super.apply(this, arguments);
var show_value = openerp.web.format_value(value, this, '');
this.$element.find('textarea').val(show_value);
+ if (!this.resized && this.view.options.resize_textareas) {
+ this.do_resize(this.view.options.resize_textareas);
+ this.resized = true;
+ }
},
update_dom: function() {
this._super.apply(this, arguments);
@@ -1509,6 +1534,29 @@ openerp.web.form.FieldText = openerp.web.form.Field.extend({
},
focus: function() {
this.$element.find('textarea').focus();
+ },
+ do_resize: function(max_height) {
+ max_height = parseInt(max_height, 10);
+ var $input = this.$element.find('textarea'),
+ $div = $('<div style="position: absolute; z-index: 1000; top: 0"/>').width($input.width()),
+ new_height;
+ $div.text($input.val());
+ _.each('font-family,font-size,white-space'.split(','), function(style) {
+ $div.css(style, $input.css(style));
+ });
+ $div.appendTo($('body'));
+ new_height = $div.height();
+ if (new_height < 90) {
+ new_height = 90;
+ }
+ if (!isNaN(max_height) && new_height > max_height) {
+ new_height = max_height;
+ }
+ $div.remove();
+ $input.height(new_height);
+ },
+ reset: function() {
+ this.resized = false;
}
});
@@ -1665,8 +1713,8 @@ openerp.web.form.dialog = function(content, options) {
}, options || {});
options.autoOpen = true;
var dialog = new openerp.web.Dialog(null, options);
- dialog.$dialog = $(content).dialog(dialog.dialog_options);
- return dialog.$dialog;
+ dialog.$element = $(content).dialog(dialog.dialog_options);
+ return dialog.$element;
};
openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({
@@ -1708,7 +1756,14 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({
return;
}
var pop = new openerp.web.form.FormOpenPopup(self.view);
- pop.show_element(self.field.relation, self.value[0],self.build_context(), {});
+ pop.show_element(
+ self.field.relation,
+ self.value[0],
+ self.build_context(),
+ {
+ title: _t("Open: ") + (self.string || self.name)
+ }
+ );
pop.on_write_completed.add_last(function() {
self.set_value(self.value[0]);
});
@@ -1734,7 +1789,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({
return true;
}, menuStyle: {width: "200px"}
});
- setTimeout(function() {self.$menu_btn.trigger(e);}, 0);
+ $.async_when().then(function() {self.$menu_btn.trigger(e);});
});
});
var ctx_callback = function(e) {init_context_menu_def.resolve(e); e.preventDefault()};
@@ -1855,25 +1910,36 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({
},
_quick_create: function(name) {
var self = this;
- var dataset = new openerp.web.DataSetStatic(this, this.field.relation, self.build_context());
- dataset.name_create(name, function(data) {
- self._change_int_ext_value(data);
- }).fail(function(error, event) {
- event.preventDefault();
+ var slow_create = function() {
self._change_int_value(null);
self._search_create_popup("form", undefined, {"default_name": name});
- });
+ }
+ if (self.get_definition_options().quick_create === undefined || self.get_definition_options().quick_create) {
+ var dataset = new openerp.web.DataSetStatic(this, this.field.relation, self.build_context());
+ dataset.name_create(name, function(data) {
+ self._change_int_ext_value(data);
+ }).fail(function(error, event) {
+ event.preventDefault();
+ slow_create();
+ });
+ } else
+ slow_create();
},
// all search/create popup handling
_search_create_popup: function(view, ids, context) {
var self = this;
var pop = new openerp.web.form.SelectCreatePopup(this);
- pop.select_element(self.field.relation,{
+ pop.select_element(
+ self.field.relation,
+ {
+ title: (view === 'search' ? _t("Search: ") : _t("Create: ")) + (this.string || this.name),
initial_ids: ids ? _.map(ids, function(x) {return x[0]}) : undefined,
initial_view: view,
disable_multiple_selection: true
- }, self.build_domain(),
- new openerp.web.CompoundContext(self.build_context(), context || {}));
+ },
+ self.build_domain(),
+ new openerp.web.CompoundContext(self.build_context(), context || {})
+ );
pop.on_select_elements.add(function(element_ids) {
var dataset = new openerp.web.DataSetStatic(self, self.field.relation, self.build_context());
dataset.name_get([element_ids[0]], function(data) {
@@ -1913,12 +1979,13 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({
self._change_int_ext_value(rval);
};
if (value && !(value instanceof Array)) {
- var dataset = new openerp.web.DataSetStatic(this, this.field.relation, self.build_context());
+ // name_get in a m2o does not use the context of the field
+ var dataset = new openerp.web.DataSetStatic(this, this.field.relation, self.view.dataset.get_context());
dataset.name_get([value], function(data) {
real_set_value(data[0]);
}).fail(function() {self.tmp_value = undefined;});
} else {
- setTimeout(function() {real_set_value(value);}, 0);
+ $.async_when().then(function() {real_set_value(value);});
}
},
get_value: function() {
@@ -2030,6 +2097,8 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
this.dataset = new openerp.web.form.One2ManyDataSet(this, this.field.relation);
this.dataset.o2m = this;
this.dataset.parent_view = this.view;
+ this.dataset.child_name = this.name;
+ //this.dataset.child_name =
this.dataset.on_change.add_last(function() {
self.on_ui_change();
});
@@ -2072,13 +2141,11 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
});
this.views = views;
- this.viewmanager = new openerp.web.ViewManager(this, this.dataset, views, {
- action_buttons : false
- });
+ this.viewmanager = new openerp.web.ViewManager(this, this.dataset, views, {});
this.viewmanager.template = 'One2Many.viewmanager';
this.viewmanager.registry = openerp.web.views.clone({
list: 'openerp.web.form.One2ManyListView',
- form: 'openerp.web.FormView',
+ form: 'openerp.web.form.One2ManyFormView',
page: 'openerp.web.PageView'
});
var once = $.Deferred().then(function() {
@@ -2093,9 +2160,6 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
if (self.is_readonly())
controller.set_editable(false);
} else if (view_type == "form" || view_type == 'page') {
- if (view_type == 'page') {
- controller.$element.find(".oe_form_buttons").hide();
- }
controller.on_record_loaded.add_last(function() {
once.resolve();
});
@@ -2110,13 +2174,13 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
this.viewmanager.on_mode_switch.add_first(function(n_mode, b, c, d, e) {
$.when(self.save_any_view()).then(function() {
if(n_mode === "list")
- setTimeout(function() {self.reload_current_view();}, 0);
+ $.async_when().then(function() {self.reload_current_view();});
});
});
this.is_setted.then(function() {
- setTimeout(function () {
+ $.async_when().then(function () {
self.viewmanager.appendTo(self.$element);
- }, 0);
+ });
});
return def;
},
@@ -2221,27 +2285,27 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
return commands['delete'](x.id);}));
},
save_any_view: function() {
- if (this.viewmanager && this.viewmanager.views && this.viewmanager.active_view &&
- this.viewmanager.views[this.viewmanager.active_view] &&
- this.viewmanager.views[this.viewmanager.active_view].controller) {
- var view = this.viewmanager.views[this.viewmanager.active_view].controller;
- if (this.viewmanager.active_view === "form") {
- var res = $.when(view.do_save());
- // it seems line there are some cases when this happens
- /*if (!res.isResolved() && !res.isRejected()) {
- console.warn("Asynchronous get_value() is not supported in form view.");
- }*/
- return res;
- } else if (this.viewmanager.active_view === "list") {
- var res = $.when(view.ensure_saved());
- // it seems line there are some cases when this happens
- /*if (!res.isResolved() && !res.isRejected()) {
- console.warn("Asynchronous get_value() is not supported in list view.");
- }*/
- return res;
- }
- }
- return false;
+ return this.session.synchronized_mode(_.bind(function() {
+ if (this.viewmanager && this.viewmanager.views && this.viewmanager.active_view &&
+ this.viewmanager.views[this.viewmanager.active_view] &&
+ this.viewmanager.views[this.viewmanager.active_view].controller) {
+ var view = this.viewmanager.views[this.viewmanager.active_view].controller;
+ if (this.viewmanager.active_view === "form") {
+ var res = $.when(view.do_save());
+ if (!res.isResolved() && !res.isRejected()) {
+ console.warn("Asynchronous get_value() is not supported in form view.");
+ }
+ return res;
+ } else if (this.viewmanager.active_view === "list") {
+ var res = $.when(view.ensure_saved());
+ if (!res.isResolved() && !res.isRejected()) {
+ console.warn("Asynchronous get_value() is not supported in list view.");
+ }
+ return res;
+ }
+ }
+ return false;
+ }, this));
},
is_valid: function() {
this.validate();
@@ -2299,21 +2363,27 @@ openerp.web.form.One2ManyListView = openerp.web.ListView.extend({
var self = this;
var pop = new openerp.web.form.SelectCreatePopup(this);
pop.on_default_get.add(self.dataset.on_default_get);
- pop.select_element(self.o2m.field.relation,{
- initial_view: "form",
- alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
- create_function: function(data, callback, error_callback) {
- return self.o2m.dataset.create(data).then(function(r) {
- self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result]));
- self.o2m.dataset.on_change();
- }).then(callback, error_callback);
- },
- read_function: function() {
- return self.o2m.dataset.read_ids.apply(self.o2m.dataset, arguments);
+ pop.select_element(
+ self.o2m.field.relation,
+ {
+ title: _t("Create: ") + self.name,
+ initial_view: "form",
+ alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
+ create_function: function(data, callback, error_callback) {
+ return self.o2m.dataset.create(data).then(function(r) {
+ self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result]));
+ self.o2m.dataset.on_change();
+ }).then(callback, error_callback);
+ },
+ read_function: function() {
+ return self.o2m.dataset.read_ids.apply(self.o2m.dataset, arguments);
+ },
+ parent_view: self.o2m.view,
+ form_view_options: {'not_interactible_on_create':true}
},
- parent_view: self.o2m.view,
- form_view_options: {'not_interactible_on_create':true}
- }, self.o2m.build_domain(), self.o2m.build_context());
+ self.o2m.build_domain(),
+ self.o2m.build_context()
+ );
pop.on_select_elements.add_last(function() {
self.o2m.reload_current_view();
});
@@ -2322,10 +2392,12 @@ openerp.web.form.One2ManyListView = openerp.web.ListView.extend({
do_activate_record: function(index, id) {
var self = this;
var pop = new openerp.web.form.FormOpenPopup(self.o2m.view);
- pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(),{
+ pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
+ title: _t("Open: ") + self.name,
auto_write: false,
alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
parent_view: self.o2m.view,
+ child_name: self.o2m.name,
read_function: function() {
return self.o2m.dataset.read_ids.apply(self.o2m.dataset, arguments);
},
@@ -2340,6 +2412,14 @@ openerp.web.form.One2ManyListView = openerp.web.ListView.extend({
}
});
+openerp.web.form.One2ManyFormView = openerp.web.FormView.extend({
+ form_template: 'One2Many.formview',
+ on_loaded: function(data) {
+ this._super(data);
+ this.$form_header.find('button.oe_form_button_create').click(this.on_button_new);
+ }
+});
+
openerp.web.form.FieldMany2Many = openerp.web.form.Field.extend({
template: 'FieldMany2Many',
multi_selection: false,
@@ -2402,9 +2482,9 @@ openerp.web.form.FieldMany2Many = openerp.web.form.Field.extend({
self.initial_is_loaded.resolve();
loaded.resolve();
});
- setTimeout(function () {
+ $.async_when().then(function () {
self.list_view.appendTo($("#" + self.list_id));
- }, 0);
+ });
return loaded;
},
reload_content: function() {
@@ -2444,9 +2524,14 @@ openerp.web.form.Many2ManyDataSet = openerp.web.DataSetStatic.extend({
openerp.web.form.Many2ManyListView = openerp.web.ListView.extend(/** @lends openerp.web.form.Many2ManyListView# */{
do_add_record: function () {
var pop = new openerp.web.form.SelectCreatePopup(this);
- pop.select_element(this.model, {},
+ pop.select_element(
+ this.model,
+ {
+ title: _t("Add: ") + this.name
+ },
new openerp.web.CompoundDomain(this.m2m_field.build_domain(), ["!", ["id", "in", this.m2m_field.dataset.ids]]),
- this.m2m_field.build_context());
+ this.m2m_field.build_context()
+ );
var self = this;
pop.on_select_elements.add(function(element_ids) {
_.each(element_ids, function(element_id) {
@@ -2462,6 +2547,7 @@ openerp.web.form.Many2ManyListView = openerp.web.ListView.extend(/** @lends open
var self = this;
var pop = new openerp.web.form.FormOpenPopup(this);
pop.show_element(this.dataset.model, id, this.m2m_field.build_context(), {
+ title: _t("Open: ") + this.name,
readonly: this.widget_parent.is_readonly()
});
pop.on_write_completed.add_last(function() {
@@ -2485,6 +2571,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
* - alternative_form_view
* - create_function (defaults to a naive saving behavior)
* - parent_view
+ * - child_name
* - form_view_options
* - list_view_options
* - read_function
@@ -2500,9 +2587,12 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
this.initial_ids = this.options.initial_ids;
this.created_elements = [];
this.render_element();
- openerp.web.form.dialog(this.$element, {close:function() {
- self.check_exit();
- }});
+ openerp.web.form.dialog(this.$element, {
+ close: function() {
+ self.check_exit();
+ },
+ title: options.title || ""
+ });
this.start();
},
start: function() {
@@ -2520,6 +2610,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
};
this.dataset.read_function = this.options.read_function;
this.dataset.parent_view = this.options.parent_view;
+ this.dataset.child_name = this.options.child_name;
this.dataset.on_default_get.add(this.on_default_get);
if (this.options.initial_view == "search") {
self.rpc('/web/session/eval_domain_and_context', {
@@ -2598,12 +2689,14 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
var self = this;
var wdataset = new openerp.web.DataSetSearch(this, this.model, this.context, this.domain);
wdataset.parent_view = this.options.parent_view;
+ wdataset.child_name = this.options.child_name;
return wdataset.create.apply(wdataset, arguments);
},
write_row: function() {
var self = this;
var wdataset = new openerp.web.DataSetSearch(this, this.model, this.context, this.domain);
wdataset.parent_view = this.options.parent_view;
+ wdataset.child_name = this.options.child_name;
return wdataset.write.apply(wdataset, arguments);
},
on_select_elements: function(element_ids) {
@@ -2692,6 +2785,7 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp
* - auto_write (default true)
* - read_function
* - parent_view
+ * - child_name
* - form_view_options
* - readonly
*/
@@ -2701,10 +2795,12 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp
this.context = context || {};
this.options = _.defaults(options || {}, {"auto_write": true});
this.render_element();
- this.$element.dialog({title: '',
- modal: true,
- width: 960,
- height: 600});
+ this.$element.dialog({
+ title: options.title || '',
+ modal: true,
+ width: 960,
+ height: 600
+ });
this.start();
},
start: function() {
@@ -2714,6 +2810,7 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp
this.dataset.ids = [this.row_id];
this.dataset.index = 0;
this.dataset.parent_view = this.options.parent_view;
+ this.dataset.child_name = this.options.child_name;
this.setup_form_view();
},
on_write: function(id, data) {
@@ -2722,6 +2819,7 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp
var self = this;
var wdataset = new openerp.web.DataSetSearch(this, this.model, this.context, this.domain);
wdataset.parent_view = this.options.parent_view;
+ wdataset.child_name = this.options.child_name;
wdataset.write(id, data, {}, function(r) {
self.on_write_completed();
});
@@ -3052,6 +3150,32 @@ openerp.web.form.FieldStatus = openerp.web.form.Field.extend({
}
});
+openerp.web.form.WidgetHtml = openerp.web.form.Widget.extend({
+ render: function () {
+ var $root = $('<div class="oe_form_html_view">');
+ this.render_children(this, $root);
+ return $root.html();
+ },
+ render_children: function (object, $into) {
+ var self = this,
+ fields = this.view.fields_view.fields;
+ _(object.children).each(function (child) {
+ if (typeof child === 'string') {
+ $into.text(child);
+ } else if (child.tag === 'field') {
+ $into.append(
+ new (self.view.registry.get_object('frame'))(
+ self.view, {tag: 'ueule', attrs: {}, children: [child] })
+ .render());
+ } else {
+ var $child = $(document.createElement(child.tag))
+ .attr(child.attrs)
+ .appendTo($into);
+ self.render_children(child, $child);
+ }
+ });
+ }
+});
/**
@@ -3085,7 +3209,8 @@ openerp.web.form.widgets = new openerp.web.Registry({
'progressbar': 'openerp.web.form.FieldProgressBar',
'image': 'openerp.web.form.FieldBinaryImage',
'binary': 'openerp.web.form.FieldBinaryFile',
- 'statusbar': 'openerp.web.form.FieldStatus'
+ 'statusbar': 'openerp.web.form.FieldStatus',
+ 'html': 'openerp.web.form.WidgetHtml'
});
diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js
index 16987e597d2..2ab1152a0fa 100644
--- a/addons/web/static/src/js/view_list.js
+++ b/addons/web/static/src/js/view_list.js
@@ -302,7 +302,11 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
last = first + limit;
}
this.$element.find('span.oe-pager-state').empty().text(_.str.sprintf(
- "[%d to %d] of %d", first + 1, last, total));
+ _t("[%(first_record)d to %(last_record)d] of %(records_count)d"), {
+ first_record: first + 1,
+ last_record: last,
+ records_count: total
+ }));
this.$element
.find('button[data-pager-action=first], button[data-pager-action=previous]')
@@ -326,7 +330,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
var field_to_column = function (field) {
var name = field.attrs.name;
var column = _.extend({id: name, tag: field.tag},
- field.attrs, fields[name]);
+ fields[name], field.attrs);
// modifiers computer
if (column.modifiers) {
var modifiers = JSON.parse(column.modifiers);
@@ -463,10 +467,13 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
}));
this.do_push_state({
page: this.page,
- limit: this._limit,
+ limit: this._limit
});
return reloaded.promise();
},
+ reload: function () {
+ return this.reload_content();
+ },
do_load_state: function(state) {
var reload = false;
@@ -1134,7 +1141,12 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
},
open: function (point_insertion) {
this.render().insertAfter(point_insertion);
- this.make_paginator();
+
+ var no_subgroups = _(this.datagroup.group_by).isEmpty(),
+ records_terminated = !this.datagroup.context['group_by_no_leaf'];
+ if (no_subgroups && records_terminated) {
+ this.make_paginator();
+ }
},
close: function () {
this.$row.children().last().empty();
@@ -1276,7 +1288,7 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
var fields = _.pluck(_.select(this.columns, function(x) {return x.tag == "field"}), 'name');
var options = { offset: page * limit, limit: limit };
//TODO xmo: investigate why we need to put the setTimeout
- setTimeout(function() {dataset.read_slice(fields, options , function (records) {
+ $.async_when().then(function() {dataset.read_slice(fields, options , function (records) {
// FIXME: ignominious hacks, parents (aka form view) should not send two ListView#reload_content concurrently
if (self.records.length) {
self.records.reset(null, {silent: true});
@@ -1287,7 +1299,10 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
var pages = Math.ceil(dataset.ids.length / limit);
self.$row
.find('.oe-pager-state')
- .text(_.str.sprintf('%d/%d', page + 1, pages))
+ .text(_.str.sprintf(_t("%(page)d/%(page_count)d"), {
+ page: page + 1,
+ page_count: pages
+ }))
.end()
.find('button[data-pager-action=previous]')
.attr('disabled', page === 0)
@@ -1299,7 +1314,7 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
self.records.add(records, {silent: true});
list.render();
d.resolve(list);
- });}, 0);
+ });});
return d.promise();
},
setup_resequence_rows: function (list, dataset) {
@@ -1341,9 +1356,9 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
// Accounting > Taxes > Taxes, child tax accounts)
// when synchronous (without setTimeout)
(function (dataset, id, seq) {
- setTimeout(function () {
+ $.async_when().then(function () {
dataset.write(id, {sequence: seq});
- }, 0);
+ });
}(dataset, record.get('id'), seq));
record.set('sequence', seq);
}
diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js
index 453536f7ec6..daf708104e8 100644
--- a/addons/web/static/src/js/view_list_editable.js
+++ b/addons/web/static/src/js/view_list_editable.js
@@ -242,7 +242,7 @@ openerp.web.list_editable = function (openerp) {
self.edition_form.appendTo();
$.when(self.edition_form.on_loaded(self.get_form_fields_view())).then(function () {
// put in $.when just in case FormView.on_loaded becomes asynchronous
- $new_row.find('td')
+ $new_row.find('> td')
.addClass('oe-field-cell')
.removeAttr('width')
.end()
diff --git a/addons/web/static/src/js/view_page.js b/addons/web/static/src/js/view_page.js
index 5474bcd5efd..6ac5bc9f72b 100644
--- a/addons/web/static/src/js/view_page.js
+++ b/addons/web/static/src/js/view_page.js
@@ -10,6 +10,13 @@ openerp.web.page = function (openerp) {
this._super.apply(this, arguments);
this.registry = openerp.web.page.readonly;
},
+ reload: function () {
+ if (this.dataset.index == null) {
+ this.do_prev_view();
+ return $.Deferred().reject().promise();
+ }
+ return this._super();
+ },
on_loaded: function(data) {
this._super(data);
this.$form_header.find('button.oe_form_button_edit').click(this.on_button_edit);
@@ -48,9 +55,9 @@ openerp.web.page = function (openerp) {
def.resolve();
});
} else {
- setTimeout(function () {
+ $.async_when().then(function () {
def.reject();
- }, 0)
+ })
}
});
return def.promise();
@@ -164,7 +171,7 @@ openerp.web.page = function (openerp) {
real_set_value(data[0]);
});
} else {
- setTimeout(function() {real_set_value(value);}, 0);
+ $.async_when().then(function() {real_set_value(value);});
}
},
get_value: function() {
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index 5800939ec36..42298c5c363 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -27,7 +27,7 @@ session.web.ActionManager = session.web.Widget.extend({
this.client_widget = null;
},
render: function() {
- return "<div id='"+this.element_id+"'></div>";
+ return '<div id="' + this.element_id + '" style="height: 100%;"></div>';
},
dialog_stop: function () {
if (this.dialog) {
@@ -49,8 +49,12 @@ session.web.ActionManager = session.web.Widget.extend({
},
do_push_state: function(state) {
if (this.widget_parent && this.widget_parent.do_push_state) {
- if (this.inner_action && this.inner_action.id) {
- state['action_id'] = this.inner_action.id;
+ if (this.inner_action) {
+ if (this.inner_action.id) {
+ state['action_id'] = this.inner_action.id;
+ } else {
+ state['model'] = this.inner_action.res_model;
+ }
}
this.widget_parent.do_push_state(state);
}
@@ -66,10 +70,15 @@ session.web.ActionManager = session.web.Widget.extend({
}
}
else if (state.model && state.id) {
- // TODO implement it
- //this.null_action();
- //action = {res_model: state.model, res_id: state.id};
- //action_loaded = this.do_action(action);
+ // TODO handle context & domain ?
+ this.null_action();
+ action = {
+ res_model: state.model,
+ res_id: state.id,
+ type: 'ir.actions.act_window',
+ views: [[false, 'page'], [false, 'form']]
+ };
+ action_loaded = this.do_action(action);
}
else if (state.client_action) {
this.null_action();
@@ -135,6 +144,9 @@ session.web.ActionManager = session.web.Widget.extend({
this.dialog_viewmanager.appendTo(this.dialog.$element);
this.dialog.open();
} else {
+ if(action.menu_id) {
+ return this.widget_parent.do_action(action);
+ }
this.dialog_stop();
this.content_stop();
this.inner_action = action;
@@ -313,17 +325,18 @@ session.web.ViewManager = session.web.Widget.extend(/** @lends session.web.View
.filter('[data-view-type="' + view_type + '"]')
.attr('disabled', true);
- for (var view_name in this.views) {
- if (!this.views.hasOwnProperty(view_name)) { continue; }
- if (this.views[view_name].controller) {
- if (view_name === view_type) {
- $.when(view_promise).then(this.views[view_name].controller.do_show);
- } else {
- this.views[view_name].controller.do_hide();
- }
- }
- }
$.when(view_promise).then(function () {
+ _.each(_.keys(self.views), function(view_name) {
+ var controller = self.views[view_name].controller;
+ if (controller) {
+ if (view_name === view_type) {
+ controller.do_show();
+ } else {
+ controller.do_hide();
+ }
+ }
+ });
+
self.$element.find('.oe_view_title_text:first').text(
self.display_title());
});
@@ -542,7 +555,10 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
view_mode : 'form',
target : 'new',
flags : {
- action_buttons : true
+ action_buttons : true,
+ form : {
+ resize_textareas : true
+ }
}
};
if (id) {
@@ -585,7 +601,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
var $title = self.$element.find('.oe_view_title_text'),
$search_prefix = $title.find('span.oe_searchable_view');
- if (controller.searchable !== false) {
+ if (controller.searchable !== false && self.flags.search_view !== false) {
if (!$search_prefix.length) {
$title.prepend('<span class="oe_searchable_view">' + _t("Search: ") + '</span>');
}
@@ -604,7 +620,11 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
var self = this,
defs = [];
if (state.view_type && state.view_type !== this.active_view) {
- defs.push(this.on_mode_switch(state.view_type, true));
+ defs.push(
+ this.views[this.active_view].deferred.pipe(function() {
+ return self.on_mode_switch(state.view_type, true);
+ })
+ );
}
$.when(defs).then(function() {
@@ -616,7 +636,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
var grandparent = this.widget_parent && this.widget_parent.widget_parent;
// display shortcuts if on the first view for the action
var $shortcut_toggle = this.$element.find('.oe-shortcut-toggle');
- if (!(grandparent instanceof session.web.WebClient) ||
+ if (!this.action.name ||
!(view.view_type === this.views_src[0].view_type
&& view.view_id === this.views_src[0].view_id)) {
$shortcut_toggle.hide();
@@ -847,7 +867,10 @@ session.web.Sidebar = session.web.Widget.extend({
additional_context);
result.result.flags = result.result.flags || {};
result.result.flags.new_window = true;
- self.do_action(result.result);
+ self.do_action(result.result, function () {
+ // reload view
+ self.widget_parent.reload();
+ });
});
});
},
@@ -1171,7 +1194,14 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{
on_sidebar_view_log: function() {
},
sidebar_context: function () {
- return $.Deferred().resolve({}).promise();
+ return $.when();
+ },
+ /**
+ * Asks the view to reload itself, if the reloading is asynchronous should
+ * return a {$.Deferred} indicating when the reloading is done.
+ */
+ reload: function () {
+ return $.when();
}
});
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index eb32c109787..5b471d9eb76 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -19,6 +19,7 @@
</t>
<t t-name="Interface">
<div id="oe_loading"></div>
+
<table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" class="main_table">
<tr>
<td colspan="2" valign="top">
@@ -36,15 +37,14 @@
<div id="oe_database" class="database"></div>
</td>
<td valign="top">
- <div id="oe_db_options"></div>
+ <div id="oe_db_options"></div>
</td>
</tr>
<tr>
<td colspan="2" valign="top" height="100%">
<table cellspacing="0" cellpadding="0" border="0" height="100%" width="100%">
<tr>
- <td valign="top" id="oe_secondary_menu" class="secondary_menu">
- </td>
+ <td valign="top" id="oe_secondary_menu" class="secondary_menu"></td>
<td valign="top" class="oe-application-container">
<div id="oe_app" class="oe-application">
</div>
@@ -120,7 +120,7 @@
equalTo="input[name=create_admin_pwd]"/></td>
</tr>
<tr>
- <td colspan="2" align="right"><button>Create</button></td>
+ <td colspan="2" align="right"><button class="oe_button">Create</button></td>
</tr>
</table>
</form>
@@ -150,7 +150,7 @@
<td><input type="password" name="drop_pwd" class="required"/></td>
</tr>
<tr>
- <td colspan="2" align="right"><button>Drop</button></td>
+ <td colspan="2" align="right"><button class="oe_button">Drop</button></td>
</tr>
</table>
</form>
@@ -182,7 +182,7 @@
<td><input type="password" name="backup_pwd" class="required"/></td>
</tr>
<tr>
- <td colspan="2" align="right"><button>Backup</button></td>
+ <td colspan="2" align="right"><button class="oe_button">Backup</button></td>
</tr>
</table>
</form>
@@ -211,7 +211,7 @@
<td><input type="text" name="new_db" class="required"/></td>
</tr>
<tr>
- <td colspan="2" align="right"><button>Restore</button></td>
+ <td colspan="2" align="right"><button class="oe_button">Restore</button></td>
</tr>
</table>
</form>
@@ -242,7 +242,7 @@
equalTo="input[name=new_pwd]" minlength="1"/></td>
</tr>
<tr>
- <td colspan="2" align="right"><button>Change Password</button></td>
+ <td colspan="2" align="right"><button class="oe_button">Change Password</button></td>
</tr>
</table>
</form>
@@ -263,80 +263,30 @@
</t>
<t t-name="Login">
- <div>
- <form class="oe_forms">
- <fieldset>
- <legend style="">
- <img t-att-src='_s + "/web/static/src/img/stock_person.png"' alt="" />
- </legend>
- <div class="oe_box2">
- <table align="center" cellspacing="2px" cellpadding="0">
- <tr>
- <td><label for="db">Database:</label></td>
- <td>
- <input type="text" name="db" t-att-value="widget.selected_db || ''" autofocus="true"/>
- </td>
- </tr>
- <tr>
- <td><label for="login">User:</label></td>
- <td><input type="text" name="login"
- t-att-value="widget.selected_login || ''" autofocus="true"/></td>
- </tr>
- <tr>
- <td><label for="password">Password:</label></td>
- <td><input type="password" name="password"
- t-att-value="widget.selected_password || ''"/></td>
- </tr>
- <tr>
- <td></td>
- <td>
- <button type="button" id="oe-db-config">Database</button>
- <button name="submit">Login</button>
- </td>
- </tr>
- </table>
- </div>
- </fieldset>
- <div class="login_error_message">Bad username or password</div>
- </form>
- <div class="oe_login_right_pane">
- <p>We think that daily job activities can be more intuitive, efficient, automated, .. and even fun.</p>
- <h3>OpenERP's vision to be:</h3>
-
- <table cellpadding="0" cellspacing="0" width="100%" style="border:none;">
- <tbody>
- <tr>
- <td>
- <img t-att-src='_s + "/web/static/src/img/product.png"'/>
- </td>
- <td>
- <strong>Full featured</strong><br />
- Today's enterprise challenges are multiple. We provide one module for each need.
- </td>
- </tr>
- <tr>
- <td>
- <img t-att-src='_s + "/web/static/src/img/accessories-archiver.png"'/>
- </td>
- <td>
- <strong>Open Source</strong><br />
- To Build a great product, we rely on the knowledge of thousands of contributors.
- </td>
- </tr>
- <tr>
- <td>
- <img t-att-src='_s + "/web/static/src/img/partner.png"' />
- </td>
- <td>
- <strong>User Friendly</strong><br />
- In order to be productive, people need clean and easy to use interface.
- </td>
- </tr>
- </tbody>
- </table>
-
- </div>
+ <div>
+ <div class="bottom"> </div>
+ <div class="login_error_message">Invalid username or password</div>
+ <div class="pane">
+ <div id="logo"><img src='/web/static/src/img/logo2.png'/></div>
+ <form action="" method="post">
+ <div class="dbpane" >
+ Database:
+ <input name="db"/>
+ </div>
+ <ul>
+ <li>Username</li>
+ <li><input type="text" name="login" autofocus="autofocus"/></li>
+ <li>Password</li>
+ <li><input type="password" name="password" value=""/></li>
+ <li><button name="submit">Log in</button></li>
+ </ul>
+ </form>
+ <div class="footer">
+ <a href="#" id="oe-db-config">Manage Databases</a> |
+ <a href="http://www.openerp.com">Powered by <span class="openerp">OpenERP</span></a>
+ </div>
</div>
+ </div>
</t>
<t t-name="Header">
<div>
@@ -424,8 +374,9 @@
</h2>
<div class="oe_vm_switch">
<t t-if="views.length != 1" t-foreach="views" t-as="view">
- <button type="button" t-att-data-view-type="view.view_type">
- <t t-esc="view.label || view.view_type"/>
+
+ <button type="button" t-attf-class="oe_vm_switch_#{view.view_type}" t-att-data-view-type="view.view_type" t-att-title="view.view_type">
+ <span><t t-esc="view.label || view.view_type"/></span>
</button>
</t>
</div>
@@ -567,6 +518,24 @@
</td>
</tr>
+<t t-name="ViewPager">
+ <button class="oe_button oe_button_pager" type="button" data-pager-action="first">
+ <img t-att-src='_s + "/web/static/src/img/pager_first.png"'/>
+ </button>
+ <button class="oe_button oe_button_pager" type="button" data-pager-action="previous">
+ <img t-att-src='_s + "/web/static/src/img/pager_previous.png"'/>
+ </button>
+
+ <t t-raw="__content__"/>
+
+ <button class="oe_button oe_button_pager" type="button" data-pager-action="next">
+ <img t-att-src='_s + "/web/static/src/img/pager_next.png"'/>
+ </button>
+ <button class="oe_button oe_button_pager" type="button" data-pager-action="last">
+ <img t-att-src='_s + "/web/static/src/img/pager_last.png"'/>
+ </button>
+</t>
+
<table t-name="ListView" class="oe-listview-content">
<t t-set="columns_count" t-value="visible_columns.length + (options.selectable ? 1 : 0) + (options.deletable ? 1 : 0) + (options.isClarkGable ? 1 : 0)"/>
<thead class="ui-widget-header">
@@ -575,11 +544,11 @@
<table>
<tr>
<td t-if="!no_leaf and options.action_buttons !== false" class="oe-actions">
- <button type="button" class="oe-list-add"
+ <button type="button" class="oe_button oe-list-add"
t-if="options.addable">
<t t-esc="options.addable"/>
</button>
- <button type="button" class="oe-list-delete"
+ <button type="button" class="oe_button oe-list-delete"
t-if="options.selectable and options.deletable">
Delete
</button>
@@ -639,18 +608,10 @@
</t>
<th t-name="Listview.navigation.button" t-if="!no_leaf and options.pager !== false"
class="oe-list-pager" t-att-colspan="columns_count">
- <button type="button" disabled="disabled"
- data-pager-action="first">First</button>
- <button type="button" disabled="disabled"
- data-pager-action="previous">&lt;</button>
-
- <span class="oe-pager-state">
- </span>
-
- <button type="button" disabled="disabled"
- data-pager-action="next">&gt;</button>
- <button type="button" disabled="disabled"
- data-pager-action="last">Last</button>
+ <t t-call="ViewPager">
+ <span class="oe-pager-state">
+ </span>
+ </t>
</th>
<t t-name="ListView.rows" t-foreach="records.length" t-as="index">
<t t-call="ListView.row">
@@ -692,27 +653,28 @@
<t t-name="FormView">
<div class="oe_form_header">
<div class="oe_form_buttons" t-if="widget.options.action_buttons !== false">
- <button type="button" class="oe_form_button_save">Save</button>
- <button type="button" class="oe_form_button_cancel">Cancel</button>
+ <button type="button" class="oe_button oe_form_button_save">Save</button>
+ <button type="button" class="oe_button oe_form_button_cancel">Cancel</button>
</div>
<div class="oe_form_pager" t-if="widget.options.pager !== false">
- <button type="button" data-pager-action="first">First</button>
- <button type="button" data-pager-action="previous">&lt;&lt;</button>
-
- <span class="oe_pager_index">0</span> / <span class="oe_pager_count">0</span>
-
- <button type="button" data-pager-action="next">&gt;&gt;</button>
- <button type="button" data-pager-action="last">Last</button>
+ <t t-call="ViewPager">
+ <span class="oe_pager_index">0</span><span class="oe_pager_separator"> / </span><span class="oe_pager_count">0</span>
+ </t>
</div>
</div>
<t t-raw="frame.render()"/>
</t>
+<t t-name="One2Many.formview" t-extend="FormView">
+ <t t-jquery=".oe_form_buttons" t-operation="inner">
+ <button type="button" class="oe_button oe_form_button_create">Create</button>
+ </t>
+</t>
<t t-name="PageView" t-extend="FormView">
<t t-jquery=".oe_form_buttons" t-operation="inner">
- <button type="button" class="oe_form_button_edit">Edit</button>
- <button type="button" class="oe_form_button_create">Create</button>
- <button type="button" class="oe_form_button_duplicate">Duplicate</button>
- <button type="button" class="oe_form_button_delete">Delete</button>
+ <button type="button" class="oe_button oe_form_button_edit">Edit</button>
+ <button type="button" class="oe_button oe_form_button_create">Create</button>
+ <button type="button" class="oe_button oe_form_button_duplicate">Duplicate</button>
+ <button type="button" class="oe_button oe_form_button_delete">Delete</button>
</t>
</t>
<t t-name="FormView.sidebar.attachments">
@@ -724,7 +686,7 @@
<input type="hidden" name="callback" t-attf-value="#{element_id}_iframe"/>
<input type="hidden" name="model" t-att-value="view.dataset.model"/>
<input type="hidden" name="id" t-att-value="view.datarecord.id"/>
- <button class="button" type="button">
+ <button class="oe_button" type="button">
<img t-att-src='_s + "/web/static/src/img/throbber.gif"' width="16" height="16" style="display: none"/>
<span>Add</span>
</button>
@@ -831,9 +793,7 @@
<div class="oe_tooltip_string" t-if="widget.string">
<t t-esc="widget.string"/> <t t-if="debug and widget.nolabel">(nolabel)</t>
</div>
- <p t-if="widget.help" class="oe_tooltip_help">
- <t t-esc="widget.help"/>
- </p>
+ <p t-if="widget.help" class="oe_tooltip_help"><t t-esc="widget.help"/></p>
<ul t-if="debug" class="oe_tooltip_technical">
<li data-item="field" t-if="widget.name">
<span class="oe_tooltip_technical_title">Field:</span>
@@ -905,16 +865,18 @@
</div>
</t>
<t t-name="FieldURI.readonly">
- <a href="#" class="oe_form_uri">#</a>
+ <div>
+ <a href="#" class="oe_form_uri">#</a>
+ </div>
</t>
<t t-name="FieldEmail">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
- <td width="100%" style="position: relative">
+ <td width="100%">
<t t-call="FieldChar"/>
</td>
<td width="16">
- <button type="button" class="button" title="Send an e-mail with your default e-mail client">
+ <button class="oe_button oe_field_button" type="button" title="Send an e-mail with your default e-mail client">
<img t-att-src='_s + "/web/static/src/img/icons/terp-mail-message-new.png"'/>
</button>
</td>
@@ -924,11 +886,11 @@
<t t-name="FieldUrl">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
- <td width="100%" style="position: relative">
+ <td width="100%">
<t t-call="FieldChar"/>
</td>
<td width="16">
- <button type="button" class="button" title="Open this resource">
+ <button class="oe_button oe_field_button" type="button" title="Open this resource">
<img t-att-src='_s + "/web/static/src/img/icons/gtk-ok.png"'/>
</button>
</td>
@@ -965,16 +927,22 @@
</select>
</t>
<t t-name="FieldMany2One">
- <div class="oe-m2o">
- <input type="text" size="1" style="width: 100%;"
- t-att-id="widget.element_id"/>
- <span class="oe-m2o-drop-down-button">
- <img t-att-src='_s + "/web/static/src/img/down-arrow.png"' /></span>
- <span class="oe-m2o-cm-button" t-att-id="widget.name + '_open'">
- <img t-att-src='_s + "/web/static/src/img/icons/gtk-index.png"'/></span>
- <div t-att-id="widget.cm_id" class="contextMenu" style="display:none">
- </div>
- </div>
+ <table cellpadding="0" cellspacing="0" border="0" width="100%">
+ <tr>
+ <td width="100%" valign="top">
+ <t t-call="FieldChar"/>
+ <span class="oe-m2o-drop-down-button">
+ <img t-att-src='_s + "/web/static/src/img/down-arrow.png"' /></span>
+ </td>
+ <td>
+ <button class="oe_button oe_field_button oe-m2o-cm-button" t-att-id="widget.name + '_open'">
+ <img t-att-src='_s + "/web/static/src/img/icons/STOCK_DIRECTORY.png"'/>
+ </button>
+ <div t-att-id="widget.cm_id" class="contextMenu" style="display:none">
+ </div>
+ </td>
+ </tr>
+ </table>
</t>
<t t-name="FieldMany2One.context_menu">
<ul>
@@ -1043,7 +1011,7 @@
method="post" enctype="multipart/form-data" action="/web/binary/upload">
<input type="hidden" name="session_id" value=""/>
<input type="hidden" name="callback" t-att-value="widget.iframe"/>
- <button class="button" type="button" title="Set Image">
+ <button class="oe_button" type="button" title="Set Image">
<img t-att-src='_s + "/web/static/src/img/icons/STOCK_DIRECTORY.png"'/>
</button>
<input type="file" class="oe-binary-file" name="ufile"/>
@@ -1051,7 +1019,7 @@
</div>
</td>
<td>
- <button class="button oe-binary-file-clear" type="button" title="Clear">
+ <button class="oe_button oe-binary-file-clear" type="button" title="Clear">
<img t-att-src='_s + "/web/static/src/img/icons/STOCK_MISSING_IMAGE.png"'/>
</button>
</td>
@@ -1086,7 +1054,7 @@
method="post" enctype="multipart/form-data" action="/web/binary/upload">
<input type="hidden" name="session_id" value=""/>
<input type="hidden" name="callback" t-att-value="widget.iframe"/>
- <button class="button" type="button" title="Set Image">
+ <button class="oe_button oe_field_button" type="button" title="Set Image">
<img t-att-src='_s + "/web/static/src/img/icons/STOCK_DIRECTORY.png"'/>
<span>Select</span>
</button>
@@ -1095,13 +1063,13 @@
</div>
</td>
<td>
- <button class="button oe-binary-file-save" type="button" title="Save As">
+ <button class="oe_button oe-binary-file-save" type="button" title="Save As">
<img t-att-src='_s + "/web/static/src/img/icons/gtk-save.png"'/>
<span>Save As</span>
</button>
</td>
<td>
- <button class="button oe-binary-file-clear" type="button" title="Clear">
+ <button class="oe_button oe-binary-file-clear" type="button" title="Clear">
<img t-att-src='_s + "/web/static/src/img/icons/STOCK_MISSING_IMAGE.png"'/>
<span>Clear</span>
</button>
@@ -1159,8 +1127,8 @@
<form class="oe_forms">
<t t-call="SearchView.render_lines"/>
<div class="oe_search-view-buttons">
- <button>Search</button>
- <button type="reset">Clear</button>
+ <button class="oe_button">Search</button>
+ <button class="oe_button" type="reset">Clear</button>
<select class="oe_search-view-filters-management">
</select>
</div>
@@ -1299,7 +1267,7 @@
<t t-name="SearchView.extended_search">
<t t-call="SearchView.util.expand">
<t t-set="expand" t-value="false"/>
- <t t-set="label" t-value="'Advanced Filters'"/>
+ <t t-set="label">Advanced Filters</t>
<t t-set="content">
<div class="searchview_extended_groups_list">
</div>
@@ -1429,18 +1397,18 @@
</div>
</t>
<t t-name="SelectCreatePopup.search.buttons">
- <button type="button" class="oe_selectcreatepopup-search-select" disabled="disabled">Select</button>
- <button type="button" class="oe_selectcreatepopup-search-close">Cancel</button>
+ <button type="button" class="oe_button oe_selectcreatepopup-search-select" disabled="disabled">Select</button>
+ <button type="button" class="oe_button oe_selectcreatepopup-search-close">Cancel</button>
</t>
<t t-name="SelectCreatePopup.form.buttons">
<t t-if="widget.options.disable_multiple_selection">
- <button type="button" class="oe_selectcreatepopup-form-save">Save</button>
+ <button type="button" class="oe_button oe_selectcreatepopup-form-save">Save</button>
</t>
<t t-if="! widget.options.disable_multiple_selection">
- <button type="button" class="oe_selectcreatepopup-form-save-new">Save &amp; New</button>
- <button type="button" class="oe_selectcreatepopup-form-save">Save &amp; Close</button>
+ <button type="button" class="oe_button oe_selectcreatepopup-form-save-new">Save &amp; New</button>
+ <button type="button" class="oe_button oe_selectcreatepopup-form-save">Save &amp; Close</button>
</t>
- <button type="button" class="oe_selectcreatepopup-form-close">Cancel</button>
+ <button type="button" class="oe_button oe_selectcreatepopup-form-close">Cancel</button>
</t>
<t t-name="FormOpenPopup">
<div t-att-id="element_id">
@@ -1448,8 +1416,8 @@
</div>
</t>
<t t-name="FormOpenPopup.form.buttons">
- <button type="button" class="oe_formopenpopup-form-save">Save</button>
- <button type="button" class="oe_formopenpopup-form-close">Cancel</button>
+ <button type="button" class="oe_button oe_formopenpopup-form-save">Save</button>
+ <button type="button" class="oe_button oe_formopenpopup-form-close">Cancel</button>
</t>
<t t-extend="ListView.row">
<!-- adds front & back padding to row being rendered after edition, if
@@ -1589,9 +1557,10 @@
</div>
</td>
<td class="oe_export_fields_selector_center">
- <button id="add_field">Add</button>
- <button id="remove_field">Remove</button>
- <button id="remove_all_field">Remove All</button>
+ <!-- TODO: replace ids by 'oe_*' classes -->
+ <button class="oe_button" id="add_field">Add</button>
+ <button class="oe_button" id="remove_field">Remove</button>
+ <button class="oe_button" id="remove_all_field">Remove All</button>
</td>
<td class="oe_export_fields_selector_right">
<select name="fields_list" id="fields_list"
@@ -1638,7 +1607,7 @@
<tr>
<th><label>Save as:</label></th>
<td><input size="10" type="text" id="savelist_name"/></td>
- <td><button class="oe_export_button_export" id="add_export_list">Ok</button></td>
+ <td><button class="oe_button oe_export_button_export" id="add_export_list">Ok</button></td>
</tr>
</t>
@@ -1651,7 +1620,7 @@
<option t-att-value="export.id"><t t-esc="export.name"/></option>
</t>
</select>
- <button class="oe_export_button_export" id="delete_export_list" type="button">Delete</button>
+ <button class="oe_button oe_export_button_export" id="delete_export_list" type="button">Delete</button>
</t>
<t t-name="Change_Pwd">
<form name="change_password_form" class="oe_forms" method="POST">
@@ -1672,7 +1641,7 @@
minlength="1"/></td>
</tr>
<tr>
- <td colspan="2" align="right"><button>Change Password</button></td>
+ <td colspan="2" align="right"><button class="oe_button">Change Password</button></td>
</tr>
</table>
</form>