diff options
Diffstat (limited to 'addons/web/static/src')
| -rw-r--r-- | addons/web/static/src/css/base.css | 257 | ||||
| -rw-r--r-- | addons/web/static/src/css/base.sass | 441 | ||||
| -rw-r--r-- | addons/web/static/src/js/search.js | 434 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 6 | ||||
| -rw-r--r-- | addons/web/static/src/js/views.js | 10 | ||||
| -rw-r--r-- | addons/web/static/src/xml/base.xml | 80 |
6 files changed, 692 insertions, 536 deletions
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index f664baf5319..b234e2738df 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1,4 +1,4 @@ -@charset "utf-8"; +@charset "UTF-8"; @font-face { font-family: "mnmliconsRegular"; src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot"); @@ -994,19 +994,22 @@ background: #f0eeee; border-right: 1px solid #afafb6; text-shadow: none; - padding-bottom: 16px; } -.openerp a.oe_logo { - position: relative; +.openerp .oe_leftbar > div { + height: 100%; + display: table; width: 220px; - display: block; + position: relative; +} +.openerp .oe_leftbar > div a.oe_logo { + display: table-row; text-align: center; } -.openerp a.oe_logo img { +.openerp .oe_leftbar > div a.oe_logo img { margin: 14px 0; border: 0; } -.openerp a.oe_logo .oe_logo_edit { +.openerp .oe_leftbar > div a.oe_logo .oe_logo_edit { margin: 14px 0; position: absolute; top: 1px; @@ -1021,22 +1024,36 @@ -ms-box-sizing: border-box; box-sizing: border-box; } -.openerp a.oe_logo:hover .oe_logo_edit_admin { +.openerp .oe_leftbar > div a.oe_logo:hover .oe_logo_edit_admin { display: block; } -.openerp .oe_footer { - position: fixed; +.openerp .oe_leftbar > div > div { + display: table-row; + height: 100%; +} +.openerp .oe_leftbar > div > div > div { + position: relative; + height: 100%; +} +.openerp .oe_leftbar > div > div > div > div.oe_secondary_menus_container { + position: absolute; + position: static\9; + top: 0; bottom: 0; - padding: 4px 0; + left: 0; + right: 0; + overflow-x: hidden; + overflow-y: auto; +} +.openerp .oe_leftbar > div .oe_footer { background: #f0eeee; - width: 220px; text-align: center; } -.openerp .oe_footer a { +.openerp .oe_leftbar > div .oe_footer a { font-weight: bold; color: black; } -.openerp .oe_footer a span { +.openerp .oe_leftbar > div .oe_footer a span { color: #a24689; } .openerp .oe_secondary_menu_section { @@ -1140,8 +1157,26 @@ color: #7c7bad; } .openerp .oe_application > div { + position: relative; height: 100%; } +.openerp .oe_application > div > .oe_view_manager > .oe_view_manager_wrapper { + display: table-row; + height: 100%; +} +.openerp .oe_application > div > .oe_view_manager > .oe_view_manager_wrapper > div { + position: relative; + height: 100%; +} +.openerp .oe_application > div > .oe_view_manager > .oe_view_manager_wrapper > div > .oe_view_manager_body { + position: absolute; + position: static\9; + top: 0; + bottom: 0; + left: 0; + right: 0; + overflow: auto; +} .openerp .oe_application .oe_breadcrumb_item:not(:last-child) { max-width: 7em; white-space: nowrap; @@ -1157,11 +1192,8 @@ height: inherit; width: 100%; } -.openerp .oe_view_manager .oe_view_manager_body { - height: inherit; -} .openerp .oe_view_manager .oe_view_manager_view_kanban:not(:empty) { - height: inherit; + height: 100%; } .openerp .oe_view_manager[data-view-type=kanban] .oe_view_manager_body { display: table-row; @@ -1381,7 +1413,7 @@ float: right; padding: 1px 0; line-height: 18px; - width: 400px; + min-width: 400px; border: 1px solid #ababab; background: white; -moz-border-radius: 13px; @@ -1556,59 +1588,64 @@ -webkit-border-radius: 2px; border-radius: 2px; } -.openerp .oe_searchview.oe_searchview_open_drawer .oe_searchview_drawer { - display: block; +.openerp .oe_searchview_drawer_container { + overflow: auto; } -.openerp .oe_searchview .oe_searchview_drawer { +.openerp .oe_searchview_drawer { + display: none; + width: 100%; cursor: default; - position: absolute; - z-index: 2; - margin-top: 4px; - top: 100%; - right: -1px; - background-color: white; - min-width: 100%; display: none; - border: 1px solid #afafb6; + overflow: hidden; + border-bottom: 1px solid #afafb6; text-align: left; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + padding: 8px 0; } -.openerp .oe_searchview .oe_searchview_drawer > div { - border-top: 1px solid #cccccc; - margin: 0; - padding: 8px; +.openerp .oe_searchview_drawer .badge { + font-size: 12px; + line-height: 12px; } -.openerp .oe_searchview .oe_searchview_drawer > div:first-child { - border-top: none; - margin: 0; +.openerp .oe_searchview_drawer > div:first-child { + border: none; + padding-left: 0; +} +.openerp .oe_searchview_drawer > div:first-child li:hover:not(.badge) { + background-color: #f0f0fa; +} +.openerp .oe_searchview_drawer .col-md-5 { + padding-left: 0; } -.openerp .oe_searchview .oe_searchview_drawer h3 { - margin: 8px 4px 4px 0px; +.openerp .oe_searchview_drawer dl { + margin-bottom: 0; +} +.openerp .oe_searchview_drawer dt { color: #7c7bad; font-size: 13px; + line-height: 24px; } -.openerp .oe_searchview .oe_searchview_drawer h4, .openerp .oe_searchview .oe_searchview_drawer h4 * { +.openerp .oe_searchview_drawer dd { + line-height: 24px; + font-size: 13px; + padding-top: 3px; +} +.openerp .oe_searchview_drawer h4, .openerp .oe_searchview_drawer h4 * { margin: 0 0 0 2px; + padding-left: 20px; cursor: pointer; font-weight: normal; display: inline-block; } -.openerp .oe_searchview .oe_searchview_drawer h4:hover, .openerp .oe_searchview .oe_searchview_drawer h4 *:hover { +.openerp .oe_searchview_drawer h4:hover, .openerp .oe_searchview_drawer h4 *:hover { background-color: #f0f0fa; } -.openerp .oe_searchview .oe_searchview_drawer h4:before { +.openerp .oe_searchview_drawer h4:before { content: "▸ "; color: #a3a3a3; } -.openerp .oe_searchview .oe_searchview_drawer button { +.openerp .oe_searchview_drawer button { margin: 4px 0; } -.openerp .oe_searchview .oe_searchview_drawer .button { +.openerp .oe_searchview_drawer .button { border: none; background: transparent; padding: 0 2px; @@ -1619,126 +1656,112 @@ -webkit-border-radius: 0; border-radius: 0; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section { - display: table; - width: 100%; -} -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section > div { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - display: table-cell; - width: 50%; - padding-left: 2px; -} -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section ul { - margin: 0 8px 8px; +.openerp .oe_searchview_drawer .oe_searchview_section ul { + margin: 0 8px; padding: 0; list-style: none; + display: inline; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section li { - list-style: none; - padding: 2px 4px 2px 20px; - line-height: 14px; - color: inherit; +.openerp .oe_searchview_drawer .oe_searchview_section li { + display: inline-block; cursor: pointer; position: relative; + margin-right: 8px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section li.oe_selected:before { - content: "W"; - font-family: "entypoRegular" !important; - font-size: 24px; - font-weight: 300 !important; - color: #a3a3a3; - position: absolute; - left: 4px; - top: -2px; -} -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section li:hover { - background-color: #f0f0fa; +.openerp .oe_searchview_drawer .oe_searchview_section li > span { + display: inline-block; + max-width: 250px; + text-overflow: ellipsis; + vertical-align: bottom; + overflow: hidden; } -.openerp .oe_searchview .oe_searchview_drawer form { +.openerp .oe_searchview_drawer form { margin-left: 12px; } -.openerp .oe_searchview .oe_searchview_drawer form p { +.openerp .oe_searchview_drawer form p { margin: 4px 0; line-height: 18px; } -.openerp .oe_searchview .oe_searchview_drawer form button { +.openerp .oe_searchview_drawer form button { margin: 0 0 8px -3px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom { - padding: 0 8px 8px 8px; -} -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom div { - padding: 0; -} -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom div h4 { - margin: 0; +.openerp .oe_searchview_drawer .oe_searchview_savefilter form { + display: none; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom form { +.openerp .oe_searchview_drawer .oe_searchview_custom { display: none; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom li { +.openerp .oe_searchview_drawer .oe_searchview_custom li { cursor: pointer; position: relative; line-height: 14px; - padding: 2px 4px 2px 20px; + margin-right: 0; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom li:hover { - background-color: #f0f0fa; -} -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom li button { +.openerp .oe_searchview_drawer .oe_searchview_custom li button { position: absolute; top: 0; right: 5px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom label { +.openerp .oe_searchview_drawer .oe_searchview_custom li a { + margin-left: 10px; + position: inherit; + visibility: hidden; + display: inline-block; +} +.openerp .oe_searchview_drawer .oe_searchview_custom li span:hover:not(.badge) { + background-color: #f0f0fa; +} +.openerp .oe_searchview_drawer .oe_searchview_custom li:hover a { + visibility: visible; +} +.openerp .oe_searchview_drawer .oe_searchview_custom label { font-weight: normal; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_dashboard form { +.openerp .oe_searchview_drawer .oe_searchview_dashboard form { display: none; margin-top: 2px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced form { +.openerp .oe_searchview_drawer .oe_searchview_advanced { + overflow: auto; +} +.openerp .oe_searchview_drawer .oe_searchview_advanced form { display: none; margin-top: 8px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced button.oe_add_condition:before { +.openerp .oe_searchview_drawer .oe_searchview_advanced button.oe_add_condition:before { content: "Z"; font-family: "entypoRegular" !important; font-size: 24px; font-weight: 300 !important; margin-right: 4px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced ul { +.openerp .oe_searchview_drawer .oe_searchview_advanced ul { list-style: none; padding: 0; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced li { +.openerp .oe_searchview_drawer .oe_searchview_advanced li { position: relative; list-style: none; margin: 0; white-space: nowrap; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced li:first-child .searchview_extended_prop_or { +.openerp .oe_searchview_drawer .oe_searchview_advanced li:first-child .searchview_extended_prop_or { visibility: hidden; margin-left: -14px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced .searchview_extended_prop_or { +.openerp .oe_searchview_drawer .oe_searchview_advanced .searchview_extended_prop_or { opacity: 0.5; margin-left: -14px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_opened h4:before { +.openerp .oe_searchview_drawer .oe_opened h4:before { content: "▾ "; position: relative; top: -1px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_opened form { +.openerp .oe_searchview_drawer .oe_opened form { display: block; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_delete, .openerp .oe_searchview .oe_searchview_drawer .searchview_extended_delete_prop { +.openerp .oe_searchview_drawer .oe_searchview_custom_delete, .openerp .oe_searchview_drawer .searchview_extended_delete_prop { display: inline-block; width: 12px; height: 12px; @@ -1750,7 +1773,7 @@ font-weight: bold; text-shadow: 0 1px 1px white; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_delete:hover, .openerp .oe_searchview .oe_searchview_drawer .searchview_extended_delete_prop:hover { +.openerp .oe_searchview_drawer .oe_searchview_custom_delete:hover, .openerp .oe_searchview_drawer .searchview_extended_delete_prop:hover { text-decoration: none; color: white; background: #8786b7; @@ -1759,16 +1782,16 @@ -webkit-border-radius: 2px; border-radius: 2px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_delete { +.openerp .oe_searchview_drawer .oe_searchview_custom_delete { display: none; position: absolute; bottom: 1px; right: 4px; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_private:hover .oe_searchview_custom_delete, .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_public:hover .oe_searchview_custom_delete { +.openerp .oe_searchview_drawer .oe_searchview_custom_private:hover .oe_searchview_custom_delete, .openerp .oe_searchview_drawer .oe_searchview_custom_public:hover .oe_searchview_custom_delete { display: inline-block; } -.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom_public:after { +.openerp .oe_searchview_drawer .oe_searchview_custom_public:after { content: ","; font-family: "entypoRegular" !important; font-size: 22px; @@ -3423,3 +3446,7 @@ input[type="radio"], input[type="checkbox"] { background-color: black; opacity: 0.6; } + +body { + overflow: auto; +} diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 4d952cc47bb..093ebf6cb0b 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -844,40 +844,53 @@ $sheet-padding: 16px background: #f0eeee border-right: 1px solid $tag-border text-shadow: none - padding-bottom: 16px - a.oe_logo - position: relative - width: 220px - display: block - text-align: center - img - margin: 14px 0 - border: 0 - .oe_logo_edit - margin: 14px 0 - position: absolute - top: 1px - padding: 4px - width: 100% - display: none - text-align: center - color: #eee - background: rgba(37,37,37,0.9) - @include box-sizing(border) - &:hover .oe_logo_edit_admin - display: block - .oe_footer - position: fixed - bottom: 0 - padding: 4px 0 - background: #f0eeee - width: 220px - text-align: center - a - font-weight: bold - color: black - span - color: #a24689 + > div + height: 100% + display: table + width: 220px + position: relative + a.oe_logo + display: table-row + text-align: center + img + margin: 14px 0 + border: 0 + .oe_logo_edit + margin: 14px 0 + position: absolute + top: 1px + padding: 4px + width: 100% + display: none + text-align: center + color: #eee + background: rgba(37,37,37,0.9) + @include box-sizing(border) + &:hover .oe_logo_edit_admin + display: block + > div + display: table-row + height: 100% + > div + position: relative + height: 100% + > div.oe_secondary_menus_container + position: absolute + position: static\9 + top: 0 + bottom: 0 + left: 0 + right: 0 + overflow-x: hidden + overflow-y: auto + .oe_footer + background: #f0eeee + text-align: center + a + font-weight: bold + color: black + span + color: #a24689 // }}} // Webclient.leftbar items {{{ @@ -955,7 +968,25 @@ $sheet-padding: 16px a color: $link-color > div + position: relative height: 100% + > .oe_view_manager + > .oe_view_manager_wrapper + display: table-row + height: 100% + > div + position: relative + height: 100% + > .oe_view_manager_body + position: absolute + position: static\9 + top: 0 + bottom: 0 + left: 0 + right: 0 + overflow: auto + + .oe_breadcrumb_item:not(:last-child) max-width: 7em white-space: nowrap @@ -970,10 +1001,8 @@ $sheet-padding: 16px display: table height: inherit width: 100% - .oe_view_manager_body - height: inherit .oe_view_manager_view_kanban:not(:empty) - height: inherit + height: 100% &[data-view-type=kanban] .oe_view_manager_body display: table-row @@ -1150,7 +1179,7 @@ $sheet-padding: 16px float: right padding: 1px 0 line-height: 18px - width: 400px + min-width: 400px border: 1px solid #ababab background: white @include radius(13px) @@ -1277,188 +1306,180 @@ $sheet-padding: 16px background: #8786b7 text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4) @include radius(2px) - &.oe_searchview_open_drawer - .oe_searchview_drawer - display: block - .oe_searchview_drawer - cursor: default - position: absolute - z-index: 2 - // detach drawer from field slightly - margin-top: 4px - top: 100% - right: -1px - background-color: white - min-width: 100% - display: none - border: 1px solid $tag-border - text-align: left - @include radius(4px) - @include box-shadow(0 1px 4px rgba(0,0,0,0.3)) - > div - border-top: 1px solid #ccc - margin: 0 - padding: 8px - > div:first-child - border-top: none - margin: 0 - h3 - margin: 8px 4px 4px 0px - color: $section-title-color - font-size: 13px - h4, h4 * - margin: 0 0 0 2px - cursor: pointer - font-weight: normal + .oe_searchview_drawer_container + overflow: auto + .oe_searchview_drawer + display: none + width: 100% + cursor: default + display: none + overflow: hidden + border-bottom: 1px solid $tag-border + text-align: left + padding: 8px 0 + .badge + font-size: 12px + line-height: 12px + > div:first-child + border: none + padding-left: 0 + li:hover:not(.badge) + background-color: $hover-background + .col-md-5 + padding-left: 0 + dl + margin-bottom: 0 + dt + color: $section-title-color + font-size: 13px + line-height: 24px + dd + line-height: 24px + font-size: 13px + padding-top: 3px + h4, h4 * + margin: 0 0 0 2px + padding-left: 20px + cursor: pointer + font-weight: normal + display: inline-block + &:hover + background-color: $hover-background + h4:before + content: "▸ " + color: #a3a3a3 + button + margin: 4px 0 + .button + border: none + background: transparent + padding: 0 2px + @include box-shadow(none) + @include radius(0) + .oe_searchview_section + ul + margin: 0 8px + padding: 0 + list-style: none + display: inline + li display: inline-block - &:hover - background-color: $hover-background - h4:before - content: "▸ " - color: #a3a3a3 - button + cursor: pointer + position: relative + margin-right: 8px + > span + display: inline-block + max-width: 250px + text-overflow: ellipsis + vertical-align: bottom + overflow: hidden + form + margin-left: 12px + p margin: 4px 0 - .button - border: none - background: transparent - padding: 0 2px - @include box-shadow(none) - @include radius(0) - .oe_searchview_section - display: table - width: 100% - > div - @include box-sizing(border) - display: table-cell - width: 50% - padding-left: 2px // Managed padding-left according bootstrap3 - ul - margin: 0 8px 8px - padding: 0 - list-style: none - li - list-style: none - padding: 2px 4px 2px 20px - line-height: 14px - color: inherit - cursor: pointer - position: relative - &.oe_selected:before - content: "W" - font-family: "entypoRegular" !important - font-size: 24px - font-weight: 300 !important - color: #a3a3a3 - position: absolute - left: 4px - top: -2px - // after oe_selected so background color is not overridden - &:hover - background-color: $hover-background + line-height: 18px + button + margin: 0 0 8px -3px // Managed margin-left according bootstrap3 + .oe_searchview_savefilter form - margin-left: 12px - p - margin: 4px 0 - line-height: 18px + display: none + .oe_searchview_custom + display: none + li + cursor: pointer + position: relative + line-height: 14px + margin-right: 0 button - margin: 0 0 8px -3px // Managed margin-left according bootstrap3 - .oe_searchview_custom - padding: 0 8px 8px 8px - div - padding: 0 - h4 - margin: 0 - form - display: none - li - cursor: pointer - position: relative - line-height: 14px - padding: 2px 4px 2px 20px - &:hover - background-color: $hover-background - button - position: absolute - top: 0 - right: 5px - //Customize for searchview label - label - font-weight: normal - //End of Customize - .oe_searchview_dashboard - form - display: none - margin-top: 2px - - .oe_searchview_advanced - form - display: none - margin-top: 8px - button.oe_add_condition:before - content: "Z" - font-family: "entypoRegular" !important - font-size: 24px - font-weight: 300 !important - margin-right: 4px - ul - list-style: none - padding: 0 - li - position: relative - list-style: none - margin: 0 - white-space: nowrap - &:first-child .searchview_extended_prop_or - visibility: hidden - margin-left: -14px - .searchview_extended_prop_or - opacity: 0.5 - margin-left: -14px //Customize 'or' in searchview - .oe_opened - h4:before - content: "▾ " - position: relative - top: -1px - form - display: block + position: absolute + top: 0 + right: 5px + a + margin-left: 10px + position: inherit + visibility: hidden + display: inline-block + span:hover:not(.badge) + background-color: $hover-background + li:hover a + visibility: visible + //Customize for searchview label + label + font-weight: normal + //End of Customize + .oe_searchview_dashboard + form + display: none + margin-top: 2px - // delete buttons - .oe_searchview_custom_delete, .searchview_extended_delete_prop - display: inline-block - width: 12px - height: 12px - line-height: 12px - padding: 1px - color: #8786b7 - line-height: 8px - text-align: center - font-weight: bold - text-shadow: 0 1px 1px white - &:hover - text-decoration: none - color: white - background: #8786b7 - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4) - @include radius(2px) - .oe_searchview_custom_delete + .oe_searchview_advanced + overflow: auto + form display: none - position: absolute - bottom: 1px - right: 4px - .oe_searchview_custom_private, .oe_searchview_custom_public - &:hover - .oe_searchview_custom_delete - display: inline-block - .oe_searchview_custom_public:after - content: "," + margin-top: 8px + button.oe_add_condition:before + content: "Z" font-family: "entypoRegular" !important - font-size: 22px + font-size: 24px font-weight: 300 !important - margin: 0 0 0 4px + margin-right: 4px + ul + list-style: none padding: 0 + li + position: relative + list-style: none + margin: 0 + white-space: nowrap + &:first-child .searchview_extended_prop_or + visibility: hidden + margin-left: -14px + .searchview_extended_prop_or + opacity: 0.5 + margin-left: -14px //Customize 'or' in searchview + .oe_opened + h4:before + content: "▾ " + position: relative + top: -1px + form + display: block - + // delete buttons + .oe_searchview_custom_delete, .searchview_extended_delete_prop + display: inline-block + width: 12px + height: 12px + line-height: 12px + padding: 1px + color: #8786b7 + line-height: 8px + text-align: center + font-weight: bold + text-shadow: 0 1px 1px white + &:hover + text-decoration: none + color: white + background: #8786b7 + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4) + @include radius(2px) + .oe_searchview_custom_delete + display: none + position: absolute + bottom: 1px + right: 4px + .oe_searchview_custom_private, .oe_searchview_custom_public + &:hover + .oe_searchview_custom_delete + display: inline-block + .oe_searchview_custom_public:after + content: "," + font-family: "entypoRegular" !important + font-size: 22px + font-weight: 300 !important + margin: 0 0 0 4px + padding: 0 // }}} // Views Common {{{ .oe_view_nocontent @@ -2779,5 +2800,7 @@ input[type="radio"], input[type="checkbox"] opacity: 0.6000000238418579 +body + overflow: auto // 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/search.js b/addons/web/static/src/js/search.js index 832faa4ca62..5653447566b 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -340,7 +340,8 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea }, 'click .oe_searchview_unfold_drawer': function (e) { e.stopImmediatePropagation(); - this.$el.toggleClass('oe_searchview_open_drawer'); + if (this.drawer) + this.drawer.toggle(); }, 'keydown .oe_searchview_input, .oe_searchview_facet': function (e) { switch(e.which) { @@ -383,19 +384,24 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea this.defaults = defaults || {}; this.has_defaults = !_.isEmpty(this.defaults); - this.inputs = []; - this.controls = []; - this.headless = this.options.hidden && !this.has_defaults; this.input_subviews = []; + this.view_manager = null; + this.$view_manager_header = null; this.ready = $.Deferred(); + this.drawer_ready = $.Deferred(); + this.fields_view_get = $.Deferred(); + this.drawer = new instance.web.SearchViewDrawer(parent, this); + }, start: function() { var self = this; var p = this._super(); + this.$view_manager_header = this.$el.parents(".oe_view_manager_header").first(); + this.setup_global_completion(); this.query = new my.SearchQuery() .on('add change reset remove', this.proxy('do_search')) @@ -416,20 +422,32 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea }); this.alive($.when(load_view)).then(function (r) { + self.fields_view_get.resolve(r); return self.search_view_loaded(r); }).fail(function () { self.ready.reject.apply(null, arguments); }); } - instance.web.bus.on('click', this, function(ev) { - if ($(ev.target).parents('.oe_searchview').length === 0) { - self.$el.removeClass('oe_searchview_open_drawer'); - } - }); + var view_manager = this.getParent(); + while (!(view_manager instanceof instance.web.ViewManager) && + view_manager && view_manager.getParent) { + view_manager = view_manager.getParent(); + } + if (view_manager) { + this.view_manager = view_manager; + view_manager.on('switch_mode', this, function (e) { + self.drawer.toggle(e === 'graph'); + }); + } return $.when(p, this.ready); }, + + set_drawer: function (drawer) { + this.drawer = drawer; + }, + show: function () { this.$el.show(); }, @@ -463,14 +481,6 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea }, /** - * Sets up thingie where all the mess is put? - */ - select_for_drawer: function () { - return _(this.inputs).filter(function (input) { - return input.in_drawer(); - }); - }, - /** * Sets up search view's view-wide auto-completion widget */ setup_global_completion: function () { @@ -530,7 +540,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea * @param {Function} resp response callback */ complete_global_search: function (req, resp) { - $.when.apply(null, _(this.inputs).chain() + $.when.apply(null, _(this.drawer.inputs).chain() .filter(function (input) { return input.visible(); }) .invoke('complete', req.term) .value()).then(function () { @@ -630,87 +640,6 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea }); }, - /** - * Builds a list of widget rows (each row is an array of widgets) - * - * @param {Array} items a list of nodes to convert to widgets - * @param {Object} fields a mapping of field names to (ORM) field attributes - * @param {Object} [group] group to put the new controls in - */ - make_widgets: function (items, fields, group) { - if (!group) { - group = new instance.web.search.Group( - this, 'q', {attrs: {string: _t("Filters")}}); - } - var self = this; - var filters = []; - _.each(items, function (item) { - if (filters.length && item.tag !== 'filter') { - group.push(new instance.web.search.FilterGroup(filters, group)); - filters = []; - } - - switch (item.tag) { - case 'separator': case 'newline': - break; - case 'filter': - filters.push(new instance.web.search.Filter(item, group)); - break; - case 'group': - self.make_widgets(item.children, fields, - new instance.web.search.Group(group, 'w', item)); - break; - case 'field': - var field = this.make_field( - item, fields[item['attrs'].name], group); - group.push(field); - // filters - self.make_widgets(item.children, fields, group); - break; - } - }, this); - - if (filters.length) { - group.push(new instance.web.search.FilterGroup(filters, this)); - } - }, - /** - * Creates a field for the provided field descriptor item (which comes - * from fields_view_get) - * - * @param {Object} item fields_view_get node for the field - * @param {Object} field fields_get result for the field - * @param {Object} [parent] - * @returns instance.web.search.Field - */ - make_field: function (item, field, parent) { - // M2O combined with selection widget is pointless and broken in search views, - // but has been used in the past for unsupported hacks -> ignore it - if (field.type === "many2one" && item.attrs.widget === "selection"){ - item.attrs.widget = undefined; - } - var obj = instance.web.search.fields.get_any( [item.attrs.widget, field.type]); - if(obj) { - return new (obj) (item, field, parent || this); - } else { - console.group('Unknown field type ' + field.type); - console.error('View node', item); - console.info('View field', field); - console.info('In view', this); - console.groupEnd(); - 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 - this.custom_filters = new instance.web.search.CustomFilters(this); - // add Advanced to this.inputs - (new instance.web.search.Advanced(this)); - }, - search_view_loaded: function(data) { var self = this; this.fields_view = data; @@ -720,24 +649,9 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea "Got non-search view after asking for a search view: type %s, arch root %s", data.type, data.arch.tag)); } - this.make_widgets( - data['arch'].children, - data.fields); - - this.add_common_inputs(); - // build drawer - var drawer_started = $.when.apply( - null, _(this.select_for_drawer()).invoke( - 'appendTo', this.$('.oe_searchview_drawer'))); - - - // load defaults - var defaults_fetched = $.when.apply(null, _(this.inputs).invoke( - 'facet_for_defaults', this.defaults)) - .then(this.proxy('setup_default_query')); - - return $.when(drawer_started, defaults_fetched) + return this.drawer_ready + .then(this.proxy('setup_default_query')) .then(function () { self.trigger("search_view_loaded", data); self.ready.resolve(); @@ -747,14 +661,14 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea // Hacky implementation of CustomFilters#facet_for_defaults ensure // CustomFilters will be ready (and CustomFilters#filters will be // correctly filled) by the time this method executes. - var custom_filters = this.custom_filters.filters; + var custom_filters = this.drawer.custom_filters.filters; if (!this.options.disable_custom_filters && !_(custom_filters).isEmpty()) { // Check for any is_default custom filter var personal_filter = _(custom_filters).find(function (filter) { return filter.user_id && filter.is_default; }); if (personal_filter) { - this.custom_filters.toggle_filter(personal_filter, true); + this.drawer.custom_filters.toggle_filter(personal_filter, true); return; } @@ -762,7 +676,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea return !filter.user_id && filter.is_default; }); if (global_filter) { - this.custom_filters.toggle_filter(global_filter, true); + this.drawer.custom_filters.toggle_filter(global_filter, true); return; } } @@ -872,9 +786,167 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea on_invalid: function (errors) { this.do_notify(_t("Invalid Search"), _t("triggered from search view")); this.trigger('invalid_search', errors); + }, + + // The method appendTo is overwrited to be able to insert the drawer anywhere + appendTo: function ($searchview_parent, $searchview_drawer_node) { + var $searchview_drawer_node = $searchview_drawer_node || $searchview_parent; + + return $.when( + this._super($searchview_parent), + this.drawer.appendTo($searchview_drawer_node) + ); + }, + + destroy: function () { + this.drawer.destroy(); + this.getParent().destroy.call(this); } }); +instance.web.SearchViewDrawer = instance.web.Widget.extend({ + template: "SearchViewDrawer", + + init: function(parent, searchview) { + this._super(parent); + this.searchview = searchview; + this.searchview.set_drawer(this); + this.ready = searchview.drawer_ready; + this.controls = []; + this.inputs = []; + }, + + toggle: function (visibility) { + this.$el.toggle(visibility); + var $view_manager_body = this.$el.closest('.oe_view_manager_body'); + if ($view_manager_body.length) { + $view_manager_body.scrollTop(0); + } + }, + + start: function() { + var self = this; + var filters_ready = this.searchview.fields_view_get + .then(this.proxy('prepare_filters')); + return $.when(this._super(), filters_ready).then(function () { + var defaults = arguments[1][0]; + self.ready.resolve.apply(null, defaults); + }); + }, + prepare_filters: function (data) { + this.make_widgets( + data['arch'].children, + data.fields); + + this.add_common_inputs(); + + // build drawer + var in_drawer = this.select_for_drawer(); + + var $first_col = this.$(".col-md-7"), + $snd_col = this.$(".col-md-5"); + + var add_custom_reports = in_drawer[0].appendTo($first_col), + add_filters = in_drawer[1].appendTo($first_col), + add_rest = $.when.apply(null, _(in_drawer.slice(2)).invoke('appendTo', $snd_col)), + defaults_fetched = $.when.apply(null, _(this.inputs).invoke( + 'facet_for_defaults', this.searchview.defaults)); + + return $.when(defaults_fetched, add_custom_reports, add_filters, add_rest); + }, + /** + * Sets up thingie where all the mess is put? + */ + select_for_drawer: function () { + return _(this.inputs).filter(function (input) { + return input.in_drawer(); + }); + }, + + /** + * Builds a list of widget rows (each row is an array of widgets) + * + * @param {Array} items a list of nodes to convert to widgets + * @param {Object} fields a mapping of field names to (ORM) field attributes + * @param {Object} [group] group to put the new controls in + */ + make_widgets: function (items, fields, group) { + if (!group) { + group = new instance.web.search.Group( + this, 'q', {attrs: {string: _t("Filters")}}); + } + var self = this; + var filters = []; + _.each(items, function (item) { + if (filters.length && item.tag !== 'filter') { + group.push(new instance.web.search.FilterGroup(filters, group)); + filters = []; + } + + switch (item.tag) { + case 'separator': case 'newline': + break; + case 'filter': + filters.push(new instance.web.search.Filter(item, group)); + break; + case 'group': + self.make_widgets(item.children, fields, + new instance.web.search.Group(group, 'w', item)); + break; + case 'field': + var field = this.make_field( + item, fields[item['attrs'].name], group); + group.push(field); + // filters + self.make_widgets(item.children, fields, group); + break; + } + }, this); + + if (filters.length) { + group.push(new instance.web.search.FilterGroup(filters, this)); + } + }, + /** + * Creates a field for the provided field descriptor item (which comes + * from fields_view_get) + * + * @param {Object} item fields_view_get node for the field + * @param {Object} field fields_get result for the field + * @param {Object} [parent] + * @returns instance.web.search.Field + */ + make_field: function (item, field, parent) { + // M2O combined with selection widget is pointless and broken in search views, + // but has been used in the past for unsupported hacks -> ignore it + if (field.type === "many2one" && item.attrs.widget === "selection"){ + item.attrs.widget = undefined; + } + var obj = instance.web.search.fields.get_any( [item.attrs.widget, field.type]); + if(obj) { + return new (obj) (item, field, parent || this); + } else { + console.group('Unknown field type ' + field.type); + console.error('View node', item); + console.info('View field', field); + console.info('In view', this); + console.groupEnd(); + return null; + } + }, + + add_common_inputs: function() { + // add custom filters to this.inputs + this.custom_filters = new instance.web.search.CustomReports(this); + // add Filters to this.inputs, need view.controls filled + (new instance.web.search.Filters(this)); + (new instance.web.search.SaveFilter(this, this.custom_filters)); + // add Advanced to this.inputs + (new instance.web.search.Advanced(this)); + }, + +}); + /** * Registry of search fields, called by :js:class:`instance.web.SearchView` to * find and instantiate its field widgets. @@ -932,9 +1004,10 @@ instance.web.search.Widget = instance.web.Widget.extend( /** @lends instance.web this._super(parent); var ancestor = parent; do { - this.view = ancestor; - } while (!(ancestor instanceof instance.web.SearchView) + this.drawer = ancestor; + } while (!(ancestor instanceof instance.web.SearchViewDrawer) && (ancestor = (ancestor.getParent && ancestor.getParent()))); + this.view = this.drawer.searchview || this.drawer; } }); @@ -956,7 +1029,7 @@ instance.web.search.Group = instance.web.search.Widget.extend({ this.name = attrs.string; this.children = []; - this.view.controls.push(this); + this.drawer.controls.push(this); }, push: function (input) { this.children.push(input); @@ -977,7 +1050,7 @@ instance.web.search.Input = instance.web.search.Widget.extend( /** @lends instan init: function (parent) { this._super(parent); this.load_attrs({}); - this.view.inputs.push(this); + this.drawer.inputs.push(this); }, /** * Fetch auto-completion values for the widget. @@ -1088,7 +1161,7 @@ instance.web.search.FilterGroup = instance.web.search.Input.extend(/** @lends in */ search_change: function () { var self = this; - var $filters = this.$('> li').removeClass('oe_selected'); + var $filters = this.$('> li').removeClass('badge'); var facet = this.view.query.find(_.bind(this.match_facet, this)); if (!facet) { return; } facet.values.each(function (v) { @@ -1096,7 +1169,7 @@ instance.web.search.FilterGroup = instance.web.search.Input.extend(/** @lends in if (i === -1) { return; } $filters.filter(function () { return Number($(this).data('index')) === i; - }).addClass('oe_selected'); + }).addClass('badge'); }); }, /** @@ -1628,12 +1701,12 @@ instance.web.search.ManyToOneField = instance.web.search.CharField.extend({ } }); -instance.web.search.CustomFilters = instance.web.search.Input.extend({ - template: 'SearchView.CustomFilters', +instance.web.search.CustomReports = instance.web.search.Input.extend({ + template: 'SearchView.CustomReports', _in_drawer: true, init: function () { this.is_ready = $.Deferred(); - this._super.apply(this, arguments); + this._super.apply(this,arguments); }, start: function () { var self = this; @@ -1648,13 +1721,6 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({ self.clear_selection(); }) .on('reset', this.proxy('clear_selection')); - this.$el.on('submit', 'form', this.proxy('save_current')); - this.$el.on('click', 'input[type=checkbox]', function() { - $(this).siblings('input[type=checkbox]').prop('checked', false); - }); - this.$el.on('click', 'h4', function () { - self.$el.toggleClass('oe_opened'); - }); return this.model.call('get_filters', [this.view.model]) .then(this.proxy('set_filters')) .done(function () { self.is_ready.resolve(); }) @@ -1708,7 +1774,7 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({ }; }, clear_selection: function () { - this.$('li.oe_selected').removeClass('oe_selected'); + this.$('span.badge').removeClass('badge'); }, append_filter: function (filter) { var self = this; @@ -1721,12 +1787,13 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({ } else { var id = filter.id; this.filters[key] = filter; - $filter = this.$filters[key] = $('<li></li>') + $filter = $('<li></li>') .appendTo(this.$('.oe_searchview_custom_list')) - .addClass(filter.user_id ? 'oe_searchview_custom_private' - : 'oe_searchview_custom_public') .toggleClass('oe_searchview_custom_default', filter.is_default) - .text(filter.name); + .append(this.$filters[key] = $('<span>').text(filter.name)); + + this.$filters[key].addClass(filter.user_id ? 'oe_searchview_custom_private' + : 'oe_searchview_custom_public') $('<a class="oe_searchview_custom_delete">x</a>') .click(function (e) { @@ -1738,14 +1805,18 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({ $filter.remove(); delete self.$filters[key]; delete self.filters[key]; + if (_.isEmpty(self.filters)) { + self.hide(); + } }); }) .appendTo($filter); } - $filter.unbind('click').click(function () { + this.$filters[key].unbind('click').click(function () { self.toggle_filter(filter); }); + this.show(); }, toggle_filter: function (filter, preventSearch) { var current = this.view.query.find(function (facet) { @@ -1753,15 +1824,44 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({ }); if (current) { this.view.query.remove(current); - this.$filters[this.key_for(filter)].removeClass('oe_selected'); + this.$filters[this.key_for(filter)].removeClass('badge'); return; } this.view.query.reset([this.facet_for(filter)], { preventSearch: preventSearch || false}); - this.$filters[this.key_for(filter)].addClass('oe_selected'); + this.$filters[this.key_for(filter)].addClass('badge'); }, set_filters: function (filters) { _(filters).map(_.bind(this.append_filter, this)); + if (!filters.length) { + this.hide(); + } + }, + hide: function () { + this.$el.hide(); + }, + show: function () { + this.$el.show(); + }, +}); + +instance.web.search.SaveFilter = instance.web.search.Input.extend({ + template: 'SearchView.SaveFilter', + _in_drawer: true, + init: function (parent, custom_reports) { + this._super(parent); + this.custom_reports = custom_reports; + }, + start: function () { + var self = this; + this.model = new instance.web.Model('ir.filters'); + this.$el.on('submit', 'form', this.proxy('save_current')); + this.$el.on('click', 'input[type=checkbox]', function() { + $(this).siblings('input[type=checkbox]').prop('checked', false); + }); + this.$el.on('click', 'h4', function () { + self.$el.toggleClass('oe_opened'); + }); }, save_current: function () { var self = this; @@ -1799,14 +1899,16 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({ // FIXME: current context? return self.model.call('create_or_replace', [filter]).done(function (id) { filter.id = id; - self.append_filter(filter); + if (self.custom_reports) { + self.custom_reports.append_filter(filter); + } self.$el .removeClass('oe_opened') .find('form')[0].reset(); }); }); return false; - } + }, }); instance.web.search.Filters = instance.web.search.Input.extend({ @@ -1814,22 +1916,13 @@ instance.web.search.Filters = instance.web.search.Input.extend({ _in_drawer: true, start: function () { var self = this; - var running_count = 0; - // get total filters count var is_group = function (i) { return i instanceof instance.web.search.FilterGroup; }; - var visible_filters = _(this.view.controls).chain().reject(function (group) { + var visible_filters = _(this.drawer.controls).chain().reject(function (group) { return _(_(group.children).filter(is_group)).isEmpty() || group.modifiers.invisible; }); - var filters_count = visible_filters - .pluck('children') - .flatten() - .filter(is_group) - .map(function (i) { return i.filters.length; }) - .sum() - .value(); - var col1 = [], col2 = visible_filters.map(function (group) { + var groups = visible_filters.map(function (group) { var filters = _(group.children).filter(is_group); return { name: _.str.sprintf("<span class='oe_i'>%s</span> %s", @@ -1840,27 +1933,16 @@ instance.web.search.Filters = instance.web.search.Input.extend({ }; }).value(); - while (col2.length) { - // col1 + group should be smaller than col2 + group - if ((running_count + col2[0].length) <= (filters_count - running_count)) { - running_count += col2[0].length; - col1.push(col2.shift()); - } else { - break; - } - } + var $dl = $('<dl class="dl-horizontal">').appendTo(this.$el); - return $.when( - this.render_column(col1, $('<div>').appendTo(this.$el)), - this.render_column(col2, $('<div>').appendTo(this.$el))); - }, - render_column: function (column, $el) { - return $.when.apply(null, _(column).map(function (group) { - $('<h3>').html(group.name).appendTo($el); - return $.when.apply(null, - _(group.filters).invoke('appendTo', $el)); - })); - } + var rendered_lines = _.map(groups, function (group) { + $('<dt>').html(group.name).appendTo($dl); + var $dd = $('<dd>').appendTo($dl); + return $.when.apply(null, _(group.filters).invoke('appendTo', $dd)); + }); + + return $.when.apply(this, rendered_lines); + }, }); instance.web.search.Advanced = instance.web.search.Input.extend({ diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index b03820eecaa..e276a5e3995 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -5306,8 +5306,12 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend if (this.searchview) { this.searchview.destroy(); } + if (this.searchview_drawer) { + this.searchview_drawer.destroy(); + } this.searchview = new instance.web.SearchView(this, this.dataset, false, search_defaults); + this.searchview_drawer = new instance.web.SearchViewDrawer(this, this.searchview); this.searchview.on('search_data', self, function(domains, contexts, groupbys) { if (self.initial_ids) { self.do_search(domains.concat([[["id", "in", self.initial_ids]], self.domain]), @@ -5353,7 +5357,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend }); }); }); - this.searchview.appendTo($(".oe_popup_search", self.$el)); + this.searchview.appendTo(this.$(".oe_popup_search")); }, do_search: function(domains, contexts, groupbys) { var self = this; diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index ec233159d63..19597add308 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -607,7 +607,6 @@ instance.web.ViewManager = instance.web.Widget.extend({ // If no default view defined, switch to the first one in sequence var default_view = this.flags.default_view || this.views_src[0].view_type; - return this.switch_mode(default_view, null, this.flags[default_view] && this.flags[default_view].options); @@ -647,7 +646,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ _.each(_.keys(self.views), function(view_name) { var controller = self.views[view_name].controller; if (controller) { - var container = self.$el.find("> .oe_view_manager_body > .oe_view_manager_view_" + view_name); + var container = self.$el.find("> div > div > .oe_view_manager_body > .oe_view_manager_view_" + view_name); if (view_name === view_type) { container.show(); controller.do_show(view_options || {}); @@ -690,7 +689,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ controller.on('switch_mode', self, this.switch_mode); controller.on('previous_view', self, this.prev_view); - var container = this.$el.find("> .oe_view_manager_body > .oe_view_manager_view_" + view_type); + var container = this.$el.find("> div > div > .oe_view_manager_body > .oe_view_manager_view_" + view_type); var view_promise = controller.appendTo(container); this.views[view_type].controller = controller; this.views[view_type].deferred.resolve(view_type); @@ -705,6 +704,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ self.trigger("controller_inited",view_type,controller); }); }, + /** * @returns {Number|Boolean} the view id of the given type, false if not found */ @@ -800,6 +800,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ if (this.searchview) { this.searchview.destroy(); } + var options = { hidden: this.flags.search_view === false, disable_custom_filters: this.flags.search_disable_custom_filters, @@ -807,7 +808,8 @@ instance.web.ViewManager = instance.web.Widget.extend({ this.searchview = new instance.web.SearchView(this, this.dataset, view_id, search_defaults, options); this.searchview.on('search_data', self, this.do_searchview_search); - return this.searchview.appendTo(this.$el.find(".oe_view_manager_view_search")); + return this.searchview.appendTo(this.$(".oe_view_manager_view_search"), + this.$(".oe_searchview_drawer_container")); }, do_searchview_search: function(domains, contexts, groupbys) { var self = this, diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index de544c7dff8..913783a2396 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -440,14 +440,20 @@ </tr> <tr> <td class="oe_leftbar" valign="top"> - <t t-set="debug" t-value="__debug__ ? '&debug' : ''"/> - <a class="oe_logo" t-attf-href="/web?#{debug}"> - <span class="oe_logo_edit">Edit Company data</span> - <img t-att-src='widget.session.url("/web/binary/company_logo")'/> - </a> - <div class="oe_secondary_menus_container"/> - <div class="oe_footer"> - Powered by <a href="https://www.odoo.com" target="_blank"><span>Odoo</span></a> + <div> + <t t-set="debug" t-value="__debug__ ? '&debug' : ''"/> + <a class="oe_logo" t-attf-href="/web?#{debug}"> + <span class="oe_logo_edit">Edit Company data</span> + <img t-att-src='widget.session.url("/web/binary/company_logo")'/> + </a> + <div> + <div> + <div class="oe_secondary_menus_container"/> + </div> + </div> + <div class="oe_footer"> + Powered by <a href="http://www.odoo.com" target="_blank"><span>Odoo</span></a> + </div> </div> </td> <td class="oe_application"> @@ -520,10 +526,15 @@ </tr> </table> - <div class="oe_view_manager_body"> - <t t-foreach="widget.views_src" t-as="view"> - <div t-attf-class="oe_view_manager_view_#{view.view_type}"/> - </t> + <div class="oe_view_manager_wrapper"> + <div> + <div class="oe_view_manager_body"> + <div class="oe_searchview_drawer_container"/> + <t t-foreach="widget.views_src" t-as="view"> + <div t-attf-class="oe_view_manager_view_#{view.view_type}"/> + </t> + </div> + </div> </div> </div> </t> @@ -1556,11 +1567,15 @@ <div class="oe_searchview_facets"/> <div class="oe_searchview_clear"/> <div class="oe_searchview_unfold_drawer" title="Advanced Search..."/> - <div class="oe_searchview_drawer"/> <button type="button" class="oe_searchview_search" title="Search Again">Search</button> </div> +<div t-name="SearchViewDrawer" class="oe_searchview_drawer" style="display:none;"> + <div class="col-md-7"></div> + <div class="col-md-5"></div> +</div> + <div t-name="SearchView.InputView" class="oe_searchview_input" contenteditable="true" @@ -1717,24 +1732,27 @@ <div t-name="SearchView.Filters" class="oe_searchview_filters oe_searchview_section"> </div> -<div t-name="SearchView.CustomFilters" class="oe_searchview_custom oe_searchview_section"> - <div> - <h3><span class="oe_i">M</span> Custom Filters</h3> - <ul class="oe_searchview_custom_list"/> - <div class="oe_searchview_custom"> - <h4>Save current filter</h4> - <form class="oe_form"> - <p class="oe_form_required"><input id="oe_searchview_custom_input" placeholder="Filter name"/></p> - <p> - <input id="oe_searchview_custom_public" type="checkbox"/> - <label for="oe_searchview_custom_public">Share with all users</label> - <input id="oe_searchview_custom_default" type="checkbox"/> - <label for="oe_searchview_custom_default">Use by default</label> - </p> - <button>Save</button> - </form> - </div> - </div> + + +<div t-name="SearchView.CustomReports" class="oe_searchview_custom oe_searchview_section"> + <dl class="dl-horizontal"> + <dt><span class="oe_i">M</span> Custom Reports</dt> + <dd><ul class="oe_searchview_custom_list"/></dd> + </dl> +</div> + + <div t-name="SearchView.SaveFilter" class="oe_searchview_savefilter"> + <h4>Save current filter</h4> + <form class="oe_form"> + <p class="oe_form_required"><input id="oe_searchview_custom_input" placeholder="Filter name"/></p> + <p> + <input id="oe_searchview_custom_public" type="checkbox"/> + <label for="oe_searchview_custom_public">Share with all users</label> + <input id="oe_searchview_custom_default" type="checkbox"/> + <label for="oe_searchview_custom_default">Use by default</label> + </p> + <button>Save</button> + </form> </div> <div t-name="SearchView.advanced" class="oe_searchview_advanced"> |
