diff options
| author | Roberto López López (OpenERP) <rlo@openerp.com> | 2011-12-22 12:52:43 +0100 |
|---|---|---|
| committer | Roberto López López (OpenERP) <rlo@openerp.com> | 2011-12-22 12:52:43 +0100 |
| commit | 7b2ece8ddc6712af1582dab7c4050cd680d69c36 (patch) | |
| tree | d3fee08c2be9645aff5b29a8e90b430360ac2cdc /addons/web/static/src | |
| parent | b3f7278d12a9409a112b5a4f8ef7ef182ef6538d (diff) | |
| parent | e6e2a6f7db438b46e19944cbd591691a3bc2e0e6 (diff) | |
merge
bzr revid: rlo@openerp.com-20111222115243-ht5rqa4j5bl7ie96
Diffstat (limited to 'addons/web/static/src')
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 Binary files differnew file mode 100644 index 00000000000..5400acec57b --- /dev/null +++ b/addons/web/static/src/img/iconset-a-help.gif diff --git a/addons/web/static/src/img/iconset-a-help.png b/addons/web/static/src/img/iconset-a-help.png Binary files differnew file mode 100644 index 00000000000..4af5ac170d6 --- /dev/null +++ b/addons/web/static/src/img/iconset-a-help.png diff --git a/addons/web/static/src/img/logo2.png b/addons/web/static/src/img/logo2.png Binary files differnew file mode 100644 index 00000000000..aca5f4c60d8 --- /dev/null +++ b/addons/web/static/src/img/logo2.png diff --git a/addons/web/static/src/img/pager_first.png b/addons/web/static/src/img/pager_first.png Binary files differnew file mode 100644 index 00000000000..83074ed696f --- /dev/null +++ b/addons/web/static/src/img/pager_first.png diff --git a/addons/web/static/src/img/pager_last.png b/addons/web/static/src/img/pager_last.png Binary files differnew file mode 100644 index 00000000000..dedcede4b62 --- /dev/null +++ b/addons/web/static/src/img/pager_last.png diff --git a/addons/web/static/src/img/pager_next.png b/addons/web/static/src/img/pager_next.png Binary files differnew file mode 100644 index 00000000000..9b5e7090735 --- /dev/null +++ b/addons/web/static/src/img/pager_next.png diff --git a/addons/web/static/src/img/pager_previous.png b/addons/web/static/src/img/pager_previous.png Binary files differnew file mode 100644 index 00000000000..7134186008c --- /dev/null +++ b/addons/web/static/src/img/pager_previous.png diff --git a/addons/web/static/src/img/pattern.png b/addons/web/static/src/img/pattern.png Binary files differnew file mode 100644 index 00000000000..7e3a2b37834 --- /dev/null +++ b/addons/web/static/src/img/pattern.png diff --git a/addons/web/static/src/img/sep-a.gif b/addons/web/static/src/img/sep-a.gif Binary files differnew file mode 100644 index 00000000000..5a064f21e89 --- /dev/null +++ b/addons/web/static/src/img/sep-a.gif diff --git a/addons/web/static/src/img/views-icons-a.png b/addons/web/static/src/img/views-icons-a.png Binary files differnew file mode 100644 index 00000000000..0be5b655e66 --- /dev/null +++ b/addons/web/static/src/img/views-icons-a.png 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"><</button> - - <span class="oe-pager-state"> - </span> - - <button type="button" disabled="disabled" - data-pager-action="next">></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"><<</button> - - <span class="oe_pager_index">0</span> / <span class="oe_pager_count">0</span> - - <button type="button" data-pager-action="next">>></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 & New</button> - <button type="button" class="oe_selectcreatepopup-form-save">Save & Close</button> + <button type="button" class="oe_button oe_selectcreatepopup-form-save-new">Save & New</button> + <button type="button" class="oe_button oe_selectcreatepopup-form-save">Save & 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> |
