summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorJigar Amin - OpenERP <jam@tinyerp.com>2012-08-17 11:50:19 +0530
committerJigar Amin - OpenERP <jam@tinyerp.com>2012-08-17 11:50:19 +0530
commit02d32cd6cfa94304b790f680f2d7ebeee51b71f4 (patch)
tree9820a325b375b30d33a7d973242563fafe89a762 /addons/web/static/src
parent1b5259b3e374a8f9c385d18706aadbdf0a2403df (diff)
parent281877d27470826b8b4925aaa1e79d14c95f963f (diff)
[MERGE] lp:openerp-web
bzr revid: jam@tinyerp.com-20120817062019-k2i3ut3snkoot3x1
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/css/base.css118
-rw-r--r--addons/web/static/src/css/base.sass130
-rw-r--r--addons/web/static/src/js/boot.js5
-rw-r--r--addons/web/static/src/js/chrome.js161
-rw-r--r--addons/web/static/src/js/corelib.js6
-rw-r--r--addons/web/static/src/js/coresetup.js95
-rw-r--r--addons/web/static/src/js/data.js38
-rw-r--r--addons/web/static/src/js/search.js96
-rw-r--r--addons/web/static/src/js/test_support.js12
-rw-r--r--addons/web/static/src/js/view_form.js165
-rw-r--r--addons/web/static/src/js/view_list.js4
-rw-r--r--addons/web/static/src/js/views.js44
-rw-r--r--addons/web/static/src/xml/base.xml225
13 files changed, 563 insertions, 536 deletions
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index 5f4dd3b2157..a39838070cb 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -78,7 +78,7 @@
background: white;
/* http://www.quirksmode.org/dom/inputfile.html
* http://stackoverflow.com/questions/2855589/replace-input-type-file-by-an-image
- */ */
+ */
}
.openerp :-moz-placeholder {
color: #afafb6 !important;
@@ -156,7 +156,7 @@
.openerp h4 {
margin: 4px 0;
}
-.openerp a.button:link, .openerp a.button:visited, .openerp button, .openerp input[type='submit'] {
+.openerp a.button:link, .openerp a.button:visited, .openerp button, .openerp input[type='submit'], .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button {
display: inline-block;
border: 1px solid #ababab;
color: #404040;
@@ -181,7 +181,7 @@
-webkit-font-smoothing: antialiased;
outline: none;
}
-.openerp a.button:hover, .openerp button:hover, .openerp input[type='submit']:hover {
+.openerp a.button:hover, .openerp button:hover, .openerp input[type='submit']:hover, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-hover {
background-color: #f6f6f6;
background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
@@ -190,9 +190,11 @@
background-image: -o-linear-gradient(top, #f6f6f6, #e3e3e3);
background-image: linear-gradient(to bottom, #f6f6f6, #e3e3e3);
cursor: pointer;
+ background-position: 0;
}
-.openerp a.button:focus, .openerp button:focus, .openerp input[type='submit']:focus {
+.openerp a.button:focus, .openerp button:focus, .openerp input[type='submit']:focus, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-focus {
border: 1px solid #80bfff;
+ background-position: 0;
background-color: #f6f6f6;
background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
@@ -204,7 +206,7 @@
-webkit-box-shadow: 0 0 3px #80bfff, 0 1px 1px rgba(255, 255, 255, 0.8) inset;
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 input[type='submit']:active, .openerp input[type='submit'].active {
+.openerp a.button:active, .openerp a.button.active, .openerp button:active, .openerp button.active, .openerp input[type='submit']:active, .openerp input[type='submit'].active, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-active {
background-color: #e3e3e3;
background-image: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#f6f6f6));
background-image: -webkit-linear-gradient(top, #e3e3e3, #f6f6f6);
@@ -230,6 +232,9 @@
font-family: "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;
font-size: 13px;
}
+.openerp .ui-widget-content a {
+ color: #8a89ba;
+}
.openerp .ui-menu .ui-menu-item {
margin: 0 8px 0 0;
padding: 0 0 0 12px;
@@ -238,11 +243,6 @@
.openerp .ui-menu .ui-menu-item a.ui-state-active {
background: #f0f0fa;
}
-.openerp div.ui-widget-overlay {
- background: black;
- filter: alpha(opacity=30);
- opacity: 0.3;
-}
.openerp.ui-dialog {
display: none;
padding: 6px;
@@ -302,6 +302,9 @@
.openerp.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
float: left;
}
+.openerp.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button {
+ margin-right: 4px;
+}
.openerp.ui-dialog .ui-dialog-titlebar-close {
padding: 0;
}
@@ -337,6 +340,9 @@
.openerp.ui-dialog .oe_about a:hover {
text-decoration: underline;
}
+.openerp.ui-dialog .oe_about a:focus {
+ outline: none;
+}
.openerp.ui-dialog .oe_about .oe_logo {
margin-left: -6px;
}
@@ -492,9 +498,6 @@
.openerp .oe_button_box button {
margin: 4px;
}
-.openerp .oe_avatar {
- margin: 0 6px 15px 0;
-}
.openerp .oe_avatar > img {
height: 90px;
max-width: 100px;
@@ -563,17 +566,22 @@
color: gold;
}
.openerp .oe_tag {
- border-radius: 2px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- -ms-box-sizing: border-box;
- box-sizing: border-box;
- border: 1px solid #9daccc;
- background: #e2e6f0;
- color: black !important;
- padding: 0px 3px 0px 3px;
+ border: 1px solid #afafb6;
+ font-size: 11px;
+ padding: 2px 4px;
margin: 0 2px 2px 0;
- height: 16px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ background: #f0f0fa;
+ color: #4c4c4c;
+}
+.openerp .oe_tag_dark {
+ background: #8786b7;
+ color: #eeeeee;
+}
+.openerp .oe_tags.oe_inline {
+ min-width: 250px;
}
.openerp .oe_tags .text-wrap {
width: 100% !important;
@@ -1208,16 +1216,9 @@
}
.openerp .oe_secondary_submenu .oe_menu_counter {
float: right;
- background: #8a89ba;
- color: #eeeeee;
- font-size: 10px;
- border: 1px solid lightgray;
- padding: 2px 4px;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
margin: 0px;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- border-radius: 4px;
+ padding: 1px 4px;
}
.openerp .oe_secondary_submenu .oe_active {
background: #8a89ba;
@@ -1560,25 +1561,27 @@
display: inline-block;
line-height: 17px;
}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_input, .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet {
+.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet {
height: 18px;
margin: 1px 0;
font-size: 11px;
}
-.openerp .oe_searchview .oe_searchview_facets .oe_searchview_input:focus, .openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet:focus {
+.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet:focus {
outline: none;
}
.openerp .oe_searchview .oe_searchview_facets .oe_searchview_input {
padding: 0 0 0 6px;
+ font-size: 12px;
+ height: 16px;
+ margin-top: 3px;
+}
+.openerp .oe_searchview .oe_searchview_facets .oe_searchview_input:focus {
+ outline: none;
}
.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet {
position: relative;
cursor: pointer;
- border: 1px solid #afafb6;
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- background: #8786b7;
+ padding: 0;
-webkit-font-smoothing: auto;
}
.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet:focus {
@@ -1607,6 +1610,7 @@
.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_value {
border-left: 1px solid #afafb6;
text-shadow: 0 1px 1px white;
+ color: #4c4c4c;
}
.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet .oe_facet_value:last-child {
padding-right: 16px;
@@ -1619,6 +1623,7 @@
line-height: 8px;
width: 12px;
height: 12px;
+ padding-top: 1px;
text-align: center;
font-weight: bold;
cursor: pointer;
@@ -1918,12 +1923,12 @@
width: auto;
}
.openerp .oe_form_nosheet {
- margin: 20px;
+ margin: 8px;
}
.openerp .oe_form_nosheet > header {
- margin-top: -20px;
- margin-left: -20px;
- margin-right: -20px;
+ margin-top: -8px;
+ margin-left: -8px;
+ margin-right: -8px;
}
.openerp .oe_form header {
position: relative;
@@ -2345,20 +2350,14 @@
.openerp .oe_form_editable .oe_form .oe_form_field_datetime {
width: 11.5em !important;
}
-.openerp .oe_hidden_input_file {
- overflow: hidden;
- position: relative;
- display: inline-block;
- width: 45px;
- height: 30px;
-}
.openerp .oe_hidden_input_file input.oe_form_binary_file {
z-index: 0;
line-height: 0;
font-size: 12px;
position: absolute;
top: 1px;
- right: 10px;
+ left: 0;
+ right: 0;
opacity: 0;
filter: alpha(opacity=0);
-ms-filter: "alpha(opacity=0)";
@@ -2374,15 +2373,16 @@
}
.openerp .oe_form .oe_form_field_image .oe_form_field_image_controls {
position: absolute;
- white-space: nowrap;
top: 1px;
- padding: 3px 0 0 0;
- margin: 0 1px;
+ padding: 4px;
+ width: 100%;
display: none;
- width: 99%;
text-align: center;
- background: url(/web/static/src/img/form_sheetbg.png);
- border-bottom: 1px dotted black;
+ color: #eeeeee;
+ background: rgba(37, 37, 37, 0.9);
+ -moz-border-radius: 3px 3px 0 0;
+ -webkit-border-radius: 3px 3px 0 0;
+ border-radius: 3px 3px 0 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
@@ -2737,3 +2737,9 @@
.kitten-mode-activated > * {
opacity: 0.7;
}
+
+div.ui-widget-overlay {
+ background: black;
+ filter: alpha(opacity=30);
+ opacity: 0.3;
+}
diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass
index 75382b1c2c0..f1d1f2e9f1f 100644
--- a/addons/web/static/src/css/base.sass
+++ b/addons/web/static/src/css/base.sass
@@ -1,11 +1,14 @@
@charset "utf-8"
// Variables {{{
-$section-title-color: #8786b7
$facets-border: #afafb6
-$facets-border-selected: #a6a6fe
+$section-title-color: #8786b7
+$tag-bg-light: #f0f0fa
+$tag-bg-dark: #8786b7
+$tag-border: #afafb6
+$tag-border-selected: #a6a6fe
$hover-background: #f0f0fa
-$colour4: #8a89ba
+$link-color: #8a89ba
$sheet-max-width: 860px
// }}}
// Mixins {{{
@@ -190,7 +193,7 @@ $sheet-max-width: 860px
margin: 4px 0
// }}}
// Button style {{{
- a.button:link, a.button:visited, button, input[type='submit']
+ a.button:link, a.button:visited, button, input[type='submit'], .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button
display: inline-block
border: 1px solid #ababab
color: #404040
@@ -205,16 +208,18 @@ $sheet-max-width: 860px
-webkit-font-smoothing: antialiased
outline: none
- a.button:hover, button:hover, input[type='submit']:hover
+ a.button:hover, button:hover, input[type='submit']:hover, .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-hover
@include vertical-gradient(#f6f6f6, #e3e3e3)
cursor: pointer
+ background-position: 0
- a.button:focus, button:focus, input[type='submit']:focus
+ a.button:focus, button:focus, input[type='submit']:focus, .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-focus
border: 1px solid #80bfff
+ background-position: 0
@include vertical-gradient(#f6f6f6, #e3e3e3)
@include box-shadow((0 0 3px #80bfff, 0 1px 1px rgba(255, 255, 255, .8) inset))
- a.button:active, a.button.active, button:active, button.active, input[type='submit']:active, input[type='submit'].active
+ a.button:active, a.button.active, button:active, button.active, input[type='submit']:active, input[type='submit'].active, .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-active
@include vertical-gradient(#e3e3e3, #f6f6f6)
@include box-shadow(none)
@@ -230,6 +235,8 @@ $sheet-max-width: 860px
.ui-widget
font-family: "Lucida Grande", Helvetica, Verdana, Arial, sans-serif
font-size: 13px
+ .ui-widget-content a
+ color: $link-color
.ui-menu
.ui-menu-item
margin: 0 8px 0 0
@@ -237,9 +244,7 @@ $sheet-max-width: 860px
width: auto
a.ui-state-active
background: #f0f0fa
- div.ui-widget-overlay
- background: black
- @include opacity(0.3)
+
// Modal box
&.ui-dialog
display: none
@@ -276,6 +281,8 @@ $sheet-max-width: 860px
margin: 0
.ui-dialog-buttonset
float: left
+ .ui-button
+ margin-right: 4px
.ui-dialog-titlebar-close
padding: 0
.ui-icon-closethick
@@ -299,9 +306,11 @@ $sheet-max-width: 860px
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=)
@include radius(0 0 2px 2px)
a
- color: #8A89BA
+ color: $link-color
&:hover
text-decoration: underline
+ &:focus
+ outline: none
.oe_logo
margin-left: -6px
.oe_bottom
@@ -399,7 +408,6 @@ $sheet-max-width: 860px
button
margin: 4px
.oe_avatar
- margin: 0 6px 15px 0
> img
height: 90px
max-width: 100px
@@ -420,7 +428,7 @@ $sheet-max-width: 860px
display: none
span
@include reset()
- color: #8A89BA
+ color: $link-color
font-weight: bold
&:hover
text-decoration: underline
@@ -438,16 +446,20 @@ $sheet-max-width: 860px
// }}}
// Tags (for many2many tags, among others) {{{
.oe_tag
- border-radius: 2px
- @include box-sizing(border)
- border: 1px solid #9DACCC
- background: #E2E6F0
- color: black !important
- padding: 0px 3px 0px 3px
+ border: 1px solid $tag-border
+ font-size: 11px
+ padding: 2px 4px
margin: 0 2px 2px 0
- height: 16px
- // font: 11px "lucida grande", tahoma, verdana, arial, sans-serif
+ @include radius(3px)
+ background: $tag-bg-light
+ color: #4C4C4C
+ .oe_tag_dark
+ background: $tag-bg-dark
+ color: #eee
+
.oe_tags
+ &.oe_inline
+ min-width: 250px
.text-wrap
width: 100% !important
textarea
@@ -899,7 +911,7 @@ $sheet-max-width: 860px
.oe_secondary_menu_section
font-weight: bold
margin-left: 8px
- color: $colour4
+ color: $link-color
.oe_secondary_submenu
padding: 2px 0 8px 0
margin: 0
@@ -917,7 +929,7 @@ $sheet-max-width: 860px
top: 1px
right: 1px
font-size: 10px
- background: $colour4
+ background: $link-color
color: white
padding: 2px 4px
margin: 1px 6px 0 0
@@ -927,16 +939,11 @@ $sheet-max-width: 860px
@include box-shadow(inset 0 1px 1px rgba(0, 0, 0, 0.2))
.oe_menu_counter
float: right
- background: #8a89ba
- color: #eee
- font-size: 10px
- border: 1px solid lightgray
- padding: 2px 4px
text-shadow: 0 1px 1px rgba(0,0,0,0.2)
margin: 0px
- @include radius(4px)
+ padding: 1px 4px
.oe_active
- background: $colour4
+ background: $link-color
border-top: 1px solid lightGray
border-bottom: 1px solid lightGray
text-shadow: 0 1px 1px rgba(0,0,0,0.2)
@@ -945,12 +952,12 @@ $sheet-max-width: 860px
color: white
.oe_menu_label
background: #eee
- color: $colour4
+ color: $link-color
text-shadow: 0 1px 1px white
@include box-shadow(0 1px 1px rgba(0, 0, 0, 0.2))
.oe_menu_counter
background: #eee
- color: #8a89ba
+ color: $link-color
.oe_menu_toggler:before
width: 0
height: 0
@@ -977,7 +984,7 @@ $sheet-max-width: 860px
.oe_application
width: 100%
a
- color: $colour4
+ color: $link-color
&:hover
text-decoration: underline
> div
@@ -1011,7 +1018,7 @@ $sheet-max-width: 860px
margin: 0
float: left
a
- color: $colour4
+ color: $link-color
.oe_button_group
display: inline-block
border: 1px solid #ababab
@@ -1148,8 +1155,8 @@ $sheet-max-width: 860px
font-size: 12px
line-height: 18px
&.oe_focused
- border-color: $facets-border-selected
- @include box-shadow(0 1px 2px $facets-border-selected inset)
+ border-color: $tag-border-selected
+ @include box-shadow(0 1px 2px $tag-border-selected inset)
.oe_searchview_clear
cursor: pointer
position: absolute
@@ -1200,7 +1207,7 @@ $sheet-max-width: 860px
vertical-align: top
display: inline-block
line-height: 17px
- .oe_searchview_input, .oe_searchview_facet
+ .oe_searchview_facet
height: 18px
margin: 1px 0
font-size: 11px
@@ -1208,17 +1215,20 @@ $sheet-max-width: 860px
outline: none
.oe_searchview_input
padding: 0 0 0 6px
+ font-size: 12px
+ height: 16px
+ margin-top: 3px
+ &:focus
+ outline: none
.oe_searchview_facet
position: relative
cursor: pointer
- border: 1px solid $facets-border
- @include radius(3px)
- background: #8786b7
+ padding: 0
-webkit-font-smoothing: auto
// spacing for opera, FF
&:focus
- border-color: $facets-border-selected
- @include box-shadow(0 0 3px 1px $facets-border-selected)
+ border-color: $tag-border-selected
+ @include box-shadow(0 0 3px 1px $tag-border-selected)
.oe_facet_values
background: #f0f0fa
@include radius(0 3px 3px 0)
@@ -1231,8 +1241,9 @@ $sheet-max-width: 860px
.oe_facet_category.oe_i
font-size: 16px
.oe_facet_value
- border-left: 1px solid $facets-border
+ border-left: 1px solid $tag-border
text-shadow: 0 1px 1px white
+ color: #4C4C4C
&:last-child
padding-right: 16px
.oe_facet_remove
@@ -1243,6 +1254,7 @@ $sheet-max-width: 860px
line-height: 8px
width: 12px
height: 12px
+ padding-top: 1px
text-align: center
font-weight: bold
cursor: pointer
@@ -1473,11 +1485,11 @@ $sheet-max-width: 860px
.oe_form .oe_form_field_date
width: auto
.oe_form_nosheet
- margin: 20px
+ margin: 8px
.oe_form_nosheet > header
- margin-top: -20px
- margin-left: -20px
- margin-right: -20px
+ margin-top: -8px
+ margin-left: -8px
+ margin-right: -8px
// }}}
// FormView.custom tags and classes {{{
.oe_form
@@ -1825,19 +1837,14 @@ $sheet-max-width: 860px
* http://stackoverflow.com/questions/2855589/replace-input-type-file-by-an-image
*/
.oe_hidden_input_file
- overflow: hidden
- position: relative
- display: inline-block
- width: 45px
- height: 30px
input.oe_form_binary_file
z-index: 0
line-height: 0
font-size: 12px
position: absolute
- // Should be adjusted for all browsers
top: 1px
- right: 10px
+ left: 0
+ right: 0
opacity: 0
filter: alpha(opacity = 0)
-ms-filter: "alpha(opacity=0)"
@@ -1852,15 +1859,14 @@ $sheet-max-width: 860px
vertical-align: top
.oe_form_field_image_controls
position: absolute
- white-space: nowrap
top: 1px
- padding: 3px 0 0 0
- margin: 0 1px
+ padding: 4px
+ width: 100%
display: none
- width: 99%
text-align: center
- background: url(/web/static/src/img/form_sheetbg.png)
- border-bottom: 1px dotted black
+ color: #eee
+ background: rgba(37,37,37,0.9)
+ @include radius(3px 3px 0 0)
@include box-sizing(border)
&:hover .oe_form_field_image_controls
display: block
@@ -2160,6 +2166,10 @@ $sheet-max-width: 860px
// }}}
+// The jQuery-ui overlay is outside the .openerp div, please don't add indentation !!!
+div.ui-widget-overlay
+ background: black
+ @include opacity(0.3)
// au BufWritePost,FileWritePost *.sass :!sass --style expanded --line-numbers <afile> > "%:p:r.css"
// vim:tabstop=4:shiftwidth=4:softtabstop=4:fdm=marker:
diff --git a/addons/web/static/src/js/boot.js b/addons/web/static/src/js/boot.js
index 844dd88a0ac..05ce709e80a 100644
--- a/addons/web/static/src/js/boot.js
+++ b/addons/web/static/src/js/boot.js
@@ -37,7 +37,10 @@
};
openerp.instances[new_instance._session_id] = new_instance;
for(var i=0; i < modules.length; i++) {
- openerp[modules[i]](new_instance,new_instance[modules[i]]);
+ new_instance[modules[i]] = {};
+ if (openerp[modules[i]]) {
+ openerp[modules[i]](new_instance,new_instance[modules[i]]);
+ }
}
return new_instance;
}
diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js
index fbf51dac522..ff066c9f425 100644
--- a/addons/web/static/src/js/chrome.js
+++ b/addons/web/static/src/js/chrome.js
@@ -66,9 +66,9 @@ instance.web.Dialog = instance.web.Widget.extend({
max_width: '95%',
height: 'auto',
min_height: 0,
- max_height: this.get_height('100%') - 140,
+ max_height: this.get_height('100%') - 200,
autoOpen: false,
- position: [false, 50],
+ position: [false, 40],
buttons: {},
beforeClose: function () { self.on_close(); },
resizeStop: this.on_resized
@@ -109,7 +109,7 @@ instance.web.Dialog = instance.web.Widget.extend({
} else if (val.slice(-1) == "%") {
return Math.round(available_size / 100 * parseInt(val.slice(0, -1), 10));
} else {
- return parseInt(val, 10);
+ return parseInt(val, 10);
}
},
renderElement: function() {
@@ -123,7 +123,7 @@ instance.web.Dialog = instance.web.Widget.extend({
if (! this.dialog_inited)
this.init_dialog();
var o = this.get_options(options);
- instance.web.dialog(this.$element, o).dialog('open');
+ instance.web.dialog(this.$element, o).dialog('open');
if (o.height === 'auto' && o.max_height) {
this.$element.css({ 'max-height': o.max_height, 'overflow-y': 'auto' });
}
@@ -193,7 +193,7 @@ instance.web.CrashManager = instance.web.CallbackEnabled.extend({
on_traceback: function(error) {
var self = this;
var buttons = {};
- if (instance.connection.openerp_entreprise) {
+ if (instance.session.openerp_entreprise) {
buttons[_t("Send OpenERP Enterprise Report")] = function() {
var $this = $(this);
var issuename = $('#issuename').val();
@@ -224,7 +224,7 @@ instance.web.CrashManager = instance.web.CallbackEnabled.extend({
min_height: '600px',
buttons: buttons
}).open();
- dialog.$element.html(QWeb.render('CrashManager.error', {session: instance.connection, error: error}));
+ dialog.$element.html(QWeb.render('CrashManager.error', {session: instance.session, error: error}));
},
on_javascript_exception: function(exception) {
this.on_traceback({
@@ -269,7 +269,7 @@ instance.web.Loading = instance.web.Widget.extend({
this.count += increment;
if (this.count > 0) {
- if (instance.connection.debug) {
+ if (instance.session.debug) {
this.$element.text(_.str.sprintf( _t("Loading (%d)"), this.count));
} else {
this.$element.text(_t("Loading"));
@@ -300,6 +300,7 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
},
start: function() {
var self = this;
+ $('.oe_secondary_menus_container,.oe_user_menu_placeholder').empty();
var fetch_db = this.rpc("/web/database/get_list", {}).pipe(
function(result) {
self.db_list = result.db_list;
@@ -315,12 +316,22 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
},
do_render: function() {
var self = this;
+ instance.webclient.toggle_bars(true);
self.$element.html(QWeb.render("DatabaseManager", { widget : self }));
- self.$element.find(".oe_database_manager_menu").tabs({
- show: function(event, ui) {
- $('*[autofocus]:first', ui.panel).focus();
- }
+ $('.oe_user_menu_placeholder').append(QWeb.render("DatabaseManager.user_menu",{ widget : self }));
+ $('.oe_secondary_menus_container').append(QWeb.render("DatabaseManager.menu",{ widget : self }));
+ $('ul.oe_secondary_submenu > li:first').addClass('oe_active')
+ $('ul.oe_secondary_submenu > li').bind('click', function (event) {
+ var menuitem = $(this);
+ menuitem.addClass('oe_active').siblings().removeClass('oe_active');
+ var form_id =menuitem.find('a').attr('href');
+ $(form_id).show().siblings().hide();
+ event.preventDefault();
});
+ $('#back-to-login').click(self.do_exit);
+ self.$element.find("td").addClass("oe_form_group_cell");
+ self.$element.find("tr td:first-child").addClass("oe_form_group_cell_label");
+ self.$element.find("label").addClass("oe_form_label");
self.$element.find("form[name=create_db_form]").validate({ submitHandler: self.do_create });
self.$element.find("form[name=drop_db_form]").validate({ submitHandler: self.do_drop });
self.$element.find("form[name=backup_db_form]").validate({ submitHandler: self.do_backup });
@@ -336,7 +347,6 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
},
submitHandler: self.do_change_password
});
- self.$element.find("#back_to_login").click(self.do_exit);
},
destroy: function () {
this.$element.find('#db-create, #db-drop, #db-backup, #db-restore, #db-change-password, #back-to-login').unbind('click').end().empty();
@@ -407,7 +417,6 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
};
self.do_action(client_action);
});
-
},
do_drop: function(form) {
var self = this;
@@ -486,11 +495,14 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
self.display_error(result);
return;
}
+ self.unblockUI();
self.do_notify("Changed Password", "Password has been changed successfully");
});
},
do_exit: function () {
- this.do_action("login");
+ this.$element.remove();
+ instance.webclient.toggle_bars(false);
+ this.do_action('login');
}
});
instance.web.client_actions.add("database_manager", "instance.web.DatabaseManager");
@@ -498,11 +510,11 @@ instance.web.client_actions.add("database_manager", "instance.web.DatabaseManage
instance.web.Login = instance.web.Widget.extend({
template: "Login",
remember_credentials: true,
- _db_list: null,
init: function(parent, params) {
this._super(parent);
this.has_local_storage = typeof(localStorage) != 'undefined';
+ this.db_list = null;
this.selected_db = null;
this.selected_login = null;
this.params = params || {};
@@ -525,50 +537,41 @@ instance.web.Login = instance.web.Widget.extend({
self.$element.find('.oe_login_manage_db').click(function() {
self.do_action("database_manager");
});
- return self.load_db_list().then(self.on_db_list_loaded).then(function() {
- if (self.params.db) {
- self.do_login(self.params.db, self.params.login, self.params.password);
- }
- });
- },
- load_db_list: function (force) {
- var d = $.when(), self = this;
- if (_.isNull(this._db_list) || force) {
- d = self.rpc("/web/database/get_list", {}, function(result) {
- self._db_list = _.clone(result.db_list);
- }, function(error, event) {
- if (error.data.fault_code === 'AccessDenied') {
- event.preventDefault();
- }
- });
+ var d;
+ if (self.params.db) {
+ d = self.do_login(self.params.db, self.params.login, self.params.password);
+ } else {
+ d = self.rpc("/web/database/get_list", {}).done(self.on_db_loaded).fail(self.on_db_failed);
}
return d;
},
- on_db_list_loaded: function () {
- var self = this;
- var list = this._db_list;
- var dbdiv = this.$element.find('div.oe_login_dbpane');
- this.$element.find("[name=db]").replaceWith(instance.web.qweb.render('Login.dblist', { db_list: list, selected_db: this.selected_db}));
- if(list.length === 0) {
+ on_db_loaded: function (result) {
+ this.db_list = result.db_list;
+ this.$("[name=db]").replaceWith(QWeb.render('Login.dblist', { db_list: this.db_list, selected_db: this.selected_db}));
+ if(this.db_list.length === 0) {
this.do_action("database_manager");
- } else if(list && list.length === 1) {
- dbdiv.hide();
+ } else if(this.db_list.length === 1) {
+ this.$('div.oe_login_dbpane').hide();
} else {
- dbdiv.show();
+ this.$('div.oe_login_dbpane').show();
+ }
+ },
+ on_db_failed: function (error, event) {
+ if (error.data.fault_code === 'AccessDenied') {
+ event.preventDefault();
}
},
on_submit: function(ev) {
if(ev) {
ev.preventDefault();
}
- var $e = this.$element;
- var db = $e.find("form [name=db]").val();
+ var db = this.$("form [name=db]").val();
if (!db) {
this.do_warn("Login", "No database selected !");
return false;
}
- var login = $e.find("form input[name=login]").val();
- var password = $e.find("form input[name=password]").val();
+ var login = this.$("form input[name=login]").val();
+ var password = this.$("form input[name=password]").val();
this.do_login(db, login, password);
},
@@ -599,16 +602,11 @@ instance.web.Login = instance.web.Widget.extend({
}
self.trigger('login_successful');
},function () {
- self.$(".oe_login_pane").fadeIn("fast");
- self.$element.addClass("oe_login_invalid");
+ self.$(".oe_login_pane").fadeIn("fast", function() {
+ self.$element.addClass("oe_login_invalid");
+ });
});
},
- show: function () {
- this.$element.show();
- },
- hide: function () {
- this.$element.hide();
- }
});
instance.web.client_actions.add("login", "instance.web.Login");
@@ -623,11 +621,11 @@ instance.web.Reload = instance.web.Widget.extend({
},
start: function() {
var l = window.location;
- var timestamp = new Date().getTime();
- var search = "?ts=" + timestamp;
- if (l.search) {
- search = l.search + "&ts=" + timestamp;
- }
+
+ var sobj = $.deparam(l.search.substr(1));
+ sobj.ts = new Date().getTime();
+ var search = '?' + $.param(sobj);
+
var hash = l.hash;
if (this.menu_id) {
hash = "#menu_id=" + this.menu_id;
@@ -665,7 +663,7 @@ instance.web.ChangePassword = instance.web.Widget.extend({
template: "ChangePassword",
start: function() {
var self = this;
- self.$element.find("form[name=change_password_form]").validate({
+ self.$element.validate({
submitHandler: function (form) {
self.rpc("/web/session/change_password",{
'fields': $(form).serializeArray()
@@ -685,7 +683,7 @@ instance.web.ChangePassword = instance.web.Widget.extend({
modal: true,
title: error.title,
buttons: [
- {text: _("Ok"), click: function() { $(this).dialog("close"); }}
+ {text: _t("Ok"), click: function() { $(this).dialog("close"); }}
]
}).html(error.error);
},
@@ -869,8 +867,8 @@ instance.web.UserMenu = instance.web.Widget.extend({
var func = new instance.web.Model("res.users").get_func("read");
return func(self.session.uid, ["name", "company_id"]).pipe(function(res) {
var topbar_name = res.name;
- if(instance.connection.debug)
- topbar_name = _.str.sprintf("%s (%s)", topbar_name, instance.connection.db);
+ if(instance.session.debug)
+ topbar_name = _.str.sprintf("%s (%s)", topbar_name, instance.session.db);
if(res.company_id[0] > 1)
topbar_name = _.str.sprintf("%s (%s)", topbar_name, res.company_id[1]);
self.$element.find('.oe_topbar_name').text(topbar_name);
@@ -887,7 +885,7 @@ instance.web.UserMenu = instance.web.Widget.extend({
on_menu_settings: function() {
var self = this;
self.rpc("/web/action/load", { action_id: "base.action_res_users_my" }, function(result) {
- result.result.res_id = instance.connection.uid;
+ result.result.res_id = instance.session.uid;
self.getParent().action_manager.do_action(result.result);
});
},
@@ -901,7 +899,7 @@ instance.web.UserMenu = instance.web.Widget.extend({
window.location.href, 'debug');
});
instance.web.dialog($help, {autoOpen: true,
- modal: true, width: 580, height: 290, resizable: false, title: _t("About")});
+ modal: true, width: 507, height: 290, resizable: false, title: _t("About")});
});
},
});
@@ -914,7 +912,7 @@ instance.web.Client = instance.web.Widget.extend({
},
start: function() {
var self = this;
- return instance.connection.session_bind(this.origin).pipe(function() {
+ return instance.session.session_bind(this.origin).pipe(function() {
var $e = $(QWeb.render(self._template, {}));
self.replaceElement($e);
self.bind_events();
@@ -950,14 +948,14 @@ instance.web.Client = instance.web.Widget.extend({
instance.web.bus.on('click', this, function(ev) {
$.fn.tipsy.clear();
if (!$(ev.target).is('input[type=file]')) {
- self.$element.find('.oe_dropdown_menu.oe_opened').removeClass('oe_opened');
+ self.$element.find('.oe_dropdown_menu.oe_opened, .oe_dropdown_toggle.oe_opened').removeClass('oe_opened');
}
});
},
show_common: function() {
var self = this;
this.crashmanager = new instance.web.CrashManager();
- instance.connection.on_rpc_error.add(this.crashmanager.on_rpc_error);
+ instance.session.on_rpc_error.add(this.crashmanager.on_rpc_error);
self.notification = new instance.web.Notification(this);
self.notification.appendTo(self.$element);
self.loading = new instance.web.Loading(self);
@@ -965,6 +963,9 @@ instance.web.Client = instance.web.Widget.extend({
self.action_manager = new instance.web.ActionManager(self);
self.action_manager.appendTo(self.$('.oe_application'));
},
+ toggle_bars: function(value) {
+ this.$('tr:has(td.oe_topbar),.oe_leftbar').toggle(value);
+ }
});
instance.web.WebClient = instance.web.Client.extend({
@@ -1006,13 +1007,27 @@ instance.web.WebClient = instance.web.Client.extend({
};
},
show_login: function() {
- this.$('.oe_topbar').hide();
- this.action_manager.do_action("login");
- this.action_manager.inner_widget.on('login_successful', this, this.show_application);
+ this.toggle_bars(false);
+
+ var action = {
+ 'type': 'ir.actions.client',
+ 'tag': 'login'
+ };
+ var state = $.bbq.getState(true);
+ if (state.action === "login") {
+ action.params = state;
+ }
+
+ this.action_manager.do_action(action);
+ this.action_manager.inner_widget.on('login_successful', this, function() {
+ this.do_push_state(state);
+ this._current_state = null; // ensure the state will be loaded
+ this.show_application(); // will load the state we just pushed
+ });
},
show_application: function() {
var self = this;
- self.$('.oe_topbar').show();
+ self.toggle_bars(true);
self.menu = new instance.web.Menu(self);
self.menu.replace(this.$element.find('.oe_menu_placeholder'));
self.menu.on('menu_click', this, this.on_menu_action);
@@ -1037,7 +1052,7 @@ instance.web.WebClient = instance.web.Client.extend({
do_reload: function() {
var self = this;
return this.session.session_reload().pipe(function () {
- instance.connection.load_modules(true).pipe(
+ instance.session.load_modules(true).pipe(
self.menu.proxy('do_reload')); });
},
@@ -1054,8 +1069,6 @@ instance.web.WebClient = instance.web.Client.extend({
this.session.session_logout().then(function () {
$(window).unbind('hashchange', self.on_hashchange);
self.do_push_state({});
- //would be cool to be able to do this, but I think it will make addons do strange things
- //this.show_login();
window.location.reload();
});
},
@@ -1144,7 +1157,7 @@ instance.web.EmbeddedClient = instance.web.Client.extend({
start: function() {
var self = this;
return $.when(this._super()).pipe(function() {
- return instance.connection.session_authenticate(self.dbname, self.login, self.key, true).pipe(function() {
+ return instance.session.session_authenticate(self.dbname, self.login, self.key, true).pipe(function() {
return self.rpc("/web/action/load", { action_id: self.action_id }, function(result) {
var action = result.result;
action.flags = _.extend({
diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js
index a46d6314ebe..5da12043994 100644
--- a/addons/web/static/src/js/corelib.js
+++ b/addons/web/static/src/js/corelib.js
@@ -692,7 +692,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, {
instance.web.WidgetMixin.init.call(this,parent);
// FIXME: this should not be
this.setElement(this._make_descriptive());
- this.session = instance.connection;
+ this.session = instance.session;
},
/**
* Renders the element. The default implementation renders the widget using QWeb,
@@ -841,7 +841,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, {
rpc: function(url, data, success, error) {
var def = $.Deferred().then(success, error);
var self = this;
- instance.connection.rpc(url, data). then(function() {
+ instance.session.rpc(url, data). then(function() {
if (!self.isDestroyed())
def.resolve.apply(def, arguments);
}, function() {
@@ -863,7 +863,7 @@ instance.web.Registry = instance.web.Class.extend({
*
* An object path is simply a dotted name from the instance root to the
* object pointed to (e.g. ``"instance.web.Session"`` for an OpenERP
- * connection object).
+ * session object).
*
* @constructs instance.web.Registry
* @param {Object} mapping a mapping of keys to object-paths
diff --git a/addons/web/static/src/js/coresetup.js b/addons/web/static/src/js/coresetup.js
index 6ba62162e93..229a82a1784 100644
--- a/addons/web/static/src/js/coresetup.js
+++ b/addons/web/static/src/js/coresetup.js
@@ -11,32 +11,6 @@ if (!console.debug) {
openerp.web.coresetup = function(instance) {
-/**
- * @deprecated use :class:`instance.web.Widget`
- */
-instance.web.OldWidget = instance.web.Widget.extend({
- init: function(parent, element_id) {
- this._super(parent);
- this.element_id = element_id;
- this.element_id = this.element_id || _.uniqueId('widget-');
-
- var tmp = document.getElementById(this.element_id);
- this.setElement(tmp || this._make_descriptive());
- },
- renderElement: function() {
- var rendered = this.render();
- if (rendered) {
- this.replaceElement($(rendered));
- }
- return this;
- },
- render: function (additional) {
- if (this.template)
- return instance.web.qweb.render(this.template, _.extend({widget: this}, additional || {}));
- return null;
- }
-});
-
/** Session openerp specific RPC class */
instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Session# */{
init: function() {
@@ -540,7 +514,7 @@ $.async_when = function() {
// special tweak for the web client
var old_async_when = $.async_when;
$.async_when = function() {
- if (instance.connection.synch)
+ if (instance.session.synch)
return $.when.apply(this, arguments);
else
return old_async_when.apply(this, arguments);
@@ -549,43 +523,56 @@ $.async_when = function() {
/** Setup blockui */
if ($.blockUI) {
$.blockUI.defaults.baseZ = 1100;
- $.blockUI.defaults.message = '<div class="oe_blockui_spin" style="height: 50px">';
+ $.blockUI.defaults.message = '<div class="oe_blockui_spin_container">';
$.blockUI.defaults.css.border = '0';
$.blockUI.defaults.css["background-color"] = '';
- $.blockUI.spinners = [];
}
+
+instance.web.Throbber = instance.web.Widget.extend({
+ template: "Throbber",
+ start: function() {
+ var opts = {
+ lines: 13, // The number of lines to draw
+ length: 7, // The length of each line
+ width: 4, // The line thickness
+ radius: 10, // The radius of the inner circle
+ rotate: 0, // The rotation offset
+ color: '#FFF', // #rgb or #rrggbb
+ speed: 1, // Rounds per second
+ trail: 60, // Afterglow percentage
+ shadow: false, // Whether to render a shadow
+ hwaccel: false, // Whether to use hardware acceleration
+ className: 'spinner', // The CSS class to assign to the spinner
+ zIndex: 2e9, // The z-index (defaults to 2000000000)
+ top: 'auto', // Top position relative to parent in px
+ left: 'auto' // Left position relative to parent in px
+ };
+ this.spin = new Spinner(opts).spin(this.$element[0]);
+ },
+ destroy: function() {
+ if (this.spin)
+ this.spin.stop();
+ this._super();
+ },
+});
+instance.web.Throbber.throbbers = [];
+
instance.web.blockUI = function() {
var tmp = $.blockUI.apply($, arguments);
- var target = $(".oe_blockui_spin")[0];
- var opts = {
- lines: 13, // The number of lines to draw
- length: 7, // The length of each line
- width: 4, // The line thickness
- radius: 10, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#FFF', // #rgb or #rrggbb
- speed: 1, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 2e9, // The z-index (defaults to 2000000000)
- top: 'auto', // Top position relative to parent in px
- left: 'auto' // Left position relative to parent in px
- };
- var spinner = new Spinner(opts).spin(target);
- $.blockUI.spinners.push(spinner);
+ var throbber = new instance.web.Throbber();
+ instance.web.Throbber.throbbers.push(throbber);
+ throbber.appendTo($(".oe_blockui_spin_container"));
return tmp;
}
instance.web.unblockUI = function() {
- _.each($.blockUI.spinners, function(el) {
- el.stop();
+ _.each(instance.web.Throbber.throbbers, function(el) {
+ el.destroy();
});
return $.unblockUI.apply($, arguments);
}
/** Setup default session */
-instance.connection = new instance.web.Session();
+instance.session = new instance.web.Session();
/** Configure default qweb */
instance.web._t = new instance.web.TranslationDataBase().build_translation_function();
@@ -604,8 +591,8 @@ instance.web._lt = function (s) {
return {toString: function () { return instance.web._t(s); }}
};
instance.web.qweb = new QWeb2.Engine();
-instance.web.qweb.default_dict['__debug__'] = instance.connection.debug; // Which one ?
-instance.web.qweb.debug = instance.connection.debug;
+instance.web.qweb.default_dict['__debug__'] = instance.session.debug; // Which one ?
+instance.web.qweb.debug = instance.session.debug;
instance.web.qweb.default_dict = {
'_' : _,
'_t' : instance.web._t
@@ -662,7 +649,7 @@ var _t = instance.web._t;
_t('%d years ago');
}
-instance.connection.on('module_loaded', this, function () {
+instance.session.on('module_loaded', this, function () {
// provide timeago.js with our own translator method
$.timeago.settings.translator = instance.web._t;
});
diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js
index 2589afe5503..10fd727e57a 100644
--- a/addons/web/static/src/js/data.js
+++ b/addons/web/static/src/js/data.js
@@ -58,7 +58,7 @@ instance.web.Query = instance.web.Class.extend({
},
_execute: function () {
var self = this;
- return instance.connection.rpc('/web/dataset/search_read', {
+ return instance.session.rpc('/web/dataset/search_read', {
model: this._model.name,
fields: this._fields || false,
domain: this._model.domain(this._filter),
@@ -233,7 +233,7 @@ instance.web.Model = instance.web.Class.extend(/** @lends openerp.web.Model# */{
kwargs = args;
args = [];
}
- return instance.connection.rpc('/web/dataset/call_kw', {
+ return instance.session.rpc('/web/dataset/call_kw', {
model: this.name,
method: method,
args: args,
@@ -256,7 +256,7 @@ instance.web.Model = instance.web.Class.extend(/** @lends openerp.web.Model# */{
* @param {String} signal signal to trigger on the workflow
*/
exec_workflow: function (id, signal) {
- return instance.connection.rpc('/web/dataset/exec_workflow', {
+ return instance.session.rpc('/web/dataset/exec_workflow', {
model: this.name,
id: id,
signal: signal
@@ -282,7 +282,7 @@ instance.web.Model = instance.web.Class.extend(/** @lends openerp.web.Model# */{
*/
context: function (context) {
return new instance.web.CompoundContext(
- instance.connection.user_context, this._context, context || {});
+ instance.session.user_context, this._context, context || {});
},
/**
* Button action caller, needs to perform cleanup if an action is returned
@@ -292,7 +292,7 @@ instance.web.Model = instance.web.Class.extend(/** @lends openerp.web.Model# */{
* FIXME: remove when evaluator integrated
*/
call_button: function (method, args) {
- return instance.connection.rpc('/web/dataset/call_button', {
+ return instance.session.rpc('/web/dataset/call_button', {
model: this.name,
method: method,
domain_id: null,
@@ -439,7 +439,7 @@ instance.web.data = {
})
};
-instance.web.DataGroup = instance.web.OldWidget.extend( /** @lends openerp.web.DataGroup# */{
+instance.web.DataGroup = instance.web.CallbackEnabled.extend( /** @lends openerp.web.DataGroup# */{
/**
* Management interface between views and grouped collections of OpenERP
* records.
@@ -451,9 +451,9 @@ instance.web.DataGroup = instance.web.OldWidget.extend( /** @lends openerp.web.
* content of the current grouping level.
*
* @constructs instance.web.DataGroup
- * @extends instance.web.OldWidget
+ * @extends instance.web.CallbackEnabled
*
- * @param {instance.web.OldWidget} parent widget
+ * @param {instance.web.CallbackEnabled} parent widget
* @param {String} model name of the model managed by this DataGroup
* @param {Array} domain search domain for this DataGroup
* @param {Object} context context of the DataGroup's searches
@@ -524,13 +524,13 @@ instance.web.StaticDataGroup = instance.web.GrouplessDataGroup.extend( /** @lend
}
});
-instance.web.DataSet = instance.web.OldWidget.extend( /** @lends openerp.web.DataSet# */{
+instance.web.DataSet = instance.web.CallbackEnabled.extend( /** @lends openerp.web.DataSet# */{
/**
* DateaManagement interface between views and the collection of selected
* OpenERP records (represents the view's state?)
*
* @constructs instance.web.DataSet
- * @extends instance.web.OldWidget
+ * @extends instance.web.CallbackEnabled
*
* @param {String} model the OpenERP model this dataset will manage
*/
@@ -706,7 +706,7 @@ instance.web.DataSet = instance.web.OldWidget.extend( /** @lends openerp.web.Da
* @returns {$.Deferred}
*/
call_and_eval: function (method, args, domain_index, context_index, callback, error_callback) {
- return this.rpc('/web/dataset/call', {
+ return instance.session.rpc('/web/dataset/call', {
model: this.model,
method: method,
domain_id: domain_index == undefined ? null : domain_index,
@@ -805,6 +805,22 @@ instance.web.DataSet = instance.web.OldWidget.extend( /** @lends openerp.web.Da
alter_ids: function(n_ids) {
this.ids = n_ids;
},
+ /**
+ * Resequence records.
+ *
+ * @param {Array} ids identifiers of the records to resequence
+ * @returns {$.Deferred}
+ */
+ resequence: function (ids, options) {
+ options = options || {};
+ return instance.session.rpc('/web/dataset/resequence', {
+ model: this.model,
+ ids: ids,
+ context: this._model.context(options.context),
+ }).pipe(function (results) {
+ return results;
+ });
+ },
});
instance.web.DataSetStatic = instance.web.DataSet.extend({
init: function(parent, model, context, ids) {
diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js
index 53daa40ae31..a7625631aa5 100644
--- a/addons/web/static/src/js/search.js
+++ b/addons/web/static/src/js/search.js
@@ -635,6 +635,16 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
return null;
}
},
+
+ add_common_inputs: function() {
+ // add Filters to this.inputs, need view.controls filled
+ (new instance.web.search.Filters(this));
+ // add custom filters to this.inputs
+ (new instance.web.search.CustomFilters(this));
+ // add Advanced to this.inputs
+ (new instance.web.search.Advanced(this));
+ },
+
on_loaded: function(data) {
var self = this;
this.fields_view = data.fields_view;
@@ -649,20 +659,13 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
data.fields_view['arch'].children,
data.fields_view.fields);
- // add Filters to this.inputs, need view.controls filled
- (new instance.web.search.Filters(this));
- // add custom filters to this.inputs
- (new instance.web.search.CustomFilters(this));
- // add Advanced to this.inputs
- (new instance.web.search.Advanced(this));
+ this.add_common_inputs();
// build drawer
var drawer_started = $.when.apply(
null, _(this.select_for_drawer()).invoke(
'appendTo', this.$element.find('.oe_searchview_drawer')));
- new instance.web.search.AddToReporting(this).appendTo($('.oe_searchview_drawer', this.$element));
-
// load defaults
var defaults_fetched = $.when.apply(null, _(this.inputs).invoke(
'facet_for_defaults', this.defaults)).then(function () {
@@ -683,9 +686,6 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
case 'advanced_filter':
this.extended_search.on_activate();
break;
- case 'add_to_dashboard':
- this.on_add_to_dashboard();
- break;
case '':
this.do_clear();
}
@@ -1613,7 +1613,7 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({
}
var filter = {
name: $name.val(),
- user_id: private_filter ? instance.connection.uid : false,
+ user_id: private_filter ? instance.session.uid : false,
model_id: self.view.model,
context: results.context,
domain: results.domain
@@ -1678,74 +1678,6 @@ instance.web.search.Filters = instance.web.search.Input.extend({
}));
}
});
-instance.web.search.AddToReporting = instance.web.Widget.extend({
- template: 'SearchView.addtoreporting',
- _in_drawer: true,
- start: function () {
- var self = this;
- this.$element
- .on('click', 'h4', this.proxy('show_option'))
- .on('submit', 'form', function (e) {
- e.preventDefault();
- self.add_dashboard();
- });
- return this.load_data().then(this.proxy("render_data"));
- },
- load_data:function(){
- if (!instance.webclient) { return $.Deferred().reject(); }
- var dashboard_menu = instance.webclient.menu.data.data.children;
- return new instance.web.Model('ir.model.data')
- .query(['res_id'])
- .filter([['name','=','menu_reporting_dashboard']])
- .first().pipe(function (result) {
- var menu = _(dashboard_menu).chain()
- .pluck('children')
- .flatten(true)
- .find(function (child) { return child.id === result.res_id; })
- .value();
- return menu ? menu.children : [];
- });
- },
- render_data: function(dashboard_choices){
- var selection = instance.web.qweb.render(
- "SearchView.addtoreporting.selection", {
- selections: dashboard_choices});
- this.$("input").before(selection)
- },
- add_dashboard:function(){
- var self = this;
- var getParent = this.getParent();
- var view_parent = this.getParent().getParent();
- if (! view_parent.action || ! this.$element.find("select").val())
- return this.do_warn("Can't find dashboard action");
- var data = getParent.build_search_data();
- var context = new instance.web.CompoundContext(getParent.dataset.get_context() || []);
- var domain = new instance.web.CompoundDomain(getParent.dataset.get_domain() || []);
- _.each(data.contexts, context.add, context);
- _.each(data.domains, domain.add, domain);
- this.rpc('/web/searchview/add_to_dashboard', {
- menu_id: this.$element.find("select").val(),
- action_id: view_parent.action.id,
- context_to_save: context,
- domain: domain,
- view_mode: view_parent.active_view,
- name: this.$element.find("input").val()
- }, function(r) {
- if (r === false) {
- self.do_warn("Could not add filter to dashboard");
- } else {
- self.$element.toggleClass('oe_opened');
- self.do_notify("Filter added to dashboard", '');
- }
- });
- },
- show_option:function(){
- this.$element.toggleClass('oe_opened');
- if (! this.$element.hasClass('oe_opened'))
- return;
- this.$("input").val(this.getParent().fields_view.name || "" );
- }
-});
instance.web.search.Advanced = instance.web.search.Input.extend({
template: 'SearchView.advanced',
@@ -1805,11 +1737,11 @@ instance.web.search.Advanced = instance.web.search.Input.extend({
}
});
-instance.web.search.ExtendedSearchProposition = instance.web.OldWidget.extend(/** @lends instance.web.search.ExtendedSearchProposition# */{
+instance.web.search.ExtendedSearchProposition = instance.web.Widget.extend(/** @lends instance.web.search.ExtendedSearchProposition# */{
template: 'SearchView.extended_search.proposition',
/**
* @constructs instance.web.search.ExtendedSearchProposition
- * @extends instance.web.OldWidget
+ * @extends instance.web.Widget
*
* @param parent
* @param fields
diff --git a/addons/web/static/src/js/test_support.js b/addons/web/static/src/js/test_support.js
index d46366326b7..314a12c91c6 100644
--- a/addons/web/static/src/js/test_support.js
+++ b/addons/web/static/src/js/test_support.js
@@ -1,12 +1,12 @@
openerp.test_support = {
- setup_connection: function (connection) {
+ setup_session: function (session) {
var origin = location.protocol+"//"+location.host;
- _.extend(connection, {
+ _.extend(session, {
origin: origin,
prefix: origin,
server: origin, // keep chs happy
//openerp.web.qweb.default_dict['_s'] = this.origin;
- rpc_function: connection.rpc_json,
+ rpc_function: session.rpc_json,
session_id: false,
uid: false,
username: false,
@@ -22,7 +22,7 @@ openerp.test_support = {
shortcuts: [],
active_id: null
});
- return connection.session_reload();
+ return session.session_reload();
},
module: function (title, tested_core, nonliterals) {
var conf = QUnit.config.openerp = {};
@@ -31,10 +31,10 @@ openerp.test_support = {
QUnit.stop();
var oe = conf.openerp = window.openerp.init();
window.openerp.web[tested_core](oe);
- var done = openerp.test_support.setup_connection(oe.connection);
+ var done = openerp.test_support.setup_session(oe.session);
if (nonliterals) {
done = done.pipe(function () {
- return oe.connection.rpc('/tests/add_nonliterals', {
+ return oe.session.rpc('/tests/add_nonliterals', {
domains: nonliterals.domains || [],
contexts: nonliterals.contexts || []
}).then(function (r) {
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index b8acdfea4cd..208ee3c0edb 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -255,7 +255,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
/**
*
* @param {Object} [options]
- * @param {Boolean} [editable=false] whether the form should be switched to edition mode. A value of ``false`` will keep the current mode.
+ * @param {Boolean} [mode=undefined] If specified, switch the form to specified mode. Can be "edit" or "view".
* @param {Boolean} [reload=true] whether the form should reload its content on show, or use the currently loaded record
* @return {$.Deferred}
*/
@@ -292,9 +292,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
});
}
return shown.pipe(function() {
- if (options.editable) {
- self.to_edit_mode();
- }
+ self._actualize_mode(options.mode || self.options.initial_mode);
self.$element.css({
opacity: '1',
filter: 'alpha(opacity = 100)'
@@ -634,12 +632,21 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
this._actualize_mode("edit");
},
/**
- * Reactualize actual_mode.
+ * Ask the view to switch to a precise mode if possible. The view is free to
+ * not respect this command if the state of the dataset is not compatible with
+ * the new mode. For example, it is not possible to switch to edit mode if
+ * the current record is not yet saved in database.
+ *
+ * @param {string} [new_mode] Can be "edit", "view", "create" or undefined. If
+ * undefined the view will test the actual mode to check if it is still consistent
+ * with the dataset state.
*/
_actualize_mode: function(switch_to) {
var mode = switch_to || this.get("actual_mode");
if (! this.datarecord.id) {
mode = "create";
+ } else if (mode === "create") {
+ mode = "edit";
}
this.set({actual_mode: mode});
},
@@ -1656,7 +1663,7 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
template = 'WidgetLabel.tooltip';
}
return QWeb.render(template, {
- debug: instance.connection.debug,
+ debug: instance.session.debug,
widget: widget
})},
gravity: $.fn.tipsy.autoBounds(50, 'nw'),
@@ -1733,7 +1740,7 @@ instance.web.form.WidgetButton = instance.web.form.FormWidget.extend({
start: function() {
this._super.apply(this, arguments);
this.$element.click(this.on_click);
- if (this.node.attrs.help || instance.connection.debug) {
+ if (this.node.attrs.help || instance.session.debug) {
this.do_attach_tooltip();
}
this.setupFocus(this.$element);
@@ -1930,7 +1937,7 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
}, this));
}
this.$label = this.view.$element.find('label[for=' + this.id_for_label + ']');
- if (instance.connection.debug) {
+ if (instance.session.debug) {
this.do_attach_tooltip(this, this.$label[0] || this.$element);
this.$label.off('dblclick').on('dblclick', function() {
console.log("Field '%s' of type '%s' in View: %o", self.name, (self.node.attrs.widget || self.field.type), self.view);
@@ -2173,7 +2180,7 @@ instance.web.form.FieldFloat = instance.web.form.FieldChar.extend({
}
});
-instance.web.DateTimeWidget = instance.web.OldWidget.extend({
+instance.web.DateTimeWidget = instance.web.Widget.extend({
template: "web.datepicker",
jqueryui_object: 'datetimepicker',
type_of_date: "datetime",
@@ -2394,44 +2401,54 @@ instance.web.form.FieldText = instance.web.form.AbstractField.extend(instance.we
* To find more information about CLEditor configutation: go to
* http://premiumsoftware.net/cleditor/docs/GettingStarted.html
*/
-instance.web.form.FieldTextHtml = instance.web.form.FieldText.extend({
-
- initialize_content: function() {
- this.$textarea = this.$element.find('textarea');
- var width = ((this.node.attrs || {}).editor_width || 468);
- var height = ((this.node.attrs || {}).editor_height || 100);
- this.$textarea.cleditor({
- width: width, // width not including margins, borders or padding
- height: height, // height not including margins, borders or padding
- controls: // controls to add to the toolbar
- "bold italic underline strikethrough | size " +
- "| removeformat | bullets numbering | outdent " +
- "indent | link unlink",
- sizes: // sizes in the font size popup
- "1,2,3,4,5,6,7",
- bodyStyle: // style to assign to document body contained within the editor
- "margin:4px; font:12px monospace; cursor:text; color:#1F1F1F"
- });
- this.$cleditor = this.$textarea.cleditor()[0];
- // call super now, because cleditor resets the disable attr
+instance.web.form.FieldTextHtml = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
+ template: 'FieldTextHtml',
+ init: function() {
this._super.apply(this, arguments);
- // propagate disabled property to cleditor
- this.$cleditor.disable(this.$textarea.prop('disabled'));
+ if (this.field.type !== 'html') {
+ throw new Error(_.str.sprintf(
+ _t("Error with field %s, it is not allowed to use the widget 'html' with any other field type than 'html'"), this.string));
+ }
+ },
+ initialize_content: function() {
+ var self = this;
+ if (! this.get("effective_readonly")) {
+ self._updating_editor = false;
+ this.$textarea = this.$element.find('textarea');
+ var width = ((this.node.attrs || {}).editor_width || 468);
+ var height = ((this.node.attrs || {}).editor_height || 100);
+ this.$textarea.cleditor({
+ width: width, // width not including margins, borders or padding
+ height: height, // height not including margins, borders or padding
+ controls: // controls to add to the toolbar
+ "bold italic underline strikethrough " +
+ "| removeformat | bullets numbering | outdent " +
+ "indent | link unlink | source",
+ bodyStyle: // style to assign to document body contained within the editor
+ "margin:4px; font:12px monospace; cursor:text; color:#1F1F1F"
+ });
+ this.$cleditor = this.$textarea.cleditor()[0];
+ this.$cleditor.change(function() {
+ if (! self._updating_editor) {
+ self.$cleditor.updateTextArea();
+ self.set({'value': self.$textarea.val()});
+ }
+ });
+ }
},
-
set_value: function(value_) {
this._super.apply(this, arguments);
- this._dirty_flag = true;
+ this.render_value();
},
-
render_value: function() {
- this._super.apply(this, arguments);
- this.$cleditor.updateFrame();
- },
-
- get_value: function() {
- this.$cleditor.updateTextArea();
- return this.$textarea.val();
+ if (! this.get("effective_readonly")) {
+ this.$textarea.val(this.get('value'));
+ this._updating_editor = true;
+ this.$cleditor.updateFrame();
+ this._updating_editor = false;
+ } else {
+ this.$element.html(this.get('value'));
+ }
},
});
@@ -2706,6 +2723,11 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
this.floating = false;
this.render_value();
});
+ instance.web.bus.on('click', this, function() {
+ if (!this.get("effective_readonly") && this.$input && this.$input.autocomplete('widget').is(':visible')) {
+ this.$input.autocomplete("close");
+ }
+ });
},
initialize_content: function() {
if (!this.get("effective_readonly"))
@@ -2784,8 +2806,8 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
}
}
});
- var tip_def = $.Deferred();
- var untip_def = $.Deferred();
+ self.tip_def = $.Deferred();
+ self.untip_def = $.Deferred();
var tip_delay = 200;
var tip_duration = 15000;
var anyoneLoosesFocus = function() {
@@ -2807,24 +2829,25 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
}
self.floating = false;
}
- if (used && self.get("value") === false) {
- tip_def.reject();
- untip_def.reject();
- tip_def = $.Deferred();
- tip_def.then(function() {
+ if (used && self.get("value") === false && ! self.no_tipsy) {
+ self.tip_def.reject();
+ self.untip_def.reject();
+ self.tip_def = $.Deferred();
+ self.tip_def.then(function() {
self.$input.tipsy("show");
});
setTimeout(function() {
- tip_def.resolve();
- untip_def.reject();
- untip_def = $.Deferred();
- untip_def.then(function() {
+ self.tip_def.resolve();
+ self.untip_def.reject();
+ self.untip_def = $.Deferred();
+ self.untip_def.then(function() {
self.$input.tipsy("hide");
});
- setTimeout(function() {untip_def.resolve();}, tip_duration);
+ setTimeout(function() {self.untip_def.resolve();}, tip_duration);
}, tip_delay);
} else {
- tip_def.reject();
+ self.no_tipsy = false;
+ self.tip_def.reject();
}
};
this.$input.focusout(anyoneLoosesFocus);
@@ -2953,7 +2976,17 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
},
focus: function () {
this.$input.focus();
- }
+ },
+ _quick_create: function() {
+ this.no_tipsy = true;
+ this.tip_def.reject();
+ return instance.web.form.CompletionFieldMixin._quick_create.apply(this, arguments);
+ },
+ _search_create_popup: function() {
+ this.no_tipsy = true;
+ this.tip_def.reject();
+ return instance.web.form.CompletionFieldMixin._search_create_popup.apply(this, arguments);
+ },
});
/*
@@ -4078,7 +4111,7 @@ instance.web.form.Many2ManyQuickCreate = instance.web.Widget.extend({
/**
* Class with everything which is common between FormOpenPopup and SelectCreatePopup.
*/
-instance.web.form.AbstractFormPopup = instance.web.OldWidget.extend({
+instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
template: "AbstractFormPopup.render",
/**
* options:
@@ -4156,7 +4189,10 @@ instance.web.form.AbstractFormPopup = instance.web.OldWidget.extend({
this.view_form.appendTo(this.$element.find(".oe_popup_form"));
this.view_form.on_loaded.add_last(function() {
var multi_select = self.row_id === null && ! self.options.disable_multiple_selection;
- self.$buttonpane.html(QWeb.render("AbstractFormPopup.buttons", {multi_select: multi_select}));
+ self.$buttonpane.html(QWeb.render("AbstractFormPopup.buttons", {
+ multi_select: multi_select,
+ readonly: self.row_id !== null && self.options.readonly,
+ }));
var $snbutton = self.$buttonpane.find(".oe_abstractformpopup-form-save-new");
$snbutton.click(function() {
$.when(self.view_form.do_save()).then(function() {
@@ -4177,11 +4213,6 @@ instance.web.form.AbstractFormPopup = instance.web.OldWidget.extend({
$cbutton.click(function() {
self.check_exit();
});
- if (self.row_id !== null && self.options.readonly) {
- $snbutton.hide();
- $sbutton.hide();
- $cbutton.text(_t("Close"));
- }
self.view_form.do_show();
});
},
@@ -4318,11 +4349,12 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
});
},
on_click_element: function(ids) {
+ var self = this;
this.selected_ids = ids || [];
if(this.selected_ids.length > 0) {
- this.$element.find(".oe_selectcreatepopup-search-select").removeAttr('disabled');
+ self.$buttonpane.find(".oe_selectcreatepopup-search-select").removeAttr('disabled');
} else {
- this.$element.find(".oe_selectcreatepopup-search-select").attr('disabled', "disabled");
+ self.$buttonpane.find(".oe_selectcreatepopup-search-select").attr('disabled', "disabled");
}
},
new_object: function() {
@@ -4616,8 +4648,9 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
if (this.get('value') && ! /^\d+(\.\d*)? \w+$/.test(this.get('value'))) {
url = 'data:image/png;base64,' + this.get('value');
} else if (this.get('value')) {
+ var id = escape(JSON.stringify(this.view.datarecord.id || null));
url = '/web/binary/image?session_id=' + this.session.session_id + '&model=' +
- this.view.dataset.model +'&id=' + (this.view.datarecord.id || '') + '&field=' + this.name + '&t=' + (new Date().getTime());
+ this.view.dataset.model +'&id=' + id + '&field=' + this.name + '&t=' + (new Date().getTime());
} else {
url = "/web/static/src/img/placeholder.png";
}
@@ -4793,7 +4826,7 @@ instance.web.form.widgets = new instance.web.Registry({
'email' : 'instance.web.form.FieldEmail',
'url' : 'instance.web.form.FieldUrl',
'text' : 'instance.web.form.FieldText',
- 'text_html' : 'instance.web.form.FieldTextHtml',
+ 'html' : 'instance.web.form.FieldTextHtml',
'date' : 'instance.web.form.FieldDate',
'datetime' : 'instance.web.form.FieldDatetime',
'selection' : 'instance.web.form.FieldSelection',
diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js
index 986b0e49faf..95dfa78fd63 100644
--- a/addons/web/static/src/js/view_list.js
+++ b/addons/web/static/src/js/view_list.js
@@ -2059,7 +2059,7 @@ instance.web.list.Button = instance.web.list.Column.extend({
title: this.string || '',
additional_attributes: isNaN(row_data["id"].value) && instance.web.BufferedDataSet.virtual_id_regex.test(row_data["id"].value) ?
'disabled="disabled" class="oe_list_button_disabled"' : '',
- prefix: instance.connection.prefix,
+ prefix: instance.session.prefix,
icon: this.icon,
alt: this.string || ''
});
@@ -2086,7 +2086,7 @@ instance.web.list.Binary = instance.web.list.Column.extend({
var text = _t("Download");
var download_url = _.str.sprintf(
'/web/binary/saveas?session_id=%s&model=%s&field=%s&id=%d',
- instance.connection.session_id, options.model, this.id, options.id);
+ instance.session.session_id, options.model, this.id, options.id);
if (this.filename) {
download_url += '&filename_field=' + this.filename;
if (row_data[this.filename]) {
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index 2845d9afb73..0831d0c5f8e 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -159,7 +159,9 @@ instance.web.ActionManager = instance.web.Widget.extend({
//state = _.extend(this.inner_action.params || {}, state);
}
}
- this.getParent().do_push_state(state);
+ if(!this.dialog) {
+ this.getParent().do_push_state(state);
+ }
}
},
do_load_state: function(state, warm) {
@@ -222,7 +224,7 @@ instance.web.ActionManager = instance.web.Widget.extend({
}
var type = action.type.replace(/\./g,'_');
var popup = action.target === 'new';
- var inline = action.target === 'inline';
+ var inline = action.target === 'inline' || action.target === 'inlineview';
action.flags = _.extend({
views_switcher : !popup && !inline,
search_view : !popup && !inline,
@@ -241,8 +243,7 @@ instance.web.ActionManager = instance.web.Widget.extend({
this.dialog_stop();
this.clear_breadcrumbs();
},
-
- do_ir_actions_common: function(action, on_close) {
+ ir_actions_common: function(action, on_close) {
var self = this, klass, widget, post_process;
if (action.type === 'ir.actions.client') {
var ClientWidget = instance.web.client_actions.get_object(action.tag);
@@ -286,16 +287,8 @@ instance.web.ActionManager = instance.web.Widget.extend({
this.inner_widget.appendTo(this.$element);
}
},
-
ir_actions_act_window: function (action, on_close) {
var self = this;
- if (_(['base.module.upgrade', 'base.setup.installer'])
- .contains(action.res_model)) {
- var old_close = on_close;
- on_close = function () {
- instance.webclient.do_reload().then(old_close);
- };
- }
if (action.target !== 'new') {
if(action.menu_id) {
this.dialog_stop();
@@ -304,10 +297,10 @@ instance.web.ActionManager = instance.web.Widget.extend({
});
}
}
- return this.do_ir_actions_common(action, on_close);
+ return this.ir_actions_common(action, on_close);
},
ir_actions_client: function (action, on_close) {
- return this.do_ir_actions_common(action, on_close);
+ return this.ir_actions_common(action, on_close);
},
ir_actions_act_window_close: function (action, on_closed) {
if (!this.dialog && on_closed) {
@@ -350,9 +343,6 @@ instance.web.ActionManager = instance.web.Widget.extend({
ir_actions_act_url: function (action) {
window.open(action.url, action.target === 'self' ? '_self' : '_blank');
},
- ir_ui_menu: function (action) {
- this.getParent().do_action(action);
- }
});
instance.web.ViewManager = instance.web.Widget.extend({
@@ -475,17 +465,12 @@ instance.web.ViewManager = instance.web.Widget.extend({
// Lazy loading of views
var self = this;
var view = this.views[view_type];
- var controllerclass = this.registry.get_object(view_type);
+ var viewclass = this.registry.get_object(view_type);
var options = _.clone(view.options);
- if (view_type === "form" && this.action) {
- switch (this.action.target) {
- case 'new':
- case 'inline':
- options.initial_mode = 'edit';
- break;
- }
+ if (view_type === "form" && this.action && (this.action.target == 'new' || this.action.target == 'inline')) {
+ options.initial_mode = 'edit';
}
- var controller = new controllerclass(this, this.dataset, view.view_id, options);
+ var controller = new viewclass(this, this.dataset, view.view_id, options);
controller.on('history_back', this, function() {
var am = self.getParent();
@@ -1179,7 +1164,6 @@ instance.web.TranslateDialog = instance.web.Dialog.extend({
});
instance.web.View = instance.web.Widget.extend({
- template: "EmptyComponent",
// name displayed in view switchers
display_name: '',
/**
@@ -1349,12 +1333,10 @@ instance.web.View = instance.web.Widget.extend({
do_search: function(view) {
},
on_sidebar_import: function() {
- var import_view = new instance.web.DataImport(this, this.dataset);
- import_view.start();
+ new instance.web.DataImport(this, this.dataset).open();
},
on_sidebar_export: function() {
- var export_view = new instance.web.DataExport(this, this.dataset);
- export_view.start();
+ new instance.web.DataExport(this, this.dataset).open();
},
on_sidebar_translate: function() {
return this.do_action({
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 6de9286be68..ee5183d8e5c 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -121,25 +121,25 @@
</select>
</t>
+
<t t-name="DatabaseManager">
- <div class="oe_database_manager">
- <div class="oe_database_manager_menu">
- <ul class="oe_notebook">
- <li><a href="#db_create">Create</a></li>
- <li><a href="#db_drop">Drop</a></li>
- <li><a href="#db_backup">Backup</a></li>
- <li><a href="#db_restore">Restore</a></li>
- <li><a href="#db_change_password">Password</a></li>
- <li><a id="back_to_login" href="#">Back to Login</a></li>
- </ul>
- <form id="db_create" name="create_db_form" method="POST">
+ <div class="oe_view_manager_view_form">
+ <div class="oe_form">
+ <form id="db_create" name="create_db_form" style="display: block;">
+ <div class="oe_view_manager oe_view_manager_current">
+ <div class="oe_view_manager_header" style="padding: 8px;">
+ <div class="oe_header_row">
+ <h2 class="oe_view_title">
+ <span class="oe_view_title_text oe_breadcrumb_title">Create Database</span>
+ </h2>
+ <button type="submit" class="oe_button oe_highlight db_create">Create</button>
+ </div>
+ </div>
+ </div>
<table align="center" class="db_option_table">
<tr>
- <th colspan="2" class="option_string"> CREATE DATABASE </th>
- </tr>
- <tr>
<td><label for="super_admin_pwd">Master password:</label></td>
- <td><input type="password" name="super_admin_pwd" class="required" value="admin"/></td>
+ <td><input type="password" name="super_admin_pwd" class="required" value="admin" /></td>
</tr>
<tr>
<td><label for="db_name">New database name:</label></td>
@@ -147,42 +147,54 @@
</tr>
<tr>
<td><label for="demo_data">Load Demonstration data:</label></td>
- <td><input type="checkbox" name="demo_data"/></td>
+ <td class="oe_form_group_cell">
+ <span class="oe_form_field oe_form_field_boolean">
+ <input type="checkbox" name="demo_data" />
+ </span>
+ </td>
</tr>
<tr>
<td><label for="db_lang">Default language:</label></td>
- <td>
+ <td class="oe_form_field oe_form_field_selection ">
<select name="db_lang" t-if="widget.lang_list">
<t t-foreach="widget.lang_list" t-as="lang">
- <option t-att-value="lang[0]" t-att-selected="lang[0] === 'en_US' ? 'selected' : undefined"><t t-esc="lang[1]"/></option>
+ <option t-att-value="lang[0]" t-att-selected="lang[0] === 'en_US' ? 'selected' : undefined">
+ <t t-esc="lang[1]" />
+ </option>
</t>
</select>
</td>
</tr>
<tr>
<td><label for="create_admin_pwd">Admin password:</label></td>
- <td><input type="password" name="create_admin_pwd" class="required"/></td>
+ <td><input type="password" name="create_admin_pwd" class="required" /></td>
</tr>
<tr>
<td><label for="create_confirm_pwd">Confirm password:</label></td>
<td><input type="password" name="create_confirm_pwd" class="required" equalTo="input[name=create_admin_pwd]"/></td>
</tr>
- <tr>
- <td colspan="2" align="right"><button class="oe_button">Create</button></td>
- </tr>
</table>
</form>
- <form id="db_drop" name="drop_db_form" method="POST">
+ <form id="db_drop" name="drop_db_form" style="display: none; ">
+ <div class="oe_view_manager oe_view_manager_current">
+ <div class="oe_view_manager_header" style="padding: 8px;">
+ <div class="oe_header_row">
+ <h2 class="oe_view_title">
+ <span class="oe_view_title_text oe_breadcrumb_title">Drop Database</span>
+ </h2>
+ <button type="submit" class="oe_button oe_highlight db_drop">Drop</button>
+ </div>
+ </div>
+ </div>
<table align="center" class="db_option_table">
<tr>
- <th colspan="2" class="option_string"> DROP DATABASE </th>
- </tr>
- <tr>
<td><label for="drop_db">Database:</label></td>
- <td>
+ <td class="oe_form_field oe_form_field_selection">
<select t-if="widget.db_list" name="drop_db" autofocus="autofocus">
<t t-foreach="widget.db_list" t-as="db">
- <option t-att-value="db"><t t-esc="db"/></option>
+ <option t-att-value="db">
+ <t t-esc="db" />
+ </option>
</t>
</select>
<input t-if="!widget.db_list" name="drop_db" class="required" type="text" autofocus="autofocus"/>
@@ -190,25 +202,31 @@
</tr>
<tr>
<td><label for="drop_password">Master Password:</label></td>
- <td><input type="password" name="drop_pwd" class="required"/></td>
- </tr>
- <tr>
- <td colspan="2" align="right"><button class="oe_button">Drop</button></td>
+ <td><input type="password" name="drop_pwd" class="required" /></td>
</tr>
</table>
</form>
- <form id="db_backup" name="backup_db_form" method="POST" target="backup-target" action="/web/database/backup">
- <input type="hidden" name="token"/>
+ <form id="db_backup" name="backup_db_form" target="backup-target" action="/web/database/backup" style="display: none;">
+ <div class="oe_view_manager oe_view_manager_current">
+ <div class="oe_view_manager_header" style="padding: 8px;">
+ <div class="oe_header_row">
+ <h2 class="oe_view_title">
+ <span class="oe_view_title_text oe_breadcrumb_title">Backup Database</span>
+ </h2>
+ <button type="submit" class="oe_button oe_highlight db_backup">Backup</button>
+ </div>
+ </div>
+ </div>
+ <input type="hidden" name="token" />
<table align="center" class="db_option_table">
<tr>
- <th colspan="2" class="option_string"> BACKUP DATABASE </th>
- </tr>
- <tr>
<td><label for="backup_db">Database:</label></td>
- <td>
+ <td class="oe_form_field oe_form_field_selection ">
<select t-if="widget.db_list" name="backup_db" autofocus="autofocus">
<t t-foreach="widget.db_list" t-as="db">
- <option t-att-value="db"><t t-esc="db"/></option>
+ <option t-att-value="db">
+ <t t-esc="db" />
+ </option>
</t>
</select>
<input t-if="!widget.db_list" name="backup_db" class="required" type="text" autofocus="autofocus"/>
@@ -216,19 +234,23 @@
</tr>
<tr>
<td><label for="backup_pwd">Master Password:</label></td>
- <td><input type="password" name="backup_pwd" class="required"/></td>
- </tr>
- <tr>
- <td colspan="2" align="right"><button class="oe_button">Backup</button></td>
+ <td><input type="password" name="backup_pwd" class="required" /></td>
</tr>
</table>
</form>
- <form id="db_restore" name="restore_db_form" method="POST">
+ <form id="db_restore" name="restore_db_form" style="display: none; ">
+ <div class="oe_view_manager oe_view_manager_current">
+ <div class="oe_view_manager_header" style="padding: 8px;">
+ <div class="oe_header_row">
+ <h2 class="oe_view_title">
+ <span class="oe_view_title_text oe_breadcrumb_title">Restore Database</span>
+ </h2>
+ <button type="submit" class="oe_button oe_highlight db_restore">Restore</button>
+ </div>
+ </div>
+ </div>
<table align="center" class="db_option_table">
<tr>
- <th colspan="2" class="option_string"> RESTORE DATABASE </th>
- </tr>
- <tr>
<td><label for="restore_db">File:</label></td>
<td><input type="file" name="db_file" class="required" autofocus="autofocus"/></td>
</tr>
@@ -240,17 +262,21 @@
<td><label for="new_db">New database name:</label></td>
<td><input type="text" name="new_db" class="required"/></td>
</tr>
- <tr>
- <td colspan="2" align="right"><button class="oe_button">Restore</button></td>
- </tr>
</table>
</form>
- <form id="db_change_password" name="change_pwd_form" method="POST">
+ <form id="db_change_password" name="change_pwd_form" style="display: none;">
+ <div class="oe_view_manager oe_view_manager_current">
+ <div class="oe_view_manager_header" style="padding: 8px;">
+ <div class="oe_header_row">
+ <h2 class="oe_view_title">
+ <span class="oe_view_title_text oe_breadcrumb_title">Change Master Password</span>
+ </h2>
+ <button type="submit" class="oe_button oe_highlight db-change-password">Change Password</button>
+ </div>
+ </div>
+ </div>
<table align="center" class="db_option_table">
<tr>
- <th colspan="2" class="option_string"> CHANGE MASTER PASSWORD </th>
- </tr>
- <tr>
<td><label for="old_pwd">Master password:</label></td>
<td><input type="password" name="old_pwd" class="required" minlength="1" autofocus="autofocus"/></td>
</tr>
@@ -260,16 +286,28 @@
</tr>
<tr>
<td><label for="confirm_pwd">Confirm new master password:</label></td>
- <td><input type="password" name="confirm_pwd" class="required" equalTo="input[name=new_pwd]" minlength="1"/></td>
- </tr>
- <tr>
- <td colspan="2" align="right"><button class="oe_button">Change Password</button></td>
+ <td><input type="password" name="confirm_pwd" class="required" equalTo="input[name=new_pwd]" minlength="1"/> </td>
</tr>
</table>
</form>
</div>
</div>
</t>
+<t t-name="DatabaseManager.user_menu">
+ <span class="oe_right">
+ <a id="back-to-login" href="#"><span class="oe_topbar_item oe_topbar_name">Back to Login</span></a>
+ </span>
+</t>
+<t t-name="DatabaseManager.menu">
+ <div class="oe_secondary_menu_section">Database Management</div>
+ <ul class="oe_secondary_submenu">
+ <li><a href="#db_create">Create</a></li>
+ <li><a href="#db_drop">Drop</a></li>
+ <li><a href="#db_backup">Backup</a></li>
+ <li><a href="#db_restore">Restore</a></li>
+ <li><a href="#db_change_password">Password</a></li>
+ </ul>
+</t>
<t t-name="ChangePassword">
<form name="change_password_form" method="POST">
@@ -282,7 +320,7 @@
<tr>
<td><label for="new_password">New Password:</label></td>
<td><input type="password" name="new_password"
- minlength="1" autofocus="autofocus"/></td>
+ minlength="1"/></td>
</tr>
<tr>
<td><label for="confirm_pwd">Confirm Password:</label></td>
@@ -342,7 +380,7 @@
t-att-data-action-id="menu.action ? menu.action.split(',')[1] : ''">
<t t-esc="menu.name"/>
<t t-if="menu.needaction_enabled and menu.needaction_counter">
- <div class="oe_menu_counter">
+ <div class="oe_tag oe_tag_dark oe_menu_counter">
<t t-esc="menu.needaction_counter"/>
</div>
</t>
@@ -937,6 +975,14 @@
/>
</div>
</t>
+<t t-name="FieldTextHtml">
+ <div t-att-class="'oe_form_field oe_form_field_html' + (widget.get('effective_readonly') ? ' oe_form_embedded_html' : '')"
+ t-att-style="widget.node.attrs.style">
+ <t t-if="! widget.get('effective_readonly')">
+ <textarea/>
+ </t>
+ </div>
+</t>
<t t-name="web.datepicker">
<span>
<t t-set="placeholder" t-value="widget.getParent().node and widget.getParent().node.attrs.placeholder"/>
@@ -1049,7 +1095,7 @@
<span></span>
</span>
<img t-att-src='_s + "/web/static/src/img/form_steps.png"' class="oe_form_steps_arrow" t-if="i &lt; size - 1"/>
- </div>
+ </div>
</li>
</t>
</t>
@@ -1058,13 +1104,8 @@
<div class="oe_form_field_image_controls oe_edit_only">
<t t-call="HiddenInputFile">
<t t-set="fileupload_id" t-value="widget.fileupload_id"/>
- <button class="oe_button" type="button" title="Set Image">
- <img t-att-src='_s + "/web/static/src/img/icons/STOCK_DIRECTORY.png"'/>
- </button>
+ Edit
</t>
- <button class="oe_button oe_form_binary_file_clear" type="button" title="Clear">
- <img t-att-src='_s + "/web/static/src/img/icons/STOCK_MISSING_IMAGE.png"'/>
- </button>
<div class="oe_form_binary_progress" style="display: none">
<img t-att-src='_s + "/web/static/src/img/throbber.gif"' width="16" height="16"/>
<b>Uploading ...</b>
@@ -1235,14 +1276,24 @@
<a class="oe_button oe_selectcreatepopup-search-close oe_bold oe_form_button_cancel" href="javascript:void(0)">Cancel</a>
</t>
<t t-name="AbstractFormPopup.buttons">
- <t t-if="! multi_select">
- <button type="button" class="oe_button oe_abstractformpopup-form-save oe_highlight">Save</button>
- </t>
- <t t-if="multi_select">
- <button type="button" class="oe_button oe_abstractformpopup-form-save-new oe_highlight">Save &amp; New</button>
- <button type="button" class="oe_button oe_abstractformpopup-form-save oe_highlight">Save &amp; Close</button>
+ <t t-if="! readonly">
+ <t t-if="! multi_select">
+ <button type="button" class="oe_button oe_abstractformpopup-form-save oe_highlight">Save</button>
+ </t>
+ <t t-if="multi_select">
+ <button type="button" class="oe_button oe_abstractformpopup-form-save-new oe_highlight">Save &amp; New</button>
+ <button type="button" class="oe_button oe_abstractformpopup-form-save oe_highlight">Save &amp; Close</button>
+ </t>
+ or
</t>
- or <a class="oe_button oe_abstractformpopup-form-close oe_bold oe_form_button_cancel" href="javascript:void(0)">Discard</a>
+ <a class="oe_button oe_abstractformpopup-form-close oe_bold oe_form_button_cancel" href="javascript:void(0)">
+ <t t-if="! readonly">
+ Discard
+ </t>
+ <t t-if="readonly">
+ Close
+ </t>
+ </a>
</t>
<t t-name="One2Many.viewmanager" t-extend="ViewManager">
@@ -1284,7 +1335,7 @@
contenteditable="true"/>
<!-- tabindex: makes div focusable -->
<div t-name="SearchView.FacetView"
- class="oe_searchview_facet"
+ class="oe_tag oe_tag_dark oe_searchview_facet"
tabindex="0"
><span class="oe_facet_remove">x</span
><span class="oe_facet_category oe_i" t-if="widget.model.has('icon')">
@@ -1459,20 +1510,7 @@
<div>
</div>
</div>
-<div t-name="SearchView.addtoreporting" class="oe_searchview_dashboard">
- <h4>Add to Dashboard</h4>
- <form>
- <p><input placeholder="Title of new dashboard item"/></p>
- <button class="oe_apply" type="submit">Add</button>
- </form>
-</div>
-<t t-name="SearchView.addtoreporting.selection">
- <select>
- <option t-foreach="selections" t-as="element"
- t-att-value="element.id || element.res_id ">
- <t t-esc="element.name"/></option>
- </select>
-</t>
+
<div t-name="SearchView.advanced" class="oe_searchview_advanced">
<h4>Advanced Search</h4>
<form>
@@ -1698,5 +1736,12 @@
<div t-name="Many2ManyKanban.quick_create" class="oe_kanban_quick_create">
<input t-att-placeholder="_t('Type name to search')"/>
</div>
-
+<t t-name="Throbber">
+ <div>
+ <div class="oe_blockui_spin" style="height: 50px">
+ </div>
+ <br />
+ <div style="color:white">Loading...</div>
+ </div>
+</t>
</templates>